Esempio n. 1
0
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            Room room = ai.Room;
            List <ScoreStruct> scores = new List <ScoreStruct>();

            foreach (Player p in ai.GetEnemies(player))
            {
                if (!p.Chained && RoomLogic.CanBeChainedBy(room, p, player))
                {
                    ScoreStruct score = ai.FindCards2Discard(player, p, string.Empty, "he", HandlingMethod.MethodDiscard);
                    score.Players = new List <Player> {
                        p
                    };
                    scores.Add(score);
                }
            }

            if (scores.Count > 0)
            {
                ai.CompareByScore(ref scores);
                if (scores[0].Score > 0)
                {
                    use.Card = card;
                    use.To   = scores[0].Players;
                }
            }
        }
Esempio n. 2
0
        public override int AskForCardChosen(Player who, string flags, string reason, HandlingMethod method, List <int> disabled_ids)
        {
            SkillEvent e = Engine.GetSkillEvent(reason);

            if (e != null)
            {
                List <int> result = e.OnCardsChosen(this, self, who, flags, 1, 1, disabled_ids);
                if (result != null && result.Count == 1)
                {
                    return(result[0]);
                }
            }

            UseCard c = Engine.GetCardUsage(reason);

            if (c != null)
            {
                List <int> result = c.OnCardsChosen(this, self, who, flags, 1, 1, disabled_ids);
                if (result != null && result.Count == 1)
                {
                    return(result[0]);
                }
            }

            ScoreStruct score = FindCards2Discard(self, who, string.Empty, flags, method, 1, false, disabled_ids);

            if (score.Ids != null && score.Ids.Count == 1)
            {
                return(score.Ids[0]);
            }

            return(-1);
        }
Esempio n. 3
0
    private float GetScore(ScoreStruct scoreStruct, int champs)
    {
        switch (champs)
        {
        case 0:
            return(scoreStruct.NoChampScore);

        case 1:
            return(scoreStruct.OneChampScore);

        case 2:
            return(scoreStruct.TwoChampScore);

        case 3:
            return(scoreStruct.ThreeChampScore);

        case 4:
            return(scoreStruct.FourChampScore);

        case 5:
            return(scoreStruct.FiveChampScore);
        }

        return(0);
    }
Esempio n. 4
0
        public static void RankingManage(ref ScoreStruct scoreData, int score, ClearType clear)
        {
            if (scoreData.scoreRanking == null)
            {
                scoreData.scoreRanking    = new RankingStruct[1];
                scoreData.scoreRanking[0] = new RankingStruct(StaticValue.playerName, score, clear);

                return;
            }

            int rankingCount = scoreData.scoreRanking.Length;

            if (rankingCount < Constant.rankingLength)
            {
                Array.Resize(ref scoreData.scoreRanking, rankingCount + 1);

                RankingStruct rankingData = new RankingStruct(StaticValue.playerName, score, clear);
                scoreData.scoreRanking[rankingCount] = rankingData;
            }
            else if (scoreData.scoreRanking[rankingCount - 1].score < score)
            {
                RankingStruct rankingData = new RankingStruct(StaticValue.playerName, score, clear);
                scoreData.scoreRanking[rankingCount - 1] = rankingData;
            }

            Array.Sort(scoreData.scoreRanking, (x, y) => y.score - x.score);
        }
Esempio n. 5
0
 public static void Clear()
 {
     for (int i = 0; i < numOfRecords; ++i)
     {
         s_Entries[i] = new ScoreStruct(0);
     }
     SaveScores();
 }
Esempio n. 6
0
 public override bool CheckClear(ScoreStruct getScore)
 {
     if (getScore.DeleteNum >= nowNorm)
     {
         return(true);
     }
     return(false);
 }
Esempio n. 7
0
 public override bool CheckClear(ScoreStruct getScore)
 {
     scoreSum += getScore.GainScore;
     if (scoreSum >= nowNorm)
     {
         return(true);
     }
     return(false);
 }
Esempio n. 8
0
        public override ScoreStruct GetDamageScore(TrustedAI ai, DamageStruct damage)
        {
            ScoreStruct score = new ScoreStruct
            {
                Score = 0
            };

            if (damage.To != null && ai.HasSkill(Name, damage.To) && damage.Card != null)
            {
                score.Score = 1.2;
                FunctionCard fcard = Engine.GetFunctionCard(damage.Card.Name);
                if (!(fcard is SkillCard))
                {
                    foreach (int id in damage.Card.SubCards)
                    {
                        double value = Math.Max(ai.GetUseValue(id, damage.To, Player.Place.PlaceHand), ai.GetKeepValue(id, damage.To, Player.Place.PlaceHand));
                        score.Score += value * 0.45;
                    }

                    if (ai.WillSkipPlayPhase(damage.To))
                    {
                        score.Score /= 3;
                    }

                    if (damage.Damage >= damage.To.Hp)
                    {
                        score.Score /= 2;
                    }

                    if (damage.From != null && damage.From == damage.To && score.Score > 0)
                    {
                        score.Score /= 4;
                    }
                }

                if (damage.Damage > 1)
                {
                    score.Score /= 1.5;
                }
                if (ai.WillSkipPlayPhase(damage.To))
                {
                    score.Score /= 1.5;
                }

                if (ai.IsEnemy(damage.To))
                {
                    score.Score = -score.Score;
                }
                else
                {
                    score.Score -= 1.5;
                }
            }

            return(score);
        }
Esempio n. 9
0
 public static void SaveHighScores(List <ScoreStruct> list)
 {
     SortHighScores(list);
     for (int i = 0; i < GamePlayManager.MAX_HIGHSCORE; i++)
     {
         ScoreStruct s = list[i];
         PlayerPrefs.SetInt(GamePlayManager.HIGHSCORENUMBER + i, s.score);
         PlayerPrefs.SetString(GamePlayManager.HIGHSCORENAME + i, s.name);
     }
 }
Esempio n. 10
0
    public bool MissionCheck(ScoreStruct score)
    {
        var toNext = nowMissions[0].CheckClear(score);

        if (toNext)
        {
            Pop();
        }
        return(toNext);
    }
Esempio n. 11
0
    public bool MissionCheck(ScoreStruct score)
    {
        var cleared = missionManager.MissionCheck(score);

        if (cleared)
        {
            UpdateContent();
            clearParticle.Play();
        }
        return(cleared);
    }
Esempio n. 12
0
        public override ScoreStruct GetDamageScore(TrustedAI ai, DamageStruct damage)
        {
            ScoreStruct score = new ScoreStruct
            {
                Score = 0
            };

            if (ai.HasSkill(Name, damage.To) && damage.Damage <= damage.To.Hp)
            {
                double value = 0;
                if (!damage.To.FaceUp && damage.Damage == 1)
                {
                    value += 4;
                }
                Room room = ai.Room;
                foreach (Player p in room.GetOtherPlayers(damage.To))
                {
                    if (RoomLogic.CanGetCard(room, damage.To, p, "hej"))
                    {
                        value += 0.3;
                        if (ai.IsEnemy(damage.To, p))
                        {
                            if (!p.IsNude())
                            {
                                value += 0.5;
                            }
                            else
                            {
                                value -= 1;
                            }
                        }
                    }
                }
                if (damage.Damage > 1)
                {
                    value *= (0.6 * (damage.Damage - 1)) + 1;
                }
                if (value > 0 && damage.Damage >= damage.To.Hp)
                {
                    value /= 2;
                }

                if (!ai.IsFriend(damage.To))
                {
                    value = -value;
                }

                score.Score = value;
            }

            return(score);
        }
Esempio n. 13
0
        public override CardUseStruct OnResponding(TrustedAI ai, Player player, string pattern, string prompt, object data)
        {
            Room          room   = ai.Room;
            Player        caocao = room.FindPlayer(prompt.Split(':')[1]);
            CardUseStruct use    = new CardUseStruct(null, player, new List <Player>());

            if (caocao != null && ai.IsFriend(caocao))
            {
                object       reason = room.GetTag("current_Jink");
                DamageStruct damage = new DamageStruct();
                if (reason is SlashEffectStruct slash)
                {
                    damage.From   = slash.From;
                    damage.To     = slash.To;
                    damage.Card   = slash.Slash;
                    damage.Damage = slash.Drank + 1;
                    damage.Nature = DamageStruct.DamageNature.Normal;
                    if (damage.Card.Name == FireSlash.ClassName)
                    {
                        damage.Nature = DamageStruct.DamageNature.Fire;
                    }
                    else if (damage.Card.Name == ThunderSlash.ClassName)
                    {
                        damage.Nature = DamageStruct.DamageNature.Thunder;
                    }
                }
                else if (reason is CardEffectStruct effect)
                {
                    damage.From   = effect.From;
                    damage.To     = effect.To;
                    damage.Card   = effect.Card;
                    damage.Damage = 1;
                    damage.Nature = DamageStruct.DamageNature.Normal;
                }

                List <WrappedCard> jinks = ai.GetCards("Jink", player);
                ScoreStruct        score = ai.GetDamageScore(damage);
                if (score.Score < -5 && jinks.Count > 0)
                {
                    use.Card = jinks[0];
                }
                else if (score.Score < 0 && jinks.Count > 1)
                {
                    use.Card = jinks[0];
                }
            }

            return(use);
        }
Esempio n. 14
0
        public override List <int> OnExchange(TrustedAI ai, Player player, string pattern, int min, int max, string pile)
        {
            Room room = ai.Room;

            if (room.GetTag(Name) is DamageStruct damage)
            {
                ScoreStruct score = ai.GetDamageScore(damage, DamageStruct.DamageStep.Done);
                if (ai.IsEnemy(damage.To))
                {
                    List <int> ids = new List <int>();
                    foreach (int id in player.GetCards("h"))
                    {
                        WrappedCard card = room.GetCard(id);
                        if (Engine.MatchExpPattern(room, pattern, player, card) && (card.Name != Peach.ClassName && card.Name != Analeptic.ClassName || damage.Damage > 1))
                        {
                            ids.Add(id);
                        }
                    }
                    if (ids.Count > 0)
                    {
                        List <double> values = ai.SortByKeepValue(ref ids, false);
                        if (values[0] < score.Score)
                        {
                            return new List <int> {
                                       ids[0]
                            }
                        }
                        ;
                        if (player == room.Current)
                        {
                            values = ai.SortByUseValue(ref ids, false);

                            if (values[0] < score.Score)
                            {
                                return new List <int> {
                                           ids[0]
                                }
                            }
                            ;
                        }
                    }
                }
            }

            return(new List <int>());
        }
    }
Esempio n. 15
0
        public override ScoreStruct GetDamageScore(TrustedAI ai, DamageStruct damage)
        {
            ScoreStruct score = new ScoreStruct();

            score.Score = 0;
            if (damage.From != null && damage.From != damage.To && ai.HasSkill(Name, damage.To) && !damage.To.HasFlag(Name) && !ai.IsFriend(damage.From, damage.To) && !damage.To.IsKongcheng())
            {
                if (ai.IsFriend(damage.To))
                {
                    score.Score += 3;
                }
                else if (ai.IsFriend(damage.From))
                {
                    score.Score -= 3;
                }
            }
            return(score);
        }
Esempio n. 16
0
    public static void SaveScore(string name, uint score)
    {
        ScoreStruct newScore = new ScoreStruct {
            Name = name, Score = score
        };
        List <ScoreStruct> CurrentScore = new List <ScoreStruct>();

        if (System.IO.File.Exists(Application.dataPath + scoreFileName))
        {
            CurrentScore = JsonUtility.FromJson <List <ScoreStruct> >(Application.dataPath + scoreFileName);
        }

        CurrentScore.Add(newScore);
        CurrentScore.OrderByDescending(value => value.Score);

        if (CurrentScore.Count > 10)
        {
            CurrentScore.RemoveRange(10, CurrentScore.Count - 11);
        }
    }
Esempio n. 17
0
        public override ScoreStruct GetDamageScore(TrustedAI ai, DamageStruct damage)
        {
            ScoreStruct score = new ScoreStruct
            {
                Score = 0
            };

            if (damage.To != null && ai.HasSkill(Name, damage.To))
            {
                int n = ai.DamageEffect(damage, DamageStruct.DamageStep.Done);
                if (n < damage.To.Hp || damage.To.Removed)
                {
                    score.Score = 4 * damage.Damage;
                }

                double numerator = 0.6;
                if (!ai.WillSkipPlayPhase(damage.To))
                {
                    numerator += 0.3;
                }
                foreach (Player p in ai.GetFriends(damage.To))
                {
                    if (p != damage.To && !ai.WillSkipPlayPhase(p))
                    {
                        numerator += 0.1;
                    }
                }
                score.Score *= numerator;

                if (ai.IsEnemy(damage.To))
                {
                    score.Score = -score.Score;
                }
                else
                {
                    score.Score -= 1.5;
                }
            }

            return(score);
        }
        public override List <int> OnExchange(TrustedAI ai, Player player, string pattern, int min, int max, string pile)
        {
            Room room = ai.Room;

            if (room.GetTag(Name) is DamageStruct damage)
            {
                ScoreStruct score = ai.GetDamageScore(damage);
                damage.Damage++;
                ScoreStruct _score = ai.GetDamageScore(damage);
                if (_score.Score - score.Score > 3)
                {
                    List <int> ids = new List <int>();
                    foreach (int id in player.GetCards("h"))
                    {
                        if (!RoomLogic.CanDiscard(room, player, player, id))
                        {
                            continue;
                        }
                        WrappedCard  card  = room.GetCard(id);
                        FunctionCard fcard = Engine.GetFunctionCard(card.Name);
                        if (fcard is Slash || fcard is Weapon)
                        {
                            ids.Add(id);
                        }
                    }

                    if (ids.Count > 0)
                    {
                        ai.SortByUseValue(ref ids, false);
                        return(new List <int> {
                            ids[0]
                        });
                    }
                }
            }

            return(new List <int>());
        }
Esempio n. 19
0
    /// <summary>
    /// 设置查叫显示
    /// </summary>
    /// <param name="flowSemList"></param>
    /// <returns></returns>
    IEnumerator SetChatJiaoIenum(List <FlowSemStruct> flowSemList)
    {
        int seatId = 0;

        for (int i = 0; i < flowSemList.Count; i++)
        {
            FlowSemStruct chajiaoInfo = flowSemList[i]; //要查叫的玩家
            seatId = chajiaoInfo.seatId;                //被查叫的玩家id
            if (chajiaoInfo.effList == null)
            {
                continue;
            }
            for (int j = 0; j < flowSemList[i].effList.Count; j++)//被查叫玩家查叫类型
            {
                effStruct efstruct = chajiaoInfo.effList[j];
                eEff      etype    = (eEff)efstruct.type;//查叫类型
                for (int k = 0; k < efstruct.scoreList.Count; k++)
                {
                    ScoreStruct scoredata = efstruct.scoreList[k]; //受影响的玩家
                                                                   //显示分数
                    if (seatId == scoredata.seatId)
                    {
                        mAllPlayer[MJGameModel.Inst.mnewSeatToIndex[scoredata.seatId]].SetChajiaoScores(scoredata.seatId, etype, scoredata.score);
                    }
                    else
                    {
                        mAllPlayer[MJGameModel.Inst.mnewSeatToIndex[scoredata.seatId]].SetChajiaoScores(scoredata.seatId, eEff.NONE, scoredata.score);
                    }
                }
                yield return(new WaitForSeconds(1f));

                SetChatjiaoScoresHide();
            }
        }
        ServerSettlement(MJGameModel.Inst.mSettlData);
        SetChatjiaoScoresHide();
    }
Esempio n. 20
0
        /// <summary>
        /// スコアデータを更新する
        /// </summary>
        /// <param name="musicName"></param>
        /// <param name="score"></param>
        /// <param name="difficulty"></param>
        /// <param name="clearType"></param>
        /// <returns></returns>
        public static IEnumerator WriteScoreDataFromResult(string musicName, int score, Difficulty difficulty, ClearType clearType)
        {
            int             chartElement = (int)difficulty;
            ScoreDataStruct scoreData    = null;

            if (Constant.CompareEnv(GameEnvironment.local))
            {
                scoreData = LoadScoreData(musicName);
            }
            else if (Constant.CompareEnv(GameEnvironment.webGL))
            {
                bool isFinish = false;
                NCMBQuery <NCMBObject> query = new NCMBQuery <NCMBObject>("MusicData");
                query.WhereEqualTo("musicName", musicName);
                query.Limit = 1;
                query.FindAsync((List <NCMBObject> objList, NCMBException e) =>
                {
                    if (e != null)
                    {
                        isFinish = true;
                        Debug.LogError(e);
                    }
                    else
                    {
                        string scoreJson = Convert.ToString(objList[0]["scoreData"]);
                        scoreData        = JsonUtility.FromJson <ScoreDataStruct>(scoreJson);
                        isFinish         = true;
                    }
                });
                // 取得が完了するまで待機
                while (!isFinish)
                {
                    yield return(null);
                }
            }

            if (scoreData == null)
            {
                yield break;
            }

            ScoreStruct scoreStruct = scoreData.scores[chartElement];

            if (scoreData == null)
            {
                scoreData = new ScoreDataStruct();
            }

            if (scoreStruct.bestScore < score)
            {
                scoreData.scores[chartElement].bestScore = score;
            }
            if (scoreStruct.clearType < clearType)
            {
                scoreData.scores[chartElement].clearType = clearType;
            }
            if (clearType > ClearType.Failed)
            {
                scoreData.scores[chartElement].clearCount++;
            }

            scoreData.scores[chartElement].playCount++;
            RankingManage(ref scoreData.scores[chartElement], score, clearType);

            string scoreDataJson = JsonUtility.ToJson(scoreData);

            if (Constant.CompareEnv(GameEnvironment.local))
            {
                string filePath = Application.streamingAssetsPath + Constant.musicDataDirectory + "/" + musicName;

                if (!Directory.Exists(filePath))
                {
                    yield break;
                }

                string dataFilePath = filePath + "/" + musicName + Constant.scoreExtension;

                File.WriteAllText(dataFilePath, scoreDataJson);
            }
            else if (Constant.CompareEnv(GameEnvironment.webGL))
            {
                bool isFinish = false;
                NCMBQuery <NCMBObject> query = new NCMBQuery <NCMBObject>("MusicData");
                query.WhereEqualTo("musicName", musicName);
                query.Limit = 1;
                query.FindAsync((List <NCMBObject> objList, NCMBException e) =>
                {
                    if (e != null)
                    {
                        isFinish = true;
                        Debug.LogError(e);
                    }
                    else
                    {
                        objList[0]["scoreData"] = scoreDataJson;
                        objList[0].SaveAsync((NCMBException exp) =>
                        {
                            if (exp != null)
                            {
                                isFinish = true;
                                Debug.LogError(e);
                            }
                            else
                            {
                                isFinish = true;
                            }
                        });
                    }
                });
                // 取得が完了するまで待機
                while (!isFinish)
                {
                    yield return(null);
                }
                SetScoreCacheStruct(musicName, scoreData);
            }
        }
Esempio n. 21
0
 public abstract bool CheckClear(ScoreStruct getScore);
Esempio n. 22
0
    public void ContactCheck()
    {
        for (int i = 0; i < hices.Length; i++)
        {
            if (hices[i].HexColor == HexColor.None)
            {
                continue;
            }
            if (hices[i].Vanished)
            {
                continue;
            }
            RefreshChecked();
            hices[i].StartCountCheck();
        }
        // Vanishing Check
        var vanishingSum = 0;

        for (int i = 0; i < hices.Length; i++)
        {
            if (hices[i].HexColor == HexColor.None)
            {
                continue;
            }
            if (!hices[i].Vanishing)
            {
                continue;
            }
            vanishingSum++;
            hices[i].Vanishing = false;
            hices[i].Vanished  = true;
        }
        if (vanishingSum > 0)
        {
            // Chain
            // Debug.Log($"{ChainNum} Chain!:{vanishingSum}");
            if (vanishingSum < 3)
            {
                Debug.LogError("Chain Error");
            }
            for (int j = 0; j < hices.Length; j++)
            {
                // if(hices[j].Vanished) Debug.Log($"{j}:(React:{hices[j].ReactContact})");
            }
            var addScore = gameMaster.AddScore(vanishingSum, ChainNum);
            earnedScore.PopUp(ChainNum, vanishingSum, addScore);
            shake.ShakeByChain(ChainNum);
            ChainNum++;
            var scoreStruct = new ScoreStruct(vanishingSum, ChainNum - 1, addScore);
            var cleard      = missionBoardMaster.MissionCheck(scoreStruct);
            if (cleard)
            {
                gameMaster.AddTime();
                audioMaster.PlayClear();
            }
            perform.InitWait();
            gameMaster.PuzzleState = PuzzleState.Effect;
            gameMaster.StopTimer();
        }
        else
        {
            // Chain end
            // Elase Vanished Panel
            var shouldPlaySound = false;
            for (int i = 0; i < hices.Length; i++)
            {
                if (hices[i].HexColor == HexColor.None)
                {
                    continue;
                }
                hices[i].Vanishing = false;
                if (!hices[i].Vanished)
                {
                    continue;
                }
                hices[i].Vanished = false;
                hices[i].SetHex(HexColor.None);
                shouldPlaySound = true;
            }
            gameMaster.PuzzleState = PuzzleState.Play;
            if (shouldPlaySound)
            {
                audioMaster.PlayVanish();
            }
            gameMaster.StartTimer();
        }
    }
Esempio n. 23
0
        public override ScoreStruct GetDamageScore(DamageStruct _damage, DamageStruct.DamageStep step = DamageStruct.DamageStep.Caused)
        {
            DamageStruct damage = new DamageStruct(_damage.Card, _damage.From, _damage.To, _damage.Damage, _damage.Nature)
            {
                Reason         = _damage.Reason,
                Steped         = _damage.Steped,
                Transfer       = _damage.Transfer,
                TransferReason = _damage.TransferReason,
                Chain          = _damage.Chain
            };

            if (!HasSkill("gangzhi", damage.To))
            {
                damage.Damage = DamageEffect(damage, step);
            }

            Player from = damage.From;
            Player to   = damage.To;

            if (damage.Steped < DamageStruct.DamageStep.Caused)
            {
                damage.Steped = DamageStruct.DamageStep.Caused;
            }

            ScoreStruct result_score = new ScoreStruct
            {
                Damage   = damage,
                DoDamage = true
            };

            if (!HasSkill("gangzhi", damage.To))
            {
                damage.Damage = DamageEffect(damage, DamageStruct.DamageStep.Done);
            }
            damage.Steped       = DamageStruct.DamageStep.Done;
            result_score.Damage = damage;

            List <ScoreStruct> scores = new List <ScoreStruct>();
            bool deadly = false;

            if (damage.Damage > 0 && !to.Removed)
            {
                double value = 0;
                value = Math.Min(damage.Damage, to.Hp) * 3.5;
                if (IsWeak(to))
                {
                    value += 4;
                    if (damage.Damage > to.Hp)
                    {
                        if (!CanSave(to, damage.Damage - to.Hp + 1))
                        {
                            int over_damage = damage.Damage - to.Hp;
                            for (int i = 1; i <= over_damage; i++)
                            {
                                double x = HasSkill("buqu", to) ? 1 / Math.Pow(i, 2) : (double)8 / Math.Pow(i, 2);
                                value += x;
                            }
                        }
                        else
                        {
                            deadly = true;
                        }
                    }
                }

                //刚直应该这里就停止计算
                if (HasSkill("gangzhi", to))
                {
                    if (IsFriend(to))
                    {
                        value = -value;
                    }
                    if (priority_enemies.Contains(to) && value > 0)
                    {
                        value *= 1.5;
                    }
                    if (to.GetRoleEnum() == Player.PlayerRole.Lord)
                    {
                        value *= 1.2;
                    }
                    result_score.DoDamage = false;
                    result_score.Score    = value;
                    return(result_score);
                }

                if (!to.Removed && CanResist(to, damage.Damage))
                {
                    result_score.Score = 3;
                }
                if (IsFriend(to))
                {
                    value = -value;
                    if (deadly && damage.From != null && damage.From.Alive)
                    {
                        if (RoomLogic.IsFriendWith(room, damage.From, damage.To) && !damage.From.IsNude())
                        {
                            value -= 3;
                        }
                        else if (!RoomLogic.WillBeFriendWith(room, damage.From, damage.To))
                        {
                            value -= 2;
                        }
                    }
                }
                else
                {
                    if (deadly && damage.From != null && damage.From.Alive)
                    {
                        if (RoomLogic.IsFriendWith(room, damage.From, damage.To) && !damage.From.IsNude())
                        {
                            value += 2.5;
                        }
                        else if (IsFriend(damage.From) && !RoomLogic.WillBeFriendWith(room, damage.From, damage.To))
                        {
                            value += 4;
                        }
                    }
                }

                foreach (SkillEvent e in skill_events.Values)
                {
                    if (e.Name != damage.Reason)
                    {
                        value += e.GetDamageScore(this, damage).Score;
                    }
                }
                if (priority_enemies.Contains(to) && value > 0)
                {
                    value *= 1.5;
                }

                //ai debug log

                /*
                 * if ((RoomLogic.IsFriendWith(room, self, to) || IsFriend(to)) && value > 0)
                 * {
                 *  string damage_from = damage.From != null ? string.Format("{0},{1} has skills {2}", damage.From.General1Showed ? damage.From.ActualGeneral1 : "hidden head",
                 *      damage.From.General2Showed ? damage.From.ActualGeneral2 : "hidden deputy", string.Join(",", GetKnownSkills(damage.From))) : "no damage from";
                 *  string damage_str = string.Format("nature {0} count {1} reason {2}", damage.Nature == DamageStruct.DamageNature.Normal ? "normal" : damage.Nature == DamageStruct.DamageNature.Fire ?
                 *      "fire" : "thunder", damage.Damage, damage.Card != null ? damage.Card.Name : damage.Reason);
                 *  string damage_to = string.Format("{0},{1} has skills {2}", damage.To.General1Showed ? damage.To.ActualGeneral1 : "hidden head",
                 *      damage.To.General2Showed ? damage.To.ActualGeneral2 : "hidden deputy", string.Join(",", GetKnownSkills(damage.To)));
                 *  string self_str = string.Format("{0},{1}", self.ActualGeneral1, self.ActualGeneral2);
                 *
                 *  File.AppendAllText("ai_damage_log.txt", string.Format("{0} judge damage {1} against {2} {6} and value is {3} and ai judge target is my {4} and I'm {5}\r\n",
                 *      damage_from, damage_str, damage_to, value, IsFriend(self, to) ? "friend" : "enemy", self_str, to.Chained ? "chained" : string.Empty));
                 * }
                 */

                result_score.Score = value;
            }
            scores.Add(result_score);

            if (damage.Card != null && from != null && !damage.Transfer)
            {
                if (damage.Card.Name.Contains(Slash.ClassName) && from.HasWeapon(IceSword.ClassName) && !to.IsNude())
                {
                    ScoreStruct score = FindCards2Discard(from, to, string.Empty, "he", HandlingMethod.MethodDiscard, 2, true);
                    scores.Add(score);
                }
            }

            CompareByScore(ref scores);
            return(scores[0]);
        }
        public override List <Player> OnPlayerChosen(TrustedAI ai, Player player, List <Player> targets, int min, int max)
        {
            Room room = ai.Room;

            if (room.GetTag("extra_target_skill") is CardUseStruct use)
            {
                List <Player> result = new List <Player>();
                if (use.Card.Name == ExNihilo.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.IsFriend(p) && !ai.HasSkill("zishu", p))
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                    }
                    ;
                }
                else if (use.Card.Name.Contains(Slash.ClassName))
                {
                    List <ScoreStruct> scores = ai.CaculateSlashIncome(player, new List <WrappedCard> {
                        use.Card
                    }, targets, false);
                    if (scores.Count > 0 && scores[0].Score > 0)
                    {
                        return(scores[0].Players);
                    }
                }
                else if (use.Card.Name == Snatch.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.FindCards2Discard(player, p, use.Card.Name, "hej", HandlingMethod.MethodGet).Score > 0)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == Dismantlement.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.FindCards2Discard(player, p, use.Card.Name, "hej", HandlingMethod.MethodDiscard).Score > 0)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == IronChain.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.IsFriend(p) && !ai.HasSkill("jieying", p) && p.Chained)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                    foreach (Player p in targets)
                    {
                        if (ai.IsEnemy(p) && !p.Chained)
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == FireAttack.ClassName)
                {
                    foreach (Player p in targets)
                    {
                        if (ai.IsEnemy(p))
                        {
                            return new List <Player> {
                                       p
                            }
                        }
                        ;
                    }
                }
                else if (use.Card.Name == Duel.ClassName)
                {
                    WrappedCard   duel    = use.Card;
                    List <Player> enemies = ai.Exclude(ai.GetEnemies(player), duel);
                    List <Player> friends = ai.Exclude(ai.FriendNoSelf, duel);
                    int           n1      = ai.GetKnownCardsNums(Slash.ClassName, "he", player);

                    if (ai.HasSkill("wushuang"))
                    {
                        n1 *= 2;
                    }
                    List <ScoreStruct> scores = new List <ScoreStruct>();
                    foreach (Player p in friends)
                    {
                        if (!targets.Contains(p))
                        {
                            continue;
                        }
                        bool fuyin = false;
                        if (ai.HasSkill("fuyin", p) && p.GetMark("fuyin") == 0)
                        {
                            int count = player.HandcardNum;
                            if (count > p.HandcardNum)
                            {
                                fuyin = true;
                            }
                        }
                        if (!fuyin)
                        {
                            ScoreStruct score = ai.GetDamageScore(new DamageStruct(duel, player, p));
                            score.Players = new List <Player> {
                                p
                            };
                            foreach (string skill in ai.GetKnownSkills(p))
                            {
                                SkillEvent skill_e = Engine.GetSkillEvent(skill);
                                if (skill_e != null)
                                {
                                    score.Score += skill_e.TargetValueAdjust(ai, duel, player, new List <Player> {
                                        p
                                    }, p);
                                }
                            }
                            scores.Add(score);
                        }
                    }
                    foreach (Player p in enemies)
                    {
                        if (!targets.Contains(p))
                        {
                            continue;
                        }
                        bool fuyin = false;
                        if (ai.HasSkill("fuyin", p) && p.GetMark("fuyin") == 0)
                        {
                            int count = player.HandcardNum;
                            foreach (int id in duel.SubCards)
                            {
                                if (room.GetCardPlace(id) == Place.PlaceHand)
                                {
                                    count--;
                                }
                            }

                            if (count > p.HandcardNum)
                            {
                                ScoreStruct score = new ScoreStruct
                                {
                                    Score   = 1,
                                    Players = new List <Player> {
                                        p
                                    }
                                };
                                scores.Add(score);
                                fuyin = true;
                            }
                        }

                        if (!fuyin)
                        {
                            bool   no_red   = p.GetMark("@qianxi_red") > 0;
                            bool   no_black = p.GetMark("@qianxi_black") > 0;
                            double n2       = ai.GetKnownCardsNums(Slash.ClassName, "he", p, player);

                            bool fuqi = false;
                            if (player.ContainsTag("wenji") && player.GetTag("wenji") is List <string> names && names.Contains(Name))
                            {
                                fuqi = true;
                            }
                            if (ai.HasSkill("fuqi", player) && RoomLogic.DistanceTo(room, player, p) == 1)
                            {
                                fuqi = true;
                            }

                            if (!fuqi && !ai.IsLackCard(p, Slash.ClassName))
                            {
                                int rate = 4;
                                if (ai.GetKnownCards(p).Count != p.HandcardNum)
                                {
                                    rate = 5;
                                    if (ai.HasSkill("longdan", p))
                                    {
                                        rate -= 2;
                                        if (no_black || no_red)
                                        {
                                            rate += 1;
                                        }
                                    }
                                    if (ai.HasSkill("wusheng", p) && !no_red)
                                    {
                                        rate -= 2;
                                    }
                                    int count = p.HandcardNum - ai.GetKnownCards(p).Count;
                                    count += p.GetHandPile(true).Count - ai.GetKnownHandPileCards(p).Count;
                                    if (no_red)
                                    {
                                        rate += 1;
                                    }
                                    if (no_black)
                                    {
                                        rate += 2;
                                    }
                                    n2 += ((double)count / rate);
                                }
                                if (ai.HasSkill("wushuang", p))
                                {
                                    n2 *= 2;
                                }
                            }
                            ScoreStruct score = new ScoreStruct
                            {
                                Players = new List <Player> {
                                    p
                                }
                            };
                            if (fuqi)
                            {
                                score.Score = ai.GetDamageScore(new DamageStruct(duel, player, p)).Score;
                            }
                            else if (n2 > n1)
                            {
                                score.Score = ai.GetDamageScore(new DamageStruct(duel, p, player)).Score;
                            }
                            else
                            {
                                score.Score = ai.GetDamageScore(new DamageStruct(duel, p, player)).Score - (n2 - 1) * 0.4;
                            }

                            foreach (string skill in ai.GetKnownSkills(p))
                            {
                                SkillEvent skill_e = Engine.GetSkillEvent(skill);
                                if (skill_e != null)
                                {
                                    score.Score += skill_e.TargetValueAdjust(ai, duel, player, new List <Player> {
                                        p
                                    }, p);
                                }
                            }
                            scores.Add(score);
                        }
                    }
                    if (scores.Count > 0)
                    {
                        scores.Sort((x, y) => { return(x.Score > y.Score ? -1 : 1); });
                        if (scores[0].Score > 1)
                        {
                            return(scores[0].Players);
                        }
                    }
                }
            }
            return(new List <Player>());
        }
Esempio n. 25
0
        public override void Use(TrustedAI ai, Player player, ref CardUseStruct use, WrappedCard card)
        {
            Room room = ai.Room;
            List <ScoreStruct> scores = new List <ScoreStruct>();

            foreach (Player p in room.GetOtherPlayers(player))
            {
                if (!RoomLogic.InMyAttackRange(room, p, player) || p.IsNude())
                {
                    continue;
                }
                ScoreStruct score = ai.FindCards2Discard(player, p, "he", HandlingMethod.MethodDiscard);
                score.Players = new List <Player> {
                    p
                };
                if (ai.IsEnemy(p))
                {
                    if (p.HandcardNum + p.GetPile("wooden_ox").Count < 3 || ai.IsLackCard(p, Slash.ClassName))
                    {
                        score.Score += 3;
                    }
                    else
                    {
                        bool armor_ignore = false;
                        if (p.HasWeapon(QinggangSword.ClassName) || ai.HasSkill("jianchu", p))
                        {
                            armor_ignore = true;
                        }
                        else if (ai.HasSkill("paoxiao|paoxiao_fz", p))
                        {
                            Player lord = ai.FindPlayerBySkill("shouyue");
                            if (lord != null && RoomLogic.PlayerHasShownSkill(room, lord, "shouyue") && RoomLogic.WillBeFriendWith(room, p, lord))
                            {
                                armor_ignore = true;
                            }
                        }

                        if (!armor_ignore && ai.HasArmorEffect(player, RenwangShield.ClassName))
                        {
                            score.Score += 0.5;
                        }
                        if (!armor_ignore && ai.HasArmorEffect(player, EightDiagram.ClassName))
                        {
                            score.Score += 0.5;
                        }
                        if (ai.HasSkill("wushang", p))
                        {
                            score.Score -= 0.5;
                        }
                        if (p.HasWeapon(DragonPhoenix.ClassName))
                        {
                            score.Score -= 0.5;
                        }
                        if (ai.HasSkill("jianchu", p))
                        {
                            score.Score = -0.5;
                        }
                        if (ai.HasSkill("tieqi|tieqi_fz", p))
                        {
                            score.Score = 1;
                        }
                        if (ai.GetKnownCardsNums(Jink.ClassName, "he", player) == 0)
                        {
                            score.Score -= 2;
                        }
                    }
                }
                scores.Add(score);
            }

            if (scores.Count > 0)
            {
                ai.CompareByScore(ref scores);
                if (scores[0].Score > 2)
                {
                    use.Card = card;
                    use.To   = new List <Player>(scores[0].Players);
                }
            }
        }
        public override NulliResult OnNullification(TrustedAI ai, CardEffectStruct effect, bool positive, bool keep)
        {
            NulliResult result = new NulliResult();
            Room        room = ai.Room;
            Player      from = effect.From, to = effect.To;
            WrappedCard trick  = effect.Card;
            Player      player = ai.Self;

            if (positive)
            {
                ScoreStruct score = new ScoreStruct
                {
                    Score = 0
                };
                if (from.Alive)
                {
                    DamageStruct damage = new DamageStruct(trick, from, to);
                    score = ai.GetDamageScore(damage);
                }

                if (to.IsWounded())
                {
                    if (ai.IsFriend(to))
                    {
                        score.Score += 1 * to.GetLostHp();
                    }
                    else if (ai.IsEnemy(to))
                    {
                        score.Score -= 1 * to.GetLostHp();
                    }
                }

                if (score.Score <= -4)
                {
                    result.Null = true;
                }
            }
            else
            {
                ScoreStruct score = new ScoreStruct
                {
                    Score = 0
                };
                if (from.Alive)
                {
                    DamageStruct damage = new DamageStruct(trick, from, to);
                    score = ai.GetDamageScore(damage);
                }

                if (to.IsWounded())
                {
                    if (ai.IsFriend(to))
                    {
                        score.Score += 1 * to.GetLostHp();
                    }
                    else if (ai.IsEnemy(to))
                    {
                        score.Score -= 1 * to.GetLostHp();
                    }
                }

                if (score.Score > 4)
                {
                    result.Null = true;
                }
            }

            return(result);
        }