From e0621d60856420f135fae512ea4af239f6b2c7c4 Mon Sep 17 00:00:00 2001 From: gquesnot Date: Thu, 26 Sep 2024 16:26:49 +0200 Subject: [PATCH 1/2] set to last_version --- Set12Simulator/augments.py | 52 +++++++++++++++++++++++++++++++++ Set12Simulator/player.py | 35 ++++++++++++++++++++++ Set12Simulator/tft_simulator.py | 8 ++++- 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 Set12Simulator/augments.py diff --git a/Set12Simulator/augments.py b/Set12Simulator/augments.py new file mode 100644 index 0000000..c409cb0 --- /dev/null +++ b/Set12Simulator/augments.py @@ -0,0 +1,52 @@ +from enum import Enum, auto + + +class Augment(Enum): + AFK = auto() + + @staticmethod + def is_augment_round(round_:int) -> bool: + return round_ in [3,10,17] + + +class SelectedAugmentConfig: + round: int + augment: Augment + + def __init__(self, augment: Augment, round_: int): + self.round = round_ + self.augment = augment + + +def handle_start_round_augment(player, augment_config: SelectedAugmentConfig): + """ + Handle modifications to the player at the start of the round + """ + if augment_config.augment == Augment.AFK: + afk_augment_get_golds(player,augment_config) + + + +def handle_can_perform_action_augment(round_:int, augment_config:SelectedAugmentConfig)-> bool: + """ + Check if the player can perform an action based on the augment + """ + if augment_config.augment == Augment.AFK: + return afk_augment_can_perform_action(round_, augment_config) + return True + + + +def afk_augment_get_golds(player, augment_config: SelectedAugmentConfig): + """ + Update the player gold after the afk augment become inactive + """ + if player.round == augment_config.round + 3: + player.gold += 20 + + +def afk_augment_can_perform_action(round_:int, augment_config: SelectedAugmentConfig) -> bool: + """ + Check if the afk augment is active + """ + return round_ >= augment_config.round + 3 diff --git a/Set12Simulator/player.py b/Set12Simulator/player.py index 93745ea..d31a25f 100644 --- a/Set12Simulator/player.py +++ b/Set12Simulator/player.py @@ -2,6 +2,8 @@ import time import numpy as np import random + +from Set12Simulator.augments import SelectedAugmentConfig, Augment, handle_start_round_augment, handle_can_perform_action_augment from Simulator import champion, origin_class import Simulator.utils as utils import Simulator.config as config @@ -17,6 +19,8 @@ from Simulator.observation.token.action import ActionToken # Here for debugging purposes, will be removed later from Simulator.default_agent import Default_Agent +from typing import Dict, List, Optional + """ Description - This is the base player class @@ -178,6 +182,12 @@ def __init__(self, pool_pointer, player_num): self.default_agent = Default_Agent() self.default_player = False + # Store augments for the player + self.augments: List[SelectedAugmentConfig] = [] + + # Store if the player has afk augment active + self.is_afk = False + # --- Exp Action --- # def buy_exp_action(self): """Buys exp for the player and levels up if possible. @@ -373,6 +383,19 @@ def buy_champion(self, a_champion): return champion_added + def add_augment(self, augment:Augment)-> bool: + """ Adds an augment to the player's list of augments + Parameters: + augment (Augment): The augment to be added + Returns: + bool: True if the augment was successfully added, False otherwise + """ + if len(self.augments) >= 3: + return False + self.augments.append(SelectedAugmentConfig(augment, self.round)) + return True + + def add_to_bench(self, a_champion, from_carousel=False): """Adds a champion to the bench. @@ -1607,6 +1630,7 @@ def reset_state(self): self.health = 100 self.max_units = 1 self.num_units_in_play = 0 + self.is_afk = False def spill_reward(self, damage): """Gives reward for taking damage @@ -1630,6 +1654,17 @@ def start_round(self, t_round): self.round = t_round self.reward += self.num_units_in_play * self.minion_count_reward self.gold_income(self.round) + for augment in self.augments: + handle_start_round_augment(self, augment) + + # TODO: remove when augment is correctly implemented + if Augment.is_augment_round(self.round): + self.add_augment(Augment.AFK) + self.is_afk = False + for augment in self.augments: + if handle_can_perform_action_augment(self.round, augment): + self.is_afk = True + break if self.kayn_check(): self.kayn_turn_count += 1 if self.kayn_turn_count >= 3: diff --git a/Set12Simulator/tft_simulator.py b/Set12Simulator/tft_simulator.py index 19e3808..ab1de69 100644 --- a/Set12Simulator/tft_simulator.py +++ b/Set12Simulator/tft_simulator.py @@ -17,6 +17,7 @@ from Simulator.observation.token.action import ActionToken import time +import numpy as np @dataclass class TFTConfig: @@ -234,6 +235,11 @@ def step(self, action): return agent = self.agent_selection + + # if player is afk then pass action + if self.player_manager.player_states[agent].is_afk: + action = np.array([0, 0, 0]) + # Perform action and update observations if action.ndim == 0: self.step_function.perform_1d_action(agent, action) @@ -257,7 +263,7 @@ def step(self, action): self._clear_rewards() _non_trunc_agents = self.agents[:] - if self.taken_max_actions(agent): + if self.taken_max_actions(agent) or self.player_manager.player_states[agent].is_afk: self.truncations[agent] = True self.truncated_agents.append(agent) From b0818b42b7bd4f176069ade28c6136870b83ace3 Mon Sep 17 00:00:00 2001 From: gquesnot Date: Thu, 26 Sep 2024 17:43:45 +0200 Subject: [PATCH 2/2] Add Set12Simulator test Switch import from Simulator to Set12Simulator in Set12Simulator dir Add AugmentType and Augment Add method augment_round and is_augment_round in GameRound Add method to update player from augment, augment.start_round(player) Implemented Augment.AFK --- Set12Simulator/ability.py | 14 +++--- Set12Simulator/active.py | 6 +-- Set12Simulator/alt_autobattler.py | 2 +- Set12Simulator/augment.py | 23 +++++++++ Set12Simulator/augments.py | 52 -------------------- Set12Simulator/batch_generator.py | 14 +++--- Set12Simulator/battle_generator.py | 14 +++--- Set12Simulator/carousel.py | 6 +-- Set12Simulator/champion.py | 14 +++--- Set12Simulator/champion_functions.py | 12 ++--- Set12Simulator/config.py | 2 +- Set12Simulator/default_agent.py | 16 +++--- Set12Simulator/field.py | 4 +- Set12Simulator/game_round.py | 29 +++++++++-- Set12Simulator/items.py | 8 +-- Set12Simulator/loot_orb.py | 4 +- Set12Simulator/minion.py | 6 +-- Set12Simulator/origin_class.py | 8 +-- Set12Simulator/player.py | 41 ++++++--------- Set12Simulator/player_manager.py | 2 +- Set12Simulator/pool.py | 8 +-- Set12Simulator/position_leveling_system.py | 2 +- Set12Simulator/step_function.py | 2 +- Set12Simulator/tft_item_simulator.py | 16 +++--- Set12Simulator/tft_position_simulator.py | 18 +++---- Set12Simulator/tft_rllib_vector_simulator.py | 2 +- Set12Simulator/tft_simulator.py | 16 +++--- Set12Simulator/tft_vector_simulator.py | 2 +- Set12Simulator/utils.py | 2 +- UnitTests/augments_test.py | 19 +++++++ UnitTests/simulator_12_test.py | 21 ++++++++ 31 files changed, 203 insertions(+), 182 deletions(-) create mode 100644 Set12Simulator/augment.py delete mode 100644 Set12Simulator/augments.py create mode 100644 UnitTests/augments_test.py create mode 100644 UnitTests/simulator_12_test.py diff --git a/Set12Simulator/ability.py b/Set12Simulator/ability.py index 1674160..20e5cd0 100755 --- a/Set12Simulator/ability.py +++ b/Set12Simulator/ability.py @@ -1,10 +1,10 @@ -import Simulator.config as config -import Simulator.stats as stats -import Simulator.field as field -import Simulator.champion_functions as champion_functions -import Simulator.item_stats as item_stats -import Simulator.origin_class as origin_class -import Simulator.items as items +import Set12Simulator.config as config +import Set12Simulator.stats as stats +import Set12Simulator.field as field +import Set12Simulator.champion_functions as champion_functions +import Set12Simulator.item_stats as item_stats +import Set12Simulator.origin_class as origin_class +import Set12Simulator.items as items import random from math import ceil, floor diff --git a/Set12Simulator/active.py b/Set12Simulator/active.py index 6f189c2..63b7835 100755 --- a/Set12Simulator/active.py +++ b/Set12Simulator/active.py @@ -1,6 +1,6 @@ -import Simulator.stats as stats -import Simulator.field as field -import Simulator.origin_class_stats as origin_class_stats +import Set12Simulator.stats as stats +import Set12Simulator.field as field +import Set12Simulator.origin_class_stats as origin_class_stats import random diff --git a/Set12Simulator/alt_autobattler.py b/Set12Simulator/alt_autobattler.py index 177c30a..6f5ab96 100644 --- a/Set12Simulator/alt_autobattler.py +++ b/Set12Simulator/alt_autobattler.py @@ -1,4 +1,4 @@ -from Simulator.pool_stats import cost_star_values +from Set12Simulator.pool_stats import cost_star_values import numpy as np def alt_auto_battle(player_1, player_2, round_damage=0): diff --git a/Set12Simulator/augment.py b/Set12Simulator/augment.py new file mode 100644 index 0000000..55e9fc7 --- /dev/null +++ b/Set12Simulator/augment.py @@ -0,0 +1,23 @@ +from enum import Enum, auto + + +class AugmentType(Enum): + AFK = auto() + +class Augment: + type_: AugmentType + round_: int + + def __init__(self, type_: AugmentType, round_: int): + self.type_ = type_ + self.round_ = round_ + + + def start_round(self, player): + if self.type_ == AugmentType.AFK: + remaining_round = player.round - self.round_ - 3 + if remaining_round < 0: + player.is_afk = True + elif remaining_round == 0: + player.gold += 20 + diff --git a/Set12Simulator/augments.py b/Set12Simulator/augments.py deleted file mode 100644 index c409cb0..0000000 --- a/Set12Simulator/augments.py +++ /dev/null @@ -1,52 +0,0 @@ -from enum import Enum, auto - - -class Augment(Enum): - AFK = auto() - - @staticmethod - def is_augment_round(round_:int) -> bool: - return round_ in [3,10,17] - - -class SelectedAugmentConfig: - round: int - augment: Augment - - def __init__(self, augment: Augment, round_: int): - self.round = round_ - self.augment = augment - - -def handle_start_round_augment(player, augment_config: SelectedAugmentConfig): - """ - Handle modifications to the player at the start of the round - """ - if augment_config.augment == Augment.AFK: - afk_augment_get_golds(player,augment_config) - - - -def handle_can_perform_action_augment(round_:int, augment_config:SelectedAugmentConfig)-> bool: - """ - Check if the player can perform an action based on the augment - """ - if augment_config.augment == Augment.AFK: - return afk_augment_can_perform_action(round_, augment_config) - return True - - - -def afk_augment_get_golds(player, augment_config: SelectedAugmentConfig): - """ - Update the player gold after the afk augment become inactive - """ - if player.round == augment_config.round + 3: - player.gold += 20 - - -def afk_augment_can_perform_action(round_:int, augment_config: SelectedAugmentConfig) -> bool: - """ - Check if the afk augment is active - """ - return round_ >= augment_config.round + 3 diff --git a/Set12Simulator/batch_generator.py b/Set12Simulator/batch_generator.py index 39d0be7..c7d2b27 100644 --- a/Set12Simulator/batch_generator.py +++ b/Set12Simulator/batch_generator.py @@ -1,13 +1,13 @@ import config import numpy as np -from Simulator.battle_generator import BattleGenerator -from Simulator import pool -from Simulator.observation.token.basic_observation import ObservationToken -from Simulator.observation.vector.observation import ObservationVector -from Simulator.observation.vector.gemini_observation import GeminiObservation -from Simulator.player_manager import PlayerManager -from Simulator.tft_simulator import TFTConfig +from Set12Simulator.battle_generator import BattleGenerator +from Set12Simulator import pool +from Set12Simulator.observation.token.basic_observation import ObservationToken +from Set12Simulator.observation.vector.observation import ObservationVector +from Set12Simulator.observation.vector.gemini_observation import GeminiObservation +from Set12Simulator.player_manager import PlayerManager +from Set12Simulator.tft_simulator import TFTConfig class BatchGenerator: def __init__(self): diff --git a/Set12Simulator/battle_generator.py b/Set12Simulator/battle_generator.py index 444cfee..e854fb6 100644 --- a/Set12Simulator/battle_generator.py +++ b/Set12Simulator/battle_generator.py @@ -1,13 +1,13 @@ import numpy as np import config import random -from Simulator.pool import pool -from Simulator.player import Player -from Simulator.utils import coord_to_x_y, x_y_to_1d_coord -from Simulator.item_stats import item_builds -from Simulator.champion import champion -from Simulator.observation.token.action import ActionToken -from Simulator.default_agent_stats import ONE_COST_UNITS, TWO_COST_UNITS, THREE_COST_UNITS, FOUR_COST_UNITS, FIVE_COST_UNITS +from Set12Simulator.pool import pool +from Set12Simulator.player import Player +from Set12Simulator.utils import coord_to_x_y, x_y_to_1d_coord +from Set12Simulator.item_stats import item_builds +from Set12Simulator.champion import champion +from Set12Simulator.observation.token.action import ActionToken +from Set12Simulator.default_agent_stats import ONE_COST_UNITS, TWO_COST_UNITS, THREE_COST_UNITS, FOUR_COST_UNITS, FIVE_COST_UNITS """ diff --git a/Set12Simulator/carousel.py b/Set12Simulator/carousel.py index 0adb007..0e8bd1b 100644 --- a/Set12Simulator/carousel.py +++ b/Set12Simulator/carousel.py @@ -1,7 +1,7 @@ import config -from Simulator.item_stats import item_builds as item_builds, basic_items, starting_items, offensive_items, defensive_items -from Simulator.champion import champion -from Simulator.pool_stats import COST_1, COST_2, COST_3, COST_4, COST_5 +from Set12Simulator.item_stats import item_builds as item_builds, basic_items, starting_items, offensive_items, defensive_items +from Set12Simulator.champion import champion +from Set12Simulator.pool_stats import COST_1, COST_2, COST_3, COST_4, COST_5 import random # TODO: diff --git a/Set12Simulator/champion.py b/Set12Simulator/champion.py index ab81f94..57a899e 100755 --- a/Set12Simulator/champion.py +++ b/Set12Simulator/champion.py @@ -1,16 +1,16 @@ -import Simulator.config as config -import Simulator.origin_class as origin_class -import Simulator.origin_class_stats as origin_class_stats -import Simulator.champion_functions as champion_functions +import Set12Simulator.config as config +import Set12Simulator.origin_class as origin_class +import Set12Simulator.origin_class_stats as origin_class_stats +import Set12Simulator.champion_functions as champion_functions import time import random import itertools from math import ceil -from Simulator.stats import AD, HEALTH, ARMOR, MR, AS, RANGE, MANA, MAXMANA, COST, MANALOCK, ABILITY_REQUIRES_TARGET, \ +from Set12Simulator.stats import AD, HEALTH, ARMOR, MR, AS, RANGE, MANA, MAXMANA, COST, MANALOCK, ABILITY_REQUIRES_TARGET, \ DODGE, INITIATIVE_ACTIVE, ABILITY_LENGTH, DAMAGE_PER_UNIT -from Simulator.champion_functions import attack, die, MILLIS, MILLISECONDS_INCREASE, add_damage_dealt -from Simulator import ability, active, field, item_stats, items +from Set12Simulator.champion_functions import attack, die, MILLIS, MILLISECONDS_INCREASE, add_damage_dealt +from Set12Simulator import ability, active, field, item_stats, items que = [] log = [] diff --git a/Set12Simulator/champion_functions.py b/Set12Simulator/champion_functions.py index ef7b6d4..73cf38d 100755 --- a/Set12Simulator/champion_functions.py +++ b/Set12Simulator/champion_functions.py @@ -1,11 +1,11 @@ -import Simulator.config as config -import Simulator.origin_class as origin_class -import Simulator.origin_class_stats as origin_class_stats -import Simulator.stats as stats +import Set12Simulator.config as config +import Set12Simulator.origin_class as origin_class +import Set12Simulator.origin_class_stats as origin_class_stats +import Set12Simulator.stats as stats import random from math import ceil -from Simulator import ability, active, field, item_stats, items -from Simulator.stats import * +from Set12Simulator import ability, active, field, item_stats, items +from Set12Simulator.stats import * MILLISECONDS = 0 diff --git a/Set12Simulator/config.py b/Set12Simulator/config.py index 1e0f3ef..ee15a1a 100644 --- a/Set12Simulator/config.py +++ b/Set12Simulator/config.py @@ -1,5 +1,5 @@ import config -from Simulator.item_stats import uncraftable_items, items +from Set12Simulator.item_stats import uncraftable_items, items CHAMPION_INFORMATION = 12 BOARD_X = 7 diff --git a/Set12Simulator/default_agent.py b/Set12Simulator/default_agent.py index 2efd772..48a473d 100644 --- a/Set12Simulator/default_agent.py +++ b/Set12Simulator/default_agent.py @@ -1,13 +1,13 @@ import config import numpy as np -import Simulator.champion as champion -from Simulator.default_agent_stats import * -from Simulator.pool_stats import cost_star_values -from Simulator.origin_class_stats import tiers, origin_class -from Simulator.origin_class import team_traits -from Simulator.utils import x_y_to_1d_coord -from Simulator.stats import COST, BASE_CHAMPION_LIST -from Simulator.item_stats import starting_items +import Set12Simulator.champion as champion +from Set12Simulator.default_agent_stats import * +from Set12Simulator.pool_stats import cost_star_values +from Set12Simulator.origin_class_stats import tiers, origin_class +from Set12Simulator.origin_class import team_traits +from Set12Simulator.utils import x_y_to_1d_coord +from Set12Simulator.stats import COST, BASE_CHAMPION_LIST +from Set12Simulator.item_stats import starting_items from copy import deepcopy diff --git a/Set12Simulator/field.py b/Set12Simulator/field.py index 32efaa0..d0c876e 100755 --- a/Set12Simulator/field.py +++ b/Set12Simulator/field.py @@ -1,6 +1,6 @@ import math -import Simulator.stats as stats -import Simulator.items as items +import Set12Simulator.stats as stats +import Set12Simulator.items as items coordinates = [[None] * 7 for _ in range(8)] diff --git a/Set12Simulator/game_round.py b/Set12Simulator/game_round.py index 25df96d..3f19543 100644 --- a/Set12Simulator/game_round.py +++ b/Set12Simulator/game_round.py @@ -1,12 +1,14 @@ -import Simulator.config as config +import Set12Simulator.config as config import config as global_config import time import random import numpy as np -from Simulator import champion, minion -from Simulator.champion_functions import MILLIS -from Simulator.carousel import carousel -from Simulator.alt_autobattler import alt_auto_battle + +from Set12Simulator.augment import Augment, AugmentType +from Set12Simulator import champion, minion +from Set12Simulator.champion_functions import MILLIS +from Set12Simulator.carousel import carousel +from Set12Simulator.alt_autobattler import alt_auto_battle from copy import deepcopy @@ -356,6 +358,23 @@ def update_players(self, players): self.PLAYERS = players + + def augment_round(self): + """ + Execute augment round for all players + """ + for player in self.PLAYERS.values(): + if player and player.augments.len() < 3: + player.augments.append(Augment(AugmentType.AFK, self.current_round)) + + + def is_augment_round(self): + """ + Checks if the current round is an augment round + """ + return self.current_round in [3,10,17] + + def log_to_file_start(): if config.LOGMESSAGES: with open('log.txt', "w") as out: diff --git a/Set12Simulator/items.py b/Set12Simulator/items.py index 63dabb9..85e7dc8 100755 --- a/Set12Simulator/items.py +++ b/Set12Simulator/items.py @@ -1,7 +1,7 @@ -from Simulator import field, item_stats -import Simulator.champion_functions as champion_functions -import Simulator.stats as stats -import Simulator.origin_class as origin_class +from Set12Simulator import field, item_stats +import Set12Simulator.champion_functions as champion_functions +import Set12Simulator.stats as stats +import Set12Simulator.origin_class as origin_class import random # ALL FUNCTIONS REGARDING ITEMS ARE HERE diff --git a/Set12Simulator/loot_orb.py b/Set12Simulator/loot_orb.py index 04fa278..20e4929 100644 --- a/Set12Simulator/loot_orb.py +++ b/Set12Simulator/loot_orb.py @@ -1,8 +1,8 @@ from enum import Enum import random import numpy as np -from Simulator import champion, pool_stats -from Simulator.item_stats import thieves_gloves_items +from Set12Simulator import champion, pool_stats +from Set12Simulator.item_stats import thieves_gloves_items # Theives gloves items includes all full items except emblems item_list = thieves_gloves_items diff --git a/Set12Simulator/minion.py b/Set12Simulator/minion.py index 5fa5006..5aee4ed 100644 --- a/Set12Simulator/minion.py +++ b/Set12Simulator/minion.py @@ -1,7 +1,7 @@ import config -import Simulator.config as config -from Simulator import champion -from Simulator.loot_orb import LootOrb, gen_loot, gen_orb_reward, gen_orbs, give_loot +import Set12Simulator.config as config +from Set12Simulator import champion +from Set12Simulator.loot_orb import LootOrb, gen_loot, gen_orb_reward, gen_orbs, give_loot # TODO diff --git a/Set12Simulator/origin_class.py b/Set12Simulator/origin_class.py index 46f756b..5ef6dab 100755 --- a/Set12Simulator/origin_class.py +++ b/Set12Simulator/origin_class.py @@ -1,7 +1,7 @@ -import Simulator.config as config -import Simulator.origin_class_stats as origin_class_stats -from Simulator import field, item_stats, items, champion_functions -import Simulator.stats as stats +import Set12Simulator.config as config +import Set12Simulator.origin_class_stats as origin_class_stats +from Set12Simulator import field, item_stats, items, champion_functions +import Set12Simulator.stats as stats import random import time diff --git a/Set12Simulator/player.py b/Set12Simulator/player.py index d31a25f..6397f56 100644 --- a/Set12Simulator/player.py +++ b/Set12Simulator/player.py @@ -3,21 +3,21 @@ import numpy as np import random -from Set12Simulator.augments import SelectedAugmentConfig, Augment, handle_start_round_augment, handle_can_perform_action_augment -from Simulator import champion, origin_class -import Simulator.utils as utils -import Simulator.config as config -from Simulator.item_stats import basic_items, item_builds, thieves_gloves_items, \ +from Set12Simulator.augment import Augment, AugmentType +from Set12Simulator import champion, origin_class +import Set12Simulator.utils as utils +import Set12Simulator.config as config +from Set12Simulator.item_stats import basic_items, item_builds, thieves_gloves_items, \ starting_items, trait_items, items -from Simulator.stats import COST -from Simulator.pool_stats import cost_star_values -from Simulator.origin_class_stats import tiers, fortune_returns +from Set12Simulator.stats import COST +from Set12Simulator.pool_stats import cost_star_values +from Set12Simulator.origin_class_stats import tiers, fortune_returns from math import floor from config import DEBUG, CHAMPION_ACTION_DIM, TIERS_FLATTEN_LENGTH, TEAM_TIERS_VECTOR -from Simulator.observation.token.action import ActionToken # Here for debugging purposes, will be removed later -from Simulator.default_agent import Default_Agent +from Set12Simulator.observation.token.action import ActionToken # Here for debugging purposes, will be removed later +from Set12Simulator.default_agent import Default_Agent from typing import Dict, List, Optional @@ -78,7 +78,7 @@ def __init__(self, pool_pointer, player_num): Rotated to match the board in game Top | (0, 3) (1, 3) (2, 3) (3, 3) (4, 3) (5, 3) (6, 3) | - Left | (0, 2) (1, 2) (2, 2) (3, 2) (4, 2) (5, 2) (6, 2) | + Left | (0, 2) (1, 2) (2, 2) (3, 2) (4, 2) (5, 2) (6, 2) | | (0, 1) (1, 1) (2, 1) (3, 1) (4, 1) (5, 1) (6, 1) | Right | (0, 0) (1, 0) (2, 0) (3, 0) (4, 0) (5, 0) (6, 0) | Bottom @@ -183,7 +183,7 @@ def __init__(self, pool_pointer, player_num): self.default_player = False # Store augments for the player - self.augments: List[SelectedAugmentConfig] = [] + self.augments: List[Augment] = [] # Store if the player has afk augment active self.is_afk = False @@ -383,16 +383,16 @@ def buy_champion(self, a_champion): return champion_added - def add_augment(self, augment:Augment)-> bool: + def add_augment(self, augment_type:AugmentType) -> bool: """ Adds an augment to the player's list of augments Parameters: - augment (Augment): The augment to be added + augment_type (AugmentType): The augment to be added Returns: bool: True if the augment was successfully added, False otherwise """ if len(self.augments) >= 3: return False - self.augments.append(SelectedAugmentConfig(augment, self.round)) + self.augments.append(Augment(augment_type, self.round)) return True @@ -1630,7 +1630,6 @@ def reset_state(self): self.health = 100 self.max_units = 1 self.num_units_in_play = 0 - self.is_afk = False def spill_reward(self, damage): """Gives reward for taking damage @@ -1654,17 +1653,9 @@ def start_round(self, t_round): self.round = t_round self.reward += self.num_units_in_play * self.minion_count_reward self.gold_income(self.round) - for augment in self.augments: - handle_start_round_augment(self, augment) - - # TODO: remove when augment is correctly implemented - if Augment.is_augment_round(self.round): - self.add_augment(Augment.AFK) self.is_afk = False for augment in self.augments: - if handle_can_perform_action_augment(self.round, augment): - self.is_afk = True - break + augment.start_round(self) if self.kayn_check(): self.kayn_turn_count += 1 if self.kayn_turn_count >= 3: diff --git a/Set12Simulator/player_manager.py b/Set12Simulator/player_manager.py index a69dd80..ce7a219 100644 --- a/Set12Simulator/player_manager.py +++ b/Set12Simulator/player_manager.py @@ -1,5 +1,5 @@ import config -from Simulator.player import Player as player_class +from Set12Simulator.player import Player as player_class class PlayerManager: def __init__(self, diff --git a/Set12Simulator/pool.py b/Set12Simulator/pool.py index 9b11592..7c0a13b 100755 --- a/Set12Simulator/pool.py +++ b/Set12Simulator/pool.py @@ -1,9 +1,9 @@ -import Simulator.stats as stats +import Set12Simulator.stats as stats import random -from Simulator.pool_stats import * -from Simulator.origin_class_stats import origin_class, chosen_exclude -from Simulator.config import LOGMESSAGES +from Set12Simulator.pool_stats import * +from Set12Simulator.origin_class_stats import origin_class, chosen_exclude +from Set12Simulator.config import LOGMESSAGES class pool: diff --git a/Set12Simulator/position_leveling_system.py b/Set12Simulator/position_leveling_system.py index 8c7f3c3..ca9ed58 100644 --- a/Set12Simulator/position_leveling_system.py +++ b/Set12Simulator/position_leveling_system.py @@ -1,4 +1,4 @@ -from Simulator.battle_generator import BattleGenerator +from Set12Simulator.battle_generator import BattleGenerator class PositionLevelingSystem: def __init__(self): diff --git a/Set12Simulator/step_function.py b/Set12Simulator/step_function.py index 574d629..2b3af3b 100644 --- a/Set12Simulator/step_function.py +++ b/Set12Simulator/step_function.py @@ -1,6 +1,6 @@ import time -from Simulator.utils import coord_to_x_y +from Set12Simulator.utils import coord_to_x_y class Step_Function: def __init__(self, player_manager): diff --git a/Set12Simulator/tft_item_simulator.py b/Set12Simulator/tft_item_simulator.py index b4660f4..2c2d3a7 100644 --- a/Set12Simulator/tft_item_simulator.py +++ b/Set12Simulator/tft_item_simulator.py @@ -2,14 +2,14 @@ import time import numpy as np import gymnasium as gym -from Simulator import pool -from Simulator.observation.vector.observation import ObservationVector -from Simulator.step_function import Step_Function -from Simulator.game_round import Game_Round, log_to_file -from Simulator.player import Player as player_class -from Simulator.player_manager import PlayerManager -from Simulator.tft_simulator import TFTConfig -from Simulator.battle_generator import BattleGenerator +from Set12Simulator import pool +from Set12Simulator.observation.vector.observation import ObservationVector +from Set12Simulator.step_function import Step_Function +from Set12Simulator.game_round import Game_Round, log_to_file +from Set12Simulator.player import Player as player_class +from Set12Simulator.player_manager import PlayerManager +from Set12Simulator.tft_simulator import TFTConfig +from Set12Simulator.battle_generator import BattleGenerator from gymnasium.spaces import MultiDiscrete, Dict, Box, Tuple from gymnasium.envs.registration import EnvSpec diff --git a/Set12Simulator/tft_position_simulator.py b/Set12Simulator/tft_position_simulator.py index f4dbab1..bcde653 100644 --- a/Set12Simulator/tft_position_simulator.py +++ b/Set12Simulator/tft_position_simulator.py @@ -4,15 +4,15 @@ from gymnasium.envs.registration import EnvSpec from gymnasium.spaces import MultiDiscrete, Dict, Box -from Simulator import pool -from Simulator.position_leveling_system import PositionLevelingSystem -from Simulator.game_round import Game_Round, log_to_file, log_to_file_start -from Simulator.observation.vector.observation import ObservationVector -from Simulator.observation.token.basic_observation import ObservationToken -from Simulator.player_manager import PlayerManager -from Simulator.step_function import Step_Function -from Simulator.tft_simulator import TFTConfig -from Simulator.utils import coord_to_x_y +from Set12Simulator import pool +from Set12Simulator.position_leveling_system import PositionLevelingSystem +from Set12Simulator.game_round import Game_Round, log_to_file, log_to_file_start +from Set12Simulator.observation.vector.observation import ObservationVector +from Set12Simulator.observation.token.basic_observation import ObservationToken +from Set12Simulator.player_manager import PlayerManager +from Set12Simulator.step_function import Step_Function +from Set12Simulator.tft_simulator import TFTConfig +from Set12Simulator.utils import coord_to_x_y class TFT_Position_Simulator(gym.Env): diff --git a/Set12Simulator/tft_rllib_vector_simulator.py b/Set12Simulator/tft_rllib_vector_simulator.py index 8f49979..4340695 100644 --- a/Set12Simulator/tft_rllib_vector_simulator.py +++ b/Set12Simulator/tft_rllib_vector_simulator.py @@ -12,7 +12,7 @@ ) from ray.util import log_once -from Simulator.tft_position_simulator import TFT_Position_Simulator +from Set12Simulator.tft_position_simulator import TFT_Position_Simulator from typing import List, Optional, Tuple, Union logger = logging.getLogger(__name__) diff --git a/Set12Simulator/tft_simulator.py b/Set12Simulator/tft_simulator.py index ab1de69..ed62021 100644 --- a/Set12Simulator/tft_simulator.py +++ b/Set12Simulator/tft_simulator.py @@ -5,16 +5,16 @@ from pettingzoo.utils.env import AECEnv from pettingzoo.utils.conversions import parallel_wrapper_fn -from Simulator import pool -from Simulator.game_round import Game_Round +from Set12Simulator import pool +from Set12Simulator.game_round import Game_Round -from Simulator.player_manager import PlayerManager -from Simulator.step_function import Step_Function -from Simulator.ui import GameState +from Set12Simulator.player_manager import PlayerManager +from Set12Simulator.step_function import Step_Function +from Set12Simulator.ui import GameState -from Simulator.observation.interface import ObservationBase, ActionBase -from Simulator.observation.token.observation import ObservationToken -from Simulator.observation.token.action import ActionToken +from Set12Simulator.observation.interface import ObservationBase, ActionBase +from Set12Simulator.observation.token.observation import ObservationToken +from Set12Simulator.observation.token.action import ActionToken import time import numpy as np diff --git a/Set12Simulator/tft_vector_simulator.py b/Set12Simulator/tft_vector_simulator.py index e32d499..cd60788 100644 --- a/Set12Simulator/tft_vector_simulator.py +++ b/Set12Simulator/tft_vector_simulator.py @@ -2,7 +2,7 @@ import time import numpy as np import ray -from Simulator.tft_position_simulator import TFT_Position_Simulator +from Set12Simulator.tft_position_simulator import TFT_Position_Simulator from typing import List, Optional logger = logging.getLogger(__name__) diff --git a/Set12Simulator/utils.py b/Set12Simulator/utils.py index 6c99504..5f365d4 100644 --- a/Set12Simulator/utils.py +++ b/Set12Simulator/utils.py @@ -1,4 +1,4 @@ -import Simulator.config as config +import Set12Simulator.config as config import numpy as np from functools import wraps from time import time diff --git a/UnitTests/augments_test.py b/UnitTests/augments_test.py new file mode 100644 index 0000000..ea62e44 --- /dev/null +++ b/UnitTests/augments_test.py @@ -0,0 +1,19 @@ +from Set12Simulator.augment import AugmentType, Augment +from Set12Simulator.player import Player +from Set12Simulator import pool + + +def test_afk_augment(): + pool_pointer = pool.pool() + player_id = 0 + player = Player(pool_pointer=pool_pointer, player_num=player_id) + player.augments = [Augment(AugmentType.AFK, 0)] + player.start_round(1) + assert player.is_afk == True, "afk augment is_afk" + assert player.gold == 2, "afk augment is_afk" + player.start_round(2) + assert player.is_afk == True, "afk augment is_afk" + assert player.gold == 4, "afk augment is_afk" + player.start_round(3) + assert player.gold == 27, "after afk augment" + assert player.is_afk == False, "after afk augment" \ No newline at end of file diff --git a/UnitTests/simulator_12_test.py b/UnitTests/simulator_12_test.py new file mode 100644 index 0000000..82fbdcc --- /dev/null +++ b/UnitTests/simulator_12_test.py @@ -0,0 +1,21 @@ +import pytest +from pettingzoo.test import parallel_api_test, api_test +from Set12Simulator.tft_simulator import parallel_env, env as tft_env, TFTConfig +from Set12Simulator.observation.vector.observation import ObservationVector + +def aec(env): + return tft_env(env) + +def parallel(env): + return parallel_env(env) + + +def test_Env(): + """ + PettingZoo's api tests for the simulator. + """ + tftConfig = TFTConfig(observation_class=ObservationVector) + # raw_env = aec(tftConfig) + # api_test(raw_env, num_cycles=100000) + local_env = parallel(tftConfig) + parallel_api_test(local_env, num_cycles=100000)