def test_unobvious_collision(self): state = GameState(settings) state.add_robot((9, 10), 0) state.add_robot((9, 12), 1) state.add_robot((9, 11), 0) state.add_robot((11, 11), 1) actions = { (9, 10): ['move', (9, 11)], (9, 12): ['move', (9, 11)], (9, 11): ['move', (10, 11)], (11, 11): ['move', (10, 11)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual(state2.robots[9, 10].hp, settings.robot_hp) self.assertTrue(state2.is_robot((9, 12))) self.assertEqual(state2.robots[9, 12].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((9, 11))) self.assertEqual(state2.robots[9, 11].hp, settings.robot_hp - settings.collision_damage*2) self.assertTrue(state2.is_robot((11, 11))) self.assertEqual(state2.robots[11, 11].hp, settings.robot_hp - settings.collision_damage)
def test_try_move_in_circle(self): state = GameState() state.add_robot((8, 8), 0) state.add_robot((9, 8), 1) state.add_robot((9, 9), 0) state.add_robot((8, 9), 1) actions = { (8, 8): ['move', (9, 8)], (9, 8): ['move', (9, 9)], (9, 9): ['move', (8, 9)], (8, 9): ['move', (8, 8)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 8))) self.assertEqual(state2.robots[9, 8].hp, settings.robot_hp) self.assertEqual(state2.robots[9, 8].player_id, 0) self.assertTrue(state2.is_robot((9, 9))) self.assertEqual(state2.robots[9, 9].hp, settings.robot_hp) self.assertEqual(state2.robots[9, 9].player_id, 1) self.assertTrue(state2.is_robot((8, 9))) self.assertEqual(state2.robots[8, 9].hp, settings.robot_hp) self.assertEqual(state2.robots[8, 9].player_id, 0) self.assertTrue(state2.is_robot((8, 8))) self.assertEqual(state2.robots[8, 8].hp, settings.robot_hp) self.assertEqual(state2.robots[8, 8].player_id, 1)
def test_unobvious_collision(self): state = GameState() state.add_robot((9, 10), 0) state.add_robot((9, 12), 1) state.add_robot((9, 11), 0) state.add_robot((11, 11), 1) actions = { (9, 10): ['move', (9, 11)], (9, 12): ['move', (9, 11)], (9, 11): ['move', (10, 11)], (11, 11): ['move', (10, 11)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual(state2.robots[9, 10].hp, settings.robot_hp) self.assertTrue(state2.is_robot((9, 12))) self.assertEqual(state2.robots[9, 12].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((9, 11))) self.assertEqual(state2.robots[9, 11].hp, settings.robot_hp - settings.collision_damage * 2) self.assertTrue(state2.is_robot((11, 11))) self.assertEqual(state2.robots[11, 11].hp, settings.robot_hp - settings.collision_damage)
def test_train_collision(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((11, 10), 1) state.add_robot((12, 10), 0) state.add_robot((8, 10), 1) actions = { (10, 10): ['move', (9, 10)], (11, 10): ['move', (10, 10)], (12, 10): ['move', (11, 10)], (8, 10): ['move', (9, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.collision_damage * 2) self.assertTrue(state2.is_robot((11, 10))) self.assertEqual(state2.robots[11, 10].hp, settings.robot_hp - settings.collision_damage * 2) self.assertTrue(state2.is_robot((12, 10))) self.assertEqual(state2.robots[12, 10].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((8, 10))) self.assertEqual(state2.robots[8, 10].hp, settings.robot_hp - settings.collision_damage)
def test_train_collision(self): state = GameState(settings) state.add_robot((10, 10), 0) state.add_robot((11, 10), 1) state.add_robot((12, 10), 0) state.add_robot((8, 10), 1) actions = { (10, 10): ['move', (9, 10)], (11, 10): ['move', (10, 10)], (12, 10): ['move', (11, 10)], (8, 10): ['move', (9, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.collision_damage*2) self.assertTrue(state2.is_robot((11, 10))) self.assertEqual(state2.robots[11, 10].hp, settings.robot_hp - settings.collision_damage*2) self.assertTrue(state2.is_robot((12, 10))) self.assertEqual(state2.robots[12, 10].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((8, 10))) self.assertEqual(state2.robots[8, 10].hp, settings.robot_hp - settings.collision_damage)
def test_try_move_in_circle(self): state = GameState(settings) state.add_robot((8, 8), 0) state.add_robot((9, 8), 1) state.add_robot((9, 9), 0) state.add_robot((8, 9), 1) actions = { (8, 8): ['move', (9, 8)], (9, 8): ['move', (9, 9)], (9, 9): ['move', (8, 9)], (8, 9): ['move', (8, 8)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 8))) self.assertEqual(state2.robots[9, 8].hp, settings.robot_hp) self.assertEqual(state2.robots[9, 8].player_id, 0) self.assertTrue(state2.is_robot((9, 9))) self.assertEqual(state2.robots[9, 9].hp, settings.robot_hp) self.assertEqual(state2.robots[9, 9].player_id, 1) self.assertTrue(state2.is_robot((8, 9))) self.assertEqual(state2.robots[8, 9].hp, settings.robot_hp) self.assertEqual(state2.robots[8, 9].player_id, 0) self.assertTrue(state2.is_robot((8, 8))) self.assertEqual(state2.robots[8, 8].hp, settings.robot_hp) self.assertEqual(state2.robots[8, 8].player_id, 1)
def test_first_turn_spawning(self): state = GameState() actions = {} state2 = state.apply_actions(actions) self.assertEqual(state2.get_scores(), [settings.spawn_per_player, settings.spawn_per_player])
def test_spawn_dodge(self): state = GameState() state.add_robot((4, 3), 0) actions = {(4, 3): ["move", (4, 4)]} state2 = state.apply_actions(actions) self.assertTrue(state2.is_robot((4, 4)))
def test_spawn_kills(self): state = GameState() state.add_robot((4, 3), 0) actions = {(4, 3): ["guard"]} state2 = state.apply_actions(actions) self.assertTrue(not state2.is_robot((4, 3)) or state2.robots[(4, 3)].robot_id != state.robots[4, 3].robot_id)
def test_spawn_hop_in(self): state = GameState() state.add_robot((4, 4), 0) actions = {(4, 4): ["move", (4, 3)]} state2 = state.apply_actions(actions) self.assertTrue(not state2.is_robot((4, 3)) or state2.robots[(4, 3)].robot_id != state.robots[4, 4].robot_id)
def test_suicide_dodge(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = {(10, 10): ['sucide'], (9, 10): ['move', (8, 10)]} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((8, 10))) self.assertEqual(state2.robots[8, 10].hp, settings.robot_hp)
def test_suicide_does_no_damage_to_teammates(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 0) actions = {(10, 10): ['guard'], (9, 10): ['suicide']} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp) self.assertFalse(state2.is_robot((9, 10)))
def test_spawn_dodge(self): state = GameState() state.add_robot((4, 3), 0) actions = { (4, 3): ['move', (4, 4)] } state2 = state.apply_actions(actions) self.assertTrue(state2.is_robot((4, 4)))
def test_move_into_suicide_bot(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = {(10, 10): ['suicide'], (9, 10): ['move', (10, 10)]} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual( state2.robots[9, 10].hp, settings.robot_hp - settings.collision_damage - settings.suicide_damage)
def test_move_no_collision(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((8, 10), 0) actions = {(10, 10): ['move', (11, 10)], (8, 10): ['move', (7, 10)]} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((11, 10))) self.assertEqual(state2.robots[11, 10].hp, settings.robot_hp) self.assertTrue(state2.is_robot((7, 10))) self.assertEqual(state2.robots[7, 10].hp, settings.robot_hp)
def test_guarding_reduces_damage(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = {(10, 10): ['guard'], (9, 10): ['suicide']} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.suicide_damage // 2) self.assertFalse(state2.is_robot((9, 10)))
def test_attack_hop_in(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((8, 10), 1) actions = {(10, 10): ['attack', (9, 10)], (8, 10): ['move', (9, 10)]} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) damage = settings.robot_hp - state2.robots[9, 10].hp self.assertTrue( settings.attack_range[0] <= damage <= settings.attack_range[1])
def test_guarding_reduces_damage(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = {(10, 10): ['attack', (9, 10)], (9, 10): ['guard']} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) damage = settings.robot_hp - state2.robots[9, 10].hp self.assertTrue(settings.attack_range[0] // 2 <= damage <= settings.attack_range[1] // 2)
def test_attack_kills(self): state = GameState() state.add_robot((10, 10), 0, hp=settings.attack_range[0]) state.add_robot((9, 10), 1, hp=settings.attack_range[0]) actions = { (10, 10): ['attack', (9, 10)], (9, 10): ['attack', (10, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertFalse(state2.is_robot((10, 10))) self.assertFalse(state2.is_robot((9, 10)))
def test_guarding_ingnores_collisions(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = {(10, 10): ['move', (9, 10)], (9, 10): ['guard']} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual(state2.robots[9, 10].hp, settings.robot_hp)
def test_spawn_hop_in(self): state = GameState() state.add_robot((4, 4), 0) actions = { (4, 4): ['move', (4, 3)] } state2 = state.apply_actions(actions) self.assertTrue(not state2.is_robot((4, 3)) or state2.robots[(4, 3)].robot_id != state.robots[4, 4].robot_id)
def test_suicide_dodge(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = { (10, 10): ['sucide'], (9, 10): ['move', (8, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((8, 10))) self.assertEqual(state2.robots[8, 10].hp, settings.robot_hp)
def test_spawn_kills(self): state = GameState() state.add_robot((4, 3), 0) actions = { (4, 3): ['guard'] } state2 = state.apply_actions(actions) self.assertTrue(not state2.is_robot((4, 3)) or state2.robots[(4, 3)].robot_id != state.robots[4, 3].robot_id)
def test_basic_suicide(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = {(10, 10): ['attack', (9, 10)], (9, 10): ['suicide']} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.suicide_damage) self.assertFalse(state2.is_robot((9, 10)))
def test_suicide_does_no_damage_to_teammates(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 0) actions = { (10, 10): ['guard'], (9, 10): ['suicide'] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp) self.assertFalse(state2.is_robot((9, 10)))
def test_guarding_reduces_damage(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = { (10, 10): ['guard'], (9, 10): ['suicide'] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.suicide_damage/2) self.assertFalse(state2.is_robot((9, 10)))
def test_move_no_collision(self): state = GameState(settings) state.add_robot((10, 10), 0) state.add_robot((8, 10), 0) actions = { (10, 10): ['move', (11, 10)], (8, 10): ['move', (7, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((11, 10))) self.assertEqual(state2.robots[11, 10].hp, settings.robot_hp) self.assertTrue(state2.is_robot((7, 10))) self.assertEqual(state2.robots[7, 10].hp, settings.robot_hp)
def test_spawn_dodge_overwrite(self): state = GameState() state.add_robot((4, 3), 0) actions = { (4, 3): ['move', (4, 4)] } # ensure that a robot will get spawned at (4, 3) state._get_spawn_locations = lambda: [(i, 3) for i in range(10)] state2 = state.apply_actions(actions) self.assertTrue(state2.is_robot((4, 4))) self.assertTrue(state2.is_robot((4, 3)))
def test_guarding_reduces_damage(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = { (10, 10): ['attack', (9, 10)], (9, 10): ['guard'] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) damage = settings.robot_hp - state2.robots[9, 10].hp self.assertTrue( settings.attack_range[0]/2 <= damage <= settings.attack_range[1]/2)
def test_attack_hop_in(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((8, 10), 1) actions = { (10, 10): ['attack', (9, 10)], (8, 10): ['move', (9, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) damage = settings.robot_hp - state2.robots[9, 10].hp self.assertTrue( settings.attack_range[0] <= damage <= settings.attack_range[1])
def test_guarding_ingnores_collisions(self): state = GameState(settings) state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = { (10, 10): ['move', (9, 10)], (9, 10): ['guard'] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual(state2.robots[9, 10].hp, settings.robot_hp)
def test_move_into_suicide_bot(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = { (10, 10): ['suicide'], (9, 10): ['move', (10, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual(state2.robots[9, 10].hp, settings.robot_hp - settings.collision_damage - settings.suicide_damage)
def test_basic_suicide(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((9, 10), 1) actions = { (10, 10): ['attack', (9, 10)], (9, 10): ['suicide'] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp - settings.suicide_damage) self.assertFalse(state2.is_robot((9, 10)))
def test_move_train(self): state = GameState() state.add_robot((10, 10), 0) state.add_robot((11, 10), 0) state.add_robot((12, 10), 0) actions = { (10, 10): ['move', (9, 10)], (11, 10): ['move', (10, 10)], (12, 10): ['move', (11, 10)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 10))) self.assertEqual(state2.robots[9, 10].hp, settings.robot_hp) self.assertTrue(state2.is_robot((10, 10))) self.assertEqual(state2.robots[10, 10].hp, settings.robot_hp) self.assertTrue(state2.is_robot((11, 10))) self.assertEqual(state2.robots[11, 10].hp, settings.robot_hp)
def test_try_swap(self): state = GameState() state.add_robot((9, 9), 0) state.add_robot((8, 9), 1) actions = {(9, 9): ['move', (8, 9)], (8, 9): ['move', (9, 9)]} state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 9))) self.assertEqual(state2.robots[9, 9].player_id, 0) self.assertEqual(state2.robots[9, 9].robot_id, state.robots[9, 9].robot_id) self.assertEqual(state2.robots[9, 9].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((8, 9))) self.assertEqual(state2.robots[8, 9].player_id, 1) self.assertEqual(state2.robots[8, 9].robot_id, state.robots[8, 9].robot_id) self.assertEqual(state2.robots[8, 9].hp, settings.robot_hp - settings.collision_damage)
def test_try_swap(self): state = GameState(settings) state.add_robot((9, 9), 0) state.add_robot((8, 9), 1) actions = { (9, 9): ['move', (8, 9)], (8, 9): ['move', (9, 9)] } state2 = state.apply_actions(actions, spawn=False) self.assertTrue(state2.is_robot((9, 9))) self.assertEqual(state2.robots[9, 9].player_id, 0) self.assertEqual(state2.robots[9, 9].robot_id, state.robots[9, 9].robot_id) self.assertEqual(state2.robots[9, 9].hp, settings.robot_hp - settings.collision_damage) self.assertTrue(state2.is_robot((8, 9))) self.assertEqual(state2.robots[8, 9].player_id, 1) self.assertEqual(state2.robots[8, 9].robot_id, state.robots[8, 9].robot_id) self.assertEqual(state2.robots[8, 9].hp, settings.robot_hp - settings.collision_damage)
class Simulator: def __init__(self, player1_path, player2_path): self.match_id = None self.player = Player(player1_path) if player1_path else None if self.player: self.player1_path = player1_path self.player.set_player_id(1) self.player2 = Player(player2_path) if player2_path else None if self.player2: self.player2_path = player2_path self.player2.set_player_id(0) self.turn_repeat = False self.UI = SimulatorUI(settings) self.UI.setTitle("Robot Game Simulator") self.state = GameState(settings, turn=1) self.cached_actions = None self.human_actions = {} self.UI.setTurn(self.state.turn) self.UI.bind("w", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("a", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("s", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("d", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<Up>", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("<Left>", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("<Down>", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("<Right>", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<ButtonPress-1>", lambda ev: self.UI.onMouseClick(ev)) self.UI.bind("l", self.onLoadMatch) self.UI.bind("k", self.onLoadTurn) self.UI.bind("o", self.onReloadPlayer) self.UI.bind("p", self.onSwapPlayer) self.UI.bind("t", self.onEditTurn) self.UI.bind("f", self.onAddTeammate) self.UI.bind("e", self.onAddEnemy) self.UI.bind("r", self.onRemove) self.UI.bind("c", self.onClear) self.UI.bind("<Delete>", self.onRemove) self.UI.bind("<BackSpace>", self.onRemove) self.UI.bind("h", self.onEditHP) self.UI.bind("<space>", self.onShowActions) self.UI.bind("<Return>", self.onSimulate) self.UI.bind("n", self.onNextAction) self.UI.bind("g", self.onSpawnRobots) self.UI.run() def onReloadPlayer(self, event): self.UI.fadeActions() self.cached_actions = None self.human_actions = {} if self.player: self.player = Player(self.player1_path) self.player.set_player_id(1) if self.player2: self.player2 = Player(self.player2_path) self.player2.set_player_id(0) def onSwapPlayer(self, event): self.UI.clearActions() self.UI.clearBots() self.onReloadPlayer(None) for loc, robot in self.state.robots.iteritems(): self.state.robots[loc][ "player_id"] = 1 - self.state.robots[loc]["player_id"] self.UI.renderBot(loc, robot.hp, robot.player_id) def onLoadMatch(self, event): self.match_id = tkSimpleDialog.askinteger("Load match", "Enter match number", parent=self.UI.root, initialvalue=2588548, minvalue=1, maxvalue=99999999) if self.match_id is not None: self.moves = getrgmatch.get_match_result(self.match_id) self.loadBotsfromTurn(1) def onLoadTurn(self, event): if self.match_id is not None: new_turn = tkSimpleDialog.askinteger("Edit turn", "Enter new turn", parent=self.UI.root, initialvalue=self.state.turn, minvalue=1, maxvalue=100) if new_turn is not None: self.loadBotsfromTurn(new_turn) def loadBotsfromTurn(self, new_turn): if self.match_id is not None: self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.human_actions = {} self.state = GameState() for bot in self.moves[new_turn]: loc = tuple(bot['location']) # print bot self.state.add_robot(loc, bot['player_id']) self.state.robots[loc].hp = bot['hp'] self.UI.renderBot(loc, bot['hp'], bot['player_id']) self.UI.setTurn(new_turn) self.state.turn = new_turn def onEditTurn(self, event): new_turn = tkSimpleDialog.askinteger("Edit turn", "Enter new turn", parent=self.UI.root, initialvalue=self.state.turn, minvalue=1, maxvalue=100) if new_turn is not None: self.UI.fadeActions() self.cached_actions = None self.human_actions = {} self.UI.setTurn(new_turn) self.state.turn = new_turn def onRemove(self, event): self._removeRobot(self.UI.selection) def _removeRobot(self, loc): if self.state.is_robot(loc): self.UI.fadeActions() self.cached_actions = None if loc in self.human_actions: del self.human_actions[loc] self.state.remove_robot(loc) self.UI.renderEmpty(loc) def onAddTeammate(self, event): self._addRobot(1, self.UI.selection) def onAddEnemy(self, event): self._addRobot(0, self.UI.selection) def _addRobot(self, player_id, loc): self.UI.fadeActions() self.cached_actions = None if self.state.is_robot(loc): self.state.remove_robot(loc) if loc in self.human_actions: del self.human_actions[loc] self.state.add_robot(loc, player_id) self.UI.renderBot(loc, 50, player_id) def onEditHP(self, event): if self.state.is_robot(self.UI.selection): robot = self.state.robots[self.UI.selection] self.UI.fadeActions() self.cached_actions = None new_hp = tkSimpleDialog.askinteger("Edit hp", "Enter new hp", parent=self.UI.root, initialvalue=robot.hp, minvalue=1, maxvalue=50) if new_hp is not None: robot.hp = new_hp self.UI.renderBot(self.UI.selection, new_hp, robot.player_id) def getActions(self): def getPlayerActions(player, player_id): if player: actions, _ = player.get_responses(self.state, player_id) else: actions = {} for loc, robot in self.state.robots.iteritems(): if robot.player_id == player_id: action = self.human_actions.get(loc) if action or loc not in actions: actions[loc] = action if action else ('guard', ) return actions actions = getPlayerActions(self.player, 1) actions.update(getPlayerActions(self.player2, 0)) return actions def onClear(self, event): self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.human_actions = {} self.state = GameState(turn=self.state.turn) def onShowActions(self, event): if self.state.turn < 100: # the following is needed since if the turn does not change, # non-stateless bots behave differently if self.player and self.turn_repeat: self.player = Player(self.player1_path) self.player.set_player_id(1) if self.player2 and self.turn_repeat: self.player2 = Player(self.player2_path) self.player2.set_player_id(0) self.UI.clearActions() actions = self.getActions() self.cached_actions = actions for loc, action in actions.iteritems(): self.UI.renderAction(loc, action) self.turn_repeat = True try: rgsim_text = self.player._module.rgsim_text for loc, text in rgsim_text.iteritems(): self.UI.renderText(loc, text) except AttributeError: print "No rgsim_text dict found for player 1, skipping..." except: print("Error in rgsim_text dict, please ensure keys are " + "valid locations and values are strings") def onSimulate(self, event): if self.state.turn < 100: self.UI.clearActions() self.UI.clearBots() if self.cached_actions is None: actions = self.getActions() else: actions = self.cached_actions self.state = self.state.apply_actions(actions, spawn=False) for loc, robot in self.state.robots.iteritems(): self.UI.renderBot(loc, robot.hp, robot.player_id) self.cached_actions = None self.human_actions = {} self.UI.setTurn(self.state.turn) self.turn_repeat = False def onNextAction(self, event): if not self.state.is_robot(self.UI.selection): return robot = self.state.robots[self.UI.selection] action = self.human_actions.get(self.UI.selection) if action is None and self.cached_actions is not None: action = self.cached_actions.get(self.UI.selection) if action is None: action = ('guard', ) x, y = self.UI.selection adjacent_locs = ((x, y - 1), (x + 1, y), (x, y + 1), (x - 1, y)) move_locs = [l for l in adjacent_locs if l not in settings.obstacles] all_actions = [('guard', )] all_actions += [('move', loc) for loc in move_locs] all_actions += [('attack', loc) for loc in adjacent_locs] all_actions += [('suicide', )] i = (all_actions.index(action) + 1) % len(all_actions) action = all_actions[i] if self.cached_actions is not None: self.cached_actions[self.UI.selection] = action self.human_actions[self.UI.selection] = action self.UI.clearAction(self.UI.selection) self.UI.renderAction(self.UI.selection, action) def onSpawnRobots(self, event): all_locs = self.state._get_spawn_locations() for loc in settings.spawn_coords: self._removeRobot(loc) for i, loc in enumerate(all_locs): player_id = i // settings.spawn_per_player self._addRobot(player_id, loc)
class Simulator: def __init__(self, player1_path, player2_path): self.match_id = None self.player = Player(player1_path) if player1_path else None if self.player: self.player1_path = player1_path self.player.set_player_id(1) self.player2 = Player(player2_path) if player2_path else None if self.player2: self.player2_path = player2_path self.player2.set_player_id(0) self.turn_repeat = False self.UI = SimulatorUI(settings) self.UI.setTitle("Robot Game Simulator") self.state = GameState(settings, turn=1) self.cached_actions = None self.human_actions = {} self.UI.setTurn(self.state.turn) self.UI.bind("w", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("a", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("s", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("d", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<Up>", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("<Left>", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("<Down>", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("<Right>", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<ButtonPress-1>", lambda ev: self.UI.onMouseClick(ev)) self.UI.bind("l", self.onLoadMatch) self.UI.bind("k", self.onLoadTurn) self.UI.bind("o", self.onReloadPlayer) self.UI.bind("p", self.onSwapPlayer) self.UI.bind("t", self.onEditTurn) self.UI.bind("f", self.onAddTeammate) self.UI.bind("e", self.onAddEnemy) self.UI.bind("r", self.onRemove) self.UI.bind("c", self.onClear) self.UI.bind("<Delete>", self.onRemove) self.UI.bind("<BackSpace>", self.onRemove) self.UI.bind("h", self.onEditHP) self.UI.bind("<space>", self.onShowActions) self.UI.bind("<Return>", self.onSimulate) self.UI.bind("n", self.onNextAction) self.UI.bind("g", self.onSpawnRobots) self.UI.run() def onReloadPlayer(self, event): self.UI.fadeActions() self.cached_actions = None self.human_actions = {} if self.player: self.player = Player(self.player1_path) self.player.set_player_id(1) if self.player2: self.player2 = Player(self.player2_path) self.player2.set_player_id(0) def onSwapPlayer(self, event): self.UI.clearActions() self.UI.clearBots() self.onReloadPlayer(None) for loc, robot in self.state.robots.iteritems(): self.state.robots[loc]["player_id"] = 1 - self.state.robots[loc]["player_id"] self.UI.renderBot(loc, robot.hp, robot.player_id) def onLoadMatch(self, event): self.match_id = tkSimpleDialog.askinteger( "Load match", "Enter match number", parent = self.UI.root, initialvalue = 2588548, minvalue = 1, maxvalue = 99999999 ) if self.match_id is not None: self.moves = getrgmatch.get_match_result(self.match_id) self.loadBotsfromTurn(1) def onLoadTurn(self, event): if self.match_id is not None: new_turn = tkSimpleDialog.askinteger( "Edit turn", "Enter new turn", parent = self.UI.root, initialvalue = self.state.turn, minvalue = 1, maxvalue = 100 ) if new_turn is not None: self.loadBotsfromTurn(new_turn) def loadBotsfromTurn(self, new_turn): if self.match_id is not None: self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.human_actions = {} self.state = GameState() for bot in self.moves[new_turn]: loc = tuple(bot['location']) # print bot self.state.add_robot(loc, bot['player_id']) self.state.robots[loc].hp = bot['hp'] self.UI.renderBot(loc, bot['hp'], bot['player_id']) self.UI.setTurn(new_turn) self.state.turn = new_turn def onEditTurn(self, event): new_turn = tkSimpleDialog.askinteger( "Edit turn", "Enter new turn", parent = self.UI.root, initialvalue = self.state.turn, minvalue = 1, maxvalue = 100 ) if new_turn is not None: self.UI.fadeActions() self.cached_actions = None self.human_actions = {} self.UI.setTurn(new_turn) self.state.turn = new_turn def onRemove(self, event): self._removeRobot(self.UI.selection) def _removeRobot(self, loc): if self.state.is_robot(loc): self.UI.fadeActions() self.cached_actions = None if loc in self.human_actions: del self.human_actions[loc] self.state.remove_robot(loc) self.UI.renderEmpty(loc) def onAddTeammate(self, event): self._addRobot(1, self.UI.selection) def onAddEnemy(self, event): self._addRobot(0, self.UI.selection) def _addRobot(self, player_id, loc): self.UI.fadeActions() self.cached_actions = None if self.state.is_robot(loc): self.state.remove_robot(loc) if loc in self.human_actions: del self.human_actions[loc] self.state.add_robot(loc, player_id) self.UI.renderBot(loc, 50, player_id) def onEditHP(self, event): if self.state.is_robot(self.UI.selection): robot = self.state.robots[self.UI.selection] self.UI.fadeActions() self.cached_actions = None new_hp = tkSimpleDialog.askinteger( "Edit hp", "Enter new hp", parent = self.UI.root, initialvalue = robot.hp, minvalue = 1, maxvalue = 50 ) if new_hp is not None: robot.hp = new_hp self.UI.renderBot(self.UI.selection, new_hp, robot.player_id) def getActions(self): def getPlayerActions(player, player_id): if player: actions, _ = player.get_responses(self.state, player_id) else: actions = {} for loc, robot in self.state.robots.iteritems(): if robot.player_id == player_id: action = self.human_actions.get(loc) if action or loc not in actions: actions[loc] = action if action else ('guard',) return actions actions = getPlayerActions(self.player, 1) actions.update(getPlayerActions(self.player2, 0)) return actions def onClear(self, event): self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.human_actions = {} self.state = GameState(turn=self.state.turn) def onShowActions(self, event): if self.state.turn < 100: # the following is needed since if the turn does not change, # non-stateless bots behave differently if self.player and self.turn_repeat: self.player = Player(self.player1_path) self.player.set_player_id(1) if self.player2 and self.turn_repeat: self.player2 = Player(self.player2_path) self.player2.set_player_id(0) self.UI.clearActions() actions = self.getActions() self.cached_actions = actions for loc, action in actions.iteritems(): self.UI.renderAction(loc, action) self.turn_repeat = True try: rgsim_text = self.player._module.rgsim_text for loc, text in rgsim_text.iteritems(): self.UI.renderText(loc, text) except AttributeError: print "No rgsim_text dict found for player 1, skipping..." except: print ("Error in rgsim_text dict, please ensure keys are " + "valid locations and values are strings") def onSimulate(self, event): if self.state.turn < 100: self.UI.clearActions() self.UI.clearBots() if self.cached_actions is None: actions = self.getActions() else: actions = self.cached_actions self.state = self.state.apply_actions(actions, spawn=False) for loc, robot in self.state.robots.iteritems(): self.UI.renderBot(loc, robot.hp, robot.player_id) self.cached_actions = None self.human_actions = {} self.UI.setTurn(self.state.turn) self.turn_repeat = False def onNextAction(self, event): if not self.state.is_robot(self.UI.selection): return robot = self.state.robots[self.UI.selection] action = self.human_actions.get(self.UI.selection) if action is None and self.cached_actions is not None: action = self.cached_actions.get(self.UI.selection) if action is None: action = ('guard',) x, y = self.UI.selection adjacent_locs = ((x, y-1), (x+1, y), (x, y+1), (x-1, y)) move_locs = [l for l in adjacent_locs if l not in settings.obstacles] all_actions = [('guard',)] all_actions += [('move', loc) for loc in move_locs] all_actions += [('attack', loc) for loc in adjacent_locs] all_actions += [('suicide',)] i = (all_actions.index(action) + 1) % len(all_actions) action = all_actions[i] if self.cached_actions is not None: self.cached_actions[self.UI.selection] = action self.human_actions[self.UI.selection] = action self.UI.clearAction(self.UI.selection) self.UI.renderAction(self.UI.selection, action) def onSpawnRobots(self, event): all_locs = self.state._get_spawn_locations() for loc in settings.spawn_coords: self._removeRobot(loc) for i, loc in enumerate(all_locs): player_id = i // settings.spawn_per_player self._addRobot(player_id, loc)
class Simulator: def __init__(self, settings, p1_path, p2_path): self.settings = settings self.match_id = None self.p1_path = p1_path self.p2_path = p2_path self.code = open(p1_path).read() if p2_path is None: self.p2_path = map_data = open(pkg_resources.resource_filename('rgkit', 'bots/guardbot.py')).read() self.code2 = open(p2_path).read() self.player = Player(self.code) self.player.set_player_id(1) self.player2 = Player(self.code2) self.player2.set_player_id(0) self.UI = SimulatorUI(settings) self.UI.setTitle("Robot Game Simulator") self.state = GameState(settings, turn=1) self.cached_actions = None self.UI.setTurn(self.state.turn) self.UI.bind("w", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("a", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("s", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("d", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<Up>", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("<Left>", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("<Down>", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("<Right>", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<ButtonPress-1>", lambda ev: self.UI.onMouseClick(ev)) self.UI.bind("l", self.onLoadMatch) self.UI.bind("k", self.onLoadTurn) self.UI.bind("o", self.onReloadPlayer) self.UI.bind("p", self.onSwapPlayer) self.UI.bind("t", self.onEditTurn) self.UI.bind("f", self.onAddTeammate) self.UI.bind("e", self.onAddEnemy) self.UI.bind("r", self.onRemove) self.UI.bind("c", self.onClear) self.UI.bind("<Delete>", self.onRemove) self.UI.bind("<BackSpace>", self.onRemove) self.UI.bind("h", self.onEditHP) self.UI.bind("<space>", self.onShowActions) self.UI.bind("<Return>", self.onSimulate) self.UI.run() def onReloadPlayer(self, event): self.UI.fadeActions() self.cached_actions = None self.code = open(self.p1_path).read() self.code2 = open(self.p2_path).read() self.player = Player(self.code) self.player.set_player_id(1) self.player2 = Player(self.code2) self.player2.set_player_id(0) def onSwapPlayer(self, event): self.p1_path, self.p2_path = self.p2_path, self.p1_path def onLoadMatch(self, event): self.match_id = tkSimpleDialog.askinteger( "Load match", "Enter match number", parent = self.UI.root, initialvalue = 2588548, minvalue = 1, maxvalue = 99999999 ) if self.match_id is not None: self.moves = getrgmatch.get_match_result(self.match_id) self.loadBotsfromTurn(1) def onLoadTurn(self, event): if self.match_id is not None: new_turn = tkSimpleDialog.askinteger( "Edit turn", "Enter new turn", parent = self.UI.root, initialvalue = self.state.turn, minvalue = 1, maxvalue = 100 ) if new_turn is not None: self.loadBotsfromTurn(new_turn) def loadBotsfromTurn (self, new_turn): if self.match_id is not None: self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.state = GameState(self.settings) for bot in self.moves[new_turn]: loc = tuple(bot['location']) # print bot self.state.add_robot(loc, bot['player_id']) self.state.robots[loc].hp = bot['hp'] self.UI.renderBot(loc, bot['hp'], bot['player_id']) self.UI.setTurn(new_turn) self.state.turn = new_turn def onEditTurn(self, event): new_turn = tkSimpleDialog.askinteger( "Edit turn", "Enter new turn", parent = self.UI.root, initialvalue = self.state.turn, minvalue = 1, maxvalue = 100 ) if new_turn is not None: self.UI.fadeActions() self.cached_actions = None self.UI.setTurn(new_turn) self.state.turn = new_turn def onRemove(self, event): if self.state.is_robot(self.UI.selection): self.UI.fadeActions() self.cached_actions = None self.state.remove_robot(self.UI.selection) self.UI.renderEmpty(self.UI.selection) def onAddTeammate(self, event): self.UI.fadeActions() self.cached_actions = None if self.state.is_robot(self.UI.selection): self.state.remove_robot(self.UI.selection) self.state.add_robot(self.UI.selection, 1) self.UI.renderBot(self.UI.selection, 50, 1) def onAddEnemy(self, event): self.UI.fadeActions() self.cached_actions = None if self.state.is_robot(self.UI.selection): self.state.remove_robot(self.UI.selection) self.state.add_robot(self.UI.selection, 0) self.UI.renderBot(self.UI.selection, 50, 0) def onEditHP(self, event): if self.state.is_robot(self.UI.selection): robot = self.state.robots[self.UI.selection] self.UI.fadeActions() self.cached_actions = None new_hp = tkSimpleDialog.askinteger( "Edit hp", "Enter new hp", parent = self.UI.root, initialvalue = robot.hp, minvalue = 1, maxvalue = 50 ) if new_hp is not None: robot.hp = new_hp self.UI.renderBot(self.UI.selection, new_hp, robot.player_id) def getActions(self): actions = self.player.get_actions(self.state, 0) actions2 = self.player2.get_actions(self.state, 0) actions.update(actions2) return actions def onClear(self, event): self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.state = GameState(self.settings) def onShowActions(self, event): self.player.reload() self.player2.reload() self.UI.clearActions() actions = self.getActions() self.cached_actions = actions for loc, action in actions.iteritems(): self.UI.renderAction(loc, action) def onSimulate(self, event): self.UI.clearActions() self.UI.clearBots() if self.cached_actions is None: actions = self.getActions() else: actions = self.cached_actions self.state = self.state.apply_actions(actions, spawn=False) for loc, robot in self.state.robots.iteritems(): self.UI.renderBot(loc, robot.hp, robot.player_id) self.cached_actions = None self.UI.setTurn(self.state.turn)
class Simulator: def __init__(self, player1, player2): self.match_id = None self.player = player1 if self.player: self.player.set_player_id(1) self.player2 = player2 if self.player2: self.player2.set_player_id(0) self.UI = SimulatorUI(settings) self.UI.setTitle("Robot Game Simulator") self.state = GameState(settings, turn=1) self.cached_actions = None self.human_actions = {} self.UI.setTurn(self.state.turn) self.UI.bind("w", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("a", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("s", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("d", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<Up>", lambda ev: self.UI.moveSelection((0, -1))) self.UI.bind("<Left>", lambda ev: self.UI.moveSelection((-1, 0))) self.UI.bind("<Down>", lambda ev: self.UI.moveSelection((0, 1))) self.UI.bind("<Right>", lambda ev: self.UI.moveSelection((1, 0))) self.UI.bind("<ButtonPress-1>", lambda ev: self.UI.onMouseClick(ev)) self.UI.bind("l", self.onLoadMatch) self.UI.bind("k", self.onLoadTurn) self.UI.bind("o", self.onReloadPlayer) self.UI.bind("p", self.onSwapPlayer) self.UI.bind("t", self.onEditTurn) self.UI.bind("f", self.onAddTeammate) self.UI.bind("e", self.onAddEnemy) self.UI.bind("r", self.onRemove) self.UI.bind("c", self.onClear) self.UI.bind("<Delete>", self.onRemove) self.UI.bind("<BackSpace>", self.onRemove) self.UI.bind("h", self.onEditHP) self.UI.bind("<space>", self.onShowActions) self.UI.bind("<Return>", self.onSimulate) self.UI.bind("n", self.onNextAction) self.UI.bind("g", self.onSpawnRobots) self.UI.run() def onReloadPlayer(self, event): self.UI.fadeActions() self.cached_actions = None self.human_actions = {} if self.player: self.player.reload(from_file=True) self.player.set_player_id(1) if self.player2: self.player2.reload(from_file=True) self.player2.set_player_id(0) def onSwapPlayer(self, event): self.player, self.player2 = self.player2, self.player self.onReloadPlayer(None) def onLoadMatch(self, event): self.match_id = tkSimpleDialog.askinteger( "Load match", "Enter match number", parent = self.UI.root, initialvalue = 2588548, minvalue = 1, maxvalue = 99999999 ) if self.match_id is not None: self.moves = getrgmatch.get_match_result(self.match_id) self.loadBotsfromTurn(1) def onLoadTurn(self, event): if self.match_id is not None: new_turn = tkSimpleDialog.askinteger( "Edit turn", "Enter new turn", parent = self.UI.root, initialvalue = self.state.turn, minvalue = 1, maxvalue = 100 ) if new_turn is not None: self.loadBotsfromTurn(new_turn) def loadBotsfromTurn (self, new_turn): if self.match_id is not None: self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.human_actions = {} self.state = GameState() for bot in self.moves[new_turn]: loc = tuple(bot['location']) # print bot self.state.add_robot(loc, bot['player_id']) self.state.robots[loc].hp = bot['hp'] self.UI.renderBot(loc, bot['hp'], bot['player_id']) self.UI.setTurn(new_turn) self.state.turn = new_turn def onEditTurn(self, event): new_turn = tkSimpleDialog.askinteger( "Edit turn", "Enter new turn", parent = self.UI.root, initialvalue = self.state.turn, minvalue = 1, maxvalue = 100 ) if new_turn is not None: self.UI.fadeActions() self.cached_actions = None self.human_actions = {} self.UI.setTurn(new_turn) self.state.turn = new_turn def onRemove(self, event): self._removeRobot(self.UI.selection) def _removeRobot(self, loc): if self.state.is_robot(loc): self.UI.fadeActions() self.cached_actions = None if loc in self.human_actions: del self.human_actions[loc] self.state.remove_robot(loc) self.UI.renderEmpty(loc) def onAddTeammate(self, event): self._addRobot(1, self.UI.selection) def onAddEnemy(self, event): self._addRobot(0, self.UI.selection) def _addRobot(self, player_id, loc): self.UI.fadeActions() self.cached_actions = None if self.state.is_robot(loc): self.state.remove_robot(loc) if loc in self.human_actions: del self.human_actions[loc] self.state.add_robot(loc, player_id) self.UI.renderBot(loc, 50, player_id) def onEditHP(self, event): if self.state.is_robot(self.UI.selection): robot = self.state.robots[self.UI.selection] self.UI.fadeActions() self.cached_actions = None new_hp = tkSimpleDialog.askinteger( "Edit hp", "Enter new hp", parent = self.UI.root, initialvalue = robot.hp, minvalue = 1, maxvalue = 50 ) if new_hp is not None: robot.hp = new_hp self.UI.renderBot(self.UI.selection, new_hp, robot.player_id) def getActions(self): def getPlayerActions(player, player_id): if player: actions = player.get_actions(self.state, player_id) else: actions = {} for loc, robot in self.state.robots.iteritems(): if robot.player_id == player_id: action = self.human_actions.get(loc) if action or loc not in actions: actions[loc] = action if action else ['guard'] return actions actions = getPlayerActions(self.player, 1) actions.update(getPlayerActions(self.player2, 0)) return actions def onClear(self, event): self.UI.clearActions() self.UI.clearBots() self.cached_actions = None self.human_actions = {} self.state = GameState(turn=self.state.turn) def onShowActions(self, event): if self.state.turn < 100: if self.player: self.player.reload(from_file=True) if self.player2: self.player2.reload(from_file=True) self.UI.clearActions() actions = self.getActions() self.cached_actions = actions for loc, action in actions.iteritems(): self.UI.renderAction(loc, action) def onSimulate(self, event): if self.state.turn < 100: self.UI.clearActions() self.UI.clearBots() if self.cached_actions is None: actions = self.getActions() else: actions = self.cached_actions self.state = self.state.apply_actions(actions, spawn=False) for loc, robot in self.state.robots.iteritems(): self.UI.renderBot(loc, robot.hp, robot.player_id) self.cached_actions = None self.human_actions = {} self.UI.setTurn(self.state.turn) def onNextAction(self, event): if not self.state.is_robot(self.UI.selection): return robot = self.state.robots[self.UI.selection] action = self.human_actions.get(self.UI.selection) if action is None and self.cached_actions is not None: action = self.cached_actions.get(self.UI.selection) if action is None: action = ['guard'] x, y = self.UI.selection adjacent_locs = ((x, y-1), (x+1, y), (x, y+1), (x-1, y)) move_locs = [l for l in adjacent_locs if l not in settings.obstacles] all_actions = [['guard']] all_actions += [['move', loc] for loc in move_locs] all_actions += [['attack', loc] for loc in adjacent_locs] all_actions += [['suicide']] i = (all_actions.index(action) + 1) % len(all_actions) action = all_actions[i] if self.cached_actions is not None: self.cached_actions[self.UI.selection] = action self.human_actions[self.UI.selection] = action self.UI.clearAction(self.UI.selection) self.UI.renderAction(self.UI.selection, action) def onSpawnRobots(self, event): all_locs = self.state._get_spawn_locations() for loc in settings.spawn_coords: self._removeRobot(loc) for i, loc in enumerate(all_locs): player_id = i // settings.spawn_per_player self._addRobot(player_id, loc)