def TimeEvent(): global race_info # update effect status for player in players: Players.handleEffects(player) diff = (datetime.now() - start_time) race_info.Time = diff.seconds * 1000 + diff.microseconds / 1000 sender.sendUpdate(race_info, "RaceInfo") if not shutdown: timer = Timer(0.1, TimeEvent) timer.start()
def ControllerEvent(player, event, data, packet_id): global race_info global players global last_id global player_infos packet_id = int(packet_id) # did packet arrive in order? try: if packet_id < last_id: print "Discarding packet %d, last_received %d" % (packet_id, last_id) return except Exception as e: print e last_id = packet_id if (DEBUG and race_info.State != LAP_SELECT): try: print "Received controller event (Player %s State %d)" % (player, race_info.State) except Exception as e: print e player = int(player) #Bail if there's an invalid player if (player < 0 or player > Players.MAX_PLAYERS): if DEBUG: print "Invalid player, should be >= 0 and < %d" % Players.MAX_PLAYERS return event = int(event) data = int(data) #don't send a packet unless necessary send = False if race_info.State == JOINING: if DEBUG: print "Joining event=%d data=%d" % (event, data) # If player hasn't joined and pressed A, join them if event == BUT_A and data == 1 and players[player] == None: print "Player %d is now ready" % (player + 1) players[player] = Players.PlayerState() player_infos[player] = PlayerInfo(race_info.JoinedPlayers + 1) race_info.JoinedPlayers += 1 sender.sendUpdate(race_info, "RaceInfo") # If joined player presses start, begin lap count selection if event == START and data == 1 and players[player] != None: print "Starting with current players" race_info.State = LAP_SELECT sender.sendUpdate(race_info, "RaceInfo") # Ignoring all other input in this state elif DEBUG: print "Ignoring input until race begins" return elif race_info.State == LAP_SELECT: # If player pressed up, increase lap count if event == UD and data == -32767 or event == DUP and data == 1: race_info.Laps += 1 # If player pressed down, decrease lap count elif event == UD and data == 32767 or event == DDOWN and data == 1: race_info.Laps -= 1 # Ensure at least one lap if race_info.Laps < 1: race_info.Laps = 1 # If player pressed start, begin the countdown elif event == START and data == 1: race_info.State = COUNTDOWN sender.sendUpdate(race_info, "RaceInfo") print return # Erase the current line, and return to the beginning print "%s[2K\r" % chr(27), # Prompt for number of laps print "Please select number of Laps: %d" % race_info.Laps, # Force buffer to flush (needed because no newline terminating print) sys.stdout.flush() sender.sendUpdate(race_info, "RaceInfo") elif race_info.State == COUNTDOWN: return elif race_info.State == FINISHED: if event == START and data == 1: # reset all the players stats for pl in players: if pl != None: pl.init() race_info.State = JOINING race_info.Time = 0 sender.sendUpdate(race_info, "RaceInfo") return if (event == ACCEL): players[player].forward = data send = True if (event == BRAKE): players[player].reverse = data send = True if (event == LR): send = True # Parse xbox controller data if data == -32767: players[player].turn = -1 if data == 0: players[player].turn = 0 if data == 32767: players[player].turn = 1 print "Player turn", players[player].turn, player, player_infos player_infos[player].Turn == players[player].turn print player_infos[player].Turn print "updated" if event == BUT_A and data == 1 and players[player].powerup != None: # Player fired a powerup triggerPowerup(player) print "F: %d R: %d" % (players[player].forward, players[player].reverse) if send: print "Beginning of controller event" speed2 = players[player].forward - players[player].reverse #Deal with player effects Players.handleEffects(player) players[player].speed_percent = Players.DEFAULT_SPEED_PERCENT speed2 = int(speed2 * players[player].speed_percent) #enforce speed boundaries if (speed2 > Players.MAX_SPEED): speed2 = Players.MAX_SPEED if (speed2 < Players.MIN_SPEED): speed2 = Players.MIN_SPEED #update speed info for the GUI player_infos[player].Speed = speed * 100.0 / (MAX_SPEED * DEFAULT_SPEED_PERCENT) sender.sendUpdate(player_infos[player], "PlayerInfo" + str(player_infos[player].Number)) try: if (DEBUG): print "Player: %d, Speed=%d, Turn=%d" % (player, speed2, players[player].turn) sender.sendAsync("CarEvent", player=str(int(player_infos[player].Number)), speed=str(speed2), turn=str(players[player].turn)) if (DEBUG): print "Packet Sent" except Exception as e: print e