diff --git a/README b/README index d336d5c..0750595 100644 --- a/README +++ b/README @@ -34,10 +34,6 @@ Status for other games: -> HellRaiser: not tested -> Freedoom phase 1: E1 works, E2 crashes -UI improvements TODO: -* Better keyboard layout (including more keys, eg. Run) -* Edit messages accordingly ("press y"/etc) - Technical support TODO: * Built-in overclocking? * Auto frameskip? diff --git a/cgdoom/cgdoom-ui.c b/cgdoom/cgdoom-ui.c index d48efb3..8159788 100644 --- a/cgdoom/cgdoom-ui.c +++ b/cgdoom/cgdoom-ui.c @@ -543,7 +543,7 @@ void UI_Controls(void) int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *dev_info, int *use_mmap, int *startmap, int *startepisode, int *trustunaligned, - int *autostart, int *enabledemos, int *enable2MBline) + int *autostart, int *enabledemos, int *enable2MBline, int *recorddemo) { Layout l; Layout_Init(&l); @@ -588,6 +588,8 @@ int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *dev_info, int *use_mmap, Layout_Spacing(&l, 10); if(enable2MBline) Layout_Checkbox(&l, "Use experimental RAM:", enable2MBline); + int i_demo = Layout_Text(&l, "Record demo:", + (*recorddemo < 0) ? "None" : "DEMO%02d.lmp", *recorddemo); int i_controls = Layout_Text(&l, "Customize controls...", ""); int i_advanced = Layout_Text(&l, "Advanced options...", ""); Layout_EndFrame(&l); @@ -597,13 +599,14 @@ int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *dev_info, int *use_mmap, GetKey(&key); if(Layout_Event(&l, key)) { - /* Autostart when changing starting episode/map */ + /* Set autostart when changing starting episode/map */ int startparam = (l.focus == wad_count || l.focus == wad_count+1); int changekey = (key == KEY_CTRL_EXE || key == KEY_CTRL_LEFT || key == KEY_CTRL_RIGHT); if(startparam && changekey) *autostart = 1; } + /* Title screen options */ else if(key == KEY_CTRL_EXE && l.focus == i_title) { if (!*autostart && *enabledemos) *autostart = 1; @@ -612,12 +615,21 @@ int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *dev_info, int *use_mmap, else *autostart = 0, *enabledemos = 0; } + /* Submenus */ else if(key == KEY_CTRL_EXE && l.focus == i_controls) { UI_Controls(); } else if(key == KEY_CTRL_EXE && l.focus == i_advanced) { UI_AdvancedOptions(dev_info, use_mmap, trustunaligned); } + /* Select demo file to save */ + else if(key == KEY_CTRL_LEFT && l.focus == i_demo) { + *recorddemo -= (*recorddemo >= 0); + } + else if(key == KEY_CTRL_RIGHT && l.focus == i_demo) { + *recorddemo += (*recorddemo < 99); + } + /* Start game */ else if(key == KEY_CTRL_EXE && l.focus < wad_count) { return l.focus; } diff --git a/cgdoom/cgdoom-ui.h b/cgdoom/cgdoom-ui.h index 9436dbf..670fd22 100644 --- a/cgdoom/cgdoom-ui.h +++ b/cgdoom/cgdoom-ui.h @@ -71,7 +71,8 @@ int UI_Main(CGD_WADFileInfo *wads, int wad_count, int *trustunaligned, /* Trust unaligned lumps */ int *autostart, /* Skip title screen, straight to gameplay */ int *enabledemos, /* Enable demos on the title screen */ - int *enable2MBline /* Enable memory past the 2MB line */ + int *enable2MBline, /* Enable memory past the 2MB line */ + int *recorddemo /* Number of demo to record (-1 for none) */ ); /* Show an error with custom formatting. */ diff --git a/cgdoom/cgdoom.c b/cgdoom/cgdoom.c index 501bc96..87704ca 100644 --- a/cgdoom/cgdoom.c +++ b/cgdoom/cgdoom.c @@ -8,6 +8,7 @@ #include "m_misc.h" #include "d_main.h" #include "v_video.h" +#include "g_game.h" #include "cgdoom-alloc.h" #include "cgdoom-kbd.h" @@ -127,6 +128,7 @@ int CGD_SingleEpisodeUltimate = 0; int CGD_2MBLineMemory = 0; int CGD_Frameskip = 1; const char *CGD_WADFileName = NULL; +const char *CGD_RecordDemoName = NULL; /* Delayed file accesses */ CGD_DelayedFileWrite CGD_DelayedSaves[6] = { 0 }; @@ -583,6 +585,7 @@ int main(void) int wad_count = FindWADs(wads, 16); int dev_info = 0; + int recorddemo = -1; /* Set initial keyboard layout to thumbs-only */ CGD_LoadKeymap(CGD_Keymap_ThumbsOnly); @@ -600,7 +603,7 @@ int main(void) int choice = UI_Main(wads, wad_count, &dev_info, &CGD_WADMethod, &startmap, &startepisode, &CGD_TrustUnalignedLumps, &autostart_, - &CGD_EnableDemos, enable_2MBline); + &CGD_EnableDemos, enable_2MBline, &recorddemo); if(choice < 0) return 1; @@ -712,6 +715,13 @@ int main(void) /* Initialize the PRAM allocator */ CGD_PRAM_Init(PRAM0_alloc_start, PRAM0_END); + /* Set up demo recording for this session */ + if(recorddemo >= 0) { + static char demoname[20]; + sprintf(demoname, "DEMO%02d", recorddemo); + CGD_RecordDemoName = demoname; + } + memset(VRAM, 0, WIDTH*HEIGHT*2); D_DoomMain(); diff --git a/cgdoom/cgdoom.h b/cgdoom/cgdoom.h index 18edcb0..bac6fb6 100644 --- a/cgdoom/cgdoom.h +++ b/cgdoom/cgdoom.h @@ -71,6 +71,8 @@ extern int startmap, startepisode; extern const char *CGD_WADFileName; /* Save Game operations delayed until closing the add-in (one per save) */ extern CGD_DelayedFileWrite CGD_DelayedSaves[6]; +/* Name of record demo file */ +extern const char *CGD_RecordDemoName; // Keyboard interface. diff --git a/cgdoom/d_main.c b/cgdoom/d_main.c index b650f96..17e7bee 100644 --- a/cgdoom/d_main.c +++ b/cgdoom/d_main.c @@ -258,6 +258,9 @@ extern boolean demorecording; void D_DoomLoop (void) { + if (demorecording) + G_BeginRecording (); + I_InitGraphics (); while (!fuck) @@ -278,7 +281,8 @@ void D_DoomLoop (void) if(!(gametic % (CGD_Frameskip + 1))) D_Display (); } - // I_ShutdownGraphics(); + + G_CheckDemoStatus(); Z_Free(lumpinfo); CGD_PRAM_Free(lumpcache); I_ShutdownGraphics(); @@ -556,6 +560,9 @@ void D_DoomMain() ST_Init (); printf ("Engage... \n"); + if (CGD_RecordDemoName) + G_RecordDemo(CGD_RecordDemoName); + if (autostart) G_DeferedInitNew (startskill, startepisode, startmap); else diff --git a/cgdoom/g_game.c b/cgdoom/g_game.c index 1c5f8b9..af0c75a 100644 --- a/cgdoom/g_game.c +++ b/cgdoom/g_game.c @@ -121,13 +121,14 @@ int gametic; int levelstarttic; // gametic at level start int totalkills, totalitems, totalsecret; // for intermission -//char demoname[32]; -boolean demoplayback; -boolean netdemo = 0; +char demoname[32]; +boolean demorecording; +boolean demoplayback; +boolean netdemo = 0; byte* demobuffer; byte* demo_p; byte* demoend; -boolean singledemo; // quit after playing a demo from cmdline +boolean singledemo; // quit after playing a demo from cmdline boolean precache = false; // if true, load all graphics at start @@ -501,6 +502,9 @@ void G_Ticker (void) else G_BuildTiccmd (cmd); + if (demorecording) + G_WriteDemoTiccmd (cmd); + if (players[0].cmd.buttons & BT_SPECIAL) { switch (players[0].cmd.buttons & BT_SPECIALMASK) @@ -1257,21 +1261,22 @@ void G_ReadDemoTiccmd (ticcmd_t* cmd) void G_WriteDemoTiccmd (ticcmd_t* cmd) { - if (gamekeydown['q']) // press q to end demo recording + if (gamekeydown[KEY_ESCAPE]) // press MENU to end demo recording G_CheckDemoStatus (); *demo_p++ = (byte)cmd->forwardmove; *demo_p++ = (byte)cmd->sidemove; *demo_p++ = (byte)((cmd->angleturn+128)>>8); *demo_p++ = (byte)cmd->buttons; - demo_p -= 4; - if (demo_p > demoend - 16) +// demo_p -= 4; + if (demo_p > demoend - 12) { // no more space G_CheckDemoStatus (); return; } - G_ReadDemoTiccmd (cmd); // make SURE it is exactly the same +// G_ReadDemoTiccmd (cmd); // make SURE it is exactly the same + cmd->angleturn = demo_p[-2] << 8; } @@ -1279,6 +1284,43 @@ void G_WriteDemoTiccmd (ticcmd_t* cmd) // // G_RecordDemo // +void G_RecordDemo (const char* name) +{ + int maxsize; + + usergame = false; + strcpy (demoname, name); + strcat (demoname, ".lmp"); + /* CGDoom: Maximum is 64 kiB instead of 128 kiB */ + maxsize = 0x10000; + demobuffer = Z_Malloc (maxsize,PU_STATIC,NULL); + + if (demobuffer) { + demoend = demobuffer + maxsize; + demorecording = true; + } +} + + +void G_BeginRecording (void) +{ + int i; + + demo_p = demobuffer; + + *demo_p++ = VERSION; + *demo_p++ = gameskill; + *demo_p++ = gameepisode; + *demo_p++ = gamemap; + *demo_p++ = deathmatch; + *demo_p++ = respawnparm; + *demo_p++ = fastparm; + *demo_p++ = nomonsters; + *demo_p++ = consoleplayer; + + for (i=0 ; i