From d0c3ebb5c2036dc4167258ed2976608636198927 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Thu, 6 Sep 2007 09:54:57 +0000 Subject: [PATCH] - Fixed: Several options while changing maps only worked for the regular exit but caused problems when used with the secret exit. Rewrote the code to set the next map at the beginning and removed all subsequent parts that tried to resolve it from the original data again. SVN r544 (trunk) --- docs/rh-log.txt | 6 +++ src/d_net.cpp | 3 +- src/g_level.cpp | 117 ++++++++++++++++++++++------------------------- src/g_level.h | 4 +- src/p_lnspec.cpp | 3 +- 5 files changed, 64 insertions(+), 69 deletions(-) diff --git a/docs/rh-log.txt b/docs/rh-log.txt index c49cbb023..0e692f311 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,9 @@ +September 5, 2007 (Changes by Graf Zahl) +- Fixed: Several options while changing maps only worked for the regular exit + but caused problems when used with the secret exit. Rewrote the code to + set the next map at the beginning and removed all subsequent parts that + tried to resolve it from the original data again. + August 19, 2007 (Changes by Graf Zahl) - Fixed: dumpmap crashed when used outside a map. diff --git a/src/d_net.cpp b/src/d_net.cpp index 18fac8f64..e215e7d85 100644 --- a/src/d_net.cpp +++ b/src/d_net.cpp @@ -2015,11 +2015,10 @@ void Net_DoCommand (int type, BYTE **stream, int player) case DEM_CHANGEMAP: // Change to another map without disconnecting other players s = ReadString (stream); - strncpy (level.nextmap, s, 8); // Using LEVEL_NOINTERMISSION tends to throw the game out of sync. // That was a long time ago. Maybe it works now? level.flags |= LEVEL_CHANGEMAPCHEAT; - G_ExitLevel (pos, false); + G_ChangeLevel(s, pos, false); break; case DEM_SUICIDE: diff --git a/src/g_level.cpp b/src/g_level.cpp index e8a26f497..a72204325 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -1635,33 +1635,51 @@ void G_InitNew (const char *mapname, bool bTitleLevel) // // G_DoCompleted // -bool secretexit; +static char nextlevel[9]; static int startpos; // [RH] Support for multiple starts per level extern int NoWipe; // [RH] Don't wipe when travelling in hubs static bool startkeepfacing; // [RH] Support for keeping your facing angle static bool resetinventory; // Reset the inventory to the player's default for the next level +static bool unloading; // [RH] The position parameter to these next three functions should // match the first parameter of the single player start spots // that should appear in the next map. -static void goOn (int position, bool keepFacing, bool secret, bool resetinv) +void G_ChangeLevel(const char * levelname, int position, bool keepFacing, int nextSkill, + bool nointermission, bool resetinv, bool nomonsters) { - static bool unloading; - if (unloading) { Printf (TEXTCOLOR_RED "Unloading scripts cannot exit the level again.\n"); return; } + strncpy (nextlevel, levelname, 8); + nextlevel[8] = 0; + + if (strncmp(nextlevel, "enDSeQ", 6)) + { + level_info_t *nextinfo = CheckLevelRedirect (FindLevelInfo (nextlevel)); + if (nextinfo) + { + strncpy(nextlevel, nextinfo->mapname, 8); + } + } + + if (nextSkill != -1) NextSkill = nextSkill; + + if (!nomonsters) dmflags = dmflags & ~DF_NO_MONSTERS; + else dmflags = dmflags | DF_NO_MONSTERS; + + if (nointermission) level.flags |= LEVEL_NOINTERMISSION; + cluster_info_t *thiscluster = FindClusterInfo (level.cluster); - cluster_info_t *nextcluster = FindClusterInfo (CheckLevelRedirect (FindLevelInfo (level.nextmap))->cluster); + cluster_info_t *nextcluster = FindClusterInfo (FindLevelInfo (nextlevel)->cluster); startpos = position; startkeepfacing = keepFacing; gameaction = ga_completed; - secretexit = secret; resetinventory = resetinv; bglobal.End(); //Added by MC: @@ -1687,32 +1705,23 @@ static void goOn (int position, bool keepFacing, bool secret, bool resetinv) void G_ExitLevel (int position, bool keepFacing) { - goOn (position, keepFacing, false, false); + G_ChangeLevel(level.nextmap, position, keepFacing); } -// Here's for the german edition. void G_SecretExitLevel (int position) { - // [RH] Check for secret levels is done in - // G_DoCompleted() + const char *nextmap; - goOn (position, false, true, false); -} + MapData * map = P_OpenMapData(level.secretmap); + if (map != NULL) + { + delete map; + nextmap = level.secretmap; + } + else + nextmap = level.nextmap; -void G_ChangeLevel(const char * levelname, int position, bool keepFacing, int nextSkill, - bool nointermission, bool resetinventory, bool nomonsters) -{ - strncpy (level.nextmap, levelname, 8); - level.nextmap[8] = 0; - - if (nextSkill != -1) NextSkill = nextSkill; - - if (!nomonsters) dmflags = dmflags & ~DF_NO_MONSTERS; - else dmflags = dmflags | DF_NO_MONSTERS; - - if (nointermission) level.flags |= LEVEL_NOINTERMISSION; - - goOn(position, keepFacing, false, resetinventory); + G_ChangeLevel(nextmap, position, false); } void G_DoCompleted (void) @@ -1723,7 +1732,7 @@ void G_DoCompleted (void) if (gamestate == GS_TITLELEVEL) { - strncpy (level.mapname, level.nextmap, 8); + strncpy (level.mapname, nextlevel, 8); G_DoLoadLevel (startpos, false); startpos = 0; viewactive = true; @@ -1750,40 +1759,22 @@ void G_DoCompleted (void) } else { - wminfo.next[0] = 0; - if (secretexit) + if (strncmp (nextlevel, "enDSeQ", 6) == 0) { - MapData * map = P_OpenMapData(level.secretmap); - if (map != NULL) - { - delete map; - strncpy (wminfo.next, level.secretmap, 8); - strncpy (wminfo.lname1, FindLevelInfo (level.secretmap)->pname, 8); - } - else - { - secretexit = false; - } + strncpy (wminfo.next, nextlevel, 8); + wminfo.lname1[0] = 0; } - if (!wminfo.next[0]) + else { - if (strncmp (level.nextmap, "enDSeQ", 6) == 0) - { - strncpy (wminfo.next, level.nextmap, 8); - wminfo.lname1[0] = 0; - } - else - { - level_info_t *nextinfo = CheckLevelRedirect (FindLevelInfo (level.nextmap)); - strncpy (wminfo.next, nextinfo->mapname, 8); - strncpy (wminfo.lname1, nextinfo->pname, 8); - } + level_info_t *nextinfo = FindLevelInfo (nextlevel); + strncpy (wminfo.next, nextinfo->mapname, 8); + strncpy (wminfo.lname1, nextinfo->pname, 8); } } CheckWarpTransMap (wminfo.next, true); - wminfo.next_ep = FindLevelInfo (wminfo.next)->cluster - 1; + wminfo.next_ep = FindLevelInfo (nextlevel)->cluster - 1; wminfo.maxkills = level.total_monsters; wminfo.maxitems = level.total_items; wminfo.maxsecret = level.total_secrets; @@ -1811,7 +1802,7 @@ void G_DoCompleted (void) // ordinary cluster (not a hub), take stuff from the player, but // leave the world vars alone. cluster_info_t *thiscluster = FindClusterInfo (level.cluster); - cluster_info_t *nextcluster = FindClusterInfo (CheckLevelRedirect (FindLevelInfo (level.nextmap))->cluster); + cluster_info_t *nextcluster = FindClusterInfo (wminfo.next_ep+1); // next_ep is cluster-1 EFinishLevelType mode; if (thiscluster != nextcluster || deathmatch || @@ -2036,7 +2027,6 @@ void G_WorldDone (void) { cluster_info_t *nextcluster; cluster_info_t *thiscluster; - char *nextmap; gameaction = ga_worlddone; @@ -2044,9 +2034,8 @@ void G_WorldDone (void) return; thiscluster = FindClusterInfo (level.cluster); - nextmap = !secretexit || !level.secretmap[0] ? level.nextmap : level.secretmap; - if (strncmp (nextmap, "enDSeQ", 6) == 0) + if (strncmp (nextlevel, "enDSeQ", 6) == 0) { F_StartFinale (thiscluster->messagemusic, thiscluster->musicorder, thiscluster->cdtrack, thiscluster->cdid, @@ -2057,7 +2046,7 @@ void G_WorldDone (void) } else { - nextcluster = FindClusterInfo (CheckLevelRedirect (FindLevelInfo (nextmap))->cluster); + nextcluster = FindClusterInfo (FindLevelInfo (nextlevel)->cluster); if (nextcluster->cluster != level.cluster && !deathmatch) { @@ -2095,7 +2084,7 @@ void G_DoWorldDone (void) } else { - strncpy (level.mapname, wminfo.next, 8); + strncpy (level.mapname, nextlevel, 8); } G_StartTravel (); G_DoLoadLevel (startpos, true); @@ -2388,17 +2377,19 @@ level_info_t *CheckLevelRedirect (level_info_t *info) { if (playeringame[i] && players[i].mo->FindInventory (type)) { - level_info_t *newinfo = FindLevelInfo (info->RedirectMap); - if (newinfo != NULL) + // check for actual presence of the map. + MapData * map = P_OpenMapData(info->RedirectMap); + if (map != NULL) { - info = newinfo; + delete map; + return FindLevelInfo(info->RedirectMap); } break; } } } } - return info; + return NULL; } static void SetLevelNum (level_info_t *info, int num) diff --git a/src/g_level.h b/src/g_level.h index bfe944e94..11db77d1f 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -320,8 +320,8 @@ void G_DeferedInitNew (const char *mapname, int skill = -1); void G_ExitLevel (int position, bool keepFacing); void G_SecretExitLevel (int position); -void G_ChangeLevel(const char * levelname, int position, bool keepFacing, int nextSkill, - bool showintermission, bool resetinventory, bool nomonsters); +void G_ChangeLevel(const char * levelname, int position, bool keepFacing, int nextSkill=-1, + bool nointermission=false, bool resetinventory=false, bool nomonsters=false); void G_SetForEndGame (char *nextmap); diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index f9de8f2f7..abcf2aaba 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -746,8 +746,7 @@ FUNC(LS_Teleport_NewMap) if (info && CheckIfExitIsGood (it)) { - strncpy (level.nextmap, info->mapname, 8); - G_ExitLevel (arg1, !!arg2); + G_ChangeLevel(info->mapname, arg1, !!arg2); return true; } }