← Back to team overview

widelands-dev team mailing list archive

[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