Path: blob/master/SonicMania/Objects/FBZ/ElectroMagnet.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: ElectroMagnet Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectElectroMagnet *ElectroMagnet;1011void ElectroMagnet_Update(void)12{13RSDK_THIS(ElectroMagnet);1415StateMachine_Run(self->state);16}1718void ElectroMagnet_LateUpdate(void) {}1920void ElectroMagnet_StaticUpdate(void)21{22if (ElectroMagnet->magnetSfxTimer) {23if (!ElectroMagnet->playingMagnetSfx) {24RSDK.PlaySfx(ElectroMagnet->sfxMagnet, true, 255);25ElectroMagnet->playingMagnetSfx = true;26}27ElectroMagnet->magnetSfxTimer = 0;28}29else if (ElectroMagnet->playingMagnetSfx) {30RSDK.StopSfx(ElectroMagnet->sfxMagnet);31ElectroMagnet->playingMagnetSfx = false;32}33}3435void ElectroMagnet_Draw(void)36{37RSDK_THIS(ElectroMagnet);3839if (self->state == ElectroMagnet_State_MagnetActive) {40self->animator.frameID = Zone->timer & 3;41RSDK.DrawSprite(&self->animator, NULL, false);4243self->animator.frameID = (Zone->timer & 1) + 4;44RSDK.DrawSprite(&self->animator, NULL, false);45}46}4748void ElectroMagnet_Create(void *data)49{50RSDK_THIS(ElectroMagnet);5152if (!self->interval)53self->interval = 600;5455self->active = ACTIVE_BOUNDS;56self->updateRange.x = 0x800000;57self->visible = !self->invisible;58self->updateRange.y = (self->height + 64) << 16;59self->drawGroup = Zone->objectDrawGroup[1];6061self->hitboxMagnetRange.left = -64;62self->hitboxMagnetRange.top = 0;63self->hitboxMagnetRange.right = 64;64self->hitboxMagnetRange.bottom = self->height;6566self->hitboxShieldRange.left = -64;67self->hitboxShieldRange.top = 0;68self->hitboxShieldRange.right = 64;69self->hitboxShieldRange.bottom = self->shieldRange;7071RSDK.SetSpriteAnimation(ElectroMagnet->aniFrames, 0, &self->animator, true, 0);72self->state = ElectroMagnet_State_AwaitInterval;73}7475void ElectroMagnet_StageLoad(void)76{77ElectroMagnet->active = ACTIVE_ALWAYS;7879if (RSDK.CheckSceneFolder("FBZ"))80ElectroMagnet->aniFrames = RSDK.LoadSpriteAnimation("FBZ/ElectroMagnet.bin", SCOPE_STAGE);8182ElectroMagnet->hitboxPlayer.left = -1;83ElectroMagnet->hitboxPlayer.top = -1;84ElectroMagnet->hitboxPlayer.right = 1;85ElectroMagnet->hitboxPlayer.bottom = 1;8687ElectroMagnet->sfxRange.x = 0x800000;88ElectroMagnet->sfxRange.y = 0x400000;8990ElectroMagnet->sfxMagnet = RSDK.GetSfx("Stage/Magnet.wav");91}9293void ElectroMagnet_State_AwaitInterval(void)94{95RSDK_THIS(ElectroMagnet);96int32 time = (Zone->timer + self->intervalOffset) % self->interval;9798if (time <= self->duration) {99self->active = ACTIVE_NORMAL;100self->timer = self->duration - time;101self->state = ElectroMagnet_State_MagnetActive;102}103}104105void ElectroMagnet_State_MagnetActive(void)106{107RSDK_THIS(ElectroMagnet);108109if (self->timer <= 0) {110if (self->hitboxShieldRange.top != self->hitboxShieldRange.bottom) {111foreach_active(Player, player)112{113if (RSDK.CheckObjectCollisionTouchBox(player, &ElectroMagnet->hitboxPlayer, self, &self->hitboxShieldRange)114&& player->invertGravity) {115player->invertGravity = false;116player->onGround = false;117}118}119}120121self->active = ACTIVE_BOUNDS;122self->state = ElectroMagnet_State_AwaitInterval;123}124else {125self->timer--;126127foreach_all(Blaster, blaster)128{129if (RSDK.CheckObjectCollisionTouchBox(blaster, &ElectroMagnet->hitboxPlayer, self, &self->hitboxMagnetRange)130&& blaster->animator.animationID < 2 && blaster->state != Blaster_State_Init) {131blaster->state = Blaster_State_MagnetAttract;132blaster->active = ACTIVE_NORMAL;133}134}135136foreach_all(MagSpikeBall, spikeBall)137{138if (RSDK.CheckObjectCollisionTouchBox(spikeBall, &ElectroMagnet->hitboxPlayer, self, &self->hitboxMagnetRange)) {139spikeBall->direction = FLIP_X;140spikeBall->active = ACTIVE_NORMAL;141}142}143144foreach_all(MagPlatform, platform)145{146if (RSDK.CheckObjectCollisionTouchBox(platform, &ElectroMagnet->hitboxPlayer, self, &self->hitboxMagnetRange)) {147platform->state = MagPlatform_State_Rise;148platform->active = ACTIVE_NORMAL;149}150}151152if (RSDK.CheckOnScreen(self, &ElectroMagnet->sfxRange))153++ElectroMagnet->magnetSfxTimer;154155if (self->hitboxShieldRange.top != self->hitboxShieldRange.bottom) {156foreach_active(Player, player)157{158if (RSDK.CheckObjectCollisionTouchBox(player, &ElectroMagnet->hitboxPlayer, self, &self->hitboxShieldRange)) {159if (player->state == Player_State_FlyCarried160|| (player->characterID == ID_KNUCKLES161&& (player->state == Player_State_KnuxWallClimb || player->state == Player_State_KnuxLedgePullUp))) {162player->invertGravity = false;163}164else if (player->shield == SHIELD_LIGHTNING) {165if (player->collisionMode != CMODE_ROOF)166player->onGround = false;167168player->invertGravity = true;169170if (player->state != Player_State_Transform) {171if (player->velocity.y > -0x68000)172player->velocity.y -= 2 * player->gravityStrength;173174if (RSDK.ObjectTileCollision(player, player->collisionLayers, CMODE_ROOF, player->collisionPlane, 0, -0x160000, false)) {175player->collisionMode = CMODE_ROOF;176player->angle = 128;177player->onGround = true;178player->groundVel = -player->velocity.x;179}180else {181player->state = Player_State_Air;182RSDK.SetSpriteAnimation(player->aniFrames, ANI_JUMP, &player->animator, false, 0);183}184}185}186}187}188}189}190}191192#if GAME_INCLUDE_EDITOR193void ElectroMagnet_EditorDraw(void)194{195RSDK_THIS(ElectroMagnet);196self->alpha = 0xC0;197198self->inkEffect = self->invisible ? INK_ALPHA : INK_NONE;199200self->animator.frameID = 0;201RSDK.DrawSprite(&self->animator, NULL, false);202203self->animator.frameID = 4;204RSDK.DrawSprite(&self->animator, NULL, false);205206self->inkEffect = INK_NONE;207208self->hitboxMagnetRange.left = -64;209self->hitboxMagnetRange.top = 0;210self->hitboxMagnetRange.right = 64;211self->hitboxMagnetRange.bottom = self->height;212213self->hitboxShieldRange.left = -64;214self->hitboxShieldRange.top = 0;215self->hitboxShieldRange.right = 64;216self->hitboxShieldRange.bottom = self->shieldRange;217218if (showGizmos()) {219RSDK_DRAWING_OVERLAY(true);220221DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &self->hitboxMagnetRange, FLIP_NONE, 0xFFFF00);222DrawHelpers_DrawHitboxOutline(self->position.x, self->position.y, &self->hitboxShieldRange, FLIP_NONE, 0xFF0000);223224RSDK_DRAWING_OVERLAY(false);225}226}227228void ElectroMagnet_EditorLoad(void) { ElectroMagnet->aniFrames = RSDK.LoadSpriteAnimation("FBZ/ElectroMagnet.bin", SCOPE_STAGE); }229#endif230231void ElectroMagnet_Serialize(void)232{233RSDK_EDITABLE_VAR(ElectroMagnet, VAR_UINT16, interval);234RSDK_EDITABLE_VAR(ElectroMagnet, VAR_UINT16, intervalOffset);235RSDK_EDITABLE_VAR(ElectroMagnet, VAR_UINT16, duration);236RSDK_EDITABLE_VAR(ElectroMagnet, VAR_ENUM, height);237RSDK_EDITABLE_VAR(ElectroMagnet, VAR_ENUM, shieldRange);238RSDK_EDITABLE_VAR(ElectroMagnet, VAR_BOOL, invisible);239}240241242