diff -Naur rogue5.4.4.orig/extern.c rogue5.4.4/extern.c
--- rogue5.4.4.orig/extern.c	2007-09-05 19:08:06.000000000 +0000
+++ rogue5.4.4/extern.c	2012-01-29 21:21:39.000000000 +0000
@@ -51,6 +51,8 @@
 
 char dir_ch;				/* Direction from last get_dir() call */
 char file_name[MAXSTR];			/* Save file name */
+char game_name[MAXSTR];			/* Save game name */
+char save_path[MAXSTR];			/* Save path */
 char huh[MAXSTR];			/* The last message printed */
 char *p_colors[MAXPOTIONS];		/* Colors of the potions */
 char prbuf[2*MAXSTR];			/* buffer for sprintfs */
diff -Naur rogue5.4.4.orig/main.c rogue5.4.4/main.c
--- rogue5.4.4.orig/main.c	2007-09-05 19:08:06.000000000 +0000
+++ rogue5.4.4/main.c	2012-01-29 21:21:39.000000000 +0000
@@ -14,6 +14,7 @@
 #include <time.h>
 #include <curses.h>
 #include "rogue.h"
+#include <sys/stat.h>
 
 /*
  * main:
@@ -48,8 +49,19 @@
 
     strncpy(home, md_gethomedir(), MAXSTR);
 
-    strcpy(file_name, home);
-    strcat(file_name, "rogue.save");
+    strncpy(save_path, home, MAXSTR);
+    strncat(save_path, ".rogue", MAXSTR);
+    mkdir(save_path, S_IRWXU | S_IRGRP | S_IROTH); /* mkdir ~/.rogue ; chmod 644 */
+
+    /* read the game name */
+    if ((argc==3) && !strcmp(argv[1],"-r") && strcmp(argv[2],"")) {
+      strncpy(game_name, argv[2], MAXSTR);
+    } else strncpy(game_name, "default", MAXSTR);
+
+    strncpy(file_name, save_path, MAXSTR);
+    strncat(file_name, "/", MAXSTR);
+    strncat(file_name, game_name, MAXSTR);
+    strncat(file_name, ".save", MAXSTR);
 
     if ((env = getenv("ROGUEOPTS")) != NULL)
 	parse_opts(env);
@@ -101,7 +113,7 @@
     }
 
     init_check();			/* check for legal startup */
-    if (argc == 2)
+    if ((argc == 2) || (argc == 3))
 	if (!restore(argv[1], envp))	/* Note: restore will never return */
 	    my_exit(1);
 #ifdef MASTER
diff -Naur rogue5.4.4.orig/rogue.h rogue5.4.4/rogue.h
--- rogue5.4.4.orig/rogue.h	2007-09-05 19:08:06.000000000 +0000
+++ rogue5.4.4/rogue.h	2012-01-29 21:21:39.000000000 +0000
@@ -467,9 +467,9 @@
 		passgo, playing, q_comm, running, save_msg, see_floor,
 		seenstairs, stat_msg, terse, to_death, tombstone;
 
-extern char	dir_ch, file_name[], home[], huh[], *inv_t_name[],
-		l_last_comm, l_last_dir, last_comm, last_dir, *Numname,
-		outbuf[], *p_colors[], *r_stones[], *release, runch,
+extern char	dir_ch, file_name[], game_name[], save_path[], home[], huh[],
+		*inv_t_name[], l_last_comm, l_last_dir, last_comm, last_dir,
+		*Numname, outbuf[], *p_colors[], *r_stones[], *release, runch,
 		*s_names[], take, *tr_name[], *ws_made[], *ws_type[];
 
 extern int	a_class[], count, food_left, hungry_state, inpack,
diff -Naur rogue5.4.4.orig/save.c rogue5.4.4/save.c
--- rogue5.4.4.orig/save.c	2007-09-05 19:08:06.000000000 +0000
+++ rogue5.4.4/save.c	2012-01-29 21:26:18.000000000 +0000
@@ -43,11 +43,11 @@
      */
     mpos = 0;
 over:
-    if (file_name[0] != '\0')
+    if (game_name[0] != '\0')
     {
 	for (;;)
 	{
-	    msg("save file (%s)? ", file_name);
+	    msg("game name = \"%s\" ? (y/n)", game_name);
 	    c = readchar();
 	    mpos = 0;
 	    if (c == ESCAPE)
@@ -64,7 +64,6 @@
 	{
 	    addstr("Yes\n");
 	    refresh();
-	    strcpy(buf, file_name);
 	    goto gotfile;
 	}
     }
@@ -72,7 +71,7 @@
     do
     {
 	mpos = 0;
-	msg("file name: ");
+	msg("new game name: ");
 	buf[0] = '\0';
 	if (get_str(buf, stdscr) == QUIT)
 	{
@@ -80,12 +79,17 @@
 	    msg("");
 	    return;
 	}
+	strncpy(game_name, buf, MAXSTR);
 	mpos = 0;
 gotfile:
 	/*
 	 * test to see if the file exists
 	 */
-	if (stat(buf, &sbuf) >= 0)
+	strncpy(file_name, save_path, MAXSTR);
+	strncat(file_name, "/", MAXSTR);
+	strncat(file_name, game_name, MAXSTR);
+	strncat(file_name, ".save", MAXSTR);
+	if (stat(file_name, &sbuf) >= 0)
 	{
 	    for (;;)
 	    {
@@ -100,10 +104,9 @@
 		else
 		    msg("Please answer Y or N");
 	    }
-	    msg("file name: %s", buf);
+	    msg("file name: %s", file_name);
 	    md_unlink(file_name);
 	}
-	strcpy(file_name, buf);
 	if ((savef = fopen(file_name, "w")) == NULL)
 	    msg(strerror(errno));
     } while (savef == NULL);
@@ -219,7 +222,7 @@
      * inode for as long as possible
      */
 
-    if (
+/*    if (
 #ifdef MASTER
 	!wizard &&
 #endif
@@ -227,7 +230,7 @@
     {
 	printf("Cannot unlink file\n");
 	return FALSE;
-    }
+    }*/
     mpos = 0;
 /*    printw(0, 0, "%s: %s", file, ctime(&sbuf2.st_mtime)); */
 /*
