Path: blob/master/SonicMania/Objects/Common/Decoration.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: Decoration Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectDecoration *Decoration;1011void Decoration_Update(void)12{13RSDK_THIS(Decoration);1415RSDK.ProcessAnimation(&self->animator);1617self->rotation = (self->rotation + self->rotSpeed) & 0x1FF;18}1920void Decoration_LateUpdate(void) {}2122void Decoration_StaticUpdate(void) {}2324void Decoration_Draw(void)25{26RSDK_THIS(Decoration);2728if (self->additive) {29RSDK.CopyPalette(0, 160, 1, 160, 16);30RSDK.CopyPalette(2, 160, 0, 160, 16);31}3233Decoration_DrawSprite();3435if (self->additive)36RSDK.CopyPalette(1, 160, 0, 160, 16);37}3839void Decoration_Create(void *data)40{41RSDK_THIS(Decoration);4243self->drawFX = FX_FLIP;44if (!SceneInfo->inEditor) {45self->active = ACTIVE_BOUNDS;46self->visible = true;4748if (self->rotSpeed)49self->drawFX |= FX_ROTATE;5051if (RSDK.CheckSceneFolder("TMZ1") || RSDK.CheckSceneFolder("TMZ2"))52self->additive = true;5354if (self->additive) {55self->inkEffect |= INK_ADD;56self->alpha = 0xE0;57}5859self->updateRange.x = TO_FIXED(128);60self->updateRange.y = TO_FIXED(128);61RSDK.SetSpriteAnimation(Decoration->aniFrames, self->type, &self->animator, true, 0);6263if (RSDK.GetFrameID(&self->animator)) // ideally use 'h'64self->drawGroup = Zone->objectDrawGroup[1];65else66self->drawGroup = Zone->objectDrawGroup[0];67}68}6970void Decoration_StageLoad(void)71{72if (RSDK.CheckSceneFolder("GHZ"))73Decoration->aniFrames = RSDK.LoadSpriteAnimation("GHZ/Decoration.bin", SCOPE_STAGE);74else if (RSDK.CheckSceneFolder("CPZ"))75Decoration->aniFrames = RSDK.LoadSpriteAnimation("CPZ/Decoration.bin", SCOPE_STAGE);76else if (RSDK.CheckSceneFolder("SPZ1"))77Decoration->aniFrames = RSDK.LoadSpriteAnimation("SPZ1/Decoration.bin", SCOPE_STAGE);78else if (RSDK.CheckSceneFolder("FBZ"))79Decoration->aniFrames = RSDK.LoadSpriteAnimation("FBZ/Decoration.bin", SCOPE_STAGE);80else if (RSDK.CheckSceneFolder("SSZ1") || RSDK.CheckSceneFolder("SSZ2"))81Decoration->aniFrames = RSDK.LoadSpriteAnimation("SSZ/Decoration.bin", SCOPE_STAGE);82else if (RSDK.CheckSceneFolder("MMZ1") || RSDK.CheckSceneFolder("MMZ2"))83Decoration->aniFrames = RSDK.LoadSpriteAnimation("MMZ/Decoration.bin", SCOPE_STAGE);84else if (RSDK.CheckSceneFolder("MSZ"))85Decoration->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Decoration.bin", SCOPE_STAGE);86#if MANIA_USE_PLUS87else if (RSDK.CheckSceneFolder("MSZEnding"))88Decoration->aniFrames = RSDK.LoadSpriteAnimation("MSZ/Ending.bin", SCOPE_STAGE);89#endif90else if (RSDK.CheckSceneFolder("HCZ"))91Decoration->aniFrames = RSDK.LoadSpriteAnimation("HCZ/Decoration.bin", SCOPE_STAGE);92else if (RSDK.CheckSceneFolder("TMZ1") || RSDK.CheckSceneFolder("TMZ2"))93Decoration->aniFrames = RSDK.LoadSpriteAnimation("TMZ1/Decoration.bin", SCOPE_STAGE);94else if (RSDK.CheckSceneFolder("TMZ3"))95Decoration->aniFrames = RSDK.LoadSpriteAnimation("Phantom/Decoration.bin", SCOPE_STAGE);96else if (RSDK.CheckSceneFolder("AIZ"))97Decoration->aniFrames = RSDK.LoadSpriteAnimation("AIZ/Decoration.bin", SCOPE_STAGE);98}99100void Decoration_DrawSprite(void)101{102RSDK_THIS(Decoration);103104Vector2 drawPos, repeat;105106repeat.x = FROM_FIXED(self->repeatTimes.x);107repeat.y = FROM_FIXED(self->repeatTimes.y);108drawPos.x = self->position.x - ((repeat.x * self->repeatSpacing.x) >> 1);109drawPos.y = self->position.y - ((repeat.y * self->repeatSpacing.y) >> 1);110111for (int32 y = 0; y <= repeat.y; ++y) {112drawPos.x = self->position.x - (repeat.x * self->repeatSpacing.x >> 1);113for (int32 x = 0; x <= repeat.x; ++x) {114RSDK.DrawSprite(&self->animator, &drawPos, false);115drawPos.x += self->repeatSpacing.x;116}117drawPos.y += self->repeatSpacing.y;118}119}120121#if GAME_INCLUDE_EDITOR122void Decoration_EditorDraw(void)123{124RSDK_THIS(Decoration);125126RSDK.SetSpriteAnimation(Decoration->aniFrames, self->type, &self->animator, true, 0);127128if (self->rotSpeed)129self->drawFX |= FX_ROTATE;130else131self->drawFX &= ~FX_ROTATE;132133Decoration_DrawSprite();134}135136void Decoration_EditorLoad(void)137{138Decoration_StageLoad();139140RSDK_ACTIVE_VAR(Decoration, direction);141RSDK_ENUM_VAR("No Flip", FLIP_NONE);142RSDK_ENUM_VAR("Flip X", FLIP_X);143RSDK_ENUM_VAR("Flip Y", FLIP_Y);144RSDK_ENUM_VAR("Flip XY", FLIP_XY);145}146#endif147148void Decoration_Serialize(void)149{150RSDK_EDITABLE_VAR(Decoration, VAR_UINT8, type);151RSDK_EDITABLE_VAR(Decoration, VAR_UINT8, direction);152RSDK_EDITABLE_VAR(Decoration, VAR_ENUM, rotSpeed);153RSDK_EDITABLE_VAR(Decoration, VAR_VECTOR2, repeatTimes);154RSDK_EDITABLE_VAR(Decoration, VAR_VECTOR2, repeatSpacing);155}156157158