public void Serialize(AnimationSerializeContext context) { if (Asserts.enabled && !ValidateAlphaMasks()) { throw new InvalidOperationException( "Attempting to save animation set with missing or invalid alpha masks"); } context.bw.WriteNullableString(friendlyName); context.bw.Write(importOrigin); context.bw.WriteNullableString(behaviour); if (context.bw.WriteBoolean(Heightmap != null)) { Heightmap.Serialize(context); } // If you don't seem to have set any physics bounds, I will just generate them... if (physicsStartX == 0 && physicsEndX == 1 && physicsStartZ == 0 && physicsEndZ == 1 && physicsHeight == 0 || physicsEndX - physicsStartX <= 0) { AutoGeneratePhysicsAndDepthBounds(); } // NOTE: only writing out values that cannot be auto-generated if (Heightmap != null) { Debug.Assert(!Asserts.enabled || Heightmap.IsObjectHeightmap || physicsHeight == 0); context.bw.Write(physicsHeight); if (physicsHeight > 0) { depthBounds.Serialize(context); } context.bw.Write(flatDirection); // <- for the sake of editing, keep this value around } else { context.bw.Write(physicsStartX); context.bw.Write(physicsEndX); context.bw.Write(physicsStartZ); context.bw.Write(physicsHeight); context.bw.Write(flatDirection); if (physicsHeight == 0) { context.bw.Write(physicsEndZ); } } if (context.Version >= 38) { context.bw.Write(coplanarPriority); } if (context.Version >= 36) { context.bw.Write(doAboveCheck); } if (context.bw.WriteBoolean(Ceiling != null)) { Ceiling.Serialize(context); } animations.SerializeTagLookup(context, a => a.Serialize(context)); // Unused Animations { if (unusedAnimations == null) { context.bw.Write(0); // unused animations is lazy-initialized } else { context.bw.Write(unusedAnimations.Count); foreach (var animation in unusedAnimations) { animation.Serialize(context); } } } context.bw.WriteNullableString(cue); // Shadow layers: { if (shadowLayers == null) { context.bw.Write(0); } else { context.bw.Write(shadowLayers.Count); foreach (var sl in shadowLayers) { context.bw.Write(sl.startHeight); sl.shadowSpriteRef.Serialize(context); } RecalculateCachedShadowBounds(); context.bw.Write(cachedShadowBounds); } } // Properties: if (context.Version >= 40) { context.bw.Write(properties.Count); foreach (var kvp in properties) { context.bw.Write(kvp.Key); context.bw.Write(kvp.Value ?? string.Empty); // (null value should probably be blocked by editor, but being safe...) } } }