#include #include // Patches MIST_INTERMITTENT (sprite 239) class daEnEventBlock_c : public daEnBlockMain_c { public: typedef State State; TileRenderer tile; Physics::Info physicsInfo; u8 eventNum; 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; eventNum = (settings & 0xFF) - 1; 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); tile.tileNumber = (dFlagMgr_c::instance->active(eventNum) ? 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::blockWasHit(bool isDown) { pos.y = initialY; if (dFlagMgr_c::instance->active(eventNum)) dFlagMgr_c::instance->set(eventNum, 0, false, false, false); else dFlagMgr_c::instance->set(eventNum, 0, true, 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; } }