2026-04-19 18:40:54 +08:00

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;
}
}
}