[ש] Химчистка прачечная | ходы игроков | уголок индуизма

 
DungeonMaster wyleg
24.04.2021 19:23
  =  
Если вы еще не в айтишке (или дальше), то я не понимаю, че с вами не так.

Прикол айтишки в том, что даже
, коих целый дээмчик, без хард скиллов, там найдется место, и еще какое. И айтишка намного честнее, чем, скажем, быть московским коммерсом или продажником на авторынке. Про талантливых людей, художников и музыкантов, я просто молчу - айтишка позволяет произведениям как найти новую аудиторию, так и изобрести новые медиумы.

Называйте меня акселерационистом (с чем я в принципе согласен), фашистом (это заявление конечно стоит деконструировать и разложить на коннотации и подтексты) или капиталистом, но попробуйте-ка со мной поспорить в том плане, что айтишка, в которой сейчас сосредотачиваются топовые мировые умственные и финансовые ресурсы, делает жизнь рядового обывалы, который от нее далек, неизбежно и неостановимо лучше.

Сейчас не будем затрагивать такие тонкие моменты, как исчезновение приватности, информационные пузыри, стирание разницы между наблюдаемым и наблюдателем и приближение (анти)утопического общественного устройства, а возьмем один очень простой, прикладной, утилитарный, костыльный пример.

Представьте что вы молодой стремящийся 3D-художник, который ввязался в модостроительную банду, и лепите модельки под требования конкретного движка. Конкретнее - PDX для движка параходов. Если кто не знает, эти наркоманы используют собственный формат карт текстур, где они для карт нормалей меняют местами RGB-каналы в файле, один из них вообще дублируют, а PBR-карты вообще засовывают три карты в один файл, по карте на канал.

Ну вот и если вы не умеете настраивать Substance Painter на кастомный экспорт или используете какое-нибудь говно вроде миксера, в котором кастомного экспорта вообще нет, то представьте.
Каждая итерация - ну а в процессе не бывает без итераций, нельзя сразу сделать финальную версию, а на свои творения нужно смотреть, как они выглядят в естественной среде - так вот, каждая итерация - это надо держать открытым прожорливый фотошоп, как-то там хитро линковать импортированные изображения, разделять их на каналы (я если честно не представляю во всех тонкостях, но типа все равно даже если найти подходящие инструменты, то это будет СЛОЖНО), и клацать, клацать, клацать мышкой, чтобы обновить экспортированные карты и сохранить их в нужном формате (плюс накачать плагинов на конвертацию в dds), и так каждый раз.

А если вы умеете в скриптинг, то вы один (1) раз пишете скрипт (враппер над древним как мир imagemagick), который сам находит файлы с картами в папочке, сам раздербанивает их на каналы, сам их пересобирает, сам их сохраняет в нужном формате, сам их копирует куда надо... и все. Каждая итерация после экспорта карт из софтины для текстурирования - это просто переключиться на консольку, нажать вверх и нажать энтер.

Это ускоряет работу в тысячу раз. Это избавляет от головной боли. Это высвобождает ресурсы мозга на гораздо более высокоуровневые задачи. Не "ну давай еще раз сохраним и импортируем в игру это говно", а "хм, а если попробовать вот эту мелочь сюда засунуть, поломает ли композицию?".

Затратив меньше, достигаем большего.

делать что-то руками, если ты можешь спихнуть тупую работу на кого-то еще?
И зачем спихивать тупую работу на человека (да, в моей голове все еще звучит эхо возгласа "ДАВАЙТЕ НАЙМЕМ ДЖУНОВ"), если можно свалить ее на машину?

А если мы сюда еще приплетем такую вещь как опенсорс, то берем одного энтузиаста, который по фану для общего развития пилит такой скрипт и шарит его с другими нуждающимся, и художников, которым эта штука реально помогает, и получаем представление о том, как может быть все радужно-чудесно в прекрасном мире будущего, где каждый получит свой маленький кусочек эгоистически-альтруистического счастья.
Но это вообще разговор на другой раз и на другую, более глубокую, более переворачивающую представление о мире вверх дном тему.
Это пока так, затравочка.

Let this soak in.
Отредактировано 24.04.2021 в 19:47
1

DungeonMaster wyleg
24.05.2021 22:23
  =  
Здарова, вайшьи. Контент подъехал.

Хочу похвастаться - сегодня у меня есть для вас ответ на вопрос "зачем нужна математика в программировании". Не какое-то там абстрактное "ну типа шоб лучше понимать, как работают чистые функции, алгоритмы и структуры данных", а нормальный такой прикладной и, главное, наглядный в прямом смысле пример.

Итак, снова представляем себя на месте молодого стремящегося инди-разработчика игорей на Юнити, который пилит свой шутан от первого лица и хочет, чтобы его анимации пушек выглядели живо, но тратить время на блендер не хочет.
Главный секрет живости анимаций, чтобы они не выглядели строгими и линейными, как у роботов - это мелочи. Ошибки в точности, инерция, подергивания, в общем, все, что угодно, но не скучное равномерное прямолинейное перемещение из точки а в точку б. Какой самый простой способ сделать анимацию отдачи от выстрела достаточно живой и плавной, чтобы при этом не пришлось лезть в блендер и делать ее руками?

Правильно, представить ее в виде затухающего гармонического колебания.

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


Лучше синусов для такого еще ничего не придумали. Ну, или косинуса в данном случае - я хочу, чтобы ствол дернуло в единицу моментально, неуловимо, как это и происходит при выстреле, а анимация состояла из возвращения оружия в исходное положение. Тут у нас по оси x - время, а точнее, фаза колебания в радианах. По оси у будет угол отклонения от оси - то есть, угол, на который отдача откидывает ствол. Сначала пушку подкидывает вверх, потом стрелок ловит ствол и уводит его вниз, перебарщивает, возвращает обратно наверх, ну вы поняли.
В самом низу - формула, по которой рассчитывается текущая фаза в радианах, которая подставляется в качестве аргумента для косинуса.

Запихиваем это все в код игры:


Да, это, в общем-то, все. Первую функцию вызываем из того участка кода, который отвечает непосредственно за выстрел оружия. Просто говорим коду, что наша анимация начинается прямо сейчас. Вторую функцию - в Update(), чтобы при при каждом тике у нас считались позиция и вращение объекта с оружием по описанным нами законам. Она смотрит разницу между моментом времени, который задала первая функция, и текущим временем - отсюда и берется течение времени для нашей функции.
Переменные amp, length и offset помещаем куда-нибудь в свойства оружия (в SerializeField, например) и получаем настраиваемую процедурную отдачу, которую можно вертеть как угодно и вокруг чего угодно (спасибо offset).
amp отвечает за амплитуду. length - за длину анимации в секундах. через offset мы задаем pivot point - то есть точку, вокруг которой нужно вращать ствол. Например, если вам нужно сместить ось вращения от центра игрового объекта, в котором находятся модельки ствола с руками, находящегося прям под камерой первого лица, ближе к кистям, которые держат пистолет, то мы задаем какой-нибудь offset, который двигает наш pivot впердё.

Math.Lerp - это линейная интерполяция между двумя значениями, в данном случае от 1 до 0. Третий аргумент это собсно... эээ... коэффициент? интерполяции. Принимает значения от 0 до 1, где в нуле у нас на выходе будет первое число, а при 1 - второе. Вроде все понятно. За счет этого Lerp мы с течением времени управляем величиной коэффициента k в уравнении и получаем эту самую сужающуюся воронку, благодаря которой наше колебание плавно затухает в ноль, как показано на графике.

И вот как это выглядит в игре:
1. ссылка

Поиграемся с цифрами немного. Ведь это же так просто, когда мы можем просто подергать за ползунки вместо переделывания анимаций вручную и их реимпорта в движок!
2. ссылка
3. ссылка

В третьем примере мы унесли ось вращения далеко вперед, как видите. Ну и время анимации увеличили.
Заметили, кстати, что количество периодов, которые проходит косинус, остается то же самое? Сейчас оно было равно 1.5*Pi радиан. Давайте попробуем увеличить число периодов:
4. ссылка

Нувыпоняли. Надеюсь, вопросов ни у кого не осталось. Математика - клевая штука.

P.S. На опробование процедурных анимаций на матфункциях меня вдохновил автор мода BDArmory для KSP и автор игры VTOL VR вот этим видосом: ссылка
За что ему плотный респект.
Отредактировано 24.05.2021 в 22:27
2

DungeonMaster wyleg
19.06.2021 16:06
  =  
Контент должен быть конструктивным, и 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 укрытия после каждого проникающего попадания

Структура скрипта:


Как использовать:
Если вы линуксоид, то вам объяснять не надо.
Если вы форточник:
- скачиваете и устанавливаете Python3. Последняя версия подойдет.
- скачиваете исходники по ссылке, распаковываете куда-нибудь.
- открываете командную строку (command prompt, она же cmd), переходите в папку со скриптом (командой cd путь_до_папки). Можете и PowerShell попробовать, но у меня не получилось в нем печатать заглавные буквы, поэтому я забил. Но должно работать.
- вводите
python3 cp2020battlecalc.py команда_с_аргументами

- кнопкой вверх вы можете вернуть исполненную ранее команду и отредактировать ее, вместо того чтобы вводить заново

Пример использования:


Ссылка на репозиторий: ссылка

Так что если вам всегда хотелось провести модуль по цопэ, но было лень считать, то вы это. Дерзайте.
Отредактировано 27.06.2021 в 13:08
3

DungeonMaster wyleg
09.01.2022 06:13
  =  
Мне нужно было немного отдохнуть, поэтому я для разрядки набросал драфт схемы про то, как роботы месятся друг с другом на чейнганах и гаубицах.

Преследовал несколько целей:
- чтобы игромеханически поддерживалась ситуация, когда мелкий и юркий мех с гатлингом нарезает круги вокруг тяжелого артиллерийского меха, и тот не может в него попасть
- чтобы поддерживались все остальные варианты боестолкновения
- чтобы не было перегруженно
- чтобы расстояния измерялись в сотнях метров, и геймплей на карте мог трансформироваться из снайперских дуэлей меж барханов в городское рубилово на площадях и переулках в рамках одной катки
- чтобы было весело

Такой, знаете, не мехворриор, а НЯЩКЕН

Заценить можно здесь: ссылка
Там основа системы плюс базовый вариант того с чем (и против чего) будем воевать. Скелет.
Получилось вроде несложно. Там одна формула, которую на самом деле можно представить визуально, чтобы было вот вообще просто понять, в чем суть. Но это я позже сделаю.

Приглашаю к обсуждению, оставляйте комментарии, задавайте вопросы, там, туда-сюда.

Потом зарубимся.
Отредактировано 09.01.2022 в 06:35
4

Партия: 

Добавить сообщение

Нельзя добавлять сообщения в неактивной игре.