/// <summary>
        /// 当所有信息齐后进行
        /// </summary>
        void RealFunction()
        {
            //如果当前怪兽的状态是里侧表示,则进行反转召唤
            if (calledMonster.GetCardGameState() == CardGameState.Back)
            {
                callMonsterType = CallMonsterType.Flip;
                calledMonster.SetCardGameState(cardGameState);
                calledMonster.SetChangeAttackOrDefenseNumber(0);
                calledMonster.GetDuelCardScript().SetOwner(ownerPlayer);
                CheckCardCanChainLaunch();
                return;
            }
            int monsterLevel = calledMonster.GetLevel();

            //先判断是否可以直接进行召唤
            if (monsterLevel <= DuelRuleManager.GetCallMonsterWithoutSacrificeLevelUpperLimit())
            {
                int index = CallMonster();
                calledMonster.GetDuelCardScript().SetOwner(ownerPlayer);
                ownerPlayer.GetOpponentPlayer().CallMonsterNotify(calledMonster.GetID(), CallType.Normal, CardGameState.Hand, cardGameState, index);
                CheckCardCanChainLaunch();
            }
            else//使用祭品召唤
            {
                if (ownerPlayer.GetCanBeSacrificeMonsterNumber() >= calledMonster.NeedSacrificeMonsterNumer())
                {
                    callMonsterType = CallMonsterType.Sacrifice;
                    TrySacrificeCall();
                }
            }
        }
        /// <summary>
        /// 召唤怪兽
        /// </summary>
        int CallMonster()
        {
            int index = 0;

            for (; index < DuelRuleManager.GetMonsterAreaNumber(); index++)
            {
                if (ownerPlayer.GetMonsterCardArea()[index] == null)
                {
                    ownerPlayer.GetMonsterCardArea()[index] = calledMonster;
                    break;
                }
            }
            callMonsterType = CallMonsterType.Normal;
            calledMonster.AddContent("monsterCardAreaIndex", index);

            if (calledMonster.GetCardGameState() == CardGameState.Tomb)
            {
                calledMonster.GetDuelCardScript().GetOwner().GetTombCards().Remove(calledMonster);
            }
            else if (calledMonster.GetCardGameState() == CardGameState.Hand)
            {
                calledMonster.GetDuelCardScript().GetOwner().GetHandCards().Remove(calledMonster);
            }

            calledMonster.SetCardGameState(cardGameState, index);

            ownerPlayer.SetNormalCallNumber(ownerPlayer.GetNormalCallNumber() - 1);
            return(index);
        }
 protected override void BeforeProcessFunction()
 {
     if (!launchEffectCard.IsInArea())
     {
         int index = 0;
         for (; index < DuelRuleManager.GetMagicTrapAreaNumber(); index++)
         {
             if (ownerPlayer.GetMagicTrapCardArea()[index] == null)
             {
                 ownerPlayer.GetMagicTrapCardArea()[index] = launchEffectCard;
                 break;
             }
         }
         launchEffectCard.AddContent("magicTrapCardAreaIndex", index);
         if (launchEffectCard.GetCardGameState() == CardGameState.Hand)
         {
             ownerPlayer.GetHandCards().Remove(launchEffectCard);
         }
         launchEffectCard.SetCardGameState(CardGameState.Front, index);
     }
     else
     {
         launchEffectCard.SetCardGameState(CardGameState.Front);
     }
     launchEffectCard.BeforeLaunchEffect(CostFinish);
 }
Esempio n. 4
0
 /// <summary>
 /// 决斗开始时抽卡
 /// </summary>
 public void DrawAtFirst()
 {
     for (int i = 0; i < DuelRuleManager.GetDrawNumberOnStartDuel(); i++)
     {
         Draw();
     }
 }
Esempio n. 5
0
 public void SetLife(int newLife)
 {
     life = newLife;
     life = life > 0 ? life : 0;
     lifeScrollBar.size  = (float)life / DuelRuleManager.GetPlayerStartLife();
     lifeNumberText.text = life + "/" + DuelRuleManager.GetPlayerStartLife();
     duelScene.CheckWinByLife();
 }
 /// <summary>
 /// 开始结束流程事件
 /// </summary>
 void BeginEndPhaseTypeEvent()
 {
     //在回合结束后检查手牌是否超过规定的最大数量,超过的话丢弃多余数量
     if (duelScene.GetCurrentPlayer().GetHandCards().Count > DuelRuleManager.GetHandCardNumberUpperLimit())
     {
         GameManager.ShowMessage("当前手牌数量大于规定数量!");
         beInterrupted = true;
         int number = duelScene.GetCurrentPlayer().GetHandCards().Count - DuelRuleManager.GetHandCardNumberUpperLimit();
         DiscardHandCardEffectProcess discardHandCardEffectProcess = new DiscardHandCardEffectProcess(null, number, null, duelScene.GetCurrentPlayer());
         duelScene.GetCurrentPlayer().AddEffectProcess(discardHandCardEffectProcess);
     }
     finishAction += duelScene.ChangeCurrentPlayer;
 }
Esempio n. 7
0
        /// <summary>
        /// 清除指定卡组错误
        /// </summary>
        /// <param name="cardGroupName"></param>
        public static void ClearCardGroupError(string cardGroupName)
        {
            UserCardGroup userCardGroup = gameManagerInstance.GetUserData().GetCardGroupByName(cardGroupName);

            //检测卡牌的数量
            for (int i = userCardGroup.mainCardList.Count - 1; i >= 0; i--)
            {
                if (userCardGroup.GetMainCardCount() > DuelRuleManager.GetMainCardGroupNumberUpperLimit())
                {
                    userCardGroup.mainCardList.RemoveAt(i);
                }
                else
                {
                    break;
                }
            }
            //检测是否存在未知卡牌
            for (int i = userCardGroup.mainCardList.Count - 1; i >= 0; i--)
            {
                if (!gameManagerInstance.GetAllCardInfoList().ContainsKey(userCardGroup.mainCardList[i].cardNo))
                {
                    userCardGroup.mainCardList.RemoveAt(i);
                }
            }
            for (int i = userCardGroup.extraCardList.Count - 1; i >= 0; i--)
            {
                if (!gameManagerInstance.GetAllCardInfoList().ContainsKey(userCardGroup.extraCardList[i].cardNo))
                {
                    userCardGroup.extraCardList.RemoveAt(i);
                }
            }
            for (int i = userCardGroup.deputyCardList.Count - 1; i >= 0; i--)
            {
                if (!gameManagerInstance.GetAllCardInfoList().ContainsKey(userCardGroup.deputyCardList[i].cardNo))
                {
                    userCardGroup.deputyCardList.RemoveAt(i);
                }
            }
            //检测同名卡牌的数量
            foreach (var item in userCardGroup.mainCardList)
            {
                if (item.number > DuelRuleManager.GetSameCardNumberUpperLimit())
                {
                    item.number = DuelRuleManager.GetSameCardNumberUpperLimit();
                }
            }
            //检测禁卡的限制

            gameManagerInstance.SaveUserData();
        }
Esempio n. 8
0
        /// <summary>
        /// 检测卡组是否合法
        /// </summary>
        /// <param name="cardGroupName"></param>
        /// <returns></returns>
        public static bool CheckCardGroupLegal(string cardGroupName)
        {
            UserCardGroup userCardGroup = gameManagerInstance.GetUserData().GetCardGroupByName(cardGroupName);

            //检测卡牌的数量
            if (userCardGroup.mainCardList.Count > DuelRuleManager.GetMainCardGroupNumberUpperLimit())
            {
                ShowMessage($"卡组:{cardGroupName}不合法。原因:卡牌的数量超过限制!");
                return(false);
            }
            //检测是否存在未知卡牌
            foreach (var item in userCardGroup.mainCardList)
            {
                if (!gameManagerInstance.GetAllCardInfoList().ContainsKey(item.cardNo))
                {
                    ShowMessage($"卡组:{cardGroupName}不合法。原因:主卡组存在未知卡牌{item.cardNo}!");
                    return(false);
                }
            }
            foreach (var item in userCardGroup.extraCardList)
            {
                if (!gameManagerInstance.GetAllCardInfoList().ContainsKey(item.cardNo))
                {
                    ShowMessage($"卡组:{cardGroupName}不合法。原因:额外卡组存在未知卡牌{item.cardNo}!");
                    return(false);
                }
            }
            foreach (var item in userCardGroup.deputyCardList)
            {
                if (!gameManagerInstance.GetAllCardInfoList().ContainsKey(item.cardNo))
                {
                    ShowMessage($"卡组:{cardGroupName}不合法。原因:副卡组存在未知卡牌{item.cardNo}!");
                    return(false);
                }
            }
            //检测同名卡牌的数量

            foreach (var item in userCardGroup.mainCardList)
            {
                if (item.number > DuelRuleManager.GetSameCardNumberUpperLimit())
                {
                    ShowMessage($"卡组:{cardGroupName}不合法。原因:同名卡牌{item.cardNo}超过上限!");
                    return(false);
                }
            }
            //检测禁卡的限制

            return(true);
        }
Esempio n. 9
0
 /// <summary>
 /// 召唤需要的祭品数量
 /// </summary>
 /// <returns></returns>
 public int NeedSacrificeMonsterNumer()
 {
     if (GetLevel() > DuelRuleManager.GetCallMonsterWithoutSacrificeLevelUpperLimit())
     {
         if (GetLevel() > DuelRuleManager.GetCallMonsterWithOneSacrificeLevelUpperLimit())
         {
             return(2);
         }
         else
         {
             return(1);
         }
     }
     return(0);
 }
Esempio n. 10
0
 /// <summary>
 /// 判断是否可以通常召唤
 /// </summary>
 /// <returns></returns>
 public bool CanNormalCall()
 {
     if (ownerPlayer.IsMyTurn() &&
         card.GetCardGameState() == CardGameState.Hand &&
         card.GetCardType() == CardType.Monster &&
         (duelScene.GetCurrentPhaseType() == PhaseType.Main ||
          duelScene.GetCurrentPhaseType() == PhaseType.Second) &&
         ownerPlayer.GetCurrentEffectProcess() == null &&
         ownerPlayer.GetCanCallNumber() > 0)
     {
         if (card.GetLevel() <= DuelRuleManager.GetCallMonsterWithoutSacrificeLevelUpperLimit())
         {
             return(!ownerPlayer.MonsterAreaIsFull());
         }
     }
     return(false);
 }
Esempio n. 11
0
        protected override void BeforeProcessFunction()
        {
            int index = 0;

            for (; index < DuelRuleManager.GetMagicTrapAreaNumber(); index++)
            {
                if (ownerPlayer.GetMagicTrapCardArea()[index] == null)
                {
                    ownerPlayer.GetMagicTrapCardArea()[index] = backPlaceCard;
                    break;
                }
            }
            backPlaceCard.AddContent("magicTrapCardAreaIndex", index);
            backPlaceCard.SetCardGameState(CardGameState.Back, index);
            ownerPlayer.GetHandCards().Remove(backPlaceCard);

            AfterFinishProcessFunction();
        }
Esempio n. 12
0
        public override void InitBeforDuel()
        {
            lifeScrollBar  = GameObject.Find("opponentLifeScrollbar").GetComponent <Scrollbar>();
            lifeNumberText = GameObject.Find("opponentLifeNumberText").GetComponent <Text>();

            life = DuelRuleManager.GetPlayerStartLife();

            List <CardBase> myCards = duelCardGroup.GetCards();

            for (int i = 0; i < myCards.Count; i++)
            {
                GameObject go = GameObject.Instantiate(duelScene.cardPre, duelScene.duelBackImage.transform);
                go.GetComponent <DuelCardScript>().SetCard(myCards[i]);
                go.GetComponent <DuelCardScript>().SetOwner(this);
                myCards[i].SetCardObject(go);
                myCards[i].SetCardGameState(CardGameState.Group);
            }
        }
Esempio n. 13
0
        /// <summary>
        /// 初始化数据
        /// </summary>
        public void InitData()
        {
            if (initDataFinish)
            {
                Debug.LogError("游戏中数据仅初始化一次!");
                return;
            }

            string    cardBackPath = rootPath + "/Texture/CardBack.jpg";
            WWW       www          = new WWW(cardBackPath);
            Texture2D texture      = new Texture2D(177, 254);

            www.LoadImageIntoTexture(texture);
            cardBackImage = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);

            string cardOperationButtonPrefabPath = "Prefab/CardOperationButtonPre";

            cardOperationButtonPrefab = Resources.Load <GameObject>(cardOperationButtonPrefabPath);
            DuelRuleManager.InitDuelRule();

            LoadUserData();
            LoadAllCardData();
        }
Esempio n. 14
0
 public void SetAttackNumber()
 {
     SetAttackNumber(DuelRuleManager.GetMonsterAttackNumberEveryTurn());
 }
Esempio n. 15
0
 /// <summary>
 /// 开始回合
 /// </summary>
 public void StartTurn()
 {
     normalCallNumber = DuelRuleManager.GetNormalCallMonsterNumber();
     duelScene.EnterPhaseType(PhaseType.Draw);
 }
Esempio n. 16
0
 public void SetChangeAttackOrDefenseNumber()
 {
     SetChangeAttackOrDefenseNumber(DuelRuleManager.GetMonsterChangeAttackOrDefenseNumberEveryTurn());
 }
Esempio n. 17
0
    /// <summary>
    /// 向指定卡组添加卡牌
    /// </summary>
    /// <param name="cardGroupType"></param>
    /// <param name="card"></param>
    public bool AddCardToCardGroup(CardGroupType cardGroupType, CardBase card)
    {
        if (cardGroup == null)
        {
            Debug.LogError("在向卡组中添加卡牌时没有找到卡组:" + currentCardGroupName);
            return(false);
        }
        int cardNumberLimit = DuelRuleManager.GetSameCardNumberUpperLimit();
        List <UserCardData> typrCardGroup = null;

        switch (cardGroupType)
        {
        case CardGroupType.Unknown:
            Debug.LogError("未知卡组类型!");
            return(false);

        case CardGroupType.Main:
            typrCardGroup = cardGroup.mainCardList;
            break;

        case CardGroupType.Extra:
            typrCardGroup = cardGroup.extraCardList;
            break;

        case CardGroupType.Deputy:
            typrCardGroup = cardGroup.deputyCardList;
            break;

        default:
            break;
        }
        UserCardData userCardData = null;

        foreach (var item in typrCardGroup)
        {
            if (item.cardNo == card.GetCardNo())
            {
                userCardData = item;
            }
        }
        if (userCardData == null)
        {
            userCardData        = new UserCardData();
            userCardData.cardNo = card.GetCardNo();
            userCardData.number = 1;
            typrCardGroup.Add(userCardData);
        }
        else
        {
            if (userCardData.number >= cardNumberLimit)
            {
                GameManager.ShowMessage("卡组中" + card.GetName() + "数量超过最大值!");
                return(false);
            }
            else
            {
                userCardData.number++;
            }
        }
        switch (cardGroupType)
        {
        case CardGroupType.Unknown:
            break;

        case CardGroupType.Main:
            ResetMainCardGroup();
            break;

        case CardGroupType.Extra:
            ResetExtraCardGroup();
            break;

        case CardGroupType.Deputy:
            ResetDeputyCardGroup();
            break;

        default:
            break;
        }
        return(true);
    }
Esempio n. 18
0
        /// <summary>
        /// 电脑思考行动,暂时制作简单处理。
        /// </summary>
        public override void ThinkAction()
        {
            //不是自己回合不进行操作
            if (duelScene.GetCurrentPlayer() != this)
            {
                return;
            }
            //受效果处理时进行根据效果类型做特殊操作
            if (currentEffectProcess != null)
            {
                if (currentEffectProcess is DiscardHandCardEffectProcess)
                {
                    (currentEffectProcess as DiscardHandCardEffectProcess).DiscardOneHandCard(null, FindWorstCardInHand());
                }
                if (currentEffectProcess is ChooseCardEffectProcess)
                {
                    ChooseCardEffectProcess chooseCardEffectProcess = currentEffectProcess as ChooseCardEffectProcess;

                    chooseCardEffectProcess.ChooseCardCallBack(chooseCardEffectProcess.GetLaunchEffectCard(), FindCanBeChooseCardFromList(chooseCardEffectProcess.GetCanChooseCardList()));
                }
                return;
            }
            if (duelScene.GetCurrentPhaseType() == PhaseType.Draw)
            {
                duelScene.EnterPhaseType(PhaseType.Prepare);
                return;
            }
            else if (duelScene.GetCurrentPhaseType() == PhaseType.Prepare)
            {
                duelScene.EnterPhaseType(PhaseType.Main);
                return;
            }
            //在主要流程中
            else if (duelScene.GetCurrentPhaseType() == PhaseType.Main)
            {
                //先召唤怪兽
                if (GameManager.GetSingleInstance().GetUserData().opponentCanCallMonster&& CanCallMonster())
                {
                    foreach (var item in handCards)
                    {
                        DuelCardScript duelCardScript = item.GetDuelCardScript();
                        if (duelCardScript.CanCall())
                        {
                            int sacrificeMonsterNumer = item.NeedSacrificeMonsterNumer();
                            if (sacrificeMonsterNumer > 0)
                            {
                                List <CardBase> sacrificeCards = new List <CardBase>();//祭品列表

                                for (int i = 0; i < DuelRuleManager.GetMonsterAreaNumber(); i++)
                                {
                                    if (monsterCardArea[i] != null)
                                    {
                                        sacrificeCards.Add(monsterCardArea[i]);
                                        sacrificeMonsterNumer -= monsterCardArea[i].GetCanBeSacrificedNumber();
                                        if (sacrificeMonsterNumer <= 0)
                                        {
                                            break;
                                        }
                                    }
                                }
                                CardGameState nextCardGameState = ThinkCallMonsterCardGameState(item);

                                CallMonsterEffectProcess callMonsterEffectProcess = new CallMonsterEffectProcess(item, nextCardGameState, sacrificeCards, this);
                                AddEffectProcess(callMonsterEffectProcess);
                            }
                            else
                            {
                                CardGameState nextCardGameState = ThinkCallMonsterCardGameState(item);

                                CallMonsterEffectProcess callMonsterEffectProcess = new CallMonsterEffectProcess(item, nextCardGameState, this);
                                AddEffectProcess(callMonsterEffectProcess);
                            }
                            return;
                        }
                    }
                }
                //然后使用魔法卡
                else if (GameManager.GetSingleInstance().GetUserData().opponentCanLaunchEffect&& CanLanuchMagicCard())
                {
                    foreach (var item in magicTrapCardArea)
                    {
                        if (item != null && item.CanLaunchEffect())
                        {
                            LaunchEffect(item);
                            return;
                        }
                    }
                    foreach (var item in GetHandCards())
                    {
                        if (item.CanLaunchEffect())
                        {
                            LaunchEffect(item);
                            return;
                        }
                    }
                }
                //最后进入战斗流程
                else if (GameManager.GetSingleInstance().GetUserData().opponentCanAttack&& CanEnterBattlePhaseType())
                {
                    Battle();
                    return;
                }
            }
            else if (duelScene.GetCurrentPhaseType() == PhaseType.Battle)
            {
                //先判断是否存在可以进行攻击的怪兽,并选出攻击力最大的怪兽先进行攻击
                int canAttackMonsterIndex = -1;
                int maxAttackValue        = 0;
                for (int i = 0; i < DuelRuleManager.GetMonsterAreaNumber(); i++)
                {
                    if (monsterCardArea[i] != null && monsterCardArea[i].CanAttack() && monsterCardArea[i].GetAttackValue() > maxAttackValue)
                    {
                        canAttackMonsterIndex = i;
                        maxAttackValue        = monsterCardArea[i].GetAttackValue();
                    }
                }

                //没有的话进入第二主要回合或回合结束
                if (canAttackMonsterIndex == -1)
                {
                    duelScene.EnterPhaseType(PhaseType.Second);
                    return;
                }
                else
                {
                    CardBase canAttackMonster = monsterCardArea[canAttackMonsterIndex];
                    //如果对方没有可以受攻击的怪兽时,进行直接攻击
                    if (!GetOpponentPlayer().HaveBeAttackedMonster() &&
                        GetCanDirectAttack() &&
                        GetOpponentPlayer().CanBeDirectAttacked() &&
                        canAttackMonster.CanDirectAttack())
                    {
                        AttackEffectProcess attackEffectProcess = new AttackEffectProcess(canAttackMonster, null, this);
                        AddEffectProcess(attackEffectProcess);
                        return;
                    }

                    //如果当前怪兽攻击力,比对方场上表侧表示的怪兽最小的攻击力或守备力大的话进行攻击
                    //如果对方存在里侧表示的怪兽时进行攻击
                    //以上皆不满足的话退出战斗流程
                    foreach (var item in GetOpponentPlayer().GetMonsterCardArea())
                    {
                        bool attackThisMonster = false;
                        if (item != null && item.CanBeAttacked())
                        {
                            if (item.GetCardGameState() == CardGameState.FrontAttack)
                            {
                                if (maxAttackValue >= item.GetAttackValue())
                                {
                                    attackThisMonster = true;
                                }
                            }
                            else if (item.GetCardGameState() == CardGameState.FrontDefense)
                            {
                                if (maxAttackValue >= item.GetDefenseValue())
                                {
                                    attackThisMonster = true;
                                }
                            }
                            else if (item.GetCardGameState() == CardGameState.Back)
                            {
                                attackThisMonster = true;
                            }
                        }

                        if (attackThisMonster)
                        {
                            AttackEffectProcess attackEffectProcess = new AttackEffectProcess(canAttackMonster, item, this);
                            AddEffectProcess(attackEffectProcess);
                            return;
                        }
                    }
                    return;
                }
            }
            else if (duelScene.GetCurrentPhaseType() == PhaseType.End)
            {
            }
            if (duelScene.GetCurrentPhaseType() == PhaseType.Main ||
                duelScene.GetCurrentPhaseType() == PhaseType.Battle ||
                duelScene.GetCurrentPhaseType() == PhaseType.Second)
            {
                EndTurn();
            }
        }