Source code for gobigger.managers.player_manager

import random
import math
import logging
import uuid
from abc import ABC, abstractmethod
from easydict import EasyDict
from pygame.math import Vector2

from .base_manager import BaseManager
from gobigger.utils import format_vector, Border, SequenceGenerator
from gobigger.balls import FoodBall, ThornsBall, CloneBall, SporeBall
from gobigger.players import HumanPlayer


[docs]class PlayerManager(BaseManager): def __init__(self, cfg, border, team_num, player_num_per_team, spore_manager_settings, random_generator=None, sequence_generator=None): super(PlayerManager, self).__init__(cfg, border) self.players = {} self.team_num = team_num self.player_num_per_team = player_num_per_team self.player_num = self.team_num * self.player_num_per_team self.spore_manager_settings = spore_manager_settings self.spore_settings = self.spore_manager_settings.ball_settings if random_generator is not None: self._random = random_generator else: self._random = random.Random() if sequence_generator is not None: self.sequence_generator = sequence_generator else: self.sequence_generator = SequenceGenerator() def init_balls(self, custom_init=None): if custom_init is None or len(custom_init) == 0: for i in range(self.team_num): team_id = i for j in range(self.player_num_per_team): player_id = i * self.player_num_per_team + j player = HumanPlayer(cfg=self.cfg.ball_settings, team_id=team_id, player_id=player_id, border=self.border, spore_settings=self.spore_settings, sequence_generator=self.sequence_generator) player.respawn(position=self.border.sample()) self.players[player_id] = player else: init_dict = {} for i in range(self.team_num): team_id = i init_dict[team_id] = {} for j in range(self.player_num_per_team): player_id = i * self.player_num_per_team + j player = HumanPlayer(cfg=self.cfg.ball_settings, team_id=team_id, player_id=player_id, border=self.border, spore_settings=self.spore_settings, sequence_generator=self.sequence_generator) self.players[player_id] = player init_dict[team_id][player_id] = False for ball_cfg in custom_init: position = Vector2(*ball_cfg[0:2]) score = ball_cfg[2] player_id = ball_cfg[3] team_id = ball_cfg[4] ball = CloneBall(ball_id=self.sequence_generator.get(), position=position, border=self.border, score=score, team_id=team_id, player_id=player_id, spore_settings=self.spore_settings, **self.cfg.ball_settings) if len(ball_cfg) > 5: ball.vel_given = Vector2(*ball_cfg[5:7]) ball.acc_given = Vector2(*ball_cfg[7:9]) ball.vel_split = Vector2(*ball_cfg[9:11]) ball.split_frame = Vector2(*ball_cfg[12]) ball.frame_since_last_split = ball_cfg[13] self.players[player_id].add_balls(ball) init_dict[team_id][player_id] = True for team_id, team in init_dict.items(): for player_id, player_init_flag in team.items(): if not player_init_flag: self.players[player_id].respawn(position=self.border.sample())
[docs] def get_balls(self): balls = [] for player_id, player in self.players.items(): balls.extend(player.get_balls()) return balls
def get_players(self): return list(self.players.values()) def get_player_by_name(self, player_id): assert player_id in self.players return self.players[player_id]
[docs] def add_balls(self, balls): if isinstance(balls, list): for ball in balls: self.players[ball.player_id].add_balls(ball) elif isinstance(balls, CloneBall): self.players[balls.player_id].add_balls(balls) return True
[docs] def remove_balls(self, balls): if isinstance(balls, list): for ball in balls: self.players[ball.player_id].remove_balls(ball) elif isinstance(balls, CloneBall): self.players[balls.player_id].remove_balls(balls)
[docs] def step(self): for player_id, player in self.players.items(): if player.get_clone_num() == 0: player.respawn(position=self.border.sample())
[docs] def adjust(self): ''' Overview: Adjust all balls in all players ''' eats = {} for player in self.get_players(): eats[player.player_id] = player.adjust() return eats
def get_clone_num(self, ball): return self.players[ball.player_id].get_clone_num()
[docs] def get_player_names(self): ''' Overview: get all names of players ''' return [player.player_id for player in self.get_players()]
[docs] def get_team_names(self): ''' Overview: get all names of players by teams with team names ''' ret = {} for player in self.get_players(): if player.team_id not in ret: ret[player.team_id] = [] ret[player.team_id].append(player.player_id) return ret
[docs] def get_player_names_with_team(self): ''' Overview: get all names of players by teams ''' ret = {} for player in self.get_players(): if player.team_id not in ret: ret[player.team_id] = [] ret[player.team_id].append(player.player_id) return list(ret.values())
def get_team_infos(self): team_player_ids = {} for player in self.get_players(): if player.team_id not in team_player_ids: team_player_ids[player.team_id] = [] team_player_ids[player.team_id].append(player.player_id) return sorted(team_player_ids.items()) def get_teams_score(self): team_name_score = {} for player in self.get_players(): if player.team_id not in team_name_score: team_name_score[player.team_id] = player.get_total_score() else: team_name_score[player.team_id] += player.get_total_score() return team_name_score
[docs] def reset(self): ''' Overview: reset manager ''' self.players = {} return True