/*
Yarn Spinner is licensed to you under the terms found in the file LICENSE.md.
*/
using System;
using System.Collections;
using UnityEngine;
#nullable enable
namespace Yarn.Unity
{
#region Class/Interface
///
/// An attribute that marks a method on an object as a command.
///
///
///
/// When a receives a ,
/// and no command handler has been installed for the command, it splits it
/// by spaces, and then checks to see if the second word, if any, is the
/// name of an object.
///
///
/// By default, it checks for any s in the scene. If
/// one is found, it is checked to see if any of the s attached to the class has a whose matches the first word of the command.
///
/// If the method is static, it will not try to use an object.
/// If a method is found, its parameters are checked:
///
/// -
/// If the method takes a single [] parameter, the
/// method is called, and will be passed an array containing all words in
/// the command after the first two.
///
/// -
/// If the method takes a number of parameters equal to the number of words
/// in the command after the first two, it will be called with those words
/// as parameters.
///
/// -
/// If a parameter is a , we look up the object
/// using . As per the API, the game
/// object must be active.
///
/// -
/// If a parameter is assignable to , we will locate
/// the component based on the name of the object. As per the API of , the game object must be active.
///
/// -
/// If a parameter is a , the string must be true
/// or false (as defined by the standard converter for to ). However, we also allow for the
/// string to equal the parameter name, case insensitive. This allows us to
/// write commands with more self-documenting parameters, eg for a certain
/// Move(bool wait), you could write <<move wait>>
/// instead of <<move true>>.
///
/// -
/// For any other type, we will attempt to convert using using the
/// culture.
/// This means that you can implement to add new
/// accepted types. (Do be aware that it's a non-CLS compliant interface,
/// according to its docs. Mono for Unity seems to implement it, but you may
/// have trouble if you use any other CLS implementation.)
///
/// - Otherwise, it will not be called, and a warning will be
/// issued.
///
/// This attribute may be attached to a coroutine or to an async
/// method.
///
/// The determines if the method is a coroutine
/// if the method returns , or if the method
/// returns a or a task.
///
///
/// If the method is a coroutine, returns a , or
/// returns a task, the DialogueRunner will pause execution until the the
/// coroutine or task ends.
///
///
public class YarnCommandAttribute : YarnActionAttribute
{
///
public YarnCommandAttribute(string? name = null) => Name = name;
}
#endregion
}