Path: blob/master/SonicMania/Objects/GHZ/SpikeLog.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: SpikeLog Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectSpikeLog *SpikeLog;1011void SpikeLog_Update(void)12{13RSDK_THIS(SpikeLog);14StateMachine_Run(self->state);15}1617void SpikeLog_LateUpdate(void) {}1819void SpikeLog_StaticUpdate(void) { SpikeLog->timer = Zone->timer / 3 & 0x1F; }2021void SpikeLog_Draw(void)22{23RSDK_THIS(SpikeLog);24RSDK.DrawSprite(&self->animator, NULL, false);25}2627void SpikeLog_Create(void *data)28{29RSDK_THIS(SpikeLog);30self->drawFX |= FX_FLIP;31self->active = ACTIVE_BOUNDS;32self->visible = true;33self->updateRange.x = 0x400000;34self->updateRange.y = 0x400000;35if (!SceneInfo->inEditor)36self->frame *= 4;37self->drawGroup = Zone->objectDrawGroup[0];38RSDK.SetSpriteAnimation(SpikeLog->aniFrames, 0, &self->animator, true, 0);39self->state = SpikeLog_State_Main;40}4142void SpikeLog_StageLoad(void)43{44if (RSDK.CheckSceneFolder("GHZ"))45SpikeLog->aniFrames = RSDK.LoadSpriteAnimation("GHZ/SpikeLog.bin", SCOPE_STAGE);4647SpikeLog->hitboxSpikeLog.left = -8;48SpikeLog->hitboxSpikeLog.top = -16;49SpikeLog->hitboxSpikeLog.right = 8;50SpikeLog->hitboxSpikeLog.bottom = 0;5152SpikeLog->hitboxBurnLog.left = -9;53SpikeLog->hitboxBurnLog.top = -16;54SpikeLog->hitboxBurnLog.right = 9;55SpikeLog->hitboxBurnLog.bottom = 0;56}5758void SpikeLog_State_Main(void)59{60RSDK_THIS(SpikeLog);61self->animator.frameID = (self->frame + SpikeLog->timer) & 0x1F;62foreach_active(Player, player)63{64if (player->shield != SHIELD_FIRE || player->invincibleTimer) {65if ((self->animator.frameID & 0xFFFFFFFC) != 8)66continue;6768if (Player_CheckCollisionTouch(player, self, &SpikeLog->hitboxSpikeLog)) {69#if MANIA_USE_PLUS70if (player->characterID == ID_MIGHTY) {71int32 anim = player->animator.animationID;72if (anim == ANI_JUMP || anim == ANI_SPINDASH || anim == ANI_HAMMERDROP) {73if (!player->invincibleTimer && player->blinkTimer <= 0) {74if (abs(player->velocity.x) < 0x10000 || !player->groundedStore) {75player->velocity.y = -0x48000;76player->onGround = false;77player->applyJumpCap = false;78player->jumpAbilityState = 0;79RSDK.SetSpriteAnimation(player->aniFrames, ANI_UNSPIN, &player->animator, false, 0);80RSDK.PlaySfx(Player->sfxMightyUnspin, false, 255);81}8283if (!player->uncurlTimer) {84player->uncurlTimer = 15;85RSDK.PlaySfx(Player->sfxPimPom, false, 255);86}87}88}89else if (player->animator.animationID != ANI_UNSPIN)90Player_Hurt(player, self);91}92else {93#endif94Player_Hurt(player, self);95#if MANIA_USE_PLUS96}97#endif98}99}100else if (Player_CheckCollisionTouch(player, self, &SpikeLog->hitboxSpikeLog)) {101if (!SpikeLog->hasAchievement) {102API_UnlockAchievement(&achievementList[ACH_GHZ]);103104SpikeLog->hasAchievement = true;105}106CREATE_ENTITY(BurningLog, INT_TO_VOID(16), self->position.x, self->position.y);107RSDK.SetTile(Zone->fgLayer[0], self->position.x >> 20, self->position.y >> 20, -1);108self->frame = 8;109self->state = SpikeLog_State_Burn;110}111}112}113114void SpikeLog_State_Burn(void)115{116RSDK_THIS(SpikeLog);117if (!--self->frame) {118foreach_all(SpikeLog, other)119{120if (other->state == SpikeLog_State_Main121&& RSDK.CheckObjectCollisionTouchBox(other, &SpikeLog->hitboxBurnLog, self, &SpikeLog->hitboxBurnLog)) {122CREATE_ENTITY(BurningLog, INT_TO_VOID(16), other->position.x, other->position.y);123RSDK.SetTile(Zone->fgLayer[0], other->position.x >> 20, other->position.y >> 20, -1);124other->frame = 8;125other->state = SpikeLog_State_Burn;126other->active = ACTIVE_NORMAL;127}128}129destroyEntity(self);130}131}132133#if GAME_INCLUDE_EDITOR134void SpikeLog_EditorDraw(void)135{136RSDK_THIS(SpikeLog);137self->animator.frameID = self->frame * 4;138RSDK.DrawSprite(&self->animator, NULL, false);139}140141void SpikeLog_EditorLoad(void) { SpikeLog->aniFrames = RSDK.LoadSpriteAnimation("GHZ/SpikeLog.bin", SCOPE_STAGE); }142#endif143144void SpikeLog_Serialize(void) { RSDK_EDITABLE_VAR(SpikeLog, VAR_UINT8, frame); }145146147