/* Copyright (C) 1997-2001 Id Software, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ // ui_game_saveload.c -- the single save/load menus #include #ifdef _WIN32 #include #endif #include "../client/client.h" #include "ui_local.h" #define MAX_SAVEGAMES 21 // was 15 static menuframework_s s_loadgame_menu; static menuaction_s s_loadgame_actions[MAX_SAVEGAMES]; static menuaction_s s_loadgame_back_action; static menuframework_s s_savegame_menu; static menuaction_s s_savegame_actions[MAX_SAVEGAMES]; static menuaction_s s_savegame_back_action; /* ============================================================================= SAVESHOT HANDLING ============================================================================= */ char m_savestrings[MAX_SAVEGAMES][32]; qboolean m_savevalid[MAX_SAVEGAMES]; qboolean m_saveshotvalid[MAX_SAVEGAMES+1]; char m_mapname[MAX_QPATH]; qboolean m_mapshotvalid; void Create_Savestrings (void) { int i; fileHandle_t f; char name[MAX_OSPATH]; char mapname[MAX_TOKEN_CHARS]; char *ch; for (i=0 ; igeneric.localdata[0] ] ) { Com_sprintf(loadshotname, sizeof(loadshotname), "/save/save%i/shot.jpg", a->generic.localdata[0]); load_saveshot = loadshotname; } else load_saveshot = NULL; if ( m_savevalid[ a->generic.localdata[0] ] ) Cbuf_AddText (va("load save%i\n", a->generic.localdata[0] ) ); UI_ForceMenuOff (); } void LoadGame_MenuInit ( void ) { int i; s_loadgame_menu.x = SCREEN_WIDTH*0.5 - 240; s_loadgame_menu.y = SCREEN_HEIGHT*0.5 - 58; // s_loadgame_menu.x = viddef.width / 2 - SCR_ScaledVideo(240); // s_loadgame_menu.y = viddef.height / 2 - SCR_ScaledVideo(7.25*MENU_FONT_SIZE); // was 58 s_loadgame_menu.nitems = 0; Create_Savestrings(); for ( i = 0; i < MAX_SAVEGAMES; i++ ) { s_loadgame_actions[i].generic.name = m_savestrings[i]; s_loadgame_actions[i].generic.flags = QMF_LEFT_JUSTIFY; s_loadgame_actions[i].generic.localdata[0] = i; s_loadgame_actions[i].generic.callback = LoadGameCallback; s_loadgame_actions[i].generic.x = 0; s_loadgame_actions[i].generic.y = (i) * MENU_LINE_SIZE; if (i>1) // separate from autosave s_loadgame_actions[i].generic.y += 10; s_loadgame_actions[i].generic.type = MTYPE_ACTION; Menu_AddItem( &s_loadgame_menu, &s_loadgame_actions[i] ); } s_loadgame_back_action.generic.type = MTYPE_ACTION; s_loadgame_back_action.generic.flags = QMF_LEFT_JUSTIFY; s_loadgame_back_action.generic.x = 0; s_loadgame_back_action.generic.y = (MAX_SAVEGAMES+3)*MENU_LINE_SIZE; s_loadgame_back_action.generic.name = " CANCEL"; s_loadgame_back_action.generic.callback = UI_BackMenu; Menu_AddItem( &s_loadgame_menu, &s_loadgame_back_action ); InitSaveshots (true); // register saveshots } void LoadGame_MenuDraw( void ) { Menu_Banner( "m_banner_load_game" ); // Menu_AdjustCursor( &s_loadgame_menu, 1 ); Menu_Draw( &s_loadgame_menu ); DrawSaveshot (true); } const char *LoadGame_MenuKey( int key ) { if ( key == K_ESCAPE || key == K_ENTER ) { s_savegame_menu.cursor = s_loadgame_menu.cursor - 1; if ( s_savegame_menu.cursor < 0 ) s_savegame_menu.cursor = 0; } return Default_MenuKey( &s_loadgame_menu, key ); } void M_Menu_LoadGame_f (void) { LoadGame_MenuInit(); UI_PushMenu( LoadGame_MenuDraw, LoadGame_MenuKey ); } /* ============================================================================= SAVEGAME MENU ============================================================================= */ void SaveGameCallback( void *self ) { menuaction_s *a = ( menuaction_s * ) self; Cbuf_AddText (va("save save%i\n", a->generic.localdata[0] )); UI_ForceMenuOff (); } void SaveGame_MenuDraw( void ) { Menu_Banner( "m_banner_save_game" ); Menu_AdjustCursor( &s_savegame_menu, 1 ); Menu_Draw( &s_savegame_menu ); DrawSaveshot (false); } void SaveGame_MenuInit( void ) { int i; s_savegame_menu.x = SCREEN_WIDTH*0.5 - 240; s_savegame_menu.y = SCREEN_HEIGHT*0.5 - 58; // s_savegame_menu.x = viddef.width / 2 - SCR_ScaledVideo(240); // s_savegame_menu.y = viddef.height / 2 - SCR_ScaledVideo(7.25*MENU_FONT_SIZE);//was 58 s_savegame_menu.nitems = 0; Create_Savestrings(); // don't include the autosave slot for ( i = 0; i < MAX_SAVEGAMES-2; i++ ) { s_savegame_actions[i].generic.name = m_savestrings[i+2]; s_savegame_actions[i].generic.localdata[0] = i+2; s_savegame_actions[i].generic.flags = QMF_LEFT_JUSTIFY; s_savegame_actions[i].generic.callback = SaveGameCallback; s_savegame_actions[i].generic.x = 0; s_savegame_actions[i].generic.y = ( i ) * MENU_LINE_SIZE; s_savegame_actions[i].generic.type = MTYPE_ACTION; Menu_AddItem( &s_savegame_menu, &s_savegame_actions[i] ); } s_savegame_back_action.generic.type = MTYPE_ACTION; s_savegame_back_action.generic.flags = QMF_LEFT_JUSTIFY; s_savegame_back_action.generic.x = 0; s_savegame_back_action.generic.y = (MAX_SAVEGAMES+2)*MENU_LINE_SIZE; s_savegame_back_action.generic.name = " CANCEL"; s_savegame_back_action.generic.callback = UI_BackMenu; Menu_AddItem( &s_savegame_menu, &s_savegame_back_action ); InitSaveshots (false); } const char *SaveGame_MenuKey( int key ) { if ( key == K_ENTER || key == K_ESCAPE ) { s_loadgame_menu.cursor = s_savegame_menu.cursor - 1; if ( s_loadgame_menu.cursor < 0 ) s_loadgame_menu.cursor = 0; } return Default_MenuKey( &s_savegame_menu, key ); } void M_Menu_SaveGame_f (void) { if (!Com_ServerState()) return; // not playing a game SaveGame_MenuInit(); UI_PushMenu( SaveGame_MenuDraw, SaveGame_MenuKey ); Create_Savestrings (); }