178 lines
5.9 KiB
Python
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()
|