Path: blob/master/SonicMania/Objects/HCZ/HCZOneWayDoor.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: HCZOneWayDoor Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectHCZOneWayDoor *HCZOneWayDoor;1011void HCZOneWayDoor_Update(void)12{13RSDK_THIS(HCZOneWayDoor);1415bool32 shouldShut = false;16int32 storeX = self->position.x;17int32 storeY = self->position.y;1819foreach_active(Player, player)20{21self->position.x = storeX;22self->position.y = storeY;23Player_CheckCollisionBox(player, self, &self->hitboxSolid);2425self->position = self->startPos;26if (!player->sidekick) {27if (Player_CheckCollisionTouch(player, self, &self->hitboxTrigger))28shouldShut = true;29}30}3132self->position.x = storeX;33self->position.y = storeY;3435if (shouldShut) {36if (self->movePos >= self->duration) {37switch (self->orientation) {38case HCZONEWAYDOOR_UP: self->position.y = self->startPos.y - self->size.y; break;39case HCZONEWAYDOOR_LEFT: self->position.x = self->startPos.x - self->size.x; break;40case HCZONEWAYDOOR_DOWN: self->position.y = self->startPos.y + self->size.y; break;41case HCZONEWAYDOOR_RIGHT: self->position.x = self->startPos.x + self->size.x; break;42}43}44else {45switch (self->orientation) {46case HCZONEWAYDOOR_UP: self->position.y = self->startPos.y - self->movePos * (self->size.y / self->duration); break;47case HCZONEWAYDOOR_LEFT: self->position.x = self->startPos.x - self->movePos * (self->size.x / self->duration); break;48case HCZONEWAYDOOR_DOWN: self->position.y = self->startPos.y + self->movePos * (self->size.y / self->duration); break;49case HCZONEWAYDOOR_RIGHT: self->position.x = self->startPos.x + self->movePos * (self->size.x / self->duration); break;50}5152if (++self->movePos >= self->duration) {53if (self->onScreen)54RSDK.PlaySfx(HCZOneWayDoor->sfxClack, false, 255);55}56}57}58else {59if (self->movePos > 0) {60switch (self->orientation) {61case HCZONEWAYDOOR_UP: self->position.y = self->startPos.y - self->movePos * (self->size.y / self->duration); break;62case HCZONEWAYDOOR_LEFT: self->position.x = self->startPos.x - self->movePos * (self->size.x / self->duration); break;63case HCZONEWAYDOOR_DOWN: self->position.y = self->startPos.y + self->movePos * (self->size.y / self->duration); break;64case HCZONEWAYDOOR_RIGHT: self->position.x = self->startPos.x + self->movePos * (self->size.x / self->duration); break;65}6667if (--self->movePos <= 0) {68if (self->onScreen)69RSDK.PlaySfx(HCZOneWayDoor->sfxClack, false, 255);70}71}72else {73switch (self->orientation) {74case HCZONEWAYDOOR_UP: self->position.y = self->startPos.y; break;75case HCZONEWAYDOOR_LEFT: self->position.x = self->startPos.x; break;76case HCZONEWAYDOOR_DOWN: self->position.y = self->startPos.y; break;77case HCZONEWAYDOOR_RIGHT: self->position.x = self->startPos.x; break;78}79}80}81}8283void HCZOneWayDoor_LateUpdate(void) {}8485void HCZOneWayDoor_StaticUpdate(void) {}8687void HCZOneWayDoor_Draw(void) { HCZOneWayDoor_DrawSprites(); }8889void HCZOneWayDoor_Create(void *data)90{91RSDK_THIS(HCZOneWayDoor);9293if (!self->duration)94self->duration = 6;9596if (!self->length)97self->length = 2;9899self->active = ACTIVE_BOUNDS;100self->drawGroup = Zone->objectDrawGroup[0];101self->startPos = self->position;102self->visible = true;103self->drawFX = FX_FLIP;104HCZOneWayDoor_SetupHitboxes();105self->updateRange.x = 0x800000 + self->size.x;106self->updateRange.y = 0x800000 + self->size.y;107RSDK.SetSpriteAnimation(HCZOneWayDoor->aniFrames, 0, &self->animator, true, 0);108}109110void HCZOneWayDoor_StageLoad(void)111{112HCZOneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("HCZ/ButtonDoor.bin", SCOPE_STAGE);113114HCZOneWayDoor->sfxClack = RSDK.GetSfx("Stage/Clack2.wav");115}116117void HCZOneWayDoor_SetupHitboxes(void)118{119RSDK_THIS(HCZOneWayDoor);120121self->size.x = 0x200000;122self->size.y = 0x200000;123self->initialSize.x = self->size.x;124self->initialSize.y = self->size.y;125126if (self->orientation == HCZONEWAYDOOR_UP || self->orientation == HCZONEWAYDOOR_DOWN)127self->size.y = self->length << 21;128else if (self->orientation == HCZONEWAYDOOR_LEFT || self->orientation == HCZONEWAYDOOR_RIGHT)129self->size.x = self->length << 21;130131self->hitboxSolid.right = self->size.x >> 17;132self->hitboxSolid.bottom = self->size.y >> 17;133self->hitboxSolid.left = -(self->size.x >> 17);134self->hitboxSolid.top = -(self->size.y >> 17);135136switch (self->orientation) {137case HCZONEWAYDOOR_UP:138case HCZONEWAYDOOR_DOWN:139self->hitboxTrigger.top = -(self->size.y >> 17);140self->hitboxTrigger.left = -(self->size.x >> 17);141self->hitboxTrigger.right = self->size.x >> 17;142self->hitboxTrigger.bottom = self->size.y >> 17;143144if (self->detectDirection == FLIP_X)145self->hitboxTrigger.right = (self->size.x >> 17) + (self->initialSize.y >> 14);146else if (self->detectDirection == FLIP_NONE)147self->hitboxTrigger.left = -(self->size.x >> 17) - (self->initialSize.y >> 14);148break;149150case HCZONEWAYDOOR_LEFT:151case HCZONEWAYDOOR_RIGHT:152self->hitboxTrigger.right = self->size.y >> 17;153self->hitboxTrigger.top = -(self->size.y >> 17);154self->hitboxTrigger.left = -(self->size.x >> 17);155self->hitboxTrigger.bottom = self->size.y >> 17;156157if (self->detectDirection == FLIP_X)158self->hitboxTrigger.top = -(self->size.y >> 17) - (self->initialSize.x >> 14);159else if (self->detectDirection == FLIP_NONE)160self->hitboxTrigger.bottom = (self->size.y >> 17) + (self->initialSize.x >> 14);161break;162163default: break;164}165}166167void HCZOneWayDoor_DrawSprites(void)168{169RSDK_THIS(HCZOneWayDoor);170171Vector2 drawPos = self->position;172173int32 offsetX = 0, offsetY = 0;174if (self->orientation == HCZONEWAYDOOR_UP || self->orientation == HCZONEWAYDOOR_DOWN) {175drawPos.y = (self->initialSize.y >> 1) + self->position.y - (self->size.y >> 1);176offsetY = self->initialSize.y;177}178else if (self->orientation == HCZONEWAYDOOR_LEFT || self->orientation == HCZONEWAYDOOR_RIGHT) {179drawPos.x = (self->initialSize.x >> 1) + self->position.x - (self->size.x >> 1);180offsetX = self->initialSize.x;181}182183for (int32 i = 0; i < self->length; ++i) {184RSDK.DrawSprite(&self->animator, &drawPos, false);185drawPos.x += offsetX;186drawPos.y += offsetY;187}188}189190#if GAME_INCLUDE_EDITOR191void HCZOneWayDoor_EditorDraw(void) { HCZOneWayDoor_DrawSprites(); }192193void HCZOneWayDoor_EditorLoad(void)194{195HCZOneWayDoor->aniFrames = RSDK.LoadSpriteAnimation("HCZ/ButtonDoor.bin", SCOPE_STAGE);196197RSDK_ACTIVE_VAR(HCZOneWayDoor, orientation);198RSDK_ENUM_VAR("Up", HCZONEWAYDOOR_UP);199RSDK_ENUM_VAR("Left", HCZONEWAYDOOR_LEFT);200RSDK_ENUM_VAR("Down", HCZONEWAYDOOR_DOWN);201RSDK_ENUM_VAR("Right", HCZONEWAYDOOR_RIGHT);202203RSDK_ACTIVE_VAR(HCZOneWayDoor, detectDirection);204RSDK_ENUM_VAR("No Flip", FLIP_NONE); // Left/Top205RSDK_ENUM_VAR("Flipped", FLIP_X); // Right/Bottom206}207#endif208209void HCZOneWayDoor_Serialize(void)210{211RSDK_EDITABLE_VAR(HCZOneWayDoor, VAR_ENUM, length);212RSDK_EDITABLE_VAR(HCZOneWayDoor, VAR_ENUM, duration);213RSDK_EDITABLE_VAR(HCZOneWayDoor, VAR_UINT8, orientation);214RSDK_EDITABLE_VAR(HCZOneWayDoor, VAR_UINT8, detectDirection);215}216217218