using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using Newtonsoft.Json; namespace _2DGAMELIB { [Serializable] public class VariantGrid { public string Tag = ""; public double ValueX; public double ValueY; private List difs = new List(); public Dictionary pj; public Dictionary pr; public int CountX => difs.Count; public int CountY { get { if (difs.Count > 0) { return difs[IndexX].Count; } return 0; } } public int IndexX { get { if (!(ValueX >= 1.0)) { return (int)((double)CountX * ValueX); } return CountX - 1; } set { ValueX = (double)value / (double)CountX; } } public int IndexY { get { if (!(ValueY >= 1.0)) { return (int)((double)CountY * ValueY); } return CountY - 1; } set { ValueY = (double)value / (double)CountY; } } public MorphVariant this[int Index] { get { return difs[Index]; } set { difs[Index] = value; } } public PartGroup Current => difs[IndexX][IndexY]; public double PositionSize { set { foreach (MorphVariant dif in difs) { dif.PositionSize = value; } } } public Vector2D PositionVector { set { foreach (MorphVariant dif in difs) { dif.PositionVector = value; } } } public double AngleBase { set { foreach (MorphVariant dif in difs) { dif.AngleBase = value; } } } public double AngleCont { set { foreach (MorphVariant dif in difs) { dif.AngleCont = value; } } } public double SizeBase { set { foreach (MorphVariant dif in difs) { dif.SizeBase = value; } } } public double SizeCont { set { foreach (MorphVariant dif in difs) { dif.SizeCont = value; } } } public double SizeXBase { set { foreach (MorphVariant dif in difs) { dif.SizeXBase = value; } } } public double SizeXCont { set { foreach (MorphVariant dif in difs) { dif.SizeXCont = value; } } } public double SizeYBase { set { foreach (MorphVariant dif in difs) { dif.SizeYBase = value; } } } public double SizeYCont { set { foreach (MorphVariant dif in difs) { dif.SizeYCont = value; } } } public bool Dra { set { foreach (MorphVariant dif in difs) { dif.Dra = value; } } } public bool Hit { set { foreach (MorphVariant dif in difs) { dif.Hit = value; } } } [JsonIgnore] public ShapePart CurJoinRoot { get { PartGroup current = Current; if (pr.ContainsKey(current)) { return pr[current]; } return null; } } [JsonIgnore] public IEnumerable EnumJoinRoot => pr.Values; public IEnumerable EnumAllPar() { foreach (MorphVariant dif in difs) { foreach (ShapePart item in dif.EnumAllPar()) { yield return item; } } } public IEnumerable EnumAllPars() { foreach (MorphVariant dif in difs) { foreach (PartGroup item in dif.Parss) { yield return item; } } } public void SetDefault() { foreach (MorphVariant dif in difs) { dif.SetDefault(); } } public VariantGrid() { } public VariantGrid(VariantGrid VariantGrid) { Copy(VariantGrid); } private void Copy(VariantGrid VariantGrid) { Tag = VariantGrid.Tag; ValueX = VariantGrid.ValueX; ValueY = VariantGrid.ValueY; foreach (MorphVariant dif in VariantGrid.difs) { difs.Add(new MorphVariant(dif)); } } public void Add(MorphVariant MorphVariant) { difs.Add(MorphVariant); } public void Draw(RenderArea Are) { Are.Draw(Current); } public void Draw(AreM AreM) { AreM.Draw(Current); } private ShapePart GetJoinRoot(PartGroup ps) { ShapePart[] array = ps.EnumAllPar().ToArray(); if (array.Length <= 1) { return array.FirstOrDefault(); } ShapePart[] array2 = array; foreach (ShapePart p0 in array2) { Vector2D p = p0.Position; if (array.All((ShapePart p1) => p0 == p1 || p1.JP.All((JointPoint j) => !(p1.ToGlobal(j.Joint).DistanceSquared(p) <= Join.IdentityDistance)))) { return p0; } } ShapePart shapePart = array.FirstOrDefault((ShapePart e) => e.JP.Count > 0); if (shapePart != null) { return shapePart; } return array.First(); } public void SetJoints() { pj = new Dictionary(); pr = new Dictionary(); foreach (PartGroup item in EnumAllPars()) { ShapePart joinRoot = GetJoinRoot(item); if (joinRoot != null) { pj.Add(item, joinRoot.GetJoints(item.EnumAllPar())); pr.Add(item, joinRoot); } } } public void JoinP() { pj[Current].JoinP(); } public void JoinPA() { pj[Current].JoinPA(); } public void JoinPAall() { foreach (Joints value in pj.Values) { value.JoinPA(); } } public void JoinPA(PartGroup ps) { if (pj.ContainsKey(ps)) { pj[ps].JoinPA(); } } public ShapePart GetHitPar_(Color HitColor) { return difs.FirstOrDefault((MorphVariant d) => d.IsHit(ref HitColor)).Parss.FirstOrDefault((PartGroup ps) => ps.IsHit(ref HitColor)).EnumAllPar().FirstOrDefault((ShapePart e) => e.HitColor == HitColor); } public bool IsHit(ref Color HitColor) { foreach (MorphVariant dif in difs) { if (dif.IsHit(ref HitColor)) { return true; } } return false; } public void ReverseX() { SetJoints(); foreach (MorphVariant dif in difs) { dif.ReverseX(); } JoinP(); } public void ReverseY() { SetJoints(); foreach (MorphVariant dif in difs) { dif.ReverseY(); } JoinP(); } public void Dispose() { foreach (MorphVariant dif in difs) { dif.Dispose(); } } } }