OnyxBay icon indicating copy to clipboard operation
OnyxBay copied to clipboard

feat(viruses): Comprehensive rework spread disease

Open Oubi256 opened this issue 2 years ago • 4 comments

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

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

image О кашле. Раньше кашель имел лишь одну проверку на наличие маски, от результата которой зависело заразятся ли окружающие. Такая грубая проверка позволяла быть не заразным со спущенной маской/сигаретой/конфетой и даже при использовании шлемов биозащиты и других (при условии что маска при этом не одета). А кашлюны в отключке, так это вообще отдельная тема. Теперь же мобы без сознания не кашляют и имеют полноценную проверку перед тем как попытаются распространить заразу. Перед кашлем учитывается закрыт ли рот у инфицированного и имеет ли этот предмет биологическую защиту. В случае если рот не прикрыт, то кашель, как и раньше, заражает всех в радиусе 2-х клеток (красная рамка). Если рот прикрыт чем-либо что не имеет биологической защиты (балаклава, бандана и т.п.), то кашель так-же заразит окружающих в радиусе 1-й клетки (голубая рамка). Если рот прикрыт предметом имеющий биологическую защиту (стерильные маски, противогазы, шлема ригов и т.д.), то никакого заражения окружающих не будет.

О чихах. К моему удивлению чихание вообще не имело проверки на наличие какой-либо защиты на лице, в любом случае заражался моб стоящий перед лицом инфицированного. Единственное что могло сделать чихание, так это положить сервер, что бы хоть кто-то в лагах наступил на соплю. По сравнению с кашлем бесполезный симптом если бы не сопли, которые время от времени всё же стреляют. В этом ПР-е сопли реализованы аналогично как и кашель, но если кашель при отсутствии любой защиты заражает всех в радиусе 2-х клеток, то чихание заражает область 3x4 по направлению взгляда (оранжевая рамка).

Для ревьюверов: code/game/objects/effects/decals/Cleanable/humans.dm - убрал иконстейты для того что бы подружить это всё с оверлеями (в идеале заменить стейт на прозрачный, а не null, буду рад если кто-то предложит правку с нужным стейтом), перенёс код инита в свой метод, который теперь отвечает за первое и последующее построение соплей. Высыхание реализовал через смену цвета, ибо с оверлеями после добавления взаимодействовать нет возможности (да и не надо).

code/modules/virus2/helpers.dm - добавил хелпер для проверки bio армора у предметов закрывающих рот.

code/modules/virus2/effects/mild.dm - обоим симптомам добавлены доп. проверки на закрытость лица, наличие биозащиты, состояние моба (что бы спящий не мог срать заразой). В эффект чиха добавил алгоритм возвращающий прямоугольную область перед игроком с использованием block().

fix #9244

Чейнджлог
🆑Oubi
tweak: Переработано распространение вирусов через кашель и чихание. Подробнее в ПР-е на GitHub
/🆑
  • [x] Pull Request полностью завершен, мне не нужна помощь чтобы его закончить.
  • [x] Я внимательно прочитал все свои изменения и багов в них не нашел.
  • [x] Я запускал сервер со своими изменениями локально и все протестировал.
  • [x] Я ознакомился c Guide to Contribute.

Oubi256 avatar Aug 25 '22 17:08 Oubi256

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

O0oMaximo0O avatar Aug 31 '22 15:08 O0oMaximo0O

По коду чихания получается, что если рот не прикрыт, то, если сопля не заспавнится - область сзади персонажа не будет заражена.

O0oMaximo0O avatar Aug 31 '22 15:08 O0oMaximo0O

Предлагаю в чихании перенести код с if(!mob.can_spread_disease()) вверх. И ещё изменить размер блока увеличенного чихания, чтобы он не перекрывался с областью 3х3 вокруг персонажа (оптимизация о-о).

O0oMaximo0O avatar Aug 31 '22 15:08 O0oMaximo0O

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

Нет, я потерял return после спавна/не спавна сопли

Oubi256 avatar Aug 31 '22 16:08 Oubi256

Иссуй был одобрен геймдизайнерами.

Поддержали: root, Nefr

ChaoticTheBot avatar Sep 07 '22 15:09 ChaoticTheBot