12 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
8 changed files with 154 additions and 48 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,18 +61,8 @@ 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)['room']
# 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!
@@ -78,22 +85,27 @@ class Handler(npyscreen.ButtonPress):
self.parent.parentApp.log.error('Could not handle {0}, {1}'.format(command, arguments)) self.parent.parentApp.log.error('Could not handle {0}, {1}'.format(command, arguments))
self.parent.update_log("You must specify something to look at.") self.parent.update_log("You must specify something to look at.")
elif command == 'PICK': elif command in ['PICK', 'TAKE']:
try: try:
if arguments[0] == 'UP': if arguments[0] == 'UP' or command in ['TAKE']:
if len( if command in ['TAKE']:
arguments) <= 2: # If there are only 2 args ex:up, item then we dont need to merge that last arg arguments = ['UP'] + arguments # This is a messy way to fix take logic vs pick up logic but it works.
if len(arguments) <= 2: # If there are only 2 args ex:up, item then we dont need to merge that last arg
try: try:
# Argument[1] is the "thing" you want to pick up, yaml is lowercase so we lowercase it. # Argument[1] is the "thing" you want to pick up, yaml is lowercase so we lowercase it.
self.parent.parentApp.log.info('Player tried to pick up {0}'.format(arguments[1])) self.parent.parentApp.log.info('Player tried to pick up {0}'.format(arguments[1]))
self.parent.update_log(room[arguments[1].lower()]['pick_up']) self.parent.update_log(room[arguments[1].lower()]['pick_up'])
player.add_inventory(room[arguments[1].lower()]['item_name'])
except KeyError: except KeyError:
self.parent.update_log("You cant pick that up.") self.parent.update_log("You cant pick that 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 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
try: try:
long_arg = '_'.join(arguments[1:]) # Joins whatever comes after 1 in our args with '_' between long_arg = '_'.join(
self.parent.parentApp.log.info('Player tried to pick up long object {0}'.format(long_arg)) 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']) self.parent.update_log(room[long_arg.lower()]['pick_up'])
player.add_inventory(room[long_arg.lower()]['item_name'])
except KeyError: except KeyError:
self.parent.update_log("You cant pick that up.") self.parent.update_log("You cant pick that up.")
except IndexError: except IndexError:
@@ -101,16 +113,31 @@ class Handler(npyscreen.ButtonPress):
self.parent.update_log("You must specify something to pick up.") 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. 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. self.parent.update_log(upon_enter) # Print the new room upon enter text.
#except KeyError:
# self.parent.update_log("You cant open that.") room = self.localize_room(player.playerData['player']['location']) # Re-Localize!
#except IndexError: except KeyError:
# self.parent.update_log("you must specify something to open") 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: 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))
@@ -123,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,4 +1,5 @@
from yaml_parser import parse_datafile as parse from yaml_parser import parse_datafile as parse
from errors import ItemAlreadyTaken
class Player: class Player:
@@ -22,3 +23,12 @@ class Player:
room = self.playerData['player']['location'] room = self.playerData['player']['location']
return parse('adventure_game/gamedata/world/' + room)['room']['upon_enter'] 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,11 +1,20 @@
room: 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 @@
room: 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 @@ room:
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']