]> granicus.if.org Git - nethack/commitdiff
main() reorganization (trunk only)
authornethack.rankin <nethack.rankin>
Sun, 2 Apr 2006 07:35:30 +0000 (07:35 +0000)
committernethack.rankin <nethack.rankin>
Sun, 2 Apr 2006 07:35:30 +0000 (07:35 +0000)
     Move some internals-related code out of port-specific main so that
it isn't duplicated a bunch of times.  One minor side-effect of this
change is that if you auto-pickup something at the very start of a game,
it will happen after any full moon/new moon/Friday 13th message rather
than before.  There's a second change for some:  the shared main() used
by several of the micro ports had a small difference in game play--if you
saved a game while on an engraving, it would automatically be read when
you resume--that will now occur for everybody [Elbereth weenies rejoice!].
pcmain() was also calling update_inventory() at start of play.  That's
unnecessary for new games, where inventory initialization triggers a call
to it for each item added to your pack; but I wasn't sure about restored
games, so everybody gets it there now.

     The Mac and BeOS ports evidently haven't been touched it some time;
they still referenced flags.move which got replaced by context.move quite
a while back.  The Windows GUI code has a declaration for mswin_moveloop()
which appears to be non-existant, but I left it alone.  I assume that the
Qt interface uses the existing main() routines; at least I couldn't find
any start of game code specific to it.  vmsmain's revised main() is the
only one which has been tested.

include/extern.h
src/allmain.c
src/restore.c
sys/be/bemain.c
sys/mac/macmain.c
sys/share/pcmain.c
sys/unix/unixmain.c
sys/vms/vmsmain.c
win/win32/winhack.c

index 393be35d5e17010ff249e132f9ea412bfddda9fc..59a0b79fbec5991b12574090cef37cd2116026c7 100644 (file)
@@ -20,7 +20,7 @@ E char *FDECL(fmt_ptr, (const genericptr,char *));
 
 /* ### allmain.c ### */
 
-E void NDECL(moveloop);
+E void FDECL(moveloop, (BOOLEAN_P));
 E void NDECL(stop_occupation);
 E void NDECL(display_gamewindows);
 E void NDECL(newgame);
index 62d6e6e282c66c199f48d6417511e7b0fdea38af..8f9edf5f8454838be0ed6606e843cadf73bcbfee 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)allmain.c  3.5     2003/04/02      */
+/*     SCCS Id: @(#)allmain.c  3.5     2006/04/01      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -15,7 +15,8 @@ STATIC_DCL void NDECL(do_positionbar);
 #endif
 
 void
-moveloop()
+moveloop(resuming)
+boolean resuming;
 {
 #if defined(MICRO) || defined(WIN32)
     char ch;
@@ -24,6 +25,19 @@ moveloop()
     int moveamt = 0, wtcap = 0, change = 0;
     boolean didmove = FALSE, monscanmove = FALSE;
 
+    /* Note:  these initializers don't do anything except guarantee that
+           we're linked properly.
+    */
+    decl_init();
+    monst_init();
+    monstr_init();     /* monster strengths */
+    objects_init();
+
+#ifdef WIZARD
+    if (wizard) add_debug_extended_commands();
+#endif
+
+    /* side-effects from the real world */
     flags.moonphase = phase_of_the_moon();
     if(flags.moonphase == FULL_MOON) {
        You("are lucky!  Full moon tonight.");
@@ -37,29 +51,24 @@ moveloop()
        change_luck(-1);
     }
 
-    initrack();
-
-
-    /* Note:  these initializers don't do anything except guarantee that
-           we're linked properly.
-    */
-    decl_init();
-    monst_init();
-    monstr_init();     /* monster strengths */
-    objects_init();
-
-#ifdef WIZARD
-    if (wizard) add_debug_extended_commands();
-#endif
+    if (!resuming) {   /* new game */
+       set_wear();             /* handle side-effects of worn starting gear */
+       (void) pickup(1);       /* autopickup at initial location */
+    } else {
+       update_inventory();             /* for perm_invent */
+       read_engr_at(u.ux, u.uy);       /* subset of pickup() */
+    }
 
     (void) encumber_msg(); /* in case they auto-picked up something */
     if (defer_see_monsters) {
        defer_see_monsters = FALSE;
        see_monsters();
     }
+    initrack();
 
     u.uz0.dlevel = u.uz.dlevel;
     youmonst.movement = NORMAL_SPEED;  /* give the hero some movement points */
+    context.move = 0;
 
     for(;;) {
        get_nh_event();
index ca2445bacf8dc99e6a5c9f8a1356dfd08d7106d0..5690967572246199d0053621fd555d77d506389d 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)restore.c  3.5     2005/12/14      */
+/*     SCCS Id: @(#)restore.c  3.5     2006/04/01      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -849,6 +849,7 @@ register int fd;
 
        /* Success! */
        welcome(FALSE);
+       check_special_room(FALSE);
        return(1);
 }
 
index 4c077be4f6a8d4205955662770c9c67f36aa6682..5e974657446d67de1e7f524a49cac432b145845e 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)bemain.c   3.5     1998/07/15      */
+/*     SCCS Id: @(#)bemain.c   3.5     2006/04/01      */
 /* Copyright (c) Dean Luick, 1996. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -22,7 +22,8 @@ static void getlock(void);
 int MAIN(int argc, char **argv)
 {
        int fd;
-       char *dir;      
+       char *dir;
+       boolean resuming = FALSE;       /* assume new game */
 
        dir = nh_getenv("NETHACKDIR");
        if (!dir) dir = nh_getenv("HACKDIR");
@@ -93,37 +94,32 @@ int MAIN(int argc, char **argv)
 #endif
                pline("Restoring save file...");
                mark_synch();   /* flush output */
-               if(!dorecover(fd))
-                       goto not_recovered;
+               if (dorecover(fd)) {
+                   resuming = TRUE;    /* not starting new game */
 #ifdef WIZARD
-               if(!wizard && remember_wiz_mode) wizard = TRUE;
+                   if (!wizard && remember_wiz_mode) wizard = TRUE;
 #endif
-               check_special_room(FALSE);
-               if (discover)
+                   if (discover)
                        You("are in non-scoring discovery mode.");
 
-               if (discover || wizard) {
+                   if (discover || wizard) {
                        if(yn("Do you want to keep the save file?") == 'n')
                            (void) delete_savefile();
                        else {
                            nh_compress(fqname(SAVEF, SAVEPREFIX, 0));
                        }
+                   }
                }
+       }
 
-               flags.move = 0;
-       } else {
-not_recovered:
+       if (!resuming) {
                player_selection();
                newgame();
                if (discover)
                        You("are in non-scoring discovery mode.");
-
-               flags.move = 0;
-               set_wear();
-               (void) pickup(1);
        }
 
-       moveloop();
+       moveloop(resuming);
        return 0;
 }
 
index 5d91a139e43cd362338aea3561dcbe8ad73b9e74..000514dc08861c93a42ac2728aa1b9774b9220d7 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)macmain.c  3.5     1997/01/22      */
+/*     SCCS Id: @(#)macmain.c  3.5     2006/04/01      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -37,6 +37,7 @@ main (void)
 {
        register int fd = -1;
        int argc = 1;
+       boolean resuming = FALSE;       /* assume new game */
 
        windowprocs = mac_procs;
        InitMac ();
@@ -108,11 +109,10 @@ main (void)
                mark_synch();   /* flush output */
                game_active = 1;
                if (dorecover(fd)) {
+                       resuming = TRUE;        /* not starting new game */
 #ifdef WIZARD
                        if(!wizard && remember_wiz_mode) wizard = TRUE;
 #endif
-                       check_special_room(FALSE);
-
                        if (discover || wizard) {
                                if(yn("Do you want to keep the save file?") == 'n')
                                        (void) delete_savefile();
@@ -121,25 +121,20 @@ main (void)
                                }
                        }
                }
-               else {
-                       fd = -1; /* set bad status */
-               }
        }
-       if (fd < 0) {
+
+       if (!resuming) {
                player_selection();
                game_active = 1;        /* done with selection, draw active game window */
                newgame();
-               set_wear();
-               (void) pickup(1);
        }
 
        if (discover)
                You("are in non-scoring discovery mode.");
-       flags.move = 0;
 
        UndimMenuBar (); /* Yes, this is the place for it (!) */
-       
-       moveloop();
+
+       moveloop(resuming);
 
        exit(EXIT_SUCCESS);
        /*NOTREACHED*/
index 407f87d9a66b4948e2aec90316e0775b733cd409..3172cdf5b713cb2a661ba0a8f307e4c2e343d7fe 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)pcmain.c   3.5     2002/08/22      */
+/*     SCCS Id: @(#)pcmain.c   3.5     2006/04/01      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -66,7 +66,7 @@ STATIC_DCL char *FDECL(exepath,(char *));
 
 int FDECL(main, (int,char **));
 
-extern void FDECL(pcmain, (int,char **));
+extern boolean FDECL(pcmain, (int,char **));
 
 
 #if defined(__BORLANDC__) && !defined(_WIN32)
@@ -84,18 +84,20 @@ main(argc,argv)
 int argc;
 char *argv[];
 {
-     pcmain(argc,argv);
+     boolean resuming;
+
+     resuming = pcmain(argc,argv);
 #ifdef LAN_FEATURES
      init_lan_features();
 #endif
-     moveloop();
+     moveloop(resuming);
      nethack_exit(EXIT_SUCCESS);
      /*NOTREACHED*/
      return 0;
 }
 #endif /*MSWIN_GRAPHICS*/
 
-void
+boolean
 pcmain(argc,argv)
 int argc;
 char *argv[];
@@ -110,6 +112,7 @@ char *argv[];
 #ifdef NOCWD_ASSUMPTIONS
        char failbuf[BUFSZ];
 #endif
+       boolean resuming = FALSE;       /* assume new game */
 
 #if defined(__BORLANDC__) && !defined(_WIN32)
        startup();
@@ -411,39 +414,29 @@ char *argv[];
                pline("Restoring save file...");
                mark_synch();   /* flush output */
 
-               if(!dorecover(fd))
-                       goto not_recovered;
+               if (dorecover(fd)) {
+                   resuming = TRUE;    /* not starting new game */
 #ifdef WIZARD
-               if(!wizard && remember_wiz_mode) wizard = TRUE;
+                   if (!wizard && remember_wiz_mode) wizard = TRUE;
 #endif
-               check_special_room(FALSE);
-               if (discover)
+                   if (discover)
                        You("are in non-scoring discovery mode.");
 
-               update_inventory();
-
-               if (discover || wizard) {
+                   if (discover || wizard) {
                        if(yn("Do you want to keep the save file?") == 'n')
                                (void) delete_savefile();
                        else {
                            nh_compress(fqname(SAVEF, SAVEPREFIX, 0));
                        }
-
+                   }
                }
+       }
 
-               context.move = 0;
-       } else {
-not_recovered:
+       if (!resuming) {
                player_selection();
                newgame();
                if (discover)
                        You("are in non-scoring discovery mode.");
-
-               context.move = 0;
-               set_wear();
-               (void) pickup(1);
-               read_engr_at(u.ux,u.uy);
-               update_inventory();
        }
 
 #ifndef NO_SIGNAL
@@ -452,7 +445,7 @@ not_recovered:
 #ifdef OS2
        gettty(); /* somehow ctrl-P gets turned back on during startup ... */
 #endif
-       return;
+       return resuming;
 }
 
 STATIC_OVL void
index 11f7a93199271c05134b2effce18a16768c4dbd2..b949e095bfdd091362d977286ab48d53a715ae92 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)unixmain.c 3.5     1997/01/22      */
+/*     SCCS Id: @(#)unixmain.c 3.5     2006/04/01      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -54,6 +54,7 @@ char *argv[];
        register char *dir;
 #endif
        boolean exact_username;
+       boolean resuming = FALSE;       /* assume new game */
 
 #if defined(__APPLE__)
        /* special hack to change working directory to a resource fork when
@@ -274,35 +275,30 @@ char *argv[];
 #endif
                pline("Restoring save file...");
                mark_synch();   /* flush output */
-               if(!dorecover(fd))
-                       goto not_recovered;
+               if (dorecover(fd)) {
+                   resuming = TRUE;    /* not starting new game */
 #ifdef WIZARD
-               if(!wizard && remember_wiz_mode) wizard = TRUE;
+                   if (!wizard && remember_wiz_mode) wizard = TRUE;
 #endif
-               check_special_room(FALSE);
-               wd_message();
-
-               if (discover || wizard) {
+                   wd_message();
+                   if (discover || wizard) {
                        if(yn("Do you want to keep the save file?") == 'n')
                            (void) delete_savefile();
                        else {
                            (void) chmod(fq_save,FCMASK); /* back to readable */
                            nh_compress(fq_save);
                        }
+                   }
                }
-               context.move = 0;
-       } else {
-not_recovered:
+       }
+
+       if (!resuming) {
                player_selection();
                newgame();
                wd_message();
-
-               context.move = 0;
-               set_wear();
-               (void) pickup(1);
        }
 
-       moveloop();
+       moveloop(resuming);
        exit(EXIT_SUCCESS);
        /*NOTREACHED*/
        return(0);
index 249032fa938ec2f9051f2532b3b568523867c68e..b8fd1850eb459b4ce50f4b51f49442a37a6bbdcb 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)vmsmain.c  3.5     2003/10/16      */
+/*     SCCS Id: @(#)vmsmain.c  3.5     2006/04/01      */
 /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
 /* NetHack may be freely redistributed.  See license for details. */
 /* main.c - VMS NetHack */
@@ -36,6 +36,7 @@ char *argv[];
 #ifdef CHDIR
        register char *dir;
 #endif
+       boolean resuming = FALSE;       /* assume new game */
 
 #ifdef SECURE  /* this should be the very first code executed */
        privoff();
@@ -195,34 +196,28 @@ char *argv[];
 #endif
                pline("Restoring save file...");
                mark_synch();   /* flush output */
-               if(!dorecover(fd))
-                       goto not_recovered;
+               if (dorecover(fd)) {
+                   resuming = TRUE;    /* not starting new game */
 #ifdef WIZARD
-               if(!wizard && remember_wiz_mode) wizard = TRUE;
+                   if (!wizard && remember_wiz_mode) wizard = TRUE;
 #endif
-               check_special_room(FALSE);
-               wd_message();
-
-               if (discover || wizard) {
+                   wd_message();
+                   if (discover || wizard) {
                        if (yn("Do you want to keep the save file?") == 'n')
                            (void) delete_savefile();
                        else
                            (void) chmod(fq_save,FCMASK); /* back to readable */
+                   }
                }
+       }
 
-               context.move = 0;
-       } else {
-not_recovered:
+       if (!resuming) {
                player_selection();
                newgame();
                wd_message();
-
-               context.move = 0;
-               set_wear();
-               (void) pickup(1);
        }
 
-       moveloop();
+       moveloop(resuming);
        exit(EXIT_SUCCESS);
        /*NOTREACHED*/
        return(0);
index 52e0972cabd70e32550ff1c09d56f2046cbaa1c5..317ff5405c95eec8fcd2afdb3f5ead50f92b1f4f 100644 (file)
@@ -1,4 +1,4 @@
-/*     SCCS Id: @(#)winhack.c  3.5     2005/01/23      */
+/*     SCCS Id: @(#)winhack.c  3.5     2006/04/01      */
 /* Copyright (C) 2001 by Alex Kompel    */
 /* NetHack may be freely redistributed.  See license for details. */
 
@@ -62,7 +62,7 @@ NHWinApp _nethack_app;
 #endif
 
 // Foward declarations of functions included in this code module:
-extern void FDECL(pcmain, (int,char **));
+extern boolean FDECL(pcmain, (int,char **));
 static void __cdecl mswin_moveloop(void *);
 
 #define MAX_CMDLINE_PARAM 255
@@ -80,6 +80,7 @@ int APIENTRY WinMain(HINSTANCE hInstance,
        TCHAR wbuf[BUFSZ];
        char buf[BUFSZ];
     DWORD major, minor;
+       boolean resuming;
 
 
        /* ensure that we don't access violate on a panic() */
@@ -174,9 +175,9 @@ int APIENTRY WinMain(HINSTANCE hInstance,
         }
         free(savefile);
     }
-       pcmain(argc,argv);
+       resuming = pcmain(argc,argv);
 
-       moveloop();
+       moveloop(resuming);
 
        return 0;
 }