summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sim/include/kurator/sim/HitPoints.h14
-rw-r--r--sim/src/Builder.cpp6
-rw-r--r--sim/src/HitPoints.cpp29
-rw-r--r--universe/include/kurator/universe/ShipType.h2
-rw-r--r--universe/resources/universe/ship_types.json6
-rw-r--r--universe/src/JsonRepository.cpp2
6 files changed, 51 insertions, 8 deletions
diff --git a/sim/include/kurator/sim/HitPoints.h b/sim/include/kurator/sim/HitPoints.h
index b9a8523..0004999 100644
--- a/sim/include/kurator/sim/HitPoints.h
+++ b/sim/include/kurator/sim/HitPoints.h
@@ -9,8 +9,18 @@ namespace sim
struct HitPoints
{
- double structure;
- double structure_resists = 0.7;
+ HitPoints(double base_shield, double base_armour, double base_structure);
+
+ struct Layer
+ {
+ double points;
+ double resists = 0.7;
+ double consume(double& damage);
+ };
+
+ Layer structure;
+ Layer armour;
+ Layer shield;
double deal(double damage);
bool is_alive() const;
double total() const;
diff --git a/sim/src/Builder.cpp b/sim/src/Builder.cpp
index f1e4762..e6984fe 100644
--- a/sim/src/Builder.cpp
+++ b/sim/src/Builder.cpp
@@ -39,7 +39,11 @@ Builder::operator()(const universe::ShipType& ship_type, const int team) const
ship_type.max_speed * 2.0,
ship_type.max_speed * 3.0);
registry.emplace<AIState>(entity, 6000.0, Point{0.0, 0.0});
- registry.emplace<HitPoints>(entity, ship_type.base_structure_points);
+ registry.emplace<HitPoints>(
+ entity,
+ ship_type.base_shield_points,
+ ship_type.base_armour_points,
+ ship_type.base_structure_points);
return entity;
}
diff --git a/sim/src/HitPoints.cpp b/sim/src/HitPoints.cpp
index d83c369..a214f42 100644
--- a/sim/src/HitPoints.cpp
+++ b/sim/src/HitPoints.cpp
@@ -7,26 +7,45 @@ namespace sim
{
+HitPoints::HitPoints(double base_shield, double base_armour, double base_structure) :
+ structure {base_structure},
+ armour {base_armour},
+ shield {base_shield}
+{
+}
+
+
+double
+HitPoints::Layer::consume(double& damage)
+{
+ if (damage <= 0.0)
+ return 0.0;
+ const double left_to_deal = damage - points;
+ const double actual_damage = damage * resists;
+ points -= damage * resists;
+ damage = left_to_deal;
+ return actual_damage;
+}
+
+
double
HitPoints::deal(double damage)
{
- damage *= structure_resists;
- structure -= damage;
- return damage;
+ return shield.consume(damage) + armour.consume(damage) + structure.consume(damage);
}
bool
HitPoints::is_alive() const
{
- return structure > 0.0;
+ return structure.points > 0.0;
}
double
HitPoints::total() const
{
- return structure;
+ return shield.points + armour.points + structure.points;
}
diff --git a/universe/include/kurator/universe/ShipType.h b/universe/include/kurator/universe/ShipType.h
index fdbb8af..c98a865 100644
--- a/universe/include/kurator/universe/ShipType.h
+++ b/universe/include/kurator/universe/ShipType.h
@@ -13,6 +13,8 @@ struct ShipType
{
std::string name;
double base_structure_points;
+ double base_armour_points;
+ double base_shield_points;
double max_speed;
};
diff --git a/universe/resources/universe/ship_types.json b/universe/resources/universe/ship_types.json
index cc2d892..0e7bc89 100644
--- a/universe/resources/universe/ship_types.json
+++ b/universe/resources/universe/ship_types.json
@@ -2,16 +2,22 @@
{
"name": "Anvil",
"base_structure_points": 600.0,
+ "base_armour_points": 400.0,
+ "base_shield_points": 3700.0,
"max_speed": 218.0
},
{
"name": "Eclipse",
"base_structure_points": 600.0,
+ "base_armour_points": 950.0,
+ "base_shield_points": 200.0,
"max_speed": 263.0
},
{
"name": "Warbringer",
"base_structure_points": 600.0,
+ "base_armour_points": 400.0,
+ "base_shield_points": 1400.0,
"max_speed": 336.0
}
]
diff --git a/universe/src/JsonRepository.cpp b/universe/src/JsonRepository.cpp
index 40b0b70..e8c8ed3 100644
--- a/universe/src/JsonRepository.cpp
+++ b/universe/src/JsonRepository.cpp
@@ -27,6 +27,8 @@ from_json(const json& item, ShipType& ship)
{
item.at("name").get_to(ship.name);
item.at("base_structure_points").get_to(ship.base_structure_points);
+ item.at("base_armour_points").get_to(ship.base_armour_points);
+ item.at("base_shield_points").get_to(ship.base_shield_points);
item.at("max_speed").get_to(ship.max_speed);
}