def read_file_moves(fp): ''' takes file pointer and makes csv reader iterates through reader and creates list of valid move instances ''' moves_file = csv.reader(fp) move_objects = [] next(moves_file, None) for line in moves_file: if line[2] != "1": pass elif line[9] == "1": pass elif line[4] == "" or not line[4]: pass elif line[6] == "" or not line[6]: pass else: move_object = Move(line[1], element_id_list[int(line[3])], int(line[4]), int(line[6]), int(line[9])) move_objects.append(move_object) return move_objects
def search_move_table(name, move_table=move_table): """ 目的︰從 move_table 整一個 move instance arg: name: 招式的名稱 move_table: 招式表 return: Move 的 instance """ row = move_table[move_table['中文名'] == name] # category = row['類型'].iloc[0] #這是變化、物理或特殊類形 category = '變化' #這是變化、物理或特殊類形 damage = row['威力'].iloc[0] accuracy = row['命中'].iloc[0] pp = row['PP/上限'].iloc[0] offset = row['先制'].iloc[0] #是否先制技 m_type = row['type'].iloc[0] special = None # 有沒有特殊效果 return Move(name, category=category, damage=damage, accuracy=accuracy, pp=pp, offset=offset, special=special, m_type=m_type)
async def create_move(self, data: dict) -> Move: """ Create an Move object based on the given data, and return it. :param data: a dictionary :return: Pokemon object """ return Move(name=data["name"], move_id=data["id"], generation=data["generation"]["name"], accuracy=data["accuracy"], pp=data["pp"], power=data["power"], move_type=data["type"]["name"], damage_class=data["damage_class"]["name"], effect_short=data["effect_entries"][0]["short_effect"])
def read_file_moves(fp): csv_reader = csv.reader(fp) next(csv_reader) moves_list = [] for move in csv_reader: name = move[1] element = element_id_list[int(move[3])] attack_type = int(move[9]) power = int(move[4]) if move[4]!='' else None accuracy = int(move[6]) if move[6]!='' else None generation_id = int(move[2]) if generation_id==1 and attack_type!=1 and power!=None and accuracy!=None: move_obj=Move(name,element,power,accuracy,attack_type) moves_list.append(move_obj) return moves_list
def read_file_moves(fp): """ Input: fp: file pointer for moves.csv Output: list of move objects Algorithm: Reads fp line by line and creates move objects. Each object that fills the project criteria is added to the returned move list. """ reader = csv.reader(fp) #Attaches reader to the file pointer next(reader, None) #Skip first line move_list = list() for line_list in reader: gen = line_list[2] if gen != '1': break attack_type = line_list[9] #2 phy, #3 spe, #1 status effect if attack_type == '1': continue ele_idx = int(line_list[3]) element = element_id_list[ele_idx] name = line_list[1].lower() #Power and accuracy sections power = line_list[4] if power == '': continue else: power = int(power) accuracy = line_list[6] if accuracy == '': continue else: accuracy = int(accuracy) move = Move(name, element, power, accuracy, attack_type) move_list.append(move) return move_list
def read_file_moves(fp): ''' This sorts through the move csv and gets certain stats of the move to ultimately calculate damage ''' lst = [] reader = csv.reader(fp) next(reader, None) # skips header for line in reader: # goes through each line and skips the ones with empty values if int(line[2]) != 1 or int( line[9] == 1) or not (line[4]) or not (line[6]): pass else: lst.append( Move(line[1], element_id_list[int(line[3])], int(line[4]), int(line[6]), int(line[9]))) return lst # returns list of moves
async def create_pokemon_move_list(self, data: list) -> list: """ If not an expanded mode, create a list of Move objects based on the given data, and return the list. If an expanded mode, pass a list of url parameters to the async tasks method, and then return the move_list. :param data: list of dictionaries :return: list of Move objects """ if not self.request.expanded: moves = [ Move(name=d["move"]["name"], level=d["version_group_details"][0]["level_learned_at"], url=d["move"]["url"]) for d in data ] return moves else: params = [d["move"]["url"] for d in data] await self.process_async_tasks(Mode.MOVE, params, True) return self.move_list
def read_file_moves(fp): '''takes file pointer and returns a list of move objects''' moves_list = [] reader = csv.reader(fp) next(reader, None) #skip header line for line in reader: generation_id = int(line[2]) name = line[1] attack_type = int(line[9]) if (generation_id == 1) and (attack_type != 1): #must be first gen and attack 2 or 3 try: #account for missing accuracy or power element_id = int(line[3]) element = element_id_list[ element_id] #element_id represents index accuracy = int(line[6]) power = int(line[4]) move = Move(name, element, power, accuracy, attack_type) #create move instance moves_list.append(move) except: next(reader, None) return moves_list
def process_args(self, args, kwargs): if args[1] == 'player' and args[3] == self.player_name: #args[2] will be 'p1' or 'p2' self.player_num = args[2][1] if args[1] == 'request' and args[2] != '': #Read team data data = json.loads(args[2]) if self.game_data.team == None: #Initialize team pokemon = list(map(Pokemon.from_data, data['side']['pokemon'])) self.game_data.team = pokemon self.game_data.active = pokemon[0] else: #Update data for x in data['side']['pokemon']: name, _, _ = Pokemon.get_details(x['details']) for p in self.game_data.team: if p.name == name: h, m, s = Pokemon.get_condition(x['condition']) p.health = h p.max_health = m p.status = s p.stats = x['stats'] p.update_ability(x['ability']) p.item = x['item'] break if 'wait' in data: self.wait_game = True else: if 'forceSwitch' in data: self.wait_game = False self.force_switch = True elif 'teamPreview' in data: self.wait_game = False self.choose_start = True else: self.wait_game = False self.force_switch = False #Read active pokemon moves moves = list( map(Move.from_data, data['active'][0]['moves'])) active = data['side']['pokemon'][0] name, _, _ = Pokemon.get_details(active['details']) for p in self.game_data.team: if p.name == name: p.moves = moves if args[1] == 'turn': #Do stuff with turn number? pass if args[1] == 'teamsize' and args[2] != 'p' + self.player_num: #Initialize opponent team with None for unknown pokemon num = int(args[3]) self.game_data.opp_team = [None for i in range(num)] if args[1] == 'move': player, _ = parse_pokemon(args[2]) if player != self.player_num: name = clean_name(args[3]) #Check if zmove if name not in movedex: #z status move m = re.match('z(.*)', name) name = m.group(1) move_type = movedex[name]['type'] #Find corresponding zcrystal for item in itemdex.values(): if 'zMoveType' in item and item[ 'zMoveType'] == move_type: self.game_data.opp_active.item = item['id'] elif 'isZ' in movedex[name]: zcrystal = movedex[name]['isZ'] if 'zMoveFrom' in itemdex[zcrystal]: #Signature zmove name = clean_name(itemdex[zcrystal]['zMoveFrom']) else: #Don't know original move name = None self.game_data.opp_active.item = zcrystal if name: #Update opponent moves opp_moves = self.game_data.opp_active.moves for i in range(len(opp_moves)): if opp_moves[i] == None: opp_moves[i] = Move(name) opp_moves[i].pp -= 1 break if opp_moves[i].name == name: opp_moves[i].pp -= 1 break if args[1] == 'switch' or args[1] == 'drag': player, nickname = parse_pokemon(args[2]) if player == self.player_num: self.clear_boosts(self.player_num) self.clear_poke_effects(self.player_num) self.game_data.active.transformed = False #Update active pokemon and team positions name, _, _ = Pokemon.get_details(args[3]) team = self.game_data.team if team: for i in range(len(team)): if team[i].name == name: self.game_data.active = team[i] team[0], team[i] = team[i], team[0] break else: if self.game_data.opp_active: self.game_data.opp_active.switch_out() self.clear_boosts(self.other_player()) self.clear_poke_effects(self.other_player()) #Update opponent active pokemon and team name, _, _ = Pokemon.get_details(args[3]) for i in range(len(self.game_data.opp_team)): opp = self.game_data.opp_team[i] if opp == None: #New pokemon p = Pokemon.from_details(args[3], nickname, args[4]) self.game_data.opp_active = p self.game_data.opp_team[i] = p break if name == opp.name: #Existing pokemon self.game_data.opp_active = opp break if args[1] == 'detailschange' or args[1] == '-formechange': player, _ = parse_pokemon(args[2]) if player != self.player_num: name, _, _ = Pokemon.get_details(args[3]) self.game_data.opp_active.change_form(name) if args[1] == 'replace': #TODO: implement this pass if args[1] == 'faint': player, _ = parse_pokemon(args[2]) if player != self.player_num: self.game_data.opp_active.status = 'fnt' if args[1] == '-damage' or args[1] == '-heal': player, _ = parse_pokemon(args[2]) if player != self.player_num: health, max_health, status = Pokemon.get_condition(args[3]) p = self.game_data.opp_active p.health = health p.max_health = max_health p.status = status self.check_item_ability(player, kwargs) if args[1] == '-sethp': player, _ = parse_pokemon(args[2]) health1, _, _ = Pokemon.get_condition(args[3]) health2, _, _ = Pokemon.get_condition(args[5]) if player == self.player_num: self.game_data.opp_active.health = health2 else: self.game_data.opp_active.health = health1 if args[1] == '-status': player, _ = parse_pokemon(args[2]) if player != self.player_num: self.game_data.opp_active.status = args[3] self.check_item_ability(player, kwargs) if args[1] == '-curestatus': m = re.match('p(1|2): (.*)', args[2]) if m: #Cured pokemon is not active if m.group(1) != self.player_num: team = self.game_data.opp_team for p in team: if p.nickname == m.group(2): p.status = None break else: #Cured pokemon is active player, _ = parse_pokemon(args[2]) if player != self.player_num: self.game_data.opp_active.status = None self.check_item_ability(player, kwargs) if args[1] == '-boost': player, _ = parse_pokemon(args[2]) b = self.get_boosts(player) b[args[3]] += int(args[4]) self.check_item_ability(player, kwargs) if args[1] == '-unboost': player, _ = parse_pokemon(args[2]) b = self.get_boosts(player) b[args[3]] -= int(args[4]) if player != self.player_num: self.check_item_ability(player, kwargs) if args[1] == '-setboost': player, _ = parse_pokemon(args[2]) amount = int(args[4]) #For some reason, anger point sends -setboost 12 instead of 6 if amount > 6: amount = 6 b = self.get_boosts(player) b[args[3]] = amount if player != self.player_num: self.check_item_ability(player, kwargs) if args[1] == '-swapboost': b = self.game_data.boosts opp_b = self.game_data.opp_boosts swap = list(b) if len(args) > 4: swap = args[4].split(', ') for stat in swap: b[stat], opp_b[stat] = opp_b[stat], b[stat] if args[1] == '-clearpositiveboost' or args[1] == '-clearnegativeboost': player, _ = parse_pokemon(args[2]) b = self.get_boosts(player) for stat in b: if args[1] == '-clearpositiveboost' and b[stat] > 0: b[stat] = 0 elif args[1] == '-clearnegativeboost' and b[stat] < 0: b[stat] = 0 if player != self.player_num: self.check_item_ability(player, kwargs) if args[1] == '-copyboost': b_to = self.game_data.boosts b_from = self.game_data.opp_boosts player, _ = parse_pokemon(args[2]) if player != self.player_num: b_to, b_from = b_from, b_to swap = list(b_to) if len(args) > 4: swap = args[4].split(', ') for stat in b_to: b_to[stat] = b_from[stat] if args[1] == '-clearboost': player, _ = parse_pokemon(args[2]) self.clear_boosts(player) if player != self.player_num: self.check_item_ability(player, kwargs) if args[1] == '-invertboost': player, _ = parse_pokemon(args[2]) b = self.get_boosts(player) for stat in b: b[stat] = -b[stat] if player != self.player_num: self.check_item_ability(player, kwargs) if args[1] == '-clearallboost': self.clear_boosts(self.player_num) self.clear_boosts(self.other_player()) if args[1] == '-item': player, _ = parse_pokemon(args[2]) if player != self.player_num: self.game_data.opp_active.item = clean_name(args[3]) if args[1] == '-enditem': player, _ = parse_pokemon(args[2]) if player != self.player_num: self.game_data.opp_active.item = '' if args[1] == '-ability': player, _ = parse_pokemon(args[2]) if player != self.player_num: ability = clean_name(args[3]) self.game_data.opp_active.set_ability(ability) if args[1] == '-endability': player, _ = parse_pokemon(args[2]) if player != self.player_num: opp = self.game_data.opp_active if len(args) <= 3: opp.update_ability('') #Only remove ability if currently has ability #Needed because -endability is sent after using transform if len(args) > 3 and opp.ability == clean_name(args[3]): opp.update_ability('') if args[1] == '-transform': player, _ = parse_pokemon(args[2]) p = self.game_data.active opp = self.game_data.opp_active if player == self.player_num: self.game_data.boosts = self.game_data.opp_boosts.copy() #Update opponent data before transforming because #p.transform copies opponent data opp.set_ability(p.ability) opp.moves = [] for move in p.moves: opp.moves.append(Move(move.name)) p.transform(opp) else: self.check_item_ability(player, kwargs) opp.transform(p) self.game_data.opp_boosts = self.game_data.boosts.copy() if args[1] == '-zpower': player, _ = parse_pokemon(args[2]) if player == self.player_num: self.game_data.zmove = True else: self.game_data.opp_zmove = True if args[1] == '-mega': player, _ = parse_pokemon(args[2]) if player == self.player_num: self.game_data.mega = True else: self.game_data.opp_mega = True self.game_data.opp_active.item = clean_name(args[4]) if args[1] == '-start': player, _ = parse_pokemon(args[2]) p = self.get_active(player) effects = self.get_poke_effects(player) m = re.match('(move: )?(.*)', args[3]) eff = clean_name(m.group(2)) if eff == 'typechange': if 'from' in kwargs: arg = kwargs['from'] if arg == 'move: Reflect Type': player2, _ = parse_pokemon(kwargs['of']) p2 = self.get_active(player2) p.types = p2.types.copy() else: if arg == 'Protean' or arg == 'Color Change': p.set_ability(clean_name(arg)) new_type = clean_name(args[4]) p.types = [new_type] else: new_type = clean_name(args[4]) p.types = [new_type] elif eff == 'typeadd': new_type = clean_name(args[4]) p.types.append(new_type) elif eff in effects: effects[eff] = True else: self.logger.info('Unknown effect: %s', eff) if args[1] == '-end': player, _ = parse_pokemon(args[2]) effects = self.get_poke_effects(player) m = re.match('(move: )?(.*)', args[3]) eff = clean_name(m.group(2)) if eff in effects: effects[eff] = False else: self.logger.info('Unknown effect: %s', eff) if args[1] == '-activate': player, _ = parse_pokemon(args[2]) p = self.get_active(player) m = re.match('(?:(move|ability|item): )?(.*)', args[3]) eff = clean_name(m.group(2)) if m.group(1) == 'ability': p.set_ability(eff) elif m.group(1) == 'item': p.item = eff #Handle some special activations if eff == 'mummy': ofpoke = kwargs['of'] ofplayer, _ = parse_pokemon(ofpoke) p2 = self.get_active(ofplayer) old_ability = clean_name(args[4]) p2.set_ability(old_ability) p2.update_ability('mummy') elif eff == 'forewarn': name = clean_name(args[4]) ofpoke = kwargs['of'] ofplayer, _ = parse_pokemon(ofpoke) if ofplayer != self.player_num: #Update opponent moves opp_moves = self.game_data.opp_active.moves for i in range(len(opp_moves)): if opp_moves[i] == None: opp_moves[i] = Move(name) break if opp_moves[i].name == name: break elif eff == 'skillswap': ability1 = clean_name(args[4]) ability2 = clean_name(args[5]) ofpoke = kwargs['of'] ofplayer, _ = parse_pokemon(ofpoke) p2 = self.get_active(ofplayer) p.set_ability(ability2) p.update_ability(ability1) p2.set_ability(ability1) p2.update_ability(ability2) if args[1] == '-sidestart': m = re.match('p(1|2): ', args[2]) player = m.group(1) effects = self.get_side_effects(player) m = re.match('(move: )?(.*)', args[3]) eff = clean_name(m.group(2)) if eff == 'spikes' or eff == 'toxicspikes': effects[eff] += 1 else: if eff in effects: effects[eff] = True if args[1] == '-sideend': m = re.match('p(1|2): ', args[2]) player = m.group(1) effects = self.get_side_effects(player) m = re.match('(move: )?(.*)', args[3]) eff = clean_name(m.group(2)) if eff == 'spikes' or eff == 'toxicspikes': effects[eff] = 0 else: if eff in effects: effects[eff] = False if args[1] == '-weather': weather = clean_name(args[2]) if weather == 'none': self.game_data.weather = None else: self.game_data.weather = weather self.check_item_ability(self.player_num, kwargs) if args[1] == '-fieldstart': m = re.match('(move: )?(.*)', args[2]) eff = clean_name(m.group(2)) if eff.endswith('terrain'): self.game_data.terrain = eff else: if eff in self.game_data.field_effects: self.game_data.field_effects[eff] = True self.check_item_ability(self.player_num, kwargs) if args[1] == '-fieldend': m = re.match('(move: )?(.*)', args[2]) eff = clean_name(m.group(2)) if eff.endswith('terrain'): self.game_data.terrain = None else: if eff in self.game_data.field_effects: self.game_data.field_effects[eff] = False
from pokemon import Team def growl_effect(move, atk_pkmn, def_pkmn): def_pkmn.stat_mod['atk'] -= 1 return (atk_pkmn, def_pkmn) def tail_whip_effect(move, atk_pkmn, def_pkmn): def_pkmn.stat_mod['defn'] -= 1 return (atk_pkmn, def_pkmn) ally_team = Team( Pokemon('Charmander', Type.FIRE, None, 'Blaze', 'Male', 5, 20, 11, 10, 12, 11, 13, Move('Scratch', Type.NORMAL, 40, 35, False), Move('Growl', Type.NORMAL, 0, 40, False, 100, 0, growl_effect)), Pokemon('Charmander', Type.FIRE, None, 'Blaze', 'Male', 5, 20, 11, 10, 12, 11, 13, Move('Scratch', Type.NORMAL, 40, 35, False), Move('Growl', Type.NORMAL, 0, 40, False, 100, 0, growl_effect)), ) enemy_team = Team( Pokemon( 'Squirtle', Type.WATER, None, 'Torrent', 'Male', 5, 20, 11, 13, 11, 12, 10, Move('Tackle', Type.NORMAL, 35, 35, False, 95), Move('Tail Whip', Type.NORMAL, 0, 40, False, 100, 0, tail_whip_effect)), Pokemon( 'Squirtle', Type.WATER, None, 'Torrent', 'Male', 5, 20, 11, 13, 11, 12, 10, Move('Tackle', Type.NORMAL, 35, 35, False, 95),
# CT attack method ############################################################################## from pokemon import Move, Pokemon from random import seed seed(2) m_L = [ Move('rock-throw', 'rock', 50, 90, 2), Move('hyper-fang', 'normal', 80, 90, 2), Move('comet-punch', 'normal', 18, 85, 2), Move('pay-day', 'normal', 40, 100, 2) ] p2 = Pokemon('pidgeot', 'normal', 'flying', m_L, 83, 80, 75, 70, 70) m_L2 = [ Move('slam', 'normal', 80, 75, 2), Move('thunder-punch', 'electric', 75, 100, 2), Move('thunderbolt', 'electric', 90, 100, 3), Move('thunder', 'electric', 110, 70, 3) ] p1 = Pokemon('pikachu', 'electric', '', m_L2, 35, 55, 40, 50, 50) print(p1) print(p2) print("Attack #1") print("{} hp before:{}".format(p2.get_name(), p2.get_hp())) p1.attack(Move('thunderbolt', 'electric', 90, 100, 3), p2) print("{} hp after:{}".format(p2.get_name(), p2.get_hp())) assert p2.get_hp() == 0 print('-' * 20) m_L3 = [ Move('bubble', 'water', 40, 100, 3), Move('rock-throw', 'rock', 50, 90, 2), Move('bone-club', 'ground', 65, 85, 2),