103 lines
3.5 KiB
C#
103 lines
3.5 KiB
C#
/*
|
||
* @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);
|
||
}
|
||
|
||
}
|
||
}
|
||
|