Menu: Added a basic Load-Game menu.

This commit is contained in:
Marco Cawthorne 2020-04-12 18:45:02 +02:00
parent 324fadd668
commit 9e8c779c74
4 changed files with 137 additions and 5 deletions

View file

@ -28,7 +28,7 @@
* has pretty good documentation of how the format is meant to work */
/* enable this if you want to use memalloc */
#define DYNAMIC_SENTENCES 1
#define DYNAMIC_SENTENCES
typedef struct
{

View file

@ -14,14 +14,127 @@
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
string *g_savegames;
int g_savegame_count;
CWidget fn_loadgame;
CMainButton lg_btnLoad;
CMainButton lg_btnDelete;
CMainButton lg_btnCancel;
CScrollbar lg_sbSaves;
CListBox lg_lbSaves;
CFrame lg_frSaves;
CFrame lg_frPreview;
void lg_btnload(void)
{
int i = lg_lbSaves.GetSelected();
localcmd(sprintf("load %s\n", g_savegames[i]));
}
void lg_btncancel_start(void)
{
static void lg_btncancel_end(void) {
g_menupage = PAGE_MAIN;
}
localsound("../media/launch_dnmenu1.wav");
header.SetStartEndPos(45,45,70,292);
header.SetStartEndSize(460,80,156,26);
header.m_lerp = 0.0f;
header.m_visible = TRUE;
header.SetHeader(HEAD_LOAD);
header.SetExecute(lg_btncancel_end);
}
void lg_lbsaves_changed(void)
{
}
void up_sbsaves_changed(int val)
{
lg_lbSaves.SetScroll(val);
}
void menu_loadgame_refreshsaves(void)
{
searchhandle searchy;
lg_lbSaves.Clear();
searchy = search_begin("saves/*/info.fsv", TRUE, TRUE);
g_savegame_count = search_getsize(searchy);
g_savegames = memalloc(sizeof(string) * g_savegame_count);
for (int i = 0; i < g_savegame_count; i++) {
string fullpath = search_getfilename(searchy, i);
g_savegames[i] = substring(fullpath, 6, strlen(fullpath) - 15);
precache_pic(sprintf("saves/%s/screeny.tga", g_savegames[i]));
lg_lbSaves.AddEntry(g_savegames[i]);
}
search_end(searchy);
lg_lbSaves.SetSelected(0);
}
void menu_loadgame_init(void)
{
fn_loadgame = spawn(CWidget);
lg_btnLoad = spawn(CMainButton);
lg_btnLoad.SetImage(BTN_LOADGAME);
lg_btnLoad.SetExecute(lg_btnload);
lg_btnLoad.SetPos(50,140);
Widget_Add(fn_loadgame, lg_btnLoad);
lg_btnDelete = spawn(CMainButton);
lg_btnDelete.SetImage(BTN_DELETE);
lg_btnDelete.SetExecute(__NULL__);
lg_btnDelete.SetPos(50,172);
Widget_Add(fn_loadgame, lg_btnDelete);
lg_btnCancel = spawn(CMainButton);
lg_btnCancel.SetImage(BTN_CANCEL);
lg_btnCancel.SetExecute(lg_btncancel_start);
lg_btnCancel.SetPos(50,204);
Widget_Add(fn_loadgame, lg_btnCancel);
lg_frSaves = spawn(CFrame);
lg_frSaves.SetPos(200,140);
lg_frSaves.SetSize(100+50,250);
Widget_Add(fn_loadgame, lg_frSaves);
lg_lbSaves = spawn(CListBox);
lg_lbSaves.SetPos(203,143);
lg_lbSaves.SetSize(94+50,244);
lg_lbSaves.SetChanged(lg_lbsaves_changed);
Widget_Add(fn_loadgame, lg_lbSaves);
lg_sbSaves = spawn(CScrollbar);
lg_sbSaves.SetPos(203+94+50,140);
lg_sbSaves.SetItemheight(15);
lg_sbSaves.SetHeight(250);
lg_sbSaves.SetCallback(up_sbsaves_changed);
lg_sbSaves.SetMax(0);
Widget_Add(fn_loadgame, lg_sbSaves);
lg_frPreview = spawn(CFrame);
lg_frPreview.SetPos(390,140);
lg_frPreview.SetSize(220,165);
Widget_Add(fn_loadgame, lg_frPreview);
menu_loadgame_refreshsaves();
}
void menu_loadgame_draw(void)
{
Widget_Draw(fn_loadgame);
drawpic([g_menuofs[0]+45,g_menuofs[1]+45], g_bmp[HEAD_LOAD],[460,80], [1,1,1], 1.0f, 1);
if (!g_savegame_count) {
return;
}
int i = lg_lbSaves.GetSelected();
drawpic([g_menuofs[0]+390,g_menuofs[1]+140], sprintf("saves/%s/screeny.tga", g_savegames[i]),[220,165], [1,1,1], 1.0f, 1);
}
void menu_loadgame_input(float evtype, float scanx, float chary, float devid)
{
Widget_Input(fn_loadgame, evtype, scanx, chary, devid);
}

View file

@ -88,6 +88,19 @@ void btn_configuration_start(void)
header.SetHeader(HEAD_CONFIG);
header.SetExecute(btn_configuration_end);
}
void btn_loadgame_start(void)
{
static void btn_loadgame_end(void) {
g_menupage = PAGE_LOADGAME;
}
localsound("../media/launch_upmenu1.wav");
header.SetStartEndPos(70,292,45,45);
header.SetStartEndSize(156,26,460,80);
header.m_lerp = 0.0f;
header.m_visible = TRUE;
header.SetHeader(HEAD_LOAD);
header.SetExecute(btn_loadgame_end);
}
void btn_multiplayer_start(void)
{
static void btn_multiplayer_end(void) {
@ -162,6 +175,7 @@ void menu_main_init(void)
main_btnLoadGame = spawn(CMainButton);
main_btnLoadGame.SetImage(BTN_LOADGAME);
main_btnLoadGame.SetExecute(btn_loadgame_start);
if (games[gameinfo_current].type != "Multiplayer") {
// Loadgame disabled
}

View file

@ -81,10 +81,7 @@ void CListBox::Input(float type, float x, float y, float devid)
if (Util_CheckMouse(pos[0], pos[1], m_size[0], 15)) {
if (type == IE_KEYDOWN) {
if (x == K_MOUSE1) {
m_selected = i;
if (m_execute) {
m_execute(i);
}
SetSelected(i);
break;
}
}
@ -131,7 +128,15 @@ void CListBox::SetChanged(void(int val) func)
void CListBox::SetSelected(int i)
{
if (m_entries[i] == __NULL__) {
return;
}
m_selected = i;
if (m_execute) {
m_execute(i);
}
}
int CListBox::GetSelected(void)