Path: blob/main/RSDKv4/NativeObjects/DialogPanel.cpp
817 views
#include "RetroEngine.hpp"12void DialogPanel_Create(void *objPtr)3{4RSDK_THIS(DialogPanel);5self->panelMesh = LoadMesh("Data/Game/Models/Panel.bin", -1);6SetMeshVertexColors(self->panelMesh, 0x28, 0x5C, 0xB0, 0xFF);7self->buttonCount = DLGTYPE_YESNO;8}910void DialogPanel_Main(void *objPtr)11{12RSDK_THIS(DialogPanel);13NewRenderState();14SetRenderBlendMode(RENDER_BLEND_ALPHA);1516switch (self->state) {17case DIALOGPANEL_STATE_SETUP: {18NativeEntity_PushButton *confirmButton = CREATE_ENTITY(PushButton);19self->buttons[0] = confirmButton;20if (self->buttonCount == DLGTYPE_OK) {21confirmButton->x = 0.0;22confirmButton->y = -40.0;23confirmButton->z = 0.0;24confirmButton->scale = 0.25;25confirmButton->bgColor = 0x00A048;26confirmButton->bgColorSelected = 0x00C060;27confirmButton->useRenderMatrix = true;28SetStringToFont8(confirmButton->text, " OK ", FONT_LABEL);29}30else {31confirmButton->x = -48.0;32confirmButton->y = -40.0;33confirmButton->z = 0.0;34confirmButton->scale = 0.25;35confirmButton->bgColor = 0x00A048;36confirmButton->bgColorSelected = 0x00C060;37confirmButton->useRenderMatrix = true;38SetStringToFont(confirmButton->text, strYes, FONT_LABEL);3940NativeEntity_PushButton *noButton = CREATE_ENTITY(PushButton);41self->buttons[1] = noButton;42noButton->useRenderMatrix = true;43noButton->scale = 0.25;44noButton->x = 48.0;45noButton->y = -40.0;46noButton->z = 0.0;47SetStringToFont(noButton->text, strNo, FONT_LABEL);48}49self->scale = 224.0 / (GetTextWidth(self->text, FONT_TEXT, 1.0) + 1.0);50if (self->scale > 0.4)51self->scale = 0.4;52self->textX = GetTextWidth(self->text, FONT_TEXT, self->scale) * -0.5;53self->textY = GetTextHeight(self->text, FONT_TEXT, self->scale) * 0.5;54self->state = DIALOGPANEL_STATE_ENTER;55}56// FallThrough57case DIALOGPANEL_STATE_ENTER: {58self->buttonScale += ((0.77 - self->buttonScale) / ((Engine.deltaTime * 60.0) * 8.0));59if (self->buttonScale > 0.75)60self->buttonScale = 0.75;61NewRenderState();62MatrixScaleXYZF(&self->buttonMatrix, self->buttonScale, self->buttonScale, 1.0);63MatrixTranslateXYZF(&self->buttonMult, 0.0, 0.0, 160.0);64MatrixMultiplyF(&self->buttonMatrix, &self->buttonMult);65SetRenderMatrix(&self->buttonMatrix);66for (int i = 0; i < self->buttonCount; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->buttonMatrix, sizeof(MatrixF));6768self->stateTimer += Engine.deltaTime;69if (self->stateTimer > 0.5) {70self->state = DIALOGPANEL_STATE_MAIN;71self->stateTimer = 0.0;72}73break;74}75case DIALOGPANEL_STATE_MAIN: {76CheckKeyDown(&keyDown);77CheckKeyPress(&keyPress);78SetRenderMatrix(&self->buttonMatrix);79if (!usePhysicalControls) {80if (touches < 1) {81if (self->buttons[0]->state == 1) {82self->buttonSelected = 0;83self->state = DIALOGPANEL_STATE_ACTION;84PlaySfxByName("Menu Select", false);85self->buttons[0]->state = PUSHBUTTON_STATE_FLASHING;86}87if (self->buttonCount == DLGTYPE_YESNO && self->buttons[1]->state == 1) {88self->buttonSelected = 1;89self->state = DIALOGPANEL_STATE_ACTION;90PlaySfxByName("Menu Select", false);91self->buttons[1]->state = PUSHBUTTON_STATE_FLASHING;92}93}94else {95if (self->buttonCount == DLGTYPE_OK) {96self->buttons[0]->state =97CheckTouchRect(0.0, -30.0, (self->buttons[0]->textWidth + (self->buttons[0]->scale * 64.0)) * 0.75, 12.0) >= 0;98}99else {100self->buttons[0]->state =101CheckTouchRect(-36.0, -30.0, (self->buttons[0]->textWidth + (self->buttons[0]->scale * 64.0)) * 0.75, 12.0) >= 0;102self->buttons[1]->state =103CheckTouchRect(36.0, -30.0, (self->buttons[1]->textWidth + (self->buttons[1]->scale * 64.0)) * 0.75, 12.0) >= 0;104}105}106if (keyDown.left) {107usePhysicalControls = true;108self->buttonSelected = 1;109}110else if (keyDown.right) {111usePhysicalControls = true;112self->buttonSelected = 0;113}114}115else if (touches > 0) {116usePhysicalControls = false;117}118else if (self->buttonCount == DLGTYPE_OK) {119self->buttonSelected = 0;120if (keyPress.start || keyPress.A) {121self->state = DIALOGPANEL_STATE_ACTION;122PlaySfxByName("Menu Select", false);123self->buttons[self->buttonSelected]->state = 2;124}125}126else {127if (keyPress.left) {128PlaySfxByName("Menu Move", false);129if (--self->buttonSelected < 0)130self->buttonSelected = 1;131}132if (keyPress.right) {133PlaySfxByName("Menu Move", false);134if (++self->buttonSelected > 1)135self->buttonSelected = 0;136}137self->buttons[0]->state = 0;138self->buttons[1]->state = 0;139self->buttons[self->buttonSelected]->state = 1;140141if (keyPress.start || keyPress.A) {142self->state = DIALOGPANEL_STATE_ACTION;143PlaySfxByName("Menu Select", false);144self->buttons[self->buttonSelected]->state = 2;145}146}147if (self->state == 2 && keyPress.B) {148PlaySfxByName("Menu Back", false);149self->selection = DLG_NO;150self->state = DIALOGPANEL_STATE_EXIT;151}152break;153}154case DIALOGPANEL_STATE_ACTION:155SetRenderMatrix(&self->buttonMatrix);156if (!self->buttons[self->buttonSelected]->state) {157self->state = DIALOGPANEL_STATE_EXIT;158159self->selection = self->buttonSelected + 1;160if (self->buttonCount == DLGTYPE_OK)161self->selection = DLG_OK;162}163break;164case DIALOGPANEL_STATE_EXIT:165self->buttonScale = self->buttonScale + ((((self->stateTimer < 0.2) ? 1 : -1) - self->buttonScale) / ((Engine.deltaTime * 60.0) * 8.0));166if (self->buttonScale < 0.0)167self->buttonScale = 0.0;168NewRenderState();169MatrixScaleXYZF(&self->buttonMatrix, self->buttonScale, self->buttonScale, 1.0);170MatrixTranslateXYZF(&self->buttonMult, 0.0, 0.0, 160.0);171MatrixMultiplyF(&self->buttonMatrix, &self->buttonMult);172SetRenderMatrix(&self->buttonMatrix);173for (int i = 0; i < self->buttonCount; ++i) memcpy(&self->buttons[i]->renderMatrix, &self->buttonMatrix, sizeof(MatrixF));174175self->stateTimer += Engine.deltaTime;176if (self->stateTimer > 0.5) {177for (int i = 0; i < self->buttonCount; ++i) RemoveNativeObject(self->buttons[i]);178RemoveNativeObject(self);179return;180}181break;182case DIALOGPANEL_STATE_IDLE: SetRenderMatrix(&self->buttonMatrix); break;183default: break;184}185RenderMesh(self->panelMesh, MESH_COLORS, false);186RenderText(self->text, FONT_TEXT, self->textX, self->textY, 0.0, self->scale, 255);187}188189