Path: blob/master/SonicMania/Objects/Title/TitleBG.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: TitleBG Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectTitleBG *TitleBG;1011void TitleBG_Update(void)12{13RSDK_THIS(TitleBG);1415if (self->type == TITLEBG_WINGSHINE) {16self->position.y += 0x10000;1718++self->timer;19if (self->timer == 32) {20self->timer = 0;21self->position.y -= 0x200000;22}23}24else {25self->position.x -= 0x10000;26if (self->position.x < -0x800000)27self->position.x += 0x3000000;28}29}3031void TitleBG_LateUpdate(void) {}3233void TitleBG_StaticUpdate(void)34{35TitleBG->timer += 0x8000;36TitleBG->timer &= 0x7FFFFFFF;3738++TitleBG->angle;39TitleBG->angle &= 0x3FF;4041if (++TitleBG->palTimer == 6) {42TitleBG->palTimer = 0;43RSDK.RotatePalette(0, 140, 143, false);44}45}4647void TitleBG_Draw(void)48{49RSDK_THIS(TitleBG);5051RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, ScreenInfo->size.y);52RSDK.DrawSprite(&self->animator, NULL, false);53}5455void TitleBG_Create(void *data)56{57RSDK_THIS(TitleBG);5859if (!SceneInfo->inEditor) {60RSDK.SetSpriteAnimation(TitleBG->aniFrames, self->type, &self->animator, true, 0);6162self->active = ACTIVE_NORMAL;63self->visible = false;64self->drawGroup = 1;65self->alpha = 0xFF;66self->drawFX = FX_FLIP;6768switch (self->type) {69case TITLEBG_MOUNTAIN2: self->inkEffect = INK_BLEND; break;7071case TITLEBG_REFLECTION:72case TITLEBG_WATERSPARKLE:73self->inkEffect = INK_ADD;74self->alpha = 0x80;75break;7677case TITLEBG_WINGSHINE:78self->drawGroup = 4;79self->inkEffect = INK_MASKED;80break;81default: break;82}83}84}8586void TitleBG_StageLoad(void)87{88TitleBG->aniFrames = RSDK.LoadSpriteAnimation("Title/Background.bin", SCOPE_STAGE);8990RSDK.SetPaletteEntry(0, 55, 0x202030);91}9293void TitleBG_SetupFX(void)94{95RSDK.GetTileLayer(0)->drawGroup[0] = DRAWGROUP_COUNT;96RSDK.GetTileLayer(1)->drawGroup[0] = 0;9798TileLayer *cloudLayer = RSDK.GetTileLayer(2);99cloudLayer->drawGroup[0] = 0;100cloudLayer->scanlineCallback = TitleBG_Scanline_Clouds;101102TileLayer *islandLayer = RSDK.GetTileLayer(3);103islandLayer->drawGroup[0] = 1;104islandLayer->scanlineCallback = TitleBG_Scanline_Island;105106foreach_all(TitleBG, titleBG) { titleBG->visible = true; }107foreach_all(Title3DSprite, title3DSprite) { title3DSprite->visible = true; }108109RSDK.SetPaletteEntry(0, 55, 0x00FF00);110RSDK.SetPaletteMask(0x00FF00);111RSDK.SetDrawGroupProperties(2, true, StateMachine_None);112}113114void TitleBG_Scanline_Clouds(ScanlineInfo *scanlines)115{116RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, SCREEN_YSIZE / 2);117118int32 sine = RSDK.Sin256(0);119int32 cosine = RSDK.Cos256(0);120121int32 off = 0x1000000;122for (int32 i = 0xA0; i > 0x20; --i) {123int32 id = off / (8 * i);124int32 sin = sine * id;125int32 cos = cosine * id;126127scanlines->deform.x = (-cos >> 7);128scanlines->deform.y = sin >> 7;129scanlines->position.x = sin - ScreenInfo->center.x * (-cos >> 7);130scanlines->position.y = TitleBG->timer + 2 * cos - ScreenInfo->center.x * (sin >> 7);131132off -= 0x4000;133scanlines++;134}135}136137void TitleBG_Scanline_Island(ScanlineInfo *scanlines)138{139RSDK.SetClipBounds(0, 0, 168, ScreenInfo->size.x, SCREEN_YSIZE);140141int32 sine = RSDK.Sin1024(-TitleBG->angle) >> 2;142int32 cosine = RSDK.Cos1024(-TitleBG->angle) >> 2;143144ScanlineInfo *scanlinePtr = &scanlines[168];145for (int32 i = 16; i < 88; ++i) {146int32 id = 0xA00000 / (8 * i);147int32 sin = sine * id;148int32 cos = cosine * id;149150scanlinePtr->deform.y = sin >> 7;151scanlinePtr->deform.x = -cos >> 7;152scanlinePtr->position.y = cos - ScreenInfo->center.x * scanlinePtr->deform.y - 0xA000 * cosine + 0x2000000;153scanlinePtr->position.x = sin - ScreenInfo->center.x * scanlinePtr->deform.x - 0xA000 * sine + 0x2000000;154++scanlinePtr;155}156}157158#if GAME_INCLUDE_EDITOR159void TitleBG_EditorDraw(void)160{161RSDK_THIS(TitleBG);162163RSDK.SetSpriteAnimation(TitleBG->aniFrames, self->type, &self->animator, true, 0);164self->alpha = 0xFF;165self->drawFX = FX_FLIP;166self->inkEffect = INK_NONE;167168switch (self->type) {169case TITLEBG_MOUNTAIN2: self->inkEffect = INK_BLEND; break;170171case TITLEBG_REFLECTION:172case TITLEBG_WATERSPARKLE:173self->inkEffect = INK_ADD;174self->alpha = 0x80;175break;176177case TITLEBG_WINGSHINE:178self->drawGroup = 4;179self->inkEffect = INK_MASKED;180break;181182default: break;183}184185RSDK.DrawSprite(&self->animator, NULL, false);186}187188void TitleBG_EditorLoad(void)189{190TitleBG->aniFrames = RSDK.LoadSpriteAnimation("Title/Background.bin", SCOPE_STAGE);191192RSDK_ACTIVE_VAR(TitleBG, type);193RSDK_ENUM_VAR("Mountain Top 1", TITLEBG_MOUNTAIN1);194RSDK_ENUM_VAR("Mountain Top 2", TITLEBG_MOUNTAIN2);195RSDK_ENUM_VAR("Reflection", TITLEBG_REFLECTION);196RSDK_ENUM_VAR("Water Sparkle", TITLEBG_WATERSPARKLE);197RSDK_ENUM_VAR("Wing Shine", TITLEBG_WINGSHINE);198}199#endif200201void TitleBG_Serialize(void) { RSDK_EDITABLE_VAR(TitleBG, VAR_ENUM, type); }202203204