From 6c45c9fb651133192b047eea2a0afbf8f7449723 Mon Sep 17 00:00:00 2001 From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54> Date: Tue, 10 Aug 2010 18:57:39 +0000 Subject: [PATCH] Added a Map.attrs(x, y, k, v) method to store various attributes on the map at x, y in a key 'k'. If 'v' is given it sets it otherwise it gets it. Actor:randomTeleport() wont teleport to places with the no_teleport flag set git-svn-id: http://svn.net-core.org/repos/t-engine4@1005 51575b47-30f0-44d4-a5cc-537603b46e54 --- game/engine/Actor.lua | 3 +- game/engine/Faction.lua | 1 + game/engine/Map.lua | 10 +++ game/engine/generator/map/Static.lua | 9 +- game/engine/interface/ActorTalents.lua | 1 + game/modules/tome/class/Actor.lua | 10 +-- game/modules/tome/class/Game.lua | 3 +- game/modules/tome/class/NPC.lua | 8 +- .../tome/data/maps/towns/gates-of-morning.lua | 81 +++++++++--------- .../tome/data/talents/corruptions/rituals.lua | 8 +- .../tome/data/talents/spells/storm.lua | 4 +- .../tome/data/zones/high-peak/zone.lua | 3 + ideas/zones.ods | Bin 14082 -> 14830 bytes 13 files changed, 82 insertions(+), 59 deletions(-) diff --git a/game/engine/Actor.lua b/game/engine/Actor.lua index 3c5b499ace..ae58809e84 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 56b4acc65a..df64df8aec 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 75a9f365a0..636e69674c 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 11af8de171..a87d8485de 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 901901fd1d..3cd98b4331 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 1e34aa028b..4d24236809 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 a32fa00b19..811aaef28f 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 dde58a4eb4..677730693a 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 b80bd8c017..122d5c1f63 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 7966a729f1..7a1d18e65e 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 e4ef64f7fa..493fe1bdcc 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 cc2e4cf617..9126c17391 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 GIT binary patch delta 12202 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 H|IYkB5Uoz= delta 11506 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 a0D-Lk;w+s1v)MP+#6DhH*f+Mnz5fr84XL02 -- GitLab