Обсуждение:Year Zero Engine

Материал из Ролевая энциклопедии
Перейти к: навигация, поиск
Эта техническая страница
создана на RPGverse

Как рассчитаны вероятности для лестницы костей[править]

Сохраню тут алгоритм расчёта — на случай, если кто-то решит проверить, что всё посчитано правильно (а то я немного волнуюсь 😅).


const костиАтрибутов = [6, 8, 10, 12]
const костиУмений = [null, 6, 8, 10, 12]
const вариантыБроска = костиАтрибутов.map(атрибут => костиУмений.map(умение => ({ атрибут, умение }))).flat()
// в вариантыБроска 
// [{атрибут: 6, умение: null}, {атрибут: 6, умение: 6}, ..., {атрибут: 12, умение: 12}]

function шансНеудачиДляОднойКости(количествоГранейКости) {
	// Количество неудачных граней всегда 5 (1, 2, 3, 4, 5)
	return 5 / количествоГранейКости
}

function шансОбычнойНеудачи({ атрибут, умение }) {
	if (умение === null) {
		return шансНеудачиДляОднойКости(атрибут)
	}

	return шансНеудачиДляОднойКости(атрибут) * шансНеудачиДляОднойКости(умение)
}

function шансНеудачиСПереброской(вариантБроска) {
	return шансОбычнойНеудачи(вариантБроска)**2
}

function шансОбычногоУспеха(вариантБроска) {
	return 1 - шансОбычнойНеудачи(вариантБроска)
}
function шансУспехаСПереброской(вариантБроска) {
	return 1 - шансНеудачиСПереброской(вариантБроска)
}

const вариантыСВероятностями = вариантыБроска.map(
	вариантБроска => ({
		...вариантБроска,
		успех: шансОбычногоУспеха(вариантБроска),
		успехСПереброской: шансУспехаСПереброской(вариантБроска)
	})
)

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

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

function отформатироватьТаблицу(вариантыСВероятностями) {
	const строки = [
		'{| class="wikitable" style="margin:auto"\n! colspan="2" | Бросаемые кости !! rowspan="2" | Шанс успеха !! rowspan="2" | Шанс успеха с переброской',
		'! Атрибут !! Умение',
		...вариантыСВероятностями.map(отформатироватьВариантСВероятностью),
	]

	return строки.join("\n|-\n") + "\n|}"
}

console.log(отформатироватьТаблицу(вариантыСВероятностями))