diff --git a/Source/monster.cpp b/Source/monster.cpp index dde6f2082..6391efd27 100644 --- a/Source/monster.cpp +++ b/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); } diff --git a/Source/msg.cpp b/Source/msg.cpp index 92226064f..accc504e6 100644 --- a/Source/msg.cpp +++ b/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]; diff --git a/Source/msg.h b/Source/msg.h index ca68934cf..9d157ab64 100644 --- a/Source/msg.h +++ b/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 { diff --git a/Source/objects.cpp b/Source/objects.cpp index d1ed31a2b..7ff7acdae 100644 --- a/Source/objects.cpp +++ b/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) diff --git a/Source/towners.cpp b/Source/towners.cpp index 58d3b07f3..4174b461c 100644 --- a/Source/towners.cpp +++ b/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;