Path: blob/master/SonicMania/Objects/Cutscene/FXWaveRing.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FXWaveRing Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectFXWaveRing *FXWaveRing;1112void FXWaveRing_Update(void)13{14RSDK_THIS(FXWaveRing);1516if (!(Zone->timer & 3)) {17if (self->shrinkSpeed > 0)18self->radiusOffset += RSDK.Rand(0, 2 * self->shrinkSpeed);1920self->radius = RSDK.Rand(8, 24);21self->angleVel = 1;22self->angleVel2 = RSDK.Rand(8, 32);23self->angleInc = RSDK.Rand(50, 199);24}2526self->angle = ((self->angle & 0xFF) + (self->angleVel & 0xFF)) & 0xFf;27self->angle2 = ((self->angle2 & 0xFF) + (self->angleVel2 & 0xFF)) & 0xFf;2829StateMachine_Run(self->state);3031Entity *parent = self->parent;32if (parent) {33self->position.x = parent->position.x + self->offsetPos.x;34self->position.y = parent->position.y + self->offsetPos.y;35}36}3738void FXWaveRing_LateUpdate(void) {}3940void FXWaveRing_StaticUpdate(void) {}4142void FXWaveRing_Draw(void)43{44RSDK_THIS(FXWaveRing);4546int32 angInc = 256 / self->pointCount;47uint32 color = (self->r << 16) | (self->g << 8) | (self->b << 8);48int32 sin = self->radius * RSDK.Sin256(self->angle2) + (self->radiusOffset << 8);4950int32 x = sin * RSDK.Sin256(self->angle) + self->position.x;51int32 y = sin * RSDK.Cos256(self->angle) + self->position.y;5253int32 angle = self->angle;54int32 angle2 = self->angle2;55int32 prevX = x;56int32 prevY = y;57for (int32 i = 0; i < self->pointCount - 1; ++i) {58angle += angInc;59angle2 += self->angleInc;60sin = self->radius * RSDK.Sin256(angle2) + (self->radiusOffset << 8);61prevX = x;62prevY = y;63x = sin * RSDK.Sin256(angle) + self->position.x;64y = sin * RSDK.Cos256(angle) + self->position.y;65RSDK.DrawLine(prevX, prevY, x, y, color, self->alpha, self->inkEffect, false);6667prevX = x;68prevY = y;69}7071sin = self->radius * RSDK.Sin256(self->angle2) + (self->radiusOffset << 8);72RSDK.DrawLine(x, y, sin * RSDK.Sin256(self->angle) + self->position.x, sin * RSDK.Cos256(self->angle) + self->position.y, color, self->alpha,73self->inkEffect, false);74}7576void FXWaveRing_Create(void *data)77{78RSDK_THIS(FXWaveRing);7980if (!SceneInfo->inEditor) {81self->visible = true;82self->active = ACTIVE_NORMAL;83self->drawGroup = Zone->objectDrawGroup[1];8485self->radiusOffset = 48;86self->radius = 8;87self->angleVel = 2;88self->angleVel2 = 32;89self->angleInc = 150;90self->pointCount = 16;9192self->inkEffect = INK_ADD;93self->parent = (Entity *)data;94self->state = FXWaveRing_State_FadeIn;9596self->r = 0xF0;97self->g = 0xF0;98self->b = 0xF0;99}100}101102void FXWaveRing_StageLoad(void) {}103void FXWaveRing_State_FadeIn(void)104{105RSDK_THIS(FXWaveRing);106107if (self->alpha >= 0xC0) {108self->radiusOffset -= self->shrinkSpeed;109self->state = FXWaveRing_State_Wait;110}111else {112self->alpha += 0x08;113self->radiusOffset -= self->shrinkSpeed;114}115}116void FXWaveRing_State_Wait(void)117{118RSDK_THIS(FXWaveRing);119120if (self->timer > 0) {121if (!--self->timer)122self->state = FXWaveRing_State_FadeOut;123}124125self->radiusOffset -= self->shrinkSpeed;126}127void FXWaveRing_State_FadeOut(void)128{129RSDK_THIS(FXWaveRing);130131self->radiusOffset -= self->shrinkSpeed;132133if (self->alpha <= 0)134destroyEntity(self);135else136self->alpha -= 0x10;137}138139#if GAME_INCLUDE_EDITOR140void FXWaveRing_EditorDraw(void) {}141142void FXWaveRing_EditorLoad(void) {}143#endif144145void FXWaveRing_Serialize(void) {}146#endif147148149