Ejemplo n.º 1
0
        public static KgsGameInfo FromGameJoin(KgsGameJoin kgsGameJoin)
        {
            var whiteInfo = new PlayerInfo(StoneColor.White,
                                           kgsGameJoin.GameSummary.Players["white"].Name,
                                           kgsGameJoin.GameSummary.Players["white"].Rank);
            var blackInfo = new PlayerInfo(StoneColor.Black,
                                           kgsGameJoin.GameSummary.Players["black"].Name,
                                           kgsGameJoin.GameSummary.Players["black"].Rank);
            var rules = kgsGameJoin.Rules;

            if (rules == null)
            {
                return(null);
            }
            if (!KgsHelpers.IsSupportedRuleset(rules.Rules))
            {
                return(null);
            }
            var kgi = new KgsGameInfo(
                whiteInfo,
                blackInfo,
                new Game.GameBoardSize(rules.Size),
                KgsHelpers.ConvertRuleset(rules.Rules),
                rules.Handicap,
                GetHandicapPlacementType(KgsHelpers.ConvertRuleset(rules.Rules)),
                rules.Komi,
                CountingType.Area,
                kgsGameJoin.ChannelId);

            return(kgi);
        }
Ejemplo n.º 2
0
        private static KgsGameInfo CreateGameInfo(GameChannel channel)
        {
            if (channel.GameType != GameType.Free &&
                channel.GameType != GameType.Ranked)
            {
                return(null);
            }

            var whiteInfo = new PlayerInfo(StoneColor.White, channel.Players["white"].Name,
                                           channel.Players["white"].Rank ?? "??");
            var blackInfo = new PlayerInfo(StoneColor.Black, channel.Players["black"].Name,
                                           channel.Players["black"].Rank ?? "??");
            string ruleset = channel.Rules ?? RulesDescription.RulesJapanese;

            if (!KgsHelpers.IsSupportedRuleset(ruleset))
            {
                return(null);
            }
            var kgi = new KgsGameInfo(
                whiteInfo,
                blackInfo,
                new GameBoardSize(channel.Size),
                KgsHelpers.ConvertRuleset(ruleset),
                channel.Handicap,
                KgsGameInfo.GetHandicapPlacementType(KgsHelpers.ConvertRuleset(ruleset)),
                channel.Komi,
                CountingType.Area,
                channel.ChannelId);

            return(kgi);
        }
Ejemplo n.º 3
0
        private void LoadProposalDataIntoForm(Proposal proposal)
        {
            var vm = _vm;

            vm.FormTitle            = Localizer.Creationg_KgsChallenge;
            vm.RefusalCaption       = Localizer.UnjoinChallenge;
            vm.CustomSquareSize     = proposal.Rules.Size.ToString();
            vm.SelectedRuleset      = KgsHelpers.ConvertRuleset(proposal.Rules.Rules);
            vm.IsRankedGame         = proposal.GameType == GameType.Ranked;
            vm.IsPubliclyListedGame = proposal.Global;
            string previousOpponent = vm.OpponentName;

            UpdateOpponentFromProposal(proposal.Players);
            foreach (var player in proposal.Players)
            {
                if (player.GetName() == Connections.Kgs.Username)
                {
                    vm.SelectedColor = player.Role == Role.White
                        ? Core.Game.StoneColor.White
                        : Core.Game.StoneColor.Black;
                }
                else if (!String.IsNullOrEmpty(player.GetName()))
                {
                    string opponent = player.GetNameAndRank();
                    this._opponentName = opponent;
                    vm.OpponentName    = opponent;
                    if (player.Role == Role.White)
                    {
                        vm.SelectedColor = Core.Game.StoneColor.Black;
                    }
                    else if (player.Role == Role.Black)
                    {
                        vm.SelectedColor = Core.Game.StoneColor.White;
                    }
                    else
                    {
                        // Other roles don't affect color.
                    }
                }
            }
            if (proposal.Nigiri)
            {
                vm.SelectedColor = Core.Game.StoneColor.None;
            }
            vm.Handicap           = proposal.Rules.Handicap;
            vm.CompensationString = proposal.Rules.Komi.ToString(CultureInfo.InvariantCulture);
            vm.UseRecommendedKomi = false;
            if (previousOpponent != vm.OpponentName)
            {
                Sounds.ChallengerChanged.PlayAsync();
                var tab = Mvx.Resolve <ITabProvider>().GetTabForViewModel(vm);
                if (tab != null)
                {
                    tab.IsBlinking = true;
                }
            }
            UpdateTimeControlFromRules(proposal.Rules);
        }
Ejemplo n.º 4
0
        private void ExecuteProperty(KgsSgfProperty prop, KgsGame ongame)
        {
            switch (prop.Name)
            {
            case "RULES":
                RulesDescription rules = prop;
                ongame.Info.BoardSize = new GameBoardSize(rules.Size);
                foreach (var player in ongame.Controller.Players)
                {
                    player.Clock = rules.CreateTimeControl();
                }
                ongame.Info.NumberOfHandicapStones = rules.Handicap;
                ongame.Info.Komi        = rules.Komi;
                ongame.Info.RulesetType = KgsHelpers.ConvertRuleset(rules.Rules);
                // (future work) TODO (Petr) ensure that even written late, these values are respected
                break;

            case "PLAYERNAME":
            case "PLAYERRANK":
            case "DATE":
            case "PLACE":
                // We do not need this information - we already have some and don't need the trest.
                break;

            case "PHANTOMCLEAR":
                // I don't know what to do with this yet.
                break;

            case "ADDSTONE":
                ongame.Controller.AddHandicapStonePosition(new Position(prop.Loc.X,
                                                                        KgsCoordinates.TheirsToOurs(prop.Loc.Y, ongame.Info.BoardSize)));
                break;

            case "COMMENT":
                // "Putti [2k]: hi\n
                string[] splitByNewlines =
                    prop.Text.Split(new string[] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
                foreach (var s in splitByNewlines)
                {
                    var tuple = KgsRegex.ParseCommentAsChat(s);
                    if (tuple != null)
                    {
                        var chatMessage = new ChatMessage(tuple.Item1, tuple.Item2,
                                                          DateTimeOffset.Now, tuple.Item1 == ongame.Controller.Server.Username ? ChatMessageKind.Outgoing : ChatMessageKind.Incoming);
                        ongame.Controller.KgsConnector.ChatMessageFromServer(chatMessage);
                    }
                }
                break;

            case "DEAD":
                if (ongame.Controller.Phase.Type != Modes.LiveGame.Phases.GamePhaseType.LifeDeathDetermination)
                {
                    ongame.Controller.SetPhase(Modes.LiveGame.Phases.GamePhaseType.LifeDeathDetermination);
                }
                ongame.Controller.BlackDoneReceived = false;
                ongame.Controller.WhiteDoneReceived = false;
                ongame.Controller.KgsConnector.ForceKillGroup(new Position(prop.Loc.X, KgsCoordinates.TheirsToOurs(prop.Loc.Y, ongame.Info.BoardSize)));
                break;

            case "TIMELEFT":
                StoneColor colorTimeLeft = (prop.Color == "black" ? StoneColor.Black : StoneColor.White);
                ongame.Controller.Players[colorTimeLeft].Clock.UpdateFromKgsFloat(prop.Float);
                break;

            case "MOVE":
                Move       move;
                string     propColor = prop.Color;
                StoneColor color     = propColor == "white" ? StoneColor.White : StoneColor.Black;
                if (!prop.Loc.IsPass)
                {
                    XY       whereTo  = prop.Loc;
                    Position position = new Game.Position(whereTo.X, KgsCoordinates.TheirsToOurs(whereTo.Y, ongame.Info.BoardSize));
                    move = Move.PlaceStone(color, position);
                }
                else
                {
                    move = Move.Pass(color);
                }
                foreach (var player in ongame.Controller.Players)
                {
                    if (player.Agent is KgsAgent)
                    {
                        ((KgsAgent)player.Agent).StoreMove(this.Layer, color, move);
                    }
                }
                break;

            default:
                break;
            }
        }