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; } } }
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); }
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); }
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); }
public static void Clear() { for (int i = 0; i < numOfRecords; ++i) { s_Entries[i] = new ScoreStruct(0); } SaveScores(); }
public override bool CheckClear(ScoreStruct getScore) { if (getScore.DeleteNum >= nowNorm) { return(true); } return(false); }
public override bool CheckClear(ScoreStruct getScore) { scoreSum += getScore.GainScore; if (scoreSum >= nowNorm) { return(true); } return(false); }
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); }
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); } }
public bool MissionCheck(ScoreStruct score) { var toNext = nowMissions[0].CheckClear(score); if (toNext) { Pop(); } return(toNext); }
public bool MissionCheck(ScoreStruct score) { var cleared = missionManager.MissionCheck(score); if (cleared) { UpdateContent(); clearParticle.Play(); } return(cleared); }
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); }
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); }
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>()); } }
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); }
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); } }
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>()); }
/// <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(); }
/// <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); } }
public abstract bool CheckClear(ScoreStruct getScore);
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(); } }
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>()); }
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); }