0.7.0 • Published 5 months ago

@novely/parser v0.7.0

Weekly downloads
-
License
ISC
Repository
github
Last release
5 months ago

@novely/parser

Парсер для специального языка визуальных новелл

Использование

import { parse, transform } from '!novely/parser';

const ast = parse(source);
const js = transform(ast);

const fn = eval(js);

const story = fn(engine.action, {});

Для чего

Написание историй на js/ts может показаться удобным ввиду типизации. Тем не менее, синтаксис js не является удобным для такого рода деятельности. Достаточно удобным вариантом, хоть и не очень популярным, может оказаться собственный формат. Поскольку истории в Novely не привязаны к какой-либо сложной системе это реализуется достаточно легко. В чём же отличия формата?

В этом формате структура зависит от количества отступов. Это позволяет добиться более лёгкого прочтения.

Ключи основных сцен пишутся в начале строки

start
dojo

В js ключи могут писаться где угодно, тем не менее это будет минимум один или два отступа

engine.withStory({
	start: [],
	dojo: [],
});

loaded.then(() => {
	engine.withStory({
		start: [],
		dojo: [],
	});
});

Экшены описываются через ! и название экшена. После чего или на текущей строки или на следующих находятся параметры.

start
  !dialog Name "Тут можно написать текст\n Добавить перенос"
  !dialog
    \Name
    \
      А можно написать текст таким образом
      Без кавычек

В js такая запись эквивалента следующей:

engine.withStory({
	start: [
		a.dialog('Name', 'Тут можно написать текст\n Добавить перенос'),
		a.dialog(
			'Name',
			`
А можно написать текст таким образом
Без кавычек`,
		),
	],
});

Значения из js передаются через спец-символ %.

start
  !dialog %Person %Text

В js это проще:

engine.withStory({
	start: [a.dialog(Person, Text)],
});

Запись экшена условия, для которого требуется объект, также отличается

start
  !condition
    %jsCondition
    *
      jail
        !dialog Мент "От судьбы не убежишь"
      freedom
        !dialog Кент "Ты убежал, но в этот раз тебе просто повезло"

В js:

engine.withStory({
	start: [
		a.condition(jsCondition, {
			jail: [a.dialog('Мент', 'От судьбы не убежишь')],
			freedom: [a.dialog('Кент', 'Ты убежал, но в этот раз тебе просто повезло')],
		}),
	],
});

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

0.7.0

5 months ago

0.3.0

10 months ago

0.5.0

9 months ago

0.4.0

10 months ago

0.2.2

10 months ago

0.5.2

9 months ago

0.6.0

6 months ago

0.5.1

9 months ago

0.2.1

11 months ago

0.2.0

11 months ago

0.1.0

11 months ago

0.0.2

11 months ago