using Fie.AI; using Fie.Manager; using Fie.Object; using Fie.Object.Abilities; using Fie.UI; using GameDataEditor; using Spine.Unity.Modules; using System; using System.Collections.Generic; using UnityEngine; namespace Fie.Ponies.RainbowDash { [FiePrefabInfo("Prefabs/RainbowDash/RainbowDash")] public class FieRainbowDash : FiePonies, FiePlayableGameCharacterInterface { public const int MAXIMUM_AWESOME_EFFECT_COUNT = 4; public const float AWESOME_DAMAGE_CUTOFF_RATE = 0.2f; public const float AWESOME_STAGGER_CUTOFF_RATE = 0.2f; private int _maximumAwesomeCount = 4; private bool _isCloackMode; private bool _reserveColliderState; private int _omniSmashAttackingCount; private Dictionary _awesomeEffectList = new Dictionary(); private SkeletonRendererCustomMaterials _customSpineMaterialComponent; private FieEmitObjectRainbowDashCloaking _cloackObject; public int maximumAwesomeCount => _maximumAwesomeCount; public override bool isEnableCollider { get { return _isEnableCollider; } set { if (!_isCloackMode) { if (_colliderList.Count > 0) { foreach (FieCollider collider in _colliderList) { collider.isEnable = value; } } } else { _reserveColliderState = value; } _isEnableCollider = value; } } public bool isCloackMode => _isCloackMode; public int omniSmashAttackingCount => _omniSmashAttackingCount; public int awesomeCount { get { CleanUpAwesomeCount(); if (_awesomeEffectList == null) { return 0; } return _awesomeEffectList.Count; } } public void Cloack() { if (_cloackObject != null && _cloackObject.enabled) { _cloackObject.Disable(); _cloackObject = null; } FieManagerBehaviour.I.EmitObject(base.centerTransform, Vector3.up); _cloackObject = FieManagerBehaviour.I.EmitObject(base.transform, Vector3.zero, null, this); if (!(_cloackObject == null)) { _cloackObject.Enable(); if (_colliderList.Count > 0) { foreach (FieCollider collider in _colliderList) { collider.isEnable = false; } } _customSpineMaterialComponent.SetCustomMaterialOverrides(forceEnable: true); isEnableCollider = false; _isCloackMode = true; UnbindFromDetecter(); } } public void Decloack() { if (_isCloackMode) { if (_colliderList.Count > 0) { foreach (FieCollider collider in _colliderList) { collider.isEnable = _reserveColliderState; } } FieManagerBehaviour.I.EmitObject(base.centerTransform, Vector3.up); _customSpineMaterialComponent.RemoveCustomMaterialOverrides(); _isCloackMode = false; _cloackObject = null; } } private void CleanUpAwesomeCount() { List list = new List(); for (int i = 1; i <= maximumAwesomeCount; i++) { if (_awesomeEffectList.ContainsKey(i) && (_awesomeEffectList[i] == null || _awesomeEffectList[i].gameObject == null)) { list.Add(i); } } if (list.Count > 0) { foreach (int item in list) { _awesomeEffectList.Remove(item); } } } public override Type getDefaultAttackState() { return null; } public override Type getStormState() { return null; } protected new void Awake() { base.Awake(); base.animationManager = new FieSkeletonAnimationController(base.skeletonUtility, new FieRainbowDashAnimationContainer()); _customSpineMaterialComponent = base.gameObject.GetComponent(); _staggerCancelableStateList.Add(typeof(FieStateMachineRainbowDashEvasion)); _staggerCancelableStateList.Add(typeof(FieStateMachineRainbowDashRainblowCloack)); _staggerCancelableStateList.Add(typeof(FieStateMachineRainbowDashDoublePaybackPrepareMidAir)); abstractStateList.Add(typeof(FieStateMachinePoniesJump), typeof(FieStateMachineRainbowDashJump)); abstractStateList.Add(typeof(FieStateMachinePoniesEvasion), typeof(FieStateMachineRainbowDashEvasion)); abstractStateList.Add(typeof(FieStateMachinePoniesBaseAttack), typeof(FieStateMachineRainbowDashBaseAttack)); SetStateActivateCheckCallback(EvasionActivateCheck); base.abilitiesContainer.AssignAbility(FieAbilitiesSlot.SlotType.SLOT_1, new FieStateMachineRainbowDashDoublePayback()); base.abilitiesContainer.AssignAbility(FieAbilitiesSlot.SlotType.SLOT_2, new FieStateMachineRainbowDashRainblow()); base.abilitiesContainer.AssignAbility(FieAbilitiesSlot.SlotType.SLOT_3, new FieStateMachineRainbowDashOmniSmash()); syncBindedAbilities(); base.abilitiesContainer.setActivationCallback(typeof(FieStateMachineRainbowDashOmniSmash), OmniSmashActivationCallback); 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(); base.emotionController.SetDefaultEmoteAnimationID(15); base.emotionController.RestoreEmotionFromDefaultData(); base.detector.intoTheBattleEvent += Detector_intoTheBattleEvent; base.damageSystem.beforeDamageEvent += this.HealthSystem_beforeDamageEvent; ReCalcSkillData(); } protected override void ReCalcSkillData() { _maximumAwesomeCount = 4; GDESkillTreeData skill = GetSkill(FieConstValues.FieSkill.LOYALTY_ATTACK_PASSIVE_LV4_HELLO_CAPTAIN_AWESOME); if (skill != null) { _maximumAwesomeCount += (int)skill.Value1; } } private bool OmniSmashActivationCallback(FieGameCharacter gameCharacter) { FieManagerBehaviour.I.RequestLobbyOnlyActivity(gameCharacter, FieMasterData.I.GetMasterData(GDEItemKeys.ConstantTextList_ACTIVITY_TITLE_ELE_LOYALTY_ABILITY_3), FieMasterData.I.GetMasterData(GDEItemKeys.ConstantTextList_ACTIVITY_NOTE_ELE_LOYALTY_ABILITY_3)); if (base.detector.lockonTargetObject == null || awesomeCount <= 0) { return false; } return true; } public void CalcOmniSmashAttackCount() { _omniSmashAttackingCount = 2 * Mathf.Max(0, awesomeCount); GDESkillTreeData skill = GetSkill(FieConstValues.FieSkill.LOYALTY_OMNISMASH_LV4_LET_ME_SHOW_YOU_MY_TRUE_POWER); if (skill != null) { _omniSmashAttackingCount *= (int)skill.Value1; } requestSetAwesomeEffect(-maximumAwesomeCount); } private void HealthSystem_beforeDamageEvent(FieGameCharacter attacker, ref FieDamage damage) { if (damage != null && !(damage.damage <= 0f)) { int num = requestSetAwesomeEffect(-1); if (num < 0) { damage.damage *= 0.2f; damage.stagger *= 0.2f; GDESkillTreeData skill = GetSkill(FieConstValues.FieSkill.LOYALTY_DIFFENCE_PASSIVE_LV4_DEAL_WITH_IT); if (skill != null) { base.damageSystem.AddDefenceMagni(skill.ID, 100f, skill.Value1); } GDESkillTreeData skill2 = GetSkill(FieConstValues.FieSkill.LOYALTY_DIFFENCE_PASSIVE_LV4_IT_IS_MY_TURN); if (skill2 != null) { base.abilitiesContainer.IncreaseOrReduceCooldownAll(0f - skill.Value1); } } } } private void Detector_intoTheBattleEvent(FieGameCharacter targetCharacter) { SetDialog(FieMasterData.I.GetMasterData(GDEItemKeys.WordScriptTriggerType_WS_TRIGGER_TYPE_ENEMY_DETECTED)); } private bool EvasionActivateCheck() { if (healthStats.shield <= 0f) { return false; } return true; } protected new void Start() { base.Start(); getStateMachine(StateMachineType.Attack).setState(typeof(FieStateMachinePoniesAttackIdle), isForceSet: true); getStateMachine().setState(typeof(FieStateMachineCommonIdle), isForceSet: false); } public int requestSetAwesomeEffect(int calcCount) { if (base.photonView == null || base.photonView.isMine) { int num = Mathf.Clamp(_awesomeEffectList.Count + calcCount, 0, maximumAwesomeCount); if (base.photonView != null) { object[] parameters = new object[1] { num }; base.photonView.RPC("SetAwesomeEffectRPC", PhotonTargets.Others, parameters); } return RebuildAwesomeStats(num); } return 0; } private int RebuildAwesomeStats(int settleCount) { int count = _awesomeEffectList.Count; List list = new List(); for (int i = 1; i <= maximumAwesomeCount; i++) { if (_awesomeEffectList.ContainsKey(i)) { if (i > settleCount) { list.Add(i); } } else if (i <= settleCount) { _awesomeEffectList[i] = FieManagerBehaviour.I.EmitObject(base.centerTransform, Vector3.up); } } if (list.Count > 0) { foreach (int item in list) { FieManagerBehaviour.I.EmitObject(_awesomeEffectList[item].transform, Vector3.up); _awesomeEffectList[item].stopEffect(1f); _awesomeEffectList.Remove(item); } } return settleCount - count; } [PunRPC] public void SetAwesomeEffectRPC(int settleCount) { RebuildAwesomeStats(settleCount); } public override string getDefaultName() { return FieLocalizeUtility.GetWordScriptText(GDEItemKeys.ConstantTextList_ELEMENT_NAME_LOYALTY_SIMPLE); } public override FieConstValues.FieGameCharacter getGameCharacterID() { return FieConstValues.FieGameCharacter.LOYALTY; } public override Type getDefaultAITask() { return typeof(FieAITaskRainbowDashIdle); } public override KeyValuePair getAbilitiesIconInfo() { return new KeyValuePair(typeof(FieGameUIAbilitiesIconRainbowDash), "Prefabs/UI/AbilitiesIcons/RainbowDashAbilityIcon"); } public override GDEGameCharacterTypeData getCharacterTypeData() { return FieMasterData.I.GetMasterData(GDEItemKeys.GameCharacterType_LOYALTY); } } }