除了本机函数(用native
声明的函数),任何函数都可以拥有状态分类器(State Classifiers).
为预声明函数(用forward
声明的函数)设定状态分类器是没有意义的.
若不为函数设定状态分类器,则不允许声明多个同名函数.
声明函数时,若需要声明多个拥有相同名称,不同作用的函数.可以为这些同名函数设定状态分类器.
状态分类器用于设定当前函数仅在插件的某些特定状态下可用(用state
语句切换插件状态).
一个函数可以被划分给多个不同的状态.但两个同名函数不能被划分给同一个状态.
因此,多个同名函数中,只有一个能匹配插件当前状态.不论如何切换插件状态,总是只有一个函数能被调用.
状态分类器以 <
符号开始,以 >
符号结束. <
符号是状态分类器入口, >
符号是状态分类器出口.
< >
中间允许不填写任何内容.也允许填写(定义)一个自动机名称或多个不同状态名称.
若有多个状态名称,每个状态名称之间必须用 ,
符号隔开.
插件可以拥有多个自动机,在状态分类器中 <
符号的右边可以填写1个自动机名称,以 :
符号结尾.
表示将自动机名称右边的所有状态划分给这个自动机.
若不填写自动机名称,则所有状态被划分给匿名自动机(默认自动机).
不同自动机可以拥有相同名称的状态.
自动机名称与状态名称都属于自定义符号(或自定义标识符),命名时必须遵守符号命名规则.
状态分类器是为state
语句服务的.切换插件状态,执行不同函数的相关内容,请参阅state
语句的相关教程.
状态分类器有以下数种语法格式:
// 当前函数仅在其它同名函数都无法被调用时能被调用
<>
/* 当前函数仅在插件进入State1状态后能被调用,
* 若这个状态不存在,则创建. */
<State1>
/* 当前函数仅在插件进入State2或State3或State4状态后能被调用,
* 若这些状态不存在,则创建. */
<State2, State3, State4>
/* 当前函数仅在插件进入Automaton1:State1状态后能被调用,
* 若这个自动机和状态不存在,则创建. */
<Automaton1:State1>
/* 当前函数仅在插件进入Automaton1:State2或Automaton1:State3状态后能被调用,
* 若这些自动机和状态不存在,则创建. */
<Automaton1:State2, State3>
以下是声明函数时,设定状态分类器的实例(尖括号部分的代码):
Function1() <> return 0;
Function1() <Prologue> return 5;
public Function1() <Beginning> return 10;
static Function1() <Development> return 20;
stock Function1() <Climax> return 30;
static stock Function1() <Ending> return 40;
@Function2() <> return 1;
@Function2() <Beginning, Development> return 2;
@Function2() <OtherState> return 3;
static Function3() <> { return -1; }
static Function3()
<StoryPlot:Prologue, Beginning>
{
return -2;
}
static Function3()
<StoryPlot:Development, Climax, Ending>
{
return -3;
}