diff --git a/game/engine/Actor.lua b/game/engine/Actor.lua index 3c5b499ace3eb34c397743c31c0ef50b7ee2caf0..ae58809e84916d5414e74c752ad6a1f23d22bed3 100644 --- a/game/engine/Actor.lua +++ b/game/engine/Actor.lua @@ -189,7 +189,8 @@ function _M:teleportRandom(x, y, dist, min_dist) if game.level.map:isBound(i, j) and core.fov.distance(x, y, i, j) <= dist and core.fov.distance(x, y, i, j) >= min_dist and - self:canMove(i, j) then + self:canMove(i, j) and + not game.level.map.attrs(i, j, "no_teleport") then poss[#poss+1] = {i,j} end end diff --git a/game/engine/Faction.lua b/game/engine/Faction.lua index 56b4acc65a72ed4856e5f74a102a6edb75b7b814..df64df8aecbe36a2cf05f5b2cf94425b4001cbf7 100644 --- a/game/engine/Faction.lua +++ b/game/engine/Faction.lua @@ -90,6 +90,7 @@ end -- @param reaction a numerical value representing the reaction, 0 is neutral, <0 is aggressive, >0 is friendly. -- @param mutual if true the same status will be set for f2 toward f1. function _M:setFactionReaction(f1, f2, reaction, mutual) + reaction = util.bound(reaction, -100, 100) print("[FACTION]", f1, f2, reaction, mutual) -- Faction always like itself if f1 == f2 then return end diff --git a/game/engine/Map.lua b/game/engine/Map.lua index 75a9f365a07bee2513364c32e9c0775c2d05265b..636e69674cd21d75ac29c750276222964a662249 100644 --- a/game/engine/Map.lua +++ b/game/engine/Map.lua @@ -193,6 +193,7 @@ function _M:init(w, h) self.my = 0 self.w, self.h = w, h self.map = {} + self.attrs = {} self.lites = {} self.seens = {} self.has_seens = {} @@ -292,12 +293,21 @@ function _M:loaded() end return t[x + y * self.w] end + local mapattrs = function(t, x, y, k, v) + if x < 0 or y < 0 or x >= self.w or y >= self.h then return end + if v ~= nil then + if not t[x + y * self.w] then t[x + y * self.w] = {} end + t[x + y * self.w][k] = v + end + return t[x + y * self.w] and t[x + y * self.w][k] + end getmetatable(self).__call = _M.call setmetatable(self.lites, {__call = maplite}) setmetatable(self.seens, {__call = mapseen}) setmetatable(self.has_seens, {__call = maphasseen}) setmetatable(self.remembers, {__call = mapremember}) + setmetatable(self.attrs, {__call = mapattrs}) self.surface = core.display.newSurface(self.viewport.width, self.viewport.height) self.changed = true diff --git a/game/engine/generator/map/Static.lua b/game/engine/generator/map/Static.lua index 11af8de17135d8910955de7d7ce2d6d1b845b631..a87d8485de6a4a6a03a48de2e8609cb6b52999f4 100644 --- a/game/engine/generator/map/Static.lua +++ b/game/engine/generator/map/Static.lua @@ -52,10 +52,10 @@ function _M:loadMap(file) defineTile = function(char, grid, obj, actor, trap, status) t[char] = {grid=grid, object=obj, actor=actor, trap=trap, status=status} end, - quickEntity = function(char, e) + quickEntity = function(char, e, status) if type(e) == "table" then local e = self.zone.grid_class.new(e) - t[char] = {grid=e} + t[char] = {grid=e, status=status} else t[char] = t[e] end @@ -174,8 +174,9 @@ function _M:generate(lev, old_lev) end if status then - if status.lite then self.level.map.lites(i-1, j-1, true) end - if status.remember then self.level.map.remembers(i-1, j-1, true) end + if status.lite then self.level.map.lites(i-1, j-1, true) status.lite = nil end + if status.remember then self.level.map.remembers(i-1, j-1, true) status.remember = nil end + if pairs(status) then for k, v in pairs(status) do self.level.map.attrs(i-1, j-1, k, v) end end end end end diff --git a/game/engine/interface/ActorTalents.lua b/game/engine/interface/ActorTalents.lua index 901901fd1d45bf68dc122175af1d445f1ab34825..3cd98b43317f6f41028e2e235f6fa439210cd7f3 100644 --- a/game/engine/interface/ActorTalents.lua +++ b/game/engine/interface/ActorTalents.lua @@ -79,6 +79,7 @@ function _M:newTalent(t) table.insert(self.talents_def, t) t.id = #self.talents_def + assert(not self["T_"..t.short_name], "talent already exists with id T_"..t.short_name) self["T_"..t.short_name] = #self.talents_def print("[TALENT]", t.name, t.short_name, #self.talents_def) diff --git a/game/modules/tome/class/Actor.lua b/game/modules/tome/class/Actor.lua index 1e34aa028b8d3ce8ffd6316d3a2ecfa803a7f9d5..4d24236809a965dca6b7e8f1b4834a6505de8f28 100644 --- a/game/modules/tome/class/Actor.lua +++ b/game/modules/tome/class/Actor.lua @@ -393,9 +393,9 @@ end function _M:tooltip(x, y, seen_by) if seen_by and not seen_by:canSee(self) then return end - local factcolor, factstate = "#ANTIQUE_WHITE#", "neutral" - if self:reactionToward(game.player) < 0 then factcolor, factstate = "#LIGHT_RED#", "hostile" - elseif self:reactionToward(game.player) > 0 then factcolor, factstate = "#LIGHT_GREEN#", "friendly" + local factcolor, factstate, factlevel = "#ANTIQUE_WHITE#", "neutral", self:reactionToward(game.player) + if factlevel < 0 then factcolor, factstate = "#LIGHT_RED#", "hostile" + elseif factlevel > 0 then factcolor, factstate = "#LIGHT_GREEN#", "friendly" end local rank, rank_color = self:TextRank() @@ -427,7 +427,7 @@ Stats: %d / %d / %d / %d / %d / %d Resists: %s Size: #ANTIQUE_WHITE#%s %s -Faction: %s%s (%s) +Faction: %s%s (%s, %d) %s]]):format( self:getDisplayString(), rank_color, self.name, rank_color, rank, @@ -444,7 +444,7 @@ Faction: %s%s (%s) table.concat(resists, ','), self:TextSizeCategory(), self.desc or "", - factcolor, Faction.factions[self.faction].name, factstate, + factcolor, Faction.factions[self.faction].name, factstate, factlevel, table.concat(effs, "\n") ) end diff --git a/game/modules/tome/class/Game.lua b/game/modules/tome/class/Game.lua index a32fa00b19d652a65fab2c8ba89067b67fc77144..811aaef28f850e62eca0ac064253facf029ce39e 100644 --- a/game/modules/tome/class/Game.lua +++ b/game/modules/tome/class/Game.lua @@ -474,7 +474,8 @@ function _M:setupCommands() self.player.esp.all = 1 self.player.esp.range = 50 self.player.inc_damage.all = 100000 - self:changeLevel(15, "high-peak") +-- self:changeLevel(15, "high-peak") + self:changeLevel(1, "town-gates-of-morning") -- self:changeLevel(1, "wilderness-arda-fareast") -- game.memory_levels["wilderness-arda-fareast-1"] = game.level -- self.player:grantQuest("orc-pride") diff --git a/game/modules/tome/class/NPC.lua b/game/modules/tome/class/NPC.lua index dde58a4eb47a07f89b72bf72017f7f26fc8b695e..677730693a0a21f78d15d9e6d15c35c96f54359c 100644 --- a/game/modules/tome/class/NPC.lua +++ b/game/modules/tome/class/NPC.lua @@ -60,14 +60,18 @@ function _M:onTakeHit(value, src) end if Faction:get(self.faction) and Faction:get(self.faction).hostile_on_attack then - Faction:setFactionReaction(self.faction, src.faction, -100, true) + Faction:setFactionReaction(self.faction, src.faction, Faction:factionReaction(self.faction, src.faction) - self.rank * 5, true) end return mod.class.Actor.onTakeHit(self, value, src) end function _M:die(src) - -- Sefl resurrect, mouhaha! + if Faction:get(self.faction) and Faction:get(self.faction).hostile_on_attack then + Faction:setFactionReaction(self.faction, src.faction, Faction:factionReaction(self.faction, src.faction) - self.rank * 15, true) + end + + -- Self resurrect, mouhaha! if self:attr("self_resurrect") then self:attr("self_resurrect", -1) game.logSeen(src, "#LIGHT_RED#%s raises from the dead!", self.name:capitalize()) -- src, not self as the source, to make sure the player knows his doom ;> diff --git a/game/modules/tome/data/maps/towns/gates-of-morning.lua b/game/modules/tome/data/maps/towns/gates-of-morning.lua index b80bd8c01775a6005e5c5bdf51b9d489295d7e22..122d5c1f63e38843932c5306cb035c34ade0f6d7 100644 --- a/game/modules/tome/data/maps/towns/gates-of-morning.lua +++ b/game/modules/tome/data/maps/towns/gates-of-morning.lua @@ -17,38 +17,39 @@ -- Nicolas Casalini "DarkGod" -- darkgod@te4.org -defineTile(' ', "FLOOR") -quickEntity('M', {always_remember = true, show_tooltip=true, name='Sun Wall', display='^', color=colors.GOLD, back_color=colors.CRIMSON, image="terrain/mountain.png", tint=colors.GOLD, block_move=true}) -quickEntity('<', {show_tooltip=true, name='into the wild', display='<', color=colors.WHITE, change_level=1, change_zone="wilderness-arda-fareast"}) -quickEntity('S', {name='brick roof top', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}) -quickEntity('s', {name='brick roof', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}) -quickEntity('t', {name='brick roof chimney', display='#', color=colors.LIGHT_RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}) -quickEntity('#', {name='wall', display='#', color=colors.WHITE, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}) -quickEntity('T', {name='tree', display='#', color=colors.LIGHT_GREEN, block_move=true, block_sight=true, image="terrain/grass.png", add_displays = {mod.class.Grid.new{image="terrain/tree_alpha2.png"}}}) -quickEntity('P', {name='palm tree', display='#', color=colors.LIGHT_GREEN, back_color={r=163,g=149,b=42}, image="terrain/palmtree.png", block_move=true}) -quickEntity('~', {name='river', display='~', color=colors.BLUE, block_move=true, image="terrain/river.png", add_displays = mod.class.Grid:makeWater(true)}) -quickEntity('O', {name='cobblestone road', display='.', color=colors.WHITE, image="terrain/stone_road1.png"}) -quickEntity(':', {name='sand', display='.', color={r=203,g=189,b=72}, back_color={r=163,g=149,b=42}, image="terrain/sand.png", can_encounter="desert", equilibrium_level=-10}) +defineTile(' ', "FLOOR", nil, nil, nil, {no_teleport=true}) +quickEntity('M', {always_remember = true, show_tooltip=true, name='Sun Wall', display='^', color=colors.GOLD, back_color=colors.CRIMSON, image="terrain/mountain.png", tint=colors.GOLD, block_move=true}, {no_teleport=true}) +quickEntity('<', {show_tooltip=true, name='into the wild', display='<', color=colors.WHITE, change_level=1, change_zone="wilderness-arda-fareast"}, {no_teleport=true}) +quickEntity('S', {name='brick roof top', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true}) +quickEntity('s', {name='brick roof', display='#', color=colors.RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true}) +quickEntity('t', {name='brick roof chimney', display='#', color=colors.LIGHT_RED, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true}) +quickEntity('#', {name='wall', display='#', color=colors.WHITE, block_move=true, block_sight=true, image="terrain/wood_wall1.png"}, {no_teleport=true}) +quickEntity('T', {name='tree', display='#', color=colors.LIGHT_GREEN, block_move=true, block_sight=true, image="terrain/grass.png", add_displays = {mod.class.Grid.new{image="terrain/tree_alpha2.png"}}}, {no_teleport=true}) +quickEntity('P', {name='palm tree', display='#', color=colors.LIGHT_GREEN, back_color={r=163,g=149,b=42}, image="terrain/palmtree.png", block_move=true}, {no_teleport=true}) +quickEntity('~', {name='river', display='~', color=colors.BLUE, block_move=true, image="terrain/river.png", add_displays = mod.class.Grid:makeWater(true)}, {no_teleport=true}) +quickEntity('O', {name='cobblestone road', display='.', color=colors.WHITE, image="terrain/stone_road1.png"}, {no_teleport=true}) +quickEntity(':', {name='sand', display='.', color={r=203,g=189,b=72}, back_color={r=163,g=149,b=42}, image="terrain/sand.png", can_encounter="desert", equilibrium_level=-10}, {no_teleport=true}) +quickEntity('"', {name='grass', display='.', color=colors.LIGHT_GREEN, image="terrain/grass.png"}, {no_teleport=true}) quickEntity('-', {name='grass', display='.', color=colors.LIGHT_GREEN, image="terrain/grass.png"}) -quickEntity('^', {name='hills', display='^', color=colors.SLATE, image="terrain/mountain.png", block_move=true, block_sight=true}) +quickEntity('^', {name='hills', display='^', color=colors.SLATE, image="terrain/mountain.png", block_move=true, block_sight=true}, {no_teleport=true}) defineTile('@', "GRASS", nil, "HIGH_SUN_PALADIN_AERYN") -quickEntity('1', {show_tooltip=true, name="Closed store", display='1', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('2', {show_tooltip=true, name="Armour Smith", display='2', color=colors.UMBER, resolvers.store("ARMOR"), image="terrain/wood_store_armor.png"}) -quickEntity('3', {show_tooltip=true, name="Weapon Smith", display='3', color=colors.UMBER, resolvers.store("WEAPON"), image="terrain/wood_store_weapon.png"}) -quickEntity('4', {show_tooltip=true, name="Alchemist", display='4', color=colors.LIGHT_BLUE, resolvers.store("POTION"), image="terrain/wood_store_potion.png"}) -quickEntity('5', {show_tooltip=true, name="Scribe", display='5', color=colors.WHITE, resolvers.store("SCROLL"), resolvers.chatfeature("magic-store"), image="terrain/wood_store_book.png"}) -quickEntity('6', {show_tooltip=true, name="Closed store", display='6', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('7', {show_tooltip=true, name="Closed store", display='7', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('8', {show_tooltip=true, name="Closed store", display='8', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('9', {show_tooltip=true, name="Closed store", display='9', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('0', {show_tooltip=true, name="Closed store", display='0', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('a', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('b', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('c', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('d', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) -quickEntity('e', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}) +quickEntity('1', {show_tooltip=true, name="Closed store", display='1', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('2', {show_tooltip=true, name="Armour Smith", display='2', color=colors.UMBER, resolvers.store("ARMOR"), image="terrain/wood_store_armor.png"}, {no_teleport=true}) +quickEntity('3', {show_tooltip=true, name="Weapon Smith", display='3', color=colors.UMBER, resolvers.store("WEAPON"), image="terrain/wood_store_weapon.png"}, {no_teleport=true}) +quickEntity('4', {show_tooltip=true, name="Alchemist", display='4', color=colors.LIGHT_BLUE, resolvers.store("POTION"), image="terrain/wood_store_potion.png"}, {no_teleport=true}) +quickEntity('5', {show_tooltip=true, name="Scribe", display='5', color=colors.WHITE, resolvers.store("SCROLL"), resolvers.chatfeature("magic-store"), image="terrain/wood_store_book.png"}, {no_teleport=true}) +quickEntity('6', {show_tooltip=true, name="Closed store", display='6', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('7', {show_tooltip=true, name="Closed store", display='7', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('8', {show_tooltip=true, name="Closed store", display='8', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('9', {show_tooltip=true, name="Closed store", display='9', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('0', {show_tooltip=true, name="Closed store", display='0', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('a', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('b', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('c', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('d', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) +quickEntity('e', {show_tooltip=true, name="Closed store", display='*', color=colors.LIGHT_UMBER, block_move=true, block_sight=true, image="terrain/wood_store_closed.png"}, {no_teleport=true}) startx = 0 starty = 27 @@ -91,18 +92,18 @@ MMMMMM O OO MMM MMM O MMM MMM OO MMMM MMM TTTTT O MMMMM -MMM TTTT-----------O------- MMMMM -MMMM TT-----~~~---------------------- MMMMM -MMMMMM TT-----~~~~~------------------::----MMMMMM -MMMMMMMMM------~~~~~-------TT-------::P:::::MMMMMM -MMMMMMMMM-------~~~-----TT-T------::::::::::MMMMMM -MMMMMMMMM-------~~------TTTT-----::::::::P:::MMMMM -MMMMMMMMM-----TT~-------TT------:::::P:::::MMMMMMM -MMMMMMMMM---TTTT~--------------::::::::::::MMMMMMM -MMMMMMMMMM--TTT~~------------::::P::::::::::MMMMMM -MMMMMMMMMMM-TT~~-------------::::::::::::P::::MMMM -MMMMMMMMMMMMMM~MMMMMMMMMM----::::P:::P::::::::MMMM -MMMMMMMMMMMMM~~MMMMMMMMMMM--::::::P::::::::::::MMM +MMM TTTT"""""""""""O""""""" MMMMM +MMMM TT"""""~~~"""""""""""""""""""""" MMMMM +MMMMMM TT"""""~~~~~""""""""""""""""""::""""MMMMMM +MMMMMMMMM""""""~~~~~"""""""TT"""""""::P:::::MMMMMM +MMMMMMMMM"""""""~~~"""""TT"T""""""::::::::::MMMMMM +MMMMMMMMM"""""""~~""""""TTTT"""""::::::::P:::MMMMM +MMMMMMMMM"""""TT~"""""""TT"""""":::::P:::::MMMMMMM +MMMMMMMMM"""TTTT~""""""""""""""::::::::::::MMMMMMM +MMMMMMMMMM""TTT~~""""""""""""::::P::::::::::MMMMMM +MMMMMMMMMMM"TT~~"""""""""""""::::::::::::P::::MMMM +MMMMMMMMMMMMMM~MMMMMMMMMM""""::::P:::P::::::::MMMM +MMMMMMMMMMMMM~~MMMMMMMMMMM""::::::P::::::::::::MMM MMMMMMMM~~~~~~MMMMMMMMMMMMMM:::::::::::::::::MMMMM MMMMMMM~~MMMMMMMMMMMMMMMMMMMMMM::::MMMMMMMMMMMMMMM MMMMMMM~MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM]] diff --git a/game/modules/tome/data/talents/corruptions/rituals.lua b/game/modules/tome/data/talents/corruptions/rituals.lua index 7966a729f16188c8e578e04708cf1dd83f3e5168..7a1d18e65e8238895e0746f721c5b3bf2784c610 100644 --- a/game/modules/tome/data/talents/corruptions/rituals.lua +++ b/game/modules/tome/data/talents/corruptions/rituals.lua @@ -18,7 +18,7 @@ -- darkgod@te4.org newTalent{ - name = "???", + name = "c1???", type = {"corruption/ritual", 1}, require = corrs_req1, points = 5, @@ -40,7 +40,7 @@ newTalent{ } newTalent{ - name = "???", + name = "c2???", type = {"corruption/ritual", 2}, require = corrs_req2, points = 5, @@ -66,7 +66,7 @@ newTalent{ } newTalent{ - name = "???", + name = "c3???", type = {"corruption/ritual", 3}, require = corrs_req3, points = 5, @@ -88,7 +88,7 @@ newTalent{ } newTalent{ - name = "???", + name = "c4???", type = {"corruption/ritual", 4}, require = corrs_req4, points = 5, diff --git a/game/modules/tome/data/talents/spells/storm.lua b/game/modules/tome/data/talents/spells/storm.lua index e4ef64f7fa0d4b3b6aaba67bde04c08fa51b830e..493fe1bdcca59f236a53af519eacae48e24cb2e1 100644 --- a/game/modules/tome/data/talents/spells/storm.lua +++ b/game/modules/tome/data/talents/spells/storm.lua @@ -40,7 +40,7 @@ newTalent{ } newTalent{ - name = "???", + name = "???1", type = {"spell/storm",2}, require = spells_req2, points = 5, @@ -62,7 +62,7 @@ newTalent{ } newTalent{ - name = "???", + name = "???2", type = {"spell/storm",3}, require = spells_req3, points = 5, diff --git a/game/modules/tome/data/zones/high-peak/zone.lua b/game/modules/tome/data/zones/high-peak/zone.lua index cc2e4cf61797f3603693bc30e24bb58134bdb42e..9126c17391290a6433d4cc6fcc9a4a8aa1bda4d1 100644 --- a/game/modules/tome/data/zones/high-peak/zone.lua +++ b/game/modules/tome/data/zones/high-peak/zone.lua @@ -55,6 +55,9 @@ return { nb_trap = {15, 20}, }, }, + post_process = function(level) + for uid, e in pairs(level.entities) do e.faction="blue-wizards" end + end, levels = { [1] = { diff --git a/ideas/zones.ods b/ideas/zones.ods index 7c077172f8b891b8e12b6d5f89cd6a990d099b0c..c36a97b1e0704375b28a8648010aac9f11e42cb2 100644 Binary files a/ideas/zones.ods and b/ideas/zones.ods differ