17 Commits

Author SHA1 Message Date
Joe S
ef5e21a6c5 Update blank_room.yaml 2021-02-26 23:00:00 -05:00
Joe S
752977aa94 take and pick up now work the same 2021-02-26 22:53:22 -05:00
Joe S
5c97859f4c slightly more stuff added to hallway. 2021-02-26 22:48:08 -05:00
Joe S
ebd518dd01 Add in some better art handling. 2021-02-26 22:41:26 -05:00
Joe S
22017b2c42 add start to begin art 2021-02-26 22:27:15 -05:00
Joe S
bab62f0174 Remove some testing mess 2021-02-26 22:21:44 -05:00
Joe S
c022293335 you can pick up items! 2021-02-26 22:19:17 -05:00
Joe S
66279c3bec add custom errors! 2021-02-26 22:13:32 -05:00
Joe S
50d1fc5cae Change up inventory structure 2021-02-26 22:13:26 -05:00
Joe S
e844ac23f4 Fix critical error when moving between rooms. 2021-02-26 21:59:58 -05:00
Joe S
493b663b4e Must handle these 2021-02-26 21:54:59 -05:00
Joe S
21bd3c39bb Change where we set art, inventory and location 2021-02-26 21:53:41 -05:00
Joe S
a1f215cc93 handle updating location 2021-02-26 21:51:34 -05:00
Joe S
2f8dd761ba player can now change rooms! 2021-02-26 21:46:08 -05:00
Joe S
bcb2ee060d add more try/except. Also handle new method of parenting room names 2021-02-26 21:45:58 -05:00
Joe S
3aa6d426fe Make room global 'room' not name of room 2021-02-26 21:45:36 -05:00
Joe S
301d3d75db Add some extra handlers to make engine less likely to crash unexpectedly 2021-02-26 21:34:08 -05:00
9 changed files with 187 additions and 66 deletions

View File

@@ -29,12 +29,24 @@ class GameNavigator(npyscreen.FormBaseNew):
self.logBox.value = res # Set the logbox to that value self.logBox.value = res # Set the logbox to that value
def update_location(self, location): def update_location(self, location, art=None):
""" """
This may not be needed in the future, dynamic This may not be needed in the future, dynamic
handling of location is something the navigator should do and should inherit from player. handling of location is something the navigator should do and should inherit from player.
""" """
pass self.artBox.footer = location
if art != None:
self.artContent.value = art
else:
self.artContent.value = self.parentApp.gamelib['menu']['graphics']['not_found']
def update_inventory(self, items):
res = ''
for element in items:
res = res + str(element) + '\n'
res = res.upper() # Inventory is always uppercase
self.inventoryContent.value = res # Set the logbox to that value
def create(self): def create(self):
top_division_height = 20 top_division_height = 20
@@ -54,17 +66,25 @@ class GameNavigator(npyscreen.FormBaseNew):
relx=inventory_width + 2, relx=inventory_width + 2,
max_width=art_width - 2, max_width=art_width - 2,
max_height=top_division_height - 2, max_height=top_division_height - 2,
value=self.parentApp.gamelib['menu']['graphics']['not_found'], value=self.parentApp.gamelib['menu']['graphics']['start_to_continue'],
editable=False) editable=False)
self.artBox.footer = 'Unknown Location' self.artBox.footer = 'Unknown Location'
self.artBox = self.add(npyscreen.BoxBasic, self.inventoryBox = self.add(npyscreen.BoxBasic,
name='Inventory', name='Inventory',
max_width=inventory_width, max_width=inventory_width,
max_height=top_division_height, max_height=top_division_height,
relx=1, relx=1,
rely=2, rely=2,
editable=False) editable=False)
self.inventoryContent = self.add(npyscreen.MultiLineEdit,
max_width=inventory_width,
max_height=top_division_height,
relx=2,
rely=3,
value='------------------',
editable=False)
self.logBoxOutline = self.add(npyscreen.BoxBasic, self.logBoxOutline = self.add(npyscreen.BoxBasic,
max_width=inventory_width + art_width, max_width=inventory_width + art_width,
@@ -108,10 +128,11 @@ class GameNavigator(npyscreen.FormBaseNew):
its up to Handler.py to actually play the game, but we should its up to Handler.py to actually play the game, but we should
do some basic initalization here do some basic initalization here
""" """
#TODO: load art from the last place the player was in # TODO: load art from the last place the player was in
#TODO: load up inventory # TODO: load up inventory
#TODO: Expand this by loding the text from the game # TODO: Expand this by loding the text from the game
#WARN: THIS MAY REQUIRE REWRITING HANDLER.PY TO INTALIZE THE ROOM OBJECT OUTSIDE OF HANDLER.PY # WARN: THIS MAY REQUIRE REWRITING HANDLER.PY TO INTALIZE THE ROOM OBJECT OUTSIDE OF HANDLER.PY
self.update_log('Welcome back! Try "LOOK AROUND" to get started.') self.update_log('Welcome back! Try "LOOK AROUND" to get started.')
self.update_log('>>Note from joe: Welcome! you\'re playing the demo! Please dont mind text issues like |this| and *this*\ni have yet to implement color!') self.update_log(
'>>Note from joe: Welcome! you\'re playing the demo! Please dont mind text issues like |this| and *this*\ni have yet to implement color!')

View File

@@ -11,6 +11,23 @@ class Handler(npyscreen.ButtonPress):
3: re-render the screen 3: re-render the screen
""" """
def localize_room(self, roomlocation):
"""
This method can re-localize the room.
"""
try:
room = parse(self.parent.parentApp.mainPath / 'gamedata/world' / roomlocation)['room']
# If the file could not be found
except FileNotFoundError:
# Log a critical error!
self.parent.parentApp.log.critical(
'Handler could not load the current room! Is the player file corrupt or was there a typo? Path was {0}'.format(
self.parent.parentApp.mainPath / 'gamedata/world' / roomlocation))
# Put the player in a blank room i forgot to finish
room = parse(self.parent.parentApp.mainPath / 'gamedata/world/blank_room.yaml')
return room
def whenPressed(self): def whenPressed(self):
self.parent.parentApp.log.debug('Send button pressed!') self.parent.parentApp.log.debug('Send button pressed!')
# This is the raw command from the user # This is the raw command from the user
@@ -44,64 +61,83 @@ class Handler(npyscreen.ButtonPress):
# Localize the player # Localize the player
player = self.parent.parentApp.player player = self.parent.parentApp.player
roomlocation = player.playerData['player']['location'] + '.yaml'
try:
room = parse(self.parent.parentApp.mainPath / 'gamedata/world' / roomlocation)[
player.playerData['player']['location']]
# If the file could not be found room = self.localize_room(player.playerData['player']['location']) # Localize the room
except FileNotFoundError:
# Log a critical error!
self.parent.parentApp.log.critical(
'Handler could not load the current room! Is the player file corrupt or was there a typo? Path was {0}'.format(
self.parent.parentApp.mainPath / 'gamedata/world' / roomlocation))
# Put the player in a blank room i forgot to finish
room = parse(self.parent.parentApp.mainPath / 'gamedata/world/blank_room.yaml')
# By now we should be situated in our room, and with our player. # By now we should be situated in our room, and with our player.
# self.parent.parentApp.log.debug(room) # We dont need to log this, its too verbose! # self.parent.parentApp.log.debug(room) # We dont need to log this, its too verbose!
# TODO: Should upgrade these to use fuzzy words library! and not direct comparisons! # TODO: Should upgrade these to use fuzzy words library! and not direct comparisons!
if command == 'LOOK': if command == 'LOOK':
if arguments[0] == 'AROUND': try:
try: if arguments[0] == 'AROUND':
self.parent.update_log(room['look_around']) try:
except KeyError: self.parent.update_log(room['look_around'])
self.parent.update_log('There is nothing to look at?.. This might be a bug.') except KeyError:
if arguments[0] == 'AT': self.parent.update_log('There is nothing to look at?.. This might be a bug.')
try: if arguments[0] == 'AT':
# Argument[1] is the "thing" you want to look at, yaml is lowercase so we lowercase it. try:
self.parent.update_log(room[arguments[1].lower()]['look_at']) # Argument[1] is the "thing" you want to look at, yaml is lowercase so we lowercase it.
except KeyError: self.parent.update_log(room[arguments[1].lower()]['look_at'])
self.parent.update_log("Not sure what you're trying to look at.") except KeyError:
self.parent.update_log("Im not sure what you're trying to look at.")
except IndexError:
self.parent.parentApp.log.error('Could not handle {0}, {1}'.format(command, arguments))
self.parent.update_log("You must specify something to look at.")
elif command == 'PICK': elif command in ['PICK', 'TAKE']:
if arguments[0] == 'UP': try:
if len( if arguments[0] == 'UP' or command in ['TAKE']:
arguments) <= 2: # If there are only 2 args ex:up, item then we dont need to merge that last arg if command in ['TAKE']:
try: arguments = ['UP'] + arguments # This is a messy way to fix take logic vs pick up logic but it works.
# Argument[1] is the "thing" you want to pick up, yaml is lowercase so we lowercase it. if len(arguments) <= 2: # If there are only 2 args ex:up, item then we dont need to merge that last arg
self.parent.parentApp.log.info('Player tried to pick up {0}'.format(arguments[1])) try:
self.parent.update_log(room[arguments[1].lower()]['pick_up']) # Argument[1] is the "thing" you want to pick up, yaml is lowercase so we lowercase it.
except KeyError: self.parent.parentApp.log.info('Player tried to pick up {0}'.format(arguments[1]))
self.parent.update_log("You cant pick that up.") self.parent.update_log(room[arguments[1].lower()]['pick_up'])
else: # if its a longer list of args, the player prolly wants to pick up an item with multiple words, like hand_axe, or log_viewer player.add_inventory(room[arguments[1].lower()]['item_name'])
try: except KeyError:
long_arg = '_'.join(arguments[1:]) # Joins whatever comes after 1 in our args with '_' between self.parent.update_log("You cant pick that up.")
self.parent.parentApp.log.info('Player tried to pick up long object {0}'.format(long_arg)) else: # if its a longer list of args, the player prolly wants to pick up an item with multiple words, like hand_axe, or log_viewer
self.parent.update_log(room[long_arg.lower()]['pick_up']) try:
except KeyError: long_arg = '_'.join(
self.parent.update_log("You cant pick that up.") arguments[1:]) # Joins whatever comes after 1 in our args with '_' between
self.parent.parentApp.log.info(
'Player tried to pick up long object {0}'.format(long_arg))
self.parent.update_log(room[long_arg.lower()]['pick_up'])
player.add_inventory(room[long_arg.lower()]['item_name'])
except KeyError:
self.parent.update_log("You cant pick that up.")
except IndexError:
self.parent.parentApp.log.error('Could not handle {0}, {1}'.format(command, arguments))
self.parent.update_log("You must specify something to pick up.")
elif command == 'OPEN': elif command == 'OPEN':
try: try:
self.parent.parentApp.log.info('Player tried to open door: {0}'.format(arguments[0])) self.parent.parentApp.log.info('Player tried to open door: {0}'.format(arguments[0]))
new_room = room[arguments[0].lower()]['leads_to'] new_room = room[arguments[0].lower()]['leads_to']
self.parent.parentApp.log.debug('New room is: {0}'.format(new_room)) self.parent.parentApp.log.debug('New room is: {0}'.format(new_room))
upon_enter = player.change_room(new_room) # Change the player to that new room.
self.parent.update_log(upon_enter) # Print the new room upon enter text.
room = self.localize_room(player.playerData['player']['location']) # Re-Localize!
except KeyError: except KeyError:
self.parent.update_log("You cant open that.") self.parent.update_log("You cant open that.")
except IndexError: except IndexError:
self.parent.update_log("you must specify something to open") self.parent.update_log("You must specify something to open")
elif command == 'INSPECT':
try:
self.parent.parentApp.log.info('Player inspecting: {0}'.format(arguments[0]))
self.parent.update_log(
room[arguments[0].lower()]['inspect']) # Prints the inspect text, if it exists
except KeyError:
self.parent.update_log("Nothing more to inspect here.")
except IndexError:
self.parent.update_log("You must specify something to inspect.")
elif command == 'START':
self.parent.update_log('Welcome to the game! Try to |LOOK AROUND|.')
else: else:
self.parent.parentApp.log.info('Player\'s command was not understood: {0}'.format(command)) self.parent.parentApp.log.info('Player\'s command was not understood: {0}'.format(command))
@@ -114,6 +150,19 @@ class Handler(npyscreen.ButtonPress):
# Log the command that we parsed # Log the command that we parsed
self.parent.parentApp.log.info('Parsed command "{0}" with arguments "{1}"'.format(command, arguments)) self.parent.parentApp.log.info('Parsed command "{0}" with arguments "{1}"'.format(command, arguments))
"""
Do a little bit of final setup, change the art if we
need to, change the text at the bottom and update the inventory.
"""
try:
self.parent.update_location(
room['name'],
room['art'])
except KeyError:
self.parent.update_location('Unknown Location')
self.parent.update_inventory(player.playerData['player']['inventory'])
# Make sure to re-draw the art box when we're all done (in case we updated it in logic above) # Make sure to re-draw the art box when we're all done (in case we updated it in logic above)
self.parent.artContent.display() self.parent.artContent.display()

View File

@@ -1,10 +1,13 @@
from yaml_parser import parse_datafile as parse from yaml_parser import parse_datafile as parse
from errors import ItemAlreadyTaken
class Player: class Player:
""" """
This class intended to abstract out the actual yaml data into a player.(item) that is more This class intended to abstract out the actual yaml data into a player.(item) that is more
friendly to handle in code. friendly to handle in code.
""" """
def __init__(self, save_location): def __init__(self, save_location):
self.save_location = save_location self.save_location = save_location
@@ -15,4 +18,17 @@ class Player:
Should move the player to a new room Should move the player to a new room
TODO: Put a check here that checks if the room we're moving to exists! TODO: Put a check here that checks if the room we're moving to exists!
""" """
self.playerData['player']['location'] = new_room self.playerData['player']['location'] = new_room
room = self.playerData['player']['location']
return parse('adventure_game/gamedata/world/' + room)['room']['upon_enter']
def add_inventory(self, item):
if item in self.playerData['player']['inventory']:
raise ItemAlreadyTaken
else:
self.playerData['player']['inventory'].append(item)
def remove_inventory(self, item):
pass

View File

@@ -0,0 +1,6 @@
class ItemAlreadyTaken(Exception):
pass
class ItemRequired(Exception):
pass

View File

@@ -32,6 +32,25 @@ menu:
|------------------------------------------------------------------------------------------------| |------------------------------------------------------------------------------------------------|
+------------------------------------------------------------------------------------------------+ +------------------------------------------------------------------------------------------------+
start_to_continue: |
+ +
| |
| TYPE |
| START |
| TO BEGIN! |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
+ +
dimensions: dimensions:
inventory_width: 23 inventory_width: 23
inventory_height: 20 inventory_height: 20

View File

@@ -1,4 +1,4 @@
blank_room: room:
grid: [-1, -1] grid: [-1, -1]
upon_enter: "You're in a blank room. It looks unfinished, like joe forgot to put something here" upon_enter: "You're in a blank room. It looks unfinished, like joe forgot to put something here"
look_around: "There is nothing to look at, you should tell joe you're here." look_around: "There is nothing to look at, you should tell joe you're here."

View File

@@ -1,11 +1,20 @@
office: room:
name: "The Hallway"
grid: [0, 1] grid: [0, 1]
upon_enter: "You are standing just outside your office door." upon_enter: "You are standing just outside your office door."
look_around: "You look up, and down the hallway, you see the receptionists |desk|. And a |closet| at the other end of the hall." look_around: "You look up, and down the hallway, you see the receptionists |desk|. A |closet| at the other end of the hall and the |Office Door| Behind you."
closet: closet:
look_at: "Its a closet door." look_at: "Its a closet door."
inspect: "Its still a closet door." inspect: "Its still a closet door."
open: "You cant open this door."
desk: desk:
look_at: "Its your receptionists desks, she's not sitting behind it." look_at: "Its your receptionists desk, she's not sitting behind it."
inspect: "She's still not there." inspect: "She's still not there."
office_door:
leads_to: office.yaml
look_at: "Its a door, it leads to your office. You should try to |OPEN| it."
inspect: "Its ornate but basic, this side of the door has your name on a |plaque|."
plaque:
item_name: "Office Door Plaque"
look_at: "Its a small brass plate, it has your name on it."
inspect: "Its still a small brass plate, and it has your name on it. Beyond that its nothing special."
pick_up: "You tear off the *PLAQUE*, and now you're stuck with it i guess."

View File

@@ -1,4 +1,5 @@
office: room:
name: "Your Office"
grid: [0, 0] grid: [0, 0]
upon_enter: "You are standing behind your desk, you see a |NAMEPLATE|, a |TAPE RECORDER| and your trusty |LOG VIEWER|" upon_enter: "You are standing behind your desk, you see a |NAMEPLATE|, a |TAPE RECORDER| and your trusty |LOG VIEWER|"
look_around: "You look around the room, you see a |DESK|, a |BOOKSHELF| and the |DOOR|" look_around: "You look around the room, you see a |DESK|, a |BOOKSHELF| and the |DOOR|"
@@ -9,7 +10,7 @@ office:
look_at: "The bookshelf is a bookshelf." look_at: "The bookshelf is a bookshelf."
inspect: "Its still a bookshelf." inspect: "Its still a bookshelf."
log_viewer: log_viewer:
item: yes item_name: "Log Viewer"
look_at: "The log viewer is a small piece of ornate code, allowing you to examine |entities| more closely." look_at: "The log viewer is a small piece of ornate code, allowing you to examine |entities| more closely."
inspect: "The dials are wiggly and the viewer makes Beep Boop sounds sometimes." inspect: "The dials are wiggly and the viewer makes Beep Boop sounds sometimes."
pick_up: "You pick up the *LOG VIEWER*." pick_up: "You pick up the *LOG VIEWER*."

View File

@@ -1,4 +1,4 @@
player: player:
name: 'Default' name: 'Default'
location: 'office' location: 'office.yaml'
inventory: ['test', 'test2'] inventory: ['Detective Hat']