← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/bug-1074353 into lp:widelands

 

GunChleoc has proposed merging lp:~widelands-dev/widelands/bug-1074353 into lp:widelands.

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #964534 in widelands: "Building names in help headlines create duplicate translations of building names"
  https://bugs.launchpad.net/widelands/+bug/964534
  Bug #1005194 in widelands: "building help: clear indication of the meaning of working area"
  https://bugs.launchpad.net/widelands/+bug/1005194
  Bug #1027824 in widelands: "Mistakes in in-game help of Barbarian trainingscamp"
  https://bugs.launchpad.net/widelands/+bug/1027824
  Bug #1074353 in widelands: "Lua does not wrap Descr Classes which makes hard coding values in the help needed."
  https://bugs.launchpad.net/widelands/+bug/1074353

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-1074353/+merge/221095

This is in a mergeable state now, although more work needs to be done, as commented in the source code (comments are in lua_map.cc and format_help.lua).

Please leave this bug open: https://bugs.launchpad.net/widelands/+bug/1074353

The 3 other related bugs have been fixed and can be closed.
-- 
https://code.launchpad.net/~widelands-dev/widelands/bug-1074353/+merge/221095
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1074353 into lp:widelands.
=== modified file 'campaigns/atl01.wmf/scripting/init.lua'
--- campaigns/atl01.wmf/scripting/init.lua	2014-04-14 20:01:49 +0000
+++ campaigns/atl01.wmf/scripting/init.lua	2014-05-27 14:17:43 +0000
@@ -325,10 +325,10 @@
 
       -- Flags are not so interesting
       if f.immovable.type == "flag" and
-         (f.tln.immovable and f.tln.immovable.building_type) then
+         (f.tln.immovable and is_building(f.tln.immovable)) then
          f = f.tln
       end
-      if f.immovable.building_type then
+      if is_building(f.immovable) then
          send_building_lost_message(f)
       end
    end

=== modified file 'campaigns/tutorial01.wmf/scripting/init.lua'
--- campaigns/tutorial01.wmf/scripting/init.lua	2014-03-25 06:18:48 +0000
+++ campaigns/tutorial01.wmf/scripting/init.lua	2014-05-27 14:17:43 +0000
@@ -15,6 +15,7 @@
 set_textdomain("scenario_tutorial01.wmf")
 
 include "scripting/coroutine.lua"
+include "scripting/infrastructure.lua"
 include "scripting/ui.lua"
 include "scripting/table.lua"
 
@@ -310,7 +311,7 @@
    end
 
     -- buildings and constructionsite have a flag
-   if i.building_type or i.type == "constructionsite" then
+   if is_building(i) or i.type == "constructionsite" then
       registered_player_immovables[_fmt(i.fields[1].brn)] = true
    end
 end

=== modified file 'scripting/format_help.lua'
--- scripting/format_help.lua	2014-03-04 17:48:34 +0000
+++ scripting/format_help.lua	2014-05-27 14:17:43 +0000
@@ -1,30 +1,9 @@
--- RST
--- format_help.lua
--- ---------------
---
--- Functions used in the ingame help windows for formatting the text and pictures.
-
--- RST
--- .. function:: dependencies(images[, text = nil])
---
---    Creates a dependencies line of any length.
---
---    :arg images: images in the correct order from left to right as table (set in {}).
---    :arg text: comment of the image.
---    :returns: a row of pictures connected by arrows.
---
-function dependencies(images, text)
-	if not text then
-		text = ""
-	end
-
-	string = "image=" .. images[1]
-	for k,v in ipairs({table.unpack(images,2)}) do
-		string = string .. ";pics/arrow-right.png;" .. v
-	end
-
-	return rt(string, text)
-end
+-- TODO Textdomain?
+-- TODO: get images from C++, e.g. menu.png, resi_00.png for the small image, first idle picture for the big header images. soldiers, tools, wares etc. 
+
+--  =======================================================
+--  *************** Basic helper functions ****************
+--  =======================================================
 
 -- RST
 -- .. function:: image_line(image, count[, text = nil])
@@ -83,26 +62,726 @@
   }
 end
 
--- RST
--- .. help_building_line(tribe, material, material_str, number)
---
---    Creates an image_line with a number formatted string.
---
---    :arg tribe: name of tribe in the file system.
---    :arg material: name of material in the file system.
---    :arg material_str: containing number placeholder + name of material fetched with ngettext previously.
---    :arg number: the number used for ngettext in material_str
---    :returns: image_line.
---
-function help_building_line(tribe, material, material_str, number)
-	local image = "tribes/" .. tribe .. "/" .. material .. "/menu.png"
-	if number <=6 then
-		return image_line(image,number,p(material_str:format(number)))
-	else
-		if number <=12 then
-			return image_line(image,6,p(material_str:format(number))) .. image_line(image, number-6)
-		else
-			return image_line(image,6,p(material_str:format(number))) .. image_line(image, 6) .. image_line(image, number-12)
-		end
-	end
+--  =======================================================
+--  ********** Helper functions for dependencies **********
+--  =======================================================
+
+-- RST
+-- format_help.lua
+-- ---------------
+
+-- Functions used in the ingame help windows for formatting the text and pictures.
+
+-- RST
+-- .. function:: dependencies_basic(images[, text = nil])
+--
+--    Creates a dependencies line of any length.
+--
+--    :arg images: images in the correct order from left to right as table (set in {}).
+--    :arg text: comment of the image.
+--    :returns: a row of pictures connected by arrows.
+--
+function dependencies_basic(images, text)
+	if not text then
+		text = ""
+	end
+
+	string = "image=" .. images[1]
+	for k,v in ipairs({table.unpack(images,2)}) do
+		string = string .. ";pics/arrow-right.png;" .. v
+	end
+
+	return rt(string, text)
+end
+
+
+-- RST
+-- .. function:: dependencies(tribename, items[, text = nil])
+--
+--    Creates a dependencies line of any length.
+--
+--    :arg tribename: name of the tribe.
+--    :arg items: ware and/or building names in the correct order from left to right as table (set in {}).
+--    :arg text: comment of the image.
+--    :returns: a row of pictures connected by arrows.
+--
+function dependencies(tribename, items, text)
+	if not text then
+		text = ""
+	end
+	string = "image=tribes/" .. tribename .. "/" .. items[1]  .. "/menu.png"
+	for k,v in ipairs({table.unpack(items,2)}) do
+		string = string .. ";pics/arrow-right.png;" ..  "tribes/" .. tribename .. "/" .. v  .. "/menu.png"
+	end
+	return rt(string, p(text))
+end
+
+
+-- RST
+-- .. function:: dependencies_resi(tribename, items[, text = nil])
+--
+--    Creates a dependencies line of any length for resources (that don't have menu.png files).
+--
+--    :arg tribename: name of the tribe.
+--    :arg items: resource names in the correct order from left to right as table (set in {}).
+--    :arg text: comment of the image.
+--    :returns: a row of pictures connected by arrows.
+--
+function dependencies_resi(tribename, items, text)
+	if not text then
+		text = ""
+	end
+	string = "image=tribes/" .. tribename .. "/" .. items[1]  .. "/resi_00.png"
+	for k,v in ipairs({table.unpack(items,2)}) do
+		string = string .. ";pics/arrow-right.png;" ..  "tribes/" .. tribename .. "/" .. v  .. "/menu.png"
+	end
+	return rt(string, p(text))
+end
+
+
+--  =======================================================
+--  *************** Dependencies functions ****************
+--  =======================================================
+
+-- RST
+-- .. function:: building_help_depencencies_ware(tribename, items, ware)
+--
+--    Formats a chain of ware dependencies for the help window
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg items: an array with ware and building names,
+--                            e.g. {"constructionsite", "trunk"}
+--    :arg warename: the internal name of the ware to use as a title.
+--    :returns: an rt string with images describing a chain of ware/building dependencies
+--
+function building_help_dependencies_ware(tribename, items, warename)
+	local ware_descr = wl.Game():get_ware_description(tribename, warename)
+	return dependencies(tribename, items, ware_descr.descname)
+end
+
+
+-- RST
+-- .. function:: building_help_depencencies_building(tribename, items, building)
+--
+--    Formats a chain of ware dependencies for the help window
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg items: an array with ware and building names,
+--                            e.g. {"constructionsite", "trunk"}
+--    :arg buildingname: the internal name of the building to use as a title.
+--    :returns: an rt string with images describing a chain of ware/building dependencies
+--
+function building_help_dependencies_building(tribename, items, buildingname)
+	local building_descr = wl.Game():get_building_description(tribename,buildingname)
+	return dependencies(tribename, items, building_descr.descname)
+end
+
+
+
+-- RST
+-- .. function:: building_help_depencencies_building(tribename, items, building)
+--
+--    Formats a chain of ware dependencies for the help window
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg items: an array with ware and building names,
+--                            e.g. {"constructionsite", "trunk"}
+--    :arg warename: the internal name of the ware to use in the title.
+--    :arg building: the internal name of the building to use in the title.
+--    :returns: an rt string with images describing a chain of ware/building dependencies
+--
+function building_help_dependencies_ware_building(tribename, items, warename, buildingname)
+	local building_descr = wl.Game():get_building_description(tribename,buildingname)
+	local ware_descr = wl.Game():get_ware_description(tribename, warename)
+	return dependencies(tribename, items, _"%1$s from: %2$s":bformat(ware_descr.descname, building_descr.descname))
+end
+
+
+-- RST
+-- .. function:: building_help_depencencies_ware(tribename, items, ware)
+--
+--    Formats a chain of ware dependencies for the help window. First item is a mining resource.
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg items: an array with ware and building names,
+--                            e.g. {"constructionsite", "trunk"}
+--    :arg warename: the internal name of the ware to use in the title.
+--    :returns: an rt string with images describing a chain of ware/building dependencies
+--
+function building_help_dependencies_resi(tribename, items, warename)
+	local ware_descr = wl.Game():get_ware_description(tribename, warename)
+	return dependencies_resi(tribename, items, ware_descr.descname)
+end
+
+-- RST
+-- .. function:: dependencies_training(tribename, building_description, interim1, interim2)
+--
+--    Creates a dependencies line for soldiers in a training site.
+--
+--    :arg tribename: name of the tribe.
+--    :arg building_description: the trainingsite's building description from C++
+--    :arg interim1: the soldier level trained to in the first line, e.g. "untrained+evade".
+--    :arg interim1: the soldier level trained from in the second line, e.g. "fulltrained-evade".
+--    :returns: a row of pictures connected by arrows.
+--
+function dependencies_training(tribename, building_description, interim1, interim2)
+	return
+		rt(h2(_"Dependencies")) .. rt(h3(_"Soldiers:")) ..
+		dependencies_basic({
+			"tribes/" .. tribename .. "/soldier/untrained.png",
+			"tribes/" .. tribename .. "/" .. building_description.name  .. "/menu.png",
+			"tribes/" .. tribename .. "/soldier/" .. interim1 .. ".png"}) ..
+		dependencies_basic({
+			"tribes/" .. tribename .. "/soldier/" .. interim2 .. ".png",
+			"tribes/" .. tribename .. "/" .. building_description.name  .. "/menu.png",
+			"tribes/" .. tribename .. "/soldier/fulltrained.png"})
+end
+
+
+-- RST
+-- .. function:: dependencies_training_food
+--
+--    Creates dependencies lines for food in training sites.
+--
+--    :arg tribename: name of the tribe.
+--    :arg foods: an array of arrays with food items. Outer array has "and" logic and
+--	          will appear from back to front, inner arrays have "or" logic
+--    :returns: a list of food descriptions with images
+--
+function dependencies_training_food(tribename, foods)
+	local result = ""
+	for countlist, foodlist in pairs(foods) do
+		local images = ""
+		local text = ""
+		for countfood, food in pairs(foodlist) do
+			local ware_descr = wl.Game():get_ware_description(tribename, food)
+			if(countfood > 1) then
+				images = images .. ";"
+				text = _"%1$s or %2$s":bformat(text, ware_descr.descname)
+			else
+				text = ware_descr.descname
+			end
+			images = images .. "tribes/" .. tribename .. "/" .. ware_descr.name .. "/menu.png"
+		end
+		if(countlist > 1) then
+			text = _"%s and":bformat(text)
+		end
+		result = image_line(images, 1, p(text)) .. result
+	end
+	return result
+end
+
+
+-- RST
+-- .. function:: dependencies_training_weapons(tribename, building_description, and_or, weapons, manufacturer)
+--
+--    Creates a dependencies line for any number of weapons.
+--
+--    :arg tribename: name of the tribe.
+--    :arg building_description: the trainingsite's building description from C++
+--    :arg and_or: if this is "and" or "or", adds these keyword at the beginning of the equipment string
+--    :arg weapons: an array of weapon names
+--    :arg manufacturer: the name of the building manufacturing the weapons
+--    :returns: a list weapons images with the producing and receiving building
+--
+function dependencies_training_weapons(tribename, building_description, and_or, weapons, manufacturer)
+	local manufacturer_descr = wl.Game():get_building_description(tribename, manufacturer)
+	local weaponsstring = ""
+	for count, weapon in pairs(weapons) do
+		if(count > 1) then
+			weaponsstring = weaponsstring .. ";"
+		end
+		weaponsstring = weaponsstring .. "tribes/" .. tribename .. "/" .. weapon .. "/menu.png"
+	end
+	-- TRANSLATORS: This is a headline, you can see it in the building help for trainingsites, in the dependencies section
+	local equipmentstring = _"Equipment from"
+	-- TRANSLATORS: This is a headline, you can see it in the building help for trainingsites, in the dependencies section
+	if (and_or == "and" ) then equipmentstring = _"and equipment from"
+	-- TRANSLATORS: This is a headline, you can see it in the building help for trainingsites, in the dependencies section
+	elseif (and_or == "or" ) then equipmentstring = _"or equipment from" end
+	return rt(p(equipmentstring)) ..
+		dependencies_basic({
+			"tribes/" .. tribename .. "/" .. manufacturer_descr.name  .. "/menu.png",
+			weaponsstring,
+		}, rt(p(manufacturer_descr.descname)))
+end
+
+
+--  =======================================================
+--  ************* Main buildinghelp functions *************
+--  =======================================================
+
+-- RST
+-- .. function building_help_general_string(tribename, building_description, resourcename, purpose[, note])
+--
+--    Creates the string for the general section in building help
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg building_description: The building's building description from C++
+--    :arg resourcename: The name of a representative resource that this building produces
+--    :arg purpose: A string explaining the purpose of the building
+--    :arg purpose: A string with a note about the building. Drop this argument if you don't want to add a note.
+--    :returns: rt of the formatted text
+--
+function building_help_general_string(tribename, building_description, resourcename, purpose, note)
+	-- Need to get the building description again to make sure we have the correct type, e.g. "productionsite"
+	local building_description = wl.Game():get_building_description(tribename, building_description.name)
+	local result = rt(h2(_"General"))
+	result = result .. rt(h3(_"Purpose:")) ..
+		image_line("tribes/" .. tribename .. "/" .. resourcename  .. "/menu.png", 1, p(purpose))
+	if (note) then	result = result .. rt(h3(_"Note:")) .. rt(p(note)) end
+
+	if(building_description.type == "productionsite") then
+		if(building_description.workarea_radius and building_description.workarea_radius > 0) then
+			result = result .. text_line(_"Working radius:", building_description.workarea_radius)
+		end
+
+	elseif(building_description.type == "warehouse") then
+		result = result .. rt(h3(_"Healing:")
+			.. p(_"Garrisoned soldiers heal %s per second":bformat(building_description.heal_per_second)))
+		result = result .. text_line(_"Conquer range:", building_description.conquers)
+
+	elseif(building_description.type == "militarysite") then
+		result = result .. rt(h3(_"Healing:")
+			.. p(_"Garrisoned soldiers heal %s per second":bformat(building_description.heal_per_second)))
+		result = result .. text_line(_"Capacity:", building_description.max_number_of_soldiers)
+		result = result .. text_line(_"Conquer range:", building_description.conquers)
+
+	elseif(building_description.type == "trainingsite") then
+		result = result .. rt(h3(_"Training:"))
+		if(building_description.max_attack >= 0) then
+			-- TRANSLATORS: %1$s = Health, Evade, Attack or Defense. %2$s and %3$s are numbers.
+			result = result .. rt(p(_"Trains ‘%1$s’ from %2$s up to %3$s":
+				bformat(_"Attack", building_description.min_attack, building_description.max_attack+1)))
+		end
+		if(building_description.max_defense >= 0) then
+			result = result .. rt(p( _"Trains ‘%1$s’ from %2$s up to %3$s":
+				bformat(_"Defense", building_description.min_defense, building_description.max_defense+1)))
+		end
+		if(building_description.max_evade >= 0) then
+			result = result .. rt(p( _"Trains ‘%1$s’ from %2$s up to %3$s":
+				bformat(_"Evade", building_description.min_evade, building_description.max_evade+1)))
+		end
+		if(building_description.max_hp >= 0) then
+			result = result .. rt(p(_"Trains ‘%1$s’ from %2$s up to %3$s":
+				bformat(_"Health", building_description.min_hp, building_description.max_hp+1)))
+		end
+		result = result .. text_line(_"Capacity:", building_description.max_number_of_soldiers)
+	end
+	result = result .. text_line(_"Vision range:", building_description.vision_range)
+	return result
+end
+
+
+-- RST
+-- .. function building_help_lore_string(tribename, building_description, flavourtext[, author])
+--
+--    Displays the building's main image with a flavour text.
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg building_description: The building description we get from C++
+--    :arg flavourtext: e.g. "Catches fish in the sea".
+--    :arg author: e.g. "Krumta, carpenter of Chat'Karuth". This paramater is optional.
+--    :returns: rt of the image with the text
+--
+function building_help_lore_string(tribename, building_description, flavourtext, author)
+	local result = rt(h2(_"Lore")) ..
+		rt("image=tribes/" .. tribename .. "/" .. building_description.name  .. "/" .. building_description.name .. "_i_00.png", p(flavourtext))
+		if author then
+			result = result .. rt("text-align=right",p("font-size=10 font-style=italic", author))
+		end
+	return result
+end
+
+
+-- RST
+-- .. function:: building_help_outputs(tribename, building_description[, add_constructionsite])
+--
+--    The input and output wares of a productionsite
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg building_description: The building description we get from C++
+--    :arg add_constructionsite: True if this is building supplies its wares to constructionsites.
+--    :returns: an rt string with images describing a chain of ware/building dependencies
+--
+function building_help_dependencies_production(tribename, building_description, add_constructionsite)
+	local building_description = wl.Game():get_building_description(tribename, building_description.name)
+	local result = ""
+	local hasinput = false
+	for i, warename in ipairs(building_description.inputs) do
+	 hasinput = true
+		local ware_description = wl.Game():get_ware_description(tribename, warename)
+		for j, producer in ipairs(ware_description.producers) do
+			result = result .. building_help_dependencies_ware_building(
+				tribename, {producer.name, warename}, warename, producer.name
+			)
+		end
+	end
+	if (hasinput) then
+		result =  rt(h3(_"Incoming:")) .. result
+	end
+
+	if ((not hasinput) and building_description.output_ware_types[1]) then
+		result = result .. rt(h3(_"Collects:"))
+		for i, ware in ipairs(building_description.output_ware_types) do
+			result = result ..
+				building_help_dependencies_ware(tribename, {building_description.name, ware}, ware)
+		end
+
+	elseif (building_description.ismine) then
+		-- TRANSLATORS: This is a verb (The miner mines)
+		result = result .. rt(h3(_"Mines:"))
+		for i, ware in ipairs(building_description.output_ware_types) do
+			-- Need to hack this because of inconsistency in the naming system.
+			-- Can't rename the files, because geologist won't work.
+			local resi_name = ware
+			if(resi_name == "ironore") then resi_name = "iron"
+			elseif(resi_name == "raw_stone") then resi_name = "granit"
+			elseif(resi_name == "stone") then resi_name = "granit"
+			elseif(resi_name == "diamond") then resi_name = "granit"
+			elseif(resi_name == "quartz") then resi_name = "granit"
+			elseif(resi_name == "marble") then resi_name = "granit"
+			elseif(resi_name == "goldore") then resi_name = "gold" end
+			result = result ..
+				building_help_dependencies_resi(tribename, {"resi_"..resi_name.."2", building_description.name, ware}, ware)
+		end
+
+	else
+		for i, ware in ipairs(building_description.output_ware_types) do
+			if(i == 1) then result = result .. rt(h3(_"Produces:")) end
+			result = result ..
+				building_help_dependencies_ware(tribename, {building_description.name, ware}, ware)
+		end
+	end
+
+	local outgoing = ""
+	for i, ware in ipairs(building_description.output_ware_types) do
+		local ware_description = wl.Game():get_ware_description(tribename, ware)
+
+		-- constructionsite isn't listed with the consumers, and needs special treatment because it isn't a building
+		if (add_constructionsite) then
+			outgoing = outgoing .. dependencies(tribename, {ware, "constructionsite"}, _"Construction Site")
+		end
+
+		for j, consumer in ipairs(ware_description.consumers) do
+			outgoing = outgoing .. building_help_dependencies_building(
+				tribename, {ware, consumer.name}, consumer.name
+			)
+		end
+
+		-- soldiers aren't listed with the consumers
+		local soldier  = wl.Game():get_worker_description(tribename, "soldier")
+		local addsoldier = false
+		for j, buildcost in ipairs(soldier.buildcost) do
+			if(buildcost == ware) then
+			outgoing = outgoing .. dependencies(tribename, {ware, "headquarters", soldier.name}, soldier.descname)
+			end
+		end
+	end
+	if (outgoing ~= "") then result = result .. rt(h3(_"Outgoing:")) .. outgoing end
+
+	if (result == "") then result = rt(p(_"None")) end
+	return rt(h2(_"Dependencies")) .. result
+end
+
+
+-- Helper function for building_help_building_section
+function building_help_building_line(tribename, ware, amount)
+	local ware_descr = wl.Game():get_ware_description(tribename, ware)
+	amount = tonumber(amount)
+	local image = "tribes/" .. tribename .. "/" .. ware  .. "/menu.png"
+	local result = ""
+	local imgperline = 6
+	local temp_amount = amount
+
+	while (temp_amount > imgperline) do
+		result = result .. image_line(image, imgperline)
+		temp_amount = temp_amount - imgperline
+	end
+	result = image_line(image, temp_amount, p(_"%1$dx %2$s":bformat(amount, ware_descr.descname))) .. result
+	return result
+
+end
+
+-- RST
+--
+-- .. function:: building_help_building_section(tribename, building_description[, enhanced_from, former_buildings])
+--
+--    Formats the "Building" section in the building help: Enhancing info, costs and space required
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg building_description: The building description we get from C++
+--    :arg enhanced_from: The building name that this building is usually enhanced from.
+--                        Leave blank if this is a basic building.
+--    :former_buildings:  A table of building names representing the chain of buildings that this
+--                        building was enhanced from. This is used to calculate cumulative building 
+--                        and dismantle costs.
+--    :returns: an rt string describing the building section
+--
+function building_help_building_section(tribename, building_description, enhanced_from, former_buildings)
+
+	local result = rt(h2(_"Building"))
+
+	-- Space required
+	if (building_description.ismine) then
+		result = result .. text_line(_"Space required:",_"Mine plot","pics/mine.png")
+	elseif (building_description.isport) then
+		result = result .. text_line(_"Space required:",_"Port plot","pics/port.png")
+	else
+		if (building_description.size == 1) then
+			result = result .. text_line(_"Space required:",_"Small plot","pics/small.png")
+		elseif (building_description.size == 2) then
+			result = result .. text_line(_"Space required:",_"Medium plot","pics/medium.png")
+		elseif (building_description.size == 3) then
+			result = result .. text_line(_"Space required:",_"Big plot","pics/big.png")
+		else
+			result = result .. p(_"Space required:" .. _"Unknown")
+		end
+	end
+
+	-- Enhanced from
+	if (building_description.buildable or building_description.enhanced) then
+
+		if (building_description.buildable and building_description.enhanced) then
+			result = result .. text_line(_"Note:",
+				_"This building can either be built directly or obtained by enhancing another building.")
+		end
+
+		if (building_description.buildable) then
+			-- Build cost
+			if (building_description.buildable and building_description.enhanced) then
+				result = result .. rt(h3(_"Direct build cost:"))
+			else
+				result = result .. rt(h3(_"Build cost:"))
+			end
+			for ware, amount in pairs(building_description.build_cost) do
+				result = result .. building_help_building_line(tribename, ware, amount)
+			end
+		end
+		if (building_description.enhanced) then
+			local former_building = nil
+			if (enhanced_from) then
+				former_building = wl.Game():get_building_description(tribename, enhanced_from)
+				if (building_description.buildable) then
+					result = result .. text_line(_"Or enhanced from:", former_building.descname)
+				else
+					result = result .. text_line(_"Enhanced from:", former_building.descname)
+				end
+			else
+				result = result .. text_line(_"Enhanced from:", _"Unknown")
+			end
+
+			for ware, amount in pairs(building_description.enhancement_cost) do
+				result = result .. building_help_building_line(tribename, ware, amount)
+			end
+
+			-- Cumulative cost
+			result = result .. rt(h3(_"Cumulative cost:"))
+			local warescost = {}
+			for ware, amount in pairs(building_description.enhancement_cost) do
+				if (warescost[ware]) then
+					warescost[ware] = warescost[ware] + amount
+				else
+					warescost[ware] = amount
+				end
+			end
+
+			for index, former in pairs(former_buildings) do
+				former_building = wl.Game():get_building_description(tribename, former)
+				if (former_building.buildable) then
+					for ware, amount in pairs(former_building.build_cost) do
+						if (warescost[ware]) then
+							warescost[ware] = warescost[ware] + amount
+						else
+							warescost[ware] = amount
+						end
+					end
+				elseif (former_building.enhanced) then
+					for ware, amount in pairs(former_building.enhancement_cost) do
+						if (warescost[ware]) then
+							warescost[ware] = warescost[ware] + amount
+						else
+							warescost[ware] = amount
+						end
+					end
+				end
+			end
+			if (warescost ~= {}) then
+				for ware, amount in pairs(warescost) do
+					result = result .. building_help_building_line(tribename, ware, amount)
+				end
+			else
+				result = result .. rt(p(_"Unknown"))
+			end
+
+			-- Dismantle yields
+			if (building_description.buildable) then
+				result = result .. rt(h3(_"If built directly, dismantle yields:"))
+				for ware, amount in pairs(building_description.returned_wares) do
+					result = result .. building_help_building_line(tribename, ware, amount)
+				end
+				result = result .. rt(h3(_"If enhanced, dismantle yields:"))
+			else
+				result = result .. rt(h3(_"Dismantle yields:"))
+			end
+			local warescost = {}
+			for ware, amount in pairs(building_description.returned_wares_enhanced) do
+				if (warescost[ware]) then
+					warescost[ware] = warescost[ware] + amount
+				else
+					warescost[ware] = amount
+				end
+			end
+			for index, former in pairs(former_buildings) do
+				former_building = wl.Game():get_building_description(tribename, former)
+				if (former_building.buildable) then
+					for ware, amount in pairs(former_building.returned_wares) do
+						if (warescost[ware]) then
+							warescost[ware] = warescost[ware] + amount
+						else
+							warescost[ware] = amount
+						end
+					end
+				elseif (former_building.enhanced) then
+					for ware, amount in pairs(former_building.returned_wares_enhanced) do
+						if (warescost[ware]) then
+							warescost[ware] = warescost[ware] + amount
+						else
+							warescost[ware] = amount
+						end
+					end
+				end
+			end
+			if (warescost ~= {}) then
+				for ware, amount in pairs(warescost) do
+					result = result .. building_help_building_line(tribename, ware, amount)
+				end
+			else
+				result = result .. rt(p(_"Unknown"))
+			end
+		-- Buildable
+		else
+			-- Dismantle yields
+			result = result .. rt(h3(_"Dismantle yields:"))
+			for ware, amount in pairs(building_description.returned_wares) do
+				result = result .. building_help_building_line(tribename, ware, amount)
+			end
+		end
+
+		-- Can be enhanced to
+		if (building_description.enhancements[1]) then
+			for i, building in ipairs(building_description.enhancements) do
+				result = result .. text_line(_"Can be enhanced to:", building_description.enhancements[i].descname)
+				for ware, amount in pairs(building_description.enhancements[i].enhancement_cost) do
+					result = result .. building_help_building_line(tribename, ware, amount)
+				end
+			end
+		end
+	end
+	return result
+end
+
+
+
+-- RST
+-- .. function building_help_crew_string(tribename, building_description)
+--
+--    Displays the building's workers with an image and the tool they use
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg building_description: the building_description from C++.
+--    :returns: Workers/Crew section of the help file
+--
+function building_help_crew_string(tribename, building_description)
+	-- Need to get the building description again to make sure we have the correct type, e.g. "productionsite"
+	local building_description = wl.Game():get_building_description(tribename, building_description.name)
+	local result = ""
+
+	if(building_description.type == "productionsite" or building_description.type == "trainingsite") then
+
+		result = result .. rt(h2(_"Workers")) .. rt(h3(_"Crew required:"))
+
+		local worker_descr = nil
+		local becomes_descr = nil
+		local number_of_workers = 0
+		local toolname = nil
+
+		for i, worker in ipairs(building_description.working_positions) do
+			worker_descr = wl.Game():get_worker_description(tribename, worker)
+
+			-- get the tool for the workers. This assumes that each building only uses 1 tool
+			if(worker_descr.buildable) then
+				for j, buildcost in ipairs(worker_descr.buildcost) do
+					if( not (buildcost == "carrier" or buildcost == "none" or buildcost == nil)) then
+						toolname = buildcost
+					end
+				end
+			end
+
+			becomes_descr = worker_descr.becomes
+			number_of_workers = number_of_workers + 1
+
+			if(becomes_descr) then
+				result = result .. image_line("tribes/" .. tribename .. "/" .. worker  .. "/menu.png", 1,
+					p(_"%s or better":bformat(worker_descr.descname)))
+			else
+				result = result .. image_line("tribes/" .. tribename .. "/" .. worker  .. "/menu.png", 1,
+					p(worker_descr.descname))
+			end
+		end
+
+		if(toolname) then result = result .. building_help_tool_string(tribename, toolname, number_of_workers) end
+
+		if(becomes_descr) then
+
+			result = result .. rt(h3(_"Experience levels:"))
+			local exp_string = _"%s to %s (%s EP)":format(
+					worker_descr.descname,
+					becomes_descr.descname,
+					worker_descr.level_experience
+				)
+
+			worker_descr = becomes_descr
+			becomes_descr = worker_descr.becomes
+			if(becomes_descr) then
+				exp_string = exp_string .. "<br>" .. _"%s to %s (%s EP)":format(
+						worker_descr.descname,
+						becomes_descr.descname,
+						worker_descr.level_experience
+					)
+			end
+			result = result ..  rt("text-align=right", p(exp_string))
+		end
+	end
+
+	return result
+end
+
+
+-- RST
+-- .. function building_help_tool_string(tribename, toolname)
+--
+--    Displays a tool with an intro text and image
+--
+--    :arg tribename: e.g. "barbarians".
+--    :arg toolname: e.g. "felling_axe".
+--    :arg no_of_workers: the number of workers using the tool; for plural formatting.
+--    :returns: text_line for the tool
+--
+function building_help_tool_string(tribename, toolname, no_of_workers)
+	local ware_descr = wl.Game():get_ware_description(tribename,toolname)
+	return text_line((ngettext("Worker uses:","Workers use:", no_of_workers)),
+		ware_descr.descname, "tribes/" .. tribename .. "/" .. toolname  .. "/menu.png")
+end
+
+-- RST
+-- .. building_help_production_section(performance_description)
+--
+--    Displays the production/performance section with a headline
+--
+--    :arg performance_description: a string describing the performance of tha building
+--    :returns: rt for the production section
+--
+function building_help_production_section(performance_description)
+	return rt(h2(_"Production")) .. text_line(_"Performance:", performance_description)
 end

=== modified file 'scripting/infrastructure.lua'
--- scripting/infrastructure.lua	2014-01-19 12:04:56 +0000
+++ scripting/infrastructure.lua	2014-05-27 14:17:43 +0000
@@ -157,3 +157,19 @@
       building, plr.number)
    )
 end
+
+
+-- RST
+-- .. function:: is_building(immovable)
+--
+--    Checks whether an immpvable is a building.
+--
+--    :arg immovable: The immovable to test
+--
+--    :returns: true if the immovable is a building
+function is_building(immovable)
+	return immovable.type == "productionsite" or
+		immovable.type == "warehouse" or
+		immovable.type == "militarysite" or
+		immovable.type == "trainingsite"
+end

=== modified file 'src/logic/bob.cc'
--- src/logic/bob.cc	2014-05-11 07:38:01 +0000
+++ src/logic/bob.cc	2014-05-27 14:17:43 +0000
@@ -68,7 +68,6 @@
 	return 0;
 }
 
-
 BobDescr::BobDescr
 	(char const * const _name, char const * const _descname,
 	 const std::string & directory, Profile & prof, Section & global_s,

=== modified file 'src/logic/bob.h'
--- src/logic/bob.h	2014-05-11 07:38:01 +0000
+++ src/logic/bob.h	2014-05-27 14:17:43 +0000
@@ -77,6 +77,9 @@
 	}
 	uint32_t vision_range() const;
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "bob";}
+
 protected:
 	virtual Bob& create_object() const = 0;
 

=== modified file 'src/logic/building.h'
--- src/logic/building.h	2014-05-11 07:38:01 +0000
+++ src/logic/building.h	2014-05-27 14:17:43 +0000
@@ -130,6 +130,11 @@
 	virtual int32_t suitability(const Map &, FCoords) const;
 	const BuildingHints & hints() const {return m_hints;}
 
+	// class type needed for Lua stuff
+	std::string get_type() const {
+		return "building";
+	}
+
 protected:
 	virtual Building & create_object() const = 0;
 	Building & create_constructionsite() const;

=== modified file 'src/logic/carrier.h'
--- src/logic/carrier.h	2014-02-22 18:04:02 +0000
+++ src/logic/carrier.h	2014-05-27 14:17:43 +0000
@@ -42,7 +42,8 @@
 		{};
 
 		virtual Worker_Type get_worker_type() const override {return CARRIER;}
-
+		// class type needed for Lua stuffl TODO: redundant with get_worker_type()?
+		std::string get_type() const {return "carrier";}
 	protected:
 		virtual Bob & create_object() const override {return *new Carrier(*this);}
 	};

=== modified file 'src/logic/cmd_luacoroutine.cc'
--- src/logic/cmd_luacoroutine.cc	2014-05-11 07:38:01 +0000
+++ src/logic/cmd_luacoroutine.cc	2014-05-27 14:17:43 +0000
@@ -34,8 +34,8 @@
 
 void Cmd_LuaCoroutine::execute (Game & game) {
 	try {
-		uint32_t sleeptime;
-		int rv = m_cr->resume(&sleeptime);
+		int rv = m_cr->resume();
+		const uint32_t sleeptime = m_cr->pop_uint32();
 		if (rv == LuaCoroutine::YIELDED) {
 			game.enqueue_command(new Widelands::Cmd_LuaCoroutine(sleeptime, m_cr));
 			m_cr = nullptr;  // Remove our ownership so we don't delete.

=== modified file 'src/logic/constructionsite.h'
--- src/logic/constructionsite.h	2014-04-06 10:50:39 +0000
+++ src/logic/constructionsite.h	2014-05-27 14:17:43 +0000
@@ -56,6 +56,9 @@
 		 const Tribe_Descr & tribe);
 
 	virtual Building & create_object() const override;
+
+	// class type needed for Lua stuff
+	std::string get_type() const {return "constructionsite";}
 };
 
 class ConstructionSite : public Partially_Finished_Building {

=== modified file 'src/logic/critter_bob.h'
--- src/logic/critter_bob.h	2014-03-31 20:21:27 +0000
+++ src/logic/critter_bob.h	2014-05-27 14:17:43 +0000
@@ -46,6 +46,9 @@
 
 	Critter_BobProgram const * get_program(const std::string &) const;
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "critterbob";}
+
 private:
 	DirAnimations m_walk_anims;
 	bool          m_swimming;

=== modified file 'src/logic/dismantlesite.h'
--- src/logic/dismantlesite.h	2014-02-22 18:04:02 +0000
+++ src/logic/dismantlesite.h	2014-05-27 14:17:43 +0000
@@ -48,6 +48,8 @@
 		 const Tribe_Descr & tribe);
 
 	virtual Building & create_object() const override;
+	// class type needed for Lua stuff
+	std::string get_type() const {return "dismantlesite";}
 };
 
 class DismantleSite : public Partially_Finished_Building {

=== modified file 'src/logic/game.cc'
--- src/logic/game.cc	2014-05-11 07:38:01 +0000
+++ src/logic/game.cc	2014-05-27 14:17:43 +0000
@@ -1035,7 +1035,8 @@
 		iterate_players_existing(p, nr_plrs, *this, plr) {
 			std::unique_ptr<LuaCoroutine> cr = hook->get_coroutine("calculator");
 			cr->push_arg(plr);
-			cr->resume(&custom_statistic[p - 1]);
+			cr->resume();
+			custom_statistic[p - 1] = cr->pop_uint32();
 		}
 	}
 

=== modified file 'src/logic/immovable.h'
--- src/logic/immovable.h	2014-05-10 16:47:03 +0000
+++ src/logic/immovable.h	2014-05-27 14:17:43 +0000
@@ -108,6 +108,9 @@
 
 	const Buildcost & buildcost() const {return m_buildcost;}
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "immovable";}
+
 protected:
 	int32_t     m_size;
 	Programs    m_programs;

=== modified file 'src/logic/instances.h'
--- src/logic/instances.h	2014-05-11 07:38:01 +0000
+++ src/logic/instances.h	2014-05-27 14:17:43 +0000
@@ -82,6 +82,9 @@
 	bool is_animation_known(const std::string & name) const;
 	void add_animation(const std::string & name, uint32_t anim);
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "mapobject";}
+
 protected:
 	void add_attribute(uint32_t attr);
 

=== modified file 'src/logic/militarysite.h'
--- src/logic/militarysite.h	2014-04-18 16:31:54 +0000
+++ src/logic/militarysite.h	2014-05-27 14:17:43 +0000
@@ -52,6 +52,10 @@
 	std::string m_attack_str;
 	std::string m_defeated_enemy_str;
 	std::string m_defeated_you_str;
+
+	// class type needed for Lua stuff
+	std::string get_type() const {return "militarysite";}
+
 private:
 	uint32_t m_conquer_radius;
 	uint32_t m_num_soldiers;

=== modified file 'src/logic/productionsite.h'
--- src/logic/productionsite.h	2014-04-18 16:31:54 +0000
+++ src/logic/productionsite.h	2014-05-27 14:17:43 +0000
@@ -85,6 +85,10 @@
 	typedef std::map<std::string, ProductionProgram *> Programs;
 	const Programs & programs() const {return m_programs;}
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "productionsite";}
+
+
 private:
 	BillOfMaterials m_working_positions;
 	BillOfMaterials m_inputs;

=== modified file 'src/logic/ship.h'
--- src/logic/ship.h	2014-03-31 20:21:27 +0000
+++ src/logic/ship.h	2014-05-27 14:17:43 +0000
@@ -50,6 +50,9 @@
 
 	virtual Bob & create_object() const override;
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "ship";}
+
 private:
 	DirAnimations m_sail_anims;
 	uint32_t m_capacity;

=== modified file 'src/logic/soldier.h'
--- src/logic/soldier.h	2014-02-22 18:04:02 +0000
+++ src/logic/soldier.h	2014-05-27 14:17:43 +0000
@@ -80,10 +80,11 @@
 		assert(level <= m_max_evade_level);   return m_evade_pics  [level];
 	}
 
-
-
 	uint32_t get_rand_anim(Game & game, const char * const name) const;
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "soldier";}
+
 protected:
 	virtual Bob & create_object() const override;
 

=== modified file 'src/logic/trainingsite.h'
--- src/logic/trainingsite.h	2014-04-18 16:31:54 +0000
+++ src/logic/trainingsite.h	2014-05-27 14:17:43 +0000
@@ -49,6 +49,10 @@
 	int32_t get_min_level(tAttribute) const;
 	int32_t get_max_level(tAttribute) const;
 	int32_t get_max_stall() const;
+
+	// class type needed for Lua stuff
+	std::string get_type() const {return "trainingsite";}
+
 private:
 	//  FIXME These variables should be per soldier type. They should be in a
 	//  FIXME struct and there should be a vector, indexed by Soldier_Index,

=== modified file 'src/logic/ware_descr.cc'
--- src/logic/ware_descr.cc	2014-03-16 20:55:15 +0000
+++ src/logic/ware_descr.cc	2014-05-27 14:17:43 +0000
@@ -18,11 +18,13 @@
  */
 
 #include "logic/ware_descr.h"
+#include "logic/tribe.h"
 
 #include "graphic/animation.h"
 #include "graphic/graphic.h"
 #include "i18n.h"
 #include "profile/profile.h"
+#include "upcast.h"
 
 namespace Widelands {
 
@@ -46,7 +48,6 @@
 		static_cast<uint8_t>(global_s.get_natural("preciousness", 0));
 }
 
-
 /**
  * Load all static graphics
  */

=== modified file 'src/logic/ware_descr.h'
--- src/logic/ware_descr.h	2014-05-11 07:38:01 +0000
+++ src/logic/ware_descr.h	2014-05-27 14:17:43 +0000
@@ -84,6 +84,9 @@
 	/// returns the preciousness of the ware. It is used by the computer player
 	uint8_t preciousness() const {return m_preciousness;}
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "ware";}
+
 private:
 	const Tribe_Descr & m_tribe;
 	std::string m_helptext;   ///< Long descriptive text

=== modified file 'src/logic/warehouse.h'
--- src/logic/warehouse.h	2014-05-11 07:38:01 +0000
+++ src/logic/warehouse.h	2014-05-27 14:17:43 +0000
@@ -60,6 +60,9 @@
 	uint32_t get_heal_per_second        () const {
 		return m_heal_per_second;
 	}
+
+	// class type needed for Lua stuff
+	std::string get_type() const {return "warehouse";}
 private:
 	int32_t m_conquers;
 	uint32_t m_heal_per_second;

=== modified file 'src/logic/worker_descr.h'
--- src/logic/worker_descr.h	2014-05-11 07:38:01 +0000
+++ src/logic/worker_descr.h	2014-05-27 14:17:43 +0000
@@ -112,6 +112,9 @@
 	typedef std::map<std::string, WorkerProgram *> Programs;
 	const Programs & programs() const {return m_programs;}
 
+	// class type needed for Lua stuff
+	std::string get_type() const {return "worker";}
+
 protected:
 
 	std::string       m_helptext;   ///< Short (tooltip-like) help text

=== modified file 'src/scripting/lua_bases.cc'
--- src/scripting/lua_bases.cc	2014-04-21 09:19:14 +0000
+++ src/scripting/lua_bases.cc	2014-05-27 14:17:43 +0000
@@ -22,6 +22,8 @@
 #include "economy/economy.h"
 #include "logic/checkstep.h"
 #include "logic/player.h"
+#include "logic/tribe.h"
+#include "logic/ware_descr.h"
 #include "scripting/lua_map.h"
 
 
@@ -70,6 +72,9 @@
 
 const char L_EditorGameBase::className[] = "EditorGameBase";
 const MethodType<L_EditorGameBase> L_EditorGameBase::Methods[] = {
+	METHOD(L_EditorGameBase, get_building_description),
+	METHOD(L_EditorGameBase, get_ware_description),
+	METHOD(L_EditorGameBase, get_worker_description),
 	{nullptr, nullptr},
 };
 const PropertyType<L_EditorGameBase> L_EditorGameBase::Properties[] = {
@@ -137,6 +142,96 @@
  ==========================================================
  */
 
+/* RST
+	.. function:: get_building_description(tribename, building_description.name)
+
+		:arg tribe_name: the name of the tribe that this building belongs to
+		:arg building_name: the name of the building
+
+	Registers a building description so Lua can reference it from the game. Call this with
+	wl.Game():get_building_description(tribe_name, building_name)
+
+		(RO) The :class:`~wl.Game.Building_description`.
+*/
+int L_EditorGameBase::get_building_description(lua_State* L) {
+	if (lua_gettop(L) != 3) {
+		report_error(L, "Wrong number of arguments");
+	}
+	const std::string tribe_name = luaL_checkstring(L, 2);
+	const std::string building_name = luaL_checkstring(L, 3);
+	const Tribe_Descr* tribe_description = get_egbase(L).get_tribe(tribe_name);
+	if (!tribe_description) {
+		report_error(L, "Tribe %s does not exist", tribe_name.c_str());
+	}
+	Building_Index building_index = tribe_description->building_index(building_name);
+	if (building_index == INVALID_INDEX) {
+		report_error(L, "Building %s does not exist", building_name.c_str());
+	}
+	const Building_Descr* building_description = tribe_description->get_building_descr(building_index);
+
+	return LuaMap::upcasted_building_descr_to_lua(L, building_description);
+}
+
+
+/* RST
+	.. function:: get_ware_description(tribename, ware_description.name)
+
+		:arg tribe_name: the name of the tribe that this building belongs to
+		:arg ware_name: the name of the ware
+
+	Registers a ware description so Lua can reference it from the game. Call this with
+	wl.Game():get_ware_description(tribe_name, ware_name)
+
+		(RO) The :class:`~wl.Game.Ware_description`.
+*/
+int L_EditorGameBase::get_ware_description(lua_State* L) {
+	if (lua_gettop(L) != 3) {
+		report_error(L, "Wrong number of arguments");
+	}
+	const std::string tribe_name = luaL_checkstring(L, 2);
+	const std::string ware_name = luaL_checkstring(L, 3);
+	const Tribe_Descr* tribe_description = get_egbase(L).get_tribe(tribe_name);
+	if (!tribe_description) {
+		report_error(L, "Tribe %s does not exist", tribe_name.c_str());
+	}
+	Ware_Index ware_index = tribe_description->ware_index(ware_name);
+	if (ware_index == INVALID_INDEX) {
+		report_error(L, "Ware %s does not exist", ware_name.c_str());
+	}
+	const WareDescr* ware_description = tribe_description->get_ware_descr(ware_index);
+	return to_lua<LuaMap::L_WareDescription>(L, new LuaMap::L_WareDescription(ware_description));
+}
+
+
+/* RST
+	.. function:: get_worker_description(tribename, worker_description.name)
+
+		:arg tribe_name: the name of the tribe that this building belongs to
+		:arg worker_name: the name of the worker
+
+	Registers a worker description so Lua can reference it from the game. Call this with
+	wl.Game():get_worker_description(tribe_name, worker_name)
+
+		(RO) The :class:`~wl.Game.Worker_description`.
+*/
+int L_EditorGameBase::get_worker_description(lua_State* L) {
+	if (lua_gettop(L) != 3) {
+		report_error(L, "Wrong number of arguments");
+	}
+	const std::string tribe_name = luaL_checkstring(L, 2);
+	const std::string worker_name = luaL_checkstring(L, 3);
+	const Tribe_Descr* tribe_description = get_egbase(L).get_tribe(tribe_name);
+	if (!tribe_description) {
+		report_error(L, "Tribe %s does not exist", tribe_name.c_str());
+	}
+	Ware_Index worker_index = tribe_description->worker_index(worker_name);
+	if (worker_index == INVALID_INDEX) {
+		report_error(L, "Worker %s does not exist", worker_name.c_str());
+	}
+	const Worker_Descr* worker_description = tribe_description->get_worker_descr(worker_index);
+	return to_lua<LuaMap::L_WorkerDescription>(L, new LuaMap::L_WorkerDescription(worker_description));
+}
+
 /*
  ==========================================================
  C METHODS

=== modified file 'src/scripting/lua_bases.h'
--- src/scripting/lua_bases.h	2014-02-22 18:04:02 +0000
+++ src/scripting/lua_bases.h	2014-05-27 14:17:43 +0000
@@ -56,6 +56,9 @@
 	/*
 	 * Lua methods
 	 */
+	int get_building_description(lua_State * L);
+	int get_ware_description(lua_State * L);
+	int get_worker_description(lua_State * L);
 
 	/*
 	 * C methods

=== modified file 'src/scripting/lua_coroutine.cc'
--- src/scripting/lua_coroutine.cc	2014-05-11 07:38:01 +0000
+++ src/scripting/lua_coroutine.cc	2014-05-27 14:17:43 +0000
@@ -63,7 +63,7 @@
 }  // namespace
 
 LuaCoroutine::LuaCoroutine(lua_State * ms)
-	: m_L(ms), m_idx(LUA_REFNIL), m_nargs(0)
+	: m_L(ms), m_idx(LUA_REFNIL), m_ninput_args(0), m_nreturn_values(0)
 {
 	if (m_L) {
 		m_idx = reference_coroutine(m_L);
@@ -78,20 +78,11 @@
 	return lua_status(m_L);
 }
 
-int LuaCoroutine::resume(uint32_t * sleeptime)
+int LuaCoroutine::resume()
 {
-	int rv = lua_resume(m_L, nullptr, m_nargs);
-	m_nargs = 0;
-	int n = lua_gettop(m_L);
-
-	uint32_t sleep_for = 0;
-	if (n == 1) {
-		sleep_for = luaL_checkint32(m_L, -1);
-		lua_pop(m_L, 1);
-	}
-
-	if (sleeptime)
-		*sleeptime = sleep_for;
+	int rv = lua_resume(m_L, nullptr, m_ninput_args);
+	m_ninput_args = 0;
+	m_nreturn_values = lua_gettop(m_L);
 
 	if (rv != 0 && rv != YIELDED) {
 		throw LuaError(lua_tostring(m_L, -1));
@@ -102,34 +93,114 @@
 
 void LuaCoroutine::push_arg(const Widelands::Player * plr) {
 	to_lua<LuaGame::L_Player>(m_L, new LuaGame::L_Player(plr->player_number()));
-	m_nargs++;
+	m_ninput_args++;
 }
 
 void LuaCoroutine::push_arg(const Widelands::Coords & coords) {
 	to_lua<LuaMap::L_Field>(m_L, new LuaMap::L_Field(coords));
 	++m_nargs;
+<<<<<<< TREE
 }
 
 #define COROUTINE_DATA_PACKET_VERSION 2
 void LuaCoroutine::write(FileWrite& fw) {
+=======
+	++m_ninput_args;
+}
+
+void LuaCoroutine::push_arg(const Widelands::Building_Descr* building_descr) {
+	assert(building_descr != nullptr);
+	to_lua<LuaMap::L_BuildingDescription>(m_L, new LuaMap::L_BuildingDescription(building_descr));
+	++m_ninput_args;
+}
+
+std::string LuaCoroutine::pop_string() {
+	if (!m_nreturn_values) {
+		return "";
+	}
+	if (!lua_isstring(m_L, -1)) {
+		throw LuaError("pop_string(), but no string on the stack.");
+	}
+	const std::string return_value = lua_tostring(m_L, -1);
+	lua_pop(m_L, 1);
+	--m_nreturn_values;
+	return return_value;
+}
+
+uint32_t LuaCoroutine::pop_uint32() {
+	if (!m_nreturn_values) {
+		return 0;
+	}
+	if (!lua_isnumber(m_L, -1)) {
+		throw LuaError("pop_uint32(), but no integer on the stack.");
+	}
+	const uint32_t return_value = luaL_checkuint32(m_L, -1);
+	lua_pop(m_L, 1);
+	--m_nreturn_values;
+	return return_value;
+}
+
+
+#define COROUTINE_DATA_PACKET_VERSION 2
+uint32_t LuaCoroutine::write
+	(lua_State * parent, Widelands::FileWrite & fw,
+	 Widelands::Map_Map_Object_Saver & mos)
+{
+	// Clean out the garbage before we write this.
+	lua_gc(m_L, LUA_GCCOLLECT, 0);
+
+>>>>>>> MERGE-SOURCE
 	fw.Unsigned8(COROUTINE_DATA_PACKET_VERSION);
 
 	// The current numbers of arguments on the stack
 	fw.Unsigned32(m_nargs);
+<<<<<<< TREE
 	fw.Unsigned32(m_idx);
+=======
+	fw.Unsigned32(m_ninput_args);
+	fw.Unsigned32(m_nreturn_values);
+
+	// Empty table + object to persist on the stack Stack
+	lua_newtable(parent);
+	lua_pushthread(m_L);
+	lua_xmove (m_L, parent, 1);
+
+	const uint32_t nwritten = persist_object(parent, fw, mos);
+
+	// Clean out the garbage again.
+	lua_gc(m_L, LUA_GCCOLLECT, 0);
+
+	return nwritten;
+>>>>>>> MERGE-SOURCE
 }
 
 void LuaCoroutine::read(lua_State* parent, FileRead& fr) {
 	uint8_t version = fr.Unsigned8();
 
+<<<<<<< TREE
 	if (version != COROUTINE_DATA_PACKET_VERSION)
 		throw wexception("Unhandled data packet version: %i\n", version);
+=======
+	if (version > COROUTINE_DATA_PACKET_VERSION)
+		throw wexception("Unknown data packet version: %i\n", version);
+>>>>>>> MERGE-SOURCE
 
 	m_nargs = fr.Unsigned32();
+<<<<<<< TREE
 	m_idx = fr.Unsigned32();
 
 	lua_getglobal(parent, kReferenceTableName);
 	lua_rawgeti(parent, -1, m_idx);
+=======
+		m_ninput_args = fr.Unsigned32();
+		if (version > 1) {
+			m_nreturn_values = fr.Unsigned32();
+		}
+
+	// Empty table + object to persist on the stack Stack
+	unpersist_object(parent, fr, mol, size);
+
+>>>>>>> MERGE-SOURCE
 	m_L = luaL_checkthread(parent, -1);
 	lua_pop(parent, 2);
 }

=== modified file 'src/scripting/lua_coroutine.h'
--- src/scripting/lua_coroutine.h	2014-05-11 07:38:01 +0000
+++ src/scripting/lua_coroutine.h	2014-05-27 14:17:43 +0000
@@ -50,16 +50,18 @@
 	int get_status();
 
 	// Resumes the coroutine and returns it's state after it did its execution.
-	// If 'sleeptime' is not null, it will contain the time in milliseconds the
-	// lua code requested for this coroutine to sleep before it should be
-	// resumed again.
-	int resume(uint32_t* sleeptime = nullptr);
+	int resume();
 
 	// Push the given arguments onto the Lua stack, so that a Coroutine can
 	// receive them. This is for example used in the initialization scripts or
 	// in hooks.
 	void push_arg(const Widelands::Player*);
 	void push_arg(const Widelands::Coords&);
+	void push_arg(const Widelands::Building_Descr*);
+
+	// NOCOM(#sirver): document
+	uint32_t pop_uint32();
+	std::string pop_string();
 
 private:
 	friend class LuaGameInterface;
@@ -72,6 +74,8 @@
 	lua_State* m_L;
 	uint32_t m_idx;
 	uint32_t m_nargs;
+	uint32_t m_ninput_args;
+	uint32_t m_nreturn_values;
 };
 
 #endif /* end of include guard: LUA_COROUTINE_H */

=== modified file 'src/scripting/lua_map.cc'
--- src/scripting/lua_map.cc	2014-04-21 10:47:03 +0000
+++ src/scripting/lua_map.cc	2014-05-27 14:17:43 +0000
@@ -33,6 +33,7 @@
 #include "logic/warelist.h"
 #include "logic/widelands_geometry.h"
 #include "scripting/c_utils.h"
+#include "scripting/eris/lua.hpp"
 #include "scripting/lua_game.h"
 #include "wui/mapviewpixelfunctions.h"
 
@@ -40,6 +41,35 @@
 
 namespace LuaMap {
 
+namespace  {
+
+// Pushes a lua table with (name, count) pairs for the given 'wares_map' on the
+// stack, sorted by tribe.wares_order(). Returns 1.
+int wares_map_to_lua(lua_State* L, const Buildcost& wares_map, const Tribe_Descr& tribe) {
+
+	// sorting according to wares order, code copied from waremap_to_richtext in waredisplay.cc
+	std::map<Widelands::Ware_Index, uint8_t>::const_iterator c;
+	Widelands::Tribe_Descr::WaresOrder::iterator i;
+	std::vector<Widelands::Ware_Index>::iterator j;
+	Widelands::Tribe_Descr::WaresOrder order = tribe.wares_order();
+
+	lua_newtable(L);
+	for (i = order.begin(); i != order.end(); i++) {
+		for (j = i->begin(); j != i->end(); ++j) {
+			if ((c = wares_map.find(*j)) != wares_map.end()) {
+
+				lua_pushstring(L, tribe.get_ware_descr(c->first)->name());
+				lua_pushuint32(L, c->second);
+				lua_settable(L, -3);
+			}
+		}
+	}
+	return 1;
+}
+
+
+}  // namespace
+
 /* RST
 :mod:`wl.map`
 =============
@@ -569,6 +599,29 @@
 	}
 	return to_lua<L_BaseImmovable>(L, new L_BaseImmovable(*mo));
 }
+
+// use the dynamic type of BuildingDescription
+#undef CAST_TO_LUA
+#define CAST_TO_LUA(klass, lua_klass) to_lua<lua_klass> \
+   (L, new lua_klass(static_cast<const klass *>(desc)))
+
+int upcasted_building_descr_to_lua(lua_State* L, const Building_Descr* const desc) {
+	assert(desc != nullptr);
+
+	if (is_a(MilitarySite_Descr, desc)) {
+		return CAST_TO_LUA(MilitarySite_Descr, L_MilitarySiteDescription);
+	}
+	else if (is_a(TrainingSite_Descr, desc)) {
+		return CAST_TO_LUA(TrainingSite_Descr, L_TrainingSiteDescription);
+	}
+	else if (is_a(ProductionSite_Descr, desc)) {
+		return CAST_TO_LUA(ProductionSite_Descr, L_ProductionSiteDescription);
+	}
+	else if (is_a(Warehouse_Descr, desc)) {
+		return CAST_TO_LUA(Warehouse_Descr, L_WarehouseDescription);
+	}
+	return CAST_TO_LUA(Building_Descr, L_BuildingDescription);
+}
 #undef CAST_TO_LUA
 
 
@@ -957,6 +1010,913 @@
  */
 
 
+
+/* RST
+MapObjectDescription
+----------
+
+.. class:: MapObjectDescription
+
+	A static description of a tribe's map object, so it can be used in help files
+	without having to access an actual object on the map.
+	This class contains the properties that are common to all map objects such as buildings or wares.
+
+	The dynamic MapObject class corresponding to this class is the base class for all Objects in widelands,
+	including immovables and Bobs. This class can't be instantiated directly, but provides the base
+	for all others.
+*/
+const char L_MapObjectDescription::className[] = "MapObjectDescription";
+const MethodType<L_MapObjectDescription> L_MapObjectDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_MapObjectDescription> L_MapObjectDescription::Properties[] = {
+	PROP_RO(L_MapObjectDescription, name),
+	PROP_RO(L_MapObjectDescription, descname),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_MapObjectDescription::__persist(lua_State * /* L */) {
+}
+void L_MapObjectDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+/* RST
+	.. attribute:: name
+
+			(RO) a :string:`name` with the map object's internal name
+*/
+
+int L_MapObjectDescription::get_name(lua_State * L) {
+	lua_pushstring(L, get()->name());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: name
+
+			(RO) a :string:`descname` with the map object's localized name
+*/
+
+int L_MapObjectDescription::get_descname(lua_State * L) {
+	lua_pushstring(L, get()->descname());
+	return 1;
+}
+
+
+
+/* RST
+BuildingDescription
+----------
+
+.. class:: BuildingDescription
+
+	A static description of a tribe's building, so it can be used in help files
+	without having to access an actual building on the map.
+	This class contains the properties that are common to all buildings.
+	Further properties are implemented in the subclasses.
+	See also class MapObjectDescription for more properties.
+*/
+const char L_BuildingDescription::className[] = "BuildingDescription";
+const MethodType<L_BuildingDescription> L_BuildingDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_BuildingDescription> L_BuildingDescription::Properties[] = {
+	PROP_RO(L_BuildingDescription, build_cost),
+	PROP_RO(L_BuildingDescription, buildable),
+	PROP_RO(L_BuildingDescription, conquers),
+	PROP_RO(L_BuildingDescription, destructible),
+	PROP_RO(L_BuildingDescription, enhanced),
+	PROP_RO(L_BuildingDescription, enhancement_cost),
+	PROP_RO(L_BuildingDescription, enhancements),
+	PROP_RO(L_BuildingDescription, ismine),
+	PROP_RO(L_BuildingDescription, isport),
+	PROP_RO(L_BuildingDescription, returned_wares),
+	PROP_RO(L_BuildingDescription, returned_wares_enhanced),
+	// TODO size should be similar to
+	// https://wl.widelands.org/docs/wl/autogen_wl_map/#wl.map.BaseImmovable.size.
+	// In fact, as soon as all descriptions are wrapped (also for other
+	// immovables besides buildings) we should get rid of BaseImmovable.size.
+	PROP_RO(L_BuildingDescription, size),
+	PROP_RO(L_BuildingDescription, type),
+	PROP_RO(L_BuildingDescription, vision_range),
+	PROP_RO(L_BuildingDescription, workarea_radius),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_BuildingDescription::__persist(lua_State * /* L */) {
+	// TODO(GunChleoc): we probably need to persist something here, so that a
+	// description can be held in a local variable on save.
+}
+void L_BuildingDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+
+/* RST
+	.. attribute:: build_cost
+
+			(RO) a list of ware build cost for the building.
+*/
+int L_BuildingDescription::get_build_cost(lua_State * L) {
+	return wares_map_to_lua(L, get()->buildcost(), get()->tribe());
+}
+
+
+/* RST
+	.. attribute:: buildable
+
+			(RO) true if the building can be built.
+*/
+int L_BuildingDescription::get_buildable(lua_State * L) {
+	lua_pushboolean(L, get()->is_buildable());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: conquers
+
+			(RO) the conquer range of the building as an int.
+*/
+int L_BuildingDescription::get_conquers(lua_State * L) {
+	lua_pushinteger(L, get()->get_conquers());
+	return 1;
+}
+
+
+
+/* RST
+	.. attribute:: destructible
+
+			(RO) true if the building is destructible.
+*/
+int L_BuildingDescription::get_destructible(lua_State * L) {
+	lua_pushboolean(L, get()->is_destructible());
+	return 1;
+}
+
+/* RST
+	.. attribute:: enhanced
+
+			(RO) true if the building is enhanced from another building.
+*/
+int L_BuildingDescription::get_enhanced(lua_State * L) {
+	lua_pushboolean(L, get()->is_enhanced());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: enhancement_cost
+
+			(RO) a list of ware cost for enhancing to this building type.
+*/
+int L_BuildingDescription::get_enhancement_cost(lua_State * L) {
+	return wares_map_to_lua(L, get()->enhancement_cost(), get()->tribe());
+}
+
+/* RST
+	.. attribute:: enhancements
+
+		(RO) a list of building descriptions that this building can enhance to.
+*/
+int L_BuildingDescription::get_enhancements(lua_State * L) {
+	const Tribe_Descr& tribe = get()->tribe();
+
+	lua_newtable(L);
+	int index = 1;
+	for (auto building_index : get()->enhancements()) {
+		lua_pushint32(L, index++);
+		upcasted_building_descr_to_lua(L, tribe.get_building_descr(building_index));
+		lua_rawset(L, -3);
+	}
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: ismine
+
+			(RO) true if the building is a mine.
+*/
+int L_BuildingDescription::get_ismine(lua_State * L) {
+	lua_pushboolean(L, get()->get_ismine());
+	return 1;
+}
+
+/* RST
+	.. attribute:: isport
+
+			(RO) true if the building is a port.
+*/
+int L_BuildingDescription::get_isport(lua_State * L) {
+	lua_pushboolean(L, get()->get_isport());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: type
+
+			(RO) the :int:`type` of the building, e.g. building.
+*/
+int L_BuildingDescription::get_type(lua_State * L) {
+	const Building_Descr * descr = static_cast<const Building_Descr *>(get());
+	lua_pushstring(L, descr->get_type());
+	return 1;
+}
+
+/* RST
+	.. attribute:: returned_wares
+
+			(RO) a list of wares returned upon dismantling.
+*/
+int L_BuildingDescription::get_returned_wares(lua_State * L) {
+	return wares_map_to_lua(L, get()->returned_wares(), get()->tribe());
+}
+
+
+/* RST
+	.. attribute:: returned_wares_enhanced
+
+			(RO) a list of wares returned upon dismantling an enhanced building.
+*/
+int L_BuildingDescription::get_returned_wares_enhanced(lua_State * L) {
+	return wares_map_to_lua(L, get()->returned_wares_enhanced(), get()->tribe());
+}
+
+
+/* RST
+	.. attribute:: size
+
+			(RO) the :int:`size` of the building: 1 = small, 2 = medium, 3 = big.
+*/
+int L_BuildingDescription::get_size(lua_State * L) {
+	lua_pushinteger(L, get()->get_size());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: vision range
+
+			(RO) the :int:`vision_range` of the building as an int.
+*/
+int L_BuildingDescription::get_vision_range(lua_State * L) {
+	lua_pushinteger(L, get()->vision_range());
+	return 1;
+}
+
+/* RST
+	.. attribute:: workarea_radius
+
+			(RO) the :int:`workarea_radius` of the building as an int.
+*/
+int L_BuildingDescription::get_workarea_radius(lua_State * L) {
+	lua_pushinteger(L, get()->m_workarea_info.begin()->first);
+	return 1;
+}
+
+
+/* RST
+ProductionSiteDescription
+----------
+
+.. class:: ProductionSiteDescription
+
+	A static description of a tribe's productionsite, so it can be used in help files
+	without having to access an actual building on the map.
+	This class contains the properties for productionsites that have workers.
+	For militarysites and trainingsites, please use the subclasses.
+	See also class BuildingDescription and class MapObjectDescription for more properties.
+*/
+const char L_ProductionSiteDescription::className[] = "ProductionSiteDescription";
+const MethodType<L_ProductionSiteDescription> L_ProductionSiteDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_ProductionSiteDescription> L_ProductionSiteDescription::Properties[] = {
+	PROP_RO(L_ProductionSiteDescription, inputs),
+	PROP_RO(L_ProductionSiteDescription, output_ware_types),
+	PROP_RO(L_ProductionSiteDescription, type),
+	PROP_RO(L_ProductionSiteDescription, working_positions),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_ProductionSiteDescription::__persist(lua_State * /* L */) {
+}
+void L_ProductionSiteDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+
+/* RST
+	.. attribute:: inputs
+		(RO) An array with pairs of int, ware_descr.name describing the input of the productionsite
+*/
+int L_ProductionSiteDescription::get_inputs(lua_State * L) {
+	const Tribe_Descr& tribe = get()->tribe();
+	const ProductionSite_Descr * descr = static_cast<const ProductionSite_Descr *>(get());
+
+	lua_newtable(L);
+	int index = 1;
+	for (const WareAmount& ware_amount : descr->inputs()) {
+		lua_pushint32(L, index++);
+		lua_pushstring(L, tribe.get_ware_descr(ware_amount.first)->name());
+		lua_settable(L, -3);
+	}
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: output_ware_types
+
+		(RO) An array with pairs of int, ware_descr.name describing the output of the productionsite
+*/
+int L_ProductionSiteDescription::get_output_ware_types(lua_State * L) {
+	const Tribe_Descr& tribe = get()->tribe();
+	const ProductionSite_Descr * descr = static_cast<const ProductionSite_Descr *>(get());
+
+	lua_newtable(L);
+	int index = 1;
+	for (auto ware_index : descr->output_ware_types()) {
+		lua_pushint32(L, index++);
+		lua_pushstring(L, tribe.get_ware_descr(ware_index)->name());
+		lua_rawset(L, -3);
+	}
+	return 1;
+
+
+}
+
+
+/* RST
+	.. attribute:: type
+
+			(RO) the :string:`type` of the building, e.g. productionsite.
+*/
+int L_ProductionSiteDescription::get_type(lua_State * L) {
+	const ProductionSite_Descr * descr = static_cast<const ProductionSite_Descr *>(get());
+	lua_pushstring(L, descr->get_type());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: working_positions
+		(RO) An array with pairs of int, worker_descr.name describing the worker positions of the productionsite
+*/
+int L_ProductionSiteDescription::get_working_positions(lua_State * L) {
+	const Tribe_Descr& tribe = get()->tribe();
+	const ProductionSite_Descr * descr = static_cast<const ProductionSite_Descr *>(get());
+
+	lua_newtable(L);
+	int index = 1;
+	for (const auto& positions_pair : descr->working_positions()) {
+		int amount = positions_pair.second;
+		while (amount-- > 0)
+		{
+			lua_pushint32(L, index++);
+			lua_pushstring(L, tribe.get_worker_descr(positions_pair.first)->name());
+			lua_settable(L, -3);
+		}
+	}
+	return 1;
+}
+
+
+/* RST
+MilitarySiteDescription
+----------
+
+.. class:: MilitarySiteDescription
+
+	A static description of a tribe's militarysite, so it can be used in help files
+	without having to access an actual building on the map.
+	A militarysite can garrison and heal soldiers, and it will expand your territory.
+	See also class BuildingDescription and class MapObjectDescription for more properties.
+*/
+const char L_MilitarySiteDescription::className[] = "MilitarySiteDescription";
+const MethodType<L_MilitarySiteDescription> L_MilitarySiteDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_MilitarySiteDescription> L_MilitarySiteDescription::Properties[] = {
+	PROP_RO(L_MilitarySiteDescription, heal_per_second),
+	PROP_RO(L_MilitarySiteDescription, max_number_of_soldiers),
+	PROP_RO(L_MilitarySiteDescription, type),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_MilitarySiteDescription::__persist(lua_State * /* L */) {
+}
+void L_MilitarySiteDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+
+/* RST
+	.. attribute:: heal_per_second
+
+		(RO) The :int:`number` of health healed ber second by the militarysite
+*/
+int L_MilitarySiteDescription::get_heal_per_second(lua_State * L) {
+	const MilitarySite_Descr * descr = static_cast<const MilitarySite_Descr *>(get());
+	lua_pushinteger(L, descr->get_heal_per_second());
+	return 1;
+}
+
+/* RST
+	.. attribute:: max_number_of_soldiers
+
+		(RO) The :int:`number` of soldiers that can be garrisoned at the militarysite
+*/
+int L_MilitarySiteDescription::get_max_number_of_soldiers(lua_State * L) {
+	const MilitarySite_Descr * descr = static_cast<const MilitarySite_Descr *>(get());
+	lua_pushinteger(L, descr->get_max_number_of_soldiers());
+	return 1;
+}
+
+/* RST
+	.. attribute:: type
+
+			(RO) the :string:`type` of the building, e.g. militarysite.
+*/
+int L_MilitarySiteDescription::get_type(lua_State * L) {
+	const MilitarySite_Descr * descr = static_cast<const MilitarySite_Descr *>(get());
+	lua_pushstring(L, descr->get_type());
+	return 1;
+}
+
+
+/* RST
+TrainingSiteDescription
+----------
+
+.. class:: TrainingSiteDescription
+
+	A static description of a tribe's trainingsite, so it can be used in help files
+	without having to access an actual building on the map.
+	A training site can train some or all of a soldier's properties (Attack, Defense, Evade and Health).
+	See also class BuildingDescription and class MapObjectDescription for more properties.
+*/
+const char L_TrainingSiteDescription::className[] = "TrainingSiteDescription";
+const MethodType<L_TrainingSiteDescription> L_TrainingSiteDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_TrainingSiteDescription> L_TrainingSiteDescription::Properties[] = {
+	PROP_RO(L_TrainingSiteDescription, max_attack),
+	PROP_RO(L_TrainingSiteDescription, max_defense),
+	PROP_RO(L_TrainingSiteDescription, max_evade),
+	PROP_RO(L_TrainingSiteDescription, max_hp),
+	PROP_RO(L_TrainingSiteDescription, max_number_of_soldiers),
+	PROP_RO(L_TrainingSiteDescription, min_attack),
+	PROP_RO(L_TrainingSiteDescription, min_defense),
+	PROP_RO(L_TrainingSiteDescription, min_evade),
+	PROP_RO(L_TrainingSiteDescription, min_hp),
+	PROP_RO(L_TrainingSiteDescription, type),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_TrainingSiteDescription::__persist(lua_State * /* L */) {
+}
+void L_TrainingSiteDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+/* RST
+	.. attribute:: max_attack
+
+		(RO) The :int:`number` of attack points that a soldier can train
+*/
+int L_TrainingSiteDescription::get_max_attack(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_attack())
+		lua_pushinteger(L, descr->get_max_level(atrAttack));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+/* RST
+	.. attribute:: max_defense
+
+		(RO) The :int:`number` of defense points that a soldier can train
+*/
+int L_TrainingSiteDescription::get_max_defense(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_defense())
+		lua_pushinteger(L, descr->get_max_level(atrDefense));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: max_evade
+
+		(RO) The :int:`number` of evade points that a soldier can train
+*/
+int L_TrainingSiteDescription::get_max_evade(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_evade())
+		lua_pushinteger(L, descr->get_max_level(atrEvade));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: max_hp
+
+		(RO) The :int:`number` of health points that a soldier can train
+*/
+int L_TrainingSiteDescription::get_max_hp(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_hp())
+		lua_pushinteger(L, descr->get_max_level(atrHP));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: max_number_of_soldiers
+
+		(RO) The :int:`number` of soldiers that can be garrisoned at the trainingsite
+*/
+int L_TrainingSiteDescription::get_max_number_of_soldiers(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	lua_pushinteger(L, descr->get_max_number_of_soldiers());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: min_attack
+
+		(RO) The :int:`number` of attack points that a soldier starts training with
+*/
+int L_TrainingSiteDescription::get_min_attack(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_attack())
+		lua_pushinteger(L, descr->get_min_level(atrAttack));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+/* RST
+	.. attribute:: min_defense
+
+		(RO) The :int:`number` of defense points that a soldier starts training with
+*/
+int L_TrainingSiteDescription::get_min_defense(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_defense())
+		lua_pushinteger(L, descr->get_min_level(atrDefense));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: min_evade
+
+		(RO) The :int:`number` of evade points that a soldier starts training with
+*/
+int L_TrainingSiteDescription::get_min_evade(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_evade())
+		lua_pushinteger(L, descr->get_min_level(atrEvade));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: min_hp
+
+		(RO) The :int:`number` of health points that a soldier starts training with
+*/
+int L_TrainingSiteDescription::get_min_hp(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	if (descr->get_train_hp())
+		lua_pushinteger(L, descr->get_min_level(atrHP));
+	else lua_pushinteger(L, -1);
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: type
+
+			(RO) the :string:`type` of the building, e.g. trainingsite.
+*/
+int L_TrainingSiteDescription::get_type(lua_State * L) {
+	const TrainingSite_Descr * descr = static_cast<const TrainingSite_Descr *>(get());
+	lua_pushstring(L, descr->get_type());
+	return 1;
+}
+
+
+/* RST
+WarehouseDescription
+----------
+
+.. class:: WarehouseDescription
+
+	A static description of a tribe's warehouse, so it can be used in help files
+	without having to access an actual building on the map.
+	Note that headquarters are also warehouses.
+	A warehouse keeps people, animals and wares.
+	See also class BuildingDescription and class MapObjectDescription for more properties.
+*/
+const char L_WarehouseDescription::className[] = "WarehouseDescription";
+const MethodType<L_WarehouseDescription> L_WarehouseDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_WarehouseDescription> L_WarehouseDescription::Properties[] = {
+	PROP_RO(L_WarehouseDescription, heal_per_second),
+	PROP_RO(L_WarehouseDescription, type),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_WarehouseDescription::__persist(lua_State * /* L */) {
+}
+void L_WarehouseDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+
+/* RST
+	.. attribute:: heal_per_second
+
+		(RO) The :int:`number` of health healed per second by the warehouse
+*/
+int L_WarehouseDescription::get_heal_per_second(lua_State * L) {
+	const Warehouse_Descr * descr = static_cast<const Warehouse_Descr *>(get());
+	lua_pushinteger(L, descr->get_heal_per_second());
+	return 1;
+}
+
+
+/* RST
+	.. attribute:: type
+
+			(RO) the :string:`type` of the building, e.g. warehouse.
+*/
+int L_WarehouseDescription::get_type(lua_State * L) {
+	const Warehouse_Descr * descr = static_cast<const Warehouse_Descr *>(get());
+	lua_pushstring(L, descr->get_type());
+	return 1;
+}
+
+
+
+/* RST
+WareDescription
+----------
+
+.. class:: WareDescription
+
+	A static description of a tribe's ware, so it can be used in help files
+	without having to access an actual instance of the ware on the map.
+	See also class MapObjectDescription for more properties.
+*/
+const char L_WareDescription::className[] = "WareDescription";
+const MethodType<L_WareDescription> L_WareDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_WareDescription> L_WareDescription::Properties[] = {
+	PROP_RO(L_WareDescription, producers),
+	PROP_RO(L_WareDescription, consumers),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_WareDescription::__persist(lua_State * /* L */) {
+}
+void L_WareDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+
+/* RST
+	.. attribute:: producers
+
+		(RO) a list of building descriptions that can procude this ware.
+*/
+// TODO(GunChleoc): move the calculation somewhere else.
+// You get the (mutable) wares_description container from the tribe_description
+// into the building constructor and add a member (mutable_ware_description(), either in Tribe_Descr
+// or if there is a container with every ware in there than there).
+// So you can get something like this in the buildingdesc constructor:
+// tribe.mutable_ware_description("log")->add_producer(*this);
+int L_WareDescription::get_producers(lua_State * L) {
+	const Tribe_Descr& tribe = get()->tribe();
+	Building_Index const nr_buildings = tribe.get_nrbuildings();
+
+	lua_newtable(L);
+	int index = 1;
+
+	for (Building_Index i = 0; i < nr_buildings; ++i) {
+
+		const Building_Descr & descr = *tribe.get_building_descr(i);
+
+		if (upcast(ProductionSite_Descr const, de, &descr)) {
+			for (auto ware_index : de->output_ware_types()) {
+				if (std::string(get()->name()) ==
+					std::string(tribe.get_ware_descr(ware_index)->name())) {
+					lua_pushint32(L, index++);
+					upcasted_building_descr_to_lua(L, tribe.get_building_descr(i));
+					lua_rawset(L, -3);
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+
+
+/* RST
+	.. attribute:: consumers
+
+		(RO) a list of building descriptions that can consume this ware.
+*/
+// TODO(GunChleoc): move the calculation somewhere else.
+// You get the (mutable) wares_description container from the tribe_description
+// into the building constructor and add a member (mutable_ware_description(), either in Tribe_Descr
+// or if there is a container with every ware in there than there).
+// So you can get something like this in the buildingdesc constructor:
+// tribe.mutable_ware_description("log")->add_producer(*this);
+int L_WareDescription::get_consumers(lua_State * L) {
+	const Tribe_Descr& tribe = get()->tribe();
+	Building_Index const nr_buildings = tribe.get_nrbuildings();
+
+	lua_newtable(L);
+	int index = 1;
+
+	for (Building_Index i = 0; i < nr_buildings; ++i) {
+
+		const Building_Descr & descr = *tribe.get_building_descr(i);
+
+		if (upcast(ProductionSite_Descr const, de, &descr)) {
+			// inputs() returns type WareAmount = std::pair<Ware_Index, uint32_t>
+			for (auto ware_amount : de->inputs()) {
+				if (std::string(get()->name()) ==
+					std::string(tribe.get_ware_descr(ware_amount.first)->name())) {
+					lua_pushint32(L, index++);
+					upcasted_building_descr_to_lua(L, tribe.get_building_descr(i));
+					lua_rawset(L, -3);
+				}
+			}
+		}
+	}
+	return 1;
+}
+
+
+/* RST
+WorkerDescription
+----------
+
+.. class:: WorkerDescription
+
+	A static description of a tribe's worker, so it can be used in help files
+	without having to access an actual instance of the worker on the map.
+	See also class MapObjectDescription for more properties.
+*/
+const char L_WorkerDescription::className[] = "WorkerDescription";
+const MethodType<L_WorkerDescription> L_WorkerDescription::Methods[] = {
+	{nullptr, nullptr},
+};
+const PropertyType<L_WorkerDescription> L_WorkerDescription::Properties[] = {
+	PROP_RO(L_WorkerDescription, becomes),
+	PROP_RO(L_WorkerDescription, level_experience),
+	PROP_RO(L_WorkerDescription, buildable),
+	PROP_RO(L_WorkerDescription, buildcost),
+	{nullptr, nullptr, nullptr},
+};
+
+void L_WorkerDescription::__persist(lua_State * /* L */) {
+}
+void L_WorkerDescription::__unpersist(lua_State * /* L */) {
+}
+
+/*
+ ==========================================================
+ PROPERTIES
+ ==========================================================
+ */
+
+
+/* RST
+	.. attribute:: becomes
+
+		(RO) The :class:`WorkerDescription` of the worker this one will level up
+		to or :const:`nil` if it never levels up.
+*/
+int L_WorkerDescription::get_becomes(lua_State * L) {
+	const Ware_Index becomes_index = get()->becomes();
+	if (becomes_index == INVALID_INDEX) {
+		lua_pushnil(L);
+		return 1;
+	}
+	return to_lua<L_WorkerDescription>(
+	   L, new L_WorkerDescription(get()->tribe().get_worker_descr(becomes_index)));
+}
+
+
+/* RST
+	.. attribute:: level_experience
+
+			(RO) the :int:`experience` the worker needs to reach this level.
+*/
+int L_WorkerDescription::get_level_experience(lua_State * L) {
+	lua_pushinteger(L, get()->get_level_experience());
+	return 1;
+}
+
+/* RST
+	.. attribute:: buildable
+
+			(RO) `true` if the worker is buildable.
+*/
+int L_WorkerDescription::get_buildable(lua_State * L) {
+	lua_pushboolean(L, get()->is_buildable());
+	return 1;
+}
+
+
+
+/* RST
+	.. attribute:: buildcost
+
+		(RO) a list of building requirements, e.g. {"carrier", "ax"}
+*/
+int L_WorkerDescription::get_buildcost(lua_State * L) {
+	lua_newtable(L);
+	int index = 1;
+	for (const auto& buildcost_pair : get()->buildcost()) {
+		lua_pushint32(L, index++);
+		lua_pushstring(L, buildcost_pair.first);
+		lua_settable(L, -3);
+	}
+	return 1;
+}
+
+
+/*
+ ==========================================================
+ LUA METHODS
+ ==========================================================
+ */
+
+
+
+/*
+ ==========================================================
+ C METHODS
+ ==========================================================
+ */
+
+
+
 /* RST
 MapObject
 ----------
@@ -1612,7 +2572,6 @@
 	{nullptr, nullptr},
 };
 const PropertyType<L_Building> L_Building::Properties[] = {
-	PROP_RO(L_Building, building_type),
 	PROP_RO(L_Building, flag),
 	{nullptr, nullptr, nullptr},
 };
@@ -1622,21 +2581,6 @@
  PROPERTIES
  ==========================================================
  */
-/* RST
-	.. attribute:: building_type
-
-		(RO) What type of building is this. Can be either of:
-
-		* constructionsite
-		* militarysite
-		* productionsite
-		* trainingsite
-		* warehouse
-*/
-int L_Building::get_building_type(lua_State * L) {
-	lua_pushstring(L, get(L, get_egbase(L))->type_name());
-	return 1;
-}
 
 /* RST
 	.. attribute:: flag
@@ -3061,11 +4005,46 @@
 	lua_pop(L, 1); // S:
 
 	register_class<L_Map>(L, "map");
+	register_class<L_MapObjectDescription>(L, "map");
+
+	register_class<L_BuildingDescription>(L, "map", true);
+	add_parent<L_BuildingDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
+	register_class<L_ProductionSiteDescription>(L, "map", true);
+	add_parent<L_ProductionSiteDescription, L_BuildingDescription>(L);
+	add_parent<L_ProductionSiteDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
+	register_class<L_MilitarySiteDescription>(L, "map", true);
+	add_parent<L_MilitarySiteDescription, L_ProductionSiteDescription>(L);
+	add_parent<L_MilitarySiteDescription, L_BuildingDescription>(L);
+	add_parent<L_MilitarySiteDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
+	register_class<L_TrainingSiteDescription>(L, "map", true);
+	add_parent<L_TrainingSiteDescription, L_ProductionSiteDescription>(L);
+	add_parent<L_TrainingSiteDescription, L_BuildingDescription>(L);
+	add_parent<L_TrainingSiteDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
+	register_class<L_WarehouseDescription>(L, "map", true);
+	add_parent<L_WarehouseDescription, L_BuildingDescription>(L);
+	add_parent<L_WarehouseDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
+	register_class<L_WareDescription>(L, "map", true);
+	add_parent<L_WareDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
+	register_class<L_WorkerDescription>(L, "map", true);
+	add_parent<L_WorkerDescription, L_MapObjectDescription>(L);
+	lua_pop(L, 1); // Pop the meta table
+
 	register_class<L_Field>(L, "map");
 	register_class<L_PlayerSlot>(L, "map");
 	register_class<L_MapObject>(L, "map");
 
-
 	register_class<L_Bob>(L, "map", true);
 	add_parent<L_Bob, L_MapObject>(L);
 	lua_pop(L, 1); // Pop the meta table

=== modified file 'src/scripting/lua_map.h'
--- src/scripting/lua_map.h	2014-03-31 20:21:27 +0000
+++ src/scripting/lua_map.h	2014-05-27 14:17:43 +0000
@@ -40,6 +40,9 @@
 
 namespace Widelands {
 	struct Soldier_Descr;
+	struct Building_Descr;
+	struct WareDescr;
+	class Worker_Descr;
 	class Bob;
 }
 
@@ -89,6 +92,325 @@
 };
 
 
+class L_MapObjectDescription : public L_MapModuleClass {
+public:
+	LUNA_CLASS_HEAD(L_MapObjectDescription);
+
+	virtual ~L_MapObjectDescription() {}
+
+	L_MapObjectDescription() : mapobjectdescr_(nullptr) {}
+	L_MapObjectDescription(const Widelands::Map_Object_Descr* const mapobjectdescr)
+		: mapobjectdescr_(mapobjectdescr) {}
+	L_MapObjectDescription(lua_State* L) : mapobjectdescr_(nullptr) {
+		report_error(L, "Cannot instantiate a 'MapObjectDescription' directly!");
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_name(lua_State *);
+	int get_descname(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+protected:
+	const Widelands::Map_Object_Descr* get(void) const {
+		assert(mapobjectdescr_ != nullptr);
+		return mapobjectdescr_;
+	}
+
+private:
+	const Widelands::Map_Object_Descr * const mapobjectdescr_;
+};
+
+#define CASTED_GET_DESCRIPTION(klass)                                                              \
+	const Widelands::klass* get() const {                                                           \
+		return static_cast<const Widelands::klass*>(L_MapObjectDescription::get());                  \
+	}
+
+class L_BuildingDescription : public L_MapObjectDescription {
+public:
+	LUNA_CLASS_HEAD(L_BuildingDescription);
+
+	virtual ~L_BuildingDescription() {}
+
+	L_BuildingDescription() {}
+	L_BuildingDescription(const Widelands::Building_Descr* const buildingdescr)
+	   : L_MapObjectDescription(buildingdescr) {
+	}
+	L_BuildingDescription(lua_State* L) : L_MapObjectDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_build_cost(lua_State *);
+	int get_buildable(lua_State *);
+	int get_conquers(lua_State *);
+	int get_destructible(lua_State *);
+	int get_enhanced(lua_State *);
+	int get_enhancement_cost(lua_State *);
+	int get_enhancements(lua_State *);
+	int get_ismine(lua_State *);
+	int get_isport(lua_State *);
+	int get_isproductionsite(lua_State *);
+	int get_returned_wares(lua_State *);
+	int get_returned_wares_enhanced(lua_State *);
+	int get_size(lua_State *);
+	// Subclasses all need to overwrite get_type, otherwise the type of the parent class would be fetched
+	int get_type(lua_State *);
+	int get_vision_range(lua_State *);
+	int get_workarea_radius(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(Building_Descr);
+};
+
+
+class L_ProductionSiteDescription : public L_BuildingDescription {
+public:
+	LUNA_CLASS_HEAD(L_ProductionSiteDescription);
+
+	virtual ~L_ProductionSiteDescription() {}
+
+	L_ProductionSiteDescription() {}
+	L_ProductionSiteDescription(const Widelands::ProductionSite_Descr* const productionsitedescr)
+	   : L_BuildingDescription(productionsitedescr) {
+	}
+	L_ProductionSiteDescription(lua_State* L) : L_BuildingDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_inputs(lua_State *);
+	int get_output_ware_types(lua_State *);
+	int get_type(lua_State *);
+	int get_working_positions(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(ProductionSite_Descr);
+};
+
+
+class L_MilitarySiteDescription : public L_ProductionSiteDescription {
+public:
+	LUNA_CLASS_HEAD(L_MilitarySiteDescription);
+
+	virtual ~L_MilitarySiteDescription() {}
+
+	L_MilitarySiteDescription() {}
+	L_MilitarySiteDescription(const Widelands::ProductionSite_Descr* const militarysitedescr)
+	   : L_ProductionSiteDescription(militarysitedescr) {
+	}
+	L_MilitarySiteDescription(lua_State* L) : L_ProductionSiteDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_heal_per_second(lua_State *);
+	int get_max_number_of_soldiers(lua_State *);
+	int get_type(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(MilitarySite_Descr);
+};
+
+
+class L_TrainingSiteDescription : public L_ProductionSiteDescription {
+public:
+	LUNA_CLASS_HEAD(L_TrainingSiteDescription);
+
+	virtual ~L_TrainingSiteDescription() {}
+
+	L_TrainingSiteDescription() {}
+	L_TrainingSiteDescription(const Widelands::ProductionSite_Descr* const trainingsitedescr)
+	   : L_ProductionSiteDescription(trainingsitedescr) {
+	}
+	L_TrainingSiteDescription(lua_State* L) : L_ProductionSiteDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_max_attack(lua_State *);
+	int get_max_defense(lua_State *);
+	int get_max_evade(lua_State *);
+	int get_max_hp(lua_State *);
+	int get_max_number_of_soldiers(lua_State *);
+	int get_min_attack(lua_State *);
+	int get_min_defense(lua_State *);
+	int get_min_evade(lua_State *);
+	int get_min_hp(lua_State *);
+	int get_type(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(TrainingSite_Descr);
+};
+
+
+
+class L_WarehouseDescription : public L_BuildingDescription {
+public:
+	LUNA_CLASS_HEAD(L_WarehouseDescription);
+
+	virtual ~L_WarehouseDescription() {}
+
+	L_WarehouseDescription() {}
+	L_WarehouseDescription(const Widelands::Warehouse_Descr* const warehousedescr)
+	   : L_BuildingDescription(warehousedescr) {
+	}
+	L_WarehouseDescription(lua_State* L) : L_BuildingDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_heal_per_second(lua_State *);
+	int get_type(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(Warehouse_Descr);
+};
+
+
+
+class L_WareDescription : public L_MapObjectDescription {
+public:
+	LUNA_CLASS_HEAD(L_WareDescription);
+
+	virtual ~L_WareDescription() {}
+
+	L_WareDescription()  {}
+	L_WareDescription(const Widelands::WareDescr* const waredescr)
+		: L_MapObjectDescription(waredescr) {}
+	L_WareDescription(lua_State* L) : L_MapObjectDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_producers(lua_State *);
+	int get_consumers(lua_State *);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(WareDescr);
+};
+
+
+class L_WorkerDescription : public L_MapObjectDescription {
+public:
+	LUNA_CLASS_HEAD(L_WorkerDescription);
+
+	virtual ~L_WorkerDescription() {}
+
+	L_WorkerDescription() {}
+	L_WorkerDescription(const Widelands::Worker_Descr* const workerdescr)
+	   : L_MapObjectDescription(workerdescr) {
+	}
+	L_WorkerDescription(lua_State* L) : L_MapObjectDescription(L) {
+	}
+
+	virtual void __persist(lua_State * L) override;
+	virtual void __unpersist(lua_State * L) override;
+
+	/*
+	 * Properties
+	 */
+	int get_becomes(lua_State*);
+	int get_level_experience(lua_State*);
+	int get_buildable(lua_State*);
+	int get_buildcost(lua_State*);
+
+	/*
+	 * Lua methods
+	 */
+
+	/*
+	 * C methods
+	 */
+
+private:
+	CASTED_GET_DESCRIPTION(Worker_Descr);
+};
+
+#undef CASTED_GET_DESCRIPTION
+
 #define CASTED_GET(klass) \
 Widelands:: klass * get(lua_State * L, Widelands::Editor_Game_Base & egbase) { \
 	return static_cast<Widelands:: klass *> \
@@ -228,7 +550,6 @@
 	/*
 	 * Properties
 	 */
-	int get_building_type(lua_State* L);
 	int get_flag(lua_State* L);
 
 	/*
@@ -654,6 +975,7 @@
 	 */
 };
 
+int upcasted_building_descr_to_lua(lua_State* L, const Widelands::Building_Descr* descr);
 int upcasted_immovable_to_lua(lua_State * L, Widelands::BaseImmovable * bi);
 int upcasted_bob_to_lua(lua_State * L, Widelands::Bob * mo);
 

=== modified file 'src/scripting/luna_impl.h'
--- src/scripting/luna_impl.h	2014-04-15 05:06:05 +0000
+++ src/scripting/luna_impl.h	2014-05-27 14:17:43 +0000
@@ -300,6 +300,7 @@
 
 		// metatable[prop_name] = Pointer to getter setter
 		lua_pushstring(L, PT::Properties[i].name);
+
 		lua_newtable(L);
 		lua_pushstring(L, "getter");
 		lua_pushlightuserdata

=== modified file 'src/scripting/scripting.cc'
--- src/scripting/scripting.cc	2014-05-11 07:38:01 +0000
+++ src/scripting/scripting.cc	2014-05-27 14:17:43 +0000
@@ -382,3 +382,4 @@
 
 	return nwritten;
 }
+

=== modified file 'src/scripting/scripting.h'
--- src/scripting/scripting.h	2014-05-11 12:29:55 +0000
+++ src/scripting/scripting.h	2014-05-27 14:17:43 +0000
@@ -38,6 +38,7 @@
 	class Map_Map_Object_Loader;
 	struct Map_Map_Object_Saver;
 	class Player;
+	struct Building_Descr;
 }
 
 class EditorFactory;
@@ -88,5 +89,4 @@
 private:
 	std::unique_ptr<GameFactory> m_factory;
 };
-
 #endif

=== modified file 'src/ui_basic/helpwindow.cc'
--- src/ui_basic/helpwindow.cc	2014-04-06 11:58:13 +0000
+++ src/ui_basic/helpwindow.cc	2014-05-27 14:17:43 +0000
@@ -28,6 +28,7 @@
 #include "i18n.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "log.h"
+#include "logic/building.h"
 #include "scripting/lua_table.h"
 #include "scripting/scripting.h"
 #include "ui_basic/button.h"
@@ -180,26 +181,29 @@
 LuaTextHelpWindow
 ===================
 */
-
 LuaTextHelpWindow::LuaTextHelpWindow
-	(Panel* const parent, UI::UniqueWindow::Registry& reg, const std::string&
-	 caption, const std::string& path_to_script, uint32_t width,
-	 uint32_t height)
-	: UI::UniqueWindow(parent, "help_window", &reg, width, height,
-			(boost::format(_("Help: %s")) % caption).str().c_str()),
-	textarea(new Multiline_Textarea(this, 5, 5, width - 10, height - 10,
-				std::string(), Align_Left))
+	(Panel * const parent,
+	 UI::UniqueWindow::Registry & reg,
+	 const Widelands::Building_Descr& building_description,
+	 LuaInterface * const lua,
+	 uint32_t width, uint32_t height)
+	:
+	UI::UniqueWindow(parent, "help_window", &reg, width, height,
+			(boost::format(_("Help: %s")) % building_description.descname()).str().c_str()),
+	textarea(new Multiline_Textarea(this, 5, 5, width - 10, height -10, std::string(), Align_Left))
 {
-	LuaInterface lua;
-
 	try {
-		std::unique_ptr<LuaTable> t = lua.run_script(path_to_script);
-		textarea->set_text(t->get_string("text"));
-	} catch (LuaError & err) {
+		std::unique_ptr<LuaTable> t(
+		   lua->run_script(building_description.helptext_script()));
+		std::unique_ptr<LuaCoroutine> cr(t->get_coroutine("func"));
+		cr->push_arg(&building_description);
+		cr->resume();
+		const std::string help_text = cr->pop_string();
+		textarea->set_text(help_text);
+	} catch (LuaError& err) {
 		textarea->set_text(err.what());
 	}
 }
-
 LuaTextHelpWindow::~LuaTextHelpWindow()
 {
 }

=== modified file 'src/ui_basic/helpwindow.h'
--- src/ui_basic/helpwindow.h	2014-04-06 11:58:13 +0000
+++ src/ui_basic/helpwindow.h	2014-05-27 14:17:43 +0000
@@ -27,6 +27,12 @@
 #include "ui_basic/unique_window.h"
 #include "ui_basic/window.h"
 
+class LuaInterface;
+
+namespace Widelands {
+struct Building_Descr;
+}
+
 namespace UI {
 
 /**
@@ -82,9 +88,9 @@
  */
 struct LuaTextHelpWindow : public UI::UniqueWindow {
 	LuaTextHelpWindow
-		(Panel * parent, UI::UniqueWindow::Registry &,
-		 const std::string& caption,
-		 const std::string& path_to_script,
+		(Panel * parent, UI::UniqueWindow::Registry& reg,
+		 const Widelands::Building_Descr& building_description,
+		 LuaInterface * const lua,
 		 uint32_t width = 300, uint32_t height = 400);
 	~LuaTextHelpWindow();
 

=== modified file 'src/wui/buildingwindow.cc'
--- src/wui/buildingwindow.cc	2014-05-27 11:01:15 +0000
+++ src/wui/buildingwindow.cc	2014-05-27 14:17:43 +0000
@@ -359,7 +359,7 @@
 			   igbase().unique_windows().get_registry(m_building.name() + "_help");
 			registry.open_window = [this, &registry] {
 				new UI::LuaTextHelpWindow(
-				   &igbase(), registry, m_building.descname(), m_building.descr().helptext_script());
+				   &igbase(), registry, m_building.descr(), &igbase().egbase().lua());
 			};
 
 			helpbtn->sigclicked.connect(boost::bind(&UI::UniqueWindow::Registry::toggle, boost::ref(registry)));

=== added file 'test/maps/lua_testsuite.wmf/scripting/immovables_descriptions.lua'
--- test/maps/lua_testsuite.wmf/scripting/immovables_descriptions.lua	1970-01-01 00:00:00 +0000
+++ test/maps/lua_testsuite.wmf/scripting/immovables_descriptions.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,378 @@
+set_textdomain("tribe_barbarians")
+
+test_descr = lunit.TestCase("Immovable descriptions test")
+function test_descr:test_instantiation_forbidden()
+   assert_error("Cannot instantiate", function()
+      wl.map.BuildingDescription()
+   end)
+   assert_error("Cannot instantiate", function()
+      wl.map.WareDescription()
+   end)
+   assert_error("Cannot instantiate", function()
+      wl.map.WorkerDescription()
+   end)
+end
+
+--  =======================================================
+--  ***************** BuildingDescription *****************
+--  =======================================================
+
+function test_descr:test_building_descr()
+   assert_error("Wrong tribe", function() egbase:get_building_description("XXX","sentry") end)
+   assert_error("Wrong building", function() egbase:get_building_description("barbarians","XXX") end)
+   assert_error("Wrong number of parameters: 1", function() egbase:get_building_description("XXX") end)
+   assert_error("Wrong number of parameters: 3", function() egbase:get_building_description("XXX","YYY","ZZZ") end)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Lumberjack’s Hut", egbase:get_building_description("barbarians","lumberjacks_hut").descname)
+   assert_equal(_"Battle Arena", egbase:get_building_description("barbarians","battlearena").descname)
+   assert_equal(_"Fortress", egbase:get_building_description("barbarians","fortress").descname)
+   assert_equal(_"Coal Mine", egbase:get_building_description("barbarians","coalmine").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("lumberjacks_hut", egbase:get_building_description("barbarians","lumberjacks_hut").name)
+   assert_equal("battlearena", egbase:get_building_description("barbarians","battlearena").name)
+   assert_equal("fortress", egbase:get_building_description("barbarians","fortress").name)
+   assert_equal("coalmine", egbase:get_building_description("barbarians","coalmine").name)
+end
+
+function test_descr:test_build_cost()
+   local total_cost = function(t)
+      local cost = 0
+      for name, count in pairs(t) do
+         cost = cost + count
+      end
+      return cost
+   end
+   assert_equal(2, total_cost(egbase:get_building_description("barbarians","sentry").build_cost))
+   assert_equal(20, total_cost(egbase:get_building_description("barbarians","fortress").build_cost))
+   assert_equal(0, total_cost(egbase:get_building_description("barbarians","citadel").build_cost))
+end
+
+function test_descr:test_buildable()
+   assert_equal(false, egbase:get_building_description("barbarians","headquarters").buildable)
+   assert_equal(true, egbase:get_building_description("barbarians","sentry").buildable)
+end
+
+function test_descr:test_conquers()
+   assert_equal(0, egbase:get_building_description("barbarians","lumberjacks_hut").conquers)
+   assert_equal(6, egbase:get_building_description("barbarians","sentry").conquers)
+   assert_equal(9, egbase:get_building_description("barbarians","headquarters").conquers)
+   assert_equal(0, egbase:get_building_description("barbarians","coalmine").conquers)
+end
+
+function test_descr:test_destructible()
+   assert_equal(false, egbase:get_building_description("barbarians","headquarters").destructible)
+   assert_equal(true, egbase:get_building_description("barbarians","sentry").destructible)
+end
+
+function test_descr:test_enhanced()
+   assert_equal(false, egbase:get_building_description("barbarians","headquarters").enhanced)
+   assert_equal(true, egbase:get_building_description("barbarians","axfactory").enhanced)
+end
+
+function test_descr:test_enhancement_cost()
+   local total_cost = function(t)
+      local cost = 0
+      for name, count in pairs(t) do
+         cost = cost + count
+      end
+      return cost
+   end
+   assert_equal(0, total_cost(egbase:get_building_description("barbarians","sentry").enhancement_cost))
+   assert_equal(20, total_cost(egbase:get_building_description("barbarians","citadel").enhancement_cost))
+end
+
+function test_descr:test_enhancements()
+	assert_equal("inn", egbase:get_building_description("barbarians","tavern").enhancements[1].name)
+	assert_equal(nil, egbase:get_building_description("barbarians","lumberjacks_hut").enhancements[1])
+end
+
+function test_descr:test_ismine()
+   assert_equal(false, egbase:get_building_description("barbarians","headquarters").ismine)
+   assert_equal(true, egbase:get_building_description("barbarians","oremine").ismine)
+end
+
+function test_descr:test_isport()
+   assert_equal(false, egbase:get_building_description("barbarians","headquarters").isport)
+   assert_equal(true, egbase:get_building_description("barbarians","port").isport)
+end
+
+function test_descr:test_returned_wares()
+   local total_cost = function(t)
+      local cost = 0
+      for name, count in pairs(t) do
+         cost = cost + count
+      end
+      return cost
+   end
+   assert_equal(1, total_cost(egbase:get_building_description("barbarians","sentry").returned_wares))
+   assert_equal(9, total_cost(egbase:get_building_description("barbarians","fortress").returned_wares))
+   assert_equal(0, total_cost(egbase:get_building_description("barbarians","citadel").returned_wares))
+end
+
+function test_descr:test_returned_wares_enhanced()
+   local total_cost = function(t)
+      local cost = 0
+      for name, count in pairs(t) do
+         cost = cost + count
+      end
+      return cost
+   end
+   assert_equal(0, total_cost(egbase:get_building_description("barbarians","sentry").returned_wares_enhanced))
+   assert_equal(0, total_cost(egbase:get_building_description("barbarians","fortress").returned_wares_enhanced))
+   assert_equal(10, total_cost(egbase:get_building_description("barbarians","citadel").returned_wares_enhanced))
+end
+
+function test_descr:test_size()
+   assert_equal(1, egbase:get_building_description("barbarians","lumberjacks_hut").size)
+   assert_equal(2, egbase:get_building_description("barbarians","reed_yard").size)
+   assert_equal(3, egbase:get_building_description("barbarians","fortress").size)
+   assert_equal(1, egbase:get_building_description("barbarians","coalmine").size)
+end
+
+function test_descr:test_type()
+   assert_equal("militarysite", egbase:get_building_description("barbarians","sentry").type)
+end
+
+function test_descr:test_vision_range()
+-- if vision_range is not set in the conf, it is get_conquers() + 4
+   assert_equal(4, egbase:get_building_description("barbarians","lumberjacks_hut").vision_range)
+   assert_equal(2, egbase:get_building_description("barbarians","constructionsite").vision_range)
+   assert_equal(4+11, egbase:get_building_description("barbarians","fortress").vision_range)
+   assert_equal(17, egbase:get_building_description("barbarians","donjon").vision_range)
+end
+
+--  =======================================================
+--  ************** ProductionSiteDescription **************
+--  =======================================================
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Coal Mine", egbase:get_building_description("barbarians","coalmine").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("coalmine", egbase:get_building_description("barbarians","coalmine").name)
+end
+
+function test_descr:test_inputs()
+	local building_description = wl.Game():get_building_description("barbarians","bakery")
+	assert_equal("wheat", building_description.inputs[1])
+	assert_equal("water", building_description.inputs[2])
+	building_description = wl.Game():get_building_description("barbarians","lumberjacks_hut")
+	assert_equal(nil, building_description.inputs[1])
+end
+
+function test_descr:test_output_ware_types()
+	local building_description = wl.Game():get_building_description("barbarians","bakery")
+	assert_equal("pittabread", building_description.output_ware_types[1])
+	building_description = wl.Game():get_building_description("barbarians","gamekeepers_hut")
+	assert_equal(nil, building_description.output_ware_types[1])
+end
+
+function test_descr:test_type()
+   assert_equal("productionsite", egbase:get_building_description("barbarians","coalmine").type)
+end
+
+function test_descr:test_working_positions()
+	local building_description = wl.Game():get_building_description("barbarians","deeper_coalmine")
+	assert_equal("master-miner", building_description.working_positions[1])
+	assert_equal("chief-miner", building_description.working_positions[2])
+	assert_equal("miner", building_description.working_positions[3])
+	building_description = wl.Game():get_building_description("barbarians","big_inn")
+	assert_equal("innkeeper", building_description.working_positions[1])
+	assert_equal("innkeeper", building_description.working_positions[2])
+end
+
+
+--  =======================================================
+--  *************** MilitarySiteDescription ***************
+--  =======================================================
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Sentry", egbase:get_building_description("barbarians","sentry").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("sentry", egbase:get_building_description("barbarians","sentry").name)
+end
+
+function test_descr:test_heal_per_second()
+   assert_equal(80, egbase:get_building_description("barbarians","sentry").heal_per_second)
+   assert_equal(170, egbase:get_building_description("barbarians","fortress").heal_per_second)
+end
+
+function test_descr:test_max_number_of_soldiers()
+   assert_equal(2, egbase:get_building_description("barbarians","sentry").max_number_of_soldiers)
+   assert_equal(8, egbase:get_building_description("barbarians","fortress").max_number_of_soldiers)
+end
+
+function test_descr:test_type()
+   assert_equal("militarysite", egbase:get_building_description("barbarians","sentry").type)
+end
+
+
+--  =======================================================
+--  *************** TrainingSiteDescription ***************
+--  =======================================================
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Battle Arena", egbase:get_building_description("barbarians","battlearena").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("battlearena", egbase:get_building_description("barbarians","battlearena").name)
+end
+
+function test_descr:test_max_attack()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").max_attack)
+   assert_equal(4, egbase:get_building_description("barbarians","trainingcamp").max_attack)
+end
+
+function test_descr:test_max_defense()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").max_defense)
+   assert_equal(0, egbase:get_building_description("barbarians","trainingcamp").max_defense)
+end
+
+function test_descr:test_max_evade()
+   assert_equal(1, egbase:get_building_description("barbarians","battlearena").max_evade)
+   assert_equal(0, egbase:get_building_description("barbarians","trainingcamp").max_evade)
+end
+
+function test_descr:test_max_hp()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").max_hp)
+   assert_equal(2, egbase:get_building_description("barbarians","trainingcamp").max_hp)
+end
+
+function test_descr:test_min_attack()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").min_attack)
+   assert_equal(0, egbase:get_building_description("barbarians","trainingcamp").min_attack)
+end
+
+function test_descr:test_min_defense()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").min_defense)
+   assert_equal(0, egbase:get_building_description("barbarians","trainingcamp").min_defense)
+end
+
+function test_descr:test_min_evade()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").min_evade)
+   assert_equal(0, egbase:get_building_description("barbarians","trainingcamp").min_evade)
+end
+
+function test_descr:test_min_hp()
+   assert_equal(0, egbase:get_building_description("barbarians","battlearena").min_hp)
+   assert_equal(0, egbase:get_building_description("barbarians","trainingcamp").min_hp)
+end
+
+function test_descr:test_type()
+   assert_equal("trainingsite", egbase:get_building_description("barbarians","battlearena").type)
+end
+
+
+--  =======================================================
+--  **************** WarehouseDescription *****************
+--  =======================================================
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Warehouse", egbase:get_building_description("barbarians","warehouse").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("warehouse", egbase:get_building_description("barbarians","warehouse").name)
+end
+
+function test_descr:test_heal_per_second()
+   assert_equal(170, egbase:get_building_description("barbarians","warehouse").heal_per_second)
+   assert_equal(220, egbase:get_building_description("barbarians","headquarters").heal_per_second)
+end
+
+function test_descr:test_type()
+   assert_equal("warehouse", egbase:get_building_description("barbarians","warehouse").type)
+end
+
+
+--  =======================================================
+--  ***************** WareDescription *****************
+--  =======================================================
+
+function test_descr:test_ware_descr()
+   assert_error("Wrong tribe", function() egbase:get_ware_description("XXX","thatchreed") end)
+   assert_error("Wrong ware", function() egbase:get_ware_description("barbarians","XXX") end)
+   assert_error("Wrong number of parameters: 1", function() egbase:get_ware_description("XXX") end)
+   assert_error("Wrong number of parameters: 3", function() egbase:get_ware_description("XXX","YYY","ZZZ") end)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Thatch Reed", egbase:get_ware_description("barbarians","thatchreed").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("thatchreed", egbase:get_ware_description("barbarians","thatchreed").name)
+end
+
+function test_descr:test_consumers()
+	local ware_description = wl.Game():get_ware_description("barbarians","coal")
+   assert_equal("lime_kiln", ware_description.consumers[1].name)
+   assert_equal("smelting_works", ware_description.consumers[2].name)
+   assert_equal("warmill", ware_description.consumers[3].name)
+   assert_equal("axfactory", ware_description.consumers[4].name)
+   assert_equal("helmsmithy", ware_description.consumers[5].name)
+end
+
+function test_descr:test_producers()
+	local ware_description = wl.Game():get_ware_description("barbarians","coal")
+	assert_equal("burners_house", ware_description.producers[1].name)
+	assert_equal("deeper_coalmine", ware_description.producers[2].name)
+	assert_equal("deep_coalmine", ware_description.producers[3].name)
+	assert_equal("coalmine", ware_description.producers[4].name)
+end
+
+--  =======================================================
+--  ****************** WorkerDescription ******************
+--  =======================================================
+
+function test_descr:test_worker_descr()
+   assert_error("Wrong tribe", function() egbase:get_worker_description("XXX","miner") end)
+   assert_error("Wrong worker", function() egbase:get_worker_description("barbarians","XXX") end)
+   assert_error("Wrong number of parameters: 1", function() egbase:get_worker_description("XXX") end)
+   assert_error("Wrong number of parameters: 3", function() egbase:get_worker_description("XXX","YYY","ZZZ") end)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_descname()
+   assert_equal(_"Miner", egbase:get_worker_description("barbarians","miner").descname)
+end
+
+-- This is actually a property of MapOjectDescription
+function test_descr:test_name()
+   assert_equal("miner", egbase:get_worker_description("barbarians","miner").name)
+end
+
+function test_descr:test_becomes()
+	local worker_descr = egbase:get_worker_description("barbarians","miner").becomes
+   assert_equal("chief-miner", worker_descr.name)
+	worker_descr = egbase:get_worker_description("barbarians","chief-miner").becomes
+   assert_equal("master-miner", worker_descr.name)
+	worker_descr = egbase:get_worker_description("barbarians","master-miner").becomes
+   assert_equal(nil, worker_descr)
+end
+
+function test_descr:test_level_experience()
+   assert_equal(19, egbase:get_worker_description("barbarians","miner").level_experience)
+   assert_equal(28, egbase:get_worker_description("barbarians","chief-miner").level_experience)
+end
+

=== modified file 'test/maps/lua_testsuite.wmf/scripting/init.lua'
--- test/maps/lua_testsuite.wmf/scripting/init.lua	2014-03-25 06:18:48 +0000
+++ test/maps/lua_testsuite.wmf/scripting/init.lua	2014-05-27 14:17:43 +0000
@@ -31,6 +31,7 @@
 include "map:scripting/cplr_access.lua"
 
 include "map:scripting/immovables.lua"
+include "map:scripting/immovables_descriptions.lua"
 
 if not wl.editor then
    include "map:scripting/game.lua"

=== renamed file 'tribes/atlanteans/armorsmithy/armorsmith_i_00.png' => 'tribes/atlanteans/armorsmithy/armorsmithy_i_00.png'
=== renamed file 'tribes/atlanteans/armorsmithy/armorsmith_i_00_pc.png' => 'tribes/atlanteans/armorsmithy/armorsmithy_i_00_pc.png'
=== modified file 'tribes/atlanteans/armorsmithy/conf'
--- tribes/atlanteans/armorsmithy/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/armorsmithy/conf	2014-05-27 14:17:43 +0000
@@ -49,9 +49,9 @@
 return=skipped
 
 [idle]
-pics=armorsmith_i_??.png
+pics=armorsmithy_i_??.png
 hotspot=53 60
 
 [working]
-pics=armorsmith_i_??.png
+pics=armorsmithy_i_??.png
 hotspot=53 60

=== added file 'tribes/atlanteans/armorsmithy/help.lua'
--- tribes/atlanteans/armorsmithy/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/armorsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Armor Smithy
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "advanced_shield",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/bakery/help.lua'
--- tribes/atlanteans/bakery/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/bakery/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Atlantean Bakery
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "bread",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/atlanteans/blackroot_farm/help.lua'
--- tribes/atlanteans/blackroot_farm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/blackroot_farm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Blackroot Farm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "blackroot",
+		_"Sow and harvest blackroot.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/burners_house/help.lua'
--- tribes/atlanteans/burners_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/burners_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Charcoal Burner's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	-- TODO rename pictures building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "coal",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/atlanteans/castle/help.lua'
--- tribes/atlanteans/castle/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/castle/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean Castle
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== added file 'tribes/atlanteans/coalmine/help.lua'
--- tribes/atlanteans/coalmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/coalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Coal Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "coal",
+		_"Digs coal out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/crystalmine/help.lua'
--- tribes/atlanteans/crystalmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/crystalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Crystal Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "diamond",
+		_"Carve precious stones out of the rock in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/atlanteans/dungeon/help.lua'
--- tribes/atlanteans/dungeon/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/dungeon/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,40 @@
+-- The Atlantean Dungeon
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("atlanteans", building_description.name)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Trains soldiers in ‘Attack’."
+			.. " " .."Equips the soldiers with all necessary weapons and armor parts.") ..
+
+	--Dependencies
+	-- We would need to parse the production programs to automate the parameters here; so we do it manually
+	-- TODO make pictures dependencies_training("atlanteans", building_description, "fulltrained-evade", "untrained+evade") ..
+
+	rt(h3(_"Attack Training:")) ..
+	dependencies_training_food("atlanteans", { {"smoked_fish", "smoked_meat"}, {"bread"}}) ..
+	dependencies_training_weapons("atlanteans", building_description, "and", 
+		{"long_trident", "steel_trident", "double_trident", "heavy_double_trident"}, "weaponsmithy") ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/farm/help.lua'
--- tribes/atlanteans/farm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/farm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Farm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "corn",
+		_"Sow and harvest corn.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== modified file 'tribes/atlanteans/fish_breeders_house/conf'
--- tribes/atlanteans/fish_breeders_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/fish_breeders_house/conf	2014-05-27 14:17:43 +0000
@@ -24,5 +24,5 @@
 worker=breed
 
 [idle]
-pics=fish_breeder_i_??.png  # ???
+pics=fish_breeders_house_i_??.png  # ???
 hotspot=34 42

=== renamed file 'tribes/atlanteans/fish_breeders_house/fish_breeder_i_00.png' => 'tribes/atlanteans/fish_breeders_house/fish_breeders_house_i_00.png'
=== renamed file 'tribes/atlanteans/fish_breeders_house/fish_breeder_i_00_pc.png' => 'tribes/atlanteans/fish_breeders_house/fish_breeders_house_i_00_pc.png'
=== added file 'tribes/atlanteans/fish_breeders_house/help.lua'
--- tribes/atlanteans/fish_breeders_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/fish_breeders_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Fish Breeder's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "fish",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== modified file 'tribes/atlanteans/fishers_house/conf'
--- tribes/atlanteans/fishers_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/fishers_house/conf	2014-05-27 14:17:43 +0000
@@ -23,5 +23,5 @@
 worker=fish
 
 [idle]
-pics=fisher_i_??.png  # ???
+pics=fishers_house_i_??.png  # ???
 hotspot=34 42

=== renamed file 'tribes/atlanteans/fishers_house/fisher_i_00.png' => 'tribes/atlanteans/fishers_house/fishers_house_i_00.png'
=== renamed file 'tribes/atlanteans/fishers_house/fisher_i_00_pc.png' => 'tribes/atlanteans/fishers_house/fishers_house_i_00_pc.png'
=== added file 'tribes/atlanteans/fishers_house/help.lua'
--- tribes/atlanteans/fishers_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/fishers_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Atlantean Fisher's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "fish",
+		_"Fishes on the coast near the house.",
+		_"The fisher’s house needs water full of fish within the working radius." .. " " .. _"Build a fisher breeder’s house close to the fisher’s house to make sure that you don’t run out of fish." ) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== modified file 'tribes/atlanteans/foresters_house/conf'
--- tribes/atlanteans/foresters_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/foresters_house/conf	2014-05-27 14:17:43 +0000
@@ -24,5 +24,5 @@
 worker=plant
 
 [idle]
-pics=forester_i_??.png  # ???
+pics=foresters_house_i_??.png  # ???
 hotspot=37 44

=== renamed file 'tribes/atlanteans/foresters_house/forester_i_00.png' => 'tribes/atlanteans/foresters_house/foresters_house_i_00.png'
=== added file 'tribes/atlanteans/foresters_house/help.lua'
--- tribes/atlanteans/foresters_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/foresters_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Atlantean's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "log",
+		_"Plants trees in the surrounding area.",
+		_"The foresters’s house needs free space within the working radius to plant the trees.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculaiton needed]])
+   end
+}

=== added file 'tribes/atlanteans/goldmine/help.lua'
--- tribes/atlanteans/goldmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/goldmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Gold Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "goldore",
+		_"Digs gold ore out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/atlanteans/goldweaver/help.lua'
--- tribes/atlanteans/goldweaver/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/goldweaver/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Goldweaver
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "goldyarn",
+		_"Spins goldyarn out of gold.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/guardhall/help.lua'
--- tribes/atlanteans/guardhall/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/guardhall/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean Guardhall
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== added file 'tribes/atlanteans/guardhouse/help.lua'
--- tribes/atlanteans/guardhouse/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/guardhouse/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean Guardhouse
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== added file 'tribes/atlanteans/headquarters/help.lua'
--- tribes/atlanteans/headquarters/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/headquarters/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean Headquarters
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "carrier",
+		_"Accomodation for your people. Also stores your wares and tools.",
+		_"The headquarters is your main building." .. "<br>" .. _[[Text needed]]) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== added file 'tribes/atlanteans/high_tower/help.lua'
--- tribes/atlanteans/high_tower/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/high_tower/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean High Tower
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description, "tower", {"tower"})
+   end
+}

=== added file 'tribes/atlanteans/horsefarm/help.lua'
--- tribes/atlanteans/horsefarm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/horsefarm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Atlantean Horse Farm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "horse",
+		_"Breeds horses for adding them to the transportation system.") ..
+
+	--Dependencies
+	-- TODO: why is "Produces" empty?
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== modified file 'tribes/atlanteans/hunters_house/conf'
--- tribes/atlanteans/hunters_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/hunters_house/conf	2014-05-27 14:17:43 +0000
@@ -23,5 +23,5 @@
 worker=hunt
 
 [idle]
-pics=hunter_i_??.png
+pics=hunters_house_i_??.png
 hotspot=36 44

=== added file 'tribes/atlanteans/hunters_house/help.lua'
--- tribes/atlanteans/hunters_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/hunters_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Atlantean Hunter's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "meat",
+		_"Hunts animals to produce meat.",
+		_"The hunter’s house needs animals to hunt within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/atlanteans/hunters_house/hunter_i_00.png' => 'tribes/atlanteans/hunters_house/hunters_house_i_00.png'
=== renamed file 'tribes/atlanteans/hunters_house/hunter_i_00_pc.png' => 'tribes/atlanteans/hunters_house/hunters_house_i_00_pc.png'
=== added file 'tribes/atlanteans/ironmine/help.lua'
--- tribes/atlanteans/ironmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/ironmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Iron Ore Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "ironore",
+		_"Digs iron ore out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/atlanteans/labyrinth/help.lua'
--- tribes/atlanteans/labyrinth/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/labyrinth/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,48 @@
+-- The Atlantean Labyrinth
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("atlanteans", building_description.name)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Trains soldiers in ‘Defense’, ‘Evade’, and ‘Health’."
+			.. " " .."Equips the soldiers with all necessary weapons and armor parts.") ..
+
+	--Dependencies
+	-- We would need to parse the production programs to automate the parameters here; so we do it manually
+	-- TODO make pictures dependencies_training("atlanteans", building_description, "fulltrained-evade", "untrained+evade") ..
+
+	rt(h3(_"Defense Training:")) ..
+	dependencies_training_food("atlanteans", { {"smoked_fish", "smoked_meat"}, {"bread"}}) ..
+	dependencies_training_weapons("atlanteans", building_description, "and", 
+		{"steel_shield", "advanced_shield"}, "armorsmithy") ..
+
+	rt(h3(_"Evade Training:")) ..
+	dependencies_training_food("atlanteans", { {"smoked_fish", "smoked_meat"}}) ..
+
+	rt(h3(_"Health Training:")) ..
+	dependencies_training_food("atlanteans", { {"smoked_fish", "smoked_meat"}, {"bread"}}) ..
+	dependencies_training_weapons("atlanteans", building_description, "and", 
+		{"golden_tabard"}, "weaving-mill") ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/mill/help.lua'
--- tribes/atlanteans/mill/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/mill/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Atlantean Mill
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "cornflour",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/atlanteans/port/help.lua'
--- tribes/atlanteans/port/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/port/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,29 @@
+-- The Atlantean Port
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	-- TODO this building acts like a warehouse
+	building_help_general_string("atlanteans", building_description, "ship",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	-- TODO expedition costs here?
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/quarry/help.lua'
--- tribes/atlanteans/quarry/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/quarry/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Quarry
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "stone",
+		_"Carves stones out of rocks in the vicinity.", _"The quarry needs stones to cut within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/sawmill/help.lua'
--- tribes/atlanteans/sawmill/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/sawmill/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Sawmill
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "planks",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/scouts_house/help.lua'
--- tribes/atlanteans/scouts_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/scouts_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Scout's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "scout",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/ship/menu.png'
Binary files tribes/atlanteans/ship/menu.png	1970-01-01 00:00:00 +0000 and tribes/atlanteans/ship/menu.png	2014-05-27 14:17:43 +0000 differ
=== added file 'tribes/atlanteans/shipyard/help.lua'
--- tribes/atlanteans/shipyard/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/shipyard/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Ship Yard
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "shipwright",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/small_tower/help.lua'
--- tribes/atlanteans/small_tower/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/small_tower/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean Small Tower
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== added file 'tribes/atlanteans/smelting_works/help.lua'
--- tribes/atlanteans/smelting_works/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/smelting_works/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Smelting Works
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "iron",
+		_"Smelts iron ore into iron and gold ore into gold.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/smokery/help.lua'
--- tribes/atlanteans/smokery/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/smokery/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Smokery
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "smoked_meat",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/spiderfarm/help.lua'
--- tribes/atlanteans/spiderfarm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/spiderfarm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Spider Farm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "spideryarn",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== modified file 'tribes/atlanteans/toolsmithy/conf'
--- tribes/atlanteans/toolsmithy/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/toolsmithy/conf	2014-05-27 14:17:43 +0000
@@ -149,9 +149,9 @@
 return=skipped
 
 [idle]
-pics=toolsmith_i_??.png
+pics=toolsmithy_i_??.png
 hotspot=50 53
 
 [working]
-pics=toolsmith_i_??.png
+pics=toolsmithy_i_??.png
 hotspot=50 53

=== added file 'tribes/atlanteans/toolsmithy/help.lua'
--- tribes/atlanteans/toolsmithy/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/toolsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Toolsmithy
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "hammer",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/atlanteans/toolsmithy/toolsmith_i_00.png' => 'tribes/atlanteans/toolsmithy/toolsmithy_i_00.png'
=== renamed file 'tribes/atlanteans/toolsmithy/toolsmith_i_00_pc.png' => 'tribes/atlanteans/toolsmithy/toolsmithy_i_00_pc.png'
=== added file 'tribes/atlanteans/tower/help.lua'
--- tribes/atlanteans/tower/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/tower/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Atlantean Tower
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== added file 'tribes/atlanteans/warehouse/help.lua'
--- tribes/atlanteans/warehouse/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/warehouse/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,21 @@
+-- The Atlantean Warehouse
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "log",
+		_"Warehouses store soldiers, wares and tools.") ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description)
+   end
+}

=== modified file 'tribes/atlanteans/weaponsmithy/conf'
--- tribes/atlanteans/weaponsmithy/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/weaponsmithy/conf	2014-05-27 14:17:43 +0000
@@ -91,9 +91,9 @@
 return=skipped
 
 [idle]
-pics=weaponsmith_i_??.png  # ???
+pics=weaponsmithy_i_??.png  # ???
 hotspot=50 58
 
 [working]
-pics=weaponsmith_i_??.png  # ???
+pics=weaponsmithy_i_??.png  # ???
 hotspot=50 58

=== added file 'tribes/atlanteans/weaponsmithy/help.lua'
--- tribes/atlanteans/weaponsmithy/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/weaponsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Weapon Smithy
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "light_trident",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/atlanteans/weaponsmithy/weaponsmith_i_00.png' => 'tribes/atlanteans/weaponsmithy/weaponsmithy_i_00.png'
=== renamed file 'tribes/atlanteans/weaponsmithy/weaponsmith_i_00_pc.png' => 'tribes/atlanteans/weaponsmithy/weaponsmithy_i_00_pc.png'
=== added file 'tribes/atlanteans/weaving-mill/help.lua'
--- tribes/atlanteans/weaving-mill/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/weaving-mill/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Weaving Mill
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	-- TODO rename pictures building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("atlanteans", building_description, "spidercloth",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/atlanteans/well/help.lua'
--- tribes/atlanteans/well/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/well/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Atlantean Well
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	--General Section
+	building_help_general_string("atlanteans", building_description, "water",
+		_"Draws water out of the deep.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== modified file 'tribes/atlanteans/woodcutters_house/conf'
--- tribes/atlanteans/woodcutters_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/atlanteans/woodcutters_house/conf	2014-05-27 14:17:43 +0000
@@ -24,5 +24,5 @@
 worker=harvest
 
 [idle]
-pics=woodcutter_i_??.png
+pics=woodcutters_house_i_??.png
 hotspot=37 44

=== added file 'tribes/atlanteans/woodcutters_house/help.lua'
--- tribes/atlanteans/woodcutters_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/atlanteans/woodcutters_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Atlantean Lumberjack's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_atlanteans")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("atlanteans", building_description, _[[Text needed]],_[[Source needed]]) ..
+	--General Section
+	building_help_general_string("atlanteans", building_description, "log",
+		_"Fell trees in the surrounding area and process them into logs.",
+		_"The woodcutter's house needs trees to fell within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("atlanteans", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("atlanteans", building_description) ..
+
+	--Building Section
+	building_help_building_section("atlanteans", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/atlanteans/woodcutters_house/woodcutter_i_00.png' => 'tribes/atlanteans/woodcutters_house/woodcutters_house_i_00.png'
=== renamed file 'tribes/atlanteans/woodcutters_house/woodcutter_i_00_pc.png' => 'tribes/atlanteans/woodcutters_house/woodcutters_house_i_00_pc.png'
=== modified file 'tribes/barbarians/axfactory/help.lua'
--- tribes/barbarians/axfactory/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/axfactory/help.lua	2014-05-27 14:17:43 +0000
@@ -1,65 +1,36 @@
+-- The Barbarian Axfactory
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Axfactory")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/axfactory/axfactory_i_00.png", p(
-			_[[‘A new Warrior’s Ax brings forth the best in its wielder – or the worst in its maker.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[An old Barbarian proverb<br> meaning that you need to take some risks sometimes.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘A new warrior’s ax brings forth the best in its wielder – or the worst in its maker.’]], _[[An old Barbarian proverb<br> meaning that you need to take some risks sometimes.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"The Barbarian Axfactory is the intermediate production site in a series of three buildings. It is an upgrade from the Metal Workshop but doesn’t require additional qualification for the worker.") ..
-		rt("image=tribes/barbarians/ax/menu.png;tribes/barbarians/sharpax/menu.png;tribes/barbarians/broadax/menu.png image-align=right",p(_"It can make axes, Sharp axes and Broad axes.")) ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "ax",
+		_"Produces axes, sharp axes and broad axes.",
+		_"The barbarian axfactory is the intermediate production site in a series of three buildings. It is an upgrade from the metal workshop but doesn’t require additional qualification for the worker.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/smelting_works/menu.png","tribes/barbarians/iron/menu.png","tribes/barbarians/axfactory/menu.png"},p(_"%s from the Smelting Works":format(_"Iron"))) ..
-		dependencies({"tribes/barbarians/coalmine/menu.png;tribes/barbarians/burners_house/menu.png","tribes/barbarians/coal/menu.png","tribes/barbarians/axfactory/menu.png"}) ..
-		rt(p(_"%s from the Coal mine or the Charcoal Burner’s House":format(_"Coal"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/axfactory/menu.png","tribes/barbarians/ax/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/soldier/menu.png"},p(_"Soldier")) ..
-		dependencies({"tribes/barbarians/axfactory/menu.png","tribes/barbarians/sharpax/menu.png;tribes/barbarians/broadax/menu.png","tribes/barbarians/trainingcamp/menu.png"},p(_"Training Camp")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", _"Metal Workshop","tribes/barbarians/metalworks/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 1), 1) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 2), 2) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 2), 2) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 2), 2) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 4), 4) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 1), 1) ..
-		text_line(_"Upgradeable to:",_"War Mill","tribes/barbarians/warmill/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/blacksmith/menu.png", 1, p(_"%s or better":format(_"Blacksmith"))) ..
-		text_line(_"Worker uses:",_"Hammer","tribes/barbarians/hammer/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		dependencies({"tribes/barbarians/blacksmith/menu.png","tribes/barbarians/master-blacksmith/menu.png"}) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Blacksmith",_"Master Blacksmith","24"))) ..
+	building_help_building_section("barbarians", building_description, "metalworks", {"metalworks"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %1$s in about %2$s on average.":bformat(_"each item","57s")) ..
-		rt(p(_"All three weapons take the same time for making, but the required raw materials vary."))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce each type of ax in about %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 57):bformat(57)
+		) .. " " ..
+		_"All three weapons take the same time for making, but the required raw materials vary."
+	)
+  end
 }

=== modified file 'tribes/barbarians/bakery/help.lua'
--- tribes/barbarians/bakery/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/bakery/help.lua	2014-05-27 14:17:43 +0000
@@ -1,56 +1,34 @@
+-- The Barbarian Bakery
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Bakery")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/bakery/bakery_i_00.png", p(
-			_[[Text needed]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Source needed]])) ..
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Bake Pitta Bread for Soldiers and Miners alike.","tribes/barbarians/pittabread/menu.png") ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "pittabread",
+		_"Bakes pitta bread for soldiers and miners alike.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/farm/menu.png","tribes/barbarians/wheat/menu.png","tribes/barbarians/bakery/menu.png"},p(_"Wheat from the Farm")) ..
-		dependencies({"tribes/barbarians/well/menu.png","tribes/barbarians/water/menu.png","tribes/barbarians/bakery/menu.png"},p(_"Water from the Well")) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/bakery/menu.png","tribes/barbarians/pittabread/menu.png"},p(_"Pitta Bread")) ..
-		dependencies({"tribes/barbarians/pittabread/menu.png","tribes/barbarians/tavern/menu.png"},p(_"Tavern")) ..
-		dependencies({"tribes/barbarians/pittabread/menu.png","tribes/barbarians/inn/menu.png"},p(_"Inn")) ..
-		dependencies({"tribes/barbarians/pittabread/menu.png","tribes/barbarians/big_inn/menu.png"},p(_"Big Inn")) ..
-		dependencies({"tribes/barbarians/pittabread/menu.png","tribes/barbarians/battlearena/menu.png"},p(_"Battle Arena")) ..
-		dependencies({"tribes/barbarians/pittabread/menu.png","tribes/barbarians/trainingcamp/menu.png"},p(_"Training Camp")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 2), 2) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 2), 2) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 1), 1) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/baker/menu.png", 1, p(_"Baker")) ..
-		text_line(_"Worker uses:", _"Bread Paddle","tribes/barbarians/bread_paddle/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %1$s in %2$s on average.":bformat(_"a Pitta Bread","30s"))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce a pitta bread in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 30):bformat(30)
+	))
+  end
 }

=== modified file 'tribes/barbarians/barrier/help.lua'
--- tribes/barbarians/barrier/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/barrier/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Sentry
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== modified file 'tribes/barbarians/battlearena/help.lua'
--- tribes/barbarians/battlearena/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/battlearena/help.lua	2014-05-27 14:17:43 +0000
@@ -1,56 +1,41 @@
+-- The Barbarian Battle Arena"
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Battle Arena")) ..
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("barbarians", building_description.name)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/battlearena/battlearena_i_00.png", p(
-			_[[‘No better friend you have in battle than the enemy’s blow that misses.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Said to originate from Neidhardt, the famous trainer.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘No better friend you have in battle than the enemy’s blow that misses.’]], _[[Said to originate from Neidhardt, the famous trainer.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Trains soldiers in Evade up to level 2.") ..
-		rt(p(_[[‘Evade’ increases the soldier’s chance not to be hit by the enemy and so to remain totally unaffected.]])) ..
-		rt("_<p font-weight=bold font-decoration=underline font-size=12>Note: </p>_<p font-size=12>Barbarian soldiers cannot be trained in \"Defense\" and will remain at the level with which they came.<br><br></p>") ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Trains soldiers in ‘Evade’." .. " " .. _"‘Evade’ increases the soldier’s chance not to be hit by the enemy and so to remain totally unaffected.",
+		_"Barbarian soldiers cannot be trained in ‘Defense’ and will remain at the level with which they came.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		dependencies({"tribes/barbarians/soldier/untrained.png","tribes/barbarians/battlearena/menu.png","tribes/barbarians/soldier/untrained+evade.png"}) ..
-		dependencies({"tribes/barbarians/soldier/fulltrained-evade.png","tribes/barbarians/battlearena/menu.png","tribes/barbarians/soldier/fulltrained.png"}) ..
-		rt(h3(_"Evade Training:")) ..
-		image_line("tribes/barbarians/pittabread/menu.png",1,p(_"%s and":format(_"Pitta Bread"))) ..
-		image_line("tribes/barbarians/strongbeer/menu.png",1,p(_"%s and":format(_"Strong Beer"))) ..
-		image_line("tribes/barbarians/fish/menu.png;tribes/barbarians/meat/menu.png",1,p(_"%s or %s":format(_"Fish",_"Meat"))) ..
+	-- We would need to parse the production programs to automate the parameters here; so we do it manually
+	dependencies_training("barbarians", building_description, "untrained+evade", "fulltrained-evade") ..
+
+	rt(h3(_"Evade Training:")) ..
+	dependencies_training_food("barbarians", { {"fish", "meat"}, {"strongbeer"}, {"pittabread"}}) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Big plot","pics/big.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "gold", ngettext("%i Gold", "%i Gold", 4), 4) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 3), 3) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 6), 6) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 4), 4) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 6), 6) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "gold", ngettext("%i Gold", "%i Gold", 2), 2) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 2), 2) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 3), 3) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 3), 3) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/trainer/menu.png", 1, p(_"Trainer")) ..
-		text_line(_"Worker uses:","n/a") ..
-		text_line(_"Experience levels:", "n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, a Battle Arena can train %1$s for one soldier from 0 to the highest level in %2$s on average.":bformat(_"Evade",_"%1$im%2$is":bformat(1,10)))
+	building_help_production_section(_"If all needed wares are delivered in time, a battle arena can train evade for one soldier from 0 to the highest level in %1$s and %2$s on average.":bformat(
+		ngettext("%d minute", "%d minutes", 1):bformat(1),
+		ngettext("%d second", "%d seconds", 10):bformat(10)
+	))
+   end
 }

=== modified file 'tribes/barbarians/big_inn/help.lua'
--- tribes/barbarians/big_inn/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/big_inn/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- "The Barbarian Big Inn"
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "meal",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description, "inn", {"tavern", "inn"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
 }

=== modified file 'tribes/barbarians/brewery/help.lua'
--- tribes/barbarians/brewery/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/brewery/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Brewery
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "strongbeer",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description, "micro-brewery", {"micro-brewery"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
 }

=== renamed file 'tribes/barbarians/burners_house/burner_i_00.png' => 'tribes/barbarians/burners_house/burners_house_i_00.png'
=== modified file 'tribes/barbarians/burners_house/conf'
--- tribes/barbarians/burners_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/barbarians/burners_house/conf	2014-05-27 14:17:43 +0000
@@ -30,9 +30,9 @@
 produce=coal
 
 [idle]
-pics=burner_i_??.png  # ???
+pics=burners_house_i_??.png  # ???
 hotspot=47 54
 
 [working]
-pics=burner_i_??.png  # ???
+pics=burners_house_i_??.png  # ???
 hotspot=47 54

=== modified file 'tribes/barbarians/burners_house/help.lua'
--- tribes/barbarians/burners_house/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/burners_house/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Charcoal Burner's House
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "coal",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
 }

=== modified file 'tribes/barbarians/cattlefarm/help.lua'
--- tribes/barbarians/cattlefarm/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/cattlefarm/help.lua	2014-05-27 14:17:43 +0000
@@ -1,48 +1,34 @@
+-- The Barbarian Cattle Farm
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Cattle Farm")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/cattlefarm/cattlefarm_i_00.png", p(
-			_[[Text needed]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Source needed]])) ..
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Breed Oxen for adding them to the transportation system.","tribes/barbarians/ox/menu.png") ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "ox",
+		_"Breeds oxen for adding them to the transportation system.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/farm/menu.png","tribes/barbarians/wheat/menu.png","tribes/barbarians/cattlefarm/menu.png"},p(_"Wheat from the Farm")) ..
-		dependencies({"tribes/barbarians/well/menu.png","tribes/barbarians/water/menu.png","tribes/barbarians/cattlefarm/menu.png"},p(_"Water from the Well")) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/cattlefarm/menu.png","tribes/barbarians/ox/menu.png"},p(_"Ox")) ..
+	-- TODO: why is "Produces" empty?
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Big plot","pics/big.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/cattlebreeder/menu.png", 1, p(_"Cattle Breeder")) ..
-		text_line(_"Worker uses:", "n/a") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %1$s in %2$s on average.":bformat(_"an Ox","30s"))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce an ox in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 30):bformat(30)
+	))
+  end
 }

=== modified file 'tribes/barbarians/citadel/help.lua'
--- tribes/barbarians/citadel/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/citadel/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Citadel
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description, "fortress", {"fortress"})
+   end
 }

=== modified file 'tribes/barbarians/coalmine/help.lua'
--- tribes/barbarians/coalmine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/coalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,58 +1,35 @@
+-- The Barbarian Coal Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Coal Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/coalmine/coalmine_i_00.png", p(
-			_([[Ages ago, the Barbarians learned to delve into mountainsides for that black material that feeds their furnaces.<br>
-]] ..
-			[[Wood may serve for a household fire and to keep you warm, but when it comes to working with iron or gold, there is no way around coal.]])
-		)) ..
+	building_help_lore_string("barbarians", building_description, _[[Ages ago, the Barbarians learned to delve into mountainsides for that black material that feeds their furnaces. <br>
+Wood may serve for a household fire and to keep you warm, but when it comes to working with iron or gold, there is no way around coal.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits only %2$s of the resource. From there on out, it will only have a 5%% chance of finding %3$s.":bformat(_"Coal mine","1/3",_"Coal"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/coal/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Coal"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "coal",
+		_"Digs coal out of the ground in mountain terrain.",
+		_"This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any coal.":bformat("1/3")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/tavern/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/coalmine/menu.png"}, p(_"%s from a Tavern":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/coalmine/menu.png"}, p(_"%s from an Inn":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/coalmine/menu.png"}, p(_"%s from a Big Inn":format(_"Ration"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_coal2/resi_00.png","tribes/barbarians/coalmine/menu.png","tribes/barbarians/coal/menu.png"}, p(_"Coal")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/axfactory/menu.png"}, p(_"Axfactory")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/warmill/menu.png"}, p(_"War Mill")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/helmsmithy/menu.png"}, p(_"Helm Smithy")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/lime_kiln/menu.png"}, p(_"Lime Kiln")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:",_"Deep Coal Mine","tribes/barbarians/deep_coalmine/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Worker uses:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %1$s in %2$s on average.":bformat(_"Coal","32.5s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce coal in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 32.5):bformat(32.5)
+	))
+   end
 }

=== modified file 'tribes/barbarians/deep_coalmine/help.lua'
--- tribes/barbarians/deep_coalmine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/deep_coalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,61 +1,37 @@
+-- The Barbarian Deep Coal Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Deep Coal Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deep_coalmine/deep_coalmine_i_00.png", p(--text identical to coalmine
-			_([[Ages ago, the Barbarians learned to delve into mountainsides for that black material that feeds their furnaces.<br>
-]] ..
-			[[Wood may serve for a household fire and to keep you warm, but when it comes to working with iron or gold, there is no way around coal.]])
-		)) ..
+	--text identical to coalmine
+	building_help_lore_string("barbarians", building_description, _[[Ages ago, the Barbarians learned to delve into mountainsides for that black material that feeds their furnaces. <br>
+Wood may serve for a household fire and to keep you warm, but when it comes to working with iron or gold, there is no way around coal.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits only %2$s of the resource. From there on out, it will only have a 5%% chance of finding %3$s.":bformat(_"Deep Coal Mine","2/3",_"Coal"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/coal/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Coal"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	-- Keeping the parameters here hardcoded for the moment, too hard to get from C++.
+	building_help_general_string("barbarians", building_description, "coal",
+		_"Digs coal out of the ground in mountain terrain.",
+		_"This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any coal.":bformat("2/3")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/snack/menu.png","tribes/barbarians/deep_coalmine/menu.png"}, p(_"%s from an Inn":format(_"Snack"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/snack/menu.png","tribes/barbarians/deep_coalmine/menu.png"}, p(_"%s from a Big Inn":format(_"Snack"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_coal2/resi_00.png","tribes/barbarians/deep_coalmine/menu.png","tribes/barbarians/coal/menu.png"}, p(_"Coal")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/axfactory/menu.png"}, p(_"Axfactory")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/warmill/menu.png"}, p(_"War Mill")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/helmsmithy/menu.png"}, p(_"Helm Smithy")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/lime_kiln/menu.png"}, p(_"Lime Kiln")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:",_"Coal mine","tribes/barbarians/coalmine/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 4), 4) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 8), 8) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		text_line(_"Upgradeable to:",_"Deeper Coal Mine","tribes/barbarians/deeper_coalmine/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/chief-miner/menu.png", 1, p(_"%s or better":format(_"Chief Miner"))) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Workers use:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description, "coalmine", {"coalmine"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %1$s in %2$s on average.":bformat(_"Coal","19.5s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce coal in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 19.5):bformat(19.5)
+	))
+   end
 }

=== modified file 'tribes/barbarians/deep_goldmine/help.lua'
--- tribes/barbarians/deep_goldmine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/deep_goldmine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,56 +1,35 @@
+-- The Barbarian Deep Gold Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Deep Gold Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deep_goldmine/deep_goldmine_i_00.png", p(--text identical to goldmine
-			_[[‘Soft and supple.<br> And yet untouched by time and weather.<br> Rays of sun, wrought into eternity ...’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Excerpt from ‘Our Treasures Underground’,<br> a traditional Barbarian song.]])) ..
+	--text identical to goldmine
+	building_help_lore_string("barbarians", building_description, _[[‘Soft and supple.<br> And yet untouched by time and weather.<br> Rays of sun, wrought into eternity ...’]], _[[Excerpt from ‘Our Treasures Underground’,<br> a traditional Barbarian song.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits only %2$s of the resource. From there on out, it will only have a 5%% chance of finding %3$s.":bformat(_"Deep Gold Mine","2/3",_"Gold Ore"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/goldore/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Gold Ore"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "goldore",
+		_"Digs gold ore out of the ground in mountain terrain.",
+		_"This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any gold ore.":bformat("2/3")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/snack/menu.png","tribes/barbarians/deep_goldmine/menu.png"}, p(_"%s from an Inn":format(_"Snack"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/snack/menu.png","tribes/barbarians/deep_goldmine/menu.png"}, p(_"%s from a Big Inn":format(_"Snack"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_gold2/resi_00.png","tribes/barbarians/deep_goldmine/menu.png","tribes/barbarians/goldore/menu.png"}, p(_"Gold Ore")) ..
-		dependencies({"tribes/barbarians/goldore/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		rt(p(_"%s always goes to the %s. It has no other use.":format(_"Gold Ore",_"Smelting Works"))) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:",_"Gold Mine","tribes/barbarians/goldmine/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 4), 4) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 8), 8) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		text_line(_"Upgradeable to:",_"Deeper Gold Mine","tribes/barbarians/deeper_goldmine/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/chief-miner/menu.png", 1, p(_"%s or better":format(_"Chief Miner"))) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Workers use:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description, "goldmine", {"goldmine"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %1$s in %2$s on average.":bformat(_"Gold Ore","19.5s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce gold ore in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 19.5):bformat(19.5)
+	))
+  end
 }

=== modified file 'tribes/barbarians/deep_oremine/help.lua'
--- tribes/barbarians/deep_oremine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/deep_oremine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,56 +1,35 @@
+-- The Barbarian Deep Iron Ore Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Deep Iron Ore Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deeper_oremine/deeper_oremine_i_00.png", p(--text identical to oremine
-			_[[‘I look at my own pick wearing away day by day and I realize why my work is important.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic",_[[Quote from an anonymous miner.]])) ..
+	--text identical to oremine
+	building_help_lore_string("barbarians", building_description, _[[‘I look at my own pick wearing away day by day and I realize why my work is important.’]], _[[Quote from an anonymous miner.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits only %2$s of the resource. From there on out, it will only have a 5%% chance of finding %3$s.":bformat(_"Deep Iron Ore Mine","2/3",_"Iron Ore"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/ironore/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Iron Ore"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "ironore",
+		_"Digs iron ore out of the ground in mountain terrain.",
+		_"This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any iron ore.":bformat("2/3")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/snack/menu.png","tribes/barbarians/deep_oremine/menu.png"}, p(_"%s from an Inn":format(_"Snack"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/snack/menu.png","tribes/barbarians/deep_oremine/menu.png"}, p(_"%s from a Big Inn":format(_"Snack"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_iron2/resi_00.png","tribes/barbarians/deep_oremine/menu.png","tribes/barbarians/ironore/menu.png"}, p(_"Iron Ore")) ..
-		dependencies({"tribes/barbarians/ironore/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		rt(p(_"%s always goes to the %s. It has no other use.":format(_"Iron Ore",_"Smelting Works"))) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:",_"Iron Ore Mine","tribes/barbarians/oremine/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 4), 4) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 8), 8) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		text_line(_"Upgradeable to:",_"Deeper Iron Ore Mine","tribes/barbarians/deeper_oremine/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/chief-miner/menu.png", 1, p(_"%s or better":format(_"Chief Miner"))) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Workers use:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description, "oremine", {"oremine"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Iron Ore","39.5s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce iron ore in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 39.5):bformat(39.5)
+	))
+  end
 }

=== modified file 'tribes/barbarians/deeper_coalmine/help.lua'
--- tribes/barbarians/deeper_coalmine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/deeper_coalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,61 +1,36 @@
+-- The Barbarian Deep Coal Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Deeper Coal Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deeper_coalmine/deeper_coalmine_i_00.png", p(--text identical to coalmine
-			_([[Ages ago, the Barbarians learned to delve into mountainsides for that black material that feeds their furnaces.<br>
-]] ..
-			[[Wood may serve for a household fire and to keep you warm, but when it comes to working with iron or gold, there is no way around coal.]])
-		)) ..
+	--text identical to coalmine
+	building_help_lore_string("barbarians", building_description, _[[Ages ago, the Barbarians learned to delve into mountainsides for that black material that feeds their furnaces. <br>
+Wood may serve for a household fire and to keep you warm, but when it comes to working with iron or gold, there is no way around coal.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits all of the resource down to the deepest level. But even after having done so, it will still have a %2$s chance of finding some more %3$s.":bformat(_"Deeper Coal Mine","10%",_"Coal"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/coal/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Coal"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "coal",
+		_"Digs coal out of the ground in mountain terrain.",
+		_"This mine exploits all of the resource down to the deepest level. But even after having done so, it will still have a %s chance of finding some more coal.":bformat("10%")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/meal/menu.png","tribes/barbarians/deeper_coalmine/menu.png"}, p(_"%s from a Big Inn":format(_"Meal"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_coal2/resi_00.png","tribes/barbarians/deeper_coalmine/menu.png","tribes/barbarians/coal/menu.png"}, p(_"Coal")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/axfactory/menu.png"}, p(_"Axfactory")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/warmill/menu.png"}, p(_"War Mill")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/helmsmithy/menu.png"}, p(_"Helm Smithy")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		dependencies({"tribes/barbarians/coal/menu.png","tribes/barbarians/lime_kiln/menu.png"}, p(_"Lime Kiln")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:",_"Deep Coal Mine","tribes/barbarians/deep_coalmine/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 6), 6) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 12), 12) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 3), 3) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 6), 6) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/master-miner/menu.png", 1, p(_"%s and":format(_"Master Miner"))) ..
-		image_line("tribes/barbarians/chief-miner/menu.png", 1, p(_"%s or better and":format(_"Chief Miner"))) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Workers use:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description, "deep_coalmine", {"coalmine", "deep_coalmine"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Coal","14.4s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce coal in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 14.4):bformat(14.4)
+	))
+  end
 }

=== modified file 'tribes/barbarians/deeper_goldmine/help.lua'
--- tribes/barbarians/deeper_goldmine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/deeper_goldmine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,56 +1,35 @@
+-- The Barbarian Deeper Gold Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Deeper Gold Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deeper_goldmine/deeper_goldmine_i_00.png", p(--text identical to goldmine
-			_[[‘Soft and supple.<br> And yet untouched by time and weather.<br> Rays of sun, wrought into eternity ...’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Excerpt from ‘Our Treasures Underground’,<br> a traditional Barbarian song.]])) ..
+		--text identical to goldmine
+	building_help_lore_string("barbarians", building_description, _[[‘Soft and supple.<br> And yet untouched by time and weather.<br> Rays of sun, wrought into eternity ...’]], _[[Excerpt from ‘Our Treasures Underground’,<br> a traditional Barbarian song.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits all of the resource down to the deepest level. But even after having done so, it will still have a %2$s chance of finding some more %3$s.":bformat(_"Deeper Gold Mine","10%",_"Gold Ore"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/goldore/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Gold Ore"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "goldore",
+		_"Digs gold ore out of the ground in mountain terrain.",
+		_"This mine exploits all of the resource down to the deepest level. But even after having done so, it will still have a %s chance of finding some more gold ore.":bformat("10%")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/meal/menu.png","tribes/barbarians/deeper_goldmine/menu.png"}, p(_"%s from a Big Inn":format(_"Meal"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_gold2/resi_00.png","tribes/barbarians/deeper_goldmine/menu.png","tribes/barbarians/goldore/menu.png"}, p(_"Gold Ore")) ..
-		dependencies({"tribes/barbarians/goldore/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		rt(p(_"%s always goes to the %s. It has no other use.":format(_"Gold Ore",_"Smelting Works"))) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:",_"Deep Gold Mine","tribes/barbarians/deep_goldmine/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 6), 6) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 12), 12) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 3), 3) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 6), 6) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/master-miner/menu.png", 1, p(_"%s and":format(_"Master Miner"))) ..
-		image_line("tribes/barbarians/chief-miner/menu.png", 1, p(_"%s or better and":format(_"Chief Miner"))) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Workers use:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description, "deep_goldmine", {"goldmine", "deep_goldmine"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Gold Ore","18.5s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce gold ore in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 18.5):bformat(18.5)
+	))
+  end
 }

=== modified file 'tribes/barbarians/deeper_oremine/help.lua'
--- tribes/barbarians/deeper_oremine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/deeper_oremine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,56 +1,35 @@
+-- The Barbarian Deeper Iron Ore Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Deeper Iron Ore Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deeper_oremine/deeper_oremine_i_00.png", p(--text identical to oremine
-			_[[‘I look at my own pick wearing away day by day and I realize why my work is important.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic",_[[Quote from an anonymous miner.]])) ..
+	--text identical to oremine
+	building_help_lore_string("barbarians", building_description, _[[‘I look at my own pick wearing away day by day and I realize why my work is important.’]], _[[Quote from an anonymous miner.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits all of the resource down to the deepest level. But even after having done so, it will still have a %2$s chance of finding some more %3$s.":bformat(_"Deeper Iron Ore Mine","10%",_"Iron Ore"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/ironore/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Iron Ore"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "ironore",
+		_"Digs iron ore out of the ground in mountain terrain.",
+		_"This mine exploits all of the resource down to the deepest level. But even after having done so, it will still have a %s chance of finding some more iron ore.":bformat("10%")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/meal/menu.png","tribes/barbarians/deeper_oremine/menu.png"}, p(_"%s from a Big Inn":format(_"Meal"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_iron2/resi_00.png","tribes/barbarians/deeper_oremine/menu.png","tribes/barbarians/ironore/menu.png"}, p(_"Iron Ore")) ..
-		dependencies({"tribes/barbarians/ironore/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		rt(p(_"%s always goes to the %s. It has no other use.":format(_"Iron Ore",_"Smelting Works"))) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:",_"Deep Iron Ore Mine","tribes/barbarians/deep_oremine/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 6), 6) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 12), 12) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 3), 3) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 6), 6) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/master-miner/menu.png", 1, p(_"%s and":format(_"Master Miner"))) ..
-		image_line("tribes/barbarians/chief-miner/menu.png", 1, p(_"%s or better and":format(_"Chief Miner"))) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Workers use:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description, "deep_oremine", {"oremine", "deep_oremine"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Iron Ore","17.6s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce iron ore in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 17.6):bformat(17.6)
+	))
+  end
 }

=== modified file 'tribes/barbarians/donjon/help.lua'
--- tribes/barbarians/donjon/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/donjon/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Donjon
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== modified file 'tribes/barbarians/farm/help.lua'
--- tribes/barbarians/farm/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/farm/help.lua	2014-05-27 14:17:43 +0000
@@ -1,51 +1,31 @@
+-- The Barbarian Farm
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Farm")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/farm/farm_i_00.png", p(
-			_[[Text needed]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Source needed]])) ..
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Sow and harvest wheat.","tribes/barbarians/wheat/menu.png") ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "wheat",
+		_"Sow and harvest wheat.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		text_line(_"Incoming:", "n/a") ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/farm/menu.png","tribes/barbarians/wheat/menu.png"},p(_"Wheat")) ..
-		dependencies({"tribes/barbarians/wheat/menu.png","tribes/barbarians/bakery/menu.png"},p(_"Bakery")) ..
-		dependencies({"tribes/barbarians/wheat/menu.png","tribes/barbarians/micro-brewery/menu.png"},p(_"Micro Brewery")) ..
-		dependencies({"tribes/barbarians/wheat/menu.png","tribes/barbarians/brewery/menu.png"},p(_"Brewery")) ..
-		dependencies({"tribes/barbarians/wheat/menu.png","tribes/barbarians/cattlefarm/menu.png"},p(_"Cattle Farm")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Big plot","pics/big.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 3), 3) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/farmer/menu.png", 1, p(_"Farmer")) ..
-		text_line(_"Worker uses:", _"Scythe","tribes/barbarians/scythe/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"Calculation needed")
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/fishers_hut/conf'
--- tribes/barbarians/fishers_hut/conf	2014-03-17 17:23:26 +0000
+++ tribes/barbarians/fishers_hut/conf	2014-05-27 14:17:43 +0000
@@ -22,5 +22,5 @@
 worker=fish
 
 [idle]
-pics=fisher_i_??.png  # ???
+pics=fishers_hut_i_??.png  # ???
 hotspot=39 40

=== renamed file 'tribes/barbarians/fishers_hut/fisher_i_00.png' => 'tribes/barbarians/fishers_hut/fishers_hut_i_00.png'
=== modified file 'tribes/barbarians/fishers_hut/help.lua'
--- tribes/barbarians/fishers_hut/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/fishers_hut/help.lua	2014-05-27 14:17:43 +0000
@@ -1,50 +1,34 @@
+-- The Barbarian Fisher's Hut
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Fisher's Hut")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/fishers_hut/fisher_i_00.png", p(
-			_[[‘What do you mean, my fish ain’t fresh?!’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Source needed]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘What do you mean, my fish ain’t fresh?!’]], _[[Source needed]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(h2(_"Purpose:")) ..
-		image_line("tribes/barbarians/fish/menu.png",1,p(_"Fishes on the coast near the hut.")) ..
-		text_line(_"Working radius:", "7") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "fish",
+		_"Fishes on the coast near the hut.",
+		_"The fisher’s hut needs water full of fish within the working radius.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(p(_"The Fisher’s Hut needs water full of fish in the vicinity.")) ..
-		text_line(_"Incoming:", "n/a") ..
-		rt(h2(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/fishers_hut/menu.png","tribes/barbarians/fish/menu.png"},p(_"Fish")) ..
-		dependencies({"tribes/barbarians/fish/menu.png","tribes/barbarians/battlearena/menu.png"},p(_"Battle Arena")) ..
-		dependencies({"tribes/barbarians/fish/menu.png","tribes/barbarians/trainingcamp/menu.png"},p(_"Training Camp")) ..
-		dependencies({"tribes/barbarians/fish/menu.png","tribes/barbarians/tavern/menu.png"},p(_"Tavern")) ..
-		dependencies({"tribes/barbarians/fish/menu.png","tribes/barbarians/inn/menu.png"},p(_"Inn")) ..
-		dependencies({"tribes/barbarians/fish/menu.png","tribes/barbarians/big_inn/menu.png"},p(_"Big Inn")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/fisher/menu.png", 1, p(_"Fisher")) ..
-		text_line(_"Worker uses:",_"Fishing Rod","tribes/barbarians/fishing_rod/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The fisher pauses 18s before going to work again.")
+	building_help_production_section(_"The fisher pauses %s before going to work again.":bformat(
+		ngettext("%d second", "%d seconds", 18):bformat(18)
+	))
+   end
 }

=== modified file 'tribes/barbarians/fortress/help.lua'
--- tribes/barbarians/fortress/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/fortress/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Fortress
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== modified file 'tribes/barbarians/gamekeepers_hut/help.lua'
--- tribes/barbarians/gamekeepers_hut/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/gamekeepers_hut/help.lua	2014-05-27 14:17:43 +0000
@@ -1,44 +1,34 @@
+-- The Barbarian Gamekeeper's Hut
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Gamekeeper's Hut")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/gamekeepers_hut/gamekeeper_i_00.png", p(
-			_[[‘He loves the animals and to breed them<br>as we love to cook and eat them.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Barbarian nursery rhyme]])) ..
+--	building_help_lore_string("barbarians", building_description, _[[‘He loves the animals and to breed them<br>
+--as we love to cook and eat them.’]],_[[Barbarian nursery rhyme]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Releases animals into the wild to steady the meat production.") ..
-		text_line(_"Working radius:", "3") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "meat",
+		_"Releases animals into the wild to steady the meat production.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		text_line(_"Incoming:", "n/a") ..
-		text_line(_"Outgoing:","n/a") ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/gamekeeper/menu.png", 1, p(_"Gamekeeper")) ..
-		text_line(_"Worker uses:","n/a") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The gamekeeper pauses 52.5s before going to work again.")
+	building_help_production_section(_"The gamekeeper pauses %s before going to work again.":bformat(
+		ngettext("%d second", "%d seconds", 52.5):bformat(52.5)
+	))
+   end
 }

=== modified file 'tribes/barbarians/goldmine/help.lua'
--- tribes/barbarians/goldmine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/goldmine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,53 +1,34 @@
+-- "The Barbarian Gold Mine"
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Gold Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/goldmine/goldmine_i_00.png", p(
-			_[[‘Soft and supple.<br> And yet untouched by time and weather.<br> Rays of sun, wrought into eternity ...’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Excerpt from ‘Our Treasures Underground’,<br> a traditional Barbarian song.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘Soft and supple.<br> And yet untouched by time and weather.<br> Rays of sun, wrought into eternity ...’]], _[[Excerpt from ‘Our Treasures Underground’,<br> a traditional Barbarian song.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits only %2$s of the resource. From there on out, it will only have a 5%% chance of finding %3$s.":bformat(_"Gold Mine","1/3",_"Gold Ore"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/goldore/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Gold Ore"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "goldore",
+		_"Digs gold ore out of the ground in mountain terrain.",
+		_"This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any gold ore.":bformat("1/3")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/tavern/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/goldmine/menu.png"}, p(_"%s from a Tavern":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/goldmine/menu.png"}, p(_"%s from an Inn":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/goldmine/menu.png"}, p(_"%s from a Big Inn":format(_"Ration"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_gold2/resi_00.png","tribes/barbarians/goldmine/menu.png","tribes/barbarians/goldore/menu.png"}, p(_"Gold Ore")) ..
-		dependencies({"tribes/barbarians/goldore/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		rt(p(_"%s always goes to the %s. It has no other use.":format(_"Gold Ore",_"Smelting Works"))) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:",_"Deep Gold Mine","tribes/barbarians/deep_goldmine/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Worker uses:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Gold Ore","65s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce gold ore in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 65):bformat(65)
+	))
+  end
 }

=== modified file 'tribes/barbarians/granitemine/help.lua'
--- tribes/barbarians/granitemine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/granitemine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,53 +1,34 @@
+-- The Barbarian Granite Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Granite Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/granitemine/granitemine_i_00.png", p(
-			_[[‘I can handle tons of granite, man, but no more of your vain prattle.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[This phrase was the reply Rimbert the miner – later known as Rimbert the loner – gave, when he was asked to remain seated on an emergency meeting at Stonford in the year of the great flood. <br> The same man had all the 244 granite blocks ready only a week later, and they still fortify the city’s levee.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘I can handle tons of granite, man, but no more of your vain prattle.’]], _[[This phrase was the reply Rimbert the miner – later known as Rimbert the loner – gave, when he was asked to remain seated on an emergency meeting at Stonford in the year of the great flood. <br> The same man had all the 244 granite blocks ready only a week later, and they still fortify the city’s levee.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"A %1$s exploits all of the resource down to the deepest level. But even after having done so, it will still have a %2$s chance of finding some more %3$s.":bformat(_"Granite Mine","5%",_"Raw Stone") .. _" It cannot be upgraded.")) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/raw_stone/menu.png", 1, p(_"Carve %s out of the rock in mountain terrain.":format(_"Raw Stone"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "raw_stone",
+		_"Carve raw stone out of the rock in mountain terrain.",
+		_"This mine exploits all of the resource down to the deepest level. But even after having done so, it will still have a %s chance of finding some more raw stone.":bformat("5%") .. "<br>" .. _"It cannot be upgraded.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/tavern/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/granitemine/menu.png"}, p(_"%s from a Tavern":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/granitemine/menu.png"}, p(_"%s from an Inn":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/granitemine/menu.png"}, p(_"%s from a Big Inn":format(_"Ration"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_granit2/resi_00.png","tribes/barbarians/granitemine/menu.png","tribes/barbarians/raw_stone/menu.png"}, p(_"Raw Stone")) ..
-		dependencies({"tribes/barbarians/raw_stone/menu.png","tribes/barbarians/constructionsite/menu.png"},p(_"Construction Site")) ..
-		dependencies({"tribes/barbarians/raw_stone/menu.png","tribes/barbarians/lime_kiln/menu.png"}, p(_"Lime Kiln")) ..
+	building_help_dependencies_production("barbarians", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Worker uses:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Raw Stone","20s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce raw stone in %s on average.":format(
+		ngettext("%d second", "%d seconds", 20):bformat(20)
+	))
+  end
 }

=== modified file 'tribes/barbarians/hardener/help.lua'
--- tribes/barbarians/hardener/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/hardener/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Wood Hardener
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "blackwood",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/headquarters/help.lua'
--- tribes/barbarians/headquarters/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/headquarters/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Headquarters
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "carrier",
+		_"Accomodation for your people. Also stores your wares and tools.",
+		_"The headquarters is your main building." .. "<br>" .. _[[Text needed]]) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== modified file 'tribes/barbarians/headquarters_interim/help.lua'
--- tribes/barbarians/headquarters_interim/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/headquarters_interim/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Interim Headquarters
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "carrier",
+		_"Accomodation for your people. Also stores your wares and tools.",
+		_"The headquarters is your main building." .. "<br>" .. _[[Text needed]]) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== modified file 'tribes/barbarians/helmsmithy/help.lua'
--- tribes/barbarians/helmsmithy/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/helmsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Helm Smithy
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "helm",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/hunters_hut/conf'
--- tribes/barbarians/hunters_hut/conf	2014-03-17 17:23:26 +0000
+++ tribes/barbarians/hunters_hut/conf	2014-05-27 14:17:43 +0000
@@ -23,5 +23,5 @@
 worker=hunt
 
 [idle]
-pics=hunter_i_??.png
+pics=hunters_hut_i_??.png
 hotspot=45 40

=== modified file 'tribes/barbarians/hunters_hut/help.lua'
--- tribes/barbarians/hunters_hut/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/hunters_hut/help.lua	2014-05-27 14:17:43 +0000
@@ -1,52 +1,34 @@
+-- The Barbarian Hunter's Hut
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Hunter's Hut")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/hunters_hut/hunter_i_00.png", p(
-			_[[‘As silent as a panther,<br> as deft as a weasel,<br> as swift as an arrow,<br> as deadly as a viper.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[‘The Art of Hunting’]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘As silent as a panther,<br> as deft as a weasel,<br> as swift as an arrow,<br> as deadly as a viper.’]], _[[‘The Art of Hunting’]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/meat/menu.png",1,p(_"Hunt animals to produce meat.")) ..
-		text_line(_"Working radius:", "13") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "meat",
+		_"Hunts animals to produce meat.",
+		_"The hunter’s hut needs animals to hunt within the working radius.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(p(_"The Hunter’s Hut needs animals in the vicinity to hunt.")) ..
-		text_line(_"Incoming:", "n/a") ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/hunters_hut/menu.png","tribes/barbarians/meat/menu.png"},p(_"Meat")) ..
-		dependencies({"tribes/barbarians/meat/menu.png","tribes/barbarians/battlearena/menu.png"},p(_"Battle Arena")) ..
-		dependencies({"tribes/barbarians/meat/menu.png","tribes/barbarians/trainingcamp/menu.png"},p(_"Training Camp")) ..
-		dependencies({"tribes/barbarians/meat/menu.png","tribes/barbarians/tavern/menu.png"},p(_"Tavern")) ..
-		dependencies({"tribes/barbarians/meat/menu.png","tribes/barbarians/inn/menu.png"},p(_"Inn")) ..
-		dependencies({"tribes/barbarians/meat/menu.png","tribes/barbarians/big_inn/menu.png"},p(_"Big Inn")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/hunter/menu.png", 1, p(_"Hunter")) ..
-		text_line(_"Worker uses:",_"Hunting Spear","tribes/barbarians/hunting_spear/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The hunter pauses 35s before going to work again.")
+	building_help_production_section(_"The hunter pauses %s before going to work again.":bformat(
+		ngettext("%d second", "%d seconds", 35):bformat(35)
+	))
+   end
 }

=== renamed file 'tribes/barbarians/hunters_hut/hunter_i_00.png' => 'tribes/barbarians/hunters_hut/hunters_hut_i_00.png'
=== modified file 'tribes/barbarians/inn/help.lua'
--- tribes/barbarians/inn/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/inn/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Inn
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "snack",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description, "tavern", {"tavern"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
 }

=== modified file 'tribes/barbarians/lime_kiln/conf'
--- tribes/barbarians/lime_kiln/conf	2014-03-17 17:23:26 +0000
+++ tribes/barbarians/lime_kiln/conf	2014-05-27 14:17:43 +0000
@@ -29,9 +29,9 @@
 produce=grout:2
 
 [idle]
-pics=stonegrinder_i_??.png  # ???
+pics=lime_kiln_i_??.png  # ???
 hotspot=45 53
 
 [working]
-pics=stonegrinder_i_??.png  # ???
+pics=lime_kiln_i_??.png  # ???
 hotspot=45 53

=== modified file 'tribes/barbarians/lime_kiln/help.lua'
--- tribes/barbarians/lime_kiln/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/lime_kiln/help.lua	2014-05-27 14:17:43 +0000
@@ -1,55 +1,34 @@
+-- The Barbarian Lime Kiln
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Lime Kiln")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/lime_kiln/stonegrinder_i_00.png", p(
-			_[[‘Forming new stone from old with fire and water.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Ragnald the Child’s answer to the question, what he’s doing in the dirt. His ‘new stone’ now is an important building material.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘Forming new stone from old with fire and water.’]], _[[Ragnald the Child’s answer to the question, what he’s doing in the dirt. His ‘new stone’ now is an important building material.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _[[The Lime Kiln processes Raw Stones to make ‘Grout’, a substance that solidifies and so reinforces masonry.]],"tribes/barbarians/grout/menu.png") ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "grout",
+		_[[The Lime Kiln processes Raw Stones to make ‘Grout’, a substance that solidifies and so reinforces masonry.]],
+		_"The Lime Kiln’s output will only go to construction sites that need it. Those are predominantly houses that work with fire, and some military sites.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/granitemine/menu.png;tribes/barbarians/quarry/menu.png","tribes/barbarians/raw_stone/menu.png","tribes/barbarians/lime_kiln/menu.png"}) ..
-		rt(p(_"Raw Stone from the Granite Mine or Quarry")) ..
-		dependencies({"tribes/barbarians/coalmine/menu.png;tribes/barbarians/burners_house/menu.png","tribes/barbarians/coal/menu.png","tribes/barbarians/axfactory/menu.png"}) ..
-		rt(p(_"%s from the Coal mine or the Charcoal Burner’s House":format(_"Coal"))) ..
-		dependencies({"tribes/barbarians/well/menu.png","tribes/barbarians/water/menu.png","tribes/barbarians/lime_kiln/menu.png"},p(_"Water from the Well")) ..
-		--rt() ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/lime_kiln/menu.png","tribes/barbarians/grout/menu.png"},p(_"Grout")) ..
-		dependencies({"tribes/barbarians/grout/menu.png","tribes/barbarians/constructionsite/menu.png"},p(_"Construction Site")) ..
-		rt(p(_"The Lime Kiln’s output will only go to construction sites that need it. Those are predominantly houses that work with fire, and some military sites.")) ..
+	building_help_dependencies_production("barbarians", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/lime-burner/menu.png", 1, p(_"Lime-Burner")) ..
-		text_line(_"Worker uses:", "n/a") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %1$s in about %2$s on average.":bformat(_"Grout","41s"))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce grout in about %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 41):bformat(41)
+	))
+   end
 }

=== renamed file 'tribes/barbarians/lime_kiln/stonegrinder_i_00.png' => 'tribes/barbarians/lime_kiln/lime_kiln_i_00.png'
=== modified file 'tribes/barbarians/lumberjacks_hut/help.lua'
--- tribes/barbarians/lumberjacks_hut/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/lumberjacks_hut/help.lua	2014-05-27 14:17:43 +0000
@@ -1,49 +1,33 @@
+-- The Barbarian Lumberjack's Hut
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Lumberjack's Hut")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/lumberjacks_hut/lumberjacks_hut_i_00.png", p(
-			_[[‘Take 200 hits to fell a tree and you’re a baby. Take 100 and you’re a soldier. Take 50 and you’re a hero. Take 20 and soon you will be a honorable lumberjack.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Krumta, carpenter of Chat’Karuth]])) ..
+	building_help_lore_string("barbarians", building_description, _[["Take 200 hits to fell a tree and you're a baby. Take 100 and you're a soldier. Take 50 and you're a hero. Take 20 and soon you will be a honorable lumberjack."]],_[[Krumta, carpenter of Chat'Karuth]]) ..
 	--General Section
-		rt(h2(_"General")) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/log/menu.png",1,p(_"Fell trees in the surrounding area and process them into logs.")) ..
-		text_line(_"Working radius:", "10") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "log",
+		_"Fell trees in the surrounding area and process them into logs.",
+		_"The lumberjack's hut needs trees to fell within the working radius.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(p(_"The Lumberjack’s Hut needs trees in the immediate vicinity to fell.")) ..
-		text_line(_"Incoming:", "n/a") ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/lumberjacks_hut/menu.png","tribes/barbarians/log/menu.png"},p(_"Log")) ..
-		dependencies({"tribes/barbarians/log/menu.png","tribes/barbarians/constructionsite/menu.png"},p(_"Construction Site")) ..
-		dependencies({"tribes/barbarians/log/menu.png","tribes/barbarians/burners_house/menu.png"},p(_"Charcoal Burner’s House")) ..
-		dependencies({"tribes/barbarians/log/menu.png","tribes/barbarians/metalworks/menu.png"},p(_"Metal Workshop")) ..
-		dependencies({"tribes/barbarians/log/menu.png","tribes/barbarians/hardener/menu.png"},p(_"Wood Hardener")) ..
+	building_help_dependencies_production("barbarians", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 3), 3) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/lumberjack/menu.png", 1, p(_"Lumberjack")) ..
-		text_line(_"Worker uses:",_"Felling Ax","tribes/barbarians/felling_ax/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The Lumberjack needs %s to fell a tree, not counting the time he needs to reach the destination and go home again.":format("12s"))
+	building_help_production_section(_"The lumberjack needs %s to fell a tree, not counting the time he needs to reach the destination and go home again.":format(
+		ngettext("%d second", "%d seconds", 12):bformat(12)
+	))
+   end
 }

=== modified file 'tribes/barbarians/metalworks/help.lua'
--- tribes/barbarians/metalworks/help.lua	2014-04-08 06:27:03 +0000
+++ tribes/barbarians/metalworks/help.lua	2014-05-27 14:17:43 +0000
@@ -1,71 +1,34 @@
+-- The Barbarian Metal Workshop
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Metal Workshop")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/metalworks/metalworks_i_00.png", p(
-			_[[‘We make it work!’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Inscription on the threshold of the now ruined Olde Forge at Harradsheim, the eldest known smithy.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘We make it work!’]], _[[Inscription on the threshold of the now ruined Olde Forge at Harradsheim, the eldest known smithy.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"The Barbarian Metal Workshop is the basic production site in a series of three buildings and creates all the tools that Barbarians need. The others are for weapons.") ..
-		rt("image=tribes/barbarians/bread_paddle/menu.png;tribes/barbarians/felling_ax/menu.png;tribes/barbarians/fire_tongs/menu.png;tribes/barbarians/fishing_rod/menu.png;tribes/barbarians/hammer/menu.png;tribes/barbarians/hunting_spear/menu.png;tribes/barbarians/kitchen_tools/menu.png;tribes/barbarians/pick/menu.png;tribes/barbarians/scythe/menu.png;tribes/barbarians/shovel/menu.png image-align=right",p("")) ..
-		rt(p(_"It can make Bread Paddles, Felling Axes, Fire Tongs, Fishing Rods, Hammers, Hunting Spears, Kitchen Tools, Picks, Scythes and Shovels.")) ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "hammer",
+		_"The barbarian metal workshop can make bread paddles, felling axes, fire tongs, fishing rods, hammers, hunting spears, kitchen tools, picks, scythes and shovels.",
+		_"The barbarian metal workshop is the basic production site in a series of three buildings and creates all the tools that barbarians need. The others are for weapons.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/smelting_works/menu.png","tribes/barbarians/iron/menu.png","tribes/barbarians/metalworks/menu.png"},p(_"%s from the Smelting Works":format(_"Iron"))) ..
-		dependencies({"tribes/barbarians/lumberjacks_hut/menu.png","tribes/barbarians/log/menu.png","tribes/barbarians/metalworks/menu.png"},p(_"%s from the Lumberjack’s hut":format(_"Log"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/bread_paddle/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/baker/menu.png" },p(_"Baker")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/felling_ax/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/lumberjack/menu.png" },p(_"Lumberjack")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/fire_tongs/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/smelter/menu.png" },p(_"Smelter")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/fishing_rod/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/fisher/menu.png" },p(_"Fisher")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/hammer/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/builder/menu.png" },p(_"Builder")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/hammer/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/geologist/menu.png" },p(_"Geologist")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/hammer/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/helmsmith/menu.png" },p(_"Helmsmith")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/hammer/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/blacksmith/menu.png" },p(_"Blacksmith")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/hunting_spear/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/hunter/menu.png" },p(_"Hunter")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/kitchen_tools/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/innkeeper/menu.png" },p(_"Innkeeper")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/pick/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/miner/menu.png" },p(_"Miner")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/pick/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/stonemason/menu.png" },p(_"Stonemason")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/scythe/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/farmer/menu.png" },p(_"Farmer")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/shovel/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/ranger/menu.png" },p(_"Ranger")) ..
-		dependencies({"tribes/barbarians/metalworks/menu.png","tribes/barbarians/shovel/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/gardener/menu.png" },p(_"Gardener")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", _"n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 1), 1) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 1), 1) ..
-		text_line(_"Upgradeable to:",_"Axfactory","tribes/barbarians/axfactory/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/blacksmith/menu.png", 1, p(_"%s or better":format(_"Blacksmith"))) ..
-		text_line(_"Worker uses:",_"Hammer","tribes/barbarians/hammer/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		dependencies({"tribes/barbarians/blacksmith/menu.png","tribes/barbarians/master-blacksmith/menu.png"}) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Blacksmith",_"Master Blacksmith","24"))) ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %1$s in about %2$s on average.":bformat(_"each item", "67s"))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce each tool in about %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 67):bformat(67)
+	))
+   end
 }

=== modified file 'tribes/barbarians/micro-brewery/help.lua'
--- tribes/barbarians/micro-brewery/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/micro-brewery/help.lua	2014-05-27 14:17:43 +0000
@@ -1,54 +1,33 @@
+-- The Barbarian Micro Brewery
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Micro Brewery")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/micro-brewery/micro-brewery_i_00.png", p(
-			_[[‘Let the first one drive away the hunger, the second one put you at ease; when you have swallowed up your third one, it’s time for the next shift!’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Widespread toast among Miners]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘Let the first one drive away the hunger, the second one put you at ease; when you have swallowed up your third one, it’s time for the next shift!’]], _[[Widespread toast among Miners]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"The Micro Brewery produces Beer of the lower grade. This beer is a vital component of the Snacks that Inns and Big Inns prepare for Miners in Deep Mines.","tribes/barbarians/beer/menu.png") ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "beer",
+		_"The micro brewery produces Beer of the lower grade. This beer is a vital component of the snacks that inns and big inns prepare for miners in deep mines.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/well/menu.png","tribes/barbarians/water/menu.png","tribes/barbarians/micro-brewery/menu.png"},p(_"Water from the Well")) ..
-		dependencies({"tribes/barbarians/farm/menu.png","tribes/barbarians/wheat/menu.png","tribes/barbarians/micro-brewery/menu.png"},p(_"Wheat from the Farm")) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/micro-brewery/menu.png","tribes/barbarians/beer/menu.png"},p(_"Beer")) ..
-		dependencies({"tribes/barbarians/beer/menu.png","tribes/barbarians/inn/menu.png"},p(_"Inn")) ..
-		dependencies({"tribes/barbarians/beer/menu.png","tribes/barbarians/big_inn/menu.png"},p(_"Big Inn")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 2), 2) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 2), 2) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 3), 3) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 3), 3) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:",_"Brewery","tribes/barbarians/brewery/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/brewer/menu.png", 1, p(_"Brewer")) ..
-		text_line(_"Workers use:","n/a") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Brewer",_"Master Brewer","19"))) ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %s in about %s on average.":format(_"Beer","60s"))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce beer in about %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 60):bformat(60)
+	))
+  end
 }

=== modified file 'tribes/barbarians/oremine/help.lua'
--- tribes/barbarians/oremine/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/oremine/help.lua	2014-05-27 14:17:43 +0000
@@ -1,53 +1,34 @@
+-- The Barbarian Iron Ore Mine
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Iron Ore Mine")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/deeper_oremine/deeper_oremine_i_00.png", p(
-			_[[‘I look at my own pick wearing away day by day and I realize why my work is important.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic",_[[Quote from an anonymous miner.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘I look at my own pick wearing away day by day and I realize why my work is important.’]], _[[Quote from an anonymous miner.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(p(_"An %1$s exploits only %2$s of the resource. From there on out, it will only have a 5%% chance of finding %3$s.":bformat(_"Iron Ore Mine","1/3",_"Iron Ore"))) ..
-		rt(h3(_"Purpose:")) ..
-		image_line("tribes/barbarians/ironore/menu.png", 1, p(_"Dig %s out of the ground in mountain terrain.":format(_"Iron Ore"))) ..
-		text_line(_"Working radius:", "2") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "ironore",
+		_"Digs iron ore out of the ground in mountain terrain.",
+		_"This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any iron ore.":bformat("1/3")) ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/tavern/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/oremine/menu.png"}, p(_"%s from a Tavern":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/oremine/menu.png"}, p(_"%s from an Inn":format(_"Ration"))) ..
-		dependencies({"tribes/barbarians/big_inn/menu.png","tribes/barbarians/ration/menu.png","tribes/barbarians/oremine/menu.png"}, p(_"%s from a Big Inn":format(_"Ration"))) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_iron2/resi_00.png","tribes/barbarians/oremine/menu.png","tribes/barbarians/ironore/menu.png"}, p(_"Iron Ore")) ..
-		dependencies({"tribes/barbarians/ironore/menu.png","tribes/barbarians/smelting_works/menu.png"}, p(_"Smelting Works")) ..
-		rt(p(_"%s always goes to the %s. It has no other use.":format(_"Iron Ore",_"Smelting Works"))) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Mine plot","pics/mine.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:",_"Deep Iron Ore Mine","tribes/barbarians/deep_oremine/menu.png") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/miner/menu.png", 1, p(_"%s or better":format(_"Miner"))) ..
-		text_line(_"Worker uses:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Miner",_"Chief Miner","19") .. "<br>" .. _"%s to %s (%s EP)":format(_"Chief Miner",_"Master Miner","28"))) ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If the food supply is steady, this mine can produce %s in %s on average.":format(_"Iron Ore","65s"))
+	building_help_production_section(_"If the food supply is steady, this mine can produce iron ore in %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 65):bformat(65)
+	))
+  end
 }

=== modified file 'tribes/barbarians/port/help.lua'
--- tribes/barbarians/port/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/port/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,29 @@
+-- The Barbarian Port
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	-- TODO this building acts like a warehouse
+	building_help_general_string("barbarians", building_description, "ship",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	-- TODO expedition costs here?
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/quarry/conf'
--- tribes/barbarians/quarry/conf	2014-03-15 11:29:32 +0000
+++ tribes/barbarians/quarry/conf	2014-05-27 14:17:43 +0000
@@ -22,9 +22,9 @@
 worker=cut
 
 [idle]
-pics=b_quarry_i_??.png  # ???
+pics=quarry_i_??.png  # ???
 hotspot=45 40
 
 [build]
-pics=b_quarry_b_??.png  # ???
+pics=quarry_b_??.png  # ???
 hotspot=44 36

=== modified file 'tribes/barbarians/quarry/help.lua'
--- tribes/barbarians/quarry/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/quarry/help.lua	2014-05-27 14:17:43 +0000
@@ -1,47 +1,33 @@
+-- The Barbarian Quarry
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Quarry")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/quarry/b_quarry_i_00.png", p(
-			_[[Text needed]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Source needed]])) ..
+	building_help_lore_string("barbarians", building_description, _[[Text needed]],_[[Source needed]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		rt(h2(_"Purpose:")) ..
-		image_line("tribes/barbarians/raw_stone/menu.png",1,p(_"Carve %s out of stones lying near the hut.":format(_"Raw Stone"))) ..
-		text_line(_"Working radius:", "6") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "raw_stone",
+		_"Carves raw stone out of rocks in the vicinity.", _"The quarry needs stones to cut within the working radius.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(p(_"The Quarry needs stones in the vicinity.")) ..
-		text_line(_"Incoming:", "n/a") ..
-		rt(h2(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/quarry/menu.png","tribes/barbarians/raw_stone/menu.png"},p(_"Raw Stone")) ..
-		dependencies({"tribes/barbarians/raw_stone/menu.png","tribes/barbarians/constructionsite/menu.png"},p(_"Construction Site")) ..
-		dependencies({"tribes/barbarians/raw_stone/menu.png","tribes/barbarians/lime_kiln/menu.png"}, p(_"Lime Kiln")) ..
+	building_help_dependencies_production("barbarians", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/stonemason/menu.png", 1, p(_"Stonemason")) ..
-		text_line(_"Worker uses:",_"Pick","tribes/barbarians/pick/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The stonemason pauses 25s before going to work again.")
+	building_help_production_section(_"The stonemason pauses %s before going back to work again.":bformat(
+		ngettext("%d second", "%d seconds", 65):bformat(65)
+	))
+   end
 }

=== renamed file 'tribes/barbarians/quarry/b_quarry_b_00.png' => 'tribes/barbarians/quarry/quarry_b_00.png'
=== renamed file 'tribes/barbarians/quarry/b_quarry_b_01.png' => 'tribes/barbarians/quarry/quarry_b_01.png'
=== renamed file 'tribes/barbarians/quarry/b_quarry_i_00.png' => 'tribes/barbarians/quarry/quarry_i_00.png'
=== modified file 'tribes/barbarians/rangers_hut/conf'
--- tribes/barbarians/rangers_hut/conf	2014-03-15 11:29:32 +0000
+++ tribes/barbarians/rangers_hut/conf	2014-05-27 14:17:43 +0000
@@ -21,9 +21,9 @@
 worker=plant
 
 [idle]
-pics=b_ranger_i_??.png  # ???
+pics=rangers_hut_i_??.png  # ???
 hotspot=43 40
 
 [build]
-pics=b_ranger_b_??.png  # ???
+pics=rangers_hut_b_??.png  # ???
 hotspot=40 33

=== modified file 'tribes/barbarians/rangers_hut/help.lua'
--- tribes/barbarians/rangers_hut/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/rangers_hut/help.lua	2014-05-27 14:17:43 +0000
@@ -1,44 +1,35 @@
+-- The Barbarian Ranger's Hut
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Ranger's Hut")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/rangers_hut/b_ranger_i_00.png", p(
-			--"Wer zwei Halme dort wachsen lässt, wo sonst nur einer wächst, der ist größer als der größte Feldherr!" – Friedrich der Große
-			_[[‘He who can grow two trees where normally only one will grow exceeds the most important general!’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Chat’Karuth in a conversation with a Ranger]])) ..
+	--"Wer zwei Halme dort wachsen lässt, wo sonst nur einer wächst, der ist größer als der größte Feldherr!" – Friedrich der Große
+	building_help_lore_string("barbarians", building_description, _[[‘He who can grow two trees where normally only one will grow exceeds the most important general!’]],_[[Chat’Karuth in a conversation with a Ranger]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Plant trees in the surrounding area.") ..
-		text_line(_"Working radius:", "5") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "log",
+		_"Plants trees in the surrounding area.",
+		_"The ranger’s hut needs free space within the working radius to plant the trees.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(p(_"The Ranger’s Hut needs free space in the immediate vicinity to plant the trees.")) ..
-		text_line(_"Incoming:", "n/a") ..
-		text_line(_"Outgoing:","n/a") ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/ranger/menu.png", 1, p(_"Ranger")) ..
-		text_line(_"Worker uses:",_"Shovel","tribes/barbarians/shovel/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The Ranger needs %s to plant a tree, not counting the time he needs to reach the destination and go home again.":format("5s"))
+	building_help_production_section(_"The ranger needs %s to plant a tree, not counting the time he needs to reach the destination and go home again.":bformat(
+		ngettext("%d second", "%d seconds", 5):bformat(5)
+	))
+   end
 }

=== renamed file 'tribes/barbarians/rangers_hut/b_ranger_b_00.png' => 'tribes/barbarians/rangers_hut/rangers_hut_b_00.png'
=== renamed file 'tribes/barbarians/rangers_hut/b_ranger_b_01.png' => 'tribes/barbarians/rangers_hut/rangers_hut_b_01.png'
=== renamed file 'tribes/barbarians/rangers_hut/b_ranger_i_00.png' => 'tribes/barbarians/rangers_hut/rangers_hut_i_00.png'
=== modified file 'tribes/barbarians/reed_yard/help.lua'
--- tribes/barbarians/reed_yard/help.lua	2014-04-08 06:28:45 +0000
+++ tribes/barbarians/reed_yard/help.lua	2014-05-27 14:17:43 +0000
@@ -1,48 +1,34 @@
+-- The Barbarian Reed Yard
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Reed Yard")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/reed_yard/reed_yard_i_00.png", p(
-			_[[‘We grow roofs’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Slogan of the Guild of Gardeners]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘We grow roofs’]],_[[Slogan of the Guild of Gardeners]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"The Reed Yard cultivates reed that serves two different purposes for the Barbarian tribe.<br>It is the traditional material for roofing, and it is woven into the extremely durable cloth that they use for their ships’ sails.","tribes/barbarians/thatchreed/menu.png") ..
-		text_line(_"Working radius:", "1") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "thatchreed",
+		_"The Reed Yard cultivates reed that serves two different purposes for the Barbarian tribe.",
+		"Thatch reed is the traditional material for roofing, and it is woven into the extremely durable cloth that they use for their ships’ sails.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		text_line(_"Incoming:","n/a") ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/reed_yard/menu.png","tribes/barbarians/thatchreed/menu.png"},p(_"Thatch Reed")) ..
-		dependencies({"tribes/barbarians/thatchreed/menu.png","tribes/barbarians/constructionsite/menu.png"},p(_"Construction Site")) ..
-		rt(p(_"The Reed Yard’s output will only go to construction sites that need it.")) ..
-		dependencies({"tribes/barbarians/thatchreed/menu.png","tribes/barbarians/weaving-mill/menu.png"},p(_"Weaving Mill")) ..
+	building_help_dependencies_production("barbarians", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 5), 5) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 1), 1) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 3), 3) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/gardener/menu.png", 1, p(_"Gardener")) ..
-		text_line(_"Worker uses:", _"Shovel","tribes/barbarians/shovel/menu.png") ..
-		text_line(_"Experience levels:","n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"A Reed Yard can produce a sheaf of Thatch Reed in about %s on average.":format("65s"))
+	building_help_production_section(_"A reed yard can produce a sheaf of thatch reed in about %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 65):bformat(65)
+	))
+   end
 }

=== modified file 'tribes/barbarians/scouts_hut/help.lua'
--- tribes/barbarians/scouts_hut/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/scouts_hut/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Scout's Hut
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "scout",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/sentry/help.lua'
--- tribes/barbarians/sentry/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/sentry/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,22 @@
+-- The Barbarian Sentry
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== added file 'tribes/barbarians/ship/menu.png'
Binary files tribes/barbarians/ship/menu.png	1970-01-01 00:00:00 +0000 and tribes/barbarians/ship/menu.png	2014-05-27 14:17:43 +0000 differ
=== modified file 'tribes/barbarians/shipyard/help.lua'
--- tribes/barbarians/shipyard/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/shipyard/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,32 @@
+-- The Barbarian Ship Yard
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+-- TODO crashes because of missing image
+	--building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "shipwright",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/smelting_works/help.lua'
--- tribes/barbarians/smelting_works/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/smelting_works/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Smelting Works
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "iron",
+		_"Smelts iron ore into iron and gold ore into gold.") ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== modified file 'tribes/barbarians/tavern/help.lua'
--- tribes/barbarians/tavern/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/tavern/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Tavern
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "ration",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
 }

=== modified file 'tribes/barbarians/trainingcamp/help.lua'
--- tribes/barbarians/trainingcamp/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/trainingcamp/help.lua	2014-05-27 14:17:43 +0000
@@ -1,64 +1,49 @@
+-- The Barbarian Training Camp
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Training Camp")) ..
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("barbarians", building_description.name)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/trainingcamp/trainingcamp_i_00.png", p(
-			_[[‘He who is strong shall neither forgive nor forget, but revenge injustice suffered – in the past and for all future.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Chief Chat’Karuth in a speech to his army.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘He who is strong shall neither forgive nor forget, but revenge injustice suffered – in the past and for all future.’]], _[[Chief Chat’Karuth in a speech to his army.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Trains soldiers in Attack up to level 5, and in Health up to level 3.<br>Equips the soldiers with all necessary weapons and armor parts.") ..
-		rt("<p font-weight=bold font-decoration=underline font-size=12>" .. _"Note:" .. "</p><p font-size=12>" ..
-		   _"Barbarian soldiers cannot be trained in ‘Defense’ and will remain at their initial level."
-		   .. "<br><br></p>") ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "soldier",
+		_"Trains soldiers in ‘Attack’ and in ‘Health’."
+			.. " " .."Equips the soldiers with all necessary weapons and armor parts.",
+		_"Barbarian soldiers cannot be trained in ‘Defense’ and will remain at their initial level.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		dependencies({"tribes/barbarians/soldier/untrained.png","tribes/barbarians/trainingcamp/menu.png","tribes/barbarians/soldier/fulltrained-evade.png"}) ..
-		dependencies({"tribes/barbarians/soldier/untrained+evade.png","tribes/barbarians/trainingcamp/menu.png","tribes/barbarians/soldier/fulltrained.png"}) ..
-		rt(h3(_"Training Attack:")) ..
-		dependencies({"tribes/barbarians/axfactory/menu.png","tribes/barbarians/sharpax/menu.png;tribes/barbarians/broadax/menu.png","tribes/barbarians/trainingcamp/menu.png"}) ..
-		rt(p(_"Provided by the Axfactory")) ..
-		dependencies({"tribes/barbarians/warmill/menu.png","tribes/barbarians/sharpax/menu.png;tribes/barbarians/broadax/menu.png;tribes/barbarians/bronzeax/menu.png;tribes/barbarians/battleax/menu.png;tribes/barbarians/warriorsax/menu.png","tribes/barbarians/trainingcamp/menu.png"}) ..
-		rt(p(_"Provided by the War Mill")) ..
-		rt(h3(_"Training Health:")) ..
-		dependencies({"tribes/barbarians/helmsmithy/menu.png","tribes/barbarians/helm/menu.png;tribes/barbarians/mask/menu.png;tribes/barbarians/warhelm/menu.png","tribes/barbarians/trainingcamp/menu.png"}) ..
-		rt(p(_"Provided by the Helm Smithy")) ..
-		rt(h3(_"Training Both")) ..
-		image_line("tribes/barbarians/pittabread/menu.png",1,p(_"%s and":format(_"Pitta Bread"))) ..
-		image_line("tribes/barbarians/fish/menu.png;tribes/barbarians/meat/menu.png",1,p(_"%s or %s":format(_"Fish",_"Meat"))) ..
+	-- We would need to parse the production programs to autpmate the parameters here; so we do it manually
+	dependencies_training("barbarians", building_description, "fulltrained-evade", "untrained+evade") ..
+
+	rt(h3(_"Attack Training:")) ..
+	dependencies_training_food("barbarians", { {"fish", "meat"}, {"pittabread"}}) ..
+	dependencies_training_weapons("barbarians", building_description, "and", {"sharpax", "broadax"}, "axfactory") ..
+	dependencies_training_weapons("barbarians", building_description, "or", 
+		{"sharpax", "broadax", "bronzeax", "battleax", "warriorsax"}, "warmill") ..
+
+	rt(h3(_"Health Training:")) ..
+	dependencies_training_food("barbarians", { {"fish", "meat"}, {"pittabread"}}) ..
+	dependencies_training_weapons("barbarians", building_description, "and", {"helm", "mask", "warhelm"}, "helmsmithy") ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Big plot","pics/big.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "gold", ngettext("%i Gold", "%i Gold", 4), 4) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 3), 3) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 6), 6) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 4), 4) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 6), 6) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "gold", ngettext("%i Gold", "%i Gold", 2), 2) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 2), 2) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 3), 3) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 3), 3) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/trainer/menu.png", 1, p(_"Trainer")) ..
-		text_line(_"Worker uses:","n/a") ..
-		text_line(_"Experience levels:", "n/a") ..
+	building_help_building_section("barbarians", building_description) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, a Training Camp can train one new soldier in %1$s and %2$s to the final level in %3$s on average.":bformat(_"Attack",_"Health",_"%1$im%2$is":bformat(4,40)))
+	building_help_production_section(_"If all needed wares are delivered in time, a training camp can train one new soldier in attack and health to the final level in %1$s and %2$s on average.":bformat(
+		ngettext("%d minute", "%d minutes", 4):bformat(4),
+		ngettext("%d second", "%d seconds", 40):bformat(40)
+	))
+   end
 }

=== modified file 'tribes/barbarians/warehouse/help.lua'
--- tribes/barbarians/warehouse/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/warehouse/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,21 @@
+-- The Barbarian Warehouse
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("barbarians", building_description, "log",
+		_"Warehouses store soldiers, wares and tools.") ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description)
+   end
 }

=== modified file 'tribes/barbarians/warmill/help.lua'
--- tribes/barbarians/warmill/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/warmill/help.lua	2014-05-27 14:17:43 +0000
@@ -1,67 +1,36 @@
+-- The Barbarian War Mill
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian War Mill")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/warmill/warmill_i_00.png", p(
-			_[[‘A new Warrior’s Ax brings forth the best in its wielder – or the worst in its maker.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[An old Barbarian proverb<br> meaning that you need to take some risks sometimes.]])) ..
+	building_help_lore_string("barbarians", building_description, _[[‘A new warrior’s ax brings forth the best in its wielder – or the worst in its maker.’]], _[[An old Barbarian proverb<br> meaning that you need to take some risks sometimes.]]) ..
+
 	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"The Barbarian War Mill is their most advanced production site for weapons. As such it needs to be upgraded from an Axfactory.") ..
-		rt("image=tribes/barbarians/ax/menu.png;tribes/barbarians/sharpax/menu.png;tribes/barbarians/broadax/menu.png;tribes/barbarians/bronzeax/menu.png;tribes/barbarians/battleax/menu.png;tribes/barbarians/warriorsax/menu.png image-align=right",p("The War Mill produces all the axes that the Barbarians use for warfare.")) ..
-		text_line(_"Working radius:", "n/a") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_general_string("barbarians", building_description, "ax",
+		_"The war mill produces all the axes that the barbarians use for warfare.",
+		_"The barbarian war mill is their most advanced production site for weapons. As such it needs to be upgraded from an axfactory.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		rt(h3(_"Incoming:")) ..
-		dependencies({"tribes/barbarians/smelting_works/menu.png","tribes/barbarians/iron/menu.png","tribes/barbarians/warmill/menu.png"},p(_"%s from the Smelting Works":format(_"Iron"))) ..
-		dependencies({"tribes/barbarians/smelting_works/menu.png","tribes/barbarians/gold/menu.png","tribes/barbarians/warmill/menu.png"},p(_"%s from the Smelting Works":format(_"Gold"))) ..
-		dependencies({"tribes/barbarians/coalmine/menu.png;tribes/barbarians/burners_house/menu.png","tribes/barbarians/coal/menu.png","tribes/barbarians/warmill/menu.png"}) ..
-		rt(p(_"Coal from the Coal mine or the Charcoal Burner’s House")) ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/warmill/menu.png","tribes/barbarians/ax/menu.png","tribes/barbarians/headquarters/menu.png","tribes/barbarians/soldier/menu.png"},p(_"Soldier")) ..
-		dependencies({"tribes/barbarians/warmill/menu.png","tribes/barbarians/sharpax/menu.png;tribes/barbarians/broadax/menu.png;tribes/barbarians/bronzeax/menu.png;tribes/barbarians/battleax/menu.png;tribes/barbarians/warriorsax/menu.png","tribes/barbarians/trainingcamp/menu.png"}) ..
-		rt(p(_"Training Camp")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Medium plot","pics/medium.png") ..
-		text_line(_"Upgraded from:", _"Axfactory","tribes/barbarians/axfactory/menu.png") ..
-		rt(h3(_"Upgrade cost:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 1), 1) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 1), 1) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 1), 1) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 2), 2) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 1), 1) ..
-		rt(h3(_"Cost cumulative:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 3), 3) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 3), 3) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 3), 3) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 6), 6) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 3), 3) ..
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "blackwood", ngettext("%i Blackwood", "%i Blackwood", 2), 2) ..
-		help_building_line("barbarians", "thatchreed", ngettext("%i Thatch Reed", "%i Thatch Reeds", 2), 2) ..
-		help_building_line("barbarians", "grout", ngettext("%i Grout", "%i Grout", 2), 2) ..
-		help_building_line("barbarians", "raw_stone", ngettext("%i Raw Stone", "%i Raw Stones", 3), 3) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/master-blacksmith/menu.png", 1, p(_"%s and":format(_"Master Blacksmith"))) ..
-		image_line("tribes/barbarians/blacksmith/menu.png", 1, p(_"%s or better":format(_"Blacksmith"))) ..
-		text_line(_"Workers use:",_"Hammer","tribes/barbarians/hammer/menu.png") ..
-		rt(h3(_"Experience levels:")) ..
-		rt("text-align=right", p(_"%s to %s (%s EP)":format(_"Blacksmith",_"Master Blacksmith","24"))) ..
+	building_help_building_section("barbarians", building_description, "axfactory", {"metalworks", "axfactory"}) ..
+
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"If all needed wares are delivered in time, this building can produce %s in about %s on average.":format(_"each item","57s")) ..
-		rt(p(_"All weapons require the same time for making, but the consumption of the same raw materials increases from step to step. The last two need gold."))
+	building_help_production_section(_"If all needed wares are delivered in time, this building can produce each ax in about %s on average.":bformat(
+		ngettext("%d second", "%d seconds", 57):bformat(57)
+		) .. " " ..
+		_"All weapons require the same time for making, but the consumption of the same raw materials increases from step to step. The last two need gold."
+	)
+   end
 }

=== modified file 'tribes/barbarians/weaving-mill/conf'
--- tribes/barbarians/weaving-mill/conf	2014-03-17 17:23:26 +0000
+++ tribes/barbarians/weaving-mill/conf	2014-05-27 14:17:43 +0000
@@ -29,13 +29,13 @@
 produce=cloth
 
 [idle]
-pics=i_??.png
+pics=weaving-mill_i_??.png
 hotspot=36 74
 
 [build]
-pics=b_??.png
+pics=weaving-mill_b_??.png
 hotspot=36 74
 
 [working]
-pics=w_??.png
+pics=weaving-mill_w_??.png
 hotspot=36 74

=== modified file 'tribes/barbarians/weaving-mill/help.lua'
--- tribes/barbarians/weaving-mill/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/weaving-mill/help.lua	2014-05-27 14:17:43 +0000
@@ -1,9 +1,31 @@
+-- The Barbarian Weaving Mill
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		rt("image=tribes/barbarians/constructionsite/idle_with_worker_00.png",p(_"The help text of this building is under construction."))
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("barbarians", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("barbarians", building_description, "cloth",
+		_"Weaves cloth out of thatch reed.") ..
+
+	--Dependencies
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
+	--Building Section
+	building_help_building_section("barbarians", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
 }

=== renamed file 'tribes/barbarians/weaving-mill/b_00.png' => 'tribes/barbarians/weaving-mill/weaving-mill_b_00.png'
=== renamed file 'tribes/barbarians/weaving-mill/i_00.png' => 'tribes/barbarians/weaving-mill/weaving-mill_i_00.png'
=== renamed file 'tribes/barbarians/weaving-mill/w_00.png' => 'tribes/barbarians/weaving-mill/weaving-mill_w_00.png'
=== modified file 'tribes/barbarians/well/help.lua'
--- tribes/barbarians/well/help.lua	2014-03-25 06:18:48 +0000
+++ tribes/barbarians/well/help.lua	2014-05-27 14:17:43 +0000
@@ -1,49 +1,34 @@
+-- The Barbarian Well
+
 include "scripting/formatting.lua"
 include "scripting/format_help.lua"
 
 set_textdomain("tribe_barbarians")
 
 return {
-	text =
-		--rt(h1(_"The Barbarian Well")) ..
+   func = function(building_description)
+	return
+
 	--Lore Section
-		rt(h2(_"Lore")) ..
-		rt("image=tribes/barbarians/well/well_i_00.png", p(
-			_[[‘Oh how sweet is the source of life,<br> that comes down from the sky <br> and lets the earth drink.’]])) ..
-		rt("text-align=right",p("font-size=10 font-style=italic", _[[Song written by Sigurd the Bard<br>when the first rain fell after the Great Drought in the 21st year of Chat’Karuth’s reign.]])) ..
-	--General Section
-		rt(h2(_"General")) ..
-		text_line(_"Purpose:", _"Draw Water out of the deep.","tribes/barbarians/water/menu.png") ..
-		text_line(_"Working radius:", "1") ..
-		text_line(_"Conquer range:", "n/a") ..
-		text_line(_"Vision range:", "4") ..
+	building_help_lore_string("barbarians", building_description, _[[‘Oh how sweet is the source of life,<br> that comes down from the sky <br> and lets the earth drink.’]], _[[Song written by Sigurd the Bard<br>when the first rain fell after the Great Drought in the 21st year of Chat’Karuth’s reign.]]) ..
+
+	--General Section
+	--General Section
+	building_help_general_string("barbarians", building_description, "water",
+		_"Draws water out of the deep.") ..
+
 	--Dependencies
-		rt(h2(_"Dependencies")) ..
-		text_line(_"Incoming:", "n/a") ..
-		rt(h3(_"Outgoing:")) ..
-		dependencies({"tribes/barbarians/resi_water1/resi_00.png","tribes/barbarians/well/menu.png","tribes/barbarians/water/menu.png"},p(_"Water")) ..
-		dependencies({"tribes/barbarians/water/menu.png","tribes/barbarians/bakery/menu.png"},p(_"Bakery")) ..
-		dependencies({"tribes/barbarians/water/menu.png","tribes/barbarians/micro-brewery/menu.png"},p(_"Micro Brewery")) ..
-		dependencies({"tribes/barbarians/water/menu.png","tribes/barbarians/brewery/menu.png"},p(_"Brewery")) ..
-		dependencies({"tribes/barbarians/water/menu.png","tribes/barbarians/cattlefarm/menu.png"},p(_"Cattle Farm")) ..
-		dependencies({"tribes/barbarians/water/menu.png","tribes/barbarians/lime_kiln/menu.png"},p(_"Lime Kiln")) ..
+	building_help_dependencies_production("barbarians", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("barbarians", building_description) ..
+
 	--Building Section
-		rt(h2(_"Building")) ..
-		text_line(_"Space required:",_"Small plot","pics/small.png") ..
-		text_line(_"Upgraded from:", "n/a") ..
-		rt(h3(_"Build cost:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 4), 4) ..
+	building_help_building_section("barbarians", building_description) ..
 
-		rt(h3(_"Dismantle yields:")) ..
-		help_building_line("barbarians", "log", ngettext("%i Log", "%i Logs", 2), 2) ..
-		text_line(_"Upgradeable to:","n/a") ..
-	--Workers Section
-		rt(h2(_"Workers")) ..
-		rt(h3(_"Crew required:")) ..
-		image_line("tribes/barbarians/carrier/menu.png", 1, p(_"Carrier")) ..
-		text_line(_"Worker uses:", "n/a") ..
-		text_line(_"Experience levels:","n/a") ..
 	--Production Section
-		rt(h2(_"Production")) ..
-		text_line(_"Performance:", _"The Carrier needs %s to get one bucket full of water.":format("40s"))
+	building_help_production_section(_"The carrier needs %s to get one bucket full of water.":bformat(
+		ngettext("%d second", "%d seconds", 40):bformat(40)
+	))
+  end
 }

=== added file 'tribes/empire/arena/help.lua'
--- tribes/empire/arena/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/arena/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,39 @@
+-- The Imperial Arena
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("empire", building_description.name)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Trains soldiers in ‘Evade’." .. " " .. _"‘Evade’ increases the soldier’s chance not to be hit by the enemy and so to remain totally unaffected.",
+		_"Imperial soldiers cannot be trained in ‘Defense’ and will remain at the level with which they came.") ..
+
+	--Dependencies
+	-- We would need to parse the production programs to automate the parameters here; so we do it manually
+	-- TODO create images for this
+	-- dependencies_training("empire", building_description, "untrained+evade", "fulltrained-evade") ..
+
+	rt(h3(_"Evade Training:")) ..
+	dependencies_training_food("empire", { {"fish", "meat"}, {"bread"}}) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/armorsmithy/help.lua'
--- tribes/empire/armorsmithy/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/armorsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Armor Smithy
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	-- TODO rename pictures building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "helm",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/bakery/help.lua'
--- tribes/empire/bakery/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/bakery/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Bakery
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "bread",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/barracks/help.lua'
--- tribes/empire/barracks/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/barracks/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Barracks
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== added file 'tribes/empire/barrier/help.lua'
--- tribes/empire/barrier/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/barrier/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,26 @@
+-- The Imperial Barrier
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	-- TODO this building can both be upgraded or built directly.
+	-- Display build cost, upgrade cost, and dismantle costs for both versions.
+	-- Dismantle returns for upgraded version: 2 stone, 1 wood, 1 marble
+	-- Dismantle returns for built version: 1 stone, 1 log, 1 wood
+	building_help_building_section("empire", building_description, "outpost", {"outpost"})
+   end
+}

=== added file 'tribes/empire/brewery/help.lua'
--- tribes/empire/brewery/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/brewery/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Brewery
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "beer",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== renamed file 'tribes/empire/burners_house/burner_i_00.png' => 'tribes/empire/burners_house/burners_house_i_00.png'
=== modified file 'tribes/empire/burners_house/conf'
--- tribes/empire/burners_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/empire/burners_house/conf	2014-05-27 14:17:43 +0000
@@ -31,9 +31,9 @@
 produce=coal
 
 [idle]
-pics=burner_i_??.png  # ???
+pics=burners_house_i_??.png  # ???
 hotspot=51 48
 
 [working]
-pics=burner_i_??.png  # ???
+pics=burners_house_i_??.png  # ???
 hotspot=51 48

=== added file 'tribes/empire/burners_house/help.lua'
--- tribes/empire/burners_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/burners_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Charcoal Burner's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "coal",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/castle/help.lua'
--- tribes/empire/castle/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/castle/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Castle
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "fortress", {"fortress"})
+   end
+}

=== added file 'tribes/empire/coalmine/help.lua'
--- tribes/empire/coalmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/coalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Coal Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "coal",
+		_"Digs coal out of the ground in mountain terrain.") ..
+-- TODO  calculate "This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any coal.":bformat("1/3"))
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/colosseum/help.lua'
--- tribes/empire/colosseum/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/colosseum/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,39 @@
+-- The Imperial Colosseum
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("empire", building_description.name)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Trains soldiers in ‘Evade’." .. " " .. _"‘Evade’ increases the soldier’s chance not to be hit by the enemy and so to remain totally unaffected.",
+		_"Imperial soldiers cannot be trained in ‘Defense’ and will remain at the level with which they came.") ..
+
+	--Dependencies
+	-- We would need to parse the production programs to automate the parameters here; so we do it manually
+	-- TODO create images for this
+	-- dependencies_training("empire", building_description, "untrained+evade", "fulltrained-evade") ..
+
+	rt(h3(_"Evade Training:")) ..
+	dependencies_training_food("empire", { {"fish", "meat"}, {"bread"}}) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "arena", {"arena"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/deep_coalmine/help.lua'
--- tribes/empire/deep_coalmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/deep_coalmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Deep Coal Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]]) ..
+
+	--General Section
+	-- Keeping the parameters here hardcoded for the moment, too hard to get from C++.
+	building_help_general_string("empire", building_description, "coal",
+		_"Digs coal out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "coalmine", {"coalmine"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/deep_goldmine/help.lua'
--- tribes/empire/deep_goldmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/deep_goldmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Deep Gold Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "goldore",
+		_"Digs gold ore out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "goldmine", {"goldmine"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/deep_marblemine/help.lua'
--- tribes/empire/deep_marblemine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/deep_marblemine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Deep Marble Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "marble",
+		_"Digs marble and stones out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "marblemine", {"marblemine"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/deep_oremine/help.lua'
--- tribes/empire/deep_oremine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/deep_oremine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Deep Iron Ore Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Text needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "ironore",
+		_"Digs iron ore out of the ground in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "oremine", {"oremine"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/donkeyfarm/help.lua'
--- tribes/empire/donkeyfarm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/donkeyfarm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Donkey Farm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "donkey",
+		_"Breeds donkeys for adding them to the transportation system.") ..
+
+	--Dependencies
+	-- TODO: why is "Produces" empty?
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/farm/help.lua'
--- tribes/empire/farm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/farm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Farm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "wheat",
+		_"Sow and harvest wheat.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== modified file 'tribes/empire/fishers_house/conf'
--- tribes/empire/fishers_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/empire/fishers_house/conf	2014-05-27 14:17:43 +0000
@@ -24,5 +24,5 @@
 worker=fish
 
 [idle]
-pics=fisher_i_??.png  # ???
+pics=fishers_house_i_??.png  # ???
 hotspot=42 60

=== renamed file 'tribes/empire/fishers_house/fisher_i_00.png' => 'tribes/empire/fishers_house/fishers_house_i_00.png'
=== added file 'tribes/empire/fishers_house/help.lua'
--- tribes/empire/fishers_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/fishers_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Fisher's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "fish",
+		_"Fishes on the coast near the house.",
+		_"The fisher’s house needs water full of fish within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/foresters_house/help.lua'
--- tribes/empire/foresters_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/foresters_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Forester's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "log",
+		_"Plants trees in the surrounding area.",
+		_"The foresters’s house needs free space within the working radius to plant the trees.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculaiton needed]])
+   end
+}

=== added file 'tribes/empire/fortress/help.lua'
--- tribes/empire/fortress/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/fortress/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Fortress
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== added file 'tribes/empire/goldmine/help.lua'
--- tribes/empire/goldmine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/goldmine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Gold Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "goldore",
+		_"Digs gold ore out of the ground in mountain terrain.") ..
+-- TODO calculation needed "This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any gold ore.":bformat("1/3"))
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/headquarters/help.lua'
--- tribes/empire/headquarters/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/headquarters/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Headquarters
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "carrier",
+		_"Accomodation for your people. Also stores your wares and tools.",
+		_"The headquarters is your main building." .. "<br>" .. _[[Text needed]]) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== added file 'tribes/empire/headquarters_shipwreck/help.lua'
--- tribes/empire/headquarters_shipwreck/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/headquarters_shipwreck/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Headquarters Shipwreck
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "carrier",
+		_"Although this ship ran aground, it still serves as accomodation for your people. It also stores your wares and tools.",
+		_"The headquarters shipwreck is your main building." .. "<br>" .. _[[Text needed]]) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== modified file 'tribes/empire/hunters_house/conf'
--- tribes/empire/hunters_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/empire/hunters_house/conf	2014-05-27 14:17:43 +0000
@@ -23,5 +23,5 @@
 worker=hunt
 
 [idle]
-pics=hunter_i_??.png
+pics=hunters_house_i_??.png
 hotspot=54 55

=== added file 'tribes/empire/hunters_house/help.lua'
--- tribes/empire/hunters_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/hunters_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Hunter's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "meat",
+		_"Hunts animals to produce meat.",
+		_"The hunter’s house needs animals to hunt within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/empire/hunters_house/hunter_i_00.png' => 'tribes/empire/hunters_house/hunters_house_i_00.png'
=== added file 'tribes/empire/inn/help.lua'
--- tribes/empire/inn/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/inn/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Inn
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "meal",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description, "tavern", {"tavern"}) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== modified file 'tribes/empire/lumberjacks_house/conf'
--- tribes/empire/lumberjacks_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/empire/lumberjacks_house/conf	2014-05-27 14:17:43 +0000
@@ -24,5 +24,5 @@
 worker=chop
 
 [idle]
-pics=lumberjack_i_??.png
+pics=lumberjacks_house_i_??.png
 hotspot=40 59

=== added file 'tribes/empire/lumberjacks_house/help.lua'
--- tribes/empire/lumberjacks_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/lumberjacks_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Lumberjack's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]],_[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "log",
+		_"Fell trees in the surrounding area and process them into logs.",
+		_"The lumberjack's house needs trees to fell within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/empire/lumberjacks_house/lumberjack_i_00.png' => 'tribes/empire/lumberjacks_house/lumberjacks_house_i_00.png'
=== added file 'tribes/empire/marblemine/help.lua'
--- tribes/empire/marblemine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/marblemine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Marble Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "marble",
+		_"Carve marble and stones out of the rock in mountain terrain.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/mill/help.lua'
--- tribes/empire/mill/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/mill/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Mill
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	-- TODO rename images building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "flour",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/oremine/help.lua'
--- tribes/empire/oremine/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/oremine/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Iron Ore Mine
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "ironore",
+		_"Digs iron ore out of the ground in mountain terrain.") ..
+-- TODO calculation needed "This mine exploits only %s of the resource. From there on out, it will only have a 5%% chance of finding any iron ore.":bformat("1/3"))
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== added file 'tribes/empire/outpost/help.lua'
--- tribes/empire/outpost/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/outpost/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Outpost
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== added file 'tribes/empire/piggery/help.lua'
--- tribes/empire/piggery/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/piggery/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Piggery
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "meat",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/port/help.lua'
--- tribes/empire/port/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/port/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,29 @@
+-- The Imperial Port
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	-- TODO this building acts like a warehouse
+	building_help_general_string("empire", building_description, "ship",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	-- TODO expedition costs here?
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/quarry/help.lua'
--- tribes/empire/quarry/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/quarry/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Quarry
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "stone",
+		_"Carves marble and stone out of rocks in the vicinity.", _"The quarry needs stones to cut within the working radius.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/sawmill/help.lua'
--- tribes/empire/sawmill/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/sawmill/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Sawmill
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "wood",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/scouts_house/help.lua'
--- tribes/empire/scouts_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/scouts_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Scout's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]],_[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "scout",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/sentry/help.lua'
--- tribes/empire/sentry/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/sentry/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,25 @@
+-- The Imperial Sentry
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	-- TODO this building can both be upgraded or built directly.
+	-- Display build cost, upgrade cost, and dismantle costs for both versions.
+	-- Dismantle returns the same for both versions
+	building_help_building_section("empire", building_description, "barracks", {"barracks"})
+   end
+}

=== added file 'tribes/empire/sheepfarm/help.lua'
--- tribes/empire/sheepfarm/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/sheepfarm/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Sheepfarm
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "wool",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/ship/menu.png'
Binary files tribes/empire/ship/menu.png	1970-01-01 00:00:00 +0000 and tribes/empire/ship/menu.png	2014-05-27 14:17:43 +0000 differ
=== added file 'tribes/empire/shipyard/help.lua'
--- tribes/empire/shipyard/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/shipyard/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Ship Yard
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+-- TODO crashes because of missing image
+	--building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "shipwright",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/smelting_works/help.lua'
--- tribes/empire/smelting_works/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/smelting_works/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Smelting Works
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "iron",
+		_"Smelts iron ore into iron and gold ore into gold.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== modified file 'tribes/empire/stonemasons_house/conf'
--- tribes/empire/stonemasons_house/conf	2014-03-17 17:23:26 +0000
+++ tribes/empire/stonemasons_house/conf	2014-05-27 14:17:43 +0000
@@ -32,9 +32,9 @@
 produce=marblecolumn
 
 [idle]
-pics=stonemason_i_??.png  # ???
+pics=stonemasons_house_i_??.png  # ???
 hotspot=58 61
 
 [working]
-pics=stonemason_i_??.png  # ???
+pics=stonemasons_house_i_??.png  # ???
 hotspot=58 61

=== added file 'tribes/empire/stonemasons_house/help.lua'
--- tribes/empire/stonemasons_house/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/stonemasons_house/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Stonemason's House
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "marblecolumn",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description, true) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/empire/stonemasons_house/stonemason_i_00.png' => 'tribes/empire/stonemasons_house/stonemasons_house_i_00.png'
=== added file 'tribes/empire/tavern/help.lua'
--- tribes/empire/tavern/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/tavern/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Tavern
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "ration",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== modified file 'tribes/empire/toolsmithy/conf'
--- tribes/empire/toolsmithy/conf	2014-03-17 17:23:26 +0000
+++ tribes/empire/toolsmithy/conf	2014-05-27 14:17:43 +0000
@@ -160,9 +160,9 @@
 return=skipped
 
 [idle]
-pics=toolsmith_i_??.png
+pics=toolsmithy_i_??.png
 hotspot=58 61
 
 [working]
-pics=toolsmith_i_??.png
+pics=toolsmithy_i_??.png
 hotspot=58 61

=== added file 'tribes/empire/toolsmithy/help.lua'
--- tribes/empire/toolsmithy/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/toolsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Toolsmithy
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "hammer",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== renamed file 'tribes/empire/toolsmithy/toolsmith_i_00.png' => 'tribes/empire/toolsmithy/toolsmithy_i_00.png'
=== added file 'tribes/empire/tower/help.lua'
--- tribes/empire/tower/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/tower/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,22 @@
+-- The Imperial Tower
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Garrisons soldiers to expand your territory.",
+		_"If you’re low on soldiers to occupy new military sites, use the downward arrow button to decrease the capacity. You can also click on a soldier to send him away.") ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== added file 'tribes/empire/trainingcamp/help.lua'
--- tribes/empire/trainingcamp/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/trainingcamp/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,46 @@
+-- The Imperial Training Camp
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	-- need to get this again, so the building description will be of type "trainingsite"
+	local building_description = wl.Game():get_building_description("empire", building_description.name)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "soldier",
+		_"Trains soldiers in ‘Attack’ and in ‘Health’."
+			.. " " .."Equips the soldiers with all necessary weapons and armor parts.",
+		_"Imperial soldiers cannot be trained in ‘Defense’ and will remain at the level with which they came.") ..
+
+	--Dependencies
+	-- We would need to parse the production programs to automate the parameters here; so we do it manually
+	-- TODO make pictures dependencies_training("empire", building_description, "fulltrained-evade", "untrained+evade") ..
+
+	rt(h3(_"Attack Training:")) ..
+	dependencies_training_food("empire", { {"fish", "meat"}, {"bread"}}) ..
+	dependencies_training_weapons("empire", building_description, "and", 
+		{"lance", "advanced_lance", "heavy_lance", "war_lance"}, "weaponsmithy") ..
+
+	rt(h3(_"Health Training:")) ..
+	dependencies_training_food("empire", { {"fish", "meat"}, {"bread"}}) ..
+	dependencies_training_weapons("empire", building_description, "and", 
+		{"helm", "armor", "chain_armor", "plate_armor"}, "armorsmithy") ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/vineyard/help.lua'
--- tribes/empire/vineyard/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/vineyard/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Vineyard
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "grape",
+		_"Sow and harvest wheat.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/warehouse/help.lua'
--- tribes/empire/warehouse/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/warehouse/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,21 @@
+-- The Imperial Warehouse
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+	--General Section
+	building_help_general_string("empire", building_description, "log",
+		_"Warehouses store soldiers, wares and tools.") ..
+
+	--Building Section
+	building_help_building_section("empire", building_description)
+   end
+}

=== added file 'tribes/empire/weaponsmithy/help.lua'
--- tribes/empire/weaponsmithy/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/weaponsmithy/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Weapon Smithy
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	-- TODO rename pictures building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "wood_lance",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/weaving-mill/help.lua'
--- tribes/empire/weaving-mill/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/weaving-mill/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Weaving Mill
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	-- TODO rename pictures building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "cloth",
+		_"Weaves cloth out of wool.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+   end
+}

=== added file 'tribes/empire/well/help.lua'
--- tribes/empire/well/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/well/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,32 @@
+-- The Imperial Well
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	--General Section
+	building_help_general_string("empire", building_description, "water",
+		_"Draws water out of the deep.") ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== modified file 'tribes/empire/winery/conf'
--- tribes/empire/winery/conf	2013-07-23 19:04:12 +0000
+++ tribes/empire/winery/conf	2014-05-27 14:17:43 +0000
@@ -32,9 +32,9 @@
 produce=wine
 
 [idle]
-pics=vintagery_i_??.png  # ???
+pics=winery_i_??.png  # ???
 hotspot=39 62
 
 [working]
-pics=vintagery_i_??.png  # ???
+pics=winery_i_??.png  # ???
 hotspot=39 62

=== added file 'tribes/empire/winery/help.lua'
--- tribes/empire/winery/help.lua	1970-01-01 00:00:00 +0000
+++ tribes/empire/winery/help.lua	2014-05-27 14:17:43 +0000
@@ -0,0 +1,31 @@
+-- The Imperial Winery
+
+include "scripting/formatting.lua"
+include "scripting/format_help.lua"
+
+set_textdomain("tribe_empire")
+
+return {
+   func = function(building_description)
+	return
+
+	--Lore Section
+	building_help_lore_string("empire", building_description, _[[Text needed]], _[[Source needed]]) ..
+
+	--General Section
+	building_help_general_string("empire", building_description, "wine",
+		_[[Text needed]]) ..
+
+	--Dependencies
+	building_help_dependencies_production("empire", building_description) ..
+
+	--Workers Section
+	building_help_crew_string("empire", building_description) ..
+
+	--Building Section
+	building_help_building_section("empire", building_description) ..
+
+	--Production Section
+	building_help_production_section(_[[Calculation needed]])
+  end
+}

=== renamed file 'tribes/empire/winery/vintagery_i_00.png' => 'tribes/empire/winery/winery_i_00.png'

Follow ups