星露谷物语吧 关注:496,933贴子:2,987,351

【进阶MOD教程?】问题对话+随机文本代码写法介绍

只看楼主收藏回复

嗨!最近肝对话有些无聊了,来分享一下研究Content Patcher和爬MOD讨论区的成果。
这教程是给已经在自己写MOD的人看的,只会分享代码写法,从零开始的人请看其他人写的基础教程。
因为我自己找了很久才学懂怎幺写问题对话和显示随机文本,看了一下也没有相关教程,所以发出来,希望能帮到也在码对话的人们。我感觉在做自制NPC时也会很有用。
想不到镇楼图,来分享一下塞巴斯蒂安某天早上【我送放射性矿碇谋杀亲妹结果对方还很高兴】的高能自爆。


IP属地:澳大利亚1楼2022-04-15 05:43回复
    2樓備用


    IP属地:澳大利亚2楼2022-04-15 05:44
    收起回复
      【1】问题对话
      星露谷本身就有内置问题对话的写法,主要是【$y】和【$q】这两种。
      【$q】通常对答
      这是最普遍的对答,通常我们在事件里的好感度问题选项,或者NPC们隔三差五问你「我今天发型怎幺样」「你平常看什幺书」都是这种对答。
      $q的具体写法可以参考精品区的事件/对话教程,已经有人写过了,这里不覆述。
      $q主要有下列这些优点:
      -允许写入好感度变动
      -答案的代码格式非常自由,$b和$e都可以随意使用
      -配合$r和$p可以制作更多后续对话
      但是也有很严重的缺点:
      -除非配合EventRepeater这种外置MOD,否则问题在一个存档里只会发生一次,不适合用于日常问答。


      IP属地:澳大利亚3楼2022-04-15 05:45
      回复
        那如果想在日常对话中加入选项怎幺办?这时候可以用【$y】。
        【$y】快速对答
        通常出现在节日的一些NPC对话中,例如每年冰雪节潘妮会问你堆什幺雪人好。
        $y相比起$q有这样的缺点:
        -选项无法影响友好度
        -答案只能存在$b的效果,无法用$e结束对话
        -不会纪录对话ID,问答结束后就是结束了,无法用$r和$p制作后续互动对话。
        -在对答后无法加入任何台词
        但有个强大的优点:无需外置MOD就可以无限次发生!!!
        所以如果你不是想做一个牵扯到后续剧情的关键问题,而只是想做些增添趣味的小问答,用$y其实就可以解决了。
        那具体怎幺写?我们可以参考游戏的原写法。
        这是威利在冬日星餐宴的对话代码:
        "Willy": "$y '想不想听冬日星的传说?_想_在冬日的夜空中,有一颗闪亮的星星,只能从此谷中看见。没人知道为什幺……在古时候,来自四面八方的人会聚集于此来看它。*他们相信看见星星的人会交上好运。甚至有人说被称为=星之果实的神秘水果是跟冬日星有某种程度的联系。_不用_那随你吧。'",
        这段的具体效果就是
        问题:想不想听冬日星的传说?
        选项1:想
        选项2:不用
        答案1:在冬日的夜空中,有一颗闪亮的星星,只能从此谷中看见。没人知道为什幺……在古时候,来自四面八方的人会聚集于此来看它。*他们相信看见星星的人会交上好运。甚至有人说被称为=星之果实的神秘水果是跟冬日星有某种程度的联系。
        答案2:那随你吧。
        答案1很长,所以是有换行的。【*】就是换行的代码,在$y中效果等同于$b。
        【_】的顺序绝对不能搞错,否则会整个问题代码崩溃。我自己制作了【$y】的写法模版如下:
        $y '问题_选项1_答案1_选项2_答案2_选项3_答案3'
        把文本复制黏贴到适当位置就行,非常简单。选项数目方面,2-4个都实测可以运行,更多的数量请自己写入代码测试看看。
        $y的开场白可以任意设置,但是在$y结束后无法再加入任何台词,就是无论如何都无法使用$e的效果。如果你实在想用$e,那就只能用$q了。


        IP属地:澳大利亚4楼2022-04-15 05:45
        回复
          $y实测非常好用!可以在日常对话中加入N多问题对答。在此再整理一下在$y的答案中可以用的代码:
          【*】:换行用,效果等同于【$b】。
          【$h、$s】等表情代码:全部都可以用。


          IP属地:澳大利亚5楼2022-04-15 05:47
          回复
            【2】随机文本写法
            游戏内置的随机文本写法【$c】虽然也能用,但是有着无法换行及不能多于两项的限制。
            与此相比,Content Patcher的【Random】功能就方便很多。不只项目无上限,还可以自由使用$q、$y、$b、$e等等格式。
            Random写法:
            {{Random: 内容1, 内容2}}
            这样游戏运行时就会随机显示内容1或者内容2,概率均等。
            【, 】是分隔内容用的符号,注意不要漏掉后面的空格。
            中文MOD如果用全形标点,用【, 】来分隔其实也足够了,但如果是英文MOD用半形符号的话,就会有在文本里无法用逗号的问题。
            Content Patcher内置了一个方法来解决这问题:inputSeparator。
            你可以自定义你的分隔符号,那就可以随意使用逗号了。
            使用inputSeparator的例子如下:
            {{Random: 内容1+++ 内容2+++ 内容3|inputSeparator=+++}}
            这情况下【+++】就是分隔符,效果等同于预设的【,,】。
            Random有非常多的用法,在这只介绍在文本里的用法。
            它可以用在几乎所有地方。例如你可以在角色的台词里使用:
            "Fri4": "{{Random: 每天都要刷碗扫除。呃……如果妈妈每晚不喝酒,早早就回来按时睡觉,或许也能帮我做点家务呢。$s+++ 镇子很小,所有人自然都十分熟络。#$e#不知城市里又是什幺样的呢?|inputSeparator=+++}}",
            那在4心的周五,游戏就会随机显示【每天都要刷碗扫除。呃……如果妈妈每晚不喝酒,早早就回来按时睡觉,或许也能帮我做点家务呢。$s】或者【镇子很小,所有人自然都十分熟络。#$e#不知城市里又是什幺样的呢?】。
            这例子里只写入了两组,但只要你的肝够用就可以设置无数项,用分隔号分开就行……不过我觉得三项就差不多够用了。


            IP属地:澳大利亚6楼2022-04-15 05:48
            收起回复
              Content Patcher的说明文件里虽然有Random的解说,但是没有写怎幺应用到对话文本里OTZ
              这还是我自己爬讨论区的旧文才看到的。
              以上。再见!


              IP属地:澳大利亚7楼2022-04-15 05:50
              回复
                噢对了,Random里面还可以再套用Random。就是你可以做个这样的东西:
                {{Random: $y '问题_选项1_{{Random: 随机答案1+++ 随机答案2+++ 随机答案3|inputSeparator=+++}}_选项2_{{Random: 随机答案4+++ 随机答案5+++ 随机答案6|inputSeparator=+++}}_选项3_{{Random: 随机答案7+++ 随机答案8+++ 随机答案9|inputSeparator=+++}}'
                +++ 内容2+++ 内容3|inputSeparator=+++}}
                无限套娃,只要你确认好自己的开关括号没有写错就行。


                IP属地:澳大利亚8楼2022-04-15 05:54
                回复


                  IP属地:广西来自Android客户端9楼2022-04-15 19:14
                  回复
                    wow!好棒!


                    IP属地:广东来自Android客户端10楼2022-04-15 21:00
                    收起回复
                      那我说一下,使用肖像的代码,除了$h、$s这些的英文代码,还有比较简单的,而且非常好记,每个肖像,从左到右,0开始数,这样子,对我们这些懒人好记ww使用肖像代码都是在对话文字说完之后,后面才可以使用,都是在#$b#的前面
                      例子↓
                      今天天气真好啊。$2#$b#
                      这样子的


                      IP属地:广东来自Android客户端11楼2022-04-15 21:06
                      回复
                        在此再介绍一下Random的一些特性和进阶用法!
                        全部都来自Content Patcher的说明文件。没有Pathoschild大佬做Content Patcher的话都不知道要怎幺玩(笑哭):
                        这些用法都是Random的特性,Random不只可以用在对话里,用在行走图或者头像也是可以的,但我不搞这些,所以这里不会介绍。具体请参考Content Patcher的说明文件。
                        【1】显示的内容以随机抽取乱数的方式决定,一般在一天开始时抽取。更新频率可以利用加入【Update Rate】的方法来调整(后述)。
                        【2】概率永远都是均等的。如果你想让某些选项概率高些,可以使用输入两次的方式:
                        {{Random:内容1, 内容1, 内容2}}
                        这样内容1的概率就会比内容2高1倍。
                        【3】每组Random的乱数都是独立抽取的,结果不会互相影响。如果想要做到统一结果,可以使用后述的【Pinned Key】来为你的乱数加入【Unique Key】。


                        IP属地:澳大利亚12楼2022-04-15 23:15
                        回复
                          【Update Rate】
                          我还没用过这功能(完全想不到对话文本有什幺会用到它的地方,进出地图换行走图倒是可能用到),所以都是照搬说明文件的。
                          加入Update Rate的写法:
                          {{Random: a, b, c |key={{Time}} }}
                          {{Time}}就是Update Rate的部分。你可以替换成以下的选项:
                          OnDayStart预设的选项,每天开始时抽取。
                          OnLocationChange当玩家切换地图(俗称过版)时重新抽取。
                          OnTimeChange游戏时间每前进10分钟时抽取。
                          这些指令之间可以混用,就是可以写入”OnLocationChange, OnTimeChange”,这样就是两个都要。加入后的例子:
                          {{Random: a, b, c |key=OnLocationChange, OnTimeChange }}
                          注意拥有同样的key的Random指令会总是抽到同样的乱数(就是例如OnLocationChange如果抽到了1,所有设定成这个更新频率的。如果不想抽到同样的乱数,可以加入Unique Key:
                          {{Random: a, b, c |key=Abigail portraits OnLocationChange, OnTimeChange }}


                          IP属地:澳大利亚13楼2022-04-15 23:15
                          回复
                            【Update Rate】
                            我还没用过这功能(完全想不到对话文本有什幺会用到它的地方,进出地图换行走图倒是可能用到),所以都是照搬说明文件的。
                            加入Update Rate的写法:
                            {{Random: a, b, c |key={{Time}} }}
                            {{Time}}就是Update Rate的部分。你可以替换成以下的选项:
                            OnDayStart预设的选项,每天开始时抽取。
                            OnLocationChange当玩家切换地图(俗称过版)时重新抽取。
                            OnTimeChange游戏时间每前进10分钟时抽取。
                            这些指令之间可以混用,就是可以写入”OnLocationChange, OnTimeChange”,这样就是两个都要。加入后的例子:
                            {{Random: a, b, c |key=OnLocationChange, OnTimeChange }}
                            注意拥有同样的key的Random指令会总是抽到同样的乱数(就是例如OnLocationChange如果抽到了1,所有设定成这个更新频率的都是1)。如果不想抽到同样的乱数,可以加入Unique Key:
                            {{Random: a, b, c |key=Abigail portraits OnLocationChange, OnTimeChange }}


                            IP属地:澳大利亚14楼2022-04-15 23:16
                            回复
                              这里就要再介绍一下Unique Key,这东西能让Random的结果统一。
                              先来解释一下有什幺具体的作用!例如你为阿比做了夏装1和夏装2的行走图和头像!如果不使用Unique Key,可能会出现行走图是夏装1,而头像是夏装2的结果。Unique Key的用途就是让行走图和头像会一起抽到夏装1或者夏装2。
                              在对话里也可以用到。比如你为A角色写了三套随机台词1A,2A,3A,又为角色B写了配套的台词1B,2B,3B,然后角色C又写了1C,2C,3C。
                              【山姆:我好饿啊。/我吃饱了。/我今天肚子痛不想吃东西。】
                              【塞巴斯蒂安:你听到山姆的肚子叫了幺?我从刚才一直听到。/山姆刚吃了两个披萨。我好奇他怎幺吃这幺多的。/山姆说他今天拉肚子。我肯定他昨天吃了什幺不该吃的。】
                              【阿比盖尔:山姆的肚子从刚才开始就好吵。/我没想到山姆能吃完那幺多披萨。/山姆说他拉肚子。我希望这不是因为爸店里在卖坏掉的东西!】
                              不用Unique Key的话,说不定会抽到这样的结果:
                              【山姆:我好饿啊。】
                              【塞巴斯蒂安:山姆说他今天拉肚子。我肯定他昨天吃了什幺不该吃的。】
                              【阿比盖尔:我没想到山姆能吃完那幺多披萨。】
                              是不是很支离破碎?!这就该轮到Unique Key出场了。
                              不含Unique Key的写法:
                              {{Random: 我好饿啊。+++ 我吃饱了。+++ 我今天肚子痛不想吃东西。|inputSeparator=+++}}
                              含Unique Key的写法:
                              {{Random: 我好饿啊。+++ 我吃饱了。+++ 我今天肚子痛不想吃东西。|inputSeparator=+++|key=Dialogue1}}
                              重点是最后面那串【|key=Dialogue1】。这个Dialogue1可以替换成任何文字(最好不要用中文吧),只要保证所有想要分成一组的对话都使用同一个key就可以。
                              使用后的效果应该就会是
                              【山姆:我吃饱了。】
                              【塞巴斯蒂安:山姆刚吃了两个披萨。我好奇他怎幺吃这幺多的。】
                              【阿比盖尔:我没想到山姆能吃完那幺多披萨。】
                              用这个可以做出不同角色之间联动的随机台词!又扩展了做台词的新世界~


                              IP属地:澳大利亚15楼2022-04-15 23:17
                              回复