protected virtual void RewardAndPunish(Room room, Player killer, Player victim) { if (!killer.Alive || !killer.HasShownOneGeneral()) { return; } if (!RoomLogic.IsFriendWith(room, killer, victim)) { int n = 1; foreach (Player p in room.GetOtherPlayers(victim)) { if (RoomLogic.IsFriendWith(room, victim, p)) { ++n; } } room.DrawCards(killer, n, "gamerule"); } else { room.ThrowAllHandCardsAndEquips(killer); } }
public override int GetExtra(Room room, Player target) { if (RoomLogic.HasArmorEffect(room, target, PeaceSpell.ClassName)) { int count = 1; foreach (Player p in room.GetOtherPlayers(target)) { if (RoomLogic.IsFriendWith(room, target, p)) { count++; } } count += target.GetPile("heavenly_army").Count; return(count); } return(0); }
public override bool IsEnabledAtPlay(Room room, Player player) { if (room.AliveCount() < 4) { return(false); } if (player.HasFlag("Global_SummonFailed")) { return(false); } if (!player.CanShowGeneral(RoomLogic.InPlayerHeadSkills(player, Name) ? "h" : "d")) { return(false); } if (!player.HasShownOneGeneral() && Hegemony.WillbeRole(room, player) == "careerist") { return(false); } BattleArraySkill skill = (BattleArraySkill)Engine.GetTriggerSkill(Name); if (skill != null) { ArrayType type = skill.Type; switch (type) { case ArrayType.Siege: { if (RoomLogic.WillBeFriendWith(room, player, room.GetNextAlive(player)) && RoomLogic.WillBeFriendWith(room, player, room.GetLastAlive(player))) { return(false); } if (!RoomLogic.WillBeFriendWith(room, player, room.GetNextAlive(player))) { if (!room.GetNextAlive(player, 2).HasShownOneGeneral() && room.GetNextAlive(player).HasShownOneGeneral()) { return(true); } } if (!RoomLogic.WillBeFriendWith(room, player, room.GetLastAlive(player))) { return(!room.GetLastAlive(player, 2).HasShownOneGeneral() && room.GetLastAlive(player).HasShownOneGeneral()); } break; } case ArrayType.Formation: { int n = room.AliveCount(false); int asked = n; for (int i = 1; i < n; ++i) { Player target = room.GetNextAlive(player, i); if (RoomLogic.IsFriendWith(room, player, target)) { continue; } else if (!target.HasShownOneGeneral()) { return(true); } else { asked = i; break; } } n -= asked; for (int i = 1; i < n; ++i) { Player target = room.GetLastAlive(player, i); if (RoomLogic.IsFriendWith(room, player, target)) { continue; } else { return(!target.HasShownOneGeneral()); } } break; } } } return(false); }
public override double CardValue(TrustedAI ai, Player player, bool use, WrappedCard card, Player.Place place) { double value = 0; Room room = ai.Room; if (ai.HasSkill("wendao", player)) { if (use) { value += 5; } else { if (!player.HasUsed(WendaoCard.ClassName) || room.Current != player) { value -= 10; } } } else { Player target = null; foreach (Player p in room.GetOtherPlayers(player)) { if (ai.HasSkill("wendao", p)) { target = p; break; } } if (target != null) { if (!ai.HasSkill("flamemap", player) || !use) { value -= 7; } } else { foreach (Player p in room.GetOtherPlayers(player)) { if (RoomLogic.IsFriendWith(room, player, p)) { value += 0.5; } } } if (!use && player.Hp == 1 && player.HandcardNum <= 1 && place == Player.Place.PlaceEquip) { value -= 3; } } if (player.Chained) { value += 1; } return(value); }
//阵亡聊天 private static void OnDeath(Room room, Player player, object data) { if (player.ClientId < 0 && data is DeathStruct death) { //几率1/3聊天 if (Shuffle.random(1, 3)) { Client client = room.GetClient(player); //50%随机是发言还是表情 bool speak = Shuffle.random(1, 2); if (room.Setting.SpeakForbidden) { speak = false; } DataRow row = Engine.GetLines(client.Profile.NickName); if (speak) { string message = row["death1"].ToString(); if (!string.IsNullOrEmpty(message)) { if (message.Contains("%1")) { if (death.Damage.From != null) { message = message.Replace("%1", death.Damage.From.SceenName); } else { message = string.Empty; } } if (!string.IsNullOrEmpty(message)) { room.Speak(client, message); } } } else { string messages = row["death2"].ToString(); if (!string.IsNullOrEmpty(messages)) { string[] ms = messages.Split('/'); room.Emotion(client, ms[0], ms[1]); } } } //杀死非友方时 if (death.Damage.From != null && death.Damage.From != player && death.Damage.From.ClientId < 0 && !RoomLogic.IsFriendWith(room, death.Damage.From, player) && Shuffle.random(1, 3)) { Client client = room.GetClient(death.Damage.From); //50%随机是发言还是表情 bool speak = Shuffle.random(1, 2); if (room.Setting.SpeakForbidden) { speak = false; } DataRow row = Engine.GetLines(client.Profile.NickName); if (speak) { string message = row["kill1"].ToString(); if (!string.IsNullOrEmpty(message) && !message.Contains("%1")) { message = message.Replace("%1", player.SceenName); room.Speak(client, message); } } else { string messages = row["kill2"].ToString(); if (!string.IsNullOrEmpty(messages)) { string[] ms = messages.Split('/'); room.Emotion(client, ms[0], ms[1]); } } } } }
private static void OnUseCard(Room room, Player player, object data) { if (data is CardUseStruct use) { if (use.Card.Name == Analeptic.ClassName && (use.Reason == CardUseStruct.CardUseReason.CARD_USE_REASON_PLAY || room.GetRoomState().GetCurrentCardUsePattern(player) == "@@rende") && use.Card.Skill != "_zhendu") { List <Client> ais = new List <Client>(); foreach (Player p in room.GetAlivePlayers()) { Client client = room.GetClient(p); if (p.ClientId < 0 && !ais.Contains(client) && RoomLogic.InMyAttackRange(room, player, p) && !RoomLogic.IsFriendWith(room, player, p) && room.GetClient(player) != client && Shuffle.random(1, 3)) { ais.Add(client); } } if (ais.Count == 0) { return; } foreach (Client client in ais) { bool speak = Shuffle.random(1, 2); if (room.Setting.SpeakForbidden) { speak = false; } DataRow row = Engine.GetLines(client.Profile.NickName); if (speak) { string message = row["other_drunk1"].ToString(); if (!string.IsNullOrEmpty(message)) { message = message.Replace("%1", player.SceenName); room.Speak(client, message); } } else { string messages = row["other_drunk2"].ToString(); if (!string.IsNullOrEmpty(messages)) { string[] ms = messages.Split('/'); room.Emotion(client, ms[0], ms[1]); } } } } else if (player.ClientId < 0 && use.Card.Name.Contains(Slash.ClassName) && (use.Reason == CardUseStruct.CardUseReason.CARD_USE_REASON_PLAY || room.GetRoomState().GetCurrentCardUsePattern(player) == "@@rende") && use.To.Count == 1 && !RoomLogic.IsFriendWith(room, player, use.To[0]) && Shuffle.random(1, 3)) { Client client = room.GetClient(player); bool speak = Shuffle.random(1, 2); if (room.Setting.SpeakForbidden) { speak = false; } DataRow row = Engine.GetLines(client.Profile.NickName); if (speak) { string message = row["slash_use1"].ToString(); if (!string.IsNullOrEmpty(message)) { message = message.Replace("%1", use.To[0].SceenName); room.Speak(client, message); } } else { string messages = row["slash_use2"].ToString(); if (!string.IsNullOrEmpty(messages)) { string[] ms = messages.Split('/'); room.Emotion(client, ms[0], ms[1]); } } } } }
public override string GetWinner(Room room) { if (!string.IsNullOrEmpty(room.PreWinner)) { return(room.PreWinner); } List <string> winners = new List <string>(); List <Player> players = room.GetAlivePlayers(); Player win_player = players[0]; if (players.Count == 1) { if (!win_player.General1Showed) { room.ShowGeneral(win_player, true, false, false); } if (!win_player.General2Showed) { room.ShowGeneral(win_player, false, false, false); } foreach (Player p in room.Players) { if (RoomLogic.IsFriendWith(room, win_player, p)) { winners.Add(p.Name); } } } else { bool has_diff_kingdoms = false; string left_kingdom = null; foreach (Player p in players) { left_kingdom = General.GetKingdom(Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0]); foreach (Player p2 in players) { if (p == p2) { continue; } if (p.HasShownOneGeneral() && p2.HasShownOneGeneral() && !RoomLogic.IsFriendWith(room, p, p2)) { has_diff_kingdoms = true; break;// if both shown but not friend, hehe. } if ((p.HasShownOneGeneral() && !p2.HasShownOneGeneral() && !RoomLogic.WillBeFriendWith(room, p2, p)) || (!p.HasShownOneGeneral() && p2.HasShownOneGeneral() && !RoomLogic.WillBeFriendWith(room, p, p2))) { has_diff_kingdoms = true; break;// if either shown but not friend, hehe. } if (!p.HasShownOneGeneral() && !p2.HasShownOneGeneral()) { if (Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0] != Engine.GetGeneral(p2.ActualGeneral1, room.Setting.GameMode).Kingdom[0]) { has_diff_kingdoms = true; break; // if neither shown and not friend, hehe. } } } if (has_diff_kingdoms) { break; } } bool all_live_shown = true; if (!has_diff_kingdoms) { //check all shown before judging careerist, cos same skills could change kindom such as dragonphoenix foreach (Player p in players) { if (!p.HasShownOneGeneral()) { all_live_shown = false; } } } if (!has_diff_kingdoms && !all_live_shown) { // judge careerist List <string> lords = new List <string>(); int all = 0; foreach (Player p in room.Players) { if (p.HasShownOneGeneral()) { if (p.Kingdom == left_kingdom && p.Role != "careerist") { all++; } } else if (General.GetKingdom(Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0]) == left_kingdom) { all++; } } foreach (Player p in room.Players) { if (Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).IsLord()) { if (p.Alive && p.General1Showed) //the lord has shown { lords.Add(General.GetKingdom(Engine.GetGeneral(p.ActualGeneral1, room.Setting.GameMode).Kingdom[0])); } else if (!p.Alive && p.Kingdom == left_kingdom) //the lord is dead, all careerist { return(null); } else if (p.Alive && !p.HasShownOneGeneral() && all > room.Players.Count / 2) //the lord not yet shown { return(null); } } } if (lords.Count == 0 && all > room.Players.Count / 2) //careerist exists { has_diff_kingdoms = true; } } if (has_diff_kingdoms) { return(null); //if has enemy, hehe } // if run here, all are friend. foreach (Player p in players) { if (!p.General1Showed) { room.ShowGeneral(p, true, false, false); // dont trigger event } if (!p.General2Showed) { room.ShowGeneral(p, false, false, false); } } foreach (Player p in room.Players) { if (RoomLogic.IsFriendWith(room, win_player, p)) { winners.Add(p.Name); } } } return(string.Join("+", winners)); }
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]); }