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); }
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); }
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); } }