From e14e3415910d58a72a8afac4bf4e3d71d7dfbe6b Mon Sep 17 00:00:00 2001
From: dg <dg@51575b47-30f0-44d4-a5cc-537603b46e54>
Date: Thu, 28 Oct 2010 22:48:56 +0000
Subject: [PATCH] plop

git-svn-id: http://svn.net-core.org/repos/t-engine4@1687 51575b47-30f0-44d4-a5cc-537603b46e54
---
 game/modules/tome/class/GameState.lua         | 61 +++++++++++++++++++
 game/modules/tome/class/Player.lua            |  6 +-
 game/modules/tome/class/WorldNPC.lua          |  4 ++
 .../data/general/encounters/maj-eyal-npcs.lua | 55 +----------------
 4 files changed, 71 insertions(+), 55 deletions(-)

diff --git a/game/modules/tome/class/GameState.lua b/game/modules/tome/class/GameState.lua
index 0bbc5262a5..7bc34a71b5 100644
--- a/game/modules/tome/class/GameState.lua
+++ b/game/modules/tome/class/GameState.lua
@@ -100,3 +100,64 @@ function _M:worldDirectorAI()
 	local ok, err = pcall(script)
 	if not ok and err then error(err) end
 end
+
+function _M:spawnWorldAmbush(enc)
+	local gen = { class = "engine.generator.map.Forest",
+		edge_entrances = {4,6},
+		sqrt_percent = 50,
+		zoom = 10,
+		floor = "GRASS",
+		wall = "TREE",
+		down = "DOWN",
+		up = "UP_WILDERNESS",
+	}
+	local g = game.level.map(game.player.x, game.player.y, engine.Map.TERRAIN)
+	if not g.can_encounter then return false end
+
+	if g.can_encounter == "desert" then gen.floor = "SAND" gen.wall = "PALMTREE" end
+
+	local zone = engine.Zone.new("ambush", {
+		name = "Ambush!",
+		level_range = {game.player.level, game.player.level},
+		level_scheme = "player",
+		max_level = 1,
+		actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
+		width = enc.width or 20, height = enc.height or 20,
+		all_lited = true,
+		ambiant_music = "last",
+		generator =  {
+			map = gen,
+			actor = { class = "engine.generator.actor.Random", nb_npc = enc.nb or {1,1}, filters=enc.filters },
+		},
+
+		npc_list = mod.class.NPC:loadList("/data/general/npcs/all.lua", nil, nil, function(e) e.make_escort=nil end),
+		grid_list = mod.class.Grid:loadList{"/data/general/grids/basic.lua", "/data/general/grids/forest.lua", "/data/general/grids/sand.lua"},
+		object_list = mod.class.Object:loadList("/data/general/objects/objects.lua"),
+		trap_list = {},
+		post_process = function(level)
+			-- Find a good starting location, on the opposite side of the exit
+			local sx, sy = level.map.w-1, rng.range(0, level.map.h-1)
+			level.spots[#level.spots+1] = {
+				check_connectivity = "entrance",
+				x = sx,
+				y = sy,
+			}
+			level.default_down = level.default_up
+			level.default_up = {x=sx, y=sy}
+		end,
+	})
+	game.player:runStop()
+	game.player.energy.value = game.energy_to_act
+	game.paused = true
+	game:changeLevel(1, zone)
+	engine.ui.Dialog:simplePopup("Ambush!", "You have been ambushed!")
+end
+
+function _M:handleWorldEncounter(target)
+	local enc = target.on_encounter
+	if type(enc) == "function" then return enc() end
+	if type(enc) == "table" then
+		if enc.type == "ambush" then target:die() self:spawnWorldAmbush(enc)
+		end
+	end
+end
diff --git a/game/modules/tome/class/Player.lua b/game/modules/tome/class/Player.lua
index d967aaaf5a..61391c7381 100644
--- a/game/modules/tome/class/Player.lua
+++ b/game/modules/tome/class/Player.lua
@@ -121,8 +121,10 @@ function _M:onLeaveLevel(zone, level)
 end
 
 -- Wilderness encounter
-function _M:onWorldEncounter(self)
-	print("PLAYER ENCOUNTER")
+function _M:onWorldEncounter(target)
+	if target.on_encounter then
+		game.state:handleWorldEncounter(target)
+	end
 end
 
 function _M:move(x, y, force)
diff --git a/game/modules/tome/class/WorldNPC.lua b/game/modules/tome/class/WorldNPC.lua
index c17da739ea..7bdf3f99cd 100644
--- a/game/modules/tome/class/WorldNPC.lua
+++ b/game/modules/tome/class/WorldNPC.lua
@@ -53,6 +53,10 @@ function _M:bumpInto(target)
 	end
 end
 
+function _M:takeHit()
+	return nil
+end
+
 function _M:encounterAttack(target)
 	if target.player then target:onWorldEncounter(self) return end
 
diff --git a/game/modules/tome/data/general/encounters/maj-eyal-npcs.lua b/game/modules/tome/data/general/encounters/maj-eyal-npcs.lua
index 26181b70b4..cdbc9086a3 100644
--- a/game/modules/tome/data/general/encounters/maj-eyal-npcs.lua
+++ b/game/modules/tome/data/general/encounters/maj-eyal-npcs.lua
@@ -52,6 +52,7 @@ newEntity{
 	rarity = 4,
 	unit_power = 1,
 	ai = "world_hostile", ai_state = {chase_distance=3},
+	on_encounter = {type="ambush", width=10, height=10, nb={1,1}, filters={{type="animal", subtype="bear"}}},
 }
 
 newEntity{
@@ -63,57 +64,5 @@ newEntity{
 	rarity = 4,
 	unit_power = 1,
 	ai = "world_hostile", ai_state = {chase_distance=3},
-	on_encounter = function()
-		local gen = { class = "engine.generator.map.Forest",
-			edge_entrances = {4,6},
-			sqrt_percent = 50,
-			zoom = 10,
-			floor = "GRASS",
-			wall = "TREE",
-			up = "UP",
-			down = "DOWN",
-			up = "UP_WILDERNESS_FAR_EAST",
-		}
-		local g = game.level.map(who.x, who.y, engine.Map.TERRAIN)
-		if not g.can_encounter then return false end
-
-		if g.can_encounter == "desert" then gen.floor = "SAND" gen.wall = "PALMTREE" end
-
-		local zone = engine.Zone.new("ambush", {
-			name = "Ambush!",
-			level_range = {20, 50},
-			level_scheme = "player",
-			max_level = 1,
-			actor_adjust_level = function(zone, level, e) return zone.base_level + e:getRankLevelAdjust() + level.level-1 + rng.range(-1,2) end,
-			width = 20, height = 20,
-			all_lited = true,
-			ambiant_music = "last",
-			generator =  {
-				map = gen,
-				actor = { class = "engine.generator.actor.Random",nb_npc = {5, 7}, },
-				trap = { class = "engine.generator.trap.Random", nb_trap = {0, 0}, },
-			},
-
-			npc_list = mod.class.NPC:loadList("/data/general/npcs/orc.lua", nil, nil, function(e) e.make_escort=nil end),
-			grid_list = mod.class.Grid:loadList{"/data/general/grids/basic.lua", "/data/general/grids/forest.lua", "/data/general/grids/sand.lua"},
-			object_list = mod.class.Object:loadList("/data/general/objects/objects.lua"),
-			trap_list = {},
-			post_process = function(level)
-				-- Find a good starting location, on the opposite side of the exit
-				local sx, sy = level.map.w-1, rng.range(0, level.map.h-1)
-				level.spots[#level.spots+1] = {
-					check_connectivity = "entrance",
-					x = sx,
-					y = sy,
-				}
-				level.default_down = level.default_up
-				level.default_up = {x=sx, y=sy}
-			end,
-		})
-		game.player:runStop()
-		game.player.energy.value = game.energy_to_act
-		game.paused = true
-		game:changeLevel(1, zone)
-		engine.ui.Dialog:simplePopup("Ambush!", "You have been ambushed by a patrol of orcs!")
-	end,
+	on_encounter = {type="ambush", width=10, height=10, nb={3,5}, filters={{type="animal", subtype="canine"}}},
 }
-- 
GitLab