Skip to content

Commit

Permalink
Populate player inventory with all items.
Browse files Browse the repository at this point in the history
  • Loading branch information
afritz1 committed Nov 15, 2024
1 parent 67c3259 commit e3408ae
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 25 deletions.
11 changes: 11 additions & 0 deletions OpenTESArena/src/Entities/Player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "../Game/Game.h"
#include "../Game/GameState.h"
#include "../Game/Options.h"
#include "../Items/ItemLibrary.h"
#include "../Math/Constants.h"
#include "../Math/Quaternion.h"
#include "../Math/Random.h"
Expand Down Expand Up @@ -164,6 +165,7 @@ void Player::init(const std::string &displayName, bool male, int raceID, int cha
this->maxWalkSpeed = maxWalkSpeed;
this->weaponAnimation.init(weaponID, exeData);
this->attributes.init(raceID, male, random);
this->inventory.clear();

if (!TryCreatePhysicsCharacters(physicsSystem, &this->physicsCharacter, &this->physicsCharacterVirtual, &this->physicsCharVsCharCollision))
{
Expand All @@ -188,6 +190,7 @@ void Player::init(const std::string &displayName, bool male, int raceID, int cha
this->maxWalkSpeed = maxWalkSpeed;
this->weaponAnimation.init(weaponID, exeData);
this->attributes = std::move(attributes);
this->inventory.clear();

if (!TryCreatePhysicsCharacters(physicsSystem, &this->physicsCharacter, &this->physicsCharacterVirtual, &this->physicsCharVsCharCollision))
{
Expand All @@ -214,6 +217,14 @@ void Player::initRandom(const CharacterClassLibrary &charClassLibrary, const Exe
this->weaponAnimation.init(weaponID, exeData);
this->attributes.init(this->raceID, this->male, random);

this->inventory.clear();
const ItemLibrary &itemLibrary = ItemLibrary::getInstance();
for (int i = 0; i < itemLibrary.getCount(); i++)
{
const ItemDefinitionID itemDefID = static_cast<ItemDefinitionID>(i);
this->inventory.insert(itemDefID);
}

if (!TryCreatePhysicsCharacters(physicsSystem, &this->physicsCharacter, &this->physicsCharacterVirtual, &this->physicsCharVsCharCollision))
{
DebugCrash("Couldn't create player physics collider.");
Expand Down
2 changes: 2 additions & 0 deletions OpenTESArena/src/Entities/Player.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include "PrimaryAttributeSet.h"
#include "WeaponAnimation.h"
#include "../Assets/MIFUtils.h"
#include "../Items/ItemInventory.h"
#include "../Math/MathUtils.h"
#include "../World/Coord.h"

Expand Down Expand Up @@ -52,6 +53,7 @@ struct Player
double maxWalkSpeed; // Eventually a function of 'Speed' attribute
WeaponAnimation weaponAnimation;
PrimaryAttributeSet attributes;
ItemInventory inventory;

Player();
~Player();
Expand Down
17 changes: 12 additions & 5 deletions OpenTESArena/src/Interface/InventoryUiModel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

#include "InventoryUiModel.h"
#include "InventoryUiView.h"
#include "../Entities/Player.h"
#include "../Game/Game.h"
#include "../Items/ItemLibrary.h"

void InventoryUiModel::ItemUiDefinition::init(const std::string &text, const Color &color)
Expand All @@ -12,13 +14,18 @@ void InventoryUiModel::ItemUiDefinition::init(const std::string &text, const Col

Buffer<InventoryUiModel::ItemUiDefinition> InventoryUiModel::getPlayerInventoryItems(Game &game)
{
// @todo: actually grab from player inventory
std::vector<const ItemDefinition*> itemDefs;
const ItemLibrary &itemLibrary = ItemLibrary::getInstance();
for (int i = 0; i < itemLibrary.getCount(); i++)
const Player &player = game.player;

std::vector<const ItemDefinition*> itemDefs;
for (int i = 0; i < player.inventory.getTotalSlotCount(); i++)
{
const ItemDefinition &itemDef = itemLibrary.getDefinition(i);
itemDefs.emplace_back(&itemDef);
const ItemInstance &itemInst = player.inventory.getSlot(i);
if (itemInst.isValid())
{
const ItemDefinition &itemDef = itemLibrary.getDefinition(itemInst.defID);
itemDefs.emplace_back(&itemDef);
}
}

const int elementCount = static_cast<int>(itemDefs.size());
Expand Down
5 changes: 5 additions & 0 deletions OpenTESArena/src/Items/ItemInstance.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,8 @@ void ItemInstance::init(ItemDefinitionID defID)
{
this->defID = defID;
}

bool ItemInstance::isValid() const
{
return this->defID >= 0;
}
2 changes: 2 additions & 0 deletions OpenTESArena/src/Items/ItemInstance.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ struct ItemInstance
ItemInstance();

void init(ItemDefinitionID defID);

bool isValid() const;
};

#endif
28 changes: 9 additions & 19 deletions OpenTESArena/src/Items/ItemInventory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ int ItemInventory::getEmptySlotCount() const
for (int i = 0; i < this->getTotalSlotCount(); i++)
{
const ItemInstance &itemInst = this->getSlot(i);
if (itemInst.defID == -1)
if (!itemInst.isValid())
{
count++;
}
Expand Down Expand Up @@ -53,13 +53,12 @@ double ItemInventory::getWeight() const
for (int i = 0; i < this->getTotalSlotCount(); i++)
{
const ItemInstance &itemInst = this->getSlot(i);
const ItemDefinitionID itemDefID = itemInst.defID;
if (itemDefID == -1)
if (!itemInst.isValid())
{
continue;
}

const ItemDefinition &itemDef = itemLibrary.getDefinition(itemDefID);
const ItemDefinition &itemDef = itemLibrary.getDefinition(itemInst.defID);
totalWeight += itemDef.getWeight();
}

Expand All @@ -71,7 +70,7 @@ bool ItemInventory::findFirstEmptySlot(int *outIndex) const
for (int i = 0; i < this->getTotalSlotCount(); i++)
{
const ItemInstance &itemInst = this->getSlot(i);
if (itemInst.defID == -1)
if (!itemInst.isValid())
{
*outIndex = i;
return true;
Expand Down Expand Up @@ -111,24 +110,15 @@ bool ItemInventory::findLastSlot(ItemDefinitionID defID, int *outIndex) const
return false;
}

bool ItemInventory::insert(ItemDefinitionID defID)
void ItemInventory::insert(ItemDefinitionID defID)
{
int insertIndex;
if (!this->findFirstEmptySlot(&insertIndex))
{
return false;
insertIndex = static_cast<int>(this->items.size());
this->items.emplace_back(ItemInstance());
}

if (insertIndex < this->getTotalSlotCount())
{
ItemInstance &existingItemInst = this->getSlot(insertIndex);
existingItemInst.init(defID);
}
else
{
ItemInstance &newItemInst = this->items.emplace_back(ItemInstance());
newItemInst.init(defID);
}

return true;
ItemInstance &itemInst = this->getSlot(insertIndex);
itemInst.init(defID);
}
2 changes: 1 addition & 1 deletion OpenTESArena/src/Items/ItemInventory.h
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ class ItemInventory
bool findFirstSlot(ItemDefinitionID defID, int *outIndex) const;
bool findLastSlot(ItemDefinitionID defID, int *outIndex) const;

bool insert(ItemDefinitionID defID); // @todo: attempt stacking if possible.
void insert(ItemDefinitionID defID); // @todo: attempt stacking if possible.
// @todo: if inserting multiple, want some kind of "ItemInventoryTransferResult" struct that holds what didn't go

// @todo: sort() or shrink()
Expand Down

0 comments on commit e3408ae

Please sign in to comment.