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); } } }
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; }
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"); } }
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)); }
public void Regiseter(TtaUIControllerMonoBehaviour controller) { controller.Channel = Channel; LogRecorder.Log(controller.name + " Registed"); }
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); } } } }
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(); } } }
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); }
public void OnDestory() { LogRecorder.Log("Destoryed"); Unregister(this); }
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 }