Browse Source

Fix Hork Demon and Nakrul drops in multiplayer

pull/4031/head
staphen 4 years ago committed by Anders Jenbo
parent
commit
30a9595020
  1. 10
      Source/monster.cpp
  2. 24
      Source/msg.cpp
  3. 15
      Source/msg.h
  4. 12
      Source/objects.cpp
  5. 2
      Source/towners.cpp

10
Source/monster.cpp

@ -1094,7 +1094,7 @@ void SpawnLoot(Monster &monster, bool sendmsg)
if (sgGameInitInfo.bTheoQuest != 0) {
SpawnTheodore(monster.position.tile);
} else {
CreateAmulet(monster.position.tile, 13, false, true);
CreateAmulet(monster.position.tile, 13, sendmsg, false);
}
} else if (monster.MType->mtype == MT_HORKSPWN) {
} else if (monster.MType->mtype == MT_NAKRUL) {
@ -1105,10 +1105,10 @@ void SpawnLoot(Monster &monster, bool sendmsg)
stream_stop();
Quests[Q_NAKRUL]._qlog = false;
UberDiabloMonsterIndex = -2;
CreateMagicWeapon(monster.position.tile, ItemType::Sword, ICURS_GREAT_SWORD, false, true);
CreateMagicWeapon(monster.position.tile, ItemType::Staff, ICURS_WAR_STAFF, false, true);
CreateMagicWeapon(monster.position.tile, ItemType::Bow, ICURS_LONG_WAR_BOW, false, true);
CreateSpellBook(monster.position.tile, SPL_APOCA, false, true);
CreateMagicWeapon(monster.position.tile, ItemType::Sword, ICURS_GREAT_SWORD, sendmsg, false);
CreateMagicWeapon(monster.position.tile, ItemType::Staff, ICURS_WAR_STAFF, sendmsg, false);
CreateMagicWeapon(monster.position.tile, ItemType::Bow, ICURS_LONG_WAR_BOW, sendmsg, false);
CreateSpellBook(monster.position.tile, SPL_APOCA, sendmsg, false);
} else if (monster.MType->mtype != MT_GOLEM) {
SpawnItem(monster, monster.position.tile, sendmsg);
}

24
Source/msg.cpp

@ -420,15 +420,15 @@ bool DeltaGetItem(const TCmdGItem &message, BYTE bLevel)
if (item.bCmd == CMD_INVALID || item.wIndx != message.wIndx || item.wCI != message.wCI || item.dwSeed != message.dwSeed)
continue;
if (item.bCmd == CMD_WALKXY) {
if (item.bCmd == TCmdPItem::PickedUpItem) {
return true;
}
if (item.bCmd == CMD_STAND) {
if (item.bCmd == TCmdPItem::FloorItem) {
sgbDeltaChanged = true;
item.bCmd = CMD_WALKXY;
item.bCmd = TCmdPItem::PickedUpItem;
return true;
}
if (item.bCmd == CMD_ACK_PLRINFO) {
if (item.bCmd == TCmdPItem::DroppedItem) {
sgbDeltaChanged = true;
item.bCmd = CMD_INVALID;
return true;
@ -443,7 +443,7 @@ bool DeltaGetItem(const TCmdGItem &message, BYTE bLevel)
for (TCmdPItem &item : sgLevels[bLevel].item) {
if (item.bCmd == CMD_INVALID) {
sgbDeltaChanged = true;
item.bCmd = CMD_WALKXY;
item.bCmd = TCmdPItem::PickedUpItem;
item.x = message.x;
item.y = message.y;
item.wIndx = message.wIndx;
@ -474,12 +474,12 @@ void DeltaPutItem(const TCmdPItem &message, Point position, BYTE bLevel)
return;
for (const TCmdPItem &item : sgLevels[bLevel].item) {
if (item.bCmd != CMD_WALKXY
if (item.bCmd != TCmdPItem::PickedUpItem
&& item.bCmd != CMD_INVALID
&& item.wIndx == message.wIndx
&& item.wCI == message.wCI
&& item.dwSeed == message.dwSeed) {
if (item.bCmd == CMD_ACK_PLRINFO)
if (item.bCmd == TCmdPItem::DroppedItem)
return;
app_fatal("%s", _("Trying to drop a floor item?"));
}
@ -489,7 +489,7 @@ void DeltaPutItem(const TCmdPItem &message, Point position, BYTE bLevel)
if (item.bCmd == CMD_INVALID) {
sgbDeltaChanged = true;
memcpy(&item, &message, sizeof(TCmdPItem));
item.bCmd = CMD_ACK_PLRINFO;
item.bCmd = TCmdPItem::DroppedItem;
item.x = position.x;
item.y = position.y;
return;
@ -2115,7 +2115,7 @@ void DeltaAddItem(int ii)
&& item.wIndx == Items[ii].IDidx
&& item.wCI == Items[ii]._iCreateInfo
&& item.dwSeed == Items[ii]._iSeed
&& (item.bCmd == CMD_WALKXY || item.bCmd == CMD_STAND)) {
&& IsAnyOf(item.bCmd, TCmdPItem::PickedUpItem, TCmdPItem::FloorItem)) {
return;
}
}
@ -2125,7 +2125,7 @@ void DeltaAddItem(int ii)
continue;
sgbDeltaChanged = true;
item.bCmd = CMD_STAND;
item.bCmd = TCmdPItem::FloorItem;
item.x = Items[ii].position.x;
item.y = Items[ii].position.y;
item.wIndx = Items[ii].IDidx;
@ -2238,7 +2238,7 @@ void DeltaLoadLevel()
if (sgLevels[currlevel].item[i].bCmd == CMD_INVALID)
continue;
if (sgLevels[currlevel].item[i].bCmd == CMD_WALKXY) {
if (sgLevels[currlevel].item[i].bCmd == TCmdPItem::PickedUpItem) {
int activeItemIndex = FindGetItem(
sgLevels[currlevel].item[i].dwSeed,
sgLevels[currlevel].item[i].wIndx,
@ -2250,7 +2250,7 @@ void DeltaLoadLevel()
DeleteItem(activeItemIndex);
}
}
if (sgLevels[currlevel].item[i].bCmd == CMD_ACK_PLRINFO) {
if (sgLevels[currlevel].item[i].bCmd == TCmdPItem::DroppedItem) {
int ii = AllocateItem();
auto &item = Items[ii];

15
Source/msg.h

@ -600,6 +600,21 @@ struct TCmdPItem {
uint8_t bMinMag;
uint8_t bMinDex;
int16_t bAC;
/**
* Items placed during dungeon generation
*/
static constexpr _cmd_id FloorItem = CMD_STAND;
/**
* Floor items that have already been picked up
*/
static constexpr _cmd_id PickedUpItem = CMD_WALKXY;
/**
* Items dropped by players, monsters, or objects and left on the floor of the dungeon
*/
static constexpr _cmd_id DroppedItem = CMD_ACK_PLRINFO;
};
struct TCmdChItem {

12
Source/objects.cpp

@ -2468,17 +2468,17 @@ void OperateSlainHero(int pnum, int i)
auto &player = Players[pnum];
if (player._pClass == HeroClass::Warrior) {
CreateMagicArmor(Objects[i].position, ItemType::HeavyArmor, ICURS_BREAST_PLATE, false, true);
CreateMagicArmor(Objects[i].position, ItemType::HeavyArmor, ICURS_BREAST_PLATE, true, false);
} else if (player._pClass == HeroClass::Rogue) {
CreateMagicWeapon(Objects[i].position, ItemType::Bow, ICURS_LONG_BATTLE_BOW, false, true);
CreateMagicWeapon(Objects[i].position, ItemType::Bow, ICURS_LONG_BATTLE_BOW, true, false);
} else if (player._pClass == HeroClass::Sorcerer) {
CreateSpellBook(Objects[i].position, SPL_LIGHTNING, false, true);
CreateSpellBook(Objects[i].position, SPL_LIGHTNING, true, false);
} else if (player._pClass == HeroClass::Monk) {
CreateMagicWeapon(Objects[i].position, ItemType::Staff, ICURS_WAR_STAFF, false, true);
CreateMagicWeapon(Objects[i].position, ItemType::Staff, ICURS_WAR_STAFF, true, false);
} else if (player._pClass == HeroClass::Bard) {
CreateMagicWeapon(Objects[i].position, ItemType::Sword, ICURS_BASTARD_SWORD, false, true);
CreateMagicWeapon(Objects[i].position, ItemType::Sword, ICURS_BASTARD_SWORD, true, false);
} else if (player._pClass == HeroClass::Barbarian) {
CreateMagicWeapon(Objects[i].position, ItemType::Axe, ICURS_BATTLE_AXE, false, true);
CreateMagicWeapon(Objects[i].position, ItemType::Axe, ICURS_BATTLE_AXE, true, false);
}
Players[MyPlayerId].Say(HeroSpeech::RestInPeaceMyFriend);
if (pnum == MyPlayerId)

2
Source/towners.cpp

@ -728,7 +728,7 @@ void TalkToGirl(Player &player, Towner &girl)
if (quest._qactive != QUEST_DONE && player.TryRemoveInvItemById(IDI_THEODORE)) {
InitQTextMsg(TEXT_GIRL4);
CreateAmulet(girl.position, 13, false, true);
CreateAmulet(girl.position, 13, true, false);
quest._qlog = false;
quest._qactive = QUEST_DONE;
auto curFrame = girl._tAnimFrame;

Loading…
Cancel
Save