Path: blob/master/SonicMania/Objects/ERZ/ERZShinobi.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: ERZShinobi Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectERZShinobi *ERZShinobi;1011void ERZShinobi_Update(void)12{13RSDK_THIS(ERZShinobi);1415if (self->invincibilityTimer > 0)16self->invincibilityTimer--;1718StateMachine_Run(self->state);1920self->rotStore = (self->rotStore + 8) & 0x1FF;21}2223void ERZShinobi_LateUpdate(void) {}2425void ERZShinobi_StaticUpdate(void) {}2627void ERZShinobi_Draw(void)28{29RSDK_THIS(ERZShinobi);3031if ((self->invincibilityTimer & 1))32RSDK.CopyPalette(2, 128, 0, 128, 128);3334self->rotation = self->rotStore;3536for (int32 i = 0; i < 8; ++i) {37Vector2 drawPos;3839drawPos.x = self->finRadius * RSDK.Sin512(self->rotation) + self->position.x;40drawPos.y = self->position.y - self->finRadius * RSDK.Cos512(self->rotation);41self->finAnimator.frameID = ((self->rotation + 16) >> 5) & 0xF;42RSDK.DrawSprite(&self->finAnimator, &drawPos, false);4344drawPos.x = ((5 * self->finRadius * RSDK.Sin512(self->rotation)) >> 3) + self->position.x;45drawPos.y = self->position.y - ((5 * self->finRadius * RSDK.Cos512(self->rotation)) >> 3);46RSDK.DrawSprite(&self->armAnimator, &drawPos, false);4748self->rotation += 64;49}5051RSDK.DrawSprite(&self->bodyAnimator, NULL, false);5253if ((self->invincibilityTimer & 1))54RSDK.CopyPalette(1, 128, 0, 128, 128);55}5657void ERZShinobi_Create(void *data)58{59RSDK_THIS(ERZShinobi);6061if (!SceneInfo->inEditor) {62self->visible = true;63self->drawFX = FX_ROTATE | FX_FLIP;64self->drawGroup = Zone->objectDrawGroup[0];65self->active = ACTIVE_NORMAL;66self->updateRange.x = 0x800000;67self->updateRange.y = 0x800000;68self->collisionLayers = Zone->collisionLayers;69self->tileCollisions = TILECOLLISION_DOWN;70self->finRadius = 0x1600;71self->state = ERZShinobi_State_Moving;7273RSDK.SetSpriteAnimation(ERZShinobi->aniFrames, 0, &self->bodyAnimator, true, 0);74RSDK.SetSpriteAnimation(ERZShinobi->aniFrames, 0, &self->armAnimator, true, 1);75RSDK.SetSpriteAnimation(ERZShinobi->aniFrames, 1, &self->finAnimator, true, 0);76}77}7879void ERZShinobi_StageLoad(void)80{81ERZShinobi->aniFrames = RSDK.LoadSpriteAnimation("Phantom/PhantomShinobi.bin", SCOPE_STAGE);8283ERZShinobi->hitbox.left = -24;84ERZShinobi->hitbox.top = -24;85ERZShinobi->hitbox.right = 24;86ERZShinobi->hitbox.bottom = 24;87}8889void ERZShinobi_CheckPlayerCollisions(void)90{91RSDK_THIS(ERZShinobi);9293foreach_active(Player, playerLoop)94{95if (!self->invincibilityTimer && Player_CheckBadnikTouch(playerLoop, self, &ERZShinobi->hitbox) && Player_CheckBossHit(playerLoop, self)) {96ERZShinobi_Hit();97foreach_return;98}99}100101int32 storeX = self->position.x;102int32 storeY = self->position.y;103int32 angle = self->rotStore;104foreach_active(Player, player)105{106for (int32 f = 0; f < 8; ++f) {107self->position.x = storeX + self->finRadius * RSDK.Sin512(angle);108self->position.y = storeY - self->finRadius * RSDK.Cos512(angle);109if (RSDK.CheckObjectCollisionTouchCircle(player, 0xC0000, self, 0x80000)) {110Player_Hurt(player, self);111}112angle += 0x40;113}114}115116self->position.x = storeX;117self->position.y = storeY;118}119120void ERZShinobi_Hit(void)121{122RSDK_THIS(ERZShinobi);123124self->invincibilityTimer = 48;125RSDK.PlaySfx(ERZKing->sfxHit, false, 255);126}127128void ERZShinobi_HandleTileCollisions(void)129{130RSDK_THIS(ERZShinobi);131132if (self->onGround) {133self->finRadius += (0x1000 - self->finRadius) >> 3;134135if (!self->prevOnGround) {136if (self->numBounces > 0) {137self->velocity.y = -0x30000;138self->numBounces--;139self->onGround = false;140}141}142}143else {144self->velocity.y += 0x3800;145if (self->velocity.y > 0xC0000)146self->velocity.y = 0xC0000;147148self->finRadius += (0x1600 - self->finRadius) >> 3;149}150151int32 size = self->finRadius / 88;152153self->outerBox.left = -size;154self->outerBox.top = -size;155self->outerBox.right = size;156self->outerBox.bottom = size;157158self->innerBox.left = 2 - size;159self->innerBox.top = -size;160self->innerBox.right = size - 2;161self->innerBox.bottom = size;162163self->prevOnGround = self->onGround;164165RSDK.ProcessObjectMovement(self, &self->outerBox, &self->innerBox);166}167168void ERZShinobi_State_Moving(void)169{170RSDK_THIS(ERZShinobi);171172ERZShinobi_HandleTileCollisions();173174if (++self->timer == 60) {175self->timer = 0;176if (self->onGround) {177self->numBounces = 2;178self->velocity.y = -0x80000;179self->onGround = false;180}181}182183ERZShinobi_CheckPlayerCollisions();184}185186#if GAME_INCLUDE_EDITOR187void ERZShinobi_EditorDraw(void)188{189RSDK_THIS(ERZShinobi);190191self->finRadius = 0x1600;192193RSDK.SetSpriteAnimation(ERZShinobi->aniFrames, 0, &self->bodyAnimator, false, 0);194RSDK.SetSpriteAnimation(ERZShinobi->aniFrames, 0, &self->armAnimator, false, 1);195RSDK.SetSpriteAnimation(ERZShinobi->aniFrames, 1, &self->finAnimator, false, 0);196197ERZShinobi_Draw();198}199200void ERZShinobi_EditorLoad(void) { ERZShinobi->aniFrames = RSDK.LoadSpriteAnimation("Phantom/PhantomShinobi.bin", SCOPE_STAGE); }201#endif202203void ERZShinobi_Serialize(void) {}204205206