widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #11214
[Merge] lp:~widelands-dev/widelands/ai_differentiation into lp:widelands
TiborB has proposed merging lp:~widelands-dev/widelands/ai_differentiation into lp:widelands.
Requested reviews:
Widelands Developers (widelands-dev)
Related bugs:
Bug #1516785 in widelands: "Redefine difficulty levels"
https://bugs.launchpad.net/widelands/+bug/1516785
For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/ai_differentiation/+merge/331085
- Redesigned limitation of buildings count for weaker player (It seems that it was broken)
- New set of WAI files
- Slight change in mutation logic
--
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/ai_differentiation into lp:widelands.
=== modified file 'data/ai/ai_input_1.wai'
--- data/ai/ai_input_1.wai 2017-09-08 04:37:41 +0000
+++ data/ai/ai_input_1.wai 2017-09-20 17:28:07 +0000
@@ -1,4 +1,4 @@
-# Automatically created by Widelands bzr8437[frisians] (Debug)
+# Automatically created by Widelands bzr8447[ai_adjust_hints] (Release)
# See wiki for more info: https://wl.widelands.org/wiki/Ai%20Training/
[magic_numbers]
@@ -25,7 +25,7 @@
20="58"
21="-28"
22="13"
-23="39"
+23="59"
24="0"
25="0"
26="45"
@@ -44,7 +44,7 @@
39="-72"
40="51"
41="51"
-42="13"
+42="49"
43="-49"
44="73"
45="-6"
@@ -54,7 +54,7 @@
49="-41"
50="-3"
51="-55"
-52="62"
+52="58"
53="0"
54="57"
55="-92"
@@ -142,7 +142,7 @@
137="-100"
138="36"
139="-4"
-140="-28"
+140="-9"
141="15"
142="-57"
143="-82"
@@ -321,7 +321,7 @@
0="483200277"
1="1310583807"
2="1146587310"
-3="3992184279"
+3="3992167895"
4="2392253055"
5="72410151"
6="3177317446"
@@ -334,7 +334,7 @@
13="4031844007"
14="466688301"
15="1174624614"
-16="2326435667"
+16="2326697811"
17="2785353768"
18="2923165204"
19="1657182988"
@@ -348,7 +348,7 @@
27="3069847931"
28="4080809651"
29="119008422"
-30="2921738017"
+30="2921738081"
31="3462444063"
32="4152203232"
33="2048168826"
@@ -366,7 +366,7 @@
45="1543642853"
46="1267826585"
47="2484812109"
-48="2823884087"
+48="2832272695"
49="3081242716"
50="2293521686"
51="727162548"
=== modified file 'data/ai/ai_input_2.wai'
--- data/ai/ai_input_2.wai 2017-09-08 04:37:41 +0000
+++ data/ai/ai_input_2.wai 2017-09-20 17:28:07 +0000
@@ -1,4 +1,4 @@
-# Automatically created by Widelands bzr8437[frisians] (Debug)
+# Automatically created by Widelands bzr8447[ai_adjust_hints] (Release)
# See wiki for more info: https://wl.widelands.org/wiki/Ai%20Training/
[magic_numbers]
@@ -39,12 +39,12 @@
34="-72"
35="52"
36="-68"
-37="-31"
+37="-47"
38="17"
39="-72"
40="51"
41="51"
-42="0"
+42="-26"
43="-49"
44="47"
45="0"
@@ -159,7 +159,7 @@
2="0"
3="47"
4="-93"
-5="-88"
+5="63"
6="-47"
7="86"
8="50"
@@ -182,7 +182,7 @@
25="31"
26="47"
27="-49"
-28="79"
+28="68"
29="0"
30="0"
31="25"
@@ -221,7 +221,7 @@
64="-14"
65="-36"
66="0"
-67="63"
+67="51"
68="0"
69="-26"
70="48"
@@ -324,7 +324,7 @@
3="3989038583"
4="2392240695"
5="609313893"
-6="3177319494"
+6="3177319490"
7="2470638061"
8="1737719069"
9="906272344"
@@ -358,8 +358,8 @@
37="2245976000"
38="1096631444"
39="3885459710"
-40="3462144474"
-41="996514907"
+40="3457950168"
+41="996531291"
42="2041263380"
43="3998980624"
44="3482467367"
@@ -371,10 +371,10 @@
50="2293521678"
51="727170724"
52="2337924218"
-53="2822240129"
+53="2822240001"
54="2099269402"
55="3081820126"
56="1364736179"
57="3215255873"
-58="4220516419"
+58="3146774595"
59="698271105"
=== modified file 'data/ai/ai_input_3.wai'
--- data/ai/ai_input_3.wai 2017-09-08 04:37:41 +0000
+++ data/ai/ai_input_3.wai 2017-09-20 17:28:07 +0000
@@ -1,4 +1,4 @@
-# Automatically created by Widelands bzr8437[frisians] (Debug)
+# Automatically created by Widelands bzr8447[ai_adjust_hints] (Release)
# See wiki for more info: https://wl.widelands.org/wiki/Ai%20Training/
[magic_numbers]
@@ -20,7 +20,7 @@
15="-2"
16="26"
17="46"
-18="-77"
+18="-46"
19="0"
20="58"
21="-28"
@@ -44,9 +44,9 @@
39="-72"
40="51"
41="51"
-42="49"
+42="11"
43="-49"
-44="47"
+44="73"
45="-3"
46="6"
47="3"
@@ -106,7 +106,7 @@
101="-42"
102="31"
103="-92"
-104="-62"
+104="-83"
105="75"
106="-35"
107="-63"
@@ -326,8 +326,8 @@
5="72410151"
6="3178103874"
7="2466439405"
-8="1670593821"
-9="906270296"
+8="1637039389"
+9="906272344"
10="1266807704"
11="2811238757"
12="1160748840"
@@ -336,16 +336,16 @@
15="1174624614"
16="2326435667"
17="2785353768"
-18="2923165204"
+18="2923034132"
19="1657183084"
20="127874232"
21="2840446882"
22="3269953620"
23="2809068809"
-24="3213948893"
+24="3197171673"
25="350248689"
26="403599210"
-27="4143589755"
+27="4076480891"
28="4078712499"
29="119008422"
30="2921738017"
@@ -364,12 +364,12 @@
43="3998980624"
44="3381672999"
45="1560420069"
-46="1267826589"
-47="2484803917"
+46="1272020893"
+47="2493192525"
48="2832796979"
49="3081242716"
50="2293521686"
-51="727162548"
+51="727162556"
52="2405032058"
53="2822242065"
54="1025593118"
@@ -377,4 +377,4 @@
56="1096297651"
57="3215223873"
58="3146774595"
-59="701417377"
+59="701482913"
=== modified file 'data/ai/ai_input_4.wai'
--- data/ai/ai_input_4.wai 2017-09-08 04:37:41 +0000
+++ data/ai/ai_input_4.wai 2017-09-20 17:28:07 +0000
@@ -1,4 +1,4 @@
-# Automatically created by Widelands bzr8437[frisians] (Debug)
+# Automatically created by Widelands bzr8447[ai_adjust_hints] (Release)
# See wiki for more info: https://wl.widelands.org/wiki/Ai%20Training/
[magic_numbers]
@@ -44,7 +44,7 @@
39="-72"
40="51"
41="51"
-42="22"
+42="33"
43="-49"
44="47"
45="-3"
@@ -193,7 +193,7 @@
36="-60"
37="-42"
38="-55"
-39="-34"
+39="-71"
40="-27"
41="-73"
42="-87"
@@ -324,21 +324,21 @@
3="3990087127"
4="2392236671"
5="72410151"
-6="3178103874"
+6="3178102850"
7="2466439405"
8="1670593821"
-9="906272344"
+9="907318872"
10="1266807704"
-11="2811238765"
+11="2811238757"
12="1160748840"
13="4031844007"
14="1540430125"
-15="1174657382"
+15="1174624614"
16="2326435667"
17="2785353768"
18="2923165204"
-19="1657182988"
-20="127743160"
+19="1657183076"
+20="127874232"
21="2840446882"
22="3269953620"
23="2809068809"
@@ -364,7 +364,7 @@
43="3998980624"
44="3381672999"
45="1560420069"
-46="1267826589"
+46="1269923741"
47="2484803917"
48="2832796979"
49="3081242716"
@@ -372,9 +372,9 @@
51="727162548"
52="2405032058"
53="2822242065"
-54="1026640670"
+54="1025593118"
55="859101088"
56="1096297651"
-57="3214961729"
+57="3215223873"
58="3146774595"
59="701417377"
=== modified file 'data/tribes/buildings/productionsites/atlanteans/blackroot_farm/init.lua'
--- data/tribes/buildings/productionsites/atlanteans/blackroot_farm/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/atlanteans/blackroot_farm/init.lua 2017-09-20 17:28:07 +0000
@@ -29,7 +29,9 @@
aihints = {
prohibited_till = 550,
- space_consumer = true
+ space_consumer = true,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 2
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/atlanteans/farm/init.lua'
--- data/tribes/buildings/productionsites/atlanteans/farm/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/atlanteans/farm/init.lua 2017-09-20 17:28:07 +0000
@@ -33,7 +33,9 @@
basic_amount = 1,
-- Farm needs spidercloth to be built and spidercloth needs corn for production
-- -> farm should be built ASAP!
- prohibited_till = 250
+ prohibited_till = 250,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 3
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/atlanteans/fishers_house/init.lua'
--- data/tribes/buildings/productionsites/atlanteans/fishers_house/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/atlanteans/fishers_house/init.lua 2017-09-20 17:28:07 +0000
@@ -27,7 +27,9 @@
aihints = {
needs_water = true,
basic_amount = 1,
- prohibited_till = 540
+ prohibited_till = 540,
+ very_weak_ai_limit = 2,
+ weak_ai_limit = 4
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/atlanteans/foresters_house/init.lua'
--- data/tribes/buildings/productionsites/atlanteans/foresters_house/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/atlanteans/foresters_house/init.lua 2017-09-20 17:28:07 +0000
@@ -28,7 +28,9 @@
aihints = {
space_consumer = true,
- supports_production_of = { "log" }
+ supports_production_of = { "log" },
+ very_weak_ai_limit = 2,
+ weak_ai_limit = 4
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/atlanteans/sawmill/init.lua'
--- data/tribes/buildings/productionsites/atlanteans/sawmill/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/atlanteans/sawmill/init.lua 2017-09-20 17:28:07 +0000
@@ -32,7 +32,7 @@
aihints = {
basic_amount = 2,
- very_weak_ai_limit = 1,
+ very_weak_ai_limit = 2,
weak_ai_limit = 2
},
=== modified file 'data/tribes/buildings/productionsites/barbarians/farm/init.lua'
--- data/tribes/buildings/productionsites/barbarians/farm/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/barbarians/farm/init.lua 2017-09-20 17:28:07 +0000
@@ -41,7 +41,9 @@
aihints = {
space_consumer = true,
- prohibited_till = 400
+ prohibited_till = 400,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 3
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/barbarians/fishers_hut/init.lua'
--- data/tribes/buildings/productionsites/barbarians/fishers_hut/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/barbarians/fishers_hut/init.lua 2017-09-20 17:28:07 +0000
@@ -33,7 +33,9 @@
aihints = {
needs_water = true,
- prohibited_till = 490
+ prohibited_till = 490,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 3
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/barbarians/hunters_hut/init.lua'
--- data/tribes/buildings/productionsites/barbarians/hunters_hut/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/barbarians/hunters_hut/init.lua 2017-09-20 17:28:07 +0000
@@ -35,7 +35,9 @@
aihints = {
prohibited_till = 480,
- basic_amount = 1
+ basic_amount = 1,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 2
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/barbarians/rangers_hut/init.lua'
--- data/tribes/buildings/productionsites/barbarians/rangers_hut/init.lua 2017-08-25 19:17:15 +0000
+++ data/tribes/buildings/productionsites/barbarians/rangers_hut/init.lua 2017-09-20 17:28:07 +0000
@@ -34,7 +34,9 @@
aihints = {
supports_production_of = { "log" },
space_consumer = true,
- basic_amount = 1
+ basic_amount = 1,
+ very_weak_ai_limit = 3,
+ weak_ai_limit = 5
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/empire/bakery/init.lua'
--- data/tribes/buildings/productionsites/empire/bakery/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/empire/bakery/init.lua 2017-09-20 17:28:07 +0000
@@ -37,7 +37,9 @@
aihints = {
prohibited_till = 550,
- basic_amount = 1
+ basic_amount = 1,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 2
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/empire/farm/init.lua'
--- data/tribes/buildings/productionsites/empire/farm/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/empire/farm/init.lua 2017-09-20 17:28:07 +0000
@@ -32,7 +32,9 @@
aihints = {
basic_amount = 1,
space_consumer = true,
- prohibited_till = 510
+ prohibited_till = 510,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 3
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/empire/foresters_house/init.lua'
--- data/tribes/buildings/productionsites/empire/foresters_house/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/empire/foresters_house/init.lua 2017-09-20 17:28:07 +0000
@@ -28,7 +28,9 @@
aihints = {
space_consumer = true,
- supports_production_of = { "log" }
+ supports_production_of = { "log" },
+ very_weak_ai_limit = 2,
+ weak_ai_limit = 4
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/empire/sawmill/init.lua'
--- data/tribes/buildings/productionsites/empire/sawmill/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/empire/sawmill/init.lua 2017-09-20 17:28:07 +0000
@@ -32,7 +32,7 @@
aihints = {
basic_amount = 2,
- very_weak_ai_limit = 1,
+ very_weak_ai_limit = 2,
weak_ai_limit = 2
},
=== modified file 'data/tribes/buildings/productionsites/empire/sheepfarm/init.lua'
--- data/tribes/buildings/productionsites/empire/sheepfarm/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/empire/sheepfarm/init.lua 2017-09-20 17:28:07 +0000
@@ -31,7 +31,9 @@
},
aihints = {
- prohibited_till = 380
+ prohibited_till = 380,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 3
},
working_positions = {
=== modified file 'data/tribes/buildings/productionsites/empire/vineyard/init.lua'
--- data/tribes/buildings/productionsites/empire/vineyard/init.lua 2017-09-03 07:59:51 +0000
+++ data/tribes/buildings/productionsites/empire/vineyard/init.lua 2017-09-20 17:28:07 +0000
@@ -30,7 +30,10 @@
aihints = {
space_consumer = true,
basic_amount = 1,
- prohibited_till = 490
+ prohibited_till = 490,
+ very_weak_ai_limit = 1,
+ weak_ai_limit = 3
+
},
working_positions = {
=== modified file 'src/ai/ai_help_structs.cc'
--- src/ai/ai_help_structs.cc 2017-08-20 17:45:42 +0000
+++ src/ai/ai_help_structs.cc 2017-09-20 17:28:07 +0000
@@ -609,8 +609,16 @@
// Mutating, but all done on persistent data
void ManagementData::mutate(const uint8_t pn) {
+ // Below numbers are used to dictate intensity of mutation
+ // Probability that a value will be mutated = 1 / probability
+ // (lesser number means higher probability and higher mutation)
int16_t probability =
shift_weight_value(get_military_number_at(kMutationRatePosition), false) + 101;
+ // Some of mutation will be agressive - over full range of values, the number below
+ // say how many (aproximately) they will be
+ uint16_t prefferred_numbers_count = 0;
+ // This is used to store status whether wild card was or was not used
+ bool wild_card = false;
// When doing training mutation probability is to be bigger than not in training mode
if (ai_training_mode_) {
@@ -620,29 +628,32 @@
if (probability < kLowerDefaultMutationLimit) {
probability = kLowerDefaultMutationLimit;
}
+ prefferred_numbers_count = 1;
} else {
probability = kNoAiTrainingMutation;
}
set_military_number_at(kMutationRatePosition, probability - 101);
-
// decreasing probability (or rather increasing probability of mutation) if weaker player
if (ai_type == Widelands::AiType::kWeak) {
- probability /= 2;
- log("%2d: Weak mode, increasing mutation probability to 1 / %d\n", pn, probability);
+ probability /= 15;
+ prefferred_numbers_count = 25;
} else if (ai_type == Widelands::AiType::kVeryWeak) {
- probability /= 4;
- log("%2d: Very weak mode, increasing mutation probability to 1 / %d\n", pn, probability);
+ probability /= 40;
+ prefferred_numbers_count = 50;
}
// Wildcard for ai trainingmode
- if (ai_training_mode_ && std::rand() % 8 == 0) {
+ if (ai_training_mode_ && std::rand() % 8 == 0 && ai_type == Widelands::AiType::kNormal) {
probability /= 3;
+ prefferred_numbers_count = 5;
+ wild_card = true;
}
assert(probability > 0 && probability <= 201);
- log("%2d: mutating DNA with probability 1 / %3d:\n", pn, probability);
+ log("%2d: mutating DNA with probability 1 / %3d, preffered numbers target %d%s:\n", pn,
+ probability, prefferred_numbers_count, (wild_card) ? ", wild card" : "");
if (probability < 201) {
@@ -650,8 +661,10 @@
{
// Preferred numbers are ones that will be mutated agressively in full range
// [-kWeightRange, kWeightRange]
- std::set<int32_t> preferred_numbers = {std::rand() % kMagicNumbersSize *
- pref_number_probability};
+ std::set<int32_t> preferred_numbers;
+ for (int i = 0; i < prefferred_numbers_count; i++) {
+ preferred_numbers.insert(std::rand() % pref_number_probability);
+ }
for (uint16_t i = 0; i < kMagicNumbersSize; i += 1) {
if (i == kMutationRatePosition) { // mutated above
@@ -676,8 +689,10 @@
// Modifying pool of neurons
{
// Neurons to be mutated more agressively
- std::set<int32_t> preferred_neurons = {std::rand() % kNeuronPoolSize *
- pref_number_probability};
+ std::set<int32_t> preferred_neurons;
+ for (int i = 0; i < prefferred_numbers_count; i++) {
+ preferred_neurons.insert(std::rand() % pref_number_probability);
+ }
for (auto& item : neuron_pool) {
const MutatingIntensity mutating_intensity =
@@ -707,8 +722,13 @@
// Modifying pool of f-neurons
{
// FNeurons to be mutated more agressively
- std::set<int32_t> preferred_f_neurons = {std::rand() % kFNeuronPoolSize *
- pref_number_probability};
+ std::set<int32_t> preferred_f_neurons;
+ // prefferred_numbers_count is multiplied by 3 because FNeuron store more than
+ // one value
+ for (int i = 0; i < 3 * prefferred_numbers_count; i++) {
+ preferred_f_neurons.insert(std::rand() % pref_number_probability);
+ }
+
for (auto& item : f_neuron_pool) {
uint8_t changed_bits = 0;
// is this a preferred neuron
=== modified file 'src/ai/ai_help_structs.h'
--- src/ai/ai_help_structs.h 2017-08-25 19:17:15 +0000
+++ src/ai/ai_help_structs.h 2017-09-20 17:28:07 +0000
@@ -124,7 +124,6 @@
constexpr int kFNeuronPoolSize = 60;
constexpr int kFNeuronBitSize = 32;
constexpr int kMutationRatePosition = 42;
-constexpr int16_t AiPrefNumberProbability = 5;
constexpr uint32_t kNever = std::numeric_limits<uint32_t>::max();
@@ -664,7 +663,6 @@
}
void set_ai_training_mode() {
ai_training_mode_ = true;
- pref_number_probability = AiPrefNumberProbability;
}
int16_t get_military_number_at(uint8_t);
@@ -687,7 +685,7 @@
uint16_t performance_change = 0U;
Widelands::AiType ai_type = Widelands::AiType::kNormal;
bool ai_training_mode_ = false;
- uint16_t pref_number_probability = 100;
+ uint16_t pref_number_probability = 200;
AiDnaHandler ai_dna_handler;
};
=== modified file 'src/ai/defaultai.cc'
--- src/ai/defaultai.cc 2017-08-26 11:08:00 +0000
+++ src/ai/defaultai.cc 2017-09-20 17:28:07 +0000
@@ -448,6 +448,14 @@
++conquered_wh;
}
};
+ if (!basic_economy_established) {
+ assert(!persistent_data->remaining_basic_buildings.empty());
+ assert(persistent_data->remaining_buildings_size > 0);
+ log("%2d: Basic economy not achieved, %lu building(s) missing, f.e.: %s\n",
+ player_number(), persistent_data->remaining_basic_buildings.size(),
+ get_building_observer(persistent_data->remaining_basic_buildings.begin()->first)
+ .name);
+ }
if (!enemy_warehouses.empty())
log("Conquered warehouses: %d / %lu\n", conquered_wh, enemy_warehouses.size());
management_data.review(
@@ -1007,7 +1015,7 @@
if (!basic_economy_established) {
log("%2d: Initializing in the basic economy mode, required buildings:\n", player_number());
for (auto bb : persistent_data->remaining_basic_buildings) {
- log(" %3d / %-25s- target %d\n", bb.first, get_building_observer(bb.first).name,
+ log(" %3d / %-28s- target %d\n", bb.first, get_building_observer(bb.first).name,
bb.second);
}
}
@@ -1045,6 +1053,9 @@
productionsites_ratio_ = management_data.get_military_number_at(86) / 10 + 12;
+ assert(persistent_data->remaining_basic_buildings.size() ==
+ persistent_data->remaining_buildings_size);
+
// Just to be initialized
soldier_status_ = SoldiersStatus::kEnough;
vacant_mil_positions_average_ = 0;
@@ -1989,6 +2000,9 @@
player_number(), persistent_data->remaining_basic_buildings.size(),
gamestring_with_leading_zeros(gametime));
basic_economy_established = true;
+ // Zeroing following to preserve consistency
+ persistent_data->remaining_buildings_size = 0;
+ persistent_data->remaining_basic_buildings.clear();
}
// *_military_scores are used as minimal score for a new military building
@@ -2352,14 +2366,13 @@
bo.primary_priority = 0;
}
- if (ai_training_mode_ && bo.type == BuildingObserver::Type::kProductionsite) {
+ const bool log_needed = (bo.new_building == BuildingNecessity::kAllowed ||
+ bo.new_building == BuildingNecessity::kForced ||
+ bo.new_building == BuildingNecessity::kNeeded);
+ if (ai_training_mode_ && bo.type == BuildingObserver::Type::kProductionsite &&
+ (gametime % 20 == 0 || log_needed)) {
log("%2d: %-35s(%2d now) %-11s: max prec: %2d/%2d, primary priority: %4d, overdue: %3d\n",
- player_number(), bo.name, bo.total_count(),
- (bo.new_building == BuildingNecessity::kAllowed ||
- bo.new_building == BuildingNecessity::kForced ||
- bo.new_building == BuildingNecessity::kNeeded) ?
- "needed" :
- "not needed",
+ player_number(), bo.name, bo.total_count(), (log_needed) ? "needed" : "not needed",
bo.max_needed_preciousness, bo.max_preciousness, bo.primary_priority,
bo.new_building_overdue);
}
@@ -3580,6 +3593,12 @@
// Get link to productionsite that should be checked
ProductionSiteObserver& site = productionsites.front();
+ // Make sure we are not above ai type limit
+ if (site.bo->total_count() > site.bo->cnt_limit_by_aimode) {
+ log("Too many %s: %d, ai limit: %d\n", site.bo->name, site.bo->total_count(), site.bo->cnt_limit_by_aimode);
+ }
+ assert(site.bo->total_count() <= site.bo->cnt_limit_by_aimode);
+
// first we werify if site is working yet (can be unoccupied since the start)
if (!site.site->can_start_working()) {
site.unoccupied_till = game().get_gametime();
@@ -4502,6 +4521,7 @@
// And finally the 'core' of this function
// First deal with construction of new sites
if (purpose == PerfEvaluation::kForConstruction) {
+ assert(bo.total_count() <= bo.cnt_limit_by_aimode);
if (bo.forced_after < gametime && bo.total_count() == 0 && !has_substitution_building) {
if (!bo.is(BuildingAttribute::kBarracks)) {
bo.max_needed_preciousness = bo.max_preciousness;
@@ -4579,7 +4599,7 @@
}
bo.cnt_target = 3;
// adjusting/decreasing based on cnt_limit_by_aimode
- bo.cnt_target = limit_cnt_target(bo.cnt_target, bo.cnt_limit_by_aimode);
+ bo.cnt_target = std::min(bo.cnt_target, bo.cnt_limit_by_aimode);
// for case the wood is not needed yet, to avoid inconsistency later on
bo.max_needed_preciousness = bo.max_preciousness;
@@ -4718,7 +4738,7 @@
bo.cnt_target = tmp_target;
// adjusting/decreasing based on cnt_limit_by_aimode
- bo.cnt_target = limit_cnt_target(bo.cnt_target, bo.cnt_limit_by_aimode);
+ bo.cnt_target = std::min(bo.cnt_target, bo.cnt_limit_by_aimode);
assert(bo.cnt_target > 1 && bo.cnt_target < 1000);
@@ -5418,6 +5438,8 @@
}
}
+ log("Sorry, cannot find building with id %d", static_cast<int32_t>(di));
+ // I noticed that exception test is being lost so will will print it into log as well
throw wexception("Sorry, cannot find building with id %d", static_cast<int32_t>(di));
}
@@ -6189,25 +6211,6 @@
}
}
-int32_t DefaultAI::limit_cnt_target(const int32_t current_cnt_target, const int32_t ai_limit) {
-
- if (ai_limit >= std::numeric_limits<int32_t>::max() - 1) {
- // = ai limit is not set
- return current_cnt_target;
- }
-
- int32_t new_target = current_cnt_target;
-
- if (current_cnt_target > (ai_limit + 1) / 2) {
- new_target = (ai_limit + 1) / 2;
- }
- assert(new_target * 2 >= ai_limit);
- assert(new_target > 0);
- assert(new_target <= ai_limit);
-
- return new_target;
-}
-
// Looking for situation where for a critical mine (iron, or marble) there is just one mine and it
// is
// unoccupied, probably we need to dismantle another one to release a miner
=== modified file 'src/ai/defaultai.h'
--- src/ai/defaultai.h 2017-08-18 10:23:45 +0000
+++ src/ai/defaultai.h 2017-09-20 17:28:07 +0000
@@ -328,7 +328,6 @@
uint32_t military_last_dismantle_;
uint32_t military_last_build_; // sometimes expansions just stops, this is time of last military
// building built
- int32_t limit_cnt_target(int32_t, int32_t);
uint32_t time_of_last_construction_;
uint32_t next_mine_construction_due_;
uint16_t fishers_count_;
=== modified file 'src/ai/defaultai_warfare.cc'
--- src/ai/defaultai_warfare.cc 2017-08-20 08:34:02 +0000
+++ src/ai/defaultai_warfare.cc 2017-09-20 17:28:07 +0000
@@ -567,6 +567,9 @@
TrainingSite* ts = trainingsites.front().site;
TrainingSiteObserver& tso = trainingsites.front();
+ // Make sure we are not above ai type limit
+ assert(tso.bo->total_count() <= tso.bo->cnt_limit_by_aimode);
+
const DescriptionIndex enhancement = ts->descr().enhancement();
if (enhancement != INVALID_INDEX && ts_without_trainers_ == 0 && mines_.size() > 3 &&
@@ -778,6 +781,7 @@
// Check next militarysite
bool changed = false;
MilitarySite* ms = militarysites.front().site;
+ MilitarySiteObserver& mso = militarysites.front();
// Don't do anything if last change took place lately
if (militarysites.front().last_change + 2 * 60 * 1000 > gametime) {
@@ -786,6 +790,9 @@
return false;
}
+ // Make sure we are not above ai type limit
+ assert(mso.bo->total_count() <= mso.bo->cnt_limit_by_aimode);
+
FCoords f = game().map().get_fcoords(ms->get_position());
BuildableField bf(f);
Follow ups