Редактор генераторов


Представляю вам АЛЬФА версию.
Задача оказалась сложнее, чем я рассчитывал, и на ее реализацию ушли все выходные, и часть сегодняшнего дня. Наверное я бы и не стал пока браться, если бы знал сколько это займет времени, но я не знал. Да и идея эта крепко засела у меня в голове. В общем в каком-то виде я его все же сделал. В ближайшие дни планирую перегнать в него все свои прошлые генераторы из прошлых реализаций, подправлю баги. И тогда, наверное, переведу в статус БЕТЫ :)
paradoxdream.com/ngen
Принципы работы загрузки и сохранения во многом похожи на мой лист персонажа, поэтому пересказывать не буду. А перейду непосредственно к функционалу самого редактора. Во первых, для авторизированных пользователей доступна возможность «опубликовать», что позволит видеть ваш генератор среди прочих, в панеле слева.
Что бы создать генератор, нажимаем на ссылку «Создать свой генератор», или перейдя по ссылке paradoxdream.com/ngen/new
Все генераторы состоят из элементов 5 типов(я не уверен что хорошо подобрал терминологию, так что если у вас появятся предложение по ее изменении, пишите):
1) Генератор – последовательность элементов собственно и образающая типичный генератор. Может содержать в себе элементы любых типов.
2) Словарь – коллекция строк, из которых случайным образом выбирается одна.
3) Строка – просто строка. Например можно использовать для пробела.
4) Объединение – во многом похоже на словарь, с той разницей, что может содержать в себе элементы любых типов, и выбирает случайно один из них. Тут следует сказать кое-что о «вероятностях». Все вложенные элементы воспринимаются как единая сущность, кроме словарей. Пример:
Например есть два словаря:
А) меч, кинжал
Б) шлем, щит, кольчуга, нагрудник
К примеру мы вставили эти два словаря в объединение. Вероятность появления элементов двух этих словарей будут равновероятными. Т.е. вероятность появления оружия будет 1 к 3, а вовсе не 1 к 2. Это сделано специально(на то были причины, и они станут очевидны после будущих расширений функционала), но если вдруг вам надо сделать иначе, всегда можно вставить в объединение два генератора, и в каждый из них встроить по одному словарю.
5) Ссылка – элемент, который может ссылаться на любой другой элемент. Позволяет повторно использовать одни и те же элементы.

А теперь попробую написать простейший туториал по создания простого генератора.
Для создания нового генератора переходим по ссылке paradoxdream.com/ngen/new
Заполняем его имя, например пишем в графе название «Пример 1».
Нажимаем кнопку Генератор, что бы создать элемент «генератор».
Нажимаем карандашик, что бы его отредактировать. В открывшемся окне меняем имя на «оружие» и ставим галочку Публичный. Нажимаем кнопку «сохранить изменения».
Теперь создадим дочерний элемент «словарь». Для этого в заголове генератора нажмем «плюс» и выберем «словарь».
Теперь в нажмем на синий карандаш в заголовке словаря, и в поле текст введем текст:
Золотой
Серебряный
Железный
Нажимаем кнопку «сохранить изменения».
Теперь снова нажмем +, что бы создать в генераторе еще один элемент – строка. Войдем в редактирование строки и напишем там единственный символ – пробел.
Снова нажмем +, и создадим в генераторе еще один словарь. Войдем в редактирование словаря и в поле словарь напишем:
меч
кинжал
топор
Нажимаем кнопку «сохранить изменения».

Вот наш первый генератор готов. В голубой области нашего нового генератора видно пример генеренной строки. Теперь нажмем кнопку «сохранить», что бы сохранить генератор в целом. И можно нажать кнопу «просмотр», что бы полноценно им попользоваться.

Ну и давайте напоследок немного модифицируем наш генератор, что-бы увидеть другие возможности редактора.
1) Нажмем на кнопку Объединение, что бы создать элемент этого типа на верхнем уровне.(автоматически он назовется «элемент_4»)
2) Нажмем плюс на панели нашего прошлого генератора и выберем пункт «создать ссылку». Назжем клавишу мышки над зоголовком нашей ссылке и перетащим его в белую область нашего Объединения.
3) Создадим внутри нашего объединения генератор. Снова создадим ссылку нашего первого генератора, и перетащим в новый генетратор(элемент_6).
4) Теперь создадим в новом генераторе(элемент 6), строку и изменит текст на пробел.
5) Теперь создадим в новом генераторе(элемент 6), еще один словарь и введем текст:
Крови
Забвения
Ярости
Смерти
6) Теперь войдем в редактор нашего объединения, и введем название, вместо элемент_4 — Оружие 2. И включим галочку публичный. Сохраняем генератор в целом и нажимаем кнопку «просмотр».

29 комментариев

avatar
Жена потестировала и два раза запуталась в понятии «Объединение». Поясню — если вдруг не понятно, это своего рода способ соединить несколько словарей или других сущностей в одну. Например так можно объединить 3 разных генератора, с коротким, средним и длинным иеменем, и в результате будет генерится один из этих трех вариантов. Так или иначе, термин подобран плохо. Есть предложение, как его лучше назвать?
avatar
Инструмент судя по всему классный.
Единственное, вот что. Хорошо было бы иметь туториал по овладению этой штукой.
Готовую штуку и вытащенные наружу параметры этой штуки.
Так чтобы хотя-бы методом тыка, меняя параметры, сразу видеть как изменяется работа готового генератора.
avatar
Ну краткий туториал я вроде как написал :) На более качественный с картинками у меня просто пока времени не было.
Готовую штуку и вытащенные наружу параметры этой штуки.
Так чтобы хотя-бы методом тыка, меняя параметры, сразу видеть как изменяется работа готового генератора.
Не совсем понял… Чисто теоретически там это есть) Под заголовком каждого генератора виден один пример его работы. В общем подробнее если можно о этих пожеланиях…
avatar
А туториал я наверное потом возможно сделаю в виде ролика, как вариант — это будет быстрее чем писать и делать скриншоты :)
avatar
А можно и то, и то? А то иногда хочется убить людей, которые вместо текстовой инструкции в два предложения снимают трехминутный ролик…
avatar
Из этого я делаю вывод, что то, что я написал в посте вообще не понятно?
avatar
Лично мне — понятно. За остальных ручаться не могу)
avatar
Исправил несколько багов, добавил в меню «Добавить пробел» — строку с пробелом, ибо часто надо. И еще сделал на всякий случай клонирование.
avatar
Здорово. Жаль прочитал поздно — пора на работу. Завтра поиграюсь )))
avatar
Запили возможность в тексте вставлять результаты других таблиц и будет отлично. Как Абулафия, но быстрее.
avatar
В тексте — нет, я не хочу этого делать. Именно так работали все мои предыдущие генераторы — они по сути представляли собой своего рода язык программирования генераторов, у них был свой парсер и все такое. Сейчас я от этого полностью ушел, в сторону визуального редактора и возвращатся к этому не хочу. На самом деле все это можно прекрасно делат и без парсеров. Просто часть текста, потом ссылка(как раз таки результат другой таблицы), снова текст. Да, текстовые блоки могут выглядеть довольно странно, зато все наглядно и ничего лишнего. Лучше я потом сделаю для текстов inplace editing, когда ты кликаешь на текст и правишь его там же, без всяких всплывающих окон. Но делать дополнительный синтаксис внутри я не хочу соверешенно.
avatar
Тебе решать, конечно. Увы лишь, никакая ссылка не заменит явно написанного куска текста.
avatar
Я реально пробовал по всякому, и я уверен, что это ничего не решает. В конечном итоге, в работе над нормальным генератором такая мелочь, которая в лучшем случае сэкономит минуту времени — капля в море.
avatar
Я не уверен что это, алгоритмически, мелочь.
А касаемо пользы, см. Абулафия: random-generator.com/index.php?title=Main_Page
avatar
Ну а мне, кажется, именно так, если честно… Вот у меня раньше были такие конструкции...
scorp{@preCorp@postCorp}
preCorp
[
Aero
Alpha
Astro
Auto
Bio
Chemo
Citi
Cosmo
Cryo
Crypto
Cyber
Dyna
Dyno
Delta
Electro
Fabri
Gene
Geneti
Globo
Gyro
Gamme
Humano
Kilo
Lumo
Mango
Maxi
Mega
Micro
Macro
Multy
Nucleo
Neiro
Neo
Photo
Physio
Psycho
Psy
Radio
Techno
Tele
Ultra
Uni
Video
Visio
Golo
Termo
]
postCorp
[
bank
co
com
corp
corporation
digital
dynamics
frontier
innovations
logistics
mantics
matics
mation
motors
nautics
netics
soft
sys
systems
tech
technics
tronics
]


Ну или вот более наглядно…
Привет {|Темный(Светлый)(Гадкий)}( ){@имена.txt}!

Это как раз оно, и это было совершенно не наглядно, хотя мне, как программисту — вполне удобно. Но пытаться научить этому людей? Я бы не взялся, а вот тот инструмент, который я сделал — вполне реально. Он более казуальный. Простота рулит…
Может потом я и сделаю всему этому и текстовое представление, для так сказать, «продвинутых пользователей», если желающих такого инструмента будет достаточное количество. Но пока — нет. У меня просто нет на это времени, ровно как и на поддержку нескольких стандартов.
avatar
Я не чтобы докопаться, но я правильно понял, что у тебя там мог выпасть Technotech?
avatar
Да, мог :) И может, этот генератор сейчас есть на сайте :D
avatar
Правда вероятность этого события равно… Хм, ну на глазок, если не путаю, 0,001, т.е. 1 десятая процента.
avatar
Не совсем понимаю зачем так сложно.
«Тебе выпал <драг-камень> и <1-500> гп» звучит вполне постижимым каждому.
avatar
Может быть :) Поживем увидим… Может и сделаю что-то простое
avatar
Сделал, подробности тут imaginaria.ru/DioWorlds/snova-generatory.html :)
avatar
Кстати, Джек, а есть возможность чужой генератор изменять и сохранять отдельно? думаю, было бы полезно.
avatar
Пока нет, но идея мне нравится. Сделаю как время будет. Правда наверное надо будет сделать галочку — разрешает ли автор генератора это делать :)
avatar
Сделал, подробности тут imaginaria.ru/DioWorlds/snova-generatory.html :)
avatar
Написала пробный генератор (Погода), появились вопросы. :)
Допустим, я хочу добавить туда направление ветра, но только для случаев, когда ветер в принципе есть. То есть, когда штиль, то чтобы направления никакого не выводилось. И хочу добавить осадки (дождь, снег, иногда град), но понятно, что я не хочу для комбинации «Очень жарко+Ясно» осадков в виде снега.
Как мне это сделать без if-конструкций?

Upd: с направлением и силой ветра разобралась, но получилось забавно по распределению вероятностей: всякие «безветрие» и «затишье» — это словарь на 3 элемента, он объединён с генератором, в который вложены словарь значений для собственно силы ветра, на 14 значений, и словарь направлений, 8 значений. Ну так безветрие (штиль, затишье) выпадает заметно чаще, чем ветер-с-силой-и-направлением — как так получается?..
avatar
По вероятностям… Сейчас у тебя по идее такое распределение в объединении: Элемент_8
У тебя там словарь на три элемента, и вложенный генератор. Как я писал в первом посте, union учитывая при вероятностях словари. Т.е. сумарно он сейчас считает, в нем 4 элемента, т.е. вероятность каждого из элменетов словаря Ветер и генератора ветра одинаковы.
Что бы сделать, например, что бы и словарь и генератор выпадали с равной вероятностью, надо просто сделать в объединении еще один генератор, и перетащить словарь внутрь(других элементов не нужно).
По первому вопросы ты уже разобралась или нужны таки консультации?

Вообще Zmaj подогнал очень правильную идею — клонирование генераторов. Просто я не дал ссылок на редакторы тех же примеров, потому что стоило мне их дать, кто то испортит и что называется — другим не достанется. Но если я сейчас смогу давать ссылки на «клон», это решит проблему. Даже не на клон, а просто некая ссылка, которая создает новый(еще не сохраненный генератор), но сразу заполняет себя содержимым другого генератора. Это будет идеальный механизм, мне кажется…
avatar
Про направление ветра разобралась, словарь в генератор перетащила, распределение стало заметно лучше. :) Спасибо. :)

Про осадки пока думаю, там механизм сложнее.

Клонирование содержимого генераторов — весьма хорошая идея. :)
avatar
По вероятностям, я пожалуй поясню, откуда растут ноги у такой вероятности. Дело в том, что у меня на самом деле уже есть механизм склонения прилогательных. Например есть такое генератор
[
Железный
Золотой
Алмазный
]
[
Меч
Кинжал
Катана
]
Железный Катана звучит странновато, верно? ;) Что бы эту проблему решить, мне надо пометить, что меч и кинжал мужского рода, а катана женского, и тогда я смогу просклонять прилагательное. Делать это по каждому элменет вообще не прикольно. Поэтому я добавлю такой атрбут как род непсредственно в словарь(на самом деле там не совсем род, а род+множественное число). И в данном случае сделаю два словара, в одном будет кинжал и меч, а во втором катана. А что бы их соединить, воспользуюсь объединением. Но при этом я хочу, что бы катана и меч выпадали с равной вероятностью. Поэтому элементы словарей в объединении считаются чуточку иначе, что бы обеспечить работу вышеописанного механизма.
avatar
Кстати IF, переменные и какие-то математические выражения я тоже планирую сделать. Иногда это очень нужно для решения нетипичных задач. Например для генерации характеристик персонажа, например когда нам надо рандомно распределить между силой, ловкостью и интелектом число 10 :) Да мало ли что еще можно приудмать? Но не все сразу. Думаю ты как никто нзнаешь, сколкьо у меня задач. А уже существующий иструмент по моему тоже позволяет сделать очень много.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.