From 68801322dca8fb6f5fda129add8118c61e1731a8 Mon Sep 17 00:00:00 2001 From: terminx Date: Tue, 14 Sep 2010 18:19:38 +0000 Subject: [PATCH] Automatically name savegames based on the map name instead of canceling the save if no name is entered git-svn-id: https://svn.eduke32.com/eduke32@1707 1a8010ca-5511-0410-912e-c29ae57300e0 --- polymer/eduke32/source/menus.c | 53 ++++++++++++++++--------------- polymer/eduke32/source/savegame.c | 26 ++++++++------- polymer/eduke32/source/savegame.h | 2 +- 3 files changed, 44 insertions(+), 37 deletions(-) diff --git a/polymer/eduke32/source/menus.c b/polymer/eduke32/source/menus.c index 2ea17ad27..8c33a36ee 100644 --- a/polymer/eduke32/source/menus.c +++ b/polymer/eduke32/source/menus.c @@ -29,6 +29,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "savegame.h" #include "premap.h" #include "demo.h" +#include "crc32.h" + #include extern char inputloc; @@ -4670,6 +4672,10 @@ cheat_for_port_credits: if (g_currentMenu >= 360 && g_currentMenu <= 369) { + static uint32_t crc = 0; + + if (!crc) crc = crc32once((uint8_t *)&ud.savegame[g_currentMenu-360][0], 19); + Bsprintf(tempbuf,"PLAYERS: %-2d ",ud.multimode); mgametext(160,156,tempbuf,0,2+8+16); Bsprintf(tempbuf,"EPISODE: %-2d / LEVEL: %-2d / SKILL: %-2d",1+ud.volume_number,1+ud.level_number,ud.player_skill); @@ -4677,43 +4683,40 @@ cheat_for_port_credits: if (ud.volume_number == 0 && ud.level_number == 7) mgametext(160,180,currentboardfilename,0,2+8+16); - x = G_EnterText((320>>1),184,&ud.savegame[g_currentMenu-360][0],19, 999); + x = G_EnterText((320>>1),184,&ud.savegame[g_currentMenu-360][0],20, 999); if (x == -1) { - // ReadSaveGameHeaders(); - g_player[myconnectindex].ps->gm = MODE_GAME; - if ((!g_netServer && ud.multimode < 2) && ud.recstat != 2) - { - ready2send = 1; - totalclock = ototalclock; - } + crc = 0; + ReadSaveGameHeaders(); + ChangeToMenu(351); goto DISPLAYNAMES; } if (x == 1) { - if (ud.savegame[g_currentMenu-360][0] == 0) + // dirty hack... char 127 in last position indicates an auto-filled name + if (ud.savegame[g_currentMenu-360][0] == 0 || (ud.savegame[g_currentMenu-360][20] == 127 && + crc == crc32once((uint8_t *)&ud.savegame[g_currentMenu-360][0], 19))) { - KB_FlushKeyboardQueue(); - ChangeToMenu(351); + Bstrncpy(&ud.savegame[g_currentMenu-360][0], MapInfo[ud.volume_number * MAXLEVELS + ud.level_number].name, 19); + ud.savegame[g_currentMenu-360][20] = 127; } - else - { - if ((g_netServer || ud.multimode > 1)) - G_SavePlayer(-1-(g_currentMenu-360)); - else G_SavePlayer(g_currentMenu-360); - g_lastSaveSlot = g_currentMenu-360; - g_player[myconnectindex].ps->gm = MODE_GAME; - if ((!g_netServer && ud.multimode < 2) && ud.recstat != 2) - { - ready2send = 1; - totalclock = ototalclock; - } - KB_ClearKeyDown(sc_Escape); - S_PlaySound(EXITMENUSOUND); + if ((g_netServer || ud.multimode > 1)) + G_SavePlayer(-1-(g_currentMenu-360)); + else G_SavePlayer(g_currentMenu-360); + g_lastSaveSlot = g_currentMenu-360; + g_player[myconnectindex].ps->gm = MODE_GAME; + + if ((!g_netServer && ud.multimode < 2) && ud.recstat != 2) + { + ready2send = 1; + totalclock = ototalclock; } + KB_ClearKeyDown(sc_Escape); + S_PlaySound(EXITMENUSOUND); + crc = 0; } rotatesprite(101<<16,97<<16,65536>>1,512,TILE_SAVESHOT,-32,0,2+4+8+64,0,0,xdim-1,ydim-1); diff --git a/polymer/eduke32/source/savegame.c b/polymer/eduke32/source/savegame.c index 2a5bad746..58c3fd81b 100644 --- a/polymer/eduke32/source/savegame.c +++ b/polymer/eduke32/source/savegame.c @@ -68,10 +68,12 @@ void ReadSaveGameHeaders(void) kclose(fil); continue; } - if (kdfread(&ud.savegame[i][0],19,1,fil) != 1) + if (kdfread(&ud.savegame[i][0],21,1,fil) != 1) { ud.savegame[i][0] = 0; } + else ud.savegame[i][19] = 0; + kclose(fil); } } @@ -104,7 +106,7 @@ int32_t G_LoadSaveHeader(char spot,struct savehead *saveh) if (kdfread(&saveh->numplr,sizeof(int32_t),1,fil) != 1) goto corrupt; - if (kdfread(saveh->name,19,1,fil) != 1) goto corrupt; + if (kdfread(saveh->name,21,1,fil) != 1) goto corrupt; if (kdfread(&saveh->volnum,sizeof(int32_t),1,fil) != 1) goto corrupt; if (kdfread(&saveh->levnum,sizeof(int32_t),1,fil) != 1) goto corrupt; if (kdfread(&saveh->plrskl,sizeof(int32_t),1,fil) != 1) goto corrupt; @@ -187,11 +189,12 @@ int32_t G_LoadPlayer(int32_t spot) if (numplayers > 1) { - if (kdfread(&buf,19,1,fil) != 1) goto corrupt; + if (kdfread(&buf,21,1,fil) != 1) goto corrupt; } else { - if (kdfread(&ud.savegame[spot][0],19,1,fil) != 1) goto corrupt; + if (kdfread(&ud.savegame[spot][0],21,1,fil) != 1) goto corrupt; + ud.savegame[spot][19] = 0; } @@ -653,7 +656,7 @@ int32_t G_SavePlayer(int32_t spot) dfwrite(&bv,sizeof(bv),1,fil); dfwrite(&ud.multimode,sizeof(ud.multimode),1,fil); - dfwrite(&ud.savegame[spot][0],19,1,fil); + dfwrite(&ud.savegame[spot][0],21,1,fil); dfwrite(&ud.volume_number,sizeof(ud.volume_number),1,fil); dfwrite(&ud.level_number,sizeof(ud.level_number),1,fil); dfwrite(&ud.player_skill,sizeof(ud.player_skill),1,fil); @@ -2048,7 +2051,7 @@ static uint8_t *dosaveplayer2(int32_t spot, FILE *fil, uint8_t *mem) if (spot>=0) { - SAVEWRU(&ud.savegame[spot][0], 19, 1); + SAVEWRU(&ud.savegame[spot][0], 21, 1); SAVEWRU("1", 1, 1); if (!waloff[TILE_SAVESHOT]) { @@ -2061,13 +2064,13 @@ static uint8_t *dosaveplayer2(int32_t spot, FILE *fil, uint8_t *mem) } else { - char buf[19]; + char buf[21]; const time_t t=time(NULL); struct tm *st; Bsprintf(buf, "Eduke32 demo"); if (t>=0 && (st = localtime(&t))) Bsprintf(buf, "Edemo32 %04d%02d%02d", st->tm_year+1900, st->tm_mon+1, st->tm_mday); - SAVEWRU(&buf, 19, 1); + SAVEWRU(&buf, 21, 1); SAVEWRU("\0", 1, 1); // demos don't save screenshot } @@ -2091,7 +2094,7 @@ static uint8_t *dosaveplayer2(int32_t spot, FILE *fil, uint8_t *mem) static int32_t doloadplayer2(int32_t spot, int32_t fil, uint8_t **memptr) { uint8_t *mem = memptr ? *memptr : NULL, *tmem=mem; - char tbuf[19]; + char tbuf[21]; int32_t i; if (readspecdata(svgm_udnetw, fil, &mem)) @@ -2102,9 +2105,10 @@ static int32_t doloadplayer2(int32_t spot, int32_t fil, uint8_t **memptr) if (spot<0 || numplayers > 1) { - if (LOADRDU(&tbuf, 19, 1)) return -3; + if (LOADRDU(&tbuf, 21, 1)) return -3; } - else if (LOADRDU(&ud.savegame[spot][0], 19, 1)) return -3; + else if (LOADRDU(&ud.savegame[spot][0], 21, 1)) return -3; + else ud.savegame[spot][19] = 0; if (LOADRDU(tbuf, 1, 1)) return -3; if (tbuf[0]) diff --git a/polymer/eduke32/source/savegame.h b/polymer/eduke32/source/savegame.h index 9f1638ea9..46e452fbf 100644 --- a/polymer/eduke32/source/savegame.h +++ b/polymer/eduke32/source/savegame.h @@ -26,7 +26,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #pragma pack(push,1) struct savehead { - char name[19]; + char name[21]; int32_t numplr,volnum,levnum,plrskl; char boardfn[BMAX_PATH]; };