Поиграл я, значит, в RimWorld и решил понять как это работает хотя бы концептуально.
Чтобы обмозговать эту задачу, я составил JSON-структуру описывающую человека.
Органы, части тела, кровообращение, иммунная система и пр.
И тут я задумался. А как, собственно, менять параметры в этой структуре?
Это ж замаешься их выискивать!
А ведь ещё из-за их изменения человек может скопытиться.
В сухом остатке получится, что надо за 1 условный ход перебрать всё дерево для поиска и изменения параметров.
А после ещё проверить "нормальность параметров".
К примеру, у человека закончилась кровь и он умер.
И тут я подумал, а пусть параметры сами себя меняют!
Как? А расширим JSON функциями-выражениями, которые до боли будут напоминать форт!
Вопрос: Почему именно форт?
Ответ: Простейший парсер
Вопрос: И всё?!
Ответ: Да, если найдёте ещё неочевидные преимущества, буду только рад.
Вот например набросал примерный код для выработки иммунитета от болезни.
Код:
( 60 0 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye )
Смысл выражения:
60 - кол-во ходов, за которые выработается иммунитет
0 - счётчик выработанности иммунитета
'speed hour' - строка-ключ на параметр отражающий скорость выработки иммунитета за 1 ход.
this - взять строку как ключ и вернуть ссылку на этот объект в JSON, берётся начиная от первого объемлющего объекта
+ - увеличить значение объекта-счётчика на значение от объекта на вершине стека
=< - внезапно, сравнить два значения объектов. Если они не равны или счёткик больше покинуть выражение
add - добавить объект в объект, если он это позволяет
delete - удалить объект с ключом "грипп" в объекте.
bye - удалить выражение
Соот-но, каждых ход выражение будет меняться
Код:
( 60 1 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye )
...
( 60 2 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye )
...
и т. д.
А теперь всё это вместе с кусочком данных в формате JSON
Код:
'immune system':
{
'speed hour':1 // скорость выработки иммунитета за ход
'defend':['tetanus',] // к чему выработан иммунитет. Для примера тут написан столбняк
'disease':{
// болезни, с которыми сейчас борется иммунитет
'грипп: [
( 60 0 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye ),
( 240 0 1 + =< 'dead' signal )
]
}
}
Соот-но, у нас тут явно какой-то слабый грипп.
Короче,
задача перебрать за ход все параметры и после перепроверить их на корректность.
превращается в простой перебор, ибо выражения на этом диалекте форта тоже объекты.
И если произойдёт неординарное событие (смерть, обморок и пр.), то об этом станет известно сразу же.
В штатном же режиме параметры будут изменяться сами собой.
А теперь скажите мне, какой велосипед я изобрёл
Поиграл я, значит, в RimWorld и решил понять как это работает хотя бы концептуально.
Чтобы обмозговать эту задачу, я составил JSON-структуру описывающую человека.
Органы, части тела, кровообращение, иммунная система и пр.
И тут я задумался. А как, собственно, менять параметры в этой структуре?
Это ж замаешься их выискивать!
А ведь ещё из-за их изменения человек может скопытиться.
В сухом остатке получится, что надо за 1 условный ход перебрать всё дерево для поиска и изменения параметров.
А после ещё проверить "нормальность параметров".
К примеру, у человека закончилась кровь и он умер.
И тут я подумал, а пусть параметры сами себя меняют!
Как? А расширим JSON функциями-выражениями, которые до боли будут напоминать форт!
Вопрос: Почему именно форт?
Ответ: Простейший парсер
Вопрос: И всё?!
Ответ: Да, если найдёте ещё неочевидные преимущества, буду только рад.
Вот например набросал примерный код для выработки иммунитета от болезни.
[code]( 60 0 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye )[/code]
Смысл выражения:
60 - кол-во ходов, за которые выработается иммунитет
0 - счётчик выработанности иммунитета
'speed hour' - строка-ключ на параметр отражающий скорость выработки иммунитета за 1 ход.
this - взять строку как ключ и вернуть ссылку на этот объект в JSON, берётся начиная от первого объемлющего объекта
+ - увеличить значение объекта-счётчика на значение от объекта на вершине стека
=< - внезапно, сравнить два значения объектов. Если они не равны или счёткик больше покинуть выражение
add - добавить объект в объект, если он это позволяет
delete - удалить объект с ключом "грипп" в объекте.
bye - удалить выражение
Соот-но, каждых ход выражение будет меняться
[code]
( 60 1 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye )
...
( 60 2 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye )
...
и т. д.[/code]
А теперь всё это вместе с кусочком данных в формате JSON
[code]
'immune system':
{
'speed hour':1 // скорость выработки иммунитета за ход
'defend':['tetanus',] // к чему выработан иммунитет. Для примера тут написан столбняк
'disease':{
// болезни, с которыми сейчас борется иммунитет
'грипп: [
( 60 0 'speed hour' this + =< 'грипп' 'defend' this add 'грипп' 'disease' this delete bye ),
( 240 0 1 + =< 'dead' signal )
]
}
}
[/code]
Соот-но, у нас тут явно какой-то слабый грипп. :shuffle;
Короче,
задача перебрать за ход все параметры и после перепроверить их на корректность.
превращается в простой перебор, ибо выражения на этом диалекте форта тоже объекты.
И если произойдёт неординарное событие (смерть, обморок и пр.), то об этом станет известно сразу же.
В штатном же режиме параметры будут изменяться сами собой.
А теперь скажите мне, какой велосипед я изобрёл :))