Stone Story RPG

Stone Story RPG

Not enough ratings
Stonescript Manual (beta) на русском
By Cucumber_RU
Создал это руководство, потому что я тоже плох в английском. Приму все ошибки в комментариях.

Также другие руководства по теме:
Stonescript Manual - сюда можно отправиться
Stonescript Manual (beta) - вы здесь
   
Award
Favorite
Favorited
Unfavorite
О Stonescript
https://stonestoryrpg.com/stonescript/beta.html

v3.10.0 - 2022/02/13

Авторство Martian Rex, Inc. 2020
Перевод Cucumber_RU, AquiloSpiritus.

Используется в Камне Разума для автоматизации выбора снаряжения. Stonescript - очень простой, но мощный язык внутри Stone Story RPG[stonestoryrpg.com]

Нужна помощь? Хотите сотрудничать по скриптам? Посетите https://discord.gg/StoneStoryRPG

Цель хорошего скрипта - экипировать лучшие предметы по мере изменения состояния игры.
Это может быть так же просто, как автоматическая активация зелья, если у вас мало здоровья, или достаточно сложный, где бой оптимизирован до сверхчеловеческого уровня.
1. Пример
// Экипирует лопату для Скалистого плато. // В Пещерах Страха экипирует разгрузку 1, // но когда появляется босс, // то экипирует крюк-кошка и боевой молот 7 звёзд. // Для Призрачных залов экипирует две палочки, // указав яд для левой руки и // энергия для правой руки, однако // если сложность превышает 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
2. Основы
?
Проверяет логическое условие. Если 'Истина', выполняет указанные строки (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 для пещер
/* */
Блок комментария. Весь текст между символами не имеет логического эффекта при выполнении скрипта.
/* ?loc = caves loadout 1 */
Этот скрипт ничего не делает, так как всё находится внутри блока комментариев.
^
Продолжить предыдущую строку.
?loc=caves | ^loc = mine equip repeating // Это всё равно, так же как: ?loc=caves|loc=mine equip repeating
3. Состояние игры [1]
Они говорят вам, что происходит и что находится прямо перед игроком.

?loc
Текущая локация.
?loc = caves loadout 1
?loc.id
Уникальный идентификатор текущей локации.
var id id = loc.id >Исследуем @id@
?loc.name
Локализованное имя текущей локации.
var name name = loc.name >Исследуем @name@
?loc.stars
Сложность текущей локации.
?loc = caves ?loc.stars=4 loadout 1 ?loc.stars=5 loadout 2
?loc.begin
'Истина' только в первом кадре локации, когда time = 0, до запуска любого игрового симулятора. Полезно для счёта переменных.
var i ?loc.begin i = 0 ?loc = caves i = -100
?loc.loop
'Истина' в первом кадре после цикла Уроборос.
var loopCount = 0 ?loc.loop loopCount++
loc.bestTime⠀⠀⠀⠀⠀
Лучшее время завершения текущей локации (ваш рекорд, лучший счёт).
>`0,1,Лучшее время = ^ @loc.bestTime@ кадров
loc.averageTime
Среднее время завершения текущей локации. Среднее время для локации рассчитывается взвешенным образом, где последнее время завершения имеет большую ценность, а более ранние времена имеют прогрессивно меньшую ценность, чем они старше.
Примечание: 20 циклов достаточно что бы свести влияние, более старых, к нулю.
>`0,2,Среднее время = ^ @loc.averageTime@ кадров
?foe
Текущий противник нацеленный игроком.
?foe = boo equip vigor staff
?foe.name
Локализованное имя противника, на которого нацелен игрок.
?foe.distance
Расстояние между игроком и противником.
?foe.count
Количество врагов в пределах 46 единиц.
?foe.hp
Текущее здоровье противника, на которого нацелен игрок.
?foe.maxhp
Максимальное здоровье противника, на которого нацелен игрок.
?foe.armor
Текущая броня противника, на которую нацелен игрок.
?foe.maxarmor
Максимальная броня противника, на которого нацелен игрок.
?foe.buffs.count
Количество бафов (положительных эффектов) на нацеленном противнике.
?foe.buffs.string
Сводная информация обо всех бафов нацеленного противника.
?foe.buffs.count > 0 >`0,3,Бафы противника = @foe.buffs.string@
?foe.debuffs.count
Количество дебафов (негативных эффектов) на нацеленном противнике.
?foe.debuffs.string
Сводная информация обо всех дебафов нацеленного противника.
?foe.debuffs.count > 0 >`0,4,Дебафы противника = @foe.debuffs.string@
?foe.state
Число, представляющее текущее состояние нацеленного противника.
?foe.state = 0 >`0,0,Противник спит
?foe.time
Прошедшее количество кадров в текущем состоянии нацеленного противника.
>`0,0,Противник = @foe.name@:@foe.state@,@foe.time@
?foe.level
Уровень нацеленного противника.
>`0,0,Противник = @foe.name@ имеет уровень @foe.level@
?item.left
Предмет в левой руке.
>`0,1,В левой:@item.left@ >`0,2,В правой:@item.right@
?item.right
Предмет в правой руке
?item.right = quarterstaff activate R
?item.left.id
?item.right.id
ID предмета, экепированного в левую или правую руку.
>`0,1,Left ID:@item.left.id@ >`0,2,Right ID:@item.right.id@
?item.potion
Зелье, которое варится в котле в данный момент. Добавляет 'auto', если в Котле включено автоматическое пополнение.
?item.potion ! empty & item.potion = auto activate potion
?harvest
Следующий объект, который можно добыть, к примеру дерево(Tree) или валун(Boulder).
?harvest=Boulder equip shovel
?harvest.distance
Расстояние между игроком и ближайшим добывающим объектом.
?loc=Rocky & harvest.distance < 7 equip shovel
?pickup
Текущий собираемый объект нацеленный игроком.
?pickup equip star stone : loadout 1
?pickup.distance
Расстояние между игроком и выбранным собираемым объектом.
?time
Номер текущего кадра локации.
?time % 300 = 0 >Каждые 10 секунд ты будешь видеть это сообщение
?totaltime
Текущий номер кадра локации, накопленный в случае локации босса.
>`0,0,Текущее время = @totaltime@ кадров
?hp
Текущее здоровье игрока.
?maxhp
Максимальное здоровье игрока.
?armor
Текущая броня игрока, округленная вниз.
например: если броня говорит [2.4], то ?armor равен 2.
?armor.f
Текущая дробная броня игрока.
например: если броня говорит [2.4], то ?armor.f равен 4.
?maxarmor
Максимальная броня игрока.
?buffs.count
Количество бафов на данный момент на игроке.
?buffs.string
Сводная информация обо всех бафов игрока.
?buffs.count > 0 >`0,1,Бафы игрока = @buffs.string@
?debuffs.count
Количество дебафов на данный момент на игроке.
?debuffs.string
Сводная информация обо всех дебафов игрока.
?buffs.count > 0 >`0,1,Дебафы игрока = @buffs.string@
?pos.x
Текущая позиция X игрока.
?pos.y
Текущая позиция Y игрока.
?pos.z
Текущая позиция Z игрока.
?ai.enabled
'Истина', если AI включен, 'Ложь', если AI выключен, например, во время катсцены.
?ai.paused
'Истина', если ИИ временно приостановлен, например, в ожидании падения сокровища.
?ai.idle
'Истина', если игрок бездействует, ожидая завершения чего-либо, например, атаки.
?ai.walking
'Истина', если игрок движется.
?face
Текущее выражение лица игрока.
?face = "^^" >Счастливый
?key
Состояние пользовательского ввода игры (cсылка на 15 пункт).
// Печатает текущий ввод >@key@
?res.stone
?res.wood
?res.tar
?res.ki
?res.bronze
Текущее количество ресурсов игрока в его инвентаре.
?loc = Deadwood >Дерево = @res.wood@
?player.direction
Показывает направление, в которое смотрит игрок. Возвращает значение 1 для правого и -1 для левого направления.
?player.direction = 1 >`0,0,Идёт вправо : >`0,0,Идёт влево
player.name
Имя выбранное игроком.
// Рисует имя игрока над головой var name var x name = player.name x = string.Size(name) / -2 >o@x@,-2,@name@
?totalgp
Суммарное количество "Очков снаряжения" в инвентаре, калькулированное с звёздных уровней предметов и бонусов чар.
>Мои очки снаряжения = @totalgp@
3. Состояние игры [2]
?rng
Возвращает случайное число в диапазоне от 0 до 9999.
?rng < 5000 >Heads! : >Tails!
Генерирует случайное число между 5 и 24:
var min = 5 var max = 24 var n = min + rng % (max - min + 1)
?rngf
Возвращает случайное число с плавающей запятой в диапазоне от 0 до 1.
>Случайное число с плавающей точкой = @rngf@
Генерирует случайное число с плавающей запятой между 5,0 и 24,0:
var min = 5.0 var max = 24.0 var n = min + (max - min) * rngf
?input.x
Позиция X в сетке ASCII устройства ввода (мышь/касание).
?input.y
Позиция Y в сетке ASCII устройства ввода (мышь/касание).
> (@input.x@, @input.y@)
?screen.i
Положение экрана в игре, как индекс, который увеличивается, когда игрок достигает правой стороны и он скользит.
>`0,0,Индекс экрана = @screen.i@
?screen.x
Положение экрана в игре.
>`0,0,Позиция X экрана = @screen.x@
?screen.w
Ширина сетки ASCII экрана.
var sw = screen.w >Ширина экрана = @sw@
?screen.h
Высота сетки ASCII экрана.
var sh = screen.h >Высота экрана = @sh@
time.ms
Время Unix представляет собой количество миллисекунд, прошедших с момента
1970-01-01T00:00:00Z (1 января 1970 г., 00:00 UTC). Не учитываются високосные секунды.
>@time.ms@
time.year
time.month
time.day
time.hour
time.minute
time.second
Локальное время на компьютере.
>`0,0,@time.year@/@time.month@/@time.day@ ^ @time.hour@:@time.minute@:@time.second@
utc.year
utc.month
utc.day
utc.hour
utc.minute
utc.second
Текущее время UTC.
var utcZ = utc.year*356*12*24*30 + ^utc.month*12*24 + utc.day*24+utc.hour var timeZ = time.year*356*12*24*30 + ^time.month*12*24 + time.day*24+time.hour var timeZone = timeZ - utcZ ?timeZone < 0 >`0,0,Часовой пояс: UTC@timeZone@ : >`0,0,Часовой пояс: UTC+@timeZone@
4. Команды
Они говорят игре сделать что-то.

activate (ability)
Активирует способность предмета. (ability) может иметь следующие значения: potion, P, left, L, right, R.
activate R
Активирует способность предмета, экипированного с правой стороны, такого как Топор
brew (ingredients)
Наполняет бутылку с зельем указанной комбинацией ингредиентов. Выполняется только в начале прохождения, в момент времени 0. Ингредиенты могут быть камнем(stone), деревом(wood), смолой(tar) или бронзой(bronze) и должны быть разделены +. Названия ингредиентов могут быть написаны на английском языке или на языке, выбранном в настройках.
?loc.begin brew bronze + tar
equip (str)
Экипирует предмет. (str) имеет ограничение в 7 критериев. Принимает, локализованное имя, отображаемое в инвентаре. Двуручные предметы должны использовать эту форму команды экипировки.
equip vigor crossbow *8 +5
equipL (str)
Экипирует предмет левой рукой.
equipL poison sword
equipR (str)
Экипирует предмет в правую руку.
equipR vigor shield
equip @var@
Оснащает предмет на основе критериев из строковой переменной. Экипировка и другие команды поиска предметов поддерживают критерии вычитания.
var weaponName = "poison sword *10 -big" equipR @weaponName@
loadout⠀(n)⠀⠀⠀⠀⠀⠀⠀
Экипирует конкретный номер разгрузки.
?loc = caves loadout 1 ?loc = deadwood loadout 2
> (str)
Печатает строку в верхней части экрана.
>Hello World!
> @varName@
Печатает строку со значением вставленной переменной. Несколько переменных могут быть вставлены в одну печать. Чтобы вставить, окружите имя переменной @.
В следующем примере выводится информация о текущем противнике:
var foeInfo foeInfo = foe >Противник = @foeInfo@
>(abcd
Показывает пользовательское выражение лица на игроке.
>( OwO
>oX,Y, [#rrggbb,] (str)
Продвинутая печать относительно положения головы игрока. X и Y - смещения координат. #rrggbb - это цвет текста в шестнадцатеричном формате[htmlcolorcodes.com]
Цвет также можно установить с помощью следующих констант: #white, #cyan, #yellow, #green, #blue и #red. Для печати в радуге используйте #rainFF, где последние 2 символа определяют яркость.
В следующем примере написано "Let's Go!" красным шрифтом относительно позиции игрока, 6 слева и 3 вниз:
>o-6,3,#ff0000,Let's go!
>hX,Y, [#rrggbb,] (str)
Однако, как и "> o", рисует на том же слое, что и Большая Голова. Идеально подходит для аксессуаров, таких как шляпы.
Следующее рисует желтую шляпу на игроке. Требуется большая голова:
>h-2, -4,#ffff00,\n ^##_\n ^#| |\n ^_|_|_
>`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, ^##!\n ^-#·#-\n ^##¡
var (variable)
Объявляет переменную (ссылка на пункт 6), которая может использоваться в математических, логических и строковых операциях.
var message = Hello World! >@message@
func (function)
Объявляет функцию (ссылка на пункт 8), которая может быть вызвана позже.
func Print(message) >@message@ Print("Hello World!")
for v = a..b
Создает цикл (ссылка на пункт 12), который перебирает переменную 'v' от значения 'a' до значения 'b'. Код, который появляется внутри области видимости цикла, будет выполняться несколько раз.
var a a = 0 for i = 1..5 a = a + i >a = @a@
import (script)
Загружает и выполняет внешний скрипт (ссылка на пункт 10).
В этом примере импортируется мини-игра о рыбалке, расположенная по адресу
(save-file folder)/Stonescript/fishing.txt
import fishing
new (script)
Загружает и выполняет внешний скрипт (ссылка на 10 пункт), похожий на 'import'. Однако каждый объект, загруженный с помощью 'new', является отдельной копией, и его тело скрипта будет выполняться только один раз.
Этот пример создает и печатает векторный объект:
var v = new Components/Vector v.Init(10, 5) >Vector = @v@
disable abilities
Предотвращает активацию способностей зелий и оружия. Также серые кнопки HUD.
enable abilities
Восстанавливает активацию способностей, которые были отключены предыдущим вызовом «отключить способности»."disable abilities".
disable banner
Предотвращает отображение горизонтального баннера, который появляется с названием местоположения в начале и в конце местоположения.
enable banner
Восстанавливает отрисовку горизонтального баннера с названием местоположения.
disable hud
Скрывает и отключает элементы пользовательского интерфейса, включая: ресурсы, точки попадания, кнопки способностей и кнопку паузы.
enable hud
Возвращает все элементы пользовательского интерфейса, скрытые предыдущей командой 'disable hud'.
disable loadout print
Скрывает сообщения, которые появляются при отзыве загрузки.
enable loadout print
Возвращает печать сообщений о загрузке.
disable loadout input
Предотвращает сохранение или вызов снаряжения оружия с помощью клавиш ввода.
enable loadout input
Восстанавливает сохранение или вызов снаряжения оружия с помощью клавиш ввода.
disable pause
Скрывает пользовательский интерфейс кнопки паузы. Пауза по-прежнему доступна с помощью сочетания клавиш [P].
enable pause
Возвращает кнопку паузы, скрытую предыдущей командой «отключить паузу».
disable player
Скрывает игрока. Не влияет на бой, это только косметика.
enable player
Возвращает рендеринг игрока, если он был скрыт предыдущей командой 'disable player'.
play (sound)
Воспроизводит звуковой эффект (см Приложение - Звуковые Эффекты) с необязательным значением высоты тона. Значение высоты тона по умолчанию равно 100, при этом более высокие числа увеличивают высоту тона, а меньшие уменьшают.
?key = primary play buy ?key = up play buy 200
var pitch ?time%30 = 0 pitch = rng/100 + 50 >@pitch@ play buy @pitch@
5. Фильтры поиска
Они используются при оценке состояния игры.
?foe = insect | foe = poison loadout 3
  • poison // яд
  • vigor // энергия
  • aether // эфир
  • fire // огонь
  • air // воздух
  • ice // лёд
  • arachnid // паукообразный
  • serpent // змея
  • insect // насекомое
  • machine // механизм
  • humanoid // человекообразный
  • elemental // элементаль
  • boss // босс
  • phase1 // Фаза 1 Босса
  • phase2 // Фаза 2 Босса
  • phase3 // Фаза 3 Босса
  • spawner // спавнер
  • flying // летающий
  • slow // медленный
  • ranged // дально-атакующий
  • explode // взрывной
  • swarm // рой-стая
  • unpushable // в состоянии нетолкаемости
  • undamageable // в состояние не получения урона
  • magic_resist // сопротивление магии
  • magic_vulnerability // уязвимость к магии
  • immune_to_stun // иммунитет к стану
  • immune_to_ranged // иммунитет к дальнему урону
  • immune_to_debuff_damage // иммунитет к дебаффу урона
  • immune_to_debuff_dot // иммунитет к дебаффу поджога
  • immune_to_debuff_chill // иммунитет к дебаффу холода
  • immune_to_Vigor // иммунитет к энергии
  • immune_to_physical // иммунитет в физическому урону
  • *[number] // звёздный уровень локации или предмета
  • +[number] // бонус чар предмета
6. Сравнения
Используется в сочетании с состоянием игры для принятия решений.

=
Сравнивает значения равные или строка содержит.
?hp = maxhp loadout 2
!
Сравнивает значения не равные или строка не содержит.
?foe ! poison equipL sword
&
Логический оператор И.
?loc=caves & foe=boss
|
Логический оператор ИЛИ. Если '&' и '|' смешиваются в одном сложном выражении, все '&' работают в первую очередь.
?foe=slow | foe.count>3 activate potion
>
Больше чем равно. Может использоваться с трудностью локации, количеством врагов, здоровьем и т. Д.
?foe.count > 10 equip bardiche
<
Меньше чем равно.
?hp < 6 activate potion
>=
Больше или равно. Сочетание '>' и '=' в одном сравнении.
// Следующие два примера равнозначны ?loc.stars >= 6 equipR vigor shield ?loc.stars > 6 | loc.stars = 6 equipR vigor shield
<=
Меньше или равно. Сочетание '<' и '=' в одном сравнении.
?hp <= 6 activate potion
7. Переменные
Переменные - это способ хранения значения для последующего использования. Объявите новую переменную с ключевым словом 'var'.

var myVar = 10
myVar - это имя переменной, которая равняется значению 10.

myVar = myVar + 5
myVar сейчас равен 15.

var secondVar = 3 myVar = myVar - secondVar
Многие переменные могут быть объединены в математических операциях. myVar теперь равен 12.

Когда переменная объявлена, она имеется только один раз в начале цикла.

var i = 0 i++ >i = @i@
В этом примере переменная 'i' объявляется и начинается со значения 0. Во время каждого кадра цикла значение 'i' увеличивается на 1 и затем выводится на экран.

Переменные сбрасываются к своему начальному значению только в том случае, если вы покидаете местоположение и начинаете новый запуск вручную. Они не сбрасываются, когда начинается новый круг Уроборос.

Строковые переменные могут быть объявлены в кавычках. Это включает специальные символы и завершающие пробелы.
var a = 10 var b = 5 var myVar = a + " x " + b + " = " + (a * b) >@myVar@
(Этот пример также демонстрирует, как соединять строки с помощью оператора '+')

Переменные в импортированных скриптах содержатся в этих скриптах, и их имена не будут конфликтовать с переменными или функциями в других скриптах.
8. Математические операции
Операторы изменяют числа. Может использоваться в сочетании с переменными или непосредственно в выражениях состояния игры.

+
Добавляет два числа или переменные вместе.
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 = 5.0 a = a / 2 // a равен 2.5
++
Увеличивает переменную.
var a = 3 a++ // a равен 4
--
Уменьшает переменную.
var a = 3 a-- // a равен 2
%
Модуль. Даёт остаток от деления одного числа на другое.
var a = 5 % 4 // a равен 1
?time % 8 < 4 > \0) ?time % 8 > 3 > (0/ // это рисует анимированное эмодзи
(⠀)
Скобки могут быть использованы для определения приоритетов операций.
var a = 2 * (3 - 1) // a равен 4
!
Отрицание. Инвертирует значение при использовании перед логическим выражением.
? !ai.enabled >ИИ не включён.
9. Функции
Функции служат важной организационной цели для сценариев по мере их усложнения. Они облегчают чтение сценариев и сокращают повторения. Когда функция объявлена, её содержимое не выполняется немедленно. Вместо этого строки скрипта внутри функции выполняются, когда функция вызывается на более позднем этапе.

В этом примере создается счетчик, который увеличивается на 1 каждый кадр. При нажатии любой пользовательской клавиши ввода вызывается ResetCounter() и значение счетчика возвращается к нулю:
var count = 0 count++ >Counter = @count@ func ResetCounter() count = 0 ?key=begin ResetCounter()

Другой аспект функций заключается в том, что они могут возвращать значение. В этом примере мы объявляем простую функцию, которая вычисляет продолжительность основного местоположения (не босса):
func NonBossDuration() return totalTime - time var duration = 0 duration = NonBossDuration() >Time was: @duration@

Функции также принимают любое количество аргументов/параметров, делая их еще более мощными, с возможностью работы с произвольным вводом. Здесь мы объявляем вспомогательную функцию, которая генерирует случайное число в пределах диапазона, а затем используем его для генерации случайных чисел от 5 до 10:
func RandomRange(min, max) ?min >= max return min return min + rng % (max - min + 1) var randomValue = 0 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)

Когда функции вызывают другие функции или сами себя, это создает стек выполнения, который может увеличиваться в размере до сбоя приложения. Для защиты ресурсов компьютера Камень Разума имеет ограничение стека 215 и выдает ошибку, если предел превышен.
10. Встроенные функции [Игровое]
Хотя сценарии могут определять свои собственные функции, Камень разума поставляется с набором предопределенных/собственных функций, которые ведут себя подобно командам, но отличаются тем, что они более четко сгруппированы по темам, могут принимать параметры и иногда возвращать значение.

ambient
?ambient
Возвращает строку
Возвращает разделенный запятыми список всех активных идентификаторов окружающего звука.
>`0,0,Ambient Layers = @ambient@
ambient.Add(str)
Нет возвращаемого значения
Добавляет слой окружающего звука с заданным идентификатором звука. До 4 слоев. Если добавляется 5-й слой, самый старый слой удаляется.
?loc.begin ambient.Add(ambient_crypt)
ambient.Stop()
Нет возвращаемого значения
Очищает все окружающие слои.
?time = 3 ambient.Stop() ambient.Add(ambient_mines)

draw
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)
Нет возвращаемого значения
Рисует прямоугольную форму в указанном положении и размере. Граница прямоугольника определяется цветом и номером стиля. Отрицательные числа стиля делают центр прямоугольника прозрачным. Примечание - В настоящее время продвинутые отпечатки всегда рисуются поверх box.
Используйте этот пример для изучения различных стилей, нажимая на стрелках влево/вправо
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,Press Left/Right\nto change 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()
Нет возвращаемого значения
Рисует персонажа игрока со всем оборудованием и надстройками в определенной точке сценария.

item
item.CanActivate()
Возвращает логическое значение
Возвращает 'Истину', если можно активировать способности предмета. В противном случае 'Ложь'. В некоторых игровых ситуациях активация способностей отключена, даже если они не находятся на перезарядке, например, за мгновение до боя с боссом или во время кинематографического фильма.
?item.CanActivate() equip Bardiche activate R
item.CanActivate(str)
Возвращает логическое значение
Возвращает true, если возможно активировать определенный элемент. Будет истиной только в том случае, если предмет экипирован. Некоторые предметы могут иметь механику, которая не позволяет их активировать, если не соблюдены определенные критерии. Это подмножество item.GetCooldown(), так как время перезарядки предмета может быть равно нулю, и его нельзя активировать, но никогда нельзя будет активировать предмет, находящийся на перезарядке.
equip bardiche ?item.GetCooldown("skeleton_arm") <= 0 equip skeleton arm ?item.CanActivate("skeleton_arm") activate R
item.GetCooldown(str)
Возвращает целое число
Возвращает оставшееся время восстановления (в кадрах) для данной способности.
?foe = boss & item.GetCooldown("bardiche") <= 0 equip Bardiche activate R
В следующей таблице перечислены все доступные имена способностей. Примечание: неверные строки способностей вернут -1. Некоторые способности еще не использованного оружия вернут -1.
Предмет
ID перезарядки
Бердыш
"bardiche"
Таранный щит
"bash"
Стремительный щит
"dash"
Топор
"hatcher"
Камень Разума
"mind"
Квотерстафф
"quarterstaff"
Клинок павшего бога
"blade"
item.GetCount(str)
Возвращает целое число
Возвращает количество копий предмета в инвентаре. Возвращает 0, если элемент не найден.
var searchCriteria = "sword *0 -big -socket" var swordCount = item.GetCount(searchCriteria) >I have @swordCount@ basic swords

loc
loc.Leave()
Нет⠀возвращаемого⠀значения
Вызывает отказ от пробега, как если бы игрок нажал, чтобы уйти вручную.
loc.Pause()
Нет возвращаемого значения
Вызывает приостановку прогона, как если бы игрок нажал кнопку паузы вручную.
10. Встроенные функции [Математика]
int
int.Parse(str)
Возвращает целое число
Преобразует строку числа в целочисленное значение. Если данная строка не является числом, выдается ошибка.
var s = "999" var i = int.Parse(s) i++

math
Математический API работает как с целыми числами, так и с числами с плавающей запятой (float). Когда число обозначается десятичной точкой, подразумевается, что оно является числом с плавающей запятой (например, var a = 0,5). Если десятичного числа нет, то оно рассматривается как целое (например, var a = 2).
math.Abs(num)
Возвращает число
Возвращает модуль числа.
var number = -2 number = math.Abs(number) // number now equals 2
math.Sign(num)
Возвращает число
Возвращает -1, если заданное число отрицательное. В противном случае возвращает 1.
var sign = math.Sign(-21) var n = 10 * sign // n equals -10
math.Min(num1, num2)
Возвращает число
Возвращает наименьшее из двух чисел.
var number = math.Min(3, 10) // number equals 3
math.Max(num1, num2)
Возвращает число
Возвращает наибольшее из двух чисел.
var number = math.Max(3, 10) // number equals 10
math.Clamp(num, min, max)
Возвращает число
Содержит число в диапазоне от 'минимум' до 'максимум'. Если число уже находится в пределах диапазона, оно будет возвращено без изменения.
var number = 50 number = math.Clamp(number, 0, 10) //число ограничили до 10
math.Round(num)
Возвращает число
Округляет число до ближайшего целого числа.
var number = math.Round(2.7) // number equals 3.0
math.RoundToInt(num)
Возвращает целое число
Округляет число до ближайшего целого числа.
var number = math.RoundToInt(2.7) // number equals 3
math.Floor(num)
Возвращает число
Округляет число в меньшую сторону до первого меньшего целого числа.
var number = math.Floor(2.7) // number equals 2.0
math.FloorToInt(num)
Возвращает целое число
Округляет число в меньшую сторону до первого меньшего целого числа.
var number = math.FloorToInt(2.7) // number equals 2
math.Ceil(num)
Возвращает число
Округляет число в большую сторону до первого целого числа, большего его.
var number = math.Ceil(4.2) // number equals 5.0
math.CeilToInt(num)
Возвращает целое число
Округляет число в большую сторону до первого целого числа, большего его.
var number = math.CeilToInt(4.2) // number equals 5
math.Lerp(a, b, t)
Возвращает число
Выполняет линейную интерполяцию от значения a до b в момент времени (в процентах) t.
var number = math.Lerp(0.0, 20.0, 0.75) // number equals 15.0
var n = 0.0 ?key = Begin n = 0.0 n = math.Lerp(n, 100, 0.02) >n = @n@ // Переменная n уменьшается до 100, на 2% за кадр. При нажатии клавиши сбрасывается
math.Log(num, base)
Возвращает число
Возвращает логарифм числа по заданному основанию.
var number = math.Log(5, 2) // number equals 2.321928
math.Pow(num, p)
Возвращает число
Возвращает число, возведенное в степень.
var number = math.Pow(3, 2) // number equals 9
math.Sqrt(num)
Возвращает число
Возвращает квадратный корень числа.
var number = math.Sqrt(9) // number equals 3
math.pi
Возвращает число с
плавающей запятой
(float)
Константа π, приблизительно равная 3,1415926.
>PI = @math.pi@ // prints the value of π to the screen
math.ToDeg(num)
Возвращает число
Преобразовывает число радиан в градусы.
var number = math.ToDeg(2 * math.pi) // number equals 360
math.ToRad(num)
Возвращает число
Преобразует число градусов в радианы.
var number = math.ToRad(360) // number equals 2π
math.Acos(num)
Возвращает число
Возвращает арккосинус числа в радианах. Границы ввода: от -1 до 1. Если входное значение выходит за пределы, возвращается «NaN».
var number = math.Acos(-1) // number equals π
math.Asin(num)
Возвращает число
Возвращает арксинус числа в радианах. Границы ввода: от -1 до 1. Если входное значение выходит за пределы, возвращается «NaN».
var number = math.Asin(1) // number equals π/2
math.Atan(num)
Возвращает число
Возвращает арктангенс числа в радианах.
var number = math.Atan(2) // number equals 1.107149
math.Cos(num)
Возвращает число
Возвращает косинус заданного угла в радианах.
var number = math.Cos(0) // number equals 1
math.Sin(num)
Возвращает число
Возвращает синус заданного угла в радианах.
var number = math.Sin(math.pi / 2) // number equals 1
math.Tan(num)
Возвращает число
Возвращает тангенс заданного угла в радианах.
var number = math.Tan(2) // number equals -2.18504
10. Встроенные функции [Окружение]
music
?music
Возвращает строку
Возвращает идентификатор воспроизводимой в данный момент музыки.
>`0,0,Current Music = @music@
music.Play(str)
Нет возвращаемого значения
Воспроизведение музыки с заданным идентификатором звука. Одновременно может играть только одна музыка.
?loc.begin | loc.loop music.Play(temple_0)
music.Stop()
Нет возвращаемого значения
Останавливает всю музыку.
?!string.Equals(music, "") music.Stop()

player
player.ShowScaredFace(num)
Нет возвращаемого значения
Если у игрока включена большая голова, выражение его лица изменится на испуганное в течение заданного периода времени.
?key = primaryBegin player.ShowScaredFace(1)

screen
screen.FromWorldX(int)
возвращает целое число
Преобразует значение по оси X из мирового пространства в ось X экранного пространства.
screen.FromWorldZ(int)
возвращает целое число
Преобразует значение из оси Z мирового пространства в ось Y экранного пространства.
var x var y x = screen.FromWorldX(pos.x) y = screen.FromWorldZ(pos.z - pos.y) >`0,1,Player position on screen: @x@,@y@
screen.ToWorldX(int)
возвращает целое число
Преобразует значение по оси X из экранного пространства в мировое пространство.
screen.ToWorldZ(int)
возвращает целое число
Преобразует значение из оси Y экранного пространства в ось Z мирового пространства.
var x var y var z x = input.x y = input.y >`0,1,Screen position of cursor: @x@,@y@ x = screen.ToWorldX(input.x) z = screen.ToWorldZ(input.y) >`0,2,World position of cursor: @x@,@z@
screen.Next()
Нет возвращаемого значения
Для многоэкранных локаций камера перемещается на один экран вперед по отношению к игроку.
?key = rightBegin screen.Next()
screen.Previous()
Нет возвращаемого значения
Для многоэкранных локаций камера перемещается на один экран назад по отношению к игроку.
?key = leftBegin screen.Previous()
screen.ResetOffset()
Нет возвращаемого значения
Сбрасывает камеру, чтобы она следовала за игроком, отменяя изменения, сделанные screen.Next() и screen.Previous().
var lastScreenI = -1 ?lastScreenI ! screen.i screen.ResetOffset() lastScreenI = screen.i
10. Встроенные функции [Хранилище]
storage
Значения, сохраненные в постоянном хранилище, сохраняются, когда вы покидаете место, а также когда игра закрывается. Они не являются частью вашего primary_save, а существуют в виде серии отдельных файлов в папке Stonescript. Импортированные скрипты получают доступ к хранилищу изолированно друг от друга, что позволяет различным модулям использовать одни и те же ключи без изменения данных друг друга.
storage.Delete(string)
Нет возвращаемого значения
Удаляет любое значение, которое может существовать в указанном ключе.
storage.Delete("highscore")
storage.Get(string)
Возвращает значение
Извлекает постоянное значение, хранящееся в указанном ключе.
var value = storage.get("higscore") ?value >Рекорд = @value@ : >Рекорд не найден
storage.Get(string, value)
Возвращает значение
Извлекает постоянное значение, хранящееся в указанном ключе. Если он не найден, возвращает второй параметр как значение по умолчанию.
var value = storage.Get("highscore", 0) >Рекорд = @value@
storage.Has(string)
Возвращает логическое значение
Возвращает 'Истину', если указанный ключ существует в постоянном хранилище; иначе 'Ложь'.
?storage.Has("highscore") var value = storage.Get("highscore") >Рекорд = @value@ : >Рекорд не найден.
storage.Incr(string)
Возвращает целое число
Увеличивает на 1 значение, хранящееся в указанном ключе, затем возвращает новое значение.
?gameOver storage.Incr("stat_TimesPlayed")
storage.Incr(string, integer)
Возвращает целое число
Увеличивает значение, хранящееся в указанном ключе, на заданную величину, а затем возвращает новое значение.
var amount ?foundCoins amount = rng%5 + 5 storage.Incr("coins", amount)
storage.Set(string, integer)
Нет возвращаемого значения
Сохраняет значение в постоянное хранилище по указанному ключу.
var score = 1000 storage.Set("highscore", score)
10. Встроенные функции [Текст]
string
string.Break(string, integer)
Возвращает массив
Разбивает строку на несколько строк, учитывая максимальную ширину.
var s = "The brown fox jumped over the lazy dog" var a = string.Break(s, 14) for i = 0 .. a.Count()-1 >`0,@i@,@a[i]@
string.Capitalize(str)
Возвращает строку
Преобразует первую букву строки в верхний регистр.
var a = "foo" a = string.Capitalize(a) >@a@ (Prints "Foo")
string.Equals(str1, str2)
Возвращает логическое значение
Принимает два строковых параметра и возвращает 'Истина', если они в точности совпадают. В противном случае возвращает 'Ложь'. Деликатный случай.
var a = "foo" ?string.Equals(a, "foo") >Эти строки равны : >Эти строки НЕ равны (Строки в этом случае равны. string.Equals() возвращает 'Истина')
string.Format(str1, ...)
Возвращает строку
Изменяет строку, заменяя шаблоны формата значениями других параметров, а затем возвращает окончательную составленную строку. Это мощная функция, которая поддерживает множество параметров форматирования.
var str = "My name is {0} and I have {1} power!" var result = string.Format( ^ str, ^ player.name, ^ totalgp ^) >@result@
string.IndexOf(var, criteria)
Возвращает целое число
Принимает строковую переменную и строковые критерии в качестве параметров и находит положение критериев внутри строки. Возвращает -1, если не найдено.
var a = Hello World! var index = string.IndexOf(a, llo) (index равен 2)
string.IndexOf(var, criteria, startAt)
Возвращает целое число
Принимает строковую переменную, строковый критерий и начальный индекс в качестве параметров. Находит позицию критерия внутри строки, но начинает поиск в startAt. Возвращает -1, если не найдено.
var a = Hello World! var index = string.IndexOf(a, llo, 4) //(индекс равен -1, потому что поиск начался с позиции 4, поэтому 'llo' не был найден)
string.Join(s, [])
string.Join(s, [], int)
string.Join(s, [], int,int)
Возвращает строку
Берет массив строк [] и объединяет его в одну строку с разделителем s. Можно передать необязательные целочисленные параметры, которые определяют начальный индекс и количество элементов для объединения. Если параметры индекса не указаны, объединяется весь массив.
var a = ["Hello", "World", "!"] var b = string.Join(";", a) >`0,0,@b@ // Prints "Hello;World;!"
var a = ["Hello", "World", "!"] var b = string.Join(";", a, 1) >`0,0,@b@ // Prints "World;!"
var a = ["Hello", "World", "!"] var b = string.Join(";", a, 0, 2) >`0,0,@b@ // Prints "Hello;World"
string.Size(str)
Возвращает целое число
Принимает строковую переменную в качестве параметра и вычисляет ее длину в количестве символов.
var a = Hello World! var size = string.Size(a) >Размер = @size@
string.Split(str)
string.Split(str, s…)
string.Split(str, s…, bool)
string.Split(str, bool)
Возвращает массив
Берет строку и разбивает ее на массив строк с заданным набором разделителей строк s…. Если разделители не указаны, то строка разрывается везде, где есть пробел. Необязательный логический параметр указывает, следует ли отбрасывать пустые записи.
Например.
var a = string.Split("Hello World !") for i = 0 .. a.Count()-1 >`0,@i@,[@i@] = @a[i]@ // Breaks up the string into: "Hello", "World", "!"
var a = string.Split("Hello World !", " ", "l") for i = 0 .. a.Count()-1 >`0,@i@,[@i@] = @a[i]@ // Breaks up the string into: "He", " ", "o", "Wor", "d", "!"
var a a = string.Split("Hello World !","l","r",true) for i = 0 .. a.Count()-1 >`0,@i@,[@i@] = @a[i]@ // Breaks up the string into: "He", "o Wo", "d !"
string.Sub(var, startAt)
Возвращает строку
Принимает строковую переменную и начальный индекс в качестве параметров и разбивает строку с этой точки вперед.
var a = Hello World! var subString = string.Sub(a, 6) >Подстрока = @subString@ (subString равен "World!")
string.Sub(var, startAt, length)
Возвращает строку
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Принимает строковую переменную, начальный индекс и длину в качестве параметров и разделяет строку из этой начальной точки, останавливаясь на заданной длине.
var a = Hello World! var subString = string.Sub(a, 6, 3) >substring = @subString@ (subString равен "Wor")
string.ToLower(str)
Возвращает строку
Преобразует все буквы в строке в нижний регистр.
var a = "Foo" a = string.ToLower(a) >@a@ // Prints "foo" to the screen
string.ToUpper(str)
Возвращает строку
Преобразует все буквы в строке в верхний регистр.
var a = "Foo" a = string.ToUpper(a) >@a@ // Prints "FOO" to the screen

Text Localization
На момент написания этой статьи Stonescript поддерживает 12 языков. Несколько операций позволяют адаптировать пользовательские сценарии к выбранному игроком языку.
te.language
Возвращает строку
Код языка, выбранного игроком в настройках. Возможные значения: EN, PT-BR, ZH-CN, ZH-TW, FR, DE, RU, ES-LA, ES-EU, JP, KR и TK.
var lang = te.language >Language = @lang@
te.xt(str)
Возвращает строку
Переводит заданный английский текст на выбранный игроком язык. Если переведенная версия не найдена, вместо нее возвращается введенный текст. Кроме того, в качестве входных данных можно использовать текстовый идентификатор (TID), хотя исчерпывающий список TID выходит за рамки данного руководства.
var button = ui.AddButton() button.text = te.xt(Play) // Change your language in settings to see this example at work
te.GetTID(str)
Возвращает строку
Возвращает текстовый идентификатор (TID) для заданного текста. Вводимый текст ожидается на языке, выбранном игроком.
var tid = te.GetTID("Play") >`0,1,@tid@ // Prints tid_button_play to the screen
te.ToEnglish(str)
Возвращает строку
Переводит заданный текст с выбранного игроком языка в исходный английский текст. Если переведенная версия не найдена, вместо нее возвращается введенный текст.
>`0,1,@te.ToEnglish("Jogar")@ // If Portuguese is chosen in settings it will print "Play" // otherwise it will print "Jogar"
10. Встроенные функции [Прочее]
time
time.FormatCasual(int)
time.FormatCasual(int,bool)
Возвращает строку
Преобразует количество кадров в удобочитаемое строковое представление времени, например «1 м 23 с». Второй параметр (bool) является необязательным; Если true, то точность результата максимальна.
>`0,0,Current time = ^ @time.FormatCasual(totaltime, true)@
time.FormatDigital(int)
time.FormatDigital(int,bool)
Возвращает строку
Преобразует количество кадров в удобочитаемое строковое представление времени, например «1:23». Второй параметр (bool) является необязательным; Если true, то точность результата максимальна.
>`0,0,Current time = ^ @time.FormatDigital(totaltime, true)@

UI
Stonescript предоставляет контейнер для элементов пользовательского интерфейса, которые рисуются поверх игры. Элементы рисуются и обновляются в том порядке, в котором они добавляются.
ui.Clear()
Нет возвращаемого значения
Удаляет все элементы пользовательского интерфейса из основного контейнера.
?key = backBegin ui.Clear()
ui.AddButton()
возвращает Button
Добавляет элемент Button.
func OnPressed() > Hello World! ?loc.begin var button = ui.AddButton() button.y = 1 button.text = Press me button.SetPressed(OnPressed)
button.x
Возвращает целое цичсло
Позиция X кнопки относительно ее контейнера.
button.x = screen.w - button.w // Перемещает кнопку в правую часть экрана
button.y
Возвращает целое цичсло
Позиция Y кнопки относительно ее контейнера.
button.y = (screen.h - button.h) / 2 // Перемещает кнопку вертикально к центру экрана
button.w
Возвращает целое цичсло
Ширина кнопки. Значение по умолчанию — 18.
button.w = string.Size(button.text) + 4 // Размер кнопки соответствует ее текущему тексту, +2 с каждой стороны
button.h
Возвращает целое цичсло
Высота кнопки. Значение по умолчанию — 5.
button.h = screen.h //Устанавливает высоту кнопки, чтобы заполнить весь экран
button.text
Возвращает строку
Текст, который появляется внутри кнопки.
button.text = player.name // Напишите свое имя на кнопке!
button.tcolor
Возвращает строку
Цвет текста внутри кнопки в шестнадцатеричном формате RGB.
button.tcolor = #ff0000 // Устанавливает цвет текста кнопки на красный
button.bcolor
Возвращает строку
Цвет границы кнопки в шестнадцатеричном формате RGB.
>@button.bcolor@ button.bcolor = #880000 //Печатает текущий цвет границы, затем устанавливает его на темно-красный
button.sound
Возвращает строку
Звуковой эффект, который воспроизводится при нажатии кнопки. По умолчанию «подтвердить».
button.sound = buy // Изменяет кнопку таким образом, что при нажатии воспроизводится звук покупки.
button.SetPressed(f)
возвращает вывод функции
Назначает функцию, которая будет вызываться при нажатии кнопки. Функция может иметь любое количество параметров (даже без параметров). При вызове функции первым параметром будет ссылка на саму кнопку.
var button1 var button2 func OnPressed(btn) ?btn = button1 >Button1 was pressed : >Button2 was pressed ?loc.begin button1 = ui.AddButton() button1.y = 1 button1.SetPressed(OnPressed) button2 = ui.AddButton() button2.y = 6 button2.SetPressed(OnPressed)
ui.ShowBanner(str)
ui.ShowBanner(str,str)
Нет возвращаемого значения
Отображает анимированный баннер с двумя сообщениями. Анимация баннера перезапускается каждый раз, когда вызывается ui.ShowBanner().
?time = 120 ui.ShowBanner("Hello World!")

Other
Type(var)
Возвращает строку
Оценивает тип переменной и возвращает строковое представление. Возможные типы: 'string', 'int', 'bool', 'function', 'object' и 'null'.
var a = 0 ?Type(a) = int >Переменная 'a' целое число.
11. Импорт внешних скриптов
Твой сценарий не обязательно должен быть в Камне Разума. Stonescript поддерживает загрузку внешних файлов с помощью ключевого слова import. Для работы внешних сценариев они должны быть расположены в папке с сохранёнными файлами[stonestoryrpg.com], внутри папки/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 print_util 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

Несмотря на схожесть, между 'import' и 'new' есть два важных различия. При 'import' один и тот же объект возвращается каждый раз. Если вы импортируете один и тот же сценарий из нескольких мест, все они будут использовать один и тот же объект. Скрипты, импортированные с помощью 'new', являются уникальными копиями, но их тело скрипта будет запускаться только 1 раз, в отличие от каждого кадра.
12. ASCII-арт
В Камне разума пользовательские ASCII-арты могут быть встроены в сценарии и отображены на экране с помощью расширенных команд печати. Есть несколько способов сделать это, и некоторые символы имеют специальное поведение:

# - Пустое пространство. Прозрачность. Не рисует.
\n - Разрыв строки. Вызывает продолжение рисовки на следующей линии. ПРЕДУПРЕЖДЕНИЕ. Это дорогостоящий оператор, и его не следует использовать для разрыва линий на больших чертежах. Вместо этого используйте блок ascii/asciiend.

Способ 1
Расширенная печать

Этот пример рисует зеленый кружок в верхнем левом углу экрана.
>`1,0,#green,ascii ^#.-. ^( ) ^#`-´ asciiend

Способ 2
Переменные

Этот пример сохраняет рисунок для жуткой рыбы в переменной, а затем рисует его в верхнем левом углу экрана красным цветом.
var fishSprite = fishSprite = ascii ^###(°_## ^#_/_ o\# ^#´ `''#" asciiend >`0,3,#red,@fishSprite@
13. Циклы
Циклы позволяют раздел кода запускаться несколько раз. Чтобы создать цикл, используйте ключевое слово '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@

Можно перебирать элементы массива (ссылка на пункт 14), используя эту форму:
var a = [1, 2, 3] var n n = "" for value : a n = n + value >n = @n@
14. Массивы
Массивы - это особый тип переменных. Они предоставляют способ последовательной организации значений и объектов в коллекцию, которая назначается одной переменной.

a = []
Инициализирует новый массив. Смотрите ниже для дополнительной информации.
a[integer]
Считывает значение в заданной позиции.
var myArray = [10, 3] ?myArray[1] = 3 >Да, значение [1] равно 3
a.Add(value)
Добавляет новое значение/объект в конец массива.
var myArray = [] myArray.Add(10)
a.Clear()
Удаляет все элементы из массива, делая его пустым. Это более эффективно, чем повторное объявление массива с помощью [].
var myArray = [10, 3] myArray.Clear()
a.Contains()
Определяет, находится ли данное значение внутри массива. Возвращает 'Истина', если найдено; иначе 'Ложь'.
var myArray = [10, 3] ?myArray.Contains(3) >Да
a.Count()
Возвращает количество элементов в массиве.
var myArray = ["apple","banana"] var size = myArray.Count() >Размер массива = @size@
a.Emplace(integer, value)
Заменяет значение в данной позиции новым значением.
var myArray = [10, 3] myArray.Emplace(0, 4) var value = myArray[0] >Значение на [0] теперь @value@
a.IndexOf(value)⠀⠀⠀⠀⠀⠀
Ищет заданное значение внутри массива. Возвращает целое число, указывающее позицию первого появления значения. Если значение не найдено, возвращается -1.
var myArray = [10, 3] var index = myArray.IndexOf(3) >Найдена позиция @index@
a.Insert(integer, value)
Добавляет новое значение/объект в определенную позицию массива. Элементы справа смещаются на следующую позицию.
var myArray = [10, 3] myArray.Insert(1, "apple") // Массив сейчас [10, "apple", 3]
a.RemoveAt(integer)
Удаляет элемент массива из определенной позиции. Возвращает удаленное значение.
На основе нуля: myArray.RemoveAt(0) удаляет первый элемент.
Элементы справа перемещаются на предыдущую позицию.
var myArray = [1, 2, 3] myArray.RemoveAt(1) // Массив сейчас [1, 3]
a.Sort()
Организует элементы массива в порядке возрастания. Если массив содержит объекты разных типов, он все равно будет отсортирован, но ожидаемые результаты не определены, а элементы не гарантированно сгруппированы по типу.
var myArray = ["Cherry", 2, "Apple", 1, true, false, "Banana", 3] var value myArray.Sort() for i = 0 .. myArray.Count() - 1 value = myArray[i] >`0,@i@,@value@

Вот несколько различных способов инициализации и использования массивов:
var emptyCollection = [] var magicNumbers = [10, 3, 0, 15, -7] var someStrings = ["apple", "banana", "cherry"] var sameButMultiLine = [ "apple", "banana", "cherry", ] var redeclaredEachFrame redeclaredEachFrame = [] // Не хорошо для ПК var clearedEachFrame = [] clearedEachFrame.Clear() // Отлично для памяти и процессора var clearedEachLoop = [] ?loc.begin | loc.loop clearedEachLoop.Clear() var multiDimensional = [[], [], []] var objectCollection = [ new Components/Float, new Components/Float, new Components/Vector, ] var animationFrames = [ascii ───┼ O/ /| / \ asciiend ^,ascii ---. O \ /|\┼─── / \ asciiend ^]

Цикл по массивам:
var myArray = ["Apple", "Banana", "Cherry"] var count var value count = myArray.Count() ?count > 0 for i = 0 .. count - 1 value = myArray[i] >`0,@i@,@value@ // В этом примере названия фруктов печатаются слева от экрана.

Многомерный доступ:
var a = [[1,2], [3,4]] var value value = a[1][0] >Найдено значение @value@ в (1, 0)
15. Пользовательский ввод
Stonescript может читать входные данные игрока, используя состояние игры '?key'. Это может быть использовано для управления расширенным поведением, таким как различные режимы для ИИ, но пользовательские вводы позволяют создавать совершенно новый опыт, наложенный поверх Stone Story.

В этом примере символ @ можно перемещать по экрану, как главного героя в классической игре типа рогалик. Коды клавиш (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,@

Таблица со всеми доступными кодами клавиш
Ручное
Зажатое
Отпущенное
По умлочанию на PC
left
leftBegin
leftEnd
A или ←
right
rightBegin
rightEnd
D или →
up
upBegin
upEnd
W или ↑
down
downBegin
downEnd
S или ↓
primary
primaryBegin
primaryEnd
Return
back
backBegin
backEnd
X
ability1
ability1Begin
ability1End
Shift
ability2
ability2Begin
ability1End
Control
bumpL
bumpLBegin
bumpLEnd
Z
bumpR
bumpRBegin
bumpREnd
C

16. Подсказки
  • Пробел (в начале строки) имеет значение при определении того, что происходит в результате '?' сравнения.

  • Сценарий можно изменить в середине пробега, нажав клавишу «M» на клавиатуре.

  • Кнопка Сила в правом верхнем углу Камня разума включает / выключает скрипт.

  • Если вызывается несколько команд экипировки, произойдет то, что наступит последним.

  • Сценарий выполняется 30 раз в секунду (один раз за кадр).

  • Чтобы поэкспериментировать с различными сценариями, рекомендуется скопировать их во внешний текстовый редактор, например блокнот.

  • Полезны такие горячие клавиши, как Ctrl + A, Ctrl + C и Ctrl + V.

  • Удерживание клавиши Tab в игре дает вам много информации о состоянии игры и показывает список последних ошибок Stonescript.

  • Команда печати может быть разбита на несколько строк с помощью '\n' в тексте.
17. Скрипт по умолчанию
import Fishing ?hp < 7 activate potion ?loc = caves equipL sword equipR shield ?foe = boss equip crossbow
18. Дорожная карта
Вещи, которые запланированы, но еще не в игре:

sprite.New()
sprite.AddAnimation()
Другие операции над спрайтами.

Расширение пространства имён пользовательского интерфейса, например:
ui.Remove(element) ui.AddTextBox(), ui.AddSprite(), button.bstyle, ui.AddPanel(), button.sprite и т.д.

Рисование линий.

Find() - получить ссылки на врагов или декорации.

Родной моддинг врагов, украшений и оружия.

Расширенный API для использования в побочных квестах, создаваемых пользователями.

Выбросы частиц.

equipF (str) - экипирует предмет в Фею.

foes - Список врагов в пределах 46 единиц.
Приложение A - Звуковые Эффекты [1]
Stonescript может воспроизводить звуковые эффекты из игры, основываясь на пользовательской логике.

В этом примере звук 'unequip' воспроизводится всякий раз, когда игрок теряет здоровье:
var lasthp = hp ?hp < lasthp play unequip lasthp = hp

Большинство звуков имеют вариации, которые воспроизводятся либо случайно, либо последовательно. Если один и тот же звук воспроизводится более одного раза в одном кадре, он будет проигнорирован. Если в секунду воспроизводится более 5 звуков, они будут подавлены.

Вот полный список звуков, доступных в Stone Story RPG:

buy
click
confirm
soul_stone
sword_cast
sword_hit
wand_cast
wand_hit
player_kick
player_punch
stone_throw_cast
stone_throw_hit
grappling_cast
grappling_hit
grappling_idle
hatchet_cast
hatchet_hit
shovel_cast
torch_cast
torch_hit
torch_idle
pickup_stone
pickup_wood
pickup_tar
pickup_success
soul_stone_drop
wand_drop
key_drop
cross_deadwood_bump
cross_deadwood_row
cross_deadwood_splash
ui_starfirst
ui_starnew
ui_starold1
ui_starold2
ui_starold3
ui_starold4
bronze_gate_open
prompt_choice
waterfall_hook_hit
waterfall_splash
haunted_gate_key_bounce_1
haunted_gate_key_bounce_2
haunted_gate_key_bounce_3
haunted_gate_opening
haunted_gate_point_lost
haunted_gate_key_into_gate
haunted_gate_shuffle
haunted_gate_shuffle_fast
haunted_gate_torch_off
haunted_gate_torch_on
haunted_gate_try_to_open
paint_splat
waterfall_land
waterfall_rope_grab
waterfall_rope_swing
skeleton_boss_death
skeleton_boss_legs_die
spider_boss_death
tree_boss_death
mushroom_boss_death
tree_boss_attack
tree_boss_awake
tree_boss_idle
tree_boss_spike
spider_boss_attack
player_hit
mushroom_boss_awake
mushroom_boss_punch
mushroom_boss_shoot
skeleton_boss_arm1
skeleton_boss_arm2
skeleton_boss_attack
skeleton_boss_idle
skeleton_boss_bone_bounce
skeleton_boss_arm_woosh
equip
unequip
bat_attack_small
bat_death_small
bat_wing
bat_wing_small
spider_attack
spider_death
spider_death_small
spider_eggs_spawn
spider_walk
scarab_awake
scarab_bite
scarab_death
scarab_horn
scarab_wings
mosquito_attack
mosquito_death
mosquito_loop
bronze_gate_locked
bat_attack
bat_death
progress_1
progress_2
progress_3
progress_4
progress_5
progress_6
progress_7
progress_8
progress_9
life_gain
player_death
logo_full
logo_short
smithy_hammer
sightstone_cast
error
ranting_tree_halt
treasure_close
treasure_item_pop
treasure_item_show
treasure_open
skeleton_boss_awake
skeleton_boss_hand_slam
level_up
insta_kill
spider_boss_awake
metal_drop
treasure_drop
smithy_hammer_fail
xp_tick
crossbow_cast
crossbow_hit
wand_aether_cast
wand_aether_hit
wand_air_cast
wand_air_hit
wand_fire_cast
wand_fire_hit
wand_ice_cast
wand_ice_hit
wand_poison_cast
wand_poison_hit
wand_vigor_cast
wand_vigor_hit
skeleton_boss_arm_reconnect
skeleton_boss_summon_minions
mushroom_boss_fat_slam
pickup_bronze
temple_npc_chant
temple_npc_clear_throat
temple_npc_talk
first_controller
slave_npc
slave_outro_chatter
slave_outro_voice
haunted_gate_npc_voice
slave_outro_transition
bronze_guardian_attack1
bronze_guardian_attack2
bronze_guardian_attack3
bronze_guardian_death
bronze_guardian_helmet
bronze_guardian_power_up
bronze_guardian_steps
ant_attack
ant_death
ant_walk
snail_attack
snail_attack_small
snail_death
snail_death_small
snail_walk
ghost_death
ghost_death_small
skeletimmy_death
skeletony_death
skeletimmy_attack
skeletony_attack
skeletony_awake_a
skeletony_awake_b
skeletony_walk
ghost_loop
ghost_loop_small
ghost_attack
ghost_attack_small
controller_death
controller_whip_attack
controller_whip_hit
dominotaur_death
dominotaur_whip_attack
dominotaur_whip_hit
mine_walker_death
mine_walker_attack_a
mine_walker_attack_b
mine_walker_attack_hit
mine_walker_awake
mine_walker_step
fire_elemental_attack
fire_elemental_attack_hit
fire_elemental_awake
fire_elemental_death
mine_walker_helmet_break
ice_elemental_attack
ice_elemental_attack_hit
ice_elemental_awake
ice_elemental_death
ki_eater_attack
ki_eater_attack_hit
ki_eater_awake
ki_eater_death
ki_gobbler_attack
ki_gobbler_attack_hit
ki_gobbler_awake
ki_gobbler_death
ki_slerper_attack
ki_slerper_attack_hit
ki_slerper_awake
ki_slerper_death
bell_ringer_attack
bell_ringer_attack_hit
cult_guard_attack
cult_guard_attack_hit
cult_marksman_attack
cult_marksman_attack_hit
cult_sorcerer_attack
cult_sorcerer_attack_hit
cultist_death
flying_serpent_loop
poison_adept_attack
poison_adept_attack_hit
serpent_attack
serpent_death
serpent_handler_release
serpent_hiss
serpent_slither
worm_rider_hop
booklet_open
booklet_turn_page
booklet_close
hammer_cast
hammer_hit
shield_dash
fissure_break_apart
fissure_unmake
mindstone_off
mindstone_on
triskelion_fuse
potion_berserk
potion_cleansing
potion_defensive
potion_experience
potion_healing
potion_invisibility
potion_lightning
potion_lucky
potion_strength
potion_vampiric
bronze_guardian_pulling_hammer
bronze_guardian_removing_hammer
bronze_guardian_turbine
bronze_guardian_ears_ring
bronze_guardian_fuse
bronze_guardian_attack4
yeti_attack
yeti_attack_flick
yeti_attack_hit
yeti_awake_blow
yeti_awake_explosion
yeti_awake_inhale
yeti_awake_lick
yeti_blow
yeti_blow_ice_wall
yeti_death
yeti_inhale
yeti_inhale_lick
nagaraja_awake_roar
nagaraja_awake_swallow
nagaraja_awake_tongue_1
nagaraja_awake_tongue_2
nagaraja_dead
nagaraja_poison_attack
nagaraja_poison_attack_hit
nagaraja_wail
nagaraja_wail_brick
nagaraja_attack_eat
nagaraja_attack_lick
nagaraja_attack_swallow
nagaraja_tongue_damaged
nagaraja_tongue_lift
nagaraja_tongue_smell
nagaraja_tongue_wrap
bearer3_talk
bearer_attack
bearer_attack_hit
bearer_death
bearer_stealing
bearer_super_attack
bearer_scream
bearer4_talk
bearer4_talk_evolving
bearer_evolving
elementalist_aether_attack
elementalist_aether_attack_hit
elementalist_aether_blink
elementalist_death
elementalist_fire_attack
elementalist_fire_attack_hit
elementalist_fire_blink
elementalist_ice_attack
elementalist_ice_attack_hit
elementalist_ice_blink
elementalist_poison_attack
elementalist_poison_attack_hit
elementalist_poison_blink
elementalist_vigor_attack
elementalist_vigor_attack_hit
elementalist_vigor_blink
bearer5_talk
elementalist_evolving
perfected_attack
perfected_attack_hit
perfected_death
perfected_defense
perfected_energy_ball
perfected_energy_ball_hit
perfected_summon
perfected_talk
epilogue_devolving
epliogue_player_evolves
epilogue_talk
devolved_talk
dysangelos_guidance
dysangelos_guidance_1
dysangelos_guidance_2
dysangelos_guidance_3
dysangelos_intro_talk
Приложение A - Звуковые эффекты [2]
ranting_tree_talk_halt
ranting_tree_talk_again
ranting_tree_talk_how_dare
ranting_tree_talk_avenge
ranting_tree_talk_get_out
ranting_tree_talk_impressive
ranting_tree_talk_very_well
ranting_tree_talk_extra
hans_talk_intro
hans_talk_reward
scotty_a_pleasure
scotty_a_worthy_opponent
scotty_deuced
scotty_failte_back
scotty_getting_good
scotty_grr
scotty_guess_which
scotty_intro
scotty_lets_harden
scotty_make_ye_guess
scotty_noo_jist
scotty_perhaps_the_rules
scotty_pick_some_treasure
scotty_shall_we_up
scotty_we_have_wee_use
scotty_well_met
scotty_well_then
scotty_wizard
scotty_wrong_choice
scotty_hell_be_back
scotty_out_of_treasure
scotty_there_he_is
nagaraja_choir
mushroom_boss_split
ant_hill
treasure_drop_common
treasure_drop_epic
treasure_drop_giant
treasure_drop_humble
treasure_drop_rare
dominotaur_awake
fire_geyser
ice_pillar
treasure_item_cyan
treasure_item_yellow
treasure_item_green
treasure_item_blue
treasure_item_red
treasure_item_rainbow
ki_slerper_walk
mindstone_found
ghost_tomb_death
perfected_fly_start
perfected_fly_loop
perfected_fly_end
shop_door_open
shop_door_enter
scorpion_death
bomb_cart_explosion
bomb_cart_fuse
bomb_cart_move
bronze_gate_close
poison_powerup
acronian_cultist_power_up
giant_ice_elemental_attack
scout_dialog
morel_punch
falling_stonefolk
scout_arrives
scout_leaves
scout_wing
scout_focus
dog_bark
frog
lost_item_boost
treasure_item_lost
blade_glow
blade_pallas_attack
blade_raise
blade_drag
auggie_voice
pallas_voice
quest_stone_jump
quest_stone_unlock
bardiche_cast
boo_voice
quarterstaff_cast
air_hiss
bang_go_forward
fire_orbs
open_note
talisman_reveal
fire_beast_1
fire_beast_2
uulaa_voice
Приложение B - Музыка
Stonescript может воспроизводить музыкальные треки из игры на основе пользовательской логики.

?loc.begin | loc.loop music.Play(temple_0)

Вот полный список музыки, доступной в Stone Story RPG:

Кипящая шахта
bronze_guardian_3
bronze_guardian_4
bronze_guardian_5
bronze_guardian_cyan
bronze_mine_0
bronze_mine_1
bronze_mine_2
bronze_mine_3
bronze_mine_4
bronze_mine_5
bronze_mine_cyan
slave_outro_climb
slave_outro_loop

Пещеры Страха
caustic_caves
spider_boss

Дедвуд
cross_deadwood_river
cross_deadwood_wind
deadwood_0
deadwood_1
deadwood_2
deadwood_3
deadwood_4
deadwood_5
deadwood_cyan
tree_boss
waterfall_descent

Залы с привидениями
skeleton_boss
undead_crypt_0
undead_crypt_1
undead_crypt_2
undead_crypt_3
undead_crypt_4
undead_crypt_5
undead_crypt_cyan
undead_crypt_intro

Ледяной хребет
bridge_broken
bridge_crossing
icy_ridge_0
icy_ridge_1
icy_ridge_2
icy_ridge_3
icy_ridge_4
icy_ridge_5
icy_ridge_cyan
yeti

Грибной лес
fire_loop
fungus_forest_0
fungus_forest_1
fungus_forest_2
fungus_forest_3
fungus_forest_4
fungus_forest_5
fungus_forest_cyan
mushroom_boss
mushroom_boss_cyan
shop

Скалистое плато
rocky_plateau_0
rocky_plateau_1
rocky_plateau_2
rocky_plateau_3
rocky_plateau_4
rocky_plateau_5
rocky_plateau_epilogue
rocky_plateau_fight
rocky_plateau_talk

Храм
nagaraja
temple_0
temple_1
temple_2
temple_3
temple_4
temple_5
temple_cyan

События
event_fall
event_hamartia
event_spring
event_stonejam
event_summer
event_winter

Остальное
credits
main_menu
bone_factory
osteophone
uulaa
Приложение C - Окружающие звуки
Stonescript может воспроизводить несколько слоёв фонового окружающего звука на основе пользовательской логики.

?loc.begin ambient.Stop() ambient.Add(ambient_crypt)

Вот полный список окружающего звука, доступного в Stone Story RPG:

ambient_mines
ambient_caves
ambient_bronze_gate
ambient_deadwood
ambient_mushroom
ambient_bridge
ambient_icy
ambient_cave
ambient_rocky
ambient_temple
ambient_crypt
ambient_haunted_gate
ambient_pallas
waterfall_a
waterfall_b
waterfall_c
< >
1 Comments
miksalok Feb 23, 2020 @ 2:19am 
хорошая работа. наконец смогу что-то сделать в этом камне с монитором. спасибо тебе