maps/python/maps/witherspoon_manor/ghost.py

178 lines
5.9 KiB
Python

'''
This script is part of the Witherspoon quest, that starts in /scorn/mansion/witherspoon_manor_attic.
Check the README file in the same directory as this file for more details.
Script for the ghost in Witherspoon manor (south-east of Scorn).
'''
import random
import Crossfire
from CFDialog import DialogRule, Dialog
key_angry = 'ghost_angry'
key_disappear = 'ghost_disappear'
def warn_player(player, ghost):
'''Ghost is about to become angry, warn the player so she can flee before it's too late!'''
if player.Level < ghost.Level:
player.Write('You feel a very powerful force gather around the %s! Your instinct tell you you\'d rather feel fast!'%ghost.Name)
else:
player.Write('You feel a really powerful force gather around the %s! Time to start fleeing, maybe?'%ghost.Name)
drop = ghost.Map.CreateObject('reeking_urine', player.X, player.Y)
player.Write('You feel so frightened you can\'t control your bladder!')
def check_body(player, rule):
'''Did the player already dig?'''
if player.ReadKey('witherspoon_tomb') != 'dig':
return True
return False
def start_disappear(ghost, player):
'''ghost should disappear, called for 2 endings.'''
ghost.WriteKey(key_disappear, '1', 1)
ghost.CreateTimer(5, 1)
ghost.StandStill = True
player.Write('The %s starts fading...'%ghost.Name)
def found_body(player, rule):
'''Does the player have the body?'''
if player.ReadKey('witherspoon_tomb') != 'dig':
return False
player.WriteKey('witherspoon_tomb', '', 1)
#reset our dialog anyway - the player did dig, so quest ends (nicely or badly)
player.WriteKey('dialog_witherspoon_ghost', '', 1)
#try to find the body, if not found then get angry
body = player.CheckInventory('tortured body')
ghost = Crossfire.WhoAmI()
if body:
#all fine!
body.Remove()
start_disappearing(ghost, player)
return 1
#oh oh, bad, ghost is getting angry!
ghost.WriteKey(key_angry, '1', 1)
ghost.CreateTimer(10, 1)
ghost.Say('You fool! You lost my body!\nPrepare to feel my wrath!')
warn_player(player, ghost)
return False
return has_body(player)
def can_talk(player, rule):
'''Is the ghost angry or disappearing?
Used for the final catch all rule so the ghost doesn't talk when angry or disappearing.
'''
return Crossfire.WhoAmI().ReadKey(key_angry) == '' and Crossfire.WhoAmI().ReadKey(key_disappear) == ''
def do_dialog():
'''Main dialog routine.'''
if not can_talk(None, None):
return
whoami = Crossfire.WhoAmI()
pl = Crossfire.WhoIsActivator()
if pl.ReadKey('witherspoon_know_all') == '1':
# player found the real story, through Rolanda.
whoami.Say('Oh...')
whoami.Map.Print('The %s manages to blush.'%whoami.Name)
whoami.Say('Now I remember. I\'m so stupid. Poor Rolanda, will she ever forgive me...')
whoami.Say('Well, I guess I can go now. Many thanks for your help!')
whoami.WriteKey('bonus', '1', 1)
start_disappear(whoami, pl)
return
if pl.ReadKey('witherspoon_know_dagger') == '1':
# player talked to the priest of Devourers, and knows the dagger is special.
whoami.Say('Oh, please find who could be as cruel as to use such a horrible spell on me!')
return
# default dialog, just talk
# If you ever change this key, change the value in tomb.py too!
speech = Dialog(Crossfire.WhoIsActivator(), Crossfire.WhoAmI(), "witherspoon_ghost")
prer = [["witherspoon_ghost","0"]]
postr = [["witherspoon_ghost", "explain"]]
rmsg = ["I was killed by surprise, and ever since I'm stuck here.\n\n"
"If I could see my body, I could really understand I'm dead and I could rest in peace.\n\n"
"Could you find my body, please?"
]
speech.addRule(DialogRule(["help","yes","how"], prer, rmsg, postr),0)
prer = [["witherspoon_ghost","explain"]]
postr = [["witherspoon_ghost", "wait"]]
rmsg = ["I was walking near a lake west of Scorn, so maybe my body is buried here."]
speech.addRule(DialogRule(["where","location"], prer, rmsg, postr),1)
prer = [["witherspoon_ghost","explain"]]
postr = [["witherspoon_ghost", "*"]]
rmsg = ["Please, go find my body...", "Please, I need my body to rest in peace..."]
speech.addRule(DialogRule(["*"], prer, rmsg, postr),2)
prer = [["witherspoon_ghost","wait"]]
postr = [["witherspoon_ghost", "*"]]
rmsg = ["Please, go find my body.\n\nIt should be near the lake west of Scorn...", "Did you find my body yet? No?\n\nThen please, go search for it, west of Scorn there is a lake..."]
speech.addRule(DialogRule(["*"], prer, rmsg, postr, check_body),3)
prer = [["witherspoon_ghost","wait"]]
postr = [["witherspoon_ghost", "0"]]
rmsg = ["Thanks, you found my body!"]
speech.addRule(DialogRule(["*"], prer, rmsg, postr, found_body),4)
prer = [["witherspoon_ghost","*"]]
postr = [["witherspoon_ghost", "*"]]
rmsg = ["Please help me....", "Heeeeeeeelp...", "Pleaseeeee..."]
speech.addRule(DialogRule(["*"], prer, rmsg, postr, can_talk),5)
speech.speak(Crossfire.WhatIsMessage())
def do_angry(ghost):
# Ghost is angry point, let's rock
ghost.Say('Feel my wrath!')
ghost.WriteKey(key_angry, '', 1)
ghost.Unaggressive = 0
ghost.NoDamage = 0
ghost.RandomMovement = 0
ghost.Speed = ghost.Speed * 2
def do_timer():
'''Got a timer, what for?'''
ghost = Crossfire.WhoAmI()
if ghost.ReadKey(key_angry) != '':
do_angry(ghost)
elif ghost.ReadKey(key_disappear) != '':
do_disappear()
#shouldn't get there...
def do_disappear():
'''Ghost is happy, all is fine.'''
ghost = Crossfire.WhoAmI()
if ghost.ReadKey(key_disappear) != '1':
'''Hu? Not supposed to come here in this case...'''
return
ghost.Say('Thanks a lot! Please take those small presents as a token of my gratitude.')
bonus = 0
if ghost.ReadKey('bonus') == '1':
bonus = 25
presents = ['gem', 'ruby', 'emerald', 'pearl', 'sapphire']
got = ghost.Map.CreateObject(presents[random.randint(0, len(presents) - 1)], ghost.X, ghost.Y)
got.Quantity = random.randint(3 + bonus, 7 + bonus)
ghost.Remove()
if Crossfire.WhatIsEvent().Subtype == Crossfire.EventType.SAY:
Crossfire.SetReturnValue(1)
do_dialog()
elif Crossfire.WhatIsEvent().Subtype == Crossfire.EventType.TIMER:
do_timer()