npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

vnjson

v1.5.4

Published

Visual Novel Engine

Downloads

6

Readme

Установка

  1. Установить nodejs
  2. Скачать этот репозиторий mcap.zip
  3. В терминале (консоле) выполнить команду npm install
  4. Установить rollup глобально npm install rollup -g
  5. Запустить сборку скриптов npm run dev
  6. Отктыть в браузере страницу http://localhost:9000
  7. Открыть инструменты разработчика браузера F12

Как использовать

Для начала необходимо объявить персонажей. Откройте файл ./src/$root/characters.yaml Внутри которого можно зарегестрировать персонажей. От чьего лица будут идти реплики

Например. Реплики в нутри скрипта мы пишем так

# $root/characters.yaml

- id: $, # Знак доллора ипользуется как алиас для реплики - строчки
  name: Автор

- id: a, 
  name: Алиса
#label.yaml
- Привет Мир! # name = Автор
- Вторая реплика
- Третья реплика
- a: Четвертая реплика # name = Алиса
- $: Пятая реплика # name = Автор

Немного о YAML

YAML использует синтаксис ключ/значение

key: value
'my key': Hello world!

- key: test1
  key: test 2 #Недопускается использование одинаковых ключей в одном объекте

В синтаксисе yaml используется система отступов, как в Python. Каждый отступ с двумя пробелами представляет новый уровень.

level1:
  level2:
    Level3:
{
  level1: {
    level2: {
      level3: {}
    }
  }
}

Можете поэксперементировать в онлайн редакторе

http://nodeca.github.io/js-yaml/

https://www.json2yaml.com/

https://onlineyamltools.com/convert-yaml-to-json

Файловая структура

Рабочая область это папка ./src/scenes

Внутри неё папки первого уровня являются сценами. Внутри скрипта мы будет обращаться по этим именам

/scenes
├───$root
├───scene_1
├───scene_2
├───scene_3 # имена сцен можно создавать произвольные кроме $root

Такая файловая структура собирается в файл /public/scenes/vn.json

{
  $root: {},
  scene_1: {},
  scene_2: {},
  scene_3: {}
}

Структура сцены

/scenes
├───$root
│   ├───assets
│   │   ├───background.png  #имена файлов станут id для доступа к этим файлам
│   │   └───audio1.mp3
│   ├───data
│   │   ├───файл_с_текстовыми_данными.txt
│   │   └───файл_с_текстовыми_данными.php
│   └───$init.yaml #точка входа в игру
├───scene_2
│   └───$init.yaml 
            #Внутри каждой сцены желательно создавать файл $init.yaml
            #в первом объекте которого, будет описываться какой экран отобразить
            #а так же аудио и прочие элементы. Это не обязательно, но упростит отладку новеллы.

Внутри сцены лежат файлы с раширением yaml это так называемые метки (label) Если иначе выразится то сцена является Томом книги, а метки являются главами.

scene.label
volume.chapter
vn.json
{
  $root: {
    assets: [
      {name: 'background', url: './scenes/assets/background.png'},
      {name: 'audio1', url: './scenes/assets/audio1.mp3'}
    ],
    data: {
      'файл_с_текстовыми_данными.txt': 'Текст в формате json',
      'файл_с_текстовыми_данными.php': '<?php print "текст"; ?>'
    },
    $init: [
      "Реплика номер 1",
      "Реплика номер 2",
      "Реплика номер 3",
      { jump: 'scene_2.$init' }
    ]
  },
  scene_2: {
    $init: [
      "Реплика номер 4"
    ]
  }
}

В качестве описания сценария используется yaml это язык описания структур данных.

Экраны

Компоненты

Плагины

:paperclip: - плагины включены в библиотеку vnjson.js | | | | ----------------------------------| ---------------------------------------------------------| | character | Обработчик реплик персонажей :paperclip: | | jump | Прыжок между сценами и метками :paperclip: | | next | Переход на следующий объект скрипта :paperclip: | | target | Прыжок по якорям внутри label :paperclip: | | timeout | Вызывает другие плагины по истечению времени :paperclip: | | debug | Вывод сообщений об ошиках | | dialog-box | Диалоговое окно | | menu | Внутриигровое меню | | clear | Скрывает все компоненты и отключает аудио | | assets-loader | Загрузка медиа ресурсов | | audio | Воспроизведение аудио | | sound-hover | Воспроизводит звук при наведении на кнопки | | show | Отображает персонажей на экране | | term | Выводит код с подсведкой синтаксиса | | slide | Отображает изображение по центру экрана | | hands | В диалоговом окне два слота (руки) | | screen | Переключение экранов | | scene | Отоброжение заднего фона внутри экрана | | animate | Добавление анимации к элементам | | embed | Подключение сторонних ресурсов через iFrame | | inv | Инвентарь | | | |

Все ключевые слова первого уровня являются плагинами. По своей сути это назание событий которое вызываются когда игрок дойдет по скрипту до этого ключевого слова.

Плагины предустановлены и находятся внутри папки ./src/plugins

character

Этот плагин отвечает за обработку реплик песонажей, Но явно нигде не вызывается. На базе этого плагина работает плагин dialog-box

- Реплика 1 # реплика от имени автора
- Реплика 2
- $: Реплика 3 # так же реплика от имени автора
- a: Реплика от Алисы
  scene: background1 #scene/assets/background1.ong

Символ $ зарезервирован для повествования от лица автора. Так же от имени автора выводятся реплики без указания индификатора персонажа

Персонажей необходимо предварительно зарегестрировать внутри файла /scenes/$root/characters.yaml

/scenes
├───$root
│   ├───charactes.yaml
#charactes.yaml
- id: $      # Является алиасом для реплики без параметров [ - Реплика  ] = [ $: Реплика ]
  name: ""   # Автор
  nameColor: '#e0b33f'    # Цвет имени персонажа 
  replyColor: '#f2cd11'   # Цвет реплики персонажа

- id: a            # обязательный параметр
  name: Алиса      # обязательный параметр
  nameColor: '#49de58' # цвет необходимо писать в ковычках
  replyColor: '#a4deaa'
  logo: capitan # Можно хранить дополнительные параметры
  age: 17
  bio: -

Плагин [ characters ] берёт зарегестрированные id персонажей и случает когда они встретятся по мере прохождения скрипта. Потом плагин dialog-box получает эти данные и выводит в диалоговое окно

:warning: Обратите внимание что в id используется малое количество симовлов, чаще всего один. Поэтому часто можно допустить ошибку и написать символ на другом языке. Например ( c и c ) являются разными символами. Один на русской, а другой на английской расладке.

jump

Делает прыжки между сценами (scene), и между метками (label) внутри сцен

scene1/part1.yaml

- У лукоморья дуб зелёный
- Златая цепь на дубе том
- И днём и ночью кот учёный
- Всё ходит по цепи кругом
- jump: part2 # Прыжок в метку part2 внутри этой же сцены

scene1/part2.yaml

- Идёт направо — песнь заводит,
- Налево — сказку говорит.
- jump: scene2.$init # Прыжок в другую сцену

Можно делать прыжки на конкретную позицию внутри скрипта scene.label.index Позиция внутри label (метки) отсчитывается с нуля

scene2/$init.yaml

- Там чудеса: там леший бродит,
- Русалка на ветвях сидит
- jump: $root.$init.3 

После того как был совершён прыжок, вызывается событие this.emit('init', scene)

# Прыжок на конкретную метку
http://localhost:9000/?jump=scene.label
# Прыжок на метку по умолчанию $init
http://localhost:9000/?jump=scene  # default $init

next

Выполняет текущий объект контекста и перескакивает на следующий объект скрипта не дожидаясь действий пользователя

- scene: bg1 
  next: true

- $: Привет Мир! 

target

Плагин [ target ] делает прыжок внутри текущей главы/метки в помеченное место (якорь) которое маркируется ключевым словом [ _test ] с символом нижнего подчёркивания в начале

- $: Там на неведомых дорожках
  target: _mark1 # jump to _mark1

- $: Следы невиданных зверей;
  _mark2: true

- Избушка там на курьих ножках
- Стоит без окон, без дверей;
- $: Там лес и дол видений полны;
  jump: $root.$init # make a jump from this label

- $: Там о заре прихлынут волны
  _mark1: true  

- На брег песчаный и пустой,
- И тридцать витязей прекрасных
- target: _mark2 # jump to _mark2

timeout

Выполняет другие плагины по истечению таймера (в миллисекундах)

- timeout:
    exec: 
      jump: $root.$init
    timer: 1000

debug

# ./src/scenes/$root/package.yaml

debug: false #true

F12 - инструменты разработчика F5 - Обновить страницу Ctrl+R - Обновить страницу Ctrl+Shift+R - Обновить страницу без кэша

dialog-box

Является надстройской над плагином character Выводит реплику текущего персонажа, а так же его имя.

- dialog-box: true # отобразить компонент диалогового окна
- dialog-box: false # скрыть компонент диалогового окна
- dialog-box: clear # очишает диалоговое окно от реплики и имени персонажа

menu

Плагин для внтуриигрового меню.

- menu:
    luna: Отправиться на Луну
    mars: Лучше на Марс 
    next: Пожалуй останусь на Земле #Можно внутри можно использовать [ next ]

#next
- Земля

### ### ##
- menu:
    $: Куда бы мне отправить #Вопрос от автора
    luna: Отправиться на Луну
    mars: Лучше на Марс 
### ### ##
- menu:
    a: Куда бы мне отправить #Вопрос от Алисы
    luna: Отправиться на Луну
    mars: Лучше на Марс 
### ### ##
- menu:
    a: Куда бы мне отправить #Вопрос от Алисы
    luna: Отправиться на Луну
    disabled: Лучше на Марс #Не активный пункт меню
    disabled_23: Еще один заблокированный пункт
    next: Дальше
#Что бы заблокировать пункт меню используется ключевое слово [ disable ]
#Но так как заблокировавнных пунктов может быть несколько, а ключи внутри объекта
#не могут повторяться, то к ключевому слову пожно прибавить какой-нибудь префикс disabled_24

- $: Пример с маркировкой
  _mark1: true

- menu:
    luna: Отправиться на Луну
    mars: Лучше на Марс 
    _mark1: В начало
   

clear

Отключает воспроизведение текущей аудиодорожки, а так же скрывает все компоненты

- clear: all

assets-loader

Загрузка медиа ресурсов Вызывается не явно. По срабатыванию события $vnjs.emit('setTree')

Излучает события
$vnjs.emit('preload')
$vnjs.emit('load', asset)
$vnjs.emit('postload')
/scenes
├───$root
│   ├───assets
│   │   ├───background.png  #имена файлов станут id для доступа к этим файлам
│   │   └───audio1.mp3

./public/scenes/vn.json

{
  "$root": {
    "assets": [
        { "name": "background", "url": "./scenes/assets/background.png" },
        { "name": "audio1", "url": "./scenes/assets/audio1.mp3" }
    ]
  }
}

После чего предзагруженные медиа ресурсы можно использовать во время прохождения визуальной новеллы

- scene: background
  audio:
    name: audio1
    action: play
    speed: 0.3
    volume: 0.01
    loop: true

audio

- audio:
    name: audio1
    action: play
    speed: 0.3
    volume: 0.01
    loop: true

- audio: false # stop

Так же можно воспроизвести звук в отдельном аудио канале

- sound: audio1

sound-hover

Вызывается не явно. Только при наведении игроком на кнопку с классом .sound-hover

<div class="sound-hover">Кнопка со звуком</div>

show

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

- center: characterImage_1
- left: characterImage_2
- right: characterImage_3

- center: false # очистить элемент персонажа
- left: false #
- right: false #

slide

Отображает изображение по центру экрана, сохраняя при этом фактический размер изображения

- slide: characterImage_1
- slide: false

- slide:
    name: characterImage_1
    css:
      top: 320px
      border: 15px dashed orange

Свойство css принимает любые css свойства. Фактически является оберткой метода jQuery.css

hands


- hands: true

- hand-left: imageName1
- hand-right: imageName2

- hands: false

term

Компонент для вывода кода с подсведкой синтаксиса

- term: lesson_1.py #planeText[extname]


- term: lesson_1.lua  

- term: imageName # выводит изображение в компоненте терминала

- term: false # скрыть терминал
/scenes
├───$root
│   ├───assets
│   ├───data
│   │   ├───lesson_1.lua
│   │   └───lesson_1.py

./public/scenes/vn.json

{
  "$root": {
    "data": {
      "lesson_1.lua": "...",
      "lesson_1.py": "..."
    }
  }
}

screen

Экран это div элемент с короторый находится на первом уровне внутри элемента #screen . У элемента экрана есть id и класс .screen

<div id="screen">
  <div id="screenName" class="screen">
    Первый экран
  </div>
</div>

Предустановленно два экрана. Один для главного меню и один для потока игры. Размеры экрана шираина 1024px высота: 768px

scene

Отображает изображение на заднем фоне экрана #stream

scene: imagename

Изображения для сцен лучше сжимать, что бы они меньше весили в качестве формата для фона рекомендую использовать .webp или .jpg

Файлам находящимся в папках assets и data необходимо задавать уникальные имена

animate

Обёртка вокруг метода jQuery.animate({})

  • animate: selector: .dialog-box duration: 1000 #время выполнения анимации в милисекундах css: background-color: red opacity: 0.5

embed

Встраивает сторонние ресурсы через iFrame элемент. Которые необходимо разместить в файле ./src/scenes/$root/embed.yaml

yt-salut: <iframe <iframe width="100%" height="100%" src="https://www.youtube.com/embed/a_o-P-lIDEA?start=50"></iframe>
3d-conni: <iframe <iframe width="100%" height="100%" src="https://sketchfab.com/models/d0c68158e3f5482f87a9d89ada23c0bc/embed"> </iframe>

yt-salut - это индификатор по которому iframe будет вызываться из YAML скрипта

Каждый индификатор автоматически регистрируется с как плагин


- yt-salut: true

- yt-salut: false 

inv

Инвентарь

./scenes/$items/assets - изображения

./scenes/$items/store.yaml - описание предметов

- inv: true
- Создаем сцену [ $items ], а внутри неё папку [ assets ] и ложим в неё файлы с предметами
- Далее внутри этой сцены создаем файл в котором будет описываться
- n: Название ему необходимо задать store.yaml
  inv-set: gear # должно быть описано внутри ./scenes/$items/store.yaml
- Внутри него описываем структуру предметов
- a: В оный день, когда над миром новым
- a: Бог склонял лицо свое, тогда
  inv-get: gear
- a: Солнце останавливали словом,
- a: Словом разрушали города.
- jump: $init