103 lines
3.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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>();
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);
}
}
}