From: nethack.rankin Date: Sun, 2 Apr 2006 07:35:30 +0000 (+0000) Subject: main() reorganization (trunk only) X-Git-Tag: MOVE2GIT~1074 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2c0a072ef1df0b39728c799517ec5a9996f6a86f;p=nethack main() reorganization (trunk only) 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. --- diff --git a/include/extern.h b/include/extern.h index 393be35d5..59a0b79fb 100644 --- a/include/extern.h +++ b/include/extern.h @@ -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); diff --git a/src/allmain.c b/src/allmain.c index 62d6e6e28..8f9edf5f8 100644 --- a/src/allmain.c +++ b/src/allmain.c @@ -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(); diff --git a/src/restore.c b/src/restore.c index ca2445bac..569096757 100644 --- a/src/restore.c +++ b/src/restore.c @@ -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); } diff --git a/sys/be/bemain.c b/sys/be/bemain.c index 4c077be4f..5e9746574 100644 --- a/sys/be/bemain.c +++ b/sys/be/bemain.c @@ -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; } diff --git a/sys/mac/macmain.c b/sys/mac/macmain.c index 5d91a139e..000514dc0 100644 --- a/sys/mac/macmain.c +++ b/sys/mac/macmain.c @@ -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*/ diff --git a/sys/share/pcmain.c b/sys/share/pcmain.c index 407f87d9a..3172cdf5b 100644 --- a/sys/share/pcmain.c +++ b/sys/share/pcmain.c @@ -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 diff --git a/sys/unix/unixmain.c b/sys/unix/unixmain.c index 11f7a9319..b949e095b 100644 --- a/sys/unix/unixmain.c +++ b/sys/unix/unixmain.c @@ -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); diff --git a/sys/vms/vmsmain.c b/sys/vms/vmsmain.c index 249032fa9..b8fd1850e 100644 --- a/sys/vms/vmsmain.c +++ b/sys/vms/vmsmain.c @@ -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); diff --git a/win/win32/winhack.c b/win/win32/winhack.c index 52e0972ca..317ff5405 100644 --- a/win/win32/winhack.c +++ b/win/win32/winhack.c @@ -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; }