Path: blob/master/SonicMania/Objects/MMZ/BladePole.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: BladePole Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectBladePole *BladePole;1011void BladePole_Update(void)12{13RSDK_THIS(BladePole);1415RSDK.ProcessAnimation(&self->bladeTopAnimator);16RSDK.ProcessAnimation(&self->bladeBottomAnimator);1718StateMachine_Run(self->state);19}2021void BladePole_LateUpdate(void) {}2223void BladePole_StaticUpdate(void) {}2425void BladePole_Draw(void) { BladePole_DrawSprites(); }2627void BladePole_Create(void *data)28{29RSDK_THIS(BladePole);3031self->active = ACTIVE_BOUNDS;32self->visible = true;33self->drawGroup = Zone->objectDrawGroup[0];34self->drawFX = FX_FLIP;35self->updateRange.x = 0x800000;36self->updateRange.y = 0x800000;3738RSDK.SetSpriteAnimation(BladePole->aniFrames, 0, &self->poleAnimator, true, 0);39RSDK.SetSpriteAnimation(BladePole->aniFrames, 1, &self->bladeTopAnimator, true, 0);40RSDK.SetSpriteAnimation(BladePole->aniFrames, 1, &self->bladeBottomAnimator, true, 0);4142// Why is this initialized here?? wouldn't StageLoad be better?43BladePole->hitboxBottom.left = -24;44BladePole->hitboxBottom.top = 20;45BladePole->hitboxBottom.right = 24;46BladePole->hitboxBottom.bottom = BladePole->hitboxBottom.top + 24;4748BladePole->hitboxTop.left = -24;49BladePole->hitboxTop.top = -32;50BladePole->hitboxTop.right = 24;51BladePole->hitboxTop.bottom = BladePole->hitboxTop.top + 24;5253self->state = BladePole_State_TopBladeActive;54}5556void BladePole_StageLoad(void) { BladePole->aniFrames = RSDK.LoadSpriteAnimation("MMZ/BladePole.bin", SCOPE_STAGE); }5758void BladePole_DrawSprites(void)59{60RSDK_THIS(BladePole);6162self->direction = FLIP_NONE;63Vector2 drawPos = self->position;64RSDK.DrawSprite(&self->poleAnimator, &drawPos, false);6566drawPos.y -= 0xC0000;67RSDK.DrawSprite(&self->poleAnimator, &drawPos, false);6869drawPos.y -= 0xC0000;70RSDK.DrawSprite(&self->poleAnimator, &drawPos, false);7172drawPos.x = self->position.x;73drawPos.y = self->position.y - 0x180000;74RSDK.DrawSprite(&self->bladeTopAnimator, &drawPos, false);7576if (SceneInfo->inEditor) {77drawPos.y += 0x180000;78}79else {80self->direction = FLIP_Y;81drawPos.y += 0x3C0000;82}8384RSDK.DrawSprite(&self->bladeBottomAnimator, &drawPos, false);85self->direction = FLIP_NONE;86}8788bool32 BladePole_SetAnimation(Animator *animator)89{90RSDK_THIS(BladePole);9192switch (animator->animationID) {93case 1: RSDK.SetSpriteAnimation(BladePole->aniFrames, 2, animator, true, 0); break;9495case 2:96if (animator->frameID == animator->frameCount - 1)97RSDK.SetSpriteAnimation(BladePole->aniFrames, 3, animator, true, 0);98break;99100case 3:101if (self->timer >= 74 && !animator->frameID)102RSDK.SetSpriteAnimation(BladePole->aniFrames, 4, animator, true, 0);103break;104105case 4:106if (animator->frameID == animator->frameCount - 1) {107RSDK.SetSpriteAnimation(BladePole->aniFrames, 1, animator, true, 0);108return true;109}110break;111112default: break;113}114115return false;116}117118void BladePole_CheckPlayerCollisions(Hitbox *hitbox)119{120RSDK_THIS(BladePole);121122foreach_active(Player, player)123{124if (Player_CheckCollisionTouch(player, self, hitbox)) {125int32 storeX = self->position.x;126int32 storeY = self->position.y;127128self->position.y = ((BladePole->hitboxBottom.bottom - BladePole->hitboxBottom.top) << 15) + storeY;129#if MANIA_USE_PLUS130if (!Player_CheckMightyUnspin(player, 0x400, 2, &player->uncurlTimer))131#endif132Player_Hurt(player, self);133134self->position.x = storeX;135self->position.y = storeY;136}137}138}139140void BladePole_State_TopBladeActive(void)141{142RSDK_THIS(BladePole);143144if (BladePole_SetAnimation(&self->bladeTopAnimator)) {145self->state = BladePole_State_BottomBladeActive;146self->timer = 0;147}148149if (self->bladeTopAnimator.animationID == 3)150BladePole_CheckPlayerCollisions(&BladePole->hitboxTop);151152++self->timer;153}154155void BladePole_State_BottomBladeActive(void)156{157RSDK_THIS(BladePole);158159if (BladePole_SetAnimation(&self->bladeBottomAnimator)) {160self->state = BladePole_State_TopBladeActive;161self->timer = 0;162}163164if (self->bladeBottomAnimator.animationID == 3)165BladePole_CheckPlayerCollisions(&BladePole->hitboxBottom);166167++self->timer;168}169170#if GAME_INCLUDE_EDITOR171void BladePole_EditorDraw(void) { BladePole_DrawSprites(); }172173void BladePole_EditorLoad(void) { BladePole->aniFrames = RSDK.LoadSpriteAnimation("MMZ/BladePole.bin", SCOPE_STAGE); }174#endif175176void BladePole_Serialize(void) {}177178179