Merge branch 'main' of http://10.27.17.121:3000/kawagiri/TH1
This commit is contained in:
commit
4ac1983b0c
@ -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);
|
||||
|
||||
@ -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打B,B反击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
|
||||
{
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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 _);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,8 +16,8 @@ namespace Logic.Skill
|
||||
{
|
||||
public RemiliaHunterSkill()
|
||||
{
|
||||
IsPermanent = true;
|
||||
TurnsLimit = 0;
|
||||
IsPermanent = false;
|
||||
TurnsLimit = 1;
|
||||
Score = 2;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user