Path: blob/master/SonicMania/Objects/FBZ/FlameSpring.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FlameSpring Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFlameSpring *FlameSpring;1011void FlameSpring_Update(void)12{13RSDK_THIS(FlameSpring);1415StateMachine_Run(self->state);16}1718void FlameSpring_LateUpdate(void) {}1920void FlameSpring_StaticUpdate(void) {}2122void FlameSpring_Draw(void)23{24RSDK_THIS(FlameSpring);2526StateMachine_Run(self->stateDraw);27}2829void FlameSpring_Create(void *data)30{31RSDK_THIS(FlameSpring);3233self->drawFX = FX_FLIP;34if (!SceneInfo->inEditor) {35self->active = ACTIVE_BOUNDS;36self->updateRange.x = 0x800000;37self->updateRange.y = 0x800000;38self->visible = true;39self->drawGroup = Zone->objectDrawGroup[0] + 1;4041if (data) {42RSDK.SetSpriteAnimation(FlameSpring->aniFrames, 2, &self->mainAnimator, true, 0);43self->state = FlameSpring_State_Flame;44self->stateDraw = FlameSpring_Draw_Flame;45}46else {47if (!(self->force & 1))48self->velocity.y = -0xA0000;49else50self->velocity.y = -0x100000;51RSDK.SetSpriteAnimation(FlameSpring->aniFrames, 0, &self->mainAnimator, true, 0);52RSDK.SetSpriteAnimation(FlameSpring->aniFrames, 1, &self->nozzleAnimator, true, 0);5354self->flamePosL.x = self->position.x - 0x300 * RSDK.Sin1024(0x100);55self->flamePosL.y = self->position.y - 0x40000;56self->flamePosR.x = 0x300 * RSDK.Sin1024(0x100) + self->position.x;57self->flamePosR.y = self->position.y - 0x40000;5859if (self->type > FLAMESPRING_LEFT)60self->mainAnimator.frameID = 2;6162self->type = self->type % 3;63self->state = FlameSpring_State_Spring;64self->stateDraw = FlameSpring_Draw_Spring;65}66}67}6869void FlameSpring_StageLoad(void)70{71if (RSDK.CheckSceneFolder("FBZ"))72FlameSpring->aniFrames = RSDK.LoadSpriteAnimation("FBZ/FlameSpring.bin", SCOPE_STAGE);7374FlameSpring->hitboxSpring.left = -16;75FlameSpring->hitboxSpring.top = -8;76FlameSpring->hitboxSpring.right = 16;77FlameSpring->hitboxSpring.bottom = 8;7879FlameSpring->hitboxFlame.left = -4;80FlameSpring->hitboxFlame.top = -4;81FlameSpring->hitboxFlame.right = 4;82FlameSpring->hitboxFlame.bottom = 4;8384FlameSpring->sfxSpring = RSDK.GetSfx("Global/Spring.wav");85FlameSpring->sfxFlame = RSDK.GetSfx("Stage/Flame2.wav");86}8788void FlameSpring_State_Spring(void)89{90RSDK_THIS(FlameSpring);9192self->spittingFire = false;93foreach_active(Player, playerPtr)94{95if (Player_CheckCollisionBox(playerPtr, self, &FlameSpring->hitboxSpring) == C_TOP && playerPtr->velocity.y >= 0) {96if (!self->mainAnimator.frameID) {97self->timer = 0;98self->mainAnimator.frameID = 1;99}100101if (self->mainAnimator.frameID <= 1)102self->spittingFire = true;103}104}105106if (self->mainAnimator.frameID == 1) {107if (self->spittingFire) {108if (++self->timer >= 60) {109foreach_active(Player, player)110{111if (Player_CheckCollisionBox(player, self, &FlameSpring->hitboxSpring) == C_TOP) {112int32 anim = player->animator.animationID;113if (anim == ANI_WALK || (anim > ANI_AIR_WALK && anim <= ANI_DASH))114player->animationReserve = player->animator.animationID;115else116player->animationReserve = ANI_WALK;117118if (self->playerAni)119RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_TWIRL, &player->animator, true, 0);120else121RSDK.SetSpriteAnimation(player->aniFrames, ANI_SPRING_DIAGONAL, &player->animator, true, 0);122123player->state = Player_State_Air;124player->onGround = false;125player->velocity.y = self->velocity.y;126if (player->underwater)127player->velocity.y >>= 1;128RSDK.PlaySfx(FlameSpring->sfxSpring, false, 255);129}130}131}132}133else {134self->mainAnimator.frameID = 0;135}136}137else {138if (!(Zone->timer & 7))139RSDK.PlaySfx(FlameSpring->sfxFlame, false, 255);140141int32 timer = Zone->timer + self->offset;142if (!self->type) {143self->flamePosL.x = self->position.x - 0x300 * RSDK.Sin1024(((4 * timer) & 0x1FF) + 0x100);144self->flamePosR.x = 0x300 * RSDK.Sin1024(((4 * timer) & 0x1FF) + 0x100) + self->position.x;145}146147if (!(Zone->timer & 3)) {148EntityFlameSpring *flame = NULL;149switch (self->type) {150case FLAMESPRING_BOTH:151flame = CREATE_ENTITY(FlameSpring, INT_TO_VOID(true), self->flamePosL.x, self->flamePosL.y);152flame->drawGroup = Zone->objectDrawGroup[0];153flame->velocity.x = -0x100 * RSDK.Sin1024(((4 * timer) & 0x1FF) + 0x100);154155flame = CREATE_ENTITY(FlameSpring, INT_TO_VOID(1), self->flamePosR.x, self->flamePosR.y);156flame->velocity.x = (RSDK.Sin1024(((4 * timer) & 0x1FF) + 256) << 8);157break;158159case FLAMESPRING_RIGHT:160flame = CREATE_ENTITY(FlameSpring, INT_TO_VOID(true), self->flamePosR.x, self->flamePosR.y);161flame->drawGroup = Zone->objectDrawGroup[0];162if (0xC00 * RSDK.Sin1024((timer & 0x1FF) + 0x100) >= 0)163flame->velocity.x = (0x44000 - 0xC0 * RSDK.Sin1024((timer & 0x1FF) + 0x100));164else165flame->velocity.x = (0x44000 - -0xC0 * RSDK.Sin1024((timer & 0x1FF) + 0x100));166break;167168case FLAMESPRING_LEFT:169flame = CREATE_ENTITY(FlameSpring, INT_TO_VOID(true), self->flamePosL.x, self->flamePosL.y);170flame->drawGroup = Zone->objectDrawGroup[0];171if (-0xC0 * RSDK.Sin1024((timer & 0x1FF) + 0x100) >= 0)172flame->velocity.x = (-0xC0 * RSDK.Sin1024((timer & 0x1FF) + 0x100) - 0x44000);173else174flame->velocity.x = (0xC0 * RSDK.Sin1024((timer & 0x1FF) + 0x100) - 0x44000);175break;176}177}178}179}180181void FlameSpring_State_Flame(void)182{183RSDK_THIS(FlameSpring);184185self->position.x += self->velocity.x;186foreach_active(Player, player)187{188if (Player_CheckCollisionTouch(player, self, &FlameSpring->hitboxFlame)) {189Player_ElementHurt(player, self, SHIELD_FIRE);190}191}192193RSDK.ProcessAnimation(&self->mainAnimator);194if (self->mainAnimator.frameID == self->mainAnimator.frameCount - 1)195destroyEntity(self);196}197198void FlameSpring_Draw_Spring(void)199{200RSDK_THIS(FlameSpring);201202if (self->mainAnimator.frameID != 1 && self->type != FLAMESPRING_RIGHT) {203self->nozzleAnimator.frameID = self->flamePosL.x > self->position.x;204RSDK.DrawSprite(&self->nozzleAnimator, &self->flamePosL, false);205}206207RSDK.DrawSprite(&self->mainAnimator, NULL, false);208209if (self->mainAnimator.frameID != 1 && self->type != FLAMESPRING_LEFT) {210self->nozzleAnimator.frameID = self->flamePosR.x > self->position.x;211RSDK.DrawSprite(&self->nozzleAnimator, &self->flamePosR, false);212}213}214215void FlameSpring_Draw_Flame(void)216{217RSDK_THIS(FlameSpring);218219RSDK.DrawSprite(&self->mainAnimator, NULL, false);220}221222#if GAME_INCLUDE_EDITOR223void FlameSpring_EditorDraw(void)224{225RSDK_THIS(FlameSpring);226227self->flamePosL.x = self->position.x - 0x300 * RSDK.Sin1024(0x100);228self->flamePosL.y = self->position.y - 0x40000;229self->flamePosR.x = 0x300 * RSDK.Sin1024(0x100) + self->position.x;230self->flamePosR.y = self->position.y - 0x40000;231232RSDK.SetSpriteAnimation(FlameSpring->aniFrames, 0, &self->mainAnimator, true, 0);233RSDK.SetSpriteAnimation(FlameSpring->aniFrames, 1, &self->nozzleAnimator, true, 0);234if (self->type > FLAMESPRING_LEFT)235self->mainAnimator.frameID = 2;236237uint8 type = self->type % 3;238if (self->mainAnimator.frameID != 1 && type != FLAMESPRING_RIGHT) {239self->nozzleAnimator.frameID = self->flamePosL.x > self->position.x;240RSDK.DrawSprite(&self->nozzleAnimator, &self->flamePosL, false);241}242243RSDK.DrawSprite(&self->mainAnimator, NULL, false);244245if (self->mainAnimator.frameID != 1 && type != FLAMESPRING_LEFT) {246self->nozzleAnimator.frameID = self->flamePosR.x > self->position.x;247RSDK.DrawSprite(&self->nozzleAnimator, &self->flamePosR, false);248}249}250251void FlameSpring_EditorLoad(void)252{253FlameSpring->aniFrames = RSDK.LoadSpriteAnimation("FBZ/FlameSpring.bin", SCOPE_STAGE);254255RSDK_ACTIVE_VAR(FlameSpring, type);256RSDK_ENUM_VAR("Circle", FLAMESPRING_BOTH);257RSDK_ENUM_VAR("Right", FLAMESPRING_RIGHT);258RSDK_ENUM_VAR("Left", FLAMESPRING_LEFT);259RSDK_ENUM_VAR("Both Sides (No Spring)", FLAMESPRING_BOTH_NOSPRING);260RSDK_ENUM_VAR("Right Only (No Spring)", FLAMESPRING_RIGHT_NOSPRING);261RSDK_ENUM_VAR("Left Only (No Spring)", FLAMESPRING_LEFT_NOSPRING);262263RSDK_ACTIVE_VAR(FlameSpring, force);264RSDK_ENUM_VAR("Weak", FLAMESPRING_FORCE_WEAK);265RSDK_ENUM_VAR("Strong", FLAMESPRING_FORCE_STRONG);266267RSDK_ACTIVE_VAR(FlameSpring, playerAni);268RSDK_ENUM_VAR("Spring Diagonal", FLAMESPRING_PANI_DIAGONAL);269RSDK_ENUM_VAR("Spring Twirl", FLAMESPRING_PANI_TWIRL);270}271#endif272273void FlameSpring_Serialize(void)274{275RSDK_EDITABLE_VAR(FlameSpring, VAR_ENUM, type);276RSDK_EDITABLE_VAR(FlameSpring, VAR_ENUM, force);277RSDK_EDITABLE_VAR(FlameSpring, VAR_UINT8, playerAni);278RSDK_EDITABLE_VAR(FlameSpring, VAR_UINT8, offset);279}280281282