using System; using System.Collections.Generic; using System.Linq; using Assets.HeroEditor4D.Common.Scripts.Collections; using Assets.HeroEditor4D.Common.Scripts.Common; using Assets.HeroEditor4D.Common.Scripts.Data; using Assets.HeroEditor4D.Common.Scripts.Enums; using Assets.HeroEditor4D.InventorySystem.Scripts; using Assets.HeroEditor4D.InventorySystem.Scripts.Data; using Assets.HeroEditor4D.InventorySystem.Scripts.Enums; using UnityEngine; namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts { /// /// Controls 4 characters (for each direction). /// public class Character4D : MonoBehaviour { [Header("Parts")] public Character Front; public Character Back; public Character Left; public Character Right; public Transform characterTransform (){ if(Front.gameObject.activeSelf){ return Front.transform; }else if (Back.gameObject.activeSelf){ return Back.transform; }else if (Left.gameObject.activeSelf){ return Left.transform; }else{ return Right.transform; } } public List Parts; public List Shadows; [Header("Animation")] public Animator Animator; public AnimationManager AnimationManager; [Header("Other")] public LayerManager LayerManager; public Color BodyColor; public SpriteCollection SpriteCollection => Parts[0].SpriteCollection; private List PartsExceptBack => new List { Front, Left, Right }; public List Body { set { Parts.ForEach(i => i.Body = value.ToList()); } } public List Head { set { Parts.ForEach(i => i.Head = i.HairRenderer.GetComponent().FindSprite(value)); } } public List Hair { set { Parts.ForEach(i => i.Hair = i.HairRenderer.GetComponent().FindSprite(value)); } } public List Beard { set { Parts.ForEach(i => { if (i.BeardRenderer) i.Beard = i.BeardRenderer.GetComponent().FindSprite(value); }); } } public List Ears { set { Parts.ForEach(i => i.Ears = value.ToList()); } } public List Eyebrows { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyebrows = i.EyebrowsRenderer.GetComponent().FindSprite(value)); } } public List Eyes { set { PartsExceptBack.ForEach(i => i.Expressions[0].Eyes = i.EyesRenderer.GetComponent().FindSprite(value)); } } public List Mouth { set { PartsExceptBack.ForEach(i => i.Expressions[0].Mouth = i.MouthRenderer.GetComponent().FindSprite(value)); } } public List Helmet { set { Parts.ForEach(i => i.Helmet = i.HelmetRenderer.GetComponent().FindSprite(value)); } } public List Armor { set { Parts.ForEach(i => i.Armor = value.ToList()); } } public Sprite PrimaryWeapon { set { Parts.ForEach(i => i.PrimaryWeapon = value); } } public Sprite SecondaryWeapon { set { Parts.ForEach(i => i.SecondaryWeapon = value); } } public List Shield { set { Parts.ForEach(i => i.Shield = value.ToList()); } } public List CompositeWeapon { set { Parts.ForEach(i => i.CompositeWeapon = value.ToList()); } } public List Makeup { set { Parts.ForEach(i => { if (i.MakeupRenderer) i.Makeup = i.MakeupRenderer.GetComponent().FindSprite(value); }); } } public List Mask { set { Parts.ForEach(i => { if (i.MaskRenderer) i.Mask = i.MaskRenderer.GetComponent().FindSprite(value); }); } } public List Earrings { set { Parts.ForEach(i => i.Earrings = value.ToList()); } } public WeaponType WeaponType { get => Front.WeaponType; set { Parts.ForEach(i => i.WeaponType = value); } } public void OnValidate() { Parts = new List { Front, Back, Left, Right }; Parts.ForEach(i => i.BodyRenderers.ForEach(j => j.color = BodyColor)); Parts.ForEach(i => i.EarsRenderers.ForEach(j => j.color = BodyColor)); } public void Start() { var stateHandler = Animator.GetBehaviours().SingleOrDefault(i => i.Name == "Death"); if (stateHandler != null) { stateHandler.StateExit.AddListener(() => SetExpression("Default")); } Animator.keepAnimatorStateOnDisable = true; //Animator.keepAnimatorControllerStateOnDisable = true; } public void Initialize() { Parts.ForEach(i => i.Initialize()); } public void SetBody(ItemSprite item, BodyPart part) { Parts.ForEach(i => i.SetBody(item, part)); } public void SetBody(ItemSprite item, BodyPart part, Color? color) { Parts.ForEach(i => i.SetBody(item, part, color)); } public void SetExpression(string expression) { Parts.ForEach(i => i.SetExpression(expression)); } public void Equip(ItemSprite item, EquipmentPart part) { Parts.ForEach(i => i.Equip(item, part)); UpdateWeaponType(part); } public void Equip(ItemSprite item, EquipmentPart part, Color? color) { Parts.ForEach(i => i.Equip(item, part, color)); UpdateWeaponType(part); } private void UpdateWeaponType(EquipmentPart part) { switch (part) { case EquipmentPart.MeleeWeapon1H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee1H); break; case EquipmentPart.MeleeWeapon2H: Animator.SetInteger("WeaponType", (int) WeaponType.Melee2H); break; case EquipmentPart.Bow: Animator.SetInteger("WeaponType", (int) WeaponType.Bow); break; case EquipmentPart.Crossbow: Animator.SetInteger("WeaponType", (int) WeaponType.Crossbow); break; case EquipmentPart.Firearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm1H); break; case EquipmentPart.Firearm2H: Animator.SetInteger("WeaponType", (int) WeaponType.Firearm2H); break; case EquipmentPart.SecondaryFirearm1H: Animator.SetInteger("WeaponType", (int) WeaponType.Paired); break; } } public void UnEquip(EquipmentPart part) { Parts.ForEach(i => i.UnEquip(part)); } public void ResetEquipment() { Parts.ForEach(i => i.ResetEquipment()); Animator.SetInteger("WeaponType", (int)WeaponType.Melee1H); } public Vector2 Direction { get; private set; } public Character Active { get; private set; } public void SetDirection(Vector2 direction) { if (Direction == direction) return; Direction = direction; if (Direction == Vector2.zero) { Parts.ForEach(i => i.SetActive(true)); Shadows.ForEach(i => i.SetActive(true)); Parts[0].transform.localPosition = Shadows[0].transform.localPosition = new Vector3(0, -1.25f); Parts[1].transform.localPosition = Shadows[1].transform.localPosition = new Vector3(0, 1.25f); Parts[2].transform.localPosition = Shadows[2].transform.localPosition = new Vector3(-1.5f, 0); Parts[3].transform.localPosition = Shadows[3].transform.localPosition = new Vector3(1.5f, 0); return; } Parts.ForEach(i => i.transform.localPosition = Vector3.zero); Shadows.ForEach(i => i.transform.localPosition = Vector3.zero); int index; if (direction == Vector2.left) { index = 2; } else if (direction == Vector2.right) { index = 3; } else if (direction == Vector2.up) { index = 1; } else if (direction == Vector2.down) { index = 0; } else { throw new NotSupportedException(); } for (var i = 0; i < Parts.Count; i++) { Parts[i].SetActive(i == index); Shadows[i].SetActive(i == index); } Active = Parts[index]; } public void CopyFrom(Character4D character) { for (var i = 0; i < Parts.Count; i++) { Parts[i].CopyFrom(character.Parts[i]); Parts[i].WeaponType = character.Parts[i].WeaponType; Parts[i].HideEars = character.Parts[i].HideEars; Parts[i].CropHair = character.Parts[i].CropHair; Parts[i].AnchorFireMuzzle.localPosition = character.Parts[i].AnchorFireMuzzle.localPosition; } Animator.SetInteger("WeaponType", (int) character.WeaponType); } public string ToJson() { return Front.ToJson(); } public void FromJson(string json, bool silent) { Parts.ForEach(i => i.LoadFromJson(json, silent)); Animator.SetInteger("WeaponType", (int) Parts[0].WeaponType); } #region Setup Examples public void Equip(Item item) { var itemParams = ItemCollection.Active.GetItemParams(item); switch (itemParams.Type) { case ItemType.Helmet: EquipHelmet(item); break; case ItemType.Armor: EquipArmor(item); break; case ItemType.Vest: EquipVest(item); break; case ItemType.Bracers: EquipBracers(item); break; case ItemType.Leggings: EquipLeggings(item); break; case ItemType.Shield: EquipShield(item); break; case ItemType.Weapon: { switch (itemParams.Class) { case ItemClass.Bow: EquipBow(item); break; case ItemClass.Firearm: EquipSecondaryFirearm(item); break; default: if (itemParams.Tags.Contains(ItemTag.TwoHanded)) { EquipMeleeWeapon2H(item); } else { EquipMeleeWeapon1H(item); } break; } break; } } } public void EquipSecondaryMelee1H(Item item) { Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryMelee1H); } public void EquipArmor(Item item) { if (item == null) UnEquip(EquipmentPart.Armor); else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Armor); } public void EquipHelmet(Item item) { if (item == null) UnEquip(EquipmentPart.Helmet); else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Helmet); } public void EquipVest(Item item) { if (item == null) UnEquip(EquipmentPart.Vest); else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Vest); } public void EquipBracers(Item item) { if (item == null) UnEquip(EquipmentPart.Bracers); else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Bracers); } public void EquipLeggings(Item item) { if (item == null) UnEquip(EquipmentPart.Leggings); else Equip(SpriteCollection.Armor.Single(i => i.Id == item.Params.SpriteId), EquipmentPart.Leggings); } public void EquipShield(Item item) { Equip(SpriteCollection.Shield.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Shield); } public void EquipMeleeWeapon1H(Item item) { Equip(SpriteCollection.MeleeWeapon1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon1H); } public void EquipMeleeWeapon2H(Item item) { Equip(SpriteCollection.MeleeWeapon2H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.MeleeWeapon2H); } public void EquipBow(Item item) { Equip(SpriteCollection.Bow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Bow); } public void EquipCrossbow(Item item) { Equip(SpriteCollection.Crossbow.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.Crossbow); } public void EquipSecondaryFirearm(Item item) { Equip(SpriteCollection.Firearm1H.SingleOrDefault(i => i.Id == item.Params.SpriteId), EquipmentPart.SecondaryFirearm1H); } #endregion } }