private void BindHandCard(List <PlayerAction> acceptedActions, GameObject cardFrame, PCBoardBehavior boardBehavior)
        {
            var behaviorList =
                cardFrame.transform.Cast <Transform>()
                .Select(t => t.gameObject.GetComponent <PCBoardCardDisplayBehaviour>())
                .Where(behave => behave != null)
                .ToList().Where(cardDisplayBehavior => cardDisplayBehavior.Card != null)
                .Where(cd => cd.gameObject.activeSelf == true);


            var cards = new Dictionary <CardInfo, List <PCBoardCardDisplayBehaviour> >();

            foreach (var cd in behaviorList)
            {
                if (!cards.ContainsKey(cd.Card))
                {
                    cards[cd.Card] = new List <PCBoardCardDisplayBehaviour>();
                }

                cards[cd.Card].Add(cd);
            }

            foreach (var action in acceptedActions)
            {
                var key = action.Data[0] as CardInfo;
                if (key == null)
                {
                    LogRecorder.Log("Wrong Action");
                    continue;
                }

                if (!cards.ContainsKey(key))
                {
                    LogRecorder.Log("Missing Card");
                    continue;
                }
                foreach (var behavior in cards[key])
                {
                    var trg         = behavior.gameObject.GetComponent <PCBoardBindedActionClickTrigger>();
                    var actionAsync = action;
                    trg.Bind(new PlayerAction()
                    {
                        ActionType = PlayerActionType.ProgramDelegateAction,
                        Data       = new Dictionary <int, object>()
                        {
                            { 0, new Action(() =>
                                {
                                    HandCardMenuFrame.Popup(actionAsync, trg.gameObject, boardBehavior);
                                }) }
                        }
                    }, boardBehavior);
                }
            }
        }
Ejemplo n.º 2
0
        public override void EnteringState()
        {
            //确定返回的事件
            var actions     = StateData[StateNameAvailableActions] as List <PlayerAction>;
            var triggerCard = StateData[StateNameTriggerCard] as CardInfo;

            if (triggerCard == null || actions == null)
            {
                LogRecorder.Log("Crash!");
                return;
            }

            var board = CurrentGame.Boards[CurrentGame.MyPlayerIndex];

            var targetElements = new Dictionary <String, List <CardInfo> >();

            targetElements["HandCivilCard"] = new List <CardInfo>();
            targetElements["BuildingCell"]  = new List <CardInfo>();

            targetElements["HandCivilCard"].Add(triggerCard);


            //1. 突破(研究科技后改变[0]类型的属性[1]点)
            var cards =
                board.CivilCards.Where(
                    card =>
                    actions.Exists(
                        action =>
                        action.ActionType == PlayerActionType.DevelopTechCard &&
                        (action.Data[0] as CardInfo).InternalId == card.InternalId)).ToList();

            targetElements["HandCivilCard"].AddRange(cards);


            //建造资源建筑减少资源点消耗[0]
            //建造城市建筑减少资源点消耗[0]
            cards =
                actions.Where(action => action.ActionType == PlayerActionType.BuildBuilding)
                .Select(act => act.Data[0] as CardInfo)
                .ToList();
            targetElements["BuildingCell"].AddRange(cards);

            //建造资源建筑减少资源点消耗[0]
            //建造城市建筑减少资源点消耗[0]
            cards =
                actions.Where(action => action.ActionType == PlayerActionType.UpgradeBuilding)
                .Select(act => act.Data[0] as CardInfo)
                .ToList();
            targetElements["BuildingCell"].AddRange(cards);


            StateData["HighlightElement"] = targetElements;
        }
Ejemplo n.º 3
0
 protected override void OnSubscribedGameEvents(System.Object sender, GameUIEventArgs args)
 {
     //响应Refresh(来重新创建UI Element)
     if (args.EventType == GameUIEventType.CancelWaitingNetwork)
     {
         gameObject.SetActive(false);
         LogRecorder.Log("Disable Mask");
     }
     else if (args.EventType == GameUIEventType.WaitingNetwork)
     {
         gameObject.SetActive(true);
         LogRecorder.Log("Enable Mask");
     }
 }
Ejemplo n.º 4
0
        public IEnumerator TakeInternalAction(TtaGame game, PlayerAction action, Action <List <PlayerAction> > callback)
        {
            BgoGame         bgoGame   = game as BgoGame;
            BgoPlayerAction bgoAction = action as BgoPlayerAction;
            Action <List <PlayerAction> > callbackDelegate = (actions) =>
            {
                if (callback != null)
                {
                    callback(actions);
                }
            };

            if (bgoAction == null)
            {
                LogRecorder.Log("Null Action!");
                return(null);
            }

            return(BgoPostProvider.PostInternalAction(sessionObject, bgoGame, bgoAction, callbackDelegate));
        }
Ejemplo n.º 5
0
        public void Regiseter(TtaUIControllerMonoBehaviour controller)
        {
            controller.Channel = Channel;

            LogRecorder.Log(controller.name + " Registed");
        }
Ejemplo n.º 6
0
        public static List <String> SplitRow(String str)
        {
            List <String> Columns = new List <string>();

            String lastEntry = null;
            String col       = "";

            foreach (char t in str)
            {
                switch (lastEntry)
                {
                case null:
                case ",":
                    switch (t)
                    {
                    case '"':
                        lastEntry = "(";
                        break;

                    case ',':
                        Columns.Add(col);
                        col       = "";
                        lastEntry = ",";
                        break;

                    default:
                        col += t;
                        break;
                    }
                    break;

                case "(":
                    if (t == '"')
                    {
                        lastEntry = ")";
                    }
                    else
                    {
                        col += t;
                    }
                    break;

                case ")":
                    if (t == ',')
                    {
                        Columns.Add(col);
                        col       = "";
                        lastEntry = ",";
                    }
                    else
                    {
                        LogRecorder.Log(str);
                        return(null);
                    }
                    break;
                }
            }

            Columns.Add(col);
            return(Columns);
        }
        public override void ProcessGameEvents(object sender, GameUIEventArgs args)
        {
            if (!args.UIKey.Contains("PoliticalDialog"))
            {
                return;
            }
            if (args.EventType == GameUIEventType.TrySelect)
            {
                //内政Idle中,能选中的Dialog就能点击
                if (args.UIKey.Contains("Card"))
                {
                    //点的是卡
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
                else if (args.UIKey.Contains("Player"))
                {
                    //是玩家名字
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
                else if (args.UIKey.Contains("DialogButton"))
                {
                    //是按钮
                    //这里不一定能按
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
            }
            else if (args.EventType == GameUIEventType.Selected)
            {
                if (args.UIKey.Contains("Card"))
                {
                    //点的是卡
                    if (StateData.ContainsKey("PoliticalIdle-CardSelected"))
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.SelectionDeactive,
                                                                     ((GameUIEventArgs)StateData["PoliticalIdle-CardSelected"]).UIKey));
                    }
                    StateData["PoliticalIdle-CardSelected"] = args;
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.SelectionActive, args.UIKey));
                }
                else if (args.UIKey.Contains("Player"))
                {
                    //是玩家名字
                    if (StateData.ContainsKey("PoliticalIdle-Player"))
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.SelectionDeactive,
                                                                     ((GameUIEventArgs)StateData["PoliticalIdle-Player"]).UIKey));
                    }
                    StateData["PoliticalIdle-Player"] = args;
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.SelectionActive, args.UIKey));
                }
                else if (args.UIKey.Contains("DialogButton"))
                {
                    //是按钮
                    //这里不一定能按
                    //看是什么Button
                    if (args.UIKey.Contains("PassPoliticalPhase"))
                    {
                        var action =
                            CurrentGame.PossibleActions.FirstOrDefault(
                                a => a.ActionType == PlayerActionType.PassPoliticalPhase);

                        var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                        msg.AttachedData.Add("PlayerAction", action);
                        Channel.Broadcast(msg);
                    }
                    else if (args.UIKey.Contains("Confirm"))
                    {
                        var card =
                            (CardInfo)((GameUIEventArgs)StateData["PoliticalIdle-CardSelected"]).AttachedData["Card"];
                        var action =
                            CurrentGame.PossibleActions.FirstOrDefault(
                                a => a.ActionType == PlayerActionType.Aggression && card == (CardInfo)a.Data[0]);

                        var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");

                        if (StateData.ContainsKey("PoliticalIdle-Player"))
                        {
                            var playerNo =
                                (int)((GameUIEventArgs)StateData["PoliticalIdle-Player"]).AttachedData["PlayerNo"];
                            action =
                                CurrentGame.PossibleActions.FirstOrDefault(
                                    a =>
                                    String.Equals(a.Data[1].ToString(), CurrentGame.Boards[playerNo].PlayerName,
                                                  StringComparison.CurrentCultureIgnoreCase));
                            if (action == null)
                            {
                                LogRecorder.Log("No Such Aggression");
                                return;
                            }
                        }
                        msg.AttachedData.Add("PlayerAction", action);
                        Channel.Broadcast(msg);
                    }
                }
            }
        }
Ejemplo n.º 8
0
        private void Clicked()
        {
            var mousePoint = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            if (ButtonCount == 1)
            {
                if (Action != null)
                {
                    trigger.BoardBehavior.TakeAction(Action, InternalActionCallback);
                }
                Collapse();
            }
            else if (ButtonCount == 2)
            {
                if (mousePoint.y < transform.position.y + 0.5f)
                {
                    LogRecorder.Log("Not in Range");
                    return;
                }
                if (mousePoint.x < this.transform.position.x)
                {
                    if (Action != null)
                    {
                        trigger.BoardBehavior.TakeAction(Action, InternalActionCallback);
                    }
                    Collapse();
                }
                else
                {
                    Collapse();
                }
            }
            else if (ButtonCount == 3)
            {
                if (mousePoint.y < transform.position.y + 0.5f)
                {
                    LogRecorder.Log("Not in Range");
                    return;
                }
                if (mousePoint.x < this.transform.position.x - 0.1f)
                {
                    if (Action != null)
                    {
                        trigger.BoardBehavior.TakeAction(Action, InternalActionCallback);
                    }
                    Collapse();
                }
                else
                if (mousePoint.x > this.transform.position.x - 0.1f && mousePoint.x < this.transform.position.x + 0.1f)
                {
                    if (Action != null)
                    {
                        trigger.BoardBehavior.TakeAction(Action, InternalActionCallback);
                    }
                    Collapse();
                }
                else
                {
                    Collapse();
                }
            }
        }
Ejemplo n.º 9
0
        public static void LoadCiviloPedia()
        {
            if (Civilopedias != null)
            {
                return;
            }

            TextAsset textAsset = Resources.Load <TextAsset>("Civilopedia/BGO.2.0");

            var dictStr = textAsset.text;

            Civilopedias = new Dictionary <string, TtaCivilopedia>();

            var civilopedia = new TtaCivilopedia();

            civilopedia.cardInfos = new Dictionary <string, CardInfo>();

            var rows = dictStr.Split("\n".ToCharArray());

            foreach (var row in rows)
            {
                var csvRow = CsvUtil.SplitRow(row.Trim());
                if (csvRow.Count != 20)
                {
                    continue;
                }

                try
                {
                    CardInfo info = new CardInfo
                    {
                        InternalId  = csvRow[0],
                        CardName    = TtaTranslation.GetTranslatedText(csvRow[1]).Trim(),
                        CardType    = (CardType)Convert.ToInt32(csvRow[2]),
                        CardAge     = (Age)Convert.ToInt32(csvRow[3]),
                        Description = csvRow[4],
                        NormalImage = "SpriteTile/Cards/" + csvRow[5].Replace(".png", "")
                    };

                    info.SmallImage = info.NormalImage + "_small";
                    UnityResources.LazyLoadSprite(info.SmallImage,
                                                  () => UnityResources.ZoomSprite(info.NormalImage, new Vector2(0.5f, 0.5f), 70f / 297f));

                    info.SpecialImage = "SpriteTile/Cards/" + csvRow[6].Replace(".png", "");

                    info.Package = csvRow[7];

                    info.ResearchCost  = ToIntList(csvRow[8], "/");
                    info.BuildCost     = ToIntList(csvRow[9], ",");
                    info.RedMarkerCost = ToIntList(csvRow[10], "|");

                    info.ImmediateEffects = new List <CardEffect>();
                    info.ImmediateEffects.AddRange(CreateEffects(csvRow[11])); //使用效果(ActionCard专用)
                    info.ImmediateEffects.AddRange(CreateEffects(csvRow[12])); //一次性效果(ColonyCard专用)

                    info.SustainedEffects = CreateEffects(csvRow[13]);         //持续效果

                    info.AffectedTrget = ToIntList(csvRow[14], ",");           //6月6日新加:影响对象

                    info.WinnerEffects = CreateEffects(csvRow[15]);
                    info.LoserEffects  = CreateEffects(csvRow[16]);

                    info.TacticComposition = ToIntList(csvRow[17], ",");
                    info.TacticValue       = string.IsNullOrEmpty(csvRow[18])
                        ? new List <int>()
                        : csvRow[18].Split("/".ToCharArray())
                                             .Select(a => Convert.ToInt32(a.Split(",".ToCharArray())[2]))
                                             .ToList();

                    info.ImmediateEffects.AddRange(CreateEffects(csvRow[19])); //领袖技能主动使用效果(LeaderCard专用)

                    civilopedia.cardInfos[info.InternalId] = info;
                }
                catch (Exception e)
                {
                    LogRecorder.Log(e.Message + " " + row);
                }
            }

            Civilopedias.Add("2.0", civilopedia);
        }
Ejemplo n.º 10
0
 public void OnDestory()
 {
     LogRecorder.Log("Destoryed");
     Unregister(this);
 }
Ejemplo n.º 11
0
        public override void ProcessGameEvents(System.Object sender, GameUIEventArgs args)
        {
            #region ProcessActionPhaseIdleStateEvents - TrySelect
            if (args.EventType == GameUIEventType.TrySelect)
            {
                //在空闲状态,允许点击的UI元素如下
                if (args.UIKey.Contains("CardRow"))
                {
                    //卡牌列上的卡
                    //要看是什么张卡,白点够不够
                    var action =
                        CurrentGame.PossibleActions.FirstOrDefault(a => (
                                                                       a.ActionType == PlayerActionType.TakeCardFromCardRow ||
                                                                       a.ActionType == PlayerActionType.PutBackCard) && (
                                                                       Convert.ToInt32(a.Data[1]) ==
                                                                       (int)
                                                                       args.AttachedData[
                                                                           "Position"]));

                    if (action != null)
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                    }
                }
                else if (args.UIKey.Contains("BuildingCell"))
                {
                    //建筑列表
                    //看有没有相关的Action,没有就不让选
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
                else if (args.UIKey.Contains("BuildingsPopupMenuItem"))
                {
                    //Building的MenuItem都是可选的Action
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
                else if (args.UIKey.Contains("ConstructingWonderBox"))
                {
                    //在建造中的奇迹
                    List <PlayerAction> acceptedActions =
                        CurrentGame.PossibleActions.Where(
                            action =>
                            action.ActionType == PlayerActionType.BuildWonder).ToList();

                    acceptedActions.Sort((a, b) => ((int)a.Data[1]).CompareTo(b.Data[0]));

                    if (acceptedActions.Count > 0)
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                    }
                }
                else if (args.UIKey.Contains("ConstructingWonderMenuItem"))
                {
                    //Wonder的MenuItem只要拉得出来都是可选的Action
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
                else if (args.UIKey.Contains("WorkerBank"))
                {
                    //人力库(要看粮食)
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
                else if (args.UIKey.Contains("PlayerTab"))
                {
                    //玩家面板(要看人数)
                    var playerNo = (int)args.AttachedData["PlayerNo"];
                    if (CurrentGame.Boards.Count > playerNo)
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                    }
                }
                else if (args.UIKey.Contains("HandCivilCard")
                         )
                {
                    //手牌(要看手牌内容)
                    var card = args.AttachedData["Card"] as CardInfo;
                    if (CurrentGame.PossibleActions.FirstOrDefault(
                            action => (
                                action.ActionType == PlayerActionType.DevelopTechCard ||
                                action.ActionType == PlayerActionType.PlayActionCard ||
                                action.ActionType == PlayerActionType.Revolution ||
                                action.ActionType == PlayerActionType.ElectLeader) && (action.Data[0] as CardInfo == card)) !=
                        null)
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                    }
                }
                else if (args.UIKey.Contains("HandMilitaryCard"))
                {
                    var card = args.AttachedData["Card"] as CardInfo;
                    if (CurrentGame.PossibleActions.FirstOrDefault(
                            action =>
                            action.ActionType == PlayerActionType.SetupTactic && action.Data[0] as CardInfo == card) !=
                        null)
                    {
                        Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                    }
                }
                else if (args.UIKey.Contains("DialogButton"))
                {
                    //按钮
                    Channel.Broadcast(new ManagerGameUIEventArgs(GameUIEventType.AllowSelect, args.UIKey));
                }
            }
            #endregion

            #region ProcessActionPhaseIdleStateEvents - Selected
            if (args.EventType == GameUIEventType.Selected)
            {
                //如果玩家在空闲状态下,选中不同的目标
                //TODO 这里省略判断,默认合法(理论上上面TrySelect的内容应该留在这里判断)
                if (args.UIKey.Contains("CardRow"))
                {
                    //卡牌列上的卡

                    //第一步,把要的action找出来
                    var action =
                        CurrentGame.PossibleActions.FirstOrDefault(a => (
                                                                       a.ActionType == PlayerActionType.TakeCardFromCardRow ||
                                                                       a.ActionType == PlayerActionType.PutBackCard) && (
                                                                       Convert.ToInt32(a.Data[1]) ==
                                                                       (int)
                                                                       args.AttachedData[
                                                                           "Position"]));

                    //第二步,发消息给server,take action
                    var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                    msg.AttachedData.Add("PlayerAction", action);
                    Channel.Broadcast(msg);
                }
                else if (args.UIKey.Contains("WorkerBank"))
                {
                    //人力库(要看粮食)

                    var action =
                        CurrentGame.PossibleActions.FirstOrDefault(
                            a => a.ActionType == PlayerActionType.IncreasePopulation);

                    var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                    msg.AttachedData.Add("PlayerAction", action);
                    Channel.Broadcast(msg);
                }
                else if (args.UIKey.Contains("BuildingCell"))
                {
                    //建筑列表
                    var card = (CardInfo)args.AttachedData["Card"];
                    //看有没有相关的Action,没有就不让选
                    List <PlayerAction> acceptedActions = new List <PlayerAction>();

                    foreach (var action in CurrentGame.PossibleActions)
                    {
                        if (action.ActionType == PlayerActionType.BuildBuilding &&
                            ((CardInfo)action.Data[0]).InternalId == card.InternalId)
                        {
                            acceptedActions.Add(action);
                        }

                        if (action.ActionType == PlayerActionType.UpgradeBuilding)
                        {
                            if (((CardInfo)action.Data[0]).InternalId == card.InternalId ||
                                ((CardInfo)action.Data[1]).InternalId == card.InternalId)
                            {
                                acceptedActions.Add(action);
                            }
                        }
                        if (action.ActionType == PlayerActionType.Disband ||
                            action.ActionType == PlayerActionType.Destory)
                        {
                            if (((CardInfo)action.Data[0]).InternalId == card.InternalId)
                            {
                                acceptedActions.Add(action);
                            }
                        }
                    }
                    var msg = new ManagerGameUIEventArgs(GameUIEventType.PopupMenu, args.UIKey);
                    msg.AttachedData.Add("Actions", acceptedActions);
                    Channel.Broadcast(msg);
                }
                else if (args.UIKey.Contains("BuildingsPopupMenuItem"))
                {
                    var action = args.AttachedData["Action"] as PlayerAction;
                    var msg    = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                    msg.AttachedData.Add("PlayerAction", action);

                    if (action == null)
                    {
                        return;
                    }

                    if (action.Internal)
                    {
                        //出错了,建筑面板不可能有InternalAction
                        Debug.Log("Error: BuildingsPopupMenuItem has Internal Action");
                    }
                    else
                    {
                        Channel.Broadcast(msg);
                    }
                }
                else if (args.UIKey.Contains("ConstructingWonderBox"))
                {
                    //在建造中的奇迹
                    List <PlayerAction> acceptedActions =
                        CurrentGame.PossibleActions.Where(
                            action =>
                            action.ActionType == PlayerActionType.BuildWonder).ToList();

                    acceptedActions.Sort((a, b) => ((int)a.Data[1]).CompareTo(b.Data[0]));

                    if (acceptedActions.Count > 0)
                    {
                        var msg = new ManagerGameUIEventArgs(GameUIEventType.PopupMenu, args.UIKey);
                        msg.AttachedData.Add("Actions", acceptedActions);
                        Channel.Broadcast(msg);
                    }
                }
                else if (args.UIKey.Contains("ConstructingWonderMenuItem"))
                {
                    var action = args.AttachedData["Action"] as PlayerAction;
                    var msg    = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                    msg.AttachedData.Add("PlayerAction", action);

                    if (action == null)
                    {
                        return;
                    }

                    if (action.Internal)
                    {
                        //出错了,Wonder不可能有InternalAction
                        Debug.Log("Error: BuildingsPopupMenuItem has Internal Action");
                    }
                    else
                    {
                        Channel.Broadcast(msg);
                    }
                }
                else if (args.UIKey.Contains("PlayerTab"))
                {
                    //玩家面板
                    var playerNo = (int)args.AttachedData["PlayerNo"];
                    if (CurrentGame.Boards.Count > playerNo)
                    {
                        Manager.SwitchDisplayingBoardNo(playerNo);
                    }
                }
                else if (args.UIKey.Contains("DialogButton"))
                {
                    //按钮
                    if (args.UIKey.Contains("ResetActionPhase"))
                    {
                        var action =
                            CurrentGame.PossibleActions.FirstOrDefault(
                                a => a.ActionType == PlayerActionType.ResetActionPhase);

                        var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                        msg.AttachedData.Add("PlayerAction", action);
                        Channel.Broadcast(msg);
                    }
                    else if (args.UIKey.Contains("EndActionPhase"))
                    {
                        var action =
                            CurrentGame.PossibleActions.FirstOrDefault(
                                a => a.ActionType == PlayerActionType.EndActionPhase);

                        var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                        msg.AttachedData.Add("PlayerAction", action);
                        Channel.Broadcast(msg);
                    }
                }
                else if (args.UIKey.Contains("HandCivilCard"))
                {
                    //手牌(要看手牌内容)
                    var handCardActions = CurrentGame.PossibleActions.Where(
                        a =>
                        a.ActionType == PlayerActionType.DevelopTechCard ||
                        a.ActionType == PlayerActionType.PlayActionCard ||
                        a.ActionType == PlayerActionType.Revolution ||
                        a.ActionType == PlayerActionType.ElectLeader).ToList();
                    var action = handCardActions.FirstOrDefault(
                        a => a.Data[0] as CardInfo == args.AttachedData["Card"] as CardInfo);

                    var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                    msg.AttachedData.Add("PlayerAction", action);

                    if (action == null)
                    {
                        return;
                    }

                    if (action.Internal)
                    {
                        Manager.SwitchState(GameManagerState.ActionPhaseInternalQuery,
                                            new Dictionary <String, System.Object>()
                        {
                            { ActionPhaseChooseTargetStateHandler.StateNameTriggerCard, args.AttachedData["Card"] as CardInfo },
                            { ActionPhaseChooseTargetStateHandler.StateNameTriggerAction, action }
                        });
                    }
                    else
                    {
                        Channel.Broadcast(msg);
                    }
                }
                else if (args.UIKey.Contains("HandMilitaryCard"))
                {
                    var card       = args.AttachedData["Card"] as CardInfo;
                    var cardAction = CurrentGame.PossibleActions.FirstOrDefault(
                        action =>
                        action.ActionType == PlayerActionType.SetupTactic && action.Data[0] as CardInfo == card);

                    if (cardAction == null)
                    {
                        return;
                    }

                    var msg = new ManagerGameUIEventArgs(GameUIEventType.TakeAction, "NetworkManager");
                    msg.AttachedData.Add("PlayerAction", cardAction);

                    if (cardAction.Internal)
                    {
                        LogRecorder.Log("Error HandMilitaryCard Internal Action");
                    }
                    else
                    {
                        Channel.Broadcast(msg);
                    }
                }
            }
            #endregion
        }