Stone Story RPG

Stone Story RPG

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

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

v2.28.8 - 2020/11/08

Перевод Cucumber_RU и Google Переводчик

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

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

В первый раз в StoneScript? Начните с обучающего гайда «Введение в Камень Разума»[stonestoryrpg.com] (временно не переведено)

Цель хорошего скрипта - экипировать лучшие предметы по мере изменения состояния игры.
Это может быть так же просто, как автоматическая активация зелья, если у вас мало здоровья, или достаточно сложный, где бой оптимизирован до сверхчеловеческого уровня.
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. Основы
?
Сравнение и ветвление логики (если).
:
Альтернативная логическая ветвь, в случае '?' условие ложно (иначе).
?loc = caves loadout 1 : loadout 2
:?
Альтернативная логическая ветвь, с дополнительными условиями (иначе если).
?loc = caves loadout 1 :?loc = deadwood loadout 2 : loadout 3
//
Комментарий. Весь текст справа от '//' не имеет логического эффекта при выполнении скрипта.
?loc = caves loadout 1 //Вышеуказанное экипирует разгрузку 1 для пещер
^
Продолжить предыдущую строку.
?loc=caves | ^loc = mine equip repeating //Это так же как: ?loc=caves | loc=mine equip repeating
3. Состояние игры
Они говорят, что происходит и что перед игроком
?loc
Текущая локация.
?loc = caves loadout 1
?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++
?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@
?harvest
Следующий объект, который можно добыть, к примеру дерево или валун.
?harvest=Boulder equip shovel
?harvest.distance
Расстояние между игроком и ближайшим добывающим объектом.
?loc=Rocky & harvest.distance < 7 equip shovel
?pickup
Текущий собираемый объект нацеленный игроком.
?pickup.distance
Расстояние между игроком и выбранным собираемым объектом.
?time
Номер текущего кадра месторасположения.
?time % 300 = 0 >Каждые 10 секунд ты будешь видеть это сообщение
?totaltime
Текущий номер кадра месторасположения, накопленный в случае локации босса.
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@
?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.name
Имя выбранное игроком.
этот пример рисует имя игрока над головой var name var x name = player.name x = string.Size(name) / -2 >o@x@,-2,@name@
?totalgp
Суммарное количество "Очков снаряжения" в инвентаре, калькулированное с звёздных уровней предметов и бонусов чар.
>Мои очки снаряжения = @totalgp@
?rng
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
Выбирает случайное число от 0 до 9999.
?rng < 5000 >Heads! : >Tails!
этот пример генерирует случайное число от 5 до 24 var min = 5 var max = 24 var n = 0 n = min + rng % (max - min + 1)
?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@
4. Команды
Они говорят игре сделать что-то
activate (ability)
Активирует способность предмета.
(ability) может иметь следующие значения: potion, P, left, L, right, R.
activate R активирует способность предмета, экипированного с правой стороны, такого как Топор
equip (str)
Экипирует предмет. (str) имеет ограничение в 7 критериев.
equip vigor crossbow *8 +5
equipL (str)
Экипирует предмет в левую руку.
equipL poison sword
equipR (str)
Экипирует предмет в правую руку.
equipR vigor shield
loadout⠀(n)⠀⠀⠀⠀⠀⠀⠀
Экипирует конкретный номер разгрузки.
?loc = caves loadout 1 ?loc = deadwood loadout 2
> (str)
Печатает строку в верхней части экрана.
>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,ascii ^##_ ^#| | ^_|_|_ asciiend
>`X,Y, [#rrggbb,] (str)
Продвинутая печать относительно левого верхнего угла экрана.
этот пример печатает'Hello World!', но использует переменные для координат и цвета var posX = 10 var posY = 5 var color = rainE1 >`@posX@,@posY@,#@color@,Hello World!
>cX,Y, [#rrggbb,] (str)
Продвинутая печать относительно центра экрана. Похоже на ">` ". Обратите внимание, что выбор цвета необязателен.
этот пример демонстрирует необязательный выбор цвета и он по умолчанию белый >c0,0,Hello World!
>fX,Y, [#rrggbb,] (str)
Расширенная печать относительно цели делает положение головы.
этот пример рисует красное перекрестие на целевого врага >f-2,0,#ff0000,ascii ^##! ^-#·#- ^##¡ asciiend
var (variable)
Объявляет переменную (ссылка на пункт 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 hud
Скрывает и отключает элементы пользовательского интерфейса, включая: ресурсы, точки попадания, кнопки способностей и кнопку паузы.
enable hud
Возвращает все элементы пользовательского интерфейса, скрытые предыдущей командой 'disable hud'.
disable loadout print
Скрывает сообщения, которые появляются при отзыве загрузки.
enable loadout print
Возвращает печать сообщений о загрузке.
disable player
Скрывает игрока. Не влияет на бой, это только косметика.
enable player
Возвращает рендеринг игрока, если он был скрыт предыдущей командой 'disable player'.
play (sound)
Играет звуковой эффект (ссылка на Приложение - Звуковые Эффекты).
?key = primary play buy
5. Сравнения
Используется в сочетании с состоянием игры для принятия решений
=
Сравнивает значения равные или строка содержит.
?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
6. Переменные
Переменные - это способ хранения значения для последующего использования

Объявите новую переменную с ключевым словом 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@
(Этот пример также демонстрирует, как соединять строки с помощью оператора '+')

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

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

В этом примере создается счетчик, который увеличивается на 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() >Время было: @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 и выдает ошибку, если предел превышен.
9. Встроенные функции [1]
Хотя сценарии могут определять свои собственные функции, Камень разума поставляется с набором предопределенных/собственных функций, которые ведут себя подобно командам, но отличаются тем, что они более четко сгруппированы по темам, могут принимать параметры и иногда возвращать значение.

draw.Bg(x, y, color)
Нет возвращаемого значения
Устанавливает цвет фона в определенной позиции экрана.
draw.Bg(5, 4, #red)
draw.Bg(x, y, color, w, h, color, style)
Нет возвращаемого значения
Рисует прямоугольную форму в указанном положении и размере. Граница прямоугольника определяется цветом и номером стиля. Отрицательные числа стиля делают центр прямоугольника прозрачным. Примечание - В это время продвинутые отпечатки всегда рисуются поверх коробок.
Используйте этот пример для изучения различных стилей, нажимая на стрелках влево/вправо
var style = 1 ?key = leftBegin style-- ?key = rightBegin style++ draw.Box(10, 5, 30, 15, #333333, style) >`12,6,#ffffff,Style = @style@ >`12,8,#888888,Press Left/Right\nto change style
draw.Bg(x, y, color, w, h)
Нет возвращаемого значения
Устанавливает цвет фона прямоугольной области на экране.
draw.Bg(5, 4, #cyan, 10, 6)
draw.Clear()
Нет возвращаемого значения
Очищает весь экран.
draw.GetSymbol(x, y)
Возвращает строку
Возвращает глиф в позиции экрана (x, y).
Этот пример выбирает координату экрана и рисует символ, найденный там в левом верхнем углу. Выбор [] может быть перемещен игроком:
var s var x = 20 var y = 10 var drawX ?key=leftBegin x-- ?key=rightBegin x++ ?key=upBegin y-- ?key=downBegin y++ s = draw.GetSymbol(x, y) >`0,1,Symbol = @s@ drawX = x - 1 >`@drawX@,@y@,[#]
draw.Player()
Нет возвращаемого значения
Рисует персонажа игрока со всем оборудованием и надстройками в определенной точке сценария.
int.Parse(str)
Возвращает целое число
Преобразует строку числа в целочисленное значение. Если данная строка не является числом, выдается ошибка.
var s = "999" var i = int.Parse(s) i++
item.CanActivate()
Возвращает логическое значение
Возвращает 'Истину', если можно активировать способности предмета. В противном случае 'Ложь'. В некоторых игровых ситуациях активация способностей отключена, даже если они не находятся на перезарядке, например, за мгновение до боя с боссом или во время кинематографического фильма.
?item.CanActivate() equip Bardiche 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"
loc.Leave()
Нет⠀возвращаемого⠀значения⠀⠀⠀
Вызывает отказ от запуска, как если бы игрок нажал, чтобы уйти вручную.
loc.Pause()
Нет возвращаемого значения
Вызывает приостановку прогона, как если бы игрок нажал кнопку паузы вручную.
math.Clamp(num, min, max)
Возвращает целое число
Содержит число в диапазоне от 'минимум' до 'максимум'. Если число уже находится в пределах диапазона, оно будет возвращено без изменения.
var number = 50 number = math.Clamp(number, 0, 10) число ограничили и равно 10
9. Встроенные функции [2]
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)
string.Equals(str1, str2)
Возвращает логическое значение
Принимает два строковых параметра и возвращает 'Истина', если они в точности совпадают. В противном случае возвращает 'Ложь'. Деликатный случай.
var a = "foo" ?string.Equals(a, "foo") >Эти строки равны : >Эти строки НЕ равны (Строки в этом случае равны. string.Equals() возвращает 'Истина')
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.Size(str)
Возвращает целое число
Принимает строковую переменную в качестве параметра и вычисляет ее длину в количестве символов.
var a = Hello World! var size = string.Size(a) >Размер = @size@
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")
Type(var)
Возвращает строку
Оценивает тип переменной и возвращает строковое представление. Возможные типы: 'string', 'int', 'bool', 'function', 'object' и 'null'.
var a = 0 ?Type(a) = int >Переменная 'a' целое число.
10. Импорт внешних скриптов
Твой сценарий не обязательно должен быть в Камне Разума. Stonescript поддерживает загрузку внешних файлов с помощью ключевого слова import. Для работы внешних сценариев они должны быть расположены в папке с сохраненными файлами[stonestoryrpg.com], внутри папки/Stonescript и заканчиваться на '.txt'.

В самом простом примере внешний скрипт импортируется и выполняется так, как если бы он был непосредственно в вашем Камне Разума, что делает этот удобный способ организации сценариев фарма:
import rocky import deadwood import caves import forest

Когда скрипт импортируется, он копируется в свой собственный контейнер и возвращается как ссылка. Переменные, объявленные во внешнем скрипте, изолированы и не взаимодействуют с переменными в других скриптах. В этом примере сценарий утилиты печати предлагает упрощенные услуги:
// print_util.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 раз, в отличие от каждого кадра.
11. ASCII-арт
В Камне разума пользовательские ASCII-арты могут быть встроены в сценарии и отображены на экране с помощью расширенных команд печати. Есть несколько способов сделать это, и некоторые символы имеют специальное поведение:

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

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

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

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

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

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) удаляет первый элемент.
Элементы справа перемещаются на предыдущую позицию.
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@ в этом примере названия фруктов печатаются слева от экрана

ПРИМЕЧАНИЕ. Прямой доступ к многомерным массивам, например. a[0][0], в настоящий момент возвращает синтаксическую ошибку. Вот способ получить к ним доступ:
var a = [[1,2], [3,4]] var b var value b = a[1] value = b[0] >Найдено значение @value@ в a[1][0]
14. Фильтры поиска
Они используются при оценке состояния игры.
?foe = insect | foe = poison loadout 3
  • poison //яд
  • vigor //энергия
  • aether //эфир
  • fire //огонь
  • air //воздух
  • ice //лёд
  • arachnid //паукообразный
  • serpent //змея
  • insect //насекомое
  • machine //механизм
  • humanoid //человекообразный
  • elemental //элементаль
  • boss //босс
  • phrase1 // Фаза 1 Босса
  • phrase2 // Фаза 2 Босса
  • phrase3 // Фаза 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] //очарование бонуса предмета
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 в игре дает вам много информации о состоянии игры.

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

Добавление математических нативных функций.
Постоянные переменные, которые сохраняют значение между выполнениями приложения.
Рыбалка мини-игра.

?has = potion
Проверяет, есть ли зелье, доступное для использования
?has = (item)
Проверяет, экипирован ли данный предмет
?hasL = (item)
Проверяет, экипирован ли данный предмет слева
?hasR = (item)
Проверяет, экипирован ли данный предмет справа

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

brew [resources] - Создает зелье в начале локации. Например: brew wood stone

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

foes - Список врагов в пределах 46 единиц
Приложение - Звуковые Эффекты
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
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
< >
9 Comments
AquiloSpiritus Feb 9 @ 6:42am 
Появилось много новых команд string. и te.
Будет ли обновление?
AquiloSpiritus Feb 4 @ 12:17am 
@Режу салат
Работает такая конструкция
?buffs.string = "pick_pocket:"+thiefArmCount
Соответственно вам нужно
?debuffs.string = "НАЗВАНИЕ ДЕБАФА:"+ПЕРЕМЕННАЯ С ЧИСЛОМ СТЕКОВ
AquiloSpiritus Feb 2 @ 10:44pm 
@Режу салат
Если просто по числу дебафов то:
?debuffs.count >= 15
activate potion

Если именно яда, то смотреть debuffs.string. Вывод на экран:
>`10,10,@debuffs.string@
но проще сделать фильтр на конкретного боса: ?foc=temple
AquiloSpiritus Feb 2 @ 10:39pm 
9. Встроенные функции [1]
Пропущен параметр функции:
item.GetCooldown(str)

Skeleton Arm
"skeleton_arm"


14. Фильтры поиска
лишняя r
phrase1 // Фаза 1 Босса
phrase2 // Фаза 2 Босса
phrase3 // Фаза 3 Босса
Режу салат May 9, 2021 @ 7:33am 
Есть у кого наброски готовых скриптов для фарма или как сделать так, чтобы в храме на боссе я выпивал зелье при получении 15 стаков яда на себе?
Н̵а̷ч̴а̵л̷ь̷н̶и̷ Apr 8, 2021 @ 1:28am 
как перекрасить количество хп в правом нижнем углу?
Cucumber_RU  [author] Dec 27, 2020 @ 9:43pm 
Это Stonescript детка
доавята Dec 27, 2020 @ 6:06am 
и что это такое
QuBillion Mar 1, 2020 @ 1:00pm 
нихрена не понял.но очень интересно