Browse Source

🚩 Add option for disabeling frindly fire (#1104)

pull/1113/head
Anders Jenbo 5 years ago committed by GitHub
parent
commit
dd73ff2cf0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 6
      Source/control.cpp
  2. 10
      Source/diablo.cpp
  3. 4
      Source/diablo.h
  4. 3
      Source/missiles.cpp
  5. 2
      Source/multi.cpp
  6. 1
      Source/multi.h
  7. 2
      Source/player.cpp
  8. 4
      SourceX/controls/plrctrls.cpp

6
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;
}
}

10
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);
}
}

4
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
}

3
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) {

2
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();

1
Source/multi.h

@ -24,6 +24,7 @@ typedef struct GameData {
Uint8 bJogInTown;
Uint8 bTheoQuest;
Uint8 bCowQuest;
Uint8 bFriendlyFire;
} GameData;
typedef struct _SNETPROGRAMDATA {

2
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;

4
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);
}
}

Loading…
Cancel
Save