Path: blob/master/SonicMania/Objects/SSZ/HiLoSign.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: HiLoSign Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectHiLoSign *HiLoSign;1011void HiLoSign_Update(void)12{13RSDK_THIS(HiLoSign);1415foreach_active(Player, player)16{17if (Player_CheckCollisionTouch(player, self, &HiLoSign->spinHitbox[self->type])) {18int32 velocity = (self->type & HILOSIGN_V) ? player->velocity.x : player->velocity.y;1920int32 speed = abs((velocity >> 7) + (velocity >> 6));21if (speed > self->spinSpeed && speed >= 0xC00) {22self->spinSpeed = speed & 0xFFFFFF80;23self->active = ACTIVE_NORMAL;24self->state = HiLoSign_State_Spinning;25self->direction = velocity < 0;26}27}28}2930StateMachine_Run(self->state);31}3233void HiLoSign_LateUpdate(void) {}3435void HiLoSign_StaticUpdate(void) {}3637void HiLoSign_Draw(void)38{39RSDK_THIS(HiLoSign);4041StateMachine_Run(self->stateDraw);42}4344void HiLoSign_Create(void *data)45{46RSDK_THIS(HiLoSign);4748if (!SceneInfo->inEditor) {49RSDK.SetSpriteAnimation(HiLoSign->aniFrames, 0, &self->faceAnimator, true, 0);50RSDK.SetSpriteAnimation(HiLoSign->aniFrames, 1, &self->sidesAnimator, true, 0);5152self->active = ACTIVE_BOUNDS;53self->updateRange.x = 0x800000;54self->updateRange.y = 0x800000;55self->drawFX = FX_SCALE;56self->visible = true;57self->drawGroup = Zone->objectDrawGroup[0];58self->scale.x = 0x200;59self->scale.y = 0x200;60self->state = HiLoSign_State_Spinning;6162switch (self->type) {63case HILOSIGN_H:64self->sidesAnimator.frameID = 1;65self->stateDraw = HiLoSign_Draw_Horizontal;66break;6768case HILOSIGN_V: self->stateDraw = HiLoSign_Draw_Vertical; break;69}70}71}7273void HiLoSign_StageLoad(void)74{75HiLoSign->aniFrames = RSDK.LoadSpriteAnimation("SSZ/HiLoSign.bin", SCOPE_STAGE);7677HiLoSign->spinHitbox[HILOSIGN_H].left = -24;78HiLoSign->spinHitbox[HILOSIGN_H].top = -6;79HiLoSign->spinHitbox[HILOSIGN_H].right = 24;80HiLoSign->spinHitbox[HILOSIGN_H].bottom = 6;8182HiLoSign->spinHitbox[HILOSIGN_V].left = -6;83HiLoSign->spinHitbox[HILOSIGN_V].top = -24;84HiLoSign->spinHitbox[HILOSIGN_V].right = 6;85HiLoSign->spinHitbox[HILOSIGN_V].bottom = 24;8687HiLoSign->sfxSignPost = RSDK.GetSfx("Global/SignPost.wav");8889DEBUGMODE_ADD_OBJ(HiLoSign);90}9192void HiLoSign_DebugSpawn(void)93{94RSDK_THIS(DebugMode);9596CREATE_ENTITY(HiLoSign, NULL, self->position.x, self->position.y);97}9899void HiLoSign_DebugDraw(void)100{101RSDK.SetSpriteAnimation(HiLoSign->aniFrames, 0, &DebugMode->animator, true, 0);102RSDK.DrawSprite(&DebugMode->animator, NULL, false);103}104105void HiLoSign_State_Spinning(void)106{107RSDK_THIS(HiLoSign);108109if (self->spinSpeed) {110if (self->direction)111self->angle -= self->spinSpeed;112else113self->angle += self->spinSpeed;114115self->spinSpeed -= 0x40;116if (self->spinSpeed < 0x100) {117if (self->direction) {118if ((self->angle & 0xFFFF) < 0x4000)119self->direction ^= FLIP_X;120}121else {122if ((self->angle & 0xFFFF) > 0xC000)123self->direction = FLIP_X;124}125126self->spinSpeed = 0;127self->state = HiLoSign_State_FinishSpinAdjust;128}129}130131self->rotation = (self->angle >> 8) & 0x1FF;132}133134void HiLoSign_State_FinishSpinAdjust(void)135{136RSDK_THIS(HiLoSign);137138uint32 prevAng = self->angle & 0xFFFF0000;139if (self->direction)140self->angle -= self->spinSpeed;141else142self->angle += self->spinSpeed;143144self->spinSpeed -= 0x20;145if ((self->angle & 0xFFFF0000) != prevAng) {146self->active = ACTIVE_BOUNDS;147self->spinSpeed = 0;148self->state = HiLoSign_State_Spinning;149}150151self->rotation = (self->angle >> 8) & 0x1FF;152}153154void HiLoSign_Draw_Horizontal(void)155{156RSDK_THIS(HiLoSign);157158Vector2 drawPos;159drawPos.x = self->position.x;160161self->drawFX = FX_SCALE;162self->scale.y = abs(RSDK.Cos512(self->rotation)) + 1;163int32 scaleY = abs(RSDK.Sin512(self->rotation)) + 1;164165switch (self->rotation >> 7) {166case 0:167case 2:168drawPos.y = self->position.y + (scaleY << 9);169RSDK.DrawSprite(&self->faceAnimator, &drawPos, false);170drawPos.y += -2048 * self->scale.y - (scaleY << 9);171break;172173case 1:174case 3:175drawPos.y = self->position.y - (scaleY << 9);176RSDK.DrawSprite(&self->faceAnimator, &drawPos, false);177drawPos.y += (scaleY + 4 * (self->scale.y - 16)) << 9;178break;179180default: break;181}182183self->scale.y = scaleY;184RSDK.DrawSprite(&self->sidesAnimator, &drawPos, false);185}186187void HiLoSign_Draw_Vertical(void)188{189RSDK_THIS(HiLoSign);190191Vector2 drawPos;192drawPos.y = self->position.y;193194self->drawFX = FX_SCALE;195self->scale.x = abs(RSDK.Cos512(self->rotation)) + 1;196int32 scaleX = abs(RSDK.Sin512(self->rotation)) + 1;197198switch (self->rotation >> 7) {199case 0:200case 2:201drawPos.x = self->position.x + (scaleX << 9);202RSDK.DrawSprite(&self->faceAnimator, &drawPos, false);203drawPos.x += -0xF00 * self->scale.x - (scaleX << 9);204break;205206case 1:207case 3:208drawPos.x = self->position.x - (scaleX << 9);209RSDK.DrawSprite(&self->faceAnimator, &drawPos, false);210drawPos.x += ((scaleX - 64) << 9) + 0xF00 * self->scale.x;211break;212213default: break;214}215216self->scale.x = scaleX;217RSDK.DrawSprite(&self->sidesAnimator, &drawPos, false);218}219220#if GAME_INCLUDE_EDITOR221void HiLoSign_EditorDraw(void)222{223RSDK_THIS(HiLoSign);224225RSDK.SetSpriteAnimation(HiLoSign->aniFrames, 0, &self->faceAnimator, true, 0);226227RSDK.DrawSprite(&self->faceAnimator, NULL, false);228}229230void HiLoSign_EditorLoad(void)231{232HiLoSign->aniFrames = RSDK.LoadSpriteAnimation("SSZ/HiLoSign.bin", SCOPE_STAGE);233234RSDK_ACTIVE_VAR(HiLoSign, type);235RSDK_ENUM_VAR("Horizontal", HILOSIGN_H);236RSDK_ENUM_VAR("Vertical", HILOSIGN_V);237}238#endif239240void HiLoSign_Serialize(void) { RSDK_EDITABLE_VAR(HiLoSign, VAR_UINT8, type); }241242243