def randomize_players(self): self.set_switching_lock(settings.LOCK_LINEUP_ON_DECISION) players_copy = self.players[:] while players_copy == self.players: randomhelper.shuffle(players_copy) self.players = players_copy SoundManager.play(Trigger.PLAYERS_SHUFFLE)
def set_player(self, player): # check if player has already been set before try: idx_already_set = self.players.index(player) except ValueError, e: # player is not in any team yet self.players[self.current_player_slot] = player self.highlight_player(self.current_player_slot) SoundManager.play(Trigger.PLAYER_JOINED, player)
def equalize_players(self): self.set_switching_lock(settings.LOCK_LINEUP_ON_DECISION) # get min team elo lineup permutations = list(itertools.permutations(self.players)) team_elo_list = [[i, abs(a['attacker']['elo'] + b['defender']['elo'] - c['attacker']['elo'] - d['defender']['elo'])] for i, (a, b, c, d) in enumerate(permutations)] team_elo_list = sorted(team_elo_list, key=lambda x: x[1]) equal_lineup = list(permutations[team_elo_list[0][0]]) # check positions self.players = self.check_positions(equal_lineup) SoundManager.play(Trigger.PLAYERS_EQUALIZE)
def __handle_goal(self, team): if team == '1': GameData.add_goal(0) obj = self.ids.labelHome else: GameData.add_goal(1) obj = self.ids.labelAway self.score = GameData.get_score() HighlightOverlay(orig_obj=obj, parent=self).animate(font_size=500, color=(1, 1, 1, 0), d=2.0) SoundManager.play(Trigger.GOAL)
def __handle_goal(self, data): # 0 : home, 1: away if data in ["0", "1"]: team_id = int(data) GameData.add_goal(team_id) # play goal sound SoundManager.play(Trigger.GOAL) # update local match data self.update_match() # highlight score board HighlightOverlay(orig_obj=self.score_objects[team_id], parent=self).animate(font_size=500, color=(1, 1, 1, 0), d=2.0)
def on_score(self, instance, value): # update kickoff information self.handle_kickoff(False) # check max goal during match if self.state == 'running': if GameData.is_match_finished(): self.state = 'finished' SoundManager.play(Trigger.GAME_END) # manual swiping can resume a finished match elif self.state == 'finished': self.state = 'running' SoundManager.play(Trigger.GAME_RESUME)
def __handle_rfid(self, rfid): self.current_rfid = rfid SoundManager.play(Trigger.RFID) # RFID --> player ID player_id = PlayerData.get_player_by_rfid(rfid) # player ID --> player dict player = PlayerData.get_player_by_id(player_id) if player: time.sleep(0.5) self.current_player = player else: self.current_player = {}
def update_match(self): # fetch score from GameData self.score = GameData.get_score() # update kickoff information self.handle_kickoff(False) # check max goal during match if self.state == 'running': if GameData.is_match_finished(): self.state = 'finished' self.stop_time = self.get_time() SoundManager.play(Trigger.GAME_END) # manual swiping can resume a finished match elif self.state == 'finished' and not GameData.is_match_finished(): self.state = 'running' SoundManager.play(Trigger.GAME_RESUME)
def on_back(self): # game still running, ask for user confirmation if self.state == 'running': SoundManager.play(Trigger.GAME_PAUSE) view = ModalView(size_hint=(None, None), size=(600, 400), auto_dismiss=False) content = Factory.STModalView(title='Spiel abbrechen', text='Das Spiel ist noch nicht beendet.\nWirklich abbrechen?', cb_yes=self.cancel_match, cb_no=self.resume_match) view.add_widget(content) view.open() # game not running anymore elif self.state in ['finished', 'submitting', 'submit_failed']: view = ModalView(size_hint=(None, None), size=(600, 400), auto_dismiss=False) content = Factory.STModalView(title='Spiel abbrechen', text='Das Ergebnis wurde noch nicht hochgeladen.\nWirklich abbrechen?', cb_yes=self.cancel_match) view.add_widget(content) view.open() else: self.manager.current = 'lounge'
def __init__(self, **kwargs): super(BackgroundScreenManager, self).__init__(**kwargs) self.transition = FadeTransition(duration=0.2) # setup hardware listener self.hwlistener = HardwareListener() self.hwlistener.register(self.receive_msg) # setup network status NetworkInfo.start_polling() # setup screens self.add_widget(MenuScreen(name='menu')) self.add_widget(RfidSetupScreen(name='rfid-setup')) self.add_widget(SettingsScreen(name='settings')) self.add_widget(LoungeScreen(name='lounge')) self.add_widget(MatchScreen(name='match')) SoundManager.play(Trigger.INTRO)
def handle_score_touch_up(self, event): if self.state not in ['running', 'finished']: return if self.score_touch: score_id = self.score_touch['id'] dist = event.pos[1] - self.score_touch['startPos'] if abs(dist) > settings.SCORE_SWIPE_DISTANCE: goal_up = dist > 0 if goal_up: swipe_allowed = GameData.add_goal(score_id) else: swipe_allowed = GameData.revoke_goal(score_id) if swipe_allowed: self.update_match() HighlightOverlay(orig_obj=self.score_objects[score_id], parent=self).animate(font_size=500, color=(1, 1, 1, 0)) if goal_up: SoundManager.play(Trigger.GOAL) else: SoundManager.play(Trigger.OFFSIDE) else: self.denied() self.score_objects[score_id].color = (1, 1, 1, 1) self.score_touch = None
def handle_score_touch_up(self, event): if self.state not in ['running', 'finished']: return if self.score_touch: score_id = self.score_touch['id'] dist = event.pos[1] - self.score_touch['startPos'] if abs(dist) > self.MIN_SCORE_MOVE_PX: goal_up = dist > 0 if goal_up: swipe_allowed = GameData.add_goal(score_id) else: swipe_allowed = GameData.revoke_goal(score_id) if swipe_allowed: self.score = GameData.get_score() HighlightOverlay(orig_obj=self.score_objects[score_id], parent=self).animate(font_size=500, color=(1, 1, 1, 0)) if goal_up: SoundManager.play(Trigger.GOAL) else: SoundManager.play(Trigger.OFFSIDE) else: # TODO: "Rote Karte" pass self.score_objects[score_id].color = (1, 1, 1, 1) self.score_touch = None
def cancel_match(self): SoundManager.play(Trigger.MENU) self.manager.current = 'lounge'
except ValueError, e: # player is not in any team yet self.players[self.current_player_slot] = player self.highlight_player(self.current_player_slot) SoundManager.play(Trigger.PLAYER_JOINED, player) else: # only switch position if new player is not already in current slot if idx_already_set != self.current_player_slot: # switch slots self.players[idx_already_set] = self.players[self.current_player_slot] self.players[self.current_player_slot] = player self.highlight_player(self.current_player_slot) # check if target slot was empty if self.players[idx_already_set] == {}: # player is moved to empty slot SoundManager.play(Trigger.PLAYER_MOVED) else: # player switches position with another player SoundManager.play(Trigger.PLAYERS_SWITCHED) self.highlight_player(idx_already_set) # advance to next player block self.current_player_slot = (self.current_player_slot + 1) % 4 def process_message(self, msg): if msg['trigger'] == 'rfid': self.__handle_rfid(msg['data']) else: self.denied() class STModalView(BoxLayout): title = StringProperty("")
def cancel_match(self): SoundManager.play(Trigger.MENU) self.manager.get_screen('lineup').set_switching_lock(False) self.manager.current = 'lineup'
def handle_kickoff(self, say_player): if not GameData.is_match_finished(): delay = 1.0 Clock.schedule_once(self.__animate_kickoff, delay) if say_player: SoundManager.play(Trigger.GAME_START, self.players[GameData.get_kickoff_team() * 2])
def denied(self): SoundManager.play(Trigger.DENIED)
def switch_players(self, slot_id_1, slot_id_2): self.players[slot_id_1], self.players[slot_id_2] = self.players[slot_id_2], self.players[slot_id_1] for player_id in [slot_id_1, slot_id_2]: self.highlight_player(player_id) SoundManager.play(Trigger.PLAYERS_SWITCHED)
def on_current_player(self, instance, value): self.ids.btnPlayer.iconText = self.current_player.get('name', u'---') SoundManager.play(Trigger.PLAYER_SELECTED, self.current_player) # enable "accept" button if current player is set and was not stored before self.ids.btnAccept.disabled = not (self.current_player.has_key('id') and self.current_player.get('id') != PlayerData.get_rfid_map().get(self.current_rfid))
def resume_match(self): SoundManager.play(Trigger.GAME_RESUME)
def say_connection_status(self): if self.connected: SoundManager.play(Trigger.HOTSPOT_CONNECT, self.player) else: SoundManager.play(Trigger.HOTSPOT_DISCONNECT)
def __init__(self, **kwargs): super(MenuScreen, self).__init__(**kwargs) # initial fade in self.fadeopacity = 0.0 NetworkInfo.register(self.__update_network_info) SoundManager.play(Trigger.INTRO)