Path: blob/master/SonicMania/Objects/FBZ/FBZSetup.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: FBZSetup Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89ObjectFBZSetup *FBZSetup;1011void FBZSetup_Update(void) {}1213void FBZSetup_LateUpdate(void) {}1415void FBZSetup_StaticUpdate(void)16{17if (!(Zone->timer & 1)) {18++FBZSetup->cylinderAniFrame;19FBZSetup->cylinderAniFrame &= 7;2021if (Zone->actID == 1) // Cylinder H (left cylinder on the sheet)22RSDK.DrawAniTiles(FBZSetup->aniTiles, 381, 0, 16 * FBZSetup->cylinderAniFrame, 256, 16);2324// Cylinder V (right cylinder on the sheet)25RSDK.DrawAniTiles(FBZSetup->aniTiles, 401, 16 * (FBZSetup->cylinderAniFrame + 16), 0, 16, 126);26}2728if (!(Zone->timer & 3)) {29++FBZSetup->propellerShaftAniFrameUnused;30FBZSetup->propellerShaftAniFrameUnused &= 3;3132++FBZSetup->propellerShaftAniFrame;33FBZSetup->propellerShaftAniFrame &= 7;3435++FBZSetup->spiralPlatformAniFrame;36FBZSetup->spiralPlatformAniFrame %= 6;3738// Propeller Shaft AniTiles (unused?, these don't match propellers, just some clouds)39RSDK.DrawAniTiles(FBZSetup->aniTiles, 377, 16 * (FBZSetup->propellerShaftAniFrameUnused + 24), 16, 16, 32);4041// Propeller Shaft AniTiles42RSDK.DrawAniTiles(FBZSetup->aniTiles, 379, 16 * (FBZSetup->propellerShaftAniFrame + 24), 0, 16, 32);4344// Spiral Platform AniTiles (unused in-game)45RSDK.DrawAniTiles(FBZSetup->aniTiles, 397, 384, 16 * (FBZSetup->spiralPlatformAniFrame + 2), 64, 16);46}4748RSDK.GetTileLayer(FBZSetup->backgroundOutside)->scrollPos = (RSDK.Sin512(Zone->persistentTimer) + 512) << 10;49}5051void FBZSetup_Draw(void) {}5253void FBZSetup_Create(void *data) {}5455void FBZSetup_StageLoad(void)56{57FBZSetup->aniTiles = RSDK.LoadSpriteSheet("FBZ/AniTiles.gif", SCOPE_STAGE);5859FBZSetup->backgroundOutside = RSDK.GetTileLayerID("Background Outside");6061Animals->animalTypes[0] = ANIMAL_FLICKY;62Animals->animalTypes[1] = ANIMAL_RICKY;6364BGSwitch->switchCallback[FBZ_BG_INSIDE1] = FBZSetup_BGSwitch_ShowInside1;65BGSwitch->switchCallback[FBZ_BG_INSIDE2] = FBZSetup_BGSwitch_ShowInside2;66BGSwitch->switchCallback[FBZ_BG_INSIDE1_NOSTORM] = FBZSetup_BGSwitch_ShowInside1_NoStorm;6768TileLayer *backgroundInside = RSDK.GetTileLayer(0);69backgroundInside->drawGroup[0] = 0;70backgroundInside->drawGroup[1] = 0;71backgroundInside->drawGroup[2] = 0;72backgroundInside->drawGroup[3] = 0;73if (!Zone->actID)74backgroundInside->scanlineCallback = FBZSetup_Scanline_BGInside;7576int32 ang = -336;77int32 scanlineY = 0;78for (int32 i = 0; i < 0x400; ++i) {79FBZSetup->scanlineDeformX[i] = 32 * (abs(RSDK.Sin1024(ang >> 1)) + 0x400);80FBZSetup->positionYMove[i] = 32 * (abs(RSDK.Cos1024(ang >> 1)) + 0x800);8182FBZSetup->scanlinePosY[i] = scanlineY & 0x1FF0000;83ang += 3;84scanlineY += FBZSetup->positionYMove[i];85}8687// Yeah, this is actually here in the original88// This (& the one in MSZSpotlight) is how I found out about what these funcs do LOL89RSDK_ACTIVE_VAR(GenericTrigger, triggerID);90RSDK_ENUM_VAR("Show Exterior", FBZ_GENERICTRIGGER_EXTERIOR);91RSDK_ENUM_VAR("Show Interior", FBZ_GENERICTRIGGER_INTERIOR);9293GenericTrigger->callbacks[FBZ_GENERICTRIGGER_EXTERIOR] = FBZSetup_Trigger_ShowExterior;94GenericTrigger->callbacks[FBZ_GENERICTRIGGER_INTERIOR] = FBZSetup_Trigger_ShowInterior;9596if (globals->gameMode == MODE_COMPETITION) {97foreach_all(ParallaxSprite, parallaxSprite) { destroyEntity(parallaxSprite); }98}99100if (isMainGameMode() && CutsceneRules_IsAct1()) {101foreach_all(FBZ1Outro, outro)102{103Zone->shouldRecoverPlayers = true;104FBZSetup->outro = outro;105foreach_break;106}107Zone->stageFinishCallback = FBZSetup_StageFinish_EndAct1;108}109110if (isMainGameMode() && globals->atlEnabled && !CutsceneRules_CheckStageReload()) {111FBZSetup_ActTransitionLoad();112}113114#if MANIA_USE_PLUS115if (isMainGameMode() && CutsceneRules_IsAct2())116Zone->stageFinishCallback = FBZSetup_StageFinish_EndAct2;117118if ((SceneInfo->filter & FILTER_ENCORE)) {119RSDK.LoadPalette(0, "EncoreFBZ.act", 0b0000000011111111);120RSDK.CopyPalette(0, 1, 1, 1, 0b0000000011111111);121RSDK.LoadPalette(2, "EncoreFBZs.act", 0b0000000011111111);122RSDK.LoadPalette(3, "EncoreFBZf.act", 0b0000000011111111);123RSDK.LoadPalette(4, "EncoreFBZi.act", 0b0000000011111111);124}125#endif126}127128void FBZSetup_ActTransitionLoad(void)129{130Zone_ReloadStoredEntities(WIDE_SCR_XCENTER << 16, 4324 << 16, false);131Zone->cameraBoundsL[0] = 0;132Zone->cameraBoundsB[0] = 4324;133Zone->cameraBoundsL[1] = 0;134Zone->cameraBoundsB[1] = 4324;135Zone->cameraBoundsL[2] = 0;136Zone->cameraBoundsB[2] = 4324;137Zone->cameraBoundsL[3] = 0;138Zone->cameraBoundsB[3] = 4324;139140int32 id = 0;141TileLayer *layer = RSDK.GetTileLayer(2);142for (int32 i = 0; i < layer->scrollInfoCount; ++i) {143layer->scrollInfo[i].scrollPos = globals->parallaxOffset[id++];144}145146foreach_all(ParallaxSprite, parallaxSprite) { parallaxSprite->scrollPos.x = globals->parallaxOffset[id++]; }147}148149void FBZSetup_AddDynamicBG(ScanlineInfo *scanlines, int32 parallaxFactorX, int32 parallaxFactorY, int32 startLine, int32 lineCount, int32 sourcePosY)150{151RSDKScreenInfo *screen = &ScreenInfo[SceneInfo->currentScreenID];152153int32 scanlineX = (parallaxFactorX * screen->position.x) << 8;154int32 screenY = (parallaxFactorY * screen->position.y) >> 8;155156int32 start = startLine - screenY;157int32 end = start + lineCount;158159if (start < SCREEN_YSIZE && end > 0) {160end = MIN(end, SCREEN_YSIZE);161162// sourcePosY = start layer line163int32 scanlineY = sourcePosY;164if (start < 0) {165scanlineY = sourcePosY - (start << 16);166start = 0;167}168169ScanlineInfo *scanlinePtr = &scanlines[start];170int32 count = end - start;171for (int32 i = 0; i < count; ++i) {172scanlinePtr->position.x = scanlineX;173scanlinePtr->position.y = scanlineY;174scanlinePtr->deform.x = 0x10000;175176++scanlinePtr;177scanlineY += 0x10000;178}179}180}181182void FBZSetup_Scanline_BGInside(ScanlineInfo *scanlines)183{184RSDKScreenInfo *screen = &ScreenInfo[SceneInfo->currentScreenID];185int32 y = screen->position.y >> 3;186187// Handle the cool deformation on the BG Inside layer188ScanlineInfo *scanlinePtr = scanlines;189for (int32 i = 0; i < SCREEN_YSIZE; ++i) {190int32 pos = (i + y) & 0x3FF;191scanlinePtr->deform.x = FBZSetup->scanlineDeformX[pos];192scanlinePtr->deform.y = 0;193scanlinePtr->position.x = ((screen->position.x << 14) - FBZSetup->scanlineDeformX[pos] * screen->center.x) & 0xFFFF8000;194scanlinePtr->position.y = FBZSetup->scanlinePosY[pos];195++scanlinePtr;196}197198// Add Other bits of the layer to overlay so it's not so barren199FBZSetup_AddDynamicBG(scanlines, 128, 32, 0, 112, 576 << 16);200FBZSetup_AddDynamicBG(scanlines, 128, 32, 456, 128, 512 << 16);201FBZSetup_AddDynamicBG(scanlines, 112, 64, 420, 16, 816 << 16);202FBZSetup_AddDynamicBG(scanlines, 144, 80, 640, 48, 768 << 16);203FBZSetup_AddDynamicBG(scanlines, 160, 96, 512, 64, 704 << 16);204}205206void FBZSetup_BGSwitch_ShowInside1(void)207{208RSDK.GetTileLayer(0)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;209210if (Zone->actID == 1) {211RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;212RSDK.GetTileLayer(3)->drawGroup[BGSwitch->screenID] = 0;213}214else {215RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = 0;216}217}218219void FBZSetup_BGSwitch_ShowInside2(void)220{221RSDK.GetTileLayer(0)->drawGroup[BGSwitch->screenID] = 0;222223if (Zone->actID == 1) {224RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = 0;225RSDK.GetTileLayer(2)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;226RSDK.GetTileLayer(3)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;227}228else {229RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;230}231}232233void FBZSetup_BGSwitch_ShowInside1_NoStorm(void)234{235RSDK.GetTileLayer(0)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;236237if (Zone->actID == 1) {238RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = DRAWGROUP_COUNT;239RSDK.GetTileLayer(2)->drawGroup[BGSwitch->screenID] = 0;240}241else {242RSDK.GetTileLayer(1)->drawGroup[BGSwitch->screenID] = 0;243}244}245246void FBZSetup_Trigger_ShowExterior(void)247{248int32 id = (2 * (Zone->actID != 0) + 3);249RSDK.GetTileLayer(id)->drawGroup[GenericTrigger->playerID] = DRAWGROUP_COUNT;250RSDK.GetTileLayer(id + 1)->drawGroup[GenericTrigger->playerID] = 6;251252foreach_active(ParallaxSprite, parallaxSprite)253{254if (!parallaxSprite->visible) {255parallaxSprite->visible = true;256parallaxSprite->state = ParallaxSprite_State_FadeIntoHalf;257}258}259}260261void FBZSetup_Trigger_ShowInterior(void)262{263int32 id = (2 * (Zone->actID != 0) + 3);264RSDK.GetTileLayer(id)->drawGroup[GenericTrigger->playerID] = 6;265RSDK.GetTileLayer(id + 1)->drawGroup[GenericTrigger->playerID] = DRAWGROUP_COUNT;266267foreach_active(ParallaxSprite, parallaxSprite) { parallaxSprite->state = ParallaxSprite_State_FadeOut; }268}269270void FBZSetup_StageFinish_EndAct1(void) { FBZSetup->outro->active = ACTIVE_NORMAL; }271#if MANIA_USE_PLUS272void FBZSetup_StageFinish_EndAct2(void) { CREATE_ENTITY(FBZ2Outro, NULL, 0, 0); }273#endif274275#if GAME_INCLUDE_EDITOR276void FBZSetup_EditorDraw(void) {}277278void FBZSetup_EditorLoad(void)279{280RSDK_ACTIVE_VAR(GenericTrigger, triggerID);281RSDK_ENUM_VAR("Show Exterior", FBZ_GENERICTRIGGER_EXTERIOR);282RSDK_ENUM_VAR("Show Interior", FBZ_GENERICTRIGGER_INTERIOR);283284RSDK_ACTIVE_VAR(BGSwitch, bgID);285RSDK_ENUM_VAR("Show Inside 1", FBZ_BG_INSIDE1);286RSDK_ENUM_VAR("Show Inside 2", FBZ_BG_INSIDE2);287RSDK_ENUM_VAR("Show Inside 1 (No Storm)", FBZ_BG_INSIDE1_NOSTORM);288289RSDK_ACTIVE_VAR(Decoration, type);290RSDK_ENUM_VAR("Blueprint 1", FBZ_DECORATION_BLUEPRINT1);291RSDK_ENUM_VAR("Blueprint 2", FBZ_DECORATION_BLUEPRINT2);292293RSDK_ACTIVE_VAR(ParallaxSprite, aniID);294RSDK_ENUM_VAR("Clouds", FBZ_PARALLAXSPRITE_CLOUDS);295}296#endif297298void FBZSetup_Serialize(void) {}299300301