diff --git a/src/client/sentences.c b/src/client/sentences.c index 2cac2415..92cfbebb 100644 --- a/src/client/sentences.c +++ b/src/client/sentences.c @@ -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 { diff --git a/src/menu-fn/m_loadgame.cpp b/src/menu-fn/m_loadgame.cpp index a2761e6a..b3ac9f34 100644 --- a/src/menu-fn/m_loadgame.cpp +++ b/src/menu-fn/m_loadgame.cpp @@ -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); } diff --git a/src/menu-fn/m_main.cpp b/src/menu-fn/m_main.cpp index bbec91e6..c3f60cda 100644 --- a/src/menu-fn/m_main.cpp +++ b/src/menu-fn/m_main.cpp @@ -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 } diff --git a/src/menu-fn/w_listbox.cpp b/src/menu-fn/w_listbox.cpp index fe2496a0..74b1cf49 100644 --- a/src/menu-fn/w_listbox.cpp +++ b/src/menu-fn/w_listbox.cpp @@ -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)