Files
RobustToolbox/Robust.Shared/Prototypes/IPrototype.cs
slarticodefast 4747e5a05a Add and update a lot of documentation (#6337)
* Serialization docs

Co-authored-by: Moony <moonheart08@users.noreply.github.com>

* ECS docs

Co-authored-by: Moony <moonheart08@users.noreply.github.com>

* scattered docs

Co-authored-by: Moony <moonheart08@users.noreply.github.com>

* Fixes

---------

Co-authored-by: Moony <moonheart08@users.noreply.github.com>
Co-authored-by: PJB3005 <pieterjan.briers+git@gmail.com>
2025-12-15 20:26:17 +01:00

106 lines
4.1 KiB
C#

using System;
using Robust.Shared.Serialization.Manager.Attributes;
#if !ROBUST_ANALYZERS_TEST
using Robust.Shared.ViewVariables;
#endif
namespace Robust.Shared.Prototypes
{
/// <summary>
/// IPrototype, when combined with <see cref="PrototypeAttribute"/>, defines a type that the game can load from
/// the global YAML prototypes folder during init or runtime. It's a way of defining data for the game to read
/// and act on.
/// </summary>
/// <include file='Docs.xml' path='entries/entry[@name="IPrototype"]/*'/>
/// <seealso cref="IPrototypeManager"/>
/// <seealso cref="PrototypeAttribute"/>
/// <seealso cref="IInheritingPrototype"/>
public interface IPrototype
{
/// <summary>
/// A unique ID for this prototype instance.
/// This will never be a duplicate, and the game will error during loading if there are multiple prototypes
/// with the same unique ID.
/// </summary>
#if !ROBUST_ANALYZERS_TEST
[ViewVariables(VVAccess.ReadOnly)]
#endif
string ID { get; }
}
/// <summary>
/// An extension of <see cref="IPrototype"/> that allows for a prototype to have parents that it inherits data
/// from. This, alongside <see cref="AlwaysPushInheritanceAttribute"/> and
/// <see cref="NeverPushInheritanceAttribute"/>, allow data-based multiple inheritance.
/// </summary>
/// <example>
/// An example of this in practice is <see cref="EntityPrototype"/>.
/// </example>
/// <include file='Docs.xml' path='entries/entry[@name="IPrototype"]/*'/>
/// <seealso cref="IPrototypeManager"/>
/// <seealso cref="PrototypeAttribute"/>
/// <seealso cref="IPrototype"/>
public interface IInheritingPrototype
{
/// <summary>
/// The collection of parents for this prototype. Parents' data is applied to the child in order of
/// specification in the array.
/// </summary>
string[]? Parents { get; }
/// <summary>
/// Whether this prototype is "abstract". This behaves ike an abstract class, abstract prototypes are never
/// indexable and do not show up when enumerating prototypes, as they're just a source of data to inherit
/// from.
/// </summary>
bool Abstract { get; }
}
/// <summary>
/// Marks a field as a prototype's unique identifier. This field must always be a <c>string?</c>.
/// <br/>
/// This field is always required.
/// </summary>
/// <seealso cref="IPrototype"/>
public sealed class IdDataFieldAttribute : DataFieldAttribute
{
public const string Name = "id";
public IdDataFieldAttribute(int priority = 1, Type? customTypeSerializer = null) :
base(Name, false, priority, true, false, customTypeSerializer)
{
}
}
/// <summary>
/// Marks a field as the parent/parents field for this prototype, as required by
/// <see cref="IInheritingPrototype"/>. This must either be a <c>string?</c>, or <c>string[]?</c>.
/// <br/>
/// This field is never required.
/// </summary>
/// <seealso cref="IInheritingPrototype"/>
public sealed class ParentDataFieldAttribute : DataFieldAttribute
{
public const string Name = "parent";
public ParentDataFieldAttribute(Type prototypeIdSerializer, int priority = 1) :
base(Name, false, priority, false, false, prototypeIdSerializer)
{
}
}
/// <summary>
/// Marks a field as the abstract field for this prototype, as required by
/// <see cref="IInheritingPrototype"/>. This must be a <c>bool</c>.
/// <br/>
/// This field is never required.
/// </summary>
/// <seealso cref="IInheritingPrototype"/>
public sealed class AbstractDataFieldAttribute : DataFieldAttribute
{
public const string Name = "abstract";
public AbstractDataFieldAttribute(int priority = 1) :
base(Name, false, priority, false, false, null)
{
}
}
}