← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/rework-resource-indicators into lp:widelands

 

Benedikt Straub has proposed merging lp:~widelands-dev/widelands/rework-resource-indicators into lp:widelands.

Commit message:
Removed name and amount restrictions for resource indicators. Created a different set of resi graphics for each tribe.

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #1784208 in widelands: "Reimplement resource indicators"
  https://bugs.launchpad.net/widelands/+bug/1784208

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/rework-resource-indicators/+merge/353996
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/rework-resource-indicators into lp:widelands.
=== modified file 'data/campaigns/bar01.wmf/scripting/texts.lua'
--- data/campaigns/bar01.wmf/scripting/texts.lua	2018-08-13 16:44:58 +0000
+++ data/campaigns/bar01.wmf/scripting/texts.lua	2018-08-29 17:40:17 +0000
@@ -43,16 +43,16 @@
    body = objective_text(_"Build coal and iron mines",
       li(_"Build a coal mine and an iron mine.") ..
       li_arrow(_"To do so, place a flag up on the mountain’s flank to the east (on mountain terrain though, not mountain meadow). When you click on the new flag, you can send geologists there. Because the flag is on a mountain, the geologists will search for ores; otherwise, they would search for water. Then build a mine for both kinds of resources that they will find, choosing the appropriate mine to be built:") ..
-      li_image("tribes/immovables/resi_coal1/idle_00.png", _"a bit of coal") ..
-      li_image("tribes/immovables/resi_coal2/idle_00.png", _"a lot of coal") ..
-      li_image("tribes/immovables/resi_iron1/idle_00.png", _"a bit of iron") ..
-      li_image("tribes/immovables/resi_iron2/idle_00.png", _"a lot of iron") ..
-      li_image("tribes/immovables/resi_gold1/idle_00.png", _"a bit of gold") ..
-      li_image("tribes/immovables/resi_gold2/idle_00.png", _"a lot of gold") ..
-      li_image("tribes/immovables/resi_stones1/idle_00.png", _"a bit of granite") ..
-      li_image("tribes/immovables/resi_stones2/idle_00.png", _"a lot of granite") ..
-      li_image("tribes/immovables/resi_water1/idle_00.png", _"water") ..
-      li_image("tribes/immovables/resi_none/idle_00.png", _"nothing was found here") ..
+      li_image("tribes/immovables/resi/barbarians/png/coal_1.png", _"a bit of coal") ..
+      li_image("tribes/immovables/resi/barbarians/png/coal_2.png", _"a lot of coal") ..
+      li_image("tribes/immovables/resi/barbarians/png/iron_1.png", _"a bit of iron") ..
+      li_image("tribes/immovables/resi/barbarians/png/iron_2.png", _"a lot of iron") ..
+      li_image("tribes/immovables/resi/barbarians/png/gold_1.png", _"a bit of gold") ..
+      li_image("tribes/immovables/resi/barbarians/png/gold_2.png", _"a lot of gold") ..
+      li_image("tribes/immovables/resi/barbarians/png/stones_1.png", _"a bit of granite") ..
+      li_image("tribes/immovables/resi/barbarians/png/stones_2.png", _"a lot of granite") ..
+      li_image("tribes/immovables/resi/barbarians/png/water.png", _"water") ..
+      li_image("tribes/immovables/resi/barbarians/png/none.png", _"nothing was found here") ..
       p(_[[Mines can only be built on mountain terrain. Suitable places for mines are displayed as orange mine symbols.]]))
 }
 

=== modified file 'data/images/wui/overlays/mine.png'
Binary files data/images/wui/overlays/mine.png	2014-12-03 20:13:06 +0000 and data/images/wui/overlays/mine.png	2018-08-29 17:40:17 +0000 differ
=== modified file 'data/tribes/atlanteans.lua'
--- data/tribes/atlanteans.lua	2017-11-23 09:13:06 +0000
+++ data/tribes/atlanteans.lua	2018-08-29 17:40:17 +0000
@@ -22,6 +22,8 @@
 --
 --    **roads**: The file paths for the tribes' road textures in 2 subtables ``busy`` and ``normal``
 --
+--    **resource_indicators**: The names for the resource indicators. This table contains a subtable for each resource name plus a subtable named "" for no resources. Each subtable is an array, in which the index of each entry is the highest amount of resources the indicator may indicate.
+--
 --    **wares_order**: This defines all the wares that this tribe uses and their display order in the user interface. Each subtable defines a column in the user interface.
 --
 --    **workers_order**:  This defines all the workers that this tribe uses and their display order in the user interface. Each subtable defines a column in the user interface.
@@ -73,6 +75,31 @@
       },
    },
 
+   resource_indicators = {
+      [""] = {
+         [0] = "atlanteans_resi_none",
+      },
+      coal = {
+         [10] = "atlanteans_resi_coal_1",
+         [20] = "atlanteans_resi_coal_2",
+      },
+      iron = {
+         [10] = "atlanteans_resi_iron_1",
+         [20] = "atlanteans_resi_iron_2",
+      },
+      gold = {
+         [10] = "atlanteans_resi_gold_1",
+         [20] = "atlanteans_resi_gold_2",
+      },
+      stones = {
+         [10] = "atlanteans_resi_stones_1",
+         [20] = "atlanteans_resi_stones_2",
+      },
+      water = {
+         [100] = "atlanteans_resi_water",
+      },
+   },
+
    -- Wares positions in wares windows.
    -- This also gives us the information which wares the tribe uses.
    -- Each subtable is a column in the wares windows.
@@ -205,16 +232,16 @@
       "cornfield_ripe",
       "cornfield_harvested",
       "destroyed_building",
-      "resi_coal1",
-      "resi_coal2",
-      "resi_gold1",
-      "resi_gold2",
-      "resi_iron1",
-      "resi_iron2",
-      "resi_none",
-      "resi_water1",
-      "resi_stones1",
-      "resi_stones2",
+      "atlanteans_resi_none",
+      "atlanteans_resi_water",
+      "atlanteans_resi_coal_1",
+      "atlanteans_resi_iron_1",
+      "atlanteans_resi_gold_1",
+      "atlanteans_resi_stones_1",
+      "atlanteans_resi_coal_2",
+      "atlanteans_resi_iron_2",
+      "atlanteans_resi_gold_2",
+      "atlanteans_resi_stones_2",
       "atlanteans_shipconstruction",
    },
 

=== modified file 'data/tribes/barbarians.lua'
--- data/tribes/barbarians.lua	2018-07-15 10:32:12 +0000
+++ data/tribes/barbarians.lua	2018-08-29 17:40:17 +0000
@@ -26,6 +26,31 @@
       },
    },
 
+   resource_indicators = {
+      [""] = {
+         [0] = "barbarians_resi_none",
+      },
+      coal = {
+         [10] = "barbarians_resi_coal_1",
+         [20] = "barbarians_resi_coal_2",
+      },
+      iron = {
+         [10] = "barbarians_resi_iron_1",
+         [20] = "barbarians_resi_iron_2",
+      },
+      gold = {
+         [10] = "barbarians_resi_gold_1",
+         [20] = "barbarians_resi_gold_2",
+      },
+      stones = {
+         [10] = "barbarians_resi_stones_1",
+         [20] = "barbarians_resi_stones_2",
+      },
+      water = {
+         [100] = "barbarians_resi_water",
+      },
+   },
+
    -- Wares positions in wares windows.
    -- This also gives us the information which wares the tribe uses.
    -- Each subtable is a column in the wares windows.
@@ -155,16 +180,16 @@
       "reed_small",
       "reed_medium",
       "reed_ripe",
-      "resi_coal1",
-      "resi_coal2",
-      "resi_gold1",
-      "resi_gold2",
-      "resi_iron1",
-      "resi_iron2",
-      "resi_none",
-      "resi_water1",
-      "resi_stones1",
-      "resi_stones2",
+      "barbarians_resi_none",
+      "barbarians_resi_water",
+      "barbarians_resi_coal_1",
+      "barbarians_resi_iron_1",
+      "barbarians_resi_gold_1",
+      "barbarians_resi_stones_1",
+      "barbarians_resi_coal_2",
+      "barbarians_resi_iron_2",
+      "barbarians_resi_gold_2",
+      "barbarians_resi_stones_2",
       "barbarians_shipconstruction",
    },
 

=== modified file 'data/tribes/empire.lua'
--- data/tribes/empire.lua	2017-11-25 23:32:30 +0000
+++ data/tribes/empire.lua	2018-08-29 17:40:17 +0000
@@ -29,6 +29,31 @@
       },
    },
 
+   resource_indicators = {
+      [""] = {
+         [0] = "empire_resi_none",
+      },
+      coal = {
+         [10] = "empire_resi_coal_1",
+         [20] = "empire_resi_coal_2",
+      },
+      iron = {
+         [10] = "empire_resi_iron_1",
+         [20] = "empire_resi_iron_2",
+      },
+      gold = {
+         [10] = "empire_resi_gold_1",
+         [20] = "empire_resi_gold_2",
+      },
+      stones = {
+         [10] = "empire_resi_stones_1",
+         [20] = "empire_resi_stones_2",
+      },
+      water = {
+         [100] = "empire_resi_water",
+      },
+   },
+
    -- Wares positions in wares windows.
    -- This also gives us the information which wares the tribe uses.
    -- Each subtable is a column in the wares windows.
@@ -163,16 +188,16 @@
       "grapevine_small",
       "grapevine_medium",
       "grapevine_ripe",
-      "resi_coal1",
-      "resi_coal2",
-      "resi_gold1",
-      "resi_gold2",
-      "resi_iron1",
-      "resi_iron2",
-      "resi_none",
-      "resi_water1",
-      "resi_stones1",
-      "resi_stones2",
+      "empire_resi_none",
+      "empire_resi_water",
+      "empire_resi_coal_1",
+      "empire_resi_iron_1",
+      "empire_resi_gold_1",
+      "empire_resi_stones_1",
+      "empire_resi_coal_2",
+      "empire_resi_iron_2",
+      "empire_resi_gold_2",
+      "empire_resi_stones_2",
       "empire_shipconstruction",
    },
 

=== modified file 'data/tribes/frisians.lua'
--- data/tribes/frisians.lua	2018-05-17 11:02:45 +0000
+++ data/tribes/frisians.lua	2018-08-29 17:40:17 +0000
@@ -27,6 +27,31 @@
       },
    },
 
+   resource_indicators = {
+      [""] = {
+         [0] = "frisians_resi_none",
+      },
+      coal = {
+         [10] = "frisians_resi_coal_1",
+         [20] = "frisians_resi_coal_2",
+      },
+      iron = {
+         [10] = "frisians_resi_iron_1",
+         [20] = "frisians_resi_iron_2",
+      },
+      gold = {
+         [10] = "frisians_resi_gold_1",
+         [20] = "frisians_resi_gold_2",
+      },
+      stones = {
+         [10] = "frisians_resi_stones_1",
+         [20] = "frisians_resi_stones_2",
+      },
+      water = {
+         [100] = "frisians_resi_water",
+      },
+   },
+
    -- Wares positions in wares windows.
    -- This also gives us the information which wares the tribe uses.
    -- Each subtable is a column in the wares windows.
@@ -201,16 +226,16 @@
       "reed_small",
       "reed_medium",
       "reed_ripe",
-      "resi_coal1",
-      "resi_coal2",
-      "resi_gold1",
-      "resi_gold2",
-      "resi_iron1",
-      "resi_iron2",
-      "resi_none",
-      "resi_water1",
-      "resi_stones1",
-      "resi_stones2",
+      "frisians_resi_none",
+      "frisians_resi_water",
+      "frisians_resi_coal_1",
+      "frisians_resi_iron_1",
+      "frisians_resi_gold_1",
+      "frisians_resi_stones_1",
+      "frisians_resi_coal_2",
+      "frisians_resi_iron_2",
+      "frisians_resi_gold_2",
+      "frisians_resi_stones_2",
       "frisians_shipconstruction",
       --These non-frisian immovables can be used by bee-keepers
       "field_medium",

=== added directory 'data/tribes/immovables/resi'
=== added directory 'data/tribes/immovables/resi/atlanteans'
=== added directory 'data/tribes/immovables/resi/atlanteans/helptexts'
=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/coal_1.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/coal_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/coal_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is only a little bit of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/coal_2.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/coal_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/coal_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is a lot of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/gold_1.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/gold_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/gold_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is only a little bit of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/gold_2.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/gold_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/gold_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is a lot of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/iron_1.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/iron_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/iron_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is only a little bit of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/iron_2.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/iron_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/iron_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is a lot of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/none.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/none.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/none.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: No resources
+      default = _("There are no resources in the ground here.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/stones_1.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/stones_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/stones_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are only a few precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is only a little bit of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is only a little bit of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/stones_2.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/stones_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/stones_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are many precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is a lot of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is a lot of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/helptexts/water.lua'
--- data/tribes/immovables/resi/atlanteans/helptexts/water.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/helptexts/water.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: Water
+      default = _("There is water in the ground here that can be pulled up by a well.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/atlanteans/init.lua'
--- data/tribes/immovables/resi/atlanteans/init.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/atlanteans/init.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,240 @@
+dirname = path.dirname(__file__)
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_none",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: None"),
+   helptext_script = dirname .. "helptexts/none.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = {dirname .. "png/none.png"},
+         hotspot = {10, 36},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_water",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Water Vein"),
+   helptext_script = dirname .. "helptexts/water.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/water_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_coal_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/coal_1_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_gold_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/gold_1_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_iron_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/iron_1_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_stones_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Some Stones"),
+   helptext_script = dirname .. "helptexts/stones_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/stones_1_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_coal_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/coal_2_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_gold_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/gold_2_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_iron_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/iron_2_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "atlanteans_resi_stones_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: A Lot of Stones"),
+   helptext_script = dirname .. "helptexts/stones_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/stones_2_?.png"),
+         hotspot = {10, 36},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}

=== added directory 'data/tribes/immovables/resi/atlanteans/png'
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_1_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_1_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_1_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_1_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_2_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_2_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_2_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/coal_2_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/coal_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/coal_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_1_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_1_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_1_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_1_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_2_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_2_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_2_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/gold_2_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/gold_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/gold_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_1_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_1_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_1_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_1_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_2_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_2_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_2_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/iron_2_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/iron_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/iron_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/none.png'
Binary files data/tribes/immovables/resi/atlanteans/png/none.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/none.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_1_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_1_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_1_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_1_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_2_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_2_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_2_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/stones_2_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/stones_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/stones_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/water_0.png'
Binary files data/tribes/immovables/resi/atlanteans/png/water_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/water_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/water_1.png'
Binary files data/tribes/immovables/resi/atlanteans/png/water_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/water_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/water_2.png'
Binary files data/tribes/immovables/resi/atlanteans/png/water_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/water_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/atlanteans/png/water_3.png'
Binary files data/tribes/immovables/resi/atlanteans/png/water_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/atlanteans/png/water_3.png	2018-08-29 17:40:17 +0000 differ
=== added directory 'data/tribes/immovables/resi/barbarians'
=== added directory 'data/tribes/immovables/resi/barbarians/helptexts'
=== added file 'data/tribes/immovables/resi/barbarians/helptexts/coal_1.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/coal_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/coal_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is only a little bit of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/coal_2.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/coal_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/coal_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is a lot of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/gold_1.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/gold_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/gold_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is only a little bit of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/gold_2.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/gold_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/gold_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is a lot of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/iron_1.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/iron_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/iron_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is only a little bit of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/iron_2.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/iron_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/iron_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is a lot of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/none.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/none.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/none.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: No resources
+      default = _("There are no resources in the ground here.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/stones_1.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/stones_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/stones_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are only a few precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is only a little bit of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is only a little bit of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/stones_2.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/stones_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/stones_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are many precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is a lot of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is a lot of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/helptexts/water.lua'
--- data/tribes/immovables/resi/barbarians/helptexts/water.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/helptexts/water.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: Water
+      default = _("There is water in the ground here that can be pulled up by a well.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/barbarians/init.lua'
--- data/tribes/immovables/resi/barbarians/init.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/barbarians/init.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,231 @@
+dirname = path.dirname(__file__)
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_none",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: None"),
+   helptext_script = dirname .. "helptexts/none.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/none.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_water",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Water Vein"),
+   helptext_script = dirname .. "helptexts/water.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/water.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_coal_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/coal_1.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_gold_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/gold_1.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_iron_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/iron_1.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_stones_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Some Stones"),
+   helptext_script = dirname .. "helptexts/stones_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/stones_1.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_coal_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/coal_2.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_gold_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/gold_2.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_iron_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/iron_2.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "barbarians_resi_stones_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: A Lot of Stones"),
+   helptext_script = dirname .. "helptexts/stones_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/stones_2.png" },
+         hotspot = {9, 28},
+         scale = 4,
+      },
+   }
+}

=== added directory 'data/tribes/immovables/resi/barbarians/png'
=== added file 'data/tribes/immovables/resi/barbarians/png/coal_1.png'
Binary files data/tribes/immovables/resi/barbarians/png/coal_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/coal_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/coal_2.png'
Binary files data/tribes/immovables/resi/barbarians/png/coal_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/coal_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/gold_1.png'
Binary files data/tribes/immovables/resi/barbarians/png/gold_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/gold_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/gold_2.png'
Binary files data/tribes/immovables/resi/barbarians/png/gold_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/gold_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/iron_1.png'
Binary files data/tribes/immovables/resi/barbarians/png/iron_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/iron_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/iron_2.png'
Binary files data/tribes/immovables/resi/barbarians/png/iron_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/iron_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/none.png'
Binary files data/tribes/immovables/resi/barbarians/png/none.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/none.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/stones_1.png'
Binary files data/tribes/immovables/resi/barbarians/png/stones_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/stones_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/stones_2.png'
Binary files data/tribes/immovables/resi/barbarians/png/stones_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/stones_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/barbarians/png/water.png'
Binary files data/tribes/immovables/resi/barbarians/png/water.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/barbarians/png/water.png	2018-08-29 17:40:17 +0000 differ
=== added directory 'data/tribes/immovables/resi/empire'
=== added directory 'data/tribes/immovables/resi/empire/helptexts'
=== added file 'data/tribes/immovables/resi/empire/helptexts/coal_1.lua'
--- data/tribes/immovables/resi/empire/helptexts/coal_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/coal_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is only a little bit of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/coal_2.lua'
--- data/tribes/immovables/resi/empire/helptexts/coal_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/coal_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is a lot of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/gold_1.lua'
--- data/tribes/immovables/resi/empire/helptexts/gold_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/gold_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is only a little bit of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/gold_2.lua'
--- data/tribes/immovables/resi/empire/helptexts/gold_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/gold_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is a lot of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/iron_1.lua'
--- data/tribes/immovables/resi/empire/helptexts/iron_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/iron_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is only a little bit of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/iron_2.lua'
--- data/tribes/immovables/resi/empire/helptexts/iron_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/iron_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is a lot of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/none.lua'
--- data/tribes/immovables/resi/empire/helptexts/none.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/none.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: No resources
+      default = _("There are no resources in the ground here.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/stones_1.lua'
--- data/tribes/immovables/resi/empire/helptexts/stones_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/stones_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are only a few precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is only a little bit of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is only a little bit of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/stones_2.lua'
--- data/tribes/immovables/resi/empire/helptexts/stones_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/stones_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are many precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is a lot of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is a lot of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/helptexts/water.lua'
--- data/tribes/immovables/resi/empire/helptexts/water.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/helptexts/water.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: Water
+      default = _("There is water in the ground here that can be pulled up by a well.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/empire/init.lua'
--- data/tribes/immovables/resi/empire/init.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/empire/init.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,231 @@
+dirname = path.dirname(__file__)
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_none",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: None"),
+   helptext_script = dirname .. "helptexts/none.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/none.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_water",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Water Vein"),
+   helptext_script = dirname .. "helptexts/water.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/water.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_coal_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/coal_1.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_gold_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/gold_1.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_iron_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/iron_1.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_stones_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Some Stones"),
+   helptext_script = dirname .. "helptexts/stones_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/stones_1.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_coal_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/coal_2.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_gold_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/gold_2.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_iron_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/iron_2.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "empire_resi_stones_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: A Lot of Stones"),
+   helptext_script = dirname .. "helptexts/stones_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/stones_2.png" },
+         hotspot = {8, 19},
+         scale = 6,
+      },
+   }
+}

=== added directory 'data/tribes/immovables/resi/empire/png'
=== added file 'data/tribes/immovables/resi/empire/png/coal_1.png'
Binary files data/tribes/immovables/resi/empire/png/coal_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/coal_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/coal_2.png'
Binary files data/tribes/immovables/resi/empire/png/coal_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/coal_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/gold_1.png'
Binary files data/tribes/immovables/resi/empire/png/gold_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/gold_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/gold_2.png'
Binary files data/tribes/immovables/resi/empire/png/gold_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/gold_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/iron_1.png'
Binary files data/tribes/immovables/resi/empire/png/iron_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/iron_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/iron_2.png'
Binary files data/tribes/immovables/resi/empire/png/iron_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/iron_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/none.png'
Binary files data/tribes/immovables/resi/empire/png/none.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/none.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/stones_1.png'
Binary files data/tribes/immovables/resi/empire/png/stones_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/stones_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/stones_2.png'
Binary files data/tribes/immovables/resi/empire/png/stones_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/stones_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/empire/png/water.png'
Binary files data/tribes/immovables/resi/empire/png/water.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/empire/png/water.png	2018-08-29 17:40:17 +0000 differ
=== added directory 'data/tribes/immovables/resi/frisians'
=== added directory 'data/tribes/immovables/resi/frisians/helptexts'
=== added file 'data/tribes/immovables/resi/frisians/helptexts/coal_1.lua'
--- data/tribes/immovables/resi/frisians/helptexts/coal_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/coal_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is only a little bit of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/coal_2.lua'
--- data/tribes/immovables/resi/frisians/helptexts/coal_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/coal_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("Coal veins contain coal that can be dug up by coal mines."),
+         -- TRANSLATORS: Helptext for a resource: Coal
+         _("There is a lot of coal here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/gold_1.lua'
--- data/tribes/immovables/resi/frisians/helptexts/gold_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/gold_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is only a little bit of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/gold_2.lua'
--- data/tribes/immovables/resi/frisians/helptexts/gold_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/gold_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("Gold veins contain gold ore that can be dug up by gold mines."),
+         -- TRANSLATORS: Helptext for a resource: Gold
+         _("There is a lot of gold here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/iron_1.lua'
--- data/tribes/immovables/resi/frisians/helptexts/iron_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/iron_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is only a little bit of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/iron_2.lua'
--- data/tribes/immovables/resi/frisians/helptexts/iron_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/iron_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,17 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      default = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("Iron veins contain iron ore that can be dug up by iron mines."),
+         -- TRANSLATORS: Helptext for a resource: Iron
+         _("There is a lot of iron here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/none.lua'
--- data/tribes/immovables/resi/frisians/helptexts/none.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/none.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: No resources
+      default = _("There are no resources in the ground here.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/stones_1.lua'
--- data/tribes/immovables/resi/frisians/helptexts/stones_1.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/stones_1.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are only a few precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is only a little bit of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is only a little bit of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/stones_2.lua'
--- data/tribes/immovables/resi/frisians/helptexts/stones_2.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/stones_2.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,27 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
+         _("There are many precious stones here.")),
+      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("Granite is a basic building material and can be dug up by a granite mine."),
+         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
+         _("There is a lot of granite here.")),
+      empire = pgettext("sentence_separator", "%s %s"):bformat(
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
+         -- TRANSLATORS: Helptext for an Empire resource: Stones
+         _("There is a lot of marble here."))
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/helptexts/water.lua'
--- data/tribes/immovables/resi/frisians/helptexts/water.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/helptexts/water.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,14 @@
+function immovable_helptext(tribe)
+   local helptext = {
+      -- TRANSLATORS: Helptext for a resource: Water
+      default = _("There is water in the ground here that can be pulled up by a well.")
+   }
+   local result = ""
+   if tribe then
+      result = helptext[tribe]
+   else
+      result = helptext["default"]
+   end
+   if (result == nil) then result = "" end
+   return result
+end

=== added file 'data/tribes/immovables/resi/frisians/init.lua'
--- data/tribes/immovables/resi/frisians/init.lua	1970-01-01 00:00:00 +0000
+++ data/tribes/immovables/resi/frisians/init.lua	2018-08-29 17:40:17 +0000
@@ -0,0 +1,240 @@
+dirname = path.dirname(__file__)
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_none",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: None"),
+   helptext_script = dirname .. "helptexts/none.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = { dirname .. "png/none.png" },
+         hotspot = {2, 49},
+         scale = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_water",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Water Vein"),
+   helptext_script = dirname .. "helptexts/water.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/water_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_coal_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/coal_1_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_gold_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/gold_1_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_iron_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/iron_1_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_stones_1",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Some Stones"),
+   helptext_script = dirname .. "helptexts/stones_1.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/stones_1_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_coal_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Coal Vein"),
+   helptext_script = dirname .. "helptexts/coal_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/coal_2_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_gold_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Gold Vein"),
+   helptext_script = dirname .. "helptexts/gold_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/gold_2_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_iron_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: Main Iron Vein"),
+   helptext_script = dirname .. "helptexts/iron_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/iron_2_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}
+
+tribes:new_immovable_type {
+   msgctxt = "immovable",
+   name = "frisians_resi_stones_2",
+   -- TRANSLATORS: This is a resource name used in lists of resources
+   descname = pgettext("immovable", "Resources: A Lot of Stones"),
+   helptext_script = dirname .. "helptexts/stones_2.lua",
+   attributes = { "resi" },
+   programs = {
+      program = {
+         "animate=idle 600000",
+         "remove="
+      }
+   },
+
+   animations = {
+      idle = {
+         pictures = path.list_files(dirname .. "png/stones_2_?.png"),
+         hotspot = {2, 49},
+         scale = 4,
+         fps = 4,
+      },
+   }
+}

=== added directory 'data/tribes/immovables/resi/frisians/png'
=== added file 'data/tribes/immovables/resi/frisians/png/coal_1_0.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_1_1.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_1_2.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_1_3.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_2_0.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_2_1.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_2_2.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/coal_2_3.png'
Binary files data/tribes/immovables/resi/frisians/png/coal_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/coal_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_1_0.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_1_1.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_1_2.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_1_3.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_2_0.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_2_1.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_2_2.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/gold_2_3.png'
Binary files data/tribes/immovables/resi/frisians/png/gold_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/gold_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_1_0.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_1_1.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_1_2.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_1_3.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_2_0.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_2_1.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_2_2.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/iron_2_3.png'
Binary files data/tribes/immovables/resi/frisians/png/iron_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/iron_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/none.png'
Binary files data/tribes/immovables/resi/frisians/png/none.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/none.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_1_0.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_1_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_1_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_1_1.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_1_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_1_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_1_2.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_1_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_1_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_1_3.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_1_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_1_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_2_0.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_2_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_2_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_2_1.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_2_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_2_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_2_2.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_2_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_2_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/stones_2_3.png'
Binary files data/tribes/immovables/resi/frisians/png/stones_2_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/stones_2_3.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/water_0.png'
Binary files data/tribes/immovables/resi/frisians/png/water_0.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/water_0.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/water_1.png'
Binary files data/tribes/immovables/resi/frisians/png/water_1.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/water_1.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/water_2.png'
Binary files data/tribes/immovables/resi/frisians/png/water_2.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/water_2.png	2018-08-29 17:40:17 +0000 differ
=== added file 'data/tribes/immovables/resi/frisians/png/water_3.png'
Binary files data/tribes/immovables/resi/frisians/png/water_3.png	1970-01-01 00:00:00 +0000 and data/tribes/immovables/resi/frisians/png/water_3.png	2018-08-29 17:40:17 +0000 differ
=== removed directory 'data/tribes/immovables/resi_coal1'
=== removed file 'data/tribes/immovables/resi_coal1/helptexts.lua'
--- data/tribes/immovables/resi_coal1/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_coal1/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,17 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      default = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a resource: Coal
-         _("Coal veins contain coal that can be dug up by coal mines."),
-         -- TRANSLATORS: Helptext for a resource: Coal
-         _("There is only a little bit of coal here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_coal1/idle_00.png'
Binary files data/tribes/immovables/resi_coal1/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_coal1/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_coal1/init.lua'
--- data/tribes/immovables/resi_coal1/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_coal1/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_coal1",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Coal Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_coal2'
=== removed file 'data/tribes/immovables/resi_coal2/helptexts.lua'
--- data/tribes/immovables/resi_coal2/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_coal2/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,17 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      default = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a resource: Coal
-         _("Coal veins contain coal that can be dug up by coal mines."),
-         -- TRANSLATORS: Helptext for a resource: Coal
-         _("There is a lot of coal here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_coal2/idle_00.png'
Binary files data/tribes/immovables/resi_coal2/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_coal2/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_coal2/init.lua'
--- data/tribes/immovables/resi_coal2/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_coal2/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_coal2",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Main Coal Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_gold1'
=== removed file 'data/tribes/immovables/resi_gold1/helptexts.lua'
--- data/tribes/immovables/resi_gold1/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_gold1/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,17 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      default = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a resource: Gold
-         _("Gold veins contain gold ore that can be dug up by gold mines."),
-         -- TRANSLATORS: Helptext for a resource: Gold
-         _("There is only a little bit of gold here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_gold1/idle_00.png'
Binary files data/tribes/immovables/resi_gold1/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_gold1/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_gold1/init.lua'
--- data/tribes/immovables/resi_gold1/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_gold1/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_gold1",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Gold Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_gold2'
=== removed file 'data/tribes/immovables/resi_gold2/helptexts.lua'
--- data/tribes/immovables/resi_gold2/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_gold2/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,17 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      default = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a resource: Gold
-         _("Gold veins contain gold ore that can be dug up by gold mines."),
-         -- TRANSLATORS: Helptext for a resource: Gold
-         _("There is a lot of gold here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_gold2/idle_00.png'
Binary files data/tribes/immovables/resi_gold2/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_gold2/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_gold2/init.lua'
--- data/tribes/immovables/resi_gold2/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_gold2/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_gold2",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Main Gold Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_iron1'
=== removed file 'data/tribes/immovables/resi_iron1/helptexts.lua'
--- data/tribes/immovables/resi_iron1/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_iron1/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,17 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      default = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a resource: Iron
-         _("Iron veins contain iron ore that can be dug up by iron mines."),
-         -- TRANSLATORS: Helptext for a resource: Iron
-         _("There is only a little bit of iron here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_iron1/idle_00.png'
Binary files data/tribes/immovables/resi_iron1/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_iron1/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_iron1/init.lua'
--- data/tribes/immovables/resi_iron1/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_iron1/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_iron1",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Iron Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_iron2'
=== removed file 'data/tribes/immovables/resi_iron2/helptexts.lua'
--- data/tribes/immovables/resi_iron2/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_iron2/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,17 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      default = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a resource: Iron
-         _("Iron veins contain iron ore that can be dug up by iron mines."),
-         -- TRANSLATORS: Helptext for a resource: Iron
-         _("There is a lot of iron here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_iron2/idle_00.png'
Binary files data/tribes/immovables/resi_iron2/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_iron2/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_iron2/init.lua'
--- data/tribes/immovables/resi_iron2/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_iron2/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_iron2",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Main Iron Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_none'
=== removed file 'data/tribes/immovables/resi_none/helptexts.lua'
--- data/tribes/immovables/resi_none/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_none/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,14 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      -- TRANSLATORS: Helptext for a resource: No resources
-      default = _("There are no resources in the ground here.")
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_none/idle_00.png'
Binary files data/tribes/immovables/resi_none/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_none/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_none/init.lua'
--- data/tribes/immovables/resi_none/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_none/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_none",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: None"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_stones1'
=== removed file 'data/tribes/immovables/resi_stones1/helptexts.lua'
--- data/tribes/immovables/resi_stones1/helptexts.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_stones1/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,27 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
-         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
-         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
-         _("There are only a few precious stones here.")),
-      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
-         _("Granite is a basic building material and can be dug up by a granite mine."),
-         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
-         _("There is only a little bit of granite here.")),
-      empire = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for an Empire resource: Stones
-         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
-         -- TRANSLATORS: Helptext for an Empire resource: Stones
-         _("There is only a little bit of marble here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_stones1/idle_00.png'
Binary files data/tribes/immovables/resi_stones1/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_stones1/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_stones1/init.lua'
--- data/tribes/immovables/resi_stones1/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_stones1/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_stones1",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Some Stones"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_stones2'
=== removed file 'data/tribes/immovables/resi_stones2/helptexts.lua'
--- data/tribes/immovables/resi_stones2/helptexts.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_stones2/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,27 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      atlanteans = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
-         _("Precious stones are used in the construction of big buildings. They can be dug up by a crystal mine. You will also get granite from the mine."),
-         -- TRANSLATORS: Helptext for an Atlantean resource: Stones
-         _("There are many precious stones here.")),
-      barbarians = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
-         _("Granite is a basic building material and can be dug up by a granite mine."),
-         -- TRANSLATORS: Helptext for a Barbarian resource: Stones
-         _("There is a lot of granite here.")),
-      empire = pgettext("sentence_separator", "%s %s"):bformat(
-         -- TRANSLATORS: Helptext for an Empire resource: Stones
-         _("Marble is a basic building material and can be dug up by a marble mine. You will also get granite from the mine."),
-         -- TRANSLATORS: Helptext for an Empire resource: Stones
-         _("There is a lot of marble here."))
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_stones2/idle_00.png'
Binary files data/tribes/immovables/resi_stones2/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_stones2/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_stones2/init.lua'
--- data/tribes/immovables/resi_stones2/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_stones2/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_stones2",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: A Lot of Stones"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== removed directory 'data/tribes/immovables/resi_water1'
=== removed file 'data/tribes/immovables/resi_water1/helptexts.lua'
--- data/tribes/immovables/resi_water1/helptexts.lua	2017-11-12 16:21:28 +0000
+++ data/tribes/immovables/resi_water1/helptexts.lua	1970-01-01 00:00:00 +0000
@@ -1,14 +0,0 @@
-function immovable_helptext(tribe)
-   local helptext = {
-      -- TRANSLATORS: Helptext for a resource: Water
-      default = _("There is water in the ground here that can be pulled up by a well.")
-   }
-   local result = ""
-   if tribe then
-      result = helptext[tribe]
-   else
-      result = helptext["default"]
-   end
-   if (result == nil) then result = "" end
-   return result
-end

=== removed file 'data/tribes/immovables/resi_water1/idle_00.png'
Binary files data/tribes/immovables/resi_water1/idle_00.png	2014-12-12 10:21:43 +0000 and data/tribes/immovables/resi_water1/idle_00.png	1970-01-01 00:00:00 +0000 differ
=== removed file 'data/tribes/immovables/resi_water1/init.lua'
--- data/tribes/immovables/resi_water1/init.lua	2017-11-18 14:19:28 +0000
+++ data/tribes/immovables/resi_water1/init.lua	1970-01-01 00:00:00 +0000
@@ -1,23 +0,0 @@
-dirname = path.dirname(__file__)
-
-tribes:new_immovable_type {
-   msgctxt = "immovable",
-   name = "resi_water1",
-   -- TRANSLATORS: This is a resource name used in lists of resources
-   descname = pgettext("immovable", "Resources: Water Vein"),
-   helptext_script = dirname .. "helptexts.lua",
-   attributes = { "resi" },
-   programs = {
-      program = {
-         "animate=idle 600000",
-         "remove="
-      }
-   },
-
-   animations = {
-      idle = {
-         pictures = path.list_files(dirname .. "idle_??.png"),
-         hotspot = { 7, 10 },
-      },
-   }
-}

=== modified file 'data/tribes/init.lua'
--- data/tribes/init.lua	2018-07-15 10:32:12 +0000
+++ data/tribes/init.lua	2018-08-29 17:40:17 +0000
@@ -179,16 +179,10 @@
       include "tribes/immovables/reed_ripe/init.lua"
       include "tribes/immovables/reed_small/init.lua"
       include "tribes/immovables/reed_tiny/init.lua"
-      include "tribes/immovables/resi_coal1/init.lua"
-      include "tribes/immovables/resi_coal2/init.lua"
-      include "tribes/immovables/resi_gold1/init.lua"
-      include "tribes/immovables/resi_gold2/init.lua"
-      include "tribes/immovables/resi_iron1/init.lua"
-      include "tribes/immovables/resi_iron2/init.lua"
-      include "tribes/immovables/resi_none/init.lua"
-      include "tribes/immovables/resi_stones1/init.lua"
-      include "tribes/immovables/resi_stones2/init.lua"
-      include "tribes/immovables/resi_water1/init.lua"
+      include "tribes/immovables/resi/atlanteans/init.lua"
+      include "tribes/immovables/resi/barbarians/init.lua"
+      include "tribes/immovables/resi/empire/init.lua"
+      include "tribes/immovables/resi/frisians/init.lua"
       include "tribes/immovables/shipconstruction_atlanteans/init.lua"
       include "tribes/immovables/shipconstruction_barbarians/init.lua"
       include "tribes/immovables/shipconstruction_empire/init.lua"

=== modified file 'src/logic/editor_game_base.cc'
--- src/logic/editor_game_base.cc	2018-04-27 06:11:05 +0000
+++ src/logic/editor_game_base.cc	2018-08-29 17:40:17 +0000
@@ -42,6 +42,7 @@
 #include "logic/map_objects/tribes/ware_descr.h"
 #include "logic/map_objects/tribes/worker.h"
 #include "logic/map_objects/world/critter.h"
+#include "logic/map_objects/world/resource_description.h"
 #include "logic/map_objects/world/world.h"
 #include "logic/mapregion.h"
 #include "logic/player.h"
@@ -199,6 +200,20 @@
 	assert(tribes_);
 	tribes_->postload();
 
+	for (DescriptionIndex i = 0; i < tribes_->nrtribes(); i++) {
+		const TribeDescr* tribe = tribes_->get_tribe_descr(i);
+		for (DescriptionIndex j = 0; j < world_->get_nr_resources(); j++) {
+			const ResourceDescription* res = world_->get_resource(j);
+			if (res->detectable()) {
+				// This function will throw an exception if this tribe doesn't
+				// have a high enough resource indicator for this resource
+				tribe->get_resource_indicator(res, res->max_amount());
+			}
+		}
+		// For the "none" indicator
+		tribe->get_resource_indicator(nullptr, 0);
+	}
+
 	// TODO(unknown): postload players? (maybe)
 }
 

=== modified file 'src/logic/map_objects/tribes/tribe_descr.cc'
--- src/logic/map_objects/tribes/tribe_descr.cc	2018-04-07 16:59:00 +0000
+++ src/logic/map_objects/tribes/tribe_descr.cc	2018-08-29 17:40:17 +0000
@@ -162,6 +162,20 @@
 			}
 		}
 
+		items_table = table.get_table("resource_indicators");
+		for (std::string resource : items_table->keys<std::string>()) {
+			ResourceIndicatorList resis;
+			std::unique_ptr<LuaTable> tbl = items_table->get_table(resource);
+			const std::set<int> keys = tbl->keys<int>();
+			for (int upper_limit : keys) {
+				resis[upper_limit] = tribes_.safe_immovable_index(tbl->get_string(upper_limit));
+			}
+			if (resis.empty()) {
+				throw GameDataError("Tribe has no indicators for resource %s.", resource.c_str());
+			}
+			resource_indicators_[resource] = resis;
+		};
+
 		ship_names_ = table.get_table("ship_names")->array_entries<std::string>();
 
 		for (const std::string& buildingname :
@@ -374,41 +388,31 @@
 DescriptionIndex TribeDescr::get_resource_indicator(ResourceDescription const* const res,
                                                     const ResourceAmount amount) const {
 	if (!res || !amount) {
-		DescriptionIndex idx = immovable_index("resi_none");
-		if (!has_immovable(idx)) {
-			throw GameDataError("There is no resource indicator for resi_none!");
-		}
-		return idx;
-	}
-
-	int32_t i = 1;
-	int32_t num_indicators = 0;
-	for (;;) {
-		const std::string resi_filename =
-		   (boost::format("resi_%s%i") % res->name().c_str() % i).str();
-		if (!has_immovable(immovable_index(resi_filename))) {
-			break;
-		}
-		++i;
-		++num_indicators;
-	}
-
-	if (!num_indicators) {
-		throw GameDataError("There is no resource indicator for resource %s", res->name().c_str());
-	}
-
-	int32_t bestmatch =
-	   static_cast<int32_t>((static_cast<float>(amount) / res->max_amount()) * num_indicators);
-	if (bestmatch > num_indicators) {
-		throw GameDataError("Amount of %s is %i but max amount is %i", res->name().c_str(),
-		                    static_cast<unsigned int>(amount),
-		                    static_cast<unsigned int>(res->max_amount()));
-	}
-	if (amount < res->max_amount()) {
-		bestmatch += 1;  // Resi start with 1, not 0
-	}
-
-	return immovable_index((boost::format("resi_%s%i") % res->name().c_str() % bestmatch).str());
+		auto list = resource_indicators_.find("");
+		if (list == resource_indicators_.end() || list->second.empty())
+			throw GameDataError("Tribe '%s' has no indicator for no resources!", descname_.c_str());
+		return list->second.begin()->second;
+	}
+
+	auto list = resource_indicators_.find(res->name());
+	if (list == resource_indicators_.end() || list->second.empty())
+		throw GameDataError("Tribe '%s' has no indicators for resource '%s'!", descname_.c_str(), res->name().c_str());
+
+	uint32_t lowest = 0;
+	for (ResourceIndicatorList::const_iterator it = list->second.begin(); it != list->second.end(); it++) {
+		if (it->first < amount)
+			continue;
+		else if (lowest < amount || it->first < lowest)
+			lowest = it->first;
+	}
+
+	if (lowest < amount) {
+		throw GameDataError(
+				"Tribe '%s' has no indicators for amount %i of resource '%s' (highest possible amount is %i)!",
+				descname_.c_str(), amount, res->name().c_str(), lowest);
+	}
+
+	return list->second.find(lowest)->second;
 }
 
 void TribeDescr::resize_ware_orders(size_t maxLength) {

=== modified file 'src/logic/map_objects/tribes/tribe_descr.h'
--- src/logic/map_objects/tribes/tribe_descr.h	2018-04-07 16:59:00 +0000
+++ src/logic/map_objects/tribes/tribe_descr.h	2018-08-29 17:40:17 +0000
@@ -49,6 +49,16 @@
 struct Event;
 
 /*
+Resource indicators:
+A ResiSet maps the resource name to a ResiList.
+A ResiList maps resource amounts to the DescrIndex of an immovable this player uses.
+Special case: The ResiList mapped to "" contains resis that will be used in locations
+without resources. If it has several entries, result is arbitrary.
+*/
+using ResourceIndicatorList = std::map<uint32_t, DescriptionIndex>;
+using ResourceIndicatorSet = std::map<std::string, ResourceIndicatorList>;
+
+/*
 Tribes
 ------
 
@@ -72,6 +82,7 @@
 	const std::set<DescriptionIndex>& wares() const;
 	const std::set<DescriptionIndex>& workers() const;
 	const std::set<DescriptionIndex>& immovables() const;
+	const ResourceIndicatorSet& resource_indicators() const;
 
 	bool has_building(const DescriptionIndex& index) const;
 	bool has_ware(const DescriptionIndex& index) const;
@@ -184,6 +195,7 @@
 	std::vector<std::string> ship_names_;
 	std::set<DescriptionIndex> workers_;
 	std::set<DescriptionIndex> wares_;
+	ResourceIndicatorSet resource_indicators_;
 	// The wares that are used by construction sites
 	std::set<DescriptionIndex> construction_materials_;
 	// Special units. Some of them are used by the engine, some are only used by the AI.

=== modified file 'src/map_io/tribes_legacy_lookup_table.cc'
--- src/map_io/tribes_legacy_lookup_table.cc	2018-04-07 16:59:00 +0000
+++ src/map_io/tribes_legacy_lookup_table.cc	2018-08-29 17:40:17 +0000
@@ -194,9 +194,19 @@
                           {"cornfield_m", "cornfield_medium"},
                           {"cornfield_s", "cornfield_small"},
                           {"cornfield_t", "cornfield_tiny"},
-                          {"resi_granite1", "resi_stones1"},
-                          {"resi_granite2", "resi_stones2"},
+                          {"resi_granite1", "atlanteans_resi_stones_1"},
+                          {"resi_granite2", "atlanteans_resi_stones_2"},
                           {"shipconstruction", "atlanteans_shipconstruction"},
+                          {"resi_coal1", "atlanteans_resi_coal_1"},
+                          {"resi_iron1", "atlanteans_resi_iron_1"},
+                          {"resi_gold1", "atlanteans_resi_gold_1"},
+                          {"resi_stones1", "atlanteans_resi_stones_1"},
+                          {"resi_coal2", "atlanteans_resi_coal_2"},
+                          {"resi_iron2", "atlanteans_resi_iron_2"},
+                          {"resi_gold2", "atlanteans_resi_gold_2"},
+                          {"resi_stones2", "atlanteans_resi_stones_2"},
+                          {"resi_none", "atlanteans_resi_none"},
+                          {"resi_water1", "atlanteans_resi_water"},
                        }),
         std::make_pair("barbarians",
                        std::map<std::string, std::string>{
@@ -209,9 +219,19 @@
                           {"reed0s", "reed_small"},
                           {"reed0t", "reed_tiny"},
                           {"reed1", "reed_ripe"},
-                          {"resi_granite1", "resi_stones1"},
-                          {"resi_granite2", "resi_stones2"},
+                          {"resi_granite1", "barbarians_resi_stones_1"},
+                          {"resi_granite2", "barbarians_resi_stones_2"},
                           {"shipconstruction", "barbarians_shipconstruction"},
+                          {"resi_coal1", "barbarians_resi_coal_1"},
+                          {"resi_iron1", "barbarians_resi_iron_1"},
+                          {"resi_gold1", "barbarians_resi_gold_1"},
+                          {"resi_stones1", "barbarians_resi_stones_1"},
+                          {"resi_coal2", "barbarians_resi_coal_2"},
+                          {"resi_iron2", "barbarians_resi_iron_2"},
+                          {"resi_gold2", "barbarians_resi_gold_2"},
+                          {"resi_stones2", "barbarians_resi_stones_2"},
+                          {"resi_none", "barbarians_resi_none"},
+                          {"resi_water1", "barbarians_resi_water"},
                        }),
         std::make_pair("empire",
                        std::map<std::string, std::string>{
@@ -224,9 +244,32 @@
                           {"wine0s", "grapevine_small"},
                           {"wine0t", "grapevine_tiny"},
                           {"wine1", "grapevine_ripe"},
-                          {"resi_granite1", "resi_stones1"},
-                          {"resi_granite2", "resi_stones2"},
+                          {"resi_granite1", "empire_resi_stones_1"},
+                          {"resi_granite2", "empire_resi_stones_2"},
                           {"shipconstruction", "empire_shipconstruction"},
+                          {"resi_coal1", "empire_resi_coal_1"},
+                          {"resi_iron1", "empire_resi_iron_1"},
+                          {"resi_gold1", "empire_resi_gold_1"},
+                          {"resi_stones1", "empire_resi_stones_1"},
+                          {"resi_coal2", "empire_resi_coal_2"},
+                          {"resi_iron2", "empire_resi_iron_2"},
+                          {"resi_gold2", "empire_resi_gold_2"},
+                          {"resi_stones2", "empire_resi_stones_2"},
+                          {"resi_none", "empire_resi_none"},
+                          {"resi_water1", "empire_resi_water"},
+                       }),
+        std::make_pair("frisians",
+                       std::map<std::string, std::string>{
+                          {"resi_coal1", "frisians_resi_coal_1"},
+                          {"resi_iron1", "frisians_resi_iron_1"},
+                          {"resi_gold1", "frisians_resi_gold_1"},
+                          {"resi_stones1", "frisians_resi_stones_1"},
+                          {"resi_coal2", "frisians_resi_coal_2"},
+                          {"resi_iron2", "frisians_resi_iron_2"},
+                          {"resi_gold2", "frisians_resi_gold_2"},
+                          {"resi_stones2", "frisians_resi_stones_2"},
+                          {"resi_none", "frisians_resi_none"},
+                          {"resi_water1", "frisians_resi_water"},
                        }),
      } {
 }


Follow ups