136 lines
4.3 KiB
C#
136 lines
4.3 KiB
C#
/*
|
|
* @Author: 白哉
|
|
* @Description:
|
|
* @Date: 2025年10月12日 星期六 10:10:12
|
|
* @Modify:
|
|
*/
|
|
|
|
|
|
using System.Collections.Generic;
|
|
using RuntimeData;
|
|
using TH1_Logic.Core;
|
|
using System.Linq;
|
|
|
|
|
|
namespace Logic.Skill
|
|
{
|
|
public partial class MeilingRestSkill : SkillBase
|
|
{
|
|
public bool AroundGiant;
|
|
public bool Sleeping => !AroundGiant;
|
|
|
|
|
|
public MeilingRestSkill()
|
|
{
|
|
IsPermanent = true;
|
|
TurnsLimit = 0;
|
|
Score = 2;
|
|
AroundGiant = false;
|
|
}
|
|
|
|
public override SkillType GetSkillType()
|
|
{
|
|
return SkillType.MEILINGREST;
|
|
}
|
|
|
|
public override void OnSkillAdd(MapData mapData, uint originId)
|
|
{
|
|
var self = mapData.GetIdentifierBase(originId);
|
|
if (self != null && self is UnitData unitData) RefreshAroundGiant(mapData, unitData);
|
|
}
|
|
|
|
public override void OnTurnStart(IdentifierBase identifier, MapData mapData)
|
|
{
|
|
var self = identifier as UnitData;
|
|
if (self == null) return;
|
|
RefreshAroundGiant(mapData, self);
|
|
}
|
|
|
|
public override void OnAnyUnitMove(MapData map, IdentifierBase identifier, UnitData moveUnit, GridData target, MoveType moveType)
|
|
{
|
|
var self = identifier as UnitData;
|
|
if (self == null) return;
|
|
RefreshAroundGiant(map, self);
|
|
}
|
|
|
|
public override void OnAnyUnitDie(MapData map, UnitData self, UnitData dieUnit)
|
|
{
|
|
RefreshAroundGiant(map, self);
|
|
}
|
|
|
|
public override void OnAnyUnitCreate(MapData map, IdentifierBase identifier, UnitData newUnit)
|
|
{
|
|
var self = identifier as UnitData;
|
|
if (self == null) return;
|
|
RefreshAroundGiant(map, self);
|
|
}
|
|
|
|
public override void OnTurnEnd(IdentifierBase identifier, MapData mapData)
|
|
{
|
|
var self = identifier as UnitData;
|
|
if (self == null) return;
|
|
if(AroundGiant) return;
|
|
Main.UnitLogic.RecoverHealth_Legacy(mapData, self, self, 2);
|
|
}
|
|
|
|
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
|
|
{
|
|
if (AroundGiant) return 0.5f;
|
|
return 0;
|
|
}
|
|
|
|
public override float GetDefenseAdditionParam(MapData mapData, UnitData self, UnitData target = null)
|
|
{
|
|
if (!AroundGiant) return 1;
|
|
return 0;
|
|
}
|
|
|
|
public override int GetExtraMoveRange(MapData map,UnitData self)
|
|
{
|
|
if (AroundGiant) return 1;
|
|
return 0;
|
|
}
|
|
|
|
private void RefreshAroundGiant(MapData mapData, UnitData self)
|
|
{
|
|
var selfPlayer = self.Player(mapData);
|
|
if (selfPlayer == null) return;
|
|
|
|
if (!mapData.GetGridDataByUnitId(self.Id, out var targetGrid)) return;
|
|
var aroundBuf = RentAroundBuf();
|
|
mapData.GridMap.GetAroundGridData(1, 1, targetGrid, aroundBuf);
|
|
foreach (var gridData in aroundBuf)
|
|
{
|
|
if (gridData == targetGrid) continue;
|
|
if(!gridData.RealUnit(mapData,out var unit))continue;
|
|
if (!unit.TreatedAsHero(mapData,self)) continue;
|
|
var unitPlayer = unit.Player(mapData);
|
|
if (unitPlayer == null || unitPlayer.Id != selfPlayer.Id) continue;
|
|
|
|
AroundGiant = true;
|
|
if(self.InMainSight())
|
|
self.Renderer(mapData)?.RenderUpdateUnitSprite();
|
|
ReturnAroundBuf();
|
|
return;
|
|
}
|
|
|
|
AroundGiant = false;
|
|
if(self.InMainSight())
|
|
self.Renderer(mapData)?.RenderUpdateUnitSprite();
|
|
ReturnAroundBuf();
|
|
}
|
|
|
|
public override bool ReservedOnTransform(UnitData self, UnitFullType fullType)
|
|
{
|
|
Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(self.UnitFullType, out var originInfo);
|
|
Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(fullType, out var targetInfo);
|
|
//如果变形情况是carry相关的
|
|
if (originInfo.Skills.Contains(SkillType.CARRY) != targetInfo.Skills.Contains(SkillType.CARRY))
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
}
|
|
}
|