Path: blob/master/SonicMania/Objects/Pinball/PBL_Setup.c
338 views
// ---------------------------------------------------------------------1// RSDK Project: Sonic Mania2// Object Description: PBL_Setup Object3// Object Author: Christian Whitehead/Simon Thomley/Hunter Bridges4// Decompiled by: Rubberduckycooly & RMGRich5// ---------------------------------------------------------------------67#include "Game.h"89#if MANIA_USE_PLUS10ObjectPBL_Setup *PBL_Setup;1112void PBL_Setup_Update(void)13{14RSDK_THIS(PBL_Setup);1516StateMachine_Run(self->state);1718if (self->state != PBL_Setup_SaveAndChangeScene && globals->gameMode < MODE_TIMEATTACK)19++SaveGame_GetSaveRAM()->zoneTimes[28];20}2122void PBL_Setup_LateUpdate(void) {}2324void PBL_Setup_StaticUpdate(void)25{26RSDK_THIS_GEN();2728++PBL_Setup->timer;29PBL_Setup->timer &= 0x7FFF;3031if (!(PBL_Setup->timer & 1)) {32++PBL_Setup->ringFrame;33PBL_Setup->ringFrame &= 0xF;34}3536if (!(PBL_Setup->timer & 0xF)) {37for (int32 i = 0; i < 8; ++i) {38RSDK.RotatePalette(i, 176, 181, true);39RSDK.RotatePalette(i, 176, 181, true);40}41}4243PBL_Setup->scanlineTimer += 0x8000;44PBL_Setup->scanlineTimer &= 0x7FFFFFFF;4546if ((ControllerInfo->keyStart.press || Unknown_pausePress) && SceneInfo->state == ENGINESTATE_REGULAR47&& !RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu)->classID) {48RSDK.ResetEntitySlot(SLOT_PAUSEMENU, PauseMenu->classID, NULL);4950EntityPauseMenu *pauseMenu = RSDK_GET_ENTITY(SLOT_PAUSEMENU, PauseMenu);51pauseMenu->disableRestart = true;52pauseMenu->triggerPlayer = RSDK.GetEntitySlot(self);53}54}5556void PBL_Setup_Draw(void)57{58RSDK_THIS(PBL_Setup);5960RSDK.FillScreen(self->color, self->timer, self->timer - 128, self->timer - 256);61}6263void PBL_Setup_Create(void *data)64{65RSDK_THIS(PBL_Setup);6667self->active = ACTIVE_NORMAL;68self->visible = true;69self->drawGroup = DRAWGROUP_COUNT - 1;70self->color = 0xF0F0F0;71self->timer = 512;7273self->state = PBL_Setup_State_FadeIn;74}7576void PBL_Setup_StageLoad(void)77{78PBL_Setup->tableLow = RSDK.GetTileLayerID("Table Low");79PBL_Setup->tableHigh = RSDK.GetTileLayerID("Table High");8081PBL_Setup->rings = 0;82PBL_Setup->sectorID = 0;83PBL_Setup->sectorCount = 0;84PBL_Setup->score = 0;85PBL_Setup->score1UP = 10000;8687RSDK.GetTileLayer(PBL_Setup->tableLow)->scanlineCallback = PBL_Setup_Scanline_TableLow;88RSDK.GetTileLayer(PBL_Setup->tableHigh)->scanlineCallback = PBL_Setup_Scanline_TableHigh;89RSDK.GetTileLayer(1)->scanlineCallback = PBL_Setup_Scanline_PinballBG;9091RSDK.SetDrawGroupProperties(1, false, PBL_Setup_DrawHook_PrepareDrawingFX);92RSDK.SetDrawGroupProperties(3, false, PBL_Setup_DrawHook_PrepareDrawingFX);93RSDK.SetDrawGroupProperties(4, true, StateMachine_None);9495RSDK.SetLimitedFade(1, 0, 7, 36, 0, 255);96RSDK.SetLimitedFade(2, 0, 7, 72, 0, 255);97RSDK.SetLimitedFade(3, 0, 7, 108, 0, 255);98RSDK.SetLimitedFade(4, 0, 7, 144, 0, 255);99RSDK.SetLimitedFade(5, 0, 7, 180, 0, 255);100RSDK.SetLimitedFade(6, 0, 7, 216, 0, 255);101102RSDK.ResetEntitySlot(SLOT_PBL_SETUP, PBL_Setup->classID, NULL);103104PBL_Setup->sfxContinue = RSDK.GetSfx("Special/Continue.wav");105}106107void PBL_Setup_Scanline_TableLow(ScanlineInfo *scanlines)108{109EntityPBL_Camera *camera = RSDK_GET_ENTITY(SLOT_PBL_CAMERA, PBL_Camera);110RSDK.SetClipBounds(0, 0, camera->centerY, ScreenInfo->size.x, ScreenInfo->size.y);111112int32 sin = RSDK.Sin1024(camera->angle) >> 2;113int32 cos = RSDK.Cos1024(camera->angle) >> 2;114int32 negSin = RSDK.Sin1024(-camera->rotationY) >> 2;115int32 negCos = RSDK.Cos1024(-camera->rotationY) >> 2;116int32 cosVal = -ScreenInfo->center.y * negCos;117118for (int32 i = -ScreenInfo->center.y; i < ScreenInfo->center.y; ++i) {119int32 div = negSin + (cosVal >> 8);120if (!div)121div = 1;122123int32 mult = camera->worldY / div;124scanlines->deform.x = -(cos * mult) >> 8;125scanlines->deform.y = sin * mult >> 8;126127int32 pos = (negCos * mult >> 8) - (negSin * (i * mult >> 8) >> 8);128RSDK.SetActivePalette(CLAMP((abs(pos) >> 12) - 27, 0, 7), i + 120, i + 121);129130scanlines->position.x = (sin * pos - ScreenInfo->center.x * scanlines->deform.x) + camera->position.x;131scanlines->position.y = (cos * pos - ScreenInfo->center.x * scanlines->deform.y) + camera->position.y;132133cosVal += negCos;134scanlines++;135}136}137void PBL_Setup_Scanline_TableHigh(ScanlineInfo *scanlines)138{139EntityPBL_Camera *camera = RSDK_GET_ENTITY(SLOT_PBL_CAMERA, PBL_Camera);140RSDK.SetClipBounds(0, 0, camera->centerY, ScreenInfo->size.x, ScreenInfo->size.y);141142int32 sin = RSDK.Sin1024(camera->angle) >> 2;143int32 cos = RSDK.Cos1024(camera->angle) >> 2;144int32 negSin = RSDK.Sin1024(-camera->rotationY) >> 2;145int32 negCos = RSDK.Cos1024(-camera->rotationY) >> 2;146int32 cosVal = -ScreenInfo->center.y * negCos;147148for (int32 i = -ScreenInfo->center.y; i < ScreenInfo->center.y; ++i) {149int32 div = negSin + (cosVal >> 8);150if (!div)151div = 1;152153int32 mult = (camera->worldY - 0x100000) / div;154scanlines->deform.x = -(cos * mult) >> 8;155scanlines->deform.y = sin * mult >> 8;156157int32 pos = (negCos * mult >> 8) - (negSin * (i * mult >> 8) >> 8);158RSDK.SetActivePalette(CLAMP((abs(pos) >> 12) - 24, 0, 7), i + 120, i + 121);159160scanlines->position.x = (sin * pos - ScreenInfo->center.x * scanlines->deform.x) + camera->position.x;161scanlines->position.y = (cos * pos - ScreenInfo->center.x * scanlines->deform.y) + camera->position.y;162163cosVal += negCos;164scanlines++;165}166}167void PBL_Setup_Scanline_PinballBG(ScanlineInfo *scanlines)168{169RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, 112);170171int32 x = 116 << 16;172int32 centerX = ScreenInfo->center.x;173int32 sin = RSDK.Sin256(32);174int32 cos = RSDK.Cos256(32);175int32 timer = PBL_Setup->scanlineTimer >> 1;176177int32 clr = 0;178for (int32 i = 160; i > 40; --i) {179x += 0xE000;180int32 id = x / (8 * i);181182scanlines->deform.x = -(cos * id) >> 7;183scanlines->deform.y = sin * id >> 7;184scanlines->position.x = timer + sin * id - centerX * scanlines->deform.x;185scanlines->position.y = timer + cos * id - centerX * (sin * id >> 7);186187RSDK.SetActivePalette(CLAMP((abs(id) >> 11) - 16, 0, 7), clr, clr + 1);188189scanlines++;190++clr;191}192}193194void PBL_Setup_DrawHook_PrepareDrawingFX(void)195{196RSDK.SetClipBounds(0, 0, 0, ScreenInfo->size.x, ScreenInfo->size.y);197RSDK.SetActivePalette(0, 0, ScreenInfo->size.y);198}199200void PBL_Setup_ExitPinball(void)201{202EntityPBL_Setup *setup = RSDK_GET_ENTITY(SLOT_BSS_SETUP, PBL_Setup);203setup->visible = true;204setup->state = PBL_Setup_SaveAndChangeScene;205setup->color = 0x000000;206207Music_FadeOut(0.025);208209PauseMenu->disableEvents = true;210int32 oldScore = globals->restartScore;211globals->restartScore += PBL_Setup->score;212if (globals->restartScore > 9999999 || globals->restartScore < oldScore)213globals->restartScore = 9999999;214215while (globals->restartScore1UP < globals->restartScore) globals->restartScore1UP += 50000;216}217218void PBL_Setup_GiveScore(int32 score)219{220PBL_Setup->score += score;221if (PBL_Setup->score > 9999999)222PBL_Setup->score = 9999999;223224if (PBL_Setup->score > PBL_Setup->score1UP) {225RSDK.PlaySfx(PBL_Setup->sfxContinue, false, 255);226227SaveRAM *saveRAM = SaveGame_GetSaveRAM();228if (saveRAM->continues < 20)229saveRAM->continues++;230231while (PBL_Setup->score1UP <= PBL_Setup->score) PBL_Setup->score1UP += 10000;232233foreach_active(PBL_HUD, hud) { PBL_HUD_DisplayMessage(hud, "!CONTINUE!", PBL_HUD_MSG_SCROLL_LEFT); }234}235}236237void PBL_Setup_GiveLife(void)238{239SaveRAM *saveRAM = SaveGame_GetSaveRAM();240241if (globals->gameMode != MODE_TIMEATTACK && globals->gameMode != MODE_ENCORE) {242if (saveRAM->lives < 99)243saveRAM->lives++;244245Music_PlayJingle(TRACK_1UP);246}247}248249void PBL_Setup_State_FadeIn(void)250{251RSDK_THIS(PBL_Setup);252253if (self->timer <= 0) {254self->timer = 0;255self->visible = false;256self->state = PBL_Setup_State_ManageStageExit;257258SceneInfo->timeEnabled = true;259}260else {261self->timer -= 16;262}263}264265void PBL_Setup_State_ManageStageExit(void)266{267EntityPBL_Camera *camera = RSDK_GET_ENTITY(SLOT_PBL_CAMERA, PBL_Camera);268269foreach_active(PBL_Player, player)270{271if (player->position.y > camera->curCamBoundaryB + 0x400000) {272PBL_Setup_ExitPinball();273player->state = StateMachine_None;274}275}276}277278void PBL_Setup_SaveAndChangeScene(void)279{280RSDK_THIS(PBL_Setup);281282if (self->timer >= 1024) {283SaveRAM *saveRAM = SaveGame_GetSaveRAM();284if (saveRAM) {285saveRAM->characterFlags = globals->characterFlags;286saveRAM->stock = globals->stock;287saveRAM->playerID = globals->playerID;288289if (globals->gameMode == MODE_ENCORE)290RSDK.SetScene("Encore Mode", "");291else292RSDK.SetScene("Mania Mode", "");293294SceneInfo->listPos = saveRAM->storedStageID;295}296else {297RSDK.SetScene("Presentation", "Title Screen");298}299300RSDK.LoadScene();301}302else {303self->timer += 16;304}305}306307#if GAME_INCLUDE_EDITOR308void PBL_Setup_EditorDraw(void) {}309310void PBL_Setup_EditorLoad(void) {}311#endif312313void PBL_Setup_Serialize(void) {}314#endif315316317