Okay, I have taken a quick look and haven't really found anything strange, besides that you can keep drowning if you don't have the flippers and continue to press in the direction of the water. You never see Link submerged. Not to mention that the submerged sprite is half in the water and half on the land. And when you come back you are standing on water.
I have also taken a look at your code. I can't really say erstand it all, because it is really all over the place. And I have seen a lot of coding conventions, but yours is the first to bring shivers down my spine and to make my skin crawl. For example from your menu object step event:
var oldslot; // Used to track which item was in the Z or X slot before swapping with the slot the cursor resides at
oldslot = false;
if global.pause = true && alarm[0] = -1{ // Only activates the code when the game is paused.
// Scrolls through equipment screens
if keyboard_check_pressed(ord('A')) {sound_play(sfx_menu_open) switch menu {case 0: scr_fade(c_white) menu = global.keyitem[15, 3] break; case global.keyitem[15, 3]: scr_fade(c_white) menu = 4 break; case 4: scr_fade(c_white) menu = 0 break;}}
if menu = 0 {
// Assign an item to the Z slot
if keyboard_check_pressed(ord('Z')) {
sound_play(sfx_select)
oldslot = slot[16, 0]
slot[16, 0] = slot[cursor, 0]
slot[cursor, 0] = oldslot
}
// Assign an item to the X slot
if keyboard_check_pressed(ord('X')) {
sound_play(sfx_select)
oldslot = slot[17, 0]
slot[17, 0] = slot[cursor, 0]
slot[cursor, 0] = oldslot
}
}
// Test different level ring boxes
// Changing the ring level while on the key item screen will make it so you cannot change to the next screen until you're back at the original ring level.
if keyboard_check_pressed(ord('R')) {if global.keyitem[15, 3] != 3 {global.keyitem[15, 3] += 1} else if global.keyitem[15, 3] = 3 {global.keyitem[15, 3] = 1}}
// Move cursor around the screen and change the select variable accordingly
if menu = 0 {
// Moves the cursor up and if its at the top it will move down to the bottom.
if keyboard_check_pressed(vk_up) {sound_play(sfx_cursor) if cursory != 8 {cursory -= 24 cursor -= 4} else if cursory = 8 {cursory = 80 cursor += 12}}
// Moves the cursor down and if its at the bottom it will move up to the top.
if keyboard_check_pressed(vk_down) {sound_play(sfx_cursor) if cursory != 80 {cursory += 24 cursor += 4} else if cursory = 80 {cursory = 8 cursor -= 12}}
// Moves the cursor to the left and if its at the edge it will up one space and to the end of the previous row.
if keyboard_check_pressed(vk_left) {sound_play(sfx_cursor) if cursorx != 22 {cursorx -= 32 cursor -= 1}
else if cursorx = 22 { cursorx = 118
if cursory != 8 {cursory -= 24 cursor -= 1} else if cursory = 8 {cursory = 80 cursor += 15}}}
// Moves the cursor to the right and if its at the edge it will down one space and to the beginning of the next row.
if keyboard_check_pressed(vk_right) {sound_play(sfx_cursor) if cursorx != 118 {cursorx += 32 cursor += 1}
else if cursorx = 118 { cursorx = 22
if cursory != 80 {cursory += 24 cursor += 1} else if cursory = 80 {cursory = 8 cursor -= 15}}}
} //else if menu = 1 || menu = 2 || menu = 3 // <- use to set up the cursor for other parts of the menu
}
A part of it is decent, but other parts you put entire blocks of if/else and switch statements on a single line. I have a pretty wide screen with a 1920x1080 resolution, but some of these lines are even larger then my screen width. These conventions are really: Yyyaaarrrggghhh!!! I suggest if you want your engine to be readable for others and workable for others, that you change your conventions and unify them. Because this actually discourages me from working with your engine..