242 lines
11 KiB
Python
242 lines
11 KiB
Python
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() |