# Murder in the Park - A Robotic Mystery
# Copyright (C) 2008 Jeffrey Armstrong (a.k.a. PrintStar)
# http://jeff.rainbow-100.com/
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# A full version of the license terms is available in LICENSE.
import cmd
from gamedb import *
from prep import *
from unsure import *
from custom import *
PROMPT = '>> '
class GameCmd(cmd.Cmd):
def __init__(self,db=None):
cmd.Cmd.__init__(self)
if db:
self.db = db
else:
try:
self.db = GameDB()
except IOError:
print 'Error loading default game file...'
self.prompt = PROMPT
def do_n(self,args):
"""Moves north..."""
success = self.db.moveNorth()
self.ackMove(success)
def do_s(self,args):
"""Moves south..."""
success = self.db.moveSouth()
self.ackMove(success)
def do_e(self,args):
"""Moves east..."""
success = self.db.moveEast()
self.ackMove(success)
def do_w(self,args):
"""Moves west..."""
success = self.db.moveWest()
self.ackMove(success)
def do_u(self,args):
"""Moves up..."""
success = self.db.moveUp()
self.ackMove(success)
def do_d(self,args):
"""Moves down..."""
success = self.db.moveDown()
self.ackMove(success)
def do_north(self,args):
"""Moves north..."""
success = self.db.moveNorth()
self.ackMove(success)
def do_south(self,args):
"""Moves south..."""
success = self.db.moveSouth()
self.ackMove(success)
def do_east(self,args):
"""Moves east..."""
success = self.db.moveEast()
self.ackMove(success)
def do_west(self,args):
"""Moves west..."""
success = self.db.moveWest()
self.ackMove(success)
def do_up(self,args):
"""Moves up..."""
success = self.db.moveUp()
self.ackMove(success)
def do_down(self,args):
"""Moves down..."""
success = self.db.moveDown()
self.ackMove(success)
def do_look(self,args):
"""Looks at an object or just around in general"""
if len(args.strip()) == 0:
self.outputRoom()
return
cleaner = removePrep(args)
if isDirection(cleaner.strip()):
self.outputLook(cleaner.strip())
else:
#print cleaner.strip()
self.outputLookAt(self.db.lookAt(cleaner.strip()))
def do_examine(self,args):
if len(args.strip())==0:
print "Examine what?"
self.do_look('at '+args.strip())
def do_i(self,args):
"""List inventory..."""
inv = self.db.getInventory()
if len(inv) == 0:
'You currently have no items in your inventory'
return
print 'Current Inventory:'
for x in inv:
print ' '+x
def do_inv(self,args):
"""List inventory..."""
self.do_i(args)
def do_inventory(self,args):
"""List inventory..."""
self.do_i(args)
def do_get(self,args):
"""Picks up an item in the room..."""
success = self.db.pickUp(args)
if not success:
print "I don't see any %s to pick up" % args
elif success == True:
print 'Picked up %s' % args
else:
print success
def do_drop(self,args):
"""Drops an inventory item"""
success = self.db.drop(args)
if not success:
print "You're not carrying %s" % args
elif success == True:
print "Dropped %s" % args
def do_exit(self,args):
"""Quits the game..."""
return self.do_quit(args)
def do_quit(self,args):
"""Quits the game..."""
self.db.end()
return -1
def do_save(self,args):
"""Saves the game to a specified file"""
if len(args.strip()) == 0:
print "Please include a filename - save "
else:
success = self.db.save(args.strip())
if success:
print "Game saved successfully"
else:
print "Unknown error while saving..."
def do_load(self,args):
"""Loads the game from a specified file"""
if len(args.strip()) == 0:
print "Please include a filename - load "
else:
backupdb = self.db
try:
self.db = GameDB(args.strip())
print "Loading successful!"
print
self.ackMove(MOVE_OK)
backupdb.end()
except:
self.db = backupdb
print "Loading failed for unknown reasons..."
def do_xyzzy(self,args):
"""..."""
print "The air shimmers with magic..."
print "Something big is about to happen..."
print "..."
print "You hear a distant sigh of disgust, but nothing else happens."
def default(self,args):
"""For unrecognized commands"""
ret = False
if len(args.strip()) > 0:
(verb,obj1,obj2) = parseSentence(args)
#print verb,obj1,obj2
ret = handle(self.db,verb,obj1,obj2)
if not ret:
print getUnkownCmd()
else:
print ret
def outputRoom(self):
print '* '+self.db.getRoomName()+' *'
print self.db.getRoomDescription()
for item in self.db.getRoomContents():
print item
#print
def outputLook(self,dir):
desc = self.db.getDirection(getSafeDirection(dir))
if desc:
print desc
else:
print "It's a little foggy..."
def outputLookAt(self,text):
if text:
print text
else:
print "Excuse me?"
def precmd(self,line):
return self.db.clearSynonyms(line)
def postcmd(self,stop,line):
if stop:
return stop
if self.db.isEnd():
for line in self.db.getEnding().splitlines():
print line
print "Press ENTER to continue..."
self.stdin.readline()
self.db.end()
return True
return False
def preloop(self):
for line in self.db.getIntro().splitlines():
print line
print "Press ENTER to continue..."
self.stdin.readline()
print
for line in self.db.getTitle().splitlines():
print line
print
self.outputRoom()
def ackMove(self,success=MOVE_OK):
if success==MOVE_OK:
self.outputRoom()
elif success==MOVE_FAILED:
print 'That way is blocked...'
else:
print success