91 lines
3.4 KiB
C#

/*
* @Author: 白哉
* @Description:
* @Date: 2025年04月23日 星期三 21:04:18
* @Modify:
*/
using System.Collections.Generic;
using RuntimeData;
using System;
using TH1_Logic.Core;
using TH1Renderer;
using UnityEngine;
using MemoryPack;
namespace Logic.Skill
{
public partial class StompSkill : SkillBase
{
public StompSkill()
{
IsPermanent = true;
TurnsLimit = 0;
Score = 4;
}
public override SkillType GetSkillType()
{
return SkillType.STOMP;
}
public override void OnMove(UnitData self, GridData grid, MapData mapData, MoveType moveType, List<Vector2Int> path = null)
{
var selfUnitList = new HashSet<UnitData>();
mapData.GetPlayerDataByUnitId(self.Id, out var selfPlayer);
mapData.GetUnitDataListByPlayerId(selfPlayer.Id, selfUnitList);
//遍历会溅射的所有格子
var roundGrids = mapData.GridMap.GetAroundGridData(1, 1, grid);
foreach (var roundGrid in roundGrids)
{
var ROgrid = MapRenderer.Instance.ROGridMap[roundGrid.Id];
//如果格子上没有单位,播放地震动画
if (!mapData.GetUnitDataByGid(roundGrid.Id, out var unit))
{
//TODO 下面的是不规范做法,后面要迭代
if (roundGrid.InMainSight())
{
ROgrid.SetBounceAnim(NeedRandomWait:true);
}
}
//如果格子上有单位,播放地震动画,并且播放对方受伤动画
else
{
if (selfUnitList.Contains(unit)) continue;
if (mapData.IsLeagueUnitByUnit(unit.Id, self.Id)) continue;
// 计算攻击伤害,执行伤害逻辑
var damage = Table.Instance.CalcDamage(mapData, self, unit, damagePara:0.5f);
var targetGrid = unit.Grid(mapData);
var city = unit.City(mapData);
Main.UnitLogic.DamageSettlement(mapData, self, unit, damage, DamageType.Splash);
//TODO 动画系统要接管
if (roundGrid.InMainSight())
{
//播放伤害数字特效
roundGrid.Renderer(mapData)?.PlayVFX(new GridVFXParams(GridVFXType.Damage,damage));
//更新unit所属的city的cityInfo
city?.CityInfoRenderer(mapData)?.InstantUpdateCityInfo();
//更新unit的显示 ,unit即使已经死了也可以访问到renderer
unit.Renderer(mapData)?.InstantUpdateUnit(false);
unit.Renderer(mapData)?.InstantUpdateTryDie();
targetGrid?.Renderer(mapData)?.InstantUpdateGrid();
//播放受伤特效
roundGrid.Renderer(mapData)?.PlayVFX(new GridVFXParams(GridVFXType.Fog));
// 执行相关动画,包括伤害特效、伤害数字、以及可能得死亡特效
ROgrid.SetBounceAnim(NeedRandomWait:true);
}
}
}
}
}
}