Stone Story RPG

Stone Story RPG

Không đủ lượt đánh giá
Stonescript Manual (beta) на русском
Bởi cucumb3r
Создал это руководство, потому что я тоже плох в английском. Приму ошибки в комментариях.

На данный момент переводится.
Готово 22/23 разделов.


Также другие руководства по теме:
Stonescript Manual - сюда можно отправиться
Stonescript Manual (beta) - вы здесь
   
Giải thưởng
Yêu thích
Đã yêu thích
Bỏ thích
О Stonescript
https://stonestoryrpg.com/stonescript/beta.html

v3.22.0 - 2023/01/11

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

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

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

Это руководство является исчерпывающим справочником по всем доступным функциям Stonescript. Большинство примеров можно скопировать и вставить в Камень Разума, что является отличным способом узнать, как они работают.
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
Локализованное имя текущей локации.
>Исследуем @loc.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.isQuest
'Истина' если данная локация является локацией от Легендарного или пользовательского квеста. Остальное 'Ложь'.
?loc.isQuest >`0,1,Мы находимся в локации квеста
loc.bestTime⠀⠀⠀⠀⠀
Лучшее время завершения текущей локации (ваш рекорд, лучший счёт).
>`0,1,Лучшее время = ^ @loc.bestTime@ кадров
loc.averageTime
Среднее время завершения текущей локации. Среднее время для локации рассчитывается взвешенным образом, где последнее время завершения имеет большую ценность, а более ранние времена имеют прогрессивно меньшую ценность, чем они старше.
Примечание: 20 циклов достаточно что бы свести влияние, более старых, к нулю.
>`0,2,Среднее время = ^ @loc.averageTime@ кадров
?foe
Текущий противник нацеленный игроком.
?foe = boo equip vigor staff
?foe.name
Локализованное имя противника, на которого нацелен игрок.
?foe.damage
Урон за один удар противника, на которого нацелен игрок.
>`0,1,Урон противника = @foe.damage@
?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
Состояние пользовательского ввода игры (см. 15. Пользовательский ввод).
// Печатает текущий ввод >@key@
?res.stone
?res.wood
?res.tar
?res.ki
?res.bronze
?res.crystals
Текущее количество ресурсов игрока в его инвентаре.
?loc = Deadwood >Дерево = @res.wood@
>`0,1,#magenta, ♦ @res.crystals@
?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)
Объявляет переменную (см. 7. Переменные), которая может использоваться в математических, логических и строковых операциях.
var message = Hello World! >@message@
func (function)
Объявляет функцию (см. 9. Функции), которая может быть вызвана позже.
func Print(message) >@message@ Print("Hello World!")
for v = a..b
Создает цикл (см. 13. Циклы), который перебирает переменную 'v' от значения 'a' до значения 'b'. Код, который появляется внутри области видимости цикла, будет выполняться несколько раз.
var a a = 0 for i = 1..5 a = a + i >a = @a@
import (script)
Загружает и выполняет внешний скрипт (см. 11. Импорт внешних скриптов).
В этом примере импортируется мини-игра о рыбалке, расположенная по адресу
(директория файла-сохранения)/Stonescript/fishing.txt
import fishing
new (script)
Загружает и выполняет внешний скрипт (см. 11. Импорт внешних скриптов), похожий на '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 pause'.
disable player
Скрывает игрока. Не влияет на бой, это только косметика.
enable player
Возвращает рендеринг игрока, если он был скрыт предыдущей командой 'disable player'.
play (sound) (pitch)
Воспроизводит звуковой эффект (см. Приложение - Звуковые Эффекты) с необязательным значением высоты тона. Значение высоты тона по умолчанию равно 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_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'.

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@ // Скрипт в Камне Разума 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 // Скрипт в Камне Разума 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 + ")" // Скрипт в Камне Разума 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. Пользовательский интерфейс [1]
Кнопки, текст, анимация... Stonescript предоставляет систему для создания сложных макетов и высокопроизводительных пользовательских интерфейсов. Невидимая «корневая» панель существует по умолчанию в основе системы. В корневую панель могут быть добавлены различные другие элементы пользовательского интерфейса, в том числе дополнительные панели, образующие древовидную структуру. Все элементы рисуются вместе, за один шаг, в том порядке, в котором они добавляются.
root │ ├─ Panel │ ├─ Text │ ├─ ASCII-art │ └─ Button │ ├─ Panel │ ├─ Panel | | └─ Text ...

UI
Вызывает функции в пространстве имён 'ui' для построения интерфейса.
ui.root
Panel
Базовый объект UI, поверх которого строится всё дерево.
disable hud ui.root.visible = true
ui.AddAnim(string)
Возвращает Anim
Добавляет объект Anim в корневую панель. Принимает лист спрайтов анимации в качестве параметра.
?loc.begin ui.AddAnim(ascii \o) %% (o/ asciiend)
ui.AddButton()
Возвращает Button
Добавляет объект Button в корневую панель.
func OnPressed() > Hello World! ?loc.begin var button = ui.AddButton() button.y = 1 button.text = Press me button.SetPressed(OnPressed)
ui.AddPanel()
Возвращает Panel
Добавляет объект Panel в корневую панель. Панели — важный тип объектов, служащий контейнерами для других элементов.
?loc.begin var p = ui.AddPanel() p.color = #red
ui.AddStyle()
Возвращает целое число
Добавляет новый стиль, который можно использовать для рисования прямоугольных компонентов, таких как панели и кнопки. Возвращает идентификационный номер нового стиля. Защищен от многократного добавления одного и того же стиля, в этом случае ничего не меняется и возвращается один и тот же идентификатор. Поскольку все сценарии могут вызывать ui.AddStyle(), рекомендуется сохранять идентификатор в виде переменной, а не вручную кодировать номера стилей в сценарии.
var customStyle = ui.AddStyle(" ^123 ^456 ^789") ?loc.begin var p = ui.AddPanel() p.style = customStyle
ui.AddText()
ui.AddText(string)
Возвращает строку
Добавляет Text объект в корневую панель.
?loc.begin var t = ui.AddText() t.text = "Hello World!"
ui.Clear()
Нет возвращаемого значения
Удаляет все элементы UI из основного контейнера.
?key = backBegin ui.Clear()

Component
Компонент является базовым типом для всех других типов пользовательского интерфейса. Это означает, что другие элементы (панели, текст, кнопки и анимация) имеют следующие свойства:
component.x
Целое число
Положение X компонента относительно его закрепленного положения.
component.y
Целое число
Положение Y компонента относительно его закрепленного положения.
component.w
Целое число
Ширина компонента. Значение по умолчанию зависит от типа объекта.
button.w = string.Size(button.text) + 4 // Размер кнопки соответствует её текущему тексту, +2 с каждой стороны
component.h
Целое число
Высота компонента. Значение по умолчанию - 5.
panel.h = panel.parent.h // Устанавливает высоту панели в соответствии с высотой ее родительской панели
component.absoluteX
component.absoluteY
Целое число
Только для чтения
Положение компонента относительно экрана.
var t ?loc.begin var p = ui.AddPanel() p.anchor = bottom_right p.dock = bottom_right t = ui.AddText("Foo") p.Add(t) >`0,1,Относительная позиция = @t.x@,@t.y@ >`0,2,Абсолютная позиция = @t.absoluteX@,@t.absoluteY@
component.anchor
Строка
Свойство автоматического размещения, представляющее внутреннюю точку поворота компонента. Это указывает системе UI, как позиционировать компонент относительно самого себя. Значение по умолчанию — "center_center". Возможные значения: top_left, top_center, top_right, center_left, center_center, center_right, bottom_left, bottom_center and bottom_right.
component.dock
Строка
Свойство автоматического размещения, аналогичное якорю. Однако стыковка представляет собой внешнюю точку поворота или позицию внутри родителя, в которую следует поместить компонент. Если вы сомневаетесь, используйте одно и то же значение для якоря и стыковки, что является наиболее распространённой ситуацией.
?loc.begin var p = ui.AddPanel() p.anchor = top_right p.dock = top_right p.w = 20 p.h = 9 var t = ui.AddText("HelloWorld!") t.anchor = left_bottom t.dock = bottom_left t.x = 2 t.h = t.lines.Count() + 1 p.Add(t)
component.ax
Строка
X часть якоря. Возможные значения: left, center, right.
component.ay
Строка
Y часть якоря. Возможные значения: top, center, bottom.
component.dx
Строка
X часть стыковки. Возможные значения: top, center, bottom.
component.dy
Строка
Y часть стыковки. Возможные значения: left, center, right.
?loc.begin p = ui.AddPanel() p.ax = right p.ay = top p.dx = right p.dy = top
component.parent
Panel
Только для чтения
Ссылка на родительскую панель компонента. Может относиться к корневой панели, если компонент был создан, но никогда не добавлялся в другую панель. Когда вызывается panel.Add(component) родительские компоненты изменяются.
component.visible
Булево/строка
Видимость компонента. Значение по умолчанию - "inherit"(наследовать). Возможные значения: true, false, inherit. Если установлено значение "true", компонент всегда будет виден, игнорируя статус его родителя. Если установлено значение "false", компонент будет невидимым независимо от его родителя. Однако, если установлено значение "inherit", компонент будет следовать видимости своего родителя.
component.Recycle()
Нет возвращаемого значения
Удаляет компонент из его родительской панели. Он будет переназначен в будущих вызовах ui.Add_(). Любые ссылки переменных на переработанный элемент должны быть обнулены или переназначены, чтобы избежать ошибок.

Text > Component
Многострочное текстовое поле. Поддерживает метаданные цвета.
text.align
Строка
Выравнивание текста внутри поля. Значение по умолчанию — "left". Возможные значения: left, center, right.
text.color
Строка
Цвет текста в шестнадцатеричном формате[htmlcolorcodes.com].
text.lines
Строка[]
Массив строк, представляющих собой разбитые строки текста после того, как текстовое поле отформатировало свое содержимое. Исключает метаданные цвета.
text.text
Строка
Полное содержимое текстового поля. Часть текста может быть окрашена метаданными [color=#rrggbb][/color].
?loc.begin var t = ui.AddText() t.text = "Привет [color=#red]Мир[/color]!"
16. Пользовательский интерфейс [2]
Panel > Component
Панели — это прямоугольные компоненты, которые служат контейнерами для других компонентов. Цепочка панелей, добавленных друг к другу, образует древовидную структуру.
panel.children
Component[]
Массив со всеми дочерними компонентами, которые были добавлены в Panel с помощью panel.Add().
panel.clip
Булево
Указывает, следует ли использовать границы Panel для ограничения рисования дочерних компонентов. Если установлено значение true, части дочерних компонентов, выходящие за пределы панели, отображаться не будут.
var p ?loc.begin p = ui.AddPanel() p.w = 4 p.h = 3 var t = ui.AddText("Быстрая коричневая лиса ^ перепрыгивает через ленивую собаку.") p.Add(t) ?time%30 < 15 p.clip = true : p.clip = false
panel.color
Строка
Цвет панели в шестнадцатеричном формате[htmlcolorcodes.com].
panel.style
Целое число
Идентификационный номер текущего стиля панели. Значение по умолчанию 1. Возможные значения от -8 до 8. Дополнительные стили можно добавить с помощью ui.AddStyle()
panel.Add(Component)
panel.Add(Component, int)
Нет возвращаемого значения
Добавляет компонент на панель. Компонент становится дочерним элементом панели, а панель становится родителем компонента. Порядок, в котором элементы добавляются в панель, влияет на порядок прорисовки. Компоненты могут быть вставлены в определенную позицию сортировки с помощью необязательного целочисленного параметра. Отсутствие целочисленного параметра означает, что компонент добавляется как последний дочерний элемент панели. Эту функцию также можно использовать для изменения порядка прорисовки компонентов, которые уже являются дочерними элементами панели.
panel.Clear()
Нет возвращаемого значения
Удаляет все элементы пользовательского интерфейса из панели. Компоненты, удаленные таким образом, перерабатываются в систему пользовательского интерфейса и будут повторно использоваться в будущих вызовах ui.Add_(). Любые ссылки переменных на эти элементы должны быть обнулены или переназначены, чтобы избежать ошибок.
panel.Remove(Component)
panel.Remove(int)
Нет возвращаемого значения
Удаляет определенный компонент из панели или удаляет компонент с указанным порядковым номером. Компоненты, удаленные таким образом, перерабатываются в систему пользовательского интерфейса и будут повторно использоваться в будущих вызовах ui.Add_(). Любые ссылки переменных на эти элементы должны быть обнулены или переназначены, чтобы избежать ошибок.

Anim > Component
Анимации спрайтов ASCII, которые можно добавить в пользовательский интерфейс.
anim.color
Строка
Цвет анимации, в шестнадцатеричном формате[htmlcolorcodes.com]
anim.duration
Целое число
Длительность анимации в кадрах.
anim.flipX
Булево
Если 'истина', изображение переворачивается по горизонтали над точкой опоры.
anim.flipY
Булево
Если 'истина', изображение переворачивается по вертикали над точкой опоры.
anim.frame
Целое число
Отрисовывается текущий кадр анимации. Можно изменить, чтобы установить анимацию на определенный кадр.
anim.gamePause
Булево
Если 'истина', анимация автоматически приостанавливает воспроизведение, если игрок приостанавливает игру, и возобновляет воспроизведение, если игрок выходит из экрана паузы.
anim.loop
Булево
Если 'истина', анимация будет перезапущена с самого начала, как только она достигнет конца своей продолжительности.
anim.playing
Булево
Только для чтения
'истина', если анимация воспроизводится в данный момент.
anim.paused
Булево
Только для чтения
'истина', если анимация воспроизводится, но было приостановлено вызовом anim.Pause().
anim.pivotX
anim.pivotY
Целое число
Дополнительное смещение поворота, которое можно использовать для тонкой настройки, когда ASCII-графика рисуется относительно своего положения.
anim.playOnStart
Булево
Если 'истина', анимация начнется как можно скорее.
anim.Load(строка)
Нет возвращаемого значения
Назначает новый лист спрайтов ASCII.
anim.Pause()
Нет возвращаемого значения
Приостанавливает воспроизведение анимации на текущем кадре. Последующий вызов anim.Play() возобновляет воспроизведение.
anim.Play()
Нет возвращаемого значения
Начинает воспроизведение анимации или возобновляет воспроизведение, если оно было приостановлено.
var dance ?loc.begin dance = ui.AddAnim(ascii (O/ %% \O) asciiend) dance.duration = 20 dance.loop = true dance.Play()
anim.Stop()
Нет возвращаемого значения
Приостанавливает воспроизведение и возвращает анимацию к первому кадру.

Canvas > Component
Контейнер, оптимизированный для рисования произвольных символов и цветов.
canvas.blend
Строка
Режим наложения холста, когда он состоит из элементов позади него. Возможные значения: opaque(непрозрачность), multiply(умножение), divide(разделение), add(сложение), subtract(вычитание). Значение по умолчанию "opaque".
var filter1 = ui.AddCanvas() var filter2 = ui.AddCanvas() filter1.w = screen.w filter1.h = screen.h filter2.w = screen.w filter2.h = screen.h filter1.blend = multiply filter1.SetFG(#aa5555) filter1.SetBG(#dddddd) filter2.blend = add filter2.SetFG(#aa6600) filter2.SetBG(#662200)
canvas.Get(int,int)
Возвращает строку
Возвращает символ в определенной позиции x,y на холсте.
canvas.Set(int,int,str)
Нет возвращаемого значения
Изменяет определенную позицию x,y на холсте на заданный символ.
?loc.begin var canvas = ui.AddCanvas() canvas.Set(0, 0, "A")
canvas.Set(int,int, fg,str)
canvas.Set(int,int, fg,bg,str)
Нет возвращаемого значения
Перегрузки для изменения холста в определенной позиции с одновременной установкой цветов переднего плана и фона.
?loc.begin var canvas = ui.AddCanvas() for x = 0..canvas.w for y = 0..canvas.h var fg = color.Random() var bg = color.Random() canvas.Set(x, y, fg, bg, ▄)
canvas.SetFG(color)
Нет возвращаемого значения
Устанавливает цвет переднего плана для всего холста.
?loc.begin var canvas = ui.AddCanvas() canvas.Set("R") canvas.SetFG(#red)
canvas.SetFG(int,int, color)
Нет возвращаемого значения
Изменяет цвет переднего плана в определенной позиции x,y.
?loc.begin var canvas = ui.AddCanvas() canvas.Set("X") canvas.SetFG(2, 1, #ff00ff)
canvas.SetBG(color)
Нет возвращаемого значения
Устанавливает цвет фона для всего холста.
?loc.begin var canvas = ui.AddCanvas() canvas.Set("g") canvas.SetBG(#00aa00)
canvas.SetBG(int,int, color)
Нет возвращаемого значения
Изменяет цвет фона в определенной позиции x,y.
?loc.begin var canvas = ui.AddCanvas() canvas.Set("X") canvas.SetBG(2, 1, #yellow)
17. Подсказки
  • Отступ пробелами в начале строки имеет значение при определении того, что происходит в результате '?' сравнения.

  • Для изменения скрипта в середине пробега нажмите клавишу 'M'.

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

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

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

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

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

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

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

  • 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
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
Приложение A - Звуковые эффекты [2]
open_note
talisman_reveal
fire_beast_1
fire_beast_2
uulaa_voice
mask_summon_1
mask_summon_2
Приложение 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
2 bình luận
Bébra 30 Thg11, 2022 @ 6:37am 
Item.GetCount() у меня не работает, выдаёт число 0, даже когда использовал пример
Miksalok 23 Thg02, 2020 @ 2:19am 
хорошая работа. наконец смогу что-то сделать в этом камне с монитором. спасибо тебе