Path: blob/master/SonicMania/Objects/AIZ/AIZKingClaw.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: AIZKingClaw Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectAIZKingClaw *AIZKingClaw;1011void AIZKingClaw_Update(void)12{13RSDK_THIS(AIZKingClaw);14StateMachine_Run(self->state);1516for (int32 i = 0; i < MIN(self->grabCount, 8); ++i) {17Entity *grabbed = self->grabbedEntities[i];18if (grabbed) {19grabbed->position.x = self->clawPos.x;20grabbed->position.y = self->clawPos.y + 0x2C0000;2122if (grabbed->classID == Platform->classID) {23EntityPlatform *plat = (EntityPlatform *)grabbed;24plat->drawPos.x = plat->position.x;25plat->drawPos.y = plat->position.y;26plat->centerPos.x = plat->position.x;27plat->centerPos.y = plat->position.y;28}29}30}3132AIZKingClaw_HandleClawPositions();33}3435void AIZKingClaw_LateUpdate(void) {}3637void AIZKingClaw_StaticUpdate(void)38{39foreach_active(AIZKingClaw, claw) { RSDK.AddDrawListRef(Zone->objectDrawGroup[1], RSDK.GetEntitySlot(claw)); }40}4142void AIZKingClaw_Draw(void)43{44RSDK_THIS(AIZKingClaw);45if (SceneInfo->currentDrawGroup == Zone->objectDrawGroup[0]) {46RSDK.DrawSprite(&self->clawBackAnimator, &self->clawPos, false);47}48else {49for (int32 i = 0; i < AIZKingClaw_ChainCount; ++i) RSDK.DrawSprite(&self->chainAnimator, &self->chainPos[i], false);5051RSDK.DrawSprite(&self->hingeAnimator, &self->clawPos, false);52RSDK.DrawSprite(&self->clawFrontAnimator, &self->clawPos, false);53}54}5556void AIZKingClaw_Create(void *data)57{58RSDK_THIS(AIZKingClaw);59if (!SceneInfo->inEditor) {60self->visible = true;61self->drawFX = FX_ROTATE;62self->drawGroup = Zone->objectDrawGroup[0];63self->active = ACTIVE_NORMAL;64self->updateRange.x = 0x800000;65self->updateRange.y = 0x1000000;66self->startY = self->position.y - 0x300000;67if (RSDK.CheckSceneFolder("AIZ")) {68self->position.y -= 0x1000000;69RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 3, &self->clawBackAnimator, true, 0);70RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 2, &self->clawFrontAnimator, true, 0);71}72else {73self->position.y -= 0x40000;74RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 3, &self->clawBackAnimator, true, 3);75RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 2, &self->clawFrontAnimator, true, 3);76}77RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 0, &self->chainAnimator, true, 0);78RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 1, &self->hingeAnimator, true, 0);79}80}8182void AIZKingClaw_StageLoad(void)83{84if (RSDK.CheckSceneFolder("AIZ")) {85AIZKingClaw->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Claw.bin", SCOPE_STAGE);86}87else if (RSDK.CheckSceneFolder("GHZCutscene")) {88AIZKingClaw->aniFrames = RSDK.LoadSpriteAnimation("GHZCutscene/Claw.bin", SCOPE_STAGE);89}9091AIZKingClaw->active = ACTIVE_NORMAL;92AIZKingClaw->sfxClack = RSDK.GetSfx("Stage/Clack.wav");93AIZKingClaw->sfxWalkerLegs = RSDK.GetSfx("LRZ/WalkerLegs.wav");94}9596void AIZKingClaw_HandleClawPositions(void)97{98RSDK_THIS(AIZKingClaw);99100self->clawPos.x = self->position.x;101self->clawPos.y = self->position.y;102int32 moveX = RSDK.Sin256(self->angle) << 12;103int32 moveY = RSDK.Cos256(self->angle) << 12;104105for (int32 i = 0; i < AIZKingClaw_ChainCount; ++i) {106self->chainPos[i].x = self->clawPos.x;107self->chainPos[i].y = self->clawPos.y;108self->clawPos.x += moveX;109self->clawPos.y += moveY;110}111112self->clawPos.x += 0xC00 * RSDK.Sin256(self->angle);113self->clawPos.y += 0xC00 * RSDK.Cos256(self->angle);114}115116void AIZKingClaw_State_Grab(void)117{118RSDK_THIS(AIZKingClaw);119if (!self->timer)120RSDK.PlaySfx(AIZKingClaw->sfxClack, false, 0);121122++self->timer;123if (!(self->timer & 3)) {124if (self->clawFrontAnimator.frameID >= 3) {125self->state = StateMachine_None;126}127else {128self->clawBackAnimator.frameID++;129self->clawFrontAnimator.frameID++;130if (self->clawFrontAnimator.frameID == 3)131RSDK.PlaySfx(AIZKingClaw->sfxWalkerLegs, false, 0);132}133}134}135136#if GAME_INCLUDE_EDITOR137void AIZKingClaw_EditorDraw(void)138{139RSDK_THIS(AIZKingClaw);140int32 y = self->position.y;141if (RSDK.CheckSceneFolder("AIZ")) {142self->position.y -= 0x1000000;143RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 3, &self->clawBackAnimator, true, 0);144RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 2, &self->clawFrontAnimator, true, 0);145}146else {147self->position.y -= 0x40000;148RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 3, &self->clawBackAnimator, true, 3);149RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 2, &self->clawFrontAnimator, true, 3);150}151RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 0, &self->chainAnimator, true, 0);152RSDK.SetSpriteAnimation(AIZKingClaw->aniFrames, 1, &self->hingeAnimator, true, 0);153154AIZKingClaw_HandleClawPositions();155156for (int32 i = 0; i < AIZKingClaw_ChainCount; ++i) RSDK.DrawSprite(&self->chainAnimator, &self->chainPos[i], false);157158RSDK.DrawSprite(&self->hingeAnimator, &self->clawPos, false);159RSDK.DrawSprite(&self->clawFrontAnimator, &self->clawPos, false);160161RSDK.DrawSprite(&self->clawBackAnimator, &self->clawPos, false);162163self->position.y = y;164}165166void AIZKingClaw_EditorLoad(void)167{168if (RSDK.CheckSceneFolder("AIZ"))169AIZKingClaw->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Claw.bin", SCOPE_STAGE);170else if (RSDK.CheckSceneFolder("GHZCutscene"))171AIZKingClaw->aniFrames = RSDK.LoadSpriteAnimation("GHZCutscene/Claw.bin", SCOPE_STAGE);172}173#endif174175void AIZKingClaw_Serialize(void) {}176177178