From 13d8853431dfe9066263e870dbdf4ef6980e34cd Mon Sep 17 00:00:00 2001 From: Treeki Date: Fri, 2 Nov 2012 22:45:11 +0100 Subject: fixed player stunning with bossMegaGoomba --- bossMegaGoomba.yaml | 5 +++++ kamek_pal.x | 4 ++-- src/bossMegaGoomba.cpp | 47 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 46 insertions(+), 10 deletions(-) diff --git a/bossMegaGoomba.yaml b/bossMegaGoomba.yaml index 6edc7cd..869c2a2 100644 --- a/bossMegaGoomba.yaml +++ b/bossMegaGoomba.yaml @@ -13,3 +13,8 @@ hooks: src_addr_pal: 0x8031B1B4 target_func: 'MGarcNameList' # 0x8031AB4C + sprite num * 0x4 == offset + + - {name: ShakePlayerFix1, type: nop_insn, area_pal: 0x80B601AC} + - {name: ShakePlayerFix2, type: nop_insn, area_pal: [0x80B601F0, 0x80B601F4]} + - {name: ShakePlayerFix1, type: nop_insn, area_pal: 0x80B601AC} + diff --git a/kamek_pal.x b/kamek_pal.x index 66af909..0438488 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -132,8 +132,8 @@ SECTIONS { ShakeScreen = 0x800D8D50; StageScreen = 0x8042A2E8; - ShakePlayers = 0x80B60180; - StopPlayerShake = 0x80B60220; + stunPlayer = 0x80137650; + unstunPlayer = 0x80137790; createChild__13dStageActor_cF6ActorsP13dStageActor_cUiP7Point3dP6S16VecUc = 0x80064680; GameMgrBossEndFunc = 0x8001CDB0; diff --git a/src/bossMegaGoomba.cpp b/src/bossMegaGoomba.cpp index 79ebd34..a6758f4 100644 --- a/src/bossMegaGoomba.cpp +++ b/src/bossMegaGoomba.cpp @@ -4,8 +4,6 @@ #include #include "boss.h" -extern "C" void *ShakePlayers(dEn_c *); -extern "C" void *StopPlayerShake(dEn_c *); extern "C" void *StageScreen; const char* MGarcNameList [] = { @@ -87,6 +85,11 @@ class daMegaGoomba_c : public dEn_c { void updateModelMatrices(); + void stunPlayers(); + void unstunPlayers(); + + bool playerStunned[4]; + // bool preSpriteCollision(ActivePhysics *apThis, ActivePhysics *apOther); // bool prePlayerCollision(ActivePhysics *apThis, ActivePhysics *apOther); // bool preYoshiCollision(ActivePhysics *apThis, ActivePhysics *apOther); @@ -653,17 +656,17 @@ void daMegaGoomba_c::executeState_Turn() { int frame = (int)(this->animationChr.getCurrentFrame() * 5.0); if ((frame == 100) || (frame == 325) || (frame == 550) || (frame == 775)) { ShakeScreen(StageScreen, 0, 1, 0, 0); - ShakePlayers(this); + stunPlayers(); PlaySound(this, SE_BOSS_MORTON_GROUND_SHAKE); } if (isBigBoss) { if ((frame == 250) || (frame == 500) || (frame == 700) || (frame == 900)) - StopPlayerShake(this); + unstunPlayers(); } else { if ((frame == 200) || (frame == 425) || (frame == 650) || (frame == 875)) - StopPlayerShake(this); + unstunPlayers(); } } void daMegaGoomba_c::endState_Turn() { @@ -709,17 +712,17 @@ void daMegaGoomba_c::executeState_Walk() { int frame = (int)(this->animationChr.getCurrentFrame() * 5.0); if ((frame == 100) || (frame == 325) || (frame == 550) || (frame == 775)) { ShakeScreen(StageScreen, 0, 1, 0, 0); - ShakePlayers(this); + stunPlayers(); PlaySound(this, SE_BOSS_MORTON_GROUND_SHAKE); } if (isBigBoss) { if ((frame == 250) || (frame == 500) || (frame == 700) || (frame == 900)) - StopPlayerShake(this); + unstunPlayers(); } else { if ((frame == 200) || (frame == 425) || (frame == 650) || (frame == 875)) - StopPlayerShake(this); + unstunPlayers(); } if(this->animationChr.isAnimationDone()) { @@ -769,3 +772,31 @@ void daMegaGoomba_c::endState_Walk() { } // } // void daMegaGoomba_c::endState_Outro() { } + + +extern "C" void stunPlayer(void *, int); +extern "C" void unstunPlayer(void *); + +void daMegaGoomba_c::stunPlayers() { + for (int i = 0; i < 4; i++) { + playerStunned[i] = false; + + dStageActor_c *player = GetSpecificPlayerActor(i); + if (player) { + if (player->collMgr.CollidedWithTile() && player->currentZoneID == currentZoneID) { + stunPlayer(player, 1); + playerStunned[i] = true; + } + } + } +} + +void daMegaGoomba_c::unstunPlayers() { + for (int i = 0; i < 4; i++) { + dStageActor_c *player = GetSpecificPlayerActor(i); + if (player && playerStunned[i]) { + unstunPlayer(player); + } + } +} + -- cgit v1.2.3