Path: blob/main/RSDKv4/NativeObjects/PlayerSelectScreen.cpp
817 views
#include "RetroEngine.hpp"12void PlayerSelectScreen_Create(void *objPtr)3{4RSDK_THIS(PlayerSelectScreen);5self->labelPtr = CREATE_ENTITY(TextLabel);6self->labelPtr->useRenderMatrix = true;7self->labelPtr->fontID = FONT_HEADING;8self->labelPtr->scale = 0.2;9self->labelPtr->alpha = 256;10self->labelPtr->x = -144.0;11self->labelPtr->y = 100.0;12self->labelPtr->z = 16.0;13self->labelPtr->state = TEXTLABEL_STATE_IDLE;14SetStringToFont(self->labelPtr->text, strPlayerSelect, FONT_HEADING);1516SetStringToFont(self->textSonic, strSonic, FONT_TEXT);1718self->sonicX = (GetTextWidth(self->textSonic, FONT_TEXT, 0.2) * -0.5) - 88.0;1920SetStringToFont(self->textTails, strTails, FONT_TEXT);21self->tailsX = GetTextWidth(self->textTails, FONT_TEXT, 0.2) * -0.5;2223SetStringToFont(self->textKnux, strKnuckles, FONT_TEXT);24self->knuxX = (GetTextWidth(self->textKnux, FONT_TEXT, 0.2) * -0.5) + 88.0;2526self->meshPanel = LoadMesh("Data/Game/Models/Panel.bin", 255);27SetMeshVertexColors(self->meshPanel, 0, 0, 0, 0xC0);2829self->textureArrows = LoadTexture("Data/Game/Menu/ArrowButtons.png", TEXFMT_RGBA4444);30self->texturePlayerSel = LoadTexture("Data/Game/Menu/PlayerSelect.png", TEXFMT_RGBA8888);31self->backPressed = false;32self->flag = true;33}34void PlayerSelectScreen_Main(void *objPtr)35{36RSDK_THIS(PlayerSelectScreen);3738NativeEntity_SaveSelect *saveSel = self->saveSel;39NativeEntity_TextLabel *label = self->labelPtr;40SaveGame *saveGame = (SaveGame *)saveRAM;4142switch (self->state) {43case PLAYERSELECTSCREEN_STATE_ENTER:44if (self->alpha < 0x100)45self->alpha += 8;4647self->scale += ((1.025 - self->scale) / ((60.0 * Engine.deltaTime) * 8.0));48if (self->scale < -8.0)49self->scale = -8.0;5051NewRenderState();52MatrixScaleXYZF(&self->matrix1, self->scale, self->scale, 1.0);53MatrixTranslateXYZF(&self->matrixTemp, 0.0, -8.0, 160.0);54MatrixMultiplyF(&self->matrix1, &self->matrixTemp);55SetRenderMatrix(&self->matrix1);56label->renderMatrix = self->matrix1;5758self->timer += Engine.deltaTime;59if (self->timer > 0.5) {60self->timer = 0.0;61self->state = PLAYERSELECTSCREEN_STATE_MAIN;62keyPress.start = false;63keyPress.A = false;64self->alpha = 256;65if (usePhysicalControls)66self->playerID = SAVESEL_SONIC;67}68break;6970case PLAYERSELECTSCREEN_STATE_MAIN:71CheckKeyDown(&keyDown);72CheckKeyPress(&keyPress);73SetRenderMatrix(&self->matrixTemp);74if (usePhysicalControls) {75if (touches > 0) {76usePhysicalControls = false;77}78else {79if (keyPress.left) {80if (saveGame->knuxUnlocked) {81PlaySfxByName("Menu Move", false);82if (--self->playerID < SAVESEL_SONIC)83self->playerID = SAVESEL_KNUX;84}85else if (saveGame->tailsUnlocked) {86PlaySfxByName("Menu Move", false);87if (--self->playerID > SAVESEL_SONIC)88self->playerID = SAVESEL_TAILS;89}90}91else if (keyPress.right) {92if (saveGame->knuxUnlocked) {93PlaySfxByName("Menu Move", false);9495if (++self->playerID > SAVESEL_KNUX)96self->playerID = SAVESEL_SONIC;97}98else if (saveGame->tailsUnlocked) {99PlaySfxByName("Menu Move", false);100101if (++self->playerID > SAVESEL_TAILS)102self->playerID = SAVESEL_SONIC;103}104else {105self->playerID = SAVESEL_SONIC;106}107}108if (keyPress.start || keyPress.A) {109PlaySfxByName("Menu Select", false);110StopMusic(true);111self->state = PLAYERSELECTSCREEN_STATE_ACTION;112}113else if (keyPress.B) {114PlaySfxByName("Menu Back", false);115self->backPressed = false;116self->state = PLAYERSELECTSCREEN_STATE_EXIT;117}118}119}120else {121if (touches > 0) {122if (CheckTouchRect(-88.0, 24.0, 40.0, 40.0) < 0) {123if (self->playerID == SAVESEL_SONIC)124self->playerID = SAVESEL_NONE;125}126else {127self->playerID = SAVESEL_SONIC;128}129if (saveGame->tailsUnlocked) {130if (CheckTouchRect(-84.0, -64.0, 16.0, 16.0) < 0) {131if (self->playerID == SAVESEL_ST)132self->playerID = SAVESEL_SONIC;133}134else {135self->playerID = SAVESEL_ST;136}137if (CheckTouchRect(0.0, -16.0, 40.0, 40.0) < 0) {138if (self->playerID == SAVESEL_TAILS)139self->playerID = SAVESEL_NONE;140}141else {142self->playerID = SAVESEL_TAILS;143}144}145if (saveGame->knuxUnlocked) {146if (CheckTouchRect(88.0, 24.0, 40.0, 40.0) < 0) {147if (self->playerID == SAVESEL_KNUX)148self->playerID = SAVESEL_NONE;149}150else {151self->playerID = SAVESEL_KNUX;152}153}154self->backPressed = CheckTouchRect(128.0, -92.0, 32.0, 32.0) >= 0;155if (self->state == PLAYERSELECTSCREEN_STATE_MAIN && (keyDown.left || keyDown.right)) {156usePhysicalControls = true;157self->playerID = SAVESEL_SONIC;158}159}160else {161if (self->playerID > 0) {162PlaySfxByName("Menu Select", false);163StopMusic(true);164self->state = PLAYERSELECTSCREEN_STATE_ACTION;165}166if (self->backPressed || keyPress.B) {167PlaySfxByName("Menu Back", false);168self->backPressed = false;169self->state = PLAYERSELECTSCREEN_STATE_EXIT;170}171else if (self->state == PLAYERSELECTSCREEN_STATE_MAIN && (keyDown.left || keyDown.right)) {172usePhysicalControls = true;173self->playerID = SAVESEL_SONIC;174}175}176}177break;178179case PLAYERSELECTSCREEN_STATE_ACTION:180SetRenderMatrix(&self->matrixTemp);181182self->timer2 += Engine.deltaTime;183self->timer += Engine.deltaTime;184if (self->timer2 > 0.1) {185self->timer2 -= 0.1;186}187self->flag = self->timer2 > 0.05;188189if (self->timer > 1.0) {190self->flag = true;191self->timer = 0.0;192self->state = PLAYERSELECTSCREEN_STATE_IDLE;193if (saveSel->selectedButton <= 0) {194SetGlobalVariableByName("options.saveSlot", 0);195SetGlobalVariableByName("options.gameMode", 0);196}197else {198SetGlobalVariableByName("options.saveSlot", saveSel->selectedButton - 1);199SetGlobalVariableByName("options.gameMode", 1);200201switch (self->playerID) {202case SAVESEL_SONIC: saveGame->files[saveSel->selectedButton - 1].characterID = 0; break;203case SAVESEL_TAILS: saveGame->files[saveSel->selectedButton - 1].characterID = 1; break;204case SAVESEL_KNUX: saveGame->files[saveSel->selectedButton - 1].characterID = 2; break;205case SAVESEL_ST: saveGame->files[saveSel->selectedButton - 1].characterID = 3; break;206}207208saveGame->files[saveSel->selectedButton - 1].lives = 3;209saveGame->files[saveSel->selectedButton - 1].score = 0;210saveGame->files[saveSel->selectedButton - 1].scoreBonus = 500000;211saveGame->files[saveSel->selectedButton - 1].stageID = 1;212saveGame->files[saveSel->selectedButton - 1].emeralds = 0;213saveGame->files[saveSel->selectedButton - 1].specialStageID = 0;214WriteSaveRAMData();215}216SetGlobalVariableByName("options.stageSelectFlag", 0);217SetGlobalVariableByName("player.lives", 3);218SetGlobalVariableByName("player.score", 0);219SetGlobalVariableByName("player.scoreBonus", 50000);220SetGlobalVariableByName("specialStage.listPos", 0);221SetGlobalVariableByName("specialStage.emeralds", 0);222SetGlobalVariableByName("specialStage.nextZone", 0);223SetGlobalVariableByName("timeAttack.result", 0);224SetGlobalVariableByName("lampPostID", 0);225SetGlobalVariableByName("starPostID", 0);226debugMode = false;227228int charID = 0;229switch (self->playerID) {230case SAVESEL_SONIC: charID = 0; break;231case SAVESEL_TAILS: charID = 1; break;232case SAVESEL_KNUX: charID = 2; break;233case SAVESEL_ST: charID = 3; break;234}235InitStartingStage(STAGELIST_PRESENTATION, 0, charID);236237CREATE_ENTITY(FadeScreen);238}239break;240241case PLAYERSELECTSCREEN_STATE_IDLE: SetRenderMatrix(&self->matrixTemp); break;242243case PLAYERSELECTSCREEN_STATE_EXIT:244if (self->alpha > 0)245self->alpha -= 8;246247if (self->timer >= 0.2)248self->scale += ((-1.0f - self->scale) / ((60.0 * Engine.deltaTime) * 8.0));249else250self->scale += ((1.5 - self->scale) / ((60.0 * Engine.deltaTime) * 8.0));251if (self->scale < 0.0)252self->scale = 0.0;253254NewRenderState();255MatrixScaleXYZF(&self->matrix1, self->scale, self->scale, 1.0);256MatrixTranslateXYZF(&self->matrixTemp, 0.0, -8.0, 160.0);257MatrixMultiplyF(&self->matrix1, &self->matrixTemp);258SetRenderMatrix(&self->matrix1);259label->renderMatrix = self->matrix1;260261self->timer += Engine.deltaTime;262if (self->timer > 0.5) {263saveSel->state = SAVESELECT_STATE_EXITSUBMENU;264RemoveNativeObject(label);265RemoveNativeObject(self);266return;267}268break;269270default: break;271}272273RenderMesh(self->meshPanel, MESH_COLORS, false);274if ((self->playerID == SAVESEL_SONIC || self->playerID == SAVESEL_ST) && self->flag) {275SetRenderVertexColor(255, 192, 0);276if (self->playerID == SAVESEL_SONIC && usePhysicalControls) {277RenderImage(-88.0, 28.0, 8.0, 0.325, 0.325, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 255, self->texturePlayerSel);278}279else {280RenderImage(-88.0, 28.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 255, self->texturePlayerSel);281}282}283else {284SetRenderVertexColor(255, 255, 0);285RenderImage(-88.0, 28.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 255, self->texturePlayerSel);286}287288SetRenderVertexColor(255, 255, 255);289RenderImage(-88.0, 32.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 0.0, 0.0, 255, self->texturePlayerSel);290if ((self->playerID == SAVESEL_TAILS || self->playerID == SAVESEL_ST) && self->flag) {291SetRenderVertexColor(0, 96, 0xFF);292}293else {294SetRenderVertexColor(0, 0x80, 0xFF);295RenderImage(0.0, -12.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 255, self->texturePlayerSel);296}297if (self->playerID == SAVESEL_TAILS && usePhysicalControls) {298RenderImage(0.0, -12.0, 8.0, 0.325, 0.325, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);299}300else {301RenderImage(0.0, -12.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);302}303304if (saveGame->tailsUnlocked)305SetRenderVertexColor(255, 255, 255);306else307SetRenderVertexColor(0, 0, 0);308RenderImage(0.0, -8.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 0.0, 255, self->texturePlayerSel);309if (self->playerID == SAVESEL_KNUX && self->flag) {310SetRenderVertexColor(0, 128, 0);311if (usePhysicalControls) {312RenderImage(88.0, 28.0, 8.0, 0.325, 0.325, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);313}314else {315RenderImage(88.0, 28.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);316}317}318else {319SetRenderVertexColor(0, 144, 0);320RenderImage(88.0, 28.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);321}322323if (saveGame->knuxUnlocked)324SetRenderVertexColor(0xFF, 0xFF, 0xFF);325else326SetRenderVertexColor(0, 0, 0);327RenderImage(88.0, 32.0, 8.0, 0.3, 0.3, 128.0, 128.0, 256.0, 256.0, 0.0, 256.0, 0xFF, self->texturePlayerSel);328329if (saveGame->tailsUnlocked) {330if (self->playerID == SAVESEL_ST && self->flag) {331SetRenderVertexColor(255, 64, 0);332RenderImage(-88.0, -56.0, 8.0, 0.135, 0.135, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);333RenderRect(-96.0, -54.0, 8.0, 16.0, 4.0, 0xFF, 255, 0x40, 0xFF);334RenderRect(-90.0, -48.0, 8.0, 4.0, 16.0, 0xFF, 255, 0x40, 0xFF);335RenderRect(-36.0, -54.0, 8.0, 10.0, 4.0, 0xFF, 255, 0x40, 0xFF);336RenderRect(-52.0, -54.0, 8.0, 10.0, 4.0, 0xFF, 255, 0x40, 0xFF);337RenderRect(-68.0, -54.0, 8.0, 10.0, 4.0, 0xFF, 255, 0x40, 0xFF);338RenderRect(-90.0, -26.0, 8.0, 4.0, 10.0, 0xFF, 255, 0x40, 0xFF);339}340else {341SetRenderVertexColor(255, 0, 0);342RenderImage(-88.0, -56.0, 8.0, 0.125, 0.125, 128.0, 128.0, 256.0, 256.0, 256.0, 256.0, 0xFF, self->texturePlayerSel);343RenderRect(-96.0, -54.0, 8.0, 16.0, 4.0, 0xFF, 0xFF, 0xFF, 0xFF);344RenderRect(-90.0, -48.0, 8.0, 4.0, 16.0, 0xFF, 0xFF, 0xFF, 0xFF);345RenderRect(-36.0, -54.0, 8.0, 10.0, 4.0, 0xFF, 0xFF, 0xFF, 0xFF);346RenderRect(-52.0, -54.0, 8.0, 10.0, 4.0, 0xFF, 0xFF, 0xFF, 0xFF);347RenderRect(-68.0, -54.0, 8.0, 10.0, 4.0, 0xFF, 0xFF, 0xFF, 0xFF);348RenderRect(-90.0, -26.0, 8.0, 4.0, 10.0, 0xFF, 0xFF, 0xFF, 0xFF);349}350}351if ((self->playerID == SAVESEL_SONIC || self->playerID == SAVESEL_ST) && self->flag)352SetRenderVertexColor(0xFF, 0xFF, 0x40);353else354SetRenderVertexColor(0xFF, 0xFF, 0xFF);355RenderText(self->textSonic, FONT_TEXT, self->sonicX, -22.0, 8.0, 0.2, 255);356357if (saveGame->tailsUnlocked) {358if ((self->playerID == SAVESEL_TAILS || self->playerID == SAVESEL_ST) && self->flag)359SetRenderVertexColor(0xFF, 0xFF, 0x40);360else361SetRenderVertexColor(0xFF, 0xFF, 0xFF);362}363else {364SetRenderVertexColor(0xA0, 0xA0, 0xA0);365}366RenderText(self->textTails, FONT_TEXT, self->tailsX, -64.0, 8.0, 0.2, 0xFF);367if (saveGame->knuxUnlocked) {368if (self->playerID == SAVESEL_KNUX && self->flag)369SetRenderVertexColor(0xFF, 0xFF, 0x40);370else371SetRenderVertexColor(0xFF, 0xFF, 0xFF);372}373else {374SetRenderVertexColor(0xA0, 0xA0, 0xA0);375}376RenderText(self->textKnux, FONT_TEXT, self->knuxX, -22.0, 8.0, 0.2, 0xFF);377378NewRenderState();379SetRenderMatrix(NULL);380SetRenderVertexColor(0xFF, 0xFF, 0xFF);381if (self->backPressed)382RenderImage(128.0, -92.0, 160.0, 0.3, 0.3, 64.0, 64.0, 128.0, 128.0, 128.0, 128.0, self->alpha, self->textureArrows);383else384RenderImage(128.0, -92.0, 160.0, 0.3, 0.3, 64.0, 64.0, 128.0, 128.0, 128.0, 0.0, self->alpha, self->textureArrows);385}386387388