diff --git a/msvc2003/devilution/comparer-config.toml b/msvc2003/devilution/comparer-config.toml index 9beec6fa..2209efd7 100644 --- a/msvc2003/devilution/comparer-config.toml +++ b/msvc2003/devilution/comparer-config.toml @@ -515,6 +515,94 @@ addr = 0x414B20 name = "SetMapping" addr = 0x414B40 +[[func]] +name = "InitMyChar" +addr = 0x414B50 + +[[func]] +name = "AnimationMyChar" +addr = 0x414BF0 + +[[func]] +name = "ShowMyChar" +addr = 0x415220 + +[[func]] +name = "PutMyChar" +addr = 0x415250 + +[[func]] +name = "ActMyChar_Normal" +addr = 0x4156C0 + +[[func]] +name = "ActMyChar_Stream" +addr = 0x416470 + +[[func]] +name = "ActMyChar" +addr = 0x4168C0 + +[[func]] +name = "AirProcess" +addr = 0x416990 + +[[func]] +name = "GetMyCharPosition" +addr = 0x416AA0 + +[[func]] +name = "SetMyCharPosition" +addr = 0x416AC0 + +[[func]] +name = "MoveMyChar" +addr = 0x416B30 + +[[func]] +name = "ZeroMyCharXMove" +addr = 0x416B50 + +[[func]] +name = "GetUnitMyChar" +addr = 0x416B60 + +[[func]] +name = "SetMyCharDirect" +addr = 0x416B70 + +[[func]] +name = "ChangeMyUnit" +addr = 0x416C40 + +[[func]] +name = "PitMyChar" +addr = 0x416C50 + +[[func]] +name = "EquipItem" +addr = 0x416C70 + +[[func]] +name = "ResetCheck" +addr = 0x416CA0 + +[[func]] +name = "SetNoise" +addr = 0x416CC0 + +[[func]] +name = "CutNoise" +addr = 0x416D40 + +[[func]] +name = "ResetNoise" +addr = 0x416D80 + +[[func]] +name = "SleepNoise" +addr = 0x416DF0 + [[func]] name = "ResetMyCharFlag" addr = 0x416E20 diff --git a/src/MyChar.cpp b/src/MyChar.cpp index 4872b5a0..25f2ebc7 100644 --- a/src/MyChar.cpp +++ b/src/MyChar.cpp @@ -44,7 +44,7 @@ void InitMyChar() gMC.unit = 0; } -void AnimationMyChar(bool bKey) +void AnimationMyChar(BOOL bKey) { RECT rcLeft[12] = { {0, 0, 16, 16}, @@ -76,84 +76,83 @@ void AnimationMyChar(bool bKey) {112, 16, 128, 32}, }; - if (!(gMC.cond & 2)) + if (gMC.cond & 2) + return; + + if (gMC.flag & 8) { - if (gMC.flag & 8) + if (gMC.cond & 1) { - if (gMC.cond & 1) - { - gMC.ani_no = 11; - } - else if (gKey & gKeyUp && (gKeyRight | gKeyLeft) & gKey && bKey) - { - gMC.cond |= 4; + gMC.ani_no = 11; + } + else if (gKey & gKeyUp && (gKeyRight | gKeyLeft) & gKey && bKey) + { + gMC.cond |= 4; - if (++gMC.ani_wait > 4) - { - gMC.ani_wait = 0; - if (++gMC.ani_no == 7 || gMC.ani_no == 9) - PlaySoundObject(24, 1); - } - - if (gMC.ani_no > 9 || gMC.ani_no < 6) - gMC.ani_no = 6; - } - else if ((gKeyRight | gKeyLeft) & gKey && bKey) + if (++gMC.ani_wait > 4) { - gMC.cond |= 4; - - if (++gMC.ani_wait > 4) - { - gMC.ani_wait = 0; - if (++gMC.ani_no == 2 || gMC.ani_no == 4) - PlaySoundObject(24, 1); - } - - if (gMC.ani_no > 4 || gMC.ani_no < 1) - gMC.ani_no = 1; - } - else if (gKey & gKeyUp && bKey) - { - if (gMC.cond & 4) + gMC.ani_wait = 0; + if (++gMC.ani_no == 7 || gMC.ani_no == 9) PlaySoundObject(24, 1); - - gMC.cond &= ~4; - gMC.ani_no = 5; } - else + + if (gMC.ani_no > 9 || gMC.ani_no < 6) + gMC.ani_no = 6; + } + else if ((gKeyRight | gKeyLeft) & gKey && bKey) + { + gMC.cond |= 4; + + if (++gMC.ani_wait > 4) { - if (gMC.cond & 4) + gMC.ani_wait = 0; + if (++gMC.ani_no == 2 || gMC.ani_no == 4) PlaySoundObject(24, 1); - - gMC.cond &= ~4; - gMC.ani_no = 0; } + + if (gMC.ani_no > 4 || gMC.ani_no < 1) + gMC.ani_no = 1; } - else if (gMC.up) + else if (gKey & gKeyUp && bKey) { - gMC.ani_no = 6; - } - else if (gMC.down) - { - gMC.ani_no = 10; - } - else if (gMC.ym <= 0) - { - gMC.ani_no = 3; + if (gMC.cond & 4) + PlaySoundObject(24, 1); + + gMC.cond &= ~4; + gMC.ani_no = 5; } else { - gMC.ani_no = 1; - } + if (gMC.cond & 4) + PlaySoundObject(24, 1); - if (gMC.direct) - gMC.rect = rcRight[gMC.ani_no]; - else - gMC.rect = rcLeft[gMC.ani_no]; + gMC.cond &= ~4; + gMC.ani_no = 0; + } } + else if (gMC.up) + { + gMC.ani_no = 6; + } + else if (gMC.down) + { + gMC.ani_no = 10; + } + else + { + if (gMC.ym > 0) + gMC.ani_no = 1; + else + gMC.ani_no = 3; + } + + if (gMC.direct == 0) + gMC.rect = rcLeft[gMC.ani_no]; + else + gMC.rect = rcRight[gMC.ani_no]; } -void ShowMyChar(bool bShow) +void ShowMyChar(BOOL bShow) { if (bShow) gMC.cond &= ~2; @@ -163,498 +162,539 @@ void ShowMyChar(bool bShow) void PutMyChar(int fx, int fy) { - if ((gMC.cond & 0x80) && !(gMC.cond & 2)) + int arms_offset_y; + + if ((gMC.cond & 0x80) == 0 || (gMC.cond & 2)) + return; + + // Draw weapon + gMC.rect_arms.left = 24 * (gArmsData[gSelectedArms].code % 13); + gMC.rect_arms.right = gMC.rect_arms.left + 24; + gMC.rect_arms.top = 96 * (gArmsData[gSelectedArms].code / 13); + gMC.rect_arms.bottom = gMC.rect_arms.top + 16; + + if (gMC.direct == 2) { - // Draw weapon - gMC.rect_arms.left = 24 * (gArmsData[gSelectedArms].code % 13); - gMC.rect_arms.right = gMC.rect_arms.left + 24; - gMC.rect_arms.top = 96 * (gArmsData[gSelectedArms].code / 13); - gMC.rect_arms.bottom = gMC.rect_arms.top + 16; - - if (gMC.direct == 2) - { - gMC.rect_arms.top += 16; - gMC.rect_arms.bottom += 16; - } - - int arms_offset_y; - if (gMC.up) - { - arms_offset_y = -4; - gMC.rect_arms.top += 32; - gMC.rect_arms.bottom += 32; - } - else if (gMC.down) - { - arms_offset_y = 4; - gMC.rect_arms.top += 64; - gMC.rect_arms.bottom += 64; - } - else - { - arms_offset_y = 0; - } - - if (gMC.ani_no == 1 || gMC.ani_no == 3 || gMC.ani_no == 6 || gMC.ani_no == 8) - ++gMC.rect_arms.top; - - if (gMC.direct) - PutBitmap3( - &grcGame, - (gMC.x - gMC.view.left) / 0x200 - fx / 0x200, - (gMC.y - gMC.view.top) / 0x200 - fy / 0x200 + arms_offset_y, - &gMC.rect_arms, - SURFACE_ID_ARMS); - else - PutBitmap3( - &grcGame, - (gMC.x - gMC.view.left) / 0x200 - fx / 0x200 - 8, - (gMC.y - gMC.view.top) / 0x200 - fy / 0x200 + arms_offset_y, - &gMC.rect_arms, - SURFACE_ID_ARMS); - - if (!((gMC.shock >> 1) & 1)) - { - // Draw player - RECT rect = gMC.rect; - if (gMC.equip & 0x40) - { - rect.top += 32; - rect.bottom += 32; - } - - PutBitmap3(&grcGame, (gMC.x - gMC.view.left) / 0x200 - fx / 0x200, (gMC.y - gMC.view.top) / 0x200 - fy / 0x200, &rect, SURFACE_ID_MY_CHAR); - - // Draw air tank - RECT rcBubble[2] = { - {56, 96, 80, 120}, - {80, 96, 104, 120}, - }; - - ++gMC.bubble; - if (gMC.equip & 0x10 && gMC.flag & 0x100) - PutBitmap3(&grcGame, gMC.x / 0x200 - 12 - fx / 0x200, gMC.y / 0x200 - 12 - fy / 0x200, &rcBubble[(gMC.bubble >> 1) & 1], SURFACE_ID_CARET); - else if (gMC.unit == 1) - PutBitmap3(&grcGame, gMC.x / 0x200 - 12 - fx / 0x200, gMC.y / 0x200 - 12 - fy / 0x200, &rcBubble[(gMC.bubble >> 1) & 1], SURFACE_ID_CARET); - } + gMC.rect_arms.top += 16; + gMC.rect_arms.bottom += 16; } + + if (gMC.up) + { + arms_offset_y = -4; + gMC.rect_arms.top += 32; + gMC.rect_arms.bottom += 32; + } + else if (gMC.down) + { + arms_offset_y = 4; + gMC.rect_arms.top += 64; + gMC.rect_arms.bottom += 64; + } + else + { + arms_offset_y = 0; + } + + if (gMC.ani_no == 1 || gMC.ani_no == 3 || gMC.ani_no == 6 || gMC.ani_no == 8) + ++gMC.rect_arms.top; + + if (gMC.direct == 0) + PutBitmap3( + &grcGame, + (gMC.x - gMC.view.left) / 0x200 - fx / 0x200 - 8, + (gMC.y - gMC.view.top) / 0x200 - fy / 0x200 + arms_offset_y, + &gMC.rect_arms, + SURFACE_ID_ARMS); + else + PutBitmap3( + &grcGame, + (gMC.x - gMC.view.left) / 0x200 - fx / 0x200, + (gMC.y - gMC.view.top) / 0x200 - fy / 0x200 + arms_offset_y, + &gMC.rect_arms, + SURFACE_ID_ARMS); + + if ((gMC.shock / 2) % 2) + return; + + // Draw player + RECT rect = gMC.rect; + if (gMC.equip & 0x40) + { + rect.top += 32; + rect.bottom += 32; + } + + PutBitmap3(&grcGame, (gMC.x - gMC.view.left) / 0x200 - fx / 0x200, (gMC.y - gMC.view.top) / 0x200 - fy / 0x200, &rect, SURFACE_ID_MY_CHAR); + + // Draw air tank + RECT rcBubble[2] = { + {56, 96, 80, 120}, + {80, 96, 104, 120}, + }; + + ++gMC.bubble; + if (gMC.equip & 0x10 && gMC.flag & 0x100) + PutBitmap3(&grcGame, gMC.x / 0x200 - 12 - fx / 0x200, gMC.y / 0x200 - 12 - fy / 0x200, &rcBubble[(gMC.bubble / 2) % 2], SURFACE_ID_CARET); + else if (gMC.unit == 1) + PutBitmap3(&grcGame, gMC.x / 0x200 - 12 - fx / 0x200, gMC.y / 0x200 - 12 - fy / 0x200, &rcBubble[(gMC.bubble / 2) % 2], SURFACE_ID_CARET); } -void ActMyChar_Normal(bool bKey) +void ActMyChar_Normal(BOOL bKey) { - if (!(gMC.cond & 2)) - { - // Get speeds and accelerations - int max_dash; - int gravity1; - int gravity2; - int jump; - int dash1; - int dash2; - int resist; + // Get speeds and accelerations + int max_move; // Unused + int max_dash; + int gravity1; + int gravity2; + int jump; + int dash1; + int dash2; + int resist; - if (gMC.flag & 0x100) + int a; + int x; + + if (gMC.cond & 2) + return; + + if (gMC.flag & 0x100) + { + max_dash = 0x196; + max_move = 0x2FF; + gravity1 = 0x28; + gravity2 = 0x10; + jump = 0x280; + dash1 = 0x2A; + dash2 = 0x10; + resist = 0x19; + } + else + { + max_dash = 0x32C; + max_move = 0x5FF; + gravity1 = 0x50; + gravity2 = 0x20; + jump = 0x500; + dash1 = 0x55; + dash2 = 0x20; + resist = 0x33; + } + + // Don't create "?" effect + gMC.ques = 0; + + // If can't control player, stop boosting + if (!bKey) + gMC.boost_sw = 0; + + // Movement on the ground + if (gMC.flag & 8 || gMC.flag & 0x10 || gMC.flag & 0x20) + { + // Stop boosting and refuel + gMC.boost_sw = 0; + + if (gMC.equip & 1) { - max_dash = 0x196; - gravity1 = 0x28; - gravity2 = 0x10; - jump = 0x280; - dash1 = 0x2A; - dash2 = 0x10; - resist = 0x19; + gMC.boost_cnt = 50; + } + else if (gMC.equip & 0x20) + { + gMC.boost_cnt = 50; } else { - max_dash = 0x32C; - gravity1 = 0x50; - gravity2 = 0x20; - jump = 0x500; - dash1 = 0x55; - dash2 = 0x20; - resist = 0x33; + gMC.boost_cnt = 0; } - // Don't create "?" effect - gMC.ques = 0; - - // If can't control player, stop boosting - if (!bKey) - gMC.boost_sw = 0; - - // Movement on the ground - if (gMC.flag & 8 || gMC.flag & 0x10 || gMC.flag & 0x20) + // Move in direction held + if (bKey) { - // Stop boosting and refuel - gMC.boost_sw = 0; - - if (gMC.equip & 1) + if (gKeyTrg == gKeyDown && gKey == gKeyDown && (gMC.cond & 1) == 0 && (g_GameFlags & 4) == 0) { - gMC.boost_cnt = 50; + gMC.cond |= 1; + gMC.ques = 1; } - else if (gMC.equip & 0x20) + else if (gKey == gKeyDown) { - gMC.boost_cnt = 50; + } else { - gMC.boost_cnt = 0; - } - - // Move in direction held - if (bKey) - { - if (gKeyTrg != gKeyDown || gKey != gKeyDown || (gMC.cond & 1) || g_GameFlags & 4) - { - if (gKey != gKeyDown) - { - if (gKey & gKeyLeft && gMC.xm > -max_dash) - gMC.xm -= dash1; - if (gKey & gKeyRight && gMC.xm < max_dash) - gMC.xm += dash1; - - if (gKey & gKeyLeft) - gMC.direct = 0; - if (gKey & gKeyRight) - gMC.direct = 2; - } - } - else - { - gMC.cond |= 1; - gMC.ques = 1; - } - } - - // Friction - if (!(gMC.cond & 0x20)) - { - if (gMC.xm < 0) - { - if (gMC.xm <= -resist) - gMC.xm += resist; - else - gMC.xm = 0; - } - if (gMC.xm > 0) - { - if (gMC.xm >= resist) - gMC.xm -= resist; - else - gMC.xm = 0; - } - } - } - else - { - // Start boosting - if (bKey) - { - if (gMC.equip & 0x21 && gKeyTrg & gKeyJump && gMC.boost_cnt) - { - // Booster 0.8 - if (gMC.equip & 1) - { - gMC.boost_sw = 1; - if (gMC.ym > 0x100) - gMC.ym /= 2; - } - - // Booster 2.0 - if (gMC.equip & 0x20) - { - if (gKey & gKeyUp) - { - gMC.boost_sw = 2; - gMC.xm = 0; - gMC.ym = -0x5FF; - } - else if (gKey & gKeyLeft) - { - gMC.boost_sw = 1; - gMC.ym = 0; - gMC.xm = -0x5FF; - } - else if (gKey & gKeyRight) - { - gMC.boost_sw = 1; - gMC.ym = 0; - gMC.xm = 0x5FF; - } - else if (gKey & gKeyDown) - { - gMC.boost_sw = 3; - gMC.xm = 0; - gMC.ym = 0x5FF; - } - else - { - gMC.boost_sw = 2; - gMC.xm = 0; - gMC.ym = -0x5FF; - } - } - } - - // Move left and right if (gKey & gKeyLeft && gMC.xm > -max_dash) - gMC.xm -= dash2; + gMC.xm -= dash1; if (gKey & gKeyRight && gMC.xm < max_dash) - gMC.xm += dash2; + gMC.xm += dash1; if (gKey & gKeyLeft) gMC.direct = 0; if (gKey & gKeyRight) gMC.direct = 2; } - - // Slow down when stopped boosting (Booster 2.0) - if (gMC.equip & 0x20 && gMC.boost_sw && (!(gKey & gKeyJump) || !gMC.boost_cnt)) - { - if (gMC.boost_sw == 1) - gMC.xm /= 2; - else if (gMC.boost_sw == 2) - gMC.ym /= 2; - } - - // Stop boosting - if (!gMC.boost_cnt || !(gKey & gKeyJump)) - gMC.boost_sw = 0; } - // Jumping + // Friction + if (!(gMC.cond & 0x20)) + { + if (gMC.xm < 0) + { + if (gMC.xm > -resist) + gMC.xm = 0; + else + gMC.xm += resist; + } + if (gMC.xm > 0) + { + if (gMC.xm < resist) + gMC.xm = 0; + else + gMC.xm -= resist; + } + } + } + else + { + // Start boosting if (bKey) { - // Look up and down - gMC.up = (gKey & gKeyUp) != 0; - gMC.down = gKey & gKeyDown && !(gMC.flag & 8); + if (gMC.equip & 0x21 && gKeyTrg & gKeyJump && gMC.boost_cnt) + { + // Booster 0.8 + if (gMC.equip & 1) + { + gMC.boost_sw = 1; + if (gMC.ym > 0x100) + gMC.ym /= 2; + } - if (gKeyTrg & gKeyJump - && (gMC.flag & 8 || gMC.flag & 0x10 || gMC.flag & 0x20) - && !(gMC.flag & 0x2000)) + // Booster 2.0 + if (gMC.equip & 0x20) + { + if (gKey & gKeyUp) + { + gMC.boost_sw = 2; + gMC.xm = 0; + gMC.ym = -0x5FF; + } + else if (gKey & gKeyLeft) + { + gMC.boost_sw = 1; + gMC.ym = 0; + gMC.xm = -0x5FF; + } + else if (gKey & gKeyRight) + { + gMC.boost_sw = 1; + gMC.ym = 0; + gMC.xm = 0x5FF; + } + else if (gKey & gKeyDown) + { + gMC.boost_sw = 3; + gMC.xm = 0; + gMC.ym = 0x5FF; + } + else + { + gMC.boost_sw = 2; + gMC.xm = 0; + gMC.ym = -0x5FF; + } + } + } + + // Move left and right + if (gKey & gKeyLeft && gMC.xm > -max_dash) + gMC.xm -= dash2; + if (gKey & gKeyRight && gMC.xm < max_dash) + gMC.xm += dash2; + + if (gKey & gKeyLeft) + gMC.direct = 0; + if (gKey & gKeyRight) + gMC.direct = 2; + } + + // Slow down when stopped boosting (Booster 2.0) + if (gMC.equip & 0x20 && gMC.boost_sw && (!(gKey & gKeyJump) || !gMC.boost_cnt)) + { + if (gMC.boost_sw == 1) + gMC.xm /= 2; + else if (gMC.boost_sw == 2) + gMC.ym /= 2; + } + + // Stop boosting + if (!gMC.boost_cnt || !(gKey & gKeyJump)) + gMC.boost_sw = 0; + } + + // Jumping + if (bKey) + { + // Look up and down + if (gKey & gKeyUp) + gMC.up = TRUE; + else + gMC.up = FALSE; + + if (gKey & gKeyDown && (gMC.flag & 8) == 0) + gMC.down = TRUE; + else + gMC.down = FALSE; + + if (gKeyTrg & gKeyJump + && (gMC.flag & 8 || gMC.flag & 0x10 || gMC.flag & 0x20)) + { + if (gMC.flag & 0x2000) + { + // Another weird empty case needed for accurate assembly + } + else { gMC.ym = -jump; PlaySoundObject(15, 1); } } + } - // Stop interacting when moved - if (bKey && (gKeyShot | gKeyJump | gKeyUp | gKeyRight | gKeyLeft) & gKey) - gMC.cond &= ~1; + // Stop interacting when moved + if (bKey && (gKeyShot | gKeyJump | gKeyUp | gKeyRight | gKeyLeft) & gKey) + gMC.cond &= ~1; - // Booster losing fuel - if (gMC.boost_sw && gMC.boost_cnt) - --gMC.boost_cnt; + // Booster losing fuel + if (gMC.boost_sw && gMC.boost_cnt) + --gMC.boost_cnt; - // Wind / current forces - if (gMC.flag & 0x1000) - gMC.xm -= 0x88; - if (gMC.flag & 0x2000) - gMC.ym -= 0x80; - if (gMC.flag & 0x4000) - gMC.xm += 0x88; - if (gMC.flag & 0x8000) - gMC.ym += 0x55; + // Wind / current forces + if (gMC.flag & 0x1000) + gMC.xm -= 0x88; + if (gMC.flag & 0x2000) + gMC.ym -= 0x80; + if (gMC.flag & 0x4000) + gMC.xm += 0x88; + if (gMC.flag & 0x8000) + gMC.ym += 0x55; - // Booster 2.0 forces and effects - if (gMC.equip & 0x20 && gMC.boost_sw) + // Booster 2.0 forces and effects + if (gMC.equip & 0x20 && gMC.boost_sw) + { + if (gMC.boost_sw == 1) { - if (gMC.boost_sw == 1) - { - // Go up when going into a wall - if (gMC.flag & 5) - gMC.ym = -0x100; + // Go up when going into a wall + if (gMC.flag & 5) + gMC.ym = -0x100; - // Move in direction facing + // Move in direction facing + if (!gMC.direct) + gMC.xm -= 0x20; + if (gMC.direct == 2) + gMC.xm += 0x20; + + // Boost particles (and sound) + if (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1) + { if (!gMC.direct) - gMC.xm -= 0x20; + SetCaret(gMC.x + 0x400, gMC.y + 0x400, 7, 2); if (gMC.direct == 2) - gMC.xm += 0x20; + SetCaret(gMC.x - 0x400, gMC.y + 0x400, 7, 0); - // Boost particles (and sound) - if (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1) - { - if (!gMC.direct) - SetCaret(gMC.x + 0x400, gMC.y + 0x400, 7, 2); - if (gMC.direct == 2) - SetCaret(gMC.x - 0x400, gMC.y + 0x400, 7, 0); - - PlaySoundObject(113, 1); - } - } - else if (gMC.boost_sw == 2) - { - // Move upwards - gMC.ym -= 0x20; - - // Boost particles (and sound) - if (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1) - { - SetCaret(gMC.x, gMC.y + 0xC00, 7, 3); - PlaySoundObject(113, 1); - } - } - else if (gMC.boost_sw == 3 && (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1)) - { - // Boost particles (and sound) - SetCaret(gMC.x, gMC.y - 0xC00, 7, 1); PlaySoundObject(113, 1); } } - // Upwards wind/current - else if (gMC.flag & 0x2000) + else if (gMC.boost_sw == 2) { - gMC.ym += gravity1; - } - // Booster 0.8 - else if (gMC.equip & 1 && gMC.boost_sw && gMC.ym > -0x400) - { - // Upwards force + // Move upwards gMC.ym -= 0x20; - if (!(gMC.boost_cnt % 3)) + // Boost particles (and sound) + if (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1) { - SetCaret(gMC.x, gMC.hit.bottom / 2 + gMC.y, 7, 3); + SetCaret(gMC.x, gMC.y + 0xC00, 7, 3); PlaySoundObject(113, 1); } - - // Bounce off of ceiling - if (gMC.flag & 2) - gMC.ym = 0x200; } - // Gravity while jump is held - else if (gMC.ym < 0 && bKey && gKey & gKeyJump) + else if (gMC.boost_sw == 3 && (gKeyTrg & gKeyJump || gMC.boost_cnt % 3 == 1)) { - gMC.ym += gravity2; + // Boost particles (and sound) + SetCaret(gMC.x, gMC.y - 0xC00, 7, 1); + PlaySoundObject(113, 1); } - // Normal gravity + } + // Upwards wind/current + else if (gMC.flag & 0x2000) + { + gMC.ym += gravity1; + } + // Booster 0.8 + else if (gMC.equip & 1 && gMC.boost_sw && gMC.ym > -0x400) + { + // Upwards force + gMC.ym -= 0x20; + + if (!(gMC.boost_cnt % 3)) + { + SetCaret(gMC.x, gMC.hit.bottom / 2 + gMC.y, 7, 3); + PlaySoundObject(113, 1); + } + + // Bounce off of ceiling + if (gMC.flag & 2) + gMC.ym = 0x200; + } + // Gravity while jump is held + else if (gMC.ym < 0 && bKey && gKey & gKeyJump) + { + gMC.ym += gravity2; + } + // Normal gravity + else + { + gMC.ym += gravity1; + } + + // Keep player on slopes + if (!bKey || !(gKeyTrg & gKeyJump)) + { + if (gMC.flag & 0x10 && gMC.xm < 0) + gMC.ym = -gMC.xm; + if (gMC.flag & 0x20 && gMC.xm > 0) + gMC.ym = gMC.xm; + if (gMC.flag & 8 && gMC.flag & 0x80000 && gMC.xm < 0) + gMC.ym = 0x400; + if (gMC.flag & 8 && gMC.flag & 0x10000 && gMC.xm > 0) + gMC.ym = 0x400; + if (gMC.flag & 8 && gMC.flag & 0x20000 && gMC.flag & 0x40000) + gMC.ym = 0x400; + } + + if (0) + { + // There used to be an if here that didn't do anything, but the compiler optimised it out. + // We only know this was here because empty ifs mess with the register usage. + // Since there's no code, we have no idea what the original condition actually was. + } + + // Limit speed + if ((gMC.flag & 0x100) && (gMC.flag & 0xF000) == 0) + { + if (gMC.xm < -0x2FF) + gMC.xm = -0x2FF; + if (gMC.xm > 0x2FF) + gMC.xm = 0x2FF; + if (gMC.ym < -0x2FF) + gMC.ym = -0x2FF; + if (gMC.ym > 0x2FF) + gMC.ym = 0x2FF; + } + else + { + if (gMC.xm < -0x5FF) + gMC.xm = -0x5FF; + if (gMC.xm > 0x5FF) + gMC.xm = 0x5FF; + if (gMC.ym < -0x5FF) + gMC.ym = -0x5FF; + if (gMC.ym > 0x5FF) + gMC.ym = 0x5FF; + } + + // Water splashing + if (!gMC.sprash && gMC.flag & 0x100) + { + int dir; + if (gMC.flag & 0x800) + dir = 2; else - { - gMC.ym += gravity1; - } + dir = 0; - // Keep player on slopes - if (bKey && !(gKeyTrg & gKeyJump)) + if ((gMC.flag & 8) == 0 && gMC.ym > 0x200) { - if (gMC.flag & 0x10 && gMC.xm < 0) - gMC.ym = -gMC.xm; - if (gMC.flag & 0x20 && gMC.xm > 0) - gMC.ym = gMC.xm; - if (gMC.flag & 8 && gMC.flag & 0x80000 && gMC.xm < 0) - gMC.ym = 0x400; - if (gMC.flag & 8 && gMC.flag & 0x10000 && gMC.xm > 0) - gMC.ym = 0x400; - if (gMC.flag & 8 && gMC.flag & 0x20000 && gMC.flag & 0x40000) - gMC.ym = 0x400; - } - - // Limit speed - if (!(gMC.flag & 0x100) || gMC.flag & 0xF000) - { - if (gMC.xm < -0x5FF) - gMC.xm = -0x5FF; - if (gMC.xm > 0x5FF) - gMC.xm = 0x5FF; - if (gMC.ym < -0x5FF) - gMC.ym = -0x5FF; - if (gMC.ym > 0x5FF) - gMC.ym = 0x5FF; - } - else - { - if (gMC.xm < -0x2FF) - gMC.xm = -0x2FF; - if (gMC.xm > 0x2FF) - gMC.xm = 0x2FF; - if (gMC.ym < -0x2FF) - gMC.ym = -0x2FF; - if (gMC.ym > 0x2FF) - gMC.ym = 0x2FF; - } - - // Water splashing - if (!gMC.sprash && gMC.flag & 0x100) - { - int dir; - if (gMC.flag & 0x800) - dir = 2; - else - dir = 0; - - if (gMC.flag & 8 || gMC.ym <= 0x200) + for (a = 0; a < 8; a++) { - if (gMC.xm > 0x200 || gMC.xm < -0x200) - { - for (int a = 0; a < 8; a++) - SetNpChar(73, gMC.x + (Random(-8, 8) << 9), gMC.y, gMC.xm + Random(-0x200, 0x200), Random(-0x200, 0x80), dir, 0, 0); - - PlaySoundObject(56, 1); - } + x = gMC.x + (Random(-8, 8) * 0x200); + SetNpChar(73, x, gMC.y, gMC.xm + Random(-0x200, 0x200), Random(-0x200, 0x80) - gMC.ym / 2, dir, 0, 0); } - else + + PlaySoundObject(56, 1); + } + else + { + if (gMC.xm > 0x200 || gMC.xm < -0x200) { - for (int a = 0; a < 8; a++) - SetNpChar(73, gMC.x + (Random(-8, 8) << 9), gMC.y, gMC.xm + Random(-0x200, 0x200), Random(-0x200, 0x80) - gMC.ym / 2, dir, 0, 0); + for (a = 0; a < 8; a++) + { + x = gMC.x + (Random(-8, 8) * 0x200); + SetNpChar(73, x, gMC.y, gMC.xm + Random(-0x200, 0x200), Random(-0x200, 0x80), dir, 0, 0); + } PlaySoundObject(56, 1); } - - gMC.sprash = 1; } - if (!(gMC.flag & 0x100)) - gMC.sprash = 0; - - // Spike damage - if (gMC.flag & 0x400) - DamageMyChar(10); - - // Camera - if (gMC.direct) - { - gMC.index_x += 0x200; - if (gMC.index_x > 0x8000) - gMC.index_x = 0x8000; - } - else - { - gMC.index_x -= 0x200; - if (gMC.index_x < -0x8000) - gMC.index_x = -0x8000; - } - if (gKey & gKeyUp && bKey) - { - gMC.index_y -= 0x200; - if (gMC.index_y < -0x8000) - gMC.index_y = -0x8000; - } - else if (gKey & gKeyDown && bKey) - { - gMC.index_y += 0x200; - if (gMC.index_y > 0x8000) - gMC.index_y = 0x8000; - } - else - { - if (gMC.index_y > 0x200) - gMC.index_y -= 0x200; - if (gMC.index_y < -0x200) - gMC.index_y += 0x200; - } - - gMC.tgt_x = gMC.x + gMC.index_x; - gMC.tgt_y = gMC.y + gMC.index_y; - - // Change position - if (gMC.xm > resist || gMC.xm < -resist) - gMC.x += gMC.xm; - gMC.y += gMC.ym; + gMC.sprash = 1; } + + if (!(gMC.flag & 0x100)) + gMC.sprash = 0; + + // Spike damage + if (gMC.flag & 0x400) + DamageMyChar(10); + + // Camera + if (gMC.direct == 0) + { + gMC.index_x -= 0x200; + if (gMC.index_x < -0x8000) + gMC.index_x = -0x8000; + } + else + { + gMC.index_x += 0x200; + if (gMC.index_x > 0x8000) + gMC.index_x = 0x8000; + } + if (gKey & gKeyUp && bKey) + { + gMC.index_y -= 0x200; + if (gMC.index_y < -0x8000) + gMC.index_y = -0x8000; + } + else if (gKey & gKeyDown && bKey) + { + gMC.index_y += 0x200; + if (gMC.index_y > 0x8000) + gMC.index_y = 0x8000; + } + else + { + if (gMC.index_y > 0x200) + gMC.index_y -= 0x200; + if (gMC.index_y < -0x200) + gMC.index_y += 0x200; + } + + gMC.tgt_x = gMC.x + gMC.index_x; + gMC.tgt_y = gMC.y + gMC.index_y; + + // Change position + if (gMC.xm <= resist && gMC.xm >= -resist) + { + // Okay, this is getting stupid. Why the HELL is the code written like this? + } + else + { + gMC.x += gMC.xm; + } + + gMC.y += gMC.ym; } -void ActMyChar_Stream(bool bKey) +void ActMyChar_Stream(BOOL bKey) { - gMC.up = false; - gMC.down = false; + gMC.up = FALSE; + gMC.down = FALSE; if (bKey) { @@ -666,17 +706,18 @@ void ActMyChar_Stream(bool bKey) if (gKey & gKeyRight) gMC.xm += 0x100; } - else if (gMC.xm > 0x7F || gMC.xm < -0x7F) - { - if (gMC.xm > 0) - gMC.xm -= 0x80; - else if (gMC.xm < 0) - gMC.xm += 0x80; - } - else + else if (gMC.xm < 0x80 && gMC.xm > -0x80) { gMC.xm = 0; } + else if (gMC.xm > 0) + { + gMC.xm -= 0x80; + } + else if (gMC.xm < 0) + { + gMC.xm += 0x80; + } if (gKey & (gKeyDown | gKeyUp)) { @@ -686,43 +727,34 @@ void ActMyChar_Stream(bool bKey) if (gKey & gKeyDown) gMC.ym += 0x100; } - else if (gMC.ym > 0x7F || gMC.ym < -0x7F) - { - if (gMC.ym > 0) - gMC.ym -= 0x80; - else if (gMC.ym < 0) - gMC.ym += 0x80; - } - else + else if (gMC.ym < 0x80 && gMC.ym > -0x80) { gMC.ym = 0; } + else if (gMC.ym > 0) + { + gMC.ym -= 0x80; + } + else if (gMC.ym < 0) + { + gMC.ym += 0x80; + } } else { - if (gMC.xm > 0x7F || gMC.xm < -0x3F) - { - if (gMC.xm > 0) - gMC.xm -= 0x80; - else if (gMC.xm < 0) - gMC.xm += 0x80; - } - else - { + if (gMC.xm < 0x80 && gMC.xm > -0x40) gMC.xm = 0; - } + else if (gMC.xm > 0) + gMC.xm -= 0x80; + else if (gMC.xm < 0) + gMC.xm += 0x80; - if (gMC.ym > 0x7F || gMC.ym < -0x3F) - { - if (gMC.ym > 0) - gMC.ym -= 0x80; - else if (gMC.ym < 0) - gMC.ym += 0x80; - } - else - { + if (gMC.ym < 0x80 && gMC.ym > -0x40) gMC.ym = 0; - } + else if (gMC.ym > 0) + gMC.ym -= 0x80; + else if (gMC.ym < 0) + gMC.ym += 0x80; } if (gMC.ym < -0x200 && gMC.flag & 2) @@ -785,7 +817,11 @@ void AirProcess() } else { - if (gMC.flag & 0x100) + if ((gMC.flag & 0x100) == 0) + { + gMC.air = 1000; + } + else { if (--gMC.air <= 0) { @@ -799,19 +835,15 @@ void AirProcess() // Drown StartTextScript(41); - if (gMC.direct) - SetCaret(gMC.x, gMC.y, 8, 2); - else + if (gMC.direct == 0) SetCaret(gMC.x, gMC.y, 8, 0); + else + SetCaret(gMC.x, gMC.y, 8, 2); gMC.cond &= ~0x80; } } } - else - { - gMC.air = 1000; - } if (gMC.flag & 0x100) { @@ -824,41 +856,38 @@ void AirProcess() } } -void ActMyChar(bool bKey) +void ActMyChar(BOOL bKey) { - if (gMC.cond & 0x80) + if ((gMC.cond & 0x80) == 0) + return; + + if (gMC.exp_wait) + --gMC.exp_wait; + + if (gMC.shock) { - if (gMC.exp_wait) - --gMC.exp_wait; - - if (gMC.shock) - { - --gMC.shock; - } - else if (gMC.exp_count) - { - SetValueView(&gMC.x, &gMC.y, gMC.exp_count); - gMC.exp_count = 0; - } - - switch (gMC.unit) - { - case 0: - if (!(g_GameFlags & 4) && bKey) - AirProcess(); - ActMyChar_Normal(bKey); - break; - - case 1: - ActMyChar_Stream(bKey); - break; - - default: - break; - } - - gMC.cond &= ~0x20; + --gMC.shock; } + else if (gMC.exp_count) + { + SetValueView(&gMC.x, &gMC.y, gMC.exp_count); + gMC.exp_count = 0; + } + + switch (gMC.unit) + { + case 0: + if (!(g_GameFlags & 4) && bKey) + AirProcess(); + ActMyChar_Normal(bKey); + break; + + case 1: + ActMyChar_Stream(bKey); + break; + } + + gMC.cond &= ~0x20; } void GetMyCharPosition(int *x, int *y) @@ -871,8 +900,8 @@ void SetMyCharPosition(int x, int y) { gMC.x = x; gMC.y = y; - gMC.tgt_x = x; - gMC.tgt_y = y; + gMC.tgt_x = gMC.x; + gMC.tgt_y = gMC.y; gMC.index_x = 0; gMC.index_y = 0; gMC.xm = 0; @@ -897,42 +926,41 @@ int GetUnitMyChar() return gMC.unit; } -void SetMyCharDirect(uint8_t dir) +void SetMyCharDirect(unsigned char dir) { - switch (dir) + if (dir == 3) { - case 3: - gMC.cond |= 1; - break; - - default: - gMC.cond &= ~1; - - if (dir < 10) - { - gMC.direct = dir; - break; - } + gMC.cond |= 1; + } + else + { + gMC.cond &= ~1; + if (dir < 10) + { + gMC.direct = dir; + } + else + { for (int i = 0; i < NPC_MAX; i++) - { if (gNPC[i].code_event == dir) - { - if (gMC.x <= gNPC[i].x) - gMC.direct = 2; - else - gMC.direct = 0; break; - } - } - break; + + if (i == NPC_MAX) + return; + + if (gMC.x > gNPC[i].x) + gMC.direct = 0; + else + gMC.direct = 2; + } } gMC.xm = 0; - AnimationMyChar(false); + AnimationMyChar(FALSE); } -void ChangeMyUnit(uint8_t a) +void ChangeMyUnit(unsigned char a) { gMC.unit = a; } @@ -942,7 +970,7 @@ void PitMyChar() gMC.y += 0x4000; } -void EquipItem(int flag, bool b) +void EquipItem(int flag, BOOL b) { if (b) gMC.equip |= flag; @@ -960,16 +988,18 @@ void SetNoise(int no, int freq) noise_freq = freq; noise_no = no; - if (no == 1) + switch (noise_no) { - ChangeSoundFrequency(40, noise_freq); - ChangeSoundFrequency(41, noise_freq + 100); - PlaySoundObject(40, -1); - PlaySoundObject(41, -1); - } - else if (no == 2) - { - PlaySoundObject(58, -1); + case 1: + ChangeSoundFrequency(40, noise_freq); + ChangeSoundFrequency(41, noise_freq + 100); + PlaySoundObject(40, -1); + PlaySoundObject(41, -1); + break; + + case 2: + PlaySoundObject(58, -1); + break; } } @@ -983,16 +1013,18 @@ void CutNoise() void ResetNoise() { - if (noise_no == 1) + switch (noise_no) { - ChangeSoundFrequency(40, noise_freq); - ChangeSoundFrequency(41, noise_freq + 100); - PlaySoundObject(40, -1); - PlaySoundObject(41, -1); - } - else if (noise_no == 2) - { - PlaySoundObject(58, -1); + case 1: + ChangeSoundFrequency(40, noise_freq); + ChangeSoundFrequency(41, noise_freq + 100); + PlaySoundObject(40, -1); + PlaySoundObject(41, -1); + break; + + case 2: + PlaySoundObject(58, -1); + break; } } diff --git a/src/MyChar.h b/src/MyChar.h index a3d568c1..252fcf68 100644 --- a/src/MyChar.h +++ b/src/MyChar.h @@ -6,11 +6,11 @@ struct MYCHAR { - uint8_t cond; + unsigned char cond; unsigned int flag; int direct; - int up; - int down; + BOOL up; + BOOL down; int unit; int equip; int x; @@ -30,41 +30,41 @@ struct MYCHAR int level; int exp_wait; int exp_count; - uint8_t shock; - uint8_t no_life; - uint8_t rensha; - uint8_t bubble; - int16_t life; - int16_t star; - int16_t max_life; - int16_t a; + unsigned char shock; + unsigned char no_life; + unsigned char rensha; + unsigned char bubble; + short life; + short star; + short max_life; + short a; int lifeBr; int lifeBr_count; int air; int air_get; - int8_t sprash; - int8_t ques; - int8_t boost_sw; + signed char sprash; + signed char ques; + signed char boost_sw; int boost_cnt; }; extern MYCHAR gMC; void InitMyChar(); -void AnimationMyChar(bool bKey); -void ShowMyChar(bool bShow); +void AnimationMyChar(BOOL bKey); +void ShowMyChar(BOOL bShow); void PutMyChar(int fx, int fy); -void ActMyChar_Normal(bool bKey); -void ActMyChar(bool bKey); +void ActMyChar_Normal(BOOL bKey); +void ActMyChar(BOOL bKey); void GetMyCharPosition(int *x, int *y); void SetMyCharPosition(int x, int y); void MoveMyChar(int x, int y); void ZeroMyCharXMove(); int GetUnitMyChar(); -void SetMyCharDirect(uint8_t dir); -void ChangeMyUnit(uint8_t a); +void SetMyCharDirect(unsigned char dir); +void ChangeMyUnit(unsigned char a); void PitMyChar(); -void EquipItem(int flag, bool b); +void EquipItem(int flag, BOOL b); void ResetCheck(); void SetNoise(int no, int freq); void CutNoise();