From 885f40738381147437e97055d286bd1e015c2838 Mon Sep 17 00:00:00 2001 From: Kwarde Date: Mon, 15 Jan 2024 14:56:20 +0100 Subject: [PATCH] Get player wands, intro to battle, adds spells.random_battle_spell() --- game.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- spells.py | 14 ++++++----- 2 files changed, 80 insertions(+), 8 deletions(-) diff --git a/game.py b/game.py index 145cc63..5ab95c4 100644 --- a/game.py +++ b/game.py @@ -17,7 +17,7 @@ def print_turn_message(player: Player): return random.choice(input_messages).format(name=player.name) current_round = 1 -def round_end(player1: Player, player2: Player): +def round_end(): if (player1.stunned_rounds > 0): player1.stunned_rounds -= 1 if (player2.stunned_rounds > 0): player2.stunned_rounds -= 1 @@ -52,4 +52,74 @@ while True: #GET: WANDS print("Welcome {p1_name} and {p2_name}! You're about to choose a wand to use in this duel! Available wands are:".format(p1_name=player1_name, p2_name=player2_name)) for i in Wand.wandList: - print(i) \ No newline at end of file + print(i) + +#Player 1 +while (True): + try: + wand_input = int(input("What wand do you want {name}? (Enter one of the numbers): ".format(name=player1_name))) + except ValueError: + continue + if wand_input < 1 or wand_input > len(Wand.wandList): + continue + + player1_wand = Wand.wandList[wand_input-1] + break +#Player 2 +while (True): + try: + wand_input = int(input("What wand do you want {name}? (Enter one of the numbers): ".format(name=player2_name))) + except ValueError: + continue + if wand_input < 1 or wand_input > len(Wand.wandList): + continue + + player2_wand = Wand.wandList[wand_input-1] + break + +player1 = Player(player1_name, player1_wand) +player2 = Player(player2_name, player2_wand) + +print() +print("{name} will be fighting with an {wood} wand with a {core} core".format(name=player1.name, wood=player1.wand.get_wand_wood().lower(), core=player1.wand.get_wand_core().lower())) +print("{name} will be fighting with an {wood} wand with a {core} core".format(name=player2.name, wood=player2.wand.get_wand_wood().lower(), core=player2.wand.get_wand_core().lower())) +print(" If you need a list of available spells, enter: help (this will not take away a move)") +print(" If you need information of a specific spell, enter: help SPELL_NAME") +print(" You can press enter (without typing a spell) to cast a random basic combat spell") +print() +print("Alright! Time to duel!") + +game_running = True +try: + while (game_running): + current_round += 1 + if (current_round != 1): + # Weird, right? To have round_end() at the start of a round. + # There will be multiple conditions where the current iteration will end. + # I'm lazy, hence why it's here :-) + round_end() + + print("== Round {round} ==".format(round=current_round)) + + # INPUT: Player 1 + + # INPUT: Player 2 + + # OUTCOME: SPELLS + # > Get spell succes + # > Add health if defensive spell was lucky (partial heal, fully heal) + # > Determine instant winner or skip to next round + # > Determine fastest spell + # Spells with speed 100 will always be casted + # > Determine priority + # 1. Unforgivables + # 2. Protego + # 3. (fastest_spell) + # 4. (other_player) + + # CAST SPELLS + # > + +except KeyboardInterrupt: + print() + print(" Duel ended because both {} and {} suddenly decided to test out their apparition skill!".format(player1.name, player2.name)) \ No newline at end of file diff --git a/spells.py b/spells.py index 1e0e5c5..5c8cfc9 100644 --- a/spells.py +++ b/spells.py @@ -1,4 +1,4 @@ -from random import random +import random from Levenshtein import distance SPELL_TYPE_USELESS = 0 @@ -26,8 +26,7 @@ class Spell: #Class special methods """ name (str) Name of the spell as used in combat - speed (int) Speed of the spell. This will determine what spell hits who in a single move. The spell of the wizard with the lowest spell speed won't hit the player. - If spells have the same speed, both will be executed + speed (int) Speed of the spell. This will determine what spell is casted first. damage (int) Damage that the spell does. Negative damage takes away moves from opponent (eg -2 = cancel 2 moves of opponent) succes_rate (int) How much chance for the spell to be succesfully cast. If it fails, spell won't be cast (thus spells with a succes_rate of 0 would never be executed, and 100=always succes) @@ -75,7 +74,7 @@ spell_protego = Spell("Protego", 100, 000, 95, "Create # Common combat spells. High chance of succes, deals some damage spell_reducto = Spell("Reduto", 75, 150, 75, "Blast an object near your opponent") -spell_rictusempra = Spell("Rictusempra", 85, 90, 90, "Causes your opponent to curl up in laughter, making them tired") +spell_rictusempra = Spell("Rictusempra", 85, 90, 90, "Causes your opponent to curl up in laughter, tiring them out") spell_stupefy = Spell("Stupefy", 95, 75, 95, "Knock over your opponent") # Powerful combat spells. Medium chance of succes, deals more damage or stuns opponents @@ -86,16 +85,19 @@ spell_sectusempra = Spell("Sectusempra", 90, 400, 40, "Slices spell_silencio = Spell("Silencio", 35, -3, 20, "Silences your opponent, causing them unable to cast spells for 3 moves", SPELL_TYPE_POWERFUL) # Unforgivable spells. Very low chance of success, instantly kills or deals alot of damage/stun amount -spell_avada_kedavra = Spell("Avada Kedavra", 100, 9999, 2, "Instantly end your opponent", SPELL_TYPE_UNFORGIVABLE) +spell_avada_kedavra = Spell("Avada Kedavra", 100, 999, 2, "Instantly end your opponent", SPELL_TYPE_UNFORGIVABLE) spell_crucio = Spell("Crucio", 100, 500, 5, "Cause excruciating pain to your opponent, causing alot of damage and making them unable to cast spells for 5 moves", SPELL_TYPE_UNFORGIVABLE) spell_imperio = Spell("Imperio", 100, -1, 3, "Muddle with your opponent's mind, convincing them to stop casting spells for 10 moves", SPELL_TYPE_UNFORGIVABLE) -# spell_none, used as a fallback if an invalid spell was cast ('no object'.method/attribute) +# spell_none, used as a fallback if an invalid spell was casted spell_none = Spell(__INVALID_SPELL, 0, 0, 0, "(internal) invalid spell", SPELL_TYPE_USELESS) ## ## Standalone spell functions ## +def random_combat_spell(): + return random.choice([i for i in Spell.spellList if i.type == SPELL_TYPE_COMMON]) + def find_spell_by_name(input: str): # Returns a list with: [spell_object, levenshtein_distance]. If distance is greater than 0 (typos were made), damage goes down for i in Spell.spellList: if input.title() == i.name.title():