add: Б.O.Р.И.С. модуль. Теперь на парашизе.#8518
add: Б.O.Р.И.С. модуль. Теперь на парашизе.#8518Buravka wants to merge 27 commits intoss220-space:master220from
Conversation
zalupa экшены оболочки для мода оболочка для мода перенесена в мехфаб маркер. удаление устаревшего переопределённого прока get_equipped_items, замена передаваемых аргументов на битфлаги, где этого ещё не было. компоненту лазера добавлен кд на использование 1 секунда
There was a problem hiding this comment.
Code Review
This pull request introduces the B.O.R.I.S. module, enabling AI players to remotely control robot shells. While the technical implementation is generally satisfactory, a critical logic flaw has been identified in the AI evacuation procedure during shell destruction. This vulnerability can lead to a denial-of-service state for the AI player, trapping them in a deleted object or forcing them into a ghost state without a way to return to their core. Additionally, several areas require attention for improved code quality and stability, including macro name typos, issues in AI shell creation logic, style guide violations, incorrect handling of unpowered shells, and code duplication in evacuate_ai and law_manager.dm. Minor issues like potential HTML injection and improper power cell handling were also noted.
| if(istype(I, /obj/item/borg/upgrade/ai)) | ||
|
|
||
| var/obj/item/borg/upgrade/ai/M = I | ||
| if(check_completion()) | ||
| if(!isturf(loc)) | ||
| to_chat(user, span_warning("You cannot install [M], the frame has to be standing on the ground to be perfectly precise!")) | ||
| return | ||
| qdel(M) | ||
| var/mob/living/silicon/robot/robot = new /mob/living/silicon/robot/shell(get_turf(src)) | ||
|
|
||
| if(!aisync) | ||
| lawsync = FALSE | ||
| robot.set_connected_ai(null) | ||
| else | ||
| if(forced_ai) | ||
| robot.set_connected_ai(forced_ai) | ||
| robot.notify_ai(AI_NOTIFICATION_AI_SHELL) | ||
| if(!lawsync) | ||
| robot.lawupdate = FALSE | ||
| robot.make_laws() | ||
|
|
||
| robot.cell = chest.cell | ||
| chest.cell.forceMove(robot) | ||
|
|
||
| robot.locked = panel_locked | ||
| robot.job = JOB_TITLE_CYBORG | ||
| forceMove(robot) | ||
| robot.robot_suit = src | ||
| if(!locomotion) | ||
| robot.set_lockcharge(TRUE) | ||
|
|
There was a problem hiding this comment.
🟡 Рекомендация по улучшению: Логика создания оболочки ИИ при использовании модуля Б.О.Р.И.С. на каркасе киборга имеет несколько недостатков:
- Используется
qdel(M)вместоuser.drop_transfer_item_to_loc(M, src), что может привести к некорректному удалению объекта из инвентаря пользователя. - Отсутствует проверка на
!check_completion(), что может привести к созданию оболочки на незавершенном каркасе. - Процедура не возвращает
ATTACK_CHAIN_BLOCKED_ALLпосле успешного создания, что может привести к выполнению лишнего кода.
Рекомендую переработать этот блок, сделав его более надежным и консистентным с логикой установки ММИ.
There was a problem hiding this comment.
Ну тут ему кажется просто от ТГшного кода просто башку снесло. Так там все легит.
There was a problem hiding this comment.
как минимум по паре пунктов он прав. предмет нужно убирать из инвентаря перед удалением, так же код должен возвращать ATTACK_CHAIN флаг, а вот какой - уже другой вопрос. Так же нужно вынести логически отдельные блоки кода в отдельные проки. Прок слишком большой
There was a problem hiding this comment.
А еще запомни. ТГ код не ультимативен. Там тоже говна хватает
There was a problem hiding this comment.
Я не увидел решения по моим замечаниям. Прок нужно разбить на составные части
|
Все. Пусть маринуется до лучших времен. |
10b38fa to
54187f7
Compare
|
Опа, разработка ожила??? |
|
К смысловой части перевода вопросов нет, технически сделано тоже верно. |
|
Выпустите уже борьку погулять на парашиз. Синтград заждался. |
AurothWyvern
left a comment
There was a problem hiding this comment.
Локализация в порядке 👍
code/_onclick/hud/ai.dm
Outdated
| icon_state = "AIshell" | ||
|
|
||
| /atom/movable/screen/ai/connect_to_shell/Click() | ||
| if(isAI(usr)) |
| cell_component.installed = TRUE | ||
|
|
||
| /obj/item/robot_parts/robot_suit/proc/check_locomotion(mob/living/silicon/robot/target) | ||
| if(!locomotion) |
|
|
||
| return TRUE | ||
|
|
||
| /mob/living/silicon/ai/verb/deploy_to_shell(mob/living/silicon/robot/target) |
There was a problem hiding this comment.
Уверен, что нельзя сделать это экшеном, заместо верба?
| AI.adjustOxyLoss(200) | ||
| else | ||
| mainframe.disconnect_shell() | ||
| to_chat(AI, span_danger("ВНИМАНИЕ: Беcпроводное подключение с оболочкой было принудительно прервано!")) |
There was a problem hiding this comment.
разбей с помощью ранних ретурнов
| if(connected_ai != user) | ||
| to_chat(user, span_warning("Отказано в доступе. Подключение невозможно.")) | ||
| return | ||
| if(tgui_alert(user, "Подключиться к [name]?", "Подключение к оболочке", list("Подключиться", "Отмена")) != "Подключиться") |
There was a problem hiding this comment.
Выборы дефайнизировать
| var/shell = FALSE | ||
| var/deployed = FALSE | ||
| var/mob/living/silicon/ai/mainframe = null | ||
| var/datum/action/innate/undeployment/undeployment_action = new |
There was a problem hiding this comment.
если ты добавляешь новые ссылки в датум, их нужно обнулять в дестрое, либо удалять объект вместе с обнулением, если он нигде не используется
|
|
||
| /mob/living/silicon/ai/adjustFireLoss(amount, updating_health = TRUE, def_zone = null, blocked = 0, forced = FALSE, used_weapon = null, sharp = FALSE, silent = FALSE, affect_robotic = TRUE,) | ||
| . = ..() | ||
| if(amount > 0) |
|
|
||
| /mob/living/silicon/ai/adjustBruteLoss(amount = 0, updating_health = TRUE, def_zone = null, blocked = 0, forced = FALSE, used_weapon = null, sharp = FALSE, silent = FALSE, affect_robotic = TRUE,) | ||
| . = ..() | ||
| if(amount > 0) |
| to_chat(src, span_warning("Во время установки cоеденения с оболочкой произошла ошибка.")) | ||
| return | ||
|
|
||
| else if(mind) |
| var/list/possible = list() | ||
|
|
||
| for(var/shell in GLOB.available_ai_shells) | ||
| var/mob/living/silicon/robot/R = shell |
| var/obj/item/radio/headset/heads/ai_integrated/aiRadio = null | ||
|
|
||
| //AI SHELL CONTROL | ||
| var/mob/living/silicon/robot/deployed_shell |
…hiks-Parashiso into barbariska_reborn
Что этот ПР делает
Добавляет в игру модуль Б.О.Р.И.С. и другие связанные с ним штуки-дрюки
Если кто не знал, то B.O.R.I.S. или же Bluespace Optimized Remote Intelligence Synchronization module (Лакализавана как Модуль Блюспейс Ориентированной Роботической Искусственной Сети) - это такая деталька для киборгов, которая позволяет ИИ "вселятся" в них и управлять напрямую по аналогии с мехами и маячком ИИ.
P.S. Код в основном был
криво украденадаптирован и портирован с ТГЭффект после латунизации у киборгов был заменен с тяжелого ЭМИ на простой стан в 6 секунд.
Потому-что вообще-то ЭМИ вредит киборгам, а ломать будущих членов своего культа - не круто
Даже если борг мешает, 6-ти секундного стана хватит, что-бы обезвредить его и забить ножичком
1. СОЗДАНИЕ ОБОЛОЧКИ-ИИ И МОДУЛЯ Б.О.Р.И.С. . ПРИМЕНЕНИЕ МОДУЛЯ Б.О.Р.И.С. .
2. ПОДКЛЮЧЕНИЕ К ОБОЛОЧКЕ. ИЕАРХИЯ ИИ. СИНХРОНИЗАЦИЯ ЗАКОНОВ.
3. СМЕРТЬ ОБОЛОЧКИ И ИИ.
4. ОСОБЕНОСТИ ОБОЛОЧКИ
Почему это хорошо для игры
Прыкольная механика
Демонстрация изменений
Демонстрации изменений
Икона способности "Вернуться в ядро"(Возвращает ИИ обратно в ядро из оболочки).

Икона кнопки "Подключиться к оболочке" на ХУДе ИИ(Позволяет выбрать ИИ оболочку из списка и подключиться к ней).

Борисе модуль собственной персоной!(приписка "r" означает "real")

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

Тестирование
Спавнил оболочки-ИИ. Делал оболочки-ИИ в робототехнике.. Подключался к оболочкам-ИИ. Бил себя сваркой оболочками-ИИ. Оболочками-ИИ.