diff --git a/docs/rh-log.txt b/docs/rh-log.txt index 6f1bce807..e629bb6e3 100644 --- a/docs/rh-log.txt +++ b/docs/rh-log.txt @@ -1,3 +1,6 @@ +November 2, 2007 (Changes by Graf Zahl) +- Added skill definitions to MAPINFO. + October 29, 2007 (Changes by Graf Zahl) - added two new things which can set a sector's color without the need of tags or scripts. ColorSetter (#9038) sets the sector's color and FadeSetter (#9039) diff --git a/src/doomdef.h b/src/doomdef.h index d19d875c3..c72423031 100644 --- a/src/doomdef.h +++ b/src/doomdef.h @@ -104,6 +104,7 @@ typedef enum typedef float skill_t; +/* enum ESkillLevels { sk_baby, @@ -112,6 +113,7 @@ enum ESkillLevels sk_hard, sk_nightmare }; +*/ diff --git a/src/g_level.cpp b/src/g_level.cpp index 73293e834..a6477d5a9 100644 --- a/src/g_level.cpp +++ b/src/g_level.cpp @@ -71,6 +71,7 @@ #include "version.h" #include "m_menu.h" #include "statnums.h" +#include "vectors.h" #include "gi.h" @@ -100,6 +101,9 @@ static void SetLevelNum (level_info_t *info, int num); static void ClearEpisodes (); static void ClearLevelInfoStrings (level_info_t *linfo); static void ClearClusterInfoStrings (cluster_info_t *cinfo); +static void ParseSkill (); +static void G_VerifySkill(); +static void InitializeDefaultSkills(); static FRandom pr_classchoice ("RandomPlayerClassChoice"); @@ -134,6 +138,7 @@ level_locals_t level; // info about current level static TArray wadclusterinfos; TArray wadlevelinfos; +TArray AllSkills; // MAPINFO is parsed slightly differently when the map name is just a number. static bool HexenHack; @@ -170,6 +175,8 @@ static const char *MapInfoTopLevel[] = "clusterdef", "episode", "clearepisodes", + "skill", + "clearskills", NULL }; @@ -179,7 +186,9 @@ enum MITL_DEFAULTMAP, MITL_CLUSTERDEF, MITL_EPISODE, - MITL_CLEAREPISODES + MITL_CLEAREPISODES, + MITL_SKILL, + MITL_CLEARSKILLS, }; static const char *MapInfoMapLevel[] = @@ -515,6 +524,7 @@ void G_ParseMapInfo () int lump, lastlump = 0; atterm (G_UnloadMapInfo); + InitializeDefaultSkills(); // Parse the default MAPINFO for the current game. switch (gameinfo.gametype) @@ -564,6 +574,10 @@ void G_ParseMapInfo () { I_FatalError ("You cannot use clearepisodes in a MAPINFO if you do not define any new episodes after it."); } + if (AllSkills.Size()==0) + { + InitializeDefaultSkills(); + } } static void G_DoParseMapInfo (int lump) @@ -721,6 +735,15 @@ static void G_DoParseMapInfo (int lump) case MITL_CLEAREPISODES: ClearEpisodes (); break; + + case MITL_SKILL: + ParseSkill(); + break; + + case MITL_CLEARSKILLS: + AllSkills.Clear(); + break; + } } SC_Close (); @@ -1489,12 +1512,7 @@ void G_InitNew (const char *mapname, bool bTitleLevel) } UnlatchCVars (); - - if (gameskill > sk_nightmare) - gameskill = sk_nightmare; - else if (gameskill < sk_baby) - gameskill = sk_baby; - + G_VerifySkill(); UnlatchCVars (); if (paused) @@ -3015,52 +3033,252 @@ static void InitPlayerClasses () } -int G_SkillProperty(ESkillProperty prop) +static void ParseSkill () { - switch(prop) + FSkillInfo skill; + + skill.AmmoFactor = FRACUNIT; + skill.DamageFactor = FRACUNIT; + skill.FastMonsters = false; + skill.DisableCheats = false; + skill.EasyBossBrain = false; + skill.AutoUseHealth = false; + skill.RespawnCounter = 0; + skill.Aggressiveness = FRACUNIT; + skill.SpawnFilter = 0; + skill.ACSReturn = AllSkills.Size(); + skill.MenuNameIsLump = false; + skill.MustConfirm = false; + skill.shortcut=0; + + SC_MustGetString(); + skill.name = sc_String; + + while (SC_GetString ()) { - case SKILLP_AmmoFactor: - if (gameskill == sk_baby || (gameskill == sk_nightmare && gameinfo.gametype != GAME_Strife)) + if (SC_Compare ("ammofactor")) { - if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) - return FRACUNIT; - else - return FRACUNIT*3/2; + SC_MustGetFloat (); + skill.AmmoFactor = FLOAT2FIXED(sc_Float); } - return FRACUNIT; - - case SKILLP_DamageFactor: - if (gameskill == sk_baby) return FRACUNIT/2; - return FRACUNIT; - - case SKILLP_FastMonsters: - return (gameskill == sk_nightmare || (dmflags & DF_FAST_MONSTERS)); - - case SKILLP_Respawn: - if (dmflags & DF_MONSTERS_RESPAWN || - gameinfo.gametype & (GAME_DoomStrife) && gameskill == sk_nightmare) + else if (SC_Compare ("damagefactor")) { - return TICRATE * (gameinfo.gametype != GAME_Strife ? 12 : 16); + SC_MustGetFloat (); + skill.AmmoFactor = FLOAT2FIXED(sc_Float); + } + else if (SC_Compare ("fastmonsters")) + { + skill.FastMonsters = true; + } + else if (SC_Compare ("disablecheats")) + { + skill.DisableCheats = true; + } + else if (SC_Compare ("easybossbrain")) + { + skill.EasyBossBrain = true; + } + else if (SC_Compare("autousehealth")) + { + skill.AutoUseHealth = true; + } + else if (SC_Compare("respawntime")) + { + SC_MustGetFloat (); + skill.RespawnCounter = int(sc_Float*TICRATE); + } + else if (SC_Compare("Aggressiveness")) + { + SC_MustGetFloat (); + skill.Aggressiveness = FRACUNIT - FLOAT2FIXED(clamp(sc_Float, 0,1)); + } + else if (SC_Compare("SpawnFilter")) + { + SC_MustGetString (); + strlwr(sc_String); + if (strstr(sc_String, "easy")) skill.SpawnFilter|=MTF_EASY; + if (strstr(sc_String, "normal")) skill.SpawnFilter|=MTF_NORMAL; + if (strstr(sc_String, "hard")) skill.SpawnFilter|=MTF_HARD; + } + else if (SC_Compare("ACSReturn")) + { + SC_MustGetNumber (); + skill.ACSReturn = sc_Number; + } + else if (SC_Compare("MenuName")) + { + SC_MustGetString (); + skill.MenuName = sc_String; + skill.MenuNameIsLump = false; + } + else if (SC_Compare("MenuLump")) + { + SC_MustGetString (); + skill.MenuName = sc_String; + skill.MenuNameIsLump = true; + } + else if (SC_Compare("MustConfirm")) + { + skill.MustConfirm = true; } else { - return 0; + SC_UnGet (); + break; } + } + for(int i=0;i 0) + { + switch(prop) + { + case SKILLP_AmmoFactor: + return AllSkills[gameskill].AmmoFactor; - case SKILLP_DisableCheats: - return gameskill == sk_nightmare; + case SKILLP_DamageFactor: + return AllSkills[gameskill].DamageFactor; - case SKILLP_AutoUseHealth: - return gameskill == sk_baby; + case SKILLP_FastMonsters: + return AllSkills[gameskill].FastMonsters || (dmflags & DF_FAST_MONSTERS); - case SKILLP_EasyBossBrain: - return gameskill == sk_baby; + case SKILLP_Respawn: + if (dmflags & DF_MONSTERS_RESPAWN && AllSkills[gameskill].RespawnCounter==0) + return TICRATE * (gameinfo.gametype != GAME_Strife ? 12 : 16); + return AllSkills[gameskill].RespawnCounter; - case SKILLP_SpawnFilter: - return gameskill <= sk_easy? MTF_EASY : gameskill == sk_medium? MTF_NORMAL : MTF_HARD; + case SKILLP_Aggressiveness: + return AllSkills[gameskill].Aggressiveness; + + case SKILLP_DisableCheats: + return AllSkills[gameskill].DisableCheats; + + case SKILLP_AutoUseHealth: + return AllSkills[gameskill].AutoUseHealth; + + case SKILLP_EasyBossBrain: + return AllSkills[gameskill].EasyBossBrain; + + case SKILLP_SpawnFilter: + return AllSkills[gameskill].SpawnFilter; + + case SKILLP_ACSReturn: + return AllSkills[gameskill].ACSReturn; + } } return 0; } + +static void InitializeDefaultSkills() +{ + FSkillInfo skill; + EGameType g = gameinfo.gametype; + + skill.shortcut=0; + + // sk_baby + skill.name = "baby"; + skill.AmmoFactor = (g & GAME_DoomStrife) ? FRACUNIT*2 : FRACUNIT*3/2; + skill.DamageFactor = FRACUNIT/2; + skill.FastMonsters = false; + skill.DisableCheats = false; + skill.EasyBossBrain = true; + skill.AutoUseHealth = true; + skill.RespawnCounter = 0; + skill.Aggressiveness = FRACUNIT; + skill.SpawnFilter = MTF_EASY; + skill.ACSReturn = 0; + skill.MenuName = g&GAME_DoomStrife ? "M_JKILL" : "MNU_WETNURSE"; + skill.MenuNameIsLump = !!(g&GAME_DoomStrife); + skill.MustConfirm = false; + if (g & GAME_Hexen) + { + skill.MenuNamesForPlayerClass["fighter"] = "MNU_SQUIRE"; + skill.MenuNamesForPlayerClass["cleric"] = "MNU_ALTARBOY"; + skill.MenuNamesForPlayerClass["mage"] = "MNU_APPRENTICE"; + } + AllSkills.Push(skill); + + // sk_easy + skill.name = "easy"; + skill.AmmoFactor = FRACUNIT; + skill.DamageFactor = FRACUNIT; + skill.EasyBossBrain = false; + skill.AutoUseHealth = false; + skill.RespawnCounter = 0; + skill.Aggressiveness = FRACUNIT; + skill.SpawnFilter = MTF_EASY; + skill.ACSReturn = 1; + skill.MenuName = g&GAME_DoomStrife ? "M_ROUGH" : "MNU_YELLOWBELLIES"; + if (g & GAME_Hexen) + { + skill.MenuNamesForPlayerClass["fighter"] = "MNU_KNIGHT"; + skill.MenuNamesForPlayerClass["cleric"] = "MNU_ACOLYTE"; + skill.MenuNamesForPlayerClass["mage"] = "MNU_ENCHANTER"; + } + AllSkills.Push(skill); + + // sk_normal + skill.name = "normal"; + skill.SpawnFilter = MTF_NORMAL; + skill.ACSReturn = 2; + skill.MenuName = g&GAME_DoomStrife ? "M_HURT" : "MNU_BRINGEST"; + if (g & GAME_Hexen) + { + skill.MenuNamesForPlayerClass["fighter"] = "MNU_WARRIOR"; + skill.MenuNamesForPlayerClass["cleric"] = "MNU_PRIEST"; + skill.MenuNamesForPlayerClass["mage"] = "MNU_SORCERER"; + } + AllSkills.Push(skill); + + // sk_hard + skill.name = "hard"; + skill.SpawnFilter = MTF_HARD; + skill.ACSReturn = 3; + skill.MenuName = g&GAME_DoomStrife ? "M_ULTRA" : "MNU_SMITE"; + if (g & GAME_Hexen) + { + skill.MenuNamesForPlayerClass["fighter"] = "MNU_BERSERKER"; + skill.MenuNamesForPlayerClass["cleric"] = "MNU_CARDINAL"; + skill.MenuNamesForPlayerClass["mage"] = "MNU_WARLOCK"; + } + AllSkills.Push(skill); + + // sk_nightmare + skill.name = "nightmare"; + skill.AmmoFactor = (g & GAME_DoomStrife) ? FRACUNIT*2 : FRACUNIT*3/2; + skill.DamageFactor = FRACUNIT; + skill.FastMonsters = true; + skill.DisableCheats = true; + skill.RespawnCounter = (g & GAME_Raven)? 0 : TICRATE * (g != GAME_Strife ? 12 : 16); + skill.Aggressiveness = FRACUNIT; + skill.ACSReturn = 4; + skill.MenuName = g&GAME_DoomStrife ? "M_NMARE" : "MNU_BLACKPLAGUE"; + skill.MustConfirm = true; + if (g & GAME_Hexen) + { + skill.MenuNamesForPlayerClass["fighter"] = "MNU_TITAN"; + skill.MenuNamesForPlayerClass["cleric"] = "MNU_POPE"; + skill.MenuNamesForPlayerClass["mage"] = "MNU_ARCHMAGE"; + } + AllSkills.Push(skill); +} + +void G_VerifySkill() +{ + if (gameskill >= AllSkills.Size()) + gameskill = AllSkills.Size()-1; + else if (gameskill < 0) + gameskill = 0; +} \ No newline at end of file diff --git a/src/g_level.h b/src/g_level.h index 902141858..4b37a14c9 100644 --- a/src/g_level.h +++ b/src/g_level.h @@ -365,8 +365,61 @@ enum ESkillProperty SKILLP_AutoUseHealth, SKILLP_SpawnFilter, SKILLP_EasyBossBrain, + SKILLP_ACSReturn, + SKILLP_Confirm, }; int G_SkillProperty(ESkillProperty prop); +typedef TMap SkillMenuNames; + +struct FSkillInfo +{ + FName name; + fixed_t AmmoFactor; + fixed_t DamageFactor; + bool FastMonsters; + bool DisableCheats; + bool AutoUseHealth; + bool EasyBossBrain; + int RespawnCounter; + fixed_t Aggressiveness; + int SpawnFilter; + int ACSReturn; + FString MenuName; + SkillMenuNames MenuNamesForPlayerClass; + bool MenuNameIsLump; + bool MustConfirm; + char shortcut; + + FSkillInfo() {} + FSkillInfo(const FSkillInfo &other) + { + operator=(other); + } + FSkillInfo &operator=(const FSkillInfo &other) + { + name = other.name; + AmmoFactor = other.AmmoFactor; + DamageFactor = other.DamageFactor; + FastMonsters = other.FastMonsters; + DisableCheats = other.DisableCheats; + AutoUseHealth = other.AutoUseHealth; + EasyBossBrain = other.EasyBossBrain; + RespawnCounter= other.RespawnCounter; + Aggressiveness= other.Aggressiveness; + SpawnFilter = other.SpawnFilter; + ACSReturn = other.ACSReturn; + MenuName = other.MenuName; + MenuNamesForPlayerClass = other.MenuNamesForPlayerClass; + MenuNameIsLump = other.MenuNameIsLump; + MustConfirm = other.MustConfirm; + shortcut = other.shortcut; + return *this; + } +}; + +extern TArray AllSkills; + + #endif //__G_LEVEL_H__ diff --git a/src/g_strife/a_strifeitems.cpp b/src/g_strife/a_strifeitems.cpp index 0e50cfeeb..a2351d997 100644 --- a/src/g_strife/a_strifeitems.cpp +++ b/src/g_strife/a_strifeitems.cpp @@ -11,6 +11,7 @@ #include "d_event.h" #include "a_keys.h" #include "c_console.h" +#include "templates.h" // Degnin Ore --------------------------------------------------------------- @@ -461,7 +462,8 @@ bool AHealthFillup::TryPickup (AActor *toucher) { static const int skillhealths[5] = { -100, -75, -50, -50, -100 }; - if (!P_GiveBody (toucher, skillhealths[gameskill])) + int index = clamp(gameskill, 0,4); + if (!P_GiveBody (toucher, skillhealths[index])) { return false; } diff --git a/src/m_menu.cpp b/src/m_menu.cpp index 8d5367098..1c80fd6f6 100644 --- a/src/m_menu.cpp +++ b/src/m_menu.cpp @@ -377,66 +377,80 @@ static oldmenu_t FilesMenu = // // DOOM SKILL SELECT // -static oldmenuitem_t NewGameMenu[]= -{ - {1,0,'i',"M_JKILL",M_ChooseSkill}, - {1,0,'h',"M_ROUGH",M_ChooseSkill}, - {1,0,'h',"M_HURT",M_ChooseSkill}, - {1,0,'u',"M_ULTRA",M_ChooseSkill}, - {1,0,'n',"M_NMARE",M_ChooseSkill} +static oldmenuitem_t SkillSelectMenu[]={ + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, + { 1, 0, 0, "", M_ChooseSkill}, }; -static oldmenu_t NewDef = +static oldmenu_t SkillDef = { - countof(NewGameMenu), - NewGameMenu, // oldmenuitem_t -> + 0, + SkillSelectMenu, // oldmenuitem_t -> M_DrawNewGame, // drawing routine -> 48,63, // x,y 2 // lastOn }; -// -// HERETIC SKILL SELECT -// -static oldmenuitem_t HereticSkillItems[] = -{ - {1,1,'t',"MNU_WETNURSE",M_ChooseSkill}, - {1,1,'y',"MNU_YELLOWBELLIES",M_ChooseSkill}, - {1,1,'b',"MNU_BRINGEST",M_ChooseSkill}, - {1,1,'t',"MNU_SMITE",M_ChooseSkill}, - {1,1,'b',"MNU_BLACKPLAGUE",M_ChooseSkill} -}; - -static oldmenu_t HereticSkillMenu = -{ - countof(HereticSkillItems), - HereticSkillItems, - M_DrawNewGame, - 38, 30, - 2 -}; - -// -// HEXEN SKILL SELECT -// -static oldmenuitem_t HexenSkillItems[] = -{ - { 1,1, '1', NULL, M_ChooseSkill }, - { 1,1, '2', NULL, M_ChooseSkill }, - { 1,1, '3', NULL, M_ChooseSkill }, - { 1,1, '4', NULL, M_ChooseSkill }, - { 1,1, '5', NULL, M_ChooseSkill } -}; - static oldmenu_t HexenSkillMenu = { - 5, HexenSkillItems, + 0, + SkillSelectMenu, // oldmenuitem_t -> DrawHexenSkillMenu, 120, 44, 2 }; +void M_StartupSkillMenu(const char *playerclass) +{ + if (gameinfo.gametype & GAME_Raven) + { + SkillDef.x = 38; + SkillDef.y = 30; + } + SkillDef.numitems = HexenSkillMenu.numitems = 0; + for(int i=0;iGetChars()[0]); + } + } + SkillDef.numitems++; + HexenSkillMenu.numitems++; + } + // Hexen needs some manual coordinate adjustments based on player class + if (gameinfo.gametype == GAME_Hexen) + { + if (!stricmp(playerclass, "fighter")) HexenSkillMenu.x = 120; + else if (!stricmp(playerclass, "cleric")) HexenSkillMenu.x = 116; + else if (!stricmp(playerclass, "mage")) HexenSkillMenu.x = 112; + else HexenSkillMenu.x = 38; + + M_SetupNextMenu(&HexenSkillMenu); + } + else + M_SetupNextMenu(&SkillDef); + +} + // // [RH] Player Setup Menu // @@ -1579,14 +1593,11 @@ void M_NewGame(int choice) { M_ChooseSkill(2); } - else if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) - { - M_SetupNextMenu (&NewDef); - } else { - M_SetupNextMenu (&HereticSkillMenu); + M_StartupSkillMenu(NULL); } + } else { @@ -1719,7 +1730,7 @@ void M_VerifyNightmare (int ch) void M_ChooseSkill (int choice) { - if (gameinfo.gametype == GAME_Doom && choice == NewDef.numitems - 1) + if (gameinfo.gametype == GAME_Doom && AllSkills[choice].MustConfirm) { M_StartMessage (GStrings("NIGHTMARE"), M_VerifyNightmare, true); return; @@ -1758,59 +1769,7 @@ void M_Episode (int choice) return; } - if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) - M_SetupNextMenu (&NewDef); - else if (gameinfo.gametype == GAME_Hexen) - M_SetupNextMenu (&HexenSkillMenu); - else - M_SetupNextMenu (&HereticSkillMenu); -} - -//========================================================================== -// -// Sets Hexen's skill menu according to player class -// -//========================================================================== - -static void SetHexenSkillMenu (const char * pclass) -{ - if (!stricmp(pclass, "fighter")) - { - HexenSkillMenu.x = 120; - HexenSkillItems[0].name = "MNU_SQUIRE"; - HexenSkillItems[1].name = "MNU_KNIGHT"; - HexenSkillItems[2].name = "MNU_WARRIOR"; - HexenSkillItems[3].name = "MNU_BERSERKER"; - HexenSkillItems[4].name = "MNU_TITAN"; - } - else if (!stricmp(pclass, "cleric")) - { - HexenSkillMenu.x = 116; - HexenSkillItems[0].name = "MNU_ALTARBOY"; - HexenSkillItems[1].name = "MNU_ACOLYTE"; - HexenSkillItems[2].name = "MNU_PRIEST"; - HexenSkillItems[3].name = "MNU_CARDINAL"; - HexenSkillItems[4].name = "MNU_POPE"; - } - else if (!stricmp(pclass, "mage")) - { - HexenSkillMenu.x = 112; - HexenSkillItems[0].name = "MNU_APPRENTICE"; - HexenSkillItems[1].name = "MNU_ENCHANTER"; - HexenSkillItems[2].name = "MNU_SORCERER"; - HexenSkillItems[3].name = "MNU_WARLOCK"; - HexenSkillItems[4].name = "MNU_ARCHMAGE"; - } - else - { - // Use Heretic's menu titles as default - HexenSkillMenu.x = HereticSkillMenu.x; - HexenSkillItems[0].name = HereticSkillItems[0].name; - HexenSkillItems[1].name = HereticSkillItems[1].name; - HexenSkillItems[2].name = HereticSkillItems[2].name; - HexenSkillItems[3].name = HereticSkillItems[3].name; - HexenSkillItems[4].name = HereticSkillItems[4].name; - } + M_StartupSkillMenu(NULL); } //========================================================================== @@ -1832,15 +1791,13 @@ static void SCClass (int option) else playerclass = PlayerClasses[option].Type->Meta.GetMetaString (APMETA_DisplayName); - SetHexenSkillMenu(playerclass); - if (EpiDef.numitems > 1) { M_SetupNextMenu (&EpiDef); } else if (!EpisodeNoSkill[0]) { - M_SetupNextMenu (&HexenSkillMenu); + M_StartupSkillMenu(playerclass); } else { @@ -1858,7 +1815,6 @@ static void M_ChooseClass (int choice) } playerclass = (choice < ClassMenuDef.numitems-1) ? ClassMenuItems[choice].name : "Random"; - SetHexenSkillMenu(playerclass); if (EpiDef.numitems > 1) { @@ -1868,17 +1824,9 @@ static void M_ChooseClass (int choice) { M_ChooseSkill(2); } - else if (gameinfo.gametype & (GAME_Doom|GAME_Strife)) + else { - M_SetupNextMenu (&NewDef); - } - else if (gameinfo.gametype == GAME_Hexen) - { - M_SetupNextMenu (&HexenSkillMenu); - } - else - { - M_SetupNextMenu (&HereticSkillMenu); + M_StartupSkillMenu(playerclass); } } @@ -3375,7 +3323,7 @@ void M_Init (void) if (gameinfo.gametype == GAME_Strife) { MainDef.y = 45; - NewDef.lastOn = 1; + //NewDef.lastOn = 1; } } else diff --git a/src/p_acs.cpp b/src/p_acs.cpp index bd5107e8a..95793bc76 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -3923,7 +3923,7 @@ int DLevelScript::RunScript () break; case PCD_GAMESKILL: - PushToStack (gameskill); + PushToStack (G_SkillProperty(SKILLP_ACSReturn)); break; // [BC] Start ST PCD's diff --git a/src/p_lnspec.cpp b/src/p_lnspec.cpp index 66e778912..21b0969eb 100644 --- a/src/p_lnspec.cpp +++ b/src/p_lnspec.cpp @@ -2516,7 +2516,7 @@ FUNC(LS_Autosave) FUNC(LS_ChangeSkill) { - if (arg0 < sk_baby || arg0 > sk_nightmare) + if (arg0 < 0 || arg0 > AllSkills.Size()) { NextSkill = -1; } diff --git a/src/p_user.cpp b/src/p_user.cpp index 19b883444..23c06f1f9 100644 --- a/src/p_user.cpp +++ b/src/p_user.cpp @@ -1608,7 +1608,7 @@ void P_MovePlayer (player_t *player) fprintf (debugfile, "]\n"); } - if (!(player->cheats & CF_PREDICTING)) + if (!(player->cheats & CF_PREDICTING) && (forwardmove|sidemove)) { player->mo->PlayRunning (); }