Small farm, with special chicken - don't bother'em.
git-svn-id: svn://svn.code.sf.net/p/crossfire/code/maps/trunk@6331 282e977c-c81d-0410-88c4-b93c2d0d6712master
							parent
							
								
									4d3bc46f1d
								
							
						
					
					
						commit
						9ec02092c0
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
					@ -0,0 +1,138 @@
 | 
				
			||||||
 | 
					# Script for the Combat Chicken for Sentrio's farmhouse (/lake_country/sentrio_farmhouse).
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright 2007 Nicolas Weeger
 | 
				
			||||||
 | 
					# Released as GPL
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# This script is supposed to be called for the time event.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import Crossfire
 | 
				
			||||||
 | 
					import random
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					key_target = 'chicken_target'		# where the chicken is trying to go
 | 
				
			||||||
 | 
					key_food = 'chicken_food'		# currently eaten food
 | 
				
			||||||
 | 
					key_attacked = 'chicken_attacked'	# if set, chicken has normal monster behaviour - so it reacts when attacked
 | 
				
			||||||
 | 
					stay_on_floor = 'small_stones'		# what ground it'll stay on
 | 
				
			||||||
 | 
					# what the chicken will eat, and food increase
 | 
				
			||||||
 | 
					eat = { 'orc\'s livers' : 5, 'orc\'s hearts' : 6, 'goblin\'s livers' : 1, 'goblin\'s hearts' : 2 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# those should be in some common library
 | 
				
			||||||
 | 
					dir_x = [  0, 0, 1, 1, 1, 0, -1, -1, -1 ]
 | 
				
			||||||
 | 
					dir_y = [ 0, -1, -1, 0, 1, 1, 1, 0, -1 ]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# this should be in some common library
 | 
				
			||||||
 | 
					def coordinates_to_dir(x, y):
 | 
				
			||||||
 | 
						q = 0
 | 
				
			||||||
 | 
						if(y == 0):
 | 
				
			||||||
 | 
							q = -300 * x;
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							q = int(x * 100 / y);
 | 
				
			||||||
 | 
						if(y>0):
 | 
				
			||||||
 | 
							if(q < -242):
 | 
				
			||||||
 | 
								return 3
 | 
				
			||||||
 | 
							if (q < -41):
 | 
				
			||||||
 | 
								return 2
 | 
				
			||||||
 | 
							if (q < 41):
 | 
				
			||||||
 | 
								return 1
 | 
				
			||||||
 | 
							if (q < 242):
 | 
				
			||||||
 | 
								return 8 ;
 | 
				
			||||||
 | 
							return 7
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if (q < -242):
 | 
				
			||||||
 | 
							return 7
 | 
				
			||||||
 | 
						if (q < -41):
 | 
				
			||||||
 | 
							return 6
 | 
				
			||||||
 | 
						if (q < 41):
 | 
				
			||||||
 | 
							return 5
 | 
				
			||||||
 | 
						if (q < 242):
 | 
				
			||||||
 | 
							return 4
 | 
				
			||||||
 | 
						return 3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# returns floor with specific name
 | 
				
			||||||
 | 
					def has_floor(x, y, name):
 | 
				
			||||||
 | 
						obj = Crossfire.WhoAmI().Map.ObjectAt(x, y)
 | 
				
			||||||
 | 
						while obj != None:
 | 
				
			||||||
 | 
							if obj.Floor == 1 and obj.ArchName == name:
 | 
				
			||||||
 | 
								return True
 | 
				
			||||||
 | 
							obj = obj.Above
 | 
				
			||||||
 | 
						return False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# returns some eligible food on specified spot
 | 
				
			||||||
 | 
					def find_food(chicken, x, y):
 | 
				
			||||||
 | 
						obj = chicken.Map.ObjectAt(x, y)
 | 
				
			||||||
 | 
						while obj != None:
 | 
				
			||||||
 | 
							#print obj.Name
 | 
				
			||||||
 | 
							if eat.has_key(obj.NamePl):
 | 
				
			||||||
 | 
								return obj
 | 
				
			||||||
 | 
							obj = obj.Above
 | 
				
			||||||
 | 
						return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# main chicken handler
 | 
				
			||||||
 | 
					def move_chicken():
 | 
				
			||||||
 | 
						chicken = Crossfire.WhoAmI()
 | 
				
			||||||
 | 
						if chicken.Enemy != None:
 | 
				
			||||||
 | 
							# chicken won't let itself get killed easily!
 | 
				
			||||||
 | 
							chicken.WriteKey(key_attacked, '1', 1)
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						if chicken.ReadKey(key_attacked) != '':
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						Crossfire.SetReturnValue(1)
 | 
				
			||||||
 | 
						if chicken.Map.Darkness >= 3:
 | 
				
			||||||
 | 
							# too dark, night is for sleeping
 | 
				
			||||||
 | 
							return
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						target = chicken.ReadKey(key_target)
 | 
				
			||||||
 | 
						if target != '':
 | 
				
			||||||
 | 
							x = int(target.split('|')[0])
 | 
				
			||||||
 | 
							y = int(target.split('|')[1])
 | 
				
			||||||
 | 
							if chicken.X != x or chicken.Y != y:
 | 
				
			||||||
 | 
								chicken.Move(coordinates_to_dir(chicken.X - x, chicken.Y - y))
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
							# target found, let's try to eat it
 | 
				
			||||||
 | 
							food = find_food(chicken, x, y)
 | 
				
			||||||
 | 
							chicken.WriteKey(key_target, '', 1)
 | 
				
			||||||
 | 
							if food != None:
 | 
				
			||||||
 | 
								chicken.Map.Print('The %s eats the %s!'%(chicken.Name, food.Name))
 | 
				
			||||||
 | 
								got = chicken.ReadKey(key_food)
 | 
				
			||||||
 | 
								if got == '':
 | 
				
			||||||
 | 
									got = 0
 | 
				
			||||||
 | 
								else:
 | 
				
			||||||
 | 
									got = int(got)
 | 
				
			||||||
 | 
								got = got + eat[food.NamePl]
 | 
				
			||||||
 | 
								# drop an egg?
 | 
				
			||||||
 | 
								if random.randint(1, 100) <= ( got * 2 ):
 | 
				
			||||||
 | 
									egg = chicken.Map.CreateObject('chicken_egg', chicken.X, chicken.Y)
 | 
				
			||||||
 | 
									egg.Name = 'Chicken Combat egg'
 | 
				
			||||||
 | 
									egg.NamePl = 'Chicken combat eggs'
 | 
				
			||||||
 | 
									egg.Quantity = 1
 | 
				
			||||||
 | 
									chicken.Map.Print('The %s lays an egg!'%chicken.Name)
 | 
				
			||||||
 | 
									got = 0
 | 
				
			||||||
 | 
								chicken.WriteKey(key_food, str(got), 1)
 | 
				
			||||||
 | 
								food.Quantity = food.Quantity - 1
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
						else:
 | 
				
			||||||
 | 
							# try to find some food
 | 
				
			||||||
 | 
							#chicken.Map.Print('find food...')
 | 
				
			||||||
 | 
							food = None
 | 
				
			||||||
 | 
							for x in range(-3, 4):
 | 
				
			||||||
 | 
								for y in range(-3, 4):
 | 
				
			||||||
 | 
									food = find_food(chicken, chicken.X + x, chicken.Y + y)
 | 
				
			||||||
 | 
									#chicken.Map.Print('find food %d %d...'%(chicken.X + x, chicken.Y + y))
 | 
				
			||||||
 | 
									if food != None:
 | 
				
			||||||
 | 
										target = '%d|%d'%(food.X, food.Y)
 | 
				
			||||||
 | 
										chicken.WriteKey(key_target, target, 1)
 | 
				
			||||||
 | 
										#chicken.Map.Print('got food %s'%target)
 | 
				
			||||||
 | 
										break
 | 
				
			||||||
 | 
								if food != None:
 | 
				
			||||||
 | 
									break
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						# nothing found, random walk
 | 
				
			||||||
 | 
						for test in [1, 10]:
 | 
				
			||||||
 | 
							dir = random.randint(1, 8)
 | 
				
			||||||
 | 
							if (has_floor(chicken.X + dir_x[dir], chicken.Y + dir_y[dir], stay_on_floor)):
 | 
				
			||||||
 | 
								chicken.Move(dir)
 | 
				
			||||||
 | 
								Crossfire.SetReturnValue(1)
 | 
				
			||||||
 | 
								return
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					move_chicken()
 | 
				
			||||||
							
								
								
									
										7056
									
								
								world/world_108_126
								
								
								
								
							
							
						
						
									
										7056
									
								
								world/world_108_126
								
								
								
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
		Loading…
	
		Reference in New Issue