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

Proposed by TiborB
Status: Merged
Merged at revision: 8429
Proposed branch: lp:~widelands-dev/widelands/ai_trainingsites
Merge into: lp:widelands
Diff against target: 110 lines (+33/-12)
4 files modified
src/ai/ai_help_structs.cc (+19/-6)
src/ai/ai_help_structs.h (+8/-4)
src/ai/defaultai.cc (+4/-1)
src/ai/defaultai_warfare.cc (+2/-1)
To merge this branch: bzr merge lp:~widelands-dev/widelands/ai_trainingsites
Reviewer Review Type Date Requested Status
GunChleoc Approve
Review via email: mp+329274@code.launchpad.net

Commit message

Second and further traininsites of the type is built only if current one are busy enough...

Description of the change

Second and further traininsites of the type is now built only if existing ones are training soldiers (5 soldiers within last 20 minutes)

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

Continuous integration builds have changed state:

Travis build 2576. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/266123073.
Appveyor build 2398. State: success. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_ai_trainingsites-2398.

Revision history for this message
GunChleoc (gunchleoc) wrote :

LGTM :)

@bunnybot merge

review: Approve
Revision history for this message
bunnybot (widelandsofficial) wrote :

Continuous integration builds have changed state:

Travis build 2578. State: passed. Details: https://travis-ci.org/widelands/widelands/builds/266245691.
Appveyor build 2400. State: failed. Details: https://ci.appveyor.com/project/widelands-dev/widelands/build/_widelands_dev_widelands_ai_trainingsites-2400.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/ai/ai_help_structs.cc'
2--- src/ai/ai_help_structs.cc 2017-08-18 00:17:39 +0000
3+++ src/ai/ai_help_structs.cc 2017-08-19 10:01:16 +0000
4@@ -198,18 +198,31 @@
5 EventTimeQueue::EventTimeQueue() {
6 }
7
8-void EventTimeQueue::push(const uint32_t production_time) {
9- queue.push(production_time);
10+void EventTimeQueue::push(const uint32_t production_time, const uint32_t additional_id) {
11+ queue.push_front(std::make_pair(production_time, additional_id));
12 }
13
14-uint32_t EventTimeQueue::count(const uint32_t current_time) {
15+// Return count of entries in log (deque), if id is provided, it counts corresponding
16+// members. id here can be index of building, f.e. it count how many soldiers were
17+// trained in particular type of training site
18+uint32_t EventTimeQueue::count(const uint32_t current_time, const uint32_t additional_id) {
19 strip_old(current_time);
20- return queue.size();
21+ if (additional_id == std::numeric_limits<uint32_t>::max()) {
22+ return queue.size();
23+ } else {
24+ uint32_t cnt = 0;
25+ for (auto item : queue) {
26+ if (item.second == additional_id) {
27+ cnt += 1;
28+ }
29+ }
30+ return cnt;
31+ }
32 }
33
34 void EventTimeQueue::strip_old(const uint32_t current_time) {
35- while (!queue.empty() && queue.front() < current_time - duration_) {
36- queue.pop();
37+ while (!queue.empty() && queue.back().first < current_time - duration_) {
38+ queue.pop_back();
39 }
40 }
41
42
43=== modified file 'src/ai/ai_help_structs.h'
44--- src/ai/ai_help_structs.h 2017-08-18 00:17:39 +0000
45+++ src/ai/ai_help_structs.h 2017-08-19 10:01:16 +0000
46@@ -276,16 +276,20 @@
47 int32_t distance;
48 };
49
50+// FIFO like structure for pairs <gametime,id>, where id is optional
51+// used to count events within a time frame - duration_ (older ones are
52+// stripped with strip_old function)
53 struct EventTimeQueue {
54 EventTimeQueue();
55
56- void push(uint32_t);
57- uint32_t count(uint32_t);
58+ void push(uint32_t, uint32_t = std::numeric_limits<uint32_t>::max());
59+ uint32_t count(uint32_t, uint32_t = std::numeric_limits<uint32_t>::max());
60 void strip_old(uint32_t);
61
62 private:
63- uint32_t duration_ = 20 * 60 * 1000;
64- std::queue<uint32_t> queue;
65+ const uint32_t duration_ = 20 * 60 * 1000;
66+ // FIFO container where newest goes to the front
67+ std::deque<std::pair<uint32_t, uint32_t>> queue;
68 };
69
70 struct WalkableSpot {
71
72=== modified file 'src/ai/defaultai.cc'
73--- src/ai/defaultai.cc 2017-08-18 00:17:39 +0000
74+++ src/ai/defaultai.cc 2017-08-19 10:01:16 +0000
75@@ -489,7 +489,6 @@
76 const uint32_t gametime = game().get_gametime();
77
78 log("ComputerPlayer(%d): initializing as type %u%s\n", player_number(),
79- // NOCOM(#codereview): Please add blank spaces.
80 static_cast<unsigned int>(type_), (ai_training_mode_) ? ", in ai training mode" : "");
81 if (player_->team_number() > 0) {
82 log(" ... member of team %d\n", player_->team_number());
83@@ -4314,6 +4313,10 @@
84 return BuildingNecessity::kNotNeeded;
85 } else if (ts_without_trainers_ > 1) {
86 return BuildingNecessity::kNotNeeded;
87+ } else if (bo.total_count() > 0) {
88+ if (soldier_trained_log.count(gametime, bo.id) / bo.total_count() < 5) {
89+ return BuildingNecessity::kNotNeeded;
90+ }
91 }
92
93 // It seems we might need it after all
94
95=== modified file 'src/ai/defaultai_warfare.cc'
96--- src/ai/defaultai_warfare.cc 2017-08-09 18:45:15 +0000
97+++ src/ai/defaultai_warfare.cc 2017-08-19 10:01:16 +0000
98@@ -1239,10 +1239,11 @@
99 void DefaultAI::soldier_trained(const TrainingSite& site) {
100
101 const uint32_t gametime = game().get_gametime();
102- soldier_trained_log.push(gametime);
103+
104
105 for (TrainingSiteObserver& trainingsite_obs : trainingsites) {
106 if (trainingsite_obs.site == &site) {
107+ soldier_trained_log.push(gametime, trainingsite_obs.bo->id);
108 if (trainingsite_obs.site->soldier_control()->soldier_capacity() > 0) {
109 game().send_player_change_soldier_capacity(
110 *trainingsite_obs.site,

Subscribers

People subscribed via source and target branches

to status/vote changes: