widelands-dev team mailing list archive
-
widelands-dev team
-
Mailing list archive
-
Message #08639
[Merge] lp:~widelands-dev/widelands/prevent_ai_deadlocks into lp:widelands/build19
GunChleoc has proposed merging lp:~widelands-dev/widelands/prevent_ai_deadlocks into lp:widelands/build19.
Commit message:
Added function to starting conditions to make sure that the AI never runs out of basic building materials in order to prevent deadlocks.
Requested reviews:
Widelands Developers (widelands-dev)
For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/prevent_ai_deadlocks/+merge/309727
Deadlocks with log production have been reported on the forum by multiple users. Rather than messing with the AI code and potentially messing up something else, I have added a script to the starting conditions that will supply all wares that can cause deadlocks - same trick as used by Trading Outpost. The wares supplied are log and granite for all tribes, marble for Empire and spidercloth for Atlanteans. Let me know if I forgot any.
--
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/prevent_ai_deadlocks into lp:widelands/build19.
=== modified file 'data/tribes/scripting/starting_conditions/atlanteans/fortified_village.lua'
--- data/tribes/scripting/starting_conditions/atlanteans/fortified_village.lua 2016-03-30 07:23:59 +0000
+++ data/tribes/scripting/starting_conditions/atlanteans/fortified_village.lua 2016-11-01 07:24:37 +0000
@@ -3,6 +3,7 @@
-- =======================================================================
include "scripting/infrastructure.lua"
+include "tribes/scripting/starting_conditions/prevent_deadlocks.lua"
set_textdomain("tribes")
@@ -99,5 +100,10 @@
place_building_in_region(plr, "atlanteans_sawmill", sf:region(11), {
wares = { log = 1 }
})
+
+ if plr.ai ~= "" then
+ print("Player #" .. plr.number .. " is an AI")
+ prevent_deadlocks(plr)
+ end
end
}
=== modified file 'data/tribes/scripting/starting_conditions/atlanteans/headquarters.lua'
--- data/tribes/scripting/starting_conditions/atlanteans/headquarters.lua 2016-03-30 07:23:59 +0000
+++ data/tribes/scripting/starting_conditions/atlanteans/headquarters.lua 2016-11-01 07:24:37 +0000
@@ -3,6 +3,7 @@
-- =======================================================================
include "scripting/infrastructure.lua"
+include "tribes/scripting/starting_conditions/prevent_deadlocks.lua"
set_textdomain("tribes")
@@ -79,6 +80,11 @@
[{0,0,0,0}] = 35,
}
})
+
+ if plr.ai ~= "" then
+ print("Player #" .. plr.number .. " is an AI")
+ prevent_deadlocks(plr)
+ end
end
}
=== modified file 'data/tribes/scripting/starting_conditions/barbarians/fortified_village.lua'
--- data/tribes/scripting/starting_conditions/barbarians/fortified_village.lua 2016-03-30 07:23:59 +0000
+++ data/tribes/scripting/starting_conditions/barbarians/fortified_village.lua 2016-11-01 07:24:37 +0000
@@ -3,6 +3,7 @@
-- =======================================================================
include "scripting/infrastructure.lua"
+include "tribes/scripting/starting_conditions/prevent_deadlocks.lua"
set_textdomain("tribes")
@@ -92,5 +93,9 @@
place_building_in_region(plr, "barbarians_lime_kiln", sf:region(12), {
wares = { granite = 6, coal = 3 },
})
+ if plr.ai ~= "" then
+ print("Player #" .. plr.number .. " is an AI")
+ prevent_deadlocks(plr)
+ end
end
}
=== modified file 'data/tribes/scripting/starting_conditions/barbarians/headquarters.lua'
--- data/tribes/scripting/starting_conditions/barbarians/headquarters.lua 2016-03-30 07:23:59 +0000
+++ data/tribes/scripting/starting_conditions/barbarians/headquarters.lua 2016-11-01 07:24:37 +0000
@@ -3,6 +3,7 @@
-- =======================================================================
include "scripting/infrastructure.lua"
+include "tribes/scripting/starting_conditions/prevent_deadlocks.lua"
set_textdomain("tribes")
@@ -70,6 +71,10 @@
[{0,0,0,0}] = 45,
}
})
+ if player.ai ~= "" then
+ print("Player #" .. player.number .. " is an AI")
+ prevent_deadlocks(player)
+ end
end
}
=== modified file 'data/tribes/scripting/starting_conditions/empire/fortified_village.lua'
--- data/tribes/scripting/starting_conditions/empire/fortified_village.lua 2016-03-30 07:23:59 +0000
+++ data/tribes/scripting/starting_conditions/empire/fortified_village.lua 2016-11-01 07:24:37 +0000
@@ -3,6 +3,7 @@
-- =======================================================================
include "scripting/infrastructure.lua"
+include "tribes/scripting/starting_conditions/prevent_deadlocks.lua"
set_textdomain("tribes")
@@ -117,5 +118,9 @@
})
place_building_in_region(plr, "empire_stonemasons_house", sf:region(11))
+ if plr.ai ~= "" then
+ print("Player #" .. plr.number .. " is an AI")
+ prevent_deadlocks(plr)
+ end
end
}
=== modified file 'data/tribes/scripting/starting_conditions/empire/headquarters.lua'
--- data/tribes/scripting/starting_conditions/empire/headquarters.lua 2016-03-30 07:23:59 +0000
+++ data/tribes/scripting/starting_conditions/empire/headquarters.lua 2016-11-01 07:24:37 +0000
@@ -3,6 +3,7 @@
-- =======================================================================
include "scripting/infrastructure.lua"
+include "tribes/scripting/starting_conditions/prevent_deadlocks.lua"
set_textdomain("tribes")
@@ -77,5 +78,9 @@
[{0,0,0,0}] = 45,
}
})
+ if p.ai ~= "" then
+ print("Player #" .. p.number .. " is an AI")
+ prevent_deadlocks(p)
+ end
end
}
=== added file 'data/tribes/scripting/starting_conditions/prevent_deadlocks.lua'
--- data/tribes/scripting/starting_conditions/prevent_deadlocks.lua 1970-01-01 00:00:00 +0000
+++ data/tribes/scripting/starting_conditions/prevent_deadlocks.lua 2016-11-01 07:24:37 +0000
@@ -0,0 +1,55 @@
+include "scripting/infrastructure.lua"
+
+function prevent_deadlocks(player)
+ -- Get all warehouse types
+ local warehouse_types = {}
+ for i, building in ipairs(wl.Game():get_tribe_description(player.tribe_name).buildings) do
+ if (building.type_name == "warehouse") then
+ table.insert(warehouse_types, building.name)
+ end
+ end
+
+ -- index of a warehouse we will add to. Used to 'rotate' warehouses
+ local idx = 1
+
+ for i=1,100000 do
+ sleep(300000)
+
+ -- collect all ~warehouses and pick one to insert the wares
+ local warehouses = {}
+ for i, building_name in ipairs(warehouse_types) do
+ warehouses = array_combine(warehouses, player:get_buildings(building_name))
+ end
+
+ if #warehouses > 0 then
+ -- adding to a warehouse with index idx, if out of range, adding to wh 1
+ if idx > #warehouses then
+ idx = 1
+ end
+
+ local wh = warehouses[idx]
+ local added = 0
+
+ if wh:get_wares("log") < 1 then
+ wh:set_wares("log", wh:get_wares("log") + 20)
+ added = added + 1
+ end
+ if wh:get_wares("granite") < 1 then
+ wh:set_wares("granite", wh:get_wares("granite") + 10)
+ added = added + 1
+ end
+ if player.tribe_name == "empire" and wh:get_wares("marble") < 1 then
+ wh:set_wares("marble", wh:get_wares("marble") + 10)
+ added = added + 1
+ end
+ if player.tribe_name == "atlanteans" and wh:get_wares("spidercloth") < 1 then
+ wh:set_wares("spidercloth", wh:get_wares("spidercloth") + 10)
+ added = added + 1
+ end
+ if (added > 0) then
+ print (player.number..": "..added.." types of ware added to warehouse "..idx.." of "..#warehouses.." (to prevent deadlock)")
+ end
+ end
+ idx = idx + 1
+ end
+end
=== modified file 'src/scripting/lua_game.cc'
--- src/scripting/lua_game.cc 2016-08-07 20:39:44 +0000
+++ src/scripting/lua_game.cc 2016-11-01 07:24:37 +0000
@@ -103,11 +103,17 @@
{nullptr, nullptr},
};
const PropertyType<LuaPlayer> LuaPlayer::Properties[] = {
- PROP_RO(LuaPlayer, name), PROP_RO(LuaPlayer, allowed_buildings),
- PROP_RO(LuaPlayer, objectives), PROP_RO(LuaPlayer, defeated),
- PROP_RO(LuaPlayer, messages), PROP_RO(LuaPlayer, inbox),
- PROP_RW(LuaPlayer, team), PROP_RO(LuaPlayer, tribe),
- PROP_RW(LuaPlayer, see_all), {nullptr, nullptr, nullptr},
+ PROP_RO(LuaPlayer, ai),
+ PROP_RO(LuaPlayer, name),
+ PROP_RO(LuaPlayer, allowed_buildings),
+ PROP_RO(LuaPlayer, objectives),
+ PROP_RO(LuaPlayer, defeated),
+ PROP_RO(LuaPlayer, messages),
+ PROP_RO(LuaPlayer, inbox),
+ PROP_RW(LuaPlayer, team),
+ PROP_RO(LuaPlayer, tribe),
+ PROP_RW(LuaPlayer, see_all),
+ {nullptr, nullptr, nullptr},
};
/*
@@ -115,6 +121,19 @@
PROPERTIES
==========================================================
*/
+
+/* RST
+ .. attribute:: ai
+
+ (RO) The ai name of this Player if it is an ai, an empty string otherwise.
+*/
+int LuaPlayer::get_ai(lua_State* L) {
+ Game& game = get_game(L);
+ Player& p = get(L, game);
+ lua_pushstring(L, p.get_ai());
+ return 1;
+}
+
/* RST
.. attribute:: name
=== modified file 'src/scripting/lua_game.h'
--- src/scripting/lua_game.h 2016-08-04 15:49:05 +0000
+++ src/scripting/lua_game.h 2016-11-01 07:24:37 +0000
@@ -65,6 +65,7 @@
/*
* Properties
*/
+ int get_ai(lua_State* L);
int get_name(lua_State* L);
int get_allowed_buildings(lua_State* L);
int get_objectives(lua_State* L);
Follow ups