Обсуждение:Город Тумана — различия между версиями

Материал из Ролевая энциклопедии
Перейти к: навигация, поиск
м (Сравнение моего прототипа с модулем Генеалогии: добавлено)
м (Сравнение моего прототипа с модулем Генеалогии: поменял на то, что реально принимает мой код сейчас)
Строка 108: Строка 108:
 
(столбец Атрибут список d6 d8 d10 d12)
 
(столбец Атрибут список d6 d8 d10 d12)
 
(столбец Умение список (0 —) d6 d8 d10 d12)
 
(столбец Умение список (0 —) d6 d8 d10 d12)
(столбец "Вероятность без переброски" (- 1 (* (< Атрибут 6) (< Умение 6))))
+
(столбец "Вероятность без переброски" вероятность (- 1 (* (< Атрибут 6) (< Умение 6))))
 
</pre>
 
</pre>
  

Версия 18:15, 7 февраля 2024

Эта техническая страница
создана на RPGverse

Алгоритм, которым я подсчитал вероятности

Оставляю тут — чтобы было легче проверить, что я не совершил ошибок, и адаптировать для построения подобных табличек в других статьях. Demetrius (обсуждение) 21:41, 5 февраля 2024 (MSK)

const броскиОднойКости = [1, 2, 3, 4, 5, 6]
const суммы = броскиОднойКости.map(первая => броскиОднойКости.map(вторая => первая + вторая)).flat() 

const условияКолонок = [
  сумма => сумма <= 6,
  сумма => (сумма >= 7) && (сумма <= 9),
  сумма => сумма >= 10,
  сумма => сумма >= 12
]

const прибавки = []
for (i = -5; i <= 7; i++) прибавки.push(i)


function значенияКолонок(прибавка) {
  return условияКолонок.map(
    условие => {
      const подходящих = суммы.map(бросок => бросок + прибавка).filter(условие).length
      const всего = суммы.length
      return подходящих / всего
    }
   )
}

function вероятностьКакПроценты(вероятность) {
  return (Math.round(вероятность * 10000) / 100) + '%'
}

function отформатироватьСтрокуТаблицы(прибавка) {
  const ячейкиТаблицы = [
    (прибавка >= 0 ? '+' : '') + прибавка,
    ...значенияКолонок(прибавка).map(вероятностьКакПроценты)
  ]
  return `| ` + ячейкиТаблицы.join(' || ')
}

function отформатироватьТаблицу() {
  return [
  `
{| class="wikitable" style="margin:auto"
! Прибавка !! Неудача<br>(<6) !! Частичный успех<br>(7—9) !! Полный успех<br>(>10) !! «Динамит» (>12)`,
    ...прибавки.map(отформатироватьСтрокуТаблицы)
  ].join("\n|-\n") + '\n|}'
}

console.log(отформатироватьТаблицу())
Тема! А может, переделать это на Lua и сделать шаблоном, который легко включить в любые статьи? EvilCat (обсуждение) 09:52, 6 февраля 2024 (MSK)
Спасибо! Мне нравится эта идея. Но сделать one-off код куда проще, чем сделать переиспользуемый модуль. Надо подумать, как это всё может выглядеть... Demetrius (обсуждение) 16:44, 6 февраля 2024 (MSK)

Я пока что представляю себе примерно такой DSL, который можно было бы скармливать Lua:

-- Year Zero Engine: вариант с пулом костей
Столбец КоличествоКостей "Количество костей"
Столбец "Шанс успеха"
Столбец "Шанс успеха при переброске", вероятность: больший((КоличествоКостей * 2) раз d6) = 6

-- Year Zero Engine: вариант с атрибутами
Столбец Атрибут "Бросаемые кости/Атрибут", список: d6, d8, d10, d12
Столбец Умение "Бросаемые кости/Умение", список: 0, d6, d8, d10, d12
Столбец "Шанс успеха", вероятность: Атрибут ≥ 6 или Умение ≥ 6
Столбел "Шанс успеха при переброске", вероятность: больший(2 раза Атрибут) ≥ 6 или больший(2 раза Умение) ≥ 6

-- City of Mist
Столбец Прибавка, список: -5, -4, -3, -2, -1, 0, +1, +2, +3, +4, +5, +6, +7
Столбец "Неудача<br>(≤6)", вероятность: 2d6 + Прибавка ≤ 6
-- условие для одного и того же броска; возможно, проще сделать 7 ≤ 2d6 + прибавка ≤ 9
Столбец "Частичный успех<br>(7—9)", вероятность: [результат = 2d6 + Прибавка] результат ≥ 7 и результат ≤ 9
Столбец "Полный успех<br>(≥10)", вероятность: 2d6 + Прибавка ≥ 10
Столбец "«Динамит»<br>(≥12)", вероятность: 2d6 + Прибавка ≥ 12

Но это, кажется, чересчур амбициозно и сложно. Надо подумать, что можно упростить. Demetrius (обсуждение) 16:44, 6 февраля 2024 (MSK)

Да, звучит как что-то чем только ты и я сможем пользоваться, а мне и JavaScript вполне удобен.
Я думала о чём-то вроде модуль «Генератор таблиц вероятностей», параметра у которого были бы «тип броска» (2d6-2) и «условие успеха» (5+). Но, возможно, в этом и есть главная сложность — можно ли описать подобные проверки какой-то простой системой параметров? Или хотя бы вынести в слой абстракции, который человек с опытом Lua 1 месяц сможет напиать (функции «бросок» и «условие успеха»). Ладно, буду думать. EvilCat (обсуждение) 17:12, 6 февраля 2024 (MSK)
А я сделал прототип на Lua! Вот: https://paste.mozilla.org/5c6PANo0/raw (запускать в консоли — или, например, тут: https://onecompiler.com/lua/423pauc7x ) Парсер DSL'а ещё не сделал (входные данные задаю как массивы Lua), но я думаю взять формат типа Лиспа, для которого парсер пишется тривиально. (По сути я хочу формат примерно как выше, но с изобилием скобок, как в Лиспе — чтобы не мучиться с приоритетом операторов и т.п.).
Эта версия не расставляет rowspan/colspan и в ней нет части нужных функций, но как прототип по-моему неплохо получилось. Demetrius (обсуждение) 23:17, 6 февраля 2024 (MSK)
Ещё мысли. Кажется, в Scribunto используется Lua 5.1? Вроде в ней аналог eval'а — loadstring, и вроде он не позволяет получить аргументы (и их надо передавать через глобальные переменные?). Звучит как-то некруто, не знаю (хотя в принципе можно и в глобальных... не знаю.) Если останоситься на написании условий на Lua, и не хочется глобальных переменных, то тогда логику условий придётся описывать в модулях отдельно от игры. ИМХО это чуть менее наглядно. (Мой DSL, конечно, труднее понять, чем Lua [особенно когда я его упростил до лиспоида] — но он будет прямо в коде статьи.)
Впрочем, думаю, в любом случае вряд ли в ближайшее время этим будет заниматься кто-то кроме нас. Так что можно на JS писать и вставлять уже сгенерированное. Demetrius (обсуждение) 02:38, 7 февраля 2024 (MSK)
Вот пример подобного сложного модуля из другой вики — если открыть для правки, там будет удобный редактор. Можно посмотреть на шаблон, который его использует, и на страницы, которые его используют. EvilCat (обсуждение) 09:02, 7 февраля 2024 (MSK)
Я верю, что на десктопе он удобный (сейчас с телефона, в нём этот редактор неюзабелен), но мне кажется менее удобным, что описание таблицы будет сильно далеко от текста статьи. Хотя, наверное, это не принципиально, можно и таким пользоваться. Demetrius (обсуждение) 10:47, 7 февраля 2024 (MSK)
Я надеялась, ты доберёшься до подобных шаблонов и посмотришь, как там устроено задание параметров, которым случалось пользоваться с другим людям кроме автора %) EvilCat (обсуждение) 11:06, 7 февраля 2024 (MSK)
Ну на первый взгляд выглядит, что там что-то типа моего DSL'а, с такими отличиями:
  • (а) у меня новые строки, в этом шаблоне разные аргументы шаблона (мне мой вариант нраваится больше, но не принципиально)
  • (б) есть вспомогательные шаблоны, которые генерируют отдельные строки для (у нас такое тоже можно сделать, хотя ИМХО это не принципиально).
Вынесу в отдельную подветку, а то у нас что-то много вложенности уже. Demetrius (обсуждение) 15:55, 7 февраля 2024 (MSK)

Сравнение моего прототипа с модулем Генеалогии

Общий принцип же такой же: на вход шаблону Генеалогия поступает текст типа такого (только вместо новых строк — |, каждая строка — отдельный аргумент):

child, Симба , Нала , Копа ,border-color: crimson
child, Симба , Нала , Киара ,
child, Симба , Нала , Кайон ,

Просто пользователь не пишет данные в этом формате, а добавляет их через шаблоны типа Генеалогия/Персонаж, Генеалогия/Союз, Генеалогия/Потомок.

Это не так уж и отличается от моего

(столбец Атрибут список d6 d8 d10 d12)
(столбец Умение список (0 —) d6 d8 d10 d12)
(столбец "Вероятность без переброски" вероятность (- 1 (* (< Атрибут 6) (< Умение 6))))

Я взял S-выражения, потому что я хотел иметь произвольную математическую нотацию с возможностью добавлять новые функции. loadstring (аналог eval'а в Lua 5.1) я не брал потому, что передача данных через глобальные переменные или переменные окружения звучит... плохо. А парсер S-выражений написать довольно тривиально.)

Кстати, доп. шаблоны можно использовать, чтобы распарсить математическую нотацию. Типа, чтобы писать {{Вероятность/Столбец|Вероятность без переброски|1 - (Атрибут < 6)*(Умение < 6)}}, и Шаблон:Вероятность/Столбец превращал формулу в S-выражения для основного шаблона. Demetrius (обсуждение) 15:55, 7 февраля 2024 (MSK)

Добавлено: возможно, для ясности стоит в математической нотации писать не Атрибут < 6, а P(Атрибут < 6). Чтобы было ясно, что мы вероятность берём и дальше её умножает/отнимаем/etc. Demetrius (обсуждение) 16:03, 7 февраля 2024 (MSK)