NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/Character/Data/CharacterRuntimeData.cs

219 lines
7.5 KiB
C#

using cfg.FightCfg;
using Gameplay.Unit;
using Gameplay.Vehicle.Impl;
namespace Gameplay.Character
{
using Common;
using Weapon;
using UnityEngine;
public class CharacterRuntimeData
{
public readonly Character owner;
public bool isShooting
{
get;
set;
} = false;
public bool isFullControl = false;
public bool canMoveShoot
{
get
{
return fightData.moveShootType > 0 && !isInSuppressed;
}
}
/// <summary>
/// 所属的载具
/// </summary>
public NormalVehicle belongVehicle
{
get;
set;
}
/// <summary>
/// 所属的建筑
/// </summary>
public GameUnit belongBuilding
{
get;
set;
}
/// <summary>
/// 是否处于被压制状态
/// </summary>
public bool isInSuppressed
{
get
{
return moraleState == EMoraleType.Suppressed;
}
}
/// <summary>
/// 锁定士气状态变化
/// </summary>
// public bool lockMoraleStateChange = false;
public EMoraleType moraleState = EMoraleType.Normal;
/// <summary>
/// 是否是强制压制
/// </summary>
public bool isForceSuppressed;
// 此项数据一旦录入,不可修改
public CharacterConfigData configData;
public readonly WeaponRuntimeData weaponData;
public readonly CharacterAliveData aliveData;
public readonly CharacterFightData fightData;
public CharacterRuntimeData(Character owner)
{
this.owner = owner;
aliveData = new CharacterAliveData(owner);
weaponData = new WeaponRuntimeData();
fightData = new CharacterFightData(owner);
}
public void Init()
{
// 优先初始化父类数据
_ResetAliveData(true);
_ResetFightData();
_ResetWeaponData();
belongVehicle = null;
}
public void ResetToPrepare()
{
_ResetAliveData(false);
_ResetFightData();
_ResetWeaponData();
belongVehicle = null;
}
private void _ResetWeaponData()
{
weaponData.remainBulletCount = owner.fightData.maxBulletCount;
}
private void _ResetAliveData(bool fillHp)
{
owner.aliveData.maxHp = configData.maxHp;
owner.aliveData.maxShield = configData.maxShield;
owner.aliveData.maxMorale = configData.initMorale;
owner.aliveData.Init(fillHp);
}
private void _ResetFightData()
{
owner.fightData.specialAttakcLogicId = 0;
owner.fightData.InitAttack(configData.attack, configData.attackPowerLevel);
owner.fightData.distanceHitRate.Clear();
owner.fightData.distanceHitRate.AddRange(configData.distanceHitRate);
owner.fightData.baseDistanceHitRate.Clear();
owner.fightData.baseDistanceHitRate.AddRange(configData.distanceHitRate);
owner.fightData.scaleForHuman = configData.damageCharacterScale;
owner.fightData.scaleForVehicle = configData.damageVehicleScale;
owner.fightData.scaleForBuilding = configData.damageBuildingsScale;
owner.fightData.normalAttackDistance = configData.shootDistance;
owner.fightData.baseAttackDistance = configData.shootDistance;
owner.fightData.moveSpeed = configData.moveSpeed;
owner.fightData.baseMoveSpeed = configData.moveSpeed;
owner.fightData.noFightMoveSpeed = configData.noFightMoveSpeed;
owner.fightData.retreatSpeed = configData.retreatSpeed;
owner.fightData.baseRetreatSpeed = configData.retreatSpeed;
owner.fightData.turnSpeed = configData.turnSpeed;
owner.fightData.InitShootCd(configData.shootCd);
owner.fightData.p_shootCdScale = 0f;
owner.fightData.maxBulletCount = configData.maxBulletCount;
owner.fightData.baseMaxBulletCount = configData.maxBulletCount;
owner.fightData.criticalRate = configData.criticalRate;
owner.fightData.criticalScale = configData.criticalScale;
owner.fightData.moraleAttack = configData.moraleAttack;
owner.fightData.reloadTime = configData.reloadTime;
owner.fightData.perReloadCount = configData.perReloadCount;
owner.fightData.basePerReloadCount = configData.perReloadCount;
owner.fightData.canAttackNoReloadFull = configData.canAttackNoReloadFull;
owner.fightData.baseReloadTime = configData.reloadTime;
owner.fightData.findEnemyRange = configData.findEnemyRange;
owner.fightData.trackRange = configData.trackRange;
owner.fightData.autoRecoverHPDealy = configData.hpRecoverDelay;
owner.fightData.autoRecoverHPValueFixed = configData.hpRecoverFix;
owner.fightData.autoRecoverHPValuePercent = configData.hpRecoverPercent;
owner.fightData.autoRecoverShiledDealy = configData.shiledRecoverDelay;
owner.fightData.autoRecoverShiledValueFixed = configData.shieldRecoverFix;
owner.fightData.autoRecoverShiledValuePercent = configData.shiledRecoverPercent;
owner.fightData.overflowShiledMaxValue = configData.overflowShield;
owner.fightData.attackScaleForShiled = configData.attackShiledScale;
owner.fightData.attackScaleForHp = configData.attackHpScale;
owner.fightData.isAttackIgnoreBlock = configData.isAttackIgnoreBlock;
owner.fightData.baseAttackEndTime = configData.attackEndTime;
owner.fightData.attackEndTime = configData.attackEndTime;
owner.fightData.attackLoopCount = configData.attackLoopCount;
owner.fightData.canEvacuate = configData.canEvacuate;
fightData.moraleRecover = configData.moraleRecover;
fightData.moveShootType = configData.moveShootType;
fightData.raiseWeaponTime = configData.raiseWeaponTime;
}
public void LogicUpdate(float dt)
{
// 更新士气相关数据
aliveData.LogicUpdate(dt);
_UpdateFrameProps();
}
private void _UpdateFrameProps()
{
// defense
{
var baseValue = owner.runtimeData.configData.defense;
var isInDefense = !owner.statusData.isMoveing;
if (isInDefense)
{
baseValue = Mathf.CeilToInt(baseValue * owner.runtimeData.configData.defenseScale);
}
owner.fightData.defense = baseValue;
}
}
private int _defenceNoMoveChangeValue;
public void AddStandDefenceScale()
{
var defenceScale = owner.runtimeData.configData.defenseScale;
var baseValue = owner.fightData.baseDefense;
var addValue = Mathf.CeilToInt(baseValue * (defenceScale - 1f));
_defenceNoMoveChangeValue = addValue;
owner.fightData.defense += _defenceNoMoveChangeValue;
}
public void RemoveStandDefenceScale()
{
owner.fightData.defense -= _defenceNoMoveChangeValue;
_defenceNoMoveChangeValue = 0;
}
}
}