Ejemplo n.º 1
0
        public void startRemoteGame(ClientManager client, GameOption option, THHRoomPlayerInfo[] players)
        {
            game = new THHGame(option, getManager <CardManager>().GetCardDefines())
            {
                answers  = new GameObject(nameof(AnswerManager)).AddComponent <AnswerManager>(),
                triggers = new GameObject(nameof(TriggerManager)).AddComponent <TriggerManager>(),
                time     = new GameObject(nameof(TimeManager)).AddComponent <TimeManager>(),
                logger   = new ULogger()
            };
            (game.answers as AnswerManager).client = client;

            foreach (var info in players)
            {
                checkDeckValid(info.deck);

                THHPlayer player = game.createPlayer(info.id, info.name, game.getCardDefine(info.deck[0]) as MasterCardDefine,
                                                     info.deck.Skip(1).Select(id => game.getCardDefine(id)));
                if (client.id == info.id)
                {
                    displayGameUI(player);
                }
            }
            game.triggers.onEventAfter += onEventAfter;
            gameTask = game.run();
        }
Ejemplo n.º 2
0
        protected void Update()
        {
            if (player == null)
            {
                return;
            }

            if (canControl)
            {
                TurnEndButton.interactable = true;
                TurnEndButton.GetComponent <Image>().color = Color.white;
            }
            else
            {
                TurnEndButton.interactable = false;
                TurnEndButton.GetComponent <Image>().color = Color.gray;
            }

            THHPlayer opponent = game.getOpponent(player);

            if (opponent == null)
            {
                return;
            }
        }
Ejemplo n.º 3
0
        public void update(THHPlayer player, TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            Table table = GetComponentInParent <Table>();

            if (skin != null)
            {
                Image.sprite = skin.image;
            }
            AttackText.text = card.getAttack().ToString();
            HpText.text     = card.getCurrentLife().ToString();

            if (table.selectableTargets != null && table.selectableTargets.Contains(this))
            {
                HighlightController = Highlight.Yellow;
            }
            else if (table.player == player && table.game.currentPlayer == player && card.canAttack(table.game))
            {
                HighlightController = Highlight.Green;
            }
            else
            {
                HighlightController = Highlight.None;
            }
            getChild("Root").getChild("Taunt").gameObject.SetActive(card.isTaunt());
            getChild("Root").getChild("Shield").gameObject.SetActive(card.isShield());
        }
Ejemplo n.º 4
0
 /// <summary>
 /// 显示游戏UI,并指定本地玩家
 /// </summary>
 /// <param name="localPlayer"></param>
 private void displayGameUI(THHPlayer localPlayer)
 {
     //本地玩家用UI
     _ui.display(_ui.Game);
     getManager <TableManager>().setGame(game, localPlayer);
     _ui.Game.Table.setGame(game, localPlayer);
 }
Ejemplo n.º 5
0
 public void update(THHPlayer player)
 {
     if (player.deck.count == 0)
     {
         //我没有卡牌了!
     }
 }
Ejemplo n.º 6
0
        public void ElusiveTest()
        {
            THHGame game = TestGameflow.initGameWithoutPlayers(null, new GameOption()
            {
                shuffle = false
            });
            THHPlayer defaultPlayer = game.createPlayer(0, "玩家0", game.getCardDefine <TestMaster2>(), Enumerable.Repeat(game.getCardDefine <DefaultServant>() as CardDefine, 28)
                                                        .Concat(Enumerable.Repeat(game.getCardDefine <TestSpellCard>(), 2)));
            THHPlayer elusivePlayer = game.createPlayer(1, "玩家1", game.getCardDefine <TestMaster2>(), Enumerable.Repeat(game.getCardDefine <DefaultServant>() as CardDefine, 29)
                                                        .Concat(Enumerable.Repeat(game.getCardDefine <ElusiveServant>(), 1)));

            game.skipTurnUntil(() => defaultPlayer.gem >= game.getCardDefine <DefaultServant>().cost&& game.currentPlayer == defaultPlayer);
            defaultPlayer.cmdUse(game, defaultPlayer.hand.First(c => c.define.id == DefaultServant.ID), 0);

            game.skipTurnUntil(() => elusivePlayer.gem >= game.getCardDefine <ElusiveServant>().cost&& game.currentPlayer == elusivePlayer);
            elusivePlayer.cmdUse(game, elusivePlayer.hand.First(c => c.define.id == ElusiveServant.ID), 0);

            game.skipTurnUntil(() => defaultPlayer.gem >= game.getCardDefine <TestSpellCard>().cost&& game.currentPlayer == defaultPlayer);
            defaultPlayer.cmdUse(game, defaultPlayer.hand.First(c => c.define.id == TestSpellCard.ID), 0, defaultPlayer.field[0]);
            Assert.AreEqual(6, defaultPlayer.field[0].getCurrentLife(game)); //没有魔免的可以被法术指定
            defaultPlayer.cmdUse(game, defaultPlayer.hand.First(c => c.define.id == TestSpellCard.ID), 0, elusivePlayer.field[0]);
            Assert.AreEqual(3, elusivePlayer.field[0].getCurrentLife(game)); //魔免无法被法术指定

            game.skipTurnUntil(() => elusivePlayer.gem >= game.getCardDefine <TestDamageSkill>().cost&& game.currentPlayer == elusivePlayer);
            elusivePlayer.cmdUse(game, elusivePlayer.skill, 0, defaultPlayer.field[0]);
            Assert.AreEqual(5, defaultPlayer.field[0].getCurrentLife(game));//没有魔免的可以被技能指定
            elusivePlayer.cmdTurnEnd(game);

            game.skipTurnUntil(() => elusivePlayer.gem >= game.getCardDefine <TestDamageSkill>().cost&& game.currentPlayer == elusivePlayer);
            elusivePlayer.cmdUse(game, elusivePlayer.skill, 0, elusivePlayer.field[0]);
            Assert.AreEqual(3, elusivePlayer.field[0].getCurrentLife(game));//魔免无法被技能指定

            game.Dispose();
        }
Ejemplo n.º 7
0
 public static void createGame(out THHGame game, out THHPlayer you, out THHPlayer oppo, params KeyValuePair <int, int>[] yourDeck)
 {
     createGame(out game, out you, out oppo, new GameOption()
     {
         shuffle = false
     }, yourDeck);
 }
Ejemplo n.º 8
0
        /// <summary>
        /// 创建并开始本地游戏
        /// </summary>
        public void startLocalGame()
        {
            _ui.Game.GameResultDialog.hide();
            if (_useTimeAsRandomSeed)
            {
                _option.randomSeed = (int)DateTime.Now.ToBinary();
            }
            game = new THHGame(_option, getManager <CardManager>().GetCardDefines())
            {
                answers  = new GameObject(nameof(AnswerManager)).AddComponent <AnswerManager>(),
                triggers = new GameObject(nameof(TriggerManager)).AddComponent <TriggerManager>(),
                time     = new GameObject(nameof(TimeManager)).AddComponent <TimeManager>(),
                logger   = new UnityLogger()
            };
            (game.answers as AnswerManager).game = game;

            //检查卡组合法性
            int[] deck = _deck;
            checkDeckValid(deck);

            CardDefine playerMaster = game.getCardDefine(deck[0]);

            CardDefine[] playerDeck  = deck.Skip(1).Select(id => game.getCardDefine(id)).ToArray();
            THHPlayer    localPlayer = game.createPlayer(1, "本地玩家", playerMaster as MasterCardDefine,
                                                         playerDeck);
            THHPlayer aiPlayer = game.createPlayer(2, "AI", playerMaster as MasterCardDefine,
                                                   deck.Skip(1).Select(id => game.getCardDefine(id)));

            displayGameUI(localPlayer);
            //AI玩家用AI
            new AI(game, aiPlayer);
            gameTask = game.run();
        }
Ejemplo n.º 9
0
        public void freezeTest()
        {
            THHGame game = TestGameflow.initGameWithoutPlayers(null, new GameOption()
            {
                shuffle = false
            });
            THHPlayer defaultPlayer = game.createPlayer(0, "玩家0", game.getCardDefine <TestMaster2>(), Enumerable.Repeat(game.getCardDefine <DefaultServant>() as CardDefine, 30));
            THHPlayer elusivePlayer = game.createPlayer(1, "玩家1", game.getCardDefine <TestMaster2>(), Enumerable.Repeat(game.getCardDefine <DefaultServant>() as CardDefine, 28)
                                                        .Concat(Enumerable.Repeat(game.getCardDefine <TestFreeze>(), 2)));

            game.skipTurnUntil(() => defaultPlayer.gem >= game.getCardDefine <DefaultServant>().cost&& game.currentPlayer == defaultPlayer);
            defaultPlayer.cmdUse(game, defaultPlayer.hand.First(c => c.define.id == DefaultServant.ID), 0);
            //玩家0拍白板一张

            game.skipTurnUntil(() => elusivePlayer.gem >= game.getCardDefine <TestFreeze>().cost&& game.currentPlayer == elusivePlayer);
            elusivePlayer.cmdUse(game, elusivePlayer.hand.First(c => c.define.id == TestFreeze.ID), 0, defaultPlayer.field);
            //玩家1释放冰环

            game.skipTurnUntil(() => defaultPlayer.gem >= game.getCardDefine <DefaultServant>().cost&& game.currentPlayer == defaultPlayer);
            defaultPlayer.cmdAttack(game, defaultPlayer.field[0], elusivePlayer.master); //被冻结的随从无法攻击
            defaultPlayer.cmdTurnEnd(game);                                              //回合结束,随从解冻

            elusivePlayer.cmdTurnEnd(game);

            game.skipTurnUntil(() => defaultPlayer.gem >= game.getCardDefine <DefaultServant>().cost&& game.currentPlayer == defaultPlayer);
            defaultPlayer.cmdAttack(game, defaultPlayer.field[0], elusivePlayer.master);//已解除冰冻的随从可以攻击
            Assert.AreEqual(29, elusivePlayer.master.getCurrentLife(game));

            game.Dispose();
        }
Ejemplo n.º 10
0
        public IEnumerator calcActionsTest_Turn1()
        {
            THHGame   game   = TestGameflow.initGameWithoutPlayers(null, GameOption.Default);
            THHPlayer player = game.createPlayer(1, "玩家1", game.getCardDefine <TestMaster>(), Enumerable.Repeat(game.getCardDefine <TestServant>(), 30));

            game.createPlayer(2, "玩家2", game.getCardDefine <TestMaster>(), Enumerable.Repeat(game.getCardDefine <TestServant>(), 30));
            game.logger.log("Force Init");
            AI ai = new AI(game, player, false);

            _ = game.run();
            yield return(new WaitForSeconds(.1f));

            game.players[0].cmdInitReplace(game);
            game.players[1].cmdInitReplace(game);
            yield return(new WaitForSeconds(.1f));

            if (game.sortedPlayers[0] != player)
            {
                game.sortedPlayers[0].cmdTurnEnd(game);
                yield return(new WaitForSeconds(.1f));
            }
            var actions = ai.calcActions(game, player);

            Assert.AreEqual(player.hand.count, actions.Count);
            UseResponse use = actions.Keys.First() as UseResponse;

            Assert.NotNull(use);
        }
        public void update(Table table, THHPlayer self, THHPlayer player, TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            Image.sprite  = skin.image;
            CostText.text = card.getCost().ToString();
            if (card.isUsed())
            {
                IsUsedController = IsUsed.True;
            }
            else
            {
                IsUsedController = IsUsed.False;
            }
            if (player == self &&
                card.isUsable(table.game, player, out _) &&//技能是可用的
                table.selectableTargets == null   //没有在选择目标
                )
            {
                IsUsableController    = IsUsable.True;
                asButton.interactable = true;
            }
            else
            {
                IsUsableController    = IsUsable.False;
                asButton.interactable = false;
            }
        }
Ejemplo n.º 12
0
        /// <summary>
        /// 创建并开始本地游戏
        /// </summary>
        public void startLocalGame()
        {
            game = new THHGame(_option, getManager <CardManager>().GetCardDefines())
            {
                answers  = new GameObject(nameof(AnswerManager)).AddComponent <AnswerManager>(),
                triggers = new GameObject(nameof(TriggerManager)).AddComponent <TriggerManager>(),
                time     = new GameObject(nameof(TimeManager)).AddComponent <TimeManager>(),
                logger   = new UnityLogger()
            };
            (game.answers as AnswerManager).game = game;

            //检查卡组合法性
            int[] deck = _deck;
            checkDeckValid(deck);

            THHPlayer localPlayer = game.createPlayer(1, "本地玩家", game.getCardDefine(deck[0]) as MasterCardDefine,
                                                      deck.Skip(1).Select(id => game.getCardDefine(id)));
            THHPlayer aiPlayer = game.createPlayer(2, "AI", game.getCardDefine(deck[0]) as MasterCardDefine,
                                                   deck.Skip(1).Select(id => game.getCardDefine(id)));

            displayGameUI(localPlayer);
            //AI玩家用AI
            new AI(game, aiPlayer);

            game.triggers.onEventAfter += onEventAfter;
            gameTask = game.run();
        }
Ejemplo n.º 13
0
        public override bool update(Table table)
        {
            table.SelfMaster.update(table, table.player, table.player.master, table.getSkin(table.player.master));
            THHPlayer opponent = table.game.getOpponent(table.player);

            table.EnemyMaster.update(table, opponent, opponent.master, table.getSkin(opponent.master));
            return(true);
        }
Ejemplo n.º 14
0
 float calcFreezeValue(THHGame game, THHPlayer player, THHPlayer opponent, Card target)
 {
     if (target == opponent.master || opponent.field.Contains(target))
     {
         return(target.getAttack(game));
     }
     return(0);
 }
Ejemplo n.º 15
0
 public AI(THHGame game, THHPlayer player, bool autoRun = true)
 {
     this.game   = game;
     this.player = player;
     if (autoRun)
     {
         run(game);
     }
 }
Ejemplo n.º 16
0
        static async Task effect(THHGame game, Card card)
        {
            THHPlayer opponent = game.getOpponent(card.getOwner());

            for (int i = 0; i < opponent.field.count; i++)
            {
                await card.getOwner().createToken(game, game.getCardDefine <DustElement>());
            }
            await Patchouli.tryMix(game, card);
        }
Ejemplo n.º 17
0
        public override bool update(TableManager table, THHGame.InitEventArg eventArg)
        {
            table.setMaster(table.ui.SelfMaster, table.player.master);
            table.setSkill(table.ui.SelfSkill, table.player.skill);
            THHPlayer opponent = table.game.getOpponent(table.player);

            table.setMaster(table.ui.EnemyMaster, opponent.master);
            table.setSkill(table.ui.EnemySkill, opponent.skill);
            return(true);
        }
Ejemplo n.º 18
0
 public void setGame(THHGame game, THHPlayer player)
 {
     InitReplaceDialog.hide();
     TurnTipImage.hide();
     SelfHandList.clearItems();
     SelfFieldList.clearItems();
     EnemyFieldList.clearItems();
     EnemyHandList.clearItems();
     AttackArrowImage.hide();
     Fatigue.hide();
 }
Ejemplo n.º 19
0
        /// <summary>
        /// 设置游戏对象和玩家并初始化UI
        /// </summary>
        /// <param name="game"></param>
        /// <param name="player"></param>
        public void setGame(THHGame game, THHPlayer player)
        {
            ui.onClickNoWhere.set(onClickNoWhere);
            ui.InitReplaceDialog.hide();
            ui.TurnTipImage.hide();
            initMaster(ui.SelfMaster);
            ui.SelfGem.Text.text = "0";
            ui.SelfSkill.asButton.onClick.set(onClickSkill);
            ui.SelfSkill.onDrag.set(onDragSkill);
            ui.SelfSkill.onDragEnd.set(onDragSkillEnd);
            ui.SelfItem.hide();
            ui.SelfHandList.clearItems();
            ui.SelfHandList.asButton.onClick.set(() =>
            {
                if (ui.SelfHandList.isExpanded)
                {
                    ui.SelfHandList.shrink();
                }
                else
                {
                    ui.SelfHandList.expand();
                }
            });
            ui.SelfFieldList.clearItems();
            ui.TurnEndButton.onClick.set(onTurnEndButtonClick);
            ui.TipText.hide();
            initMaster(ui.EnemyMaster);
            ui.EnemyGem.Text.text = "0";
            ui.EnemyItem.hide();
            ui.EnemyFieldList.clearItems();
            ui.EnemyHandList.clearItems();
            ui.AttackArrowImage.hide();
            ui.Fatigue.hide();
            ui.Discover.ButtonButtonBlack.asButton.onClick.set(onDiscoverHideButtonClick);
            ui.Discover.hide();
            _animationQueue.Clear();

            if (game != null)
            {
                game.triggers.onEventBefore -= onEventBefore;
                game.triggers.onEventAfter  -= onEventAfter;
                game.answers.onRequest      -= onRequest;
                game.answers.onResponse     -= onResponse;
            }
            this.game = game;
            if (game != null)
            {
                game.triggers.onEventBefore += onEventBefore;
                game.triggers.onEventAfter  += onEventAfter;
                game.answers.onRequest      += onRequest;
                game.answers.onResponse     += onResponse;
            }
            this.player = player;
        }
Ejemplo n.º 20
0
        float calcRandomDamageValue(THHGame game, THHPlayer player, THHPlayer opponent, IEnumerable <Card> targets, int damage)
        {
            float value = 0;

            foreach (var target in targets)
            {
                value += calcDamageValue(game, player, opponent, target, damage);
            }
            value /= targets.Count();
            return(value);
        }
Ejemplo n.º 21
0
        static async Task effect(THHGame game, Card card)
        {
            THHPlayer opponent = game.getOpponent(card.getOwner());

            if (opponent.field.count > 0)
            {
                return;
            }
            await opponent.field.randomTake(game, 1).damage(game, card, 2);

            await Patchouli.tryMix(game, card);
        }
Ejemplo n.º 22
0
        public Response calcNextAction(THHGame game, THHPlayer player)
        {
            var actions = calcActions(game, player);

            if (actions.Count > 0)
            {
                return(actions.OrderByDescending(p => p.Value).First().Key);
            }
            else
            {
                return(new TurnEndResponse());
            }
        }
Ejemplo n.º 23
0
        float calcDamageValue(THHGame game, THHPlayer player, THHPlayer opponent, Card target, int damage)
        {
            float value = 0;

            if (target == opponent.master)
            {
                value = target.getCurrentLife(game) > damage ? damage : float.MaxValue;
            }
            else if (opponent.field.Contains(target))
            {
                value = target.getCurrentLife(game) > damage?target.getAttack(game) * damage : target.getAttack(game) * target.getCurrentLife(game) + 1;
            }
            return(value);
        }
Ejemplo n.º 24
0
        public void setGame(THHGame game, THHPlayer player)
        {
            InitReplaceDialog.hide();
            TurnTipImage.hide();
            SelfHandList.clearItems();
            SelfFieldList.clearItems();
            EnemyFieldList.clearItems();
            EnemyHandList.clearItems();
            AttackArrowImage.hide();
            Fatigue.hide();
            _animationQueue.Clear();

            if (game != null)
            {
                game.triggers.onEventBefore -= onEventBefore;
                game.triggers.onEventAfter  -= onEventAfter;
            }
            this.game = game;
            if (game != null)
            {
                game.triggers.onEventBefore += onEventBefore;
                game.triggers.onEventAfter  += onEventAfter;
            }
            if (player != null)
            {
                SelfSkill.asButton.onClick.RemoveAllListeners();
                TurnEndButton.onClick.RemoveAllListeners();
            }
            this.player = player;
            if (player != null)
            {
                SelfSkill.asButton.onClick.AddListener(() =>
                {
                    if (selectableTargets != null)
                    {
                        return;
                    }
                    player.cmdUse(game, SelfSkill.card, 0);
                });
                TurnEndButton.onClick.AddListener(() =>
                {
                    player.cmdTurnEnd(game);

                    //SelfHandList.stopPlacing(true);
                    resetUse(true, true);
                    selectableTargets = null;
                });
            }
        }
Ejemplo n.º 25
0
        float calcBuffValue(THHGame game, THHPlayer player, THHPlayer opponent, Card target, int attack, int life)
        {
            float value = 0;

            if (target == player.master)
            {
                value = attack * target.getCurrentLife(game) + life;
            }
            else if (player.field.Contains(target))
            {
                value = calcServantValue(game, player, opponent, target.getAttack(game) + attack, target.getCurrentLife(game) + life)
                        - calcServantValue(game, player, opponent, target.getAttack(game), target.getLife(game));
            }
            return(value);
        }
Ejemplo n.º 26
0
        public IEnumerator run_InitReplaceTest()
        {
            THHGame   game   = TestGameflow.initGameWithoutPlayers(null, GameOption.Default);
            THHPlayer player = game.createPlayer(1, "玩家1", game.getCardDefine <TestMaster>(), Enumerable.Repeat(game.getCardDefine <TestServant>(), 30));

            game.createPlayer(2, "玩家2", game.getCardDefine <TestMaster>(), Enumerable.Repeat(game.getCardDefine <TestServant>(), 30));
            AI ai = new AI(game, player);

            _ = game.run();
            yield return(new WaitForSeconds(.1f));

            game.players[1].cmdInitReplace(game);
            yield return(new WaitForSeconds(1f));

            Assert.True(game.triggers.getRecordedEvents().Any(e => e is THHGame.StartEventArg));
        }
Ejemplo n.º 27
0
        public static async Task tryMix(THHGame game, Card card)
        {
            THHPlayer player       = card.getOwner();
            var       mixableCards = player.hand.Where(c => getMixCards(game, card.define, c.define).Length > 0).ToArray();//检查手牌中有没有可以融合的牌

            if (mixableCards.Length > 0)
            {
                var mixCard = await player.discover(game, mixableCards, -1, "选择一张卡片进行元素融合");

                var mixedResults = getMixCards(game, card.define, mixCard.define).Select(define => game.createCard(define)).ToArray();
                var mixedResult  = await player.discover(game, mixedResults, -1, "选择一张融合元素法术加入你的手牌");

                await player.discard(game, mixCard);

                await player.tryAddCardToHand(game, mixedResult);
            }
        }
Ejemplo n.º 28
0
        public static string replace(string desc, THHGame game, THHPlayer player, TouhouCardEngine.Card card)
        {
            string result = Regex.Replace(desc, @"{(?<obj>\w+):(?<name>.+)}", m =>
            {
                string obj  = m.Groups["obj"].Value;
                string name = m.Groups["name"].Value;
                if (obj == "card")
                {
                    return(card.getProp(game, name).ToString());
                }
                else
                {
                    return("???");
                }
            });

            return(result);
        }
Ejemplo n.º 29
0
        static async Task effect(THHGame game, Card card)
        {
            THHPlayer player   = card.getOwner();
            THHPlayer opponent = game.getOpponent(player);
            await opponent.field.damage(game, card, player.getSpellDamage(game, 2));

            foreach (Card target in opponent.field)
            {
                if (target.isDead(game))
                {
                    if (player.field.count > 0)
                    {
                        await player.field.random(game).addBuff(game, new GeneratedBuff(ID, new AttackModifier(1), new LifeModifier(1)));
                    }
                }
            }
            await Patchouli.tryMix(game, card);
        }
Ejemplo n.º 30
0
        public void update(Table table, THHPlayer player, TouhouCardEngine.Card card, CardSkinData skin)
        {
            this.card = card;

            Image.sprite = skin.image;
            HpText.text  = card.getCurrentLife().ToString();
            //if (card.getCurrentLife() == card.getLife())
            //    HpText.color = Color.white;
            //else
            //    HpText.color = Color.red;
            if (card.getAttack() > 0)
            {
                AttackText.text    = card.getAttack().ToString();
                AttackText.enabled = true;
            }
            else
            {
                AttackText.enabled = false;
            }
            if (card.getArmor() > 0)
            {
                ArmorText.text    = card.getArmor().ToString();
                ArmorText.enabled = true;
            }
            else
            {
                ArmorText.enabled = false;
            }

            if (table.selectableTargets != null && table.selectableTargets.Contains(this))
            {
                HighlightController = Highlight.Yellow;
            }
            else if (table.player == player && table.game.currentPlayer == player && card.canAttack(table.game, player))
            {
                HighlightController = Highlight.Green;
            }
            else
            {
                HighlightController = Highlight.None;
            }
        }