Path: blob/master/SonicMania/Objects/MMZ/BuzzSaw.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: BuzzSaw Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBuzzSaw *BuzzSaw;1011void BuzzSaw_Update(void)12{13RSDK_THIS(BuzzSaw);1415StateMachine_Run(self->state);16}1718void BuzzSaw_LateUpdate(void) {}1920void BuzzSaw_StaticUpdate(void) {}2122void BuzzSaw_Draw(void)23{24RSDK_THIS(BuzzSaw);2526RSDK.DrawSprite(&self->animator, &self->drawPos, false);27}2829void BuzzSaw_Create(void *data)30{31RSDK_THIS(BuzzSaw);3233self->drawFX = FX_ROTATE;34if (self->type == BUZZSAW_ATTACHED)35self->rotation = self->angle;36else37self->inkEffect = INK_ADD;3839if (!SceneInfo->inEditor) {40RSDK.SetSpriteAnimation(BuzzSaw->aniFrames, self->type, &self->animator, true, 0);4142self->active = ACTIVE_BOUNDS;43self->updateRange.x = (abs(self->speed * self->amplitude.x) + 0x40) << 17;44self->updateRange.y = (abs(self->speed * self->amplitude.y) + 0x40) << 17;45self->amplitude.x >>= 10;46self->amplitude.y >>= 10;47self->visible = true;48self->drawGroup = Zone->objectDrawGroup[0];49self->startPos = self->position;5051if (self->type == BUZZSAW_ATTACHED)52self->state = BuzzSaw_State_Attached;53else54self->state = BuzzSaw_State_Stray_Waiting;55}56}5758void BuzzSaw_StageLoad(void)59{60BuzzSaw->aniFrames = RSDK.LoadSpriteAnimation("MMZ/BuzzSaw.bin", SCOPE_STAGE);6162BuzzSaw->unused1.x = 0x200000;63BuzzSaw->unused1.y = 0x200000;6465BuzzSaw->hitbox.left = -24;66BuzzSaw->hitbox.top = -24;67BuzzSaw->hitbox.right = 24;68BuzzSaw->hitbox.bottom = 24;6970// ඞ71Soundboard_LoadSfx("MMZ/SawSus.wav", true, BuzzSaw_SfxCheck_SawSus, BuzzSaw_SfxUpdate_SawSus);72}7374bool32 BuzzSaw_SfxCheck_SawSus(void)75{76int32 worldX = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;77int32 worldY = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;7879int32 count = 0;8081foreach_all(BuzzSaw, saw)82{83if (MathHelpers_Distance(saw->position.x, saw->position.y, worldX, worldY) <= (640 << 16))84count++;85}8687return count > 0;88}8990void BuzzSaw_SfxUpdate_SawSus(int32 sfx)91{92int32 dist = 0x7FFF0000;93int32 worldX = (ScreenInfo->position.x + ScreenInfo->center.x) << 16;94int32 worldY = (ScreenInfo->position.y + ScreenInfo->center.y) << 16;9596foreach_all(BuzzSaw, saw) { dist = MIN(MathHelpers_Distance(saw->position.x, saw->position.y, worldX, worldY), dist); }9798RSDK.SetChannelAttributes(Soundboard->sfxChannel[sfx], 1.0 - (MIN(dist >> 16, 640) / 640.0), 0.0, 1.0);99}100101void BuzzSaw_CheckPlayerCollisions(void)102{103RSDK_THIS(BuzzSaw);104105self->position.x = self->drawPos.x;106self->position.y = self->drawPos.y;107108foreach_active(Player, player)109{110if (Player_CheckCollisionTouch(player, self, &BuzzSaw->hitbox)) {111#if MANIA_USE_PLUS112if (!Player_CheckMightyUnspin(player, 0x600, false, &player->uncurlTimer))113#endif114Player_Hurt(player, self);115}116}117118self->position.x = self->startPos.x;119self->position.y = self->startPos.y;120}121122void BuzzSaw_State_Attached(void)123{124RSDK_THIS(BuzzSaw);125126self->drawPos.x = self->startPos.x + self->amplitude.x * RSDK.Sin1024(self->speed * Zone->timer);127self->drawPos.y = self->startPos.y + self->amplitude.y * RSDK.Sin1024(self->speed * Zone->timer);128129RSDK.ProcessAnimation(&self->animator);130131BuzzSaw_CheckPlayerCollisions();132}133134void BuzzSaw_State_Stray_Waiting(void)135{136RSDK_THIS(BuzzSaw);137138self->drawPos.x = self->position.x;139self->drawPos.y = self->position.y;140141foreach_active(Player, player)142{143int32 angle = RSDK.ATan2((player->position.x - self->position.x) >> 16, (player->position.y - self->position.y) >> 16);144145int32 rx = (abs(player->position.x - self->position.x) >> 16) * (abs(player->position.x - self->position.x) >> 16);146int32 ry = (abs(player->position.y - self->position.y) >> 16) * (abs(player->position.y - self->position.y) >> 16);147if (((angle + 0x20 - (self->angle & 0xFF)) & 0xFF) < 0x40 && (uint32)((rx + ry) - 0x4000) < 0x5000) {148self->active = ACTIVE_NORMAL;149self->velocity.x = 0x600 * RSDK.Cos256(self->angle);150self->velocity.y = 0x600 * RSDK.Sin256(self->angle);151self->state = BuzzSaw_State_Stray_Released;152}153}154}155156void BuzzSaw_State_Stray_Released(void)157{158RSDK_THIS(BuzzSaw);159160if (self->alpha < 0x100)161self->alpha += 0x10;162163self->drawPos.x += self->velocity.x;164self->drawPos.y += self->velocity.y;165166RSDK.ProcessAnimation(&self->animator);167168BuzzSaw_CheckPlayerCollisions();169170self->position.x = self->drawPos.x;171self->position.y = self->drawPos.y;172173if (!RSDK.CheckOnScreen(self, &self->updateRange)) {174self->position = self->startPos;175self->drawPos = self->startPos;176self->alpha = 0x00;177self->state = BuzzSaw_State_FreeMove_Reset;178}179180self->position.x = self->startPos.x;181self->position.y = self->startPos.y;182}183184void BuzzSaw_State_FreeMove_Reset(void)185{186RSDK_THIS(BuzzSaw);187188if (!RSDK.CheckOnScreen(self, &self->updateRange)) {189self->state = BuzzSaw_State_Stray_Waiting;190BuzzSaw_Create(NULL);191}192}193194#if GAME_INCLUDE_EDITOR195void BuzzSaw_EditorDraw(void)196{197RSDK_THIS(BuzzSaw);198199self->drawFX = FX_ROTATE;200self->inkEffect = INK_NONE;201self->rotation = 0;202203if (self->type == BUZZSAW_ATTACHED)204self->rotation = self->angle;205else206self->inkEffect = INK_ADD;207208RSDK.SetSpriteAnimation(BuzzSaw->aniFrames, self->type, &self->animator, true, 0);209self->active = ACTIVE_BOUNDS;210self->updateRange.x = (abs(self->speed * self->amplitude.x) + 0x40) << 17;211self->updateRange.y = (abs(self->speed * self->amplitude.y) + 0x40) << 17;212self->drawPos = self->position;213214BuzzSaw_Draw();215216if (showGizmos() && self->type == BUZZSAW_ATTACHED) {217RSDK_DRAWING_OVERLAY(true);218219Vector2 pos;220Vector2 amplitude;221amplitude.x = self->amplitude.x >> 10;222amplitude.y = self->amplitude.y >> 10;223224self->updateRange.x = (abs(self->speed * self->amplitude.x) + 0x40) << 17;225self->updateRange.y = (abs(self->speed * self->amplitude.y) + 0x40) << 17;226227// draw distance previews228self->inkEffect = INK_BLEND;229self->drawPos.x = amplitude.x * RSDK.Sin1024(0x100) + self->position.x;230self->drawPos.y = amplitude.y * RSDK.Sin1024(0x100) + self->position.y;231pos = self->drawPos;232BuzzSaw_Draw();233234self->drawPos.x = amplitude.x * RSDK.Sin1024(0x300) + self->position.x;235self->drawPos.y = amplitude.y * RSDK.Sin1024(0x300) + self->position.y;236BuzzSaw_Draw();237238RSDK.DrawLine(pos.x, pos.y, self->drawPos.x, self->drawPos.y, 0x00FF00, 0, INK_NONE, false);239240self->inkEffect = INK_NONE;241RSDK_DRAWING_OVERLAY(false);242}243}244245void BuzzSaw_EditorLoad(void)246{247BuzzSaw->aniFrames = RSDK.LoadSpriteAnimation("MMZ/BuzzSaw.bin", SCOPE_STAGE);248249RSDK_ACTIVE_VAR(BuzzSaw, type);250RSDK_ENUM_VAR("Attached", BUZZSAW_ATTACHED);251RSDK_ENUM_VAR("Stray", BUZZSAW_STRAY);252}253#endif254255void BuzzSaw_Serialize(void)256{257RSDK_EDITABLE_VAR(BuzzSaw, VAR_ENUM, type);258RSDK_EDITABLE_VAR(BuzzSaw, VAR_INT32, angle);259RSDK_EDITABLE_VAR(BuzzSaw, VAR_VECTOR2, amplitude);260RSDK_EDITABLE_VAR(BuzzSaw, VAR_ENUM, speed);261}262263264