diff --git a/source/games/duke/src/ccmds.cpp b/source/games/duke/src/ccmds.cpp index c084c2991..9c37f77b5 100644 --- a/source/games/duke/src/ccmds.cpp +++ b/source/games/duke/src/ccmds.cpp @@ -54,7 +54,7 @@ static void dowarp(MapRecord *map) if (ps[myconnectindex].gm & MODE_GAME) { - G_NewGame(map, ud.m_player_skill); + newgame(map, ud.m_player_skill); ps[myconnectindex].gm = MODE_RESTART; } else G_NewGame_EnterLevel(map, ud.m_player_skill); diff --git a/source/games/duke/src/funct.h b/source/games/duke/src/funct.h index 65529c92c..48f1fe7fd 100644 --- a/source/games/duke/src/funct.h +++ b/source/games/duke/src/funct.h @@ -3,6 +3,8 @@ #include "screenjob.h" #include "constants.h" +struct MapRecord; + BEGIN_DUKE_NS // dumping ground for all external function prototypes to keep them out of the important headers. @@ -221,5 +223,7 @@ void prelevel_r(int g); void e4intro(CompletionFunc completion); void clearfrags(void); int exitlevel(); +int enterlevel(MapRecord* mi, int gm); +void newgame(MapRecord* mi, int sk); END_DUKE_NS diff --git a/source/games/duke/src/game.h b/source/games/duke/src/game.h index 2404d2969..a5d7ac253 100644 --- a/source/games/duke/src/game.h +++ b/source/games/duke/src/game.h @@ -90,7 +90,7 @@ static inline int32_t calc_smoothratio(ClockTicks totalclk, ClockTicks ototalclk static inline void G_NewGame_EnterLevel(MapRecord *map, int skill) { - G_NewGame(map, skill); + newgame(map, skill); if (enterlevel(map, MODE_GAME)) G_BackToMenu(); diff --git a/source/games/duke/src/premap.cpp b/source/games/duke/src/premap.cpp index 3c96331c0..2a4b427e5 100644 --- a/source/games/duke/src/premap.cpp +++ b/source/games/duke/src/premap.cpp @@ -768,6 +768,94 @@ void resettimevars(void) // //--------------------------------------------------------------------------- +void newgame(MapRecord* map, int sk) +{ + auto p = &ps[0]; + handleevents(); + ready2send = 0; + +#if 0 + if (ud.m_recstat != 2 && ud.last_level >= 0 && ud.multimode > 1 && ud.coop != 1) + dobonus(1); + + if (isRR() && !isRRRA() && map->levelNumber == levelnum(0, 6)) + dobonus(0); +#endif + + show_shareware = 26 * 34; + + ud.nextLevel = map; + ud.player_skill = sk; + ud.secretlevel = 0; + ud.from_bonus = 0; + + ud.last_level = -1; + + if (!isRR() && map->levelNumber == levelnum(3, 0) && (ud.multimode < 2)) + { + e4intro([](bool) {}); + } + + p->zoom = 768; + p->gm = 0; + M_ClearMenus(); + ResetGameVars(); + + if (m_coop != 1) + { + if (isWW2GI()) + { + for (int i = 0; i < 12/*MAX_WEAPONS*/; i++) // aboive 12 have no data defined and would crash. + { + if (aplWeaponWorksLike[i][0] == PISTOL_WEAPON) + { + p->curr_weapon = i; + p->gotweapon.Set(i); + p->ammo_amount[i] = 48; + } + else if (aplWeaponWorksLike[i][0] == KNEE_WEAPON || aplWeaponWorksLike[i][0] == HANDREMOTE_WEAPON) + { + p->gotweapon.Set(i); + } + } + } + else + { + p->curr_weapon = PISTOL_WEAPON; + p->gotweapon.Set(PISTOL_WEAPON); + p->gotweapon.Set(KNEE_WEAPON); + p->ammo_amount[PISTOL_WEAPON] = 48; + p->gotweapon.Set(HANDREMOTE_WEAPON); + p->last_weapon = -1; + } + + p->last_weapon = -1; + } + + display_mirror = 0; + + if (ud.multimode > 1) + { + if (numplayers < 2) + { + connecthead = 0; + for (int i = 0; i < MAXPLAYERS; i++) connectpoint2[i] = i + 1; + connectpoint2[ud.multimode - 1] = -1; + } + } + else + { + connecthead = 0; + connectpoint2[0] = -1; + } +} + +//--------------------------------------------------------------------------- +// +// +// +//--------------------------------------------------------------------------- + static int LoadTheMap(MapRecord *mi, struct player_struct *p, int gamemode) { int16_t lbang; diff --git a/source/games/duke/src/premap.h b/source/games/duke/src/premap.h index 11b937610..bea035254 100644 --- a/source/games/duke/src/premap.h +++ b/source/games/duke/src/premap.h @@ -29,8 +29,6 @@ BEGIN_DUKE_NS extern int16_t ambientlotag[64]; extern int16_t ambienthitag[64]; -int enterlevel(MapRecord *mi, int gameMode); -void G_NewGame(MapRecord *mi, int skillNum); void P_ResetPlayer(int pn); void G_ResetInterpolations(void); void G_InitRRRASkies(void); diff --git a/source/games/duke/src/zz_premap.cpp b/source/games/duke/src/zz_premap.cpp index 1ec81375c..7bacdc142 100644 --- a/source/games/duke/src/zz_premap.cpp +++ b/source/games/duke/src/zz_premap.cpp @@ -63,74 +63,6 @@ void G_InitRRRASkies(void) } } -void G_NewGame(MapRecord *map, int skillNum) -{ - struct player_struct *const pPlayer = g_player[0].ps; - - handleevents(); - - ready2send = 0; - -#if 0 - if (m_recstat != 2 && ud.last_level >= 0 && - (g_netServer || ud.multimode > 1) && (ud.coop&GAMETYPE_SCORESHEET)) - { - dobonus(1); - } - - if (isRR() && !isRRRA() && map->levelNumber == levelnum(0, 6)) - dobonus(0); -#endif - - show_shareware = REALGAMETICSPERSEC*30; - - ud.nextLevel = map; - ud.player_skill = skillNum; - ud.secretlevel = 0; - ud.from_bonus = 0; - - ud.last_level = -1; - - int const UserMap = false;// Menu_HaveUserMap(); - - // we don't want the intro to play after the multiplayer setup screen. - if (!isRR() && (!g_netServer && ud.multimode < 2) && UserMap == 0 && map->levelNumber == levelnum(3, 0)) - { - e4intro([](bool) {}); - } - - pPlayer->zoom = 768; - pPlayer->gm = 0; - M_ClearMenus(); - - ResetGameVars(); - - //AddLog("Newgame"); - - if (m_coop != 1) - { - for (int weaponNum = 0; weaponNum < 12/*MAX_WEAPONS*/; weaponNum++) - { - auto const worksLike = isWW2GI() ? PWEAPON(0, weaponNum, WorksLike) : weaponNum; - if (worksLike == PISTOL_WEAPON) - { - pPlayer->curr_weapon = weaponNum; - pPlayer->gotweapon.Set(weaponNum); - pPlayer->ammo_amount[weaponNum] = min(max_ammo_amount[weaponNum], 48); - } - else if (worksLike == KNEE_WEAPON || (!isRR() && worksLike == HANDREMOTE_WEAPON) || (isRRRA() && worksLike == SLINGBLADE_WEAPON)) - { - pPlayer->gotweapon.Set(weaponNum); - if (isRRRA()) - pPlayer->ammo_amount[KNEE_WEAPON] = 1; - } - } - pPlayer->last_weapon = -1; - } - - display_mirror = 0; -} - void resetpspritevars(int gameMode); void clearfrags(void)