Browse Source

Refactor SpawnItem

pull/5487/head
obligaron 3 years ago committed by Anders Jenbo
parent
commit
1b1ea50cba
  1. 52
      Source/items.cpp
  2. 1
      Source/items.h

52
Source/items.cpp

@ -1309,9 +1309,6 @@ void GetItemBonus(const Player &player, Item &item, int minlvl, int maxlvl, bool
_item_indexes RndUItem(Monster *monster)
{
if (monster != nullptr && (monster->data().treasure & T_UNIQ) != 0 && !gbIsMultiplayer)
return static_cast<_item_indexes>(-((monster->data().treasure & T_MASK) + 1));
static std::array<_item_indexes, 512> ril;
int curlv = ItemsGetCurrlevel();
@ -3030,19 +3027,6 @@ void SetupItem(Item &item)
item._iIdentified = false;
}
int RndItem(const Monster &monster)
{
const uint16_t monsterTreasureFlags = monster.data().treasure;
if ((monsterTreasureFlags & T_UNIQ) != 0)
return -((monsterTreasureFlags & T_MASK) + 1);
if ((monsterTreasureFlags & T_NODROP) != 0)
return 0;
return RndItemForMonsterLevel(monster.level(sgGameInitInfo.nDifficulty)) + 1;
}
void SpawnUnique(_unique_items uid, Point position)
{
if (ActiveItemCount >= MAXITEMS)
@ -3067,29 +3051,29 @@ void SpawnItem(Monster &monster, Point position, bool sendmsg)
_item_indexes idx;
bool onlygood = true;
if (monster.isUnique() || ((monster.data().treasure & T_UNIQ) != 0 && gbIsMultiplayer)) {
bool dropsSpecialTreasure = (monster.data().treasure & T_UNIQ) != 0;
if (dropsSpecialTreasure && !gbIsMultiplayer) {
SpawnUnique(static_cast<_unique_items>(monster.data().treasure & T_MASK), position);
return;
} else if (monster.isUnique() || dropsSpecialTreasure) {
// Unqiue monster is killed => use better item base (for example no gold)
idx = RndUItem(&monster);
if (idx < IDI_GOLD) {
SpawnUnique(static_cast<_unique_items>(-(idx + 1)), position);
return;
}
onlygood = true;
} else if (Quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || Quests[Q_MUSHROOM]._qvar1 != QS_MUSHGIVEN) {
int optionalIndexOrUniqueIndex = RndItem(monster);
if (optionalIndexOrUniqueIndex == 0) // No drop
return;
if (optionalIndexOrUniqueIndex > 0) { // Item index
idx = static_cast<_item_indexes>(optionalIndexOrUniqueIndex - 1);
onlygood = false;
} else { // Unique item index
SpawnUnique(static_cast<_unique_items>(-(optionalIndexOrUniqueIndex + 1)), position);
return;
}
} else {
} else if (Quests[Q_MUSHROOM]._qactive == QUEST_ACTIVE && Quests[Q_MUSHROOM]._qvar1 == QS_MUSHGIVEN) {
// Normal monster is killed => need to drop brain to progress the quest
idx = IDI_BRAIN;
Quests[Q_MUSHROOM]._qvar1 = QS_BRAINSPAWNED;
} else {
// Normal monster
if ((monster.data().treasure & T_NODROP) != 0)
return;
onlygood = false;
idx = RndItemForMonsterLevel(monster.level(sgGameInitInfo.nDifficulty));
}
if (idx == IDI_NONE)
return;
if (ActiveItemCount >= MAXITEMS)
return;

1
Source/items.h

@ -496,7 +496,6 @@ int AllocateItem();
Point GetSuperItemLoc(Point position);
void GetItemAttrs(Item &item, _item_indexes itemData, int lvl);
void SetupItem(Item &item);
int RndItem(const Monster &monster);
void SpawnUnique(_unique_items uid, Point position);
void SpawnItem(Monster &monster, Point position, bool sendmsg);
void CreateRndItem(Point position, bool onlygood, bool sendmsg, bool delta);

Loading…
Cancel
Save