Ejemplo n.º 1
0
        public void RunRankTests()
        {
            game_state.game_type = CommandCode.COMMAND_CODE_3TMS_GAME_MODE_HOST;
            hosting_state = HostingState.HOSTING_STATE_GAME_OVER;

            Player p1 = new Player(0x01);
            Player p2 = new Player(0x02);
            Player p3 = new Player(0x03);
            players.AddLast(p1);
            players.AddLast(p2);
            players.AddLast(p3);

            p1.team_number = 1;
            p1.player_number = 0;
            p1.alive = true;
            p2.team_number = 2;
            p2.player_number = 1;
            p2.alive = true;
            p3.team_number = 3;
            p3.player_number = 3;
            p3.alive = false;

            p1.hit_by_team_player_count[1,1] = 6;
            p2.hit_team_player_count[2,0] = 6;

            p1.hit_team_player_count[0,5] = 6;

            RankPlayers();
            PrintScoreReport();
        }
Ejemplo n.º 2
0
        private bool ChangeState(DateTime now, HostingState state)
        {
            paused = false;
            //TODO: Clear timeouts

            switch (state) {
            case HostingState.HOSTING_STATE_IDLE:
                players.Clear();
                break;
            case HostingState.HOSTING_STATE_COUNTDOWN:
                if (hosting_state != HostGun.HostingState.HOSTING_STATE_ADDING) return false;
                HostDebugWriteLine("Starting countdown");
                state_change_timeout = now.AddSeconds(game_state.game_start_countdown_seconds);
                break;
            case HostingState.HOSTING_STATE_ADDING:
                HostDebugWriteLine("Joining players");
                incoming_packet_queue.Clear();
                break;
            case HostingState.HOSTING_STATE_PLAYING:
                HostDebugWriteLine("Starting Game");
                state_change_timeout = now.AddMinutes(game_state.game_time_minutes);
                incoming_packet_queue.Clear();
                break;
            case HostingState.HOSTING_STATE_SUMMARY:
                HostDebugWriteLine("Debriefing");
                break;
            case HostingState.HOSTING_STATE_GAME_OVER:
                HostDebugWriteLine("Debreif Done");
                break;
            default:
                return false;
            }

            hosting_state = state;
            next_announce = now;

            if (listener != null) {
                listener.GameStateChanged(state);
            }

            return true;
        }
Ejemplo n.º 3
0
        private bool ProcessCommandSequence()
        {
            DateTime now = DateTime.Now;

            switch (hosting_state) {
            case HostingState.HOSTING_STATE_IDLE:
            {
            #if JOIN_PLAYERS_TEST
                if (!autostart) {
                    IRPacket command_packet = incoming_packet_queue[0];
                    IRPacket game_id_packet = incoming_packet_queue[1];

                    if (command_packet.data == (UInt16)CommandCode.COMMAND_CODE_CUSTOM_GAME_MODE_HOST) {
                        System.Threading.Thread.Sleep(100);
                        byte game_id = (byte)game_id_packet.data;
                        if (join_count < 100) {
                            join_count++;
                            if (join_count % 10 == 0) {
                                SendPlayerJoin(game_id);
                            }
                        }
                    } else if (command_packet.data == (UInt16)CommandCode.COMMAND_CODE_ACK_PLAYER_JOIN_RESPONSE) {
                        System.Threading.Thread.Sleep(100);

                        IRPacket player_id_packet = incoming_packet_queue[2];

                        UInt16[] join = {
                            (UInt16)CommandCode.COMMAND_CODE_CONFIRM_PLAY_JOIN_GAME,
                            game_id_packet.data,
                            player_id_packet.data,
                        };
                        TransmitPacket2(ref join);

                    }
                }
            #endif

                return true;
            }
            case HostingState.HOSTING_STATE_ADDING:
            {

                if (incoming_packet_queue.Count != 4) {
                    return false;
                }

                IRPacket command_packet = incoming_packet_queue[0];
                IRPacket game_id_packet = incoming_packet_queue[1];
                IRPacket player_id_packet = incoming_packet_queue[2];
                IRPacket player_team_request_packet = incoming_packet_queue[3];
                UInt16 player_id = player_id_packet.data;

                if ((CommandCode)command_packet.data != CommandCode.COMMAND_CODE_PLAYER_JOIN_GAME_REQUEST) {
                    HostDebugWriteLine("Wrong command");
                    return false;
                }

                if (game_id != game_id_packet.data) {
                    HostDebugWriteLine("Wrong game id");
                    return false;
                }

                bool collision = false;
                foreach (Player collision_check_player in players) {
                    if (collision_check_player.player_id == player_id) {
                        collision = true;
                        break;
                    }
                }
                if (collision) {
                    HostDebugWriteLine("Player id collision");
                    return false;
                }

                confirm_join_state.player_id = (byte)player_id;

                /*
                 * 0 = any
                 * 1-3 = team 1-3
                 */
                UInt16 team_request = (UInt16)(player_team_request_packet.data & 0x03);

                Player p = new Player((byte)player_id);

                if (!AssignTeamAndPlayer(team_request,
                                    p))
                {
                    return false;
                }

                players.AddLast(p);

                UInt16 team_response = (UInt16)((p.team_number << 3) | (p.player_number));

                UInt16[] values = new UInt16[]{
                    (UInt16)CommandCode.COMMAND_CODE_ACK_PLAYER_JOIN_RESPONSE,
                    game_id,//Game ID
                    player_id,//Player ID
                    team_response, //player #
                    // [3 bits - zero - unknown][2 bits - team assignment][3 bits - player assignment]
                };

                if (game_id_packet.data != game_id) {
                    HostDebugWriteLine("Game id does not match current game, discarding");
                    return false;
                }

                string debug = String.Format("Player {0:x} found, joining", new object[] { player_id });
                HostDebugWriteLine(debug);

                TransmitPacket2(ref values);

                incoming_packet_queue.Clear();

                hosting_state = HostGun.HostingState.HOSTING_STATE_CONFIRM_JOIN;
                state_change_timeout = now.AddSeconds(2);

                return true;
            }
            case HostingState.HOSTING_STATE_CONFIRM_JOIN:
            {

                if (incoming_packet_queue.Count != 3) {
                    return false;
                }

                IRPacket command_packet = incoming_packet_queue[0];
                IRPacket game_id_packet = incoming_packet_queue[1];
                IRPacket player_id_packet = incoming_packet_queue[2];
                UInt16 confirmed_game_id = game_id_packet.data;
                UInt16 confirmed_player_id = player_id_packet.data;

                if ((CommandCode)command_packet.data != CommandCode.COMMAND_CODE_CONFIRM_PLAY_JOIN_GAME) {
                    HostDebugWriteLine("Wrong command");
                    return false;
                }

                if (game_id != confirmed_game_id
                    || confirm_join_state.player_id != confirmed_player_id)
                {
                    string debug = String.Format("{0:x},{1:x},{2:x},{3:x}",
                                                 new object[] {
                        game_id,
                        confirmed_game_id,
                        confirm_join_state.player_id,
                        confirmed_player_id});
                    HostDebugWriteLine("Invalid confirmation: " + debug);
                    ChangeState(now, HostingState.HOSTING_STATE_ADDING);
                    break;
                }

                bool found = false;
                foreach(Player p in players) {
                    if (p.player_id == confirmed_player_id) {
                        p.confirmed = true;
                        found = true;
                        break;
                    }
                }
                if (found) {
                    HostDebugWriteLine("Confirmed player");
                } else {
                    HostDebugWriteLine("Unable to find player to confirm");
                    return false;
                }

                if (players.Count >= MINIMUM_PLAYER_COUNT_START) {

                    state_change_timeout = now.AddSeconds(WAIT_FOR_ADDITIONAL_PLAYERS_TIMEOUT_SECONDS);
                }
                ChangeState(now, HostingState.HOSTING_STATE_ADDING);
                incoming_packet_queue.Clear();
                if (listener != null) {
                    listener.PlayerListChanged(new List<Player>(players));
                }

                return true;
            }
            case HostingState.HOSTING_STATE_SUMMARY:
            {
                IRPacket command_packet = incoming_packet_queue[0];
                switch ((CommandCode)command_packet.data) {
                case CommandCode.COMMAND_CODE_PLAYER_REPORT_SCORE:
                    return ProcessPlayerReportScore();
                case CommandCode.COMMAND_CODE_PLAYER_HIT_BY_TEAM_1_REPORT:
                case CommandCode.COMMAND_CODE_PLAYER_HIT_BY_TEAM_2_REPORT:
                case CommandCode.COMMAND_CODE_PLAYER_HIT_BY_TEAM_3_REPORT:
                    return ProcessPlayerHitByTeamReport();
                default:
                    break;
                }

                return false;
            }
            default:
                break;
            }
            return false;
        }