Path: blob/master/SonicMania/Objects/SSZ/RTeleporter.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: RTeleporter Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectRTeleporter *RTeleporter;1011void RTeleporter_Update(void)12{13RSDK_THIS(RTeleporter);1415StateMachine_Run(self->state);16}1718void RTeleporter_LateUpdate(void) {}1920void RTeleporter_StaticUpdate(void) {}2122void RTeleporter_Draw(void)23{24RSDK_THIS(RTeleporter);2526StateMachine_Run(self->stateDraw);27}2829void RTeleporter_Create(void *data)30{31RSDK_THIS(RTeleporter);3233self->drawFX = FX_FLIP;3435if (!SceneInfo->inEditor) {36self->active = ACTIVE_BOUNDS;37self->visible = true;38self->drawGroup = Zone->objectDrawGroup[1];39self->updateRange.x = 0x800000;40self->updateRange.y = 0x800000;4142RSDK.SetSpriteAnimation(RTeleporter->aniFrames, 0, &self->mainAnimator, true, 0);43RSDK.SetSpriteAnimation(RTeleporter->aniFrames, 1, &self->electricAnimator, true, 0);4445self->originY = self->position.y;46self->state = RTeleporter_State_CheckPlayerCollisions;47self->stateDraw = RTeleporter_Draw_Active;48}49}5051void RTeleporter_StageLoad(void)52{53if (RSDK.CheckSceneFolder("SSZ1") || RSDK.CheckSceneFolder("SSZ2"))54RTeleporter->aniFrames = RSDK.LoadSpriteAnimation("SSZ/RTeleporter.bin", SCOPE_STAGE);55else if (RSDK.CheckSceneFolder("MMZ1") || RSDK.CheckSceneFolder("MMZ2"))56RTeleporter->aniFrames = RSDK.LoadSpriteAnimation("MMZ/RTeleporter.bin", SCOPE_STAGE);5758RTeleporter->hitboxTeleporter.top = -32;59RTeleporter->hitboxTeleporter.left = -34;60RTeleporter->hitboxTeleporter.right = 34;61RTeleporter->hitboxTeleporter.bottom = 32;6263RTeleporter->sfxExplosion = RSDK.GetSfx("Stage/Explosion2.wav");64RTeleporter->sfxGoodFuture = RSDK.GetSfx("Stage/GoodFuture.wav");65}6667void RTeleporter_State_CheckPlayerCollisions(void)68{69RSDK_THIS(RTeleporter);7071RSDK.ProcessAnimation(&self->mainAnimator);72RSDK.ProcessAnimation(&self->electricAnimator);7374self->position.y = BadnikHelpers_Oscillate(self->originY, 4, 9);7576foreach_active(Player, player)77{78if (!player->onGround) {79if (Player_CheckCollisionTouch(player, self, &RTeleporter->hitboxTeleporter)) {80Player_CheckItemBreak(player, self, false);81self->state = RTeleporter_State_Destroyed;82self->stateDraw = RTeleporter_Draw_Exploding;83}84}85}86}8788void RTeleporter_State_Destroyed(void)89{90RSDK_THIS(RTeleporter);9192if (!(Zone->timer % 3)) {93RSDK.PlaySfx(RTeleporter->sfxExplosion, false, 255);9495if (Zone->timer & 4) {96int32 x = self->position.x + (RSDK.Rand(-32, 32) << 16);97int32 y = self->position.y + (RSDK.Rand(-32, 32) << 16);98EntityExplosion *explosion = CREATE_ENTITY(Explosion, INT_TO_VOID(((RSDK.Rand(0, 256) > 192) + EXPLOSION_BOSS)), x, y);99explosion->drawGroup = Zone->objectDrawGroup[1];100}101}102103if (++self->timer == 80) {104RSDK.PlaySfx(RTeleporter->sfxGoodFuture, false, 255);105RSDK.SetSpriteAnimation(RTeleporter->aniFrames, 2, &self->mainAnimator, true, 0);106107self->position.y += 0x180000;108RSDK.ObjectTileGrip(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0x80000, 8);109110self->state = StateMachine_None;111self->stateDraw = RTeleporter_Draw_Destroyed;112}113}114115void RTeleporter_Draw_Active(void)116{117RSDK_THIS(RTeleporter);118Vector2 drawPos;119120drawPos.x = self->position.x;121drawPos.y = self->position.y;122RSDK.DrawSprite(&self->mainAnimator, NULL, false);123124self->direction = FLIP_Y;125RSDK.DrawSprite(&self->mainAnimator, NULL, false);126127self->direction = FLIP_NONE;128RSDK.DrawSprite(&self->electricAnimator, NULL, false);129130drawPos.x -= 0x100000;131RSDK.DrawSprite(&self->electricAnimator, &drawPos, false);132133drawPos.x += 0x200000;134RSDK.DrawSprite(&self->electricAnimator, &drawPos, false);135}136137void RTeleporter_Draw_Exploding(void)138{139RSDK_THIS(RTeleporter);140141RSDK.DrawSprite(&self->mainAnimator, NULL, false);142143self->direction = FLIP_Y;144RSDK.DrawSprite(&self->mainAnimator, NULL, false);145146self->direction = FLIP_NONE;147}148149void RTeleporter_Draw_Destroyed(void)150{151RSDK_THIS(RTeleporter);152153RSDK.DrawSprite(&self->mainAnimator, NULL, false);154}155156#if GAME_INCLUDE_EDITOR157void RTeleporter_EditorDraw(void)158{159RSDK_THIS(RTeleporter);160161RSDK.SetSpriteAnimation(RTeleporter->aniFrames, 0, &self->mainAnimator, true, 0);162RSDK.SetSpriteAnimation(RTeleporter->aniFrames, 1, &self->electricAnimator, true, 0);163164RTeleporter_Draw_Active();165}166167void RTeleporter_EditorLoad(void)168{169if (RSDK.CheckSceneFolder("SSZ1") || RSDK.CheckSceneFolder("SSZ2"))170RTeleporter->aniFrames = RSDK.LoadSpriteAnimation("SSZ/RTeleporter.bin", SCOPE_STAGE);171else if (RSDK.CheckSceneFolder("MMZ1") || RSDK.CheckSceneFolder("MMZ2"))172RTeleporter->aniFrames = RSDK.LoadSpriteAnimation("MMZ/RTeleporter.bin", SCOPE_STAGE);173}174#endif175176void RTeleporter_Serialize(void) {}177178179