using Fie.AI; using Fie.Manager; using Fie.Object; using GameDataEditor; using System; using UnityEngine; namespace Fie.Enemies.HoovesRaces.QueenChrysalis { [FiePrefabInfo("Prefabs/Enemies/ChangelingForces/QueenChrysalis/QueenChrysalis")] public class FieQueenChrysalis : FieEnemiesHoovesRaces { public const int MAXIMUM_MINION_NUMBER = 2; public const float DEFAULT_CALLED_MINION_DELAY = 15f; public const float DIALOUGE_INTERVAL = 30f; public const float DIALOUGE_INTERVAL_FIRST_TIME = 3f; [SerializeField] private Transform _concentrationTransform; private const float STAGGER_IMUNITE_DELAY = 5f; public FieGameCharacter grabbingGameCharacter; private float _callingMinionDelay; private float _maximumCallingMinionDelay; private int _maximumCallingMinionCount = 2; public bool _isImmuniteStaggerDamage; public bool _isEffectivePull; public float _staggerDamageRate = 1f; public float _staggerImuniteDelay; public float _staggerImuniteDelayInitializedParam; public float _dialougeInterval = 3f; private FieGameCharacter[] _currentMinions = new FieGameCharacter[2]; public Transform concentrationTransform => _concentrationTransform; public FieGameCharacter[] currentMinions => _currentMinions; public int currentMinionCount { get { int num = 0; FieGameCharacter[] currentMinions = _currentMinions; foreach (FieGameCharacter x in currentMinions) { if (x != null) { num++; } } return num; } } public bool canAbleToCallMinion => currentMinionCount <= 0 && _callingMinionDelay <= 0f; public int maximumCallingMinionCount => _maximumCallingMinionCount; protected new void Awake() { base.Awake(); base.animationManager = new FieSkeletonAnimationController(base.skeletonUtility, new FieQueenChrysalisAnimationContainer()); base.damageSystem.deathEvent += delegate { FieManagerBehaviour.I.EmitObject(base.centerTransform, Vector3.zero, null); UnbindFromDetecter(); if (PhotonNetwork.isMasterClient) { PhotonNetwork.Destroy(base.photonView); } }; base.damageSystem.beforeDamageEvent += this.HealthSystem_beforeDamageEvent; base.damageSystem.ResetStaggerEvent(); base.damageSystem.staggerEvent += delegate { setStateToStatheMachine(typeof(FieStateMachineEnemiesQueenChrysalisStagger), isForceSet: true, isDupulicate: true); }; base.damageSystem.addStatusEffectCallback(ApplyStatusEffect_QueenChrysalisRift); base.damageSystem.addStatusEffectCallback(ApplyStatusEffect_QueenChrysalisPull); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); PreAssignEmittableObject(); } private void HealthSystem_beforeDamageEvent(FieGameCharacter attacker, ref FieDamage damage) { if (_isImmuniteStaggerDamage) { damage.stagger = 0f; } damage.stagger *= _staggerDamageRate; } protected new void Start() { base.Start(); base.emotionController.SetDefaultEmoteAnimationID(30); base.emotionController.SetEmoteAnimation(30, isForceSet: true); _maximumCallingMinionDelay = 15f; _maximumCallingMinionCount = 2; } private new void Update() { base.Update(); if (_staggerImuniteDelay > 0f) { _staggerImuniteDelay -= Time.deltaTime; _staggerDamageRate = ((!(_staggerImuniteDelay <= 0f)) ? (1f - _staggerDamageRate / _staggerImuniteDelayInitializedParam) : 1f); } if (_callingMinionDelay > 0f && currentMinionCount <= 0) { _callingMinionDelay -= Time.deltaTime; } if (_dialougeInterval > 0f && !base.voiceController.isPlaying) { _dialougeInterval -= Time.deltaTime; } if (base.isSpeakable && _dialougeInterval <= 0f) { SetRandomDialouge(); _dialougeInterval = 30f; } } private void SetRandomDialouge() { if (healthStats.shield > 0f) { float num = healthStats.shield / healthStats.maxShield; if (num > 0.5f) { SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_APPEAR_1), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_APPEAR_2)); } else { SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_1), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_2), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_3)); } } else { float num2 = healthStats.hitPoint / healthStats.maxHitPoint; if (num2 > 0.7f) { SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_6), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_7)); } else if (num2 > 0.3f) { SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_8), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_9)); } else { SetDialog(100, FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_10), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_11), FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptsList_E_THE_INSECT_QUEEN_RANDOM_12)); } } } public void SetCalledMinionDelay() { _callingMinionDelay = _maximumCallingMinionDelay; } private void ApplyStatusEffect_QueenChrysalisRift(FieStatusEffectEntityBase statusEffectObject, FieGameCharacter attacker, FieDamage damage) { if (damage.statusEffects.Count > 0) { foreach (FieStatusEffectEntityBase statusEffect in damage.statusEffects) { FieStatusEffectsRiftEntity fieStatusEffectsRiftEntity = statusEffect as FieStatusEffectsRiftEntity; if (fieStatusEffectsRiftEntity != null && healthStats.stagger + damage.stagger >= healthStats.staggerResistance) { FieStateMachineQueenChrysalisRift fieStateMachineQueenChrysalisRift = setStateToStatheMachine(typeof(FieStateMachineQueenChrysalisRift), isForceSet: true, isDupulicate: true) as FieStateMachineQueenChrysalisRift; if (fieStateMachineQueenChrysalisRift != null) { fieStateMachineQueenChrysalisRift.ResetMoveForce(fieStatusEffectsRiftEntity.resetMoveForce); fieStateMachineQueenChrysalisRift.SetRiftForceRate(fieStatusEffectsRiftEntity.riftForceRate); } damage.stagger = 0f; healthStats.stagger = 0f; } } } } private void ApplyStatusEffect_QueenChrysalisPull(FieStatusEffectEntityBase statusEffectObject, FieGameCharacter attacker, FieDamage damage) { if (damage.statusEffects.Count > 0) { foreach (FieStatusEffectEntityBase statusEffect in damage.statusEffects) { FieStatusEffectsPullEntity fieStatusEffectsPullEntity = statusEffect as FieStatusEffectsPullEntity; if (fieStatusEffectsPullEntity != null) { if (_isEffectivePull) { FieStateMachineStatusEffectPull fieStateMachineStatusEffectPull = setStateToStatheMachine(typeof(FieStateMachineStatusEffectPull), isForceSet: true, isDupulicate: true) as FieStateMachineStatusEffectPull; if (fieStateMachineStatusEffectPull != null) { fieStateMachineStatusEffectPull.setPullPoint(fieStatusEffectsPullEntity.pullPosition); fieStateMachineStatusEffectPull.setDuration(fieStatusEffectsPullEntity.pullDuration); } } damage.stagger = 0f; } } } } public void SetStaggerImmuniteDelay(float delay = 5f) { _staggerImuniteDelay = (_staggerImuniteDelayInitializedParam = delay); } public override string getDefaultName() { return FieLocalizeUtility.GetConstantText(GDEItemKeys.ConstantTextList_ENEMY_NAME_THE_QUEEN_OF_INSECTS); } public override FieConstValues.FieGameCharacter getGameCharacterID() { return FieConstValues.FieGameCharacter.THE_INSECT_QUEEN; } public override Type getDefaultAttackState() { return typeof(FieStateMachineQueenChrysalisBaseAttack); } public override Type getDefaultAITask() { return typeof(FieAITaskQueenChrysalisIdle); } public override FieStateMachineInterface getDefaultState(StateMachineType type) { if (type == StateMachineType.Base) { return new FieStateMachineQueenChrysalisIdle(); } return new FieStateMachineQueenChrysalisBaseAttack(); } public override GDEGameCharacterTypeData getCharacterTypeData() { return FieMasterData.I.GetMasterData(GDEItemKeys.GameCharacterType_THE_INSECT_QUEEN); } public override void RequestArrivalState() { } public override GDEEnemyTableData GetEnemyMasterData() { return FieMasterData.I.GetMasterData(GDEItemKeys.EnemyTable_ENEMY_TABLE_CHRYSALIS); } public override FieConstValues.FieEnemy GetEnemyMasterDataID() { return FieConstValues.FieEnemy.ENEMY_TABLE_CHRYSALIS; } } }