Path: blob/master/SonicMania/Objects/ERZ/PKingAttack.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PKingAttack Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectPKingAttack *PKingAttack;1011// NOTE:12// This object is likely highly based off LRZ/KingAttack13// hence why there's a bunch of "unused" stuff that resembles that object1415void PKingAttack_Update(void)16{17RSDK_THIS(PKingAttack);1819StateMachine_Run(self->state);20}2122void PKingAttack_LateUpdate(void) {}2324void PKingAttack_StaticUpdate(void) {}2526void PKingAttack_Draw(void)27{28RSDK_THIS(PKingAttack);2930if (self->type == PKINGATTACK_LAUNCHED)31RSDK.DrawCircle(self->position.x, self->position.y, 0x20, 0x00, 0xFF, INK_TINT, false);3233RSDK.DrawSprite(&self->animator, NULL, false);34}3536void PKingAttack_Create(void *data)37{38RSDK_THIS(PKingAttack);3940if (!SceneInfo->inEditor) {41self->drawGroup = Zone->objectDrawGroup[1];42self->type = VOID_TO_INT(data);43self->active = ACTIVE_NORMAL;44self->updateRange.x = 0x800000;45self->updateRange.y = 0x800000;4647switch (self->type) {48default: break;49case PKINGATTACK_LASER: break;5051case PKINGATTACK_ORBIT:52self->drawFX = FX_SCALE;53self->visible = true;54RSDK.SetSpriteAnimation(PKingAttack->aniFrames, 10, &self->animator, true, RSDK.Rand(0, 6));55self->state = PKingAttack_State_OrbitAppear;5657self->hitbox.left = -10;58self->hitbox.top = -10;59self->hitbox.right = 10;60self->hitbox.bottom = 10;61break;6263case PKINGATTACK_TRAIL:64self->drawGroup = Zone->objectDrawGroup[0];65self->visible = true;66self->inkEffect = INK_ADD;67self->alpha = 0xC0;68RSDK.SetSpriteAnimation(PKingAttack->aniFrames, 12, &self->animator, true, 0);69self->state = PKingAttack_State_Trail;70break;7172case PKINGATTACK_LARGEBULLET: break;73case PKINGATTACK_ENERGYLINE: break;7475case PKINGATTACK_SMALLBULLET:76self->drawGroup = Zone->objectDrawGroup[0];77self->drawFX = FX_ROTATE;78self->visible = true;79RSDK.SetSpriteAnimation(PKingAttack->aniFrames, 11, &self->animator, true, 0);80self->state = PKingAttack_State_SmallBullet;8182self->hitbox.left = -4;83self->hitbox.top = -4;84self->hitbox.right = 4;85self->hitbox.bottom = 4;86break;87}88}89}9091void PKingAttack_StageLoad(void)92{93PKingAttack->aniFrames = RSDK.LoadSpriteAnimation("Phantom/PhantomKing.bin", SCOPE_STAGE);9495PKingAttack->sfxPulse = RSDK.GetSfx("Stage/ElecPulse.wav");96}9798void PKingAttack_CheckPlayerCollisions(void)99{100RSDK_THIS(PKingAttack);101102foreach_active(Player, player)103{104if (Player_CheckCollisionTouch(player, self, &self->hitbox)) {105if (player->superState == SUPERSTATE_SUPER) {106if (!player->blinkTimer) {107int32 angle = RSDK.ATan2(player->position.x - self->position.x, player->position.y - self->position.y);108109if (self->state == PKingAttack_State_OrbitLaunched) {110player->blinkTimer = 120;111Ring_LoseRings(player, MIN(player->rings, 8), player->collisionPlane);112player->rings -= MIN(player->rings, 8);113RSDK.PlaySfx(Player->sfxLoseRings, false, 255);114}115else {116RSDK.PlaySfx(PKingAttack->sfxPulse, false, 255);117destroyEntity(self);118}119120player->rotation = 0;121player->velocity.x = RSDK.Cos256(angle) << 10;122player->velocity.y = RSDK.Sin256(angle) << 10;123player->groundVel = player->velocity.x;124player->state = ERZStart_State_PlayerRebound;125}126}127else {128Player_Hurt(player, self);129}130}131}132}133134void PKingAttack_State_OrbitAppear(void)135{136RSDK_THIS(PKingAttack);137138RSDK.ProcessAnimation(&self->animator);139140self->angle = (self->angle + 12) & 0x3FF;141142if (self->scale.x < 0x200) {143self->scale.x += 0x20;144self->scale.y = self->scale.x;145}146147self->velocity.x = self->position.x;148self->velocity.y = self->position.y;149150self->position.x = (RSDK.Cos1024(self->angle) << 12) + self->target->position.x;151self->position.y = (RSDK.Sin1024(self->angle) << 12) + self->target->position.y;152153self->velocity.x = self->position.x - self->velocity.x;154self->velocity.y = self->position.y - self->velocity.y;155156PKingAttack_CheckPlayerCollisions();157158if (++self->timer == 120) {159self->timer = 0;160self->targetPos.x = self->target->position.x;161self->targetPos.y = self->target->position.y;162self->state = PKingAttack_State_Orbiting;163}164}165166void PKingAttack_State_Orbiting(void)167{168RSDK_THIS(PKingAttack);169170RSDK.ProcessAnimation(&self->animator);171172self->position.x += self->target->position.x - self->targetPos.x;173self->position.y += self->target->position.y - self->targetPos.y;174175if (self->position.x <= self->target->position.x) {176if (self->position.x < self->target->position.x)177self->velocity.x += 0x4000;178}179else {180self->velocity.x -= 0x4000;181}182183if (self->position.y <= self->target->position.y) {184if (self->position.y < self->target->position.y)185self->velocity.y += 0x3800;186}187else {188self->velocity.y -= 0x3800;189}190191self->velocity.x = CLAMP(self->velocity.x, -0x50000, 0x50000);192self->velocity.y = CLAMP(self->velocity.y, -0x50000, 0x50000);193194self->position.x += self->velocity.x;195self->position.y += self->velocity.y;196self->targetPos.x = self->target->position.x;197self->targetPos.y = self->target->position.y;198199self->angle = (self->angle + 12) & 0x3FF;200int32 inc = (384 - self->scale.x - (RSDK.Sin1024(self->angle) >> 3)) >> 3;201202self->scale.x += inc;203self->scale.y = self->scale.x;204PKingAttack_CheckPlayerCollisions();205206if (self->angle < 0x200)207self->drawGroup = Zone->objectDrawGroup[0] - 1;208else209self->drawGroup = Zone->objectDrawGroup[0];210}211212void PKingAttack_State_OrbitLaunched(void)213{214RSDK_THIS(PKingAttack);215216RSDK.ProcessAnimation(&self->animator);217218++self->timer;219if (!(self->timer & 3))220CREATE_ENTITY(PKingAttack, INT_TO_VOID(PKINGATTACK_TRAIL), self->position.x, self->position.y);221222if (self->scale.x < 512) {223self->scale.x += 0x20;224self->scale.y = self->scale.x;225}226227self->velocity.x = self->velocity.x + ((self->targetVelocity.x - self->velocity.x) >> 3);228self->velocity.y = self->velocity.y + ((self->targetVelocity.y - self->velocity.y) >> 3);229self->position.x += self->velocity.x;230self->position.y += self->velocity.y;231232PKingAttack_CheckPlayerCollisions();233234if (!RSDK.CheckOnScreen(self, NULL))235destroyEntity(self);236}237238void PKingAttack_State_Trail(void)239{240RSDK_THIS(PKingAttack);241242if (self->timer >= 8) {243self->alpha -= 8;244if (self->alpha <= 0)245destroyEntity(self);246}247else {248self->timer++;249}250}251252void PKingAttack_State_SmallBullet(void)253{254RSDK_THIS(PKingAttack);255256RSDK.ProcessAnimation(&self->animator);257258self->rotation = (self->rotation + 16) & 0x1FF;259self->position.x += self->velocity.x;260self->position.y += self->velocity.y;261262PKingAttack_CheckPlayerCollisions();263264if (RSDK.ObjectTileCollision(self, Zone->collisionLayers, CMODE_FLOOR, 0, 0, 0x40000, true)) {265self->position.y += 0x40000;266destroyEntity(self);267}268269if (!RSDK.CheckOnScreen(self, NULL))270destroyEntity(self);271}272273#if GAME_INCLUDE_EDITOR274void PKingAttack_EditorDraw(void)275{276RSDK_THIS(PKingAttack);277278self->type = PKINGATTACK_ORBIT;279self->inkEffect = INK_ADD;280self->alpha = 0xC0;281RSDK.SetSpriteAnimation(PKingAttack->aniFrames, 12, &self->animator, true, 0);282283PKingAttack_Draw();284}285286void PKingAttack_EditorLoad(void) { PKingAttack->aniFrames = RSDK.LoadSpriteAnimation("Phantom/PhantomKing.bin", SCOPE_STAGE); }287#endif288289void PKingAttack_Serialize(void) {}290291292