static void SerializeTriggerExecutionOrder <TDoc, TCursor>(IO.TagElementStream <TDoc, TCursor, string> s,
                                                                   MegaloScriptModel model, ref int triggerIndex)
            where TDoc : class
            where TCursor : class
        {
            if (model.TagElementStreamSerializeFlags.EmbedObjects())
            {
                var id_resolving_ctxt = new TriggerIndexNameResolvingContext(model);
                var id_resolver       = TriggerIndexNameResolvingContext.IdResolver;
                var name_resolver     = TriggerIndexNameResolvingContext.NameResolver;

                s.StreamCursorIdAsString(ref triggerIndex, id_resolving_ctxt, id_resolver, name_resolver);
            }
            else
            {
                s.StreamCursor(ref triggerIndex);

                if (model.Triggers.SlotIsFreeOrInvalidIndex(triggerIndex))
                {
                    var ex = new System.IO.InvalidDataException(string.Format(
                                                                    "Couldn't define execution order for invalid trigger index {0}", triggerIndex));
                    s.ThrowReadException(ex);
                }
            }

            if (!model.Triggers[triggerIndex].TriggerType.IsUpdatedOnGameTick())
            {
                var ex = new System.IO.InvalidDataException(string.Format(
                                                                "Trigger '{0}' can't have its execution explicitly ordered",
                                                                triggerIndex.ToString()
                                                                ));
                s.ThrowReadException(ex);
            }
        }
Exemplo n.º 2
0
        protected override void SerializeValue <TDoc, TCursor>(MegaloScriptModel model, IO.TagElementStream <TDoc, TCursor, string> s)
        {
            if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.UseIndexNames) != 0)
            {
                var resolving_ctxt = new MegaloScriptModelVariableSet.IndexNameResolvingContext(model, ValueType, supportNone: true);
                s.StreamCursorIdAsString(ref mValue, resolving_ctxt,
                                         MegaloScriptModelVariableSet.IndexNameResolvingContext.IdResolver,
                                         MegaloScriptModelVariableSet.IndexNameResolvingContext.NameResolver);
            }
            else
            {
                s.StreamCursor(ref mValue);
            }

            if (!ValidateValue(model))
            {
                throw new System.IO.InvalidDataException(string.Format("VarIndex value #{0} has an invalid value {1}",
                                                                       Id, Value));
            }
        }
Exemplo n.º 3
0
        internal static void SerializeValue <TDoc, TCursor>(MegaloScriptModel model, IO.TagElementStream <TDoc, TCursor, string> s,
                                                            MegaloScriptValueType valueType, ref uint value,
                                                            IO.TagElementNodeType nodeType = IO.TagElementNodeType.Text, string nodeName = null)
            where TDoc : class
            where TCursor : class
        {
            Contract.Requires(valueType.BaseType == MegaloScriptValueBaseType.Flags);

            if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.UseEnumNames) != 0)
            {
                var id_resolving_ctxt = new Proto.MegaloScriptEnum.FlagsNameResolvingContext(model.Database, valueType);
                var id_resolver       = Proto.MegaloScriptEnum.FlagsNameResolvingContext.IdResolver;
                var name_resolver     = Proto.MegaloScriptEnum.FlagsNameResolvingContext.NameResolver;

                switch (nodeType)
                {
                case IO.TagElementNodeType.Element:
                    s.StreamElementIdAsString(nodeName, ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;

                case IO.TagElementNodeType.Attribute:
                    s.StreamAttributeIdAsString(nodeName, ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;

                case IO.TagElementNodeType.Text:
                    s.StreamCursorIdAsString(ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;
                }
            }
            else
            {
                switch (nodeType)
                {
                case IO.TagElementNodeType.Element:             s.StreamElement(nodeName, ref value); break;

                case IO.TagElementNodeType.Attribute:   s.StreamAttribute(nodeName, ref value); break;

                case IO.TagElementNodeType.Text:                s.StreamCursor(ref value); break;
                }
            }
        }
        void SerializeData <TDoc, TCursor>(MegaloScriptModel model, IO.TagElementStream <TDoc, TCursor, string> s,
                                           Proto.MegaloScriptValueType valueType)
            where TDoc : class
            where TCursor : class
        {
            var base_type = valueType.BaseType;

            switch (base_type)
            {
            case Proto.MegaloScriptValueBaseType.Int:
            case Proto.MegaloScriptValueBaseType.UInt:
                s.StreamCursor(ref Data);
                break;

            case Proto.MegaloScriptValueBaseType.Var:
                if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.UseIndexNames) != 0)
                {
                    var resolving_ctxt = new MegaloScriptModelVariableSet.IndexNameResolvingContext(model, valueType);
                    s.StreamCursorIdAsString(ref Data, resolving_ctxt,
                                             MegaloScriptModelVariableSet.IndexNameResolvingContext.IdResolver,
                                             MegaloScriptModelVariableSet.IndexNameResolvingContext.NameResolver);
                }
                else
                {
                    s.StreamCursor(ref Data);
                }
                break;

            case Proto.MegaloScriptValueBaseType.Enum:
                MegaloScriptEnumValue.SerializeValue(model, s, valueType, ref Data, IO.TagElementNodeType.Text);
                break;

            case Proto.MegaloScriptValueBaseType.Index:
                MegaloScriptIndexValue.SerializeValue(model, s, valueType, ref Data, IO.TagElementNodeType.Text);
                break;

            default: throw new KSoft.Debug.UnreachableException(base_type.ToString());
            }
        }
Exemplo n.º 5
0
        internal static void SerializeValue <TDoc, TCursor>(MegaloScriptModel model, IO.TagElementStream <TDoc, TCursor, string> s,
                                                            MegaloScriptValueType valueType, ref int value,
                                                            IO.TagElementNodeType nodeType = IO.TagElementNodeType.Text, string nodeName = null)
            where TDoc : class
            where TCursor : class
        {
            Contract.Requires(valueType.BaseType == MegaloScriptValueBaseType.Index);

            var target = valueType.IndexTarget;

            if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.EmbedObjects) != 0 &&
                target == MegaloScriptValueIndexTarget.Trigger)
            {
                SerializeTriggerReferenceValue(model, s, valueType, ref value);
            }
            #region UseIndexNames
            else if ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.UseIndexNames) != 0 &&
                     target.HasIndexName())
            {
                var id_resolving_ctxt = new MegaloScriptModel.IndexNameResolvingContext(model, target);
                var id_resolver       = MegaloScriptModel.IndexNameResolvingContext.IdResolver;
                var name_resolver     = MegaloScriptModel.IndexNameResolvingContext.NameResolver;

                switch (nodeType)
                {
                case IO.TagElementNodeType.Element:
                    s.StreamElementIdAsString(nodeName, ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;

                case IO.TagElementNodeType.Attribute:
                    s.StreamAttributeIdAsString(nodeName, ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;

                case IO.TagElementNodeType.Text:
                    s.StreamCursorIdAsString(ref value, id_resolving_ctxt, id_resolver, name_resolver);
                    break;
                }
            }
            #endregion
            else
            {
                switch (nodeType)
                {
                case IO.TagElementNodeType.Element:             s.StreamElement(nodeName, ref value); break;

                case IO.TagElementNodeType.Attribute:   s.StreamAttribute(nodeName, ref value); break;

                case IO.TagElementNodeType.Text:                s.StreamCursor(ref value); break;
                }
            }

            // #REVIEW_BLAM: this will fail when embedding and the target is a Trigger since we don't preload triggers or such
            if (s.IsReading &&
                ((model.TagElementStreamSerializeFlags & MegaloScriptModelTagElementStreamFlags.EmbedObjects) == 0 || target != MegaloScriptValueIndexTarget.Trigger)
                )
            {
                if (!model.IndexTargetIsValid(target, valueType.IndexTraits, value))
                {
                    s.ThrowReadException(new System.IO.InvalidDataException(string.Format(Util.InvariantCultureInfo,
                                                                                          "A {0} reference has an invalid value {1}", target, value)));
                }
            }
        }