Fixes multiple protean issues. (Outfitting, species loss / add, suit assimilation, and you can be a ninja now) (#5947)

## About The Pull Request

Fixes some really long standing Protean issues and minorly refractors
Protean suit assimilation to be on the species datum.

This also fixes antag selection like ninjas not functioning properly.
You can be a protean ninja now.

## Why It's Good For The Game

I think bugs are bad.

## Proof Of Testing

I tested everything I can think of, 

<img width="1199" height="534" alt="image"
src="https://github.com/user-attachments/assets/6906815b-5810-4ec2-bf9a-f928c636b1eb"
/>

## Changelog
🆑
fix: Proteans can now be outfitted properly.
fix: Suit assimilation no longer drops modules on the floor and it
should act more sane.
fix: Losing your species no longer deletes your items in storage or your
assimilated suit.
fix: Gaining the protean species allows you to properly be a Protean.
fix: You can now be mid-round antag spawn as a Protean without being
broken.
fix: As a protean ninja, you can now emag doors and hack borgs.
code: Minorly refactored suit assimilation. Please report any issues.
/🆑
This commit is contained in:
The Sharkening
2026-07-21 20:03:45 -07:00
committed by GitHub
parent 6ee965c33a
commit f944caa59c
8 changed files with 164 additions and 159 deletions
+9 -8
View File
@@ -626,36 +626,37 @@
return ..()
/obj/item/mod/control/proc/install(obj/item/mod/module/new_module, mob/user, silent = FALSE) // Bubber Edit: Silent = FALSE
. = FALSE // BUBBER EDIT
for(var/obj/item/mod/module/old_module as anything in modules)
if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules))
if(user && !silent) // Bubber Edit: Silent arg
balloon_alert(user, "incompatible with [old_module]!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE //Bubber Edit: Return False
return
var/complexity_with_module = complexity
complexity_with_module += new_module.complexity
if(complexity_with_module > complexity_max)
if(user && !silent) // Bubber Edit: Silent arg
if(user && !silent)
balloon_alert(user, "above complexity max!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE //Bubber Edit: Return False
return
if(!new_module.has_required_parts(mod_parts))
if(user && !silent) // Bubber Edit: Silent arg
balloon_alert(user, "lacking required parts!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE //Bubber Edit:
return
if(!new_module.can_install(src))
if(user && !silent) // Bubber Edit: Silent arg
balloon_alert(user, "can't install!")
playsound(src, 'sound/machines/scanner/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE)
return FALSE // Bubber edit: Return False
return
if(SEND_SIGNAL(src, COMSIG_MOD_TRY_INSTALL_MODULE, new_module, user) & MOD_ABORT_INSTALL)
return
if(SEND_SIGNAL(new_module, COMSIG_MODULE_TRY_INSTALL, src, user) & MOD_ABORT_INSTALL)
return
finish_install(new_module, user)
return finish_install(new_module, user, silent) // BUBBER EDIT: Adds a return and silent arg.
/obj/item/mod/control/proc/finish_install(obj/item/mod/module/new_module, mob/user)
/obj/item/mod/control/proc/finish_install(obj/item/mod/module/new_module, mob/user, silent = FALSE) // Bubber edit: Silent = FALSE
new_module.forceMove(src)
modules += new_module
complexity += new_module.complexity
@@ -666,7 +667,7 @@
if(active && new_module.has_required_parts(mod_parts, need_active = TRUE))
new_module.on_part_activation()
new_module.part_activated = TRUE
if(user) // Bubber Edit: Silent Arg
if(user && !silent) // Bubber Edit: Silent Arg
balloon_alert(user, "[new_module] added")
playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE)
return TRUE // Bubber Edit: Return True