public HandToFieldAnim(TableManager table, HandListItem item, FieldList field, int index) { _item = item; _startPosition = item.Card.rectTransform.position; _timer = new Timer() { duration = table.handToFieldCurve.keys.Last().time }; field.addChild(table.ui.ServantPlaceHolder.rectTransform); field.defaultItem.rectTransform.SetAsFirstSibling(); table.ui.ServantPlaceHolder.rectTransform.SetSiblingIndex(index + 1); table.ui.ServantPlaceHolder.display(); _startPosition = _item.Card.rectTransform.position; _timer.start(); }
public override bool update(TableManager table, Pile.MoveCardEventArg eventArg) { if (eventArg.from == null) { if (eventArg.to.name == PileName.HAND) { //发现,印卡 if (!table.tryGetHand(eventArg.card, out var hand)) { hand = table.createHand(eventArg.card); } if (!SimpleAnimHelper.update(table, ref _anim, hand.onCreate, hand.animator)) { return(false); } } } else if (eventArg.from.name == PileName.INIT) { if (eventArg.to.name == PileName.HAND) { //初始手牌 table.createHand(eventArg.card); } } else if (eventArg.from.name == PileName.DECK) { if (eventArg.to.name == PileName.HAND) { //抽牌 if (!_timer.isStarted) { _item = table.createHand(eventArg.card); if (eventArg.from.owner == table.player) { _item.Card.rectTransform.position = table.ui.SelfDeck.rectTransform.position; _startPosition = table.ui.SelfDeck.rectTransform.position; } else { _item.Card.rectTransform.position = table.ui.EnemyDeck.rectTransform.position; _startPosition = table.ui.EnemyDeck.rectTransform.position; } _timer.start(); } _item.Card.rectTransform.position = Vector3.Lerp(_startPosition, _item.rectTransform.position, _item.Card.drawCurve.Evaluate(_timer.progress)); if (!_timer.isExpired()) { return(false); } } } else if (eventArg.from.name == PileName.HAND) { HandListItem hand = table.getHand(eventArg.card); if (eventArg.to.name == PileName.GRAVE) { //弃牌 if (!SimpleAnimHelper.update(table, ref _anim, hand.onDiscard, hand.animator, next => { if (next is MoveCardAnim moveCard && moveCard.tEventArg.card != eventArg.card) { return(true); } return(false); }))
public override bool update(TableManager table, THHPlayer.UseEventArg eventArg) { if (eventArg.card.define is ServantCardDefine) { if (eventArg.player == table.player) { if (!table.ui.ServantPlaceHolder.Servant.isDisplaying) { HandListItem item = table.getHand(eventArg.card); if (_handToField == null) { _handToField = new HandToFieldAnim(table, item, table.ui.SelfFieldList, eventArg.position); } if (!_handToField.update(table)) { return(false); } } if (tryTargetedAnim(table, eventArg)) { return(false); } table.ui.SelfHandList.removeItem(table.getHand(eventArg.card)); table.ui.addChild(table.ui.ServantPlaceHolder.rectTransform); table.ui.ServantPlaceHolder.hide(); } else { var hand = table.getHand(eventArg.card); if (hand == null) { throw new ActorNotFoundException(eventArg.card); } if (!table.ui.ServantPlaceHolder.Servant.isDisplaying) { //敌方使用随从 if (_handToField == null) { _handToField = new HandToFieldAnim(table, hand, table.ui.EnemyFieldList, eventArg.position); } if (!_handToField.update(table)) { return(false); } } if (tryTargetedAnim(table, eventArg)) { return(false); } table.ui.EnemyHandList.removeItem(hand); table.ui.addChild(table.ui.ServantPlaceHolder.rectTransform); table.ui.ServantPlaceHolder.hide(); } } else if (eventArg.card.define is SpellCardDefine) { if (eventArg.player == table.player) { table.ui.SelfHandList.removeItem(table.getHand(eventArg.card)); if (tryTargetedAnim(table, eventArg)) { return(false); } } else { HandListItem hand = table.getHand(eventArg.card); table.setCard(hand.Card, eventArg.card, true); hand.GetComponentInChildren <PositionLerp>().setTarget(table.ui.getChild("SpellDisplay")); if (!SimpleAnimHelper.update(table, ref _useAnim, hand.onEnemyUse, hand.animator)) { return(false); } table.ui.EnemyHandList.removeItem(table.getHand(eventArg.card)); if (tryTargetedAnim(table, eventArg)) { return(false); } } } else if (eventArg.card.isSkill()) { if (eventArg.player == table.player) { table.setSkill(table.ui.SelfSkill, eventArg.card); } else { table.setSkill(table.ui.EnemySkill, eventArg.card); } if (tryTargetedAnim(table, eventArg)) { return(false); } } else if (eventArg.card.isItem()) { if (eventArg.player == table.player) { table.setItem(table.ui.SelfItem, eventArg.card); if (!SimpleAnimHelper.update(table, ref _useAnim, table.ui.SelfItem.onEquip, table.ui.SelfItem.animator)) { return(false); } } else { table.setItem(table.ui.EnemyItem, eventArg.card); if (!SimpleAnimHelper.update(table, ref _useAnim, table.ui.EnemyItem.onEquip, table.ui.EnemyItem.animator)) { return(false); } } if (tryTargetedAnim(table, eventArg)) { return(false); } } return(true); }
/// <summary> /// 手牌拖拽结束 /// </summary> /// <param name="hand"></param> /// <param name="pointer"></param> void onDragHandEnd(HandListItem hand, PointerEventData pointer) { if (hand.GetComponentInParent <HandList>() != ui.SelfHandList)//你不能用别人的卡 { return; } if (!canControl)//不是你的回合,不生效 { resetUse(true, true); return; } usingCard = getCard(hand); if (ui.SelfHandList.rectTransform.rect.Contains(ui.SelfHandList.rectTransform.InverseTransformPoint(pointer.position))) { //如果松开,取消使用 resetUse(true, true); } else { if (!usingCard.isUsable(game, player, out string info)) { //卡牌不可用 showTip(info); resetUse(true, true); } else if (usingCard.define is ServantCardDefine) { //松开鼠标,确认使用随从牌 int index = calcIndexInField(pointer.position); ui.ServantPlaceHolder.rectTransform.SetSiblingIndex(index + 1); if (usingCard.getAvaliableTargets(game) is TouhouCardEngine.Card[] targets && targets.Length > 0) { usingPosition = index; //进入选择目标状态,固定手牌到占位上,高亮可以选择的目标 addAnim(new HandToFieldAnim(this, hand, ui.SelfFieldList, index)); TouhouCardEngine.Card localUsingCard = usingCard; addAnim(new CodeAnim(() => { hand.Card.hide(); //显示占位随从 ui.ServantPlaceHolder.Servant.display(); try { setServant(ui.ServantPlaceHolder.Servant, localUsingCard.define); } catch (NullReferenceException e) { Debug.LogError(e); } })); isSelectingTarget = true; highlightTargets(targets); ui.SelfSkill.isUsable = false; ui.SelfHandList.shrink(); } else { //使用无目标随从牌 player.cmdUse(game, usingCard, index); resetUse(false, false); } }
/// <summary> /// 手牌拖拽事件 /// </summary> /// <param name="hand"></param> /// <param name="pointer"></param> void onDragHand(HandListItem hand, PointerEventData pointer) { if (!hand.isDragable) { return; } if (!canControl)//无法进行控制 { resetUse(true, true); return; } TouhouCardEngine.Card card = getCard(hand); if (usingCard != null && usingCard != card) { resetUse(true, true); return; } usingCard = card; //拖拽卡片 hand.Card.rectTransform.position = pointer.position; if (ui.SelfHandList.rectTransform.rect.Contains(ui.SelfHandList.rectTransform.InverseTransformPoint(pointer.position))) { //如果移动回手牌区域,恢复正常大小 hand.Card.rectTransform.localScale = Vector3.one; //移除随从占位 if (usingCard.isServant()) { hideServantPlaceHolder(); } } else { //移动到手牌区以外的地方视作打算使用 if (!usingCard.isUsable(game, player, out string info)) { //卡牌不可用,停止拖拽并提示 showTip(info); resetUse(true, true); } else { //手牌在战场上大小和随从牌一致 hand.Card.rectTransform.localScale = Vector3.one * .4f / ui.SelfHandList.rectTransform.localScale.y; if (usingCard.define is ServantCardDefine) { //如果手牌是随从,那么在场上的时候会有一个占位符,预览这个随从放下去的位置。 ui.SelfFieldList.defaultItem.rectTransform.SetAsFirstSibling(); ui.ServantPlaceHolder.rectTransform.sizeDelta = ui.SelfFieldList.defaultItem.rectTransform.sizeDelta; ui.SelfFieldList.addChild(ui.ServantPlaceHolder.rectTransform); ui.ServantPlaceHolder.display(); ui.ServantPlaceHolder.rectTransform.SetSiblingIndex(calcIndexInField(pointer.position) + 1); } else if (usingCard.define is SpellCardDefine) { if (usingCard.isNeedTarget(game, out var targets)) { if (!isSelectingTarget) { isSelectingTarget = true;//TODO:这个地方一定要重写,怎么能这样的?isSelectingTarget就应该被usingCard取代 highlightTargets(targets); ui.SelfHandList.shrink(); } hand.Card.hide(); if (tryGetMaster(usingCard.getOwner().master, out var castMaster)) { displayArrow(castMaster.rectTransform.position, pointer.position); } } } } } }