107 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			107 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
# 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
 | 
						|
import CFMove
 | 
						|
 | 
						|
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 }
 | 
						|
 | 
						|
# 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:
 | 
						|
		#Crossfire.Log(Crossfire.LogMonster, obj.Name)
 | 
						|
		if obj.NamePl in eat:
 | 
						|
			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 CFMove.get_object_to(chicken, x, y) != 0:
 | 
						|
			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 = 'Combat Chicken egg'
 | 
						|
				egg.NamePl = 'Combat Chicken 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 + CFMove.dir_x[dir], chicken.Y + CFMove.dir_y[dir], stay_on_floor)):
 | 
						|
			chicken.Move(dir)
 | 
						|
			Crossfire.SetReturnValue(1)
 | 
						|
			return
 | 
						|
 | 
						|
 | 
						|
move_chicken()
 |