From c11ed21a9a264a9e5caa12a0d505c976e6c72712 Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Thu, 9 May 2024 22:00:19 -0700 Subject: [PATCH 01/12] start adding new item --- CMakeSettings.json | 14 +------- include/server/game/item.hpp | 9 +++-- include/server/game/potion.hpp | 28 +++++++++++++++ include/server/game/servergamestate.hpp | 4 +-- include/shared/game/event.hpp | 18 +++++++++- include/shared/game/sharedobject.hpp | 20 ++++++----- src/server/CMakeLists.txt | 2 ++ src/server/game/item.cpp | 9 +++-- src/server/game/objectmanager.cpp | 13 +++---- src/server/game/potion.cpp | 47 +++++++++++++++++++++++++ src/server/game/servergamestate.cpp | 15 +++++--- src/shared/game/event.cpp | 1 + src/shared/game/sharedobject.cpp | 2 -- 13 files changed, 139 insertions(+), 43 deletions(-) create mode 100644 include/server/game/potion.hpp create mode 100644 src/server/game/potion.cpp diff --git a/CMakeSettings.json b/CMakeSettings.json index 0c5fbf94..255a890a 100644 --- a/CMakeSettings.json +++ b/CMakeSettings.json @@ -1,16 +1,5 @@ { "configurations": [ - { - "name": "x64-Debug", - "generator": "Ninja", - "configurationType": "Debug", - "inheritEnvironments": [ "msvc_x64_x64" ], - "buildRoot": "${projectDir}\\out\\build\\${name}", - "installRoot": "${projectDir}\\out\\install\\${name}", - "cmakeCommandArgs": "", - "buildCommandArgs": "", - "ctestCommandArgs": "" - }, { "name": "x64-Release", "generator": "Ninja", @@ -20,8 +9,7 @@ "cmakeCommandArgs": "", "buildCommandArgs": "", "ctestCommandArgs": "", - "inheritEnvironments": [ "msvc_x64_x64" ], - "variables": [] + "inheritEnvironments": [ "msvc_x64_x64" ] } ] } \ No newline at end of file diff --git a/include/server/game/item.hpp b/include/server/game/item.hpp index 68caad40..dc5ccba0 100644 --- a/include/server/game/item.hpp +++ b/include/server/game/item.hpp @@ -3,16 +3,19 @@ #include "server/game/constants.hpp" #include "server/game/object.hpp" #include "shared/game/sharedobject.hpp" +#include "shared/game/sharedgamestate.hpp" class Item : public Object { public: + SharedItemInfo iteminfo; - SharedItemInfo iteminfo{}; + Item(ObjectType type); - Item(); - ~Item(); + virtual void useItem(); + virtual void pickUpItem(); virtual SharedObject toShared() override; + private: }; \ No newline at end of file diff --git a/include/server/game/potion.hpp b/include/server/game/potion.hpp new file mode 100644 index 00000000..a49c019f --- /dev/null +++ b/include/server/game/potion.hpp @@ -0,0 +1,28 @@ +#pragma once + +#include "server/game/item.hpp" +#include "server/game/servergamestate.hpp" +#include "server/game/object.hpp" + +enum class PotionType { + Health, + Swiftness, + Invisibility +}; + +class Potion : public Item { +public: + Potion(); + + int duration; + int effectScalar; + PotionType potType; + + void setDuration(int duration); + void seteffectScalar(int scalar); + void setPotionType(PotionType type); + void useItem() override; + +private: + +}; \ No newline at end of file diff --git a/include/server/game/servergamestate.hpp b/include/server/game/servergamestate.hpp index 213fe9e2..5cfc92ea 100644 --- a/include/server/game/servergamestate.hpp +++ b/include/server/game/servergamestate.hpp @@ -71,9 +71,7 @@ class ServerGameState { void updateMovement(); - // TODO: Add implementations of items - - void useItem(); + void updateItem(); void updateTraps(); diff --git a/include/shared/game/event.hpp b/include/shared/game/event.hpp index a0014119..c4d27cb1 100644 --- a/include/shared/game/event.hpp +++ b/include/shared/game/event.hpp @@ -34,6 +34,7 @@ enum class EventType { MoveRelative, MoveAbsolute, SpawnEntity, + UseItem, }; enum class ActionType { @@ -180,7 +181,21 @@ struct SpawnEntityEvent { DEF_SERIALIZE(Archive& ar, const unsigned int version) { // TODO: } +}; + +/** + * Event for entity to use item + */ +struct UseItemEvent { + UseItemEvent() {} + UseItemEvent(EntityID playerID, EntityID itemID) : playerID(playerID), itemID(itemID) {} + EntityID playerID; + EntityID itemID; + + DEF_SERIALIZE(Archive& ar, const unsigned int version) { + ar& playerID& itemID; + } }; /** @@ -195,7 +210,8 @@ using EventData = boost::variant< StopActionEvent, MoveRelativeEvent, MoveAbsoluteEvent, - SpawnEntityEvent + SpawnEntityEvent, + UseItemEvent >; /** diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index cb111d20..3fbfcb96 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -14,11 +14,11 @@ */ enum class ObjectType { Object, // Generic object type (base class) - Item, SolidSurface, Player, Enemy, - SpikeTrap + SpikeTrap, + Potion }; /** @@ -42,17 +42,21 @@ struct SharedStats { } }; -struct SharedItemInfo { - enum ItemType { healing, swiftness, invisible, key }; +enum class ItemType { + Weapon, + Spell, + Potion, + Useable +}; + +struct SharedItemInfo { bool held; // for rendering - bool used; - float scalar; - float timer; + bool used; // for rendering ItemType type; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& held& used& scalar& timer& type; + ar& type& used& held; } }; diff --git a/src/server/CMakeLists.txt b/src/server/CMakeLists.txt index 6771685d..741ce037 100644 --- a/src/server/CMakeLists.txt +++ b/src/server/CMakeLists.txt @@ -18,6 +18,8 @@ set(FILES game/grid.cpp game/trap.cpp game/spiketrap.cpp + game/item.cpp + game/potion.cpp ) add_library(${LIB_NAME} STATIC ${FILES}) diff --git a/src/server/game/item.cpp b/src/server/game/item.cpp index e655869d..1e2dfcf9 100644 --- a/src/server/game/item.cpp +++ b/src/server/game/item.cpp @@ -2,12 +2,15 @@ #include "shared/game/sharedobject.hpp" /* Constructors and Destructors */ -Item::Item() : Object(ObjectType::Item) { // cppcheck-suppress uninitMemberVar +Item::Item(ObjectType type) : + Object(type), iteminfo(SharedItemInfo{ .held = false, .used = false }) {} +void Item::useItem() { + this->iteminfo.used = true; } -Item::~Item() { - +void Item::pickUpItem() { + this->iteminfo.held = true; } /* SharedGameState generation */ diff --git a/src/server/game/objectmanager.cpp b/src/server/game/objectmanager.cpp index b8265667..02b2f179 100644 --- a/src/server/game/objectmanager.cpp +++ b/src/server/game/objectmanager.cpp @@ -1,6 +1,7 @@ #include "server/game/objectmanager.hpp" #include "server/game/enemy.hpp" #include "server/game/spiketrap.hpp" +#include "server/game/potion.hpp" #include @@ -37,19 +38,19 @@ SpecificID ObjectManager::createObject(ObjectType type) { trap->globalID = globalID; break; } - case ObjectType::Item: { + case ObjectType::Potion: { // Create a new object of type Item - Item* item = new Item(); + Potion* pot = new Potion(); // Push to type-specific items vector - typeID = (SpecificID)this->items.push(item); + typeID = (SpecificID)this->items.push(pot); // Push to global objects vector - globalID = (EntityID)this->objects.push(item); + globalID = (EntityID)this->objects.push(pot); // Set items' type and global IDs - item->typeID = typeID; - item->globalID = globalID; + pot->typeID = typeID; + pot->globalID = globalID; break; } case ObjectType::SolidSurface: { diff --git a/src/server/game/potion.cpp b/src/server/game/potion.cpp new file mode 100644 index 00000000..0569a3ad --- /dev/null +++ b/src/server/game/potion.cpp @@ -0,0 +1,47 @@ +#pragma once + +#include "server/game/potion.hpp" +#include "server/game/servergamestate.hpp" +#include "server/game/objectmanager.hpp" +#include "server/game/object.hpp" + +Potion::Potion(): + Item(ObjectType::Potion) +{ + this->physics.movable = false; + this->duration = 0; + this->effectScalar = 0; + this->potType = PotionType::Health; +} + +void Potion::useItem() { + Item::useItem(); + + switch (this->potType) { + case PotionType::Health: { + + break; + } + case PotionType::Swiftness: { + + break; + } + case PotionType::Invisibility: { + + break; + } + default: {} + } +} + +void Potion::setDuration(int duration) { + this->duration = duration; +} + +void Potion::seteffectScalar(int scalar) { + this->effectScalar = scalar; +} + +void Potion::setPotionType(PotionType type) { + this->potType = type; +} \ No newline at end of file diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 2370315a..7971101b 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -2,6 +2,7 @@ #include "shared/game/sharedgamestate.hpp" #include "server/game/boxcollider.hpp" #include "server/game/spiketrap.hpp" +#include "server/game/potion.hpp" #include "shared/utilities/root_path.hpp" #include @@ -168,7 +169,7 @@ void ServerGameState::update(const EventList& events) { } // TODO: fill update() method with updating object movement - useItem(); + updateItem(); updateMovement(); updateTraps(); @@ -289,17 +290,23 @@ void ServerGameState::updateMovement() { } } -void ServerGameState::useItem() { +void ServerGameState::updateItem() { // Update whatever is necesssary for item // This method may need to be broken down for different types // of item types - SmartVector items = this->objects.getItems(); + auto items = this->objects.getItems(); for (int i = 0; i < items.size(); i++) { - const Item* item = items.get(i); + auto item = items.get(i); if (item == nullptr) continue; + + if (item->iteminfo.used) { + item->useItem(); + + //remove from itemList? + } } } diff --git a/src/shared/game/event.cpp b/src/shared/game/event.cpp index a71b451b..a12bfc7e 100644 --- a/src/shared/game/event.cpp +++ b/src/shared/game/event.cpp @@ -21,6 +21,7 @@ std::ostream& operator<<(std::ostream& os, const EventType& type) { TO_STR(MoveRelative); TO_STR(MoveAbsolute); TO_STR(SpawnEntity); + TO_STR(UseItem); default: os << "Unknown EventType"; break; diff --git a/src/shared/game/sharedobject.cpp b/src/shared/game/sharedobject.cpp index d1521876..9c0965e1 100644 --- a/src/shared/game/sharedobject.cpp +++ b/src/shared/game/sharedobject.cpp @@ -4,8 +4,6 @@ std::string objectTypeString(ObjectType type) { switch (type) { case ObjectType::Object: return "Object"; - case ObjectType::Item: - return "Item"; case ObjectType::SolidSurface: return "SolidSurface"; case ObjectType::Player: From 44f03823943ce92e767b043a20a4457ca4e7038e Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Fri, 10 May 2024 13:02:54 -0700 Subject: [PATCH 02/12] add inventory for player --- include/server/game/constants.hpp | 2 +- include/server/game/item.hpp | 3 -- include/server/game/player.hpp | 6 ++++ include/server/game/potion.hpp | 1 - include/shared/game/event.hpp | 8 ++--- include/shared/game/sharedobject.hpp | 2 +- src/client/client.cpp | 35 +++++++++++++++++++++ src/server/game/item.cpp | 11 ++----- src/server/game/player.cpp | 29 ++++++++++++++++- src/server/game/potion.cpp | 21 ------------- src/server/game/servergamestate.cpp | 47 +++++++++++++++++++++------- src/server/server.cpp | 1 + 12 files changed, 115 insertions(+), 51 deletions(-) diff --git a/include/server/game/constants.hpp b/include/server/game/constants.hpp index 99dae219..6813c43c 100644 --- a/include/server/game/constants.hpp +++ b/include/server/game/constants.hpp @@ -10,7 +10,7 @@ #define MAX_WALLS 1000 #define MAX_TRAPS 10 #define MAX_SPELLS 4 -#define MAX_ITEMS 4 +#define MAX_ITEMS 5 /* Constants */ #define FIRST_TIMESTEP 0 diff --git a/include/server/game/item.hpp b/include/server/game/item.hpp index dc5ccba0..699d1fc1 100644 --- a/include/server/game/item.hpp +++ b/include/server/game/item.hpp @@ -11,9 +11,6 @@ class Item : public Object { Item(ObjectType type); - virtual void useItem(); - virtual void pickUpItem(); - virtual SharedObject toShared() override; private: diff --git a/include/server/game/player.hpp b/include/server/game/player.hpp index 32179985..2a5ef9d1 100644 --- a/include/server/game/player.hpp +++ b/include/server/game/player.hpp @@ -4,12 +4,18 @@ #include "server/game/object.hpp" #include "server/game/creature.hpp" #include "shared/game/sharedobject.hpp" +#include "server/game/item.hpp" +#include class Player : public Creature { public: + std::unordered_map inventory; + Player(); ~Player(); + void useItem(int itemNum); + virtual SharedObject toShared() override; private: diff --git a/include/server/game/potion.hpp b/include/server/game/potion.hpp index a49c019f..9807622e 100644 --- a/include/server/game/potion.hpp +++ b/include/server/game/potion.hpp @@ -21,7 +21,6 @@ class Potion : public Item { void setDuration(int duration); void seteffectScalar(int scalar); void setPotionType(PotionType type); - void useItem() override; private: diff --git a/include/shared/game/event.hpp b/include/shared/game/event.hpp index c4d27cb1..d5d363d0 100644 --- a/include/shared/game/event.hpp +++ b/include/shared/game/event.hpp @@ -188,13 +188,13 @@ struct SpawnEntityEvent { */ struct UseItemEvent { UseItemEvent() {} - UseItemEvent(EntityID playerID, EntityID itemID) : playerID(playerID), itemID(itemID) {} + UseItemEvent(EntityID playerEID, int itemNum) : playerEID(playerEID), itemNum(itemNum) {} - EntityID playerID; - EntityID itemID; + EntityID playerEID; + int itemNum; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& playerID& itemID; + ar& playerEID& itemNum; } }; diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index 3fbfcb96..be7292a2 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -47,7 +47,7 @@ enum class ItemType { Weapon, Spell, Potion, - Useable + Blank }; struct SharedItemInfo { diff --git a/src/client/client.cpp b/src/client/client.cpp index 1fcbae10..866ae509 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -351,6 +351,17 @@ void Client::draw() { true); break; } + case ObjectType::Potion: { + auto cube = std::make_unique(glm::vec3(0.5f)); + cube->scale(sharedObject->physics.dimensions); + cube->translateAbsolute(sharedObject->physics.position); + cube->draw(this->cube_shader, + this->cam->getViewProj(), + this->cam->getPos(), + glm::vec3(), + true); + break; + } default: break; } @@ -389,6 +400,30 @@ void Client::keyCallback(GLFWwindow *window, int key, int scancode, int action, Client::time_of_last_keystroke = getMsSinceEpoch(); break; + case GLFW_KEY_1: + if (eid.has_value()) { + this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 1))); + } + break; + + case GLFW_KEY_2: + if (eid.has_value()) { + this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 2))); + } + break; + + case GLFW_KEY_3: + if (eid.has_value()) { + this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 3))); + } + break; + + case GLFW_KEY_4: + if (eid.has_value()) { + this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 4))); + } + break; + /* For movement keys (WASD), activate flags and use it to generate * movement in idleCallback() instead of sending individual events */ diff --git a/src/server/game/item.cpp b/src/server/game/item.cpp index 1e2dfcf9..4f62a959 100644 --- a/src/server/game/item.cpp +++ b/src/server/game/item.cpp @@ -3,14 +3,9 @@ /* Constructors and Destructors */ Item::Item(ObjectType type) : - Object(type), iteminfo(SharedItemInfo{ .held = false, .used = false }) {} - -void Item::useItem() { - this->iteminfo.used = true; -} - -void Item::pickUpItem() { - this->iteminfo.held = true; + Object(type), iteminfo(SharedItemInfo{ .held = false, .used = false }) +{ + this->physics.movable = false; } /* SharedGameState generation */ diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index d5873764..98b6f5fa 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -1,6 +1,8 @@ #include "server/game/player.hpp" #include "shared/game/sharedobject.hpp" #include "shared/game/stat.hpp" +#include "server/game/item.hpp" +#include "server/game/potion.hpp" #include SharedObject Player::toShared() { @@ -10,7 +12,7 @@ SharedObject Player::toShared() { Player::Player(): Creature(ObjectType::Player, SharedStats( - Stat(0, 100, 100), + Stat(0, 100, 50), Stat(0, 10, 5) )) { @@ -18,4 +20,29 @@ Player::Player(): Player::~Player() { +} + +void Player::useItem(int itemNum) { + Item* item = this->inventory.at(itemNum); + switch (item->iteminfo.type) { + case ItemType::Potion: { + Potion* pot = (Potion*)item; + switch (pot->potType) { + case PotionType::Health: { + this->stats.health.adjustMod(pot->effectScalar); + break; + } + case PotionType::Swiftness: { + this->stats.speed.adjustMod(pot->effectScalar); + break; + } + case PotionType::Invisibility: { + + break; + } + } + } + } + + this->inventory.erase(itemNum); } \ No newline at end of file diff --git a/src/server/game/potion.cpp b/src/server/game/potion.cpp index 0569a3ad..de9e1784 100644 --- a/src/server/game/potion.cpp +++ b/src/server/game/potion.cpp @@ -8,32 +8,11 @@ Potion::Potion(): Item(ObjectType::Potion) { - this->physics.movable = false; this->duration = 0; this->effectScalar = 0; this->potType = PotionType::Health; } -void Potion::useItem() { - Item::useItem(); - - switch (this->potType) { - case PotionType::Health: { - - break; - } - case PotionType::Swiftness: { - - break; - } - case PotionType::Invisibility: { - - break; - } - default: {} - } -} - void Potion::setDuration(int duration) { this->duration = duration; } diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 7971101b..04932c74 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -4,6 +4,7 @@ #include "server/game/spiketrap.hpp" #include "server/game/potion.hpp" #include "shared/utilities/root_path.hpp" +#include "server/game/constants.hpp" #include @@ -154,13 +155,24 @@ void ServerGameState::update(const EventList& events) { break; } - case EventType::MoveRelative: + case EventType::MoveRelative: { //currently just sets the velocity to given - auto moveRelativeEvent = boost::get(event.data); - Object* objMoveRel = this->objects.getObject(moveRelativeEvent.entity_to_move); - objMoveRel->physics.velocity += moveRelativeEvent.movement; - break; + auto moveRelativeEvent = boost::get(event.data); + Object* objMoveRel = this->objects.getObject(moveRelativeEvent.entity_to_move); + objMoveRel->physics.velocity += moveRelativeEvent.movement; + break; + + } + case EventType::UseItem: + { + auto useItemEvent = boost::get(event.data); + Object* obj = this->objects.getObject(useItemEvent.playerEID); + Player* player = this->objects.getPlayer(obj->typeID); + if (player->inventory.at(useItemEvent.itemNum) != nullptr) { + player->useItem(useItemEvent.itemNum); + } + break; } // default: @@ -219,6 +231,25 @@ void ServerGameState::updateMovement() { if (currentCollider->detectCollision(otherCollider)) { collided = true; + // If player colliding with items, add it to inventory + if (object->type == ObjectType::Player && otherObj->type == ObjectType::Potion) { + Player* player = this->objects.getPlayer(object->typeID); + Item* item = this->objects.getItem(otherObj->typeID); + + if (player->inventory.size() < MAX_ITEMS) { + for (int x : {1,2,3,4,5}) { + if (player->inventory.contains(i)) { + player->inventory[i] = item; + break; + } + } + + item->iteminfo.held = true; + item->physics.boundary = NULL; + continue; + } + } + // Check x-axis collision currentCollider->corner.z -= movementStep.z; if (currentCollider->detectCollision(otherCollider)) { @@ -301,12 +332,6 @@ void ServerGameState::updateItem() { if (item == nullptr) continue; - - if (item->iteminfo.used) { - item->useItem(); - - //remove from itemList? - } } } diff --git a/src/server/server.cpp b/src/server/server.cpp index 9a86c7ba..367c3b36 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -14,6 +14,7 @@ #include #include "boost/variant/get.hpp" +#include "server/game/potion.hpp" #include "server/game/enemy.hpp" #include "server/game/player.hpp" #include "shared/game/event.hpp" From 8eb34eb74469cc48610d2013c5236a55edb22c8a Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Fri, 10 May 2024 14:47:29 -0700 Subject: [PATCH 03/12] created health potion --- include/server/game/gridcell.hpp | 1 + include/server/game/player.hpp | 2 +- include/server/game/servergamestate.hpp | 2 +- include/shared/game/sharedobject.hpp | 4 +- maps/room.maze | 2 +- src/client/client.cpp | 18 ++++--- src/server/game/gridcell.cpp | 2 + src/server/game/player.cpp | 26 +--------- src/server/game/potion.cpp | 1 + src/server/game/servergamestate.cpp | 68 ++++++++++++++++++------- 10 files changed, 71 insertions(+), 55 deletions(-) diff --git a/include/server/game/gridcell.hpp b/include/server/game/gridcell.hpp index d6e166db..0b9a232a 100644 --- a/include/server/game/gridcell.hpp +++ b/include/server/game/gridcell.hpp @@ -6,6 +6,7 @@ enum class CellType { Spawn, Enemy, SpikeTrap, + Potion, Unknown }; diff --git a/include/server/game/player.hpp b/include/server/game/player.hpp index 2a5ef9d1..faae6799 100644 --- a/include/server/game/player.hpp +++ b/include/server/game/player.hpp @@ -9,7 +9,7 @@ class Player : public Creature { public: - std::unordered_map inventory; + std::unordered_map inventory; Player(); ~Player(); diff --git a/include/server/game/servergamestate.hpp b/include/server/game/servergamestate.hpp index 5cfc92ea..46fa8f70 100644 --- a/include/server/game/servergamestate.hpp +++ b/include/server/game/servergamestate.hpp @@ -71,7 +71,7 @@ class ServerGameState { void updateMovement(); - void updateItem(); + void updateItem(SpecificID player, SpecificID item); void updateTraps(); diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index be7292a2..ecdd663f 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -42,7 +42,9 @@ struct SharedStats { } }; - +/** + * @brief An enum for the type of an item + */ enum class ItemType { Weapon, Spell, diff --git a/maps/room.maze b/maps/room.maze index 3d53dad4..57eaf5d8 100644 --- a/maps/room.maze +++ b/maps/room.maze @@ -1,5 +1,5 @@ ######### -#.@.@.@.# +#.@P@.@.# #.@@@@@.# #.@.@.@X# ######### \ No newline at end of file diff --git a/src/client/client.cpp b/src/client/client.cpp index 866ae509..9d69aa29 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -352,14 +352,16 @@ void Client::draw() { break; } case ObjectType::Potion: { - auto cube = std::make_unique(glm::vec3(0.5f)); - cube->scale(sharedObject->physics.dimensions); - cube->translateAbsolute(sharedObject->physics.position); - cube->draw(this->cube_shader, - this->cam->getViewProj(), - this->cam->getPos(), - glm::vec3(), - true); + if (!sharedObject->iteminfo->held) { + auto cube = std::make_unique(glm::vec3(1.0f)); + cube->scale(sharedObject->physics.dimensions); + cube->translateAbsolute(sharedObject->physics.position); + cube->draw(this->cube_shader, + this->cam->getViewProj(), + this->cam->getPos(), + glm::vec3(), + true); + } break; } default: diff --git a/src/server/game/gridcell.cpp b/src/server/game/gridcell.cpp index 22a3ad70..0ee49aeb 100644 --- a/src/server/game/gridcell.cpp +++ b/src/server/game/gridcell.cpp @@ -15,6 +15,8 @@ CellType charToCellType(char c) { return CellType::Enemy; case 'X': return CellType::SpikeTrap; + case 'P': + return CellType::Potion; default: return CellType::Unknown; } diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index 98b6f5fa..f65e49ac 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -3,6 +3,7 @@ #include "shared/game/stat.hpp" #include "server/game/item.hpp" #include "server/game/potion.hpp" +#include "server/game/servergamestate.hpp" #include SharedObject Player::toShared() { @@ -20,29 +21,4 @@ Player::Player(): Player::~Player() { -} - -void Player::useItem(int itemNum) { - Item* item = this->inventory.at(itemNum); - switch (item->iteminfo.type) { - case ItemType::Potion: { - Potion* pot = (Potion*)item; - switch (pot->potType) { - case PotionType::Health: { - this->stats.health.adjustMod(pot->effectScalar); - break; - } - case PotionType::Swiftness: { - this->stats.speed.adjustMod(pot->effectScalar); - break; - } - case PotionType::Invisibility: { - - break; - } - } - } - } - - this->inventory.erase(itemNum); } \ No newline at end of file diff --git a/src/server/game/potion.cpp b/src/server/game/potion.cpp index de9e1784..35af02a8 100644 --- a/src/server/game/potion.cpp +++ b/src/server/game/potion.cpp @@ -11,6 +11,7 @@ Potion::Potion(): this->duration = 0; this->effectScalar = 0; this->potType = PotionType::Health; + this->iteminfo.type = ItemType::Potion; } void Potion::setDuration(int duration) { diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 04932c74..7d7c958f 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -169,8 +169,10 @@ void ServerGameState::update(const EventList& events) { auto useItemEvent = boost::get(event.data); Object* obj = this->objects.getObject(useItemEvent.playerEID); Player* player = this->objects.getPlayer(obj->typeID); - if (player->inventory.at(useItemEvent.itemNum) != nullptr) { - player->useItem(useItemEvent.itemNum); + if (player->inventory.find(useItemEvent.itemNum) != player->inventory.end()) { + updateItem(player->typeID, player->inventory.at(useItemEvent.itemNum)); + player->inventory.erase(useItemEvent.itemNum); + //TODO : should also remove item afterwards } break; } @@ -181,7 +183,6 @@ void ServerGameState::update(const EventList& events) { } // TODO: fill update() method with updating object movement - updateItem(); updateMovement(); updateTraps(); @@ -235,15 +236,14 @@ void ServerGameState::updateMovement() { if (object->type == ObjectType::Player && otherObj->type == ObjectType::Potion) { Player* player = this->objects.getPlayer(object->typeID); Item* item = this->objects.getItem(otherObj->typeID); - + if (player->inventory.size() < MAX_ITEMS) { for (int x : {1,2,3,4,5}) { - if (player->inventory.contains(i)) { - player->inventory[i] = item; + if (!player->inventory.contains(i)) { + player->inventory[x] = item->typeID; break; } } - item->iteminfo.held = true; item->physics.boundary = NULL; continue; @@ -315,24 +315,39 @@ void ServerGameState::updateMovement() { object->physics.shared.corner.y = 0; object->physics.boundary->corner = object->physics.shared.corner; } - - } } } -void ServerGameState::updateItem() { - // Update whatever is necesssary for item - // This method may need to be broken down for different types - // of item types +void ServerGameState::updateItem(SpecificID playerID, SpecificID itemID) { + Player* player = this->objects.getPlayer(playerID); + Item* item = this->objects.getItem(itemID); - auto items = this->objects.getItems(); - for (int i = 0; i < items.size(); i++) { - auto item = items.get(i); + switch (item->iteminfo.type) { + case ItemType::Potion: { - if (item == nullptr) - continue; + Potion* pot = dynamic_cast(item); + switch (pot->potType) { + case PotionType::Health: { + player->stats.health.adjustMod(pot->effectScalar); + break; + } + case PotionType::Swiftness: { + player->stats.speed.adjustMod(pot->effectScalar); + break; + } + case PotionType::Invisibility: { + + break; + } + } } + + case ItemType::Spell: { + break; + } + } + } void ServerGameState::updateTraps() { @@ -535,6 +550,23 @@ void ServerGameState::loadMaze() { GridCell* cell = this->grid.getCell(col, row); switch (cell->type) { + case CellType::Potion: { + SpecificID potID = this->objects.createObject(ObjectType::Potion); + Potion* pot = dynamic_cast(this->objects.getItem(potID)); + pot->setDuration(0); + pot->seteffectScalar(20); + pot->setPotionType(PotionType::Health); + + pot->physics.shared.dimensions = glm::vec3(1.0f); + pot->physics.shared.position = this->grid.gridCellCenterPosition(cell) + + glm::vec3(0, 0.5, 0); + pot->physics.shared.corner = + glm::vec3(cell->x * this->grid.getGridCellWidth() + 1, + 0, + cell->y * this->grid.getGridCellWidth() + 1); + pot->physics.boundary = new BoxCollider(pot->physics.shared.corner, pot->physics.shared.dimensions); + break; + } case CellType::SpikeTrap: { SpecificID trapID = this->objects.createObject(ObjectType::SpikeTrap); SpikeTrap* trap = dynamic_cast(this->objects.getTrap(trapID)); From 716e9de5fe04c8dcdfb1efe2d8834e375b2e6c6a Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Fri, 10 May 2024 15:03:14 -0700 Subject: [PATCH 04/12] cread sharedinventory for ui purpose / need to move it from player.cpp --- include/server/game/constants.hpp | 9 +++++++++ include/server/game/player.hpp | 2 -- include/server/game/spell.hpp | 21 +++++++++++++++++++++ include/shared/game/sharedobject.hpp | 9 +++++++++ src/server/game/servergamestate.cpp | 4 ++-- src/server/game/spell.cpp | 17 +++++++++++++++++ 6 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 include/server/game/spell.hpp create mode 100644 src/server/game/spell.cpp diff --git a/include/server/game/constants.hpp b/include/server/game/constants.hpp index 6813c43c..1a795169 100644 --- a/include/server/game/constants.hpp +++ b/include/server/game/constants.hpp @@ -27,6 +27,15 @@ // Player Stat Constants #define INITIAL_HEALTH 100 +/* Potion Stats */ +#define RESTORE_HEALTH 20 +#define HEALTH_DURATION 0 + +#define SPEED_BOOST 1.2f +#define SPEED_DURATION 15 + +#define INVIS_DURATION 15 + /* Game */ #define GRAVITY 0.03f #define PLAYER_SPEED 1.5f diff --git a/include/server/game/player.hpp b/include/server/game/player.hpp index faae6799..64e0bde0 100644 --- a/include/server/game/player.hpp +++ b/include/server/game/player.hpp @@ -14,8 +14,6 @@ class Player : public Creature { Player(); ~Player(); - void useItem(int itemNum); - virtual SharedObject toShared() override; private: diff --git a/include/server/game/spell.hpp b/include/server/game/spell.hpp new file mode 100644 index 00000000..f3b92e66 --- /dev/null +++ b/include/server/game/spell.hpp @@ -0,0 +1,21 @@ +#pragma once + +#include "server/game/item.hpp" +#include "server/game/servergamestate.hpp" +#include "server/game/object.hpp" + +enum class SpellType { + Fireball, +}; + +class Spell : public Item { +public: + Potion(); + + SpellType spellType; + + void setSpellType(SpellType type); + +private: + +}; \ No newline at end of file diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index ecdd663f..f5fa40eb 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -42,6 +42,15 @@ struct SharedStats { } }; +struct SharedInventory { + // need to share itemtype data... + std::unordered_map inventory; + + DEF_SERIALIZE(Archive& ar, const unsigned int version) { + ar& dimensions& surfaceType; + } +}; + /** * @brief An enum for the type of an item */ diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 7d7c958f..a887915f 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -553,8 +553,8 @@ void ServerGameState::loadMaze() { case CellType::Potion: { SpecificID potID = this->objects.createObject(ObjectType::Potion); Potion* pot = dynamic_cast(this->objects.getItem(potID)); - pot->setDuration(0); - pot->seteffectScalar(20); + pot->setDuration(HEALTH_DURATION); + pot->seteffectScalar(RESTORE_HEALTH); pot->setPotionType(PotionType::Health); pot->physics.shared.dimensions = glm::vec3(1.0f); diff --git a/src/server/game/spell.cpp b/src/server/game/spell.cpp new file mode 100644 index 00000000..d216b12c --- /dev/null +++ b/src/server/game/spell.cpp @@ -0,0 +1,17 @@ +#pragma once + +#include "server/game/spell.hpp" +#include "server/game/servergamestate.hpp" +#include "server/game/objectmanager.hpp" +#include "server/game/object.hpp" + +Spell::Spell(): + Item(ObjectType::Spell) + + this->spellType = SpellType::Fireball; + this->iteminfo.type = ItemType::Spell; +} + +void Spell::setSpellType(SpellType type) { + this->spellType = type; +} \ No newline at end of file From 7050c8f503f872e1a3487a6af1f1fa02ee4afd0c Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Fri, 10 May 2024 18:11:12 -0700 Subject: [PATCH 05/12] update ui with sharedinventory --- assets/imgs/frame.png | Bin 0 -> 336 bytes assets/imgs/pot_health.png | Bin 0 -> 1321 bytes assets/imgs/pot_invisibility.png | Bin 0 -> 1299 bytes assets/imgs/pot_swiftness.png | Bin 0 -> 1323 bytes config.json | 2 +- include/client/gui/gui.hpp | 6 +++ include/client/gui/img/img.hpp | 8 +++- include/server/game/constants.hpp | 2 +- include/shared/game/sharedmodel.hpp | 6 ++- include/shared/game/sharedobject.hpp | 8 ++-- src/client/client.cpp | 2 +- src/client/gui/gui.cpp | 59 ++++++++++++++++++++++++++- src/client/gui/imgs/img.cpp | 4 ++ src/client/gui/widget/staticimg.cpp | 11 +++-- src/server/game/potion.cpp | 1 + src/server/game/servergamestate.cpp | 10 ++--- 16 files changed, 99 insertions(+), 20 deletions(-) create mode 100644 assets/imgs/frame.png create mode 100644 assets/imgs/pot_health.png create mode 100644 assets/imgs/pot_invisibility.png create mode 100644 assets/imgs/pot_swiftness.png diff --git a/assets/imgs/frame.png b/assets/imgs/frame.png new file mode 100644 index 0000000000000000000000000000000000000000..c5ab39388dd3b2a00a8dcca746b6f1af5fa7e5fb GIT binary patch literal 336 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=G`DAk4@xYmNj^@TsSZV@QPi+v$6GTMT&IYRw&0jy3AOcq!4S zI-{{`mX70b1`)|7$)XxN8OFPR9|Sz{6cp3^GiCio`C}6Pf{BgmUT4f&_I5hoIZLVI zA9Vw+n{LfLEq*OZ>-41k3Gww__rHgPUR`)hT<5gYXB&Ceu0;<{YoFZIGn<)1fMwRQ zkB1F@*qr~%6A%p;{E#5;;>ZTR*@7%7$rqWJWE^{*G3`GP d=HBpvHD7Rh*dFiJi9ioCc)I$ztaD0e0sucZd7JPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1inc`K~z{r#g=VM zTU8v!A6git6k1w3%N+#@n^1%;JF_K56JsD|aa&xR(@2xWxbeZaG{yif zi){OX%QOa23H8GanK-*8!Zrt57>-DxP%Mhc=hNT z_;YyJ)Y8&&INZGvB&>n8;zanBnipRt;#pZ)%`TUV;+sAIF(TAN*d-vly{)ZHe|KaW z`aDhHrcE0M*iC34;;PZ;9VTo@cVA){23-!+SX&(HO97H!2+l9Vey_smXgd$Jtt zcfw{z$SfeEXK%IVx0F<*jE~#R%cC~N(Qhr#j*T^`olc55c@k86d$p?XR!XkN2JM~O z&{!=xt%$XDF$w_X? z|Bj1865EHYor^6i*s`oxi-o&?A;2t=CLGp-FM&}gQ2F-jDBE2Xb`~OTLd~~dLU;PK zNiABW60|DBC5S-|+vSzlNN2_4*2`@iDx8U;w()bGB4{CpEc9yj+q9AOQRv%Qa5 zfR!DkQ=N+G3hRVj6(}C)z_JsYP5Ym9jWHRoo z*nIACs)FvCJ$fQ;Vf!knH1nrTjYlYoa&Rx!5b-uN8jU7Pci-WCUXNTnBBDR7^lFd4l~nu>L4N_4N^5LKKI^*Rokm>9Lo5BL};_~)x}FR;_Tyz-qZiBd>1 zv!KgVMHMGRH9#OH91aK7)6;91n_Gx@y_S|fVV22~X|jyb#0i271PL19t056893&8XP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1gJ?wK~z{r#a3Hr z990~z2S3cY&HtVM zeCPjlP%*;$XtyU`_XQW>g zMPlDw9`rQsYPg_wp6rupYoD%Mk%Gv$L86h+*jI>5)E_fpY-QCmvxK=HLs557~`Iqc@op z9q7(m=*BuQm~2qJqjnByp}}S|&!c`(TB-b;UeC7N?dD3 zi*Kn1{<#pjCG9UAg-hRj+c)D29G9DSGl~+}>>N9G(G5qjb3sT9WV1P^H1!r>B5Fw# z)c{uexpU{~C>sYPG8YovWFnbzW9MsYY2;kz`Q`dpH$`o6^6@xIL^-mKqU=yovR)(Z z-MIq}9C#XrhKGyZ4%rCc-P81LDwEBE-k`^!-@~%}k%eGn04d)&I?lk)BV&C$A9tdY z1dG`$ooNo(7>9B~6c9;BXEN~YbBDn154wv*K{f(~-TP*P&`^K3XJ~k&yQIWQLM{k# zu-ZxiB^#1_%C~HV?c2A($_k4WP1a-JFFmSOk3Y5>-0uBFqo63lrKJ!IdcW^0EiH3e zQ2j@IA(>17Qa2f|s&WAODXc6Mgc&%g0%JMsIFYO43Xt!*(1Y5 z+`N12oa189+S;o4NKq`ug%?m6RZfYi6iPZ3U^10Rqc=bt=kkz92xP~0dl|&z{B50M zC=$RZkQg2PgKDH*U_*C(GjN_LsGebbP+MDvvY%Vk^X#?+Ffa+f-{<`NvrpZDKtQp) zc6FWfR&1^0jvYJVQS&xbMWBEJ5veH)wT=tWMBu-`9Zp05e*vQ3z$649=|cbj002ov JPDHLkV1gycS#JOU literal 0 HcmV?d00001 diff --git a/assets/imgs/pot_swiftness.png b/assets/imgs/pot_swiftness.png new file mode 100644 index 0000000000000000000000000000000000000000..63bc788bf9562dc1b28af696e6e9e101ef4adf2a GIT binary patch literal 1323 zcmV+`1=RY9P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1i(o|K~z{r#g=6& zc!0{9U&|iZ^w{TeOvp0uY{B|#8r$C~8b-6LQgvu2Y!-{~S01tr)V8$1<#GzOIT~87 z@Eg%5)TATJz>XIW7|xzJ#Ev-CP%TS_h7Ua{UbPmVes~ZC+lvhhqg=XUNFW+sL^sf+6*317_rBXQryu>Q0;0noq=)-A4VW zR#Vn|`c!FnRD|AT8HR6aItSQOHb5B>?f)*!&OlCP94=nA2Rt2$ii!&1a}F~5#)dzh zPF?@7)&tHE!ns|}v9aW_`r3~)wo$#e=4Gfae2^7muGik{9!3(|hBcPokzi|veJm8T z#RNx06ryxm82h@hV%6Hd)%w*P6h%!660?X#U}pA%KmUM)$Fs`ZAMY-Wvvv7Hev8j` zVG4fjC>rKTA7Ye%HvR!jj&y?a&Sk>J<bw)H=+LOaol=+V`ZGv zs#j^3gQ6*nd#CSzLcE%WlBVIh*)c25gvNsOUDkaPQLR}1|;7FOU3_gV1f^r zoL7OU0dnsvs0p@@3xgZe?>?!F@+aLVgx}6EV8={&X6K%O?*!3Al$x4;ULC59u5J7C zewW)55>2_mAN`<^*^@%_iFhv)iHw|WhVnP7_9+-;^b3^2N&;)I|tqBCcXRUZ57aLG;cfNmY*LpXhBf07-2!ZP=k_^l+V??NmB2{<> hSq7GZyPSxC{{UN>)}#vH=UM;&002ovPDHLkV1gVYf@A;y literal 0 HcmV?d00001 diff --git a/config.json b/config.json index 2db7c14f..b8e93781 100644 --- a/config.json +++ b/config.json @@ -18,6 +18,6 @@ "client": { "default_name": "John Doe", "lobby_discovery": true, - "window_width": 2000 + "window_width": 1500 } } \ No newline at end of file diff --git a/include/client/gui/gui.hpp b/include/client/gui/gui.hpp index 07293259..4fc9b063 100644 --- a/include/client/gui/gui.hpp +++ b/include/client/gui/gui.hpp @@ -345,6 +345,12 @@ class GUI { * TODO: this is not implemented yet */ void _layoutGameHUD(); + + /** + * @brief Displays the Game HUD for both gameHUD and EscMenu layout + */ + void _sharedGameHUD(); + /** * @brief Displays the menu which appears when the player presses Escape while playing * diff --git a/include/client/gui/img/img.hpp b/include/client/gui/img/img.hpp index 4c9521ad..6817fc2f 100644 --- a/include/client/gui/img/img.hpp +++ b/include/client/gui/img/img.hpp @@ -16,10 +16,14 @@ namespace gui::img { */ enum class ImgID { Yoshi, - AwesomeSauce + AwesomeSauce, + ItemFrame, + HealthPotion, + SwiftnessPotion, + InvisPotion }; #define GET_ALL_IMG_IDS() \ - {ImgID::Yoshi, ImgID::AwesomeSauce} + {ImgID::Yoshi, ImgID::AwesomeSauce, ImgID::ItemFrame, ImgID::HealthPotion, ImgID::SwiftnessPotion, ImgID::InvisPotion} /** * Representation of a loaded image diff --git a/include/server/game/constants.hpp b/include/server/game/constants.hpp index 1a795169..e87c3e45 100644 --- a/include/server/game/constants.hpp +++ b/include/server/game/constants.hpp @@ -10,7 +10,7 @@ #define MAX_WALLS 1000 #define MAX_TRAPS 10 #define MAX_SPELLS 4 -#define MAX_ITEMS 5 +#define MAX_ITEMS 4 /* Constants */ #define FIRST_TIMESTEP 0 diff --git a/include/shared/game/sharedmodel.hpp b/include/shared/game/sharedmodel.hpp index 84a80b71..9b1c35b3 100644 --- a/include/shared/game/sharedmodel.hpp +++ b/include/shared/game/sharedmodel.hpp @@ -6,5 +6,9 @@ enum class ModelType { Cube, Player, - WarrenBear + WarrenBear, + HealthPotion, + SwiftnessPotion, + InvisibilityPotion, + Frame }; \ No newline at end of file diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index 741431fc..1ee37ab4 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -42,14 +42,15 @@ struct SharedStats { } }; + struct SharedInventory { // need to share itemtype data... - std::unordered_map inventory; + std::unordered_map inventory; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& dimensions& surfaceType; + ar& inventory; } -}; +}; /** * @brief An enum for the type of an item @@ -143,6 +144,7 @@ class SharedObject { boost::optional iteminfo; boost::optional solidSurface; boost::optional trapInfo; + boost::optional inventoryInfo; SharedObject() {} // cppcheck-suppress uninitMemberVar ~SharedObject() {} diff --git a/src/client/client.cpp b/src/client/client.cpp index 25450fa9..b16869b4 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -359,7 +359,7 @@ void Client::draw() { if (!sharedObject->iteminfo->held) { auto cube = std::make_unique(glm::vec3(1.0f)); cube->scale(sharedObject->physics.dimensions); - cube->translateAbsolute(sharedObject->physics.position); + cube->translateAbsolute(sharedObject->physics.getCenterPosition()); cube->draw(this->cube_shader, this->cam->getViewProj(), this->cam->getPos(), diff --git a/src/client/gui/gui.cpp b/src/client/gui/gui.cpp index ffa8d4eb..2dfdc3f3 100644 --- a/src/client/gui/gui.cpp +++ b/src/client/gui/gui.cpp @@ -6,6 +6,7 @@ #include "shared/utilities/rng.hpp" #include "client/client.hpp" #include "shared/game/sharedgamestate.hpp" +#include "shared/game/sharedobject.hpp" namespace gui { @@ -138,6 +139,7 @@ void GUI::layoutFrame(GUIState state) { break; case GUIState::GAME_ESC_MENU: glfwSetInputMode(client->window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + this->_sharedGameHUD(); this->_layoutGameEscMenu(); break; case GUIState::LOBBY_BROWSER: @@ -146,6 +148,7 @@ void GUI::layoutFrame(GUIState state) { break; case GUIState::GAME_HUD: glfwSetInputMode(client->window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + this->_sharedGameHUD(); this->_layoutGameHUD(); break; case GUIState::LOBBY: @@ -355,6 +358,60 @@ void GUI::_layoutLobby() { this->addWidget(std::move(waiting_msg)); } +void GUI::_sharedGameHUD() { + auto self_eid = client->session->getInfo().client_eid; + if (!self_eid.has_value()) { + return; + } + + auto self = client->gameState.objects.at(*self_eid); + + // Flexbox for the item frames + auto frameflex = widget::Flexbox::make( + glm::vec2(0.0f, 0.0f), //position relative to screen + glm::vec2(WINDOW_WIDTH, 0.0f), //dimensions of the flexbox + widget::Flexbox::Options(widget::Dir::HORIZONTAL, widget::Align::CENTER, 0.0f) //last one is padding + ); + + frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); + frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); + frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); + frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); + this->addWidget(std::move(frameflex)); + + // Flexbox for the items + // Loading itemframe again if no item + auto itemflex = widget::Flexbox::make( + glm::vec2(0.0f, 0.0f), + glm::vec2(WINDOW_WIDTH, 0.0f), + widget::Flexbox::Options(widget::Dir::HORIZONTAL, widget::Align::CENTER, 0.0f) + ); + for (int x : {1, 2, 3, 4}) { + if (self->inventoryInfo->inventory.contains(x)) { + switch (self->inventoryInfo->inventory.at(x)) { + case ModelType::HealthPotion: { + itemflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::HealthPotion))); + break; + } + case ModelType::SwiftnessPotion: { + itemflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::SwiftnessPotion))); + break; + } + case ModelType::InvisibilityPotion: { + itemflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::InvisPotion))); + break; + } + } + } + else { + itemflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); + } + } + + + this->addWidget(std::move(itemflex)); +} + void GUI::_layoutGameHUD() { auto self_eid = client->session->getInfo().client_eid; if (!self_eid.has_value()) { @@ -369,7 +426,7 @@ void GUI::_layoutGameHUD() { font::Size::MEDIUM, font::Color::RED, fonts, - font::getRelativePixels(10) + font::getRelativePixels(70) ); this->addWidget(std::move(health_txt)); } diff --git a/src/client/gui/imgs/img.cpp b/src/client/gui/imgs/img.cpp index f153eaa2..b6c84722 100644 --- a/src/client/gui/imgs/img.cpp +++ b/src/client/gui/imgs/img.cpp @@ -10,6 +10,10 @@ std::string getImgFilepath(ImgID img) { default: case ImgID::Yoshi: return (img_root / "Yoshi.png").string(); case ImgID::AwesomeSauce: return (img_root / "awesomeface.png").string(); + case ImgID::ItemFrame: return (img_root / "frame.png").string(); + case ImgID::HealthPotion: return (img_root / "pot_health.png").string(); + case ImgID::SwiftnessPotion: return (img_root / "pot_swiftness.png").string(); + case ImgID::InvisPotion: return (img_root / "pot_invisibility.png").string(); } } diff --git a/src/client/gui/widget/staticimg.cpp b/src/client/gui/widget/staticimg.cpp index 0ac80959..f2566505 100644 --- a/src/client/gui/widget/staticimg.cpp +++ b/src/client/gui/widget/staticimg.cpp @@ -12,8 +12,8 @@ std::unique_ptr StaticImg::shader = nullptr; StaticImg::StaticImg(glm::vec2 origin, gui::img::Img img): Widget(Type::StaticImg, origin), img(img) { - this->width = img.width; - this->height = img.height; + this->width = img.width * 2; + this->height = img.height * 2; this->texture_id = img.texture_id; } @@ -28,8 +28,8 @@ StaticImg::~StaticImg() { void StaticImg::render() { // ⚠ SUS SHIT ⚠ - float width_percent = (2.0f / (WINDOW_WIDTH)) * (img.width); - float height_percent = (2.0f / (WINDOW_HEIGHT)) * (img.height); + float width_percent = (2.0f / (WINDOW_WIDTH)) * (img.width) * 2; + float height_percent = (2.0f / (WINDOW_HEIGHT)) * (img.height) * 2; glm::vec2 bottom_left = (2.0f * (origin / glm::vec2(WINDOW_WIDTH, WINDOW_HEIGHT))) - glm::vec2(1.0f, 1.0f); float vertices[] = { @@ -66,6 +66,7 @@ void StaticImg::render() { glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); + glDisable(GL_CULL_FACE); StaticImg::shader->use(); // glm::mat4 projection = GUI_PROJECTION_MATRIX(); @@ -83,6 +84,8 @@ void StaticImg::render() { glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); glUseProgram(0); + + glEnable(GL_CULL_FACE); } } diff --git a/src/server/game/potion.cpp b/src/server/game/potion.cpp index 35af02a8..c0b50a33 100644 --- a/src/server/game/potion.cpp +++ b/src/server/game/potion.cpp @@ -11,6 +11,7 @@ Potion::Potion(): this->duration = 0; this->effectScalar = 0; this->potType = PotionType::Health; + this->physics.collider = Collider::Box; this->iteminfo.type = ItemType::Potion; } diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index a3785559..66d4fb81 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -237,14 +237,14 @@ void ServerGameState::updateMovement() { Item* item = this->objects.getItem(otherObj->typeID); if (player->inventory.size() < MAX_ITEMS) { - for (int x : {1,2,3,4,5}) { - if (!player->inventory.contains(i)) { + for (int x : {1,2,3,4}) { + if (!player->inventory.contains(x)) { player->inventory[x] = item->typeID; break; } } item->iteminfo.held = true; - item->physics.boundary = NULL; + item->physics.collider = Collider::None; continue; } } @@ -551,13 +551,11 @@ void ServerGameState::loadMaze() { pot->setPotionType(PotionType::Health); pot->physics.shared.dimensions = glm::vec3(1.0f); - pot->physics.shared.position = this->grid.gridCellCenterPosition(cell) + - glm::vec3(0, 0.5, 0); + pot->physics.shared.corner = glm::vec3(cell->x * this->grid.getGridCellWidth() + 1, 0, cell->y * this->grid.getGridCellWidth() + 1); - pot->physics.boundary = new BoxCollider(pot->physics.shared.corner, pot->physics.shared.dimensions); break; } case CellType::SpikeTrap: { From a3fd3fc66386b52caf14e1f8db92f9e17f39fcca Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Fri, 10 May 2024 19:56:31 -0700 Subject: [PATCH 06/12] ui is now working with 3 different potions (only health pot is implemented) --- include/server/game/item.hpp | 1 - include/server/game/objectmanager.hpp | 3 --- include/server/game/player.hpp | 1 - include/server/game/potion.hpp | 1 - src/server/game/item.cpp | 3 ++- src/server/game/player.cpp | 4 +--- src/server/game/potion.cpp | 2 -- 7 files changed, 3 insertions(+), 12 deletions(-) diff --git a/include/server/game/item.hpp b/include/server/game/item.hpp index 87e44591..34dd0577 100644 --- a/include/server/game/item.hpp +++ b/include/server/game/item.hpp @@ -1,7 +1,6 @@ #pragma once #include "server/game/object.hpp" -#include "shared/game/sharedobject.hpp" #include "server/game/servergamestate.hpp" class Item : public Object { diff --git a/include/server/game/objectmanager.hpp b/include/server/game/objectmanager.hpp index 75820960..770e0500 100644 --- a/include/server/game/objectmanager.hpp +++ b/include/server/game/objectmanager.hpp @@ -3,15 +3,12 @@ #include #include "server/game/object.hpp" -#include "server/game/item.hpp" -#include "server/game/trap.hpp" #include "server/game/player.hpp" #include "server/game/enemy.hpp" #include "server/game/solidsurface.hpp" class Trap; // forward declaration to use Trap* class Item; -class Player; #include "shared/utilities/smartvector.hpp" diff --git a/include/server/game/player.hpp b/include/server/game/player.hpp index f6d17b54..20de3509 100644 --- a/include/server/game/player.hpp +++ b/include/server/game/player.hpp @@ -4,7 +4,6 @@ #include "server/game/object.hpp" #include "server/game/creature.hpp" #include "shared/game/sharedobject.hpp" -#include "server/game/item.hpp" #include class Player : public Creature { diff --git a/include/server/game/potion.hpp b/include/server/game/potion.hpp index 79165fd9..97c4f289 100644 --- a/include/server/game/potion.hpp +++ b/include/server/game/potion.hpp @@ -2,7 +2,6 @@ #include "server/game/item.hpp" #include "server/game/object.hpp" -#include "server/game/servergamestate.hpp" enum class PotionType { Health, diff --git a/src/server/game/item.cpp b/src/server/game/item.cpp index d96d387f..cc2623d1 100644 --- a/src/server/game/item.cpp +++ b/src/server/game/item.cpp @@ -1,6 +1,7 @@ #include "server/game/item.hpp" -#include "server/game/player.hpp" #include "shared/game/sharedobject.hpp" +#include "server/game/servergamestate.hpp" +#include "server/game/objectmanager.hpp" /* Constructors and Destructors */ Item::Item(ObjectType type) : diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index 53b9b989..712491a6 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -1,14 +1,12 @@ #include "server/game/player.hpp" #include "shared/game/sharedobject.hpp" #include "shared/game/stat.hpp" -#include "server/game/item.hpp" -#include "server/game/potion.hpp" -#include "server/game/servergamestate.hpp" #include SharedObject Player::toShared() { auto so = Creature::toShared(); so.playerInfo = this->info; + so.inventoryInfo = this->sharedInventory; return so; } diff --git a/src/server/game/potion.cpp b/src/server/game/potion.cpp index 897e5fc3..6565b3fa 100644 --- a/src/server/game/potion.cpp +++ b/src/server/game/potion.cpp @@ -2,8 +2,6 @@ #include "server/game/potion.hpp" #include "shared/game/sharedobject.hpp" -#include "server/game/servergamestate.hpp" -#include "server/game/objectmanager.hpp" Potion::Potion(): Item(ObjectType::Potion) From 82ee886008a7e3e6de94f4d0fb726e9603901d81 Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Fri, 10 May 2024 21:54:16 -0700 Subject: [PATCH 07/12] added select / drop / use item mechanics --- assets/imgs/selected_frame.png | Bin 0 -> 272 bytes include/client/gui/img/img.hpp | 3 +- include/shared/game/event.hpp | 42 ++++++++++++++++++++++++--- include/shared/game/sharedobject.hpp | 3 +- src/client/client.cpp | 20 ++++++++++--- src/client/gui/gui.cpp | 32 +++++++++++--------- src/client/gui/imgs/img.cpp | 2 +- src/server/game/player.cpp | 1 + src/server/game/servergamestate.cpp | 37 +++++++++++++++++++---- src/shared/game/event.cpp | 2 ++ 10 files changed, 111 insertions(+), 31 deletions(-) create mode 100644 assets/imgs/selected_frame.png diff --git a/assets/imgs/selected_frame.png b/assets/imgs/selected_frame.png new file mode 100644 index 0000000000000000000000000000000000000000..3b450cd27d88e93e202c5e9f655db0fda695a5e9 GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=G`DAk4@xYmNj^aH*$@V@QO1vdE;%f6p6CV0hBd$Z+@j|Nrba z&$5)V`#PLw)?nsH$PwT@l+NeCav<=-w}+|*>Pd`~_@o$x*;#iy-TnG+z+#0OJA;^i z|I-&3vfXArWYW)+bYKOuo2xdam~ zHh+-@Cx$DT3`_y>6Q@bA9;kLZaaXm9G2lFh3=?yrB@a)*_c@J>4Eyd$D%^Rl4DvgJ Mr>mdKI;Vst00Jad&Hw-a literal 0 HcmV?d00001 diff --git a/include/client/gui/img/img.hpp b/include/client/gui/img/img.hpp index 6817fc2f..6a0b6e6e 100644 --- a/include/client/gui/img/img.hpp +++ b/include/client/gui/img/img.hpp @@ -18,12 +18,13 @@ enum class ImgID { Yoshi, AwesomeSauce, ItemFrame, + SelectedFrame, HealthPotion, SwiftnessPotion, InvisPotion }; #define GET_ALL_IMG_IDS() \ - {ImgID::Yoshi, ImgID::AwesomeSauce, ImgID::ItemFrame, ImgID::HealthPotion, ImgID::SwiftnessPotion, ImgID::InvisPotion} + {ImgID::Yoshi, ImgID::AwesomeSauce, ImgID::ItemFrame, ImgID::SelectedFrame, ImgID::HealthPotion, ImgID::SwiftnessPotion, ImgID::InvisPotion} /** * Representation of a loaded image diff --git a/include/shared/game/event.hpp b/include/shared/game/event.hpp index d5d363d0..98f6a124 100644 --- a/include/shared/game/event.hpp +++ b/include/shared/game/event.hpp @@ -34,7 +34,9 @@ enum class EventType { MoveRelative, MoveAbsolute, SpawnEntity, + SelectItem, UseItem, + DropItem, }; enum class ActionType { @@ -183,19 +185,49 @@ struct SpawnEntityEvent { } }; +/** + * Event for selecting which item to use + */ +struct SelectItemEvent { + SelectItemEvent() {} + SelectItemEvent(EntityID playerEID, int itemNum) : playerEID(playerEID), itemNum(itemNum) {} + + EntityID playerEID; + int itemNum; + + DEF_SERIALIZE(Archive& ar, const unsigned int version) { + ar& playerEID& itemNum; + } + +}; + /** * Event for entity to use item */ struct UseItemEvent { UseItemEvent() {} - UseItemEvent(EntityID playerEID, int itemNum) : playerEID(playerEID), itemNum(itemNum) {} + UseItemEvent(EntityID playerEID) : playerEID(playerEID) {} EntityID playerEID; - int itemNum; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& playerEID& itemNum; + ar& playerEID; + } +}; + +/** + * Event for dropping item in inventory + */ +struct DropItemEvent { + DropItemEvent() {} + DropItemEvent(EntityID playerEID) : playerEID(playerEID){} + + EntityID playerEID; + + DEF_SERIALIZE(Archive& ar, const unsigned int version) { + ar& playerEID; } + }; /** @@ -211,7 +243,9 @@ using EventData = boost::variant< MoveRelativeEvent, MoveAbsoluteEvent, SpawnEntityEvent, - UseItemEvent + SelectItemEvent, + UseItemEvent, + DropItemEvent >; /** diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index 8fb32ec9..d6c1438e 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -45,10 +45,11 @@ struct SharedStats { struct SharedInventory { // need to share itemtype data... + int selected; std::unordered_map inventory; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& inventory; + ar& selected & inventory; } }; diff --git a/src/client/client.cpp b/src/client/client.cpp index bb1b01b1..3ccdc70a 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -416,27 +416,39 @@ void Client::keyCallback(GLFWwindow *window, int key, int scancode, int action, Client::time_of_last_keystroke = getMsSinceEpoch(); break; + case GLFW_KEY_E: + if (eid.has_value()) { + this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value()))); + } + break; + + case GLFW_KEY_Q: + if (eid.has_value()) { + this->session->sendEventAsync(Event(eid.value(), EventType::DropItem, DropItemEvent(eid.value()))); + } + break; + case GLFW_KEY_1: if (eid.has_value()) { - this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 1))); + this->session->sendEventAsync(Event(eid.value(), EventType::SelectItem, SelectItemEvent(eid.value(), 1))); } break; case GLFW_KEY_2: if (eid.has_value()) { - this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 2))); + this->session->sendEventAsync(Event(eid.value(), EventType::SelectItem, SelectItemEvent(eid.value(), 2))); } break; case GLFW_KEY_3: if (eid.has_value()) { - this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 3))); + this->session->sendEventAsync(Event(eid.value(), EventType::SelectItem, SelectItemEvent(eid.value(), 3))); } break; case GLFW_KEY_4: if (eid.has_value()) { - this->session->sendEventAsync(Event(eid.value(), EventType::UseItem, UseItemEvent(eid.value(), 4))); + this->session->sendEventAsync(Event(eid.value(), EventType::SelectItem, SelectItemEvent(eid.value(), 4))); } break; diff --git a/src/client/gui/gui.cpp b/src/client/gui/gui.cpp index 8f426973..60f721c2 100644 --- a/src/client/gui/gui.cpp +++ b/src/client/gui/gui.cpp @@ -371,19 +371,6 @@ void GUI::_sharedGameHUD() { auto self = client->gameState.objects.at(*self_eid); - // Flexbox for the item frames - auto frameflex = widget::Flexbox::make( - glm::vec2(0.0f, 0.0f), //position relative to screen - glm::vec2(WINDOW_WIDTH, 0.0f), //dimensions of the flexbox - widget::Flexbox::Options(widget::Dir::HORIZONTAL, widget::Align::CENTER, 0.0f) //last one is padding - ); - - frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); - frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); - frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); - frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); - this->addWidget(std::move(frameflex)); - // Flexbox for the items // Loading itemframe again if no item auto itemflex = widget::Flexbox::make( @@ -413,8 +400,25 @@ void GUI::_sharedGameHUD() { } } - this->addWidget(std::move(itemflex)); + + // Flexbox for the item frames + auto frameflex = widget::Flexbox::make( + glm::vec2(0.0f, 0.0f), //position relative to screen + glm::vec2(WINDOW_WIDTH, 0.0f), //dimensions of the flexbox + widget::Flexbox::Options(widget::Dir::HORIZONTAL, widget::Align::CENTER, 0.0f) //last one is padding + ); + + for (int x : {1, 2, 3, 4}) { + if (self->inventoryInfo->selected == x) { + frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::SelectedFrame))); + } + else { + frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::ItemFrame))); + } + } + + this->addWidget(std::move(frameflex)); } void GUI::_layoutGameHUD() { diff --git a/src/client/gui/imgs/img.cpp b/src/client/gui/imgs/img.cpp index b6c84722..98689c47 100644 --- a/src/client/gui/imgs/img.cpp +++ b/src/client/gui/imgs/img.cpp @@ -11,10 +11,10 @@ std::string getImgFilepath(ImgID img) { case ImgID::Yoshi: return (img_root / "Yoshi.png").string(); case ImgID::AwesomeSauce: return (img_root / "awesomeface.png").string(); case ImgID::ItemFrame: return (img_root / "frame.png").string(); + case ImgID::SelectedFrame: return (img_root / "selected_frame.png").string(); case ImgID::HealthPotion: return (img_root / "pot_health.png").string(); case ImgID::SwiftnessPotion: return (img_root / "pot_swiftness.png").string(); case ImgID::InvisPotion: return (img_root / "pot_invisibility.png").string(); - } } diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index 712491a6..df07c4c1 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -20,6 +20,7 @@ Player::Player(): this->physics.collider = Collider::Box; this->info.is_alive = true; this->info.respawn_time = NULL; + this->sharedInventory.selected = 1; } Player::~Player() { diff --git a/src/server/game/servergamestate.cpp b/src/server/game/servergamestate.cpp index 515c4534..3fe0b284 100644 --- a/src/server/game/servergamestate.cpp +++ b/src/server/game/servergamestate.cpp @@ -169,19 +169,38 @@ void ServerGameState::update(const EventList& events) { break; } + case EventType::SelectItem: + { + auto selectItemEvent = boost::get(event.data); + player->sharedInventory.selected = selectItemEvent.itemNum; + break; + } case EventType::UseItem: { auto useItemEvent = boost::get(event.data); - Object* obj = this->objects.getObject(useItemEvent.playerEID); - Player* player = this->objects.getPlayer(obj->typeID); - if (player->inventory.find(useItemEvent.itemNum) != player->inventory.end()) { - updateItem(player->typeID, player->inventory.at(useItemEvent.itemNum)); - player->inventory.erase(useItemEvent.itemNum); - player->sharedInventory.inventory.erase(useItemEvent.itemNum); + int itemSelected = player->sharedInventory.selected; + if (player->inventory.find(itemSelected) != player->inventory.end()) { + updateItem(player->typeID, player->inventory.at(itemSelected)); + player->inventory.erase(itemSelected); + player->sharedInventory.inventory.erase(itemSelected); //TODO : should also remove item afterwards } break; } + case EventType::DropItem: + { + auto dropItemEvent = boost::get(event.data); + int itemSelected = player->sharedInventory.selected; + if (player->inventory.find(itemSelected) != player->inventory.end()) { + Item* item = this->objects.getItem(player->inventory.at(itemSelected)); + item->iteminfo.held = false; + item->physics.collider = Collider::Box; + item->physics.shared.corner = (player->physics.shared.corner + (player->physics.shared.facing * 4.0f)) * glm::vec3(1.0f, 0.0f, 1.0f); + player->inventory.erase(itemSelected); + player->sharedInventory.inventory.erase(itemSelected); + } + break; + } // default: // std::cerr << "Unimplemented EventType (" << event.type << ") received" << std::endl; @@ -236,6 +255,12 @@ void ServerGameState::updateMovement() { if (otherObj->physics.collider == Collider::None) { continue; } if (detectCollision(object->physics, otherObj->physics)) { + + // If item, resolve it here + if (otherObj->type == ObjectType::Potion) { + otherObj->doCollision(object, this); + continue; + } collided = true; // Check x-axis collision diff --git a/src/shared/game/event.cpp b/src/shared/game/event.cpp index a12bfc7e..178d8bb2 100644 --- a/src/shared/game/event.cpp +++ b/src/shared/game/event.cpp @@ -21,7 +21,9 @@ std::ostream& operator<<(std::ostream& os, const EventType& type) { TO_STR(MoveRelative); TO_STR(MoveAbsolute); TO_STR(SpawnEntity); + TO_STR(SelectItem); TO_STR(UseItem); + TO_STR(DropItem); default: os << "Unknown EventType"; break; From e59da3b7baad91bb27269be0c963ecd2270731a3 Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Sat, 11 May 2024 17:43:40 -0700 Subject: [PATCH 08/12] create a cube maze --- maps/room.maze | 4 ++++ src/client/camera.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/maps/room.maze b/maps/room.maze index 7342f999..f42b5139 100644 --- a/maps/room.maze +++ b/maps/room.maze @@ -1,5 +1,9 @@ ######### #h.s.i.h# #.......# +#.......# +#.......# +#.......# +#.......# #.@.s..X# ######### \ No newline at end of file diff --git a/src/client/camera.cpp b/src/client/camera.cpp index 260cd04f..251bbbca 100644 --- a/src/client/camera.cpp +++ b/src/client/camera.cpp @@ -76,7 +76,7 @@ glm::vec3 Camera::move(bool is_x_axis, float dir) { glm::vec3 effCameraFront = glm::normalize(glm::vec3(cameraFront.x, 0.0f, cameraFront.z)); if (is_x_axis) { - return dir * glm::normalize(glm::cross(effCameraFront, cameraUp)) * speed; + return dir * speed * glm::normalize(glm::cross(effCameraFront, cameraUp)); } else { return dir * speed * effCameraFront; // return dir * speed * cameraRight; From 02e7cf1f44d08e67d09348e32be2ffa72cdc594e Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Sat, 11 May 2024 20:55:02 -0700 Subject: [PATCH 09/12] fix for lint --- include/server/game/item.hpp | 3 ++- include/server/game/potion.hpp | 2 +- include/server/game/spell.hpp | 3 +-- include/shared/game/event.hpp | 6 +++--- include/shared/game/sharedobject.hpp | 3 ++- src/server/game/potion.cpp | 1 + src/server/game/spell.cpp | 7 +++---- 7 files changed, 13 insertions(+), 12 deletions(-) diff --git a/include/server/game/item.hpp b/include/server/game/item.hpp index 1b744d4a..9f7f1411 100644 --- a/include/server/game/item.hpp +++ b/include/server/game/item.hpp @@ -18,9 +18,10 @@ class Item : public Object { Item(ObjectType type, bool movable, glm::vec3 corner, ModelType model, glm::vec3 dimensions); virtual void useItem(Object* other, ServerGameState& state); + void doCollision(Object* other, ServerGameState* state) override; - virtual SharedObject toShared() override; + SharedObject toShared() override; private: diff --git a/include/server/game/potion.hpp b/include/server/game/potion.hpp index b67e5312..cd1c7018 100644 --- a/include/server/game/potion.hpp +++ b/include/server/game/potion.hpp @@ -18,7 +18,7 @@ class Potion : public Item { int effectScalar; PotionType potType; - void useItem(Object* other, ServerGameState& state); + void useItem(Object* other, ServerGameState& state) override; bool timeOut(); void revertEffect(ServerGameState& state); diff --git a/include/server/game/spell.hpp b/include/server/game/spell.hpp index f3b92e66..d4e4ce29 100644 --- a/include/server/game/spell.hpp +++ b/include/server/game/spell.hpp @@ -1,6 +1,5 @@ #pragma once -#include "server/game/item.hpp" #include "server/game/servergamestate.hpp" #include "server/game/object.hpp" @@ -10,7 +9,7 @@ enum class SpellType { class Spell : public Item { public: - Potion(); + Spell(glm::vec3 corner, glm::vec3 dimensions); SpellType spellType; diff --git a/include/shared/game/event.hpp b/include/shared/game/event.hpp index 98f6a124..7e7cb880 100644 --- a/include/shared/game/event.hpp +++ b/include/shared/game/event.hpp @@ -190,7 +190,7 @@ struct SpawnEntityEvent { */ struct SelectItemEvent { SelectItemEvent() {} - SelectItemEvent(EntityID playerEID, int itemNum) : playerEID(playerEID), itemNum(itemNum) {} + explicit SelectItemEvent(EntityID playerEID, int itemNum) : playerEID(playerEID), itemNum(itemNum) {} EntityID playerEID; int itemNum; @@ -206,7 +206,7 @@ struct SelectItemEvent { */ struct UseItemEvent { UseItemEvent() {} - UseItemEvent(EntityID playerEID) : playerEID(playerEID) {} + explicit UseItemEvent(EntityID playerEID) : playerEID(playerEID) {} EntityID playerEID; @@ -220,7 +220,7 @@ struct UseItemEvent { */ struct DropItemEvent { DropItemEvent() {} - DropItemEvent(EntityID playerEID) : playerEID(playerEID){} + explicit DropItemEvent(EntityID playerEID) : playerEID(playerEID){} EntityID playerEID; diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index 7733fcde..70c286f3 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -18,7 +18,8 @@ enum class ObjectType { Potion, Player, Enemy, - SpikeTrap + SpikeTrap, + Spell }; /** diff --git a/src/server/game/potion.cpp b/src/server/game/potion.cpp index c662afb0..e149583c 100644 --- a/src/server/game/potion.cpp +++ b/src/server/game/potion.cpp @@ -13,6 +13,7 @@ Potion::Potion(glm::vec3 corner, glm::vec3 dimensions, PotionType type): this->duration = 0; this->effectScalar = 0; this->potType = type; + this->usedPlayer = nullptr; switch (type) { case PotionType::Health: diff --git a/src/server/game/spell.cpp b/src/server/game/spell.cpp index d216b12c..1fdf2dad 100644 --- a/src/server/game/spell.cpp +++ b/src/server/game/spell.cpp @@ -5,11 +5,10 @@ #include "server/game/objectmanager.hpp" #include "server/game/object.hpp" -Spell::Spell(): - Item(ObjectType::Spell) - +Spell::Spell(glm::vec3 corner, glm::vec3 dimensions): + Item(ObjectType::Spell, false, corner, ModelType::Cube, dimensions) +{ this->spellType = SpellType::Fireball; - this->iteminfo.type = ItemType::Spell; } void Spell::setSpellType(SpellType type) { From cdd1b3cf27301746b73bdc497686602d6eb69025 Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Sat, 11 May 2024 21:16:51 -0700 Subject: [PATCH 10/12] remove temporary scaling --- src/client/gui/widget/staticimg.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/client/gui/widget/staticimg.cpp b/src/client/gui/widget/staticimg.cpp index f2566505..3dc3fc3b 100644 --- a/src/client/gui/widget/staticimg.cpp +++ b/src/client/gui/widget/staticimg.cpp @@ -12,8 +12,8 @@ std::unique_ptr StaticImg::shader = nullptr; StaticImg::StaticImg(glm::vec2 origin, gui::img::Img img): Widget(Type::StaticImg, origin), img(img) { - this->width = img.width * 2; - this->height = img.height * 2; + this->width = img.width; + this->height = img.height; this->texture_id = img.texture_id; } @@ -28,8 +28,8 @@ StaticImg::~StaticImg() { void StaticImg::render() { // ⚠ SUS SHIT ⚠ - float width_percent = (2.0f / (WINDOW_WIDTH)) * (img.width) * 2; - float height_percent = (2.0f / (WINDOW_HEIGHT)) * (img.height) * 2; + float width_percent = (2.0f / (WINDOW_WIDTH)) * (img.width); + float height_percent = (2.0f / (WINDOW_HEIGHT)) * (img.height); glm::vec2 bottom_left = (2.0f * (origin / glm::vec2(WINDOW_WIDTH, WINDOW_HEIGHT))) - glm::vec2(1.0f, 1.0f); float vertices[] = { From d9b00fbad560ddc0539ebf3b79114e2dd88afb1e Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Sat, 11 May 2024 21:52:38 -0700 Subject: [PATCH 11/12] Inventory size can be dynamic --- include/server/game/constants.hpp | 4 +++- include/shared/game/sharedobject.hpp | 3 ++- src/client/gui/gui.cpp | 11 ++++++----- src/server/game/item.cpp | 10 +++++----- src/server/game/player.cpp | 5 +++-- 5 files changed, 19 insertions(+), 14 deletions(-) diff --git a/include/server/game/constants.hpp b/include/server/game/constants.hpp index ff38099c..3ee789a9 100644 --- a/include/server/game/constants.hpp +++ b/include/server/game/constants.hpp @@ -10,7 +10,6 @@ #define MAX_WALLS 1000 #define MAX_TRAPS 10 #define MAX_SPELLS 4 -#define MAX_ITEMS 4 /* Constants */ #define FIRST_TIMESTEP 0 @@ -27,6 +26,9 @@ // Player Stat Constants #define INITIAL_HEALTH 100 +/* Inventory */ +#define INVENTORY_SIZE 4 + /* Potion Stats */ #define RESTORE_HEALTH 20 #define HEALTH_DURATION 0 diff --git a/include/shared/game/sharedobject.hpp b/include/shared/game/sharedobject.hpp index 70c286f3..0e79567c 100644 --- a/include/shared/game/sharedobject.hpp +++ b/include/shared/game/sharedobject.hpp @@ -47,10 +47,11 @@ struct SharedStats { struct SharedInventory { // need to share itemtype data... int selected; + int inventory_size; std::unordered_map inventory; DEF_SERIALIZE(Archive& ar, const unsigned int version) { - ar& selected & inventory; + ar& selected& inventory_size& inventory; } }; diff --git a/src/client/gui/gui.cpp b/src/client/gui/gui.cpp index 0b023964..0ae829d9 100644 --- a/src/client/gui/gui.cpp +++ b/src/client/gui/gui.cpp @@ -370,6 +370,7 @@ void GUI::_sharedGameHUD() { } auto self = client->gameState.objects.at(*self_eid); + auto inventory_size = self->inventoryInfo->inventory_size; // Flexbox for the items // Loading itemframe again if no item @@ -378,9 +379,9 @@ void GUI::_sharedGameHUD() { glm::vec2(WINDOW_WIDTH, 0.0f), widget::Flexbox::Options(widget::Dir::HORIZONTAL, widget::Align::CENTER, 0.0f) ); - for (int x : {1, 2, 3, 4}) { - if (self->inventoryInfo->inventory.contains(x)) { - switch (self->inventoryInfo->inventory.at(x)) { + for (int i = 1; i <= inventory_size; i++) { + if (self->inventoryInfo->inventory.contains(i)) { + switch (self->inventoryInfo->inventory.at(i)) { case ModelType::HealthPotion: { itemflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::HealthPotion))); break; @@ -409,8 +410,8 @@ void GUI::_sharedGameHUD() { widget::Flexbox::Options(widget::Dir::HORIZONTAL, widget::Align::CENTER, 0.0f) //last one is padding ); - for (int x : {1, 2, 3, 4}) { - if (self->inventoryInfo->selected == x) { + for (int i = 1; i <= inventory_size; i++) { + if (self->inventoryInfo->selected == i) { frameflex->push(widget::StaticImg::make(glm::vec2(0.0f), images.getImg(img::ImgID::SelectedFrame))); } else { diff --git a/src/server/game/item.cpp b/src/server/game/item.cpp index e5fa46d1..1d510715 100644 --- a/src/server/game/item.cpp +++ b/src/server/game/item.cpp @@ -17,11 +17,11 @@ void Item::doCollision(Object* other, ServerGameState* state) { auto player = dynamic_cast(other); if (player == nullptr) return; // only allow players to pick up items - if (player->inventory.size() < MAX_ITEMS) { - for (int x : {1, 2, 3, 4}) { - if (!player->inventory.contains(x)) { - player->inventory[x] = this->typeID; - player->sharedInventory.inventory[x] = this->modelType; + if (player->inventory.size() < player->sharedInventory.inventory_size) { + for (int i = 1; i <= player->sharedInventory.inventory_size; i++) { + if (!player->inventory.contains(i)) { + player->inventory[i] = this->typeID; + player->sharedInventory.inventory[i] = this->modelType; break; } } diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index f281d6e4..798f9a28 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -1,6 +1,7 @@ #include "server/game/player.hpp" #include "shared/game/sharedobject.hpp" #include "shared/game/stat.hpp" +#include "server/game/constants.hpp" #include SharedObject Player::toShared() { @@ -14,11 +15,11 @@ Player::Player(glm::vec3 corner, glm::vec3 facing): Creature(ObjectType::Player, corner, facing, ModelType::Player, SharedStats( Stat(0, 100, 50), Stat(0, 10, 5) - )) + )), + sharedInventory(SharedInventory { .selected = false, .inventory_size = INVENTORY_SIZE }) { this->info.is_alive = true; this->info.respawn_time = NULL; - this->sharedInventory.selected = 1; } Player::~Player() { From 0e6473a54ea6876ceb49876b382c9a86c4073773 Mon Sep 17 00:00:00 2001 From: tedpark217 Date: Sun, 12 May 2024 20:10:56 -0700 Subject: [PATCH 12/12] minor fix --- src/server/game/player.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/game/player.cpp b/src/server/game/player.cpp index 798f9a28..50602525 100644 --- a/src/server/game/player.cpp +++ b/src/server/game/player.cpp @@ -16,7 +16,7 @@ Player::Player(glm::vec3 corner, glm::vec3 facing): Stat(0, 100, 50), Stat(0, 10, 5) )), - sharedInventory(SharedInventory { .selected = false, .inventory_size = INVENTORY_SIZE }) + sharedInventory(SharedInventory { .selected = 1, .inventory_size = INVENTORY_SIZE }) { this->info.is_alive = true; this->info.respawn_time = NULL;