Skip to content

rebalance: антитела вирусу лояльности #8473

Open
SCPfollower wants to merge 15 commits intoss220-space:master220from
SCPfollower:loyality_symptom_rebalance
Open

rebalance: антитела вирусу лояльности #8473
SCPfollower wants to merge 15 commits intoss220-space:master220from
SCPfollower:loyality_symptom_rebalance

Conversation

@SCPfollower
Copy link
Contributor

Что этот ПР делает

Добавляет возможность выработать антитела к вирусу лояльности; усложняет его лечение необходимостью использовать помимо галоперидола еще и эфир; добавляет список вирусов, к которым нельзя сделать вакцину в Пандемике (no_vaccine_viruses, там пока только лояльность)

Почему это хорошо для игры

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

Демонстрация изменений

Демонстрации изменений

Тестирование

Проверял на локалке

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Аналитический отчёт от Большого Брата. Обработка запроса завершена.

Приветствую! Я проанализировал предложенные Вами изменения. С технической точки зрения, работа выглядит удовлетворительно.

Сводка анализа:

  • 🔴 Критических замечаний: 0
  • 🟡 Рекомендаций: 2
  • 💡 Предложений: 0

🟡 Рекомендации по улучшению:

  • code/datums/diseases/viruses/_virus.dm:104: Комментарий к глобальному списку no_vaccine_viruses описывает что делает код, а не почему. Рекомендуется добавить пояснение о причине такого решения (например, для игрового баланса), как того требует стайлгайд.
  • code/modules/reagents/chemistry/machinery/pandemic.dm:317: Обнаружена потенциально нестабильная операция: изменение списка res во время итерации по нему. Это может привести к пропуску элементов. Рекомендуется итерироваться по копии списка (res.Copy()) для избежания ошибок.

Пожалуйста, ознакомьтесь с комментариями к отдельным строкам кода для получения более подробной информации.

Спасибо за ваш вклад в проект!


if(Blood.data["resistances"])
var/list/res = Blood.data["resistances"]
for(var/ignore_resistance in res)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

🟡 Рекомендация по стабильности: Вы изменяете список res во время итерации по нему. В DM это может привести к пропуску элементов или другим непредсказуемым результатам. Для безопасного удаления элементов из списка во время итерации следует итерироваться по его копии.

for(var/ignore_resistance in res.Copy())

spread += "Воздушно-капельный"
return russian_list(spread, "Неизвестено", " и ")

//List of viruses that cannot be vaccinated against using PANDEMIC
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

🟡 Рекомендация: Комментарий объясняет что делает код, а не почему это необходимо. Согласно стайлгайду (п. 4.1, правило 68), комментарии должны объяснять причину, а не повторять код. В данном случае, это изменение баланса, и комментарий должен это отражать.

// For game balance, some viruses are not intended to be preventable with a simple vaccine.
References
  1. Комментарии должны объяснять 'почему' код написан так, а не 'что' он делает. Комментарии должны быть на английском. (link)

@SCPfollower
Copy link
Contributor Author

Весь нейрослоп буду тыкать завтра

@SCPfollower
Copy link
Contributor Author

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request adjusts the vaccine creation logic in the Pandemic machine, including allowing antibody development for loyalty syndrome, adding ether to medicines, and filtering non-vaccinable viruses. However, it introduces a significant security vulnerability in the vaccine creation process. The change from an index-based lookup to a direct path-based request from user input, without proper validation, allows for arbitrary object instantiation and bypasses the requirement for a valid blood sample to create vaccines. Furthermore, the current vaccine creation logic needs refinement to improve code stability and readability, especially concerning potential errors when interacting with the disease archive.

Comment on lines 89 to 104
var/vaccine_type = text2path(href_list["create_vaccine"])

if(vaccine_type in GLOB.no_vaccine_viruses)
to_chat(usr, span_warning("К этому вирусу нельзя создать вакцину."))
return

var/vaccine_name = UNKNOWN_STATUS_RUS

if(!ispath(vaccine_type))
if(GLOB.archive_diseases[path])
var/datum/disease/disease = GLOB.archive_diseases[path]
if(GLOB.archive_diseases[vaccine_type])
var/datum/disease/disease = GLOB.archive_diseases[vaccine_type]
if(disease)
vaccine_name = disease.name
vaccine_type = path
vaccine_type = vaccine_type
else if(vaccine_type)
var/datum/disease/disease = new vaccine_type
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

security-high high

This section introduces a critical security vulnerability. The use of text2path on raw user input from href_list["create_vaccine"] followed by instantiation with new allows for arbitrary object instantiation. An attacker can craft a request with a path to any object (e.g., /obj/item/gun/energy/laser), bypassing the machine's intended logic and the requirement for a valid blood sample to create vaccines.

Beyond the security concern, the logic for accessing the disease archive (GLOB.archive_diseases) and subsequent checks are incorrect and redundant. After href_list["create_vaccine"] is changed to pass a string path type, vaccine_type will either be a valid type-path or null. The current if(!ispath(vaccine_type)) check only triggers if vaccine_type is null, which would cause an error when GLOB.archive_diseases[vaccine_type] attempts to use null as a key. Additionally, GLOB.archive_diseases is likely indexed by string identifiers (e.g., disease.GetDiseaseID()), not type-paths directly, requiring vaccine_type.type for correct access.

To remediate the security vulnerability, you should:

  1. Verify that the requested vaccine_type is a subtype of /datum/disease using ispath(vaccine_type, /datum/disease).
  2. Ensure that the requested vaccine_type is actually present in the resistances list of the blood sample currently in the machine's beaker.

The provided code suggestion addresses the logical issues by simplifying checks and correctly using the string representation of the type-path for GLOB.archive_diseases access.

var/vaccine_name = UNKNOWN_STATUS_RUS
var/datum/disease/disease_instance

if(!vaccine_type) // Если text2path вернул null, значит, это невалидный путь
	to_chat(usr, span_warning("Неверный тип вакцины."))
	return

// Попытка найти болезнь в архиве по строковому представлению пути
if(GLOB.archive_diseases[vaccine_type.type])
	disease_instance = GLOB.archive_diseases[vaccine_type.type]
	if(disease_instance)
		vaccine_name = disease_instance.name
else // Если не найдено в архиве, создаем новый экземпляр из тип-пути
	disease_instance = new vaccine_type
	if(disease_instance)
		vaccine_name = disease_instance.name

@SCPfollower SCPfollower marked this pull request as draft January 27, 2026 21:55
@SCPfollower SCPfollower changed the title add/rebalance: antibodies for loyality syndrome rebalance: antibodies for loyality syndrome Jan 27, 2026
@SCPfollower
Copy link
Contributor Author

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Аналитический отчёт от Большого Брата. Обработка запроса завершена.

Приветствую! Я проанализировал предложенные Вами изменения. С технической точки зрения, работа выглядит удовлетворительно.

Сводка анализа:

  • 🔴 Критических замечаний: 0
  • 🟡 Рекомендаций: 1
  • 💡 Предложений: 0

🟡 Рекомендации по улучшению:

  • code/modules/reagents/chemistry/machinery/pandemic.dm:364-368: Использование цикла для фильтрации списка можно заменить на более эффективную и лаконичную операцию вычитания списков.

Пожалуйста, ознакомьтесь с комментариями к отдельным строкам кода для получения более подробной информации.

Спасибо за ваш вклад в проект!

@shahribek
Copy link
Contributor

там же в дефайне самого вируса всего в одной строке надо же было поставить тру вместо фолс... Или я недочитал все коды?

@SCPfollower
Copy link
Contributor Author

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

@SCPfollower
Copy link
Contributor Author

Сейчас или к болезни нельзя выработать антитела вообще, или можно и к ней делается вакцина за 30 секунд после этого

@SCPfollower
Copy link
Contributor Author

Короче как и писал в обсуждении идей, хочу сесть на два стула, где вирус поддается лечению, но при этом не будет "ВАКЦИНА НА СТОЙКЕ МЕДА" через 5 минут после появления вируса

@SCPfollower
Copy link
Contributor Author

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Аналитический отчёт от Большого Брата. Обработка запроса завершена.

Приветствую! Я проанализировал предложенные Вами изменения. С технической точки зрения, работа выглядит удовлетворительно.

Сводка анализа:

  • 🔴 Критических замечаний: 0
  • 🟡 Рекомендаций: 1
  • 💡 Предложений: 0

🟡 Рекомендации по улучшению:

  • code/modules/reagents/chemistry/machinery/pandemic.dm:362: Реализация проверки реагентов может быть улучшена для большей надёжности. Рекомендуется добавить явную проверку на тип реагента (кровь), чтобы избежать потенциальных конфликтов с другими реагентами в будущем.

Пожалуйста, ознакомьтесь с комментариями к отдельным строкам кода для получения более подробной информации.

Спасибо за ваш вклад в проект!

@shahribek
Copy link
Contributor

Короче как и писал в обсуждении идей, хочу сесть на два стула, где вирус поддается лечению, но при этом не будет "ВАКЦИНА НА СТОЙКЕ МЕДА" через 5 минут после появления вируса

тогда круто

@SCPfollower
Copy link
Contributor Author

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request aims to rebalance the loyalty syndrome virus, making its treatment more complex by allowing for antibodies, and introduces a mechanism to the Pandemic machine to prevent vaccine creation for specific viruses. However, a critical security vulnerability has been identified: the implementation uses an in-place list modification on a potentially shared reference, which can lead to unintended side effects, such as removing immunity from the source mob. Additionally, a potential null object access was found in code/modules/reagents/chemistry/machinery/pandemic.dm that could cause runtime errors.

@SCPfollower SCPfollower marked this pull request as ready for review January 29, 2026 04:35
@SCPfollower SCPfollower changed the title rebalance: antibodies for loyality syndrome rebalance: антитела вирусу лояльности Jan 29, 2026
@SCPfollower
Copy link
Contributor Author

/gemini review

Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

Аналитический отчёт от Большого Брата. Обработка запроса завершена.

Приветствую! Я проанализировал предложенные Вами изменения. С технической точки зрения, работа выглядит удовлетворительно.

Изменения вносят ожидаемый ребаланс вируса лояльности, добавляя возможность выработки иммунитета и усложняя его лечение. Также корректно реализован механизм запрета на создание вакцин для определённых вирусов.

Сводка анализа:

  • 🔴 Критических замечаний: 0
  • 🟡 Рекомендаций: 1
  • 💡 Предложений: 0

🟡 Рекомендации по улучшению:

  • code/modules/reagents/chemistry/machinery/pandemic.dm:367: Обнаружено создание нового объекта в цикле только для проверки свойства. Рекомендуется использовать initial() для повышения производительности и избежания ненужной нагрузки на сборщик мусора.

Пожалуйста, ознакомьтесь с комментариями к отдельным строкам кода для получения более подробной информации.

Спасибо за ваш вклад в проект!

Comment on lines +367 to +368
var/datum/disease/virus/virus_res = new path
if(virus_res.no_vaccine)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

🟡 Рекомендация по производительности

Создание нового объекта (new path) внутри цикла для проверки одного свойства (no_vaccine) является избыточным и может негативно сказаться на производительности, особенно если в мензурке много реагентов с большим количеством антител. Создание лишних объектов без необходимости также увеличивает нагрузку на сборщик мусора.

Согласно разделу 4.2 стайлгайда, следует избегать ресурсоемких операций в циклах. Для получения значения переменной типа по умолчанию рекомендуется использовать initial(), что является более эффективным и безопасным подходом.

                                        if(initial(path.no_vaccine))
References
  1. Стиль-гайд рекомендует избегать ресурсоемких операций в циклах для поддержания производительности и стабильности. Создание новых объектов в цикле без необходимости является такой операцией. (link)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Не сработало(
В целом у нас в теоретическом максимуме может быть 10 разных антител, а new вызывается только при установке контейнера в Пандемик. Так что наверное можно оставить так

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants