diff options
Diffstat (limited to 'include/components.hpp')
-rw-r--r-- | include/components.hpp | 666 |
1 files changed, 4 insertions, 662 deletions
diff --git a/include/components.hpp b/include/components.hpp index fe8e7a6..93d7196 100644 --- a/include/components.hpp +++ b/include/components.hpp @@ -8,669 +8,11 @@ #ifndef COMPONENTS_HPP #define COMPONENTS_HPP -#include <string> -#include <vector> - -#include <error.hpp> -#include <events.hpp> -#include <inventory.hpp> -#include <random.hpp> -#include <texture.hpp> -#include <vector2.hpp> - -#include <entityx/entityx.h> -#include <tinyxml2.h> -using namespace tinyxml2; - -// TODO heyyy guys #include <components/all.hpp> -/** - * @struct Position - * @brief Stores the position of an entity on the xy plane. - */ -struct Position : public Component { - /** - * Constructor that sets the position of the object, if nothing is passed it will default to 0. - * @param x The x position the object will be placed at. - * @param y the y position the object will be placed at. - */ - Position(float x = 0.0f, float y = 0.0f): x(x), y(y) {} - Position(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - float x; /**< The x position in the world */ - float y; /**< The y position in the world */ - - void fromXML(XMLElement* imp, XMLElement* def) final { - vec2 c; - if (imp->Attribute("position") != nullptr) - c = imp->StrAttribute("position"); - else - c = def->StrAttribute("value"); - - x = c.x, y = c.y; - } -}; - -/** - * @struct Direction - * @brief Store an entities velocity. - * This allows the entity to move throughout the world. - */ -struct Direction : public Component { - /** - * Constructor that sets the velocity, if no position is passed, it defaults to (0,0). - * @param x The velocity of the object on the x axis. - * @param y The velocity of the object on the y axis. - */ - Direction(float x = 0.0f, float y = 0.0f): x(x), y(y), grounded(false) {} - Direction(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - float x; /**< Velocity the object is moving in the x direction, this is added to the position */ - float y; /**< Velocity the object is moving in the y direction, this is added to the position */ - bool grounded; - - void fromXML(XMLElement* imp, XMLElement* def) final { - vec2 c; - if (imp->Attribute("direction") != nullptr) { - c = imp->StrAttribute("direction"); - } else if (def->Attribute("value") != nullptr) { - c = def->StrAttribute("value"); - } else { - c = vec2(0, 0); - } - - x = c.x, y = c.y, grounded = false; - } -}; - -/** - * @struct Physics - * @brief Allows and entity to react to gravity and frictions. - * When an entity inherits this component it will react with gravity and move with friction. - */ -struct Physics : public Component { - /** - * Constructor that sets the gravity constant, if not specified it becomes 0. - * @param g The non default gravity constant. - */ - Physics(float g = 0.2f): g(g) {} - Physics(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - float g; /**< The gravity constant, how fast the object falls */ - - void fromXML(XMLElement* imp, XMLElement* def) final { - if (imp->QueryFloatAttribute("gravity", &g) != XML_NO_ERROR) { - if (def->QueryFloatAttribute("value", &g) != XML_NO_ERROR) - g = 0.2f; - } - } -}; - -/** - * @struct Grounded - * @brief Places an entity without physics on the ground. - * This is used so we don't have to update the physics of a non-moving object every loop. - */ -struct Grounded : public Component { - Grounded(bool g = false) - : grounded(g) {} - Grounded(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - bool grounded; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - (void)def; - grounded = false; - } -}; - -/** - * @struct Health - * @brief Gives and entity health and stuff. - */ -struct Health : public Component { - /** - * Constructor that sets the variables, with 1 health as default. - */ - Health(int m = 1, int h = 0) - : health(h != 0 ? h : m), maxHealth(m) {} - Health(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - int health; /**< The current amount of health */ - int maxHealth; /**< The maximum amount of health */ - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - (void)def; - // TODO - if (def->QueryIntAttribute("value", &health) != XML_NO_ERROR) - health = 1; - maxHealth = health; - } -}; - -struct Portal : public Component { - Portal(std::string tf = "") - : toFile(tf) {} - Portal(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - std::string toFile; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)def; - toFile = imp->StrAttribute("inside"); - } -}; - -struct Name : public Component { - Name(std::string n = "") - : name(n) {} - Name(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - std::string name; - - void fromXML(XMLElement* imp, XMLElement* def) final { - auto n = imp->Attribute("name"); - - // TODO check def's nullness - name = n != nullptr ? n : def->Attribute("value"); - } -}; - -struct Player {}; - -struct ItemDrop { - ItemDrop(InventoryEntry& ie) - : item(ie) {} - - InventoryEntry item; -}; - -/** - * @struct Solid - * @brief Allows an entity to collide with other objects. - * When an entity has this component it can collide with the world and other objects. - */ -struct Solid : public Component { - /** - * Constructor that sets the entities dimensions based on what is passed. - * @param w The desired width of the entity. - * @param h The desired height of the entity. - */ - Solid(float w = 0.0f, float h = 0.0f) - : width(w), height(h), offset(0), passable(true) {} - Solid(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - void Passable(bool v) { passable = v; } - bool Passable(void) { return passable; } - - float width; /**< The width of the entity in units */ - float height; /**< The height of the entity in units */ - vec2 offset; /**< This allows us to make the hitbox in any spot */ - bool passable; /**< This determines whether or not one can pass by the entity */ - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - vec2 c; - if (def->Attribute("value") != nullptr) - c = def->StrAttribute("value"); - else - c = vec2(0, 0); - - width = c.x, height = c.y, offset = 0, passable = true; - } -}; - -struct SpriteData { - SpriteData(void) = default; - - SpriteData(std::string path, vec2 off): - offset(off) { - tex = Texture(path); - size = tex.getDim(); - - size_tex = vec2(1.0, 1.0); - - offset_tex.x = offset.x/size.x; - offset_tex.y = offset.y/size.y; - } - - SpriteData(std::string path, vec2 off, vec2 si): - size(si), offset(off) { - tex = Texture(path); - vec2 tmpsize = tex.getDim(); - - size_tex.x = size.x/tmpsize.x; - size_tex.y = size.y/tmpsize.y; - - offset_tex.x = offset.x/tmpsize.x; - offset_tex.y = offset.y/tmpsize.y; - } - - SpriteData(Texture t) - : tex(t) { - size_tex = 1; - offset_tex = 0; - size = tex.getDim(); - offset = 0; - } - - Texture tex; - vec2 size; - vec2 offset; - - vec2 offset_tex; - vec2 size_tex; - - unsigned int limb; -}; - -using Frame = std::vector<std::pair<SpriteData, vec2>>; - -std::vector<Frame> developFrame(XMLElement*); - -/** - * @struct Sprite - * @brief If an entity is visible we want to be able to see it. - * Each entity is given a sprite, a sprite can consist of manu frames or pieces to make one. - */ -struct Sprite : public Component { - Sprite(bool left = false) - : faceLeft(left) {} - Sprite(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - Frame getSprite() { - return sprite; - } - - int clearSprite() { - if (sprite.empty()) - return 0; - - sprite.clear(); - return 1; - } - - int addSpriteSegment(SpriteData data, vec2 loc) { - //TODO if sprite is in this spot, do something - sprite.push_back(std::make_pair(data, loc)); - return 1; - } - - int changeSpriteSegment(SpriteData data, vec2 loc) { - for (auto &s : sprite) { - if (s.second == loc) { - s.first = data; - - return 1; - } - } - addSpriteSegment(data, loc); - return 0; - } - - vec2 getSpriteSize() { - vec2 st; /** the start location of the sprite (bottom left)*/ - vec2 ed; /** the end ofthe location of the sprite (bottom right)*/ - vec2 dim; /** how wide the sprite is */ - - if (sprite.size()) { - st.x = sprite[0].second.x; - st.y = sprite[0].second.y; - - ed.x = sprite[0].second.x + sprite[0].first.size.x; - ed.y = sprite[0].second.y + sprite[0].first.size.y; - } else { - return vec2(0.0f, 0.0f); - } - - for (auto &s : sprite) { - if (s.second.x < st.x) - st.x = s.second.x; - if (s.second.y < st.y) - st.y = s.second.y; - - if (s.second.x + s.first.size.x > ed.x) - ed.x = s.second.x + s.first.size.x; - if (s.second.y + s.first.size.y > ed.y) - ed.y = s.second.y + s.first.size.y; - } - - dim = vec2(ed.x - st.x, ed.y - st.y); - dim.x *= game::HLINE; - dim.y *= game::HLINE; - return dim; - } - - Frame sprite; - bool faceLeft; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - auto frames = developFrame(def); - if (!frames.empty()) - sprite = frames.at(0); - } -}; - -/** - * @struct Limb - * @brief Storage of frames for the limbs of a sprite. - * This will allow us to only update a certain limb. This was we can do mulitple animation types at once. - */ -struct Limb { - Limb() { - } - - // adds frame to the back of the frame stack - void addFrame(Frame fr) { - frame.push_back(fr); - } - - void firstFrame(Frame& duckmyass) { - // loop through the spritedata of the sprite we wanna change - for (auto &d : duckmyass) { - // if the sprite data is the same limb as this limb - if (d.first.limb == limbID) { - // rotate through (for safety) the first frame to set the limb - for (auto &fa : frame.at(0)) { - if (fa.first.limb == limbID) { - d.first = fa.first; - d.second = fa.second; - } - } - } - } - } - - void nextFrame(Frame& duckmyass, float dt) { - updateCurrent -= dt; - if (updateCurrent <= 0) { - updateCurrent = updateRate; - } else { - return; - } - - - if (index < frame.size() - 1) - index++; - else - index = 0; - - for (auto &d : duckmyass) { - if (d.first.limb == limbID) { - for (auto &fa : frame.at(index)) { - if (fa.first.limb == limbID) { - d.first = fa.first; - d.second = fa.second; - } - } - } - } - - } - - float updateRate; /**< How often we will change each frame. */ - float updateCurrent = 0; /**< How much has been updated in the current frame. */ - unsigned int updateType; /**< What the updateRate will base it's updates off of. - ie: Movement, attacking, jumping. */ - unsigned int limbID; /**< The id of the limb we will be updating */ - - unsigned int index = 0; /**< The current sprite being used for the limb. */ - - std::vector<Frame> frame; /**< The multiple frames of each limb. */ -}; - -//TODO kill clyne -struct Animate : public Component { - // COMMENT - std::vector<Limb> limb; - // COMMENT - unsigned int index; - - Animate(){ - index = 0; - } - - Animate(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - // COMMENT - - void firstFrame(unsigned int updateType, Frame &sprite) { - unsigned int upid = updateType; //^see todo - for (auto &l : limb) { - if (l.updateType == upid) { - l.firstFrame(sprite); - } - } - } - //TODO make updateType an enum - void updateAnimation(unsigned int updateType, Frame& sprite, float dt) { - unsigned int upid = updateType; //^see todo - for (auto &l : limb) { - if (l.updateType == upid) { - l.nextFrame(sprite, dt); - } - } - } - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - - auto animx = def->FirstChildElement(); - uint limbid = 0; - float limbupdate = 0; - uint limbupdatetype = 0; - - while (animx != nullptr) { - if (std::string(animx->Name()) == "movement") { - limbupdatetype = 1; - - auto limbx = animx->FirstChildElement(); - while (limbx != nullptr) { - if (std::string(limbx->Name()) == "limb") { - auto frames = developFrame(limbx); - limb.push_back(Limb()); - auto& newLimb = limb.back(); - newLimb.updateType = limbupdatetype; - - if (limbx->QueryUnsignedAttribute("id", &limbid) == XML_NO_ERROR) - newLimb.limbID = limbid; - if (limbx->QueryFloatAttribute("update", &limbupdate) == XML_NO_ERROR) - newLimb.updateRate = limbupdate; - - // place our newly developed frames in the entities animation stack - for (auto &f : frames) { - newLimb.addFrame(f); - for (auto &fr : newLimb.frame) { - for (auto &sd : fr) - sd.first.limb = limbid; - } - } - } - - limbx = limbx->NextSiblingElement(); - } - } - - animx = animx->NextSiblingElement(); - } - } -}; - -/** - * @struct Visible - * @brief If an entity is visible we want to be able to draw it. - */ -struct Visible : public Component { - /** - * @brief Decide what layer to draw the entity on. - * When stuff is drawn, it is drawn on a "layer". This layer gives more of a 3D effect to the world. - * @param z The desired "layer" of the entity. - */ - Visible(float z = 0.0f): z(z) {} - Visible(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - float z; /**< The value along the z axis the entity will be drawn on */ - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - if (def->QueryFloatAttribute("value", &z) != XML_NO_ERROR) - z = 0; - } -}; - -struct Dialog : public Component { - Dialog(int idx = 0) - : index(idx), rindex((idx == 9999) ? randGet() : idx), talking(false) {} - Dialog(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - int index; - int rindex; - bool talking; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)def; - bool hasDialog; - if (imp->QueryBoolAttribute("hasDialog", &hasDialog) != XML_NO_ERROR) - hasDialog = false; - - index = hasDialog ? 0 : 9999; - rindex = (index == 9999) ? randGet() : index; - talking = false; - } -}; - -// movement styles - -/** - * Causes the entity to hop around. - */ -struct Hop { - Hop(float r = 0) - : hopRatio(r) {} - - float hopRatio; -}; - -/** - * Causes the entity to wander about. - */ -struct Wander { - Wander(float ix = 0, float r = 0) - : initialX(ix), range(r), countdown(0) {} - - float initialX; - float range; - int countdown; -}; - -/** - * Causes the entity to get mad at the player, charge and fight. - */ -struct Aggro : public Component { - Aggro(const std::string& a) - : arena(a) {} - Aggro(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - std::string arena; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - // TODO null check..?, imp given - arena = def->StrAttribute("arena"); - } -}; - -struct Hit : public Component { - Hit(int d, bool p = false) - : damage(d), pierce(p) {} - - int damage; - bool pierce; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - (void)def; - } -}; - -struct Trigger : public Component { - Trigger(const std::string& t) - : text(t) {} - Trigger(XMLElement* imp, XMLElement* def) { - fromXML(imp, def); - } - - std::string text; - - void fromXML(XMLElement* imp, XMLElement* def) final { - (void)imp; - (void)def; - text = "You got me!"; - } -}; - -/** - * SYSTEMS - */ - -class MovementSystem : public entityx::System<MovementSystem> { -public: - void update(entityx::EntityManager &en, entityx::EventManager &ev, entityx::TimeDelta dt) override; -}; - -class PhysicsSystem : public entityx::System<PhysicsSystem> { -public: - void update(entityx::EntityManager &en, entityx::EventManager &ev, entityx::TimeDelta dt) override; -}; - -class RenderSystem : public entityx::System<RenderSystem> { -private: - static std::string loadTexString; - static Texture loadTexResult; - -public: - static Texture loadTexture(const std::string& file); - static void render(void); - - void update(entityx::EntityManager &en, entityx::EventManager &ev, entityx::TimeDelta dt) override - { (void)en; (void)ev; (void)dt; } -}; - -class DialogSystem : public entityx::System<DialogSystem>, public entityx::Receiver<DialogSystem> { -public: - void configure(entityx::EventManager&); - void receive(const MouseClickEvent&); - void update(entityx::EntityManager&, entityx::EventManager&, entityx::TimeDelta) override; -}; +#include <systems/dialog.hpp> +#include <systems/movement.hpp> +#include <systems/physics.hpp> +#include <systems/render.hpp> #endif //COMPONENTS_HPP |