Path: blob/master/SonicMania/Objects/LRZ/LRZConvSwitch.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: LRZConvSwitch Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectLRZConvSwitch *LRZConvSwitch;1011void LRZConvSwitch_Update(void)12{13RSDK_THIS(LRZConvSwitch);1415if ((LRZ2Setup->conveyorDir != self->conveyorDir) != self->calibration)16LRZConvSwitch_Calibrate();1718int32 extendX2 = self->position.x;19int32 extendY2 = self->position.y - 0x180000;2021foreach_active(Player, player)22{23int32 playerID = RSDK.GetEntitySlot(player);2425if (self->playerPositions[playerID].x || self->playerPositions[playerID].y) {26int32 dir = 0;27if (player->position.x <= self->playerPositions[playerID].x) {28if (player->position.x < self->playerPositions[playerID].x)29dir = -1;30}31else {32dir = 1;33}3435bool32 collided =36MathHelpers_CheckPositionOverlap(player->position.x, player->position.y, self->playerPositions[playerID].x,37self->playerPositions[playerID].y, self->position.x, self->position.y, extendX2, extendY2);3839if (!self->dir && !player->sidekick) {40if (dir < 0) {41if (collided && !self->conveyorDir) {42RSDK.PlaySfx(LRZConvSwitch->sfxClack, false, 255);43RSDK.SetSpriteAnimation(LRZConvSwitch->aniFrames, 1, &self->animator, true, 0);44self->conveyorDir = 1;45LRZ2Setup->conveyorDir = self->calibration ^ 1;46self->dir = 1;47}48}49if (dir > 0 && collided && self->conveyorDir == 1) {50RSDK.PlaySfx(LRZConvSwitch->sfxClack, false, 255);51RSDK.SetSpriteAnimation(LRZConvSwitch->aniFrames, 3, &self->animator, true, 0);52self->conveyorDir = 0;53LRZ2Setup->conveyorDir = self->calibration;54self->dir = 1;55}56}57}5859self->playerPositions[playerID].x = player->position.x;60self->playerPositions[playerID].y = player->position.y;61}6263RSDK.ProcessAnimation(&self->animator);6465if (self->animator.animationID == 1 && self->animator.frameID == self->animator.frameCount - 1) {66RSDK.SetSpriteAnimation(LRZConvSwitch->aniFrames, 2, &self->animator, true, 0);67self->dir = 0;68}6970if (self->animator.animationID == 3 && self->animator.frameID == self->animator.frameCount - 1) {71RSDK.SetSpriteAnimation(LRZConvSwitch->aniFrames, 0, &self->animator, true, 0);72self->dir = 0;73}74}7576void LRZConvSwitch_LateUpdate(void) {}7778void LRZConvSwitch_StaticUpdate(void) {}7980void LRZConvSwitch_Draw(void)81{82RSDK_THIS(LRZConvSwitch);8384RSDK.DrawSprite(&self->animator, NULL, false);85}8687void LRZConvSwitch_Create(void *data)88{89RSDK_THIS(LRZConvSwitch);9091self->active = ACTIVE_BOUNDS;92self->drawGroup = Zone->objectDrawGroup[0];93self->startPos = self->position;94self->visible = true;95self->drawFX = FX_FLIP;96self->updateRange.x = 0x800000;97self->updateRange.y = 0x800000;9899LRZConvSwitch_Calibrate();100}101102void LRZConvSwitch_StageLoad(void)103{104LRZConvSwitch->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/LRZConvSwitch.bin", SCOPE_STAGE);105106LRZConvSwitch->sfxClack = RSDK.GetSfx("Stage/Clack.wav");107}108109void LRZConvSwitch_Calibrate(void)110{111RSDK_THIS(LRZConvSwitch);112113self->conveyorDir = self->calibration ^ LRZ2Setup->conveyorDir;114115if (!self->conveyorDir)116RSDK.SetSpriteAnimation(LRZConvSwitch->aniFrames, 0, &self->animator, true, 0);117else if (self->conveyorDir == 1)118RSDK.SetSpriteAnimation(LRZConvSwitch->aniFrames, 2, &self->animator, true, 0);119}120121#if GAME_INCLUDE_EDITOR122void LRZConvSwitch_EditorDraw(void)123{124LRZConvSwitch_Calibrate();125LRZConvSwitch_Draw();126}127128void LRZConvSwitch_EditorLoad(void)129{130LRZConvSwitch->aniFrames = RSDK.LoadSpriteAnimation("LRZ2/LRZConvSwitch.bin", SCOPE_STAGE);131132RSDK_ACTIVE_VAR(LRZConvSwitch, calibration);133RSDK_ENUM_VAR("Right", LRZCONVSWITCH_RIGHT);134RSDK_ENUM_VAR("Left", LRZCONVSWITCH_LEFT);135}136#endif137138void LRZConvSwitch_Serialize(void) { RSDK_EDITABLE_VAR(LRZConvSwitch, VAR_UINT8, calibration); }139140141