void G_DoLoadGame(void) { CON_DPrintf("--------Loading game--------\n"); if(!P_ReadSaveGame(savename)) { gameaction = ga_nothing; players[consoleplayer].message = "couldn't load game!"; return; } }
void G_DoSaveGame(void) { CON_DPrintf("--------Saving game--------\n"); if(!P_WriteSaveGame(savedescription, savegameslot)) { players[consoleplayer].message = "couldn't save game!"; return; } savedescription[0] = 0; players[consoleplayer].message = GGSAVED; }
void G_PlayDemo(const char* name) { int i; int p; char filename[256]; gameaction = ga_nothing; endDemo = false; p = M_CheckParm("-playdemo"); if(p && p < myargc-1) { // 20120107 bkw: add .lmp extension if missing. if(dstrrchr(myargv[p+1], '.')) { dstrcpy(filename, myargv[p+1]); } else { dsprintf(filename, "%s.lmp", myargv[p+1]); } CON_DPrintf("--------Reading demo %s--------\n", filename); if(M_ReadFile(filename, &demobuffer) == -1) { gameaction = ga_exitdemo; return; } demo_p = demobuffer; } else { if(W_CheckNumForName(name) == -1) { gameaction = ga_exitdemo; return; } CON_DPrintf("--------Playing demo %s--------\n", name); demobuffer = demo_p = W_CacheLumpName(name, PU_STATIC); } if(strncmp((char*)demo_p, "DM64", 4)) { I_Error("G_PlayDemo: Mismatched demo header"); return; } G_SaveDefaults(); demo_p++; demo_p++; demo_p++; demo_p++; demo_p++; startskill = *demo_p++; startmap = *demo_p++; deathmatch = *demo_p++; respawnparm = *demo_p++; respawnitem = *demo_p++; fastparm = *demo_p++; nomonsters = *demo_p++; consoleplayer = *demo_p++; rngseed = *demo_p++ & 0xff; rngseed <<= 8; rngseed += *demo_p++ & 0xff; rngseed <<= 8; rngseed += *demo_p++ & 0xff; rngseed <<= 8; rngseed += *demo_p++ & 0xff; gameflags = *demo_p++ & 0xff; gameflags <<= 8; gameflags += *demo_p++ & 0xff; gameflags <<= 8; gameflags += *demo_p++ & 0xff; gameflags <<= 8; gameflags += *demo_p++ & 0xff; compatflags = *demo_p++ & 0xff; compatflags <<= 8; compatflags += *demo_p++ & 0xff; compatflags <<= 8; compatflags += *demo_p++ & 0xff; compatflags <<= 8; compatflags += *demo_p++ & 0xff; for(i = 0; i < MAXPLAYERS; i++) { playeringame[i] = *demo_p++; } G_InitNew(startskill, startmap); if(playeringame[1]) { netgame = true; netdemo = true; } precache = true; usergame = false; demoplayback = true; G_RunGame(); iwadDemo = false; }
void G_RecordDemo(const char* name) { byte *demostart, *dm_p; int i; demofp = NULL; endDemo = false; dstrcpy(demoname, name); dstrcat(demoname, ".lmp"); if(access(demoname, F_OK)) { demofp = fopen(demoname, "wb"); } else { int demonum = 0; while(demonum < 10000) { sprintf(demoname, "%s%i.lmp", name, demonum); if(access(demoname, F_OK)) { demofp = fopen(demoname, "wb"); break; } demonum++; } // so yeah... dunno how to properly handle this... if(demonum >= 10000) { I_Error("G_RecordDemo: file %s already exists", demoname); return; } } CON_DPrintf("--------Recording %s--------\n", demoname); demostart = dm_p = malloc(1000); G_InitNew(startskill, startmap); *dm_p++ = 'D'; *dm_p++ = 'M'; *dm_p++ = '6'; *dm_p++ = '4'; *dm_p++ = '\0'; *dm_p++ = gameskill; *dm_p++ = gamemap; *dm_p++ = deathmatch; *dm_p++ = respawnparm; *dm_p++ = respawnitem; *dm_p++ = fastparm; *dm_p++ = nomonsters; *dm_p++ = consoleplayer; *dm_p++ = (byte)((rngseed >> 24) & 0xff); *dm_p++ = (byte)((rngseed >> 16) & 0xff); *dm_p++ = (byte)((rngseed >> 8) & 0xff); *dm_p++ = (byte)( rngseed & 0xff); *dm_p++ = (byte)((gameflags >> 24) & 0xff); *dm_p++ = (byte)((gameflags >> 16) & 0xff); *dm_p++ = (byte)((gameflags >> 8) & 0xff); *dm_p++ = (byte)( gameflags & 0xff); *dm_p++ = (byte)((compatflags >> 24) & 0xff); *dm_p++ = (byte)((compatflags >> 16) & 0xff); *dm_p++ = (byte)((compatflags >> 8) & 0xff); *dm_p++ = (byte)( compatflags & 0xff); for(i = 0; i < MAXPLAYERS; i++) { *dm_p++ = playeringame[i]; } if(fwrite(demostart, 1, dm_p-demostart, demofp) != (size_t)(dm_p-demostart)) { I_Error("G_RecordDemo: Error writing demo header"); } free(demostart); demorecording = true; usergame = false; G_RunGame(); G_CheckDemoStatus(); }