From dd73ff2cf06fabb5d7e279d103cef7c533bf29d8 Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Sat, 6 Mar 2021 04:15:54 +0100 Subject: [PATCH] :triangular_flag_on_post: Add option for disabeling frindly fire (#1104) --- Source/control.cpp | 6 +++--- Source/diablo.cpp | 10 +++++++--- Source/diablo.h | 4 +++- Source/missiles.cpp | 3 +++ Source/multi.cpp | 2 ++ Source/multi.h | 1 + Source/player.cpp | 2 +- SourceX/controls/plrctrls.cpp | 4 ++-- 8 files changed, 22 insertions(+), 10 deletions(-) diff --git a/Source/control.cpp b/Source/control.cpp index 063956f4f..1581b65ce 100644 --- a/Source/control.cpp +++ b/Source/control.cpp @@ -868,7 +868,7 @@ void DrawCtrlBtns(CelOutputBuffer out) } if (numpanbtns == 8) { CelDrawTo(out, 87 + PANEL_X, 122 + PANEL_Y, pMultiBtns, panbtn[6] + 1, 33); - if (FriendlyMode) + if (gbFriendlyMode) CelDrawTo(out, 527 + PANEL_X, 122 + PANEL_Y, pMultiBtns, panbtn[7] + 3, 33); else CelDrawTo(out, 527 + PANEL_X, 122 + PANEL_Y, pMultiBtns, panbtn[7] + 5, 33); @@ -1021,7 +1021,7 @@ void CheckPanelInfo() if (i != 7) { strcpy(infostr, PanBtnStr[i]); } else { - if (FriendlyMode) + if (gbFriendlyMode) strcpy(infostr, "Player friendly"); else strcpy(infostr, "Player attack"); @@ -1171,7 +1171,7 @@ void CheckBtnUp() control_type_message(); break; case PANBTN_FRIENDLY: - FriendlyMode = !FriendlyMode; + gbFriendlyMode = !gbFriendlyMode; break; } } diff --git a/Source/diablo.cpp b/Source/diablo.cpp index 5bfcfe78e..5bb8dbfd4 100644 --- a/Source/diablo.cpp +++ b/Source/diablo.cpp @@ -71,7 +71,9 @@ int dbgmon; int arrowdebug; #endif /** Specifies whether players are in non-PvP mode. */ -BOOL FriendlyMode = TRUE; +bool gbFriendlyMode = true; +/** Specifies players will still damage other players in non-PvP mode. */ +bool gbFriendlyFire; /** Default quick messages */ const char *const spszMsgTbl[4] = { "I need help! Come Here!", @@ -421,6 +423,7 @@ static void SaveOptions() setIniInt("Game", "Grab Input", sgOptions.bGrabInput); setIniInt("Game", "Theo Quest", sgOptions.bTheoQuest); setIniInt("Game", "Cow Quest", sgOptions.bCowQuest); + setIniInt("Game", "Friendly Fire", sgOptions.bFriendlyFire); setIniInt("Game", "Test Bard", sgOptions.bTestBard); setIniInt("Game", "Test Barbarian", sgOptions.bTestBarbarian); setIniInt("Game", "Experience Bar", sgOptions.bExperienceBar); @@ -464,6 +467,7 @@ static void LoadOptions() sgOptions.bGrabInput = getIniBool("Game", "Grab Input", false); sgOptions.bTheoQuest = getIniBool("Game", "Theo Quest", false); sgOptions.bCowQuest = getIniBool("Game", "Cow Quest", false); + sgOptions.bFriendlyFire = getIniBool("Game", "Friendly Fire", true); sgOptions.bTestBard = getIniBool("Game", "Test Bard", false); sgOptions.bTestBarbarian = getIniBool("Game", "Test Barbarian", false); sgOptions.bExperienceBar = getIniBool("Game", "Experience Bar", false); @@ -600,7 +604,7 @@ static BOOL LeftMouseCmd(BOOL bShift) } else { NetSendCmdParam1(TRUE, CMD_RATTACKID, pcursmonst); } - } else if (pcursplr != -1 && !FriendlyMode) { + } else if (pcursplr != -1 && !gbFriendlyMode) { NetSendCmdParam1(TRUE, CMD_RATTACKPID, pcursplr); } } else { @@ -616,7 +620,7 @@ static BOOL LeftMouseCmd(BOOL bShift) } } else if (pcursmonst != -1) { NetSendCmdParam1(TRUE, CMD_ATTACKID, pcursmonst); - } else if (pcursplr != -1 && !FriendlyMode) { + } else if (pcursplr != -1 && !gbFriendlyMode) { NetSendCmdParam1(TRUE, CMD_ATTACKPID, pcursplr); } } diff --git a/Source/diablo.h b/Source/diablo.h index 0f70bb1d0..15f3d1509 100644 --- a/Source/diablo.h +++ b/Source/diablo.h @@ -45,6 +45,7 @@ typedef struct Options { bool bTestBarbarian; // Enable the babarian hero class bool bExperienceBar; // Show the current level progress bool bEnemyHealthBar; // Show enemy health at the top of the screen + bool bFriendlyFire; // Will players still damage other players in non-PvP mode char szBindAddress[129]; // Optionally bind to a specific network interface } Options; @@ -108,7 +109,8 @@ extern int dbgplr; extern int dbgqst; extern int dbgmon; #endif -extern BOOL FriendlyMode; +extern bool gbFriendlyMode; +extern bool gbFriendlyFire; #ifdef __cplusplus } diff --git a/Source/missiles.cpp b/Source/missiles.cpp index 1e7dd1cfb..bb59ab5eb 100644 --- a/Source/missiles.cpp +++ b/Source/missiles.cpp @@ -872,6 +872,9 @@ BOOL Plr2PlrMHit(int pnum, int p, int mindam, int maxdam, int dist, int mtype, B { int dam, blk, blkper, hper, hit, resper; + if (!gbFriendlyFire && gbFriendlyMode) + return false; + *blocked = false; if (plr[p]._pInvincible) { diff --git a/Source/multi.cpp b/Source/multi.cpp index 69df91fe7..f6129296a 100644 --- a/Source/multi.cpp +++ b/Source/multi.cpp @@ -747,6 +747,7 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) sgGameInitInfo.bJogInTown = sgOptions.bJogInTown; sgGameInitInfo.bTheoQuest = sgOptions.bTheoQuest; sgGameInitInfo.bCowQuest = sgOptions.bCowQuest; + sgGameInitInfo.bFriendlyFire = sgOptions.bFriendlyFire; memset(&ProgramData, 0, sizeof(ProgramData)); ProgramData.size = sizeof(ProgramData); ProgramData.maxplayers = MAX_PLRS; @@ -805,6 +806,7 @@ BOOL NetInit(BOOL bSinglePlayer, BOOL *pfExitProgram) gbJogInTown = sgGameInitInfo.bJogInTown; gbTheoQuest = sgGameInitInfo.bTheoQuest; gbCowQuest = sgGameInitInfo.bCowQuest; + gbFriendlyFire = sgGameInitInfo.bFriendlyFire; for (int i = 0; i < NUMLEVELS; i++) { glSeedTbl[i] = AdvanceRndSeed(); diff --git a/Source/multi.h b/Source/multi.h index b1c5412d5..726d9de25 100644 --- a/Source/multi.h +++ b/Source/multi.h @@ -24,6 +24,7 @@ typedef struct GameData { Uint8 bJogInTown; Uint8 bTheoQuest; Uint8 bCowQuest; + Uint8 bFriendlyFire; } GameData; typedef struct _SNETPROGRAMDATA { diff --git a/Source/player.cpp b/Source/player.cpp index bd5dfeb78..3aec01d57 100644 --- a/Source/player.cpp +++ b/Source/player.cpp @@ -2741,7 +2741,7 @@ BOOL PM_DoAttack(int pnum) m = -(dMonster[dx][dy] + 1); } didhit = PlrHitMonst(pnum, m); - } else if (dPlayer[dx][dy] != 0 && !FriendlyMode) { + } else if (dPlayer[dx][dy] != 0 && (!gbFriendlyMode || gbFriendlyFire)) { BYTE p = dPlayer[dx][dy]; if (dPlayer[dx][dy] > 0) { p = dPlayer[dx][dy] - 1; diff --git a/SourceX/controls/plrctrls.cpp b/SourceX/controls/plrctrls.cpp index 5ca27b573..ac8ca91d9 100644 --- a/SourceX/controls/plrctrls.cpp +++ b/SourceX/controls/plrctrls.cpp @@ -318,7 +318,7 @@ void CheckPlayerNearby() return; int spl = plr[myplr]._pRSpell; - if (FriendlyMode && spl != SPL_RESURRECT && spl != SPL_HEALOTHER) + if (gbFriendlyMode && spl != SPL_RESURRECT && spl != SPL_HEALOTHER) return; for (int i = 0; i < MAX_PLRS; i++) { @@ -441,7 +441,7 @@ void Interact() } else { NetSendCmdParam1(true, CMD_RATTACKID, pcursmonst); } - } else if (leveltype != DTYPE_TOWN && pcursplr != -1 && !FriendlyMode) { + } else if (leveltype != DTYPE_TOWN && pcursplr != -1 && !gbFriendlyMode) { NetSendCmdParam1(true, plr[myplr]._pwtype == WT_RANGED ? CMD_RATTACKPID : CMD_ATTACKPID, pcursplr); } }