Path: blob/master/SonicMania/Objects/CPZ/TippingPlatform.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: TippingPlatform Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectTippingPlatform *TippingPlatform;1011void TippingPlatform_Update(void)12{13RSDK_THIS(TippingPlatform);1415if (self->bossID) {16if (self->animator.frameID) {17self->stateCollide = Platform_Collision_None;18self->collision = PLATFORM_C_NONE;19}20else {21self->stateCollide = Platform_Collision_Platform;22self->collision = PLATFORM_C_PLATFORM;23}2425if (!self->stoodAngle && self->bossID > TIPPINGPLATFORM_EGGMAN && self->syringe->activated) {26self->stoodAngle = 1;27self->timer = self->intervalOffset + 1;28RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, 0);29self->state = TippingPlatform_State_Tipping_Delay;30}31}32else {33if (self->state == Platform_State_Fixed) {34int32 timer = (Zone->timer + self->intervalOffset) % self->interval;35if (timer >= self->duration) {36if (timer >= self->duration + 22) {37RSDK.SetSpriteAnimation(Platform->aniFrames, 2, &self->animator, true, 6);38}39else {40self->active = ACTIVE_NORMAL;41RSDK.SetSpriteAnimation(Platform->aniFrames, 2, &self->animator, true, (timer - self->duration) >> 2);42self->state = TippingPlatform_State_Restore;43}44}45else {46self->active = ACTIVE_NORMAL;47self->timer = self->duration - timer;4849if (self->duration - timer < self->duration - 24) {50RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, 6);51self->state = TippingPlatform_State_Tipping;52}53else {54RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, timer >> 2);55self->state = TippingPlatform_State_Tipping;56self->animator.timer = (self->duration - self->timer) & 3;57}58}59}6061bool32 isSolid = false;62if (self->animator.animationID == 1)63isSolid = self->animator.frameID == 0;64else65isSolid = self->animator.frameID == 6;6667if (isSolid) {68self->stateCollide = Platform_Collision_Platform;69self->collision = PLATFORM_C_PLATFORM;70}71else {72self->stateCollide = Platform_Collision_None;73self->collision = PLATFORM_C_NONE;74}75}7677Platform_Update();78}7980void TippingPlatform_LateUpdate(void) {}8182void TippingPlatform_StaticUpdate(void) {}8384void TippingPlatform_Draw(void)85{86RSDK_THIS(TippingPlatform);8788RSDK.DrawSprite(&self->animator, &self->drawPos, false);89}9091void TippingPlatform_Create(void *data)92{93RSDK_THIS(TippingPlatform);9495if (!self->interval)96self->interval = -16;9798if (!self->duration)99self->duration = 120;100101self->collision = PLATFORM_C_PLATFORM;102Platform_Create(NULL);103104if (self->bossID) {105RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, 0);106self->animator.speed = 0;107}108else {109RSDK.SetSpriteAnimation(Platform->aniFrames, 2, &self->animator, true, 6);110}111112self->state = Platform_State_Fixed;113if (!SceneInfo->inEditor) {114if (self->bossID > TIPPINGPLATFORM_PLAYER) {115foreach_all(Syringe, syringe)116{117if (syringe->tag == self->bossID) {118self->syringe = syringe;119if (syringe) {120self->updateRange.x = abs(self->position.x - syringe->position.x) + 0x400000;121self->updateRange.y = abs(self->position.y - syringe->position.y) + 0x400000;122}123self->stateCollide = Platform_Collision_Solid;124self->collision = PLATFORM_C_SOLID;125foreach_break;126}127}128}129130if (self->bossID == TIPPINGPLATFORM_PLAYER) {131self->direction = FLIP_X;132self->drawFX = FX_FLIP;133}134}135}136137void TippingPlatform_StageLoad(void) {}138139void TippingPlatform_State_Tipping_Boss(void)140{141RSDK_THIS(TippingPlatform);142143if (self->animator.frameID < 6 && ++self->animator.timer == 4) {144self->animator.timer = 0;145self->animator.frameID++;146}147148if (--self->timer <= 0) {149self->active = ACTIVE_BOUNDS;150if (self->bossID <= TIPPINGPLATFORM_EGGMAN)151self->state = TippingPlatform_State_RestorePlatform;152else153self->state = Platform_State_Fixed;154}155}156157void TippingPlatform_State_RestorePlatform(void)158{159RSDK_THIS(TippingPlatform);160161if (self->animator.frameID <= 0) {162self->active = ACTIVE_BOUNDS;163self->state = Platform_State_Fixed;164}165else if (++self->animator.timer == 4) {166self->animator.timer = 0;167self->animator.frameID--;168}169}170171void TippingPlatform_State_Tipping(void)172{173RSDK_THIS(TippingPlatform);174175if (--self->timer <= 0) {176RSDK.SetSpriteAnimation(Platform->aniFrames, 2, &self->animator, true, 0);177self->state = TippingPlatform_State_RestorePlatform;178}179}180181void TippingPlatform_State_Restore(void)182{183RSDK_THIS(TippingPlatform);184185if (self->animator.frameID == 6) {186self->active = ACTIVE_BOUNDS;187self->state = Platform_State_Fixed;188}189}190191void TippingPlatform_State_Tipping_Delay(void)192{193RSDK_THIS(TippingPlatform);194195if (--self->timer <= 0)196self->state = TippingPlatform_State_Tipping_Boss;197}198199#if GAME_INCLUDE_EDITOR200void TippingPlatform_EditorDraw(void)201{202RSDK_THIS(TippingPlatform);203204self->collision = PLATFORM_C_PLATFORM;205Platform_Create(NULL);206207if (self->bossID) {208RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, 0);209self->animator.speed = 0;210}211else {212RSDK.SetSpriteAnimation(Platform->aniFrames, 2, &self->animator, true, 6);213}214215TippingPlatform_Draw();216217if (showGizmos()) {218RSDK_DRAWING_OVERLAY(true);219220if (self->bossID > TIPPINGPLATFORM_PLAYER) {221foreach_all(Syringe, syringe)222{223if (syringe->tag == self->bossID) {224DrawHelpers_DrawArrow(self->position.x, self->position.y, syringe->position.x, syringe->position.y, 0xFFFF00, INK_NONE, 0xFF);225foreach_break;226}227}228}229230for (int32 s = SceneInfo->entitySlot + 1, i = 0; i < self->childCount; ++i) {231Entity *child = RSDK_GET_ENTITY_GEN(s + i);232if (!child)233continue;234235DrawHelpers_DrawArrow(self->position.x, self->position.y, child->position.x, child->position.y, 0xFFFF00, INK_NONE, 0xFF);236}237238RSDK_DRAWING_OVERLAY(false);239}240}241242void TippingPlatform_EditorLoad(void)243{244245// bossID = 0: No tag246// bossID = 1: Player Boss Platform247// bossID = 2: Eggman Boss Platform248// bossID 3 and above: match syringe tag249}250#endif251252void TippingPlatform_Serialize(void)253{254RSDK_EDITABLE_VAR(TippingPlatform, VAR_ENUM, childCount);255RSDK_EDITABLE_VAR(TippingPlatform, VAR_UINT8, interval);256RSDK_EDITABLE_VAR(TippingPlatform, VAR_UINT8, intervalOffset);257RSDK_EDITABLE_VAR(TippingPlatform, VAR_UINT8, duration);258RSDK_EDITABLE_VAR(TippingPlatform, VAR_UINT8, bossID);259}260261262