diff --git a/code/__DEFINES/~doppler_defines/is_helpers.dm b/code/__DEFINES/~doppler_defines/is_helpers.dm
index 606790c68fee3..386ebb65532c7 100644
--- a/code/__DEFINES/~doppler_defines/is_helpers.dm
+++ b/code/__DEFINES/~doppler_defines/is_helpers.dm
@@ -1,9 +1,9 @@
//Species
-#define isprimitive(A) (is_species(A, /datum/species/genemod/primitive))
+#define isprimitive(A) (is_species(A, /datum/species/human/genemod/primitive))
//Customization bases
#define isinsectoid(A) (is_species(A, /datum/species/insectoid))
#define issnail(A) (is_species(A, /datum/species/snail))
-#define ishemophage(A) (is_species(A, /datum/species/genemod/hemophage))
+#define ishemophage(A) (is_species(A, /datum/species/human/genemod/hemophage))
#define isramatan(A) (is_species(A, /datum/species/ramatan))
//Species blood colors
#define hasgreenblood(A) (isinsectoid(A) || issnail(A) || isflyperson(A) || isalien(A) || HAS_TRAIT(A, TRAIT_GREEN_BLOOD))
diff --git a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm
index d0e8c707ab1aa..fa7b3a4ff6fb8 100644
--- a/code/__DEFINES/~doppler_defines/mutant_blacklists.dm
+++ b/code/__DEFINES/~doppler_defines/mutant_blacklists.dm
@@ -4,5 +4,5 @@ GLOBAL_LIST_INIT(species_blacklist_no_mutant, list(
GLOBAL_LIST_INIT(species_blacklist_no_humanoid, list(
/datum/species/golem,
- /datum/species/genemod/primitive,
+ /datum/species/human/genemod/primitive,
))
diff --git a/code/__DEFINES/~doppler_defines/mutant_variations.dm b/code/__DEFINES/~doppler_defines/mutant_variations.dm
index 4cc24ddc70254..e6580d352e9bd 100644
--- a/code/__DEFINES/~doppler_defines/mutant_variations.dm
+++ b/code/__DEFINES/~doppler_defines/mutant_variations.dm
@@ -1,27 +1,30 @@
/// The defines of each animal type who have their respective organ and list of sprite accessories beholding to them
// The string has to much the type name of the organ they represent, i.e. /obj/item/organ/external/tail/dog
#define NO_VARIATION "none"
+#define ALIEN "alien"
+#define BIRD "bird"
+#define BUG "bug"
+#define BUNNY "bunny"
#define CAT "cat"
+#define CYBERNETIC "cybernetic"
+#define DEER "deer"
#define DOG "dog"
+#define FISH "fish"
#define FOX "fox"
+#define FROG "frog"
+#define HUMANOID "humanoid"
#define LIZARD "lizard"
-#define BUNNY "bunny"
-#define BIRD "bird"
-#define MOUSE "mouse"
-#define FISH "fish"
#define MONKEY "monkey"
-#define DEER "deer"
-#define BUG "bug"
-#define CYBERNETIC "cybernetic"
-#define HUMANOID "humanoid"
-#define ALIEN "alien"
+#define MOUSE "mouse"
/// This list gets read by the dropdown pref when a player chooses what type of sprite accessory to access
GLOBAL_LIST_INIT(mutant_variations, list(
+ ALIEN,
BIRD,
BUG,
BUNNY,
CAT,
+ CYBERNETIC,
DEER,
DOG,
FISH,
@@ -30,21 +33,21 @@ GLOBAL_LIST_INIT(mutant_variations, list(
LIZARD,
MONKEY,
MOUSE,
- CYBERNETIC,
- ALIEN,
))
/// This list gets read by the animalistic preference for genemod and anthros
GLOBAL_LIST_INIT(genemod_variations, list(
- NO_VARIATION,
BIRD,
+ BUG,
BUNNY,
CAT,
DEER,
DOG,
FISH,
FOX,
+ FROG,
LIZARD,
MONKEY,
MOUSE,
+ NO_VARIATION,
))
diff --git a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
index 0e5944e118f70..eb9014df95580 100644
--- a/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
+++ b/code/game/machinery/dna_infuser/organ_sets/fish_organs.dm
@@ -224,7 +224,7 @@
safe_oxygen_min = 0 //We don't breathe this
///The required partial pressure of water_vapor for not suffocating.
- var/safe_water_level = parent_type::safe_oxygen_min
+// var/safe_water_level = parent_type::safe_oxygen_min // DOPPLER EDIT REMOVAL - moved to parent type
/// Bodypart overlay applied to the chest where the lungs are in
var/datum/bodypart_overlay/simple/gills/gills
@@ -240,7 +240,7 @@
gills = new()
AddElement(/datum/element/noticable_organ, "%PRONOUN_Theyve a set of gills on %PRONOUN_their neck.", BODY_ZONE_PRECISE_MOUTH)
AddComponent(/datum/component/bubble_icon_override, "fish", BUBBLE_ICON_PRIORITY_ORGAN)
- AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean"))
+// AddComponent(/datum/component/speechmod, replacements = strings("crustacean_replacement.json", "crustacean")) // DOPPLER EDIT REMOVAL - really funny i wish we could keep this
/obj/item/organ/internal/lungs/fish/Destroy()
QDEL_NULL(gills)
@@ -261,7 +261,7 @@
owner.clear_alert(ALERT_NOT_ENOUGH_WATER)
/// Requires the spaceman to have either water vapor or be wet.
-/obj/item/organ/internal/lungs/fish/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp)
+/obj/item/organ/internal/lungs/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp) // DOPPLER EDIT, old code: /obj/item/organ/internal/lungs/fish/proc/breathe_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp, old_water_pp)
var/need_to_breathe = !HAS_TRAIT(src, TRAIT_SPACEBREATHING) && !HAS_TRAIT(breather, TRAIT_IS_WET)
if(water_pp < safe_water_level && need_to_breathe)
on_low_water(breather, breath, water_pp)
@@ -278,7 +278,7 @@
breather.adjustOxyLoss(-5)
/// Called when there isn't enough water to breath
-/obj/item/organ/internal/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp)
+/obj/item/organ/internal/lungs/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp) // DOPPLER EDIT, old code: /obj/item/organ/internal/lungs/fish/proc/on_low_water(mob/living/carbon/breather, datum/gas_mixture/breath, water_pp)
breather.throw_alert(ALERT_NOT_ENOUGH_WATER, /atom/movable/screen/alert/not_enough_water)
var/gas_breathed = handle_suffocation(breather, water_pp, safe_water_level, breath.gases[/datum/gas/water_vapor][MOLES])
if(water_pp)
diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm
index be9c6dc1d1cd1..e1e445331347f 100644
--- a/code/modules/mob/living/brain/brain_item.dm
+++ b/code/modules/mob/living/brain/brain_item.dm
@@ -472,7 +472,7 @@
/obj/item/organ/internal/brain/lizard //A bit smaller than average
name = "lizard brain"
desc = "This juicy piece of meat has a oversized brain stem and cerebellum, with not much of a limbic system to speak of at all. You would expect it's owner to be pretty cold blooded."
- organ_traits = list(TRAIT_TACKLING_TAILED_DEFENDER)
+// organ_traits = list(TRAIT_TACKLING_TAILED_DEFENDER) // DOPPLER EDIT REMOVAL
/obj/item/organ/internal/brain/abductor
name = "grey brain"
diff --git a/code/modules/research/techweb/nodes/medbay_nodes.dm b/code/modules/research/techweb/nodes/medbay_nodes.dm
index 897a2edf18e43..5a7c9cfd8710e 100644
--- a/code/modules/research/techweb/nodes/medbay_nodes.dm
+++ b/code/modules/research/techweb/nodes/medbay_nodes.dm
@@ -58,6 +58,7 @@
"plumbing_rcd_service",
"plunger",
"fluid_ducts",
+ "vaporizer", // DOPPLER ADDITION
)
research_costs = list(TECHWEB_POINT_TYPE_GENERIC = TECHWEB_TIER_1_POINTS)
announce_channels = list(RADIO_CHANNEL_MEDICAL)
diff --git a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
index 6761fa6751a5d..1a4d87e0c39cc 100644
--- a/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/species_parts/moth_bodyparts.dm
@@ -7,7 +7,7 @@
should_draw_greyscale = FALSE
head_flags = HEAD_LIPS|HEAD_EYESPRITES|HEAD_EYEHOLES|HEAD_DEBRAIN //what the fuck, moths have lips?
teeth_count = 0
- bodypart_traits = list(TRAIT_ANTENNAE)
+// bodypart_traits = list(TRAIT_ANTENNAE) // DOPPLER EDIT REMOVAL
/obj/item/bodypart/chest/moth
icon = 'icons/mob/human/species/moth/bodyparts.dmi'
@@ -17,7 +17,7 @@
is_dimorphic = TRUE
should_draw_greyscale = FALSE
wing_types = list(/obj/item/organ/external/wings/functional/moth/megamoth, /obj/item/organ/external/wings/functional/moth/mothra)
- bodypart_traits = list(TRAIT_TACKLING_WINGED_ATTACKER)
+// bodypart_traits = list(TRAIT_TACKLING_WINGED_ATTACKER) // DOPPLER EDIT REMOVAL
/obj/item/bodypart/chest/moth/get_butt_sprite()
return icon('icons/mob/butts.dmi', BUTT_SPRITE_FUZZY)
diff --git a/code/modules/surgery/organs/external/_visual_organs.dm b/code/modules/surgery/organs/external/_visual_organs.dm
index 76de51229b691..00bb03ca364ff 100644
--- a/code/modules/surgery/organs/external/_visual_organs.dm
+++ b/code/modules/surgery/organs/external/_visual_organs.dm
@@ -195,6 +195,7 @@ Unlike normal organs, we're actually inside a persons limbs at all times
preference = "feature_moth_antennae"
dna_block = DNA_MOTH_ANTENNAE_BLOCK
restyle_flags = EXTERNAL_RESTYLE_FLESH
+ organ_traits = list(TRAIT_ANTENNAE) // DOPPLER EDIT ADDITION
bodypart_overlay = /datum/bodypart_overlay/mutant/antennae
diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm
index 3ae057f5965cc..7f05612e9967b 100644
--- a/code/modules/surgery/organs/external/tails.dm
+++ b/code/modules/surgery/organs/external/tails.dm
@@ -9,6 +9,7 @@
dna_block = DNA_TAIL_BLOCK
restyle_flags = EXTERNAL_RESTYLE_FLESH
+ organ_traits = list(TRAIT_TACKLING_TAILED_DEFENDER) // DOPPLER EDIT ADDITION
// defaults to cat, but the parent type shouldn't be created regardless
bodypart_overlay = /datum/bodypart_overlay/mutant/tail/cat
diff --git a/code/modules/surgery/organs/external/wings/wings.dm b/code/modules/surgery/organs/external/wings/wings.dm
index 775ffebf54cdf..d12a57284f66c 100644
--- a/code/modules/surgery/organs/external/wings/wings.dm
+++ b/code/modules/surgery/organs/external/wings/wings.dm
@@ -6,6 +6,7 @@
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_EXTERNAL_WINGS
+ organ_traits = list(TRAIT_TACKLING_WINGED_ATTACKER) // DOPPLER EDIT ADDITION
use_mob_sprite_as_obj_sprite = TRUE
bodypart_overlay = /datum/bodypart_overlay/mutant/wings
diff --git a/code/modules/surgery/organs/internal/lungs/_lungs.dm b/code/modules/surgery/organs/internal/lungs/_lungs.dm
index b2d85a26f8fdc..02ec157932489 100644
--- a/code/modules/surgery/organs/internal/lungs/_lungs.dm
+++ b/code/modules/surgery/organs/internal/lungs/_lungs.dm
@@ -42,6 +42,9 @@
//These thresholds are checked against what amounts to total_mix_pressure * (gas_type_mols/total_mols)
var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa
var/safe_oxygen_max = 0
+ // DOPPLER ADDITION START
+ var/safe_water_level = 16
+ // DOPPLER ADDITION END
var/safe_nitro_min = 0
var/safe_co2_max = 10 // Yes it's an arbitrary value who cares?
var/safe_plasma_min = 0
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_genemod.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_genemod.png
similarity index 100%
rename from code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_genemod.png
rename to code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_genemod.png
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_genemod_hemophage.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_genemod_hemophage.png
similarity index 100%
rename from code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_genemod_hemophage.png
rename to code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_genemod_hemophage.png
diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_genemod_primitive.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_genemod_primitive.png
similarity index 100%
rename from code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_genemod_primitive.png
rename to code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_human_genemod_primitive.png
diff --git a/modular_doppler/hearthkin/primitive_genemod/code/objects.dm b/modular_doppler/hearthkin/primitive_genemod/code/objects.dm
index 8aced5c08dffc..bf74c086cc3e7 100644
--- a/modular_doppler/hearthkin/primitive_genemod/code/objects.dm
+++ b/modular_doppler/hearthkin/primitive_genemod/code/objects.dm
@@ -9,7 +9,7 @@
var/being_used = FALSE
/obj/item/anointing_oil/attack(mob/living/target_mob, mob/living/user, params)
- if (!is_species(user, /datum/species/genemod/primitive))
+ if (!is_species(user, /datum/species/human/genemod/primitive))
to_chat(user, span_warning("You have no idea what this disgusting concoction is used for."))
return
if(being_used || !ismob(target_mob)) //originally this was going to check if the mob was friendly, but if an icecat wants to name some terror mob while it's tearing chunks out of them, why not?
@@ -48,7 +48,7 @@
/obj/item/anointing_oil/examine(mob/user)
. = ..()
- if(is_species(user, /datum/species/genemod/primitive))
+ if(is_species(user, /datum/species/human/genemod/primitive))
. += span_info("Using this on the local wildlife will allow you to give them a name.")
/datum/crafting_recipe/anointing_oil
@@ -74,7 +74,7 @@
w_class = WEIGHT_CLASS_TINY
/obj/item/frozen_breath/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
- if (!is_species(user, /datum/species/genemod/primitive))
+ if (!is_species(user, /datum/species/human/genemod/primitive))
to_chat(user, span_warning("You have no idea how to use this freezing concoction."))
return
@@ -94,7 +94,7 @@
/obj/item/frozen_breath/examine(mob/user)
. = ..()
- if(is_species(user, /datum/species/genemod/primitive))
+ if(is_species(user, /datum/species/human/genemod/primitive))
. += span_info("Using this on a pair of organic lungs transforms them into hardy lungs. This will remove any other special features from the old lungs, if there were any.")
/datum/crafting_recipe/frozen_breath
diff --git a/modular_doppler/hearthkin/primitive_genemod/code/spawner.dm b/modular_doppler/hearthkin/primitive_genemod/code/spawner.dm
index 3b75448ebffed..329469d585ccb 100644
--- a/modular_doppler/hearthkin/primitive_genemod/code/spawner.dm
+++ b/modular_doppler/hearthkin/primitive_genemod/code/spawner.dm
@@ -4,7 +4,7 @@
prompt_name = "icemoon dweller"
icon = 'icons/mob/simple/lavaland/nest.dmi'
icon_state = "hole"
- mob_species = /datum/species/genemod/primitive
+ mob_species = /datum/species/human/genemod/primitive
outfit = /datum/outfit/primitive_genemod
density = FALSE
you_are_text = "You are an icemoon dweller."
@@ -20,7 +20,7 @@
/// The team the spawner will assign players to and use to keep track of people that have already used the spawner
var/datum/team/primitive_genemods/team
- restricted_species = list(/datum/species/genemod/primitive)
+ restricted_species = list(/datum/species/human/genemod/primitive)
infinite_use = TRUE
deletes_on_zero_uses_left = FALSE
diff --git a/modular_doppler/loadout_categories/categories/accessories.dm b/modular_doppler/loadout_categories/categories/accessories.dm
new file mode 100644
index 0000000000000..a46ed7cf64aba
--- /dev/null
+++ b/modular_doppler/loadout_categories/categories/accessories.dm
@@ -0,0 +1,4 @@
+/datum/loadout_item/accessory/wetmaker
+ name = "Stardress hydro-vaporizer"
+ item_path = /obj/item/clothing/accessory/vaporizer
+ additional_displayed_text = list("A must-have for water-breathers!")
diff --git a/modular_doppler/modular_cosmetics/icons/mob/accessories/accessories.dmi b/modular_doppler/modular_cosmetics/icons/mob/accessories/accessories.dmi
new file mode 100644
index 0000000000000..82840b283400c
Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/mob/accessories/accessories.dmi differ
diff --git a/modular_doppler/modular_cosmetics/icons/obj/accessories/accessories.dmi b/modular_doppler/modular_cosmetics/icons/obj/accessories/accessories.dmi
new file mode 100644
index 0000000000000..93fe9f33f545f
Binary files /dev/null and b/modular_doppler/modular_cosmetics/icons/obj/accessories/accessories.dmi differ
diff --git a/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm b/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm
index 85ca189962c5e..9b088bf3395ad 100644
--- a/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm
+++ b/modular_doppler/modular_customization/accessories/code/~overrides/code/overrides.dm
@@ -19,7 +19,7 @@
. = ..()
/// Weirdness Check Zone
if(randomize_features)
- if(istype(species, /datum/species/genemod))
+ if(istype(species, /datum/species/human/genemod))
var/skin_tone = pick(GLOB.skin_tones)
features["mcolor"] = skintone2hex(skin_tone) //spoof
if(species.id != /datum/species/human/felinid::id)
diff --git a/modular_doppler/modular_customization/organs/external/tail.dm b/modular_doppler/modular_customization/organs/external/tail.dm
index a0ffd7a86871f..ae9b6a13db3ef 100644
--- a/modular_doppler/modular_customization/organs/external/tail.dm
+++ b/modular_doppler/modular_customization/organs/external/tail.dm
@@ -163,6 +163,7 @@
//
/obj/item/organ/external/tail/fish
preference = "feature_fish_tail"
+ organ_traits = list(TRAIT_TACKLING_TAILED_DEFENDER, TRAIT_FLOPPING)
/// Cybernetic tail
//
diff --git a/modular_doppler/modular_customization/organs/internal/ears.dm b/modular_doppler/modular_customization/organs/internal/ears.dm
index 500df70c5c226..02ecf76d2be38 100644
--- a/modular_doppler/modular_customization/organs/internal/ears.dm
+++ b/modular_doppler/modular_customization/organs/internal/ears.dm
@@ -91,6 +91,7 @@
/obj/item/organ/internal/ears/bug
preference = "feature_bug_ears"
bodypart_overlay = /datum/bodypart_overlay/mutant/ears/bug_ears
+ organ_traits = list(TRAIT_ANTENNAE)
/datum/bodypart_overlay/mutant/ears/bug_ears/get_global_feature_list()
return SSaccessories.ears_list_bug
diff --git a/modular_doppler/modular_customization/organs/internal/tongue.dm b/modular_doppler/modular_customization/organs/internal/tongue.dm
index 82a21af3878d5..3344ce92bfcdd 100644
--- a/modular_doppler/modular_customization/organs/internal/tongue.dm
+++ b/modular_doppler/modular_customization/organs/internal/tongue.dm
@@ -1,9 +1,47 @@
+/// Bug tongue
+//
+/obj/item/organ/internal/tongue/bug
+ name = "bug tongue"
+ desc = "A fleshy muscle mostly used for chittering."
+ icon = 'icons/obj/medical/organs/fly_organs.dmi'
+ say_mod = "chitters"
+
+/// Cat tongue
+//
+/obj/item/organ/internal/tongue/cat/Insert(mob/living/carbon/signer, special = FALSE, movement_flags = DELETE_IF_REPLACED)
+ . = ..()
+ signer.verb_ask = "mrrps"
+ signer.verb_exclaim = "mrrowls"
+ signer.verb_whisper = "purrs"
+ signer.verb_yell = "yowls"
+
+/obj/item/organ/internal/tongue/cat/Remove(mob/living/carbon/speaker, special = FALSE, movement_flags)
+ . = ..()
+ speaker.verb_ask = initial(verb_ask)
+ speaker.verb_exclaim = initial(verb_exclaim)
+ speaker.verb_whisper = initial(verb_whisper)
+ speaker.verb_yell = initial(verb_yell)
+
/// Dog tongue
//
/obj/item/organ/internal/tongue/dog
name = "dog tongue"
desc = "A fleshy muscle mostly used for barking."
- say_mod = "barks"
+ say_mod = "woofs"
+
+/obj/item/organ/internal/tongue/dog/Insert(mob/living/carbon/signer, special = FALSE, movement_flags = DELETE_IF_REPLACED)
+ . = ..()
+ signer.verb_ask = "arfs"
+ signer.verb_exclaim = "wans"
+ signer.verb_whisper = "whimpers"
+ signer.verb_yell = "barks"
+
+/obj/item/organ/internal/tongue/dog/Remove(mob/living/carbon/speaker, special = FALSE, movement_flags)
+ . = ..()
+ speaker.verb_ask = initial(verb_ask)
+ speaker.verb_exclaim = initial(verb_exclaim)
+ speaker.verb_whisper = initial(verb_whisper)
+ speaker.verb_yell = initial(verb_yell)
/// Bird tongue
//
@@ -40,6 +78,9 @@
desc = "A fleshy muscle mostly used for gnashing."
say_mod = "gnashes"
-/// Monkey tongue
+/// Frog tongue
//
-/obj/item/organ/internal/tongue/monkey
+/obj/item/organ/internal/tongue/frog
+ name = "frog tongue"
+ desc = "A fleshy muscle mostly used for ribbiting."
+ say_mod = "ribbits"
diff --git a/modular_doppler/modular_customization/preferences/species_traits.dm b/modular_doppler/modular_customization/preferences/species_traits.dm
index aaf22e2fd3c6e..336cc5bda057b 100644
--- a/modular_doppler/modular_customization/preferences/species_traits.dm
+++ b/modular_doppler/modular_customization/preferences/species_traits.dm
@@ -17,22 +17,26 @@
return icon('icons/mob/simple/animal.dmi', "chicken_brown", EAST)
if(BUNNY)
return icon('icons/mob/simple/rabbit.dmi', "rabbit_white", WEST)
+ if(BUG)
+ return icon('icons/mob/simple/animal.dmi', "cockroach", EAST)
if(CAT)
- return icon('icons/mob/simple/pets.dmi', "cat2", EAST)
+ return icon('icons/mob/simple/pets.dmi', "cat2", WEST)
if(DEER)
- return icon('icons/mob/simple/animal.dmi', "deer-doe", WEST)
+ return icon('icons/mob/simple/animal.dmi', "deer-doe", EAST)
if(DOG)
- return icon('icons/mob/simple/pets.dmi', "corgi", EAST)
+ return icon('icons/mob/simple/pets.dmi', "corgi", WEST)
if(FISH)
- return icon('icons/mob/simple/carp.dmi', "carp", WEST)
+ return icon('icons/mob/simple/carp.dmi', "carp", EAST)
if(FOX)
- return icon('icons/mob/simple/pets.dmi', "fox", EAST)
+ return icon('icons/mob/simple/pets.dmi', "fox", WEST)
+ if(FROG)
+ return icon('icons/mob/simple/animal.dmi', "frog", EAST)
if(LIZARD)
- return icon('icons/mob/simple/animal.dmi', "lizard", EAST)
+ return icon('icons/mob/simple/animal.dmi', "lizard", WEST)
if(MONKEY)
- return icon('icons/mob/human/human.dmi', "monkey", WEST)
+ return icon('icons/mob/human/human.dmi', "monkey", EAST)
if(MOUSE)
- return icon('icons/mob/simple/animal.dmi', "mouse_white", EAST)
+ return icon('icons/mob/simple/animal.dmi', "mouse_white", WEST)
else
return icon('icons/effects/crayondecal.dmi', "x")
diff --git a/modular_doppler/modular_quirks/breather/accessories.dm b/modular_doppler/modular_quirks/breather/accessories.dm
new file mode 100644
index 0000000000000..b0f99d0875ff4
--- /dev/null
+++ b/modular_doppler/modular_quirks/breather/accessories.dm
@@ -0,0 +1,90 @@
+/obj/item/clothing/accessory/breathing
+ name = "breathing dogtag"
+ desc = "A dogtag which labels what kind of gas a person may breathe."
+ icon_state = "allergy"
+ above_suit = FALSE
+ attachment_slot = NONE
+ var/breath_type
+
+/obj/item/clothing/accessory/breathing/examine(mob/user)
+ . = ..()
+ . += "The dogtag reads: I breathe [breath_type]."
+
+/obj/item/clothing/accessory/breathing/accessory_equipped(obj/item/clothing/under/uniform, user)
+ . = ..()
+ RegisterSignal(user, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
+
+/obj/item/clothing/accessory/breathing/accessory_dropped(obj/item/clothing/under/uniform, user)
+ . = ..()
+ UnregisterSignal(user, COMSIG_ATOM_EXAMINE)
+
+/obj/item/clothing/accessory/breathing/proc/on_examine(datum/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+ examine_list += "[user.p_Their()] [name] reads: 'I breathe [breath_type]'."
+
+
+// Accessory for Akula species, it makes them wet and happy! :)
+/obj/item/clothing/accessory/vaporizer
+ name = "\improper Stardress hydro-vaporizer"
+ desc = "An expensive device manufactured for the civilian work-force of the Azulean military power. \
+ Relying on an internal battery, the coil mechanism synthesizes a hydrogen oxygen mixture, \
+ which can then be used to moisturize the wearer's skin. \n\n\
+ A label on its back warns about the potential dangers of electro-magnetic pulses. \
+ ctrl-click in-hand to hide the device while worn."
+ icon_state = "wetmaker"
+ base_icon_state = "wetmaker"
+ icon = 'modular_doppler/modular_cosmetics/icons/obj/accessories/accessories.dmi'
+ worn_icon = 'modular_doppler/modular_cosmetics/icons/mob/accessories/accessories.dmi'
+ obj_flags = UNIQUE_RENAME
+ attachment_slot = NONE
+
+/obj/item/clothing/accessory/vaporizer/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/wetsuit)
+
+/obj/item/clothing/accessory/vaporizer/item_ctrl_click(mob/user)
+ . = ..()
+ if(!ishuman(user))
+ return CLICK_ACTION_BLOCKING
+ var/mob/living/carbon/human/wearer = user
+ if(wearer.get_active_held_item() != src)
+ to_chat(wearer, span_warning("You must hold the [src] in your hand to do this!"))
+ return CLICK_ACTION_BLOCKING
+ if(icon_state == "[base_icon_state]")
+ icon_state = "[base_icon_state]_hidden"
+ worn_icon_state = "[base_icon_state]_hidden"
+ balloon_alert(wearer, "hidden")
+ else
+ icon_state = "[base_icon_state]"
+ worn_icon_state = "[base_icon_state]"
+ balloon_alert(wearer, "shown")
+ update_icon() // update that mf
+ return CLICK_ACTION_SUCCESS
+
+/obj/item/clothing/accessory/vaporizer/emp_act(severity)
+ . = ..()
+ var/obj/item/clothing/under/attached_to = loc
+ var/mob/living/carbon/human/wearer = attached_to.loc
+ if(!istype(wearer) || !istype(attached_to))
+ return
+ var/turf/open/tile = get_turf(wearer)
+ if(istype(tile))
+ tile.atmos_spawn_air("[GAS_WATER_VAPOR]=50;[TURF_TEMPERATURE(1000)]")
+ wearer.balloon_alert(wearer, "overloaded!")
+ wearer.visible_message("[wearer] [wearer.p_their()] [src] overloads, exploding in a cloud of hot steam!")
+ wearer.set_jitter_if_lower(10 SECONDS)
+ playsound(wearer, 'sound/effects/spray.ogg', 80)
+ detach(attached_to) // safely remove wetsuit status effect
+ qdel(src)
+
+/datum/design/vaporizer
+ name = "Hydro-Vaporizer"
+ id = "vaporizer"
+ build_type = AUTOLATHE | PROTOLATHE | AWAY_LATHE
+ materials = list(/datum/material/gold = SMALL_MATERIAL_AMOUNT*2.5, /datum/material/silver =SMALL_MATERIAL_AMOUNT*5)
+ build_path = /obj/item/clothing/accessory/vaporizer
+ category = list(
+ RND_CATEGORY_INITIAL,
+ RND_CATEGORY_TOOLS + RND_SUBCATEGORY_TOOLS_MEDICAL,
+ )
+ departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE | DEPARTMENT_BITFLAG_SERVICE
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/icons/belt.dmi b/modular_doppler/modular_quirks/breather/nitrogen_breather/icons/belt.dmi
similarity index 100%
rename from modular_doppler/modular_quirks/nitrogen_breather/icons/belt.dmi
rename to modular_doppler/modular_quirks/breather/nitrogen_breather/icons/belt.dmi
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/icons/tank.dmi b/modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tank.dmi
similarity index 100%
rename from modular_doppler/modular_quirks/nitrogen_breather/icons/tank.dmi
rename to modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tank.dmi
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/icons/tanks_lefthand.dmi b/modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tanks_lefthand.dmi
similarity index 100%
rename from modular_doppler/modular_quirks/nitrogen_breather/icons/tanks_lefthand.dmi
rename to modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tanks_lefthand.dmi
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/icons/tanks_righthand.dmi b/modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tanks_righthand.dmi
similarity index 100%
rename from modular_doppler/modular_quirks/nitrogen_breather/icons/tanks_righthand.dmi
rename to modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tanks_righthand.dmi
diff --git a/modular_doppler/modular_quirks/breather/nitrogen_breather/nitrogen_breather.dm b/modular_doppler/modular_quirks/breather/nitrogen_breather/nitrogen_breather.dm
new file mode 100644
index 0000000000000..1eb1eb4078314
--- /dev/null
+++ b/modular_doppler/modular_quirks/breather/nitrogen_breather/nitrogen_breather.dm
@@ -0,0 +1,46 @@
+/datum/quirk/item_quirk/breather
+ abstract_parent_type = /datum/quirk/item_quirk/breather
+ icon = FA_ICON_LUNGS_VIRUS
+ var/breath_type = "oxygen"
+
+/datum/quirk/item_quirk/breather/nitrogen_breather
+ name = "Nitrogen Breather"
+ desc = "You breathe nitrogen, even if you might not normally breathe it. Oxygen is poisonous."
+ medical_record_text = "Patient can only breathe nitrogen."
+ gain_text = "You suddenly have a hard time breathing anything but nitrogen."
+ lose_text = "You suddenly feel like you aren't bound to nitrogen anymore."
+ value = 0
+ breath_type = "nitrogen"
+
+/datum/quirk/item_quirk/breather/nitrogen_breather/add_unique(client/client_source)
+ var/mob/living/carbon/human/target = quirk_holder
+ var/obj/item/clothing/accessory/breathing/target_tag = new(get_turf(target))
+ target_tag.breath_type = breath_type
+
+ give_item_to_holder(target_tag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+ give_item_to_holder(
+ /obj/item/tank/internals/nitrogen/belt/full,
+ list(
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS
+ )
+ )
+ var/obj/item/organ/internal/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS)
+ if(!target_lungs)
+ to_chat(target, span_warning("Your [name] quirk couldn't properly execute due to your species/body lacking a pair of lungs!"))
+ return
+ // set lung vars
+ target_lungs.safe_oxygen_min = 0 //Dont need oxygen
+ target_lungs.safe_oxygen_max = 2 //But it is quite toxic
+ target_lungs.safe_nitro_min = 10 // Atleast 10 nitrogen
+ target_lungs.oxy_damage_type = TOX
+ target_lungs.oxy_breath_dam_min = 6
+ target_lungs.oxy_breath_dam_max = 20
+ // update lung procs
+ target_lungs.breathe_always = list(/datum/gas/nitrogen = "breathe_nitro")
+ target_lungs.breath_present += list(/datum/gas/oxygen = "too_much_oxygen")
+ target_lungs.breath_lost += list(/datum/gas/oxygen = "safe_oxygen")
+ // reflect correct lung flags
+ target_lungs.respiration_type = RESPIRATION_N2
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/nitrogen_tanks.dm b/modular_doppler/modular_quirks/breather/nitrogen_breather/nitrogen_tanks.dm
similarity index 87%
rename from modular_doppler/modular_quirks/nitrogen_breather/nitrogen_tanks.dm
rename to modular_doppler/modular_quirks/breather/nitrogen_breather/nitrogen_tanks.dm
index a9f334602e9da..8f58978589e5d 100644
--- a/modular_doppler/modular_quirks/nitrogen_breather/nitrogen_tanks.dm
+++ b/modular_doppler/modular_quirks/breather/nitrogen_breather/nitrogen_tanks.dm
@@ -14,10 +14,10 @@
air_contents.gases[/datum/gas/nitrogen][MOLES] = (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)
/obj/item/tank/internals/nitrogen/belt
- icon = 'modular_doppler/modular_quirks/nitrogen_breather/icons/tank.dmi'
- worn_icon = 'modular_doppler/modular_quirks/nitrogen_breather/icons/belt.dmi'
- lefthand_file = 'modular_doppler/modular_quirks/nitrogen_breather/icons/tanks_lefthand.dmi'
- righthand_file = 'modular_doppler/modular_quirks/nitrogen_breather/icons/tanks_righthand.dmi'
+ icon = 'modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tank.dmi'
+ worn_icon = 'modular_doppler/modular_quirks/breather/nitrogen_breather/icons/belt.dmi'
+ lefthand_file = 'modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tanks_lefthand.dmi'
+ righthand_file = 'modular_doppler/modular_quirks/breather/nitrogen_breather/icons/tanks_righthand.dmi'
icon_state = "nitrogen_extended"
inhand_icon_state = "nitrogen"
slot_flags = ITEM_SLOT_BELT
diff --git a/modular_doppler/modular_quirks/breather/water_breather/water_breather.dm b/modular_doppler/modular_quirks/breather/water_breather/water_breather.dm
new file mode 100644
index 0000000000000..708e25746f435
--- /dev/null
+++ b/modular_doppler/modular_quirks/breather/water_breather/water_breather.dm
@@ -0,0 +1,42 @@
+/datum/quirk/item_quirk/breather/water_breather
+ name = "Water Breather"
+ desc = "You have a pair of gills and are only capable of breathing oxygen through water, stay wet to breathe!"
+ icon = FA_ICON_FISH
+ medical_record_text = "Patient has a pair of gills on their body."
+ gain_text = "You suddenly have a hard time breathing through thin air."
+ lose_text = "You suddenly feel like you aren't bound to breathing through liquid anymore."
+ value = 0
+ breath_type = "water"
+
+/datum/quirk/item_quirk/breather/water_breather/add_unique(client/client_source)
+ var/mob/living/carbon/human/target = quirk_holder
+ var/obj/item/clothing/accessory/breathing/target_tag = new(get_turf(target))
+ target_tag.breath_type = breath_type
+
+ give_item_to_holder(target_tag, list(LOCATION_BACKPACK = ITEM_SLOT_BACKPACK, LOCATION_HANDS = ITEM_SLOT_HANDS))
+ give_item_to_holder(
+ /obj/item/clothing/accessory/vaporizer,
+ list(
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK
+ ), "Be sure to equip your vaporizer, or you may end up choking to death!"
+ )
+ var/obj/item/organ/internal/lungs/target_lungs = target.get_organ_slot(ORGAN_SLOT_LUNGS)
+ var/obj/item/bodypart/chest/target_chest = target.get_bodypart(BODY_ZONE_CHEST)
+ if(!target_lungs || !target_chest)
+ to_chat(target, span_warning("Your [name] quirk couldn't properly execute due to your species/body lacking a pair of lungs!"))
+ return
+ // if your lungs already have this trait, no need to update
+ if(target_lungs.type == /obj/item/organ/internal/lungs/fish)
+ return
+ target_lungs.safe_oxygen_min = 0
+ // update lung procs
+ target_lungs.breathe_always = list(/datum/gas/water_vapor = "breathe_water")
+ // reflect correct lung flags
+ target_lungs.respiration_type = RESPIRATION_OXYGEN
+ // flavor
+ target_lungs.AddElement(/datum/element/noticable_organ, "%PRONOUN_Theyve a set of gills on %PRONOUN_their neck.", BODY_ZONE_PRECISE_MOUTH)
+ target_lungs.AddComponent(/datum/component/bubble_icon_override, "fish", BUBBLE_ICON_PRIORITY_ORGAN)
+ target_chest.add_bodypart_overlay(new /datum/bodypart_overlay/simple/gills)
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/equipping.dm b/modular_doppler/modular_quirks/nitrogen_breather/equipping.dm
deleted file mode 100644
index cb68d14168464..0000000000000
--- a/modular_doppler/modular_quirks/nitrogen_breather/equipping.dm
+++ /dev/null
@@ -1,61 +0,0 @@
-/datum/quirk/equipping
- abstract_parent_type = /datum/quirk/equipping
- quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE
- icon = FA_ICON_BOX_OPEN
- /// the items that will be equipped, formatted in the way of [item_path = list of slots it can be equipped to], will not equip over nodrop items
- var/list/items = list()
- /// the items that will be forcefully equipped, formatted in the way of [item_path = list of slots it can be equipped to], will equip over nodrop items
- var/list/forced_items = list()
- /// did we force drop any items? if so, they're in this list. useful for transferring any applicable contents into new items on roundstart
- var/list/force_dropped_items = list()
-
-/datum/quirk/equipping/add_unique(client/client_source)
- var/mob/living/carbon/carbon_holder = quirk_holder
- if (!items || !carbon_holder)
- return
- var/list/equipped_items = list()
- var/list/all_items = forced_items|items
- for (var/obj/item/item_path as anything in all_items)
- if (!ispath(item_path))
- continue
- var/item = new item_path(carbon_holder.loc)
- var/success = FALSE
- // Checking for nodrop and seeing if there's an empty slot
- for (var/slot as anything in all_items[item_path])
- success = force_equip_item(carbon_holder, item, slot, check_item = FALSE)
- if (success)
- break
- // Checking for nodrop
- for (var/slot as anything in all_items[item_path])
- success = force_equip_item(carbon_holder, item, slot)
- if (success)
- break
-
- if ((item_path in forced_items) && !success)
- // Checking for nodrop failed, shove it into the first available slot, even if it has nodrop
- for (var/slot as anything in all_items[item_path])
- success = force_equip_item(carbon_holder, item, slot, FALSE)
- if (success)
- break
- equipped_items[item] = success
- for (var/item as anything in equipped_items)
- on_equip_item(item, equipped_items[item])
-
-/datum/quirk/equipping/proc/force_equip_item(mob/living/carbon/target, obj/item/item, slot, check_nodrop = TRUE, check_item = TRUE)
- var/obj/item/item_in_slot = target.get_item_by_slot(slot)
- if (check_item && item_in_slot)
- if (check_nodrop && HAS_TRAIT(item_in_slot, TRAIT_NODROP))
- return FALSE
- target.dropItemToGround(item_in_slot, force = TRUE)
- force_dropped_items += item_in_slot
- RegisterSignal(item_in_slot, COMSIG_QDELETING, PROC_REF(dropped_items_cleanup))
-
- return target.equip_to_slot_if_possible(item, slot, disable_warning = TRUE) // this should never not work tbh
-
-/datum/quirk/equipping/proc/dropped_items_cleanup(obj/item/source)
- SIGNAL_HANDLER
-
- force_dropped_items -= source
-
-/datum/quirk/equipping/proc/on_equip_item(obj/item/equipped, success)
- return
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/lungs.dm b/modular_doppler/modular_quirks/nitrogen_breather/lungs.dm
deleted file mode 100644
index 6094ab1ef3250..0000000000000
--- a/modular_doppler/modular_quirks/nitrogen_breather/lungs.dm
+++ /dev/null
@@ -1,9 +0,0 @@
-/obj/item/organ/internal/lungs/nitrogen
- name = "nitrogen lungs"
- desc = "A set of lungs for breathing nitrogen."
- safe_oxygen_min = 0 //Dont need oxygen
- safe_oxygen_max = 2 //But it is quite toxic
- safe_nitro_min = 10 // Atleast 10 nitrogen
- oxy_damage_type = TOX
- oxy_breath_dam_min = 6
- oxy_breath_dam_max = 20
diff --git a/modular_doppler/modular_quirks/nitrogen_breather/quirk.dm b/modular_doppler/modular_quirks/nitrogen_breather/quirk.dm
deleted file mode 100644
index a0f3a8536c662..0000000000000
--- a/modular_doppler/modular_quirks/nitrogen_breather/quirk.dm
+++ /dev/null
@@ -1,91 +0,0 @@
-/datum/quirk/equipping/lungs
- abstract_parent_type = /datum/quirk/equipping/lungs
- icon = FA_ICON_LUNGS
- var/obj/item/organ/internal/lungs/lungs_holding
- var/obj/item/organ/internal/lungs/lungs_added
- var/lungs_typepath = /obj/item/organ/internal/lungs
- items = list(/obj/item/clothing/accessory/breathing = list(ITEM_SLOT_BACKPACK))
- var/breath_type = "oxygen"
-
-/datum/quirk/equipping/lungs/add(client/client_source)
- var/mob/living/carbon/human/carbon_holder = quirk_holder
- if (!istype(carbon_holder) || !lungs_typepath)
- return
- var/current_lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS)
- if (istype(current_lungs, lungs_typepath))
- return
- lungs_holding = current_lungs
- if(!isnull(lungs_holding))
- lungs_holding.organ_flags |= ORGAN_FROZEN // stop decay on the old lungs
- lungs_added = new lungs_typepath
- lungs_added.Insert(carbon_holder, special = TRUE)
- if(!isnull(lungs_holding))
- lungs_holding.moveToNullspace() // save them for later
-
-/datum/quirk/equipping/lungs/remove()
- var/mob/living/carbon/carbon_holder = quirk_holder
- if (!istype(carbon_holder) || !istype(lungs_holding))
- return
- var/obj/item/organ/internal/lungs/lungs = carbon_holder.get_organ_slot(ORGAN_SLOT_LUNGS)
- if (lungs != lungs_added && lungs != lungs_holding)
- qdel(lungs_holding)
- return
- lungs_holding.Insert(carbon_holder, special = TRUE, movement_flags = DELETE_IF_REPLACED)
- lungs_holding.organ_flags &= ~ORGAN_FROZEN
-
-/datum/quirk/equipping/lungs/on_equip_item(obj/item/equipped, success)
- var/mob/living/carbon/human/human_holder = quirk_holder
- if (!istype(equipped, /obj/item/clothing/accessory/breathing))
- return
- var/obj/item/clothing/accessory/breathing/acc = equipped
- acc.breath_type = breath_type
-
- var/obj/item/clothing/under/attach_to = human_holder?.w_uniform
- if (attach_to && acc.can_attach_accessory(attach_to, human_holder))
- acc.attach(human_holder.w_uniform, human_holder)
-
-/obj/item/clothing/accessory/breathing
- name = "breathing dogtag"
- desc = "Dogtag that lists what you breathe."
- icon_state = "allergy"
- above_suit = FALSE
- minimize_when_attached = TRUE
- attachment_slot = CHEST
- var/breath_type
-
-/obj/item/clothing/accessory/breathing/examine(mob/user)
- . = ..()
- . += "The dogtag reads: I breathe [breath_type]."
-
-/obj/item/clothing/accessory/breathing/accessory_equipped(obj/item/clothing/under/uniform, user)
- . = ..()
- RegisterSignal(uniform, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
-
-/obj/item/clothing/accessory/breathing/accessory_dropped(obj/item/clothing/under/uniform, user)
- . = ..()
- UnregisterSignal(uniform, COMSIG_ATOM_EXAMINE)
-
-/obj/item/clothing/accessory/breathing/proc/on_examine(datum/source, mob/user, list/examine_list)
- SIGNAL_HANDLER
- examine_list += "The dogtag reads: I breathe [breath_type]."
-
-/datum/quirk/equipping/lungs/nitrogen
- name = "Nitrogen Breather"
- desc = "You breathe nitrogen, even if you might not normally breathe it. Oxygen is poisonous."
- icon = FA_ICON_LUNGS_VIRUS
- medical_record_text = "Patient can only breathe nitrogen."
- gain_text = "You suddenly have a hard time breathing anything but nitrogen."
- lose_text = "You suddenly feel like you aren't bound to nitrogen anymore."
- value = 0
- forced_items = list(
- /obj/item/clothing/mask/breath = list(ITEM_SLOT_MASK),
- /obj/item/tank/internals/nitrogen/belt/full = list(ITEM_SLOT_HANDS, ITEM_SLOT_LPOCKET, ITEM_SLOT_RPOCKET))
- lungs_typepath = /obj/item/organ/internal/lungs/nitrogen
- breath_type = "nitrogen"
-
-/datum/quirk/equipping/lungs/nitrogen/on_equip_item(obj/item/equipped, success)
- . = ..()
- var/mob/living/carbon/carbon_holder = quirk_holder
- if (!success || !istype(carbon_holder) || !istype(equipped, /obj/item/tank/internals))
- return
- carbon_holder.internal = equipped
diff --git a/modular_doppler/modular_species/_species.dm b/modular_doppler/modular_species/_species.dm
index 00048be82343c..4badc76aec68d 100644
--- a/modular_doppler/modular_species/_species.dm
+++ b/modular_doppler/modular_species/_species.dm
@@ -59,17 +59,69 @@
/datum/species/proc/apply_animal_trait(mob/living/carbon/human/target, animal_trait)
if(!ishuman(target) || animal_trait == NO_VARIATION || !animal_trait)
return
- // Organs (or just tongues)
- /// Find and set our new informed tongue!
+
+ //// Add the organs!
+ // tongue
var/obj/item/organ/tongue = text2path("/obj/item/organ/internal/tongue/[animal_trait]")
if(tongue) // text2path nulls if it can't find a matching subtype, so don't worry adding an organ for every single trait value
mutanttongue = tongue.type
- // Adding traits from here on
+
+ // lungs
+ var/obj/item/organ/lungs = text2path("/obj/item/organ/internal/lungs/[animal_trait]")
+ if(lungs)
+ mutantlungs = lungs.type
+ else // If you have an organ that is more specific, you can add it in this switch() list
+ switch(animal_trait)
+ if(FROG)
+ mutantlungs = /obj/item/organ/internal/lungs/fish/amphibious
+
+ // liver
+ var/obj/item/organ/liver = text2path("/obj/item/organ/internal/liver/[animal_trait]")
+ if(liver)
+ mutantliver = liver.type
+ else
+ switch(animal_trait)
+ if(BUG)
+ mutantliver = /obj/item/organ/internal/liver/roach
+
+ // stomach
+ var/obj/item/organ/stomach = text2path("/obj/item/organ/internal/stomach/[animal_trait]")
+ if(stomach)
+ mutantstomach = stomach.type
+ else
+ switch(animal_trait)
+ if(BUG)
+ mutantstomach = /obj/item/organ/internal/stomach/roach
+
+ // appendix
+ var/obj/item/organ/appendix = text2path("/obj/item/organ/internal/appendix/[animal_trait]")
+ if(appendix)
+ mutantappendix = appendix.type
+ else
+ switch(animal_trait)
+ if(BUG)
+ mutantappendix = /obj/item/organ/internal/appendix/roach
+
+ ////
+ // Adding remaining traits, elements, components, and more from here on
switch(animal_trait)
+ if(BIRD)
+ target.AddComponent(/datum/component/pinata, candy = list(/obj/item/feather))
+ if(BUG)
+ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
+ ADD_TRAIT(target, TRAIT_WEB_WEAVER, SPECIES_TRAIT)
+ ADD_TRAIT(target, TRAIT_WEB_SURFER, SPECIES_TRAIT)
if(CAT)
ADD_TRAIT(target, TRAIT_CATLIKE_GRACE, SPECIES_TRAIT)
ADD_TRAIT(target, TRAIT_HATED_BY_DOGS, SPECIES_TRAIT)
-
+ ADD_TRAIT(target, TRAIT_WATER_HATER, SPECIES_TRAIT)
+ if(DEER)
+ target.AddElement(/datum/element/cliff_walking)
+ if(FISH)
+ ADD_TRAIT(target, TRAIT_WATER_ADAPTATION, SPECIES_TRAIT)
+ target.add_quirk(/datum/quirk/item_quirk/breather/water_breather) // this trait necessitates you get this 'item_quirk'
+ if(FROG)
+ ADD_TRAIT(target, TRAIT_WATER_ADAPTATION, SPECIES_TRAIT)
/// spec_revival logic
/datum/species/proc/spec_revival(mob/living/carbon/human/target)
diff --git a/modular_doppler/modular_species/species_types/akula/code/wetsuit.dm b/modular_doppler/modular_species/species_types/akula/code/wetsuit.dm
new file mode 100644
index 0000000000000..fe99522ff75a9
--- /dev/null
+++ b/modular_doppler/modular_species/species_types/akula/code/wetsuit.dm
@@ -0,0 +1,39 @@
+/// How many wetstacks does the clothing's status effect apply to its wearer
+#define STATUS_EFFECT_STACKS 5
+
+/datum/component/wetsuit
+ dupe_mode = COMPONENT_DUPE_UNIQUE
+
+/datum/component/wetsuit/RegisterWithParent()
+ . = ..()
+ RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(apply_wetsuit_status_effect))
+ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(remove_wetsuit_status_effect))
+
+/datum/component/wetsuit/UnregisterFromParent()
+ . = ..()
+ UnregisterSignal(parent, list(
+ COMSIG_ITEM_EQUIPPED,
+ COMSIG_ITEM_DROPPED,
+ ))
+
+/// A proc for all akula clothing which has the 'special tech' to keep their wearers slippery
+/datum/component/wetsuit/proc/apply_wetsuit_status_effect(obj/item/source, mob/living/user, slot)
+ if(slot == ITEM_SLOT_HANDS)
+ return FALSE
+
+ user.apply_status_effect(/datum/status_effect/grouped/wetsuit, REF(source))
+
+/// A proc to remove the wetsuit status effect
+/datum/component/wetsuit/proc/remove_wetsuit_status_effect(obj/item/source, mob/living/user, slot)
+ user.remove_status_effect(/datum/status_effect/grouped/wetsuit, REF(source))
+
+/// The status effect which `apply_wetsuit_status_effect` gives
+/datum/status_effect/grouped/wetsuit
+ id = "wetsuit"
+ alert_type = null
+ tick_interval = 5 SECONDS
+
+/datum/status_effect/grouped/wetsuit/tick(seconds_between_ticks)
+ owner.set_wet_stacks(stacks = STATUS_EFFECT_STACKS, remove_fire_stacks = FALSE)
+
+#undef STATUS_EFFECT_STACKS
diff --git a/modular_doppler/modular_species/species_types/genemod/genemod.dm b/modular_doppler/modular_species/species_types/genemod/genemod.dm
index d8ddf2b6e9e0e..a225b10a2d223 100644
--- a/modular_doppler/modular_species/species_types/genemod/genemod.dm
+++ b/modular_doppler/modular_species/species_types/genemod/genemod.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/species/genemod
- race = /datum/species/genemod
+ race = /datum/species/human/genemod
-/datum/species/genemod
+/datum/species/human/genemod
name = "Gene-Mod"
id = SPECIES_GENEMOD
preview_outfit = /datum/outfit/genemod_preview
@@ -23,22 +23,22 @@
name = "Gene-Mod (Species Preview)"
uniform = /obj/item/clothing/under/dress/sundress
-/datum/species/genemod/get_physical_attributes()
+/datum/species/human/genemod/get_physical_attributes()
return "N/a."
-/datum/species/genemod/get_species_description()
+/datum/species/human/genemod/get_species_description()
return "N/a."
-/datum/species/genemod/get_species_lore()
+/datum/species/human/genemod/get_species_lore()
return list(
"N/a.",
)
-/datum/species/genemod/on_species_gain(mob/living/carbon/human/target, datum/species/old_species, pref_load)
+/datum/species/human/genemod/on_species_gain(mob/living/carbon/human/target, datum/species/old_species, pref_load)
apply_animal_trait(target, find_animal_trait(target))
return ..()
-/datum/species/genemod/prepare_human_for_preview(mob/living/carbon/human/human_for_preview)
+/datum/species/human/genemod/prepare_human_for_preview(mob/living/carbon/human/human_for_preview)
human_for_preview.dna.ear_type = DOG
human_for_preview.dna.features["ears"] = "Fold"
human_for_preview.dna.features["ears_color_1"] = "#4E3E30"
diff --git a/modular_doppler/modular_species/species_types/hemophage/hemophage_species.dm b/modular_doppler/modular_species/species_types/hemophage/hemophage_species.dm
index b1bf3041465ce..f9e3cec230215 100644
--- a/modular_doppler/modular_species/species_types/hemophage/hemophage_species.dm
+++ b/modular_doppler/modular_species/species_types/hemophage/hemophage_species.dm
@@ -2,7 +2,7 @@
#define HEMOPHAGE_SPAWN_TEXT "You are an [span_danger("Hemophage")]. You will slowly but constantly lose blood if outside of a closet-like object. If inside a closet-like object, or in pure darkness, you will slowly heal, at the cost of blood. You may gain more blood by grabbing a live victim and using your drain ability."
-/datum/species/genemod/hemophage
+/datum/species/human/genemod/hemophage
name = "Hemophage"
id = SPECIES_HEMOPHAGE
preview_outfit = /datum/outfit/hemophage_preview
@@ -26,30 +26,24 @@
examine_limb_id = SPECIES_HUMAN
skinned_type = /obj/item/stack/sheet/animalhide/human
- digitigrade_customization = DIGITIGRADE_OPTIONAL
- digi_leg_overrides = list(
- BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/digitigrade/anthromorph,
- BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/digitigrade/anthromorph,
- )
-
-/datum/species/genemod/hemophage/check_roundstart_eligible()
+/datum/species/human/genemod/hemophage/check_roundstart_eligible()
if(check_holidays(HALLOWEEN))
return TRUE
return ..()
-/datum/species/genemod/hemophage/on_species_gain(mob/living/carbon/human/new_hemophage, datum/species/old_species, pref_load)
+/datum/species/human/genemod/hemophage/on_species_gain(mob/living/carbon/human/new_hemophage, datum/species/old_species, pref_load)
. = ..()
to_chat(new_hemophage, HEMOPHAGE_SPAWN_TEXT)
new_hemophage.update_body()
-/datum/species/genemod/hemophage/get_species_description()
+/datum/species/human/genemod/hemophage/get_species_description()
return "Oftentimes feared or pushed out of society for the predatory nature of their condition, \
Hemophages are typically mixed around various Frontier populations, keeping their true nature hidden while \
reaping both the benefits and easy access to prey, enjoying unpursued existences on the Frontier."
-/datum/species/genemod/hemophage/get_species_lore()
+/datum/species/human/genemod/hemophage/get_species_lore()
return list(
"Though known by many other names, 'Hemophages' are those that have found themselves the host of a bloodthirsty infection. 'Natural' hemophages have their infection first overtake their body through the bloodstream, though methods vary; \
Hemophages thought to be a dense cluster of tightly related but distinct strains and variants. It will first take root in the chest, making alterations to the cells making up the host's organs to rapidly expand and take them over. \
@@ -104,7 +98,7 @@
name = "Hemophage (Species Preview)"
uniform = /obj/item/clothing/under/suit/black_really/skirt
-/datum/species/genemod/hemophage/prepare_human_for_preview(mob/living/carbon/human/human)
+/datum/species/human/genemod/hemophage/prepare_human_for_preview(mob/living/carbon/human/human)
human.dna.features["mcolor"] = skintone2hex("albino")
human.dna.features["horns"] = "Lifted"
human.dna.features["horns_color_1"] = "#52435e"
@@ -118,7 +112,7 @@
regenerate_organs(human, src, visual_only = TRUE)
human.update_body(TRUE)
-/datum/species/genemod/hemophage/create_pref_unique_perks()
+/datum/species/human/genemod/hemophage/create_pref_unique_perks()
var/list/to_add = list()
to_add += list(
@@ -161,7 +155,7 @@
return to_add
-/datum/species/genemod/hemophage/create_pref_blood_perks()
+/datum/species/human/genemod/hemophage/create_pref_blood_perks()
var/list/to_add = list()
to_add += list(list(
@@ -177,12 +171,12 @@
return to_add
-/datum/species/genemod/hemophage/get_cry_sound(mob/living/carbon/human/hemophage)
+/datum/species/human/genemod/hemophage/get_cry_sound(mob/living/carbon/human/hemophage)
var/datum/species/human/human_species = GLOB.species_prototypes[/datum/species/human]
return human_species.get_cry_sound(hemophage)
// We don't need to mention that they're undead, as the perks that come from it are otherwise already explicited, and they might no longer be actually undead from a gameplay perspective, eventually.
-/datum/species/genemod/hemophage/create_pref_biotypes_perks()
+/datum/species/human/genemod/hemophage/create_pref_biotypes_perks()
return
diff --git a/modular_doppler/modular_species/species_types/insectoid/insectoid.dm b/modular_doppler/modular_species/species_types/insectoid/insectoid.dm
index 03407ac158c0b..c9265ed005610 100644
--- a/modular_doppler/modular_species/species_types/insectoid/insectoid.dm
+++ b/modular_doppler/modular_species/species_types/insectoid/insectoid.dm
@@ -8,9 +8,11 @@
preview_outfit = /datum/outfit/insect_preview
inherent_traits = list(
TRAIT_MUTANT_COLORS,
+ TRAIT_WEB_WEAVER,
+ TRAIT_WEB_SURFER,
)
body_markings = list(/datum/bodypart_overlay/simple/body_marking/lizard = "Insectoid Pattern")
- inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID
+ inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG
payday_modifier = 1.0
changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT
exotic_blood = /datum/reagent/bug_blood
@@ -29,6 +31,10 @@
BODY_ZONE_L_LEG = /obj/item/bodypart/leg/left/digitigrade/insectoid,
BODY_ZONE_R_LEG = /obj/item/bodypart/leg/right/digitigrade/insectoid,
)
+ mutanttongue = /obj/item/organ/internal/tongue/bug
+ mutantstomach = /obj/item/organ/internal/stomach/roach
+ mutantliver = /obj/item/organ/internal/liver/roach
+ mutantappendix = /obj/item/organ/internal/appendix/roach
/datum/outfit/insect_preview
name = "Insectoid (Species Preview)"
diff --git a/modular_doppler/modular_species/species_types/primitive_genemod/primitive_genemod.dm b/modular_doppler/modular_species/species_types/primitive_genemod/primitive_genemod.dm
index 9f4f732dcc978..bd33645d30d37 100644
--- a/modular_doppler/modular_species/species_types/primitive_genemod/primitive_genemod.dm
+++ b/modular_doppler/modular_species/species_types/primitive_genemod/primitive_genemod.dm
@@ -1,5 +1,5 @@
/mob/living/carbon/human/species/genemod/primitive
- race = /datum/species/genemod/primitive
+ race = /datum/species/human/genemod/primitive
/datum/language_holder/primitive_genemod
understood_languages = list(
@@ -10,7 +10,7 @@
)
selected_language = /datum/language/primitive_genemod
-/datum/species/genemod/primitive
+/datum/species/human/genemod/primitive
name = "Hearthkin"
id = SPECIES_GENEMOD_PRIMITIVE
preview_outfit = /datum/outfit/genemod_primitive_preview
@@ -38,7 +38,7 @@
neck = /obj/item/clothing/neck/scarf/primitive_genemod_scarf
back = /obj/item/forging/reagent_weapon/axe/fake_copper
-/datum/species/genemod/primitive/on_species_gain(mob/living/carbon/new_primitive, datum/species/old_species, pref_load)
+/datum/species/human/genemod/primitive/on_species_gain(mob/living/carbon/new_primitive, datum/species/old_species, pref_load)
. = ..()
var/mob/living/carbon/human/hearthkin = new_primitive
if(!istype(hearthkin))
@@ -51,14 +51,14 @@
mutation.mutadone_proof = TRUE
mutation.instability = 0
-/datum/species/genemod/primitive/on_species_loss(mob/living/carbon/former_primitive, datum/species/new_species, pref_load)
+/datum/species/human/genemod/primitive/on_species_loss(mob/living/carbon/former_primitive, datum/species/new_species, pref_load)
. = ..()
var/mob/living/carbon/human/hearthkin = former_primitive
if(!istype(hearthkin))
return
hearthkin.dna.remove_mutation(/datum/mutation/human/olfaction)
-/datum/species/genemod/primitive/prepare_human_for_preview(mob/living/carbon/human/human_for_preview)
+/datum/species/human/genemod/primitive/prepare_human_for_preview(mob/living/carbon/human/human_for_preview)
human_for_preview.dna.ear_type = CAT
human_for_preview.dna.features["ears"] = "Coeurl"
human_for_preview.dna.features["ears_color_1"] = "#e9eff5"
@@ -72,7 +72,7 @@
regenerate_organs(human_for_preview)
human_for_preview.update_body(is_creating = TRUE)
-/datum/species/genemod/primitive/get_species_description()
+/datum/species/human/genemod/primitive/get_species_description()
return list(
"Genetically modified humanoids believed to be descendants of a now centuries old colony \
ship from the pre-bluespace travel era. Still having at least some human traits, they \
@@ -80,7 +80,7 @@
the icemoon's many fauna."
)
-/datum/species/genemod/primitive/get_species_lore()
+/datum/species/human/genemod/primitive/get_species_lore()
return list(
"The Hearthkin are a culture of disparate Scandinavian groups all sharing a common origin \
as descendents from demihuman genemodders aboard the good ship Stjarndrakkr, or Star Dragon; \
diff --git a/modular_doppler/modular_species/species_types/ramatae/ramatan.dm b/modular_doppler/modular_species/species_types/ramatae/ramatan.dm
index 9f37aa915dd29..adc01d0c3dbfd 100644
--- a/modular_doppler/modular_species/species_types/ramatae/ramatan.dm
+++ b/modular_doppler/modular_species/species_types/ramatae/ramatan.dm
@@ -22,7 +22,6 @@
preview_outfit = /datum/outfit/ramatan_preview
inherent_traits = list(
TRAIT_MUTANT_COLORS,
- TRAIT_TACKLING_TAILED_DEFENDER,
TRAIT_EXPERT_FISHER,
TRAIT_BEAST_EMPATHY,
TRAIT_MUTE,
diff --git a/modular_doppler/reagent_forging/code/forge.dm b/modular_doppler/reagent_forging/code/forge.dm
index 410879207253b..261f1bb623ce3 100644
--- a/modular_doppler/reagent_forging/code/forge.dm
+++ b/modular_doppler/reagent_forging/code/forge.dm
@@ -156,7 +156,7 @@
. += span_notice("
[src] is currently [forge_temperature] degrees hot, going towards [target_temperature] degrees.
")
- if(reagent_forging && (is_species(user, /datum/species/lizard/ashwalker) || is_species(user, /datum/species/genemod/primitive)))
+ if(reagent_forging && (is_species(user, /datum/species/lizard/ashwalker) || is_species(user, /datum/species/human/genemod/primitive)))
. += span_warning("[src] has a fine gold trim, it is ready to imbue chemicals into reagent objects.")
return .
@@ -408,7 +408,7 @@
if(SKILL_LEVEL_LEGENDARY)
if(!forced)
- if(is_species(user, /datum/species/lizard/ashwalker) || is_species(user, /datum/species/genemod/primitive))
+ if(is_species(user, /datum/species/lizard/ashwalker) || is_species(user, /datum/species/human/genemod/primitive))
to_chat(user, span_notice("With just the right heat treating technique, metal could be made to accept reagents..."))
create_reagent_forge()
if(forge_level == FORGE_LEVEL_MASTER)
@@ -573,7 +573,7 @@
return
var/mob/living/carbon/human/human_user = user
- if(!is_species(human_user, /datum/species/lizard/ashwalker) && !is_species(human_user, /datum/species/genemod/primitive))
+ if(!is_species(human_user, /datum/species/lizard/ashwalker) && !is_species(human_user, /datum/species/human/genemod/primitive))
to_chat(user, span_danger("It is impossible for you to imbue!")) //maybe remove (ashwalkers & icecats only) after some time
return
@@ -623,7 +623,7 @@
return
var/mob/living/carbon/human/human_user = user
- if(!is_species(human_user, /datum/species/lizard/ashwalker) && !is_species(human_user, /datum/species/genemod/primitive))
+ if(!is_species(human_user, /datum/species/lizard/ashwalker) && !is_species(human_user, /datum/species/human/genemod/primitive))
to_chat(user, span_danger("It is impossible for you to imbue!")) //maybe remove (ashwalkers & icecats only) after some time
return
diff --git a/tgstation.dme b/tgstation.dme
index be2a2635135e8..2f49d2fc5d06c 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6690,6 +6690,7 @@
#include "modular_doppler\languages\code\language menu\language_holder.dm"
#include "modular_doppler\languages\code\language menu\language_preferences.dm"
#include "modular_doppler\loadout_categories\loadout_checkers.dm"
+#include "modular_doppler\loadout_categories\categories\accessories.dm"
#include "modular_doppler\loadout_categories\categories\backpacks.dm"
#include "modular_doppler\loadout_categories\categories\belts.dm"
#include "modular_doppler\loadout_categories\categories\clothing.dm"
@@ -6917,15 +6918,15 @@
#include "modular_doppler\modular_mood\code\mood_events\dog_wag.dm"
#include "modular_doppler\modular_mood\code\mood_events\hotspring.dm"
#include "modular_doppler\modular_mood\code\mood_events\race_drink.dm"
+#include "modular_doppler\modular_quirks\breather\accessories.dm"
+#include "modular_doppler\modular_quirks\breather\nitrogen_breather\nitrogen_breather.dm"
+#include "modular_doppler\modular_quirks\breather\nitrogen_breather\nitrogen_tanks.dm"
+#include "modular_doppler\modular_quirks\breather\water_breather\water_breather.dm"
#include "modular_doppler\modular_quirks\excitable\excitable.dm"
#include "modular_doppler\modular_quirks\hardened_soles\hardened_soles.dm"
#include "modular_doppler\modular_quirks\left_handed\left_handed.dm"
#include "modular_doppler\modular_quirks\linguist\linguist.dm"
#include "modular_doppler\modular_quirks\night_vision\night_vision.dm"
-#include "modular_doppler\modular_quirks\nitrogen_breather\equipping.dm"
-#include "modular_doppler\modular_quirks\nitrogen_breather\lungs.dm"
-#include "modular_doppler\modular_quirks\nitrogen_breather\nitrogen_tanks.dm"
-#include "modular_doppler\modular_quirks\nitrogen_breather\quirk.dm"
#include "modular_doppler\modular_quirks\overwrites\musician.dm"
#include "modular_doppler\modular_quirks\paycheck_rations\code\quirk.dm"
#include "modular_doppler\modular_quirks\paycheck_rations\code\rationpacks.dm"
@@ -6937,6 +6938,7 @@
#include "modular_doppler\modular_sounds\code\sounds.dm"
#include "modular_doppler\modular_species\_species.dm"
#include "modular_doppler\modular_species\code\bloodsplatter.dm"
+#include "modular_doppler\modular_species\species_types\akula\code\wetsuit.dm"
#include "modular_doppler\modular_species\species_types\android\android.dm"
#include "modular_doppler\modular_species\species_types\android\android_hud.dm"
#include "modular_doppler\modular_species\species_types\android\android_parts.dm"