105 lines
3.5 KiB
C#
105 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 SanaeWindSkill : SkillBase
|
||
{
|
||
public SanaeWindSkill()
|
||
{
|
||
IsPermanent = true;
|
||
TurnsLimit = 0;
|
||
Score = 2;
|
||
}
|
||
|
||
public override SkillType GetSkillType()
|
||
{
|
||
return SkillType.SANAEWIND;
|
||
}
|
||
|
||
public override void OnMove(UnitData self, GridData grid, MapData mapData, MoveType moveType, List<Vector2Int> path = null)
|
||
{
|
||
if (path == null || path.Count < 2) return;
|
||
int range = self.GetSkill(SkillType.SANAEMOVE,out var _) ? 1: 0 ;
|
||
if (!self.Player(mapData, out var player)) return;
|
||
var aroundBuf = RentAroundBuf();
|
||
mapData.GridMap.GetAroundGridData(range, range, grid, aroundBuf);
|
||
foreach (var around in aroundBuf)
|
||
{
|
||
//if (around == grid) continue;
|
||
around.VisibleUnit(mapData,player,out var unit);
|
||
if (unit == null || !unit.IsAlive()) continue;
|
||
if (!mapData.IsLeagueUnitByUnit(unit.Id, self.Id)) continue;
|
||
unit.AddSkill_Legacy(SkillType.SANAEWINDX, mapData,false,0,false,-1,false,SpecialAddSkillType.AddTurnLimit,0);
|
||
if(self.Player(mapData).PlayerHeroData.GetHeroTask(GiantType.GermanySanae, out var task))
|
||
task.OnAddSkillLevels(mapData,SkillType.SANAEWINDX,1);
|
||
|
||
unit.GetSkill(SkillType.SANAEWINDX, out var skill);
|
||
if (skill is SanaeWindXSkill sanaeWindX)
|
||
{
|
||
sanaeWindX.X = GetSanaeWindXValue(path[0], path[^1]);
|
||
sanaeWindX.SetTurnsLimit(1);
|
||
|
||
}
|
||
}
|
||
ReturnAroundBuf();
|
||
}
|
||
|
||
// 按照小键盘规律,假设起始点位于5,根据目标点方向返回12346789
|
||
private int GetSanaeWindXValue(Vector2Int origin, Vector2Int target)
|
||
{
|
||
var dx = target.x - origin.x;
|
||
var dy = target.y - origin.y;
|
||
if (dx == 0 && dy < 0) return 2; // 上
|
||
if (dx > 0 && dy < 0) return 3; // 右上
|
||
if (dx > 0 && dy == 0) return 6; // 右
|
||
if (dx > 0 && dy > 0) return 9; // 右下
|
||
if (dx == 0 && dy > 0) return 8; // 下
|
||
if (dx < 0 && dy > 0) return 7; // 左下
|
||
if (dx < 0 && dy == 0) return 4; // 左
|
||
if (dx < 0 && dy < 0) return 1; // 左上
|
||
return 5; // 原地不动
|
||
}
|
||
|
||
public override bool IsCanAttackAlly()
|
||
{
|
||
return true;
|
||
}
|
||
|
||
#region [------------------------------------------------------------------ AttackAlly 生命周期 ------------------------------------------------------------------]
|
||
|
||
// 具备 AttackAlly 能力
|
||
public override bool AttackAllyEnable(MapData mapData, UnitData self, UnitData target)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
// 基础治疗量:固定 4
|
||
public override int AttackAllyBaseHeal(MapData mapData, UnitData self, UnitData target)
|
||
{
|
||
return 4;
|
||
}
|
||
|
||
// 治疗加成:0
|
||
public override int AttackAllyHealAddition(MapData mapData, UnitData self, UnitData target)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
#endregion
|
||
}
|
||
}
|
||
|