Path: blob/master/SonicMania/Objects/ERZ/PhantomShield.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PhantomShield Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPhantomShield *PhantomShield;1011void PhantomShield_Update(void)12{13RSDK_THIS(PhantomShield);1415if (self->parent) {16self->position.x = self->parent->position.x;17self->position.y = self->parent->position.y;18}1920if (self->blendAmount > 0)21self->blendAmount -= 0x20;2223StateMachine_Run(self->state);24}2526void PhantomShield_LateUpdate(void) {}2728void PhantomShield_StaticUpdate(void) {}2930void PhantomShield_Draw(void)31{32RSDK_THIS(PhantomShield);3334if (self->blendAmount > 0)35RSDK.SetLimitedFade(0, 1, 3, self->blendAmount, 136, 143);3637self->direction = RSDK.GetFrameID(&self->animator) == 'b' ? FLIP_Y : FLIP_NONE;38RSDK.DrawSprite(&self->animator, NULL, false);3940if (self->blendAmount > 0)41RSDK.CopyPalette(1, 136, 0, 136, 8);42}4344void PhantomShield_Create(void *data)45{46RSDK_THIS(PhantomShield);4748if (!SceneInfo->inEditor) {49self->visible = true;50self->drawGroup = Zone->objectDrawGroup[0];51self->parent = (Entity *)data;52self->active = ACTIVE_NORMAL;53self->drawFX = FX_FLIP;54self->inkEffect = INK_ADD;55self->alpha = 0x100;56self->scale.x = 0x200;57self->scale.y = 0x200;58self->updateRange.x = 0x800000;59self->updateRange.y = 0x800000;60self->state = PhantomShield_State_Appear;61RSDK.SetSpriteAnimation(PhantomShield->aniFrames, 0, &self->animator, true, 0);62}63}6465void PhantomShield_StageLoad(void)66{67PhantomShield->aniFrames = RSDK.LoadSpriteAnimation("Phantom/EggShield.bin", SCOPE_STAGE);6869PhantomShield->hitbox.left = -32;70PhantomShield->hitbox.top = -32;71PhantomShield->hitbox.right = 32;72PhantomShield->hitbox.bottom = 32;73}7475void PhantomShield_State_Appear(void)76{77RSDK_THIS(PhantomShield);7879RSDK.ProcessAnimation(&self->animator);80if (!self->shieldActive) {81self->shieldActive = true;82RSDK.PlaySfx(PhantomEgg->sfxShield, false, 255);83}8485if (self->animator.frameID == self->animator.frameCount - 1) {86RSDK.SetSpriteAnimation(PhantomShield->aniFrames, 1, &self->animator, true, 0);87self->shieldActive = false;88self->state = PhantomShield_State_Active;89}90}9192void PhantomShield_State_Active(void)93{94RSDK_THIS(PhantomShield);9596RSDK.ProcessAnimation(&self->animator);9798foreach_active(Player, player)99{100if (self->playerTimer[player->playerID])101self->playerTimer[player->playerID]--;102103if (Player_CheckCollisionTouch(player, self, &PhantomShield->hitbox)) {104if (Player_CheckAttacking(player, self)) {105self->blendAmount = 256;106if (!self->playerTimer[player->playerID]) {107RSDK.PlaySfx(PhantomEgg->sfxRepel, false, 255);108self->playerTimer[player->playerID] = 16;109}110111int32 angle = RSDK.ATan2(player->position.x - self->position.x, player->position.y - self->position.y);112int32 velX = 0x500 * RSDK.Cos256(angle);113int32 velY = 0x500 * RSDK.Sin256(angle);114115if (player->state == Player_State_FlyCarried)116RSDK_GET_ENTITY(SLOT_PLAYER2, Player)->flyCarryTimer = 30;117118int32 anim = player->animator.animationID;119if (anim != ANI_FLY && anim != ANI_FLY_LIFT_TIRED) {120if (player->state != Player_State_TailsFlight) {121if (player->state != Player_State_DropDash)122player->state = Player_State_Air;123if (anim != ANI_JUMP && anim != ANI_JOG && anim != ANI_RUN && anim != ANI_DASH)124player->animator.animationID = ANI_WALK;125}126}127128if (player->characterID == ID_KNUCKLES && player->animator.animationID == ANI_GLIDE) {129RSDK.SetSpriteAnimation(player->aniFrames, ANI_GLIDE_DROP, &player->animator, false, 0);130player->state = Player_State_KnuxGlideDrop;131}132133player->groundVel = velX;134player->velocity.x = velX;135player->velocity.y = velY;136player->applyJumpCap = false;137player->onGround = false;138player->tileCollisions = TILECOLLISION_DOWN;139}140else {141Player_Hurt(player, self);142}143}144}145}146147void PhantomShield_State_Disappear(void)148{149RSDK_THIS(PhantomShield);150151RSDK.ProcessAnimation(&self->animator);152if (self->animator.frameID == self->animator.frameCount - 1)153destroyEntity(self);154}155156#if GAME_INCLUDE_EDITOR157void PhantomShield_EditorDraw(void)158{159RSDK_THIS(PhantomShield);160RSDK.SetSpriteAnimation(PhantomShield->aniFrames, 1, &self->animator, true, 0);161162self->direction = RSDK.GetFrameID(&self->animator) == 'b' ? FLIP_Y : FLIP_NONE;163RSDK.DrawSprite(&self->animator, NULL, false);164}165166void PhantomShield_EditorLoad(void) { PhantomShield->aniFrames = RSDK.LoadSpriteAnimation("Phantom/EggShield.bin", SCOPE_STAGE); }167#endif168169void PhantomShield_Serialize(void) {}170171172