196 lines
6.9 KiB
C#
196 lines
6.9 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;
|
|
|
|
/// <summary>
|
|
/// 是否处于被压制状态
|
|
/// </summary>
|
|
public bool isInSuppressed
|
|
{
|
|
get
|
|
{
|
|
return moraleState == EMoraleType.Suppressed;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 锁定士气状态变化
|
|
/// </summary>
|
|
// public bool lockMoraleStateChange = false;
|
|
public EMoraleType moraleState = EMoraleType.Normal;
|
|
|
|
// 此项数据一旦录入,不可修改
|
|
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);
|
|
|
|
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.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.canAttackNoReloadFull = configData.canAttackNoReloadFull;
|
|
owner.fightData.baseReloadTime = configData.reloadTime;
|
|
owner.fightData.findEnemyRange = configData.findEnemyRange;
|
|
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;
|
|
|
|
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;
|
|
}
|
|
|
|
}
|
|
}
|