105 lines
3.0 KiB
C#
105 lines
3.0 KiB
C#
/*
|
|
* @Author: 白哉
|
|
* @Description:
|
|
* @Date: 2025年10月12日 星期六 10:10:12
|
|
* @Modify:
|
|
*/
|
|
|
|
|
|
using RuntimeData;
|
|
using TH1_Logic.Core;
|
|
|
|
|
|
namespace Logic.Skill
|
|
{
|
|
public partial class MeilingRestSkill : SkillBase
|
|
{
|
|
private 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 OnTurnStart(UnitData self, MapData mapData)
|
|
{
|
|
RefreshAroundGiant(mapData, self);
|
|
}
|
|
|
|
public override void OnAnyUnitMove(MapData map, UnitData self, UnitData moveUnit, GridData target, MoveType moveType)
|
|
{
|
|
RefreshAroundGiant(map, self);
|
|
}
|
|
|
|
public override void OnAnyUnitDie(MapData map, UnitData self)
|
|
{
|
|
RefreshAroundGiant(map, self);
|
|
}
|
|
|
|
public override void OnAnyUnitCreate(MapData map, UnitData self, UnitData newUnit)
|
|
{
|
|
RefreshAroundGiant(map, self);
|
|
}
|
|
|
|
public override void OnTurnEnd(UnitData self, MapData mapData)
|
|
{
|
|
if(_aroundGiant) return;
|
|
Main.UnitLogic.RecoverHealth(mapData, self, self, 2);
|
|
}
|
|
|
|
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
|
|
{
|
|
if (_aroundGiant) return 1;
|
|
return 0;
|
|
}
|
|
|
|
public override float GetDefenseAdditionParam(MapData mapData, UnitData self, UnitData target = null)
|
|
{
|
|
if (!_aroundGiant) return 1;
|
|
return 0;
|
|
}
|
|
|
|
public override int GetExtraMoveRange(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 roundGrid = mapData.GridMap.GetAroundGridData(1, 1, targetGrid);
|
|
foreach (var gridData in roundGrid)
|
|
{
|
|
if (gridData == targetGrid) continue;
|
|
var unit = gridData.Unit(mapData);
|
|
if (unit == null) 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();
|
|
return;
|
|
}
|
|
|
|
_aroundGiant = false;
|
|
if(self.InMainSight())
|
|
self.Renderer(mapData)?.RenderUpdateUnitSprite();
|
|
}
|
|
}
|
|
}
|