private void buildBoard(Player.PublicInfo info, int focus, StringBuilder[] builders) { if (info.board.Count == 0) { return; } int firstIdx = (focus == 0) ? 0 : 2; builders[0].Append(focusFrame[firstIdx * 3]); builders[1].Append(focusFrame[firstIdx * 3 + 1]); builders[2].Append(" "); builders[3].Append(" "); builders[4].Append(" "); builders[5].Append(" "); builders[6].Append(focusFrame[firstIdx * 3 + 1]); builders[7].Append(focusFrame[firstIdx * 3 + 2]); for (int i = 0; i < info.board.Count; ++i) { BoardObject obj = info.board[i]; string[] toks = info.board[i].GetDescription().Split(new char[] { ',' }, 2); string[] valueToks = toks[0].Split('/'); string[] nameToks = getNameToksForBoard(toks[1]); int focusIdx = 1 + i - focus; if (focusIdx < 0 || focusIdx > 1) { focusIdx = 2; } if (obj is Monster && (obj as Monster).CanAttack()) { builders[0].AppendFormat("{0,2}┌───╮{1}", valueToks[0], focusFrame[focusIdx * 3]); builders[1].AppendFormat("┌╯ │{0}", focusFrame[focusIdx * 3 + 1]); builders[2].AppendFormat("│{0,8}│ ", nameToks[0]); builders[3].AppendFormat("│{0,8}│ ", nameToks.Length > 1 ? nameToks[1] : ""); builders[4].Append("├─╮╭─┤ "); builders[5].AppendFormat("│{0,2}├┤{1,2}│ ", valueToks[1], valueToks[2]); builders[6].AppendFormat("╰─╯╰─╯{0}", focusFrame[focusIdx * 3 + 1]); builders[7].AppendFormat(" ︾︾︾︾︾ {0}", focusFrame[focusIdx * 3 + 2]); } else { builders[0].AppendFormat(" {0}", focusFrame[focusIdx * 3]); builders[1].AppendFormat("{0,2}┌───╮{1}", valueToks[0], focusFrame[focusIdx * 3 + 1]); builders[2].AppendFormat("┌╯ │ "); builders[3].AppendFormat("│{0,8}│ ", nameToks[0]); builders[4].AppendFormat("│{0,8}│ ", nameToks.Length > 1 ? nameToks[1] : ""); if (valueToks.Length > 1) { builders[5].Append("├─╮╭─┤ "); builders[6].AppendFormat("│{0,2}├┤{1,2}│{2}", valueToks[1], valueToks[2], focusFrame[focusIdx * 3 + 1]); builders[7].AppendFormat("╰─╯╰─╯{0}", focusFrame[focusIdx * 3 + 2]); } else { builders[5].Append("│ │ "); builders[6].AppendFormat("└────┘{0}", focusFrame[focusIdx * 3 + 1]); builders[7].AppendFormat(" {0}", focusFrame[focusIdx * 3 + 2]); } } } }
public InputHandler Launch(Game game, Player player, Screen screen) { Player.PublicInfo[] info = new Player.PublicInfo[] { player.GetPublicInfo(), game.GetOppositeInfo(player.ID) }; screen.RefreshOpp(game.turnCount, info[1], false); screen.RefreshSelf(info[0], false); return(new HandHandler(player.GetHandDescription(), focus)); }
public void RefreshSelf(Player.PublicInfo selfInfo, bool focusFace, int focusBoard) { dirtyBit = true; string name = (string)selfInfo.face.name.Clone(); centerAlign(ref name, 12); string crystal = new string('●', selfInfo.currentCrystal); if (selfInfo.maximumCrystal > selfInfo.currentCrystal) { crystal = crystal.PadRight(selfInfo.maximumCrystal, '◎'); } crystal = crystal.PadRight(10, '○'); StringBuilder[] selfBoardBuilders = new StringBuilder[8]; for (int i = 0; i < 8; ++i) { selfBoardBuilders[i] = new StringBuilder(); } buildBoard(selfInfo, focusBoard, selfBoardBuilders); int width = 2 + 14 * selfInfo.board.Count; for (int i = 0; i < 8; ++i) { content[13 + i] = selfBoardBuilders[i].ToString(); centerAlign(ref content[13 + i], width, 78); } content[21] = String.Format( " {0} {1}", focusFace ? focusFrame[0] : " ", focusFace ? focusFrame[3] : " " ); content[22] = String.Format( " Cemetery: {0,2} {1} HP: {2,2} {3}", selfInfo.cemeteryNumber, focusFace ? focusFrame[1] : " ", selfInfo.face.hp, focusFace ? focusFrame[1] : " " ); content[23] = String.Format( " Deck: {0,2} Hand: {1,2} {2}{3}{4} {5,2}/{6,2} {7}", selfInfo.deckNumber, selfInfo.handNumber, focusFace ? focusFrame[1] : " ", name, focusFace ? focusFrame[1] : " ", selfInfo.currentCrystal, selfInfo.maximumCrystal, crystal ); content[24] = String.Format( " {0} {1}", focusFace ? focusFrame[2] : " ", focusFace ? focusFrame[5] : " " ); }
public void RefreshOpp(int turnCount, Player.PublicInfo oppInfo, bool focusFace, int focusBoard) { dirtyBit = true; string name = (string)oppInfo.face.name.Clone(); centerAlign(ref name, 12); string crystal = new string('●', oppInfo.currentCrystal); if (oppInfo.maximumCrystal > oppInfo.currentCrystal) { crystal = crystal.PadRight(oppInfo.maximumCrystal, '◎'); } crystal = crystal.PadRight(10, '○'); StringBuilder[] oppBoardBuilders = new StringBuilder[8]; for (int i = 0; i < 8; ++i) { oppBoardBuilders[i] = new StringBuilder(); } buildBoard(oppInfo, focusBoard, oppBoardBuilders); content[0] = String.Format("────╮ {0} {1}", focusFace ? focusFrame[0] : " ", focusFace ? focusFrame[3] : " " ); content[1] = String.Format( "Turn: {0,2}│ Deck: {1,2} Hand: {2,2} {3}{4}{5} {6,2}/{7,2} {8}", turnCount, oppInfo.deckNumber, oppInfo.handNumber, focusFace ? focusFrame[1] : " ", name, focusFace ? focusFrame[1] : " ", oppInfo.currentCrystal, oppInfo.maximumCrystal, crystal ); content[2] = String.Format( "────╯ Cemetery: {0,2} {1} HP: {2,2} {3}", oppInfo.cemeteryNumber, focusFace ? focusFrame[1] : " ", oppInfo.face.hp, focusFace ? focusFrame[1] : " " ); content[3] = String.Format( " {0} {1}", focusFace ? focusFrame[2] : " ", focusFace ? focusFrame[5] : " " ); int width = 2 + 14 * oppInfo.board.Count; for (int i = 0; i < 8; ++i) { content[4 + i] = oppBoardBuilders[i].ToString(); centerAlign(ref content[4 + i], width, 78); } }
public InputHandler Launch(Game game, Player player, Screen screen) { ConsoleKeyInfo keyInfo = Console.ReadKey(true); if (keyInfo.Key == ConsoleKey.Escape) { return(new CmdHandler(this)); } else if (keyInfo.Key == ConsoleKey.DownArrow) { HandHandler rtn = new HandHandler(player.GetHandDescription(), focus); focus = -1; UpdateScreen(game, player, screen); return(rtn); } else if (keyInfo.Key == ConsoleKey.UpArrow) { Player.PublicInfo info = game.GetOppositeInfo(player.ID); if (info.board.Count > 0) { OppBoardHandler rtn = new OppBoardHandler(info, focus); focus = -1; UpdateScreen(game, player, screen); return(rtn); } } else if (keyInfo.Key == ConsoleKey.RightArrow) { if (focus < selfInfo.board.Count - 1) { ++focus; } } else if (keyInfo.Key == ConsoleKey.LeftArrow) { if (focus > 0) { --focus; } } else if (keyInfo.Key == ConsoleKey.Enter) { Monster monster = selfInfo.board[focus] as Monster; if (monster != null && monster.CanAttack()) { AttackTargetAction attackAction = new AttackTargetAction(Action.SELF | Action.BOARD | (focus & Action.INDEX_MASK), monster); Player.PublicInfo[] info = new Player.PublicInfo[] { player.GetPublicInfo(), game.GetOppositeInfo(player.ID) }; return(new ChooseTargetHandler(info, attackAction, new ActionChainHandler(attackAction, new RefreshHandler(focus), null), this)); } } return(this); }
public OppBoardHandler(Player.PublicInfo oppInfo, int preferFocus) { this.oppInfo = oppInfo; focus = preferFocus; if (focus >= oppInfo.board.Count) { focus = oppInfo.board.Count - 1; } if (focus < 0) { focus = 0; } }
public SelfBoardHandler(Player.PublicInfo selfInfo, int preferFocus) { this.selfInfo = selfInfo; focus = preferFocus; if (focus >= selfInfo.board.Count) { focus = selfInfo.board.Count - 1; } if (focus < 0) { focus = 0; } }
public void UpdateAllTargetObject(int playerID, TargetFilter filter, TargetFixer updater) { Player.PublicInfo[] info = new Player.PublicInfo[] { player[0].GetPublicInfo(), player[1].GetPublicInfo() }; int[] playerPattern; if (player[0].ID == playerID) { playerPattern = new int[] { Action.SELF, Action.OPP } } ; else { playerPattern = new int[] { Action.OPP, Action.SELF } }; for (int i = 0; i < 2; ++i) { int facePattern = playerPattern[i] | Action.FACE; Player.Face face = info[i].face; if (filter(facePattern, face)) { updater(face); player[i].UpdateFace(face); } List <int> indices = new List <int>(); List <BoardObject> objs = new List <BoardObject>(); for (int j = 0; j < info[i].board.Count; ++j) { int boardPattern = playerPattern[i] | Action.BOARD | (j & Action.INDEX_MASK); BoardObject obj = info[i].board[j]; if (filter(boardPattern, obj)) { updater(obj); indices.Add(j); objs.Add(obj); } } if (indices.Count > 0) { player[i].UpdateBoard(indices, objs); } } } }
public InputHandler Launch(Game game, Player player, Screen screen) { ConsoleKeyInfo keyInfo = Console.ReadKey(true); if (keyInfo.Key == ConsoleKey.Escape) { return(new CmdHandler(this)); } else if (keyInfo.Key == ConsoleKey.RightArrow) { if (focus < hand.Length - 1) { ++focus; } } else if (keyInfo.Key == ConsoleKey.LeftArrow) { if (focus > 0) { --focus; } } else if (keyInfo.Key == ConsoleKey.UpArrow) { Player.PublicInfo[] info = new Player.PublicInfo[] { player.GetPublicInfo(), game.GetOppositeInfo(player.ID) }; if (info[0].board.Count > 0) { return(new SelfBoardHandler(info[0], focus)); } if (info[1].board.Count > 0) { return(new OppBoardHandler(info[1], focus)); } return(this); } else if (keyInfo.Key == ConsoleKey.Enter) { return(player.PrepareNthCard(game, focus, new RefreshHandler(focus), this)); } return(this); }
public PublicInfo GetPublicInfo() { Player.PublicInfo rtn = new Player.PublicInfo(); rtn.currentCrystal = this.currentCrystal; rtn.maximumCrystal = this.maximumCrystal; rtn.handNumber = hand.Count; rtn.deckNumber = deck.GetNumber(); rtn.cemeteryNumber = cemetery.Count; rtn.board = new List <BoardObject>(); rtn.face = new Face(nickname, hp); rtn.ID = this.ID; foreach (BoardObject obj in board) { rtn.board.Add(obj); } return(rtn); }
public InputHandler Launch(Game game, Player player, Screen screen) { ConsoleKeyInfo keyInfo = Console.ReadKey(true); if (keyInfo.Key == ConsoleKey.Escape) { return(new CmdHandler(this)); } else if (keyInfo.Key == ConsoleKey.DownArrow) { focus = -1; UpdateScreen(game, player, screen); Player.PublicInfo info = player.GetPublicInfo(); if (info.board.Count > 0) { return(new SelfBoardHandler(info)); } else { return(new HandHandler(player.GetHandDescription())); } } else if (keyInfo.Key == ConsoleKey.RightArrow) { if (focus < oppInfo.board.Count - 1) { ++focus; } } else if (keyInfo.Key == ConsoleKey.LeftArrow) { if (focus > 0) { --focus; } } return(this); }
public void DoTurn(Game game) { InitiateATurn(); Player.PublicInfo[] info = new Player.PublicInfo[] { GetPublicInfo(), game.GetOppositeInfo(ID) }; screen.RefreshOpp(game.turnCount, info[1], false); screen.RefreshSelf(info[0], false); InputHandler handler = new HandHandler(GetHandDescription()); while (handler != null && !game.IsEnd()) { if (handler is ScreenUpdater) { (handler as ScreenUpdater).UpdateScreen(game, this, screen); } screen.Repaint(); handler = handler.Launch(game, this, screen); } if (game.IsEnd()) { Player.PublicInfo winnerInfo = game.GetWinner(); info[0] = GetPublicInfo(); info[1] = game.GetOppositeInfo(ID); screen.RefreshOpp(game.turnCount, info[1], false); screen.RefreshSelf(info[0], false); screen.ShowPopup(new string[] { "Game set!!", String.Format("The winner is {0}", winnerInfo.face.name), (winnerInfo.ID == this.ID) ? "You win!!" : "You lose...." }); screen.Repaint(); } EndATurn(); }
public override InputHandler DoAction(Game game, Player player, InputHandler success, InputHandler failure) { Player.PublicInfo[] info = new Player.PublicInfo[] { player.GetPublicInfo(), game.GetOppositeInfo(player.ID) }; return(new ChooseTargetHandler(info, needTargetAction, new ActionChainHandler(next, success, failure), failure)); }
public void RefreshSelf(Player.PublicInfo selfInfo, bool focusFace) { RefreshSelf(selfInfo, focusFace, -1); }
public void RefreshOpp(int turnCount, Player.PublicInfo oppInfo, bool focusFace) { RefreshOpp(turnCount, oppInfo, focusFace, -1); }
public SelfBoardHandler(Player.PublicInfo selfInfo) { this.selfInfo = selfInfo; focus = 0; }
public OppBoardHandler(Player.PublicInfo oppInfo) { this.oppInfo = oppInfo; focus = 0; }