This commit is contained in:
kawagiri 2025-10-18 02:03:18 +08:00
commit 4ac1983b0c
30 changed files with 312 additions and 166 deletions

View File

@ -553,71 +553,89 @@ namespace RuntimeData
{
return Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType,GiantType,UnitLevel,out var Info)?Info.LandType:LandType.None;
}
// 获取技能加成倍数 (本人拥有的其他技能对特定技能的加成倍数)
public float GetSpecialSkillBonus(MapData mapData, SkillType skillType)
{
var value = 1f;
foreach (var skill in Skills) value *= skill.GetSpecialSkillBonus(mapData, this, skillType);
return value;
}
// 获得总攻击力的string显示
public string GetAttackShowString(MapData map)
{
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType, GiantType,UnitLevel, out var info)) return "0";
float extra = GetExtraAttack(map);
if (extra == 1f)
return info.Attack.ToString();
return info.Attack + "(×" + extra + ")";
return GetBaseAttackValue(map) + "(×" + GetAttackMultiplicationParam(map) + ")";
}
// 获得总攻击力
public float GetAttackValue(MapData map, UnitData target=null)
// 基础攻击力
public float GetBaseAttackValue(MapData map, UnitData target = null)
{
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType, GiantType,UnitLevel, out var info)) return 0;
if (IsCriticalHitRate(map)) return info.Attack * GetExtraAttack(map) * 2;
var value = info.Attack * GetExtraAttack(map);
if (target != null)
{
var attackOffsetValue = GetAttackerValueOffset(map,target);
if (GetSkill(SkillType.EIRINFRENCHBUFF, out var _) && target.GetUnitFullType.UnitType == UnitType.Giant)
attackOffsetValue *= 2;
value += attackOffsetValue;
}
return value * GetAllExtraAttack(map);
return info.Attack + GetAttackAdditionParam(map, target);
}
// 获取总防御力的string显示
// 总攻击力
public float GetAllAttackValue(MapData map, UnitData target = null)
{
return GetBaseAttackValue(map, target) * GetAttackAdditionParam(map, target);
}
// 攻击力加算系数
public float GetAttackAdditionParam(MapData map, UnitData target = null)
{
var value = 1f;
foreach (var skill in Skills) value *= skill.GetAttackAdditionParam(map, this, target);
return value;
}
// 攻击力乘算系数
public float GetAttackMultiplicationParam(MapData map, UnitData target = null)
{
var value = 1f;
foreach (var skill in Skills) value *= skill.GetAttackMultiplicationParam(map, this, target);
return value;
}
// 获得总防御力的string显示
public string GetDefenseShowString(MapData map)
{
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType, GiantType,UnitLevel, out var info)) return "0";
float extra = GetExtraDefense(map);
if (extra == 1f)
return info.Defense.ToString();
return info.Defense + "(×" + extra + ")";
return GetBaseDefenseValue(map) + "(×" + GetDefenseMultiplicationParam(map) + ")";
}
// 获取总防御力
public float GetDefenseValue(MapData map, UnitData origin=null)
// 基础防御力
public float GetBaseDefenseValue(MapData map, UnitData target = null)
{
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType, GiantType,UnitLevel, out var info)) return 0;
var value = info.Defense * GetExtraDefense(map);
if (origin != null) value += origin.GetDefenderValueOffset(map,origin);
return value;
return info.Defense + GetDefenseAdditionParam(map, target);
}
public float GetRawDefenseValue()
// 总防御力
public float GetAllDefenseValue(MapData map, UnitData target = null)
{
if(!Table.Instance.UnitTypeDataAssets.GetUnitTypeInfo(UnitType, GiantType,UnitLevel, out var info)) return 0;
var value = info.Defense;// * GetExtraDefense(map);
//if (origin != null) value += origin.GetDefenderValueOffset(map,origin);
return GetBaseDefenseValue(map, target) * GetDefenseAdditionParam(map, target);
}
// 防御力加算系数
public float GetDefenseAdditionParam(MapData map, UnitData target = null)
{
var value = 1f;
foreach (var skill in Skills) value *= skill.GetDefenseAdditionParam(map, this, target);
return value;
}
// 获取防御倍数
public float GetExtraDefense(MapData map)
// 防御力乘算系数
public float GetDefenseMultiplicationParam(MapData map, UnitData target = null)
{
var value = 1f;
foreach (var skill in Skills) value *= skill.GetDefenseMultiplicationParam(map, this, target);
return value * GetTerrainDefenseMultiplicationParam(map);
}
// 地形防御乘算系数
public float GetTerrainDefenseMultiplicationParam(MapData map)
{
var extraDefense = 1f;
foreach (var skill in Skills)
{
extraDefense *= skill.GetExtraDefense(this, map);
}
if (!map.GetGridDataByUnitId(Id, out var grid) || !map.GetPlayerDataByUnitId(Id, out var unitPlayer))
{
LogSystem.LogError("UnitData GetExtraDefense Cant find grid or player by uid");
@ -625,34 +643,13 @@ namespace RuntimeData
}
//如果是中立土地
if (!map.GetPlayerDataByTerritoryGridId(grid.Id, out var gridPlayer))
{
return extraDefense;
}
if (!map.GetPlayerDataByTerritoryGridId(grid.Id, out var gridPlayer)) return extraDefense;
//如果不是盟友土地
if(!map.SameUnion(unitPlayer.Id,gridPlayer.Id))
return extraDefense;
if (grid.Resource == ResourceType.NavalBase || grid.Resource == ResourceType.Military)
extraDefense *= 1.5f;
if(!map.SameUnion(unitPlayer.Id,gridPlayer.Id)) return extraDefense;
if (grid.Resource == ResourceType.NavalBase || grid.Resource == ResourceType.Military) extraDefense *= 1.5f;
return extraDefense;
}
// 获取攻击倍数
public float GetExtraAttack(MapData map)
{
var extraAttack = 1f;
foreach (var skill in Skills) extraAttack *= skill.GetExtraAttack(this, map);
return extraAttack;
}
// 获取总攻击倍数
public float GetAllExtraAttack(MapData map)
{
var extraAttack = 1f;
foreach (var skill in Skills) extraAttack *= skill.GetAllExtraAttack(this, map);
return extraAttack;
}
// 获取暴击率
public float GetCriticalHitRate(MapData map)
{
@ -661,23 +658,6 @@ namespace RuntimeData
return criticalHitRate;
}
// 受攻击时给对方的攻击力偏移
public float GetAttackerValueOffset(MapData mapData,UnitData target)
{
var value = 0f;
foreach (var skill in Skills) value += skill.GetAttackerValueOffset(mapData,target);
return value;
}
// 攻击时给对方的防御力偏移
public float GetDefenderValueOffset(MapData mapData,UnitData origin)
{
var value = 0f;
foreach (var skill in Skills) value += skill.GetDefenderValueOffset(mapData,origin);
return value;
}
// 是否能移动到伟人身周
public bool IsCanMoveGiantNearbyGrid(MapData map)
{
@ -769,6 +749,16 @@ namespace RuntimeData
return false;
}
//返回该unit是否能攻击所有人
public bool CanAttackAll(MapData map)
{
foreach (var skill in Skills)
{
if (skill.CanAttackAll(this, map)) return true;
}
return false;
}
//返回该unit是否能攻击
public bool IsLimitSelfAttack(MapData map)
{
@ -799,7 +789,7 @@ namespace RuntimeData
return false;
}
// 是否能暴击
// 是否能暴击 (移除了)
private bool IsCriticalHitRate(MapData map)
{
return map.Net.GetRandom().NextDouble() <= GetCriticalHitRate(map);

View File

@ -377,8 +377,8 @@ public class Table
//计算攻防 TODO 增加damagePara 增加multiOrAdd如果是false就是乘法攻击如果是true就是加法
public int CalcDamage(MapData map, UnitData A, UnitData B, float damagePara = 1f,bool multiOrAdd = false)
{
float attackA = A.GetAttackValue(map, B) * damagePara;
float defenseB = B.GetDefenseValue(map, A);
float attackA = A.GetAllAttackValue(map, B) * damagePara;
float defenseB = B.GetAllDefenseValue(map, A);
float attackForce = attackA * (1f * A.Health / A.GetMaxHealth());
float defenseForce = defenseB * (1f * B.Health / B.GetMaxHealth());
var totalDamage = attackForce + defenseForce;
@ -390,13 +390,13 @@ public class Table
//A打BB反击A
public int CalcCounterDamage(MapData map, UnitData A, UnitData B, float damagePara = 1f,bool multiOrAdd = false)
{
float attackA = A.GetAttackValue(map, B) * damagePara;
float defenseB = B.GetDefenseValue(map, A);
float attackA = A.GetAllAttackValue(map, B) * damagePara;
float defenseB = B.GetAllDefenseValue(map, A);
float attackForce = attackA * (1f * A.Health / A.GetMaxHealth());
float defenseForce = defenseB * (1f * B.Health / B.GetMaxHealth());
var totalDamage = attackForce + defenseForce;
if (totalDamage == 0) return 0;
int defenseResult = (int)((defenseForce / totalDamage) * B.GetRawDefenseValue() * 4.5f + 0.5f);
int defenseResult = (int)((defenseForce / totalDamage) * B.GetBaseDefenseValue(map, A) * 4.5f + 0.5f);
return defenseResult;
/*
@ -414,7 +414,7 @@ public class Table
public int CalcDamage(MapData map, UnitData A, UnitData B, int attackValue)
{
float attackA = attackValue;
float defenseB = B.GetDefenseValue(map, A);
float defenseB = B.GetAllDefenseValue(map, A);
float attackForce = attackA * (1f * A.Health / A.GetMaxHealth());
float defenseForce = defenseB * (1f * B.Health / B.GetMaxHealth());
float totalDamage = attackForce + defenseForce;
@ -423,7 +423,6 @@ public class Table
return attackResult;
}
//UI显示文字相关
public string[] tileInfo(GridData t)//返回tile的名称用于bottomInfoUI
{

View File

@ -209,7 +209,7 @@ namespace Logic.AI
{
if (!unitData.Alive || unitData.Health == 0) return 0;
var unitScore = unitData.Health + unitData.GetAttackRange() + unitData.GetMoveRange() +
unitData.GetAttackValue(mapData) + unitData.GetDefenseValue(mapData);
unitData.GetAllAttackValue(mapData) + unitData.GetAllDefenseValue(mapData);
foreach (var skill in unitData.Skills) unitScore += skill.GetScore();
var selfUnits = new HashSet<UnitData>();
@ -1006,7 +1006,7 @@ namespace Logic.AI
if (!param.MapData.GetGridDataByCityId(param.CityData.Id, out var cityGrid)) return;
if (!param.MapData.GetUnitDataByGid(cityGrid.Id, out var newUnit)) return;
result.Score[CalculateType.CityTrainDefend] = newUnit.GetDefenseValue(param.MapData) + newUnit.Health;
result.Score[CalculateType.CityTrainDefend] = newUnit.GetAllDefenseValue(param.MapData) + newUnit.Health;
}
private static void CalculatePlayerTechDefend(AICalculatorData data, CommonActionParams param, CalculateResult result)

View File

@ -8,6 +8,7 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
@ -16,8 +17,8 @@ namespace Logic.Skill
{
public CantMoveSkill()
{
IsPermanent = true;
TurnsLimit = 0;
IsPermanent = false;
TurnsLimit = 1;
Score = -5;
}
@ -25,5 +26,10 @@ namespace Logic.Skill
{
return SkillType.CANTMOVE;
}
public override void OnTurnStart(UnitData self, MapData mapData)
{
self.MP = 0;
}
}
}

View File

@ -24,5 +24,11 @@ namespace Logic.Skill
{
return SkillType.EIRINFRENCHBUFF;
}
public override int GetSpecialSkillBonus(MapData mapData, UnitData self, SkillType skillType)
{
if (skillType == SkillType.KAGUYAFRENCHSYNERGY) return 2;
return 1;
}
}
}

View File

@ -8,6 +8,7 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
@ -25,5 +26,10 @@ namespace Logic.Skill
{
return SkillType.FLANDREATTACK;
}
public override bool CanAttackAll(UnitData self, MapData mapData)
{
return true;
}
}
}

View File

@ -8,22 +8,39 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
{
public partial class FlandreBuffSkill : SkillBase
{
private static int _staticLevel = 0;
public FlandreBuffSkill()
{
IsPermanent = true;
IsPermanent = false;
TurnsLimit = 0;
Score = 2;
_levelLimit = 6;
}
public override SkillType GetSkillType()
{
return SkillType.FLANDREBUFF;
}
public override void AddLevel(MapData map, UnitData origin, int add)
{
_staticLevel += add;
if (_staticLevel > _levelLimit) _staticLevel = _levelLimit;
if (!map.GetPlayerDataByUnitId(origin.Id, out _)) return;
origin.HeroTask(map)?.OnAddSkillLevels(map, GetSkillType(), (uint)add);
}
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return 0.5f * _staticLevel;
}
}
}

View File

@ -8,6 +8,7 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
@ -25,5 +26,13 @@ namespace Logic.Skill
{
return SkillType.FLANDREKILL;
}
public override void OnDamageOther(MapData mapData, SettlementInfo info)
{
if (!info.IsKill || info.DamageOrigin.Health <= 0) return;
info.DamageOrigin.AddSkill(SkillType.FLANDREBUFF);
info.DamageOrigin.GetSkill(SkillType.FLANDREBUFF, out var skill);
skill?.AddLevel(mapData, info.DamageOrigin, 1);
}
}
}

View File

@ -27,7 +27,7 @@ namespace Logic.Skill
return SkillType.FORESTDEFENSE;
}
public override float GetExtraDefense(UnitData self, MapData mapData)
public override float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
if (!mapData.GetGridDataByUnitId(self.Id, out var grid)) return 1f;
if (grid.Vegetation == Vegetation.Trees) return 1.5f;

View File

@ -27,7 +27,7 @@ namespace Logic.Skill
return SkillType.FORTIFY;
}
public override float GetExtraDefense(UnitData self, MapData mapData)
public override float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
if (!mapData.GetGridDataByUnitId(self.Id, out var grid) || !mapData.GetCityDataByGid(grid.Id, out var city))
return 1f;
@ -36,7 +36,7 @@ namespace Logic.Skill
return 1f;
if (cityPlayer != unitPlayer)
return 1f;
return city.CityWall ? 4f : 1.5f;
return city.CityWall ? 4f : 1.5f;
}
}
}

View File

@ -33,12 +33,10 @@ namespace Logic.Skill
if (info.DamageType != DamageType.ActiveAttack) return;
if (info.IsKill) return;
if (!info.DamageTarget.GetSkill(SkillType.KAGUYAFRENCHSYNERGYDEBUFF, out var skill))
{
info.DamageTarget.AddSkill(SkillType.KAGUYAFRENCHSYNERGYDEBUFF);
info.DamageTarget.GetSkill(SkillType.KAGUYAFRENCHSYNERGYDEBUFF, out skill);
}
info.DamageTarget.AddSkill(SkillType.KAGUYAFRENCHSYNERGYDEBUFF);
info.DamageTarget.GetSkill(SkillType.KAGUYAFRENCHSYNERGYDEBUFF, out var skill);
if (skill == null) return;
skill.AddLevel(mapData, info.DamageOrigin, 1);
if (info.DamageOrigin.GetSkill(SkillType.REISENILLUSION, out var _) ||
info.DamageOrigin.GetSkill(SkillType.REISENILLUSIONPRO, out var _))
@ -46,14 +44,14 @@ namespace Logic.Skill
var player = info.DamageOrigin.Player(mapData);
if(player != null && player.PlayerHeroData.GetHeroTask(GiantType.FrenchReisen, out var task))
task.OnAddSkillLevels(mapData,SkillType.KAGUYAFRENCHSYNERGYDEBUFF,1);
}
}
public override float GetAttackerValueOffset(MapData mapData,UnitData target)
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
if (target == null) return 0;
if (!target.GetSkill(SkillType.KAGUYAFRENCHSYNERGYDEBUFF, out var skill)) return 0;
return skill.Level * 0.5f;
return skill.Level * 0.5f * self.GetSpecialSkillBonus(mapData, GetSkillType());
}
}
}

View File

@ -8,6 +8,8 @@
using System;
using MemoryPack;
using RuntimeData;
using TH1_Logic.Core;
namespace Logic.Skill
@ -25,5 +27,11 @@ namespace Logic.Skill
{
return SkillType.MEILINGCOUNTER;
}
public override void AfterActiveAttacked(MapData mapData, UnitData origin, UnitData target)
{
if (origin.Health <= 0 || target.Health <= 0) return;
Main.UnitLogic.Attack(mapData, target, origin, out _, out _, out _);
}
}
}

View File

@ -8,6 +8,7 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
@ -25,5 +26,46 @@ namespace Logic.Skill
{
return SkillType.MEILINGDUEL;
}
public override void OnDamageOther(MapData mapData, SettlementInfo info)
{
if(info.DamageType != DamageType.ActiveAttack || info.DamageOrigin.Health <= 0 || info.DamageTarget.Health <= 0) return;
var grid1 = info.DamageOrigin.Grid(mapData);
var grid2 = info.DamageTarget.Grid(mapData);
if (grid1 == null || grid2 == null) return;
var selfPlayer = info.DamageOrigin.Player(mapData);
if (selfPlayer == null) return;
var aroundHero = false;
var roundGrid = mapData.GridMap.GetAroundGridData(1, 1, grid1);
foreach (var gridData in roundGrid)
{
var unit = gridData.Unit(mapData);
if (unit == null) continue;
if (unit.UnitFullType.UnitType != UnitType.Giant) continue;
var player = unit.Player(mapData);
if (player == null) continue;
if (player.Id != selfPlayer.Id) continue;
aroundHero = true;
break;
}
if (!aroundHero) return;
aroundHero = false;
roundGrid = mapData.GridMap.GetAroundGridData(1, 1, grid2);
foreach (var gridData in roundGrid)
{
var unit = gridData.Unit(mapData);
if (unit == null) continue;
if (unit.UnitFullType.UnitType != UnitType.Giant) continue;
var player = unit.Player(mapData);
if (player == null) continue;
if (player.Id != selfPlayer.Id) continue;
aroundHero = true;
break;
}
if (!aroundHero) return;
info.DamageTarget.AddSkill(SkillType.CANTMOVE);
}
}
}

View File

@ -49,7 +49,13 @@ namespace Logic.Skill
Main.UnitLogic.RecoverHealth(mapData, self, self, 2);
}
public override float GetExtraAttack(UnitData self, MapData mapData)
public override float GetAttackAdditionParam(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;

View File

@ -27,7 +27,7 @@ namespace Logic.Skill
return SkillType.MOUNTAINDEFENSE;
}
public override float GetExtraDefense(UnitData self, MapData mapData)
public override float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
if (!mapData.GetGridDataByUnitId(self.Id, out var grid)) return 1f;
if (grid.Feature == TerrainFeature.Mountain) return 1.5f;

View File

@ -27,7 +27,7 @@ namespace Logic.Skill
return SkillType.OCEANDEFENSE;
}
public override float GetExtraDefense(UnitData self, MapData mapData)
public override float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
if (!mapData.GetGridDataByUnitId(self.Id, out var grid)) return 1f;
if (grid.Terrain == TerrainType.DeepSea) return 1.5f;

View File

@ -28,7 +28,7 @@ namespace Logic.Skill
return SkillType.PATCHOULIFIRE;
}
public override float GetExtraAttack(UnitData self, MapData mapData)
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return _level;
}

View File

@ -43,14 +43,14 @@ namespace Logic.Skill
Main.UnitLogic.RecoverHealth(mapData, self, self, _level);
}
public override float GetExtraAttack(UnitData self, MapData mapData)
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return _level * 0.5f;
}
public override float GetExtraDefense(UnitData self, MapData mapData)
public override float GetDefenseAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return _level * 1f;
return base.GetDefenseAdditionParam(mapData, self, target);
}
}
}

View File

@ -51,7 +51,7 @@ namespace Logic.Skill
_attackMark = true;
}
public override float GetExtraAttack(UnitData self, MapData mapData)
public override float GetAttackMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
if (_lastAttackMark) return 1f;
return 2f;

View File

@ -27,9 +27,9 @@ namespace Logic.Skill
return SkillType.REISENFRENCHATTAK;
}
public override void BeforeSelfActiveAttack(MapData mapData, UnitData origin, UnitData target,out int AddDmg)
public override void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target, out int addDmg)
{
AddDmg = 0;
addDmg = 0;
if (origin == null || target == null) return;
if (!mapData.GetGridDataByUnitId(target.Id, out var targetGrid)) return;
var count = 0;
@ -50,7 +50,7 @@ namespace Logic.Skill
if (origin.UnitLevel >= 3)
{
int dmg = Table.Instance.CalcDamage(mapData, origin, target, damagePara:0.5f) * count;
AddDmg = dmg;
addDmg = dmg;
Main.UnitLogic.DamageSettlement(mapData, origin, target, dmg, DamageType.FollowAttack);
}
}

View File

@ -26,7 +26,7 @@ namespace Logic.Skill
return SkillType.REISENILLUSIONPRO;
}
public override float GetAllExtraAttack(UnitData self, MapData mapData)
public override float GetAttackMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
return 0.5f;
}

View File

@ -26,7 +26,7 @@ namespace Logic.Skill
return SkillType.REISENILLUSION;
}
public override float GetAllExtraAttack(UnitData self, MapData mapData)
public override float GetAttackMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
return 0;
}

View File

@ -8,6 +8,7 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
@ -25,5 +26,22 @@ namespace Logic.Skill
{
return SkillType.REMILIAATTACK;
}
public override float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
if (target == null) return 0;
if (target.GetSkill(SkillType.REMILIAHUNTER, out _)) return 2;
return 0;
}
public override void OnDamageOther(MapData mapData, SettlementInfo info)
{
if(info.DamageType != DamageType.ActiveAttack || info.DamageOrigin.Health <= 0 || info.DamageTarget.Health <= 0) return;
if (info.DamageTarget.GetSkill(SkillType.REMILIAHUNTER, out _))
{
info.DamageTarget.RemoveSkill(SkillType.REMILIAHUNTER);
}
else info.DamageTarget.AddSkill(SkillType.REMILIAHUNTER);
}
}
}

View File

@ -8,6 +8,8 @@
using System;
using MemoryPack;
using RuntimeData;
using TH1_Logic.Core;
namespace Logic.Skill
@ -25,5 +27,20 @@ namespace Logic.Skill
{
return SkillType.REMILIABUFF;
}
public override void OnUnitDamaged(IdentifierBase identifier, MapData mapData, SettlementInfo info)
{
if (!info.IsKill) return;
var self = identifier as UnitData;
var selfGrid = self.Grid(mapData);
var grid1 = info.DamageTargetGrid;
var grid2 = info.DamageOrigin.Grid(mapData);
if (selfGrid == null || grid1 == null || grid2 == null) return;
var distance1 = mapData.GridMap.CalcDistance(selfGrid, grid1);
var distance2 = mapData.GridMap.CalcDistance(selfGrid, grid2);
if (distance1 > 2 || distance2 > 2) return;
if (!grid2.HasSpType(GridSpType.RemiliaGrid)) return;
Main.UnitLogic.RecoverHealth(mapData, self, self, info.DamageValue);
}
}
}

View File

@ -8,6 +8,7 @@
using System;
using MemoryPack;
using RuntimeData;
namespace Logic.Skill
@ -25,5 +26,17 @@ namespace Logic.Skill
{
return SkillType.REMILIAHELP;
}
public override void OnUnitDamaged(IdentifierBase identifier, MapData mapData, SettlementInfo info)
{
var self = identifier as UnitData;
if (self == null) return;
if (self.Player(mapData) != info.DamageTarget.Player(mapData)) return;
var selfGrid = self.Grid(mapData);
if (selfGrid == null || info.DamageTargetGrid == null) return;
var distance = mapData.GridMap.CalcDistance(selfGrid, info.DamageTargetGrid);
if (distance > 1) return;
info.DamageTargetGrid.AddSpType(GridSpType.RemiliaGrid);
}
}
}

View File

@ -16,8 +16,8 @@ namespace Logic.Skill
{
public RemiliaHunterSkill()
{
IsPermanent = true;
TurnsLimit = 0;
IsPermanent = false;
TurnsLimit = 1;
Score = 2;
}

View File

@ -26,8 +26,8 @@ namespace Logic.Skill
{
return SkillType.WATERDEFENSE;
}
public override float GetExtraDefense(UnitData self, MapData mapData)
public override float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
if (!mapData.GetGridDataByUnitId(self.Id, out var grid)) return 1f;
if (grid.Terrain == TerrainType.ShallowSea) return 1.5f;

View File

@ -35,7 +35,9 @@ namespace Logic.Skill
// 对他人伤害结算时
public void OnDamageOther(MapData mapData, SettlementInfo info);
// 主动攻击之前
public void BeforeSelfActiveAttack(MapData mapData, UnitData origin, UnitData target,out int addDmg);
public void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target,out int addDmg);
// 主动攻击之后
public void AfterActiveAttacked(MapData mapData, UnitData origin, UnitData target);
// 事件触发生命周期 (时刻)
public void OnTurnStart(UnitData self, MapData mapData);
@ -49,6 +51,9 @@ namespace Logic.Skill
public void OnFinished(IdentifierBase self, MapData mapData);
// 属性变化
// 是否能攻击所有人
public bool CanAttackAll(UnitData self, MapData mapData);
// 是否限制自身移动
public bool IsLimitSelfMove(UnitData self, MapData mapData);
@ -104,41 +109,35 @@ namespace Logic.Skill
// 是否隐身
public bool IsInvisible(UnitData self, MapData mapData);
// 值变化
// 获取额外防御(防御系数)
public float GetExtraDefense(UnitData self, MapData mapData);
// 获取额外视野(视野增加)
public int GetExtraSight(UnitData self, MapData mapData);
// 获得额外攻击
public float GetExtraAttack(UnitData self, MapData mapData);
// 获得额外总攻击
public float GetAllExtraAttack(UnitData self, MapData mapData);
// 获取暴击率
public float GetCriticalHitRate(UnitData self, MapData mapData);
// 攻击对方时给自己的攻击力偏移
public float GetAttackerValueOffset(MapData mapData,UnitData target);
// 防御对方时对方给自己的防御力偏移
public float GetDefenderValueOffset(MapData mapData,UnitData target);
public float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null);
public float GetAttackMultiplicationParam(MapData mapData, UnitData self, UnitData target = null);
public float GetDefenseAdditionParam(MapData mapData, UnitData self, UnitData target = null);
public float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null);
// 获得额外移动范围
public int GetExtraMoveRange(UnitData self);
// 获得额外攻击范围
public int GetExtraAttackRange(UnitData self);
// 获取特定技能加成
public int GetSpecialSkillBonus(MapData mapData, UnitData self, SkillType skillType);
// 全局技能
// 当有单位受伤结算时
public void OnUnitDamaged(IdentifierBase identifier, MapData mapData, SettlementInfo info);
// 当有单位移动时
public void OnAnyUnitMove(MapData map, UnitData moveUnit, GridData target, MoveType moveType);
}
@ -279,11 +278,16 @@ namespace Logic.Skill
}
public virtual void BeforeSelfActiveAttack(MapData mapData, UnitData origin, UnitData target,out int addDmg)
public virtual void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target,out int addDmg)
{
addDmg = 0;
}
public virtual void AfterActiveAttacked(MapData mapData, UnitData origin, UnitData target)
{
}
public virtual void OnTurnStart(UnitData self, MapData mapData)
{
@ -325,6 +329,11 @@ namespace Logic.Skill
}
public virtual void OnFinished(IdentifierBase self, MapData mapData) { }
public virtual bool CanAttackAll(UnitData self, MapData mapData)
{
return false;
}
public virtual bool IsLimitSelfMove(UnitData self, MapData mapData)
{
@ -417,40 +426,35 @@ namespace Logic.Skill
return false;
}
public virtual float GetExtraDefense(UnitData self, MapData mapData)
{
return 1f;
}
public virtual int GetExtraSight(UnitData self, MapData mapData)
{
return 0;
}
public virtual float GetExtraAttack(UnitData self, MapData mapData)
{
return 1f;
}
public virtual float GetAllExtraAttack(UnitData self, MapData mapData)
{
return 1f;
}
public virtual float GetCriticalHitRate(UnitData self, MapData mapData)
{
return 0;
}
public virtual float GetAttackerValueOffset(MapData mapData, UnitData target)
public virtual float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return 0;
}
public virtual float GetDefenderValueOffset(MapData mapData, UnitData origin)
public virtual float GetDefenseAdditionParam(MapData mapData, UnitData self, UnitData target = null)
{
return 0;
}
public virtual float GetAttackMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
return 1;
}
public virtual float GetDefenseMultiplicationParam(MapData mapData, UnitData self, UnitData target = null)
{
return 1;
}
public virtual int GetExtraMoveRange(UnitData self)
{
@ -462,6 +466,11 @@ namespace Logic.Skill
return 0;
}
public virtual int GetSpecialSkillBonus(MapData mapData, UnitData self, SkillType skillType)
{
return 1;
}
public virtual void OnUnitDamaged(IdentifierBase identifier, MapData mapData, SettlementInfo info)
{

View File

@ -270,7 +270,7 @@ namespace Logic
foreach (var skill in unit1.Skills)
{
skill.BeforeSelfActiveAttack(mapData, unit1, unit2,out var tmpAddDmg);
skill.BeforeActiveAttackOther(mapData, unit1, unit2, out var tmpAddDmg);
attackDmg += tmpAddDmg;
}
// 计算攻击伤害
@ -307,6 +307,8 @@ namespace Logic
else
fragmentType = FragmentType.AttackAndCounterDie;
}
foreach (var skill in unit2.Skills) skill.AfterActiveAttacked(mapData, unit1, unit2);
}
// 伤害新结算方法所有的掉血都要走此方法不允许直接修改UnitData.Health
@ -329,7 +331,7 @@ namespace Logic
return null;
}
if (mapData.IsLeagueUnitByUnit(origin.Id, target.Id) && type != DamageType.KillSelf)
if (!origin.CanAttackAll(mapData) && mapData.IsLeagueUnitByUnit(origin.Id, target.Id) && type != DamageType.KillSelf)
{
LogSystem.LogError($"DamageSettlement !!! mapData.IsLeagueUnitByUnit(origin.Id, target.Id) && type != DamageType.KillSelf)");
return null;

View File

@ -274,7 +274,7 @@ namespace TH1_Renderer
public void RenderUpdateUnitDefense()
{
float defenseBonus = _unitData.GetExtraDefense(Main.MapData);
float defenseBonus = _unitData.GetDefenseMultiplicationParam(Main.MapData);
switch (defenseBonus)
{
case 1.0f: