【石头故事RPG】石头剧本官方文件翻译

我很久没有玩过这个游戏了。我最近又开始玩了。我刚刚打中了这个想法,打开了自动化之路。

与一年前相比,《石器时代》增加了很多新东西,如连续两次挥舞斧头、新大斧等物品,以及超过10颗星的难度。

官方简体也有一些改进,如增加官方名称“石器时代”的官方翻译;在游戏中,“闹鬼大厅”已改为“死亡大厅”,等等。这可能是为了让中国玩家更容易获得副本ID(关于这一点,请参阅我一年前发送的专栏中的“获取关卡名称和装备名称”一章)。

        当然,这其中最最最大的更新就是Stonescript的更新了。这1年以来,Stonescript加入了很多新功能,比如一年前我玩的时候,可采集物(巨石和树木)都不会被选取到,条件判断只有if(?)而没有else。如今不仅加入了else(:),还加入了else if(:?)。以前连大于等于和小于等于都没有,而如今甚至可以用var声明变量然后引入。如此巨大的更新,将可以用Stonescript完成更多复杂功能。

        一年前我靠着的研究Stonescript。如今相关中文攻略寥寥无几,我只好先翻译一下官方文档,希望能帮助更多人玩懂Stonescript。


        写在意念石头中,用来自动切换装备。石头脚本(Stonescript)是《石头纪》中非常简单但功能强大的语言。

        优秀的脚本旨在当游戏中状态变化时,为你选择最好的物品。这既可以很简单,比如,当您生命值过低,自动使用药水;又可以足够复杂,将战斗优化到超人的水平。

·:·:·目录·:·:·

1.示例

2.基础知识

3.游戏状态

4.命令

5.比较

6.变量

7.数学运算

8.功能

9.本机函数

10.导入外部脚本

11. ASCII-art

12.循环

13.搜索过滤器

14.自定义输入

15.提示

16.默认脚本

17.发展计划

附录A-音效

·:·:·示例·:·:·

// 为岩石高地装备铲子。 

// 在恐怖洞窟中,使用装备组合1, 

// 但是面对Boss时,

// 换上勾爪和7星战锤。

// 在亡者之殿中,使用2个魔杖, 

// 左手是毒,

// 右手是以太。但是,

// 如果难度超过了5星,

// 就使用附魔+13的活力长杖。 

// 如果生命值低于10,

// 则使用药水。

?loc=rocky

  equip shovel 

?loc=cave

  loadout 1 

  ?foe=bolesh

    equip grap

    equip hammer *7 D 

?loc=halls

  equipL poison wand

  equipR vigor wand 

  ?loc.stars > 5

    equip vigor staff +13 

?hp < 10

  activate potion

(由于专栏排本格式原因,空格不显眼。为了让空格看上去更贴合游戏中实际效果,我这里用两个空格代表游戏中一个空格,任何需要复制代码的,请去原文文档复制)

·:·:·基本·:·:·

?            检查逻辑条件。如果为真,则执行已识别的行(if)。
                例如:
                ?loc = caves
                  loadout 1

           替代逻辑分支,以防“?” 条件为假(else)。
                例如:
                ?loc = caves
                  loadout 1
                :
                  loadout 2

😕            具有附加条件的替代逻辑分支(else-if)。
                例如:
                ?loc = caves
                  loadout 1
                :?loc = deadwood
                  loadout 2
                :
                  loadout 3

//            注释。执行脚本时,“//”右边的所有文本都没有逻辑作用。

                例如:
                ?loc = caves
                  loadout 1
                //上面写了在恐惧洞窟使用装备组合1(这里随便写什么,不影响代码运行)

^            继续上一行(ss里每一行能输入的字符是有限的,但是直接换行逻辑会中断,所以必须在第二行用^连上)。

                例如:
                ?loc=caves |
                ^loc = mine
                  equip repeating
                //上面写的等效于:
                ?loc=caves|loc=mine
                  equip repeating

·:·:·游戏状态·:·:·

这些问题可以告诉您发生什么,以及即将在玩家面前发生什么。

?loc                            玩家正在访问的当前位置。

                                    例如:
                                    ?loc = caves
                                      loadout 1

?loc.name                  当前位置的本地化名称。

                                    例如:

                                    var name
                                    name = loc.name
                                    >Exploring @name@

?loc.stars                   当前位置的难度(星级)。

                                    例如:
                                    ?loc = caves
                                      ?loc.stars=4
                                        loadout 1
                                      ?loc.stars=5
                                        loadout 2

?loc.begin                  仅在任一游戏启动时,time为0的时候,第一帧为ture。不包括由衔尾蛇石头自动开始的循环游戏。用来初始化变量。

                                    例如:

                                    ?loc.begin

                                      var i = 0
                                      ?loc = caves
                                         i = -100

?loc.loop                   由衔尾蛇石头自动开始的循环游戏启动时,第一帧为ture。
                                    例如:
                                    var loopCount = 0
                                    ?loc.loop
                                      loopCount++

?foe                            当前被玩家选为目标的敌人。
                                    例如:
                                    ?foe = boo
                                      equip vigor staff

?foe.name                  目标敌人的本地化名称。

?foe.distance             玩家与目标敌人的距离。

?foe.count                  40单位(距离)内敌人的数量。

?foe.hp                       目标敌人的当前生命值。

?foe.maxhp                目标敌人的最大生命值。

?foe.armor                 目标敌人的当前护甲。

?foe.maxarmor          目标敌人的最大护甲。

?foe.debuffs.count    目标敌人身上debuff的数量。

?harvest                     下一个可收获的物体,例如大树和巨石。
                                    例如:
                                    ?harvest=Boulder

                                        equip shovel

?harvest.distance      玩家与最近的可收获物体之间的距离。
                                    例如:
                                    ?loc = Rocky&Harvest.distance <7 

                                      equip shovel

?pickup                      当前被玩家选为目标的拾取物品

?pickup.distance       玩家与目标拾取物品的距离。

?time                          地区的当前帧号。

                                    例如:
                                    ?time%300 = 0

                                      >每10秒你就会看到此消息。

?totaltime                   游戏的当前帧号。(例如你进入了boss房间,time会重置为0,totaltime则不会;而当你开始了一个新游戏,包括衔尾蛇自动循环的游戏,time和totaltime都会重置为0

?armor                       玩家当前的护甲值,向下取整。
                                    例如:如果护甲值为[2.4],?armor 取值为2。

?armor.f                     玩家当前的护甲值的小数点后第一位。
                                    例如:如果护甲值为[2.4],?armor.f 取值为4。

?debuffs.count          玩家身上debuff的数量。

?hp                             玩家的当前生命值。

?maxhp                      玩家的最大生命值。

?maxarmor                玩家的最大护甲值。

?pos.x                        玩家当前的X坐标

?pos.y                        玩家当前的Y坐标

?pos.z                        玩家当前的Z坐标

?ai.enabled                如果AI启用,则为True;如果AI关闭,则为False(例如,在过场动画期间)。

?ai.paused                 如果AI暂停,例如在等待宝箱掉落时,则为true。

?ai.idle                       如果玩家空闲,等待攻击之类的事情完成,则为True。

?ai.walking                如果玩家正在移动,则为true。

?face                          玩家当前的面部表情。

                                    例如:
                                    ?face = “^^”
                                      >Happy

?key                            自定义输入的状态(详情请看本文的自定义输入部分)。

                                    以下显示当前输入:

                                    >@key@

?res.stone                 石头。

?res.wood                 木头。
?res.tar                      焦油。
?res.ki                        气。
?res.bronze               青铜。以上5条是玩家当前库存中的资源量。

                                    例如:

                                    ?loc = Deadwood
                                      >木头:@res.wood@个

?totalgp                      根据物品星级和附魔等级计算得出的总“装备分数”。
                                    例如:
                                    >我的装备分数 = @totalgp@

?rng                            返回一个0到9999之间的随机数。
                                    例如:
                                    ?rng < 5000
                                      >头!
                                    :
                                      >尾巴!

                                    下面这个例子可以生成5到24之间的随机数:
                                    var min = 5
                                    var max = 24
                                    var n
                                    n = min + rng % (max – min + 1)

?screen.w                  屏幕的ASCII网格的宽度。
                                    例如:
                                    var sw = screen.w
                                    >屏幕宽度 = @sw@

?screen.h                   屏幕的ASCII网格的高度。

                                    例如:
                                    var sh = screen.h
                                    >屏幕高度 = @sh@

·:·:·命令·:·:·

这些告诉游戏做点什么。

activate (ability)                激活物品技能。(ability)可以取以下值:potion, P, left, L, right, R.
                                           例如:
                                           activate R
                                           (激活右手装备的物品,例如斧头的技能。)

equip  (str)                        装备一个物品。(str) 限制为7个条件。

                                           例如:
                                           equip vigor crossbow *8 +5

equipL (str)                       在左手装备一个最符合条件的物品。
                                           例如:
                                           equipL poison sword

equipR (str)                       在右手装备一个最符合条件的物品。
                                           例如:
                                           equipR vigor shield

loadout (n)                        激活指定编号的装备组合。
                                           例如:
                                           ?loc = caves
                                             loadout 1
                                           ?loc = deadwood
                                             loadout 2

> (str)                                 在屏幕顶部打印一个字符串(str)
                                           例如:
                                           > Hello World!

> @varName@                  打印一个插入了变量值的字符串。单次打印可以插入多个变量。请在变量名旁加上@以插入。
                                           以下示例显示有关当前目标敌人的信息:

                                           var foeInfo
                                           foeInfo = foe
                                           >敌人是@foeInfo@

>( abcd                              在玩家上显示自定义面部表情(经译者测试,只对大脑袋生效,而且只显示前3个字符)。
                                           例如:
                                           >( OwO

>oX,Y,[#rrggbb,](str)        相对于玩家位置的高级打印。X和Y是坐标偏移。#rrggbb是十六进制表示法的文本颜色。颜色也可以使用以下常量设置:#white, #cyan, #yellow, #green, #blue和#red。如果要以彩虹色打印,请使用#rainFF,其中后2个字符定义亮度。

                                           下面的示例用红色字色写了“我们上!”。相对于玩家的位置向左偏6个单位距离,向下偏3个单位距离:

                                           >o-6,3,#red,我们上!

>hX,Y,[#rrggbb,](str)       类似于“>o”,不同的是, 和大脑袋绘制在相同图层上。是画帽子等配件的理想选择。
                                           以下代码在玩家头上绘制了一顶黄色的帽子(需要大脑袋):
                                           >h-2,-3,#yellow,ascii
                                           ##_
                                           #| |
                                           _|_|_
                                           asciiend

>`X,Y,[#rrggbb,](str)         相对于屏幕左上角的高级打印。

                                           以下例子打印“ Hello World!”,但使用变量作为坐标和颜色:

                                           var posX = 10
                                           var posY = 5
                                           var color = rainE1
                                           >`@posX@,@posY@,#@color@,Hello World!

>cX,Y,[#rrggbb,](str)         相对于屏幕中心的高级打印。类似于“>`”。注意,所有这些都是颜色选填的。
                                           本示例演示颜色如何为选填,默认为白色:
                                           >c0,0,Hello World!

>fX,Y,[#rrggbb,](str)          相对于目标敌人头部位置的高级打印。
                                           以下代码在目标敌人上绘制了红色十字准线:

                                           >f-2,0,#ff0000,ascii
                                           ##!
                                           -#·#-
                                           ##¡
                                           asciiend

var (variable)                    声明一个可以在数学,逻辑和字符串运算中使用的变量。

                                           例如:
                                           var message = Hello World!
                                           >@message@

func (function)                 声明一个可以在之后调用的函数。

                                           例如:
                                           func Print(message)
                                             >@message@
                                           Print(Hello World!)

for v = a..b                        创建一个循环,将变量v从值a迭代到值b。出现在循环范围内的代码将运行多次。
                                           例如:
                                           var a
                                           a = 0
                                           for i = 1..5
                                             a = a + i
                                           >a = @a@

import (script)                  加载并执行外部脚本的单个副本。

                                           这个示例导入的钓鱼小游戏位于
                                           (保存文件夹)/Stonescript/Fishing.txt

                                           import Fishing

new (script)                       加载并执行类似于“导入” 的外部脚本。但是,加载了“ new”的对象每个都是单独的副本,它们的脚本主体将只执行一次。

                                           本示例创建并打印一个矢量对象:

                                           var v = new Components/Vector
                                           v.Init(10, 5)
                                           >Vector = @v@

disable hud                       隐藏和禁用用户界面元素,包括:资源,生命值,能力按钮和暂停按钮。

enable hud                        返回由上一个“disable hud”命令隐藏的所有用户界面元素。

disable loadout print        隐藏打印输出消息。

enable loadout print         恢复打印输出消息

disable player                   隐藏玩家角色。对战斗没有影响,这仅仅是视觉效果。

enable player                    如果先前的“disable player”命令隐藏了玩家角色,则将其恢复。

play (sound)                      播放音效。

                                           例如:
                                           ?key = primary
                                             play buy

·:·:·比较·:·:·

与游戏状态结合使用来制定决策

=        比较数值是否相等,或字符串是否包含。如果是,则返回ture。
          例如:
          ?hp = maxhp
            loadout 2

!        比较数值是否相等,或字符串是否包含。如果否,则返回ture。

          例如:
          ?foe ! poison
            equipL sword

&       逻辑运算符“和”。

          例如:
          ?loc=caves & foe=boss

|         逻辑运算符“或”。如果“&”和“|” 混合在单个复杂的表达式中,所有的“&”优先。

          例如:
          ?foe=slow | foe.count>3
            activate potion

>        比较数值是否大于。可以结合关卡的难度,敌人的数量,健康状况等使用。
          例如:
          ?foe.count > 10
            equip shiny bardiche

<        比较数值是否小于。

          例如:
          ?hp < 6
            activate potion

>=      比较数值是否大于或者等于。“>”和“=”的组合成一个比较。
          以下两个示例是等效的:
          ?loc.stars >= 6
            equipR vigor shield

          ?loc.stars > 6 | loc.stars = 6
            equipR vigor shield

<=        比较数值是否小于或者等于。“<”和“=”的组合成一个比较。

          例如:
          ?hp <= 6
            activate potion

·:·:·变量·:·:·

变量是一种存储数值以备后用的方式。用关键字“var”声明一个新变量。

例如:

var myVar = 10

(myVar是变量的名称, 并为其初始赋值为10)

myVar = myVar + 5

(myVar现在等于15)

var secondVar = 3

myVar = myVar – secondVar

(许多变量可以在数学运算中组合。myVar现在等于12)

声明一个变量后,它仅被初始化一次,即第一次执行“ var”。

例如:

var i = 0

i++ 

>i = @i@

在此示例中,声明了变量“i”并为其初始赋值为0。在运行的每一帧期间,“i”的值增加1,然后打印到屏幕上。

仅当您离开某个位置并手动开始新的运行时,变量才会重置为其初始值。当衔尾蛇循环时,它们不会重置。

变量可以选择用引号声明为字符串类型的值。它可以带特殊符号和句尾空格。

例如:

var a = 10 

var b = 5 

var myVar = a + ” x ” + b + ” = ” + (a * b) 

>@myVar@

(此示例还演示了如何使用运算符’+’连接字符串)

导入脚本中的变量包含在这些脚本中,并且它们的名称不会与其他脚本中的变量或函数冲突。

·:·:·数学运算·:·:·

运算符对数字进行修改。可以与变量结合使用,也可以直接在游戏状态的表达式中使用。

+         将两个数字或变量相加。
            例如:
            var a = 2 + 3

            (a等于5)

–          将两个数字或变量相减。
            例如:
            ?hp < maxhp – 5
              equip vigor sword dL

*          将两个数字或变量相乘。
            例如:
            var a = 2
            var b = 5
            a = a * b
            (a等于10)

/           将一个数字或变量除以另一个。结果向下取整。 
            例如:
            var a = 8
            a = a / 4
            (a等于2)

++        变量自增。
            例如:
            var a = 3
            a++
            (a等于4)

—          变量自减。

            例如:
            var a = 3
            a–
            (a等于2)

%         取模。即给出将一个数字除以另一个数字后的余数。
            例如:
            var a = 5 % 4
            (a等于1)

            例如2:
            ?time % 8 < 4
              > \O)
            ?time % 8 > 3
              > (O/
            (这是在绘制动画表情符号)

( )            括号可用于更改运算的优先级。

            例如:
            var a = 2 * (3 – 1)
            (a等于4)

!        否定。在布尔表达式前面使用时反转该值。
            例如:
            ? !ai.enabled
              >未启用AI。

·:·:·函数·:·:·

当脚本变得越来越复杂时,自定义函数起到了重要的组织作用。它们减少脚本重复,使其更易于阅读。声明函数时,其内容不会立即执行。而在之后调用函数时,它内部的脚本才会执行。

本示例创建了一个每帧增加1的计数器。当按下任何自定义输入键时,调用函数ResetCounter(),而这个函数将使计数器值归零:

var count = 0

count++

>Counter = @count@


func ResetCounter()

  count = 0


?key=begin

  ResetCounter()

另一方面,函数可以返回一个值。在此示例中,我们声明一个简单的函数来计算在主要区域(即小怪区域)花了多长时间:

func NonBossDuration()

  return totalTime – time


var duration

duration = NonBossDuration()

>Time was: @duration@

函数还可以接受任意数量的参数/参量,从而使其功能更强大,并且可以对任意输入值进行操作。在这里,我们声明一个效用函数,该函数生成一个范围内的随机数,然后我们用它生成5到10之间的随机数:

func RandomRange(min, max)

  ?min >= max

    return min

  return min + rng % (max – min + 1)


var randomValue

randomValue = RandomRange(5, 10)

>RNG: @randomValue@

当引用属于外部脚本的变量时,可以在函数内部使用前缀“this”。“this”的使用是可选的,脚本变量可以由不带前缀的函数访问。但是,在以下示例中,变量“a”同时出现在函数的内部和外部,因此要使用“this.a”进行区分:

var a = 1

func TestScope(a)

  >Script var = @this.a@, function var = @a@


TestScope(3)

当函数调用其他函数或它们自身时,这将创建一个执行堆栈,该堆栈的大小可以建立,直到应用程序崩溃为止。为了保护计算机资源,Stonescript的堆栈限制为215,如果超出该限制,则会抛出错误。

·:·:·本机函数·:·:·

虽然可以定义函数,但Stonescript带有一组预定义/本机函数,其行为与命令相似,但不同之处在于它们按主题进行了分组,可以接受参数,有些还会返回值。

draw.Bg(x, y, color)                         设置屏幕上指定坐标的背景色。(没有返回值)
                                                          例如:
                                                          draw.Bg(5, 4, #red)

draw.Bg(x, y, color, w, h)                设置屏幕上指定矩形区域的背景色。(没有返回值)                                                          例如:
                                                          draw.Bg(5, 4, #cyan, 10, 6)

draw.Box(x, y, w, h, color, style)    在指定的位置绘制指定大小的矩形。矩形的边框取决于color和style号。负style号会使矩形的填充透明。警告:此时,高级打印始终画在盒子顶部。(没有返回值)

                                                          用此示例通过按键盘的[左]/[右]来查看不同的style号:

                                                          var style = 1
                                                          ?key = leftBegin
                                                            style–
                                                          ?key = rightBegin
                                                            style++
                                                          draw.Box(10, 5, 30, 15, #333333, style)
                                                          >`12,6,#ffffff,当前Style号:@style@
                                                          >`12,8,#888888,按左/右\n改变style号以查看

draw.Clear()                                     清空整个屏幕。(没有返回值)

draw.GetSymbol(x, y)                     返回屏幕位置的(x,y)的坐标。(返回字符串)

                                                          本示例选择一个屏幕坐标并在左上角绘制在那里找到的符号。选择[]可以由玩家被移动:

                                                          var s
                                                          var x = 20
                                                          var y = 10
                                                          var drawX
                                                          ?key=leftBegin
                                                             x–
                                                          ?key=rightBegin
                                                             x++
                                                          ?key=upBegin
                                                             y–
                                                          ?key=downBegin
                                                             y++
                                                          s = draw.GetSymbol(x, y)
                                                          >`0,1,Symbol = @s@
                                                          drawX = x – 1
                                                          >`@drawX@,@y@,[#]

draw.Player()                                   在脚本的特定位置绘制带有装备和插件的玩家角色。(没有返回值)

int.Parse(str)                                   将数字字符串转换为整数值。如果给定的字符串不是数字,则会抛出错误。(返回整数)

                                                          例如:
                                                          var s = “999”
                                                          var i = int.Parse(s)
                                                          i++

item.GetCooldown(str)                   返回给定技能的剩余冷却时间(以帧为单位)。有效的能力名称包括:“dash”,“bash”,“quarterstaff”,“ bardiche”和“ hatchet”。注意:无效的异能串将返回-1。来自尚未使用的武器的某些异能将返回-1。(返回整数)

                                                          例如:
                                                          ?foe = boss & item.GetCooldown(“bardiche”) <= 0
                                                            equip bardiche
                                                            activate R

loc.Leave()                                        离开关卡,就像玩家手动离开一样。(没有返回值)

loc.Pause()                                        游戏暂停,就像玩家手动暂停一样。(没有返回值)

math.Clamp(num, min, max)           将数字(num)限制在最小(min)和最大(max)范围内。如果该数字已经在该范围内,则它将返回而不会更改。(返回整数)

                                                          例如:
                                                          var number = 50
                                                          number = math.Clamp(number, 0, 10)
                                                          (number has been clamped down and will equal 10)

string.Size(str)                                将字符串变量作为参数,计算其长度(字符数)并返回。(返回整数)

                                                          例如:
                                                          var a = Hello World!
                                                          var size = string.Size(a)
                                                          >size = @size@

string.IndexOf(str, criteria)            将字符串变量和字符串条件作为参数,并找到条件在字符串内的位置。如果找不到,则返回-1。(返回整数)

                                                          例如:
                                                          var a = Hello World!
                                                          var index = string.IndexOf(a, llo)
                                                          (索引等于2)

string.IndexOf(str, criteria, startAt)    将字符串变量,字符串条件和起始索引作为参数。在字符串中查找条件的位置,但从“startAt”开始搜索。如果找不到,则返回-1。(返回整数)

                                                          例如:
                                                          var a = Hello World!
                                                          var index = string.IndexOf(a, llo, 4)
                                                          (索引等于-1,因为搜索从位置4开始,因此未找到“ llo”)

string.Sub(str, startAt)                   将字符串变量和起始索引作为参数,并从该点开始拆分字符串。(返回字符串)

                                                          例如:
                                                          var a = Hello World!
                                                          var subString = string.Sub(a, 6)
                                                          >substring = @subString@
                                                          (subString是”World!”)

string.Sub(str, startAt, length)       将字符串变量,起始索引和长度作为参数,并从该起始点分割字符串,并以给定的长度停止。(返回字符串)

                                                          例如:
                                                          var a = Hello World!
                                                          var subString = string.Sub(a, 6, 3)
                                                          >substring = @subString@
                                                          (subString是”Wor”)

Type(var)                                          计算变量的类型并以字符串形式返回。可能的类型包括’string’,’int’,’bool’,’function’,’object’和’null’。(返回字符串)

                                                          例如:
                                                          var a = 0
                                                          ?Type(a) = int

                                                          >变量a是整数

·:·:·导入外部脚本·:·:·

您的脚本不必全都放在意念石头中。Stonescript支持通过’import’和’new’关键字加载外部文件。为了使外部脚本起作用,它们必须位于您的保存文件文件夹中 / Stonescript文件夹内,并以“.txt”结尾。

在最基本的示例中,外部脚本被导入并像直接在您的意念石头中一样运行,就用这种便捷的方式来开发脚本:

import Rocky

import Deadwood

import Caves

import Forest

导入脚本后,会将其复制到其自己的容器中并作为参考返回。外部脚本中声明的变量是隔离的,并且不会与其他脚本中的变量交互。在此示例中,打印实用程序脚本提供了简化的服务:

// PrintUtil.txt

func LowerLeft(x, y, color, message)

  y = y + screen.h

  >`@x@,@y@,@color@,@message@

func LowerRight(x, y, color, message)

  x = x + screen.w

  y = y + screen.h

  >`@x@,@y@,@color@,@message@

// Main script in Mind Stone

var print = import PrintUtil

disable hud

print.LowerLeft(0,-1,#ffffff,”Health: ” + hp)

高级解决方案可以使用“new”命令多次导入相同的脚本,例如,以实现组件化或面向对象的范例:

// Vector.txt

var x = 0

var y = 0

func init(_x, _y)

  x = _x

  y = _y

func subtract(otherVect)

  x = x – otherVect.x

  y = y – otherVect.y

// Main script in Mind Stone

var vectFrom = new Components/Vector

var vectTo = new Components/Vector

vectFrom.init(5, 4)

vectTo.init(8, 2)

vectTo.subtract(vectFrom)

>x = @vectTo.x@, y = @vectTo.y@

外部脚本可以实现“ ToString()”功能,从而可以在高级打印命令中直接使用它们:

// Vector.txt

var x = 0

var y = 0

func init(_x, _y)

  x = _x

  y = _y

func ToString()

  return “(” + x + “, ” + y + “)”

// Main script in Mind Stone

var v = import Components/Vector

v.init(3,5)

>Vector = @v@

可以从子文件夹导入外部脚本:

import Games/Blackjack

import Cosmetics/PetFrog

import Cosmetics/Hats

虽然相似,但“导入”和“新”之间有两个重要区别。使用“导入”,每次都返回相同的对象。如果从多个位置导入相同的脚本,则它们都将使用相同的对象。使用“ new”导入的脚本是唯一的副本,但是它们的脚本主体将只运行1次,而不是每帧运行一次。

·:·:· ASCII-art ·:·:·

在Stonescript中,可以将自定义ASCII-art嵌入脚本中,并使用高级打印命令在屏幕上进行绘制。有几种方法可以执行此操作,并且某些字符具有特殊的功能:

#为空格,透明,不画。\n为换行符,使绘制继续在下一行。警告:\n是一个昂贵的操作,不应用于在大型绘图中断行,而是改用ascii/asciiend块。

方法1——高级打印

本示例在屏幕的左上方绘制一个绿色圆。.

>`1,0,#green,ascii

#.-.

(   ) 

#`-´ 

asciiend

方法2——变量

此示例将怪鱼图保存到变量中,然后将其绘制为红色,显示在屏幕的左上方。

var fishSprite

fishSprite = ascii

###(°_##

#_/_ o\#

#´  `'”#

asciiend

>`0,3,#red,@fishSprite@

·:·:· Loops ·:·:·

循环功能允许一段代码多次运行。要创建循环,请使用以下格式的’for’关键字:

for v = a..b

变量“ v”以值“ a”开始循环并增加值直到达到“ b”,然后循环结束:

for i = 1..5

  >`0,@i@,i = @i@

迭代变量“v”不应在“for”之前声明,而应包含在循环范围内。但是,可以在循环之前声明开始和结束值“a”和“ b”:

var min = 1

var max = 4

var sum

sum = 0

for j = min..max

  sum = sum + j

>sum = @sum@

循环也可以朝相反的方向使用负数:

var g

g = “”

for k = 5..-2

  g = g + k

>g = @g@

循环可以相互嵌套,也可以与数学表达式内联以形成复杂的算法:

for x = 1..9

  for y = x/2 .. x/2 + 6

    >`@x@,@y@,*

要尽早退出循环,请修改迭代变量,使其超出范围:

var n

n = “”

for i = 1..5

  ?i = 3

    i = -1

  n = n + i

>n = @n@

·:·:· 搜索过滤器 ·:·:·

这些在查看敌人时使用。

E.g.: 

?foe = insect | foe = poison

  loadout 3

poison

vigor

aether

fire

air

ice

arachnid

serpent

insect

machine

humanoid

elemental

boss

phase2

phase3

spawner

flying

slow

ranged

explode

swarm

unpushable

undamageable

magic_resist

magic_vulnerability

immune_to_stun

immune_to_ranged

immune_to_debuff_damage

immune_to_physical

*[number] star level of a location or item

+[number] enchantment bonus of an item

·:·:· 自定义输入 ·:·:·

Stonescript可以在游戏状态中使用?key读取玩家输入。这可以用来驱动高级行为,例如AI的不同模式,自定义输入允许在Stone Story之上创建全新的体验。

在此示例中,@符号可以像经典Rogue-like游戏中的主要角色一样在屏幕上移动。按键代码(leftBegin等)是指按钮的初始按下状态。

var x = 0

var y = 0

?key = leftBegin

  x–

  ?x < 0

    x = 0

?key = rightBegin

  x++ 

?key = upBegin

  y–
 

  ?y < 0

    y = 0

?key = downBegin

  y++

>`@x@,@y@,#ffffff,@

可用按键代码表(手机浏览可能会排本异常):

按住                按下                      松开                   电脑上默认键

——-               ———–                ———–             ——————

left                  leftBigin                 leftEnd               A 或 ←

right                rightBigin              rightEnd             D 或 →

up                   upBigin                 upEnd                W 或 ↑

down              downBigin            downEnd             S 或 ↓ 

primary           primaryBigin         primaryEnd         Return

back               backBigin              backEnd             X

ability1            ability1Bigin          ability1End         Shift

ability2            ability2Bigin          ability2End         Control

bumpL            bumpLBigin          bumpLEnd          Z

bumpR           bumpRBigin          bumpREnd         C        

·:·:· 提示 ·:·:·

  • 使用“?”比较(检查)而发生的情况时,空间(标识)很重要。

  • 可以在关卡运行时通过按键盘上的“M”来更改脚本。

  • 意念石头右上方的电源按钮可打开/关闭脚本。

  • 如果调用了多个装备命令,则以最后一个为准。

  • 该脚本每秒执行30次(每帧一次)。

  • 要尝试不同的脚本,建议将它们复制到外部文本编辑器(例如记事本)中。

  • 常用快捷键(例如Ctrl + A全选,Ctrl + C复制,Ctrl + V粘贴)很有用。

  • 在游戏中按住Tab键可为您提供有关游戏状态的大量信息,并显示近期的Stonescript错误列表。

  • 通过在文本中使用“ \ n”,可以将打印命令分成多行。

·:·:· 初始脚本 ·:·:·

import Fishing

?hp < 7

  activate potion

?loc = caves

  equipL sword

  equipR shield

  ?foe = boss

    equip crossbow

·:·:· 发展计划 ·:·:·

这些事情在计划之中,但是尚未加入:

永久变量,可在应用程序执行之间保留变量。钓鱼小游戏。

添加数学本机函数。

?has = potion    检查是否有可用的药水。

?has = (item)    检查是否配备了给定的物品。

?hasL = (item)   检查给定项目是否位于左侧。

?hasR = (item)  检查给定项目是否位于右侧。

颗粒物排放。

在关卡的开始用资源酿造一瓶药水。例如: brew wood stone.

数组/列表。

?foe.level – 目标敌人的等级/难度。

?foe.state (cast,perf,cooldown) – 目标敌人的当前攻击状态。

?foe.statetime – 目标敌人的攻击当前状态的已逝帧。

equipF (str) – equips an item to the Faerie.为精灵(?)装备一件物品。

foes – 40个以内的敌人列表

·:·:· 附录 – 音效 ·:·:·

Stonescript可以基于自定义逻辑播放游戏中的声音效果。

在此示例中,只要玩家失去生命,就会播放“unquip”声音:

var lasthp = hp 

?hp < lasthp

  play unequip

lasthp = hp

大多数声音具有随机播放或顺序播放的变化。如果同一声音在单帧中播放超过一次,则将被忽略。如果每秒播放5个以上的声音,它们将被限制。

一下是Stone Story RPG中可用声音的完整列表:

(太长了,全是一些音效的文件名,去原文查看吧。)

终于翻译完了,我还以为很简单,居然花了2天的(业余)时间。

比想象中的麻烦。

资源下载: