protected MegaloScriptModel(Variants.GameEngineVariant variantManager, Variants.GameEngineMegaloVariant variant)
        {
            Database      = variantManager.MegaloProtoSystem.GetMegaloDatabaseAsync(variantManager.GameBuild).Result;
            MegaloVariant = variant;

            var db = Database;

            UnionGroups           = new Collections.ActiveList <MegaloScriptUnionGroup>(db.Limits.UnionGroupsDesc);
            Values                = new Collections.ActiveList <MegaloScriptValueBase>(db.Limits.ScriptValuesDesc);
            VirtualTriggers       = new Collections.ActiveList <MegaloScriptVirtualTrigger>(db.Limits.VirtualTriggersDesc);
            TriggerExecutionOrder = new ObservableCollection <int>();

            Conditions     = new Collections.ActiveList <MegaloScriptCondition>(db.Limits.ConditionsDesc);
            Actions        = new Collections.ActiveList <MegaloScriptAction>(db.Limits.ActionsDesc);
            Triggers       = new Collections.ActiveList <MegaloScriptTrigger>(db.Limits.TriggersDesc);
            GameStatistics = new ObservableCollection <MegaloScriptGameStatistic>();
            #region Variable Sets
            GlobalVariables = new MegaloScriptModelVariableSet(Database, MegaloScriptVariableSet.Globals);
            PlayerVariables = new MegaloScriptModelVariableSet(Database, MegaloScriptVariableSet.Player);
            ObjectVariables = new MegaloScriptModelVariableSet(Database, MegaloScriptVariableSet.Object);
            TeamVariables   = new MegaloScriptModelVariableSet(Database, MegaloScriptVariableSet.Team);
            #endregion
            HudWidgets = new ObservableCollection <MegaloScriptHudWidget>();
            #region Trigger entry points
            InitializationTriggerIndex           = LocalInitializationTriggerIndex =
                HostMigrationTriggerIndex        = DoubleHostMigrationTriggerIndex =
                    ObjectDeathEventTriggerIndex =
                        LocalTriggerIndex        = PregameTriggerIndex =
                            IncidentTriggerIndex =
                                TypeExtensions.kNone;
            #endregion
            ObjectTypeReferences = new Collections.BitSet(db.Limits.MultiplayerObjectTypes.MaxCount);
            ObjectFilters        = new ObservableCollection <MegaloScriptObjectFilter>();
            CandySpawnerFilters  = new ObservableCollection <MegaloScriptGameObjectFilter>();
        }
        void DecompileVariableNames(MegaloScriptModelVariableSet set)
        {
            string prefix = set.SetType != MegaloScriptVariableSet.Globals ? set.SetType.ToString() : "Global";
            var    custom_var_proto_type = Database.VariableRefTypes[MegaloScriptVariableReferenceType.Custom];
            var    sb = new System.Text.StringBuilder();

            for (int x = 0; x < set.Numerics.Count; x++, sb.Clear())
            {
                var variable = set.Numerics[x];
                var custom_var_proto_member = custom_var_proto_type.Members[variable.Var.Type];
                var value_type = custom_var_proto_member.ValueType;

                sb.Append(prefix);
                sb.Append("Numeric");

                if (value_type.BaseType == Proto.MegaloScriptValueBaseType.Index &&
                    value_type.IndexTarget == Proto.MegaloScriptValueIndexTarget.Option)
                {
                    var option = Variant.UserDefinedOptions[variable.Var.Data];
                    sb.Append(option.CodeName.Replace(" ", ""));
                }
                else
                {
                    sb.Append(x);
                }

                variable.CodeName = sb.ToString();
            }
            for (int x = 0; x < set.Timers.Count; x++, sb.Clear())
            {
                var variable = set.Timers[x];
                var custom_var_proto_member = custom_var_proto_type.Members[variable.Var.Type];
                var value_type = custom_var_proto_member.ValueType;

                sb.Append(prefix);
                sb.Append("Timer");

                if (value_type.BaseType == Proto.MegaloScriptValueBaseType.Index &&
                    value_type.IndexTarget == Proto.MegaloScriptValueIndexTarget.Option)
                {
                    var option = Variant.UserDefinedOptions[variable.Var.Data];
                    sb.Append(option.CodeName.Replace(" ", ""));
                }
                else
                {
                    sb.Append(x);
                }

                variable.CodeName = sb.ToString();
            }
            for (int x = 0; x < set.Teams.Count; x++, sb.Clear())
            {
                var variable = set.Teams[x];
                variable.CodeName = string.Format("{0}{1}{2}", prefix, "Team", x.ToString());
            }
            for (int x = 0; x < set.Players.Count; x++, sb.Clear())
            {
                var variable = set.Players[x];
                variable.CodeName = string.Format("{0}{1}{2}", prefix, "Player", x.ToString());
            }
            for (int x = 0; x < set.Objects.Count; x++, sb.Clear())
            {
                var variable = set.Objects[x];
                variable.CodeName = string.Format("{0}{1}{2}", prefix, "Object", x.ToString());
            }
        }