private static void ReadOpponentMoves(string[] moveInput) { var orders = new List <GameOrder>(); for (var i = 1; i < moveInput.Length; i++) { GameOrder order; if (moveInput[i + 1] == "place_armies") { var playerID = ToPlayerID(moveInput[i]); var terrID = (TerritoryIDType)int.Parse(moveInput[i + 2]); var armies = int.Parse(moveInput[i + 3]); i += 3; var existing = orders.OfType <GameOrderDeploy>().FirstOrDefault(o => o.DeployOn == terrID); if (existing != null) { //Don't allow dupe deploy orders. Just add it to the existing one Assert.Fatal(existing.PlayerID == playerID); existing.NumArmies += armies; continue; } order = GameOrderDeploy.Create(playerID, armies, terrID, false); } else { if (moveInput[i + 1] == "attack/transfer") { var fromTerrID = (TerritoryIDType)int.Parse(moveInput[i + 2]); var toTerrID = (TerritoryIDType)int.Parse(moveInput[i + 3]); var playerID = ToPlayerID(moveInput[i]); var armies = int.Parse(moveInput[i + 4]); order = GameOrderAttackTransfer.Create(playerID, fromTerrID, toTerrID, AttackTransferEnum.AttackTransfer, false, new Armies(armies), false); i += 4; } else { throw new Exception("Unexpected order type"); } } orders.Add(order); } PrevTurn = orders.ToArray(); }
public static GameOrder ReadOrder(JToken jOrder) { var type = (string)jOrder["type"]; var playerID = (PlayerIDType)(int)jOrder["playerID"]; if (type == "GameOrderDeploy") { var terrID = (TerritoryIDType)(int)jOrder["deployOn"]; var armies = (int)jOrder["armies"]; return(GameOrderDeploy.Create(playerID, armies, terrID, false)); } if (type == "GameOrderAttackTransfer") { var from = (TerritoryIDType)(int)jOrder["from"]; var to = (TerritoryIDType)(int)jOrder["to"]; var armies = ToArmies((string)jOrder["numArmies"]); var attackTeammates = (bool)jOrder["attackTeammates"]; var byPercent = (bool)jOrder["byPercent"]; var attackTransfer = (AttackTransferEnum)Enum.Parse(typeof(AttackTransferEnum), (string)jOrder["attackTransfer"]); return(GameOrderAttackTransfer.Create(playerID, from, to, attackTransfer, byPercent, armies, attackTeammates)); } if (type.StartsWith("GameOrderPlayCard")) { var cardInstanceID = (CardInstanceIDType)Guid.Parse((string)jOrder["cardInstanceID"]); switch (type) { case "GameOrderPlayCardReinforcement": return(GameOrderPlayCardReinforcement.Create(cardInstanceID, playerID)); case "GameOrderPlayCardAbandon": return(GameOrderPlayCardAbandon.Create(cardInstanceID, playerID, (TerritoryIDType)(int)jOrder["targetTerritoryID"])); case "GameOrderPlayCardAirlift": return(GameOrderPlayCardAirlift.Create(cardInstanceID, playerID, (TerritoryIDType)(int)jOrder["from"], (TerritoryIDType)(int)jOrder["to"], ToArmies((string)jOrder["armiesToAirlift"]))); case "GameOrderPlayCardBlockade": return(GameOrderPlayCardBlockade.Create(cardInstanceID, playerID, (TerritoryIDType)(int)jOrder["targetTerritoryID"])); case "GameOrderPlayCardBomb": return(GameOrderPlayCardBomb.Create(cardInstanceID, playerID, (TerritoryIDType)(int)jOrder["targetTerritoryID"])); case "GameOrderPlayCardDiplomacy": return(GameOrderPlayCardDiplomacy.Create(cardInstanceID, playerID, (PlayerIDType)(int)jOrder["playerOne"], (PlayerIDType)(int)jOrder["playerTwo"])); case "GameOrderPlayCardGift": return(GameOrderPlayCardGift.Create(cardInstanceID, playerID, (TerritoryIDType)(int)jOrder["territoryID"], (PlayerIDType)(int)jOrder["giftTo"])); case "GameOrderPlayCardOrderDelay": return(GameOrderPlayCardOrderDelay.Create(cardInstanceID, playerID)); case "GameOrderPlayCardOrderPriority": return(GameOrderPlayCardOrderPriority.Create(cardInstanceID, playerID)); case "GameOrderPlayCardReconnaissance": return(GameOrderPlayCardReconnaissance.Create(cardInstanceID, playerID, (TerritoryIDType)(int)jOrder["targetTerritory"])); case "GameOrderPlayCardSanctions": return(GameOrderPlayCardSanctions.Create(cardInstanceID, playerID, (PlayerIDType)(int)jOrder["sanctionedPlayerID"])); case "GameOrderPlayCardSpy": return(GameOrderPlayCardSpy.Create(cardInstanceID, playerID, (PlayerIDType)(int)jOrder["targetPlayerID"])); case "GameOrderPlayCardSurveillance": return(GameOrderPlayCardSurveillance.Create(cardInstanceID, playerID, (BonusIDType)(int)jOrder["targetBonus"])); case "GameOrderPlayCardFogged": return(GameOrderPlayCardFogged.Create(playerID, cardInstanceID)); } } switch (type) { case "GameOrderReceiveCard": var ret = new GameOrderReceiveCard(); ret.PlayerID = (PlayerIDType)(int)jOrder["playerID"]; ret.InstancesCreated = new List <CardInstance>(); foreach (var card in (JArray)jOrder["cardsMadeWhole"]) { var inst = new CardInstance(); inst.ID = (CardInstanceIDType)Guid.Parse((string)card["cardInstanceID"]); inst.CardID = (CardIDType)(int)card["cardID"]; ret.InstancesCreated.Add(inst); } return(ret); case "GameOrderStateTransition": var stateTrans = new GameOrderStateTransition(); stateTrans.PlayerID = (PlayerIDType)(int)jOrder["playerID"]; stateTrans.NewState = (GamePlayerState)Enum.Parse(typeof(GamePlayerState), (string)jOrder["newState"]); return(stateTrans); case "ActiveCardWoreOff": var active = new ActiveCardWoreOff(); active.PlayerID = (PlayerIDType)(int)jOrder["playerID"]; active.CardInstanceID = (CardInstanceIDType)Guid.Parse((string)jOrder["cardInstanceID"]); return(active); case "GameOrderDiscard": return(GameOrderDiscard.Create((PlayerIDType)(int)jOrder["playerID"], (CardInstanceIDType)Guid.Parse((string)jOrder["cardInstanceID"]))); } throw new Exception("Need handler for order type " + type); }