Контент должен быть конструктивным, и boi do i have content for you today!
Год назад я написал скрипт для автоматизации расчетов боевой системы Cyberpunk 2020 / Friday Night Firefight и попробовал его в этом модуле:
ссылкаПолучилось прикольно. Наглядно оценить эффективность скрипта можно по посту 26 в игровой комнате:
ссылка (комментарий к посту). Мне было бы лень столько кубов кидать.
Эдди просто герой, неиронично, вы все не заслуживаете ЭддиКак обычно, задачка по технической реализации для меня оказалась интереснее ведения модуля, поэтому игра заглохла. А скрипт остался.
Решил причесать его и выложить в открытый доступ. Пользуйтесь на здоровье, жалуйтесь, предлагайте, отправляйте merge request'ы.
Скрипт работает по правилам из коры со следующими хоумрулами и уточнениями,
общепринятыми на дмчике:
- При уроне больше 8 в конечность бросается стансейв на отрыв. При успехе конечность не отрывается.
- Урон, который снижается за счет BTM до 0 и проходит из-за этого как единица, считается "тупой травмой".
- Можно делать прицельную стрельбу очередью в три выстрела по части тела, в этом случае первое попадание приходится куда целились, остальные - в рандомные части тела, модификатор остается тот же -4 за прицеливание и +3 за короткую очередь.
Как пользоваться:
В папочку rounds/номер раунда помещаете json-файлы с описанием персонажей (всех - игроков, врагов, цивилов). При необходимости рассчитываете инициативу скриптом или записываете показатель инициативы каждому персонажу в файл вручную. С этого момента считается, что скрипт знает, что происходит в бою.
Пример чарника есть в файле character_sample.json
Написан на python3.
Доступные команды с описанием:
getroundinfo - вывести информацию по текущему (последнему) раунду. Номер раунда, порядок инициативы с кратким статусом персонажей (количество хп, статус активности)
getcharinfo character - вывести краткую сводку инфы по персонажу. ХП, ранения, чем вооружен, состояние брони.
nextround - создать новый раунд из текущего состояния (создать папку раунда со следующим номером и перенести туда файлы живых персонажей)
calcinit [ow] - посчитать инициативу всем в последнем раунде и записать ее в чарники, если там нулевые значения. С параметром ow - принудительно перезаписать, даже если ненулевые.
skillcheck character skill difficulty [cm=custom modifier] - сделать скиллчек против сложности. При скиллчеках учитываются статы и штрафы к характеристикам от ранений. Кубы взрываются. Можно проверять навыки, которых у персонажа нет. Если название навыка состоит больше чем из одного слова, то его надо брать в кавычки.
shoot character target distance [preroll=number] [ns|nosaveroll] [cm=modifier] [f=fullauto_burst_size|b|s] [bp=bodypart] [cvr=cover_sp] - нувыпоняли.
Аргументы:
character - имя персонажа, который стреляет
target - имя персонажа, в кого стреляют
distance - расстояние между ними двумя
prepoll - сюда можно вставить значение кубика на стрельбу - например, если мы считаем результат стрельбы игрока и игрок кинул кубик на попадание
ns или nosaveroll - не кидать стан и дессейвы автоматически
cm - custom modifier - сюда нужно указывать сумму модификаторов, типа как за темноту, стрельбу по бегущей/лежащей цели, штраф за второе действие и тд
f - стрельба длинной очередью
b - стрельба отсечкой по три патрона
s - стрельба одиночным (по умолчанию)
bp - прицельная стрельба по части тела
cvr - SP укрытия
Что умеет:
- расчет инициативы с учетом всех модификаторов и скиллов
- произвольные скиллчеки
- автоматическое уменьшение SP брони отдельных частей тела, куда проходит дамаг
- авторасчет отрицательных модификаторов к характеристикам при ранениях
- автоматическое прокидывание стан- и дессейвов при ранениях (можно отключить, например, чтобы игроки сами кидали за своих персонажей)
- поражение целей, частично защищенных укрытием, со снижением SP укрытия после каждого проникающего попадания
Структура скрипта:
cp202battlecalc.py - основной скрипт, пользователь запускает его
core_system.py - модуль с функциями механик системы CP2020
character.py - модуль, который содержит класс персонажа
weapons.json - список оружия и его характеристик. Если вы хотите добавить ваш ствол игру, впишите его сюда по образцу. Из чарника персонажа вы потом можете сослаться на нужный ствол по названию.
skills.json - здесь хранится привязка скиллов к статам. Используется при скиллчеках. Мне лень его заполнять, мож потом заполню. Сейчас его хватает, чтобы считать пиу-пиу и иню.
Как использовать:
Если вы линуксоид, то вам объяснять не надо.
Если вы форточник:
- скачиваете и устанавливаете Python3. Последняя версия подойдет.
- скачиваете исходники по ссылке, распаковываете куда-нибудь.
- открываете командную строку (command prompt, она же cmd), переходите в папку со скриптом (командой cd путь_до_папки). Можете и PowerShell попробовать, но у меня не получилось в нем печатать заглавные буквы, поэтому я забил. Но должно работать.
- вводите
python3 cp2020battlecalc.py команда_с_аргументами
- кнопкой вверх вы можете вернуть исполненную ранее команду и отредактировать ее, вместо того чтобы вводить заново
Пример использования:
Боб стреляет в Алису с расстояния в 1 метр очередью в 10 выстрелов. Алиса частично скрыта за укрытием с SP 5. Частично - это значит что закрыты только ноги. Об этом знаем мы как мастер, но не знает скрипт. Поэтому он нас спрашивает, применить ли укрытие к той части тела, куда попадает выстрел, или нет.
Видим, что с каждым пробитием SP укрытия снижается. Также снижается и SP брони Алисы.
$ python3 cp2020battlecalc.py shoot Bob Alice 1 f=10 cvr=5
Hit Alice in the l_leg, apply cover? (y/n) y
Hit Alice in the l_arm, apply cover? (y/n) n
Hit Alice in the r_leg, apply cover? (y/n) y
Hit Alice in the r_leg, apply cover? (y/n) y
Hit Alice in the head, apply cover? (y/n) n
Hit Alice in the l_leg, apply cover? (y/n) y
Bob firing at Alice with KV-4 (f, fmj) [14/40 rds]
Gun range: 100, distance to target: 1, difficulty: 10
REF(8) + SMG(0) + WA(0) + d10(6) + fullauto(1) = 15
6 hits in full auto burst
= Dealt 2 damage to the l_leg [3D6: 2 + 6 + 4 + 0 (hard cover 5 SP) = 7 | 3 SP | 2 BTM], target HP is 38 (active; light)
Alice rolls stun save: 5 vs d10(1) (BT 5, stun_mod 0) - success
= Dealt 4 damage to the l_arm [3D6: 4 + 2 + 4 + 0 = 10 | 4 SP | 2 BTM], target HP is 34 (active; serious)
Alice rolls stun save: 4 vs d10(1) (BT 5, stun_mod 1) - success
= Dealt 2 damage to the r_leg [3D6: 4 + 3 + 4 + 0 (hard cover 4 SP) = 7 | 3 SP | 2 BTM], target HP is 32 (active; serious)
Alice rolls stun save: 4 vs d10(3) (BT 5, stun_mod 1) - success
= Dealt 5 damage to the r_leg [3D6: 6 + 3 + 3 + 0 (hard cover 3 SP) = 9 | 2 SP | 2 BTM], target HP is 27 (stunned; mortal 0)
Alice rolls death save: 5 vs d10(4) (BT 5, mortal_mod 0) - success
Alice rolls stun save: 2 vs d10(6) (BT 5, stun_mod 3) - failed
= Dealt 32 damage to the head [3D6: 5 + 6 + 6 + 0 = 17 | 0 SP | 2 BTM], target HP is -5 (dead; mortal 0)
More than 8 damage to limb!
= Dealt 10 damage to the l_leg [3D6: 6 + 4 + 6 + 0 (hard cover 2 SP) = 14 | 2 SP | 2 BTM], target HP is -15 (dead; mortal 0)
More than 8 damage to limb!
Rounds left in mag: 4
Ссылка на репозиторий:
ссылкаТак что если вам всегда хотелось провести модуль по цопэ, но было лень считать, то вы это. Дерзайте.