Merge lp:~widelands-dev/widelands/ai_trainingsites_proportion into lp:widelands

Proposed by GunChleoc
Status: Merged
Merged at revision: 8381
Proposed branch: lp:~widelands-dev/widelands/ai_trainingsites_proportion
Merge into: lp:widelands
Diff against target: 209 lines (+75/-4)
9 files modified
data/tribes/buildings/trainingsites/empire/arena/init.lua (+1/-0)
src/ai/ai_hints.cc (+12/-1)
src/ai/ai_hints.h (+5/-0)
src/logic/map_objects/tribes/building.cc (+8/-0)
src/logic/map_objects/tribes/building.h (+2/-3)
src/logic/map_objects/tribes/tribe_descr.cc (+39/-0)
src/logic/map_objects/tribes/tribe_descr.h (+3/-0)
src/logic/map_objects/tribes/tribes.cc (+4/-0)
src/logic/map_objects/tribes/tribes.h (+1/-0)
To merge this branch: bzr merge lp:~widelands-dev/widelands/ai_trainingsites_proportion
Reviewer Review Type Date Requested Status
TiborB Approve
Review via email: mp+324607@code.launchpad.net

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().

Description of the change

Let's get this in before the big AI change, to make the diff smaller.

To post a comment you must log in.
Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 2246. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/236078100.
Appveyor build 2081. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_ai_trainingsites_proportion-2081.

Revision history for this message
TiborB (tiborb95) wrote :

The code was already merged and thus tested in AI branch, so this should be safe to merge to trunk. Though I must admit I did not specifically look if this does what it should. Anyway I think it can go

review: Approve
Revision history for this message
GunChleoc (gunchleoc) wrote :

Thanks for the review :)

@bunnybot merge

Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 2306. State: failed. Details: https://travis-ci.org/widelands/widelands/builds/243567535.
Appveyor build 2140. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_ai_trainingsites_proportion-2140.

Revision history for this message
bunnybot (widelandsofficial) wrote :

Refusing to merge, since Travis is not green. Use @bunnybot merge force for merging anyways.

Travis build 2306. State: failed. Details: https://travis-ci.org/widelands/widelands/builds/243567535.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'data/tribes/buildings/trainingsites/empire/arena/init.lua'
2--- data/tribes/buildings/trainingsites/empire/arena/init.lua 2017-02-10 09:40:17 +0000
3+++ data/tribes/buildings/trainingsites/empire/arena/init.lua 2017-06-17 05:42:52 +0000
4@@ -38,6 +38,7 @@
5
6 aihints = {
7 trainingsite_type = "basic",
8+ trainingsites_max_percent = 20,
9 prohibited_till = 900,
10 very_weak_ai_limit = 1,
11 weak_ai_limit = 2,
12
13=== modified file 'src/ai/ai_hints.cc'
14--- src/ai/ai_hints.cc 2017-01-25 18:55:59 +0000
15+++ src/ai/ai_hints.cc 2017-06-17 05:42:52 +0000
16@@ -44,7 +44,10 @@
17 very_weak_ai_limit_(
18 table->has_key("very_weak_ai_limit") ? table->get_int("very_weak_ai_limit") : -1),
19 weak_ai_limit_(table->has_key("weak_ai_limit") ? table->get_int("weak_ai_limit") : -1),
20- trainingsite_type_(TrainingSiteType::kNoTS) {
21+ trainingsite_type_(TrainingSiteType::kNoTS),
22+ trainingsites_max_percent_(table->has_key("trainingsites_max_percent") ?
23+ table->get_int("trainingsites_max_percent") :
24+ 0) {
25
26 if (table->has_key("trainingsite_type")) {
27 if (table->get_string("trainingsite_type") == "basic") {
28@@ -54,3 +57,11 @@
29 }
30 }
31 }
32+
33+void BuildingHints::set_trainingsites_max_percent(uint8_t percent) {
34+ trainingsites_max_percent_ = percent;
35+}
36+
37+uint8_t BuildingHints::trainingsites_max_percent() const {
38+ return trainingsites_max_percent_;
39+}
40
41=== modified file 'src/ai/ai_hints.h'
42--- src/ai/ai_hints.h 2017-01-25 18:55:59 +0000
43+++ src/ai/ai_hints.h 2017-06-17 05:42:52 +0000
44@@ -115,6 +115,10 @@
45 return trainingsite_type_;
46 }
47
48+ void set_trainingsites_max_percent(uint8_t percent);
49+
50+ uint8_t trainingsites_max_percent() const;
51+
52 private:
53 std::string renews_map_resource_;
54 std::string mines_;
55@@ -134,6 +138,7 @@
56 int16_t very_weak_ai_limit_;
57 int16_t weak_ai_limit_;
58 TrainingSiteType trainingsite_type_;
59+ int trainingsites_max_percent_;
60
61 DISALLOW_COPY_AND_ASSIGN(BuildingHints);
62 };
63
64=== modified file 'src/logic/map_objects/tribes/building.cc'
65--- src/logic/map_objects/tribes/building.cc 2017-05-23 07:00:23 +0000
66+++ src/logic/map_objects/tribes/building.cc 2017-06-17 05:42:52 +0000
67@@ -189,6 +189,14 @@
68 size_ <= (fc.field->nodecaps() & Widelands::BUILDCAPS_SIZEMASK);
69 }
70
71+const BuildingHints& BuildingDescr::hints() const {
72+ return hints_;
73+}
74+
75+void BuildingDescr::set_hints_trainingsites_max_percent(int percent) {
76+ hints_.set_trainingsites_max_percent(percent);
77+}
78+
79 /**
80 * Normal buildings don't conquer anything, so this returns 0 by default.
81 *
82
83=== modified file 'src/logic/map_objects/tribes/building.h'
84--- src/logic/map_objects/tribes/building.h 2017-05-21 11:16:46 +0000
85+++ src/logic/map_objects/tribes/building.h 2017-06-17 05:42:52 +0000
86@@ -157,9 +157,8 @@
87 WorkareaInfo workarea_info_;
88
89 bool suitability(const Map&, const FCoords&) const;
90- const BuildingHints& hints() const {
91- return hints_;
92- }
93+ const BuildingHints& hints() const;
94+ void set_hints_trainingsites_max_percent(int percent);
95
96 protected:
97 virtual Building& create_object() const = 0;
98
99=== modified file 'src/logic/map_objects/tribes/tribe_descr.cc'
100--- src/logic/map_objects/tribes/tribe_descr.cc 2017-04-30 10:30:02 +0000
101+++ src/logic/map_objects/tribes/tribe_descr.cc 2017-06-17 05:42:52 +0000
102@@ -172,6 +172,11 @@
103 }
104 buildings_.push_back(index);
105
106+ // Register trainigsites
107+ if (get_building_descr(index)->type() == MapObjectType::TRAININGSITE) {
108+ trainingsites_.push_back(index);
109+ }
110+
111 // Register construction materials
112 for (const auto& build_cost : get_building_descr(index)->buildcost()) {
113 if (!is_construction_material(build_cost.first)) {
114@@ -188,6 +193,36 @@
115 }
116 }
117
118+ // Set default trainingsites proportions for AI. Make sure that we get a sum of ca. 100
119+ float trainingsites_without_percent = 0.f;
120+ int used_percent = 0;
121+ for (const DescriptionIndex& index : trainingsites_) {
122+ const BuildingDescr& descr = *tribes_.get_building_descr(index);
123+ if (descr.hints().trainingsites_max_percent() == 0) {
124+ ++trainingsites_without_percent;
125+ } else {
126+ used_percent += descr.hints().trainingsites_max_percent();
127+ }
128+ }
129+ if (trainingsites_without_percent > 0.f && used_percent > 100) {
130+ throw GameDataError("Predefined training sites proportions add up to > 100%%: %d", used_percent);
131+ } else if (trainingsites_without_percent > 0) {
132+ const int percent_to_use = std::ceil((100 - used_percent) / trainingsites_without_percent);
133+ if (percent_to_use < 1) {
134+ throw GameDataError("Training sites without predefined proportions add up to < 1%% and will never be built: %d", used_percent);
135+ }
136+ for (const DescriptionIndex& index : trainingsites_) {
137+ BuildingDescr* descr = tribes_.get_mutable_building_descr(index);
138+ if (descr->hints().trainingsites_max_percent() == 0) {
139+ descr->set_hints_trainingsites_max_percent(percent_to_use);
140+ used_percent += percent_to_use;
141+ }
142+ }
143+ }
144+ if (used_percent < 100) {
145+ throw GameDataError("Final training sites proportions add up to < 100%%: %d", used_percent);
146+ }
147+
148 // Special types
149 builder_ = add_special_worker(table.get_string("builder"));
150 carrier_ = add_special_worker(table.get_string("carrier"));
151@@ -333,6 +368,10 @@
152 assert(tribes_.building_exists(barracks_));
153 return barracks_;
154 }
155+
156+const std::vector<DescriptionIndex>& TribeDescr::trainingsites() const {
157+ return trainingsites_;
158+}
159 const std::vector<DescriptionIndex>& TribeDescr::worker_types_without_cost() const {
160 return worker_types_without_cost_;
161 }
162
163=== modified file 'src/logic/map_objects/tribes/tribe_descr.h'
164--- src/logic/map_objects/tribes/tribe_descr.h 2017-04-30 10:30:02 +0000
165+++ src/logic/map_objects/tribes/tribe_descr.h 2017-06-17 05:42:52 +0000
166@@ -105,6 +105,8 @@
167 DescriptionIndex headquarters() const;
168 DescriptionIndex port() const;
169 DescriptionIndex barracks() const;
170+
171+ const std::vector<DescriptionIndex>& trainingsites() const;
172 const std::vector<DescriptionIndex>& worker_types_without_cost() const;
173
174 uint32_t frontier_animation() const;
175@@ -186,6 +188,7 @@
176 DescriptionIndex port_; // The port that this tribe uses
177 DescriptionIndex barracks_; // The barracks to create soldiers
178 std::vector<DescriptionIndex> worker_types_without_cost_;
179+ std::vector<DescriptionIndex> trainingsites_;
180 // Order and positioning of wares in the warehouse display
181 WaresOrder wares_order_;
182 WaresOrderCoords wares_order_coords_;
183
184=== modified file 'src/logic/map_objects/tribes/tribes.cc'
185--- src/logic/map_objects/tribes/tribes.cc 2017-01-30 14:40:12 +0000
186+++ src/logic/map_objects/tribes/tribes.cc 2017-06-17 05:42:52 +0000
187@@ -284,6 +284,10 @@
188 return buildings_->get_mutable(buildingindex);
189 }
190
191+BuildingDescr* Tribes::get_mutable_building_descr(DescriptionIndex buildingindex) const {
192+ return buildings_->get_mutable(buildingindex);
193+}
194+
195 const ImmovableDescr* Tribes::get_immovable_descr(DescriptionIndex immovableindex) const {
196 return immovables_->get_mutable(immovableindex);
197 }
198
199=== modified file 'src/logic/map_objects/tribes/tribes.h'
200--- src/logic/map_objects/tribes/tribes.h 2017-01-30 14:40:12 +0000
201+++ src/logic/map_objects/tribes/tribes.h 2017-06-17 05:42:52 +0000
202@@ -131,6 +131,7 @@
203 DescriptionIndex worker_index(const std::string& workername) const;
204
205 const BuildingDescr* get_building_descr(DescriptionIndex building_index) const;
206+ BuildingDescr* get_mutable_building_descr(DescriptionIndex building_index) const;
207 const ImmovableDescr* get_immovable_descr(DescriptionIndex immovable_index) const;
208 const ShipDescr* get_ship_descr(DescriptionIndex ship_index) const;
209 const WareDescr* get_ware_descr(DescriptionIndex ware_index) const;

Subscribers

People subscribed via source and target branches

to status/vote changes: