diff options
-rw-r--r-- | NewerProject.yaml | 1 | ||||
-rw-r--r-- | eventblock.yaml | 7 | ||||
-rw-r--r-- | src/eventblock.cpp | 210 |
3 files changed, 218 insertions, 0 deletions
diff --git a/NewerProject.yaml b/NewerProject.yaml index a8a62e3..e1f0881 100644 --- a/NewerProject.yaml +++ b/NewerProject.yaml @@ -14,6 +14,7 @@ modules: - processed/linegod.yaml
- processed/tilesetfixer.yaml
- processed/switchblock.yaml
+ - processed/eventblock.yaml
# - processed/msgbox.yaml
# - processed/replay.yaml
- processed/growup.yaml
diff --git a/eventblock.yaml b/eventblock.yaml new file mode 100644 index 0000000..8a96a66 --- /dev/null +++ b/eventblock.yaml @@ -0,0 +1,7 @@ +--- +source_files: [../src/eventblock.cpp] +hooks: + - name: BuildEventBlock + type: add_func_pointer + src_addr_pal: 0x80970DB8 + target_func: 'daEnEventBlock_c::build(void)' diff --git a/src/eventblock.cpp b/src/eventblock.cpp new file mode 100644 index 0000000..f285da8 --- /dev/null +++ b/src/eventblock.cpp @@ -0,0 +1,210 @@ +#include <common.h> +#include <game.h> + +// Patches MIST_INTERMITTENT (sprite 239) + +class daEnEventBlock_c : public daEnBlockMain_c { +public: + enum Mode { + TOGGLE_EVENT = 0, + SWAP_EVENTS = 1 + }; + + typedef State<daEnEventBlock_c> State; + + TileRenderer tile; + Physics::Info physicsInfo; + + u8 event1; + u8 event2; + Mode mode; + + void equaliseEvents(); + + int onCreate(); + int onDelete(); + int onExecute(); + + void calledWhenUpMoveExecutes(); + void calledWhenDownMoveExecutes(); + + void wait_Begin(); + void wait_Execute(); + void wait_End(); + + void blockWasHit(bool isDown); + + static State StateID_Wait; + static daEnEventBlock_c *build(); +}; + +daEnEventBlock_c::State daEnEventBlock_c::StateID_Wait( + "daEnEventBlock_c::StateID_Wait", + &daEnEventBlock_c::wait_Begin, + &daEnEventBlock_c::wait_Execute, + &daEnEventBlock_c::wait_End); + + +int daEnEventBlock_c::onCreate() { + blockInit(pos.y); + + physicsInfo.x1 = -8; + physicsInfo.y1 = 16; + physicsInfo.x2 = 8; + physicsInfo.y2 = 0; + + physicsInfo.otherCallback1 = &daEnBlockMain_c::OPhysicsCallback1; + physicsInfo.otherCallback2 = &daEnBlockMain_c::OPhysicsCallback2; + physicsInfo.otherCallback3 = &daEnBlockMain_c::OPhysicsCallback3; + + physics.setup(this, &physicsInfo, 3, currentLayerID); + physics.flagsMaybe = 0x260; + physics.callback1 = &daEnBlockMain_c::PhysicsCallback1; + physics.callback2 = &daEnBlockMain_c::PhysicsCallback2; + physics.callback3 = &daEnBlockMain_c::PhysicsCallback3; + physics.addToList(); + + TileRenderer::List *list = dBgGm_c::instance->getTileRendererList(0); + list->add(&tile); + + tile.x = pos.x - 8; + tile.y = -(16 + pos.y); + tile.tileNumber = 0x97; + + mode = (Mode)((settings >> 16) & 0xF); + event1 = ((settings >> 8) & 0xFF) - 1; + event2 = (settings & 0xFF) - 1; + + equaliseEvents(); + + doStateChange(&daEnEventBlock_c::StateID_Wait); + + return true; +} + + +int daEnEventBlock_c::onDelete() { + TileRenderer::List *list = dBgGm_c::instance->getTileRendererList(0); + list->remove(&tile); + + physics.removeFromList(); + + return true; +} + + +int daEnEventBlock_c::onExecute() { + acState.execute(); + physics.update(); + blockUpdate(); + + tile.setPosition(pos.x-8, -(16+pos.y), pos.z); + tile.setVars(scale.x); + + equaliseEvents(); + + bool isActive = dFlagMgr_c::instance->active(event2); + + tile.tileNumber = (isActive ? 0x96 : 0x97); + + // now check zone bounds based on state + if (acState.getCurrentState()->isEqual(&StateID_Wait)) { + checkZoneBoundaries(0); + } + + return true; +} + + +daEnEventBlock_c *daEnEventBlock_c::build() { + OSReport("Creating EventBlock\n"); + + void *buffer = AllocFromGameHeap1(sizeof(daEnEventBlock_c)); + daEnEventBlock_c *c = new(buffer) daEnEventBlock_c; + + OSReport("Created EventBlock @ %p\n", c); + + return c; +} + + +void daEnEventBlock_c::equaliseEvents() { + if (mode != SWAP_EVENTS) + return; + + bool f1 = dFlagMgr_c::instance->active(event1); + bool f2 = dFlagMgr_c::instance->active(event2); + + if (!f1 && !f2) { + dFlagMgr_c::instance->set(event1, 0, true, false, false); + } + + if (f1 && f2) { + dFlagMgr_c::instance->set(event2, 0, false, false, false); + } +} + + +void daEnEventBlock_c::blockWasHit(bool isDown) { + pos.y = initialY; + + if (mode == TOGGLE_EVENT) { + if (dFlagMgr_c::instance->active(event2)) + dFlagMgr_c::instance->set(event2, 0, false, false, false); + else + dFlagMgr_c::instance->set(event2, 0, true, false, false); + + } else if (mode == SWAP_EVENTS) { + if (dFlagMgr_c::instance->active(event1)) { + dFlagMgr_c::instance->set(event1, 0, false, false, false); + dFlagMgr_c::instance->set(event2, 0, true, false, false); + } else { + dFlagMgr_c::instance->set(event1, 0, true, false, false); + dFlagMgr_c::instance->set(event2, 0, false, false, false); + } + } + + physics.setup(this, &physicsInfo, 3, currentLayerID); + physics.addToList(); + + doStateChange(&StateID_Wait); +} + + + +void daEnEventBlock_c::calledWhenUpMoveExecutes() { + if (initialY >= pos.y) + blockWasHit(false); +} + +void daEnEventBlock_c::calledWhenDownMoveExecutes() { + if (initialY <= pos.y) + blockWasHit(true); +} + + + +void daEnEventBlock_c::wait_Begin() { +} + +void daEnEventBlock_c::wait_End() { +} + +void daEnEventBlock_c::wait_Execute() { + int result = blockResult(); + + if (result == 0) + return; + + if (result == 1) { + doStateChange(&daEnBlockMain_c::StateID_UpMove); + anotherFlag = 2; + isGroundPound = false; + } else { + doStateChange(&daEnBlockMain_c::StateID_DownMove); + anotherFlag = 1; + isGroundPound = true; + } +} + + |