4747# define READ 0
4848# define WRITE 1
4949
50- # define VERSION "14.1.14 2026-06-28 "
50+ # define VERSION "14.1.15 2026-06-30 "
5151
5252/*
5353 * static declarations
5454 */
5555static const char * const usage =
56- "usage: %s [-h] [-V] [-c] [-e] [-f rogue] [-H] [-p] [-P player] [-r] [-s] [-S ROGOSEED] [-t] [-u] [-w] [-E]\n"
56+ "usage: %s [-h] [-V] [-c] [-d] [-D rgmdir] [-e] [-E] [-f rogue] [-H]\n"
57+ " [-p] [-P player] [-r] [-s [rogue_ver]] [-S ROGOSEED] [-t] [-u] [-w]\n"
5758 "\n"
5859 " -h print help message and exit\n"
5960 " -V print version string and exit\n"
6061 "\n"
6162 " -c use trap arrows\n"
6263 " -d use unique directory name\n"
64+ " -D rgmdir set rogomatic directory path\n"
6365 " -e echo file to roguelog\n"
66+ " -E set emacs mode\n"
6467 " -f rogue set path to rogue\n"
6568 " -H disable \"halftime\" show\n"
6669 " -p play back roguelog\n"
6770 " -P player set path to player\n"
6871 " -r use saved game\n"
69- " -s print scores only\n"
72+ " -s print rogomatic scores from the default rogomatic score file\n"
73+ " -s rogue_ver print scores the rogomatic score file for a given rogue version\n"
7074 " -S ROGOSEED set $ROGOSEED environment variable for rogue\n"
7175 " -t give status lines only\n"
7276 " -u start up in user mode\n"
7377 " -w set watched mode\n"
74- " -E set emacs mode\n"
7578 "\n"
7679 "Exit codes:\n"
7780 " 0 all OK\n"
@@ -114,6 +117,7 @@ main (int argc, char *argv[])
114117 char rogue_dir [MU_BUF + 1 ]; /* directory for the rogue files, not impacted by -d */
115118 unsigned int dnum = 0 ; /* rogue dungeon number to set */
116119 int player_lock_fd = -1 ; /* player lock file descriptor */
120+ char * rogue_ver = DEFVER ; /* rogue version string */
117121 extern char * optarg ; /* option argument */
118122 extern int optind ; /* argv index of the next arg */
119123 int i ;
@@ -147,7 +151,7 @@ main (int argc, char *argv[])
147151 /*
148152 * parse args
149153 */
150- while ((i = getopt (argc , argv , "hVcdD:ef:HpP:rsS :tuwE:" )) != -1 ) {
154+ while ((i = getopt (argc , argv , "hVcdD:ef:HpP:rs:S :tuwE:" )) != -1 ) {
151155 switch (i ) {
152156 case 'h' : /* -h ==> print usage message */
153157 fprintf (stderr , usage , program , prog , VERSION );
@@ -200,6 +204,7 @@ main (int argc, char *argv[])
200204
201205 case 's' : /* -s ==> Give scores only */
202206 score = true;
207+ rogue_ver = optarg ;
203208 break ;
204209
205210 case 'S' : /* -S SEED ==> set the rogomatic seed */
@@ -223,19 +228,31 @@ main (int argc, char *argv[])
223228 break ;
224229
225230 case ':' :
226- fprintf (stderr , "%s: requires an argument -- %c\n" , program , optopt );
227- fprintf (stderr , usage , program , prog , VERSION );
228- exit (3 );
231+ /*
232+ * case: -s without an argument
233+ */
234+ if (optopt == 's' ) {
235+ score = true;
236+ rogue_ver = DEFVER ; /* use the default rogue version */
237+
238+ /*
239+ * otherwise report missing argument
240+ */
241+ } else {
242+ fprintf (stderr , "%s: requires an argument -- %c\n" , program , optopt );
243+ fprintf (stderr , usage , program , prog , VERSION );
244+ exit (3 );
245+ }
229246 break ;
230247
231248 case '?' :
232- fprintf (stderr , "%s: unknown option -- %c\n" , program , optopt );
249+ fprintf (stderr , "%s: unknown option -- %c\n" , program , optopt );
233250 fprintf (stderr , usage , program , prog , VERSION );
234251 exit (3 );
235252 break ;
236253
237254 default :
238- fprintf (stderr , "%s: invalid -flag\n" , program );
255+ fprintf (stderr , "%s: invalid -flag\n" , program );
239256 fprintf (stderr , usage , program , prog , VERSION );
240257 exit (3 );
241258 break ;
@@ -292,6 +309,14 @@ main (int argc, char *argv[])
292309 */
293310 set_rgmdir (time_subpath );
294311
312+ /*
313+ * -s [version] dump score
314+ */
315+ if (score ) {
316+ dumpscore (rogue_ver );
317+ exit (0 );
318+ }
319+
295320 /*
296321 * verify that the player lock is not already locked
297322 *
@@ -387,14 +412,6 @@ main (int argc, char *argv[])
387412 "terse" , "noflush" , "jump" , "seefloor" , "nopassgo" , "tombstone" , "slow" , getname (), "apricot" ,
388413 rogue_dir , "rogue.sav" , rogue_dir , "rogue.scr" , rogue_dir , "rogue.lck" );
389414
390- /*
391- * special execution case: dumping rogomatic score
392- */
393- if (score ) {
394- dumpscore (argc == 1 ? argv [0 ] : DEFVER );
395- exit (0 );
396- }
397-
398415 /*
399416 * special execution case: replay log
400417 */
@@ -480,7 +497,7 @@ main (int argc, char *argv[])
480497
481498 if (rfile != NULL ) {
482499 rogue_savefile = form_path (rgmdir , "rogue.sav" );
483- execl (rfile , "rogue" , "-S" , "-r " , rogue_savefile , NULL );
500+ execl (rfile , "rogue" , "-S" , "-- " , rogue_savefile , NULL );
484501 fprintf (stderr , "ERROR: %s: file: %s line: %d dungeon: %u rogue default restore exec failed: %s -S -r %s: %s\n" ,
485502 __func__ , __FILE__ , __LINE__ , dnum , rfile , rogue_savefile , strerror (errno ));
486503 } else {
@@ -491,7 +508,7 @@ main (int argc, char *argv[])
491508 } else if (argc > 0 ) {
492509
493510 if (rfile != NULL ) {
494- execl (rfile , "rogue" , "-S" , argv [0 ], NULL );
511+ execl (rfile , "rogue" , "-S" , "--" , argv [0 ], NULL );
495512 fprintf (stderr , "ERROR: %s: file: %s line: %d dungeon: %u rogue restore exec failed: %s -S %s: %s\n" ,
496513 __func__ , __FILE__ , __LINE__ , dnum , rfile , argv [0 ], strerror (errno ));
497514 } else {
0 commit comments