From 7ddde5e2ec7bc0e72edd4fcf4cd0253e8631bd36 Mon Sep 17 00:00:00 2001 From: Lendemor Date: Sat, 4 Jun 2016 02:36:03 +0200 Subject: [PATCH] added battle resolution and verification that dude is alive before thinking --- src/coord.h | 2 +- src/dude.h | 1 + src/map.h | 2 +- src/simulation.cpp | 43 +++++++++++++++++++++++++++++++++++++++---- src/simulation.h | 15 ++++++++++++++- 5 files changed, 56 insertions(+), 7 deletions(-) diff --git a/src/coord.h b/src/coord.h index 63b0b2f..9d4a8a7 100644 --- a/src/coord.h +++ b/src/coord.h @@ -75,7 +75,7 @@ struct Coord }; struct CoordHash{ - size_t operator()(const Coord& val) const{ + std::size_t operator()(const Coord& val) const{ return val.x+10000*val.y; } }; diff --git a/src/dude.h b/src/dude.h index 48e8dc4..bc2f93e 100644 --- a/src/dude.h +++ b/src/dude.h @@ -25,6 +25,7 @@ public: int getTeam(){ return m_team; } void setSuccess(bool success) { m_success = success; } void setInventory(PixelType item) { m_inventory = item; } + bool isAlive() { return !m_dead; } void perish() { m_dead = true; } const Coord& getPos() { return m_pos; } void move(Dir d); diff --git a/src/map.h b/src/map.h index edc7a60..40aabae 100644 --- a/src/map.h +++ b/src/map.h @@ -11,7 +11,7 @@ struct Pixel int nbRes; // RESOURCES char *knowledge; // LIBRARY int teamId; // SPAWN - Dude* dudePtr; // DUDE + Dude *dudePtr; // DUDE }; PixelType type; diff --git a/src/simulation.cpp b/src/simulation.cpp index 1a15961..01252da 100644 --- a/src/simulation.cpp +++ b/src/simulation.cpp @@ -34,9 +34,14 @@ void Simulation::update() std::random_shuffle(m_dudes.begin(), m_dudes.end()); for (int i=0; igetTeam()].update(dude); //get action for this dude from behavior function in team - handleAction(dude); + if (dude->isAlive()){ + m_teams[dude->getTeam()].update(dude); //get action for this dude from behavior function in team + handleAction(dude); + } } + + resolveBattles(); + // for each team, spawn dude if condition met for(int i=0; isetSuccess(true); - if (target.type == DUDE) // TODO: add fight between dude and targetDude - NULL; + if (target.type == DUDE) //DONE + m_battles.insert(Battle(dude,target.data.dudePtr)); else // DONE { if(target.type == SPAWN) @@ -211,3 +216,33 @@ void Simulation::handleAction(Dude *dude) } } } + +// TODO: verify if battle resolution work +void Simulation::resolveBattles(){ + for (Battle battle : m_battles){ + Dude *attacker = battle.first, *defender = battle.second; + if (defender->isAlive() && defender->getAction().type == Action::ATTACK){ + if (attacker->getPos() == defender->getPos() + Coord(defender->getAction().dir)){ + bool armedAttacker = attacker->getInventory() == PixelType::SWORD, armedDefender = defender->getInventory() == PixelType::SWORD; + if (armedAttacker == armedDefender){ + if ((rand()%100 + 1) > 50) + attacker->perish(); + else + defender->perish(); + }else if(armedAttacker){ + if ((rand()%100 + 1) > 80) + attacker->perish(); + else + defender->perish(); + }else if(armedDefender){ + if ((rand()%100 + 1) > 20) + attacker->perish(); + else + defender->perish(); + } + }else + defender->perish(); + }else + defender->perish(); + } +} diff --git a/src/simulation.h b/src/simulation.h index 75650d8..9f11efe 100644 --- a/src/simulation.h +++ b/src/simulation.h @@ -2,6 +2,8 @@ #define SIMULATION_H #include +#include +#include #include "behavior.h" #include "team.h" @@ -10,9 +12,21 @@ class MapScene; class Simulation { private: + typedef std::pair Battle; + struct battleComparator{ + bool operator() (Battle a, Battle b){ + return ((a == b) || (a.first == b.second && b.first == a.second)); + } + }; + MapScene *p_map; std::vector m_dudes; std::vector m_teams; + std::set m_battles; + + void handleAction(Dude* dude); + void resolveBattles(); + public: Simulation(MapScene *_map, std::vector &_behaviors); ~Simulation(); @@ -23,7 +37,6 @@ public: * @brief update runs one step of simulation */ void update(); - void handleAction(Dude* dude); }; #endif // SIMULATION_H