Path: blob/master/SonicMania/Objects/Global/Debris.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Debris Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectDebris *Debris;1011void Debris_Update(void)12{13RSDK_THIS(Debris);1415if (self->delay <= 0) {16RSDK.ProcessAnimation(&self->animator);1718StateMachine_Run(self->state);1920if (self->drawFX & FX_ROTATE)21self->rotation = (self->rotation + self->rotSpeed) & 0x1FF;2223if (self->drawFX & FX_SCALE) {24if (self->scaleSpeed.x > 0 || self->scaleSpeed.y > 0) {25self->scale.x += self->scaleSpeed.x;26self->scale.y += self->scaleSpeed.y;2728if (self->scale.x < 0)29self->scale.x = 0;3031if (self->scale.y < 0)32self->scale.y = 0;33}34}35}36else37self->delay--;38}3940void Debris_LateUpdate(void) {}4142void Debris_StaticUpdate(void) {}4344void Debris_Draw(void)45{46RSDK_THIS(Debris);4748RSDK.DrawSprite(&self->animator, NULL, false);49}5051void Debris_Create(void *data)52{53RSDK_THIS(Debris);5455self->active = ACTIVE_NORMAL;56self->visible = true;57self->state = (Type_StateMachine)data;58}5960void Debris_StageLoad(void) {}6162void Debris_CreateFromEntries(int32 aniFrames, int32 *entries, int32 animationID)63{64RSDK_THIS(Debris);6566if (entries) {67int32 entryCount = *entries;68DebrisEntry *entry = (DebrisEntry *)&entries[1];6970self->drawFX = FX_FLIP;71for (int32 e = 0; e < entryCount; ++e) {72EntityDebris *debris = CREATE_ENTITY(Debris, (void *)Debris_State_FallAndFlicker, self->position.x, self->position.y);7374RSDK.SetSpriteAnimation(aniFrames, animationID, &debris->animator, true, entry->frame);75debris->direction = entry->direction;76debris->velocity = entry->velocity;77debris->gravityStrength = 0x3800;78debris->drawGroup = Zone->objectDrawGroup[1];79debris->updateRange.x = TO_FIXED(128);80debris->updateRange.y = TO_FIXED(128);8182entry++;83}84}85}8687void Debris_CreateFromEntries_UseOffset(int32 aniFrames, int32 *entries)88{89RSDK_THIS(Debris);9091if (entries) {92int32 entryCount = *entries;93DebrisOffsetEntry *entry = (DebrisOffsetEntry *)&entries[1];9495self->drawFX = FX_FLIP;96for (int32 e = 0; e < entryCount; ++e) {97int32 x = self->position.x + entry->offset.x;98int32 y = self->position.y + entry->offset.y;99EntityDebris *debris = CREATE_ENTITY(Debris, (void *)Debris_State_FallAndFlicker, x, y);100101RSDK.SetSpriteAnimation(aniFrames, 0, &debris->animator, true, entry->frame);102debris->direction = entry->direction;103debris->velocity = entry->velocity;104debris->gravityStrength = 0x3800;105debris->drawGroup = Zone->objectDrawGroup[1];106debris->updateRange.x = TO_FIXED(128);107debris->updateRange.y = TO_FIXED(128);108109entry++;110}111}112}113114void Debris_State_Move(void)115{116RSDK_THIS(Debris);117118self->position.x += self->velocity.x;119self->position.y += self->velocity.y;120121if (self->timer <= 0) {122if (!RSDK.CheckOnScreen(self, NULL))123destroyEntity(self);124}125else {126if (!--self->timer)127destroyEntity(self);128}129}130131void Debris_State_Fall(void)132{133RSDK_THIS(Debris);134135self->position.x += self->velocity.x;136self->position.y += self->velocity.y;137self->velocity.y += self->gravityStrength;138139if (self->timer <= 0) {140if (!RSDK.CheckOnScreen(self, NULL))141destroyEntity(self);142}143else {144if (!--self->timer)145destroyEntity(self);146}147}148149void Debris_State_FallAndFlicker(void)150{151RSDK_THIS(Debris);152153Debris_State_Fall(); // is this cheating154155self->visible = Zone->timer & 1;156}157158#if GAME_INCLUDE_EDITOR159void Debris_EditorDraw(void) {}160161void Debris_EditorLoad(void) {}162#endif163164void Debris_Serialize(void) {}165166167