from core import Trainer import game_data as gd import random import copy game_status = 'story' game_active_flag = True def Battle(trainer,cpu_trainer): global game_status global game_active_flag print("You are in battle!") battle_active = True while battle_active: player_battle_action_selected = False while not player_battle_action_selected: print("Type the number of one of the following actions:") print(f"1) Attack - [Your active Pokemon - {trainer.get_active_pokemon().name}]") print("2) Change pokemon") print("3) Use item") print("4) Run away") print('5) Check status') try: action = int(input("Choose an action (1-5): ").strip()) player_battle_action_selected = True except ValueError: print("Invalid input. Please enter a number between 1 and 5.") continue if action == 1: #check if the player can sustain a battle: first check the active pokemon, #then check the pokemons in the list if not trainer.active_pokemon_can_battle(): print("Your active pokemon cannot battle!") if not trainer.can_battle(): print("You have no more pokemon that can battle! You lost the battle!") battle_active = False game_status = 'pokemon_center' break else: print("You have other pokemon that can battle! Please change your active pokemon!") continue selected_combat_move_flag = False while not selected_combat_move_flag: active_pokemon = trainer.get_active_pokemon() cpu_active_pokemon = cpu_trainer.get_active_pokemon() print(f"Choose a move for {active_pokemon.name} to use against {cpu_active_pokemon.name}:\n", active_pokemon.get_moves()) player_move_name = input("Choose:") try: active_pokemon.useMove(player_move_name,cpu_active_pokemon) selected_combat_move_flag = True #check if the opponent has been defeated if not cpu_trainer.active_pokemon_can_battle(): print(f"{cpu_trainer.get_active_pokemon().name} has been defeated!") battle_active = False game_status = 'story' break #if the opponent has not been defeated, then its the CPU turn to play cpu_active_pokemon_selected_move_name = random.choice(cpu_active_pokemon.get_moves()) print(f"CPU's {cpu_active_pokemon.name} is using {cpu_active_pokemon_selected_move_name} against your {active_pokemon.name}!") cpu_active_pokemon.useMove(cpu_active_pokemon_selected_move_name, active_pokemon) #update the player pokemon list trainer.update_pokemon_list(active_pokemon) #check if the player has been defeated if not trainer.active_pokemon_can_battle(): print(f"Your {active_pokemon.name} has been defeated!") if not trainer.can_battle(): print("You have no more Pokemons that can battle! You lost!") battle_active = False game_status = 'pokemon_center' break else: print("You have other Pokemons that can battle!") continue except ValueError as e: print(e) print("Please try again...") elif action == 2: print('='*30) print("Change active pokemon") print('-'*30) change_pokemon_success = False while not change_pokemon_success: try: print("Select the name of a pokemon in your list:") print(trainer.get_pokemon_list()) chosen_new_pokemon_name = input('Choose...') trainer.change_active_pokemon(chosen_new_pokemon_name) change_pokemon_success = True except ValueError as e: print(e) elif action == 3: print("Select the item index to use:") trainer.print_items() item_selected_flag = False while not item_selected_flag: try: avail_items = list(trainer.items.keys()) item_index = int(input("Choose an item index (1-2): ").strip()) item_selected_flag = True is_pokeball = trainer.use_item(item_name=avail_items[item_index - 1]) if is_pokeball: catch_prob = 1 - (cpu_trainer.get_active_pokemon().get_current_hp() / cpu_trainer.get_active_pokemon().baseStats['hp']) random_value = random.uniform(0, 1) if random_value < catch_prob: print(f"You caught {cpu_trainer.get_active_pokemon().name}!") trainer.add_pokemon(cpu_trainer.get_active_pokemon()) battle_active = False game_status = 'story' else: print(f"{cpu_trainer.get_active_pokemon().name} escaped your pokeball!") except ValueError: print("Please enter a number between 1 and 2.") continue elif action == 4: runaway_prob = 0.6 random_value = random.uniform(0, 1) if random_value < runaway_prob: print("You successfully ran away from the battle!") battle_active = False game_status = 'story' else: print("You could not run away from the battle!") elif action == 5: print('='*30) print("BATTLE INFO") print('-'*30) print("Your items:") trainer.print_items() print("Your pokemon list info:") for pokemon in trainer.pokemon_list: pokemon.print_pokemon_info() print("-"*30) print("CPU active pokemon info:") cpu_trainer.get_active_pokemon().print_pokemon_info() print('='*30) else: print("Invalid action. Please choose again.") def Main(): global game_status global game_active_flag player_created_flag = False while not player_created_flag: try: trainer_name = input("Enter your trainer name: ") print("Available starter Pokemon: ", gd.available_starter_names) starter_name = input("Choose your starter Pokemon: ") trainer = Trainer(name=trainer_name, starter_name=starter_name) print(f"{trainer.name} has chosen {trainer.starter} as their starter Pokemon!") print("Adding potions and pokeballs to your inventory...") trainer.items = {"potions": 10, "pokeball": 10} print("Your character is ready!") trainer.print_trainer_info() player_created_flag = True print(f"Welcome {trainer.name}! Your adventure begins now!") except ValueError as e: print(e) print("Please try again...") continue while game_active_flag: if game_status == 'story': print("Type the number of one of the following actions:") print("1) Explore ") print("2) Pokemon Center") print("3) Pokemon Store") print("4) Show trainer data") print("5) Exit") try: action = int(input("Choose an action (1-5): ").strip()) except ValueError: print("Invalid input. Please enter a number between 1 and 5.") continue if action == 1: game_status = 'explore' elif action == 2: game_status = 'pokemon_center' elif action == 3: game_status = 'pokemon_store' elif action == 4: print("Showing trainer data:") trainer.print_trainer_info() elif action == 5: print("Exiting the game. Goodbye!") game_active_flag = False else: print("Invalid action. Please choose again.") elif game_status == 'explore': print("You are exploring") battle_prob = random.uniform(0, 1) print(f"Battle probability: {battle_prob:.2f}") if battle_prob < 0.8: print("A wild Pokemon appeared!") cpu_trainer = Trainer(name='CPU',starter_name=gd.available_wild_pokemon_names[random.randint(0,len(gd.available_wild_pokemon_names)-1)],is_CPU=True) print(cpu_trainer.get_active_pokemon().print_pokemon_info()) game_status = 'battle' Battle(trainer,cpu_trainer) else: print('-'*30) print("No wild Pokemon appeared.") game_status = 'story' elif game_status == 'pokemon_center': print("You are at the Pokemon Center. You can heal your Pokemon here.") heal_flag = input("Type 'yes' to heal your Pokemons: ").strip().lower() if heal_flag == 'yes': for pokemon in trainer.pokemon_list: pokemon.curr_hp = pokemon.baseStats['hp'] for move in pokemon.moves_dict.keys(): pokemon.moves_dict[move]['PP'] = copy.deepcopy(gd.available_moves[move]['PP']) print("All your Pokemon have been healed!") game_status = 'story' else: print("You exited the Pokemon Center.") game_status = 'story' # Add Pokemon Center logic here elif game_status == 'pokemon_store': print("You are in the Pokemon Store. You can buy items here.") restore_items_flag = input("Type 'yes' to restore your items: ").strip().lower() if restore_items_flag == 'yes': trainer.items = {"potions": 10, "pokeball": 10} print("Your items have been restored!") game_status = 'story' else: print("You exited the Pokemon Store.") game_status = 'story' else: print("Unknown game status. Try again.") if __name__ == "__main__": Main()