我很久没有玩过这个游戏了。我最近又开始玩了。我刚刚打中了这个想法,打开了自动化之路。
与一年前相比,《石器时代》增加了很多新东西,如连续两次挥舞斧头、新大斧等物品,以及超过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天的(业余)时间。
比想象中的麻烦。