Files
+3 77616e8b0e Add Proteans to the game. (#3449)
## About The Pull Request

Adds the funny nanite blob dudes from Vigro code into the game. It's
more of a port of the idea since they're coded from the ground up. They
will be more of a utility focused species then a combat focused species.
**They are fragile.**

- Eats metal. You need metal to live and you need metal to heal. 
- Healed by materials. You feed Proteans metal to heal them.
- Difficult to kill, but extremely fragile. They are considered a
deathless species but they are stuck in their suit if they die. **You
have to order a new refactory from cargo to revive them**

**Order Refactory > Screwdriver suit > Insert refactory > Wait 5
minutes.**

- Easily dismembered. They have 30 seconds to recover their limbs and
pop them on or they will melt into nothingness. Can do a lengthy heal
which replaces missing limbs and easy to replace organs.
- Without a refactory, you will wither away.
- Without an orchastrator, you will have a lot of issues moving.
- You can lock your suit on someone. (OOC escape will work)
- You can assimilate modsuits.

- [x] OOC escape
- [x] Suit Transformation fixes
- [x] Modsuit Assimilation
- [x] Ensure organs are working
- [x] Species info and lore
- [x] Antag Proteans
- [x] Custom damage. Disable various surgeries.
- [x] Testing, polish, feedback.
- [x] Runtime and CI fixing.
- [ ] Live testing and balance.

## Why It's Good For The Game

This was the second to top vote on species people wanted to see added
and this is more custom mechanics then what is just a human reskin.

## Proof Of Testing


![NVIDIA_Overlay_bC6M2FThJP](https://github.com/user-attachments/assets/cb8c8594-f82c-408b-a9a1-e86a61bf8a0f)


![NVIDIA_Overlay_dbhHrYltOH](https://github.com/user-attachments/assets/cb643365-5512-465f-8582-337e24211b9f)

## Changelog

🆑 StrangeWeirdKitten, Majkl-J
add: New species: Proteans
/🆑

---------

Co-authored-by: Waterpig <49160555+Majkl-J@users.noreply.github.com>
Co-authored-by: Bubberbot <151680451+Bubberbot@users.noreply.github.com>
Co-authored-by: Arturlang <24881678+Arturlang@users.noreply.github.com>
Co-authored-by: aKromatopzia <94389683+aKromatopzia@users.noreply.github.com>
Co-authored-by: Jinshee <96621959+Jinshee@users.noreply.github.com>
Co-authored-by: Jinshee <manastra2536@gmail.com>
Co-authored-by: JustMeTheIInd <145101584+JustMeTheIInd@users.noreply.github.com>
Co-authored-by: nevimer <77420409+nevimer@users.noreply.github.com>
Co-authored-by: Odairu <39929315+Odairu@users.noreply.github.com>
Co-authored-by: LT3 <83487515+lessthnthree@users.noreply.github.com>
Co-authored-by: Roxy <75404941+TealSeer@users.noreply.github.com>
2025-05-13 15:05:46 -04:00

81 lines
2.6 KiB
Plaintext

#define MOB_LAYER_SHIFT_INCREMENT 1
/// The amount by which layers are multiplied before being modified.
/// Helps avoiding floating point errors.
#define MOB_LAYER_MULTIPLIER 100
#define MOB_LAYER_SHIFT_MIN 3.95
//#define MOB_LAYER 4 // This is a byond standard define
#define MOB_LAYER_SHIFT_MAX 4.05
/mob/living/verb/shift_layer_up()
set name = "Shift Layer Upwards"
set category = "IC"
if(incapacitated)
to_chat(src, span_warning("You can't do that right now!"))
return FALSE
if(layer >= MOB_LAYER_SHIFT_MAX)
to_chat(src, span_warning("You cannot increase your layer priority any further."))
return FALSE
layer = min(((layer * MOB_LAYER_MULTIPLIER) + MOB_LAYER_SHIFT_INCREMENT) / MOB_LAYER_MULTIPLIER, MOB_LAYER_SHIFT_MAX)
var/layer_priority = round(layer * MOB_LAYER_MULTIPLIER - MOB_LAYER * MOB_LAYER_MULTIPLIER, MOB_LAYER_SHIFT_INCREMENT) // Just for text feedback
to_chat(src, span_notice("Your layer priority is now [layer_priority]."))
return TRUE
/mob/living/verb/shift_layer_down()
set name = "Shift Layer Downwards"
set category = "IC"
if(incapacitated)
to_chat(src, span_warning("You can't do that right now!"))
return FALSE
if(layer <= MOB_LAYER_SHIFT_MIN)
to_chat(src, span_warning("You cannot decrease your layer priority any further."))
return FALSE
layer = max(((layer * MOB_LAYER_MULTIPLIER) - MOB_LAYER_SHIFT_INCREMENT) / MOB_LAYER_MULTIPLIER, MOB_LAYER_SHIFT_MIN)
var/layer_priority = round(layer * MOB_LAYER_MULTIPLIER - MOB_LAYER * MOB_LAYER_MULTIPLIER, MOB_LAYER_SHIFT_INCREMENT) // Just for text feedback
to_chat(src, span_notice("Your layer priority is now [layer_priority]."))
return TRUE
/datum/emote/living/shift_layer_up
key = "shiftlayerup"
message = null
mob_type_blacklist_typecache = list(/mob/living/brain)
cooldown = 0.25 SECONDS
/datum/emote/living/shift_layer_up/run_emote(mob/user, params, type_override, intentional)
if(!can_run_emote(user))
to_chat(user, span_warning("You can't change layer at this time."))
return FALSE
var/mob/living/layer_shifter = user
return layer_shifter.shift_layer_up()
/datum/emote/living/shift_layer_down
key = "shiftlayerdown"
message = null
mob_type_blacklist_typecache = list(/mob/living/brain)
cooldown = 0.25 SECONDS
/datum/emote/living/shift_layer_down/run_emote(mob/user, params, type_override, intentional)
if(!can_run_emote(user))
to_chat(user, span_warning("You can't change layer at this time."))
return FALSE
var/mob/living/layer_shifter = user
return layer_shifter.shift_layer_down()
#undef MOB_LAYER_SHIFT_INCREMENT
#undef MOB_LAYER_MULTIPLIER
#undef MOB_LAYER_SHIFT_MIN
#undef MOB_LAYER_SHIFT_MAX