Path: blob/master/SonicMania/Objects/CPZ/OneWayDoor.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: OneWayDoor Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectOneWayDoor *OneWayDoor;1011void OneWayDoor_Update(void)12{13RSDK_THIS(OneWayDoor);1415StateMachine_Run(self->state);1617RSDK.ProcessAnimation(&self->animator);18}1920void OneWayDoor_LateUpdate(void) {}2122void OneWayDoor_StaticUpdate(void) {}2324void OneWayDoor_Draw(void)25{26RSDK_THIS(OneWayDoor);2728StateMachine_Run(self->stateDraw);29}3031void OneWayDoor_Create(void *data)32{33RSDK_THIS(OneWayDoor);3435self->active = ACTIVE_BOUNDS;36self->visible = true;37self->updateRange.x = 0x1000000;38self->updateRange.y = 0x1000000;39self->state = OneWayDoor_State_MoveDown;40self->drawGroup = Zone->objectDrawGroup[1] - 2;4142RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, 0, &self->animator, true, 0);4344if (RSDK.CheckSceneFolder("MMZ")) {45#if MANIA_USE_PLUS46RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, self->direction ? 4 : 2, &self->animator, true, 0);47#endif48self->stateDraw = OneWayDoor_Draw_MMZ;49self->groundVel = 0x60000;50}51else if (RSDK.CheckSceneFolder("CPZ")) {52self->stateDraw = OneWayDoor_Draw_CPZ;53self->groundVel = 0x80000;54}55}5657void OneWayDoor_StageLoad(void)58{59if (RSDK.CheckSceneFolder("MMZ"))60OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("MMZ/OneWayDoor.bin", SCOPE_STAGE);61else if (RSDK.CheckSceneFolder("CPZ"))62OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("CPZ/OneWayDoor.bin", SCOPE_STAGE);6364OneWayDoor->hitboxTop.left = -8;65OneWayDoor->hitboxTop.top = -32;66OneWayDoor->hitboxTop.right = 8;67OneWayDoor->hitboxTop.bottom = 0;6869OneWayDoor->hitboxBottom.left = -8;70OneWayDoor->hitboxBottom.top = 0;71OneWayDoor->hitboxBottom.right = 8;72OneWayDoor->hitboxBottom.bottom = 32;7374OneWayDoor->hitboxRange.left = -64;75OneWayDoor->hitboxRange.top = -32;76OneWayDoor->hitboxRange.right = 8;77OneWayDoor->hitboxRange.bottom = 32;78}7980void OneWayDoor_HandlePlayerInteractions(void)81{82RSDK_THIS(OneWayDoor);8384EntityPlayer *player1 = RSDK_GET_ENTITY(SLOT_PLAYER1, Player);8586self->state = OneWayDoor_State_MoveDown;8788bool32 isMMZ1 = false;89if (RSDK.CheckSceneFolder("MMZ") && Zone->actID == 1)90isMMZ1 = true;9192bool32 isBehind = false;93if (self->direction == FLIP_X)94isBehind = player1->position.x >= self->position.x;95else if (!self->direction)96isBehind = player1->position.x <= self->position.x;9798foreach_active(Player, currentPlayer)99{100if (self->stateDraw != OneWayDoor_Draw_MMZ)101self->position.y -= 2 * self->offsetY;102else103self->position.y -= self->offsetY;104105Player_CheckCollisionBox(currentPlayer, self, &OneWayDoor->hitboxTop);106if (self->stateDraw == OneWayDoor_Draw_MMZ)107self->position.y += 2 * self->offsetY;108109Player_CheckCollisionBox(currentPlayer, self, &OneWayDoor->hitboxBottom);110if (self->stateDraw == OneWayDoor_Draw_MMZ)111self->position.y -= self->offsetY;112else113self->position.y += 2 * self->offsetY;114115if (currentPlayer->velocity.x < 0x60000)116OneWayDoor->hitboxRange.left = -64;117else118OneWayDoor->hitboxRange.left = -88;119120if (Player_CheckCollisionTouch(currentPlayer, self, &OneWayDoor->hitboxRange)) {121if (isMMZ1 && currentPlayer->sidekick && !isBehind) {122#if MANIA_USE_PLUS123Player->cantSwap = true;124NoSwap->counter++;125#endif126}127else128self->state = OneWayDoor_State_MoveUp;129}130}131}132133void OneWayDoor_State_MoveDown(void)134{135RSDK_THIS(OneWayDoor);136137if (self->offsetY > 0)138self->offsetY -= self->groundVel;139140OneWayDoor_HandlePlayerInteractions();141}142143void OneWayDoor_State_MoveUp(void)144{145RSDK_THIS(OneWayDoor);146147if (self->offsetY < 0x200000)148self->offsetY += self->groundVel;149150OneWayDoor_HandlePlayerInteractions();151}152153void OneWayDoor_Draw_MMZ(void)154{155RSDK_THIS(OneWayDoor);156157self->position.y -= self->offsetY;158RSDK.DrawSprite(&self->animator, NULL, false);159160self->position.y += 2 * self->offsetY + 0x200000;161RSDK.DrawSprite(&self->animator, NULL, false);162163self->position.y += -0x200000 - self->offsetY;164}165166void OneWayDoor_Draw_CPZ(void)167{168RSDK_THIS(OneWayDoor);169170self->animator.frameID = 0;171self->position.y -= 2 * self->offsetY;172RSDK.DrawSprite(&self->animator, NULL, false);173174self->animator.frameID = 1;175RSDK.DrawSprite(&self->animator, NULL, false);176177self->position.y += 2 * self->offsetY;178}179180#if GAME_INCLUDE_EDITOR181void OneWayDoor_EditorDraw(void)182{183RSDK_THIS(OneWayDoor);184185if (RSDK.CheckSceneFolder("MMZ")) {186RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, self->direction ? 4 : 2, &self->animator, true, 0);187OneWayDoor_Draw_MMZ();188}189else if (RSDK.CheckSceneFolder("CPZ")) {190RSDK.SetSpriteAnimation(OneWayDoor->aniFrames, 0, &self->animator, true, 0);191OneWayDoor_Draw_CPZ();192}193}194195void OneWayDoor_EditorLoad(void)196{197if (RSDK.CheckSceneFolder("MMZ"))198OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("MMZ/OneWayDoor.bin", SCOPE_STAGE);199else if (RSDK.CheckSceneFolder("CPZ"))200OneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("CPZ/OneWayDoor.bin", SCOPE_STAGE);201202RSDK_ACTIVE_VAR(OneWayDoor, direction);203RSDK_ENUM_VAR("No Flip", FLIP_NONE);204RSDK_ENUM_VAR("Flipped", FLIP_X);205}206#endif207208void OneWayDoor_Serialize(void) { RSDK_EDITABLE_VAR(OneWayDoor, VAR_UINT8, direction); }209210