Path: blob/master/SonicMania/Objects/MSZ/MSZSpotlight.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: MSZSpotlight Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectMSZSpotlight *MSZSpotlight;1011void MSZSpotlight_Update(void)12{13RSDK_THIS(MSZSpotlight);1415StateMachine_Run(self->state);16}1718void MSZSpotlight_LateUpdate(void) {}1920void MSZSpotlight_StaticUpdate(void) {}2122void MSZSpotlight_Draw(void)23{24RSDK_THIS(MSZSpotlight);2526RSDK.DrawSprite(&self->animatorSpotlight, NULL, false);27}2829void MSZSpotlight_Create(void *data)30{31RSDK_THIS(MSZSpotlight);3233if (!SceneInfo->inEditor) {34self->visible = true;35self->drawGroup = Zone->objectDrawGroup[1];36self->startPos = self->position;37self->inkEffect = INK_ADD;38self->angle = RSDK.Rand(0, 256);3940switch (self->color) {41case MSZSPOTLIGHT_RED: self->angleOffset = -4; break;42case MSZSPOTLIGHT_GREEN: self->angleOffset = 4; break;43case MSZSPOTLIGHT_BLUE: self->angleOffset = 2; break;44}4546self->active = ACTIVE_BOUNDS;47self->updateRange.x = 0x800000;48self->updateRange.y = 0x800000;49RSDK.SetSpriteAnimation(MSZSpotlight->aniFrames, 9, &self->animatorSpotlight, true, self->color);50}51}5253void MSZSpotlight_StageLoad(void)54{55MSZSpotlight->aniFrames = RSDK.LoadSpriteAnimation("MSZ/HeavyMystic.bin", SCOPE_STAGE);5657// Yeah, this is actually here in the original58// This (& the one in FBZSetup) is how I found out about what these funcs do LOL59RSDK_ACTIVE_VAR(MSZSpotlight, color);60RSDK_ENUM_VAR("Red", MSZSPOTLIGHT_RED);61RSDK_ENUM_VAR("Green", MSZSPOTLIGHT_GREEN);62RSDK_ENUM_VAR("Blue", MSZSPOTLIGHT_BLUE);63}6465void MSZSpotlight_State_Appear(void)66{67RSDK_THIS(MSZSpotlight);6869self->angle = (self->angle & 0xFF) + self->angleOffset;70self->position.x = (RSDK.Cos256(self->angle) << 13) + self->startPos.x;71self->position.y = (RSDK.Sin256(self->angle) << 13) + self->startPos.y;7273if (self->alpha >= 0x100)74self->state = MSZSpotlight_State_Circling;75else76self->alpha += 8;77}7879void MSZSpotlight_State_Circling(void)80{81RSDK_THIS(MSZSpotlight);8283self->angle = (self->angle & 0xFF) + self->angleOffset;84self->position.x = (RSDK.Cos256(self->angle) << 13) + self->startPos.x;85self->position.y = (RSDK.Sin256(self->angle) << 13) + self->startPos.y;8687if (++self->timer == 120) {88self->timer = 0;89self->state = MSZSpotlight_State_Idle;90}91}9293void MSZSpotlight_State_Idle(void)94{95RSDK_THIS(MSZSpotlight);9697if (++self->timer == 30) {98self->timer = 0;99foreach_active(HeavyMystic, mystic)100{101if (mystic->type == MYSTIC_BOX) {102self->startPos.x = mystic->position.x;103self->startPos.y = mystic->position.y;104}105}106107self->velocity.x = (self->startPos.x - self->position.x) >> 4;108self->velocity.y = (self->startPos.y - self->position.y) >> 4;109self->state = MSZSpotlight_State_MoveToBox;110}111}112113void MSZSpotlight_State_MoveToBox(void)114{115RSDK_THIS(MSZSpotlight);116117self->position.x += self->velocity.x;118self->position.y += self->velocity.y;119120int32 rx = (self->startPos.x - self->position.x) >> 16;121int32 ry = (self->startPos.y - self->position.y) >> 16;122123if (rx * rx + ry * ry < 16) {124foreach_active(HeavyMystic, mystic)125{126if (mystic->type == MYSTIC_BOX && mystic->state != HeavyMystic_StateBox_CloseDoors) {127mystic->state = HeavyMystic_StateBox_CloseDoors;128RSDK.PlaySfx(HeavyMystic->sfxClack, false, 255);129}130}131132self->position.x = self->startPos.x;133self->position.y = self->startPos.y;134self->drawFX = FX_SCALE;135self->scale.x = 0x200;136self->scale.y = 0x200;137self->state = MSZSpotlight_State_Disappear;138}139}140141void MSZSpotlight_State_Disappear(void)142{143RSDK_THIS(MSZSpotlight);144145self->scale.x += 0x20;146self->scale.y += 0x20;147148if (self->scale.x < 0x300)149self->alpha = 0x100;150151if (self->alpha <= 0)152destroyEntity(self);153else154self->alpha -= 0x10;155}156157#if GAME_INCLUDE_EDITOR158void MSZSpotlight_EditorDraw(void)159{160RSDK_THIS(MSZSpotlight);161162RSDK.SetSpriteAnimation(MSZSpotlight->aniFrames, 9, &self->animatorSpotlight, true, self->color);163RSDK.DrawSprite(&self->animatorSpotlight, NULL, false);164}165166void MSZSpotlight_EditorLoad(void)167{168MSZSpotlight->aniFrames = RSDK.LoadSpriteAnimation("MSZ/HeavyMystic.bin", SCOPE_STAGE);169170RSDK_ACTIVE_VAR(MSZSpotlight, color);171RSDK_ENUM_VAR("Red", MSZSPOTLIGHT_RED);172RSDK_ENUM_VAR("Green", MSZSPOTLIGHT_GREEN);173RSDK_ENUM_VAR("Blue", MSZSPOTLIGHT_BLUE);174}175#endif176177void MSZSpotlight_Serialize(void) { RSDK_EDITABLE_VAR(MSZSpotlight, VAR_UINT8, color); }178179180