183 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			183 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			Python
		
	
	
# Script for Farnass the cook (/scorn/misc/scorn_kitchen).
 | 
						|
#
 | 
						|
# The script assumes you have:
 | 
						|
# * a cook
 | 
						|
# * a recipient where the player will put the ingredients
 | 
						|
# * a stove where Farnass will go to cook
 | 
						|
#
 | 
						|
# Copyright 2007 Nicolas Weeger
 | 
						|
# Released as GPL
 | 
						|
#
 | 
						|
# This script is supposed to be called for the say and time events of the cook,
 | 
						|
# and the close event of the recipient.
 | 
						|
 | 
						|
import Crossfire
 | 
						|
import random
 | 
						|
import CFMove
 | 
						|
 | 
						|
key_status = 'cook_status'
 | 
						|
st_getting = 'getting'		# moving to recipient to get the ingredients
 | 
						|
st_stove = 'stove'		# moving to the stove to cook
 | 
						|
st_cooking = 'cooking'		# actually cooking
 | 
						|
 | 
						|
key_cooking_step = 'cooking_step'	# when st_cooking, what cooking step
 | 
						|
 | 
						|
key_need_check = 'check_ingredients'	# used to signal, after recipient was closed, to check contents
 | 
						|
 | 
						|
color = Crossfire.MessageFlag.NDI_GREEN	# color to display messages
 | 
						|
 | 
						|
recipe_arch = 'caramel'			# archetype generated when recipe is complete
 | 
						|
eggs_count = 4
 | 
						|
failure_chance = 15
 | 
						|
recipient_x = 3				# position of the recipient to drop ingredients into
 | 
						|
recipient_y = 8
 | 
						|
stove_x = 4				# position of the stove the cook will use
 | 
						|
stove_y = 8
 | 
						|
 | 
						|
def check_ingredients():
 | 
						|
	''' Finds the ingredients in the recipient. Used when recipient is closed, and when Farnass
 | 
						|
	 arrives on the recipient (to avoid player picking up items)'''
 | 
						|
	mushroom = None
 | 
						|
	eggs = None
 | 
						|
	
 | 
						|
#	whoami.Say('before')
 | 
						|
	obj = whoami.Map.ObjectAt(recipient_x, recipient_y)
 | 
						|
	while obj != None:
 | 
						|
		if obj.Type == Crossfire.Type.CONTAINER:
 | 
						|
#			whoami.Say('got container %s'%obj.Name)
 | 
						|
			inv = obj.Inventory
 | 
						|
			while inv != None:
 | 
						|
				if inv.Slaying == 'bunion' and inv.ArchName == 'mushroom_3':
 | 
						|
					mushroom = inv
 | 
						|
				elif inv.ArchName == 'chicken_egg' and inv.NamePl == 'Combat Chicken eggs':
 | 
						|
					eggs = inv
 | 
						|
				if mushroom != None and eggs != None:
 | 
						|
					break
 | 
						|
				inv = inv.Below
 | 
						|
			break
 | 
						|
		obj = obj.Above
 | 
						|
	#whoami.Say('after')
 | 
						|
	
 | 
						|
	#if mushroom != None:
 | 
						|
	#	whoami.Say('got mushroom')
 | 
						|
	#if eggs != None:
 | 
						|
	#	whoami.Say('got eggs')
 | 
						|
	
 | 
						|
	if mushroom == None or eggs == None or eggs.Quantity < eggs_count:
 | 
						|
		if whoami.ReadKey(key_status) == st_getting:
 | 
						|
			whoami.Say('Haha, you tried to trick me!')
 | 
						|
			whoami.WriteKey(key_status, '', 1)
 | 
						|
		return
 | 
						|
	
 | 
						|
	if whoami.ReadKey(key_status) != st_getting:
 | 
						|
		whoami.Say('Oh, great, you found what I need to make my special caramel!')
 | 
						|
		whoami.WriteKey(key_status, st_getting, 1);
 | 
						|
		return
 | 
						|
	
 | 
						|
	# if called here, Farnass moved to the recipient, and can pick the ingredients
 | 
						|
	whoami.Map.Print('%s expertly opens the frypan with a leg, and grabs the ingredient using two sticks in his mouth!'%whoami.Name, color)
 | 
						|
	
 | 
						|
	mushroom.Quantity = mushroom.Quantity - 1
 | 
						|
	eggs.Quantity = eggs.Quantity - eggs_count
 | 
						|
	
 | 
						|
	Crossfire.SetReturnValue(1)
 | 
						|
	whoami.WriteKey(key_status, st_stove, 1)
 | 
						|
 | 
						|
def end_cooking(success):
 | 
						|
	''' Everything is finish, let's decide if cooking was successful or not.'''
 | 
						|
	whoami.WriteKey(key_status, '', 1)
 | 
						|
	whoami.WriteKey(key_cooking_step, '', 1)
 | 
						|
	
 | 
						|
	if success == 0:
 | 
						|
		return
 | 
						|
	if random.randint(1, 100) < failure_chance:
 | 
						|
		whoami.Map.Print('%s throws the ingredients in the bin.'%whoami.Name)
 | 
						|
		whoami.Say('I can *tell* you shook the eggs. The yellows were so badly stressed inside that this could not work, even in my own hands... err, teeth.')
 | 
						|
	else:
 | 
						|
		whoami.Say('The caramel is ready!')
 | 
						|
		omelet = whoami.Map.CreateObject(recipe_arch, whoami.X, whoami.Y)
 | 
						|
		omelet.Name = 'Farnass\'s Special Caramel'
 | 
						|
		omelet.NamePl = 'Farnass\'s Special Caramels'
 | 
						|
		omelet.Slaying = 'Farnass\'s Special Caramel'
 | 
						|
		omelet.Quantity = 1
 | 
						|
 | 
						|
def close_boiler():
 | 
						|
	'''Just tell the cook to check next time.'''
 | 
						|
	Crossfire.GetPrivateDictionary()[key_need_check] = 'yes'
 | 
						|
 | 
						|
def clean_check():
 | 
						|
	'''Cancel next check.'''
 | 
						|
	d = Crossfire.GetPrivateDictionary()
 | 
						|
	if d.has_key(key_need_check):
 | 
						|
		del d[key_need_check]
 | 
						|
 | 
						|
def move_cook():
 | 
						|
	'''Main moving routine.'''
 | 
						|
	
 | 
						|
	#whoami.Say('move')
 | 
						|
	status = whoami.ReadKey(key_status)
 | 
						|
	if status == st_getting:
 | 
						|
		clean_check()
 | 
						|
		Crossfire.SetReturnValue(1)
 | 
						|
		m = CFMove.get_object_to(whoami, recipient_x, recipient_y)
 | 
						|
		if m == 0:
 | 
						|
			check_ingredients()
 | 
						|
		elif m == 2:
 | 
						|
			whoami.Say('Get off my way! You want me to cook this caramel or what?')
 | 
						|
		return
 | 
						|
	
 | 
						|
	if status == st_cooking:
 | 
						|
		clean_check()
 | 
						|
		Crossfire.SetReturnValue(1)
 | 
						|
		
 | 
						|
		if whoami.X != stove_x or whoami.Y != stove_y:
 | 
						|
			whoami.Say('You fool! The ingredients are wasted, now!')
 | 
						|
			end_cooking(0)
 | 
						|
			return
 | 
						|
		
 | 
						|
		step = int(whoami.ReadKey(key_cooking_step)) - 1
 | 
						|
		if step == 0:
 | 
						|
			end_cooking(1)
 | 
						|
			return
 | 
						|
		elif step == 15:
 | 
						|
			whoami.Map.Print('%s skillfully mixes the ingredients with his left toe while controlling the fire under the boiler with his right one!'%whoami.Name, color)
 | 
						|
		elif step == 40:
 | 
						|
			whoami.Map.Print('Knife griped by the mouth, %s cuts the mushroom in small slices, and puts them in the stove!'%whoami.Name, color)
 | 
						|
			whoami.WriteKey(key_cooking_step, str(random.randint(25, 35)), 1)
 | 
						|
		elif step == 50:
 | 
						|
			whoami.Say('Let\'s pour the sulphur in now! Hey, wait, did I say sulphur? Ok, getting some dwarven shampoo to neutralize this!')
 | 
						|
		elif step == 70:
 | 
						|
			whoami.Map.Print('%s breaks the eggs over the stove by expertly throwing them, the shells bouncing away!'%whoami.Name, color)
 | 
						|
			whoami.WriteKey(key_cooking_step, str(random.randint(60, 69)), 1)
 | 
						|
		whoami.WriteKey(key_cooking_step, str(step), 1)
 | 
						|
		return
 | 
						|
	
 | 
						|
	if status == st_stove:
 | 
						|
		clean_check()
 | 
						|
		move = CFMove.get_object_to(whoami, stove_x, stove_y)
 | 
						|
		if move == 0:
 | 
						|
			whoami.WriteKey(key_cooking_step, str(random.randint(80, 100)), 1)
 | 
						|
			whoami.Map.Print('%s makes the stove hotter.'%whoami.Name, color)
 | 
						|
			whoami.WriteKey(key_status, st_cooking, 1)
 | 
						|
		elif move == 2:
 | 
						|
			whoami.Say('Get off my way, I need to get to the stove!')
 | 
						|
		Crossfire.SetReturnValue(1)
 | 
						|
		return
 | 
						|
	
 | 
						|
	d = Crossfire.GetPrivateDictionary()
 | 
						|
	if d.has_key(key_need_check):
 | 
						|
		whoami.Map.Print('You see %s look at the frypan.'%whoami.Name, color)
 | 
						|
		del d[key_need_check]
 | 
						|
		check_ingredients()
 | 
						|
		return
 | 
						|
 | 
						|
whoami = Crossfire.WhoAmI()
 | 
						|
if Crossfire.WhatIsEvent().Subtype == Crossfire.EventType.SAY:
 | 
						|
	if whoami.ReadKey(key_cooking_step) != '':
 | 
						|
		whoami.Say('Keep quiet, this recipe requires concentration!')
 | 
						|
		Crossfire.SetReturnValue(1)
 | 
						|
elif Crossfire.WhatIsEvent().Subtype == Crossfire.EventType.TIME:
 | 
						|
	move_cook()
 | 
						|
elif Crossfire.WhatIsEvent().Subtype == Crossfire.EventType.CLOSE:
 | 
						|
	close_boiler()
 |