public TurretAssembly Assemble(RootModel model)
        {
            GameObject     assemblyObject = UnityEngine.Object.Instantiate(Resources.Load <GameObject>(ASSEMBLY_PREFAB_PATH));
            TurretAssembly assembly       = assemblyObject.GetComponent <TurretAssembly>();
            ObjectModel    obj            = model.Root as ObjectModel;

            assembly.Name        = obj.GetValue <string>("Name");
            assembly.Description = obj.GetValue <string>("Description");
            ObjectModel tiers    = obj.GetObject("Tiers");
            UpgradeMap  upgrades = _valueAssembler.Assemble(obj.GetObject("UpgradeMap"), typeof(UpgradeMap), new AssemblyContext()) as UpgradeMap;

            foreach (var tierProperty in tiers.GetProperties())
            {
                Transform tierObj = AssembleTier(tierProperty.Model as ObjectModel, assembly).transform;
                Tier      tier    = Tier.Parse(tierProperty.Name);

                tierObj.gameObject.SetActive(false);
                tierObj.gameObject.name = tier.ToString();

                assembly.AddTier(tierObj, tier);
            }

            assembly.UpgradeMap = upgrades;
            assembly.SetTier(Tier.Initial);
            return(assembly);
        }
        public static void SaveFile(string path, TurretAssembly assembly)
        {
            Directory.CreateDirectory(Path.GetDirectoryName(path));
            TurretAssemblyAssembler assembler = new TurretAssemblyAssembler();
            var model = assembler.Disassemble(assembly);

            File.WriteAllText(path, ObjectPipeline.SerializeObject(model).ToString());
            Alert.Open("Assembly has been saved.");
        }
        public void AddTo(Structure structure, GlobalStructureMod mod)
        {
            mod.TryApply(structure);
            TurretAssembly assembly = structure as TurretAssembly;

            foreach (var component in assembly.GetComponents())
            {
                mod.TryApply(component);
            }
        }
        public void RemoveFrom(Structure structure, GlobalStructureMod mod)
        {
            mod.RemoveFrom(structure);
            TurretAssembly assembly = structure as TurretAssembly;

            foreach (var component in assembly.GetComponents())
            {
                mod.RemoveFrom(component);
            }
        }
 public void DeleteCurrentAssembly()
 {
     foreach (TierDisplay display in _tierDisplays)
     {
         Destroy(display.gameObject);
     }
     _tierDisplays.Clear();
     Destroy((CurrentAsssembly as Component).gameObject);
     CurrentAsssembly = null;
 }
        public TurretComponent Assemble(ObjectModel model, Transform parent, TurretAssembly assembly, AssemblyContext context)
        {
            IContentCachedPrefab component    = GetComponent(model.GetValue <string>("UniqueIdentifier"));
            ValueAssembler       assembler    = new ValueAssembler();
            GameObject           obj          = component.Instantiate();
            TurretComponent      newComponent = obj.GetComponent <TurretComponent>();

            if (parent != null)
            {
                obj.transform.SetParent(parent.transform);
                var position = (Vector2)assembler.Assemble(model.GetObject("LocalPosition"), typeof(Vector2), context);

                obj.transform.localPosition = (Vector3)position + Vector3.back * 0.1f;

                if (model.HasProperty("Angle"))
                {
                    obj.transform.localRotation = Quaternion.Euler(0f, 0f, model.GetValue <float>("Angle"));
                }
                if (model.HasProperty("Flipped"))
                {
                    if (model.GetValue <bool>("Flipped"))
                    {
                        newComponent.Flip();
                    }
                }

                TurretComponent parentComponent = parent.GetComponent <TurretComponent>();
                foreach (var point in newComponent.AttachmentPoints)
                {
                    AttachmentSlot slot = FindSlotForPoint(parentComponent.AttachmentSlots.GetSupportingPoints(point), point, obj.transform, parent.transform);
                    if (slot != null)
                    {
                        slot.Attach(newComponent);
                    }
                }
            }
            else
            {
                obj.transform.SetParent(assembly.transform);
                obj.transform.localPosition = Vector3.zero;
            }

            foreach (ValueModel child in model.GetArray("Children"))
            {
                Assemble(child as ObjectModel, newComponent.transform, assembly, context);
            }

            return(newComponent);
        }
        public RootModel Disassemble(TurretAssembly assembly)
        {
            DisassemblyContext context = new DisassemblyContext();
            List <ObjectField> tiers   = new List <ObjectField>();

            foreach (Transform tier in assembly.transform)
            {
                tiers.Add(new ObjectField(tier.name, DisassembleTier(assembly, Tier.Parse(tier.gameObject.name), context)));
            }

            return(new RootModel(new ObjectModel(
                                     new ObjectField("Name", ValueModelFactory.Create(assembly.Name, context)),
                                     new ObjectField("Description", ValueModelFactory.Create(assembly.Description, context)),
                                     new ObjectField("Tiers", new ObjectModel(tiers.ToArray())),
                                     new ObjectField("UpgradeMap", _valueAssembler.Disassemble(assembly.UpgradeMap, typeof(UpgradeMap), new DisassemblyContext())
                                                     ))));
        }
        private void LoadFile(string path)
        {
            if (CurrentAsssembly)
            {
                DeleteCurrentAssembly();
            }

            var json  = JObject.Parse(File.ReadAllText(path));
            var model = ObjectPipeline.DeserializeObject(json);

            TurretAssemblyAssembler assembler = new TurretAssemblyAssembler();

            CurrentAsssembly = assembler.Assemble(model);

            if (CurrentAsssembly is Component comp)
            {
                comp.transform.position = Vector3.zero;
                comp.transform.rotation = Quaternion.identity;
            }

            NameText.text        = CurrentAsssembly.Name;
            DescriptionText.text = CurrentAsssembly.Description;
        }
 private void Start()
 {
     _assembly = GetComponent <TurretAssembly>();
 }
 private bool IsUnlocked(TurretAssembly assembly) => assembly.GetComponents().All(x => UnlockList.IsUnlocked(x.Identifier));
 private bool ContainsComponent(TurretAssembly assembly, string identifier) => assembly.GetComponents().Any(x => x.Identifier == identifier);
 public void SetAssembly(TurretAssembly assembly)
 {
     CurrentAsssembly = assembly;
 }
 private ObjectModel DisassembleTier(TurretAssembly assembly, Tier tier, DisassemblyContext context)
 {
     return(_assembler.Dissassemble(assembly.GetRootComponent(tier), context));
 }
 private TurretComponent AssembleTier(ObjectModel model, TurretAssembly assembly)
 {
     return(_assembler.Assemble(model, null, assembly, new AssemblyContext()));
 }