Path: blob/master/SonicMania/Objects/LRZ/LRZConvControl.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: LRZConvControl Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectLRZConvControl *LRZConvControl;1011void LRZConvControl_Update(void)12{13RSDK_THIS(LRZConvControl);1415switch (self->triggerMode) {16case LRZCONVCTRL_TRIGGER_PLAYER: LRZConvControl_HandlePlayerTrigger(); break;17case LRZCONVCTRL_TRIGGER_BUTTON: LRZConvControl_HandleButtonTrigger(); break;18}1920self->visible = DebugMode->debugActive;21}2223void LRZConvControl_LateUpdate(void) {}2425void LRZConvControl_StaticUpdate(void) {}2627void LRZConvControl_Draw(void)28{29RSDK_THIS(LRZConvControl);3031RSDK.SetSpriteAnimation(LRZConvControl->aniFrames, 0, &self->animator, true, 0);32RSDK.DrawSprite(&self->animator, NULL, false);3334if (self->triggerMode == LRZCONVCTRL_TRIGGER_PLAYER) {35self->hitbox.left = -(self->hitboxSize.x >> 17);36self->hitbox.top = -(self->hitboxSize.y >> 17);37self->hitbox.right = self->hitboxSize.x >> 17;38self->hitbox.bottom = self->hitboxSize.y >> 17;3940DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &self->hitbox, self->direction, 0xFFFFFF);41}42}4344void LRZConvControl_Create(void *data)45{46RSDK_THIS(LRZConvControl);4748self->active = ACTIVE_BOUNDS;49self->drawGroup = Zone->objectDrawGroup[0];50self->visible = true;51self->drawFX = FX_FLIP;52self->updateRange.x = 0x800000;53self->updateRange.y = 0x800000;5455switch (self->triggerMode) {56case LRZCONVCTRL_TRIGGER_PLAYER:57self->hitbox.left = -(self->hitboxSize.x >> 17);58self->hitbox.top = -(self->hitboxSize.y >> 17);59self->hitbox.right = self->hitboxSize.x >> 17;60self->hitbox.bottom = self->hitboxSize.y >> 17;6162self->updateRange.x += self->hitboxSize.x;63self->updateRange.y += self->hitboxSize.y;64break;6566case LRZCONVCTRL_TRIGGER_BUTTON: self->taggedButton = LRZ2Setup_SetupTagLink(self->buttonTag, (Entity *)self); break;67}68}6970void LRZConvControl_StageLoad(void) { LRZConvControl->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/LRZConvControl.bin", SCOPE_STAGE); }7172void LRZConvControl_HandlePlayerTrigger(void)73{74RSDK_THIS(LRZConvControl);7576bool32 interacted = false;77foreach_active(Player, player)78{79int32 playerID = RSDK.GetEntitySlot(player);80bool32 collided = Player_CheckCollisionTouch(player, self, &self->hitbox);8182if ((1 << playerID) & self->activePlayers) {83if (!collided)84self->activePlayers &= ~(1 << playerID);85}86else {87if (collided) {88if (!player->sidekick)89interacted = true;9091self->activePlayers |= 1 << playerID;92}93}94}9596if (interacted) {97switch (self->behavior) {98case LRZCONVCTRL_BEHAVIOR_ONOFF_SET: LRZ2Setup->conveyorOff = self->flipVal; break;99case LRZCONVCTRL_BEHAVIOR_ONOFF_SWAP: LRZ2Setup->conveyorOff = !LRZ2Setup->conveyorOff; break;100case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SET: LRZ2Setup->conveyorDir = self->flipVal; break;101case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SWAP: LRZ2Setup->conveyorDir = !LRZ2Setup->conveyorDir; break;102default: break;103}104}105}106107void LRZConvControl_HandleButtonTrigger(void)108{109RSDK_THIS(LRZConvControl);110111if (self->buttonTag) {112EntityButton *button = self->taggedButton;113if (button) {114switch (self->behavior) {115case LRZCONVCTRL_BEHAVIOR_ONOFF_SET:116if (button->down)117LRZ2Setup->conveyorOff = self->flipVal;118break;119120case LRZCONVCTRL_BEHAVIOR_ONOFF_SWAP:121if (self->wasToggled != button->toggled)122LRZ2Setup->conveyorOff = !LRZ2Setup->conveyorOff;123124self->wasToggled = button->toggled;125break;126127case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SET:128if (button->down)129LRZ2Setup->conveyorDir = self->flipVal;130break;131132case LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SWAP:133if (button->toggled != self->wasToggled)134LRZ2Setup->conveyorDir = !LRZ2Setup->conveyorDir;135136self->wasToggled = button->toggled;137break;138default: break;139}140}141}142}143144#if GAME_INCLUDE_EDITOR145void LRZConvControl_EditorDraw(void)146{147RSDK_THIS(LRZConvControl);148149self->updateRange.x = 0x800000;150self->updateRange.y = 0x800000;151152switch (self->triggerMode) {153case LRZCONVCTRL_TRIGGER_PLAYER:154self->updateRange.x += self->hitboxSize.x;155self->updateRange.y += self->hitboxSize.y;156break;157158case LRZCONVCTRL_TRIGGER_BUTTON: break;159}160161RSDK.SetSpriteAnimation(LRZConvControl->aniFrames, 0, &self->animator, true, 0);162RSDK.DrawSprite(&self->animator, NULL, false);163164if (showGizmos()) {165switch (self->triggerMode) {166case LRZCONVCTRL_TRIGGER_PLAYER:167RSDK_DRAWING_OVERLAY(true);168169self->hitbox.left = -(self->hitboxSize.x >> 17);170self->hitbox.top = -(self->hitboxSize.y >> 17);171self->hitbox.right = self->hitboxSize.x >> 17;172self->hitbox.bottom = self->hitboxSize.y >> 17;173DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &self->hitbox, self->direction, 0xFFFFFF);174RSDK_DRAWING_OVERLAY(false);175break;176177case LRZCONVCTRL_TRIGGER_BUTTON:178RSDK_DRAWING_OVERLAY(true);179self->taggedButton = LRZ2Setup_SetupTagLink(self->buttonTag, (Entity *)self);180if (self->taggedButton) {181DrawHelpers_DrawArrow(self->taggedButton->position.x, self->taggedButton->position.y, self->position.x, self->position.y,1820xFFFF00, INK_NONE, 0xFF);183}184RSDK_DRAWING_OVERLAY(false);185break;186}187}188}189190void LRZConvControl_EditorLoad(void)191{192LRZConvControl->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/LRZConvControl.bin", SCOPE_STAGE);193194RSDK_ACTIVE_VAR(LRZConvControl, triggerMode);195RSDK_ENUM_VAR("Player", LRZCONVCTRL_TRIGGER_PLAYER);196RSDK_ENUM_VAR("Button", LRZCONVCTRL_TRIGGER_BUTTON);197198RSDK_ACTIVE_VAR(LRZConvControl, behavior);199RSDK_ENUM_VAR("On/Off (Set)", LRZCONVCTRL_BEHAVIOR_ONOFF_SET);200RSDK_ENUM_VAR("On/Off (Swap)", LRZCONVCTRL_BEHAVIOR_ONOFF_SWAP);201RSDK_ENUM_VAR("Change Dir (Set)", LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SET);202RSDK_ENUM_VAR("Change Dir (Swap)", LRZCONVCTRL_BEHAVIOR_CHANGEDIR_SWAP);203}204#endif205206void LRZConvControl_Serialize(void)207{208RSDK_EDITABLE_VAR(LRZConvControl, VAR_UINT8, triggerMode);209RSDK_EDITABLE_VAR(LRZConvControl, VAR_ENUM, buttonTag);210RSDK_EDITABLE_VAR(LRZConvControl, VAR_VECTOR2, hitboxSize);211RSDK_EDITABLE_VAR(LRZConvControl, VAR_UINT8, behavior);212RSDK_EDITABLE_VAR(LRZConvControl, VAR_UINT8, flipVal);213}214215216