Path: blob/master/SonicMania/Objects/AIZ/SchrodingersCapsule.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: SchrodingersCapsule Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectSchrodingersCapsule *SchrodingersCapsule;1112void SchrodingersCapsule_Update(void)13{14RSDK_THIS(SchrodingersCapsule);15StateMachine_Run(self->state);1617if (self->mainAnimator.frameID != 1) {18bool32 stoodSolid = false;19foreach_active(Player, player)20{21if (Player_CheckCollisionBox(player, self, &self->hitboxSolid) == C_TOP)22stoodSolid = true;2324if (self->state == SchrodingersCapsule_State_HandleBounds) {25if (Player_CheckCollisionBox(player, self, &self->hitboxButton) == C_TOP) {26self->buttonPos = 0x80000;27player->velocity.x = 0;28player->groundVel = 0;29CutsceneSeq_LockPlayerControl(player);30stoodSolid = false;31player->state = Player_State_Ground;32player->stateInput = StateMachine_None;33self->active = ACTIVE_NORMAL;34self->state = SchrodingersCapsule_State_Activated;35}36else {37if (Player_CheckCollisionTouch(player, self, &self->hitboxButtonTrigger)) {38Hitbox *playerHitbox = Player_GetHitbox(player);39self->buttonPos = ((playerHitbox->bottom + 48) << 16) - self->position.y + player->position.y;40if (self->buttonPos <= 0x80000) {41if (self->buttonPos < 0)42self->buttonPos = 0;43self->buttonPos &= 0xFFFF0000;44}45else {46self->buttonPos = 0x80000;47self->buttonPos &= 0xFFFF0000;48}49}50else {51if (self->buttonPos > 0)52self->buttonPos -= 0x10000;53}5455if (stoodSolid) {56EntityPhantomRuby *ruby = EncoreIntro->phantomRuby;57if (ruby->velocity.y > 0)58ruby->velocity.y = -ruby->velocity.y;59ruby->state = EncoreIntro_PhantomRuby_CapsuleRiseUp;60}61}62}63else {64stoodSolid = false;65Player_CheckCollisionBox(player, self, &self->hitboxButton);66}67}68}69}7071void SchrodingersCapsule_LateUpdate(void) {}7273void SchrodingersCapsule_StaticUpdate(void) {}7475void SchrodingersCapsule_Draw(void)76{77RSDK_THIS(SchrodingersCapsule);78Vector2 drawPos;7980if (!self->mainAnimator.frameID) {81drawPos = self->position;82drawPos.y += self->buttonPos;83RSDK.DrawSprite(&self->buttonAnimator, &drawPos, false);8485self->mainAnimator.frameID = 2;86RSDK.DrawSprite(&self->mainAnimator, NULL, false);8788if ((Zone->timer & 8)) {89self->mainAnimator.frameID = 3;90RSDK.DrawSprite(&self->mainAnimator, NULL, false);91}9293drawPos = self->position;94drawPos.x += 0xE0000;95RSDK.DrawSprite(&self->mightyAnimator, &drawPos, false);9697drawPos.x -= 0x1C0000;98RSDK.DrawSprite(&self->rayAnimator, &drawPos, false);99100self->mainAnimator.frameID = 0;101}102RSDK.DrawSprite(&self->mainAnimator, NULL, false);103104if (!self->mainAnimator.frameID) {105self->inkEffect = INK_ADD;106self->alpha = 0x80;107RSDK.DrawSprite(&self->glassAnimator, NULL, false);108109self->inkEffect = INK_NONE;110}111}112113void SchrodingersCapsule_Create(void *data)114{115RSDK_THIS(SchrodingersCapsule);116self->drawFX = FX_FLIP;117if (!SceneInfo->inEditor) {118RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 0, &self->mainAnimator, true, 0);119RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 1, &self->buttonAnimator, true, 0);120RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 2, &self->glassAnimator, true, 0);121RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 3, &self->mightyAnimator, true, 0);122RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 4, &self->rayAnimator, true, 0);123124self->hitboxSolid.left = -40;125self->hitboxSolid.top = -40;126self->hitboxSolid.right = 40;127self->hitboxSolid.bottom = 40;128129self->hitboxButton.left = -16;130self->hitboxButton.top = -44;131self->hitboxButton.right = 16;132self->hitboxButton.bottom = -30;133134self->hitboxButtonTrigger.left = -15;135self->hitboxButtonTrigger.top = -60;136self->hitboxButtonTrigger.right = 15;137self->hitboxButtonTrigger.bottom = -30;138139self->state = SchrodingersCapsule_State_Init;140self->active = ACTIVE_BOUNDS;141self->updateRange.x = 0x800000;142self->updateRange.y = 0x800000;143self->visible = true;144self->drawGroup = Zone->objectDrawGroup[0];145}146}147148void SchrodingersCapsule_StageLoad(void)149{150SchrodingersCapsule->aniFrames = RSDK.LoadSpriteAnimation("AIZ/SchrodingersCapsule.bin", SCOPE_STAGE);151152SchrodingersCapsule->sfxExplosion2 = RSDK.GetSfx("Stage/Explosion2.wav");153SchrodingersCapsule->sfxExplosion3 = RSDK.GetSfx("Stage/Explosion3.wav");154}155156void SchrodingersCapsule_State_Init(void)157{158RSDK_THIS(SchrodingersCapsule);159160self->state = SchrodingersCapsule_State_HandleBounds;161}162163void SchrodingersCapsule_State_HandleBounds(void)164{165RSDK_THIS(SchrodingersCapsule);166167RSDK.ProcessAnimation(&self->glassAnimator);168RSDK.ProcessAnimation(&self->mightyAnimator);169RSDK.ProcessAnimation(&self->rayAnimator);170171for (int32 p = 0; p < Player->playerCount; ++p) {172EntityPlayer *player = RSDK_GET_ENTITY(p, Player);173if (!player->sidekick) {174if (abs(self->position.x - player->position.x) < 0x1000000) {175if (abs(self->position.y - player->position.y) < 0x1000000 && self->position.x - (Zone->cameraBoundsR[p] << 16) < 0x1000000) {176Zone->playerBoundActiveL[p] = true;177Zone->playerBoundActiveR[p] = true;178Zone->cameraBoundsL[p] = (self->position.x >> 16) - ScreenInfo[p].center.x;179Zone->cameraBoundsR[p] = (self->position.x >> 16) + ScreenInfo[p].center.x;180}181}182}183}184}185186void SchrodingersCapsule_State_Activated(void)187{188RSDK_THIS(SchrodingersCapsule);189RSDK.ProcessAnimation(&self->glassAnimator);190RSDK.ProcessAnimation(&self->mightyAnimator);191RSDK.ProcessAnimation(&self->rayAnimator);192RSDK.SetSpriteAnimation(-1, 0, &self->glassAnimator, true, 0);193self->state = SchrodingersCapsule_State_Explode;194SceneInfo->timeEnabled = false;195}196197void SchrodingersCapsule_State_Explode(void)198{199RSDK_THIS(SchrodingersCapsule);200RSDK.ProcessAnimation(&self->glassAnimator);201RSDK.ProcessAnimation(&self->mightyAnimator);202RSDK.ProcessAnimation(&self->rayAnimator);203if (!(self->timer % 3)) {204EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID((2 * (RSDK.Rand(0, 256) > 192) + EXPLOSION_ENEMY)),205(RSDK.Rand(-24, 24) << 16) + self->position.x, (RSDK.Rand(-24, 24) << 16) + self->position.y);206explosion->drawGroup = Zone->objectDrawGroup[1];207208RSDK.PlaySfx(SchrodingersCapsule->sfxExplosion2, false, 0xFF);209}210211if (++self->timer == 60) {212self->timer = 0;213self->state = StateMachine_None;214self->mainAnimator.frameID = 1;215RSDK.SetSpriteAnimation(-1, -1, &self->mightyAnimator, true, 0);216RSDK.SetSpriteAnimation(-1, -1, &self->rayAnimator, true, 0);217218EntityPlayer *buddy1 = RSDK_GET_ENTITY(SLOT_PLAYER3, Player);219memset(buddy1, 0, sizeof(EntityBase)); // not in the original, clears the entity slot incase of something like a shield is still active220buddy1->classID = Player->classID;221Player_ChangeCharacter(buddy1, ID_MIGHTY);222buddy1->position.x = self->position.x + TO_FIXED(14);223buddy1->position.y = self->position.y;224buddy1->playerID = RSDK.GetEntitySlot(buddy1);225buddy1->active = ACTIVE_NORMAL;226buddy1->tileCollisions = TILECOLLISION_DOWN;227buddy1->interaction = true;228buddy1->visible = true;229buddy1->controllerID = buddy1->playerID + 1;230buddy1->drawGroup = Zone->playerDrawGroup[0];231buddy1->scale.x = 0x200;232buddy1->scale.y = 0x200;233buddy1->state = Player_State_Ground;234buddy1->collisionLayers = Zone->collisionLayers;235buddy1->drawFX = FX_ROTATE | FX_FLIP;236buddy1->velocity.x = 0x1C000;237buddy1->velocity.y = -0x40000;238buddy1->direction = FLIP_X;239RSDK.SetSpriteAnimation(buddy1->aniFrames, ANI_HURT, &buddy1->animator, true, 0);240241EntityPlayer *buddy2 = RSDK_GET_ENTITY(SLOT_PLAYER4, Player);242memset(buddy2, 0, sizeof(EntityBase)); // like above, but for safety :]243buddy2->classID = Player->classID;244Player_ChangeCharacter(buddy2, ID_RAY);245buddy2->position.x = self->position.x - TO_FIXED(14);246buddy2->position.y = self->position.y;247buddy2->playerID = RSDK.GetEntitySlot(buddy2);248buddy2->active = ACTIVE_NORMAL;249buddy2->tileCollisions = TILECOLLISION_DOWN;250buddy2->interaction = true;251buddy2->visible = true;252buddy2->controllerID = buddy2->playerID + 1;253buddy2->drawGroup = Zone->playerDrawGroup[0];254buddy2->scale.x = 0x200;255buddy2->scale.y = 0x200;256buddy2->state = Player_State_Ground;257buddy2->collisionLayers = Zone->collisionLayers;258buddy2->drawFX = FX_ROTATE | FX_FLIP;259buddy2->velocity.x = -0x24000;260buddy2->velocity.y = -0x40000;261RSDK.SetSpriteAnimation(buddy2->aniFrames, ANI_HURT, &buddy2->animator, true, 0);262263Music_FadeOut(0.025);264RSDK.PlaySfx(SchrodingersCapsule->sfxExplosion3, false, 0xFF);265266EntityPlayer *player = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);267player->position.x = self->position.x;268Player_ChangeCharacter(player, player->characterID);269RSDK.SetSpriteAnimation(player->aniFrames, ANI_HURT, &player->animator, true, 0);270player->velocity.x = 0;271player->velocity.y = 0;272player->groundVel = 0;273player->stateInput = StateMachine_None;274player->left = false;275player->right = false;276player->jumpPress = false;277player->jumpHold = false;278279EntityCamera *camera = RSDK_GET_ENTITY(SLOT_CAMERA1, Camera);280camera->position.x += 0x100000;281282self->timer = 0;283self->state = SchrodingersCapsule_State_SetupActClear;284285EntityFXFade *fade = CREATE_ENTITY(FXFade, INT_TO_VOID(0xF0F0F0), self->position.x, self->position.y);286fade->speedIn = 256;287fade->speedOut = 32;288}289}290291void SchrodingersCapsule_State_SetupActClear(void)292{293RSDK_THIS(SchrodingersCapsule);294if (++self->timer == 90) {295self->timer = 0;296self->state = StateMachine_None;297298EntityPlayer *buddy1 = RSDK_GET_ENTITY(SLOT_PLAYER3, Player);299buddy1->state = Player_State_Victory;300RSDK.SetSpriteAnimation(buddy1->aniFrames, ANI_VICTORY, &buddy1->animator, true, 0);301302EntityPlayer *buddy2 = RSDK_GET_ENTITY(SLOT_PLAYER4, Player);303buddy2->state = Player_State_Victory;304RSDK.SetSpriteAnimation(buddy2->aniFrames, ANI_VICTORY, &buddy2->animator, true, 0);305306ActClear->displayedActID = 1;307ActClear->forceNoSave = true;308Music_PlayTrack(TRACK_ACTCLEAR);309RSDK.ResetEntitySlot(SLOT_ACTCLEAR, ActClear->classID, NULL);310}311}312313#if GAME_INCLUDE_EDITOR314void SchrodingersCapsule_EditorDraw(void)315{316RSDK_THIS(SchrodingersCapsule);317318RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 0, &self->mainAnimator, true, 0);319RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 1, &self->buttonAnimator, true, 0);320RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 2, &self->glassAnimator, true, 0);321RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 3, &self->mightyAnimator, true, 0);322RSDK.SetSpriteAnimation(SchrodingersCapsule->aniFrames, 4, &self->rayAnimator, true, 0);323324SchrodingersCapsule_Draw();325}326327void SchrodingersCapsule_EditorLoad(void) { SchrodingersCapsule->aniFrames = RSDK.LoadSpriteAnimation("AIZ/SchrodingersCapsule.bin", SCOPE_STAGE); }328#endif329330void SchrodingersCapsule_Serialize(void) {}331#endif332333334