widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #10278
[Merge] lp:~widelands-dev/widelands/ai_trainingsites_proportion into lp:widelands
GunChleoc has proposed merging lp:~widelands-dev/widelands/ai_trainingsites_proportion into lp:widelands.
Commit message:
Added new entry "trainingsites_max_percent" to AI building hints. If this is not set, the percentages will be evenly distributed while loading the tribe. TribeDescr now has a new convenience function trainingsites().
Requested reviews:
TiborB (tiborb95)
For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/ai_trainingsites_proportion/+merge/324607
Let's get this in before the big AI change, to make the diff smaller.
--
Your team Widelands Developers is subscribed to branch lp:~widelands-dev/widelands/ai_trainingsites_proportion.
=== modified file 'data/tribes/buildings/trainingsites/empire/arena/init.lua'
--- data/tribes/buildings/trainingsites/empire/arena/init.lua 2017-02-10 09:40:17 +0000
+++ data/tribes/buildings/trainingsites/empire/arena/init.lua 2017-05-25 09:38:21 +0000
@@ -38,6 +38,7 @@
aihints = {
trainingsite_type = "basic",
+ trainingsites_max_percent = 20,
prohibited_till = 900,
very_weak_ai_limit = 1,
weak_ai_limit = 2,
=== modified file 'src/ai/ai_hints.cc'
--- src/ai/ai_hints.cc 2017-01-25 18:55:59 +0000
+++ src/ai/ai_hints.cc 2017-05-25 09:38:21 +0000
@@ -44,7 +44,10 @@
very_weak_ai_limit_(
table->has_key("very_weak_ai_limit") ? table->get_int("very_weak_ai_limit") : -1),
weak_ai_limit_(table->has_key("weak_ai_limit") ? table->get_int("weak_ai_limit") : -1),
- trainingsite_type_(TrainingSiteType::kNoTS) {
+ trainingsite_type_(TrainingSiteType::kNoTS),
+ trainingsites_max_percent_(table->has_key("trainingsites_max_percent") ?
+ table->get_int("trainingsites_max_percent") :
+ 0) {
if (table->has_key("trainingsite_type")) {
if (table->get_string("trainingsite_type") == "basic") {
@@ -54,3 +57,11 @@
}
}
}
+
+void BuildingHints::set_trainingsites_max_percent(uint8_t percent) {
+ trainingsites_max_percent_ = percent;
+}
+
+uint8_t BuildingHints::trainingsites_max_percent() const {
+ return trainingsites_max_percent_;
+}
=== modified file 'src/ai/ai_hints.h'
--- src/ai/ai_hints.h 2017-01-25 18:55:59 +0000
+++ src/ai/ai_hints.h 2017-05-25 09:38:21 +0000
@@ -115,6 +115,10 @@
return trainingsite_type_;
}
+ void set_trainingsites_max_percent(uint8_t percent);
+
+ uint8_t trainingsites_max_percent() const;
+
private:
std::string renews_map_resource_;
std::string mines_;
@@ -134,6 +138,7 @@
int16_t very_weak_ai_limit_;
int16_t weak_ai_limit_;
TrainingSiteType trainingsite_type_;
+ int trainingsites_max_percent_;
DISALLOW_COPY_AND_ASSIGN(BuildingHints);
};
=== modified file 'src/logic/map_objects/tribes/building.cc'
--- src/logic/map_objects/tribes/building.cc 2017-05-21 06:14:28 +0000
+++ src/logic/map_objects/tribes/building.cc 2017-05-25 09:38:21 +0000
@@ -189,6 +189,14 @@
size_ <= (fc.field->nodecaps() & Widelands::BUILDCAPS_SIZEMASK);
}
+const BuildingHints& BuildingDescr::hints() const {
+ return hints_;
+}
+
+void BuildingDescr::set_hints_trainingsites_max_percent(int percent) {
+ hints_.set_trainingsites_max_percent(percent);
+}
+
/**
* Normal buildings don't conquer anything, so this returns 0 by default.
*
=== modified file 'src/logic/map_objects/tribes/building.h'
--- src/logic/map_objects/tribes/building.h 2017-05-21 11:16:46 +0000
+++ src/logic/map_objects/tribes/building.h 2017-05-25 09:38:21 +0000
@@ -156,10 +156,9 @@
WorkareaInfo workarea_info_;
- bool suitability(const Map&, const FCoords&) const;
- const BuildingHints& hints() const {
- return hints_;
- }
+ virtual bool suitability(const Map&, const FCoords&) const;
+ const BuildingHints& hints() const;
+ void set_hints_trainingsites_max_percent(int percent);
protected:
virtual Building& create_object() const = 0;
=== modified file 'src/logic/map_objects/tribes/tribe_descr.cc'
--- src/logic/map_objects/tribes/tribe_descr.cc 2017-04-30 10:30:02 +0000
+++ src/logic/map_objects/tribes/tribe_descr.cc 2017-05-25 09:38:21 +0000
@@ -172,6 +172,11 @@
}
buildings_.push_back(index);
+ // Register trainigsites
+ if (get_building_descr(index)->type() == MapObjectType::TRAININGSITE) {
+ trainingsites_.push_back(index);
+ }
+
// Register construction materials
for (const auto& build_cost : get_building_descr(index)->buildcost()) {
if (!is_construction_material(build_cost.first)) {
@@ -188,6 +193,36 @@
}
}
+ // Set default trainingsites proportions for AI. Make sure that we get a sum of ca. 100
+ float trainingsites_without_percent = 0.f;
+ int used_percent = 0;
+ for (const DescriptionIndex& index : trainingsites_) {
+ const BuildingDescr& descr = *tribes_.get_building_descr(index);
+ if (descr.hints().trainingsites_max_percent() == 0) {
+ ++trainingsites_without_percent;
+ } else {
+ used_percent += descr.hints().trainingsites_max_percent();
+ }
+ }
+ if (trainingsites_without_percent > 0.f && used_percent > 100) {
+ throw GameDataError("Predefined training sites proportions add up to > 100%%: %d", used_percent);
+ } else if (trainingsites_without_percent > 0) {
+ const int percent_to_use = std::ceil((100 - used_percent) / trainingsites_without_percent);
+ if (percent_to_use < 1) {
+ throw GameDataError("Training sites without predefined proportions add up to < 1%% and will never be built: %d", used_percent);
+ }
+ for (const DescriptionIndex& index : trainingsites_) {
+ BuildingDescr* descr = tribes_.get_mutable_building_descr(index);
+ if (descr->hints().trainingsites_max_percent() == 0) {
+ descr->set_hints_trainingsites_max_percent(percent_to_use);
+ used_percent += percent_to_use;
+ }
+ }
+ }
+ if (used_percent < 100) {
+ throw GameDataError("Final training sites proportions add up to < 100%%: %d", used_percent);
+ }
+
// Special types
builder_ = add_special_worker(table.get_string("builder"));
carrier_ = add_special_worker(table.get_string("carrier"));
@@ -333,6 +368,10 @@
assert(tribes_.building_exists(barracks_));
return barracks_;
}
+
+const std::vector<DescriptionIndex>& TribeDescr::trainingsites() const {
+ return trainingsites_;
+}
const std::vector<DescriptionIndex>& TribeDescr::worker_types_without_cost() const {
return worker_types_without_cost_;
}
=== modified file 'src/logic/map_objects/tribes/tribe_descr.h'
--- src/logic/map_objects/tribes/tribe_descr.h 2017-04-30 10:30:02 +0000
+++ src/logic/map_objects/tribes/tribe_descr.h 2017-05-25 09:38:21 +0000
@@ -105,6 +105,8 @@
DescriptionIndex headquarters() const;
DescriptionIndex port() const;
DescriptionIndex barracks() const;
+
+ const std::vector<DescriptionIndex>& trainingsites() const;
const std::vector<DescriptionIndex>& worker_types_without_cost() const;
uint32_t frontier_animation() const;
@@ -186,6 +188,7 @@
DescriptionIndex port_; // The port that this tribe uses
DescriptionIndex barracks_; // The barracks to create soldiers
std::vector<DescriptionIndex> worker_types_without_cost_;
+ std::vector<DescriptionIndex> trainingsites_;
// Order and positioning of wares in the warehouse display
WaresOrder wares_order_;
WaresOrderCoords wares_order_coords_;
=== modified file 'src/logic/map_objects/tribes/tribes.cc'
--- src/logic/map_objects/tribes/tribes.cc 2017-01-30 14:40:12 +0000
+++ src/logic/map_objects/tribes/tribes.cc 2017-05-25 09:38:21 +0000
@@ -284,6 +284,10 @@
return buildings_->get_mutable(buildingindex);
}
+BuildingDescr* Tribes::get_mutable_building_descr(DescriptionIndex buildingindex) const {
+ return buildings_->get_mutable(buildingindex);
+}
+
const ImmovableDescr* Tribes::get_immovable_descr(DescriptionIndex immovableindex) const {
return immovables_->get_mutable(immovableindex);
}
=== modified file 'src/logic/map_objects/tribes/tribes.h'
--- src/logic/map_objects/tribes/tribes.h 2017-01-30 14:40:12 +0000
+++ src/logic/map_objects/tribes/tribes.h 2017-05-25 09:38:21 +0000
@@ -131,6 +131,7 @@
DescriptionIndex worker_index(const std::string& workername) const;
const BuildingDescr* get_building_descr(DescriptionIndex building_index) const;
+ BuildingDescr* get_mutable_building_descr(DescriptionIndex building_index) const;
const ImmovableDescr* get_immovable_descr(DescriptionIndex immovable_index) const;
const ShipDescr* get_ship_descr(DescriptionIndex ship_index) const;
const WareDescr* get_ware_descr(DescriptionIndex ware_index) const;
References