Path: blob/master/SonicMania/Objects/HCZ/ButtonDoor.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: ButtonDoor Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectButtonDoor *ButtonDoor;1011void ButtonDoor_Update(void)12{13RSDK_THIS(ButtonDoor);1415EntityButton *button = self->taggedButton;16if (button && button->activated) {1718if (!self->movePos)19RSDK.PlaySfx(ButtonDoor->sfxOpen, false, 255);2021if (self->movePos < self->duration) {22switch (self->orientation) {23case BUTTONDOOR_UP: self->position.y = self->startPos.y - self->movePos * (self->size.y / self->duration); break;24case BUTTONDOOR_LEFT: self->position.x = self->startPos.x - self->movePos * (self->size.x / self->duration); break;25case BUTTONDOOR_DOWN: self->position.y = self->startPos.y + self->movePos * (self->size.y / self->duration); break;26case BUTTONDOOR_RIGHT: self->position.x = self->startPos.x + self->movePos * (self->size.x / self->duration); break;27}2829self->movePos++;30}31else {32switch (self->orientation) {33case BUTTONDOOR_UP: self->position.y = self->startPos.y - self->size.y; break;34case BUTTONDOOR_LEFT: self->position.x = self->startPos.x - self->size.x; break;35case BUTTONDOOR_DOWN: self->position.y = self->startPos.y + self->size.y; break;36case BUTTONDOOR_RIGHT: self->position.x = self->startPos.x + self->size.x; break;37}38}39}4041foreach_active(Player, player) { Player_CheckCollisionBox(player, self, &self->hitbox); }42}4344void ButtonDoor_LateUpdate(void) {}4546void ButtonDoor_StaticUpdate(void) {}4748void ButtonDoor_Draw(void) { ButtonDoor_DrawSprites(); }4950void ButtonDoor_Create(void *data)51{52RSDK_THIS(ButtonDoor);5354if (!self->duration)55self->duration = 6;5657if (!self->length)58self->length = 2 - (RSDK.CheckSceneFolder("HCZ") != true);5960self->active = ACTIVE_BOUNDS;61self->drawGroup = Zone->objectDrawGroup[0];62self->startPos = self->position;63self->visible = true;64self->drawFX = FX_FLIP;65self->updateRange.x = self->size.x + 0x800000;66self->updateRange.y = self->size.y + 0x800000;6768ButtonDoor_SetupSize();69ButtonDoor_SetupTagLink();7071RSDK.SetSpriteAnimation(ButtonDoor->aniFrames, 0, &self->animator, true, 0);72}7374void ButtonDoor_StageLoad(void)75{76if (RSDK.CheckSceneFolder("LRZ1")) {77ButtonDoor->aniFrames = RSDK.LoadSpriteAnimation("LRZ1/ButtonDoor.bin", SCOPE_STAGE);78ButtonDoor->sfxOpen = RSDK.GetSfx("Stage/Open.wav");79}80else if (RSDK.CheckSceneFolder("LRZ2")) {81ButtonDoor->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/ButtonDoor.bin", SCOPE_STAGE);82ButtonDoor->sfxOpen = RSDK.GetSfx("Stage/Open.wav");83}84else if (RSDK.CheckSceneFolder("HCZ")) {85ButtonDoor->aniFrames = RSDK.LoadSpriteAnimation("HCZ/ButtonDoor.bin", SCOPE_STAGE);86ButtonDoor->sfxOpen = RSDK.GetSfx("Stage/Clack.wav");87}88}8990void ButtonDoor_SetupSize(void)91{92RSDK_THIS(ButtonDoor);9394if (RSDK.CheckSceneFolder("LRZ1")) {95self->size.y = 0x800000;96self->size.x = 0x200000;97}98else if (RSDK.CheckSceneFolder("LRZ2")) {99self->size.y = 0x400000;100self->size.x = 0x200000;101}102else if (RSDK.CheckSceneFolder("HCZ")) {103self->size.y = 0x200000;104self->size.x = 0x200000;105}106107// Size of one "block"108self->segmentSize = self->size;109110// Total Size111if (self->orientation == BUTTONDOOR_UP || self->orientation == BUTTONDOOR_DOWN)112self->size.y *= self->length;113else if (self->orientation == BUTTONDOOR_LEFT || self->orientation == BUTTONDOOR_RIGHT)114self->size.x *= self->length;115116self->hitbox.left = -(self->size.x >> 17);117self->hitbox.top = -(self->size.y >> 17);118self->hitbox.right = self->size.x >> 17;119self->hitbox.bottom = self->size.y >> 17;120}121122void ButtonDoor_SetupTagLink(void)123{124RSDK_THIS(ButtonDoor);125126self->taggedButton = NULL;127128if (RSDK.CheckSceneFolder("LRZ2")) {129self->taggedButton = LRZ2Setup_SetupTagLink(self->buttonTag, (Entity *)self);130}131else {132EntityButton *taggedButton = RSDK_GET_ENTITY(RSDK.GetEntitySlot(self) - 1, Button);133bool32 tagged = false;134135if (self->buttonTag > 0) {136if (Button) {137foreach_all(Button, button)138{139if (button->tag == self->buttonTag) {140taggedButton = button;141tagged = true;142foreach_break;143}144}145}146147if (PullChain && !tagged) {148foreach_all(PullChain, chain)149{150if (chain->tag == self->buttonTag) {151taggedButton = (EntityButton *)chain;152tagged = true;153foreach_break;154}155}156}157158if (TurretSwitch && !tagged) {159foreach_all(TurretSwitch, turretSwitch)160{161if (turretSwitch->tag == self->buttonTag) {162taggedButton = (EntityButton *)turretSwitch;163tagged = true;164foreach_break;165}166}167}168}169170if (taggedButton) {171if ((Button && taggedButton->classID == Button->classID) || (TurretSwitch && taggedButton->classID == TurretSwitch->classID)172|| (PullChain && taggedButton->classID == PullChain->classID)) {173if (self) {174int32 distX = abs(self->position.x - taggedButton->position.x) + 0x800000;175int32 distY = abs(self->position.y - taggedButton->position.y) + 0x800000;176177if (self->updateRange.x < distX)178self->updateRange.x = distX;179180if (self->updateRange.y < distY)181self->updateRange.y = distY;182}183184self->taggedButton = taggedButton;185}186}187}188}189190void ButtonDoor_DrawSprites(void)191{192RSDK_THIS(ButtonDoor);193194Vector2 drawPos = self->position;195196int32 incX = 0, incY = 0;197if (self->orientation == BUTTONDOOR_UP || self->orientation == BUTTONDOOR_DOWN) {198drawPos.y = (self->segmentSize.y >> 1) + self->position.y - (self->size.y >> 1);199incY = self->segmentSize.y;200}201else if (self->orientation == BUTTONDOOR_LEFT || self->orientation == BUTTONDOOR_RIGHT) {202drawPos.x = (self->segmentSize.x >> 1) + self->position.x - (self->size.x >> 1);203incX = self->segmentSize.x;204}205206for (int32 i = 0; i < self->length; ++i) {207RSDK.DrawSprite(&self->animator, &drawPos, false);208209drawPos.x += incX;210drawPos.y += incY;211}212}213214#if GAME_INCLUDE_EDITOR215void ButtonDoor_EditorDraw(void)216{217RSDK_THIS(ButtonDoor);218219ButtonDoor_SetupSize();220ButtonDoor_DrawSprites();221222if (showGizmos()) {223ButtonDoor_SetupTagLink();224225RSDK_DRAWING_OVERLAY(true);226227Vector2 storePos = self->position;228switch (self->orientation) {229case BUTTONDOOR_UP: self->position.y = self->startPos.y - self->size.y; break;230case BUTTONDOOR_LEFT: self->position.x = self->startPos.x - self->size.x; break;231case BUTTONDOOR_DOWN: self->position.y = self->startPos.y + self->size.y; break;232case BUTTONDOOR_RIGHT: self->position.x = self->startPos.x + self->size.x; break;233}234self->inkEffect = INK_BLEND;235ButtonDoor_DrawSprites();236237DrawHelpers_DrawArrow(storePos.x, storePos.y, self->position.x, self->position.y, 0x00F000, INK_NONE, 0xFF);238self->position = storePos;239self->inkEffect = INK_NONE;240241if (self->taggedButton) {242DrawHelpers_DrawArrow(self->taggedButton->position.x, self->taggedButton->position.y, self->position.x, self->position.y, 0xFFFF00,243INK_NONE, 0xFF);244}245RSDK_DRAWING_OVERLAY(false);246}247}248249void ButtonDoor_EditorLoad(void)250{251if (RSDK.CheckSceneFolder("LRZ1"))252ButtonDoor->aniFrames = RSDK.LoadSpriteAnimation("LRZ1/ButtonDoor.bin", SCOPE_STAGE);253else if (RSDK.CheckSceneFolder("LRZ2"))254ButtonDoor->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/ButtonDoor.bin", SCOPE_STAGE);255else if (RSDK.CheckSceneFolder("HCZ"))256ButtonDoor->aniFrames = RSDK.LoadSpriteAnimation("HCZ/ButtonDoor.bin", SCOPE_STAGE);257258RSDK_ACTIVE_VAR(ButtonDoor, orientation);259RSDK_ENUM_VAR("Up", BUTTONDOOR_UP);260RSDK_ENUM_VAR("Left", BUTTONDOOR_LEFT);261RSDK_ENUM_VAR("Down", BUTTONDOOR_DOWN);262RSDK_ENUM_VAR("Right", BUTTONDOOR_RIGHT);263}264#endif265266void ButtonDoor_Serialize(void)267{268RSDK_EDITABLE_VAR(ButtonDoor, VAR_ENUM, buttonTag);269RSDK_EDITABLE_VAR(ButtonDoor, VAR_ENUM, length);270RSDK_EDITABLE_VAR(ButtonDoor, VAR_ENUM, duration);271RSDK_EDITABLE_VAR(ButtonDoor, VAR_UINT8, orientation);272}273274275