diff options
-rw-r--r-- | NewerProject.yaml | 2 | ||||
-rwxr-xr-x | include/game.h | 11 | ||||
-rw-r--r-- | kamek_pal.x | 9 | ||||
-rw-r--r-- | spriteswapper.yaml | 8 | ||||
-rw-r--r-- | src/bossPodouble.cpp | 2 | ||||
-rw-r--r-- | src/bossThwompaDomp.cpp | 13 | ||||
-rw-r--r-- | src/effects.cpp | 6 | ||||
-rwxr-xr-x | src/spriteswapper.cpp | 243 | ||||
-rw-r--r-- | src/topman.cpp | 119 |
9 files changed, 185 insertions, 228 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml index 6726764..d92577c 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -39,10 +39,12 @@ modules: - processed/bossBalboaWrench.yaml - processed/bossWrenchThrow.yaml - processed/bossPodouble.yaml + - processed/bossTopman.yaml - processed/effectVideo.yaml - processed/fakeStarCoin.yaml - processed/shyguy.yaml - processed/meteor.yaml - processed/topman.yaml + - processed/electricLine.yaml # - processed/pengi.yaml # - processed/actorlog.yaml diff --git a/include/game.h b/include/game.h index 7c10d05..271b0a5 100755 --- a/include/game.h +++ b/include/game.h @@ -2146,6 +2146,17 @@ public: };
+class daNeedles : public dEn_c {
+
+public:
+ USING_STATES(daNeedles);
+ REF_NINTENDO_STATE(DemoWait);
+ REF_NINTENDO_STATE(DemoAwake);
+ REF_NINTENDO_STATE(Idle);
+ REF_NINTENDO_STATE(Die);
+};
+
+
class dPlayer : public dActorMultiState_c {
public:
diff --git a/kamek_pal.x b/kamek_pal.x index c5c5790..bd8c1d9 100644 --- a/kamek_pal.x +++ b/kamek_pal.x @@ -73,6 +73,11 @@ SECTIONS { StateID_DemoSt__12daKameckDemo = 0x80999C44; StateID_DemoWait__12daKameckDemo = 0x80999C84; + StateID_DemoWait__9daNeedles = 0x8099CF8C; + StateID_DemoAwake__9daNeedles = 0x8099CFD0; + StateID_Idle__9daNeedles = 0x8099D010; + StateID_Die__9daNeedles = 0x8099D050; + StateID_None__7dPlayer = 0x8035451C; StateID_Walk__7dPlayer = 0x8035455C; StateID_Jump__7dPlayer = 0x8035459C; @@ -217,6 +222,8 @@ SECTIONS { __construct_new_array = 0x802DCAD0; __destroy_new_array = 0x802DCE00; + __destroy_arr = 0x802DCD88; + sub_80024C20 = 0x80024C20; __register_global_object = 0x802DCA70; __ptmf_scall = 0x802DCEEC; @@ -244,7 +251,7 @@ SECTIONS { doSomethingCool1__11freezeMgr_c = 0x800b85a0; doSomethingCool2__11freezeMgr_c = 0x800b8670; setSomething__11freezeMgr_cFUiUiUi = 0x800b8740; - Create_ICEACTORs__11freezeMgr_c = 0x800b8750; + Create_ICEACTORs__11freezeMgr_cFPvi = 0x800b8750; Delete_ICEACTORs__11freezeMgr_c = 0x800b88a0; SetIceTimer_pt1__11freezeMgr_c = 0x800b8920; SetIceTimer_pt2__11freezeMgr_c = 0x800b8980; diff --git a/spriteswapper.yaml b/spriteswapper.yaml index 38e0160..b5f882c 100644 --- a/spriteswapper.yaml +++ b/spriteswapper.yaml @@ -3,13 +3,13 @@ source_files: [../src/spriteSwapper.cpp] hooks: - - name: SpriteSwapper_Create + - name: SpriteSpawnerTimed_Create type: add_func_pointer src_addr_pal: 0x80B05E28 - target_func: 'SpriteSwapper_Create(SpriteSwapper *)' + target_func: 'SpriteSpawnerTimed_Create(SpriteSpawnerTimed *)' - - name: SpriteSwapper_Execute + - name: SpriteSpawnerTimed_Execute type: add_func_pointer src_addr_pal: 0x80B05E40 - target_func: 'SpriteSwapper_Execute(SpriteSwapper *)' + target_func: 'SpriteSpawnerTimed_Execute(SpriteSpawnerTimed *)'
\ No newline at end of file diff --git a/src/bossPodouble.cpp b/src/bossPodouble.cpp index 663781e..77dae1a 100644 --- a/src/bossPodouble.cpp +++ b/src/bossPodouble.cpp @@ -289,8 +289,6 @@ int daPodouble::onCreate() { this->aPhysics.initWithStruct(this, &HitMeBaby); this->aPhysics.addToList(); - this->disableEatIn(); - doStateChange(&StateID_Grow); OSReport("Going to Execute Podouble\n"); diff --git a/src/bossThwompaDomp.cpp b/src/bossThwompaDomp.cpp index fb8d59e..89f2c14 100644 --- a/src/bossThwompaDomp.cpp +++ b/src/bossThwompaDomp.cpp @@ -60,6 +60,7 @@ class daEnMegaDosun_c : public dEn_c { void setupBodyModel(); + void playerCollision(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther); bool collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther); void collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther); @@ -96,6 +97,18 @@ daEnMegaDosun_c *daEnMegaDosun_c::build() { // Collisions + + void daEnMegaDosun_c::playerCollision(ActivePhysics *apThis, ActivePhysics *apOther) { + this->dEn_c::playerCollision(apThis, apOther); + this->_vf220(apOther->owner); + + // fix multiple player collisions via megazig + this->isDead = 0; + this->flags_4FC |= (1<<(31-7)); + if(apOther->owner->which_player < 4) { + this->counter_504[apOther->owner->which_player] = 0; + } + } void daEnMegaDosun_c::collisionCat1_Fireball_E_Explosion(ActivePhysics *apThis, ActivePhysics *apOther) { } bool daEnMegaDosun_c::collisionCat2_IceBall_15_YoshiIce(ActivePhysics *apThis, ActivePhysics *apOther) { return false; } void daEnMegaDosun_c::collisionCat7_WMWaggleWater(ActivePhysics *apThis, ActivePhysics *apOther) { } diff --git a/src/effects.cpp b/src/effects.cpp index c54678c..6da7177 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -1001,7 +1001,11 @@ const char* effects_name_list [] = { "Wm_bg_volcano_a", "Wm_bg_volcano_b", "Wm_ob_treasureboxwait_a", - "Wm_ob_treasureboxwait_b" + "Wm_ob_treasureboxwait_b", + "Wm_jr_electricstart", + "Wm_jr_electricglow", + "Wm_jr_electricspark", + "Wm_jr_electricline" }; extern "C" bool SpawnEffect(const char*, int, Vec*, S16Vec*, Vec*); diff --git a/src/spriteswapper.cpp b/src/spriteswapper.cpp index a158efc..945da34 100755 --- a/src/spriteswapper.cpp +++ b/src/spriteswapper.cpp @@ -1,7 +1,7 @@ #include <common.h> #include <game.h> -struct SpriteSwapper { +struct SpriteSpawnerTimed { u32 id; // 0x00 u32 settings; // 0x04 u16 name; // 0x08 @@ -12,19 +12,11 @@ struct SpriteSwapper { float z; // 0xB4 u8 _B8[0x318]; // 0xB8 // Any variables you add to the class go here; starting at offset 0x3D0 - u64 eventFlag; - u64 alteventFlag; - u8 alteventState; - u8 alteventTrue; - u16 firstType; - u16 secondType; - u8 lastEvState; - u32 spawnedActor; - u16 spawn; - u16 spawned; - u8 direction; - Vec speed; - S16Vec rot; + u64 eventFlag; // 0x3D0 + u16 type; // 0x3D4 + u32 inheritSet; // 0x3D6 + u8 lastEvState; // 0x3DA + u32 timer; }; struct EventTable_t { @@ -32,15 +24,18 @@ struct EventTable_t { }; +struct VEC { + float x; + float y; + float z; +}; extern EventTable_t *EventTable; -extern "C" dStageActor_c *CreateActor(u16 classID, int settings, Vec pos, char rot, char layer); +extern "C" dStageActor_c *CreateActor(u16 classID, int settings, VEC pos, char rot, char layer); extern "C" dStageActor_c *Actor_SearchByID(u32 actorID); -void SpriteSwapper_Update(SpriteSwapper *self); -void SpriteSwapper_CopyAndDestroy(SpriteSwapper *self, dStageActor_c *actor); -void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName); +void SpriteSpawnerTimed_Update(SpriteSpawnerTimed *self); #define ACTIVATE 1 #define DEACTIVATE 0 @@ -48,208 +43,52 @@ void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName); -bool SpriteSwapper_Create(SpriteSwapper *self) { +bool SpriteSpawnerTimed_Create(SpriteSpawnerTimed *self) { OSReport("I exist, dammit!"); char eventNum = (self->settings >> 28) & 0xF; - char alteventNum = (self->settings >> 12) & 0xF; OSReport("Event to activate: %d", eventNum); - OSReport("AltEvent to activate: %d", alteventNum); self->eventFlag = (u64)1 << (eventNum - 1); - self->alteventFlag = (u64)1 << (alteventNum - 1); - self->spawnedActor = 0; - self->firstType = (self->settings >> 16) & 0xFFF; - self->secondType = self->settings & 0xFFF; - - self->alteventState = 0; - if (alteventNum > 0) - self->alteventTrue = 1; - else - self->alteventTrue = 0; - - Vec pos; - pos.x = self->x; - pos.y = self->y; - pos.z = self->z; - - OSReport("Spawning first sprite."); - - dStageActor_c *spawned = CreateActor(self->firstType, 0, pos, 0, 0); - self->spawnedActor = spawned->id; - self->spawned = self->firstType; - self->spawn = 0; - - OSReport("Spawned %d.", self->spawnedActor); - - SpriteSwapper_Update(self); + self->type = (self->settings >> 16) & 0xFFF; - return true; -} - -bool SpriteSwapper_Execute(SpriteSwapper *self) { - SpriteSwapper_Update(self); - return true; -} - - - -void SpriteSwapper_CopyAndDestroy(SpriteSwapper *self) { - - dStageActor_c *spawned = Actor_SearchByID(self->spawnedActor); - if (spawned != 0) { - OSReport("It's still alive."); - self->x = spawned->pos.x; - self->y = spawned->pos.y; - self->z = spawned->pos.z; - self->direction = spawned->direction; - self->speed = spawned->speed; - self->rot = spawned->rot; - //FIXME changed from fBase_c::Delete(void) to dStageActor_c::Delete(u8) - spawned->Delete(spawned->_390); + short tempSet = self->settings & 0xFFFF; + self->inheritSet = (tempSet & 3) | ((tempSet & 0xC) << 2) | ((tempSet & 0x30) << 4) | ((tempSet & 0xC0) << 6) | ((tempSet & 0x300) << 8) | ((tempSet & 0xC00) << 10) | ((tempSet & 0x3000) << 12) | ((tempSet & 0xC000) << 14); - self->spawnedActor = 0; - OSReport("Now it's deleted."); - } + self->timer = 0; + SpriteSpawnerTimed_Update(self); - else { - OSReport("Is dead, turn it off.... forever."); - self->spawn = 0; - } + return true; } - -void SpriteSwapper_SpawnActor(SpriteSwapper *self, u16 newActorName) { - - Vec pos; - pos.x = self->x; - pos.y = self->y; - pos.z = self->z; - - OSReport("Making sprite."); - dStageActor_c *spawner = CreateActor(newActorName, 0, pos, 0, 0); - self->spawnedActor = spawner->id; -// spawner->direction = self->direction; -// spawner->speed = self->speed; - -// OSReport("Direction is %d.", spawner->direction); -// OSReport("Initial Rotation is %x %x.", spawner->rot.y, spawner->_106.y); -// if (spawner->direction == 0) { -// spawner->rot.y = 0xF556 + spawner->rot.y; } -// else { -// spawner->rot.y = 0xC000; } -// OSReport("Current Rotation is %x %x.", spawner->rot.y, spawner->_106.y); - - - -//Direction is 1. -//Initial Rotation is ffffd556 -// -// Direction is 0. -//Initial Rotation is ffffc000 -// -//Direction is 0 -//Initial Rotation is ffffd556 - - - -// spawner->rot = self->rot; - OSReport("Spawned %d.", self->spawnedActor); - +bool SpriteSpawnerTimed_Execute(SpriteSpawnerTimed *self) { + SpriteSpawnerTimed_Update(self); + return true; } -void SpriteSwapper_Update(SpriteSwapper *self) { - - if (self->spawn != 0) - { - OSReport("Spawning %d.", self->spawn); - SpriteSwapper_SpawnActor(self, self->spawn); - self->spawned = self->spawn; - self->spawn = 0; - return; - } - - // Sprites alternate when event a is turned on or off. - if (self->alteventTrue == 0) - { - OSReport("Single Event Type."); - if (EventTable->events & self->eventFlag) - { - OSReport("Spawning Event is on."); - if (self->spawned == self->secondType) - { - OSReport("Second sprite already there."); - return; - } +void SpriteSpawnerTimed_Update(SpriteSpawnerTimed *self) { - OSReport("Event turned on."); - - self->spawn = self->secondType; - SpriteSwapper_CopyAndDestroy(self); - } - else + if (EventTable->events & self->eventFlag) + { + + if (self->timer == 0) { - OSReport("Spawning Event is off."); - if (self->spawned == self->firstType) - { - OSReport("First sprite already there."); - return; - } - - OSReport("Event turned off."); - - self->spawn = self->firstType; - SpriteSwapper_CopyAndDestroy(self); - } - } + VEC pos; + pos.x = self->x; + pos.y = self->y; + pos.z = self->z; - // Sprites alternate when event a or b is turned on. - else - { - OSReport("Dual Event Type. EventState is %d.", self->alteventState); - if (EventTable->events & self->eventFlag) - { - OSReport("First Event on, spawning is alteventState is 0."); - if (self->alteventState == 0) - { - if (self->spawned == self->secondType) - { - OSReport("Second sprite already there."); - return; - } - - OSReport("Event turned on."); - - self->spawn = self->secondType; - SpriteSwapper_CopyAndDestroy(self); - - EventTable->events = EventTable->events & ~self->alteventFlag; - self->alteventState = 1; - } - } - - if (EventTable->events & self->alteventFlag) - { - OSReport("Second Event on, spawning is alteventState is 1."); - if (self->alteventState == 1) - { - if (self->spawned == self->firstType) - { - OSReport("First sprite already there."); - return; - } - - OSReport("Alt Event turned on."); - - self->spawn = self->firstType; - SpriteSwapper_CopyAndDestroy(self); - - EventTable->events = EventTable->events & ~self->eventFlag; - self->alteventState = 0; - } - } + OSReport("Spawning Sprite: %d at %f,%f,%f\n", self->type, pos.x, pos.y, pos.z); + + dStageActor_c *spawned = CreateActor(self->type, self->inheritSet, pos, 0, 0); + self->timer = 120; + } } + else { + self->timer = 0; + } + self->timer--; } diff --git a/src/topman.cpp b/src/topman.cpp index 4509272..a255a82 100644 --- a/src/topman.cpp +++ b/src/topman.cpp @@ -27,6 +27,7 @@ class daTopman : public dEn_c { bool isBouncing; char isInSpace; char fromBehind; + char isWaiting; static daTopman *build(); @@ -51,10 +52,13 @@ class daTopman : public dEn_c { void _vf148(); void _vf14C(); + bool CreateIceActors(); + void addScoreWhenHit(void *other); USING_STATES(daTopman); DECLARE_STATE(Walk); DECLARE_STATE(Turn); + DECLARE_STATE(Wait); DECLARE_STATE(KnockBack); DECLARE_STATE(Die); }; @@ -81,6 +85,7 @@ daTopman *daTopman::build() { CREATE_STATE(daTopman, Walk); CREATE_STATE(daTopman, Turn); + CREATE_STATE(daTopman, Wait); CREATE_STATE(daTopman, KnockBack); CREATE_STATE(daTopman, Die); @@ -106,20 +111,18 @@ daTopman *daTopman::build() { hitType = usedForDeterminingStatePress_or_playerCollision(this, apThis, apOther, 0); if(hitType == 1) { // regular jump - apOther->someFlagByte |= 2; - this->dEn_c::playerCollision(apThis, apOther); this->_vf220(apOther->owner); } else if(hitType == 3) { // spinning jump or whatever? - apOther->someFlagByte |= 2; - this->dEn_c::playerCollision(apThis, apOther); this->_vf220(apOther->owner); } else if(hitType == 0) { EN_LandbarrelPlayerCollision(this, apThis, apOther); - if (this->direction == apOther->owner->direction) { - this->direction ^= 1; - this->fromBehind = 1; + if (this->pos.x > apOther->owner->pos.x) { + this->direction = 1; + } + else { + this->direction = 0; } doStateChange(&StateID_KnockBack); } @@ -163,6 +166,10 @@ daTopman *daTopman::build() { doStateChange(&StateID_Die); } + void daTopman::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { + doStateChange(&StateID_Die); + } + void daTopman::collisionCatA_PenguinMario(ActivePhysics *apThis, ActivePhysics *apOther){ doStateChange(&StateID_KnockBack); } @@ -189,10 +196,35 @@ daTopman *daTopman::build() { doStateChange(&StateID_Die); } - void daTopman::collisionCat13_Hammer(ActivePhysics *apThis, ActivePhysics *apOther) { - doStateChange(&StateID_Die); + struct DoSomethingCool { + u32 unk_01; //0000 + Vec3 pos; //0004 + Vec3 scale; //0010 + f32 unk_02; //001C + f32 unk_03; //0020 + f32 unk_04; //0024 + f32 unk_05; //0028 + f32 unk_06; //002C + f32 unk_07; //0030 + f32 unk_08; //0034 + f32 unk_09; //0038 + } my_struct; + + extern "C" void sub_80024C20(void); + extern "C" void __destroy_arr(void*, void(*)(void), int, int); + //extern "C" __destroy_arr(struct DoSomethingCool, void(*)(void), int cnt, int bar); + + bool daTopman::CreateIceActors() + { + struct DoSomethingCool my_struct = { 0, this->pos, {2.5, 2.5, 2.5}, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 }; + this->frzMgr.Create_ICEACTORs( (void*)&my_struct, 1 ); + __destroy_arr( (void*)&my_struct, sub_80024C20, 0x3C, 1 ); + return true; } + void daTopman::addScoreWhenHit(void *other) {} + + bool daTopman::calculateTileCollisions() { // Returns true if sprite should turn, false if not. @@ -303,6 +335,7 @@ int daTopman::onCreate() { this->XSpeed = 0.8; this->isInSpace = this->settings & 0xF; + this->isWaiting = (this->settings >> 4) & 0xF; this->fromBehind = 0; ActivePhysics::Info HitMeBaby; @@ -352,7 +385,10 @@ int daTopman::onCreate() { // State Changers bindAnimChr_and_setUpdateRate("begoman_wait2", 1, 0.0, 1.0); - doStateChange(&StateID_Walk); + if (this->isWaiting == 0) { + doStateChange(&StateID_Walk); } + else { + doStateChange(&StateID_Wait); } this->onExecute(); return true; @@ -371,7 +407,6 @@ int daTopman::onExecute() { int daTopman::onDraw() { bodyModel.scheduleForDrawing(); - bodyModel._vf1C(); return true; } @@ -399,16 +434,20 @@ void daTopman::updateModelMatrices() { } void daTopman::executeState_Walk() { + PlaySound(this, SE_BOSS_JR_CROWN_JR_RIDE); // 5 + bool ret = calculateTileCollisions(); if (ret) { doStateChange(&StateID_Turn); } + bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } } - void daTopman::endState_Walk() { } + void daTopman::endState_Walk() { this->timer += 1; } + /////////////// // Turn State @@ -419,6 +458,7 @@ void daTopman::updateModelMatrices() { } void daTopman::executeState_Turn() { + bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { this->chrAnimation.setCurrentFrame(0.0); } @@ -434,6 +474,34 @@ void daTopman::updateModelMatrices() { /////////////// +// Wait State +/////////////// + void daTopman::beginState_Wait() { + this->max_speed.x = 0; + this->speed.x = 0; + + this->max_speed.y = (this->isInSpace) ? -2.0 : -4.0; + this->speed.y = (this->isInSpace) ? -2.0 : -4.0; + this->y_speed_inc = (this->isInSpace) ? -0.09375 : -0.1875; + } + void daTopman::executeState_Wait() { + + PlaySound(this, SE_BOSS_JR_CROWN_JR_RIDE); // 5 + + bool ret = calculateTileCollisions(); + if (ret) { + doStateChange(&StateID_Turn); + } + + bodyModel._vf1C(); + if(this->chrAnimation.isAnimationDone()) { + this->chrAnimation.setCurrentFrame(0.0); + } + } + void daTopman::endState_Wait() { } + + +/////////////// // Die State /////////////// void daTopman::beginState_Die() { @@ -444,6 +512,9 @@ void daTopman::updateModelMatrices() { } void daTopman::executeState_Die() { + bodyModel._vf1C(); + + PlaySound(this, SE_EMY_MECHAKOOPA_DAMAGE); if(this->chrAnimation.isAnimationDone()) { this->kill(); this->Delete(1); @@ -457,24 +528,36 @@ void daTopman::updateModelMatrices() { /////////////// void daTopman::beginState_KnockBack() { bindAnimChr_and_setUpdateRate("begoman_damage", 1, 0.0, 0.75); - this->timer = 0; + this->max_speed.x = (this->direction) ? this->XSpeed*5.0 : -this->XSpeed*5.0; - this->speed.x = (direction) ? 4.0f : -4.0f; + this->speed.x = (this->direction) ? 4.0f : -4.0f; } void daTopman::executeState_KnockBack() { bool ret = calculateTileCollisions(); this->speed.x = this->speed.x / 1.1; + bodyModel._vf1C(); if(this->chrAnimation.isAnimationDone()) { - doStateChange(&StateID_Walk); + if (this->isWaiting == 0) { + doStateChange(&StateID_Walk); } + else { + doStateChange(&StateID_Wait); } } } void daTopman::endState_KnockBack() { - if (this->fromBehind == 0) { - this->direction ^= 1; } - this->fromBehind = 0; + if (this->rot.y == 0x2800) { + // CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 175); + this->direction = 0; + } + else { + // CreateEffect(&this->pos, &(S16Vec){0,0,0}, &(Vec){1.0, 1.0, 1.0}, 192); + this->direction = 1; + } + // OSReport("Rotation: %x", this->rot.y); + // OSReport("Direction: %d", this->direction); + // this->direction ^= 1; bindAnimChr_and_setUpdateRate("begoman_wait2", 1, 0.0, 1.0); }
\ No newline at end of file |