Exemplo n.º 1
0
 static void StreamType <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s,
                                        object ctxt, ref MegaloScriptVariableType type)
     where TDoc : class
     where TCursor : class
 {
     s.StreamCursorEnum(ref type);
 }
 public void Serialize <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
     where TDoc : class
     where TCursor : class
 {
     s.StreamCursorEnum(ref mType);
     s.StreamAttributeEnumOpt("target", ref mTarget, e => e != BCollectibleSkullTarget.None);
     s.StreamAttributeOpt("value", ref mValue, PhxPredicates.IsNotInvalid);
 }
Exemplo n.º 3
0
 public void Serialize <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
     where TDoc : class
     where TCursor : class
 {
     //if (s.IsReading) s.ReadCursorName(ref mType);
     s.StreamAttributeEnum(kXmlAttrType, ref mType);
     s.StreamAttribute(kXmlAttrSigId, ref mSigID);
     s.StreamAttribute(DatabaseNamedObject.kXmlAttrNameN, ref mName);
     s.StreamAttributeOpt(kXmlAttrOptional, ref mOptional, Predicates.IsTrue);
     s.StreamCursorEnum(ref mVarType);
 }
Exemplo n.º 4
0
        protected virtual void SerializeImpl <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
            where TDoc : class
            where TCursor : class
        {
            using (s.EnterCursorBookmark("SerializeFlags"))
                s.StreamCursorEnum(ref TagElementStreamSerializeFlags, true);

            s.StreamAttribute("encoding", ref mEncodingVersion, NumeralBase.Hex);
            s.StreamAttribute("version", ref EngineVersion);
            // Must come first. Most of the other variant data contains string references
            SerializeLocaleStrings(s);

            using (var bm = s.EnterCursorBookmarkOpt("PlayerTraits", PlayerTraits, Predicates.HasItems)) if (bm.IsNotNull)
                {
                    s.StreamableElements("entry", PlayerTraits, this, _this => _this.NewMegaloPlayerTraits());
                }
            using (var bm = s.EnterCursorBookmarkOpt("UserDefinedOptions", UserDefinedOptions, Predicates.HasItems)) if (bm.IsNotNull)
                {
                    s.StreamableElements("entry", UserDefinedOptions);
                }

            if (!s.StreamAttributeOpt("engineIcon", ref EngineIconIndex, Predicates.IsNotNone))
            {
                EngineIconIndex = TypeExtensions.kNone;
            }
            if (!s.StreamAttributeOpt("engineCategory", ref EngineCategory, Predicates.IsNotNone))
            {
                EngineCategory = TypeExtensions.kNone;
            }

            using (var bm = s.EnterCursorBookmarkOpt("MapPermissions", MapPermissions, mp => !mp.IsDefault)) if (bm.IsNotNull)
                {
                    s.StreamObject(MapPermissions);
                }

            using (var bm = s.EnterCursorBookmarkOpt("PlayerRatingParams", PlayerRatingParameters, prp => !prp.IsDefault)) if (bm.IsNotNull)
                {
                    s.StreamObject(PlayerRatingParameters);
                }
                else
                {
                    PlayerRatingParameters.RevertToDefault();
                }

            s.StreamAttributeOpt("scoreToWinRound", ref ScoreToWinRound, Predicates.IsNotZero);

            SerializeOptionToggles(s);
        }
        public void Serialize <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
            where TDoc : class
            where TCursor : class
        {
            var xs = s.GetSerializerInterface();

            s.StreamAttribute("Position", ref mPosition);

            s.StreamAttributeEnum("Type", ref mCommandType);
            switch (mCommandType)
            {
            case BProtoObjectCommandType.Research:             // proto tech
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mID, DatabaseObjectKind.Tech, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoObjectCommandType.TrainUnit:             // proto object
            case BProtoObjectCommandType.Build:
            case BProtoObjectCommandType.BuildOther:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mID, DatabaseObjectKind.Object, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoObjectCommandType.TrainSquad:             // proto squad
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mID, DatabaseObjectKind.Squad, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoObjectCommandType.ChangeMode:             // unused
                s.StreamCursorEnum(ref mSquadMode);
                break;

            case BProtoObjectCommandType.Ability:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mID, DatabaseObjectKind.Ability, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoObjectCommandType.Power:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mID, DatabaseObjectKind.Power, false, XML.XmlUtil.kSourceCursor);
                break;
            }

            s.StreamAttributeOpt("AutoClose", ref mAutoClose, Predicates.IsTrue);
        }
        public void Serialize <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
            where TDoc : class
            where TCursor : class
        {
            using (s.EnterCursorBookmark("SerializeFlags"))
                s.StreamCursorEnum(ref TagElementStreamSerializeFlags, true);

            #region TryToPort sanity checks
            if ((TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.TryToPort) != 0)
            {
                if (s.IsWriting)
                {
                    if (Proto.MegaloScriptDatabase.HaloReach == null || Proto.MegaloScriptDatabase.Halo4 == null)
                    {
                        throw new InvalidOperationException("Can't port, other game's DB isn't loaded");
                    }
                }
                else if (s.IsReading)
                {
                    var ex = new InvalidOperationException("Can't load variants saved with TryToPort");
                    s.ThrowReadException(ex);
                }
            }
            #endregion

            bool embed_model_objects = TagElementStreamSerializeFlags.EmbedObjects();
            bool write_sans_ids      = TagElementStreamSerializeFlags.EmbedObjectsWriteSansIds();

            #region Version sanity checks
            if ((TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.IgnoreVersionIds) == 0)
            {
                s.StreamVersionViaAttribute("version", kVersion, "MegaFloW Script");
                s.StreamVersionViaAttribute("dbVersion", Database.Version, "Database");
            }
            #endregion

            using (s.EnterOwnerBookmark(this))
            {
                #region helpful info dump
                if (s.IsWriting && embed_model_objects && !write_sans_ids)
                {
                    using (s.EnterCursorBookmark("IDs"))
                    {
                        s.WriteAttribute("NextCondID", Conditions.FirstInactiveIndex);
                        s.WriteAttribute("NextActionID", Actions.FirstInactiveIndex);
                        s.WriteAttribute("NextValueID", Values.FirstInactiveIndex);
                        s.WriteAttribute("NextTrigID", Triggers.FirstInactiveIndex);
                        if (Database.Limits.SupportsVirtualTriggers)
                        {
                            s.WriteAttribute("NextVirtualTriggerID", VirtualTriggers.FirstInactiveIndex);
                        }
                    }
                }
                #endregion

                #region ObjectTypeReferences
                using (var bm = s.EnterCursorBookmarkOpt("ObjectTypeReferences", ObjectTypeReferences, Predicates.HasBits)) if (bm.IsNotNull)
                    {
                        ObjectTypeReferences.Serialize(s, "Ref", this, SerializeObjectTypeReference,
                                                       Database.StaticDatabase.ObjectTypeList.Types.Count - 1);
                    }
                #endregion

                #region GameStatistics
                using (var bm = s.EnterCursorBookmarkOpt("Statistics", GameStatistics, Predicates.HasItems)) if (bm.IsNotNull)
                    {
                        s.StreamableElements("Stat", GameStatistics, this, _this => _this.NewGameStatistic());
                    }
                #endregion

                #region HudWidgets
                using (var bm = s.EnterCursorBookmarkOpt("HudWidgets", HudWidgets, Predicates.HasItems)) if (bm.IsNotNull)
                    {
                        s.StreamableElements("Widget", HudWidgets);
                    }
                #endregion

                #region Object Filters
                using (var bm = s.EnterCursorBookmarkOpt("ObjectFilters", ObjectFilters, Predicates.HasItems)) if (bm.IsNotNull)
                    {
                        s.StreamableElements("Filter", ObjectFilters);
                    }

                if (Database.Limits.SupportsGameObjectFilters)
                {
                    SerializeGameObjectFilters(s);
                }
                #endregion

                #region Variables
                Predicate <MegaloScriptModelVariableSet> set_is_not_empty = v => v.IsNotEmpty;

                using (var bm = s.EnterCursorBookmarkOpt("GlobalVariables", GlobalVariables, set_is_not_empty)) if (bm.IsNotNull)
                    {
                        GlobalVariables.Serialize(this, s);
                    }
                using (var bm = s.EnterCursorBookmarkOpt("PlayerVariables", PlayerVariables, set_is_not_empty)) if (bm.IsNotNull)
                    {
                        PlayerVariables.Serialize(this, s);
                    }
                using (var bm = s.EnterCursorBookmarkOpt("ObjectVariables", ObjectVariables, set_is_not_empty)) if (bm.IsNotNull)
                    {
                        ObjectVariables.Serialize(this, s);
                    }
                using (var bm = s.EnterCursorBookmarkOpt("TeamVariables", TeamVariables, set_is_not_empty)) if (bm.IsNotNull)
                    {
                        TeamVariables.Serialize(this, s);
                    }
                #endregion

                #region UnionGroups
                if (!TagElementStreamSerializeFlags.EmbedObjectsWriteSansIds())
                {
                    using (s.EnterCursorBookmark("UnionGroups")) Collections.ActiveListUtil.
                        Serialize(s, "Group", UnionGroups, this, NewUnionGroupFromTagStream);
                }
                #endregion

                #region Values or Global Values
                // #NOTE_BLAM: A Values element will be created even if there are no global values
                using (s.EnterCursorBookmark("Values")) Collections.ActiveListUtil.
                    Serialize(s, "Value", Values, this, MegaloScriptValueBase.NewFromTagStream,
                              embed_model_objects ? MegaloScriptValueBase.SkipIfNotGlobalPredicate : null);
                #endregion

                #region Conditions / Actions / Virtual Triggers (non-embedded)
                if (!embed_model_objects)
                {
                    using (s.EnterCursorBookmark("Conditions")) Collections.ActiveListUtil.
                        Serialize(s, "Condition", Conditions, this, NewConditionFromTagStream);
                    using (s.EnterCursorBookmark("Actions")) Collections.ActiveListUtil.
                        Serialize(s, "Action", Actions, this, NewActionFromTagStream);
                    using (s.EnterCursorBookmark("VirtualTriggers")) Collections.ActiveListUtil.
                        Serialize(s, "Trigger", VirtualTriggers, this, NewVirtualTriggerFromTagStream);
                }
                #endregion

                using (s.EnterCursorBookmark("Triggers")) Collections.ActiveListUtil.
                    Serialize(s, "Trigger", Triggers, this, NewTriggerFromTagStream,
                              embed_model_objects ? MegaloScriptTrigger.SkipIfNotRootPredicate : null,
                              GetTriggersTagElementStreamReadMode);

                #region Trigger Indexes
                using (s.EnterCursorBookmark("EntryPoints"))
                {
                    var id_resolving_ctxt = new TriggerIndexNameResolvingContext(this);
                    var id_resolver       = TriggerIndexNameResolvingContext.IdResolver;
                    var name_resolver     = TriggerIndexNameResolvingContext.NameResolver;

                    s.StreamElementOptIdAsString("Initialization", ref mInitializationTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("LocalInitialization", ref mLocalInitializationTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("HostMigration", ref mHostMigrationTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("DoubleHostMigration", ref mDoubleHostMigrationTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("ObjectDeathEvent", ref mObjectDeathEventTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("Local", ref mLocalTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("Pregame", ref mPregameTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                    s.StreamElementOptIdAsString("Incident", ref mIncidentTriggerIndex, id_resolving_ctxt, id_resolver, name_resolver, Predicates.IsNotNull);
                }
                #endregion

                using (var bm = s.EnterCursorBookmarkOpt("ExecutionOrder", TriggerExecutionOrder, Predicates.HasItems)) if (bm.IsNotNull)
                    {
                        s.StreamElements("Trigger", TriggerExecutionOrder, this, SerializeTriggerExecutionOrder);
                    }
            }

            #region List count sanity checks
            if (s.IsReading)
            {
                // #TODO_IMPLEMENT: sanity check list counts
                var limits = Database.Limits;

                limits.GameStatistics.ValidateListCount(GameStatistics, "GameStatistics", s);
                GlobalVariables.ValidateVariableListCounts(s);
                PlayerVariables.ValidateVariableListCounts(s);
                ObjectVariables.ValidateVariableListCounts(s);
                TeamVariables.ValidateVariableListCounts(s);
                limits.HudWidgets.ValidateListCount(HudWidgets, "HudWidgets", s);
                limits.ObjectFilters.ValidateListCount(ObjectFilters, "ObjectFilters", s);
                limits.GameObjectFilters.ValidateListCount(CandySpawnerFilters, "GameObjectFilters", s);
            }
            #endregion
        }
        public void Serialize <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s)
            where TDoc : class
            where TCursor : class
        {
            var xs = s.GetSerializerInterface();

            s.StreamAttributeEnum("type", ref mType);

            bool stream_targets = false;

            switch (mType)
            {
            case BProtoTechEffectType.Data:
                // #NOTE engine parses these as AllActions,Action,SubType,Amount,Relativity

                // e.g., SubType==Icon and these won't be used...TODO: is Icon the only one?
                s.StreamAttributeOpt("amount", ref mAmount, PhxPredicates.IsNotInvalidNaN);
                s.StreamAttributeEnum("subtype", ref mDU.SubType);
                // #NOTE the engine treats AllActions being present as 'true', no matter its actual value
                s.StreamAttributeOpt("allactions", ref mAllActions, Predicates.IsTrue);
                s.StreamStringOpt("action", ref mAction, false, intern: true);
                s.StreamAttributeEnumOpt("relativity", ref mRelativity, x => x != BObjectDataRelative.Invalid);
                StreamXmlObjectData(s, xs);
                stream_targets = true;
                break;

            case BProtoTechEffectType.TransformUnit:
            case BProtoTechEffectType.Build:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mDU.ToTypeID, DatabaseObjectKind.Object, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoTechEffectType.TransformProtoUnit:
            case BProtoTechEffectType.TransformProtoSquad:
                xs.StreamDBID(s, "FromType", ref mDU.FromTypeID, TransformProtoObjectKind, false, XML.XmlUtil.kSourceAttr);
                xs.StreamDBID(s, "ToType", ref mDU.ToTypeID, TransformProtoObjectKind, false, XML.XmlUtil.kSourceAttr);
                break;

                #region Unused
            case BProtoTechEffectType.SetAge:
                s.StreamCursorEnum(ref mDU.SetAgeLevel);
                break;

                #endregion
            case BProtoTechEffectType.GodPower:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mDU.ID, DatabaseObjectKind.Power, false, XML.XmlUtil.kSourceCursor);
                s.StreamAttribute("amount", ref mAmount);
                break;

                #region Unused
            case BProtoTechEffectType.TechStatus:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mDU.ID, DatabaseObjectKind.Tech, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoTechEffectType.Ability:
                xs.StreamDBID(s, XML.XmlUtil.kNoXmlName, ref mDU.ID, DatabaseObjectKind.Ability, false, XML.XmlUtil.kSourceCursor);
                break;

            case BProtoTechEffectType.SharedLOS:             // no extra parsed data
                break;

            case BProtoTechEffectType.AttachSquad:
                xs.StreamDBID(s, "squadType", ref mDU.ID, DatabaseObjectKind.Squad, false, XML.XmlUtil.kSourceAttr);
                stream_targets = true;
                break;
                #endregion
            }

            if (stream_targets)
            {
                XML.XmlUtil.Serialize(s, Targets, BProtoTechEffectTarget.kBListXmlParams);
            }
        }