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); }
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); }
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); }
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; } }