Path: blob/master/SonicMania/Objects/LRZ/KingClaw.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: KingClaw Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectKingClaw *KingClaw;1011void KingClaw_Update(void)12{13RSDK_THIS(KingClaw);1415StateMachine_Run(self->state);1617KingClaw_HandleJointPositions();18}1920void KingClaw_LateUpdate(void) {}2122void KingClaw_StaticUpdate(void)23{24foreach_active(KingClaw, claw) { RSDK.AddDrawListRef(1, RSDK.GetEntitySlot(claw)); }25}2627void KingClaw_Draw(void)28{29RSDK_THIS(KingClaw);3031if (self->forceHighdrawGroup) {32RSDK.DrawSprite(&self->clawBackAnimator, &self->drawPos, false);3334for (int32 i = 0; i < KINGCLAW_CHAIN_COUNT; ++i) RSDK.DrawSprite(&self->chainAnimator, &self->chainPos[i], false);35}36else {37if (SceneInfo->currentDrawGroup != Zone->objectDrawGroup[0])38RSDK.DrawSprite(&self->clawBackAnimator, &self->drawPos, false);39else40for (int32 i = 0; i < KINGCLAW_CHAIN_COUNT; ++i) RSDK.DrawSprite(&self->chainAnimator, &self->chainPos[i], false);41}4243RSDK.DrawSprite(&self->hingeAnimator, &self->drawPos, false);44RSDK.DrawSprite(&self->clawFrontAnimator, &self->drawPos, false);45}4647void KingClaw_Create(void *data)48{49RSDK_THIS(KingClaw);5051if (!SceneInfo->inEditor) {52self->visible = true;53self->drawFX = FX_ROTATE;54self->drawGroup = Zone->objectDrawGroup[0];55self->targetY = self->position.y - 0x300000;56self->position.y = self->position.y - 0x1000000;57self->active = ACTIVE_XBOUNDS;58self->updateRange.x = 0x800000;59self->updateRange.y = 0x1000000;6061RSDK.SetSpriteAnimation(KingClaw->aniFrames, 0, &self->chainAnimator, true, 0);62RSDK.SetSpriteAnimation(KingClaw->aniFrames, 1, &self->hingeAnimator, true, 0);63RSDK.SetSpriteAnimation(KingClaw->aniFrames, 3, &self->clawBackAnimator, true, 0);64RSDK.SetSpriteAnimation(KingClaw->aniFrames, 2, &self->clawFrontAnimator, true, 0);65}66}6768void KingClaw_StageLoad(void)69{70KingClaw->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/Claw.bin", SCOPE_STAGE);7172KingClaw->active = ACTIVE_NORMAL;7374KingClaw->sfxClack = RSDK.GetSfx("Stage/Clack.wav");75KingClaw->sfxWalkerLegs = RSDK.GetSfx("LRZ/WalkerLegs.wav");76}7778void KingClaw_HandleJointPositions(void)79{80RSDK_THIS(KingClaw);8182self->drawPos.x = self->position.x;83self->drawPos.y = self->position.y;8485for (int32 i = 0; i < KINGCLAW_CHAIN_COUNT; ++i) {86self->chainPos[i].x = self->drawPos.x;87self->chainPos[i].y = self->drawPos.y;88self->drawPos.x += RSDK.Sin256(self->angle) << 12;89self->drawPos.y += RSDK.Cos256(self->angle) << 12;90}9192self->drawPos.x += 0xC00 * RSDK.Sin256(self->angle);93self->drawPos.y += 0xC00 * RSDK.Cos256(self->angle);94}9596void KingClaw_State_EnterClaw(void)97{98RSDK_THIS(KingClaw);99100if (self->position.y >= self->targetY)101self->state = StateMachine_None;102else103self->position.y += 0x8000;104}105106void KingClaw_State_Grab(void)107{108RSDK_THIS(KingClaw);109110if (!self->timer)111RSDK.PlaySfx(KingClaw->sfxClack, false, 0);112113++self->timer;114if (!(self->timer & 3)) {115if (self->clawFrontAnimator.frameID < 3) {116++self->clawBackAnimator.frameID;117++self->clawFrontAnimator.frameID;118119if (self->clawFrontAnimator.frameID == 3)120RSDK.PlaySfx(KingClaw->sfxWalkerLegs, false, 0);121}122}123124if (self->timer == 60) {125foreach_active(HPZEmerald, emerald)126{127if (emerald->type == HPZEMERALD_MASTER)128self->masterEmerald = emerald;129}130131self->timer = 0;132self->state = KingClaw_State_LiftMasterEmerald;133}134}135136void KingClaw_State_LiftMasterEmerald(void)137{138RSDK_THIS(KingClaw);139140self->position.y -= 0x2000;141142if (self->masterEmerald)143self->masterEmerald->position.y = self->position.y + 0xF80000;144145if (++self->timer == 480) {146self->timer = 0;147self->state = StateMachine_None;148}149}150151void KingClaw_State_Swinging(void)152{153RSDK_THIS(KingClaw);154155if (self->clawFrontAnimator.frameID > 0) {156--self->clawBackAnimator.frameID;157--self->clawFrontAnimator.frameID;158}159160if (self->velocity.y > -0x8000)161self->velocity.y -= 0x100;162163self->position.y += self->velocity.y;164self->angle = RSDK.Sin256(-self->timer) >> 4;165self->rotation = -2 * self->angle;166167self->timer += 3;168if (self->timer >= 0x800) {169self->state = StateMachine_None;170self->angle = 0;171self->timer = 0;172}173}174175void KingClaw_State_LowerClaw(void)176{177RSDK_THIS(KingClaw);178179if (self->velocity.y < 0x40000)180self->velocity.y += 0x200;181182if (self->position.y >= self->targetY) {183self->velocity.y >>= 3;184self->state = StateMachine_None;185}186else {187self->position.y += self->velocity.y;188}189}190191void KingClaw_State_RaiseClaw(void)192{193RSDK_THIS(KingClaw);194195if (self->velocity.y > -0x80000)196self->velocity.y -= 0x400;197198self->position.y += self->velocity.y;199}200201#if GAME_INCLUDE_EDITOR202void KingClaw_EditorDraw(void)203{204RSDK_THIS(KingClaw);205206self->updateRange.x = 0x800000;207self->updateRange.y = 0x1000000;208209RSDK.SetSpriteAnimation(KingClaw->aniFrames, 0, &self->chainAnimator, true, 0);210RSDK.SetSpriteAnimation(KingClaw->aniFrames, 1, &self->hingeAnimator, true, 0);211RSDK.SetSpriteAnimation(KingClaw->aniFrames, 3, &self->clawBackAnimator, true, 0);212RSDK.SetSpriteAnimation(KingClaw->aniFrames, 2, &self->clawFrontAnimator, true, 0);213214self->forceHighdrawGroup = true;215216KingClaw_HandleJointPositions();217KingClaw_Draw();218219if (showGizmos()) {220RSDK_DRAWING_OVERLAY(true);221222self->position.y += SCREEN_YSIZE << 15;223DrawHelpers_DrawArenaBounds(-320, -(SCREEN_YSIZE >> 1), 320, SCREEN_YSIZE >> 1, 1 | 2 | 4 | 0, 0x00C0F0);224self->position.y -= SCREEN_YSIZE << 15;225226RSDK_DRAWING_OVERLAY(false);227}228}229230void KingClaw_EditorLoad(void) { KingClaw->aniFrames = RSDK.LoadSpriteAnimation("LRZ3/Claw.bin", SCOPE_STAGE); }231#endif232233void KingClaw_Serialize(void) {}234235236