24 Commits

Author SHA1 Message Date
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
Joe S
377bb43e42 Add (most) of a handler for OPEN command
TODO: finish by updating the player locatio
2021-02-26 20:45:49 -05:00
Joe S
f400a4c7c3 Clean up handler 2021-02-24 16:16:03 -05:00
Joe S
1eb7f0b07b Dont be quite as verbose 2021-02-24 16:14:30 -05:00
Joe S
d1c85a7738 Handle commands that dont match existing handlers 2021-02-24 16:14:20 -05:00
Joe S
1c4f962201 Add some more world 2021-02-24 16:11:14 -05:00
Joe S
2d60766c0f Add missingno easteregg 2021-02-24 01:19:48 -05:00
Joe S
2b176aebdd Make the default missing texture cuter 2021-02-24 01:13:41 -05:00
Joe S
4c6e3a51af Add some 'office art' 2021-02-24 01:13:28 -05:00
8 changed files with 268 additions and 80 deletions

View File

@@ -29,6 +29,25 @@ 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, art=None):
"""
This may not be needed in the future, dynamic
handling of location is something the navigator should do and should inherit from player.
"""
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
inventory_width = 20 inventory_width = 20
@@ -47,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,
@@ -101,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,53 +61,87 @@ 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) # 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.")
if command == 'PICK': elif command in ['PICK', 'TAKE']:
if arguments[0] == 'UP': try:
if len(arguments) <= 2: # If there are only 2 args ex:up, item then we dont need to merge that last arg if arguments[0] == 'UP' or command in ['TAKE']:
try: if command in ['TAKE']:
# Argument[1] is the "thing" you want to pick up, yaml is lowercase so we lowercase it. arguments = ['UP'] + arguments # This is a messy way to fix take logic vs pick up logic but it works.
self.parent.parentApp.log.info('Player tried to pick up {0}'.format(arguments[1])) if len(arguments) <= 2: # If there are only 2 args ex:up, item then we dont need to merge that last arg
self.parent.update_log(room[arguments[1].lower()]['pick_up']) try:
except KeyError: # Argument[1] is the "thing" you want to pick up, yaml is lowercase so we lowercase it.
self.parent.update_log("You cant pick that up.") self.parent.parentApp.log.info('Player tried to pick up {0}'.format(arguments[1]))
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[arguments[1].lower()]['pick_up'])
try: player.add_inventory(room[arguments[1].lower()]['item_name'])
long_arg = '_'.join(arguments[1:]) # Joins whatever comes after 1 in our args with '_' between except KeyError:
self.parent.parentApp.log.info('Player tried to pick up long object {0}'.format(long_arg)) self.parent.update_log("You cant pick that up.")
self.parent.update_log(room[long_arg.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
except KeyError: try:
self.parent.update_log("You cant pick that up.") long_arg = '_'.join(
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':
try:
self.parent.parentApp.log.info('Player tried to open door: {0}'.format(arguments[0]))
new_room = room[arguments[0].lower()]['leads_to']
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:
self.parent.update_log("You cant open that.")
except IndexError:
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:
self.parent.parentApp.log.info('Player\'s command was not understood: {0}'.format(command))
self.parent.update_log('I didn\'t understand {0}'.format(command))
if command == 'WHERE': if command == 'WHERE':
# TODO: this should take the human readable room name, not the code-name # TODO: this should take the human readable room name, not the code-name
@@ -99,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,11 +1,34 @@
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
self.playerData = parse(save_location) self.playerData = parse(save_location)
def change_room(self, 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!
"""
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

@@ -13,24 +13,44 @@ menu:
\____/_/ |_/_/ /_/_____/ \____/_/ |_/_/ /_/_____/
not_found: | not_found: |
-------------------------------------------------------------------------------------------------- +--------------------------------------------------------------------------------NNN0ddk0000kkX--+
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------------N0OOkkkO0OkxON--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------------KkOkkkxkOxloON--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------------0xOO00000kdokX--|
-----------------------------------------------/ \----------------------------------------------- |---------------------------------------------+/ \+-----------------------------XOxdddxdl:;cdX--|
----------------------------------------------/ !! \---------------------------------------------- |--------------------------------------------+/ !! \+----------------------------XOxoldxllc:oON--|
---------------------------------------------/ \--------------------------------------------- |-------------------------------------------+/ \+---------------------------0xkddkxdOxod0W--|
--------------------------------------No Art for this location------------------------------------ |------------------------------------+No Art for this location+------------------XkddkxodkxkxxX--|
----------------------------------Consider making a pull request?--------------------------------- |--------------------------------|Consider making a pull request?|---------NXXXKOOkxxxddodxkkOX--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------NXNNXxclddxkkxkOOO0N--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------XkxxxdddoxkkxkOkxkKW--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------KxxxxdollloodO0kkk0N--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------XkxxxdlclddkOOkk0OON--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------N0dooxdlcdkOkkkkxcoX--|
-------------------------------------------------------------------------------------------------- |--------------------------------------------------------------------------WXKKKKOOO0K0kxxxdodX--|
-------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------|
-------------------------------------------------------------------------------------------------- |------------------------------------------------------------------------------------------------|
-------------------------------------------------------------------------------------------------- +------------------------------------------------------------------------------------------------+
start_to_continue: |
+ +
| |
| TYPE |
| START |
| TO BEGIN! |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
+ +
dimensions: dimensions:
inventory_width: 23 inventory_width: 23
inventory_height: 20 inventory_height: 20

View File

@@ -0,0 +1,20 @@
room:
name: "The Hallway"
grid: [0, 1]
upon_enter: "You are standing just outside your office door."
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:
look_at: "Its a closet door."
inspect: "Its still a closet door."
desk:
look_at: "Its your receptionists desk, she's not sitting behind it."
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,12 +1,39 @@
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|"
pick_up_logviewer: "You pick the *LOG VIEWER* up."
desk: desk:
look_at: "You move to stand behind your desk. You see a |NAMEPLATE|, a |TAPE RECORDER| and your trusty |LOG VIEWER|" look_at: "You move to stand behind your desk. You see a |NAMEPLATE|, a |TAPE RECORDER| and your trusty |LOG VIEWER|"
inspect: "Desk, ornate, stuff" inspect: "The desk is large and ornate with one of those silly lamps hovering over it."
bookshelf:
look_at: "The bookshelf is a bookshelf."
inspect: "Its still a bookshelf."
log_viewer: log_viewer:
look_at: "log viewer looks like garbo" item_name: "Log Viewer"
inspect: "beep boop" look_at: "The log viewer is a small piece of ornate code, allowing you to examine |entities| more closely."
pick_up: "You pick up the *LOG VIEWER*." inspect: "The dials are wiggly and the viewer makes Beep Boop sounds sometimes."
pick_up: "You pick up the *LOG VIEWER*."
door:
leads_to: hallway.yaml
look_at: "Its a door, it leads to the Hallway. You should try to |OPEN| it."
inspect: "Its ornate but basic, the other side of the door has your name on a plaque."
art: |
+ +
| |
| OFFICE STUFF? |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
+ +

View File

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