using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using UnityEngine.Events; using SiegeSong; namespace SiegeSong { public class ActorStatistics : MonoBehaviour { public ActorLoader ActorLoader; public int ID; public string InstanceID; public string FirstName = "Human"; public string LastName = "Being"; public bool Alive = true; public InventoryManager Inventory; public Selectable LootSelectable; public AudioSource AudioSource; public ThreatAwareness Awareness; public FactionManager FactionManager; public Dictionary RespectForActor; public Dictionary AdmirationForActor; public Dictionary SuspicionOfActor; public Dictionary FactionRank; public Dictionary RegionalBounty; public Dictionary RegionalFame; public Dictionary QuestStates; public Dictionary Attributes; public Dictionary> SkillValueCategories; public Dictionary Blendshapes; public int HairstyleID; public int FacialHairID; public int FacialDetailID; public int HairColorR; public int HairColorG; public int HairColorB; public int HairColorA; public bool Recoil; public int NoiseBeingProduced = 2; // in decibels public int VisualStealthRating; public float StaminaRecoveryRate = 0.2f; public float MagicRecoveryRate = 0.2f; public float HealthRecoveryRate = 0.2f; public int MaxHealth = 100; public int MaxStamina = 100; public int MaxMagic = 100; public float Health = 100.0f; public float Stamina = 100.0f; public float Magic = 100.0f; public bool InCombat; public bool Staggered; public bool OffBalance; public bool Fallen; public bool Invincible; public int Hunger; public int Thirst; public int Exhaustion; public int Heat; public int CarryWeight; public int MaxCarryWeight = 100; public int Gold; public int Level = 1; public int Experience = 0; public int ExperienceToNextLevel = 1000; public bool CanHealH = true; public bool CanHealS = true; public bool CanHealM = true; public HUDManager hudManager; #region GameBalance public float CriticalBlowMultiplier = 10.0f; public float MomentumToDamageMultiplier = 0.2f; public float PartialProtectionMultiplier = 0.5f; public float FullProtectionMultiplier = 0.75f; public int SprintCost = 2; public int DefaultSkillValue = 5; public int DefaultAttributeValue = 10; #endregion List StaminaTemporarilyRemovedIncrements = new List(); List MagicTemporarilyRemovedIncrements = new List(); List HealthTemporarilyRemovedIncrements = new List(); public void ReceiveCriticalBlow(float damage, float momentum, AparrelSlot slot, DamageType damageType) { } public void ReceiveStagger(bool canHitUnbalance = true) { if (OffBalance && canHitUnbalance) Fallen = true; if (Staggered) { if(canHitUnbalance) OffBalance = true; } else Staggered = true; } public void ReceiveHit(int baseDamage, float momentum, int skillValue, ProtectionLevel protection, DamageType damageType, AparrelSlot slot, UnityEvent weaponHitEvent, UnityEvent gripHitEvent) { var damage = 0.0f; switch (protection) { case ProtectionLevel.Unprotected: damage = (int)((float)baseDamage * (momentum * MomentumToDamageMultiplier) * (OffBalance ? CriticalBlowMultiplier : 1)); if (OffBalance) ReceiveCriticalBlow(damage, momentum, slot, damageType); if (weaponHitEvent != null) weaponHitEvent.Invoke(); break; case ProtectionLevel.Partial: damage = (int)((float)PartialProtectionMultiplier * (baseDamage + momentum * MomentumToDamageMultiplier)); break; case ProtectionLevel.Full: damage = (int)((float)FullProtectionMultiplier * (baseDamage + momentum * MomentumToDamageMultiplier)); if (damage > Health) damage = Health - 1.0f; break; } Health -= damage; if (Health <= 0) Kill(); if (Stamina <= 0) ReceiveStagger(false); updateStatusUI(); } private void updateStatusUI() { if (hudManager != null) { hudManager.HealthDisplayValue = Health; hudManager.StaminaDisplayValue = Stamina; hudManager.MagicDisplayValue = Magic; hudManager.DisplayUIGroup(HUDGroup.StatBarArea); } } public void ExpendStamina(float amount, bool increment = false) { if (!increment) { if (Stamina > amount) { Stamina -= amount; } } else { if (amount < 0) { if (StaminaTemporarilyRemovedIncrements.Contains(-(int)amount)) StaminaTemporarilyRemovedIncrements.Remove(-(int)amount); } else { StaminaTemporarilyRemovedIncrements.Add((int)amount); } } updateStatusUI(); } public void ClearStaminaIncrements() { updateStatusUI(); StaminaTemporarilyRemovedIncrements.Clear(); } public void ClearMagicIncrements() { updateStatusUI(); MagicTemporarilyRemovedIncrements.Clear(); } public void ClearHealthIncrements() { updateStatusUI(); HealthTemporarilyRemovedIncrements.Clear(); } public void ExpendMagic(int amount, bool increment = false) { updateStatusUI(); if (!increment) { if (Magic > amount) { Magic -= amount; } } else { if (amount < 0) { if (MagicTemporarilyRemovedIncrements.Contains(-amount)) MagicTemporarilyRemovedIncrements.Remove(-amount); } else { MagicTemporarilyRemovedIncrements.Add(amount); } } } public void Kill() { Alive = false; LootSelectable.Name = $"{FirstName} {LastName}"; LootSelectable.enabled = true; } public void InitializeStats() { if (SkillValueCategories == null) SkillValueCategories = new Dictionary>(); if (Attributes == null) Attributes = new Dictionary(); if (RespectForActor == null) RespectForActor = new Dictionary(); if (AdmirationForActor == null) AdmirationForActor = new Dictionary(); if (SuspicionOfActor == null) SuspicionOfActor = new Dictionary(); if (FactionRank == null) FactionRank = new Dictionary(); if (RegionalBounty == null) RegionalBounty = new Dictionary(); if (RegionalFame == null) RegionalFame = new Dictionary(); if (QuestStates == null) QuestStates = new Dictionary(); if (Blendshapes == null) Blendshapes = new Dictionary(); for (var i = 0; i < 5; i++) { if (i != 4) { var initializedSkills = new Dictionary(); for (var j = 0; j < 9; j++) { if (!initializedSkills.ContainsKey(j)) initializedSkills.Add(j, DefaultSkillValue); else initializedSkills[j] = DefaultSkillValue; } if (!SkillValueCategories.ContainsKey(i)) SkillValueCategories.Add(i, initializedSkills); else SkillValueCategories[i] = initializedSkills; } else { for (var j = 0; j < 9; j++) { if (!Attributes.ContainsKey(j)) Attributes.Add(j, DefaultAttributeValue); else Attributes[j] = DefaultAttributeValue; } } } } void Start() { InitializeStats(); } void Update() { if (CanHealH) { if (Health < MaxHealth) Health += HealthRecoveryRate; else Health = (float)MaxHealth; updateStatusUI(); } if (CanHealS && Stamina < MaxStamina) { if (Stamina < MaxStamina) Stamina += StaminaRecoveryRate; else Stamina = (float)MaxStamina; updateStatusUI(); } if (CanHealM && Magic < MaxMagic) { if (Magic < MaxMagic) Magic += MagicRecoveryRate; else Magic = (float)MaxMagic; updateStatusUI(); } } } }