using System; using System.Collections.Generic; using System.Linq; using Assets.HeroEditor4D.Common.Scripts.Data; using Assets.HeroEditor4D.Common.Scripts.Enums; using UnityEngine; namespace Assets.HeroEditor4D.Common.Scripts.CharacterScripts { public partial class Character { /// /// Set character's body parts. /// public void SetBody(ItemSprite item, BodyPart part, Color? color) { switch (part) { case BodyPart.Body: Body = item?.Sprites.ToList(); BodyRenderers.ForEach(i => i.color = color ?? i.color); Head = HeadRenderer.GetComponent().FindSprite(item?.Sprites); HeadRenderer.color = color ?? HeadRenderer.color; break; case BodyPart.Head: Head = HeadRenderer.GetComponent().FindSprite(item?.Sprites); HeadRenderer.color = color ?? HeadRenderer.color; break; case BodyPart.Hair: Hair = HairRenderer.GetComponent().FindSprite(item?.Sprites); HairRenderer.color = color ?? HairRenderer.color; HideEars = item != null && item.Tags.Contains("HideEars"); if (item != null && item.Tags.Contains("NoPaint")) { HairRenderer.color = Color.white; HairRenderer.material = new Material(Shader.Find("Sprites/Default")); } break; case BodyPart.Ears: Ears = item?.Sprites.ToList(); EarsRenderers.ForEach(i => i.color = color ?? i.color); break; case BodyPart.Eyebrows: if (EyebrowsRenderer) Expressions[0].Eyebrows = EyebrowsRenderer.GetComponent().FindSprite(item?.Sprites); break; case BodyPart.Eyes: if (EyesRenderer) { Expressions[0].Eyes = EyesRenderer.GetComponent().FindSprite(item?.Sprites); Expressions.Where(i => i.Name != "Dead").ToList().ForEach(i => i.EyesColor = color ?? EyesRenderer.color); EyesRenderer.color = color ?? EyesRenderer.color; } break; case BodyPart.Mouth: if (MouthRenderer) Expressions[0].Mouth = MouthRenderer.GetComponent().FindSprite(item?.Sprites); break; case BodyPart.Beard: if (BeardRenderer) { Beard = BeardRenderer.GetComponent().FindSprite(item?.Sprites); BeardRenderer.color = color ?? BeardRenderer.color; } break; case BodyPart.Makeup: if (MakeupRenderer) { Makeup = MakeupRenderer.GetComponent().FindSprite(item?.Sprites); MakeupRenderer.color = color ?? MakeupRenderer.color; } break; default: throw new NotImplementedException($"Unsupported part: {part}."); } Initialize(); } public void SetBody(ItemSprite item, BodyPart part) { SetBody(item, part, null); } /// /// Set character's expression. /// public void SetExpression(string expression) { if (Expressions.Count < 3) throw new Exception("Character must have at least 3 basic expressions: Default, Angry and Dead."); if (EyesRenderer == null) return; var e = Expressions.Single(i => i.Name == expression); Expression = expression; EyebrowsRenderer.sprite = e.Eyebrows; EyesRenderer.sprite = e.Eyes; EyesRenderer.color = e.EyesColor; MouthRenderer.sprite = e.Mouth; } /// /// Equip something from SpriteCollection. /// public void Equip(ItemSprite item, EquipmentPart part, Color? color) { switch (part) { case EquipmentPart.MeleeWeapon1H: CompositeWeapon = null; break; case EquipmentPart.MeleeWeapon2H: case EquipmentPart.SecondaryMelee1H: case EquipmentPart.Firearm1H: case EquipmentPart.Firearm2H: case EquipmentPart.SecondaryFirearm1H: CompositeWeapon = null; Shield = null; break; case EquipmentPart.Bow: case EquipmentPart.Crossbow: PrimaryWeapon = SecondaryWeapon = null; Shield = null; break; } Cape = Quiver = Backpack = null; switch (part) { case EquipmentPart.Helmet: HideEars = item != null && !item.Tags.Contains("ShowEars"); CropHair = item != null && !item.Tags.Contains("FullHair"); Helmet = HelmetRenderer.GetComponent().FindSprite(item?.Sprites); HelmetRenderer.color = color ?? HelmetRenderer.color; break; case EquipmentPart.Armor: Armor = item?.Sprites.ToList().ToList(); ArmorRenderers.ForEach(i => i.color = color ?? i.color); break; case EquipmentPart.Vest: SetArmorParts(VestRenderers, item?.Sprites, color); break; case EquipmentPart.Bracers: SetArmorParts(BracersRenderers, item?.Sprites, color); break; case EquipmentPart.Leggings: SetArmorParts(LeggingsRenderers, item?.Sprites, color); break; case EquipmentPart.MeleeWeapon1H: PrimaryWeapon = item?.Sprite; PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white); if (WeaponType != WeaponType.Paired) WeaponType = WeaponType.Melee1H; break; case EquipmentPart.MeleeWeapon2H: PrimaryWeapon = item?.Sprite; PrimaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? PrimaryWeaponRenderer.color : Color.white); WeaponType = WeaponType.Melee2H; break; case EquipmentPart.SecondaryMelee1H: SecondaryWeapon = item?.Sprite; SecondaryWeaponRenderer.color = color ?? (item != null && item.Tags.Contains("Paint") ? SecondaryWeaponRenderer.color : Color.white); WeaponType = WeaponType.Paired; break; case EquipmentPart.Bow: CompositeWeapon = item?.Sprites.ToList(); WeaponType = WeaponType.Bow; break; case EquipmentPart.Crossbow: CompositeWeapon = item?.Sprites.ToList(); WeaponType = WeaponType.Crossbow; break; case EquipmentPart.Firearm1H: PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side"); WeaponType = WeaponType.Firearm1H; break; case EquipmentPart.Firearm2H: PrimaryWeapon = item?.Sprites.Single(i => i.name == "Side"); WeaponType = WeaponType.Firearm2H; break; case EquipmentPart.SecondaryFirearm1H: SecondaryWeapon = item?.Sprites.Single(i => i.name == "Side"); WeaponType = WeaponType.Paired; break; case EquipmentPart.Shield: Shield = item?.Sprites.ToList(); WeaponType = WeaponType.Melee1H; break; //case EquipmentPart.Cape: // Cape = item?.Sprite; // CapeRenderer.color = color ?? CapeRenderer.color; // break; case EquipmentPart.Quiver: Quiver = item?.Sprite; QuiverRenderer.color = color ?? QuiverRenderer.color; break; case EquipmentPart.Backpack: Backpack = item?.Sprite; BackpackRenderer.color = color ?? BackpackRenderer.color; break; case EquipmentPart.Earrings: Earrings = item?.Sprites.ToList(); EarringsRenderers[0].color = EarringsRenderers[1].color = color ?? EarringsRenderers[0].color; break; case EquipmentPart.Mask: Mask = MaskRenderer.GetComponent().FindSprite(item?.Sprites); MaskRenderer.color = color ?? MaskRenderer.color; break; default: throw new NotImplementedException($"Unsupported part: {part}."); } Initialize(); if (part == EquipmentPart.Firearm1H || part == EquipmentPart.Firearm2H) { SetFirearmMuzzle(item); } } public void Equip(ItemSprite item, EquipmentPart part) { Equip(item, part, null); } /// /// Remove equipment partially. /// public void UnEquip(EquipmentPart part) { Equip(null, part); } /// /// Remove all equipment. /// public void ResetEquipment() { Armor = new List(); CompositeWeapon = new List(); Shield = new List(); Helmet = PrimaryWeapon = SecondaryWeapon = Mask = Cape = Quiver = Backpack = null; Earrings = new List(); HideEars = CropHair = false; Initialize(); } private void SetArmorParts(List renderers, List armor, Color? color) { if (Armor == null) { Armor = new List(); } else { Armor.RemoveAll(i => i == null); } foreach (var r in renderers) { var mapping = r.GetComponent(); var sprite = armor?.SingleOrDefault(j => mapping.SpriteName == j.name || mapping.SpriteNameFallback.Contains(j.name)); Armor.RemoveAll(i => i.name == mapping.SpriteName || mapping.SpriteNameFallback.Contains(i.name)); if (sprite != null) { Armor.Add(sprite); } if (color != null) r.color = color.Value; } } private void SetFirearmMuzzle(ItemSprite item) { if (item == null || PrimaryWeaponRenderer.sprite == null) { AnchorFireMuzzle.localPosition = Vector3.zero; return; } var mx = 0.5f; var my = int.Parse(item.MetaDict["Muzzle"]) / 100f; var bounds = PrimaryWeaponRenderer.sprite.bounds; var p = new Vector2(bounds.min.x + mx * (bounds.max.x - bounds.min.x), bounds.min.y + my * (bounds.max.y - bounds.min.y)); if (PrimaryWeaponRenderer.flipX) p.x *= -1; AnchorFireMuzzle.localPosition = p; } } }