Path: blob/master/SonicMania/Objects/SSZ/Fireflies.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Fireflies Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFireflies *Fireflies;1011void Fireflies_Update(void)12{13RSDK_THIS(Fireflies);1415StateMachine_Run(self->state);16}1718void Fireflies_LateUpdate(void) {}1920void Fireflies_StaticUpdate(void) {}2122void Fireflies_Draw(void)23{24RSDK_THIS(Fireflies);2526RSDK.DrawSprite(&self->animator, NULL, false);27}2829void Fireflies_Create(void *data)30{31RSDK_THIS(Fireflies);3233if (!SceneInfo->inEditor) {34self->active = ACTIVE_NORMAL;35self->drawGroup = Zone->objectDrawGroup[0];36self->visible = true;37self->drawFX = FX_FLIP;38self->updateRange.x = TO_FIXED(128);39self->updateRange.y = TO_FIXED(128);4041if (data) {42self->inkEffect = INK_ADD;43self->state = Fireflies_State_Firefly;44}45else {46self->state = Fireflies_State_Spawner;47self->screenCount = RSDK.GetVideoSetting(VIDEOSETTING_SCREENCOUNT);48}49}50}5152void Fireflies_StageLoad(void) { Fireflies->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/Fireflies.bin", SCOPE_STAGE); }5354void Fireflies_State_Spawner(void)55{56RSDK_THIS(Fireflies);5758if (self->timer <= 0) {59self->timer = 1;6061if (Fireflies->activeFireflyCount < 48) {62Vector2 startPos;6364RSDKScreenInfo *screen = &ScreenInfo[self->screenID];65int32 screenCenterX = TO_FIXED(screen->position.x + (screen->size.x / 2));66int32 screenCenterY = TO_FIXED(screen->position.y + (screen->size.y / 2));67int32 offsetX = TO_FIXED(ZONE_RAND(-screen->size.x, screen->size.x));68int32 offsetY = TO_FIXED(ZONE_RAND(-screen->size.y, screen->size.y));6970startPos.x = screenCenterX + offsetX;71startPos.y = screenCenterY + offsetY;72bool32 isLarge = ZONE_RAND(0, 10) > 7;7374EntityFireflies *fireflies = CREATE_ENTITY(Fireflies, INT_TO_VOID(true), startPos.x, startPos.y);75RSDK.SetSpriteAnimation(Fireflies->aniFrames, isLarge ? 3 : 0, &fireflies->animator, true, 0);76fireflies->drawGroup = isLarge ? Zone->objectDrawGroup[1] : 1;7778fireflies->duration = ZONE_RAND(45, 75);79fireflies->updateRange.x = TO_FIXED(128);80fireflies->updateRange.y = TO_FIXED(128);81fireflies->active = ACTIVE_NORMAL;8283int32 points3_delta = ZONE_RAND(32, 128);84int32 points3_angle = ZONE_RAND(0, 511);85int32 points3_x = startPos.x + points3_delta * (RSDK.Cos512(points3_angle) << 7);86int32 points3_y = startPos.y + points3_delta * (RSDK.Sin512(points3_angle) << 7);8788int32 points1_delta = ZONE_RAND(32, 64);89int32 points1_angle = ZONE_RAND(0, 511);90int32 points1_x = startPos.x + points1_delta * (RSDK.Cos512(points1_angle) << 7);91int32 points1_y = startPos.y + points1_delta * (RSDK.Sin512(points1_angle) << 7);9293int32 points2_delta = ZONE_RAND(32, 64);94int32 points2_angle = ZONE_RAND(0, 511);95int32 points2_x = points3_x + points2_delta * (RSDK.Cos512(points2_angle) << 7);96int32 points2_y = points3_y + points2_delta * (RSDK.Sin512(points2_angle) << 7);9798fireflies->points[0].x = startPos.x;99fireflies->points[0].y = startPos.y;100fireflies->points[1].x = points1_x;101fireflies->points[1].y = points1_y;102fireflies->points[2].x = points2_x;103fireflies->points[2].y = points2_y;104fireflies->points[3].x = points3_x;105fireflies->points[3].y = points3_y;106107++Fireflies->activeFireflyCount;108109self->screenID = (self->screenID + 1) % self->screenCount;110}111}112else {113self->timer--;114}115}116117void Fireflies_State_Firefly(void)118{119RSDK_THIS(Fireflies);120121int32 frame = 0, animLow = 0, animHigh = 0;122if (self->animator.animationID % 3 || self->animator.frameID != self->animator.frameCount - 1) {123if (self->timer == self->duration - 28) {124frame = 0;125animLow = 2;126animHigh = 5;127if (self->drawGroup == Zone->objectDrawGroup[1])128animLow = animHigh;129130RSDK.SetSpriteAnimation(Fireflies->aniFrames, animLow, &self->animator, true, frame);131}132}133else {134frame = self->animator.animationID % 3;135animLow = 1;136animHigh = 4;137if (self->drawGroup == Zone->objectDrawGroup[1])138animLow = animHigh;139140RSDK.SetSpriteAnimation(Fireflies->aniFrames, animLow, &self->animator, true, frame);141}142143int32 percent = TO_FIXED(self->timer) / self->duration;144self->position = MathHelpers_GetBezierPoint(percent, self->points[0].x, self->points[0].y, self->points[1].x, self->points[1].y,145self->points[2].x, self->points[2].y, self->points[3].x, self->points[3].y);146147if (!percent)148self->position = self->points[0];149150if (self->timer + 8 < self->duration) {151if (self->alpha < 0x100)152self->alpha += 0x20;153}154else {155self->alpha -= 0x20;156}157158if (self->timer >= self->duration) {159destroyEntity(self);160--Fireflies->activeFireflyCount;161}162163RSDK.ProcessAnimation(&self->animator);164++self->timer;165}166167#if GAME_INCLUDE_EDITOR168void Fireflies_EditorDraw(void)169{170RSDK_THIS(Fireflies);171172self->drawFX = FX_FLIP;173RSDK.SetSpriteAnimation(Fireflies->aniFrames, 5, &self->animator, true, 0);174175Fireflies_Draw();176}177178void Fireflies_EditorLoad(void) { Fireflies->aniFrames = RSDK.LoadSpriteAnimation("SSZ1/Fireflies.bin", SCOPE_STAGE); }179#endif180181void Fireflies_Serialize(void) {}182183184