git.fiddlerwoaroof.com
Browse code

monster tweaks

Ed L authored on 29/07/2012 04:52:30
Showing 4 changed files
... ...
@@ -4,7 +4,7 @@ namegen_class: "male"
4 4
 char: "h"
5 5
 color: amber
6 6
 
7
-spawn_chance: 4
7
+spawn_chance: 3
8 8
     
9 9
 hp: 10
10 10
 defense: 1
... ...
@@ -12,18 +12,47 @@ power: 5
12 12
      
13 13
 ai_class: monsters.AdvancedMonster
14 14
          
15
+---
16
+race_name: "Scoundrel"
17
+namegen_class: "Mingos Norse male"
18
+char: "s"
19
+color: amber
20
+
21
+spawn_chance: 2
22
+
23
+hp: 10
24
+defense: 0
25
+power: 4
26
+         
27
+---
28
+race_name: "Thief"
29
+namegen_class: "male"
30
+char: "T"
31
+color: amber
32
+
33
+spawn_chance: 2
34
+
35
+hp: 10
36
+defense: 0
37
+power: 4
38
+         
39
+ai_class:
40
+   class_name: monsters.Thief
41
+   skill: 32
42
+
15 43
 ---
16 44
 race_name: "Imp"
17 45
 namegen_class: "male"
18 46
 char: "i"
19 47
 color: dark_red
20 48
 
21
-spawn_chance: 7
49
+spawn_chance: 9
22 50
     
23 51
 hp: 4
24 52
 defense: 0
25
-power: 4
53
+power: 5
26 54
      
55
+ai_class: monsters.DjikstraMonster
27 56
 ---
28 57
 race_name: "Troll Fighter"
29 58
 namegen_class: "demon male"
... ...
@@ -32,9 +61,9 @@ color: darker_yellow
32 61
 
33 62
 spawn_chance: 1
34 63
     
35
-hp: 17
36
-defense: 2
37
-power: 5
64
+hp: 20
65
+defense: 1
66
+power: 7
38 67
      
39
-ai_class: monsters.AdvancedMonster
40
-         
68
+ai_class: monsters.DjikstraMonster
69
+
... ...
@@ -11,6 +11,10 @@ from algorithms import djikstra
11 11
 class Monster(object):
12 12
 	def init(self,*a): pass
13 13
 	def take_turn(self): pass
14
+	def load_data(self, data):
15
+		for k,v in data.items():
16
+			setattr(self, k,v)
17
+		return self
14 18
 
15 19
 class BasicMonster(Monster):
16 20
 	def take_turn(self):
... ...
@@ -26,6 +30,41 @@ class BasicMonster(Monster):
26 30
 			elif game_instance.player.fighter.hp > 0:
27 31
 				monster.fighter.attack(game_instance.player)
28 32
 
33
+class Thief(BasicMonster):
34
+	def init(self, level):
35
+		self.level = level
36
+		self.player = level.player
37
+		self.inventory = []
38
+		self.skill = self.skill / 100.0
39
+
40
+	def take_turn(self):
41
+		if self.player.distance(self.owner.x, self.owner.y) < 2 and random.random() < .7:
42
+			self.steal()
43
+		else:
44
+			BasicMonster.take_turn(self)
45
+
46
+	def steal(self):
47
+		if self.player.inventory.keys() == 0:
48
+			game_instance.message( ('%s can\'t find anything to steal'%self.owner.name).capitalize(), libtcod.orange )
49
+		obj = random.choice(self.player.inventory.keys())
50
+		game_instance.message( ('%s tries to steal %s'%(self.owner.name,obj)).capitalize(), libtcod.red)
51
+		if random.random() < self.skill:
52
+			game_instance.message( ('%s successfully steals %s'%(self.owner.name,obj)).capitalize(), libtcod.orange)
53
+			obj = self.player.inventory[obj]
54
+			self.inventory.append(obj)
55
+			del self.player.inventory[obj]
56
+
57
+	def death(self):
58
+		monster_death(self.owner)
59
+		for item in self.inventory:
60
+			self.drop(item)
61
+
62
+	def drop(self, item):
63
+		item.x, item.y = self.owner.pos
64
+		self.level.add_object(item)
65
+		self.inventory.remove(item)
66
+
67
+
29 68
 class DjikstraMonster(Monster):
30 69
 	maps = {}
31 70
 
... ...
@@ -52,7 +91,7 @@ class DjikstraMonster(Monster):
52 91
 
53 92
 			while self.dj.cycle(): pass
54 93
 
55
-		self.dj.visualize()
94
+		#self.dj.visualize()
56 95
 
57 96
 	def take_turn(self):
58 97
 		pos = self.owner.x, self.owner.y
... ...
@@ -187,11 +226,20 @@ class MonsterLoader(object):
187 226
 			color = libtcod.Color(*color)
188 227
 
189 228
 		ai_class = doc.get('ai_class', BasicMonster)
229
+		cls_data = {}
190 230
 		if ai_class is not BasicMonster:
231
+			cls_data = {}
232
+			if hasattr(ai_class, 'items'):
233
+				nm = ai_class.pop('class_name', 'monsters.BasicMonster')
234
+				cls_data.update(ai_class)
235
+				ai_class = nm
236
+
191 237
 			module, clas = ai_class.rsplit('.',1)
192 238
 			module = __import__(module)
193 239
 			ai_class = getattr(module, clas)
194 240
 
241
+		death_func = getattr(ai_class, 'death', monster_death)
242
+
195 243
 		print 'loading', doc
196 244
 		Game.register_monster_type(
197 245
 			(lambda doc:
... ...
@@ -209,30 +257,30 @@ class MonsterLoader(object):
209 257
 						power=doc['power'],
210 258
 						death_function=monster_death
211 259
 					),
212
-					ai=ai_class(),
260
+					ai=ai_class().load_data(cls_data),
213 261
 					level=level
214 262
 				)
215 263
 			)(doc), doc['spawn_chance'])
216 264
 
217
-#Game.register_monster_type(
218
-#	lambda map,level, con,x,y: objects.Object(map, con,
219
-#		x,y, '\x02', '%s the Orc' % libtcod.namegen_generate('Fantasy male'),
220
-#			libtcod.blue, True,
221
-#
222
-#		fighter=objects.Fighter(hp=10, defense=2, power=3, death_function=monster_death),
223
-#		ai=AdvancedMonster(),
224
-#		level=level
225
-#), 8)
226
-#
227
-#Game.register_monster_type(
228
-#	lambda map,level, con,x,y: objects.Object(map, con,
229
-#		x,y, '\x01', '%s the Troll' % libtcod.namegen_generate('Norse male'),
230
-#			libtcod.orange, True,
231
-#
232
-#		fighter=objects.Fighter(hp=16, defense=1, power=4, death_function=monster_death),
233
-#		ai=AdvancedMonster(),
234
-#		level=level
235
-#), 2)
265
+Game.register_monster_type(
266
+	lambda map,level, con,x,y: objects.Object(map, con,
267
+		x,y, '\x02', '%s the Orc' % libtcod.namegen_generate('Fantasy male'),
268
+			libtcod.blue, True,
269
+
270
+		fighter=objects.Fighter(hp=10, defense=2, power=3, death_function=monster_death),
271
+		ai=AdvancedMonster(),
272
+		level=level
273
+), 8)
274
+
275
+Game.register_monster_type(
276
+	lambda map,level, con,x,y: objects.Object(map, con,
277
+		x,y, '\x01', '%s the Troll' % libtcod.namegen_generate('Norse male'),
278
+			libtcod.orange, True,
279
+
280
+		fighter=objects.Fighter(hp=16, defense=1, power=4, death_function=monster_death),
281
+		ai=AdvancedMonster(),
282
+		level=level
283
+), 2)
236 284
 
237 285
 Game.register_monster_type(
238 286
 	lambda map,level, con,x,y: objects.Object(map, con,
... ...
@@ -240,7 +288,7 @@ Game.register_monster_type(
240 288
 			libtcod.amber, True,
241 289
 
242 290
 		fighter=objects.Fighter(hp=16, defense=1, power=7, death_function=monster_death),
243
-		ai=DjikstraMonster(),
291
+		ai=BasicMonster(),
244 292
 		level=level
245 293
 ), 1)
246 294
 Game.register_monster_type(None, 7)
... ...
@@ -34,6 +34,10 @@ class Object(object):
34 34
 			item.owner = self
35 35
 		self.item = item
36 36
 
37
+	@property
38
+	def pos(self):
39
+		return self.x, self.y
40
+
37 41
 	def enter_level(self, level):
38 42
 		self.level = level
39 43
 		return self
... ...
@@ -84,6 +84,9 @@ class Inventory(object):
84 84
 		if v.ident != k: raise ValueError('Inventory key must equal the item\'s name')
85 85
 		self.add_item(v)
86 86
 
87
+	def keys(self):
88
+		return self.objects.keys()
89
+
87 90
 	def add_item(self, item):
88 91
 		print 'add_item', item.name
89 92
 		slot = self.objects.setdefault(item.name, [Slot()])
... ...
@@ -143,6 +146,7 @@ class Player(Object):
143 146
 		obj.x, obj.y = self.x, self.y
144 147
 		self.level.add_object(obj)
145 148
 		del self.inventory[obj.name]
149
+		return obj
146 150
 
147 151
 	def use(self, item):
148 152
 		item.owner.enter_level(self.level)