1091 lines
29 KiB
C#
1091 lines
29 KiB
C#
/*
|
||
* @Author: 白哉
|
||
* @Description: 技能类
|
||
* @Date: 2025年04月22日 星期二 17:04:44
|
||
* @Modify:
|
||
*/
|
||
|
||
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using MemoryPack;
|
||
using RuntimeData;
|
||
using UnityEngine;
|
||
using UnityEngine.Rendering;
|
||
|
||
public enum SkillType
|
||
{
|
||
/*NONE,
|
||
PEACE,
|
||
DASH,
|
||
ESCAPE,
|
||
PERSIST,
|
||
SPLASH,
|
||
SNEAK,
|
||
STIFF,
|
||
FORTIFY,
|
||
HEAL,
|
||
CONVERT,
|
||
CARRY,
|
||
SCOUT,
|
||
STATIC,
|
||
HIDE,
|
||
CREEP,
|
||
INFILTRATE,
|
||
BOOST,
|
||
EXPLODE,
|
||
STOMP,
|
||
ATTACKUP,
|
||
SPEEDUP,
|
||
FORESTDEFENSE,
|
||
WATERDEFENSE,
|
||
OCEANDEFENSE,
|
||
MOUNTAINDEFENSE,
|
||
MOUNTAINMOVE,
|
||
WATERMOVE,
|
||
OCEANMOVE,
|
||
SURPRISE,
|
||
POISON,
|
||
POISONED,
|
||
UNIQUE,
|
||
SWAP,
|
||
AUTOHEAL,
|
||
CITYTRANSPORT,
|
||
ALLYCOUNTER,
|
||
POWERUP,
|
||
ALLYTRANSPORT,
|
||
QUARTET,
|
||
TAICHI,
|
||
POORHEALTH,
|
||
ROYALFLAMES,
|
||
VAMPIRE,
|
||
SUPERDASH,
|
||
PHOENIX,
|
||
PHOENIXEGG,
|
||
ILLUSION,
|
||
LUCK,
|
||
CRITICAL,
|
||
MOONPRINCESS,
|
||
ETERNITY,
|
||
GALAXYARROW,
|
||
WINDGOD,
|
||
WINDPRIESTESS,
|
||
MOUNTAINGOD,
|
||
CURSEGOD,
|
||
NUCLEAR,
|
||
NUCLEARFUSION,
|
||
CATCART,
|
||
RECYCLE,
|
||
THIRDEYE,
|
||
SUPERHIDE,
|
||
|
||
|
||
// 文明技能
|
||
CommonPlayerSkillIndustry,
|
||
RemiliaForcesSkill1,
|
||
EgyptCivSkill1,
|
||
|
||
// 2025.8.13新增
|
||
RENGESYOU,
|
||
RENGESYOUCONTRO,
|
||
LAEVATAIN,
|
||
LAEVATAINPREY,
|
||
SATSUJINKI,
|
||
PHILOSTONE,
|
||
ROYALFLAMESPRO,
|
||
VAMPIREPRO,
|
||
DUO,
|
||
TRIO,
|
||
|
||
//2025.9.5 永远亭新增
|
||
KaguyaFrenchNapoleonicCode,
|
||
KaguyaFrenchWarriorSynergy,
|
||
KaguyaFrenchBambooMove,
|
||
KaguyaFrenchCatapultSynergy,
|
||
BAMBOOMOVE,
|
||
KAGUYAFRENCHSYNERGY,
|
||
KAGUYAFRENCHSYNERGYDEBUFF,
|
||
NOPOPULATION,
|
||
|
||
// 2025.9.12新增 Demo V1.4
|
||
TEWIFRENCHSIGHT,
|
||
TEWIFRENCHDIE,
|
||
TEWIFRENCHATTACK,
|
||
TEWIFRENCHKILL,
|
||
TEWIFRENCHBUFF,
|
||
EIRINFRENCHKILL,
|
||
EIRINFRENCHATTACK,
|
||
EIRINFRENCHBUFF,
|
||
MOKOUFRENCHEGG,
|
||
MOKOUFRENCHREVIVE,
|
||
MOVERANGEUP,
|
||
ATTACKRANGEUP,
|
||
ATTACKAFTERKILL,
|
||
MOKOUFRENCHBOOM,
|
||
KAGUYAFRENCHFOREVERBUFF,
|
||
KAGUYAFRENCHATTACK,
|
||
KAGUYAFRENCHAROUND,
|
||
KAGUYAFRENCHATTACKPRO,
|
||
REISENILLUSION,
|
||
REISENFRENCHKILL,
|
||
REISENFRENCHATTAK,
|
||
REISENILLUSIONPRO,
|
||
REISENFRENCHKILLPRO,
|
||
FLY,
|
||
FORESTSTARTDASH,
|
||
LANDONLY,
|
||
LANDANDWATER,
|
||
|
||
// 10.12新增
|
||
SAKUYAFLY,
|
||
SAKUYAGUARD,
|
||
SAKUYAKILL,
|
||
SAKUYAFLYPRO,
|
||
PATCHOULIMOVE,
|
||
PATCHOULIREST,
|
||
PATCHOULISTONE,
|
||
PATCHOULISTONEPRO,
|
||
PATCHOULIEARTH,
|
||
PATCHOULIWATER,
|
||
PATCHOULIMETAL,
|
||
PATCHOULIMOVEPRO,
|
||
PATCHOULIWOOD,
|
||
PATCHOULIFIRE,
|
||
MEILINGREST,
|
||
MEILINGCOUNTER,
|
||
MEILINGDUEL,
|
||
CANTMOVE,
|
||
REMILIAHELP,
|
||
REMILIAHUNTER,
|
||
REMILIAATTACK,
|
||
REMILIABUFF,
|
||
FLANDREATTACK,
|
||
FLANDREKILL,
|
||
FLANDREBUFF,
|
||
RemiliaEgyptianEmpireKill,
|
||
|
||
//红雾领地下所有单位的实时吸血效果
|
||
ScarletMistRealTimeVampire,
|
||
REDMISTDEFENSE,
|
||
REMILIAHELPPRO,
|
||
KOAKUMADEVOTION,
|
||
KOAKUMAHERO,
|
||
ScarletMistRealTimeVampireDebuff,
|
||
ScarletKoakuma,
|
||
REMILIABUFF2,
|
||
REMILIABUFF3,
|
||
REMILIAABSORB,
|
||
|
||
// 11.13新增
|
||
MORIYABUFF,
|
||
KANAKOTECH,
|
||
KANAKOBATTLEFIELD,
|
||
KANAKOMOUNTAIN,
|
||
KANAKOMOUNTAINATTACK,
|
||
KANAKOMOUNTAINBUFF,
|
||
KANAKOSITTING,
|
||
KANAKOWIND,
|
||
SUWAKOMOVE,
|
||
SUWAKOATTACK,
|
||
SUWAKOATTACKPRO,
|
||
SUWAKOATTACKALLY,
|
||
SUWAKOHEBIATTACK,
|
||
SANAEMOVE,
|
||
SANAEWIND,
|
||
SANAEWINDX,
|
||
SANAEDIVINE,
|
||
SANAENINE,
|
||
TENGUBUFF,
|
||
PATHSTOMP,
|
||
AYAMOVEAGAIN,
|
||
AYAMOVEAGAINBUFF,
|
||
MOMIJISIGHT,
|
||
MOMIJIHUNT,
|
||
MOMIJIPREY,
|
||
MOMIJIHUNTER,
|
||
MOMIJIBUFF,
|
||
MOMIJIHUNTERATTACK,
|
||
SANAENINECONTINUE,
|
||
GRIDSANAENINECONTINUEDAMAGE,
|
||
GRIDMOMIJIPREY,
|
||
GRIDMOUNTAIN,
|
||
JUNKEROFFICER,
|
||
MORIYAKNIGHTMOVE,
|
||
MORIYAROAD,
|
||
OFFICER,
|
||
KANAKOWINDPRO,
|
||
KANAKOWAR,
|
||
KANAKOWARPRO,
|
||
SUWAKOCOMBINE,
|
||
SUWAKOSPLIT,
|
||
SUWAKOFULLMAP,
|
||
SUWAKOHEBICOMBINE,
|
||
SUWAKOHEBISPLIT,
|
||
SUWAKOHEBI,
|
||
KANAKOBATTLEFIELDPRO,
|
||
AYABUFF,*/
|
||
|
||
NONE = 0,
|
||
PEACE = 1,
|
||
DASH = 2,
|
||
ESCAPE = 3,
|
||
PERSIST = 4,
|
||
SPLASH = 5,
|
||
SNEAK = 6,
|
||
STIFF = 7,
|
||
FORTIFY = 8,
|
||
HEAL = 9,
|
||
CONVERT = 10,
|
||
CARRY = 11,
|
||
SCOUT = 12,
|
||
STATIC = 13,
|
||
HIDE = 14,
|
||
CREEP = 15,
|
||
INFILTRATE = 16,
|
||
BOOST = 17,
|
||
EXPLODE = 18,
|
||
STOMP = 19,
|
||
ATTACKUP = 20,
|
||
SPEEDUP = 21,
|
||
FORESTDEFENSE = 22,
|
||
WATERDEFENSE = 23,
|
||
OCEANDEFENSE = 24,
|
||
MOUNTAINDEFENSE = 25,
|
||
MOUNTAINMOVE = 26,
|
||
WATERMOVE = 27,
|
||
OCEANMOVE = 28,
|
||
SURPRISE = 29,
|
||
POISON = 30,
|
||
POISONED = 31,
|
||
UNIQUE = 32,
|
||
SWAP = 33,
|
||
AUTOHEAL = 34,
|
||
CITYTRANSPORT = 35,
|
||
ALLYCOUNTER = 36,
|
||
POWERUP = 37,
|
||
ALLYTRANSPORT = 38,
|
||
QUARTET = 39,
|
||
TAICHI = 40,
|
||
POORHEALTH = 41,
|
||
ROYALFLAMES = 42,
|
||
VAMPIRE = 43,
|
||
SUPERDASH = 44,
|
||
PHOENIX = 45,
|
||
PHOENIXEGG = 46,
|
||
ILLUSION = 47,
|
||
LUCK = 48,
|
||
CRITICAL = 49,
|
||
MOONPRINCESS = 50,
|
||
ETERNITY = 51,
|
||
GALAXYARROW = 52,
|
||
WINDGOD = 53,
|
||
WINDPRIESTESS = 54,
|
||
MOUNTAINGOD = 55,
|
||
CURSEGOD = 56,
|
||
NUCLEAR = 57,
|
||
NUCLEARFUSION = 58,
|
||
CATCART = 59,
|
||
RECYCLE = 60,
|
||
THIRDEYE = 61,
|
||
SUPERHIDE = 62,
|
||
// 文明技能 = ,
|
||
CommonPlayerSkillIndustry = 63,
|
||
RemiliaForcesSkill1 = 64,
|
||
EgyptCivSkill1 = 65,
|
||
// 2025.8.13新增 = ,
|
||
RENGESYOU = 66,
|
||
RENGESYOUCONTRO = 67,
|
||
LAEVATAIN = 68,
|
||
LAEVATAINPREY = 69,
|
||
SATSUJINKI = 70,
|
||
PHILOSTONE = 71,
|
||
ROYALFLAMESPRO = 72,
|
||
VAMPIREPRO = 73,
|
||
DUO = 74,
|
||
TRIO = 75,
|
||
//2025.9.5 永远亭新增 = ,
|
||
KaguyaFrenchNapoleonicCode = 76,
|
||
KaguyaFrenchWarriorSynergy = 77,
|
||
KaguyaFrenchBambooMove = 78,
|
||
KaguyaFrenchCatapultSynergy = 79,
|
||
BAMBOOMOVE = 80,
|
||
KAGUYAFRENCHSYNERGY = 81,
|
||
KAGUYAFRENCHSYNERGYDEBUFF = 82,
|
||
NOPOPULATION = 83,
|
||
// 2025.9.12新增Demo V1.4 = ,
|
||
TEWIFRENCHSIGHT = 84,
|
||
TEWIFRENCHDIE = 85,
|
||
TEWIFRENCHATTACK = 86,
|
||
TEWIFRENCHKILL = 87,
|
||
TEWIFRENCHBUFF = 88,
|
||
EIRINFRENCHKILL = 89,
|
||
EIRINFRENCHATTACK = 90,
|
||
EIRINFRENCHBUFF = 91,
|
||
MOKOUFRENCHEGG = 92,
|
||
MOKOUFRENCHREVIVE = 93,
|
||
MOVERANGEUP = 94,
|
||
ATTACKRANGEUP = 95,
|
||
ATTACKAFTERKILL = 96,
|
||
MOKOUFRENCHBOOM = 97,
|
||
KAGUYAFRENCHFOREVERBUFF = 98,
|
||
KAGUYAFRENCHATTACK = 99,
|
||
KAGUYAFRENCHAROUND = 100,
|
||
KAGUYAFRENCHATTACKPRO = 101,
|
||
REISENILLUSION = 102,
|
||
REISENFRENCHKILL = 103,
|
||
REISENFRENCHATTAK = 104,
|
||
REISENILLUSIONPRO = 105,
|
||
REISENFRENCHKILLPRO = 106,
|
||
FLY = 107,
|
||
FORESTSTARTDASH = 108,
|
||
LANDONLY = 109,
|
||
LANDANDWATER = 110,
|
||
// 10.12新增 = ,
|
||
SAKUYAFLY = 111,
|
||
SAKUYAGUARD = 112,
|
||
SAKUYAKILL = 113,
|
||
SAKUYAFLYPRO = 114,
|
||
PATCHOULIMOVE = 115,
|
||
PATCHOULIREST = 116,
|
||
PATCHOULISTONE = 117,
|
||
PATCHOULISTONEPRO = 118,
|
||
PATCHOULIEARTH = 119,
|
||
PATCHOULIWATER = 120,
|
||
PATCHOULIMETAL = 121,
|
||
PATCHOULIMOVEPRO = 122,
|
||
PATCHOULIWOOD = 123,
|
||
PATCHOULIFIRE = 124,
|
||
MEILINGREST = 125,
|
||
MEILINGCOUNTER = 126,
|
||
MEILINGDUEL = 127,
|
||
CANTMOVE = 128,
|
||
REMILIAHELP = 129,
|
||
REMILIAHUNTER = 130,
|
||
REMILIAATTACK = 131,
|
||
REMILIABUFF = 132,
|
||
FLANDREATTACK = 133,
|
||
FLANDREKILL = 134,
|
||
FLANDREBUFF = 135,
|
||
RemiliaEgyptianEmpireKill = 136,
|
||
//红雾领地下所有单位的实时吸血效果 = ,
|
||
ScarletMistRealTimeVampire = 137,
|
||
REDMISTDEFENSE = 138,
|
||
REMILIAHELPPRO = 139,
|
||
KOAKUMADEVOTION = 140,
|
||
KOAKUMAHERO = 141,
|
||
ScarletMistRealTimeVampireDebuff = 142,
|
||
ScarletKoakuma = 143,
|
||
REMILIABUFF2 = 144,
|
||
REMILIABUFF3 = 145,
|
||
REMILIAABSORB = 146,
|
||
// 11.13新增 = ,
|
||
MORIYABUFF = 147,
|
||
KANAKOTECH = 148,
|
||
KANAKOBATTLEFIELD = 149,
|
||
KANAKOMOUNTAIN = 150,
|
||
KANAKOMOUNTAINATTACK = 151,
|
||
KANAKOMOUNTAINBUFF = 152,
|
||
KANAKOSITTING = 153,
|
||
KANAKOWIND = 154,
|
||
SUWAKOMOVE = 155,
|
||
SUWAKOATTACK = 156,
|
||
SUWAKOATTACKPRO = 157,
|
||
SUWAKOATTACKALLY = 158,
|
||
SUWAKOHEBIATTACK = 159,
|
||
SANAEMOVE = 160,
|
||
SANAEWIND = 161,
|
||
SANAEWINDX = 162,
|
||
SANAEDIVINE = 163,
|
||
SANAENINE = 164,
|
||
TENGUBUFF = 165,
|
||
PATHSTOMP = 166,
|
||
AYAMOVEAGAIN = 167,
|
||
AYAMOVEAGAINBUFF = 168,
|
||
MOMIJISIGHT = 169,
|
||
MOMIJIHUNT = 170,
|
||
MOMIJIPREY = 171,
|
||
MOMIJIHUNTER = 172,
|
||
MOMIJIBUFF = 173,
|
||
MOMIJIHUNTERATTACK = 174,
|
||
SANAENINECONTINUE = 175,
|
||
GRIDSANAENINECONTINUEDAMAGE = 176,
|
||
GRIDMOMIJIPREY = 177,
|
||
GRIDMOUNTAIN = 178,
|
||
JUNKEROFFICER = 179,
|
||
MORIYAKNIGHTMOVE = 180,
|
||
MORIYAROAD = 181,
|
||
OFFICER = 182,
|
||
KANAKOWINDPRO = 183,
|
||
KANAKOWAR = 184,
|
||
KANAKOWARPRO = 185,
|
||
SUWAKOCOMBINE = 186,
|
||
SUWAKOSPLIT = 187,
|
||
SUWAKOFULLMAP = 188,
|
||
SUWAKOHEBICOMBINE = 189,
|
||
SUWAKOHEBISPLIT = 190,
|
||
SUWAKOHEBI = 191,
|
||
KANAKOBATTLEFIELDPRO = 192,
|
||
AYABUFF = 193,
|
||
Max = 194,
|
||
}
|
||
|
||
namespace Logic.Skill
|
||
{
|
||
|
||
//SkillType 只能新增, 不能删除!
|
||
|
||
|
||
public enum SkillDamageEvent
|
||
{
|
||
ActiveAttackBeforeStarted,
|
||
ActiveAttackFinished,
|
||
}
|
||
|
||
|
||
public interface ISkill
|
||
{
|
||
public SkillType GetSkillType();
|
||
|
||
public bool ReservedOnTransform(UnitData self, UnitFullType fullType);
|
||
public void NewSkillOnTransform(List<SkillBase> oldSkills);
|
||
|
||
|
||
|
||
#region [ ---------------------------------------------------------------- 生命周期--------------------------------------------------------]
|
||
// 事件触发生命周期 (事件已发生)
|
||
public void OnMove(UnitData self, GridData grid, MapData mapData, MoveType moveType, List<Vector2Int> path = null);
|
||
|
||
// 伤害结算前自身承受阶段
|
||
public void BeforeDamagedSupportStage(MapData mapData, SettlementInfo info);
|
||
|
||
// 伤害结算前自身转移阶段
|
||
public void BeforeDamagedTransformStage(MapData mapData, SettlementInfo info);
|
||
|
||
// 对他人伤害结算前
|
||
public void BeforeDamageOther(MapData mapData, SettlementInfo info);
|
||
// 伤害结算时
|
||
public void OnDamaged(MapData mapData, SettlementInfo info);
|
||
// 对他人伤害结算时
|
||
public void OnDamageOther(MapData mapData, SettlementInfo info);
|
||
public void AfterDamageOther(MapData mapData, SettlementInfo info);
|
||
|
||
public void OnHealOther(MapData mapData, UnitData origin, HealType healType);
|
||
// 主动攻击之前
|
||
public void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target,out int addDmg);
|
||
// 主动攻击之后
|
||
public void AfterActiveAttackOther(MapData mapData, UnitData origin, UnitData target);
|
||
public void AfterActiveAttacked(MapData mapData, UnitData origin, UnitData target);
|
||
|
||
// 事件触发生命周期 (时刻)
|
||
public void OnTurnStart(IdentifierBase self, MapData mapData);
|
||
public void OnTurnEnd(IdentifierBase self, MapData mapData);
|
||
public void OnFinished(IdentifierBase self, MapData mapData);
|
||
// 全局技能
|
||
// 当有单位受伤结算前
|
||
public void BeforeUnitDamaged(UnitData self, MapData mapData, SettlementInfo info);
|
||
|
||
// 当有单位受伤结算时
|
||
public void OnUnitDamaged(UnitData self, MapData mapData, SettlementInfo info);
|
||
|
||
// 当有单位移动时
|
||
public void OnAnyUnitMove(MapData map, UnitData self, UnitData moveUnit, GridData target, MoveType moveType);
|
||
|
||
// 当有单位死亡时
|
||
public void OnAnyUnitDie(MapData map, UnitData self);
|
||
|
||
// 当有单位创建时
|
||
public void OnAnyUnitCreate(MapData map, UnitData self, UnitData newUnit);
|
||
|
||
// 当有行为执行后
|
||
public void OnActionExecuted(MapData mapData, UnitData self);
|
||
|
||
#endregion
|
||
|
||
|
||
#region [ ---------------------------------------------------------------- 判断属性--------------------------------------------------------]
|
||
|
||
// 判断是不是Officer
|
||
public bool IsOfficer();
|
||
// 获取Officer的额外血量
|
||
public int GetOfficerHealth();
|
||
|
||
// 属性变化
|
||
// 是否能攻击所有人
|
||
public bool CanAttackAll(UnitData self, MapData mapData);
|
||
|
||
// 是否限制自身移动
|
||
public bool IsLimitSelfMove(UnitData self, MapData mapData);
|
||
|
||
// 是否限制自身攻击
|
||
public bool IsLimitSelfAttack(UnitData self, MapData mapData);
|
||
|
||
// 是否限制敌方反击
|
||
public bool IsLimitTargetCounterAttack(UnitData self, MapData mapData);
|
||
|
||
// 是否限制自身反击
|
||
public bool IsLimitSelfCounterAttack(UnitData self, MapData mapData);
|
||
|
||
// 是否无视敌人控制区
|
||
public bool IsIgnoreControlArea(UnitData self, MapData mapData);
|
||
|
||
// 是否限制自身经验增长
|
||
public bool IsLimitSelfExp(UnitData self, MapData mapData);
|
||
|
||
// 是否无视树林和山脉
|
||
public bool IsIgnoreWoodAndMountains(UnitData self, MapData mapData);
|
||
|
||
// 是否能在指定海陆层移动
|
||
public bool IsCanMoveOnTerrain(UnitData self, MapData mapData, TerrainType terrainType);
|
||
|
||
// 是否能在指定地形层移动
|
||
public bool IsCanMoveOnFeature(UnitData self, MapData mapData, TerrainFeature featureType);
|
||
|
||
// 是否无视地形层移动减损
|
||
public bool IsIgnoreMoveLoss(UnitData self, MapData mapData, TerrainFeature terrainType);
|
||
|
||
// 是否无视植被层移动减损
|
||
public bool IsIgnoreMoveLoss(UnitData self, MapData mapData, Vegetation terrainType);
|
||
|
||
// 是否具备同类数量限制
|
||
public bool IsLimitCount(UnitData self, MapData mapData, out int count);
|
||
|
||
// 是否能移动到我方的无人城市
|
||
public bool IsCanMoveToNoUnitSelfCity(UnitData self, MapData mapData);
|
||
|
||
// 是否能移动到我方的英雄附近
|
||
public bool IsCanMoveGiantNearbyGrid(UnitData self, MapData mapData);
|
||
|
||
// 是否能移动到
|
||
|
||
// 能否被杀死
|
||
public bool IsCanBeKill(UnitData self, MapData mapData);
|
||
|
||
// 能否被伤害
|
||
public bool IsCanBeDamaged(UnitData self, MapData mapData, int dmg);
|
||
|
||
// 能否制造矿山
|
||
public bool IsCanBuildMine(UnitData self, MapData mapData);
|
||
|
||
// 是否隐身
|
||
public bool IsInvisible(UnitData self, MapData mapData);
|
||
|
||
// 是否限制只能在我方领土移动
|
||
public bool IsLimitMoveToSelfTerrain(UnitData self, MapData mapData);
|
||
|
||
// 判断能否立刻成为Officer
|
||
public bool IsCanBeOfficer();
|
||
// 判断是否是Officer的苗子
|
||
public bool IsPrepareOfficer();
|
||
|
||
// 判断是否能攻击Ground
|
||
public bool IsCanAttackTargetGrid(MapData map,UnitData self, GridData target);
|
||
|
||
//判断是否能攻击友军
|
||
public bool IsCanAttackAlly();
|
||
|
||
//判断是否能攻击指定单位(SuwakoHebi 专用
|
||
public bool IsCanAttackTargetAlly(MapData map, UnitData self, UnitData target);
|
||
|
||
#endregion
|
||
|
||
#region [------------------------------------------------------------------------------获取状态值------------------------------------------------------------------------------]
|
||
|
||
// 值变化
|
||
// 获取额外视野(视野增加)
|
||
public int GetExtraSight(UnitData self, MapData mapData);
|
||
|
||
// 获取暴击率
|
||
public float GetCriticalHitRate(UnitData self, MapData mapData);
|
||
|
||
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(MapData mapData,UnitData self);
|
||
|
||
// 获得对应格子的额外移动范围
|
||
public int GetExtraMoveRange(UnitData self, GridData grid);
|
||
|
||
// 获得固定移动范围
|
||
public bool GetFinalMoveRange(UnitData self, out int fixedRange);
|
||
|
||
// 获得额外攻击范围
|
||
public int GetExtraAttackRange(MapData map,UnitData self);
|
||
|
||
// 获取特定技能加成
|
||
public int GetSpecialSkillBonus(MapData mapData, UnitData self, SkillType skillType);
|
||
|
||
public int GetKillCount();
|
||
|
||
//获取当前skill应该有的背景颜色
|
||
//public Color GetBGColor();
|
||
#endregion
|
||
|
||
// -------------------------------------------- 操作修改属性 -----------------------------------------
|
||
#region
|
||
|
||
public void SetOfficer();
|
||
|
||
|
||
#endregion
|
||
}
|
||
|
||
|
||
[MemoryPackable]
|
||
public abstract partial class SkillBase : ISkill
|
||
{
|
||
[MemoryPackInclude]
|
||
protected bool IsPermanent;
|
||
//是否叠层
|
||
[MemoryPackInclude]
|
||
protected bool IsLevelSkill;
|
||
//如果是叠层且0层的时候仍然有该状态
|
||
[MemoryPackInclude]
|
||
protected bool ZeroLevelStay;
|
||
|
||
[MemoryPackInclude]
|
||
protected uint OriginId;
|
||
[MemoryPackInclude]
|
||
protected uint Turns;
|
||
[MemoryPackInclude]
|
||
protected uint TurnsLimit;
|
||
[MemoryPackInclude]
|
||
protected float Score;
|
||
[MemoryPackInclude]
|
||
protected int _level;
|
||
[MemoryPackInclude]
|
||
protected int _levelLimit;
|
||
[MemoryPackInclude]
|
||
protected bool _autoDisappear;
|
||
|
||
public virtual int Level => _level;
|
||
public bool HasLevel => IsLevelSkill;
|
||
public bool HasTimeLimit => !IsPermanent;
|
||
public int LastTime => (int)TurnsLimit - (int)Turns;
|
||
public bool NoShow => _autoDisappear && _level == 0;
|
||
public bool ShowSkillLevel => IsLevelSkill && !NoShow;
|
||
|
||
public bool ShowSkill => !IsLevelSkill || ShowSkillLevel;
|
||
|
||
[MemoryPackConstructor]
|
||
public SkillBase()
|
||
{
|
||
IsLevelSkill = false;
|
||
Turns = 0;
|
||
_level = 0;
|
||
_autoDisappear = true;
|
||
}
|
||
|
||
public abstract SkillType GetSkillType();
|
||
public virtual bool ReservedOnTransform(UnitData self, UnitFullType fullType)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual void NewSkillOnTransform(List<SkillBase> oldSkills)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual float GetScore()
|
||
{
|
||
return Score;
|
||
}
|
||
|
||
public virtual bool IsFinished()
|
||
{
|
||
Turns++;
|
||
return (!IsPermanent && TurnsLimit < Turns) || (IsLevelSkill && _autoDisappear && _level == 0);
|
||
}
|
||
|
||
public SkillBase GetCopySkill()
|
||
{
|
||
var skill = SkillFactory.GetSkillBySkillType(GetSkillType());
|
||
GetSkillCopy(skill);
|
||
return skill;
|
||
}
|
||
|
||
public virtual void SetTurnsLimit(uint time)
|
||
{
|
||
IsPermanent = false;
|
||
TurnsLimit = time;
|
||
}
|
||
|
||
public virtual void AddTurnLimit(uint time)
|
||
{
|
||
TurnsLimit += time;
|
||
}
|
||
|
||
public virtual void AddLevel(MapData map, UnitData origin, UnitData self, int add)
|
||
{
|
||
_level += add;
|
||
if (_level > _levelLimit) _level = _levelLimit;
|
||
if (!map.GetPlayerDataByUnitId(origin.Id, out var player)) return;
|
||
origin.HeroTask(map)?.OnAddSkillLevels(map, GetSkillType(), (uint)add);
|
||
}
|
||
|
||
public virtual void ReduceLevel(MapData map, UnitData origin, int reduce)
|
||
{
|
||
_level -= reduce;
|
||
}
|
||
|
||
public virtual void SetLevel(int level)
|
||
{
|
||
_level = level;
|
||
}
|
||
|
||
public virtual void GetSkillCopy(SkillBase skill)
|
||
{
|
||
skill.IsPermanent = IsPermanent;
|
||
skill.IsLevelSkill = IsLevelSkill;
|
||
skill.ZeroLevelStay = ZeroLevelStay;
|
||
|
||
skill.OriginId = OriginId;
|
||
skill.Turns = Turns;
|
||
skill.TurnsLimit = TurnsLimit;
|
||
skill._level = _level;
|
||
skill._levelLimit = _levelLimit;
|
||
skill._autoDisappear = _autoDisappear;
|
||
}
|
||
|
||
public virtual void DeepCopy(SkillBase copySkill)
|
||
{
|
||
IsPermanent = copySkill.IsPermanent;
|
||
IsLevelSkill = copySkill.IsLevelSkill;
|
||
ZeroLevelStay = copySkill.ZeroLevelStay;
|
||
|
||
OriginId = copySkill.OriginId;
|
||
Turns = copySkill.Turns;
|
||
TurnsLimit = copySkill.TurnsLimit;
|
||
_level = copySkill._level;
|
||
_levelLimit = copySkill._levelLimit;
|
||
_autoDisappear = copySkill._autoDisappear;
|
||
}
|
||
|
||
|
||
//----------------------------------------- 生命周期 -----------------------------------------
|
||
#region
|
||
|
||
public virtual void OnSkillAdd(MapData mapData, uint originId)
|
||
{
|
||
OriginId = originId;
|
||
}
|
||
|
||
public virtual void OnMove(UnitData self, GridData grid, MapData mapData,MoveType moveType, List<Vector2Int> path = null)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void BeforeDamagedSupportStage(MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void BeforeDamagedTransformStage(MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void BeforeDamageOther(MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnDamaged(MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnDamageOther(MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void AfterDamageOther(MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
public virtual void OnHealOther(MapData mapData, UnitData origin,HealType healType)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void BeforeActiveAttackOther(MapData mapData, UnitData origin, UnitData target,out int addDmg)
|
||
{
|
||
addDmg = 0;
|
||
}
|
||
|
||
public virtual void AfterActiveAttackOther(MapData mapData, UnitData origin, UnitData target)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void AfterActiveAttacked(MapData mapData, UnitData origin, UnitData target)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnTurnStart(IdentifierBase self, MapData mapData)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnTurnEnd(IdentifierBase self, MapData mapData)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnFinished(IdentifierBase self, MapData mapData) { }
|
||
|
||
public virtual bool CanAttackAll(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual void BeforeUnitDamaged(UnitData self, MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnUnitDamaged(UnitData self, MapData mapData, SettlementInfo info)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnAnyUnitMove(MapData map, UnitData self, UnitData moveUnit, GridData target, MoveType moveType)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnAnyUnitDie(MapData map, UnitData self)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnAnyUnitCreate(MapData map, UnitData self, UnitData newUnit)
|
||
{
|
||
|
||
}
|
||
|
||
public virtual void OnActionExecuted(MapData mapData, UnitData self) { }
|
||
|
||
#endregion
|
||
// ---------------------------------------- 判断方法 -------------------------------------
|
||
#region
|
||
|
||
|
||
|
||
public virtual bool IsLimitMoveToSelfTerrain(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
// 判断是不是Officer
|
||
public virtual bool IsOfficer()
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsLimitSelfMove(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsLimitSelfAttack(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsLimitTargetCounterAttack(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsLimitSelfCounterAttack(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsIgnoreControlArea(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsLimitSelfExp(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsIgnoreWoodAndMountains(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanMoveOnTerrain(UnitData self, MapData mapData, TerrainType terrainType)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanMoveOnFeature(UnitData self, MapData mapData, TerrainFeature terrainType)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsIgnoreMoveLoss(UnitData self, MapData mapData, TerrainFeature terrainType)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsIgnoreMoveLoss(UnitData self, MapData mapData, Vegetation terrainType)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsLimitCount(UnitData self, MapData mapData, out int count)
|
||
{
|
||
count = -1;
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanMoveToNoUnitSelfCity(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanMoveGiantNearbyGrid(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanBeKill(UnitData self, MapData mapData)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
public virtual bool IsCanBeDamaged(UnitData self, MapData mapData, int dmg)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
public virtual bool IsCanBuildMine(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsInvisible(UnitData self, MapData mapData)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanBeOfficer()
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsPrepareOfficer()
|
||
{
|
||
return false;
|
||
}
|
||
|
||
|
||
// yse TODO 和白哉确认
|
||
public virtual bool IsCanAttackTargetGrid(MapData map, UnitData self,GridData target)
|
||
{
|
||
return false;
|
||
}
|
||
|
||
public virtual bool IsCanAttackAlly()
|
||
{
|
||
return false;
|
||
}
|
||
|
||
//在已经IsCanAttackAlly的情况下,额外判断能否attack指定target(目前仅用于suwako hebi,默认是true
|
||
public virtual bool IsCanAttackTargetAlly(MapData map, UnitData self,UnitData target)
|
||
{
|
||
return true;
|
||
}
|
||
|
||
#endregion
|
||
// ---------------------------------------- 获取属性值方法 -------------------------------------
|
||
#region
|
||
// 获取Officer的额外血量
|
||
public virtual int GetOfficerHealth() { return 0; }
|
||
|
||
public virtual int GetExtraSight(UnitData self, MapData mapData)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
public virtual float GetCriticalHitRate(UnitData self, MapData mapData)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
|
||
public virtual float GetAttackAdditionParam(MapData mapData, UnitData self, UnitData target = null)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
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(MapData mapData,UnitData self)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
//用于Momoji的特殊技能
|
||
public virtual int GetExtraMoveRange(UnitData self, GridData grid)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
public virtual bool GetFinalMoveRange(UnitData self, out int fixedRange)
|
||
{
|
||
fixedRange = 0;
|
||
return false;
|
||
}
|
||
|
||
public virtual int GetExtraAttackRange(MapData mapData,UnitData self)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
public virtual int GetSpecialSkillBonus(MapData mapData, UnitData self, SkillType skillType)
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
|
||
|
||
public virtual int GetKillCount() { return 0; }
|
||
|
||
#endregion
|
||
|
||
#region [--------------------操作修改属性--------------------]
|
||
|
||
public virtual void SetOfficer()
|
||
{
|
||
|
||
}
|
||
#endregion
|
||
|
||
}
|
||
} |