/* * @Author: 白哉 * @Description: * @Date: 2025年11月15日 星期五 * @Modify: */ using System; using System.Collections.Generic; using MemoryPack; using RuntimeData; using UnityEngine; namespace Logic.Skill { public partial class MomijiHuntSkill : SkillBase { public MomijiHuntSkill() { IsPermanent = true; TurnsLimit = 0; Score = 2; } public override SkillType GetSkillType() { return SkillType.MOMIJIHUNT; } /*public override void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target,out int dmg) { dmg = 0; if (target == null || !target.IsAlive()) return; AddPrey(mapData, origin, target); }*/ //为target赋予新的标记 private void AddPrey(MapData mapData, UnitData self, UnitData target) { //Step #1 如果对方已经有标记,不再增加标记 if (target.GetSkill(SkillType.MOMIJIPREY, out var skill)) return; //Step #2 查询场上的所有标记情况 //核心逻辑:每次新增的skill 的Rank值最大。然后如果超额了,就把rank值最小的那个删掉 var unitList = new List(); UnitData minUnit = null; int maxRank = 0; int minRank = 999; foreach(var unit in mapData.UnitMap.UnitList) if (unit.GetSkill(SkillType.MOMIJIPREY, out var hunter)) { unitList.Add(unit); var p = hunter as MomijiPreySkill; if (p == null) continue; if (p.rank < minRank) { minRank = p.rank; minUnit = unit; } if(p.rank > maxRank) maxRank = p.rank; } //Step #3 确定是否数量超标,如果超标,删除最远的那个 int limit = 1; if (self.GetSkill(SkillType.MOMIJIHUNTERATTACK, out var _)) limit = 3; if (unitList.Count >= limit) { //如果超出数量限制,把min的删掉, if(minUnit != null) minUnit.RemoveSkill(SkillType.MOMIJIPREY,mapData); } //Step #4 填加标记,时间戳rank设置为最大+1 target.AddSkill_Legacy(SkillType.MOMIJIPREY,mapData,false,1,false,-1,false,SpecialAddSkillType.Force,0); target.GetSkill(SkillType.MOMIJIPREY,out var targetSkill); //targetSkill?.SetTurnsLimit(1); var tp = targetSkill as MomijiPreySkill; tp?.SetRank(maxRank + 1); } public override void OnUnitDamaged(UnitData self, MapData mapData, SettlementInfo info) { //3格范围内才可以 if (mapData.GridMap.CalcDistance(self.Grid(mapData), info.DamageTargetGrid) > 3) return; if (info.DamageType != DamageType.ActiveAttack) return; //必须是我方阵营(不能是盟友)攻击的目标才会附着 if (!self.Player(mapData, out var player)) return; if (!info.DamageOrigin.Player(mapData, out var originPlayer) || originPlayer.Id!= player.Id) return; //如果受伤目标已经死亡 if (!info.DamageTarget.IsAlive()) return; AddPrey(mapData, self, info.DamageTarget); } } }