def generate_encounter(self, current_player, enctype="creature"): if enctype == 'creature': self.gm_print('Give me a second to get this entry...') creature = Monster( self.data.table_fetch(f'Floor{self.dungeon_data["floor"]}')) self.gm_print(f'You encounter a {creature.name}!') # TODO: Add more options (charm, barter, negotiate, intimidate) self.run_combat(current_player, creature) elif enctype == 'trap': self.gm_print('You encounter a trap!') choice = rpgtools.generate_menu( ['Go around it', 'Disarm it', 'Just trip it']) if choice == 0: if current_player.check('DEX'): self.gm_print('You go around the trap...') else: self.gm_print('You go around the trap...') self.gm_print('But it gets you at the last moment!') current_player.hp -= rpgtools.roll('1d6') elif choice == 1: if current_player.check('INT'): self.gm_print('You try to disarm the trap...') else: self.gm_print('You try to disarm the trap...') self.gm_print('But it gets you at the last moment!') current_player.hp -= rpgtools.roll('1d6') elif choice == 2: self.gm_print('You boldly march straight into the trap!') current_player.hp -= rpgtools.roll('1d6')
def use_inventory_item(self, extra_targets=None): target = self if self.inventory: choice = self.inventory[rpgtools.generate_menu(self.inventory, use_attr='name')] self.player_print(f"I'm gonna use {choice.name}.") if extra_targets: possible_targets = [self] + extra_targets self.player_print("Gotta pick a target.") target = possible_targets[rpgtools.generate_menu( possible_targets, use_attr='name')] if choice.use_case == 'attack': self.player_print("Making an attack roll...") res = rpgtools.roll('1d20') + self.data['STR'] if res > target.data['AC']: self.player_print('Hit.') choice.use(self, target) else: self.player_print('Miss.') else: choice.use(self, target)
def explore(dungeon): curr_layer = 0 layer = dungeon.directory[curr_layer] curr_room = layer[0] while True: curr_room.visited = True dungeon.display_map(curr_layer, curr_room.x, curr_room.y) print(f'You are in a room of type {curr_room.kind}') ways_out = list(curr_room.exits.keys()) c = coretools.generate_menu(ways_out + ['Back']) if c == len(ways_out + ['Back']) - 1: curr_room = curr_room.entrance if curr_room == 'EXIT': print('You left the dungeon') break else: curr_room = curr_room.exits[ways_out[c]]
def run_combat(self, player, enemy): order = [enemy, player] self.gm_print('Roll initiative...') if player.check('DEX'): order = [player, enemy] to_escape = False while True: for actor in order: if actor == player: self.gm_print('Your turn.') choice = rpgtools.generate_menu(['Use Item', 'Flee']) if choice == 0: player.use_inventory_item([enemy]) elif choice == 1: self.gm_print('Give me an escape check.') if player.check('DEX'): self.gm_print('You successfully disengage!') break else: self.gm_print( 'You will flee at the end of the combat turn!') to_escape = True else: self.gm_print(f'It\'s the {actor.name}\'s turn.') for attacks in range(actor.data['#AT']): if rpgtools.roll('1d20') > player.data['AC']: damage = rpgtools.roll(actor.data['Dmg']) player.data['HP'] -= damage self.gm_print( f'The {actor.name} hits you for {damage} damage!' ) else: self.gm_print(f'The {actor.name} misses!') if to_escape: self.gm_print('You flee!') break if player.data['HP'] <= 0: self.gm_print(f'You fall in battle!') player.is_alive = False break elif enemy.data['HP'] <= 0: self.gm_print(f'The {enemy.name} died!') player.xp += 10 break
def encounter(self, current_player): # Overloaded Encounter Dice simulation v = self.data.table_fetch('Encounters') if v == 'Encounter': self.gm_print('An encounter!') self.generate_encounter(current_player) elif v == 'Nearby': self.gm_print('Something stirs in the darkness...') r = rpgtools.generate_menu(['Run', 'Hide', 'Face it']) if r == 0: if current_player.check('DEX'): self.gm_print('You run away successfully.') else: self.generate_encounter(current_player) elif r == 1: if current_player.check('INT'): self.gm_print('You hide successfully.') else: self.generate_encounter(current_player) elif r == 2: self.generate_encounter(current_player) elif v == 'Food': self.gm_print('You start to feel hungry...') if current_player.data['hunger'] <= 0: self.gm_print('You\'re starving!') current_player.data['HP'] -= 1 else: current_player.data['hunger'] -= 1 elif v == 'Trap': self.gm_print('A trap!') self.generate_encounter(current_player, enctype='trap') elif v == 'Light': self.gm_print('The lights flicker...') if current_player.data['light'] <= 0: self.gm_print('You\'re in the dark!') else: current_player.data['light'] -= 1 elif not v: self.gm_print('Nothing happens. You\'re safe... for now.')
def dungeon_options(self, player): self.gm_print(self.data.table_fetch('RoomText')) choice = rpgtools.generate_menu( ['Go Deeper', 'Use Item', 'Rest', 'Exit Dungeon']) if choice == 0: self.gm_print('Awesome.') self.dungeon_data['room'] += 1 elif choice == 1: if player.inventory: self.gm_print( 'Ok, look through your inventory and tell me what you want to use.' ) player.use_inventory_item() else: self.gm_print('Hey, you don\'t have any items!') elif choice == 2: self.gm_print('You take a break.') player.data['HP'] = player.data['HPMax'] elif choice == 3: self.gm_print(f'Well, that was fun!') return True