Path: blob/master/SonicMania/Objects/FBZ/Launcher.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Launcher Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectLauncher *Launcher;1011void Launcher_Update(void)12{13RSDK_THIS(Launcher);1415Platform_Update();1617RSDK.ProcessAnimation(&self->animator);18}1920void Launcher_LateUpdate(void) {}2122void Launcher_StaticUpdate(void) {}2324void Launcher_Draw(void)25{26RSDK_THIS(Launcher);2728RSDK.DrawSprite(&self->animator, &self->drawPos, false);29}3031void Launcher_Create(void *data)32{33RSDK_THIS(Launcher);3435self->active = ACTIVE_BOUNDS;36Platform_Create(NULL);3738RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, 0);39self->drawFX = FX_FLIP;40self->animator.frameID = 4;41self->stateCollide = Launcher_Collide_Normal;42self->state = Launcher_State_Idle;43}4445void Launcher_StageLoad(void) { Launcher->sfxLaunch = RSDK.GetSfx("Stage/Launch.wav"); }4647void Launcher_Collide_Normal(void)48{49RSDK_THIS(Launcher);50int32 stoodPlayers = self->stoodPlayers;51self->stoodPlayers = 0;52Hitbox *hitbox = RSDK.GetHitbox(&self->animator, 0);5354foreach_active(Player, player)55{56int32 playerID = RSDK.GetEntitySlot(player);5758if (Player_CheckCollisionPlatform(player, self, hitbox)) {59self->stoodPlayers |= 1 << playerID;6061if (self->state == Launcher_State_Idle) {62self->active = ACTIVE_NORMAL;63self->velocity.x = self->direction == FLIP_NONE ? 0x10000 : -0x10000;64self->releaseDelay = 12;65self->accelTimer = 4;66RSDK.PlaySfx(Launcher->sfxLaunch, false, 255);67self->state = Launcher_State_HandleLaunch;68}6970if (self->state == Launcher_State_ReturnToStart) {71player->position.x += self->collisionOffset.x;72}73else {74player->position.x = self->drawPos.x;75player->direction = self->direction;76player->velocity.x = 0;77player->groundVel = CLAMP(self->velocity.x, -0x60000, 0x60000);78player->pushing = false;79player->tileCollisions = TILECOLLISION_DOWN;80if (player->state != Player_State_Roll)81player->state = Player_State_Ground;82}83}84else if (((1 << playerID) & stoodPlayers) && self->state != Launcher_State_ReturnToStart) {85player->velocity.x = self->velocity.x;86player->groundVel = self->velocity.x;87}88}89}9091void Launcher_State_Idle(void) {}9293void Launcher_State_HandleLaunch(void)94{95RSDK_THIS(Launcher);9697self->drawPos.x += self->velocity.x;9899if (--self->accelTimer >= 0)100self->velocity.x <<= 1;101102if (--self->releaseDelay < 0) {103foreach_active(Player, player)104{105if (((1 << RSDK.GetEntitySlot(player)) & self->stoodPlayers)) {106player->groundVel = self->velocity.x;107player->velocity.x = self->velocity.x;108}109}110111self->state = Launcher_State_ReturnToStart;112}113}114115void Launcher_State_ReturnToStart(void)116{117RSDK_THIS(Launcher);118119self->drawPos.x += self->direction ? 0x10000 : -0x10000;120if (self->drawPos.x == self->centerPos.x) {121self->active = ACTIVE_BOUNDS;122self->state = Launcher_State_Idle;123}124}125126#if GAME_INCLUDE_EDITOR127void Launcher_EditorDraw(void)128{129RSDK_THIS(Launcher);130131RSDK.SetSpriteAnimation(Platform->aniFrames, 1, &self->animator, true, 0);132self->drawFX = FX_FLIP;133self->animator.frameID = 4;134self->drawPos = self->position;135136Launcher_Draw();137138if (showGizmos()) {139RSDK_DRAWING_OVERLAY(true);140141self->velocity.x = self->direction == FLIP_NONE ? 0x10000 : -0x10000;142self->releaseDelay = 12;143144self->accelTimer = 4;145while (--self->releaseDelay >= 0) {146self->drawPos.x += self->velocity.x;147148if (--self->accelTimer >= 0)149self->velocity.x <<= 1;150}151152self->inkEffect = INK_BLEND;153Launcher_Draw();154self->inkEffect = INK_NONE;155156DrawHelpers_DrawArrow(self->position.x, self->position.y, self->drawPos.x, self->drawPos.y, 0x00FF00, INK_NONE, 0xFF);157158RSDK_DRAWING_OVERLAY(false);159}160}161162void Launcher_EditorLoad(void)163{164165RSDK_ACTIVE_VAR(Launcher, direction);166RSDK_ENUM_VAR("Right", FLIP_NONE);167RSDK_ENUM_VAR("Left", FLIP_X);168}169#endif170171void Launcher_Serialize(void) { RSDK_EDITABLE_VAR(Launcher, VAR_UINT8, direction); }172173174