1 using Microsoft.Xna.Framework;
3 using System.Collections.Generic;
4 using System.Collections.Immutable;
28 AllowedNames = element.GetAttributeStringArray(
"names", Array.Empty<
string>()).ToList();
29 MinCount = element.GetAttributeInt(
"mincount", 1);
30 MaxCount = Math.Max(element.GetAttributeInt(
"maxcount", 1),
MinCount);
48 Wall = MainPathWall | SidePathWall | CaveWall,
55 } =
new List<Sprite>();
122 } =
new Dictionary<Sprite, XElement>();
132 [
Serialize(
"0.0,1.0",
IsPropertySaveable.Yes, description:
"The sprite depth of the object (min, max). Values of 0 or less make the object render in front of walls, values larger than 0 make it render behind walls with a parallax effect."),
Editable]
139 [
Editable(MinValueFloat = 0.0f, MaxValueFloat = 10.0f),
140 Serialize(0.0f,
IsPropertySaveable.Yes, description:
"The tendency for the prefab to form clusters. Used as an exponent for perlin noise values that are used to determine the probability for an object to spawn at a specific position.")]
151 [
Editable(MinValueFloat = 0.0f, MaxValueFloat = 1.0f),
152 Serialize(0.0f,
IsPropertySaveable.Yes, description:
"A value between 0-1 that determines the z-coordinate to sample perlin noise from when determining the probability " +
153 " for an object to spawn at a specific position. Using the same (or close) value for different objects means the objects tend " +
154 "to form clusters in the same areas.")]
205 private Vector2 randomRotation;
209 get {
return new Vector2(MathHelper.ToDegrees(randomRotation.X), MathHelper.ToDegrees(randomRotation.Y)); }
212 randomRotation =
new Vector2(MathHelper.ToRadians(value.X), MathHelper.ToRadians(value.Y));
218 private float swingAmount;
222 get {
return MathHelper.ToDegrees(swingAmount); }
225 swingAmount = MathHelper.ToRadians(value);
238 [
Editable,
Serialize(
"0.0,0.0",
IsPropertySaveable.Yes, description:
"How much the scale of the object oscillates on each axis. A value of 0.5,0.5 would make the object's scale oscillate from 100% to 150%.")]
253 "This is relative to the commonness of the other objects - for example, having an object with " +
254 "a commonness of 1 and another with a commonness of 10 would mean the latter appears in levels 10 times as frequently as the former. " +
255 "The commonness value can be overridden on specific level types.")]
322 return "LevelObjectPrefab (" +
Identifier +
")";
338 LoadElements(file, element, -1);
339 InitProjSpecific(element);
343 if (element !=
null && !element.
Attributes(
"minsurfacewidth").Any())
352 if (!identifierOverride.IsEmpty) {
return identifierOverride; }
353 Identifier identifier = element.GetAttributeIdentifier(
"identifier",
"");
354 if (identifier.IsEmpty)
357 DebugConsole.ThrowError($
"Level object prefab \"{element.Name}\" has no identifier! Using the name as the identifier instead...");
359 DebugConsole.AddWarning($
"Level object prefab \"{element.Name}\" has no identifier! Using the name as the identifier instead...");
361 identifier = element.NameAsIdentifier();
368 int propertyOverrideCount = 0;
370 foreach (var subElement
in element.
Elements())
372 switch (subElement.Name.ToString().ToLowerInvariant())
375 var newSprite =
new Sprite(subElement, lazyLoad:
true);
377 var spriteSpecificPhysicsBodyElement =
378 subElement.GetChildElement(
"PhysicsBody") ?? subElement.GetChildElement(
"Body") ??
379 subElement.GetChildElement(
"physicsbody") ?? subElement.GetChildElement(
"body");
380 if (spriteSpecificPhysicsBodyElement !=
null)
385 case "deformablesprite":
390 foreach (var subElement
in element.
Elements())
392 switch (subElement.Name.ToString().ToLowerInvariant())
394 case "overridecommonness":
410 case "overrideproperties":
411 var propertyOverride =
new LevelObjectPrefab(subElement, file, identifierOverride: $
"{Identifier}-{propertyOverrideCount}".ToIdentifier());
413 if (!propertyOverride.Sprites.Any() && propertyOverride.DeformableSprite ==
null)
415 propertyOverride.Sprites =
Sprites;
418 propertyOverrideCount++;
429 partial
void InitProjSpecific(ContentXElement element);
434 if (generationParams !=
null &&
440 return requireCaveSpecificOverride ? 0.0f :
Commonness;
451 if (levelData?.
Biome !=
null)
455 return biomeCommonness;
IEnumerable< XAttribute > Attributes()
IEnumerable< ContentXElement > Elements()
LevelGenerationParams GenerationParams
List< string > AllowedNames
ChildObject(XElement element)
float ScaleOscillationFrequency
DeformableSprite DeformableSprite
List< LevelObjectPrefab > OverrideProperties
A list of prefabs whose properties override this one's properties when a trigger is active....
Dictionary< Identifier, SerializableProperty > SerializableProperties
LevelObjectPrefab(ContentXElement element, LevelObjectPrefabsFile file, Identifier identifierOverride=default)
XElement PhysicsBodyElement
static readonly PrefabCollection< LevelObjectPrefab > Prefabs
float GetCommonness(CaveGenerationParams generationParams, bool requireCaveSpecificOverride=true)
int PhysicsBodyTriggerIndex
readonly List< ContentXElement > LevelTriggerElements
float ClusteringGroup
A value between 0-1 that determines the z-coordinate to sample perlin noise from when determining the...
override string ToString()
Dictionary< Sprite, XElement > SpriteSpecificPhysicsBodyElements
float ClusteringAmount
The tendency for the prefab to form clusters. Used as an exponent for perlin noise values that are us...
readonly Dictionary< Identifier, float > OverrideCommonness
Overrides the commonness of the object in a specific level type. Key = name of the level type,...
Vector2 RandomRotationRad
List< ChildObject > ChildObjects
float MinSurfaceWidth
Minimum length of a graph edge the object can spawn on.
static Identifier ParseIdentifier(Identifier identifierOverride, XElement element)
Alignment Alignment
Which sides of a wall the object can appear on.
float GetCommonness(LevelData levelData)
readonly Identifier Identifier
Prefab that has a property serves as a deterministic hash of a prefab's identifier....
static Dictionary< Identifier, SerializableProperty > DeserializeProperties(object obj, XElement element=null)