class Profile(GameEngineElement): def __init__(self, recall_string=None, name_entry_cb=None): GameEngineElement.__init__(self) self.name = "" self.dungeon_id = "al1.txt" self.position = (-1, -1) self.playerFacing = NORTH self.hero = Hero() # 4 types of stats and difficulties self.problem_stats = {} self.difficulty = {} for stat in ["mult", "div", "geo", "shop"]: # Each type of stat has 3 "levels" easy, medium, hard # Shop uses level for too much, too little, exact self.problem_stats[stat] = [(0, 0), (0, 0), (0, 0)] # Difficulty: 1=Easy 2=Meduim(default) 3=Hard self.difficulty[stat] = 2 self.puzzlesSolved = 0 self.inventory = [] bg = pygame.image.load(MENU_PATH + "mafh_splash.gif").convert() self.background = DrawableObject([bg], "") self.background.scale(self.game_engine.width, self.game_engine.height) self.add_to_scene([self.background]) # create background rect draw_width = self.game_engine.width / 4 draw_height = self.game_engine.height / 4 surf = pygame.Surface((draw_width + 60, draw_height + 60)) surf.fill((150, 150, 255)) self.blueRect = DrawableObject([surf], "") self.add_to_scene([self.blueRect]) font = pygame.font.Font(None, 16) self.text_list = [] self.text_list.append(DrawableFontObject("1", font)) self.text_list.append(DrawableFontObject("2", font)) self.text_list.append(DrawableFontObject("name", font)) self.add_to_scene(self.text_list) if recall_string: self.load_from_json_string(recall_string) if self.name == "": self.name_cb = name_entry_cb self.add_to_engine() def reload_dungeon(self): self.__load_dungeon(self.game_engine.get_object("dungeon").id) # restore HP self.hero.setHealth(self.hero.maxHealthPoints()) def next_dungeon(self): self.__load_dungeon(self.game_engine.get_object("dungeon").next) def __load_dungeon(self, id): self.position = (-1, -1) self.playerFacing = NORTH d = self.game_engine.get_object("dungeon") self.dungeon_id = id d.remove_from_engine() self.game_engine.remove_object("dungeon") self.game_engine.add_object("dungeon", Dungeon(self.dungeon_id)) self.remove_keys() def load_from_json_string(self, recall_string): print "TO BE IMPLEMENTED" def dump_to_json_string(self): print "TO BE IMPLEMENTED" def update_problem_stat(self, p_type, level, correct): assert p_type in self.problem_stats assert level >= 0 and level < len(self.problem_stats) - 1 correct, wrong = self.problem_stats[p_type][level] if correct: self.problem_stats[p_type][level] = (correct + 1, wrong) else: self.problem_stats[p_type][level] = (correct, wrong + 1) def move_to(self, x, y): self.position = (x, y) def turn(self, dir): if dir == RIGHT: self.playerFacing = (self.playerFacing - 1) % 4 elif dir == LEFT: self.playerFacing = (self.playerFacing + 1) % 4 def give_item(self, item): self.inventory.append(item) def remove_keys(self): i = 0 new_inv = [] for item in self.inventory: if not isinstance(item, Key): new_inv.append(item) self.inventory = new_inv def add_to_engine(self): super(Profile, self).add_to_engine() def remove_from_engine(self): super(Profile, self).remove_from_engine() def event_handler(self, event): """ Handles user input (used only for name entry) """ if event.type == pygame.KEYDOWN: if pygame.key.name(event.key) == "backspace": self.name = self.name[0:-1] return True elif pygame.key.name(event.key) == "return": self.remove_from_engine() self.name_cb() return True else: self.name += event.unicode return True def draw(self): """ Draws user input for name to the screen """ width = self.game_engine.width height = self.game_engine.height draw_width = width / 4 draw_height = height / 4 self.background.setPosition(0, 0) self.blueRect.setPosition(draw_width, draw_height) # name self.text_list[0].changeText(self.name, (0, 0, 0)) self.text_list[0].setPosition(draw_width + 60, draw_height + 60) # text1 self.text_list[1].changeText(_("Enter Name:"), (0, 0, 0)) self.text_list[1].setPosition(draw_width, draw_height) # text2 self.text_list[2].changeText(_("Return to continue"), (0, 0, 0)) self.text_list[2].setPosition(draw_width + 20, draw_height + 20)
class Profile(GameEngineElement): def __init__(self, recall_string=None, name_entry_cb=None): GameEngineElement.__init__(self) self.name = "" self.dungeon_id = "al1.txt" self.position = (-1, -1) self.playerFacing = NORTH self.hero = Hero() # 4 types of stats and difficulties self.problem_stats = {} self.difficulty = {} for stat in ['mult', 'div', 'geo', 'shop']: # Each type of stat has 3 "levels" easy, medium, hard # Shop uses level for too much, too little, exact self.problem_stats[stat] = [(0, 0), (0, 0), (0, 0)] #Difficulty: 1=Easy 2=Meduim(default) 3=Hard self.difficulty[stat] = 2 self.puzzlesSolved = 0 self.inventory = [] bg = pygame.image.load(MENU_PATH + "mafh_splash.gif").convert() self.background = DrawableObject([bg], '') self.background.scale(self.game_engine.width, self.game_engine.height) self.add_to_scene([self.background]) #create background rect draw_width = self.game_engine.width / 4 draw_height = self.game_engine.height / 4 surf = pygame.Surface((draw_width + 60, draw_height + 60)) surf.fill((150, 150, 255)) self.blueRect = DrawableObject([surf], "") self.add_to_scene([self.blueRect]) font = pygame.font.Font(None, 16) self.text_list = [] self.text_list.append(DrawableFontObject("1", font)) self.text_list.append(DrawableFontObject("2", font)) self.text_list.append(DrawableFontObject("name", font)) self.add_to_scene(self.text_list) if recall_string: self.load_from_json_string(recall_string) if self.name == "": self.name_cb = name_entry_cb self.add_to_engine() def reload_dungeon(self): self.__load_dungeon(self.game_engine.get_object('dungeon').id) #restore HP self.hero.setHealth(self.hero.maxHealthPoints()) def next_dungeon(self): self.__load_dungeon(self.game_engine.get_object('dungeon').next) def __load_dungeon(self, id): self.position = (-1, -1) self.playerFacing = NORTH d = self.game_engine.get_object('dungeon') self.dungeon_id = id d.remove_from_engine() self.game_engine.remove_object('dungeon') self.game_engine.add_object('dungeon', Dungeon(self.dungeon_id)) self.remove_keys() def load_from_json_string(self, recall_string): print "TO BE IMPLEMENTED" def dump_to_json_string(self): print "TO BE IMPLEMENTED" def update_problem_stat(self, p_type, level, correct): assert (p_type in self.problem_stats) assert (level >= 0 and level < len(self.problem_stats) - 1) correct, wrong = self.problem_stats[p_type][level] if correct: self.problem_stats[p_type][level] = (correct + 1, wrong) else: self.problem_stats[p_type][level] = (correct, wrong + 1) def move_to(self, x, y): self.position = (x, y) def turn(self, dir): if dir == RIGHT: self.playerFacing = (self.playerFacing - 1) % 4 elif dir == LEFT: self.playerFacing = (self.playerFacing + 1) % 4 def give_item(self, item): self.inventory.append(item) def remove_keys(self): i = 0 new_inv = [] for item in self.inventory: if not isinstance(item, Key): new_inv.append(item) self.inventory = new_inv def add_to_engine(self): super(Profile, self).add_to_engine() def remove_from_engine(self): super(Profile, self).remove_from_engine() def event_handler(self, event): """ Handles user input (used only for name entry) """ if event.type == pygame.KEYDOWN: if pygame.key.name(event.key) == 'backspace': self.name = self.name[0:-1] return True elif pygame.key.name(event.key) == 'return': self.remove_from_engine() self.name_cb() return True else: self.name += event.unicode return True def draw(self): """ Draws user input for name to the screen """ width = self.game_engine.width height = self.game_engine.height draw_width = width / 4 draw_height = height / 4 self.background.setPosition(0, 0) self.blueRect.setPosition(draw_width, draw_height) #name self.text_list[0].changeText(self.name, (0, 0, 0)) self.text_list[0].setPosition(draw_width + 60, draw_height + 60) #text1 self.text_list[1].changeText(_("Enter Name:"), (0, 0, 0)) self.text_list[1].setPosition(draw_width, draw_height) #text2 self.text_list[2].changeText(_("Return to continue"), (0, 0, 0)) self.text_list[2].setPosition(draw_width + 20, draw_height + 20)
class GameMenuHolder( GameEngineElement ): def __init__(self, callback, background=None, width=1200, height=900): GameEngineElement.__init__(self, has_draw=True, has_event=False) self.menu = None self.callback = callback self.background = DrawableObject([pygame.image.load(background).convert()], '') self.background.scale(width, height) self.add_to_scene([self.background]) self.width = width self.height = height def remove_from_engine(self): super( GameMenuHolder, self ).remove_from_engine() self.clear_menu() def draw(self): if self.background: self.background.setPosition(0,0) else: screen.fill((0, 0, 255)) def menu_called(self, id): self.callback(id, self) def clear_menu(self): if self.menu: self.menu.clear_menu() self.menu.remove_from_engine() self.menu = None def show_menu(self,id): if self.is_in_engine(): self.clear_menu() else: self.add_to_engine() if id == "title": menu_options = [ ["Adventure Play", lambda: self.show_menu("adventure"), "Begin a new game, create a new profile, or continue from a saved profile game"], #['Creative Play', lambda: self.show_menu("creative"), "Play custom maps and learn how to create them"], #['Network', lambda: self.show_menu("network"), "Play games with special rules or see the scoreboard"], #['Extras', lambda: self.show_menu("extras"), "View special information for the loaded player profile"], #['Options', lambda: self.menu_called("options"), "Change controls, language, difficulty, and other game settings"], #['Options', lambda: self.show_menu("options"), "Change controls, language, difficulty, and other game settings"], ['Exit Game', lambda: self.game_engine.stop_event_loop(), "Exit the game"] ] elif id == "adventure": menu_options = [ #["Continue", lambda: self.menu_called("continue"), "Continue loaded game from the latest save"], #["Level Select", lambda: self.menu_called("level"), "Play completed levels from loaded game"], #["Load Game", lambda: self.menu_called("load"), "Load player profile game data"], ["New Game", lambda: self.menu_called("new"), "Play story mode from the beginning"], #["New Player Profile", lambda: self.menu_called("newpro"), "Create a new player profile"], ["Return to Title", lambda: self.show_menu("title"), "Return to the title menu"] ] elif id == "creative": menu_options = [ ["Play Custom Map", lambda: self.menu_called("playcustom"), "NOT AVAILABLE-Play a custom made map"], ["New Custom Map", lambda: self.menu_called("newcustom"), "NOT AVAILABLE-Learn how to create your own custom map"], ["Share Map", lambda: self.menu_called("sharecustom"), "NOT AVAILABLE-Share created maps with friends"], ["Return to Title", lambda: self.show_menu("title"), "Return to the title menu"] ] elif id == "network": menu_options = [ ["Local Treasure Trekkers Play", lambda: self.menu_called("networktreasure"), "NOT AVAILABLE-Play a special time trial version of Fortune Hunter"], ["View Scoreboard", lambda: self.menu_called("networkscore"), "NOT AVAILABLE-View the scoreboard for your team"], ["Return to Title", lambda: self.show_menu("title"), "Return to the title menu"] ] elif id == "extras": menu_options = [ ["View Bestiary", lambda: self.menu_called("viewbestiary"), "NOT AVAILABLE-View monster information"], ["View Treasures", lambda: self.menu_called("viewtreasures"), "NOT AVAILABLE-View collected treasures"], ["View Awards", lambda: self.menu_called("viewawards"), "NOT AVAILABLE-View awards"], ["View Statistics", lambda: self.menu_called("viewstats"), "NOT AVAILABLE-View statistics"], ["Return to Title", lambda: self.show_menu("title"), "Return to the title menu"] ] elif id == "options": menu_options = [ ["Controls", lambda: self.menu_called("controls"), "NOT AVAILABLE-Change control scheme"], ["Language", lambda: self.menu_called("language"), "NOT AVAILABLE-Change language setting"], ["Audio", lambda: self.menu_called("audiu"), "NOT AVAILABLE-Toggle audio on or off"], ["Subtitles", lambda: self.menu_called("subtitles"), "NOT AVAILABLE-Toggle subtitles on or off"], ["FMCs", lambda: self.menu_called("fmcs"), "NOT AVAILABLE-Toggle FMCs on or off"], ["Cooperative Play", lambda: self.menu_called("coop"), "NOT AVAILABLE-Toggle coop mode on or off"], ["Game Difficulty", lambda: self.menu_called("difficulty"), "NOT AVAILABLE-Change the game difficulty setting"], ["Merchant Difficulty", lambda: self.menu_called("merchant"), "NOT AVAILABLE-Change the merchant difficulty setting"], ["Credits", lambda: self.menu_called("credits"), "NOT AVAILABLE-Watch the credits reel"], ["About", lambda: self.menu_called("about"), "NOT AVAILABLE-Information on game and version"], ["Return to Title", lambda: self.show_menu("title"), "Return to the title menu"] ] else: print "Invalid Menu", id return self.menu = GameMenu(menu_options, self.width, self.height)
class GameMenuHolder(GameEngineElement): def __init__(self, callback, background=None, width=1200, height=900): GameEngineElement.__init__(self, has_draw=True, has_event=False) self.menu = None self.callback = callback self.background = DrawableObject( [pygame.image.load(background).convert()], '') self.background.scale(width, height) self.add_to_scene([self.background]) self.width = width self.height = height def remove_from_engine(self): super(GameMenuHolder, self).remove_from_engine() self.clear_menu() def draw(self): if self.background: self.background.setPosition(0, 0) else: screen.fill((0, 0, 255)) def menu_called(self, id): self.callback(id, self) def clear_menu(self): if self.menu: self.menu.clear_menu() self.menu.remove_from_engine() self.menu = None def show_menu(self, id): if self.is_in_engine(): self.clear_menu() else: self.add_to_engine() if id == "title": menu_options = [ [ "Adventure Play", lambda: self.show_menu("adventure"), "Begin a new game, create a new profile, or continue from a saved profile game" ], #['Creative Play', lambda: self.show_menu("creative"), "Play custom maps and learn how to create them"], #['Network', lambda: self.show_menu("network"), "Play games with special rules or see the scoreboard"], #['Extras', lambda: self.show_menu("extras"), "View special information for the loaded player profile"], #['Options', lambda: self.menu_called("options"), "Change controls, language, difficulty, and other game settings"], #['Options', lambda: self.show_menu("options"), "Change controls, language, difficulty, and other game settings"], [ 'Exit Game', lambda: self.game_engine.stop_event_loop(), "Exit the game" ] ] elif id == "adventure": menu_options = [ #["Continue", lambda: self.menu_called("continue"), "Continue loaded game from the latest save"], #["Level Select", lambda: self.menu_called("level"), "Play completed levels from loaded game"], #["Load Game", lambda: self.menu_called("load"), "Load player profile game data"], [ "New Game", lambda: self.menu_called("new"), "Play story mode from the beginning" ], #["New Player Profile", lambda: self.menu_called("newpro"), "Create a new player profile"], [ "Return to Title", lambda: self.show_menu("title"), "Return to the title menu" ] ] elif id == "creative": menu_options = [ [ "Play Custom Map", lambda: self.menu_called("playcustom"), "NOT AVAILABLE-Play a custom made map" ], [ "New Custom Map", lambda: self.menu_called("newcustom"), "NOT AVAILABLE-Learn how to create your own custom map" ], [ "Share Map", lambda: self.menu_called("sharecustom"), "NOT AVAILABLE-Share created maps with friends" ], [ "Return to Title", lambda: self.show_menu("title"), "Return to the title menu" ] ] elif id == "network": menu_options = [[ "Local Treasure Trekkers Play", lambda: self.menu_called("networktreasure"), "NOT AVAILABLE-Play a special time trial version of Fortune Hunter" ], [ "View Scoreboard", lambda: self.menu_called("networkscore"), "NOT AVAILABLE-View the scoreboard for your team" ], [ "Return to Title", lambda: self.show_menu("title"), "Return to the title menu" ]] elif id == "extras": menu_options = [[ "View Bestiary", lambda: self.menu_called("viewbestiary"), "NOT AVAILABLE-View monster information" ], [ "View Treasures", lambda: self.menu_called("viewtreasures"), "NOT AVAILABLE-View collected treasures" ], [ "View Awards", lambda: self.menu_called("viewawards"), "NOT AVAILABLE-View awards" ], [ "View Statistics", lambda: self.menu_called("viewstats"), "NOT AVAILABLE-View statistics" ], [ "Return to Title", lambda: self.show_menu("title"), "Return to the title menu" ]] elif id == "options": menu_options = [ [ "Controls", lambda: self.menu_called("controls"), "NOT AVAILABLE-Change control scheme" ], [ "Language", lambda: self.menu_called("language"), "NOT AVAILABLE-Change language setting" ], [ "Audio", lambda: self.menu_called("audiu"), "NOT AVAILABLE-Toggle audio on or off" ], [ "Subtitles", lambda: self.menu_called("subtitles"), "NOT AVAILABLE-Toggle subtitles on or off" ], [ "FMCs", lambda: self.menu_called("fmcs"), "NOT AVAILABLE-Toggle FMCs on or off" ], [ "Cooperative Play", lambda: self.menu_called("coop"), "NOT AVAILABLE-Toggle coop mode on or off" ], [ "Game Difficulty", lambda: self.menu_called("difficulty"), "NOT AVAILABLE-Change the game difficulty setting" ], [ "Merchant Difficulty", lambda: self.menu_called("merchant"), "NOT AVAILABLE-Change the merchant difficulty setting" ], [ "Credits", lambda: self.menu_called("credits"), "NOT AVAILABLE-Watch the credits reel" ], [ "About", lambda: self.menu_called("about"), "NOT AVAILABLE-Information on game and version" ], [ "Return to Title", lambda: self.show_menu("title"), "Return to the title menu" ] ] else: print "Invalid Menu", id return self.menu = GameMenu(menu_options, self.width, self.height)