Path: blob/master/SonicMania/Objects/MSZ/Hatterkiller.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Hatterkiller Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectHatterkiller *Hatterkiller;1011void Hatterkiller_Update(void)12{13RSDK_THIS(Hatterkiller);1415for (int32 s = 0; s < HATTERKILLER_SEGMENT_COUNT; ++s) {16if (self->bodyDelays[s] <= 0) {17self->bodyVelocities[s].y += 0x3800;18self->bodyPositions[s].x += self->bodyVelocities[s].x + TornadoPath->moveVel.x;19self->bodyPositions[s].y += self->bodyVelocities[s].y + TornadoPath->moveVel.y;20}21else {22self->bodyDelays[s]--;23self->bodyPositions[s].x += TornadoPath->moveVel.x;24self->bodyPositions[s].y += TornadoPath->moveVel.y;25}26}2728if (HeavyMystic->curtainLinePos) {29if (!(Zone->timer & 3))30HeavyMystic_SpawnParticleFX(self->position.x, self->position.y);3132if (++self->timer == 40) {33Music_TransitionTrack(TRACK_MINIBOSS, 0.0125);34RSDK.PlaySfx(Hatterkiller->sfxTransform2, false, 255);35RSDK.PlaySfx(Hatterkiller->sfxPowerup, false, 255);3637CREATE_ENTITY(FXSpinRay, NULL, self->position.x, self->position.y)->parent = (Entity *)self;3839EntityFXFade *fade = CREATE_ENTITY(FXFade, INT_TO_VOID(0xF0F0F0), self->position.x, self->position.y);40fade->speedIn = 8;41fade->speedOut = 8;42}43}44else {4546foreach_active(Player, player)47{48self->position.x = self->bodyPositions[0].x;49self->position.y = self->bodyPositions[0].y;50if (Player_CheckBadnikTouch(player, self, &Hatterkiller->hitboxSegment) && Player_CheckBadnikBreak(player, self, false)) {51for (int32 s = 1; s < HATTERKILLER_SEGMENT_COUNT; ++s) {52Vector2 *position = &self->bodyPositions[s];53Animator *animator = self->bodyAnimators[s];54EntityDebris *debris = CREATE_ENTITY(Debris, Debris_State_FallAndFlicker, position->x, position->y);5556RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, animator->animationID, &debris->animator, true, animator->frameID);57debris->velocity.x = RSDK.Rand(-0x20000, 0x20000);58debris->velocity.y = RSDK.Rand(-0x20000, -0x10000);59debris->gravityStrength = 0x4800;60debris->drawGroup = Zone->objectDrawGroup[1];61debris->updateRange.x = 0x400000;62debris->updateRange.y = 0x400000;63}6465destroyEntity(self);66self->active = ACTIVE_DISABLED;67foreach_break;68}6970for (int32 s = 1; s < HATTERKILLER_SEGMENT_COUNT; ++s) {71self->position.x = self->bodyPositions[s].x;72self->position.y = self->bodyPositions[s].y;7374if (Player_CheckCollisionTouch(player, self, &Hatterkiller->hitboxSegment)) {75#if MANIA_USE_PLUS76if (!Player_CheckMightyUnspin(player, 0x200, 2, &player->uncurlTimer))77#endif78Player_Hurt(player, self);79}80}81}82}8384if (HeavyMystic->curtainLinePos) {85self->position = self->bodyPositions[9];8687if (!RSDK.CheckOnScreen(self, NULL)) {88if (HeavyMystic->curtainLinePos == 1 && !RSDK.CheckOnScreen(self, NULL)) {89foreach_active(ParallaxSprite, sprite) { sprite->visible = false; }90++HeavyMystic->curtainLinePos;91}9293CREATE_ENTITY(UberCaterkiller, NULL, self->bodyPositions[HATTERKILLER_SEGMENT_COUNT - 1].x,94(ScreenInfo->position.y + 64 + ScreenInfo->size.y) << 16);9596destroyEntity(self);97}98}99else if (!RSDK.CheckOnScreen(self, NULL)) {100destroyEntity(self);101}102103self->position.x = self->bodyPositions[0].x;104self->position.y = self->bodyPositions[0].y;105}106107void Hatterkiller_LateUpdate(void) {}108109void Hatterkiller_StaticUpdate(void) {}110111void Hatterkiller_Draw(void)112{113RSDK_THIS(Hatterkiller);114115for (int32 s = HATTERKILLER_SEGMENT_COUNT - 1; s >= 0; --s) RSDK.DrawSprite(self->bodyAnimators[s], &self->bodyPositions[s], false);116}117118void Hatterkiller_Create(void *data)119{120RSDK_THIS(Hatterkiller);121122if (!SceneInfo->inEditor) {123self->visible = true;124self->active = ACTIVE_NORMAL;125self->drawGroup = Zone->objectDrawGroup[0] + 1;126self->updateRange.x = 0x400000;127self->updateRange.y = 0x400000;128129int32 delay = 0;130for (int32 s = 0; s < HATTERKILLER_SEGMENT_COUNT; ++s) {131self->bodyVelocities[s].x = VOID_TO_INT(data);132self->bodyVelocities[s].y = -0x40000;133self->bodyAnimators[s] = &self->bodyAnimator;134self->bodyDelays[s] = delay;135self->bodyPositions[s] = self->position;136delay += 4;137}138139self->bodyAnimators[0] = &self->headAnimator;140141if (VOID_TO_INT(data) >= 0)142RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 3, &self->headAnimator, true, 0);143else144RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 2, &self->headAnimator, true, 0);145146RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 1, &self->bodyAnimator, true, 0);147RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 4, &self->tailAnimator, true, 0);148}149}150151void Hatterkiller_StageLoad(void)152{153Hatterkiller->aniFrames = RSDK.LoadSpriteAnimation("MSZ/RattleKiller.bin", SCOPE_STAGE);154155Hatterkiller->hitboxSegment.left = -8;156Hatterkiller->hitboxSegment.top = -8;157Hatterkiller->hitboxSegment.right = 8;158Hatterkiller->hitboxSegment.bottom = 8;159160Hatterkiller->sfxRocketJet = RSDK.GetSfx("Stage/RocketJet.wav");161Hatterkiller->sfxTransform2 = RSDK.GetSfx("Stage/Transform2.wav");162Hatterkiller->sfxPowerup = RSDK.GetSfx("Stage/PowerUp.wav");163164DEBUGMODE_ADD_OBJ(Hatterkiller);165}166167void Hatterkiller_DebugDraw(void)168{169RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 0, &DebugMode->animator, true, 0);170RSDK.DrawSprite(&DebugMode->animator, NULL, false);171}172173void Hatterkiller_DebugSpawn(void)174{175RSDK_THIS(DebugMode);176177CREATE_ENTITY(Hatterkiller, INT_TO_VOID(-0x20000), self->position.x, self->position.y);178}179180#if GAME_INCLUDE_EDITOR181void Hatterkiller_EditorDraw(void)182{183RSDK_THIS(Hatterkiller);184185self->visible = true;186self->active = ACTIVE_NORMAL;187self->updateRange.x = 0x400000;188self->updateRange.y = 0x400000;189190int32 delay = 0;191for (int32 s = 0; s < HATTERKILLER_SEGMENT_COUNT; ++s) {192self->bodyAnimators[s] = &self->bodyAnimator;193self->bodyDelays[s] = delay;194self->bodyPositions[s] = self->position;195delay += 4;196}197198self->bodyAnimators[0] = &self->headAnimator;199200RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 2, &self->headAnimator, true, 0);201RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 1, &self->bodyAnimator, true, 0);202RSDK.SetSpriteAnimation(Hatterkiller->aniFrames, 4, &self->tailAnimator, true, 0);203204Hatterkiller_Draw();205}206207void Hatterkiller_EditorLoad(void) { Hatterkiller->aniFrames = RSDK.LoadSpriteAnimation("MSZ/RattleKiller.bin", SCOPE_STAGE); }208#endif209210void Hatterkiller_Serialize(void) {}211212213