具体实施方式
图1示出了三种类型的玩具玩偶;10是打网球玩偶、20是芭蕾玩偶、30是正在遛狗的一般玩偶、以及40是坦克形式的玩具。一般地,玩具适用于看起来是有生命的以及看起来是具体的人,或在坦克情况下受控的人等等。所示的四个玩具是主题玩具的类型的示例。玩具适用于与主题内的其它这样的玩具无线地进行通信。
下面的描述涉及玩具(比如玩具玩偶),该玩具能够与其它这样的玩具进行通信;该玩偶适用于协调玩偶之间的语音。在另一实施例中,该玩具是坦克或其他这样的车辆;同样,坦克适用于与其它这样的坦克无线地进行通信以协调坦克的行为而非玩偶之间的语音。
图2示出了玩偶的示意图,具有允许玩偶进行通信并且执行其他这样的任务所需的硬件组件。如图2所示,玩偶100包括处理器102,该处理器102包括无线模块104。处理器与存储器106、ROM 108、以及RAM 110进行通信。将IR/RF发射器/接收器与处理器/无线模块连接并且能够向其它这样玩偶发送或从其它这样玩偶接收信号。玩偶还与扬声器114连接。USB控制器116用于更新存储器106,并且还用于经由充电器电路118向电池120充电。备选的,玩偶适用于使用可更换电池,而非再可充电电池。
存储器106存储与玩偶可以具有的并由处理器在编译语音时访问的会话有关的信息。ROM 108用于存储与玩偶相关的永久性信息,比如玩偶的名字和ID号码。在建立玩偶网络时该信息在初始化过程中使用。RAM 110存储与当前会话有关的信息,并且用于通过存储与例如已经使用的短语有关的信息来产生更逼真的会话。
在存储器106中,每个玩偶100包含:包含玩偶的名字以及在会话期间定义的其他变量在内的数据集合;产生会话的指令集合;以及音频数据的集合。仅在控制器玩偶中存储在会话期间定义的变量。
在一个实施例中,处理器是如在MP3解码中使用的形式,同时具有关联的存储器接口(如SD卡)。本实施例提供大量处理能力(以及基于硬件的压缩技术)并且将因此允许玩偶之间的长时间和详细会话。
控制器玩偶
如图3所示,控制器单元200与多个从属单元202进行通信。控制器包括会话引擎204、语音编译器206、语音数据库208、扬声器(换能器)210、能够对从属单元发送/接收数据的发送器/接收器212。会话引擎包括随机语音选择器214、参数存储存储器216以及说话者选择器218。从属单元具有控制器单元的所有组件,在图3中没有示出从属单元的所有组件。
将第一个上电的单元初始化为控制器单元。当单元上电时,其搜索现有的网络,并且当不存在网络时其创建网络并且等待其他单元加入该网络。当开启其他单元时,它们加入该网络并且被初始化为从属单元。控制器单元等待来自两个新单元的通信,该通信指示了这两个新单元要求网络细节以及会话发起消息。一旦从属单元已经加入了该网络,则它们等待来自控制器单元的指令。应当理解所有单元(玩具/玩偶)是相同的:他们都能够成为控制器单元或从属单元。
单元适用于在如“动物园”、“体育”、“黑帮”或“时尚”等主题内进行通信。主题允许单元在不要求极大的与所有可能会话话题有关的信息数据库的情况下具有详细的会话。可以由用户从网站向单元下载主题/子主题。
下列过程用于发起玩具网络:
●当开启玩偶时其执行检查以确定是否存在可加入的现有网络-使用发送器/接收器212来完成该检查。
●如果不存在可用的网络,则该玩偶变为控制器,并且自动的建立网络-无线模块104适用于在需要的地方创建网络。
●每个开启的后续玩偶发送他们在存储器中存储了的玩偶ID号和主题ID号-经由发送器212来发送该信息。
●控制器检查主题并且仅允许具有与控制器相同主题的玩偶加入-控制器单元对发送的数据与已经在存储器中存储的数据执行比较。
●一旦两个或更多玩偶已经加入该网络,则可能发起会话。
●用户通过按动按钮等发起会话,并且控制器将开始指示其它玩偶说些什么的会话。
●用户可以在任何时刻再次按动按钮以停止会话。
控制器单元运行程序以产生会话,然后向从属单元发送信息以通知他们访问哪个音频文件(音频文件对于每个个性类型是不同的,但是对每个音频文件的引用对于每个单元是相同的)。控制器单元发送单词/短语的标识符以访问从属单元的存储器。从属单元通过发送验证要使用的短语以及该短语所需的预期时间长度的消息来对消息的接收进行肯定应答。从属单元然后使用语音编译器来编译该单词/短语,然后使用扬声器来说出该短语。一旦从属单元已经完成说出该短语,则其向控制器单元发送信号表明其已经完成了并且该会话可以继续。
然后控制器单元以相同方式指示下一个说话者,并且以此类推直到该会话结束。下面提供与会话构建有关的其他细节。
通信协议
玩具使用通信协议来进行通信;消息的格式如下:
[MessageID,SendingToy_ID,ReceivingToy_ID,MessageType,Parameters]
MessageID是标识该消息的唯一号码。从控制器玩具发送的每个消息具有唯一标识号。
SendingToy_ID指示发送消息的玩具。
ReceivingToy_ID指示接收消息的玩具。
MessageType指示消息的类型,例如START、STOP、SAY。
Parameters是与消息类型有关的任意其它所需信息。仅SAY消息具有参数,其标识要说的短语。
因此,消息的范围包括:
[MessageID,SendingToy_ID,ReceivingToy_ID,START]
[MessageID,SendingToy_ID,ReceivingToy_ID,STOP]
[MessageID,SendingToy_ID,ReceivingToy_ID,SAY,PhraseID]
这些消息的中每一个将产生下列形式的肯定应答:
[MessageID,SendingToy_ID,ReceivingToy_ID,Ack,Parameter]
Parameter仅用于对SAY消息进行肯定应答并且其指定短语的持续时间。控制器单元使用短语持续时间参数以在发送下一个消息之前等待适当的时间长度。
假定玩具1与玩具2正在进行通信,则每一个消息的正常事件序列如下:
[MessageID,1,2,START] [MessageID,2,1,ACK]
[MessageID,1,2,SAY,PhraseID][MessageID,2,1,ACK,DURATION]
[MessageID,1,2,STOP] [MessageID,2,1,ACK]
START命令指示接收玩具预期接收其它输入消息。控制器玩偶然后发送包含从属玩具需要使用的短语的phraseID在内的至少一个消息。分别向从属玩具发送每个phraseID,从而可以发送这种类型的多个消息以构建整个句子。STOP命令用于向从属玩具指示在该序列中不存在其它消息。
在接收到消息时,从属玩具向控制器发送对消息的接收进行肯定应答的消息。对于START和STOP肯定应答,控制器立刻继续会话程序;然而对于SAY命令来说,控制器玩偶在等于SAY肯定应答的DURATION的延迟之后才继续。如果没有接收到肯定应答,则重发消息直到接收到肯定应答为止。当该重发发生很多次时,玩偶将重置并且会话将停止;例如,在1,000-2000,2000-5000,5000-10,000次或更多次之间重发送该消息。
在每一个短语的结束处还附加“短语结束标志”以通知从属单元短语何时已经结束。此时,从属单元将向控制器发送指示其已经停止说话的消息。在接收到该消息时,控制器指示下一个单元说话,下一个说话者可以是控制器或另一从属单元。
对于指示语音的备选,当控制器玩具是坦克时,传送至从属单元的指令采用从属单元坦克应当移动的方向的形式。因此,应当用movementID来替代PhraseID。这样,控制器坦克将模拟战争等。玩具坦克配备对网络中其它玩具坦克进行定位的装置,使得他们可以以协同的方式来移动。该装置可以采用玩板的形式,玩板具有可以与玩具进行通信的位置传感器,或其它定位装置,比如摄像机、应答器等等。
会话构建
会话引擎实时地构建会话。备选地,在发起会话之前构建整个会话然后存储在存储器中,并且有效率地运行该会话直到结束。然而,在两种情况中构建的会话将基于特定随机选择。
会话是基于在网络中出现的单元的,因此将出现的单元的数目以及出现的单元的类型用作控制变量。每个会话的开始是固定的,比如当玩具是玩偶时“哇,我们在动物园,现在我们该做些什么?”。但是存在多个开始短语。然后从该时刻开始随机地选择会话。控制器单元选择第一单元说话然后随机地转移至任何开始短语。
该系统能够使用包括下列大量不同类型命令在内的指令集合:
●变量定义和变量设置
●上下文引用和切换
●条件流程控制
●无条件流程控制
●说出(uttering)短语
定义多个语句以控制会话的流程并且,这些语句如下:
SELECT NEXT-选择下一个说话的单元。存在该语句的许多变型,将在下面进一步详细讨论。
SWITCH-切换至下一个单元。
switch speaker-移动说话者指针到另一说话者
switch finish-该语句用于完成会话
SAY-指示单元说什么
SET-该语句用于设置变量,如“SET pet([1,dog])”。SET语句用于设置当前说话者的变量,或其可以用于设置全局变量。
TEST-该语句用于测试是否已经设置变量,或例如是否已经使用了分支。如果TEST为真则设置标志。存在两种形式的TEST语句:
TEST EQ-该语句测试两个表达式是否相等,并且如果他们相等则产生正的标志;例如“TEST EQ &ME.PET &UNDEF”将测试当前说话者的宠物变量是否未定义并且如果是则将产生正标志。
TEST NE-该语句测试两个表达式是否不等,并且如果他们不等则将产生正标志。
BRANCH-该语句用于分支进入该会话的另一部分。例如“BRANCH大猩猩:”将分支进入“动物园”主题的大猩猩部分;其中“大猩猩:”是该主题部分的标签。这是无条件语句并且在程序到达分支语句时将一直使用。
BRANCH_F-基于来自TEST的标志的条件性分支。因此,仅当从TEST语句产生的标志为正时,才使用分支语句。
CHOOSE-该语句使得控制器随机地选择要进行的标签。该语句类似于SET语句,在该语句中可以使用权重来控制进行标签的概率。
CHOOSE_F-基于来自TEST的标志的条件性选择
以剪辑(cropped)的形式来存储音频文件以减少存储要求,即在每个音频片断之前和之后没有静音。为了产生更逼真的语音,提供具有不同长度的许多静音音频文件,可以将它们放在剪辑的音频文件之后或放在每个短语或单词之间。通过SAY语句来与引用任何其它音频文件的方式相同的方式来引用这些音频文件。
可以用SET语句来定义变量以存储与每个玩偶相关联的参数;这一点在下面将进一步详细讨论。存在可以定义的两种类型的变量:
●局部变量-这些变量是与每个玩具/玩偶相关联的变量。在每个玩偶的数据集合中创建局部变量。通过DEFINEVARIABLE_NAME语句来创建玩偶变量。
●全局变量-这些变量是与“主题”相关联并且不与每个玩偶相关联的变量。通过DEFINE G_VARIABLE_NAME语句来创建全局变量。
在主题内定义的变量不具有分配给它们的值,直到在会话期间才赋向它们分配值。
向变量设置值
在会话期间必须向已经定义的变量设置值。这是通过SET语句来完成的。该SET语句有随机特征组成,该随机特征允许利用从如下值集合中随机选取的值来设置:
SET VARIABLE_NAME([w1,value1],[w2,value2],...,[wn,valuen])
该语句的操作基于随机数的输出结果将VARIABLE_NAME的值设置为value1、value2、...、valuen中的一个。选择哪个值的概率是基于权重w1、w2、...、wn的。
例如语句
SET COLOUR([1,red],[1,blue],[1,green])
以相等的概率将变量COLOUR设置为红、蓝或绿。在当前玩偶的上下文中设置玩偶变量。
附加地,SET_F语句用于仅在TEST语句已经产生condition_flag情况时才设置变量。在该情况中当且仅当condition_flag有效时才设置变量。
上下文引用和切换
指针用于存储与说话者有关的信息,并且使得控制器玩偶能够参考其他玩偶。当构建会话时,这些指针用于创建可感觉的会话;下面是所使用的指针:
前一个说话者(PREV)=前一个说话者的ID号
当前说话者(ME)=当前玩具的ID号
下一个说话者(NEXT)=所选下一个说话者的ID号
玩偶的会话引擎的重要特征是哪个玩偶是当前说话者的上下文。该上下文指代当前玩偶可访问的变量。仅前一个、下一个和当前玩偶的变量可用于访问。由如上定义的,三个引用指针来处理上下文的构思。
通过使用SELECT命令和SWITCH命令来实现上下文的控制。存在SELECT命令的多个变型。它们是:
●SELECT NOTME-随机选择所选玩偶组中除了当前玩偶之外的任何玩偶作为下一个说话者。
●SELECT NEXT-随机地选择所选玩偶组中的任何玩偶作为下一个说话者。
●SELECT PREV-选择与前一个说话者相同的玩偶作为下一个说话者。
●SELECT NAME-选择具有NAME名字的玩偶作为下一个说话者。该SELECT命令的变型是用于完全脚本会话的。
然后通过使用SWITCH命令来改变上下文。存在该SWITCH命令的两个变型:
●SWITCH SPEAKER label-其切换说话者的上下文并且将分支进入由标签指定的指令。在切换上下文上,前一个说话者(PREV)变为等于当前说话者(ME),当前说话者(ME)变为等于与下一个说话者(NEXT),并且下一个说话者(NEXT)未定义。
●SWITCH FINISH-其是用于结束会话的命令。
条件性流程控制
在会话期间,流程将依赖于不同变量的值。这可以用下列命令来完成:
●TEST EQ value1 value2-如果value1等于value2其设置condition_flag。
●TEST NE value1 value2-如果value1不等于value2其设置condition_flag。
●通过使用&CONTEXT.VARIABLE_NAME引用可以由value1和/或value2来引用变量。例如如果当前说话者(ME)的名字与前一个说话者(PREV)的名字相同,则指令TEST EQ&ME.NAME&PREV.NAME设置condition_flag。
●BRANCH_F label-如果设置condition_flag,则其分支进入由标签指定的指令,否则使用下一个指令。
●CHOOSE_F([w1,label1],[w2,label2],...,[wn,labeln])-如果设置condition_flag,则其基于随机选择使用权重w1、w2、...、wn来分支进入由label1、label2、...、labeln之一指定的指令,否则使用下一个指令。
每次玩偶要求了解与另一个玩偶有关的变量时,使用TEST语句来询问该变量是否未定义、或者否是是特定值。然后可以将这一点用于流程控制;例如,如果变量PET未定义,则玩偶将询问其他玩偶具有的宠物类型,并且如果设置了该变量,则该玩偶将询问其他玩偶该宠物是什么颜色,等等。
无条件流程控制
有时需要能够无条件地改变指令的流程。在该情况中不使用TEST语句,并且始终执行BRANCH或CHOOSE语句。使用下列语句来完成这一点:
●BRANCH label-其无条件地分支进入由标签指定的指令。
●CHOOSE([w1,label1],[w2,label2],...,[wn,labeln])-其以基于随机选择使用权重w1、w2、...、wn来分支进入由label1、label2、...、labeln之一指定的指令
说出短语
会话引擎的重要部分是说出短语。这是用下列语句来完成的SAY(phrase1,phrase2,...,phrasen)命令。
该命令使作为当前说话者(ME)的玩偶说出短语phrase1、phrase2、...、phrasen。
示例脚本
下面是脚本的简短示例。
DEFINE COLOUR
DEFINE GARMENT
Loop:
SET COLOUR([1,red],[1,blue],[1,green])
SET GARMENT([1,dress],[1,blouse],[1,hat])
SAY(hello my name is,&ME.NAME,and I have a,
&ME.COLOUR,&ME.GARMENT)
SELECT NOTME
SWITCH SPEAKER Loop
该示例可以通过选择三种颜色之一来搭配三种外套之一来为每一个出现的玩偶说出九种不同的事情。
使用多个分支来构建该会话。每个分支是与主题有关的会话的不同区域。例如,在“动物园”主题中,可用的分支是“大猩猩”、“爬行动物”以及“冰激凌”。每个分支具有与其相关联的短语/单词并且根据选择随机地对它们进行选择。玩偶的响应取决于分支、玩偶的个性类型、以及可能响应的加权。
例如,当需要选择来确定要采用的下一个分支时,会话将继续直到两个(或更多)玩偶选择相同位置连续进入为止。由于在选择要采用的分支之前要求一致,这提供了更逼真的会话。
会话在分支内继续,直到到达使得控制器玩偶能够选择另一要采用分支的部分为止。此时进行与要采用的分支有关的另一判定。为了限制会话的长度,仅那些还没有使用的分支可用于选择。
向可以随机选择的每个变量(分支、短语、单词或下一个说话者)附着权重。当随机地选择短语/单词或分支等时,权重改变了选择短语/单词分支等的概率。例如,如果所有短语具有权重1,则它们将都具有相同被选中的概率。可以调整权重以产生更逼真的会话。如“今天我从我的自行车上掉下来”的短语比如“我今天早上吃了早饭”更不可能出现。因此,后一个短语将具有远远大于前一个的权重。因此,仅偶尔地会话引擎使单元说出“今天早上我从我的自行车上掉下来”。
在另一示例中,所使用的权重可以偏向于前一个玩偶并且将因此引起两个玩偶之间的短小会话。
为了限制会话长度,对主题的任何一个分支内的时间量进行控制。例如,这可以用作另一权重参数来减少在一个分支中花费的时间,并且增加在另一分支中花费的时间量。这在没有不确定继续的概率的情况下帮助达到会话结束。
会话的长度可以是随机地;然而,在一些情况中,会话将继续直到已经设置所有的变量为止。例如在宠物主题中,会话将继续直到已经完全地描述了所有玩偶的宠物为止。这可以通过执行检查以确定是否定义了所有变量并且仅当定义了所有变量才允许会话结束来完成。
由于当前说话者仅具有前一个说话者和下一个说话者的上下文,不能始终确定何时已经设置了所有玩偶的变量。因此,在另一示例中,会话将继续直到已经当前上下文中对所有三个玩偶(即当前玩偶、前一个玩偶和下一个玩偶)设置了所有的变量为止。备选地,会话将继续直到对于连续的两个或更多玩偶集合所有变量是已知的。
会话引擎可以处理多个玩偶,并且潜在地处理相同类型的多个玩偶,例如2个Jane玩偶。当初始化网络时,每个加入网络的玩偶与网络节点相关联。然后系统使用关联的网络节点而不是用玩偶的名字来引用玩偶。这使得在不出错的情况下能够引用多个具有相同名字的玩偶。
还可以预确定完整的会话并且将其直接下载至玩偶。例如,可以将SimponsTM的情节下载至一组SimponsTM玩偶中。由于会话是由人产生的,或备选地会话是由会话引擎产生并且由人编辑的,因此预确定的会话使得玩偶能够具有特别逼真的会话。当产生预定会话时使用相同的指令;然而移除随机元素使得每次被激活时的会话是相同的。
上述会话引擎可以独立地用于产生会话。例如,该会话引擎可以用于电视节目(如卡通)的自动脚本书写。
在一个特定实施例中,为了产生主题,将主题写成脚本,然后使用编译器来编译该脚本。执行运行时的错误检查以确保该主题不会产生永远不结束的会话或任何其它错误,然后执行合理性检查以确保会话不是完全无意义的。然后一旦已经记录了音频文件则可以能够将该主题下载至玩具。在下面进一步详细描述的备选实施例中,提供一种创作工具以简化主题脚本的产生。然而,主题内会话的基本原则依然适用。例如,在两个实施例中存在选择说些什么的相同方法。
玩偶选择
如图3所示,会话引擎具有说话者选择器218。说话者选择器选择下一个说话的玩具。存在选择下一个说话的玩具的三种可能性:随机选择网络内的任何玩具;通过名字(ID号)来选择玩具;以及选择当前说话者再次说话。因此,选择下一个说话者的第一过程是随机选择在以上三种可能性中使用哪一种。当通过名字来选择下一个说话者时,必须执行检查以确定该玩具是否在网络中。
如上所述,select语句选择下一个说话的将是谁。当对下一个说话者作出判定时,选项是:用有关语音来响应,选择另一玩偶并且与它们说话,或宣布一些关于当前说话者的事情。
在说话者选择器218内使用SELECT语句来发起对下一个说话者的随机选择。备选地,SELECT语句可以使用逻辑来确定对下一个说话者的引用。例如,如果选择下一个说话的玩偶是Jane,则当前说话者可以提出下列问题“Jane,你最喜欢的宠物是什么?”。将Jane设置为下一个说话者并且从而答复将来自Jane。如在下面的示例中看到的,&语句可以用于引用下一个说话者,或不知道特定参数的任何其它一般参数。例如,&NEXT.NAME引用下一个说话者变量NAME,并且可以用于说出下一个说话者的名字。
其它选项是可用的,如不能有玩偶连续说两次,所以例如如果Jane宣布她有宠物狗,则之后将不再直接选择Jane说话。
创作工具可以使用类似的方法来选择下一个说话的玩偶,将在下面进一步详细描述这一点。
参数存储
参数存储存储器216存储与当前会话有关的信息。该存储的信息包括:已经使用的短语;已经使用的变量;流程控制变量;以及如网络中的玩偶等其它此类信息。仅在控制器玩偶中存储该信息。从属单元仅接收与下一个要说的内容有关的信息。
存储已经在会话中使用过的变量,使得可以稍后在会话中引用它们。变量是描述玩偶的信息,并且用于区分角色。例如,根据短语“我的狗叫做Fluffy”存储的信息将是狗和fluffy。该变量可以用于设置玩偶具有的宠物的类型。可以设置该变量使得玩偶仅可以具有特定变量子集合。例如,女孩玩偶不能具有蛇作为宠物。
流程控制变量用于存储与已经使用的分支有关的信息。例如,当在动物园时分支可以去看大猩猩。将存储该信息使得会话不会返回动物园。
备选地,存储已经使用的短语使得会话不会永远继续下去。可以对单一会话中可以使用的特定单词/短语的次数设置限制;该限制可以是1、2、3或更多。这确保了会话不会变的过于重复。
还存在可以在参数存储存储器中设置和存储的全局变量。全局变量的示例应当是影响网络内所有玩偶的任何事物,例如“外面在下雨”,或在会话中玩偶已经处于的位置。可以独立于玩偶的上下文来访问全局变量,并且可以在主题中的任何地方来使用该全局变量。
还可以使用创作工具来定义参数以存储与主题/玩偶有关的属性,将在下面进一步详细描述这一点。简而言之,主题属性/全局变量存储与整个主题相关联的参数并且可以由任何玩偶在任何时刻访问,并且玩偶属性/局部变量存储与每个玩偶相关联的参数并且仅可以由前一个/当前/下一个玩偶来访问。
玩偶特定下载
图4示出了玩偶可以改变或更新其已经在存储器中存储的主题所使用的过程的示意图。玩偶300包含用于标识玩偶的ID号302。玩偶经由USB连接与PC 304连接,并且该PC经由标准连接类型与互联网306连接。互联网向PC提供到网站308的连接,网站308包含可下载主题310。主题包含不可由用户选择的子主题312(由于它们取决于所连接的玩偶)。例如,不会向使用玩偶的ID号标识的Jack玩偶呈现Jill子主题。主题对于所有个性类型来说都是一般的。除了主题的表达是不同的并且取决于玩偶的个性类型以外,子主题与主主题是相同的。因此音频文件对于每个子主题来说是不同的-不同的声音、不同的用词(相同的意思)、等等。
备选地,下载到玩偶中的第一个性可以用于将后续下载的个性限制为与第一类型相同。例如,如果将玩偶设置为Jack,当连接该玩偶时网站将识别出Jack子主题,并且仅向用户呈现Jack子主题。网站通过访问玩偶的名字变量(即,Jack)并且将其与子主题的名称的列表进行比较来识别子主题。
下载的子主题包括用于所选主题的脚本(比如“动物园”)、关联的个性类型、使得玩偶能够发出会话声音的相应的音频文件、以及用于确保网络内的所有玩偶具有相同主题的主题ID。
PC 304适用于在玩偶300和网站310之间连接,以使得可以以有效率的方式来下载主题。此外,仅在玩偶上存储主题并且因此必须将每个要求该主题的玩偶与网站连接。因此,如果一个用户具有两个玩偶并且针对每个玩偶要求相同的主题,则用户必须将网站与每个玩偶连接,并且下载正确的子主题。
备选地,玩偶可以在任一时间存储多个主题。玩偶一次使用一个主题来进行通信;然而,主题可以由控制器在任意时刻进行改变。因此,玩偶可以使用“体育”主题,然后使用“动物园”主题继续。这使得会话能够持续更长时间并且还组合以扩展玩偶的可用性。
玩偶都具有缺省主题,使得当它们不具有与其它玩偶相同主题时可以简短地进行通信。缺省主题包含几个基本短语,并且可以指导用户连接至网站以下载主题。
为了确保主题是安全的,可以在下载至玩偶之前使用玩偶的唯一ID号对数据进行加密。然后每个玩偶的唯一ID号可以用于对主题内的数据进行解密。这可以用于确保每个玩偶与网站连接以下载主题。例如,即使每个Jane玩偶将使用相同的子主题,对于每个特定玩偶来说对数据进行不同编码,并且因此该数据对于除了特定玩偶之外的玩偶是无用的。
个性的表达和脚本主题
如前所述,每个不同的主题具有能够表达不同个性的各种子主题。每个主题的脚本是不同的并且用于根据该主题产生会话。然而,每个主题中的每个子主题具有产生会话的相同的脚本,但是子主题中使用的语音是不同的。这使得多个个性能够可用于相同的主题。
为了增加会话的可变性,存在可用于问相同问题的多个随机选择。所以例如存在多种方式来问简单的问题,并且这可以依赖于主题/子主题,例如:“我们接下来做些什么?”;“我们现在将做些什么”;或“接下来呢?”。每个子主题可以具有用于表示着相同事情的不同表达。例如,一个子主题可以说“喂,你好吗?”,并且另一个说“嗨,最近怎么样?”。短语的意思基本相同但是表达不同,从而个性是不同。这样,每个主题可以具有任何数目的子主题以创建多彩和有趣的会话。这样,增强了用户体验,并且允许更有变化的游戏玩法,而无需大量存储器。
可以将个性特点归于一个以及相同的主题。因此可能存在相同主题的Jack版本和Jill版本。Jack版本是子主题,并且Jill版本是子主题。
将玩偶的名字(即Jane)与个性类型链接,使得由Jane玩偶表达的个性对于每个主题是相同的;仅仅是主题的内容将改变。这使得玩偶保持一致并且允许玩偶在不同情形中以类似的方式作出反应。
备选地,在由网站首先对玩偶进行初始化时,玩偶的用户可以选择玩偶的名字以及玩偶的个性。这使得用户能够更加与玩偶有关。然后在玩偶内的存储器中存储玩偶的名称和个性、与ID相关联的每个属性,以及在例如下载其他子主题时使用。
可下载主题是表达和脚本的组合并且指示了会话的类型。
还可以裁剪(tailor)玩偶的美感和词汇,使得对于目标听众来说是适合年龄的。不同的主题可以具有适合年龄的等级。这实现了例如针对青少年市场的嘻哈主题的玩偶。
此外,可以提供仅允许由离散的玩偶集合(可能是单一玩偶)使用的短语。当选择该短语时,执行检查以确保其可以由当前玩偶来使用。如果该短语不能由该玩偶使用,则选择另一短语。
类似地,指令的部分可以进行限于离散的玩偶集合,以将其他随机性引入会话中。
备选地,玩具可以是坦克形式或其它这样的玩具。在该情况中,玩具个性的表达是与语音相对的移动形式。例如,一个玩具坦克可以具有“防御”个性并且另一玩具坦克可以具有“进攻”个性。
创作工具
创作工具是可以用于为多个玩偶创建会话主题的应用。由于会话可能遵循的潜在分支的数目很大,需要大量的时间来创建如上所述的会话。因此,为了让该过程更有效率,提供创作工具以协助该过程。尽管在个人计算机等(比如如图10所示的PC 1000或膝上型1002)上运行客户端应用,但在服务器1004上存储数据以允许多个用户对相同的主题进行操作,或用于单一用户对来自不同位置的相同主题进行操作。在服务器上提供web服务以将数据库与客户端应用连接。客户端应用经由互联网306与服务器1004进行通信。客户端应用使用XML将对网络服务的请求,从而对数据库的请求进行格式化,并且使用SOAP协议来传输数据。
创作工具的概要
图11示出了创作工具的概要。提供用户界面1100以允许主题开发者简单并且有效率地输出玩具的主题。使用所提供的用户界面,开发者遵循下列步骤:
1、使用主题产生引擎1102创建主题
2、使用玩具产生引擎1104创建玩具
3、使用上下文输入窗口1106创建每个玩具的多个上下文
4、使用代码产生引擎1108创建指令(“C”代码)
5、使用词典产生引擎1110输出要为每个玩偶记录的短语“词典”
6、使用用于在PC上测试主题的模拟引擎1111来在需要时输出主题作为模拟
这里使用的术语上下文意味着主题数据内的内容子集合,例如对于主题会话中的每个位置,存在确定玩偶说些什么并且哪个玩偶将下一个说话的至少一个上下文。上下文还可以设置主题/玩偶属性。
一旦已经分别使用代码产生引擎以及词典产生引擎1110输出指令和“词典”,使用记录装置记录短语并且使用记录器1112创建和保存音频文件。记录器提示演员产生创建的特定主题所需的每个表达数据。记录器然后向每个音频文件分配与适当表达数据相对应的ID号。在使用中,使用适当的ID号通过玩具的处理器操作的代码来引用音频文件并且使用玩具的扬声器来输出。
将基本指令集合1114(玩具处理器的固件)与主题指令集合(由代码产生引擎1108产生的)进行组合,并且使用编译器将其编译为可由玩具的处理器使用的二进制文件,以根据该主题操作玩具。在先前实施例中,基本指令集合/固件位于玩具处理器的存储器中,并且每次改变或更新主题时仅向玩偶下载主题指令集合以及音频文件。
一旦编译了指令,使用组合器引擎1120将它们与音频文件绑定在一起,使得可以将它们下载至每个玩偶(每个玩偶具有单独下载,包括相同的主题指令,但是具有个性化的音频文件)。
创作工具对存储了主题的服务器1004和数据库1122进行访问。可以根据主题开发者是否已经将主题完成,来以不同格式存储主题。存储非完成的主题,使得创作工具可以容易地访问信息;这是以包含对主题名称、玩具名字、上下文等的引用在内的数据库的形式。一旦主题开发者完成该主题,非完成格式以外,还将主题存储为如上所述的指令集合。这使得能够对完成的主题进行修改,并且基于先前完成的主题来创建新的主题。提供网站1124使得玩具的用户能够向他/她的玩具/玩偶1126下载主题数据。
创作工具具有包括上述那些在内的若干功能:
1)其可以用于使用主题产生引擎1102来创建和编辑用于多个玩偶的主题会话。
2)其可以用于使用模拟引擎1111来模拟会话过程,产生获得的主题会话的文本输出。
3)其可以用于使用词典产生引擎1110来组装要为每个玩偶记录的所有短语的列表。
4)其可以用于使用代码产生引擎1108来产生“C”代码输出(指令集合),可以用修改的处理器固件对该“C”代码输出进行编译以及链接以产生可供下载的每个玩偶的二进制数据文件。
输入会话数据
图12a至15示出了创作工具应用用户界面。界面的每个窗口具有多个导航键,以与输入窗口连接或进行至下一个界面窗口。用户界面使用处理器1150以及关联的存储器1152来向主题开发者显示用户界面的各个方面,并且使用接收器1153来接收用户输入的内容。处理器1150和存储器1152位于PC 1000或膝上型1002之内。这里使用的术语内容意味着脚本数据、表达数据、主题数据、玩偶数据以及可以由用户输入到创作工具中的任何其它数据。
图12a是第一界面窗口,并且具有下列选项:
添加主题,1100:其用于创建新的主题并且一般是使用的第一选项。其如图12b和12c所示打开主题表单,该主题表单要求下列输入:
名称:主题的名称。这是spoken text string的占位符
玩偶的数目:该主题中支持的玩偶总数
描述:该主题的描述
主题属性:该主题的全局属性,如位置
玩偶属性:玩偶的局部属性,如情绪
这些输入等于如上述所述构建会话所需的输入。如参照创作工具实施例描述的,如上所述,主题和玩偶属性分别等于全局和局部变量。然而,创作工具向主题开发者提供结构化的输入窗口以使得更有效率地输入信息。
更详细地,主题属性包含名称和可选的值。该值可以是用于spoken_text_string的占位符。如下所述,在已经完成主题之后创建spoker_text_string。spoken_text_string是可以在会话期间访问的声音文件。例如,如果主题位于动物园中,可能的主题属性将是位置=“动物园”,并且可以由玩偶来使用;例如说“嗨,我觉得动物园真有趣”,其中使用主题属性“位置”来访问单词“动物园”。
由于特定主题中的每个玩偶要求属性的值,在界面窗口中创建玩偶属性。例如,如果属性设置是“情绪”,则将对每个玩偶赋予该属性的值,比如“高兴”、“悲伤”、“愤怒”等。在会话期间,会话引擎可以访问任何玩偶属性(局部变量),并且在会话中使用该玩偶属性。
编辑,1202:其用于编辑现有的主题。例如,选择主题Alon#1,1206,并且按动编辑将允许用户编辑Alon#1主题的细节。
移除,1204:其用于删除所选的主题。
图12a示出了在已经创建了三个主题1208、1208以及1210之后的窗口。可以看到每个主题示出了该主题细节的概要,包括主题的简要描述、主题中涉及的玩偶的数目、以及主题的ID号。在服务器1004的数据库1122中存储输入该主题表单的信息用于稍后当产生输出指令时获取。
一旦已经创建了主题,用户移动至下一个窗口以在主题内创建玩偶。图13a示出了玩偶产生窗口,并且当用户按动“添加玩偶”按钮1300时,显示图13b所示的窗口。该窗口允许创建指定的玩偶并且给出简要描述。
使用图13a和b所示的窗口可以创建所需的许多玩偶。然而,由先前确定的针对该特定主题的玩偶的最大数目来限制可以创建的玩偶的数目。使用这些相同窗口,还可能编辑现有的玩偶。这样创建的每个玩偶将使得产生子主题。如上所述子主题是每个特定玩偶的主题。例如,对于每个玩具来说用于记录语音的声音是不同的,并且上下文数据将不同。同样,在服务器1004的数据库1122中存储输入到玩偶中的信息,用于稍后在产生输出指令时获取。
图14示出了上下文定义窗口,在该窗口中针对主题中每个玩偶输入不同上下文。如图14所示,在位置100存在两个定义的上下文,1400和1402,一个用于玩偶#1并且一个用于玩偶#2。因此,当在会话中访问位置100时,由如上所述的方法来选择玩偶,并且访问相应的上下文。每一个上下文保持与玩偶应当说些什么以及哪个玩偶应该下一个说话有关的信息。这通过向主题开发者提供创建会话的结构来简化了如上所述的会话构建的过程。不再要求主题开发者对主题本身进行编码,而是创作工具根据主题开发者的输入来产生所需的代码。
图15示出了针对主题内每个位置的上下文产生窗口。在图15所示的示例中,这是针对位置100和玩偶#1的上下文。每一个上下文要求下列信息:
●位置,1500-标记位置的文本串,当在图14所示的上下文定义窗口中创建新的上下文时由创作工具自动创建该位置。这对于每个上下文行是方便的标签。其可以是任何文本;然而,缺省的是从100开始顺序地对上下文行进行编号。在创建和编辑会话的同时,文本标签的使用是便于清楚会话。当要求输出“C”代码时,将所有位置标签转换为youme_conversation_struct_t结构(用于该结构和这里描述的其他结构的C代码命名习惯)的阵列的索引,其与上下文位置相对应。
●语句1502-与在随机选择过程中使用的权重一起的、玩偶能够说的语句列表。该语句包含作为spoken_text_strings的短语列表。这是在会话中该上下文点可以由具体玩偶说出的语句的列表。将每个语句用方括号括起来,并且每个语句可以用逗号分隔(例如[语句1],[语句2],[语句3]),或在如图15所示的上下文输入窗口的分开的行上输入。语句包含用于随机选择的权重以及短语的列表。在本情况中,加权以上面参照条件性流程控制描述的加权(比如SET、BRANCH或CHOOSE控制)类似的方式进行操作。每个短语是显式的的spoken_text_strings,或者是对主题属性或玩偶属性的引用,例如语句可以引用主题的位置或玩偶的情绪。在双引号中定义显式spoken_text_strings作为文本(例如“喂,你好吗”)。
引用采用下列形式:
■theme.attribute 用于主题/全局属性
■me.attribute 用于当前说话者玩偶属性
■prev.attribute 用于前一个说话者玩偶属性
■next.attribute 用于下一个说话者玩偶属性
■name.attribute 用于指定的玩偶/局部属性
下面是对语句字段的有效输入的示例:
■空白-意味着在此刻该玩偶没什么可说的。
■[1,“喂,你好吗”]-此刻该玩偶将仅说出定的一个语句“喂,你好吗”指。
■[1,“喂”,prev.name,“你好吗”]-此刻该玩偶将仅说出一个语句:“喂”后面是前一个说话者的名字,之后是“你好吗”。
■[1,“喂”],[1,“嗨”]-具有相等权重的两个语句。如果使用default_say_procedure,则此时该玩偶将有50%的时间说“喂”并且将有另外50%的时间说“嗨”。
■[3,“喂”],[1,“你好”]-具有不相等权重的两个语句。如果使用default_say_procedure,则此时该玩偶将有75%的时间说“喂”并且将有另外25%的时间说“你好”。
●说,1504-用于说出语句的程序。如果为空白则使用default_say_procedure。default_say_procedure使用权重来随机地选择可用语句中的一个。备选地,可以使用下拉列表来选择提供不同行为的任何可用的内置说过程。最终,如果需要定制行为,则可以在此处输入所需说过程的“C”代码。
●转换,1506-用于选择下一个玩偶的过程。其可以是上述的任何过程,包括:NOTME、ANY、ME、PREV、FINISH或玩偶名字之一,或者可以在此处输入的一些“C”代码。如果为空白则使用default_transition_procedure,这是NOTME转换。备选地,存在可用的转换程序下拉列表。该列表包含下列内置转换,并且在创作工具中经由下拉菜单来访问(每一个如上详细描述的):
■NOTME 随机选择除了当前说话者之外的任何玩偶
■ANY 随机选择任何玩偶
■ME 选择当前说话者
■PREV 选择前一个说话者
■玩偶的名字 选择该玩偶
附加地,如果需要定制转换行为,则可以在此处输入所需转换过程的“C”代码。
●下一个,1508-与在随机选择过程中使用的权重一起的、接下来想要去哪里的分支选择的列表。这是用于下一个上下文位置的分支选择的列表。每个分支选择在方括号中括起来并且用逗号分隔。分支选择本身包含与用于随机选择的权重一起的位置标签列表。它们在格式上与以上BRANCH命令相似。以下是对该字段的有效输入的示例(每一个如以上详细描述):
■[(1,label1),(1,label2)]-包含具有相等权重的两个标签选择的一个分支选择。
■[(1,label1),(1,label2)],[(2,label3),(3,label4)]-两个分支选择,第一个分支包含具有相等权重的两个标签选择,第二个分支包含具有权重2和3的两个标签选择。
●分支,1510-用于影响分支的过程,并且格式与以上参照会话构建描述的格式相同。否则可以在此处输入一些“C”代码。该字段用于指定处理分支选择的分支过程。如果为空白,则使用default_branch_procedure。default_branch_procedure使用下一个列表中的第一分支选择,并且使用提供的权重来随机选择标签之一。然后将上下文改变至具有所选标签作为其位置标签的上下文行。备选地,存在可用的内置分支程序的下拉列表。可以在该下拉列表中提供如上所述的分支过程。
●属性,1512-属性、set_flag、以及值和用于随机选择的权重的列表的列表。该字段用于指定用在该上下文点处的值设置的任何属性,即,主题开发者可以将玩偶属性“情绪”设置为高兴。如果为空白,则不设置任何属性。每个要设置的属性在方括号中括起来并且用逗号分隔。在方括号中在set_flag之后指定的属性,set_flag指定了对该属性设置一次还是可以重置该属性,之后是值和用于随机选择的权重的列表。该属性字段等于如上所述的SET命令。以下是对属性字段的有效输入:
■空白 不设置属性
■[me.attribute1,set,(1,“喂”)]如果还没设置,则将一个属性设置为spoken_text_string“喂”的值
■[me.attribute1,reset,(1,“喂”),(1,“嗨”)],[me.attribute2,set,(1,“宠物”),(1,“保罗”)]设置两个属性。即使已经设置了,也将第一属性设置为“喂”或“嗨”。如果还没有设置,则将第二属性设置为“宠物”或“保罗”。
●设置,1514-用于影响属性值设置的过程。如果空白则使用default_set_procedure。default_set_procedure将每个指定的属性设置为考虑到set_flag的值的适当选择。“设置”的set_flag意味着仅当还没有设置属性时可以设置该属性。“重置”的set_flag意味着可以一次又一次地设置该属性。备选的,存在可用的内置设置过程的下拉列表。最终,如果需要一些特殊的定制设置行为,则可以在此处输入所需设置过程的“C”代码。
如上所述,针对每个玩偶重复下列字段、语句、说、转换、下一个、分支、属性以及设置。字段:说、转换、下一个和分支是对于在玩具/玩偶之间交互的方法做出贡献的所有参数,并且全部等于以上参照会话构建描述的命令。
上下文选项重复用于向会话添加上下文行直到完成会话。
当已经完成主题时,包括定义每一个玩偶以及每一个上下文,创作工具提供保存功能。该选项用于保存会话,并且在一个示例中,其创建下列目录:
c:\youme\themes\theme_name
c:\youme\themes\theme_name\doll_name针对每个玩偶
c:\youme\themes\theme_name\doll_name\audio针对每个玩偶
因此,在主目录文件夹“theme_name”中保存单一主题所需的所有文件。为每个玩偶创建子文件夹以使得有效率地管理针对每个玩偶的下载。最终,每个玩偶子文件夹具有存储该玩偶所需的音频文件的文件夹。
该选项还创建下列文件:
c:\youme\themes\theme_name\theme.txt-包含主题数据作为文本文件
c:\youme\themes\theme_name\doll_name\doll.txt-包含玩偶数据作为文本文件
c:\youme\themes\theme_name\doll_name\audio\A00001.wav
c:\youme\themes\theme_name\doll_name\audio\A00002.wav
c:\youme\themes\theme_name\doll_name\audio\A00010.wav
c:\youme\themes\theme_name\doll_name\audio\Annnnn.wav
创建的wav文件是针对每个玩偶在主题中定义的每个spoken_text_strings的占位符。从A00001.wav开始,顺序地向给spoken_text_strings分配文件名A0000n.wav。文件名中使用的n还用作当需要“C”代码的输出时短语的索引。在一个实施例中,记录器1112提示演员扮演所需的spoken_text_string,然后在提示演员扮演下一个spoken_text_string之前用正确的文件名称来自动保存该文件。
另外,创作工具适用于产生与会话相对应的“C”代码。预定义该“C”代码的主要部分(基本指令集合),并且用作玩具/玩偶处理器的操作系统。一旦输出与会话相对应的“C”代码(主题指令集合),则将其与预定“C”代码进行组合,参见图11,然后编译以创建适合于操作玩偶中的或PC中的处理器的二进制文件。每次创建新主题时将操作系统/固件并入玩偶中以允许在需要时简单并且有效率地改变玩偶的功能。
可以输出“C”代码的两个变型:
1、用于windows的“C”代码-可以将该“C”代码保存为:
c:\youme\themes\theme_name\theme_simulation.c;以及
c:\youme\themes\theme_name\theme_simulation.h
可以随后对该代码进行编译并且与基于windows的会话模拟引擎链接。可以将获得应用保存为c:\youme\themes\theme_name\simulation.exe。模拟器允许用户指定应当将哪个玩偶认为是存在且活动的。然后模拟器模拟好像在真实玩偶中发生的会话的实例。模拟器随机选择活动的玩偶之一成为当前说话者并且针对该玩偶处理第一上下文行。然后其依次执行每一个新的行,输出哪个玩偶正在说话并且他们正在说什么。模拟器继续直到会话结束。
2、用于处理器的“C”代码-可以随后对该代码进行编译且与修改的播放器链接以产生每个玩偶的二进制数据文件。可以针对每个玩偶将这些“C”代码文件保存为:
c:\youme\themes\theme_name\doll_name\youme_chat.c;以及
c:\youme\themes\theme_name\doll_name\youme_chat.h
可以将获得的二进制数据文件保存为:
c:\youme\themes\theme_name\doll_name\player.sb
二进制数据文件包含在每个玩偶上运行会话所需的整个信息集合。该二进制数据文件包括针对处理器的固件,并且可以将附加特征并入玩偶的功能中,而无需更新固件的附加处理。
为了将正确的短语记录为用于玩偶的wav文件,如图11所示,使用词典产生引擎1110来创建并且输出每个玩偶的所有不同短语(spoken_text_strings)的列表;这是每个玩偶所需的短语的词典。该词典产生引擎1110与服务器1004内的数据库1122进行通信,并且基于在数据库内的主题上存储的信息来编译该列表。该词典是表达/语句和分配给该表达/语句的ID号之间的有效率的查找表。
在每个上下文行的语句字段和属性字段中定义每个玩偶使用的短语。这些短语可以是显式定义的spoken_text_strings或可以是对定制属性的引用。只要定义显式的spoken_text_string,从A00001.wav开始向该显式的spoken_text_string顺序地分配诸如A00xxx.wav的文件名。编号xxx还是短语索引。可以在下列文件中保存spoken_text_string的列表:
c:\youme\themes\theme_name\phrases.txt-其包含在该主题中使用的所有短语的列表
c:\youme\themes\theme_name\doll_name\phrases.txt-这些包含每个玩偶使用的所有短语的列表
这些文件将包含下列格式的文本:
A00xxx作为文本的关联短语
这样,将创建大量wav文件的过程简化为:可以顺序地记录短语列表、用适当的文件名来保存、以及准备用于玩偶的下载或在PC用于虚拟玩偶的情况下准备用于PC的下载。
如图12a所示,通过按钮1212“产生文件”来激活产生文件的过程。用户选择已经完成的适当主题并且按动按钮1212。然后这将产生如上所述的文件。然后将整个文件包上载至玩偶;该文件包包括主题的二进制文件和随附的操作系统、针对语音的声音(wav)文件、以及处理器操作码(固件)。
如上所述,youme_conversation_struct_t会话结构的阵列是会话的主控制数据。扼要地,当在控制器玩偶中操作会话时,会话引擎以针对第一玩偶的该阵列的索引1所指示的内容开始。然后其执行下列动作:
1、调用当前上下文的转换程序以判定下一个玩偶。
2、调用当前上下文的设置过程以设置上下文中指定的任何属性的值。
3、调用当前上下文的说过程以根据上下文中指定的数据来选择说出哪个语句。如果当前玩偶不是控制器玩偶,这将引起至远程玩偶的无线通信。在两种情况中,在继续进行之前引擎等待直到完成音频输出。
4、调用上下文的分支过程以选择会话阵列中要使用的下一个索引。
5、将前一个玩偶指针(prev)设置为等于当前玩偶指针(me)。
6、将当前玩偶指针(me)设置为等于下一个玩偶指针(next)。已经在步骤1中设置了下一个玩偶指针。
7、然后在步骤1以新的索引和新的玩偶再一次开始,并且继续该过程直到命中步骤4的分支之一中的FINISH分支。
USB通信保护器
在另一实施例中,提供一种USB通信保护器,使得PC能够与这里所述的玩具无线地进行交互。图16示出了附着至PC 304并且与玩偶100进行无线通信的USB通信保护器1600的图示。该保护器包含无线模块104、IR/RF发射器/接收器212、以及接口1602。除了接口1602之外,这些组件与如上所述的玩偶100中包含的组件是相同的。然而,使用PC 304作为处理器1604,而不是具有玩偶100所有的独立处理器的保护器,从而PC有效率地变为能够与物理玩偶100进行通信的虚拟玩偶。该虚拟玩偶配备在PC监视器上示出的动画化身,其可以与真实玩偶在外观上相似,并且从而化身的动画与玩偶的语音同步。为了运行该会话,PC在存储器1606中存储有仿真程序,用于仿真玩具的处理器。备选地,如上所述,创作工具输出针对基于PC的虚拟玩偶的特定代码。在两种情况中,主题会话数据用于使用在PC上运行的应用来运行会话,该应用用于仿真玩具/玩偶的固件。经由PC扬声器来输出玩具/玩偶的语音。
接口1602是USB连接,并且提供将无线通信保护器1600与PC 304连接的有效率的方法。保护器使用的无线通信协议与在这里所述的玩偶之间所使用的通信协议是相同的,即IEEE 802.15.4。
当用户连接至网站时,他/她能够使用USB通信保护器来便于在物理玩偶与网站内动画的虚拟玩偶之间的会话。这样,单一用户可以在不需要多个物理玩偶的情况下使用玩偶的会话引擎的功能。另外,虚拟玩偶可以参与与多个物理玩偶的会话。例如如果两个用户分别具有带有USB通信保护器的膝上型计算机,则虚拟玩偶还可以与其它虚拟玩偶互动。
游戏玩法
在另一实施例中,玩具还适用于与儿童玩游戏。例如,玩具可以玩棋盘游戏(board games),如Snakes和Ladders、Mousetrap、Ludo、或使用骰子玩的任何其它基于机会的游戏。
该玩具配备用于模拟骰子的随机数发生器。此外,该玩具适用于对通过棋子(playing piece)沿着棋盘前进的间隔数目进行计数。玩具向儿童发出可听的信号来使棋子移动所需数目的间隔。一旦儿童移动了棋子,儿童通过按动按钮等向玩具指示轮到下一个玩具/儿童。备选地,棋盘也可以是交互式的,并且包含传感器等以接收来自游戏棋盘的、与计数器的位置有关的信息。这样持续玩直到出现胜利者。
图5提供了还包括游戏引擎400在内的控制器玩具200的示意图。其余组件与图2和3中描述的组件相同。游戏引擎400包括棋盘存储器402、随机数发生器404、位置RAM 406以及肯定应答接收器408。
棋盘存储器402存储与棋盘游戏(Snakes和Ladders或Ludo)的布局有关的信息。随机数发生器用于模拟骰子,并且适用于产生数字1、2、3、4、5和6(或适合于游戏的任何其它数字集合)。位置RAM用于存储与每个玩家的棋盘上的位置有关的信息,在本情况中,玩家是控制器和三个从属。该信息与棋盘存储器以及虚拟骰子的掷出结合使用,以对棋子要移动的位置的正确数目进行计数,并且了解棋子已经移动到的方格是否具有任何特殊关联性,比如是否为ladder的底部或snake的顶部。
会话引擎204使用从游戏引擎获得的信息来对间隔数目进行计数,例如如果原始位置是方格13,并且虚拟骰子掷出4,则玩偶将通过扬声器210发出“我已经掷出4,14,15,16,17”的声音。在本示例中,如果方格17是蛇的顶部,则玩偶将继续发出“哦不,我已经将蛇滑到方格6!”的声音。计数机制对文本循环适当的次数,然后在位置RAM 406内记住最终位置。所以例如当虚拟骰子掷出4时,访问数字列表4次以产生最终结果。
附加地,玩偶具有接收来自由儿童激活的外部随机数发生器的的信息的能力。这样,儿童可以与玩偶玩,并且玩偶可以跟踪所有玩家(包括该儿童)的棋子以确定何时出现胜利者。
图6示出了玩游戏的过程的流程图。由用户发起游戏(步骤500),并且控制器玩偶将执行检查(步骤502)以确定玩家的数目。控制器玩偶然后将使用随机数发生器等来判定第一玩家(步骤504)。控制器玩偶然后将针对第一玩家掷虚拟骰子(步骤506),或如果儿童是第一玩家则控制器玩偶要求儿童掷出他们的骰子。控制器玩偶然后指示玩家在棋盘上将计数器/棋子移动相应数目的方格(步骤508),然后等待儿童已经移动了计数器的肯定应答(步骤510)。在步骤512,在向儿童提示已经移动了计数器的肯定应答之前,控制器玩偶等待预定秒数,如2、3、5或8秒。一旦控制器玩偶接收肯定应答,则执行检查以确定该玩家是否已经赢得该游戏(步骤514)。如果该玩家还没有赢得游戏,则游戏继续至下一个玩家(步骤516),并且过程从步骤506继续进行直到玩家获胜(步骤518)。
该游戏引擎适用于以上述方式来玩任何基于规则的游戏。
备选地,该系统可以实现常规编程语言(如C)以运行更复杂的算法来玩更复杂的游戏(如国际象棋)。将使用上述相同语言来产生会话,并且将可以根据C程序来引用该语言。
这样的玩具和玩偶向儿童们提供不同交互时机,并且增强他们游戏。
主题示例
附录I中提供了玩偶之间的主题会话的四个示例。这些示例提供了构建会话的不同方法。存在两个随机产生会话的示例(动物园和宠物主题),一个完全脚本会话的示例(Mr X主题)以及一个玩游戏主题的示例(Snakes和Ladders主题)。
将单元的处理器102与其它模块(如语音编译器206、语音数据库208以及参数存储器216)结合使用来解释主题内的脚本。例如当定义变量时,在参数存储器中分配存储。每一次发起会话时,在参数存储器中分配变量。这使得能够改变主题(即,从动物园到宠物),并且为新的变量分配了恰当的存储资源,而不会于来自前一个会话的变量的冲突。此外,还在参数存储器中为参数(比如PREV、NEXT和ME)分配存储。这使得SELECT语句能够引用脚本内的参数。
当使用SAY语句时,控制器玩偶使用上述通信协议以使用无线模块和发射器向有关玩偶发送命令,或如果控制器玩偶是当前说话者时,使用控制器玩偶的相关模块。使用要求说话的玩偶中的语音编译器206来访问语音数据库208中的适当音频文件。例如,动物园主题内的具有SAY语句的第一行是“SAY(I think we’ve seen everything now,p03,letsgo home)”。该语句包含对语音数据库内音频文件的三个引用。那些引用是“I think we’ve seen everything now”、“p03”以及“lets go home”。它们都引用音频文件但是“p03”引用指代了特定长度的暂停。该暂停是用于将音频文件适当分隔开的空白音频文件。语音编译器206然后使用扬声器210来播放该音频文件。
附录I内的示例主题提供使用以上定义的语句的其它示例。在每一个情况中,处理器对代码进行解释并且使用适当的模块来执行语句。
在备选实施例中,如上所述处理器不使用内置解释器,而是每个主题包含二进制数据文件,该文件包括使得处理器能够正常工作的所有处理器控制指令。这有效率地在需要时能够利用新特征对处理器的固件进行更新。可以使用创作工具来产生下面提供的主题示例。然而,控制玩具/玩偶的指令将是编译的“C”代码的二进制文件。
处理器和关联电子元件
图8示出了图2和3中所示的示意图的潜在生产版本的电路图和部件列表的示意-附录II详述了图8中的组件。图9示出了备选电路图的示意图-附录III详述了图9的组件。存在在生产电路中包括的备选方案,并稍后讨论。
电路包括:
●Jennic无线控制器
生产电路使用Jennic IC,包含RF电路,并且将固件和数据组合在单一大型闪速存储器IC中。Jennic无线控制器可以例如使用Zigbee无线通信协议来在玩偶之间进行通信。
●电池充电器
生产电路使用特殊设计的部件来从USB端口充电并且在充电的同时也向电路供电
●音频放大器
生产电路上的音频放大器是D类音频放大器。这是非常有效率的(~80%)。
技术选项
本节讨论图8中的生产电路中还没有包括的可能备选方案。
●USB接口
FTDI FT245RQ
选择该组件主要由于其为包括USB驱动软件的现成IC,减少了开发工作。其主要缺点是使用了Jennic上的大部分DIOx线路。尽管这对于当前设计来说不是问题,如果其他选项(例如语音压缩IC)需要DIOx线路,则该部件将不是适合的。
备选实施例
下面的两个备选方案都是具有内置USB和SPI从属接口的8比特微控制器IC。尽管两个制造商都提供了参考设计、应用注意事项等等以协助开发,但这些微控制器都需要使其工作而开发的固件和软件。这些部件的优点在于它们可以与Jennic SPI接口连接,并且仅需要1个DIOx线路,将其他的DIOx线路释放以作它用。
玩具不具有复杂的USB要求;唯一的要求是下载可编程到闪速存储器中的数据。该设备不需要遵循任何一般的设备功能,例如记忆棒。这减少了所需的开发工作。
选择下面标识的部件,这是由于它们的目的是简单、低功耗嵌入式应用并且具有SPI从属接口。然而,来自制造商家族或来自其它制造商的其它设备也可能是同样适合的。
Cypress CY7C63833-LFXC
Atmel AT90USB82-16MU
电池
锂离子(Lithium-Ion)
图8和9所示的电路使用锂离子(Li+)电池。出于以下三个原因选择Li+电池:
i)形状-可具有扁平棱柱(flat prismatic)封装,对于示范项目来说是方便的。
ii)容易开发-Li+充电要求比备选方案要简单,特别是当充电器必须同时向附加电路供电时。
iii)功率容量-示范项目开始时的功率要求的保守估计暗示着仅Li技术将在小的可用空间中的给出充足功率。(参见后面)
备选的可再电技术是NiMH和NiCad。NiMH具有与NiCad相似的充电要求(比Li+要复杂),但是具有与Li+相似(较高)的功率密度(对于给定物理体积来说具有更多功率)和价格。
NiCad/NiMH
在本节中将考虑相比于Li+NiCad/NiMH电池的特性。为了简单起见,对于NiCad请阅读下面节中的NiMH。
i)形状
尽管其它形状是可用的,NiCad电池通常具有标准大小,比如AA和AAA。在可以使用更小组件并且制造更复杂PCB(比如两片和/或柔性电路/连接器)的成本是不可避免的生产环境中,使用标准大小的电池是可能的。
ii)容易开发
必须在电池充电(从USB端口)的同时向电路供电(从USB端口),使得电路可以下载新的数据。(电池不能同时地被充电和向电路供电)。因此在充电期间将电路与电池隔离或让电路保持连接。隔离电池涉及更复杂的电路。让电路保持连接意味着充电器同时监视到至其控制的电池的普通电流以及我们的电路采用的额外电流。
让电路保持对于Li+电池充电器的连接不是关键。主要缺点是,一旦Li+电池完全充满,则正常关闭充电器。必须禁止该功能否则我们的电路也将关闭。结果是电池寿命更短。
让电路保持对NiCad电池充电器的连接是关键的。NiCad电池具有更复杂的充电曲线,特别是在充电快结束时。如果不正确地检测该曲线,电池永远不会完全充满或对电池过充电导致对电池的损害并且过多的温度上升。电池充电器使用两种方法中的一种来检测该曲线。第一种是通过改变电池汲取的电流。不幸地是,本电路汲取的电流将使得充电器混淆,导致潜在的危险环境。第二种方法是通过检测电池温度的改变。然而,电池充电组件在正常使用期间也变热。在本应用中,难以在热上将电池充分隔离以给出可靠的结果。
隔离电池是图8中电路采用的解决方案。电池充电器IC并入了精密的电源管理电路并且提供隔离。该集成电源管理不可用于现有产品中的NiCad技术。所以这将在离散的组件中或在定制的集成IC中实现。
iii)功率容量
在本节给出对玩偶电子元件的功率要求的讨论。在本节中使用的电池寿命是基于下列电池容量:
●AAA碱性=1150mAh1.5V
●AAA NiCad=300mAh1.2V
●AAA NiMH=750mAh1.2V
●Li+棱柱=620mAh3.7V
注意:Li+电池保持与相同级别的其它电池两倍的功率,这是由于其电压是两倍大。两个AAA电池必须串联使用,或这单一AAA与升压转换器一同使用,并且其容量会减半。
对图9所示的电路的功率估计。
估计的电流消耗=当说话时为136mA,其他情况为48mA。这是从下述中得到的:
●Jennic模块=48mA
●音频驱动器:
250mW最大8ohm扬声器功率=175mA,但是在2个玩偶之间的会话中,每一个玩偶说一半的时间=>88mA。
注意:在全部时间以最大功率来驱动扬声器是不可能的,然而,音频放大不是100%效率的,因此88mA是合理的折中。
●电路的其余部分=可忽略
基于示范估计的电池寿命
电池 |
连续会话 |
上电但不说话 |
单AAA碱性 |
41/4小时 |
12小时 |
单AAA NiCad |
66分钟 |
3小时 |
单AAA NiMH |
23/4小时 |
7小时40分钟 |
双AAA碱性 |
81/2小时 |
24小时 |
双AAA NiCad |
21/4小时 |
61/4小时 |
双AAA NiMH |
51/2小时 |
15小时40分钟 |
单棱柱Li+ |
41/2小时 |
13小时 |
单棱柱Li+解决方案是示范的显而易见的选择。
图8所示电路的功率要求
由于音频功率是总功耗中最重要的因素,因此获得更精确的值是重要的。最佳方法是直接测量,但是只在完成音频执行后才可能。
然而,存在多个因素,暗示音频功率将不如估计的大:
●语音特性使得波形的平均功率比其峰值振幅要小很多。例如,语音包含大量的暂停。从电路将可能以小于最大平均功率电平来驱动。
●生产电路中使用的D类放大器比图9中所示的电路中的放大器更有效率,引起显著的功率节省。
对示范会话的更详细地计算和分析暗示了平均音频功率在讲话时将仅为10mA,至于2个玩偶之间的会话来说给出平均5mA。这使得Jennic功率支配给出总共说话时53mA并不说话时48mA。
注意:该音频功率电平仅针对说出的语音,不是音乐。
基于对音频功率的改进估计的电池寿命
电池 |
连续会话 |
上电但不说话 |
单AAA碱性 |
10小时50分钟 |
12小时 |
单AAA NiCad |
23/4小时 |
3小时 |
单AAA NiMH |
7小时 |
7小时40分钟 |
双AAA碱性 |
21小时40分钟 |
24小时 |
双AAA NiCad |
51/2小时 |
61/4小时 |
双AAA NiMH |
13小时50分钟 |
15小时40分钟 |
单棱柱Li+ |
111/2小时 |
13小时 |
存在降低Jennic功耗的方法。当前,Jennic在所有时间都是开启的,连续地收听消息。由于固件中的改变,以及玩偶彼此通信的方式的改变,仅一个玩偶(第一个上电的)需要连续收听。其它玩偶可以在它们需要说话是周期性地检查第一个玩偶,并且仅需要在该短时间内上电。其余时间Jennic可以处于低功率休眠模式。如果可达到10%的占空比,这将不说话时的功耗降低到十分之一。当说话时,需要对Jennic供电,但是不需要收听消息,从可以不对RF级供电。这将Jennic功耗降低到四分之一。从而能够将整体电流消耗减少到说话时14mA以及不说话时4mA。
尽管大多数玩偶将具有该降低功率要求,一个玩偶(第一个打开的)不具有该功率节省。使用激活玩偶的方式的改变,也能够减少功率。需要进一步调查来确定什么是可行的。
基于减少的Jennic功率要求的电池寿命
电池 |
连续会话 |
上电但不说话 |
单AAA碱性 |
41小时 |
1433/4小时 |
单AAA NiCad |
103/4小时 |
371/2小时 |
单AAA NiMH |
263/4小时 |
933/4小时 |
双AAA碱性 |
82小时 |
2871/2小时 |
双AAA NiCad |
211/2小时 |
75小时 |
双AAA NiMH |
541/2小时 |
1871/2小时 |
单棱柱Li+ |
441/2小时 |
155小时 |
如果可以达到这些功率要求,则使用双AAA标准、NiCad或NiMH电池变为可能。
自动断电功能
玩偶电子元件的当前规范是ON-OFF开关控制电路的供电。与其它玩具通过,当该玩偶开启时是不明显的,这是由于其被动地坐等在任意一个激活的玩偶中按动按钮。这意味着很有可能忘记关闭玩偶。结果是下一次(例如第二天)玩玩偶时电池没电。
电路能够将其自身切换至‘待机’模式,汲取非常少的电流,但是这还没有在当前功能规范中包括。当电子元件进入待机模式并且如何将其重激活暗示玩偶的总体行为和表现。
语音压缩
语音压缩允许在相同容量的存储器中存储更多的音频数据。当前设计不包含任何语音压缩技术。当前设计使用产生64k bps(比特每秒)的8比特8kHz音频数据,并且使用64Mbit串行闪速存储器,该存储器能够存储1000秒(17分钟)的音频数据。
语音压缩可以用于将该数据速率降低至2kbps和8kbps之间,压缩越高则音频质量越低。所以对于8kbps来说,4Mbit闪速存储器可以保持大约500秒(81/2分钟)的音频数据。
压缩的音频数据要求在播放时的解压缩。这可以用软件或专用硬件来进行。下面给出几个选项。
Jennic控制器上的软件解压缩
还没有广泛的调查该选项。首先,必须找到合适压缩/解压缩算法的源代码,使得可以将该算法装(port)到Jennic控制器上。其次,必须对算法所需的处理能力和在Jennic控制器上的可用性进行分析。
Sensory Inc语音合成IC
Sensory Inc具有两个微控制器族。SC-6x族具有预编程的SC-691从属合成器。其具有要求9个DIOx线路与Jennic连接的4比特MCU接口,并且可以直接驱动32-欧姆扬声器。较新的RSC-4x族不具有预编程的从属合成器,并且从而要求开发定制的固件。其将用4比特或8比特MCU接口(9或15个DOIx线路)与Jennic连接。然而,该较新的RSC-4x族具有更强大的处理器(其可以处理语音识别算法),并且可以直接驱动8-欧姆扬声器。这两个部件中的任一部件不能与USB FT245芯片一起使用,这是由于Jennic不具有同时用于上述二者的足够的DIOx线路。从属SPI USB芯片将是必须的(参见USB节)。
使用具有显著处理能力的语音合成微控制器(如RSC-4x)暗示可能备选的系统架构。取代运行主要玩偶算法的Jennic无线微控制器,并且使用合成微控制器作为从属协处理器来简单地解压缩音频,合成微控制器可以运行主要玩偶算法并且使用无线微控制器作为从属协处理器以进行无线通信。更多细节请参见无线微控制器节。
无线微控制器
当前设计是基于2.4GHz IEEE 802.15.4个人区域网通信标准的。无线微控制器产品在于包含必须的RF硬件和固件来处理所有低级别RF通信。仅通信中的数据需要由玩偶应用来定义。当前设计已经选择Jennic无线微控制器。
尽管IEEE 802.15.4产品处理低级别RF通信,但是存在与玩偶应用不符合的一个方面。IEEE 802.15.4是基于节点的分级结构,具有与全功能设备通信的很多简化功能的设备。玩偶应用具有对等结构,其中所有设备是相同的。
在相同2.4GHz或不同的ISM频带中工作的其它RF收发器产品是可用的。它们都包含必需的RF硬件,但是没有强加特定低级别协议。这些收发器IC作为对通用微控制器或专用微控制器(如RSC-4x语音合成器)的从属来工作。使用这些部件,可以开发私有的对等通信协议。
RF收发器的示例是TI CC2500和Atmel ATA542x族。这些部件潜在地提供比Jennic IC更低的功耗和更低的单位成本。
当然理解,本发明并不意在不受限于仅作为示例描述的上述实施例的细节,并且可以在本发明的范围中作出对细节的修改。
可以独立地或以任何适当组合的方式来提供在说明书和(在适当的地方)权利要求书以及附图中公开的每个特征。
附录I-主题示例
动物园主题
//VISIT THE ZOO MULTI-WAY CONVERSATIONS
DEFINE THEME
DEFINE G_WHERE_ARE_WE
DEFINE G_BEEN_TO_INSECTS
DEFINE G_BEEN_TO_REPTILES
DEFINE G_BEEN_TO_PRINIATES
DEFINE G_BEEN_TO_SAFARI
DEFINE G_BEEN_TO_ICECREAM
DEFINE MY_CHOICE
DEFINE INSECT
DEFINE REPTILE
DEFINE PRIMATE
DEFINE SAFARI
DEFINE ICECREAM
DEFINE LIKE
DEFINE HATE
DEFINE TEMP
DEFINE PHRASE1
DEFINE PHRASE2
DEFINE PHRASE3
DEFINE PHRASE4
DEFINE SELF_DONE
Start:
SELECT NOTME
BRANCH_F Only_one_doll
TEST EQ &PREV $UNDEF
BRANCH_F Main_loop
TEST EQ &PREV.SELF_DONE $UNDEF
BRANCH_F Main_loop
Get_next_spkr:
SELECT NEXT
TEST EQ &NEXT &PREV
BRANCH_F Get_next_spkr
TEST EQ &NEXT.SELF_DONE $UNDEF
BRANCH_F Main_loop
TEST EQ &ME.SELF_DONE $UNDEF
BRANCH_F Main_loop
CHOOSE([3,Main_loop],[1,Finish])
Finish:
SAY(i think we′ve seen everything now,p03,lets go home)
SWITCH FINISH
Only_one_doll:
SAY(oh dear I′m all alone)
SWITCH FINISH
Normal_switch:
TEST EQ &G_BEEN_TO_INSECTS $UNDEF
BRANCH_F Do_switch
TEST EQ &G_BEEN_TO_REPTILES $UNDEF
BRANCH_F Do_switch
TEST EQ &G_BEEN_TO_PRIMATES $UNDEF
BRANCH_F Do_switch
TEST EQ &G_BEEN_TO_SAFARI $UNDEF
BRANCH_F Do_switch
SET SELF_DONE ([1,done])
Do_switch:
SAY(p50)
SWITCH SPEAKER Start
Main_loop:
TEST EQ &G_BEEN_TO_INSECTS $UNDEF
BRANCH_F Do_main_loop
TEST EQ &G_BEEN_TO_REPTILES $UNDEF
BRANCH_F Do_main_loop
TEST EQ &G_BEEN_TO_PRIMATES $UNDEF
BRANCH_F Do_main_loop
TEST EQ &G_BEEN_TO_SAFARI $UNDEF
BRANCH_F Do_main_loop
SET SELF_DONE([1,done])
Do_main_loop:
TEST EQ &PREV $UNDEF
BRANCH_F First_speaker
SET PHRASE1([1,I′ve had enough of the],[1,I′m bored with the],[1,enough of
the])
SET PHRASE2([1,lets go somewhere else],[1,lets move on],[1,lets get out of
here])
TEST EQ &G_WHERE_ARE_WE insects
CHOOSE_F([15,Insects],[1,Move_on_insects])
TEST EQ &G_WHERE_ARE_WE reptiles
CHOSE_F([15,Reptiles],[1,Move_on_reptiles)]
TEST EQ &G_HERE_ARE_WE primates
CHOOSE_F([15,Primates],(1,Move_on_primates])
TEST EQ &G_WHERE_ARE_WE safari
CHOOSE_F([15,Safari],[1,Move_on_safari])
TEST EQ &G_WHERE_ARE_WE icecream
CHOOSE_F([5,Icecream],(1,Move_on_icecream])
Move_on_insects:
TEST EQ &G_BEEN_TO_INSECTS $UNDEF
BRANCH_F Main_loop
SAY (&ME.PHRASE1,p03,&G_WHERE_ARE_WE,p03,&ME.PHRASE2)
BRANCH My_choice
Move_on_reptiles;
TEST EQ &G_BEEN_TO_REPTILES $UNDEF
BRANCH_F Main_loop
SAY(&ME.PHRASE1,p03,&G_WHERE_ARE_WE,p03,&ME.PHRASE2)
BRANCH My_choice
Move_on_primates;
TEST EQ &G_BEEN_TO_PRIMATS $UNDEF
BRANCH_F Main_loop
SAY(&ME.PHRASE1,p03,&G_WHERE_ARE_WE,p03,&ME.PHRASE2)
BRANCH My_choice
Move_on_safari:
TEST EQ &G_BEEN_TO_SAFARI $UNDEF
BRANCH_F Main_loop
SAY(&ME.PHRASE1,p03,&G_WHERE_ARE_WE,p03,&ME.PHRASE2)
BRANCH My_choice
Move_on_icecream:
TEST EQ &G_BEEN_TO_ICECREAM $UNDEF
BRANCH_F Main_loop
SETPHRASE1([1,icecream is great],[1,umm icecream is yummy],[1,oh boy I really
enjoyed that])
SET PHRSE2([1,lets go somewhere else],[1,lets move on],[1,where shall we go
now])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH My_choice
First_speaker:
SET PHPASE1([1,well here we are at the zoo],[1,now we′ve arrived at the
zoo],[1,hurrah we′re at the zoo])
SET PHRASE2 ([1,Where shall we start],[1,what shall we see first],[1,what
animals will we start with])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p50)
My_choice:
TEST EQ &ME.SELF_DONE $UNDEF
BRANCH_F Do_choice
SELECT NOTME
BRANCH Normal_switch
Do_choice:
CHOOSE
([1,Check_insects],[1,Check_reptiles],[1,Check_primates],[1,Check_safari],[1,Check_ice
cream])
Check_insects:
TEST NE &G_BEEN_TO_INSECTS $UNDEF
BRANCH_F Do_choice
SET MY_CHOICE([1,insects])
BRANCH Made_choice
Check_rsptiles:
TEST NE &G_BEEN_TO_REPTILES $UNDEF
BRANCH_F Do_choice
SET MY_CHOICE([1,reptiles])
BRANCH Made_choice
Check_primates:
TEST NE &G_BEEN_TO_PRIMATES $UNDEF
BRANCH_F Do_choice
SET MY_CHOICE([1,primates])
BRANCH Made_choice
Check_safari:
TEST NE &G_BEEN_TO_SAFARI $UNDEF
BRANCH_F Do_choice
SET MY_CHOICE([1,safari])
BRANCH Made_choice
Check_icecream:
TEST NE &G_BEEN_TO_ICECREAM $UNDEF
BRANCH_F Do_choice
SET MY_CHOICE([1,icecream])
SAY(how about,p03,we get some,p03,&ME.MY_CHOICE)
BRANCH Get_next
Made_choice:
SAY(how about,p03,we see the,p03,&ME.MY_CHOICE)
Get_next:
SELECT NOTME
TEST NE &NEXT.SELF_DONE $UNDEF
BRANCH_F Normal_switch
SAY(p50)
SWITCH SPEAKER Next_choice
Next_choice:
TEST EQ &PREV.MY_CHOICE icecream
CHOOSE_F([1,Select_icecream])
CHOOSE
([1,Check_next_insects],[1,Check_next_reptiles],[1,check_next_primates],[1,Check_next_
safari],[1,Check_next_icecream])
Check_next_insects:
TEST NE &G_BEEN_TO_INSECTS $UNDEF
BRANCH_F Next_choice
SET MY_CHOICE([1,insects])
BRANCH Check_agreement
Check_next_reptiles:
TEST NE &G_BEEN_TO_REPTILES $UNDEF
BRANCH_FNext_choice
SET MY_CHOICE([1,reptiles])
BRANCH Check_agreement
Check_next_primates:
TEST NE &G_BEEN_TO_PRIMATES $UNDEF
BRANCH_F Next_choice
SET MY_CHOICE([1,primates])
BRANCH Check_agreement
Check_next_safari:
TEST NE &G_BEEN_TO_SAFARI $UNDEF
BRANCH_F Next_choice
SET MY_CHOICE([1,safari])
BRANCH Check_agreement
Check_next_icecream:
TEST NE &G_BEEN_TO_ICECREAM $UNDEF
BRANCH_F Next_choice
SET MY_CHOICE([1,icecream])
SAY(how about,p03,we get soma,p03,&ME.MY_CHOICE)
BRANCH Get_next
Select_icecream:
SET MY_CHOICE([1,icecream])
SET PHRASE1([1,great idea],[1,good thinking],[1,totally agree])
SET PHRASE2([1,lets get some],[1,I want],[1,yippee])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.MY_CHOICE)
BRANCH Change_location
Check_agreement:
TEST EQ &ME.MY_CHOICE &PREV.MY_CHOICE
BRANCH_F Agreement
TEST NE &ME.MY_CHOICE &NEXT.MY_CHOICE
BRANCH_F No_agreement
Agreement:
SET PHRASE1([1,great idea],[1,OK],[1,yes])
SET PHRASE2([1,lets go see the],[1,off we go to the])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.MY_CHOICE,p50)
BRANCH Change_location
No_agreement:
SET PHRASE1([1,no lets],[1,I would rather],[1,I′d prefer to),[1,how about we])
SET PHRASE2([1,see the],[1,go to the])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.MY_CHOICE)
BRANCH Get_next
Change_location:
SET G_WHERE_ARE_WE([1,&ME.MY_CHOICE])
SET PHRASE1([1,here we are at the],[1,now we′ve arrived at the],[1,hurrah
we′re at the])
SET PHRASE2([1,-])
TEST EQ &G_WHERE_ARE_WE icecream
SET_F PHRASE2([1,shop])
SAY(&ME.PHRASE1,p03,&G_WHERE_ARE_WE,p03,&ME.PHRASE2)
Change_location_switch:
SELECT NEXT
BRANCH Normal_switch
Icecream:
SET G_BEEN_TO_ICECREAM([1,done])
TEST NE &ME,ICECREAM $UNDEF
BRANCH_F Icecream_get_next
SET ICECREAM([1,chocice],[1,rasberry_ripple],[1,lolly],[1,ninety_nine])
CHOOSE([1,$L_NEXT],[1,Ask_icecream])
SET PHRASE1([1,my favourite is a],[1,I just love a])
SAY(&ME.PHRASE1,p03,&ME.ICECREAM)
Ask_icecream:
SET PHRASE1([1,I′ll have a],[1,can I have a])
SAY(&ME.PHRASE1,p03,&ME.ICECREAM,p03,please)
Icecream_get_next:
SELECT NOTME
BRANCH Normal_switch
Insects:
SET G_BEEN_TO_INSECTS([1,done])
CHOOSE([3,Prev_insect],[3,Self_insect],[3,Next_insect])
Prev_insect:
TEST EQ &ME &PREV
CHOOSE_F([1,Self_insect],[1,Next_insect])
TEST EQ &PREV.INSECT $UNDEF
CHOOSE_F([1,Self_insect],[1,Next_insect])
SELECT PREV
Continue_prev_insect:
SET INSECT([1,&PREV.INSECT])
SET PHRASE1([1,ooh],[1,oh my god],[1,ugh],[1,-])
TEST EQ &PREV.INSECT spiders
CHOOSE_F([1,Spiders_not_insects],[3,Prev_spider_talk])
TEST EQ &PRIV.INSECT scorpions
CHOOSE_F([1,Prev_scorpion_talk])
SET PHRASE1([1,ooh],[1,oh my god],[1,-])
TEST EQ &PREV.INSECT centipedes
CHOOSE_F([1,Prev_centipede_talk])
TEST EQ &PREV.INSECT millipedes
CHOOSE_F([1,Prev_millipede_talk])
TEST EQ &PREV.INSECT beetles
CHOOSE_F([1,Prev_beetle_talk])
TEST EQ &PREV.INSECT ants
CHOOSE_F([1,Prev_ant_talk])
TEST EQ &PREV.INSECT bees
CHOOSE_F([1,Prev_bee_talk])
Spiders_not_insects:
SAY(funny how,p03,&PREV.INSECT,p03,are in the insect house,p03,seeing
as,p03,&PREV.INSECT,p03,aren′t insects)
BRANCH Normal_switch
Prev_spider_talk:
CHOOSE([1,Prev_spider_talk_1],[1,Prev_spider_talk_2])
Prev_spider_talk_1:
SET PHRASE2([1,look at that),[1,can you see that],[1,what a])
SET PHRASE3([1,big tarantula],[1,hairy ugly spider])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3)
BRAMCH Prev_spider_talk_end
Prev_spider_talk_2:
SET PHRASE2([1,spiders are creepy],[1,tarantulas eat crickets],[1,tarantulas
don′t seem to do very much do they])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH Prev_spider_talk_end
Prev_spider_talk_end:
CHOOSE([1,Prev_spider_talk_switch],[1,$L_NEXT])
SAY(look at,p03,all those crickets in with the tarantula)
Prev_spider_talk_switch:
BRANCH Normal_switch
Prev_scorpion_talk:
CHOOSE([1,Prev_scorpion_talk_1],[1,Prev_scorpion_talk_2])
Prev_scorpion_talk_1:
SET PHRASE2([1,look at that],[1,can you see that],[1,what a])
SET PHRASE3([1,big black],[1,scary yellow])
SAY(&ME.PHRSE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,scorpion)
BRANCH Normal_switch
Prev_scorpion_talk_2:
SET PHRASE2([1,Scorpions have a nasty poigonous sting in their tails],[1,I
don′t like scorpions])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH Normal_switch
Prev_centipede_talk:
CHOOSE([1,Prev_centipede_talk_1],[1,Prev_centipede_talk_2])
Prev_centipede_talk_1:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,it can move very quickly],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,centipede,p03,&ME,PHRASE3)
BRANCH Normal_switch
Prev_centipede_talk_2:
SET PHRASE2([1,has anyone counted the centipede′s legs doesn′t look like 100
to me])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH Normal_switch
Prev_millipede_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,look at all its legs],[1,millipedes are boring],[1,-])
SAY(&ME.PHPASE1,p03,&ME.PHRASE2,p03,millipede,p03,&ME.PHRASE3])
BRANCH Normal_switch
Prev_beetle_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,big green],[1,big black stag],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,beetle)
BRANCH Normal_switch
Prev_ant_talk:
CHOOSE([1,Prev_ant_talk_1],[1,Prev_ant_talk_2])
Prev_ant_talk_1:
SAY(&ME.PHRASE1,p03,look at,p03,all those,p03,ants,p03,in that ant nest)
BRANCH Normal_switch
Prev_ant_talk_2:
SAY(&ME.PHRASE1,p03,ants,p03,are very busy,p03,they are always on the move)
BRANCH Normal_switch
Prev_bee_talk:
CHOOSE([1,Prev_bee_talk_1],[1,Prev_bee_talk_2])
Prev_bee_talk_1:
SAY(&ME.PHRASE1,p03,can you see,p03,all the honey combs,p03,in the beehive)
BRANCH Normal_switch
Prev_bee_talk_2:
SAY(&ME.PHRASE1,p03,can you see,p03,the queen,p03,she is much bigger than the
workers)
BRANCH Normal_switch
Self_insect:
TEST NE &ME.INSECT $UNDEF
CHOOSE_F([4,Continue_self_insect],[3,Select_self_insect])
Select_self_insect:
SET TEMP
([1,spiders],[1,scorpions],[1,centipedes],[1,millipedes],[1,beetles],[1,ants],[1,bees]
)
TEST EQ &ME.TEMP &ME.INSECT
BRANCH_F Select_self_insect
SET INSECT([1,&ME.TEMP])
SET PHRASE1([1,wow],[1,I say],[1,cor],[1,come and])
SET PHRASE2([1,look at those])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.INSECT)
CHOOSE([2,Self_insect_notme],[1,Self_insect_next])
Self_insect_notme:
SELECT NOTME
BRANCH Normal_switch
Self_insect_next:
SELECT NEXT
BRANCH Normal_switch
Continue_self_insect:
SELECT NOTME
CHOOSE([1,Like_self_insect],[1,Dislike_self_insect])
Like_self_insect:
TEST EQ &ME.HATE &ME.INSECT
BRANCH_F Like_self_insect_end
SET LIKE([1,&ME.INSECT])
SET PHRASE1([1,I])
SET PHRASE2([1,like],[1,rsally like])
SET PHRASE3([1,they are fascinating],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.INSECT,p03,&ME.PHRASE3)
Like_self_insect_end:
BRANCH Normal_switch
Dislike_self_insect:
TEST EQ &ME.LIKE &ME.INSECT
BRANCH_F Dislike_self_insect_end
SET HATE([1,&ME,INSECT])
SET PHRASE1([1,I])
SET PHRASE2([1,don′t like],[1,hate])
SET PHRASE3([1,they′re creepy crawly],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.INSECT,p03,&ME.PHRASE3)
Dislike_self_insect_end:
BRANCH Normal_switch
Next_insect:
SELECT NOTME
TEST NE &NEXT.INSECT $UNDEF
BRANCH_F Continue_next_insect
BRANCH Tell_next_insect
Continue_next_insect:
CHOOSE([3,Tell_next_insect],[4,Respond_next_insect])
Respond_next_insect:
SET INSECT([1,&NEXT.INSECT])
TEST EQ &NEXT.INSECT spiders
CHOOSE_F([3,Next_spider_talk])
TEST EQ &NEXT.INSECT scorpions
CHOOSE_F([1,Next_scorpion_talk])
TEST EQ &NEXT.INSECT centipedes
CHOOSE_F([1,Next_centipede_talk])
TEST EQ &NEXT.INSECT millipedes
CHOOSE_F([1,Next_millipede_talk])
TEST EQ &NEXT.INSECT beetles
CHOOSE_F([1,Next_beetle_talk])
TEST EQ &NEXT.INSECT ants
CHOOSE_F([1,Next_ant_talk])
TEST EQ &NEXT.INSECT bees
CHOOSE_F([1,Next_bee_talk])
Tell_next_insect:
SET INSECT
([1,spiders],[1,scorpions],[1,centipedes],[1,millipedes],[1,beetles],[1,ants],[1,bees]
)
TEST EQ &ME.INSECT &NET.INSECT
BRANCH_F Tell_next_insect
SET PHRASE2([1,lookat those],[1,can you see those])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.INSECT)
BRANCH Normal_switch
Next_spider_talk:
SET PHRASE2([1,can you see that],[1,look at that])
SET PHRASE3([1,big black],[1,hairy ugly])
SET PHRASE4([1,spinning a web],[1,eating a cricket],[1,molting its skin],[1,-
])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,spider,p03,&ME.PHRASE4)
BRANCH Normal_switch
Next_scorpion_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,big black],[1,scary yellow])
SET PHRASE4([1,fighting],[1,running around],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,scorpion,p03,&ME,PHRASE4)
BRANCH Normal_switch
Next_centipede_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,it can move very quickly],[1,how many lage doea it have],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,centipede,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_millipede_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,look at all its legs],[1,millipedes are boring],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,millipede,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_beetle_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,big green],[1,big black stag])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,beetle)
BRANCH Normal_switch
Next_ant_talk:
CHOOSE([1,Next_ant_talk_1],[1,Next_ant_talk_2])
Next_ant_talk_1:
SAY(&NEXT.NAME,p03,look at,p03,all those,p03,ants,p03,in that ant nest)
BRANCH Normal_switch
Next_ant_talk_2:
SAY(&NEXT.NAME,p03,ants,p03,are very busy,p03,thay are always on the move)
BRANCH Normal_switch
Next_bee_talk:
CHOOSE([1,Next_bee_talk_1],[1,Next_bee_talk_2])
Next_bee_talk_1:
SAY(&NEXT.NAME,p03,can you see,p03,all the honey combs,p03,in the beehive)
BRANCH Normal_switch
Next_bee_talk_2:
SAY(&NEXT.NAME,p03,can you see,p03,the queen,p03,she is much bigger than the
wotkers)
BRANCH Normal_switch
Reptiles:
SET G_BEEN_TO_REPTILES([1,done])
CHOOSE([3,Prev_reptile],[3,Self_reptile],[3,Next_reptile])
Prev_reptile:
TEST EQ &ME &PREV
CHOOSE_F([1,Self_reptile],[1,Next_reptile])
TEST EQ &PREV.REPTILE $UNDEF
CHOOSE_F([1,Self_reptile],[1,Next_reptile])
SELECT PREV
Continue_prev_reptiles:
SET REPTILE([1,&PREV,REPTILE])
SET PHRASE1([1,ooh],[1,cor],[1,-])
TEST EQ &PREV.REPTILE snakes
CHOOSE_F([5,Prev_snake_talk])
TEST EQ &PREV.REPTILE lizards
CHOOSE_F([1,Prev_lizard_talk])
TEST EQ &PREV.REPTILE crocodiles
CHOOSE_F([1,Prev_crocodile_talk])
Prev_snake_talk:
CHOOSE([1,Prev_snake_talk_1],[1,Prev_snake_talk_2])
Prev_snake_talk_1:
SAY(&ME.PHRASE1,p03,look at that,p03,big python)
BRANCH Normal_switch
Prev_snake_talk_2:
SAY(&ME.PHRASE1,p03,look at that,p03,cobra,p03,cobras are very poisonous)
BRANCH Normal_switch
Prev_lizard_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,iguana],[1,little green geko])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3)
BRANCH Normal_switch
Prev_crocodile_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,huge],[1,big green],[1,enormous],[1,-])
SET PHPASE4([1,see its teeth],[1,its got bulgy eyes],[1,its got big nostrils])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,crocodile,p03,&ME.PHRASE4)
BRANCH Normal_switch
Self_reptile:
TEST NE &ME.REPTILE $UNDEF
CHOOSE_F([4,Continue_self_reptile],[3,Select_self_reptile])
Select_self_reptile:
SET TEMP([1,snakes],[1,lizards],[1,crocodiles])
TEST EQ &ME.TEMP &ME.RBPTILE
BRANCH_F Select_self_reptile
SET REPTILE([1,&ME.TEMP])
SET PHRASE1([1,wow],[1,cor],[1,I say],[1,come and])
SET PHRASE2([1,look at those])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03.&ME.REPTILE)
CHOOSE([2,Self_reptile_notme],[1,Self_reptile_next])
Self_reptile_notme:
SELECT NOTME
BRANCH Normal_switch
Self_reptile_next:
SELECT NEXT
BRANCH Normal_switch
Continue_self_reptile:
SELECT NOTME
CHOOSE([1,Like_self_reptile],[1,Dislike_self_reptile])
Like_self_reptile:
TEST EQ &ME.HATE &ME.REPTILE
BRANCH_F Like_self_reptile_end
SET LIKE([1,&ME.REPTILE])
SET PHRASE1([1,I])
SET PHRASE2([1,like],[1,really like])
SET PHRASE3([1,they′re awsome],[1,they are fascinating])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.REPTILE,p03,&ME.PHRASE3)
Like_self_reptile_end:
BRANCH Normal_switch
Dislike_self_reptile:
TEST EQ &ME.LIKE &ME.REPTILE
BRANCH_F Dislike_self_reptile_end
SET HATE([1,&ME.REPTILE])
SET PHRASE1([1,I])
SET PHRASE2([1,don′t like],[1,hate])
SET PHRASE3([1,they′re wriggly])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.REPTILE,p03,&ME.PHRASE3)
Dislike_self_reptile_end:
BRANCH Normal_switch
Next_reptile:
SELECT NOTME
TEST NE &NEXT.REPTILE $UNDEF
BRANCH_F Continue_next_reptiles
BRANCH Tell_next_reptile
Continue_next_reptiles:
CHOOSE([3,Tell_next_reptile],[4,Respond_next_reptile])
Respond_next_reptile:
SET REPTILE([1,&NEXT.REPTILE])
TEST EQ &NEXT.REPTILE snakes
CHOOSE_F([1,Next_snake_talk])
TEST EQ &MEXT.REPTILE lizards
CHOOSE_F([1,Next_lizard_alk])
TEST EQ &NEXT.REPTILE crocodiles
CHOOSE_F([1,Next_croeodile_talk])
Tell_next_reptile:
SET REPTILE([1,snakes],[1,lizards],[1,crocodiles])
TEST EQ &ME.REPTILE &NEXT.REFTILE
BRANCH_F Tell_next_reptile
SET PHRASE2([1,look at those],[1,can you see those])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.REPTILE)
BRANCH Normal_switch
Next_snake_talk:
CHOOSE([1,Next_snake_talk_1],[1,Next_snake_talk_2])
Next_snake_talk_1:
SAY(&NEXT.NAME,p03,look at that,p03,big python)
BRANCH Normal_switch
Next_snake_talk_2:
SAY(&NEXT.NAME,p03,look at that,p03,cobra,p03,cobras are very poisonous)
BRANCH Normal_switch
Next_lizard_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,iguana],[1,little green geko])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_crocodile_talk:
SET PHRASE1([1,look at that],[1,can you see that])
SET PHRASE2([1,huga],[1,big green],[1,enormous],[1,-])
SET PHRASE3([1,see its teeth],[1,its got bulgy eyes],[1,its got big nostrils])
SAY(&NEXT.NAME,p03,&ME.PHRASE1,p03,&ME.PHRASE2,p03,crocodile,p03,&ME.PHRASE3)
BRANCH Normal_switch
Primates:
SET G_BEEN_TO_PRIMATES([1,done])
CHOOSE([3,Prev_primate],[3,Self_primate],[3,Next_primate])
Prev_primate:
TEST EQ &ME &PREV
CHOOSE_F([1,Self_primate],[1,Next_primate])
TEST EQ &PREV.PRIMATE $UNDEF
CHOOSE_F([1,Self_primate],[1,Next_primate])
SELECT PREV
Continue_prev_primates:
SET PRIMATE([1,&PREV.PRIMATE])
SET PHRASE1([1,ooh],[1,cor],[1,-])
TEST EQ &PREV,PRIMATE gorillas
CHOOSE_F([1,Prev_gorilla_talk])
TEST EQ &PREV.PRIMATE chimpanzees
CHOOSE_F([1,Prev_chimp_talk])
TEST EQ &PHEV.PRIMATE monkeys
CHOOSE_F([1,Prev_monkey_talk])
Prev_gorilla_talk:
SET PHRASE2([1,can you see that],[1,see that],[1,look at that])
SET PHRASE3([1,big],[1,fat],[1,hairy])
SET PHRASE4([1,eating a banana],[1,scratching itself],[1,with the baby],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,gorilla,p03,&ME.PHRASE4)
BRANCH Normal_switch
Prev_chimp_talk:
SET PHRASE2([1,can you see that],[1,see that],[1,look at that])
SET PHRASE3([1,poking a stick into that hole],[1,eating a banana],[1,grooming
the other one],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,chimp,p03,&ME.PHRASE3)
BRANCH Normal_switch
Prev_monkey_talk:
SET PHRASE2([1,look at all],[1,can you see all])
SET PHRASE3([1,climbing in that tree],[1,jumping all over the
place],[1,fighting],[1,playing],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,those,p03,monkeys,p03,&ME.PHRASE3)
BRANCH Normal_switch
Self_primate:
TEST NE &ME.PRIMATE $UNDEF
CHOOSE_F([4,Continue_self_primate],[3,Select_self_primate])
Select_self_primate:
SET TEMP([1,gorillas],[1,chimpanzees],[1,monkeys])
TEST EQ &ME.TEMP &ME.PRIMATE
BRANCH_F Select_self_primate
SET PRIMATE([1,&ME.TEMP])
SET PHRASE1([1,wow],[1,cor],[1,I say],[1,come and])
SET PHRASE2([1,look at those])
SAY(&ME.PHRASE1_p03,&ME.PHRASR2,p03,&ME.PRIMATE)
CHOOSE([2,Self_primate_notme],[1,Self_primate_next])
Self_primate_notme:
SELECT NOTME
BRANCH Normal_switch
Self_primate_next:
SELECT NEXT
BRANCH Normal_switch
Continue_self_primate:
SELECT NOTME
SET PHRASE1([1,I])
SET PHRASE2([1,like],[1,really like])
SET PHRASE3([1,they′refunny],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME,PRIMATE,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_primate:
SELECT NOTNE
TEST NE &NEXT.PRIMATE $UDEEF
BRANCH_F Continue_next_primates
BRANCE Tell_next_primate
Continue_next_primates:
CHOOSE([3,Tell_next_primate],[4,Respond_next_primate])
Respond_next_primate:
SET PRIMATE([1,&NEXT.PRIMATE])
TEST EQ &NEXT.PRIMATE gorillas
CHOOSE_F([1,Next_gorilla_talk])
TEST EQ &NEXT.PUMATE chimpanzees
CHOOSE_F([1,Next_chimp_talk])
TEST EQ &NEXT.PRIMATE monkeys
CHOOSE_F([1,Next_monkey_talk])
Tell_next_primate:
SET PRIMATE([1,gorillas],[1,chimpanzees],[1,monkeys])
TEST EQ &ME.PRIMATE &NEXT.PRIMATE
BRANCH_F Tell_next_primate
SET PHRASE2([1,look at those],[1,can you see those])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PRIMATE)
BRANCH Normal_switch
Next_gorilla_talk:
SET PHRASE1([1,can you see that],[1,see that],[1,look at that])
SET PHRASE2([1,big],[1,hairy])
SET PHRASE3([1,eating a banana],[1,scratching itself],[1,wlth the baby
gorilla],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE1,p03,&ME.PHRASE2,p03,gorilla,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_chimp_talk:
SET PHRASE1([1,can you see that],[1,see that],[1,look at that])
SET PHRASE2([1,chimp],[1,chimpanzee])
SET PHRASE3([1,poking a stick into that hole],[1,eating a banana],[1,grooming
the other one],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE1,p03,&ME,PHRASE2,p03,&ME.PHRRAE3)
BRANCH Normal_switch
Next_monkey_talk:
SET PHRASE2([1,see all],[1,look at all])
SET PHRASE3([1,climbing in that tree],[1,jumping all over the
place],[1,fighting],[1,playing],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,those monkeys,p03,&ME.PHRASE3)
BRANCH Normal_switch
Safari:
SET G_BEEN_TO_SAFARI([1,done])
CHOOSE([3,Prev_safari],[3,Self_safari],[3,Next_safari])
Prev_safari:
TEST EQ &ME &PREV
CHOOSE_F([1,Self_safari],[1,Next_safari])
TEST EQ &PREV.SAFARI $UNDEF
CHOOSE_F([1,Self_safari],[1,Next_safari])
SELECT PREV
Continue_prev_safari:
SET SAFARI([1,&PREV.SAFARI])
SET PHRASE1([1,ooh],[1,cor],[1,-])
TEST EQ &PREV.SAFARI lions
CHOOSE_F([5,Prev_lion_talk],[5,Prev_lion_talk_1)
TEST EQ &PREV.SAFARI zebras
CHOOSE_F([1,Prev_zebra_talk])
TEST EQ &PREV.SAFARI giraffes
CHOOSE_F([1,Prev_giraffe_talk])
TEST EQ &PREV.SAFARI rhinos
CHOOSE_F([1,Prev_Rhino_talk])
TEST EQ &PREV.SAFARI cheetahs
CHOOSE_F([1,Prev_cheetah_talk])
Prev_lion_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,with the big mane],]1,-])
SAY(&ME.PHRASE1,p03,&ME,PHRASE2,p03,lion,p03,&ME.PHRASE3)
BRANCH Normal_switch
Prev_lion_talk_1:
SET PHRASE2([1,look at those],[1,can you see those])
SET PHRASE3([1,playinghow cute],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,lion,p03,cubs,p03,&ME.PHRASE3)
BRANCH Normal_switch
Prev_zetra_talk:
SET PHRASE29([1,look at those],[1,can you see those])
SET PHRASE3([1,they look like stripy donkeys],[2,-])
SAY(&ME.PHRASE1,p03,&ME.PHEASE2,p03,zebras,p03,&ME.PHRASE3)
BRANCH Normal_switch
Prev_giraffe_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,-],[1,baby])
SET PHRASE4([1,what a long neck],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,giraffe,p03,&ME.PHRASE4)
BRANCH Normal_switch
Prev_rhino_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,-],[1,baby])
SET PHRASE4([1,look at its horn],[2,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,rhino,p03,&ME.PHRASE4)
BRANCH Normal_switch
Prev_cheetah_talk:
SET PHRASE2([1,look at that],[1,can you see thay])
SET PHRASE3([1,see its spots],[1,they can run very fast],[2,-])
SAY(&ME.PHRASE1,p03,&ME.PHRSE2,p03,cheetah,p03,&ME.PHRASE3)
BRANCH Normal_switch
Self_safari:
TEST NE &ME.SAFARI $UNDEF
CHOOSE_F([4,Continue_self_safari],[3,Select_self_safari])
Select_self_safari:
SET TEMP([1,lions],[1,zebras],[1,giraffes],[1,rhinos],[1,cheatahs])
TEST EQ &ME.TEMP &ME.SAFARI
BRANCH_F Select_self_safari
SET SAFARI([1,&ME.TRMP])
SET PHRASE1([1,wow],[1,cor],[1,I say],[1,come and])
SET PHRASE2([1,look at those])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.SAFARI)
CHOOSE([2,Self_safari_notme],[1,Self_safari_next])
Self_safari_notme:
SELECT NOTME
BRANCH Normal_switch
Self_safari_next:
SELECT NEXT
BRANCH Normal_switch
Continue_self_safari:
SELECT NOTME
SET PHRASE1([1,I])
SET PHRASE2([1,like],[1,reelly like])
SET PHRASE3([1,they′re awsome],[1,they are fascinating])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2,p03,&ME.SAFARI,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_safari:
SELECT NOTME
TEST NE &NEXT.SAFARI $UDEF
BRANCH_F Continue_next_safari
BRANCH Tell_next_safari
Continue_next_safari:
CHOOSE ([3,Tell_next_safari],[4,Respond_next_safari])
Respond_next_aafari:
SET SAFARI([1,&NEXT.SAFARI])
TEST EQ &NEXT.SAFARI lions
CHOOSE_F([1,Next_lion_talk],[1,Next_lion_talk_1])
TEST EQ &NEXT.SAFARI zebras
CHOOSE_F([1,Next_zebra_talk])
TEST EQ &NEXT.SAFARI giraffes
CHOOSE_F([1,Next_giraffe_talk])
TEST EQ &NEXT.SAFARI rhinos
CHOOSE_F([1,Next_rhino_talk])
TEST EQ &NEXT.SAFARI cheetahs
CHOOSE_F([1,Next_cheetah_talk])
Tell_next_safari:
SET SAFARI([1,lions],[1,zebras],[1,giraffes],[1,rhinos],[1,cheetahs])
TEST EQ &ME.SAFARI &NEXT.SAFARI
BRANCH_F Tell_next_safari
SET PHRASE2([1,look at those],[1,can you see those])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.SAFARI)
BRANCH Normal_switch
Next_lion_talk:
SET PHRASE2([1,look at tbat],[1,can youseethat])
SET PHRASE3([1,with the big mane],[1,listen to it roar],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,lion,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_lion_talk_1:
SET PHRASE2([1,look at those],[1,can you see those])
SET PHRASE3([1,playing how cute],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,lion,p03,cubs,p03,&ME.PHRASE3)
BRANCH Normal_switch
Next_zebra_talk:
SET PHRASE2([1,look at those],[1,can you see those])
SET PHRASE3([1,they look like stripy donkeys],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,zebras,p03,&ME.RHRASE3)
BRANCH Normal_switch
Next_giraffe_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,-],[1,baby])
SET PHRASE4([1,what a long neck],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,giraffe,p03,&ME.PHRASE4)
BRANCH Normal_switch
Next_rhino_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,-],[1,baby])
SET PHRASE4([1,look at its horn],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,&ME.PHRASE3,p03,rhino,p03,&ME.PHRASE4)
BRANCH Normal_switch
Next_cheetah_talk:
SET PHRASE2([1,look at that],[1,can you see that])
SET PHRASE3([1,see its spots],[1,they can run very fast],[1,-])
SAY(&NEXT.NAME,p03,&ME.PHRASE2,p03,cheetah,p03,&ME.PHRASE3)
BRANCH Normal_switch
宠物主题
//PET MULTI-WAY CONVERSATIONS
DEFINE ID
DEFINE G_THEME
DEFINE PET
DEFINE PET_NAME
DEFINE COLOUR
DEFINE BREED
DEFINE PREFERENCE
DEFINE SELF_DONE
DEFINE PHRASE1
DEFINE PHRASE2
DEFINE PHRASE3
Start:
SELECT NOTME
BRANCH_F Only_one_doll
TEST EQ &PREV $UNDEF //First speaker?
CHOOSE_F([1,Say_about_self],[1,Ask_next_spkr])
TEST EQ &PREV.SELF_DONE $UNDEF
BRANCH_F Main_loop
Get_next:
SELECT NEXT
TEST EQ &NEXT &PREV
BRANCH_F Get_next
TEST EQ &NEXT.SELF_DONE $UNDEF
BRANCH_F Main_loop
TEST EQ &ME.SELF_DONE $UNDEF
BRANCH_F Main_loop
CHOOSE([3,Main_loop],[1,Finish])
Finish:
SAY(talking about pets has been fun,p50)
SAY(we should do it again soon)
SWITCH FINISH
Only_one_doll:
SAY(oh dear I′m all alone)
SWITCH FINISH
Normal_switch:
TEST EQ &ME.PET $UNDEF
BRANCH_F Do_switch
TEST EQ &ME.PET_NAME $UNDEF
BRANCH_F Do_switch
TEST EQ &ME.COLOUR $UNDEF
BRANCH_F Do_switch
TEST NE &ME.PET puppy
SET_F SELF_DONE([1,done])
TEST NE &ME.BREED $UNDEF
SET_F SELF_DONE([1,done])
Do_switch:
SAY(p50)
SWITCH SPEAKER Start
Main_loop:
CHOOSE([20,Respond_prev_spkr],[5,Say_about_self],[15,Ask_next_spkr])
Respond_prev_spkr:
TEST EQ &ME &PREV
BRANCH_F Start
TEST EQ &PREV.SELF_DONE done
CHOOSE_F([3,Start],[1,Compare_prev])
TEST EQ &PREV.PET $UNDEF
BRANCH_F Ask_about_pet
CHOOSE([3,Prev_pet_questions],[2,Compare_prev])
Prev_pet_queations:
CHOOSE([1,Ask_about_name],[1,Ask_about_colour],[1,Ask_about_breed])
Ask_about_name:
TEST NE &PREV.PET_NAME $UNDEF
BRANCH_F Prev_pet_questions
SET PHRASE1([1,fantastic],[1,wow],[1,cor],[1,how wonderful],[1,-])
CHOOSE([1,Ask_about_name_1],[1,Ask_about_name_2],[1,Ask_about_name_3])
Ask_about_name_1:
SAY(&ME.PHRASE1,p03,what do you call your,p03,&PREV.PET)
BRANCH Ask_about_name_switch
Ask_about_name_2:
SAY(&ME.PHRASE1,p03,whats your,p03,&PREV,PET,s,p03,name)
BRANCH Ask_about_name_switch
Ask_about_name_3:
SAY(&ME.PHRASE1,p03,has your,p03,&PREV.PET,p03,got a name)
BRANCH Ask_about_name_switch
Ask_about_name_switch:
SELECT PREV
SAY(p50)
SWITCH SPEAKER Reply_to_name
Reply_to_name:
TEST NE &ME.PET_NAME $UNDEF
BRANCH_F Say_name
TEST EQ &ME.PET puppy
SET_F PET_NAME([1,boris],[1,fred],[1,scruffy],[1,rex])
BRANCH_F Say_name
TEST EQ &ME.PET kitten
SET_F PET_NAME([1,tinks],[1,bo],[1,felix],[1,tigger])
BRANCH_F Say_name
TEST EQ &ME.PET hamster
SET_F PET_NAME([1,roger],[1,hammy],[1,bart])
BRANCH_F Say_name
SET PET_NAME([1,peter],[1,bunnikins],[1,roger],[1,bugsy])
Say_name:
SET PHRASE1([1,-])
TEST EQ &ME &PREV
BRANCH_F Say_name_do
TEST EQ &ME.PET_NAME &PREV.PET_NAME
SET_F PHRASE1([1,too],[1,as well],[1,also])
Say_name_do:
SAY(my,p03,&ME.PET,p03,is called,p03,&ME.PET_NAME,p03,&ME.PHRASE1)
SELECT NEXT
BRANCH Normal_switch
Ask_about_colour:
TEST NE &PREV.COLOUR $UNDEF
BRANCH_F Prev_pet_questions
SET PHRASE1([1,wow],[1,-])
SAY(&ME.PHRASE1,p03,what colour is your,p03,&PREV.PET)
SELECT PREV
SAY(p50)
SWITCH SPEAKER Reply_to_colour
Reply_to_colour:
TEST NE &ME.COLOUR $UNDEF
BRANCH_F Say_colour
TEST EQ &ME.PET puppy
SET_F COLOUR([1,black and white],[1,all black],[1,brown])
BRANCH_F Say_colour
TEST EQ &ME.PET kitten
SET_F COLOUR([1,ginger],[1,black and white],[1,black])
BRANCH_F Say_colour
TEST EQ &ME.PET hamster
SET_F COLOUR([1,all black],[1,brown],[1,all white])
BRANCH_F Say_colour
SET COLOUR([1,black and white],[1,brown],[1,all white],[1,black])
Say_colour:
SAY(my,p03,&ME.PET,p03,is,p03,&ME.COLOUR)
SELECT NEXT
BRANCH Normal_switch
Ask_about_breed:
TEST NE &PREV.PET puppy
BRANCH_F Prev_pet_questions
TEST NE &PREV.BREED $UNDEF
BRANCH_F Prev_pet_questions
SET PHRASE1([1,wow],[1,-])
SAY(&ME.PHRASE1,p03,what type of dog is your,p03,&PREV.PET)
SELECT PREV
SAY(P50)
SWITCH SPEAKER Reply_to_breed
Reply_to_breed:
TEST NE &ME.PET puppy
BRANCH_F Say_breed_switch
TEST NE &ME.BREED $UNDEF
BRANCH_F Say_breed
SET BREED
([1,spaniel],[1,Labrador],[1,terrier],[1,retriever],[1,scottie],[1,collie])
Say_breed:
SAY(my,p03,&ME.PET,p03,is a,p03,&ME.BREED)
Say_breed_switch:
SELECT NEXT
BRANCH Normal_switch
Ask_about_pet:
TEST EQ &PREV.PREFERENCE $UNDEF
BRANCH_F No_preference
SAY(do you have a,p03,&PREV.PREFERENCE)
BRANCH Pet_switch
No_preference:
SAY(do you have a,p03,pet)
Pet_switch:
SELECT PREV
SAY(p50)
SWITCH SPEAKER Reply_to_pet
Reply_to_pet:
SET PET([1,puppy],[1,kitten],[1,hamster],[1,bunny])
SET PHRASE1([1,-])
TEST EQ &ME.PET &PREV.PET
SET_F PHRASE1([1,too],[1,as well],[1,aleo])
TEST EQ &ME.PREFERENCE $UNDEF
BRANCH_F Reply_no_preference
TEST NE &ME.PREFERENCE &ME.PET
BRANCH_F Reply_different_pet
Reply_no_preference:
SAY(yes,p03,we have a,p03,&ME.PET,p03,&ME.PHRASE1)
BRANCH Reply_pet_switch
Reply_different_pet:
SAY(No,p03,we have a,p03,&ME.PET,p03,&ME.PHRASE1)
Reply_pet_switch:
SELECT NEXT
BRANCH Normal_switch
Compare_prev:
TEST EQ &ME.PET $UNDEF
BRANCH_F Respond_prev_epkr
TEST EQ &ME.PET &PREV.PET
CHOOSE_F
([1,Prev_same_pet_1],[1,Prev_same_pet_2],[1,Prev_same_friends],[1,Prev_same_play])
CHOOSE([1,Prev_friends],[1,Prev_play],[2,Prev_diff_pet])
Prev_same_pet_1:
SAY(thets great,p03,we both have,p03,&ME.PET,s)
BRANCH Compare_switch
Prev_same_pet_2:
SAY(we both have,p03,&ME.PET,s,p03,how wonderful)
BRANCH ComPare_switch
Prev_friends:
SAY(I hode,p03,my,p03,&ME.PET,p03,and your,p03,&PREV.PET,p03,will be friends)
BRANCH Prev_friends_switch
Prev_same_friends:
SAY(I hope,p03,our,p03,&ME.PET,s,p03,will be friends)
BRANCH Prev_friends_switch
Prev_friends_switch:
SELECT PREV
SAY(p50)
SWITCH SPEAKER Prev_friende_reply
Prev_frierds_reply:
SAY(that would be gareat )
CHOOSE([1,Prev_friends_reply_1],[1,Prev_friends_reply_2])
Prev_friends_reply_1:
SET PHRASE1([1,Then they could play together],[1,It would be fun to see them
together])
SAY(&ME.PHRASE1)
BRANCH Compare_switch
Prev_friends_reply_2:
SET PHRASE1([1,you should bring your],[1,one day bring your])
SET PHRASE2([1,to my house],[1,over to my place])
SAY(&ME.PHRASE1,p03,&PREV.PET,p03,&ME.PHRASE2)
BRANCH Compare_switch
Prev_play:
SAY(do you think your,p03,&PREV.PET,p03,and my,p03,&ME.PET,p03,will play
together)
BRANCH Prev_play_switch
Prev_same_play:
SAY(do you think our,p03,&PREV.PET,s,p03,will play together)
BRANCH Prev_play_switch
Prev_play_switch:
SELECT PREV
SAY(p50)
SWITCH SPEAKER Prev_play_reply
Prev_play_reply:
SET PHRASE1([1,I hope so],[1,I would like that])
SET PHRASE2([1,They can be friends],[1,That would be fun],[1,we must bring
them together],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH Compare_switch
Prev_diff_pet:
TEST EQ &PREV.PET kitten
BRANCH_F Prev_predator
TEST EQ &PREV.PET puppy
BRANCH_F Prev_predator
TEST EQ &PREV.PET hamster
BRANCH_F Prev_prey
TEST EQ &PREV.PET bunny
BRANCH_F Prev_prey
BRANCH Compare_prev
Prev_predator:
TEST EQ &ME.PET hamster
BRANCH_F Prev_predator_statement
TEST NE &ME.PET bunny
BRANCH_F Prev_predator_statement
BRANCH Compare_prev
Prev_predator_statement:
SAY(do you think your,p03,&PREV.PET,p03,will eat my,p03,&ME.PET)
SELECT PREV
SAY(p50)
SWITCH SPEAKER Prev_predator_reply
Prev_predator_reply:
SET PHRASE1([1,I hope not],[1,I wouldn′t like that])
SET PHRASE2([1,That would be terrible],[1,perhaps we should keep them
apart],[1,-])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH Compare_switch
Prev_prey:
TEST EQ &ME.PET kitten
BRANCH_F Prev_prey_statement
TEST EQ &ME.PET puppy
BRANCH_F Prev_prey_statement
BRANCH Compare_prev
Prev_prey_statement:
SAY(I hope my,p03,&ME.PET,p03,won′t eat your,p03,&PREV.PET)
SELECT PREV
SAY(p50)
SWITCH SPEAKER Prev_prey_reply
Prev_prey_reply:
SET PHRASE1([1,I hope not],[1,oh dear])
SET PHRASE2([1,That would be terrible], [1,perhaps we should keep chem apart])
SAY(&ME.PHRASE1,p03,&ME.PHRASE2)
BRANCH Compare_switch
Compare_switch:
SELECT NEXT
BRANCH Normal_switch
Say_about_self:
TEST EQ &ME.SELF_DONE done
CHOOSE_F
([3,Start],[1,Cute_response],[1,Love_response],[1,Preference_response])
TEST NE &ME &PREV
CHOOSE_F
([2,Cute_response],[2,Love_response],[2,Preference_response],[3,My_pet])
CHOOSE([2,Preference_response],[3,My_pet])
CUte_response:
TEST EQ &PREV.PET $UNDEF
BRANCH_F Say_about_self
SAY(&PREV.PET,s,p03,are so cute)
BRANCH Cute_switch
Cute_Switch:
SELECT NEXT
TEST EQ &NEXT &ME
CHOOSE_F([1,Continue_self],[2,Cute_switch])
BRANCH Normal_switch
Love_response:
TEST EQ &PREV.PET $UNDEF
BRANCH_F Say_about_self
SET PHRASE1([1,ooh],[1,-])
SAY(&ME.PHRASE1,p03,I love,p03,&PREV.PET,s)
BRANCH Love_switch
Love_switch:
SELECT NEXT
TEST EQ &NEXT &ME
CHOOSE_F([1,Continue_self],[2,Love_switch])
BRANCH Normal_switch
Preference_response:
TEST EQ &ME.PET $UNDEF
BRANCH_F State_preference
BRANCH Preference_switch
Stabe_preference:
SET PHRASE1([1,ooh],[1,-])
Set_preference:
TEST EQ &ME.PREFERENCE $UNDEF
SET_F PREFERENCE([1,puppy],[1,kitten],[1,hamster],(1,bunny])
TEST EQ &PREV.PET $UNDEF
CHOOSE_F([1,Preference_response_1],[1,Preference_response_2])
TEST EQ &PREV.PET &ME.PREFERENCE
CHOOSE_F([1,Preference_response_3],[1,Preference_response_4])
SAY(I prefer,p03,&ME.PREFERENCE,s)
BRANCH Preference_switch
Preference_response_1:
SAY(&ME.PHRASE1,p03,I think,p03,&ME.PREFERENCE,s,p03,are so cute)
BRANCH Preference_switch
Preference_response_2:
SAY(&ME.PHRASE1,p03,I love,p03,&ME.PREFERENCE,s)
BRANCH Preference_switch
Preference_response_3:
SAY(&ME.PHRASE1,p03,&PREV.PET,s,p03,are so cute)
BRANCH Preference_switch
Preference_response_4:
SAY(&ME.PHRASE1,p03,I love,p03,&PREV.PET,s)
BRANCH Preference_switch
Preference_switch:
SELECT NEXT
TEST EQ &NEXT &ME
CHOOSE_F([1,Continue_self],[2,Preference_switch])
BRANCH Normal_switch
My_pet:
TEST EQ &ME.PET $UNDEF
BRANCH_F Declare_pet
CHOOSE([1,Declare_name],[1,Declare_colour],[1,Declare_breed])
Declare_pet:
SET PET([1,puppy],[1,kitten],[1,hamster],[1,bunny])
SET PHRASE1([1,-])
TEST EQ &PREV.PET &ME.PET
SET_F PHRASE1([1,too],[1,as well],[1,also])
SAY(I have a,p03,&ME,PET,p03,&ME.PHRASE1)
Declare_pet_switch:
SELECT NEXT
TEST EQ &NEXT &ME
CHOOSE_F([1,Continue_self],[2,Declare_pet_switch])
BRANCH Normal_switch
Declare_name:
TEST EQ &ME.PET_NAME $UNDEF
BRANCH_F Reply_to_name
BRANCH My_pet
Declare_colour:
TEST EQ &ME.COLOUR $UNDEF
BRANCH_F Reply_to_colour
BRANCH My_pet
Declare_breed:
TEST NE &ME.PET puppy
BRANCH_F My_pet
TEST EQ &ME.BREED $UNDEF
BRANCH_F Reply_to_breed
BRANCH My_pet
Continue_self:
BRANCH Start
Ask_next_spkr:
SELECT NOTME
TEST EQ &NEXT &PREV
CHOOSE_F([1,Start ],[2,Ask_next_spkr])
TEST EQ &NEXT.SELF_DONE done
CHOOSE_F([3,Start],[2,Compare_next],[1,3party_statements])
TEST EQ &NEXT.PET $UNDEF
BRANCH_F Ask_next_pet
CHOOSE([3,Next_pet_questions],[2,Compare_next],[1,3party_statements])
Next_pet_questions:
CHOOSE([1,Ask_next_name],[1,Ask_next_colour],[1,Ask_next_breed])
Ask_next_name:
TEST NE &NEXT.PET_NAME $UNDSF
BRANCH_F Next_pet_questions
SAY(&NEXT.NAME,p03,what do you call your,p03,&NEXT.PET,p50)
SWITCH SPEAKER Reply_to_name
Ask_next_colour:
TEST NE &NEXT.COLOUR $UNDEF
BRANCH_F Next_pet_questions
SAY(&NEXT.NAME,p03,what colour is your,p03,&NEXT.PET,p50)
SWITCH SPEAKER Reply_to_colour
ASk_next_breed:
TEST NE &NEXT.PET puppy
BRANCH_F Next_pet_questions
TEST NE &NEXT.BREED $UNDEF
BRANCH_F Next_pet_questions
SAY(&NEXT.NAME,p03,what type of dog is your,p03,&NEXT.PET,p50)
SWITCH SPEAKER Reply_to_breed
Ask_Next_pet:
TEST EQ &NEXT.PREFERENCE $UNDEF
BRANCH_F Next_no_preference
SAY(&NEXT.NAME,p03,do you have a,p03,&NEXT.PREFERENCE)
BRANCH Next_pet_switch
Next_no_preference:
SAY(&NEXT.NAME,p03,do you have a,p03,pet)
Next_pet_switch:
SAY(p50)
SWITCH SPEAKER Reply_to_pet
Compare_next:
TEST EQ &ME.PET $UNDEF
BRANCH_F Ask_next_spkr
TEST EQ &NEXT.PET $UNDEF
BRANCH_F Ask_next_spkr
TESTEQ &ME.PET &NEXTT.PET
CHOOSE_F([1,Next_same_pet_1],[1,Next_same_pet_2])
CHOOSE
([1,Next_diff_pet_1],[1,Next_diff_pet_2],[1,Next_diff_pet_3],[2,Next_diff_pet_4])
Next_same_pet_1:
SAY(Hay,p03,&NEXT.NAME,p03,we both have,p03,&ME.PET,s)
BRANCH Compare_next_switch
Next_same_pet_2:
SAY(&NEXT.NAME,p03,you and mehave,p03,&ME.PET,s,p03,isn′t that great)
BRANCH Compare_next_switch
Next_diff_pet_1:
SAY(&NEXT.NAME,p03,I hope my,p03,&ME.PET,p03,and your,p03,&NEXT.PET,p03,will
be friends)
BRANCH Compare_next_switch
Next_diff_pet_2:
SAY(&NEXT.NAME,p03,do you think your,p03,&NEXT.PET,p03,and
my,p03,&ME.PET,p03,will play together)
BRANCH Compare_next_switch
Next_diff_pet_3:
SAY(&NEXT.NAME,p03,it would be fun to see your,p03,&NEXT.PET,p03,and
my,p03,&ME.PET,p03,playing together)
BRANCH Compare_next_switch
Next_diff_pet_4:
TEST EQ &NEXT.PET kitten
BRANCH_F Next_predator
TEST EQ &NEXT,PET puppy
BRANCH_F Next_predator
TEST EQ &NEXT.PET hamster
BRANCH_F Next_prey
TEST EQ &NEXT.PET bunny
BRANCH_F Next_prey
CHOOSE([1,Next_diff_pet_1],[1,Next_diff_pet_2])
Next_predator:
TEST EQ &ME.PET hamster
BRANCH_F Next_predator_statement
TEST EQ &ME.PET bunny
BRANCH_F Next_pedator_statement
CHOOSE([1,Next_diff_pet_1],[1,Next_diff_pet_2])
Next_predator_statement:
SAY(&NEXT.NAME,p03,do you think your,p03,&NEXT.PET,p03,will eat
my,p03,&ME.PET,p50)
SWITCH SPEAKER Next_predator_reply
Next_predator_reply:
CHOOSE([1,Next_predator_reply_1],[1,Next_predator_reply_2])
Next_predator_reply_1:
SAY(I don′t think so,p03,my,p03,&ME.PET,p03,is very gentle)
SELECT NEXT
BRANCH Compare_next_switch
Next_predator_reply_2:
SAY(I hope not,p03,perhaps we should keep them apart)
SELECT NEXT
BRANCH Compare_next_switch
Next_prey:
TEST EQ &ME.PET kitten
BRANCH_F Next_prey_statement
TEST EQ &ME.PET puppy
BRANCH_F Next_prey_statement
CHOOSE([1,Next_diff_pet_1],[1,Next_diff_pet_2])
Next_prey_statement:
SAY(I hope my,p03,&ME.PET,p03,won′t eat,p03,&NEXT.NAME,s,p03,&NEXT.PET,p50)
SWITCH SPEAKER Next_prey_reply
Next_prey_reply:
CHOOSE([1,Next_prey_reply_1],[1,Next_rey_reply_2])
Next_prey_reply_1:
SAY(I hope not,p03,that would be awful)
SELECT NEXT
BRANCH Compare_next_switch
Next_prey_reply_2:
SAY(I hope not,p03,perhaps we should keep them apart)
SELECT NEXT
BRANCH Compare_next_switch
Compare_next_switch:
BRANCH Normal_switch
3party_statements:
TEST EQ &ME.PET $UNDEF
BRANCH_F Ask_next_spkr
TEST EQ &ME &PREV
CHOOSE_F([1,Ask_next_spkr],[1,Compare_next])
TEST EQ &PREV.PET $UNDEF
CHOOSE_F([1,Ask_next_spkr],[1,Compare_next])
TEST EQ &NEXT.PET $UNDEF
CHOOSE_F([1,Ask_next_spkr],[1,Compare_next])
TEST EQ &PREV.PET &NEXT.PET
BRANCH_F P_eq_N
TEST EQ &ME.PET &NEXT.PET
BRANCH_F M_eq_N_ne_P
TEST EQ &ME.PET &PREV.PET
BRANCH_F M_eq_P_ne_N
P_ne_N_ne_M:
SAY(wow,p03,&PREV.NAME,p03,&NEXT.NAME,p03,and me,p03,have three different
pets)
BRANCH 3party_switcn
P_eq_N:
TEST EQ &ME.PET &NEXT.PET
BRANCH_F M_eq_P_eq_N
P_eq_N_ne_M:
SAY(&PREV.NAME,p03,and,p03,&NEXT.NAME,p03,both have,p03,&PREV.PET,s,p03,but,I
have a,p03,&ME.PET)
BRANCH 3party_switch
M_eq_N_ne_P:
SAY(both,p03,&NEXT.NAME,p03,and me
have,p03,&ME.PET,s,p03,but,p03,&PREV.NAME,p03,hasa,p03,&PREV.PET)
BRANCH 3party_switch
M_eq_P_ne_N:
SAY(both,p03,&PREV.NAME,p03,and me
hae,p03,&ME.PET,s,p03,but,p03,&NEXT.NAME,p03,has a,p03,&NEXT.PET)
BRANCH 3party_switch
M_eq_P_eq_N:
SAY(&PREV.NAME,p03,and,p03,&NEXT.NAME,p03,and me all have,p03,&ME.PET,s)
3party_switch:
BRANCH Normal_switch
预定会话主题
//Mr X
DEFINE G_THEME
DEFINE SELF_DONE
Start:
SELECT homer
BRANCH_F No_homer
SELECT salesman
BRANCH_F No_salesman
SELECT lisa
BRANCH_F No_lisa
SELECT homer
SWITCH SPEAKER Begin
No_homer:
SAY(no homer)
SWITCH FINISH
No_salesman:
SAY(no salesman)
SWITCH FINISH
No_lisa:
SAY(no lisa)
SWITCH FINISH
Begin:
SAY(homer1)
SAY(homer2)
SELECT salesman
SWITCH SPEAKER $L_NEXT
SAY(SM1)
SAY(SM2)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer3)
SAY(homer4)
SAY(homer5)
SELECT saleeman
SWITCH SPEAKER $L_NEXT
SAY(SM3)
SAY(SM4)
SAY(SM5)
SAY(SM6)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer6)
SELECT salesman
SWITCH SPEAKER $L_NEXT
SAY(SM7)
SAY(SM8)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer7)
SELECT salesman
SWITCH SPEAKER $L_NEXT
SAY(SM9)
SAY(SM10)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer8)
SELECT salesman
SWITCH SPEAKER $L_NEXT
SAY(SM11)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer9)
SELECT salesman
SWITCH SPEAKER $L_NEXT
SAY(SM12)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer10)
SELECT salesman
SWITCH SPEAKER $L_NEXT
SAY(SM13)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer11)
SELECT lisa
SWITCH SPEAKER $L_NEXT
SAY(lisa1)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer12)
SAY(homer13)
SAY(homer14)
SELECT lisa
SWITCH SPEAKER $L_NEXT
SAY(lisa2)
SAY(lisa3)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer15)
SAY(homer16)
SAY(homer17)
SELECT lisa
SWITCH SPEAKER $L_NEXT
SAY(lisa4)
SAY(lisa5)
SELECT homer
SWITCH SPEAKER $L_NEXT
SAY(homer18)
SAY(homer19)
SWITCH FINISH
Snakes和Ladders主题
//snakes and ladders
DEFINE SQUARE
DEFINE OLD_SQUARE
DEFINE DICE
DEFINE DICE_COUNTER
DEFINE INTRO
DEFINE DICE_INC_RETURN
DEFINE SQUARE_INC_RETURN
Start:
SELECT alice
BRANCH_F No_alice
SWITCH SPEAKER $L_NEXT
SET SQUARE([1,zero])
No_alice:
SELECT joe
BRANCH_F No_joe
SWITCH SPEAKER $L_EXT
SET SQUARE([1,zero])
No_joe:
SELECT zoe
BRANCH_F No_zoe
SWITCH SPEAKER $L_NEXT
SET SQUARE([1,zero])
No_zoe:
TEST EQ &ME.NAME alice
BRANCH_F Init_select_joe
TEST EQ &ME.NAME joe
BRANCH_F Init_select_zoe
TEST EQ &ME.NAME zoe
BRANCH_F Init_select_alice
Init_select_alice:
SELECT alice
BRANCH_F Init_select_joe
BRANCH Continue
Init_select_joe:
SELECT joe
BRANCH_F Init_select_zoe
BRANCH Continue
Init_select_zoe:
SELECT zoe
BRANCH_F Init_select_alice
BRANCH Continue
Continue:
CHOOSE([1,Introduce_next],[1,No_intro])
Introduce_next:
TEST EQ &ME.INTRO $UNDEF
BRANCH_F No_intro
TEST EQ &ME &NEXT
BRANCH_F No_intro
SET INTRO([1,yes])
SAY(now its your turn,&NEXT.NAME)
BRANCH Do_roll_switch
No_intro:
SET INTRO([1,no])
Do_roll_switch:
SAY(p50)
SWITCH SPEAKER $L_NEXT
TEST EQ &ME.NAME alice
BRANCH_F Select_joe
TEST EQ &ME.NAME joe
BRANCH_F Select_zoe
TEST EQ &ME.NAME zoe
BRANCH_F Select_alice
Select_alice:
SELECT alice
BRANCH_F Select_joe
BRANCH Roll_dice
Select_joe:
SELECT joe
BRANCH_F Select_zoe
BRANCH Roll_dice
Select_zoe:
SELECT zoe
BRANCH_F Select_alice
BRANCH Roll_dice
Roll_dice:
TEST EQ &PREV.INTRO yes
BRANCH_F Set_dice
SAY(It′s my turn,p50)
Set_dice:
SET DICE([1,one],[1,two],[1,three],[1,four],[1,five],[1,six])
SET DICE_COUNTER([1,zero])
TEST NE &ME.SQUARE $UNDEF
SET_F OLD_SQUARE([1,&ME.SQUARE])
SAY(I′verolled a,&ME.DICE,p50)
Move_my_square:
TEST EQ &ME.DICE &ME.DICE_COUNTER
BRANCH_F Moved
SET DICE_INC_RETURN([1,one])
BRANCH Increment_my_dice_counter
Dice_counter_incremented_one:
BRANCH Increment_my_square
Square_incremented:
TEST NE &ME.SQUARE &PREV.SQUARE
BRANCH_F Test_next
TEST EQ &ME &PREV
BRANCH_F Test_next
TEST NE &ME.DICE &ME.DICE_COUNTER
BRANCH_F Passed_prev
SAY(hurray,Ive caught up with you,&PREV.NAME,p075)
BRANCH Test_next
Passed_prev:
SAY(hurray,Ive overtaken you,&PREV.NAME,p075)
BRANCH Test_next
Test_next:
TEST NE &ME.SQUARE &NEXT.SQUARE
BRANCH_F Done_testing
TEST EQ &ME &NEXT
BRANCH_F Done_testing
TEST NE &ME.DICE &ME.DICE_COUNTER
BRANCH_F Passed_next
SAY(hurray,Ive caught up with you,&NEXT.NAME,p075)
BRANCH Done_testing
Passed_next:
SAY(hurray,Ive overtaken you,&NEXT.NAME,p075)
BRANCH Done_testing
Done_testing:
BRANCH Move_my_square
Moved:
TEST NE &ME.SQUARE onehundredandone
BRANCH_F Check_new_square
SET SQUARE([1,&ME.OLD_SQUARE])
SAY(Oh dear I′ve rolled too much,I have to stay on square,&ME.SQUARE,p075)
BRANCH Continue
Check_new_square:
SAY(now I′m at square,&ME.SQUARE,p075)
TEST EQ &ME.SQUARE onehundred
BRANCH_F I_have_won
TEST EQ &ME.SQUARE four
SET_F SQUARE([1,thirtynine])
BRANCH_F Up_ladder
TEST EQ &ME.SQUARE twentysix
SET_F SQUARE([1,seventyfive])
BRANCH_F Up_ladder
TEST EQ &ME.SQUARE thirtythree
SET_F SQUARE([1,fiftytwo])
BRANCH_F Up_ladder
TEST EQ &ME.SQUARE fiftynine
SET_F SQUARE([1,sixtythree])
BRANCH_F Up_ladder
TEST EQ &ME.SQUARE seventythree
SET_F SQUARE([1,ninetythree])
BRANCH_F Up_ladder
TEST EQ &ME.SQUARE ninetynine
SET_F SQUARE([1,fortytwo])
BRANCH_F Down_snake
TEST EQ &ME.SQUARE eightysix
SET_F SQUARE([1,fiftyseven])
BRANCH_F Down_snake
TEST EQ &ME.SQUARE seventy
SET_F SQUARE([1,fifty])
BRANCH_F Down_snake
TEST EQ &ME.SQUARE thirtysix
SET_F SQUARE([1,eight])
BRANCH_F Down_snake
TEST EQ &ME.SQUARE thirty
SET_F SQUARE([1,twelve])
BRANCH_F Down_snake
BRANCH Continue
Up_ladder:
SAY(hurray,up a ladder to square,&ME.SQUARE,p075);
BRANCH Continue
Down_snake:
SAY(Boo,down a snake to square,&ME.SQUARE,p075);
BRANCH Continue
I_have_won:
SAY(hurrah I have won)
SWITCH FINISH
Increment_my_dice_counter:
TEST EQ &ME.DICE_COUNTER zero
BRANCH_F Dice_counter__zero
TEST EQ &ME.DICE_COUNTER one
BRANCH_F Dice_counter_one
TEST EQ &ME.DICE_COUNTER two
BRANCH_F Dice_counter_two
TEST EQ &ME.DICE_COUNTER three
BRANCH_F Dice_counter_three
TEST EQ &ME.DICE_COUNTER four
BRANCH_F Dice_counter_four
TEST EQ &ME.DICE_COUNTER five
BRANCH_F Dice_counter_five
Dice_counter_zero:
SET DICE_COUNTER([1,one])
BRANCH Dice_inc_return
Dice_counter_one:
SET DICE_COUNTER([1,two])
BRANCH Dice_inc_return
Dice_counter_two:
SETDICE_COUNTER([1,three])
BRANCH Dice_inc_return
Dice_counter_three:
SET DICE_COUNTER([1,four])
BRANCH Dice_inc_return
Dice_counter_four:
SET DICE_COUNTER([1,five])
BRANCH Dice_inc_return
Dice_counter_five:
SET DICE_COUNTER ([1,six])
BRANCH Dice_inc_return
Dice_inc_return:
SAY(&ME.DICE_COUNTER,p50)
TEST EQ &ME.DICE_INC_RETURN one
BRANCH_F Dice_counter_incremented_one
Increment_my_square:
TEST EQ &ME.SQUARE zero
BRANCH_F Not_started
TEST EQ &ME.SQUARE one
BRANCH_F At_one
TEST EQ &ME.SQUARE two
BRANCH_F At_two
TEST EQ &ME.SQUARE three
BRANCH_F At_three
TEST EQ &ME.SQUARE four
BRANCH_F At_four
TEST EQ &ME.SQUARE five
BRANCH_F At_five
TEST EQ &ME.SQUARE six
BRANCH_F At_six
TEST EQ &ME.SQUARE seven
BRANCH_F At_seven
TEST EQ &ME.SQUARE eight
BRANCH_F At_eight
TEST EQ &ME.SQUARE nine
BRANCH_F At_nine
TEST EQ &ME.SQUARE ten
BRANCH_F At_ten
TEST EQ &ME.SQUARE eleven
BRANCH_F At_eleven
TEST EQ &ME.SQUARE twelve
BRANCH_F At_twelve
TEST EQ &ME.SQUARE thirteen
BRANCH_F At_thirteen
TEST EQ &ME.SQUARE fourteen
BRANCH_F At_fourteen
TEST EQ &ME.SQUARE fifteen
BRANCH_F At_fiveteen
TEST EQ &ME.SQUARE sixteen
BRANCH_F At_sixteen
TEST EQ &ME.SQUARE seventeen
BRANCH_F At_seventeen
TEST EQ &ME.SQUARE eighteen
BRANCH_F At_eighteen
TEST EQ &ME.SQUARE nineteen
BRANCH_F At_nineteen
TEST EQ &ME.SQUARE twenty
BRANCH_F At_twenty
TEST EQ &ME.SQUARE twentyone
BRANCH_F At_twentyone
TEST EQ &ME.SQUARE twentytwo
BRANCH_F At_twentytwo
TEST EQ &ME.SQUARE twentythree
BRANCH_F At_twentythree
TEST EQ &ME.SQUARE twentyfour
BRANCH_F At_twentyfour
TEST EQ &ME.SQUARE twentyfive
BRANCH_F At_twentyfive
TEST EQ &ME.SQUARE twentysix
BRANCH_F At_twentysix
TEST EQ &ME.SQUARE twentyseven
BRANCH_F At_twentyseven
TEST EQ &ME.SQUARE twentyeight
BRANCH_F At_twentyeight
TEST EQ &ME.SQUARE twentynine
BRANCH_F At_twentynine
TEST EQ &ME.SQUARE thirty
BRANCH_F At_thirty
TEST EQ &ME.SQUARE thirtyone
BRANCH_F At_thirtyone
TEST EQ &ME.SQUARE thirtytwo
BRANCH_F At_thirtytwo
TEST EQ &ME.SQUARE thirtythree
BRANCH_F At_thirtythree
TEST EQ &ME.SQUARE thirtyfour
BRANCH_F At_thirtyfour
TEST EQ &ME.SQUARE thirtyfive
BRANCH_F At_thirtyfive
TEST EQ &ME.SQUARE thirtysix
BRANCH_F At_thirtysix
TEST EQ &ME.SQUARE thirtyseven
BRANCH_F At_thirtyseven
TEST EQ &ME.SQUARE thirtyeight
BRANCH_F At_thirtyeight
TEST EQ &ME.SQUARE thirtynine
BRANCH_F At_thirtynine
TEST EQ &ME.SQUARE forty
BRANCH_F At_forty
TEST EQ &ME.SQUARE fortyone
BRANCH_F At_fortyone
TEST EQ &ME.SQUARE fortytwo
BRANCH_F At_fortytwo
TEST EQ &ME.SQUARE fortythree
BRANCH_F At_fortythree
TEST EQ &ME.SQUARE fortyfour
BRANCH_F At_fortyfour
TEST EQ &ME.SQUARE fortyfive
BRANCH_F At_fortyfive
TEST EQ &ME.SQUARE fortysix
BRANCH_F At_fortysix
TEST EQ &ME.SQUARE fortyseven,
BRANCH_F At_fortyseven
TEST EQ &ME.SQUARE fortyeight
BRANCH_F At_fortyeight
TEST EQ &ME.SQUARE fortynine
BRANCH_F At_Fortynine
TEST EQ &ME.SQUARE fifty
BRANCH_F At_fifty
TEST EQ &ME.SQUARE fiftyone
BRANCH_F At_fiftyone
TEST EQ &ME.SQUARE fiftytwo
BRANCH_F At_fiftytwo
TEST EQ &ME.SQUARE fiftythree
BRANCH_F At_fiftythree
TEST EQ &ME.SQUARE fiftyfour
BRANCH_F At_fiftyfour
TEST EQ &ME.SQUARE fiftyfive
BRANCH_F At_fiftyfive
TEST EQ &ME.SQUARE fiftysix
BRANCH_F At_fiftysix
TEST EQ &ME.SQUARE fiftyseven
BRANCH_F At_fiftyaeven
TEST EQ &ME.SQUARE fiftyeight
BRANCH_F At_fiftyeight
TEST EQ &ME.SQUARE fiftynine
BRANCH_F At_fiftynine
TEST EQ &ME.SQUARE sixty
BRANCH_F At_sixty
TEST EQ &ME.SQUARE sixtyone
BRANCH_F At_sixtyone
TEST EQ &ME.SQUARE sixtytwo
BRANCH_F At_sixtytwo
TEST EQ &ME.SQUARE sixtythree
BRANCH_F At_sixtythree
TEST EQ &ME.SQUARE sixtyfour
BRANCH_F At_sixtyfour
TEST EQ &ME.SQUARE sixtyfive
BRANCH_F At_sixtyfive
TEST EQ &ME.SQUARE sixtysix
BRANCH_F At_sixtysix
TEST EQ &ME.SQUARE sixtyseven
BRANCH_F At_sixtyseven
TEST EQ &ME.SQUARE sixtyeight
BRANCH_F At_sixtyeight
TEST EQ &ME.SQUARE sixtynine
BRANCH_F At_sixtynine
TEST EQ &ME.SQUARE seventy
BRANCH_F At_seventy
TEST EQ &ME.SQUARE seventyone
BRANCH_F At_seventyone
TEST EQ &ME.SQUARE seventytwo
BRANCH_F At_seventytwo
TEST EQ &ME.SQUARE seventythree
BRANCH_F At_seventythree
TEST EQ &ME.SQUARE seventyfour
BRANCH_F At_seventyfour
TEST EQ &ME.SQUARE seventyfive
BRANCH_F At_seventyfive
TEST EQ &ME.SQUARE seventysix
BRANCH_F At_seventysix
TEST EQ &ME.SQUARE seventyseven
BRANCH_F At_seventyseven
TEST EQ &ME.SQUARE seventyeight
BRANCH_F At_seventyeight
TEST EQ &ME.SQUARE seventynine
BRANCH_F At_seventynine
TEST EQ &ME.SQUARE eighty
BRANCH_F At_eighty
TEST EQ &ME.SQUARE eightyone
BRANCH_F At_eightyone
TEST EQ &ME.SQUARE eightytwo
BRANCH_F At_eightytwo
TEST EQ &ME.SQUARE eightythree
BRANCH_F At_eightythree
TEST EQ &ME.SQUARE eightyfour
BRANCH_F At_eightyfour
TEST EQ &ME.SQUARE eightyfive
BRANCH_F At_eightyfive
TEST EQ &ME.SQUARE eightysix
BRANCH_F At_eightysix
TEST EQ &ME.SQUARE eightyseven
BRANCH_F At_eightyseven
TEST EQ &ME.SQUARE eightyeight
BRANCH_F At_eightyeight
TEST EQ &ME.SQUARE eightynine
BRANCH_F At_eightynine
TEST EQ &ME.SQUARE ninety
BRANCH_F At_ninety
TEST EQ &ME.SQUARE ninetyone
BRANCH_F At_ninetyone
TEST EQ &ME.SQUARE ninetytwo
BRANCH_F At_ninetytwo
TEST EQ &ME.SQUARE ninetythree
BRANCH_F At_ninetythree
TEST EQ &ME.SQUARE ninetyfour
BRANCH_F At_ninetyfour
TEST EQ &ME.SQUARE ninetyfive
BRANCH_F At_ninetyfive
TEST EQ &ME.SQUARE ninetysix
BRANCH_F At_ninetysix
TEST EQ &ME.SQUARE ninetyseven
BRANCH_F At_ninetyseven
TEST EQ &ME.SQUARE ninetyeight
BRANCH_F At_ninetyeight
TEST EQ &ME.SQUARE ninetynine
BRANCH_F At_ninetynine
TEST EQ &ME.SQUARE onshundred
BRANCH_F At_onehundred
BRANCH Square_incremented
Not_started:
SET SQUARE([1,one])
BRANCH Square_incremented
At_one:
SET SQUARE([1,two])
BRANCH Square_incremented
At_two:
SET SQUARE([1,three])
BRANCH Square_incremented
At_three:
SET SQUARE([1,four])
BRANCH Square_incremented
At_four:
SET SQUARE([1,five])
BRANCH Square_incremented
At_five:
SET SQUARE([1,six])
BRANCH Square_incremented
At_six:
SET SQUARE([1,seven])
BRANCH Square_incremented
At_seven:
SET SQUARE([1,eight])
BRANCH Square_incremented
At_eight:
SET SQUARE([1,nine])
BRANCH Square_incremented
At_nine:
SET SQUARE([1,ten])
BRANCH Square_incremented
At_ten:
SET SQUARE([1,eleven])
BRANCH Square_incremented
At_eleven:
SET SQUARE([1,twelve])
BRANCH Square_incremented
At_twelve:
SET SQUARE([1,thirteen])
BRANCH Square_incremented
At_thirteen:
SET SQUARE ([1,fourteen])
BRANCH Square_incremented
At_fourteen:
SET SQUARE([1,fifteen])
BRANCH Square_incremented
At_fiveteen:
SET SQUARE([1,sixteen])
BRANCH Square_incremented
At_sixteen:
SET SQUARE([1,seventeen])
BRANCH Square_incremented
At_seventeen:
SET SQUARE([1,eighteen])
BRANCH Square_incremented
At_eighteen:
SET SQUARE([1,nineteen])
BRANCH Square_incremented
At_nineteen:
SET SQUARE([1,twenty])
BRANCH Square_incremented
At_twenty:
SET SQUARE([1,twentyone])
BRANCH Square_incremented
At_twentyone:
SET SQUARE([1,twentytwo])
BRANCH Square_incremented
At_twentytwo:
SET SQUARE([1,twentythree])
BRANCH Square_incremented
At_twentythree:
SET SQUARE([1,twentyfour])
BRANCH Square_incremented
At_twentyfour:
SET SQUARE([1,twentyfive])
BRANCH Square_incremented
At_twentyfive:
SET SQUARE([1,twentysix])
BRANCH Square_incremented
At_twentysix:
SET SQUARE([1,twentyseven])
BRANCH Square_incremented
At_twentyseven:
SET SQUARE([1,twentyeight])
BRANCH Square_incremented
At_twentyeight:
SET SQUARE([1,twentynine])
BRANCH Square_incremented
At_twentynine:
SET SQUARE([1,thirty])
BRANCH Square_incremented
At_thirty:
SETSQUARE([1,thirtyone])
BRANCH Squere_incremented
At_thirtyone:
SET SQUARE([1,thirtytwo])
BRANCH Square_incremented
At_thirtytwo:
SET SQUARE([1,thirtythree])
BRANCH Square_incremented
At_thirtythree:
SRT SQUARE([1,thirtyfour])
BRANCH Square_incremented
At_thirtyfour:
SET SQUARE([1,thirtyfive])
BRANCH Square_incremented
At_thirtyfive:
SET SQUARE([1,thirtysix])
BRANCH Square_incremented
At_thirtysix:
SET SQUARE([1,thirtyseven])
BRANCH Square_incremented
At_thirtyseven :
SET SQUARE([1,thirtyeight])
BRANCH Square_incremented
At_thirtyeight:
SET SQUARE([1,thirtynine])
BRANCH Square_incremented
At_thirtynine:
SET SQUARE([1,forty])
BRANCH Square_incremented
At_forty:
SET SQUARE([1,fortyone])
BRANCH Square_incremented
At_fortyone:
SET SQUARE([1,fortytwo])
BRANCH Square_incremented
At_fortytwo:
SET SQUARE([1,fortythree])
BRANCH Square_incremented
At_fortythree:
SET SQUARE([1,fortyfour])
BRANCH Square_incremented
At_fortyfour:
SET SQUARE([1,fortyfive])
BRANCH Square_incremented
At_fortyfive:
SET SQUARE([1,fortysix])
BRANCH Square_incremented
At_fortysix:
SET SQUARE([1,fortyseven])
BRANCH Square_incremented
At_fortyseven:
SET SQUARE([1,fortyeight])
BRANCH Square_incremented
At_fortyeight:
SET SQUARE([1,fortynine])
BRANCH Square_incremented
At_fortynine:
SET SQUARE([1,fifty])
BRANCH Square_incremented
At_fifty:
SET SQUARE([1,fiftyone])
BRANCH Square_incremented
At_fiftyone:
SET SQUARE([1,fiftytwo])
BRANCH Square_incremented
At_fiftytwo:
SET SQUARE([1,fiftythree])
BRANCH Square_incremented
At_fiftythree:
SET SQUARE([1,fiftyfour])
BRANCH Square_incremented
At_fiftyfour:
SET SQUARE([1,fiftyfive])
BRANCH Square_incremented
At_fiftyfive:
SET SQUARE([1,fiftysix])
BRANCH Square_incremented
At_fiftysix:
SET SQUARE([1,fiftyseven])
BRANCH Square_incremented
At_fiftyseven:
SET SQUARE([1,fiftyeight])
BRANCH Square_incremented
At_fiftyeight:
SET SQUARE([1,fiftynine])
BRANCH Square_incremented
At_fiftynine:
SET SQUARE([1,sixty])
BRANCH Square_incremented
At_sixty:
SET SQUARE([1,sixtyone])
BRANCH Square_incremented
At_sixtyone:
SET SQUARE([1,sixtytwo])
BRANCH Square_incremented
At_sixtytwo:
SET SQUARE([1,sixtythree])
BRANCH Square_incremented
At_sixtythree:
SET SQUARE([1,sixtyfour])
BRANCH Square_incremented
At_sixtyfour:
SET SQUARE([1,sixtyfive])
BRANCH SqUare_incremented
At_sixtyfive:
SET SQUARE([1,sixtysix])
BRANCH Square_incremented
At_sixtysix:
SET SQUARE([1,sixtyseven])
BRANCH Square_incremented
At_sixtyseven:
SET SQUARE([1,sixtyeight])
BRANCH Square_ncremented
At_sixtyeight:
SET SQUARE([1,sixtynine])
BRANCH Square_incremented
At_sixtynine:
SET SQUARE([1,seventy])
BRANCH Square_incremented
At_seventy:
SET SQUARE([1,seventyone])
BRANCH Square_incremented
At_seventyone:
SET SQUARE ([1,seventytwo])
BRANCH Square_incremented
At_seventytwo:
SET SQUARE([1,seventythree])
BRANCH Square_incremented
At_seventythree:
SET SQUARE([1,seventyfour])
BRANCH Square_incremented
At_seventyfour:
SET SQUARE([1,seventyfive])
BRANCH Square_incremented
At_seventyfive:
SET SQUARE([1,seventysix])
BRANCH Square_incremented
At_seventysix:
SET SQUARE([1,seventyseven])
BRANCH Square_incremented
At_seventyseven:
SET SQUARE([1,seventyeight])
BRANCH Square_incremented
At_seventyeight:
SET SQUARE([1,seventynine])
BRANCH Square_incremented
At_seventynine:
SET SQUARE([1,eighty])
BRANCH Square_incremented
At_eighty:
SET SQUARE([1,eightyone])
BRANCH Square_incremented
At_eightyone:
SET SQUARE([1,eightytwo])
BRANCH Square_incremented
At_eightytwo:
SET SQUARS([1,eightythree])
BRANCH Square_incremented
At_eightythree:
SET SQUARE([1,eightyfour])
BRANCH Square_incremented
At_eightyfour:
SET SQUARE([1,eightyfive])
BRANCH Square_incremented
At_eightyfive:
SET SQUARE([1,eightysix])
BRANCH Square_incremented
At_eightysix:
SET SQUARE([1,eightyseven])
BRANCH Square_incremented
At_eightyseven:
SET SQUARE([1,eightyeight])
BRANCH Square_incremented
At_eightyeight:
SET SQUARE([1,eightynine])
BRANCH Square_incremented
At_eightynine:
SET SQUARE([1,ninety])
BRANCH Square_incremented
At_ninety:
SET SQUAFE([1,ninetyone])
BRANCH Square_incremented
At_ninetyone:
SET SQUARE([1,ninetytwo])
BRANCH Square_incremented
At_ninetytwo:
SET SQUARE([1,ninetythree])
BRANCH Square_incremented
At_ninetythree:
SET SQUARE([1,ninetyfour])
BRANCH Square_incremented
At_ninetyfour:
SET SQUARE([1,ninetyfive])
BRANCH Square_incremented
At_ninetyfive:
SET SQUARE([1,ninetysix])
BRANCH Square_incremented
At_ninetysix:
SET SQUARE([1,ninetyseven])
BRANCH Square_incremented
At_ninetyseven:
SET SQUARE([1,ninetyeight])
BRANCH Square_incremented
At_ninetyeight:
SET SQUARE([1,ninetynine])
BRANCH Square_incremented
At_ninetynine:
SET SQUARE([1,onehunered])
BRANCH Square_incremented
At_onehundred:
SET SQUARE([1,onehundredandone])
BRANCH Square_incremented
附录II-与图8有关的组件的细节
附录III-与图9有关的组件的细节