eratw吧 关注:44,715贴子:182,139

DOKU式TW口上教程

取消只看楼主收藏回复

文档版的教程实在是遥遥无期,但我又苦于“基本的概念都得重复说明是什么意思,沟通起来好累”,遂想到发帖来讲一讲,也方便了解大伙的真实需要(我有一旦写教程就恨不得无微不至的恶习)
·虽然本教程【主要】是代码相关,但【很可能】也会夹带一些理念上的私货
·这些理念仅仅是个人看法,是否吸纳由君自取
·随缘更新
·虽然我在制作帕露口上,但不要叫我帕露!我从来没有以“帕露”自称!私わDOKUです!
·没有镇楼图,因为有镇楼图一定会用帕露西,但我不是帕露


IP属地:湖南1楼2024-01-23 12:39回复
    如果看此贴前,想要创作TW口上的你曾经看过本吧内的其他教程(例如纸蛇冰沙版),那你一定知道,TW本体为口上提供了口上模板这个东西(在“游戏文件夹\改造とかしてみたい人のためのあれこれ\口上関連”这个文件夹下的的“口上テンプレ”文件夹和“別人版用口上テンプレ”文件夹里)
    但是打开一看,AIEEEEE!它有这么多文件!


    光看大小,将近400kb!甚至比我的帕露口上(目前140kb左右)要大出去将近一倍!
    南无三!何等的庞杂!
    若是创作口上一开始就要把这些东西都进行一个了解,那在创作之前,热情或许便已样衰了
    虽然“照着别人创作好的口上来对模板进行填充”也不失为一种方法,但且不说有样学样容易有bug抄bug,完全不懂代码时只能“俺寻思这个是起这个作用”、然后抱着这种拿捏不定的紧张心态去尝试实现什么东西,岂非过于痛苦了?
    所以,还请先把这些东西放在一边、暂且不要去想它。虽然TW口上创作大多秉持一个“代码能跑就行”,但这样硬写于是遇到不能跑的,就难受、难受、实则难受了


    IP属地:湖南2楼2024-01-23 12:59
    收起回复
      大抵的确是夹了,看看之后能不能恢复,不能再发,能就接着写


      IP属地:湖南4楼2024-01-23 13:39
      回复
        大抵的确真的被夹去亚空间了,牢DOKU没有意见,只能重新写下
        为了让本教程更好被理解,也是为了实现“至少基础的东西不用再讲”的初衷,有几个容易混淆的概念就必须先解释清楚
        首先就是,“COM/USERCOM/指令/命令”
        COM,例如,是对应玩家的一个实际执行的动作的指令。
        在游玩角度讲,COM大都是“成功执行会消耗时间”(特例,时间停止也是com但不会消耗时间)
        在口上制作角度,COM对于口上作者来说可操作空间极大,大到“甚至能不魔改就把以自己的角色为目标的指令替换成自制指令”这种程度。
        USERCOM,例如,虽然也是对应玩家操作的指令,但既不会影响时间,也不存在“执行失败”这种东西。
        在口上制作角度,USERCOM基本是没有操作空间的,所以也基本不会有口上。
        这两者都属于“指令”,是玩家游玩的时候【能看到】的东西。
        而命令,指的是一种玩家游玩时看不到的、程序实际读取并执行的东西。

        ↑“SETCOLOR”是一个命令,“SETCOLOR 150,150,250”这行命令的含义是“把文字颜色设置为RGB格式的(150,150,250)”

        ↑“PRINTL”是一个命令,“PRINTL 【浴场的闯入者】”这行命令的含义是“输出“【浴场的闯入者】”并换行”

        ↑“RESETCOLOR”是一个命令。“RESETCOLOR”这行命令的含义是“把文字颜色改回默认”
        之所以说“这行命令”,是因为在ERA中命令的读取以行为单位,把命令拆分到多行的话ERA会无法识别

        ↑会报错
        (不过,被“{}”括起来的多个行会被ERA视为同一行)(一般来讲用不到这个知识,但是有备无患)

        ↑等价于“PRINTL 【浴场的闯入者】”,所以不会报错


        IP属地:湖南9楼2024-01-23 20:49
        收起回复
          然后就是,“事件/函数(非式中函数/式中函数)”
          事件这个东西,在TW里【并不应当】是代码概念,而应当是对一段文本内容的形容。
          初见就可以算作一个事件,约会后逆告白也可以算作一个事件,就寝后夜袭了更可以算是一个事件...“事件”这个词如果单独拿出来,就和我们平常的用法一样,并不附带任何代码上的含义。或许比起“个”来说,“次”这种量词实际上会更适合。
          哪怕是“每日归家事件”这种实则有代码去专门负责的东西,提到“每日归家事件”这个词的时候,指的也是由诸如“狸猫酒会”“抑郁药大叔”“兽的报恩”“路人子袭击”之类的具体的事件组成的集合,而并非是某段代码。
          而函数与之相反,是【完全】的代码概念。它指的,就的是由n行命令组成的代码段。

          ↑装有归家事件“抗抑郁药大叔”的主要内容的函数“GO_OUT_EV3”(的一部分)

          ↑获取在场非玩家角色数的函数“GET_TARGETNUM”


          IP属地:湖南10楼2024-01-23 21:16
          收起回复
            觉得⑨、⑩楼讲得太抽象、太难以理解?虽然还没看到这样的人,但我知道一定(红豆嘎?)会有人问着“是这样吗——”就懵圈了。这样写得那么用力却过犹不及的DOKU小子就要从冰雪聪明变成冰雪大聪明了?呀咩咯——!
            于是,这里是简单的概括:
            COM:例如移动、休憩、就寝,大都成功就过时间,口上作者好操作
            USERCOM:例如开关过滤器、能力表示,基本不会过时间,口上作者不好操作
            命令:一行の代码
            事件:不含任何代码成分,更适合TW宝宝的严选品质
            函数:千本のCODE


            IP属地:湖南11楼2024-01-23 21:26
            收起回复
              那么带着复燃的心情,继续写下
              上文虽然在“容易混淆的概念”里提到了“式中函数”和“非式中函数”,但实际上,这如果了解这二者的区别的话,哪怕只说“函数”,也可以、而且是轻易可以分辨出来实际说的是哪一个。
              要问为什么?首先它们使用的方式就不一样!
              想使用非式中函数,最基础地,是通过“CALL”这种命令来执行

              例如上图这行命令,含义就是“执行名为“韦一敏”的函数里的代码”
              虽说除了这种最基础的形式以外,还有CALLFORM、TRYCALLFORM、TRYCCALLFORM这些命令也能执行函数,但这些在相对基础的口上制作中不会用到,所以暂且留到之后再提。
              而式中函数,之所以叫“式中函数”,顾名思义,它一般而言是放在算式中使用的

              例如这一行算式中,假设“总帕露指数”和“当前帕露指数”都是存储着数字的“数字型变量”,那么 “将会获得的帕露指数()”这个式中函数就等效于一个普通的数字型变量。与普通变量的不同点,在这个表达式里就只有它的实际值是通过它这个函数内代码的执行现场算出的
              (顺带,这行算式的含义,是“算出“将会获得的帕露指数”、并与“当前帕露指数”求和,最后把和的值赋予给“总帕露指数”这个变量”。)


              IP属地:湖南12楼2024-01-24 07:03
              回复
                而虽然使用方式的不同就如末法芝士·忍者的能力一样,是“完全写在称呼上”这种程度的明显,但无论是式中或者非式中,所有函数的建立都以“@”开头,后面接上文件名
                其中非式中函数比较简单,除此之外就再无其他必要组成了。它以“下个函数的开头,或者是文件的结尾”为结尾,哪怕紧挨着下一个函数也没有问题

                而式中函数,为了与变量区分,其函数名的后放必须有成对的括号。
                由于它实际上被当作“变量的数值”来使用,它的内部还必须包含至少一条能告诉外部“它算出了甚么”的命令。
                最后,为了告诉程序“它是式中函数”,需要为它加上额外的标识。
                如此下来,式中函数的最简格式,便如下图:


                其中“#FUNCTION”的行就是说明“这个函数是式中函数”的标识。
                FUNC2()对于外部来说是数字(不带S),FUNC3对于外部来说是字符串(带S),而RETURNF就是那个告诉外部“我算出了甚么”的命令。
                对于FUNC2(),RETURNF后面应该加的内容是数字、或者数字型变量,例如

                在RETURNF后面没有内容时,默认相当于“RETURNF 0”
                对于FUNC3(),RETURNF后面应该加的内容是字符串、或者字符串型变量,例如

                在RETURNF后面没有内容时,默认相当于“RETURNF "" ”(相当于空的字符串)
                类似于非式中函数,式中函数也有“RETURN”“RETURNS”“RETURNFORM”这三个可以向外部通风报信的命令。不过这些内容在相对基础的口上制作中同样用不到,所以也留到之后说明。


                IP属地:湖南13楼2024-01-24 07:52
                回复
                  如那杀人鲸奥加一般,带着婆妈的心接着写下。
                  区分了“命令”和“函数”这些容易混淆的概念后,对于没有编程基础的小白而言,还有几个需要了解的概念
                  (有编程基础的话可以跳过)
                  首先就是,【变量】
                  相信打算自己制作口上的人,大概都在数学课或者其他什么地方学过“变量”“自变量”“因变量”这些概念。而代码意味上的“变量”和数学意味上的“变量”也没什么大的区别——
                  需要注意的就只有两件事:变量可以存储数值(与之相对的,式中函数是即时运算、并不具备存储的功能);变量有种类的区分(根据其指代的内容不同,在ERA中分为“字符串变量”和“数值变量/数字变量”)。
                  与变量相对的概念是“常量”(不变化的量,例如数字【1】或者字符串“【"啊啊啊"】),但由于“常量”这个东西的使用频率低、低、实则低,提到“量”的时候,通常语境下,指的会是变量
                  然后就是,【操作符】
                  操作符就是对数据进行操作(尤其是运算处理)的符号。就习惯而言,把操作符和被操作的数据一起构成的式子成为“算式”之类。

                  例如上图,就是三个算式,其运算符分别为【+】、【-】、【*】。操作符和数据之间的空格实则是不必要的,然而为了方便阅读,还是【应当】使用。
                  数字替换为式中函数或者用括号括起来(括号括起来的东西优先运算)的其他算式,并不会影响算式的成立。然而这三个算式,却不能像命令一样单独成行(会报错)。
                  应当说,大多数操作符的算式都只能像式中函数或者变量一样,不能单独出现、必须配合命令使用。这种算式本身的实际意义,也是其运算后的结果。

                  例如上图命令“SETCOLOR (1+1),(2-1),(3*4)”的含义就是,“把文字的颜色设置为RPG格式的(2,1,12)”。其中的括号实则是不必要的,然而为了方便阅读,还是【应当】使用
                  不过,与大多操作符不同,有少数操作符,是必须单独出现、不能像式中函数或者变量一样和命令处在同一行的——其中的代表,就是【赋值】操作符【=】

                  上图的算式“数字变量名1 = 666”,其含义就是“将666这个数值赋予给“数字变量名1”这个变量”。
                  “数字变量名2 = 数字变量名1”这个算式,含义则是“将“数字变量名1”里存储的数值赋予给“数字变量名2”这个变量”
                  与赋值操作符类似的还有【+=】【-=】【*=】【++】【--】这些操作符,带有这些操作符的算式都可以等效转化成使用赋值操作符的算式,其等效关系大致如下图

                  其中【+=】【-=】【*=】和【=】一样,操作的时候用到了前后两个数据,所以我们把它称为“二元操作符”。而【--】和【++】只用到了前面的一个,我们就把它称为“一元操作符”。
                  需要注意的是,【赋值】并不是数学上的【等于】。数学上的【等于】,在代码上以二元操作符【==】来表示。【==】的两端如果相等,那么它构成的算式的结果将是1,否则结果为0

                  例如上图的两个算式,实则等效于下图的两个算式


                  IP属地:湖南14楼2024-01-24 14:29
                  回复
                    除了上文提到的、能且必须单独成行的【赋值】等操作符,对于数字变量来说,常用的操作符的含义如下:
                    【*】: 乘。将两个数相乘,得到结果
                    【%】:取余。用前面的数整除后面的数,得到整除的余数。需要注意的是,前面的数的绝对值小于后面的数的绝对值的情况,余数当作是0。
                    【/】: 除(整除)。用前面的数整除后面的数(只要商不要余数),得到结果(只有整数,ERA的变量存不了小数)。需要注意如果被整除的数是0的话会导致游戏报错崩溃。和取余一样,前面的数绝对值更小的话,商当作是0。
                    【+】: 加。将两个数相加,得到结果
                    【-】: 减。用前面的数减去后面的数,得到结果
                    【>=】:大于等于(不小于)。判断前面的数是否不小于后面的数,如果不小于结果是1,否则结果是0
                    【>】、【<】、【<=】(大于、小于、不大于):和不小于类似。
                    【==】:等于。判断前后两个数据的数值是否相等,如果相等结果是1,否则结果是0
                    【!=】:不等于,和等于相反。
                    【&&】:与(逻辑与)。如果前面的数不是0、后面的数也不是0,那么结果是1。否则结果是0。按住shift按主键盘的数字7打出。多用于条件判断。
                    【||】:或(逻辑或)。如果前面的数是0、后面的数也是0,那么结果是0,否则结果是1,按住shift再点反斜杠【\】打出。多用于条件判断。
                    【!】:非(逻辑非)。一元操作符,操作的数据在它后面。如果后面的数是0,那么结果是1,否则结果是0。
                    或许到这里也看出来了,对于这三个逻辑运算符而言,被操作的数据和返回的结果一样,都只有“是0、不是0”这两种情况。
                    习惯上我们将“是0”称为“假‘,”不是0“称为”真“,那么在逻辑的运算里,任何数值都是”非真即假、非假即真“的。
                    为了保证不会出现“不知道1 + 2 * 2的结果是5还是6”这种蕴藏智慧的情况,操作符有一定优先级的。本层中提到的操作符优先级如下:
                    逻辑非>乘、整除、取余>加、减>不小于、不大于、大于、小于>等于、不等于>逻辑与、逻辑或。
                    (当然,赋值那些的优先级当然是最低的)
                    在优先级相同的情况下,运算是【从左至右】的。
                    例如“4 * 1 / 2”这个式子,会算出“2”,而非“4 * (1 / 2)”的0。


                    IP属地:湖南15楼2024-01-24 14:59
                    收起回复
                      那么在开始正式的讲解之前,最后要婆妈一下的概念,就只剩【参数】了(紫泥瓦“参数太郎”,贵大人豆!)
                      参数,顾名思义、望文生义,就是“参考用的数”。
                      需要参考它的东西,只有两种:一种是命令,另一种是函数。

                      还记得我们上文提到过的“SETCOLOR 150,150,250”这个函数吗?实际上,两个“150”和一个“250”,都是作为这个“SETCOLOR”命令的参数的。这时候的SETCOLOR有三个数字型的参数,第一参数(个人习惯叫一参)是150,第二参数(个人习惯,二参)也是150,第三参数(三参)则是250。
                      这三个数字型参数以【英文逗号】即【,】分隔开来,并且一参和命令之间,有着一个半角空格(就是普通的空格)。
                      然而对于“SETCOLOR”这种命令,其实还有另一种只具备一个数字型参数的形式

                      “0x”开头代表这个数字是十六进制形式,“0x66CCFF”是十进制下的“6737151”。“SETCOLOR 0x66CCFF”的含义,就是“把文字颜色改成十六进制格式下的66CCFF”(天依蓝)。这行命令虽说等价于“SETCOLOR 6737151”,但十六进制的数字在这种情况下会比十进制更好记忆。

                      同理,对于这行“PRINTL 【浴场的闯入者】”而言,参数是“【浴场的闯入者】”这个字符串。字符串作为一参,所以也一定要和作为命令本身的“PRINTL”隔开一个半角空格。
                      一定要隔开一个半角空格!一定要隔开一个半角空格!一定要隔开一个半角空格!
                      但凡以字符串作为参数的命令都很容易被忘记这个半角空格,所以重要的事情说三遍!
                      而对于这种以字符串为参数的命令,一般字符串都不仅是一参、更是唯一的参数,所以字符串中的【,】会被解释成字符串的一部分、而不起分隔参数的作用。
                      至于什么命令应当有什么样的几个参数,会在讲解命令的时候单独说明。


                      IP属地:湖南16楼2024-01-24 15:31
                      收起回复
                        命令的参数个数、类型都是由ERA语言决定的,我们无法更改,因为命令是写在ERA语言里的、我们无法自定义的。
                        但是函数恰恰相反。我们既然能够自定义函数,那么也能轻易决定函数的参数个数。

                        ↑“函数名1”这个函数是有两个参数的非式中函数。
                        其中【#DIM】出现在函数内部的话,是在函数中定义(习惯上把变量、函数等的的创建叫做定义)一个数字型变量,这里定义的变量名为“参数1”。
                        而【#DIMS】则是在函数中定义一个字符串型变量,这里定义的变量名为“参数2”。(有S是字符串没S是数字,和#FUNCTION类似)
                        (像【#DIM】【#DIMS】【#FUNCTION】【#FUNCTIONS】这类以【#】开头的内容,我们称之为【预处理】。【预处理】的行与函数名之间不能隔有非预处理的行。)

                        ↑想要【调用】“函数名1”(执行“函数名1”里的内容)的时候应该如此书写CALL命令——两个参数都要写

                        ↑非式中函数也可以不使用括号来定义(式中函数不可以)

                        ↑不使用括号来定义的话,实际上可以这样
                        但是为了与命令作出区分、为了方便代码的阅读,定义函数时还是【应当】使用括号(以“@函数名(参数,参数,...)”的形式)


                        IP属地:湖南17楼2024-01-24 23:19
                        回复
                          对于函数的参数,还有可以更进一步地讲解的东西,但是对于了解“参数”的概念,上一层的内容就足够了,多讲反而可能会让人感到混乱。
                          那么总结一下:
                          非式中函数:通过CALL等命令来执行,【函数名(参数)】作为唯一的参数
                          式中函数:放在算式中作为数字使用(不能存储数值,所以【不能】放在赋值操作符的左边)
                          算式:由操作符和被操作的数据构成的式子,形如【1+1】【变量 = 1】
                          操作符:“逻辑非、乘除取余、加减、大于小于不大于不小于、等于不等于、逻辑与逻辑或”这类对数据进行运算后得到结果(算式本身在数值上等效于得到的结果)的符号(不能单独使用,必须放在式中),或者是“赋值”这种对变量进行操作的符号(必须自占一行,不能放在式中)。
                          参数:给命令或是函数参考的数值,例如“SETCOLOR 0x66CCFF”中的【0x66CCFF】,或者“CALL 函数名1(1,"啊")”中的【1】和【"啊"】,或者是“PRINTL HELLO WORLD ”中的【HELLO WORLD】


                          IP属地:湖南18楼2024-01-24 23:33
                          回复
                            那么,哔哔叭叭地讲完了这些概念,终于是可以对口上的创作进行说明了。
                            ——才不说明嘞!直接上手!AUGHHHHHHHH!


                            IP属地:湖南19楼2024-01-25 00:38
                            回复
                              第一步,新建文件夹!新建文本文档!
                              第二步,双击打开文本文档!点击另存为!然后把它另存为.ERB格式的UTF-8BOM编码的文件!

                              点击保存!好!口上立项了!今天的工作完成了!可以开始摸鱼了!可以自豪地说“我最近成为TW口上作者了”!
                              恭喜恭喜!撒花撒花!咂哇咂哇!


                              IP属地:湖南20楼2024-01-25 00:50
                              收起回复