This tail refactor turned into an organ refactor. Funny how that works. (#67017)

* Fuck you (refactors ur tails)

* Errors

* Wow. Pain.

* Fixes up probably everything

* finish up here

* Fixes hard del maybe

* original owner hard del

* garbage collection runtime

* suck my peen byond

* Mapped tails

* motherfucker.

* motherrfucker. again.

* Whooopppppsie

* yeah bad idea

* Turns out external organs literally just sat in nullspace forever if their parent was deleted, and didnt Remove() themselves, causing harddels.

* So anyways I repathed all organs

* Fixes

* really.

* unit test... test

* unit test-test but it passes linters this time because im a moh-ron

* I've lost track of what im doing at this point

* Hopefully fixes hard del?

* meh

* Update code/datums/dna.dm

* things n stuff

* repath from master pull
This commit is contained in:
Kapu1178
2022-05-30 21:18:34 -07:00
committed by GitHub
parent f837a3e541
commit 6d470992cb
317 changed files with 2090 additions and 2118 deletions
@@ -470,7 +470,7 @@
pixel_y = 4
},
/obj/item/bodypart/chest,
/obj/item/organ/heart,
/obj/item/organ/internal/heart,
/obj/item/multitool,
/turf/open/floor/iron/freezer,
/area/ruin/powered)
@@ -286,7 +286,7 @@
"oL" = (
/obj/structure/bonfire/prelit,
/obj/effect/decal/cleanable/ash,
/obj/item/organ/tail/lizard,
/obj/item/organ/external/tail/lizard,
/obj/effect/decal/cleanable/blood/old,
/obj/structure/stone_tile/slab/cracked,
/turf/open/misc/asteroid/basalt/wasteland,
@@ -343,7 +343,7 @@
/area/ruin/unpowered/elephant_graveyard)
"wp" = (
/obj/item/knife/combat/bone,
/obj/item/organ/tongue,
/obj/item/organ/internal/tongue,
/obj/effect/decal/cleanable/blood/old,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
@@ -402,8 +402,8 @@
/turf/open/misc/asteroid/basalt/lava_land_surface,
/area/lavaland/surface)
"Di" = (
/obj/item/organ/lungs,
/obj/item/organ/liver,
/obj/item/organ/internal/lungs,
/obj/item/organ/internal/liver,
/obj/effect/decal/cleanable/blood/old,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
@@ -422,7 +422,7 @@
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"Eh" = (
/obj/item/organ/brain,
/obj/item/organ/internal/brain,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"EI" = (
@@ -465,9 +465,9 @@
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
"Kj" = (
/obj/item/organ/heart,
/obj/item/organ/eyes,
/obj/item/organ/ears,
/obj/item/organ/internal/heart,
/obj/item/organ/internal/eyes,
/obj/item/organ/internal/ears,
/obj/effect/decal/cleanable/blood/gibs/old,
/turf/open/misc/asteroid/basalt/wasteland,
/area/ruin/unpowered/elephant_graveyard)
@@ -929,9 +929,9 @@
"ja" = (
/obj/effect/turf_decal/bot_white,
/obj/structure/closet/crate/secure/engineering,
/obj/item/organ/cyberimp/arm/toolset,
/obj/item/organ/cyberimp/eyes/hud/medical,
/obj/item/organ/cyberimp/brain/anti_stun,
/obj/item/organ/internal/cyberimp/arm/toolset,
/obj/item/organ/internal/cyberimp/eyes/hud/medical,
/obj/item/organ/internal/cyberimp/brain/anti_stun,
/turf/open/floor/iron/dark/airless,
/area/shuttle/caravan/freighter3)
"jb" = (
@@ -353,7 +353,7 @@
/turf/open/floor/iron,
/area/ruin/space/has_grav/powered/cat_man)
"be" = (
/obj/item/organ/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/white/corner,
/area/ruin/space/has_grav/powered/cat_man)
@@ -444,7 +444,7 @@
"bt" = (
/obj/structure/table/optable,
/obj/effect/mob_spawn/corpse/human/damaged,
/obj/item/organ/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/effect/decal/cleanable/blood/old,
/turf/open/floor/iron/white,
/area/ruin/space/has_grav/powered/cat_man)
@@ -835,12 +835,12 @@
/obj/structure/closet/crate/freezer{
name = "cat ears"
},
/obj/item/organ/ears/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/ears/cat,
/turf/open/floor/iron/freezer,
/area/ruin/space/has_grav/powered/cat_man)
"cv" = (
@@ -889,12 +889,12 @@
/obj/structure/closet/crate/freezer{
name = "cat tails"
},
/obj/item/organ/tail/cat,
/obj/item/organ/tail/cat,
/obj/item/organ/tail/cat,
/obj/item/organ/tail/cat,
/obj/item/organ/tail/cat,
/obj/item/organ/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/cat,
/turf/open/floor/iron/freezer,
/area/ruin/space/has_grav/powered/cat_man)
"jc" = (
+1 -1
View File
@@ -5234,7 +5234,7 @@
pixel_x = 17;
pixel_y = 12
},
/obj/item/organ/cyberimp/arm/toolset{
/obj/item/organ/internal/cyberimp/arm/toolset{
pixel_y = 2;
pixel_x = 6
},
+3 -3
View File
@@ -56,7 +56,7 @@
},
/obj/item/veilrender/honkrender,
/obj/item/clothing/mask/gas/clown_hat,
/obj/item/organ/heart/demon,
/obj/item/organ/internal/heart/demon,
/turf/open/floor/engine/cult{
initial_gas_mix = "n2=23;o2=14;TEMP=2.7"
},
@@ -1414,7 +1414,7 @@
icon_state = "crateopen"
},
/obj/item/paper/fluff/awaymissions/caves/shipment_receipt,
/obj/item/organ/eyes/robotic/thermals,
/obj/item/organ/internal/eyes/robotic/thermals,
/obj/item/gun/energy/laser/captain/scattershot,
/obj/item/slimepotion/fireproof,
/turf/open/misc/asteroid/basalt{
@@ -2118,7 +2118,7 @@
},
/area/awaymission/caves/bmp_asteroid/level_three)
"YG" = (
/obj/item/organ/brain/alien,
/obj/item/organ/internal/brain/alien,
/turf/open/misc/asteroid/basalt{
initial_gas_mix = "n2=23;o2=14;TEMP=2.7"
},
@@ -18778,7 +18778,7 @@
/obj/structure/table/wood/fancy,
/obj/item/book/granter/spell/smoke/lesser,
/obj/item/nullrod,
/obj/item/organ/heart,
/obj/item/organ/internal/heart,
/obj/item/reagent_containers/food/drinks/bottle/holywater,
/turf/open/floor/iron/grimy,
/area/station/service/chapel/office)
@@ -50839,7 +50839,7 @@
/turf/closed/wall,
/area/station/engineering/storage)
"qtu" = (
/obj/item/organ/tail/monkey,
/obj/item/organ/external/tail/monkey,
/obj/effect/decal/cleanable/blood/splatter,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
@@ -67589,7 +67589,7 @@
pixel_y = 4
},
/obj/item/bodypart/chest,
/obj/item/organ/heart,
/obj/item/organ/internal/heart,
/turf/open/misc/asteroid/snow/icemoon,
/area/icemoon/underground/explored)
"vQG" = (
+5 -5
View File
@@ -11496,11 +11496,11 @@
/obj/structure/closet/crate/freezer{
name = "organ storage"
},
/obj/item/organ/tail/cat,
/obj/item/organ/tail/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/ears/cat,
/obj/item/organ/heart,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/heart,
/obj/structure/sign/poster/contraband/random/directional/east,
/turf/open/floor/iron/dark,
/area/station/maintenance/fore)
+1 -1
View File
@@ -13369,7 +13369,7 @@
/obj/item/nullrod{
pixel_x = 4
},
/obj/item/organ/heart,
/obj/item/organ/internal/heart,
/obj/item/soulstone/anybody/chaplain,
/turf/open/floor/cult,
/area/station/service/chapel/office)
+3 -3
View File
@@ -2613,13 +2613,13 @@
/area/station/science)
"XN" = (
/obj/structure/table,
/obj/item/organ/cyberimp/bci{
/obj/item/organ/internal/cyberimp/bci{
pixel_y = 5
},
/obj/item/organ/cyberimp/bci{
/obj/item/organ/internal/cyberimp/bci{
pixel_y = 5
},
/obj/item/organ/cyberimp/bci{
/obj/item/organ/internal/cyberimp/bci{
pixel_y = 5
},
/turf/open/floor/iron/dark,
+2 -2
View File
@@ -17376,8 +17376,8 @@
/obj/item/reagent_containers/medigel/synthflesh,
/obj/item/reagent_containers/medigel/synthflesh,
/obj/item/reagent_containers/medigel/synthflesh,
/obj/item/organ/heart/cybernetic/tier2,
/obj/item/organ/heart/cybernetic/tier2,
/obj/item/organ/internal/heart/cybernetic/tier2,
/obj/item/organ/internal/heart/cybernetic/tier2,
/obj/item/defibrillator,
/turf/open/floor/iron/sepia,
/area/centcom/central_command_areas/holding)
+1 -1
View File
@@ -720,7 +720,7 @@
/obj/item/stack/medical/gauze,
/obj/item/reagent_containers/food/drinks/bottle/whiskey,
/obj/item/reagent_containers/glass/bottle/ethanol,
/obj/item/organ/stomach,
/obj/item/organ/internal/stomach,
/obj/item/clothing/mask/surgical,
/turf/open/floor/iron,
/area/shuttle/escape/luxury)
+2 -2
View File
@@ -198,10 +198,10 @@
/area/shuttle/escape/brig)
"IM" = (
/obj/structure/table/abductor,
/obj/item/organ/heart/gland/access{
/obj/item/organ/internal/heart/gland/access{
pixel_x = 10
},
/obj/item/organ/heart/gland/egg,
/obj/item/organ/internal/heart/gland/egg,
/turf/open/floor/plating/abductor,
/area/shuttle/escape)
"JK" = (
+1 -1
View File
@@ -1199,7 +1199,7 @@
/obj/effect/decal/cleanable/cobweb/cobweb2,
/obj/effect/decal/cleanable/dirt,
/obj/item/trash/syndi_cakes,
/obj/item/organ/stomach,
/obj/item/organ/internal/stomach,
/obj/machinery/firealarm/directional/north,
/obj/machinery/light_switch/directional/east,
/turf/open/floor/iron/showroomfloor,
+8 -11
View File
@@ -40,24 +40,23 @@
#define DNA_UNI_IDENTITY_BLOCKS 7
/// This number needs to equal the total number of DNA blocks
#define DNA_FEATURE_BLOCKS 16
#define DNA_FEATURE_BLOCKS 15
#define DNA_MUTANT_COLOR_BLOCK 1
#define DNA_ETHEREAL_COLOR_BLOCK 2
#define DNA_LIZARD_MARKINGS_BLOCK 3
#define DNA_LIZARD_TAIL_BLOCK 4
#define DNA_SNOUT_BLOCK 5
#define DNA_HORNS_BLOCK 6
#define DNA_FRILLS_BLOCK 7
#define DNA_SPINES_BLOCK 8
#define DNA_HUMAN_TAIL_BLOCK 9
#define DNA_TAIL_BLOCK 4
#define DNA_LIZARD_TAIL_BLOCK 5
#define DNA_SNOUT_BLOCK 6
#define DNA_HORNS_BLOCK 7
#define DNA_FRILLS_BLOCK 8
#define DNA_SPINES_BLOCK 9
#define DNA_EARS_BLOCK 10
#define DNA_MOTH_WINGS_BLOCK 11
#define DNA_MOTH_ANTENNAE_BLOCK 12
#define DNA_MOTH_MARKINGS_BLOCK 13
#define DNA_MUSHROOM_CAPS_BLOCK 14
#define DNA_MONKEY_TAIL_BLOCK 15
#define DNA_POD_HAIR_BLOCK 16
#define DNA_POD_HAIR_BLOCK 15
#define DNA_SEQUENCE_LENGTH 4
#define DNA_MUTATION_BLOCKS 8
@@ -115,7 +114,6 @@
#define ORGAN_SLOT_LEFT_ARM_AUG "l_arm_device" //This one ignores alphabetical order cause the arms should be together
#define ORGAN_SLOT_STOMACH "stomach"
#define ORGAN_SLOT_STOMACH_AID "stomach_aid"
#define ORGAN_SLOT_TAIL "tail"
#define ORGAN_SLOT_THRUSTERS "thrusters"
#define ORGAN_SLOT_TONGUE "tongue"
#define ORGAN_SLOT_VOICE "vocal_cords"
@@ -180,7 +178,6 @@ GLOBAL_LIST_INIT(organ_process_order, list(
ORGAN_SLOT_HEART_AID,
ORGAN_SLOT_BRAIN_ANTIDROP,
ORGAN_SLOT_BRAIN_ANTISTUN,
ORGAN_SLOT_TAIL,
ORGAN_SLOT_PARASITE_EGG,
ORGAN_SLOT_REGENERATIVE_CORE,
ORGAN_SLOT_XENO_PLASMAVESSEL,
@@ -6,9 +6,11 @@
// Organ signals
/// Called on the organ when it is implanted into someone (mob/living/carbon/receiver)
#define COMSIG_ORGAN_IMPLANTED "comsig_organ_implanted"
/// Called when using the *wag emote
#define COMSIG_ORGAN_WAG_TAIL "comsig_wag_tail"
/// Called on the organ when it is removed from someone (mob/living/carbon/old_owner)
#define COMSIG_ORGAN_REMOVED "comsig_organ_removed"
///from base of mob/update_transform()
#define COMSIG_LIVING_POST_UPDATE_TRANSFORM "living_post_update_transform"
+10
View File
@@ -0,0 +1,10 @@
///Uses the parent limb's drawcolor value.
#define ORGAN_COLOR_INHERIT (1<<0)
///Uses /organ/external/proc/override_color()'s return value
#define ORGAN_COLOR_OVERRIDE (1<<1)
///Uses the parent's haircolor
#define ORGAN_COLOR_HAIR (1<<2)
///Tail wagging
#define WAG_ABLE (1<<0)
#define WAG_WAGGING (1<<1)
+4
View File
@@ -201,6 +201,10 @@ GLOBAL_LIST_INIT(turfs_openspace, typecacheof(list(
#define isorgan(A) (istype(A, /obj/item/organ))
#define isinternalorgan(A) (istype(A, /obj/item/organ/internal))
#define isexternalorgan(A) (istype(A, /obj/item/organ/external))
#define isclothing(A) (istype(A, /obj/item/clothing))
#define ispickedupmob(A) (istype(A, /obj/item/clothing/head/mob_holder)) // Checks if clothing item is actually a held mob
+2 -2
View File
@@ -416,7 +416,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
// example. Through years of training/abuse, their livers have taken
// a liking to those substances. Steal a sec officer's liver, eat donuts good.
// These traits are applied to /obj/item/organ/liver
// These traits are applied to /obj/item/organ/internal/liver
#define TRAIT_LAW_ENFORCEMENT_METABOLISM "law_enforcement_metabolism"
#define TRAIT_CULINARY_METABOLISM "culinary_metabolism"
#define TRAIT_COMEDY_METABOLISM "comedy_metabolism"
@@ -810,7 +810,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
/**
* Trait granted by [/mob/living/carbon/Initialize] and
* granted/removed by [/obj/item/organ/tongue]
* granted/removed by [/obj/item/organ/internal/tongue]
* Used for ensuring that carbons without tongues cannot taste anything
* so it is added in Initialize, and then removed when a tongue is inserted
* and readded when a tongue is removed.
+3 -5
View File
@@ -15,10 +15,9 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/socks, GLOB.socks_list)
//bodypart accessories (blizzard intensifies)
init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/human, GLOB.animated_tails_list_human)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails, GLOB.tails_list, add_blank = TRUE)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE)
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/horns,GLOB.horns_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/ears, GLOB.ears_list)
@@ -32,7 +31,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_wings, GLOB.moth_wings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_antennae, GLOB.moth_antennae_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/moth_markings, GLOB.moth_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/monkey, GLOB.tails_list_monkey)
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
//Species
+3 -3
View File
@@ -23,7 +23,7 @@
victim.Stun(100)
victim.adjust_timed_status_effect(30 SECONDS, /datum/status_effect/speech/stutter)
victim.set_timed_status_effect(1000 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE)
var/obj/item/organ/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(10, 15)
to_chat(victim, "<font color='red' size='8'>HONK</font>")
var/obj/item/clothing/shoes/victim_shoes = victim.get_item_by_slot(ITEM_SLOT_FEET)
@@ -35,13 +35,13 @@
victim.Paralyze(20)
victim.Stun(50)
victim.set_timed_status_effect(500 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE)
var/obj/item/organ/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(7, 10)
to_chat(victim, "<font color='red' size='5'>HONK</font>")
for(var/mob/living/carbon/victim in lightly_honked)
victim.Knockdown(20)
victim.set_timed_status_effect(200 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE)
var/obj/item/organ/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = victim.getorganslot(ORGAN_SLOT_EARS)
ears?.adjustEarDamage(4, 5)
to_chat(victim, "<font color='red' size='2'>HONK</font>")
+28 -6
View File
@@ -59,10 +59,12 @@
return pick(GLOB.backpacklist)
/proc/random_features()
if(!GLOB.tails_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/, GLOB.tails_list, add_blank = TRUE)
if(!GLOB.tails_list_human.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human, add_blank = TRUE)
if(!GLOB.tails_list_lizard.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard, add_blank = TRUE)
if(!GLOB.snouts_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/snouts, GLOB.snouts_list)
if(!GLOB.horns_list.len)
@@ -88,12 +90,12 @@
if(!GLOB.pod_hair_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/pod_hair, GLOB.pod_hair_list)
//For now we will always return none for tail_human and ears.
//For now we will always return none for tail_human and ears. | "For now" he says.
return(list(
"mcolor" = "#[pick("7F","FF")][pick("7F","FF")][pick("7F","FF")]",
"ethcolor" = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)],
"tail_lizard" = pick(GLOB.tails_list_lizard),
"tail_human" = "None",
"tail_cat" = "None",
"tail_lizard" = "Smooth",
"wings" = "None",
"snout" = pick(GLOB.snouts_list),
"horns" = pick(GLOB.horns_list),
@@ -786,9 +788,29 @@ GLOBAL_LIST_EMPTY(species_list)
return "left foot"
if(BODY_ZONE_PRECISE_R_FOOT)
return "right foot"
if(BODY_ZONE_PRECISE_GROIN)
return "groin"
else
return zone
///Takes a zone and returns it's "parent" zone, if it has one.
/proc/deprecise_zone(precise_zone)
switch(precise_zone)
if(BODY_ZONE_PRECISE_GROIN)
return BODY_ZONE_CHEST
if(BODY_ZONE_PRECISE_EYES)
return BODY_ZONE_HEAD
if(BODY_ZONE_PRECISE_R_HAND)
return BODY_ZONE_R_ARM
if(BODY_ZONE_PRECISE_L_HAND)
return BODY_ZONE_L_ARM
if(BODY_ZONE_PRECISE_L_FOOT)
return BODY_ZONE_L_LEG
if(BODY_ZONE_PRECISE_R_FOOT)
return BODY_ZONE_R_LEG
else
return precise_zone
///Returns the direction that the initiator and the target are facing
/proc/check_target_facings(mob/living/initiator, mob/living/target)
/*This can be used to add additional effects on interactions between mobs depending on how the mobs are facing each other, such as adding a crit damage to blows to the back of a guy's head.
@@ -817,7 +839,7 @@ GLOBAL_LIST_EMPTY(species_list)
mob_occupant = head.brainmob
else if(isorgan(occupant))
var/obj/item/organ/brain/brain = occupant
var/obj/item/organ/internal/brain/brain = occupant
mob_occupant = brain.brainmob
return mob_occupant
+3 -5
View File
@@ -20,8 +20,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
GLOBAL_LIST_EMPTY(socks_list) //stores /datum/sprite_accessory/socks indexed by name
//Lizard Bits (all datum lists indexed by name)
GLOBAL_LIST_EMPTY(body_markings_list)
GLOBAL_LIST_EMPTY(tails_list_lizard)
GLOBAL_LIST_EMPTY(animated_tails_list_lizard)
GLOBAL_LIST_EMPTY(snouts_list)
GLOBAL_LIST_EMPTY(horns_list)
GLOBAL_LIST_EMPTY(frills_list)
@@ -30,8 +28,9 @@ GLOBAL_LIST_EMPTY(legs_list)
GLOBAL_LIST_EMPTY(animated_spines_list)
//Mutant Human bits
GLOBAL_LIST_EMPTY(tails_list_human)
GLOBAL_LIST_EMPTY(animated_tails_list_human)
GLOBAL_LIST_EMPTY(tails_list)
GLOBAL_LIST_EMPTY(tails_list_human) //Only exists for preference choices. Use "tails_list" otherwise.
GLOBAL_LIST_EMPTY(tails_list_lizard) //See above!
GLOBAL_LIST_EMPTY(ears_list)
GLOBAL_LIST_EMPTY(wings_list)
GLOBAL_LIST_EMPTY(wings_open_list)
@@ -39,7 +38,6 @@ GLOBAL_LIST_EMPTY(moth_wings_list)
GLOBAL_LIST_EMPTY(moth_antennae_list)
GLOBAL_LIST_EMPTY(moth_markings_list)
GLOBAL_LIST_EMPTY(caps_list)
GLOBAL_LIST_EMPTY(tails_list_monkey)
GLOBAL_LIST_EMPTY(pod_hair_list)
GLOBAL_LIST_INIT(color_list_ethereal, list(
+4 -4
View File
@@ -172,7 +172,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/clothing/head/lizard,
/obj/item/clothing/shoes/cowboy/lizard,
/obj/item/food/kebab/tail,
/obj/item/organ/tail/lizard,
/obj/item/organ/external/tail/lizard,
/obj/item/reagent_containers/food/drinks/bottle/lizardwine,
/obj/item/toy/plush/lizard_plushie,
)),
@@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/effect/decal/remains/human,
/obj/item/clothing/suit/armor/bone,
/obj/item/food/meat/slab/human/mutant/skeleton,
/obj/item/organ/tongue/bone,
/obj/item/organ/internal/tongue/bone,
/obj/item/stack/sheet/bone,
)),
@@ -344,8 +344,8 @@ GLOBAL_LIST_INIT(phobia_objs, list(
/obj/item/gun/energy/alien,
/obj/item/hemostat/alien,
/obj/item/melee/baton/abductor,
/obj/item/organ/body_egg/alien_embryo,
/obj/item/organ/heart/gland,
/obj/item/organ/internal/body_egg/alien_embryo,
/obj/item/organ/internal/heart/gland,
/obj/item/radio/headset/abductor,
/obj/item/retractor/alien,
/obj/item/scalpel/alien,
+1 -1
View File
@@ -8,7 +8,7 @@
var/desc = "A trauma caused by brain damage, which causes issues to the patient."
var/scan_desc = "generic brain trauma" //description when detected by a health scanner
var/mob/living/carbon/owner //the poor bastard
var/obj/item/organ/brain/brain //the poor bastard's brain
var/obj/item/organ/internal/brain/brain //the poor bastard's brain
var/gain_text = "<span class='notice'>You feel traumatized.</span>"
var/lose_text = "<span class='notice'>You no longer feel traumatized.</span>"
var/can_gain = TRUE
@@ -182,7 +182,7 @@
var/codeword
var/objective
/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/brain/B, _permanent, _codeword, _objective)
/datum/brain_trauma/severe/split_personality/brainwashing/New(obj/item/organ/internal/brain/B, _permanent, _codeword, _objective)
..()
if(_codeword)
codeword = _codeword
+10 -10
View File
@@ -143,9 +143,9 @@
/datum/crafting_recipe/tailclub
name = "Tail Club"
result = /obj/item/tailclub
reqs = list(/obj/item/organ/tail/lizard = 1,
reqs = list(/obj/item/organ/external/tail/lizard = 1,
/obj/item/stack/sheet/iron = 1)
blacklist = list(/obj/item/organ/tail/lizard/fake)
blacklist = list(/obj/item/organ/external/tail/lizard/fake)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -153,9 +153,9 @@
/datum/crafting_recipe/tailwhip
name = "Liz O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip
reqs = list(/obj/item/organ/tail/lizard = 1,
reqs = list(/obj/item/organ/external/tail/lizard = 1,
/obj/item/stack/cable_coil = 1)
blacklist = list(/obj/item/organ/tail/lizard/fake)
blacklist = list(/obj/item/organ/external/tail/lizard/fake)
time = 40
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
@@ -163,7 +163,7 @@
/datum/crafting_recipe/catwhip
name = "Cat O' Nine Tails"
result = /obj/item/melee/chainofcommand/tailwhip/kitty
reqs = list(/obj/item/organ/tail/cat = 1,
reqs = list(/obj/item/organ/external/tail/cat = 1,
/obj/item/stack/cable_coil = 1)
time = 40
category = CAT_WEAPONRY
@@ -635,7 +635,7 @@
name = "Lizard Cloche Hat"
result = /obj/item/clothing/head/lizard
time = 10
reqs = list(/obj/item/organ/tail/lizard = 1)
reqs = list(/obj/item/organ/external/tail/lizard = 1)
category = CAT_CLOTHING
/datum/crafting_recipe/lizardhat_alternate
@@ -649,8 +649,8 @@
name = "Kitty Ears"
result = /obj/item/clothing/head/kitty/genuine
time = 10
reqs = list(/obj/item/organ/tail/cat = 1,
/obj/item/organ/ears/cat = 1)
reqs = list(/obj/item/organ/external/tail/cat = 1,
/obj/item/organ/internal/ears/cat = 1)
category = CAT_CLOTHING
@@ -760,7 +760,7 @@
/datum/crafting_recipe/flashlight_eyes
name = "Flashlight Eyes"
result = /obj/item/organ/eyes/robotic/flashlight
result = /obj/item/organ/internal/eyes/robotic/flashlight
time = 10
reqs = list(
/obj/item/flashlight = 2,
@@ -1288,7 +1288,7 @@
reqs = list(/obj/item/stack/cable_coil = 5,
/obj/item/stack/rods = 2,
/obj/item/stack/sheet/glass = 1,
/obj/item/organ/heart/ethereal = 1,
/obj/item/organ/internal/heart/ethereal = 1,
)
category = CAT_MISC
+1 -1
View File
@@ -160,7 +160,7 @@
// For carbonss we also want to clear out the stomach of any holywater
if(iscarbon(target))
var/mob/living/carbon/carbon_target = target
var/obj/item/organ/stomach/belly = carbon_target.getorganslot(ORGAN_SLOT_STOMACH)
var/obj/item/organ/internal/stomach/belly = carbon_target.getorganslot(ORGAN_SLOT_STOMACH)
if(belly)
holy_to_unholy += belly.reagents.get_reagent_amount(/datum/reagent/water/holywater)
belly.reagents.del_reagent(/datum/reagent/water/holywater)
+5 -5
View File
@@ -1,7 +1,7 @@
/datum/component/manual_blinking
dupe_mode = COMPONENT_DUPE_UNIQUE
var/obj/item/organ/eyes/E
var/obj/item/organ/internal/eyes/E
var/warn_grace = FALSE
var/warn_dying = FALSE
var/last_blink
@@ -69,18 +69,18 @@
/datum/component/manual_blinking/proc/check_added_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
var/obj/item/organ/eyes/new_eyes = O
var/obj/item/organ/internal/eyes/new_eyes = O
if(istype(new_eyes,/obj/item/organ/eyes))
if(istype(new_eyes,/obj/item/organ/internal/eyes))
E = new_eyes
START_PROCESSING(SSdcs, src)
/datum/component/manual_blinking/proc/check_removed_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
var/obj/item/organ/eyes/bye_beyes = O // oh come on, that's pretty good
var/obj/item/organ/internal/eyes/bye_beyes = O // oh come on, that's pretty good
if(istype(bye_beyes, /obj/item/organ/eyes))
if(istype(bye_beyes, /obj/item/organ/internal/eyes))
E = null
STOP_PROCESSING(SSdcs, src)
+5 -5
View File
@@ -1,7 +1,7 @@
/datum/component/manual_breathing
dupe_mode = COMPONENT_DUPE_UNIQUE
var/obj/item/organ/lungs/L
var/obj/item/organ/internal/lungs/L
var/warn_grace = FALSE
var/warn_dying = FALSE
var/last_breath
@@ -71,18 +71,18 @@
/datum/component/manual_breathing/proc/check_added_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
var/obj/item/organ/eyes/new_lungs = O
var/obj/item/organ/internal/eyes/new_lungs = O
if(istype(new_lungs,/obj/item/organ/lungs))
if(istype(new_lungs,/obj/item/organ/internal/lungs))
L = new_lungs
START_PROCESSING(SSdcs, src)
/datum/component/manual_breathing/proc/check_removed_organ(mob/who_cares, obj/item/organ/O)
SIGNAL_HANDLER
var/obj/item/organ/lungs/old_lungs = O
var/obj/item/organ/internal/lungs/old_lungs = O
if(istype(old_lungs, /obj/item/organ/lungs))
if(istype(old_lungs, /obj/item/organ/internal/lungs))
L = null
STOP_PROCESSING(SSdcs, src)
+2 -2
View File
@@ -169,7 +169,7 @@
var/mob/living/carbon/human/lich = new(parent_turf)
ADD_TRAIT(lich, TRAIT_NO_SOUL, LICH_TRAIT)
var/obj/item/organ/brain/new_lich_brain = lich.getorganslot(ORGAN_SLOT_BRAIN)
var/obj/item/organ/internal/brain/new_lich_brain = lich.getorganslot(ORGAN_SLOT_BRAIN)
if(new_lich_brain) // Prevent MMI cheese
new_lich_brain.organ_flags &= ~ORGAN_VITAL
new_lich_brain.decoy_override = TRUE
@@ -201,7 +201,7 @@
var/mob/living/carbon/carbon_body = corpse
for(var/obj/item/organ/to_drop as anything in carbon_body.internal_organs)
// Skip the brain - it can disappear, we don't need it anymore
if(istype(to_drop, /obj/item/organ/brain))
if(istype(to_drop, /obj/item/organ/internal/brain))
continue
// For the rest, drop all the organs onto the floor (for style)
+1 -1
View File
@@ -46,7 +46,7 @@
else if(isstructure(parent))
RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/use_squeak)
if(istype(parent, /obj/item/organ/liver))
if(istype(parent, /obj/item/organ/internal/liver))
// Liver squeaking is depending on them functioning like a clown's liver
RegisterSignal(parent, SIGNAL_REMOVETRAIT(TRAIT_COMEDY_METABOLISM), .proc/on_comedy_metabolism_removal)
@@ -110,7 +110,7 @@
)
return
var/obj/item/organ/tongue/licking_tongue = user.getorganslot(ORGAN_SLOT_TONGUE)
var/obj/item/organ/internal/tongue/licking_tongue = user.getorganslot(ORGAN_SLOT_TONGUE)
if(licking_tongue)
dust_mob(source, user,
span_danger("As [user] hesitantly leans in and licks [atom_source] everything goes silent before [user.p_their()] body starts to glow and burst into flames before flashing to ash!"),
+3 -2
View File
@@ -288,9 +288,10 @@
defense_mod += 2
if(islizard(T))
if(!T.getorganslot(ORGAN_SLOT_TAIL)) // lizards without tails are off-balance
var/obj/item/organ/external/tail/el_tail = T.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL)
if(!el_tail) // lizards without tails are off-balance
defense_mod -= 1
else if(T.dna.species.is_wagging_tail()) // lizard tail wagging is robust and can swat away assailants!
else if(el_tail.wag_flags & WAG_WAGGING) // lizard tail wagging is robust and can swat away assailants!
defense_mod += 1
// OF-FENSE
@@ -37,7 +37,7 @@
if(!.)
return
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
if(!ears)
return //cutting off your ears to cure the deafness: the ultimate own
switch(A.stage)
@@ -90,12 +90,12 @@
var/mob/living/carbon/M = A.affected_mob
switch(A.stage)
if(4, 5)
var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
if(ears)
ears.adjustEarDamage(-4, -4)
M.adjust_blindness(-2)
M.adjust_blurriness(-2)
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(!eyes) // only dealing with eye stuff from here on out
return
eyes.applyOrganDamage(-2)
@@ -38,7 +38,7 @@
if(!.)
return
var/mob/living/carbon/M = A.affected_mob
var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
switch(A.stage)
if(1, 2)
+1 -1
View File
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 7.5 //higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/brain)
required_organs = list(/obj/item/organ/internal/brain)
severity = DISEASE_SEVERITY_HARMFUL
+8 -8
View File
@@ -36,9 +36,9 @@
if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 100)
if(4)
var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.internal_organs
var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in affected_mob.internal_organs
if(!eyes && DT_PROB(2.5, delta_time))
var/obj/item/organ/eyes/snail/new_eyes = new()
var/obj/item/organ/internal/eyes/snail/new_eyes = new()
new_eyes.Insert(affected_mob, drop_if_replaced = TRUE)
affected_mob.visible_message(span_warning("[affected_mob]'s eyes fall out, with snail eyes taking its place!"), \
span_userdanger("You scream in pain as your eyes are pushed out by your new snail eyes!"))
@@ -56,9 +56,9 @@
affected_mob.emote("scream")
return
var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.internal_organs
var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in affected_mob.internal_organs
if(!tongue && DT_PROB(2.5, delta_time))
var/obj/item/organ/tongue/snail/new_tongue = new()
var/obj/item/organ/internal/tongue/snail/new_tongue = new()
new_tongue.Insert(affected_mob)
to_chat(affected_mob, span_userdanger("You feel your speech slow down..."))
return
@@ -83,13 +83,13 @@
. = ..()
if(affected_mob && !is_species(affected_mob, /datum/species/snail)) //undo all the snail fuckening
var/mob/living/carbon/human/H = affected_mob
var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in H.internal_organs
var/obj/item/organ/internal/tongue/tongue = locate(/obj/item/organ/internal/tongue/snail) in H.internal_organs
if(tongue)
var/obj/item/organ/tongue/new_tongue = new H.dna.species.mutanttongue ()
var/obj/item/organ/internal/tongue/new_tongue = new H.dna.species.mutanttongue ()
new_tongue.Insert(H)
var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in H.internal_organs
var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes/snail) in H.internal_organs
if(eyes)
var/obj/item/organ/eyes/new_eyes = new H.dna.species.mutanteyes ()
var/obj/item/organ/internal/eyes/new_eyes = new H.dna.species.mutanteyes ()
new_eyes.Insert(H)
var/obj/item/storage/backpack/bag = H.get_item_by_slot(ITEM_SLOT_BACK)
if(istype(bag, /obj/item/storage/backpack/snail))
+1 -1
View File
@@ -12,7 +12,7 @@
disease_flags = CAN_CARRY|CAN_RESIST
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
visibility_flags = HIDDEN_PANDEMIC
required_organs = list(/obj/item/organ/heart)
required_organs = list(/obj/item/organ/internal/heart)
bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
var/sound = FALSE
+2 -2
View File
@@ -11,7 +11,7 @@
severity = DISEASE_SEVERITY_HARMFUL
disease_flags = CAN_CARRY|CAN_RESIST
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
required_organs = list(/obj/item/organ/liver)
required_organs = list(/obj/item/organ/internal/liver)
bypasses_immunity = TRUE
@@ -20,7 +20,7 @@
if(!.)
return
var/obj/item/organ/liver/affected_liver = affected_mob.getorgan(/obj/item/organ/liver)
var/obj/item/organ/internal/liver/affected_liver = affected_mob.getorgan(/obj/item/organ/internal/liver)
if(!affected_liver)
affected_mob.visible_message(span_notice("<B>[affected_mob]'s liver is covered in tiny larva! They quickly shrivel and die after being exposed to the open air.</B>"))
cure()
+1 -1
View File
@@ -9,7 +9,7 @@
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 2.5 //like hell are you getting out of hell
desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
required_organs = list(/obj/item/organ/lungs)
required_organs = list(/obj/item/organ/internal/lungs)
severity = DISEASE_SEVERITY_BIOHAZARD
bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
+9 -17
View File
@@ -195,6 +195,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_ETHEREAL_COLOR_BLOCK] = sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE)
if(features["body_markings"])
L[DNA_LIZARD_MARKINGS_BLOCK] = construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len)
if(features["tail_cat"])
L[DNA_TAIL_BLOCK] = construct_block(GLOB.tails_list_human.Find(features["tail_cat"]), GLOB.tails_list_human.len)
if(features["tail_lizard"])
L[DNA_LIZARD_TAIL_BLOCK] = construct_block(GLOB.tails_list_lizard.Find(features["tail_lizard"]), GLOB.tails_list_lizard.len)
if(features["snout"])
@@ -205,8 +207,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_FRILLS_BLOCK] = construct_block(GLOB.frills_list.Find(features["frills"]), GLOB.frills_list.len)
if(features["spines"])
L[DNA_SPINES_BLOCK] = construct_block(GLOB.spines_list.Find(features["spines"]), GLOB.spines_list.len)
if(features["tail_human"])
L[DNA_HUMAN_TAIL_BLOCK] = construct_block(GLOB.tails_list_human.Find(features["tail_human"]), GLOB.tails_list_human.len)
if(features["ears"])
L[DNA_EARS_BLOCK] = construct_block(GLOB.ears_list.Find(features["ears"]), GLOB.ears_list.len)
if(features["moth_wings"] != "Burnt Off")
@@ -217,8 +217,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
L[DNA_MOTH_MARKINGS_BLOCK] = construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len)
if(features["caps"])
L[DNA_MUSHROOM_CAPS_BLOCK] = construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len)
if(features["tail_monkey"])
L[DNA_MONKEY_TAIL_BLOCK] = construct_block(GLOB.tails_list_monkey.Find(features["tail_monkey"]), GLOB.tails_list_monkey.len)
if(features["pod_hair"])
L[DNA_POD_HAIR_BLOCK] = construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len)
@@ -331,8 +329,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, sanitize_hexcolor(features["ethcolor"], include_crunch = FALSE))
if(DNA_LIZARD_MARKINGS_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.body_markings_list.Find(features["body_markings"]), GLOB.body_markings_list.len))
if(DNA_LIZARD_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_lizard.Find(features["tail_lizard"]), GLOB.tails_list_lizard.len))
if(DNA_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list.Find(features["tail_lizard"]), GLOB.tails_list.len))
if(DNA_SNOUT_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.snouts_list.Find(features["snout"]), GLOB.snouts_list.len))
if(DNA_HORNS_BLOCK)
@@ -341,8 +339,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, construct_block(GLOB.frills_list.Find(features["frills"]), GLOB.frills_list.len))
if(DNA_SPINES_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.spines_list.Find(features["spines"]), GLOB.spines_list.len))
if(DNA_HUMAN_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_human.Find(features["tail_human"]), GLOB.tails_list_human.len))
if(DNA_EARS_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.ears_list.Find(features["ears"]), GLOB.ears_list.len))
if(DNA_MOTH_WINGS_BLOCK)
@@ -353,8 +349,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
set_uni_feature_block(blocknumber, construct_block(GLOB.moth_markings_list.Find(features["moth_markings"]), GLOB.moth_markings_list.len))
if(DNA_MUSHROOM_CAPS_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.caps_list.Find(features["caps"]), GLOB.caps_list.len))
if(DNA_MONKEY_TAIL_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.tails_list_monkey.Find(features["tail_monkey"]), GLOB.tails_list_monkey.len))
if(DNA_POD_HAIR_BLOCK)
set_uni_feature_block(blocknumber, construct_block(GLOB.pod_hair_list.Find(features["pod_hair"]), GLOB.pod_hair_list.len))
@@ -578,8 +572,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.features["ethcolor"] = sanitize_hexcolor(get_uni_feature_block(features, DNA_ETHEREAL_COLOR_BLOCK))
if(dna.features["body_markings"])
dna.features["body_markings"] = GLOB.body_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_MARKINGS_BLOCK), GLOB.body_markings_list.len)]
if(dna.features["tail_lizard"])
dna.features["tail_lizard"] = GLOB.tails_list_lizard[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_TAIL_BLOCK), GLOB.tails_list_lizard.len)]
if(dna.features["snout"])
dna.features["snout"] = GLOB.snouts_list[deconstruct_block(get_uni_feature_block(features, DNA_SNOUT_BLOCK), GLOB.snouts_list.len)]
if(dna.features["horns"])
@@ -588,8 +580,10 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.features["frills"] = GLOB.frills_list[deconstruct_block(get_uni_feature_block(features, DNA_FRILLS_BLOCK), GLOB.frills_list.len)]
if(dna.features["spines"])
dna.features["spines"] = GLOB.spines_list[deconstruct_block(get_uni_feature_block(features, DNA_SPINES_BLOCK), GLOB.spines_list.len)]
if(dna.features["tail_human"])
dna.features["tail_human"] = GLOB.tails_list_human[deconstruct_block(get_uni_feature_block(features, DNA_HUMAN_TAIL_BLOCK), GLOB.tails_list_human.len)]
if(dna.features["tail_cat"])
dna.features["tail_cat"] = GLOB.tails_list_human[deconstruct_block(get_uni_feature_block(features, DNA_TAIL_BLOCK), GLOB.tails_list_human.len)]
if(dna.features["tail_lizard"])
dna.features["tail_cat"] = GLOB.tails_list_lizard[deconstruct_block(get_uni_feature_block(features, DNA_LIZARD_TAIL_BLOCK), GLOB.tails_list_lizard.len)]
if(dna.features["ears"])
dna.features["ears"] = GLOB.ears_list[deconstruct_block(get_uni_feature_block(features, DNA_EARS_BLOCK), GLOB.ears_list.len)]
if(dna.features["moth_wings"])
@@ -604,8 +598,6 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
dna.features["moth_markings"] = GLOB.moth_markings_list[deconstruct_block(get_uni_feature_block(features, DNA_MOTH_MARKINGS_BLOCK), GLOB.moth_markings_list.len)]
if(dna.features["caps"])
dna.features["caps"] = GLOB.caps_list[deconstruct_block(get_uni_feature_block(features, DNA_MUSHROOM_CAPS_BLOCK), GLOB.caps_list.len)]
if(dna.features["tail_monkey"])
dna.features["tail_monkey"] = GLOB.tails_list_monkey[deconstruct_block(get_uni_feature_block(features, DNA_MONKEY_TAIL_BLOCK), GLOB.tails_list_monkey.len)]
if(dna.features["pod_hair"])
dna.features["pod_hair"] = GLOB.pod_hair_list[deconstruct_block(get_uni_feature_block(features, DNA_POD_HAIR_BLOCK), GLOB.pod_hair_list.len)]
@@ -869,7 +861,7 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block())
/mob/living/carbon/human/proc/something_horrible_mindmelt()
if(!is_blind())
var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes) in internal_organs
var/obj/item/organ/internal/eyes/eyes = locate(/obj/item/organ/internal/eyes) in internal_organs
if(!eyes)
return
eyes.Remove(src)
+1 -1
View File
@@ -28,7 +28,7 @@
/datum/element/earhealing/process(delta_time)
for(var/i in user_by_item)
var/mob/living/carbon/user = user_by_item[i]
var/obj/item/organ/ears/ears = user.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = user.getorganslot(ORGAN_SLOT_EARS)
if(!ears || HAS_TRAIT_NOT_FROM(user, TRAIT_DEAF, EAR_DAMAGE))
continue
ears.deaf = max(ears.deaf - 0.25 * delta_time, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged
+1 -1
View File
@@ -80,7 +80,7 @@
log_combat(user, target, "attacked", "[item.name]", "(Combat mode: [user.combat_mode ? "On" : "Off"])")
var/obj/item/organ/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = target.getorganslot(ORGAN_SLOT_EYES)
if (!eyes)
return
+1 -1
View File
@@ -29,7 +29,7 @@
var/selected_zone = user.zone_selected
var/obj/item/bodypart/r_leg = target.get_bodypart(BODY_ZONE_R_LEG)
var/obj/item/bodypart/l_leg = target.get_bodypart(BODY_ZONE_L_LEG)
var/obj/item/organ/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN)
var/obj/item/organ/internal/brain/target_brain = target.getorganslot(ORGAN_SLOT_BRAIN)
if(!ishuman(target))
return
@@ -92,10 +92,9 @@
timeout = 2 MINUTES
/datum/mood_event/table/add_effects()
if(isfelinid(owner))
if(isfelinid(owner)) //Holy snowflake batman!
var/mob/living/carbon/human/H = owner
H.dna.species.start_wagging_tail(H)
addtimer(CALLBACK(H.dna.species, /datum/species.proc/stop_wagging_tail, H), 3 SECONDS)
SEND_SIGNAL(H, COMSIG_ORGAN_WAG_TAIL, TRUE, 3 SECONDS)
description = "They want to play on the table!"
mood_change = 2
+2 -2
View File
@@ -280,9 +280,9 @@
var/mob/living/carbon/C = user
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
return
var/obj/item/organ/tongue/tongue
var/obj/item/organ/internal/tongue/tongue
for(var/org in C.internal_organs)
if(istype(org, /obj/item/organ/tongue))
if(istype(org, /obj/item/organ/internal/tongue))
tongue = org
break
+3 -3
View File
@@ -459,7 +459,7 @@
explosion(owner, light_impact_range = 2, adminlog = TRUE, explosion_cause = src)
for(var/mob/living/carbon/human/H in view(2,owner))
var/obj/item/organ/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = H.getorganslot(ORGAN_SLOT_EYES)
if(eyes)
to_chat(H, span_userdanger("You are blinded by a shower of blood!"))
else
@@ -484,7 +484,7 @@
. = ..()
if(.)//cant add
return TRUE
var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN)
var/obj/item/organ/internal/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN)
if(brain)
brain.zone = BODY_ZONE_CHEST
@@ -502,7 +502,7 @@
. = ..()
if(.)
return TRUE
var/obj/item/organ/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN)
var/obj/item/organ/internal/brain/brain = owner.getorganslot(ORGAN_SLOT_BRAIN)
if(brain) //so this doesn't instantly kill you. we could delete the brain, but it lets people cure brain issues they /really/ shouldn't be
brain.zone = BODY_ZONE_HEAD
UnregisterSignal(owner, COMSIG_CARBON_ATTACH_LIMB)
@@ -107,8 +107,8 @@
if(special) //aheals
return
if(istype(new_organ, /obj/item/organ/eyes))
var/obj/item/organ/eyes/new_eyes = new_organ
if(istype(new_organ, /obj/item/organ/internal/eyes))
var/obj/item/organ/internal/eyes/new_eyes = new_organ
if(new_eyes.tint < TINT_BLIND) //unless you added unworking eyes (flashlight eyes), this is removing burden
update_burden(FALSE)
return
@@ -121,8 +121,8 @@
if(special) //aheals
return
if(istype(old_organ, /obj/item/organ/eyes))
var/obj/item/organ/eyes/old_eyes = old_organ
if(istype(old_organ, /obj/item/organ/internal/eyes))
var/obj/item/organ/internal/eyes/old_eyes = old_organ
if(old_eyes.tint < TINT_BLIND) //unless you were already blinded by them (flashlight eyes), this is adding burden!
update_burden(TRUE)
+1 -1
View File
@@ -109,7 +109,7 @@
return
var/mob/living/carbon/possible_throwable = user.pulling
if(!possible_throwable.getorganslot(ORGAN_SLOT_TAIL))
if(!possible_throwable.getorganslot(ORGAN_SLOT_EXTERNAL_TAIL))
return
if(ishuman(possible_throwable))
+1 -1
View File
@@ -166,7 +166,7 @@
/datum/quirk/night_vision/proc/refresh_quirk_holder_eyes()
var/mob/living/carbon/human/human_quirk_holder = quirk_holder
var/obj/item/organ/eyes/eyes = human_quirk_holder.getorgan(/obj/item/organ/eyes)
var/obj/item/organ/internal/eyes/eyes = human_quirk_holder.getorgan(/obj/item/organ/internal/eyes)
if(!eyes || eyes.lighting_alpha)
return
// We've either added or removed TRAIT_NIGHT_VISION before calling this proc. Just refresh the eyes.
+1 -1
View File
@@ -724,7 +724,7 @@
var/brand = initial(drug_container_type.name)
quirk_holder.mind.add_memory(MEMORY_QUIRK_DRUG, list(DETAIL_FAV_BRAND = brand), memory_flags = MEMORY_FLAG_NOLOCATION | MEMORY_FLAG_NOPERSISTENCE, story_value = STORY_VALUE_SHIT)
// smoker lungs have 25% less health and healing
var/obj/item/organ/lungs/smoker_lungs = quirk_holder.getorganslot(ORGAN_SLOT_LUNGS)
var/obj/item/organ/internal/lungs/smoker_lungs = quirk_holder.getorganslot(ORGAN_SLOT_LUNGS)
if (smoker_lungs && !(smoker_lungs.organ_flags & ORGAN_SYNTHETIC)) // robotic lungs aren't affected
smoker_lungs.maxHealth = smoker_lungs.maxHealth * 0.75
smoker_lungs.healing_factor = smoker_lungs.healing_factor * 0.75
+4 -4
View File
@@ -207,7 +207,7 @@
// We set override to TRUE as link to holder will be called whenever the preference is applied, given this quirk exists on the mob
RegisterSignal(human_holder, COMSIG_CARBON_LOSE_ORGAN, .proc/check_eye_removal, override=TRUE)
var/obj/item/organ/eyes/eyes_of_the_holder = quirk_holder.getorgan(/obj/item/organ/eyes)
var/obj/item/organ/internal/eyes/eyes_of_the_holder = quirk_holder.getorgan(/obj/item/organ/internal/eyes)
if(!eyes_of_the_holder)
return
@@ -215,7 +215,7 @@
eyes_of_the_holder.old_eye_color_right = color
eyes_of_the_holder.refresh()
/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/eyes/removed)
/datum/quirk/heterochromatic/proc/check_eye_removal(datum/source, obj/item/organ/internal/eyes/removed)
SIGNAL_HANDLER
if(!istype(removed))
@@ -342,11 +342,11 @@
/datum/quirk/item_quirk/tongue_tied/add_unique()
var/mob/living/carbon/human/human_holder = quirk_holder
var/obj/item/organ/tongue/old_tongue = human_holder.getorganslot(ORGAN_SLOT_TONGUE)
var/obj/item/organ/internal/tongue/old_tongue = human_holder.getorganslot(ORGAN_SLOT_TONGUE)
old_tongue.Remove(human_holder)
qdel(old_tongue)
var/obj/item/organ/tongue/tied/new_tongue = new(get_turf(human_holder))
var/obj/item/organ/internal/tongue/tied/new_tongue = new(get_turf(human_holder))
new_tongue.Insert(human_holder)
// Only tongues of people with this quirk can't be removed. Manually spawned or found tongues can be.
new_tongue.organ_flags |= ORGAN_UNREMOVABLE
+1 -1
View File
@@ -26,7 +26,7 @@
/datum/saymode/vocalcords/handle_message(mob/living/user, message, datum/language/language)
if(iscarbon(user))
var/mob/living/carbon/C = user
var/obj/item/organ/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
var/obj/item/organ/internal/vocal_cords/V = C.getorganslot(ORGAN_SLOT_VOICE)
if(V?.can_speak_with())
V.handle_speech(message) //message
V.speak_with(message) //action
+1 -1
View File
@@ -421,7 +421,7 @@
if(QDELETED(human_mob))
return
if(prob(1))//low chance of the alternative reality returning to monkey
var/obj/item/organ/tail/monkey/monkey_tail = new ()
var/obj/item/organ/external/tail/monkey/monkey_tail = new ()
monkey_tail.Insert(human_mob, drop_if_replaced = FALSE)
var/datum/species/human_species = human_mob.dna?.species
if(human_species)
@@ -946,7 +946,7 @@
candidates = living_players
for(var/mob/living/carbon/human/candidate in candidates)
if( \
!candidate.getorgan(/obj/item/organ/brain) \
!candidate.getorgan(/obj/item/organ/internal/brain) \
|| candidate.mind.has_antag_datum(/datum/antagonist/obsessed) \
|| candidate.stat == DEAD \
|| !(ROLE_OBSESSED in candidate.client?.prefs?.be_special) \
+1 -1
View File
@@ -282,7 +282,7 @@ GLOBAL_LIST(admin_objective_list) //Prefilled admin assignable objective list
/datum/objective/protect/check_completion()
var/obj/item/organ/brain/brain_target
var/obj/item/organ/internal/brain/brain_target
if(human_check)
brain_target = target.current?.getorganslot(ORGAN_SLOT_BRAIN)
//Protect will always suceed when someone suicides
+1 -1
View File
@@ -6,7 +6,7 @@
base_icon_state = "scanner"
density = TRUE
obj_flags = NO_BUILD // Becomes undense when the door is open
occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/brain)
occupant_typecache = list(/mob/living, /obj/item/bodypart/head, /obj/item/organ/internal/brain)
circuit = /obj/item/circuitboard/machine/dnascanner
var/locked = FALSE
var/damage_coeff
+1 -1
View File
@@ -262,7 +262,7 @@
chemical_list += list(list("name" = reagent.name, "volume" = round(reagent.volume, 0.01)))
if(reagent.overdosed)
overdose_list += list(list("name" = reagent.name))
var/obj/item/organ/stomach/belly = patient.getorganslot(ORGAN_SLOT_STOMACH)
var/obj/item/organ/internal/stomach/belly = patient.getorganslot(ORGAN_SLOT_STOMACH)
if(belly?.reagents.reagent_list.len) //include the stomach contents if it exists
for(var/bile in belly.reagents.reagent_list)
var/datum/reagent/bit = bile
+1 -1
View File
@@ -134,7 +134,7 @@
if(istype(AM, /obj/item))
var/obj/item/bodypart/head/as_head = AM
var/obj/item/mmi/as_mmi = AM
if(istype(AM, /obj/item/organ/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay))
if(istype(AM, /obj/item/organ/internal/brain) || (istype(as_head) && as_head.brain) || (istype(as_mmi) && as_mmi.brain) || istype(AM, /obj/item/dullahan_relay))
living_detected = TRUE
nom += AM
else if(isliving(AM))
@@ -59,7 +59,6 @@
name = "antag gear"
icon_state = "esword"
loot = list(
/obj/item/clothing/glasses/science/night = 15,
/obj/item/shield/riot = 12,
/obj/item/stack/sheet/mineral/diamond{amount = 15} = 5,
@@ -25,18 +25,18 @@
icon_state = "eyes"
spawn_loot_count = 3
loot = list(
/obj/item/organ/heart/gland/egg = 7,
/obj/item/organ/heart/gland/plasma = 7,
/obj/item/organ/heart/gland/chem = 5,
/obj/item/organ/heart/gland/mindshock = 5,
/obj/item/organ/heart/gland/transform = 5,
/obj/item/organ/heart/gland/spiderman = 5,
/obj/item/organ/heart/gland/slime = 4,
/obj/item/organ/heart/gland/trauma = 4,
/obj/item/organ/heart/gland/electric = 3,
/obj/item/organ/internal/heart/gland/egg = 7,
/obj/item/organ/internal/heart/gland/plasma = 7,
/obj/item/organ/internal/heart/gland/chem = 5,
/obj/item/organ/internal/heart/gland/mindshock = 5,
/obj/item/organ/internal/heart/gland/transform = 5,
/obj/item/organ/internal/heart/gland/spiderman = 5,
/obj/item/organ/internal/heart/gland/slime = 4,
/obj/item/organ/internal/heart/gland/trauma = 4,
/obj/item/organ/internal/heart/gland/electric = 3,
/obj/item/organ/regenerative_core = 2,
/obj/item/organ/heart/gland/ventcrawling = 1,
/obj/item/organ/body_egg/alien_embryo = 1,
/obj/item/organ/internal/heart/gland/ventcrawling = 1,
/obj/item/organ/internal/body_egg/alien_embryo = 1,
)
/obj/effect/spawner/random/medical/memeorgans
@@ -44,23 +44,23 @@
icon_state = "eyes"
spawn_loot_count = 5
loot = list(
/obj/item/organ/ears/penguin,
/obj/item/organ/ears/cat,
/obj/item/organ/eyes/moth,
/obj/item/organ/eyes/snail,
/obj/item/organ/tongue/bone,
/obj/item/organ/tongue/fly,
/obj/item/organ/tongue/snail,
/obj/item/organ/tongue/lizard,
/obj/item/organ/tongue/alien,
/obj/item/organ/tongue/ethereal,
/obj/item/organ/tongue/robot,
/obj/item/organ/tongue/zombie,
/obj/item/organ/appendix,
/obj/item/organ/liver/fly,
/obj/item/organ/lungs/plasmaman,
/obj/item/organ/tail/cat,
/obj/item/organ/tail/lizard,
/obj/item/organ/internal/ears/penguin,
/obj/item/organ/internal/ears/cat,
/obj/item/organ/internal/eyes/moth,
/obj/item/organ/internal/eyes/snail,
/obj/item/organ/internal/tongue/bone,
/obj/item/organ/internal/tongue/fly,
/obj/item/organ/internal/tongue/snail,
/obj/item/organ/internal/tongue/lizard,
/obj/item/organ/internal/tongue/alien,
/obj/item/organ/internal/tongue/ethereal,
/obj/item/organ/internal/tongue/robot,
/obj/item/organ/internal/tongue/zombie,
/obj/item/organ/internal/appendix,
/obj/item/organ/internal/liver/fly,
/obj/item/organ/internal/lungs/plasmaman,
/obj/item/organ/external/tail/cat,
/obj/item/organ/external/tail/lizard,
)
/obj/effect/spawner/random/medical/two_percent_xeno_egg_spawner
+1 -1
View File
@@ -65,7 +65,7 @@
return TRUE
/obj/item/airlock_painter/suicide_act(mob/user)
var/obj/item/organ/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS)
var/obj/item/organ/internal/lungs/L = user.getorganslot(ORGAN_SLOT_LUNGS)
if(can_use(user) && L)
user.visible_message(span_suicide("[user] is inhaling toner from [src]! It looks like [user.p_theyre()] trying to commit suicide!"))
+11 -11
View File
@@ -1,4 +1,4 @@
/obj/item/organ/body_egg
/obj/item/organ/internal/body_egg
name = "body egg"
desc = "All slimy and yuck."
icon_state = "innards"
@@ -6,23 +6,23 @@
zone = BODY_ZONE_CHEST
slot = ORGAN_SLOT_PARASITE_EGG
/obj/item/organ/body_egg/on_find(mob/living/finder)
/obj/item/organ/internal/body_egg/on_find(mob/living/finder)
..()
to_chat(finder, span_warning("You found an unknown alien organism in [owner]'s [zone]!"))
/obj/item/organ/body_egg/Initialize(mapload)
/obj/item/organ/internal/body_egg/Initialize(mapload)
. = ..()
if(iscarbon(loc))
Insert(loc)
/obj/item/organ/body_egg/Insert(mob/living/carbon/M, special = FALSE)
/obj/item/organ/internal/body_egg/Insert(mob/living/carbon/M, special = FALSE)
..()
ADD_TRAIT(owner, TRAIT_XENO_HOST, ORGAN_TRAIT)
ADD_TRAIT(owner, TRAIT_XENO_IMMUNE, ORGAN_TRAIT)
owner.med_hud_set_status()
INVOKE_ASYNC(src, .proc/AddInfectionImages, owner)
/obj/item/organ/body_egg/Remove(mob/living/carbon/M, special = FALSE)
/obj/item/organ/internal/body_egg/Remove(mob/living/carbon/M, special = FALSE)
if(owner)
REMOVE_TRAIT(owner, TRAIT_XENO_HOST, ORGAN_TRAIT)
REMOVE_TRAIT(owner, TRAIT_XENO_IMMUNE, ORGAN_TRAIT)
@@ -30,25 +30,25 @@
INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner)
..()
/obj/item/organ/body_egg/on_death(delta_time, times_fired)
/obj/item/organ/internal/body_egg/on_death(delta_time, times_fired)
. = ..()
if(!owner)
return
egg_process(delta_time, times_fired)
/obj/item/organ/body_egg/on_life(delta_time, times_fired)
/obj/item/organ/internal/body_egg/on_life(delta_time, times_fired)
. = ..()
egg_process(delta_time, times_fired)
/obj/item/organ/body_egg/proc/egg_process(delta_time, times_fired)
/obj/item/organ/internal/body_egg/proc/egg_process(delta_time, times_fired)
return
/obj/item/organ/body_egg/proc/RefreshInfectionImage()
/obj/item/organ/internal/body_egg/proc/RefreshInfectionImage()
RemoveInfectionImages()
AddInfectionImages()
/obj/item/organ/body_egg/proc/AddInfectionImages()
/obj/item/organ/internal/body_egg/proc/AddInfectionImages()
return
/obj/item/organ/body_egg/proc/RemoveInfectionImages()
/obj/item/organ/internal/body_egg/proc/RemoveInfectionImages()
return
+6 -6
View File
@@ -96,12 +96,12 @@
if(!augment_list)
augment_list = list()
var/list/templist = list(
/obj/item/organ/cyberimp/brain/anti_drop,
/obj/item/organ/cyberimp/arm/toolset,
/obj/item/organ/cyberimp/arm/surgery,
/obj/item/organ/cyberimp/chest/thrusters,
/obj/item/organ/lungs/cybernetic/tier3,
/obj/item/organ/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
/obj/item/organ/internal/cyberimp/brain/anti_drop,
/obj/item/organ/internal/cyberimp/arm/toolset,
/obj/item/organ/internal/cyberimp/arm/surgery,
/obj/item/organ/internal/cyberimp/chest/thrusters,
/obj/item/organ/internal/lungs/cybernetic/tier3,
/obj/item/organ/internal/liver/cybernetic/tier3) //cyberimplants range from a nice bonus to fucking broken bullshit so no subtypesof
for(var/V in templist)
var/atom/A = V
augment_list[initial(A.name)] = A
+1 -1
View File
@@ -303,7 +303,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
return
reagents.expose(smoker, INGEST, min(to_smoke / reagents.total_volume, 1))
var/obj/item/organ/lungs/lungs = smoker.getorganslot(ORGAN_SLOT_LUNGS)
var/obj/item/organ/internal/lungs/lungs = smoker.getorganslot(ORGAN_SLOT_LUNGS)
if(lungs && !(lungs.organ_flags & ORGAN_SYNTHETIC))
var/smoker_resistance = HAS_TRAIT(smoker, TRAIT_SMOKER) ? 0.5 : 1
smoker.adjustOrganLoss(ORGAN_SLOT_LUNGS, lung_harm*smoker_resistance)
+2 -2
View File
@@ -571,7 +571,7 @@
if(do_after(user, 3 SECONDS, H)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message(span_notice("[user] places [src] on [H]'s chest."), span_warning("You place [src] on [H]'s chest."))
playsound(src, 'sound/machines/defib_charge.ogg', 75, FALSE)
var/obj/item/organ/heart = H.getorgan(/obj/item/organ/heart)
var/obj/item/organ/internal/heart = H.getorgan(/obj/item/organ/internal/heart)
if(do_after(user, 2 SECONDS, H)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
if((!combat && !req_defib) || (req_defib && !defib.combat))
for(var/obj/item/clothing/C in H.get_equipped_items())
@@ -640,7 +640,7 @@
log_combat(user, H, "revived", defib)
do_success()
return
else if (!H.getorgan(/obj/item/organ/heart))
else if (!H.getorgan(/obj/item/organ/internal/heart))
user.visible_message(span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Patient's heart is missing. Operation aborted."))
playsound(src, 'sound/machines/defib_failed.ogg', 50, FALSE)
else if(H.undergoing_cardiac_arrest())
@@ -75,7 +75,7 @@
to_chat(user, span_warning("You're going to need to remove that [(M.head && M.head.flags_cover & HEADCOVERSEYES) ? "helmet" : (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSEYES) ? "mask": "glasses"] first!"))
return
var/obj/item/organ/eyes/E = M.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/E = M.getorganslot(ORGAN_SLOT_EYES)
if(!E)
to_chat(user, span_warning("[M] doesn't have any eyes!"))
return
@@ -527,7 +527,7 @@
if(!fuel)
user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but it's empty!"))
return SHAME
var/obj/item/organ/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = user.getorganslot(ORGAN_SLOT_EYES)
if(!eyes)
user.visible_message(span_suicide("[user] is trying to squirt [src]'s fluids into [user.p_their()] eyes... but [user.p_they()] don't have any!"))
return SHAME
@@ -196,7 +196,7 @@
var/mob/living/carbon/carbontarget = target
// Ear status
var/obj/item/organ/ears/ears = carbontarget.getorganslot(ORGAN_SLOT_EARS)
var/obj/item/organ/internal/ears/ears = carbontarget.getorganslot(ORGAN_SLOT_EARS)
if(istype(ears))
if(HAS_TRAIT_FROM(carbontarget, TRAIT_DEAF, GENETIC_MUTATION))
render_list = "<span class='alert ml-2'>Subject is genetically deaf.\n</span>"
@@ -211,7 +211,7 @@
render_list += "<span class='alert ml-2'>Subject is [ears.damage > ears.maxHealth ? "permanently ": "temporarily "] deaf.\n</span>"
// Eye status
var/obj/item/organ/eyes/eyes = carbontarget.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = carbontarget.getorganslot(ORGAN_SLOT_EYES)
if(istype(eyes))
if(carbontarget.is_blind())
render_list += "<span class='alert ml-2'>Subject is blind.\n</span>"
@@ -365,7 +365,7 @@
if(iscarbon(target))
var/mob/living/carbon/carbontarget = target
var/cyberimp_detect
for(var/obj/item/organ/cyberimp/CI in carbontarget.internal_organs)
for(var/obj/item/organ/internal/cyberimp/CI in carbontarget.internal_organs)
if(CI.status == ORGAN_ROBOTIC && !CI.syndicate_implant)
cyberimp_detect += "[!cyberimp_detect ? "[CI.get_examine_string(user)]" : ", [CI.get_examine_string(user)]"]"
if(cyberimp_detect)
@@ -397,7 +397,7 @@
render_list += "<span class='notice ml-1'>Subject contains no reagents in their blood.</span>\n"
// Stomach reagents
var/obj/item/organ/stomach/belly = target.getorganslot(ORGAN_SLOT_STOMACH)
var/obj/item/organ/internal/stomach/belly = target.getorganslot(ORGAN_SLOT_STOMACH)
if(belly)
if(belly.reagents.reagent_list.len)
render_list += "<span class='notice ml-1'>Subject contains the following reagents in their stomach:</span>\n"
+1 -1
View File
@@ -73,7 +73,7 @@
user.visible_message(span_suicide("[user] begins spinning way too fast! It looks like [user.p_theyre()] trying to commit suicide!"))
var/obj/item/bodypart/head/myhead = user.get_bodypart(BODY_ZONE_HEAD)//stole from chainsaw code
var/obj/item/organ/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
var/obj/item/organ/internal/brain/B = user.getorganslot(ORGAN_SLOT_BRAIN)
B.organ_flags &= ~ORGAN_VITAL //this cant possibly be a good idea
var/randdir
for(var/i in 1 to 24)//like a headless chicken!
+2 -2
View File
@@ -217,7 +217,7 @@
if(ishuman(slapped))
var/mob/living/carbon/human/human_slapped = slapped
human_slapped.dna?.species?.stop_wagging_tail(slapped)
SEND_SIGNAL(human_slapped, COMSIG_ORGAN_WAG_TAIL, FALSE)
user.do_attack_animation(slapped)
var/slap_volume = 50
@@ -569,7 +569,7 @@
if(!iscarbon(target))
return
var/mob/living/carbon/heartbreakee = target
var/obj/item/organ/heart/dont_go_breakin_my_heart = heartbreakee.getorganslot(ORGAN_SLOT_HEART)
var/obj/item/organ/internal/heart/dont_go_breakin_my_heart = heartbreakee.getorganslot(ORGAN_SLOT_HEART)
dont_go_breakin_my_heart.applyOrganDamage(999)
+1 -1
View File
@@ -312,7 +312,7 @@
/obj/item/melee/baton/telescopic/suicide_act(mob/user)
var/mob/living/carbon/human/human_user = user
var/obj/item/organ/brain/our_brain = human_user.getorgan(/obj/item/organ/brain)
var/obj/item/organ/internal/brain/our_brain = human_user.getorgan(/obj/item/organ/internal/brain)
user.visible_message(span_suicide("[user] stuffs [src] up [user.p_their()] nose and presses the 'extend' button! It looks like [user.p_theyre()] trying to clear [user.p_their()] mind."))
if(active)
+3 -4
View File
@@ -220,10 +220,9 @@
else if(istype(W, /obj/item/bodypart/head/robot))
var/obj/item/bodypart/head/robot/HD = W
for(var/X in HD.contents)
if(istype(X, /obj/item/organ))
to_chat(user, span_warning("There are organs inside [HD]!"))
return
if(locate(/obj/item/organ/internal) in HD)
to_chat(user, span_warning("There are organs inside [HD]!"))
return
if(head)
return
if(HD.flash2 && HD.flash1)
+10 -14
View File
@@ -577,30 +577,26 @@
///freezes the organ and loops bodyparts like heads
/obj/item/storage/organbox/proc/freeze(datum/source, obj/item/I)
SIGNAL_HANDLER
if(isorgan(I))
var/obj/item/organ/organ = I
organ.organ_flags |= ORGAN_FROZEN
if(isinternalorgan(I))
var/obj/item/organ/internal/int_organ = I
int_organ.organ_flags |= ORGAN_FROZEN
return
if(istype(I, /obj/item/bodypart))
var/obj/item/bodypart/B = I
for(var/O in B.contents)
if(isorgan(O))
var/obj/item/organ/organ = O
organ.organ_flags |= ORGAN_FROZEN
for(var/obj/item/organ/internal/int_organ in B.contents)
int_organ.organ_flags |= ORGAN_FROZEN
///unfreezes the organ and loops bodyparts like heads
/obj/item/storage/organbox/proc/unfreeze(datum/source, obj/item/I)
SIGNAL_HANDLER
if(isorgan(I))
var/obj/item/organ/organ = I
organ.organ_flags &= ~ORGAN_FROZEN
if(isinternalorgan(I))
var/obj/item/organ/internal/int_organ = I
int_organ.organ_flags &= ~ORGAN_FROZEN
return
if(istype(I, /obj/item/bodypart))
var/obj/item/bodypart/B = I
for(var/O in B.contents)
if(isorgan(O))
var/obj/item/organ/organ = O
organ.organ_flags &= ~ORGAN_FROZEN
for(var/obj/item/organ/internal/int_organ in B.contents)
int_organ.organ_flags &= ~ORGAN_FROZEN
/obj/item/storage/organbox/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/reagent_containers) && I.is_open_container())
+2 -2
View File
@@ -375,7 +375,7 @@
. = ..()
if(.)
return
if(user.getorgan(/obj/item/organ/alien/plasmavessel))
if(user.getorgan(/obj/item/organ/internal/alien/plasmavessel))
switch(status)
if(BURSTING)
to_chat(user, span_notice("The child is hatching out."))
@@ -443,7 +443,7 @@
return
var/mob/living/carbon/C = AM
if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/body_egg/alien_embryo))
if(C.stat == CONSCIOUS && C.getorgan(/obj/item/organ/internal/body_egg/alien_embryo))
return
Burst(kill=FALSE)
@@ -21,7 +21,7 @@
for(var/buck in buckled_mobs) //breaking a nest releases all the buckled mobs, because the nest isn't holding them down anymore
var/mob/living/M = buck
if(user.getorgan(/obj/item/organ/alien/plasmavessel))
if(user.getorgan(/obj/item/organ/internal/alien/plasmavessel))
unbuckle_mob(M)
add_fingerprint(user)
return
@@ -51,9 +51,9 @@
if ( !ismob(M) || (get_dist(src, user) > 1) || (M.loc != src.loc) || user.incapacitated() || M.buckled )
return
if(M.getorgan(/obj/item/organ/alien/plasmavessel))
if(M.getorgan(/obj/item/organ/internal/alien/plasmavessel))
return
if(!user.getorgan(/obj/item/organ/alien/plasmavessel))
if(!user.getorgan(/obj/item/organ/internal/alien/plasmavessel))
return
if(has_buckled_mobs())
@@ -143,7 +143,7 @@ GLOBAL_LIST_INIT(ore_probability, list(
if(3)
new /obj/item/reagent_containers/glass/bottle/potion/flight(loc)
if(4)
new /obj/item/organ/heart/cursed/wizard(loc)
new /obj/item/organ/internal/heart/cursed/wizard(loc)
if(5)
new /obj/item/jacobs_ladder(loc)
if(6)
+1 -1
View File
@@ -636,7 +636,7 @@ GLOBAL_LIST_EMPTY(station_turfs)
clear_reagents_to_vomit_pool(M, V, purge_ratio)
/proc/clear_reagents_to_vomit_pool(mob/living/carbon/M, obj/effect/decal/cleanable/vomit/V, purge_ratio = 0.1)
var/obj/item/organ/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH)
var/obj/item/organ/internal/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH)
if(!belly?.reagents.total_volume)
return
var/chemicals_lost = belly.reagents.total_volume * purge_ratio
+1
View File
@@ -30,6 +30,7 @@
// Mutant randomizing, doesn't affect the mob appearance unless it's the specific mutant.
human.dna.features["mcolor"] = "#[random_color()]"
human.dna.features["ethcolor"] = GLOB.color_list_ethereal[pick(GLOB.color_list_ethereal)]
human.dna.features["tail_cat"] = pick(GLOB.tails_list_human)
human.dna.features["tail_lizard"] = pick(GLOB.tails_list_lizard)
human.dna.features["snout"] = pick(GLOB.snouts_list)
human.dna.features["horns"] = pick(GLOB.horns_list)
+2 -2
View File
@@ -143,7 +143,7 @@
for(var/i in GLOB.human_list)
var/mob/living/carbon/human/H = i
new /obj/item/organ/zombie_infection/nodamage(H)
new /obj/item/organ/internal/zombie_infection/nodamage(H)
message_admins("[key_name_admin(usr)] added a latent zombie infection to all humans.")
log_admin("[key_name(usr)] added a latent zombie infection to all humans.")
@@ -160,7 +160,7 @@
if(confirm != "Yes")
return
for(var/obj/item/organ/zombie_infection/nodamage/I in GLOB.zombie_infection_list)
for(var/obj/item/organ/internal/zombie_infection/nodamage/I in GLOB.zombie_infection_list)
qdel(I)
message_admins("[key_name_admin(usr)] cured all zombies.")
+2 -2
View File
@@ -501,8 +501,8 @@ GLOBAL_DATUM(everyone_a_traitor, /datum/everyone_is_a_traitor_controller)
if(H.dna.species.id == SPECIES_HUMAN)
if(H.dna.features["tail_human"] == "None" || H.dna.features["ears"] == "None")
var/obj/item/organ/ears/cat/ears = new
var/obj/item/organ/tail/cat/tail = new
var/obj/item/organ/internal/ears/cat/ears = new
var/obj/item/organ/external/tail/cat/tail = new
ears.Insert(H, drop_if_replaced=FALSE)
tail.Insert(H, drop_if_replaced=FALSE)
var/list/honorifics = list("[MALE]" = list("kun"), "[FEMALE]" = list("chan","tan"), "[NEUTER]" = list("san"), "[PLURAL]" = list("san")) //John Robust -> Robust-kun
+1 -1
View File
@@ -216,7 +216,7 @@
for(var/obj/item/item in human_target.get_equipped_items(delete_pocket))
qdel(item)
var/obj/item/organ/brain/human_brain = human_target.getorganslot(BRAIN)
var/obj/item/organ/internal/brain/human_brain = human_target.getorganslot(BRAIN)
human_brain.destroy_all_skillchips() // get rid of skillchips to prevent runtimes
if(dresscode != "Naked")
@@ -94,7 +94,7 @@ GLOBAL_LIST_INIT(possible_abductor_names, list("Alpha","Beta","Gamma","Delta","E
//Equip
var/mob/living/carbon/human/H = owner.current
H.set_species(/datum/species/abductor)
var/obj/item/organ/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE)
var/obj/item/organ/internal/tongue/abductor/T = H.getorganslot(ORGAN_SLOT_TONGUE)
T.mothership = "[team.name]"
H.real_name = "[team.name] [sub_role]"
@@ -321,7 +321,7 @@
/obj/item/abductor/mind_device/proc/mind_control(atom/target, mob/living/user)
if(iscarbon(target))
var/mob/living/carbon/C = target
var/obj/item/organ/heart/gland/G = C.getorganslot("heart")
var/obj/item/organ/internal/heart/gland/G = C.getorganslot("heart")
if(!istype(G))
to_chat(user, span_warning("Your target does not have an experimental gland!"))
return
@@ -590,7 +590,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
species = span_notice("[H.dna.species.name]")
if(L.mind && L.mind.has_antag_datum(/datum/antagonist/changeling))
species = span_warning("Changeling lifeform")
var/obj/item/organ/heart/gland/temp = locate() in H.internal_organs
var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs
if(temp)
helptext = span_warning("Experimental gland detected!")
else
@@ -20,7 +20,7 @@
accept_hand = 1
time = 32
var/obj/item/organ/IC = null
var/list/organ_types = list(/obj/item/organ/heart)
var/list/organ_types = list(/obj/item/organ/internal/heart)
/datum/surgery_step/extract_organ/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
for(var/atom/A in target.internal_organs)
@@ -41,7 +41,7 @@
/datum/surgery_step/gland_insert
name = "insert gland"
implements = list(/obj/item/organ/heart/gland = 100)
implements = list(/obj/item/organ/internal/heart/gland = 100)
time = 32
/datum/surgery_step/gland_insert/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
@@ -50,6 +50,6 @@
/datum/surgery_step/gland_insert/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
user.visible_message(span_notice("[user] inserts [tool] into [target]."), span_notice("You insert [tool] into [target]."))
user.temporarilyRemoveItemFromInventory(tool, TRUE)
var/obj/item/organ/heart/gland/gland = tool
var/obj/item/organ/internal/heart/gland/gland = tool
gland.Insert(target, 2)
return 1
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland
/obj/item/organ/internal/heart/gland
name = "fleshy mass"
desc = "A nausea-inducing hunk of twisting flesh and metal."
icon = 'icons/obj/abductor.dmi'
@@ -24,27 +24,27 @@
var/mind_control_duration = 1800
var/active_mind_control = FALSE
/obj/item/organ/heart/gland/Initialize(mapload)
/obj/item/organ/internal/heart/gland/Initialize(mapload)
. = ..()
icon_state = pick(list("health", "spider", "slime", "emp", "species", "egg", "vent", "mindshock", "viral"))
/obj/item/organ/heart/gland/examine(mob/user)
/obj/item/organ/internal/heart/gland/examine(mob/user)
. = ..()
if((user.mind && HAS_TRAIT(user.mind, TRAIT_ABDUCTOR_SCIENTIST_TRAINING)) || isobserver(user))
. += span_notice("It is \a [abductor_hint]")
/obj/item/organ/heart/gland/proc/ownerCheck()
/obj/item/organ/internal/heart/gland/proc/ownerCheck()
if(ishuman(owner))
return TRUE
if(!human_only && iscarbon(owner))
return TRUE
return FALSE
/obj/item/organ/heart/gland/proc/Start()
/obj/item/organ/internal/heart/gland/proc/Start()
active = 1
COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high))
/obj/item/organ/heart/gland/proc/update_gland_hud()
/obj/item/organ/internal/heart/gland/proc/update_gland_hud()
if(!owner)
return
var/image/holder = owner.hud_list[GLAND_HUD]
@@ -57,7 +57,7 @@
else
holder.icon_state = "hudgland_spent"
/obj/item/organ/heart/gland/proc/mind_control(command, mob/living/user)
/obj/item/organ/internal/heart/gland/proc/mind_control(command, mob/living/user)
if(!ownerCheck() || !mind_control_uses || active_mind_control)
return FALSE
mind_control_uses--
@@ -72,7 +72,7 @@
addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration)
return TRUE
/obj/item/organ/heart/gland/proc/clear_mind_control()
/obj/item/organ/internal/heart/gland/proc/clear_mind_control()
if(!ownerCheck() || !active_mind_control)
return FALSE
to_chat(owner, span_userdanger("You feel the compulsion fade, and you <i>completely forget</i> about your previous orders."))
@@ -80,7 +80,7 @@
active_mind_control = FALSE
return TRUE
/obj/item/organ/heart/gland/Remove(mob/living/carbon/M, special = FALSE)
/obj/item/organ/internal/heart/gland/Remove(mob/living/carbon/M, special = FALSE)
active = FALSE
if(initial(uses) == 1)
uses = initial(uses)
@@ -89,7 +89,7 @@
clear_mind_control()
..()
/obj/item/organ/heart/gland/Insert(mob/living/carbon/M, special = FALSE)
/obj/item/organ/internal/heart/gland/Insert(mob/living/carbon/M, special = FALSE)
..()
if(special != 2 && uses) // Special 2 means abductor surgery
Start()
@@ -97,7 +97,7 @@
hud.add_atom_to_hud(owner)
update_gland_hud()
/obj/item/organ/heart/gland/on_life(delta_time, times_fired)
/obj/item/organ/internal/heart/gland/on_life(delta_time, times_fired)
if(!beating)
// alien glands are immune to stopping.
beating = TRUE
@@ -113,5 +113,5 @@
if(!uses)
active = FALSE
/obj/item/organ/heart/gland/proc/activate()
/obj/item/organ/internal/heart/gland/proc/activate()
return
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/access
/obj/item/organ/internal/heart/gland/access
abductor_hint = "anagraphic electro-scrambler. After it activates, grants the abductee intrinsic all access."
cooldown_low = 600
cooldown_high = 1200
@@ -7,6 +7,6 @@
mind_control_uses = 3
mind_control_duration = 900
/obj/item/organ/heart/gland/access/activate()
/obj/item/organ/internal/heart/gland/access/activate()
to_chat(owner, span_notice("You feel like a VIP for some reason."))
owner.AddComponent(/datum/component/simple_access, SSid_access.get_region_access_list(list(REGION_ALL_GLOBAL)), src)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/blood
/obj/item/organ/internal/heart/gland/blood
abductor_hint = "pseudonuclear hemo-destabilizer. Periodically randomizes the abductee's bloodtype into a random reagent."
cooldown_low = 1200
cooldown_high = 1800
@@ -9,7 +9,7 @@
mind_control_uses = 3
mind_control_duration = 1500
/obj/item/organ/heart/gland/blood/activate()
/obj/item/organ/internal/heart/gland/blood/activate()
if(!ishuman(owner) || !owner.dna.species)
return
var/mob/living/carbon/human/H = owner
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/chem
/obj/item/organ/internal/heart/gland/chem
abductor_hint = "intrinsic pharma-provider. The abductee constantly produces random chemicals inside their bloodstream. They also quickly regenerate toxin damage."
cooldown_low = 50
cooldown_high = 50
@@ -8,12 +8,12 @@
mind_control_duration = 1200
var/list/possible_reagents = list()
/obj/item/organ/heart/gland/chem/Initialize(mapload)
/obj/item/organ/internal/heart/gland/chem/Initialize(mapload)
. = ..()
for(var/R in subtypesof(/datum/reagent/drug) + subtypesof(/datum/reagent/medicine) + typesof(/datum/reagent/toxin))
possible_reagents += R
/obj/item/organ/heart/gland/chem/activate()
/obj/item/organ/internal/heart/gland/chem/activate()
var/chem_to_add = pick(possible_reagents)
owner.reagents.add_reagent(chem_to_add, 2)
owner.adjustToxLoss(-5, TRUE, TRUE)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/egg
/obj/item/organ/internal/heart/gland/egg
abductor_hint = "roe/enzymatic synthesizer. The abductee will periodically lay eggs filled with random reagents."
cooldown_low = 300
cooldown_high = 400
@@ -9,7 +9,7 @@
mind_control_uses = 2
mind_control_duration = 1800
/obj/item/organ/heart/gland/egg/activate()
/obj/item/organ/internal/heart/gland/egg/activate()
owner.visible_message(span_alertalien("[owner] [pick(EGG_LAYING_MESSAGES)]"))
var/turf/T = owner.drop_location()
new /obj/item/food/egg/gland(T)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/electric
/obj/item/organ/internal/heart/gland/electric
abductor_hint = "electron accumulator/discharger. The abductee becomes fully immune to electric shocks. Additionally, they will randomly discharge electric bolts."
cooldown_low = 800
cooldown_high = 1200
@@ -7,20 +7,20 @@
mind_control_uses = 2
mind_control_duration = 900
/obj/item/organ/heart/gland/electric/Insert(mob/living/carbon/M, special = 0)
/obj/item/organ/internal/heart/gland/electric/Insert(mob/living/carbon/M, special = 0)
..()
ADD_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
/obj/item/organ/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/internal/heart/gland/electric/Remove(mob/living/carbon/M, special = 0)
REMOVE_TRAIT(owner, TRAIT_SHOCKIMMUNE, "abductor_gland")
..()
/obj/item/organ/heart/gland/electric/activate()
/obj/item/organ/internal/heart/gland/electric/activate()
owner.visible_message(span_danger("[owner]'s skin starts emitting electric arcs!"),\
span_warning("You feel electric energy building up inside you!"))
playsound(get_turf(owner), SFX_SPARKS, 100, TRUE, -1, SHORT_RANGE_SOUND_EXTRARANGE)
addtimer(CALLBACK(src, .proc/zap), rand(30, 100))
/obj/item/organ/heart/gland/electric/proc/zap()
/obj/item/organ/internal/heart/gland/electric/proc/zap()
tesla_zap(owner, 4, 8000, ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE | ZAP_MOB_STUN)
playsound(get_turf(owner), 'sound/magic/lightningshock.ogg', 50, TRUE)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/heal
/obj/item/organ/internal/heart/gland/heal
abductor_hint = "organic replicator. Forcibly ejects damaged and robotic organs from the abductee and regenerates them. Additionally, forcibly removes reagents (via vomit) from the abductee if they have moderate toxin damage or poison within the bloodstream, and regenerates blood to a healthy threshold if too low. The abductee will also reject implants such as mindshields."
cooldown_low = 200
cooldown_high = 400
@@ -8,7 +8,7 @@
mind_control_uses = 3
mind_control_duration = 3000
/obj/item/organ/heart/gland/heal/activate()
/obj/item/organ/internal/heart/gland/heal/activate()
if(!(owner.mob_biotypes & MOB_ORGANIC))
return
@@ -17,31 +17,31 @@
return
for(var/organ in owner.internal_organs)
if(istype(organ, /obj/item/organ/cyberimp))
if(istype(organ, /obj/item/organ/internal/cyberimp))
reject_cyberimp(organ)
return
var/obj/item/organ/appendix/appendix = owner.getorganslot(ORGAN_SLOT_APPENDIX)
var/obj/item/organ/internal/appendix/appendix = owner.getorganslot(ORGAN_SLOT_APPENDIX)
if((!appendix && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (appendix && ((appendix.organ_flags & ORGAN_FAILING) || (appendix.organ_flags & ORGAN_SYNTHETIC))))
replace_appendix(appendix)
return
var/obj/item/organ/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER)
var/obj/item/organ/internal/liver/liver = owner.getorganslot(ORGAN_SLOT_LIVER)
if((!liver && !HAS_TRAIT(owner, TRAIT_NOMETABOLISM)) || (liver && ((liver.damage > liver.high_threshold) || (liver.organ_flags & ORGAN_SYNTHETIC))))
replace_liver(liver)
return
var/obj/item/organ/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
var/obj/item/organ/internal/lungs/lungs = owner.getorganslot(ORGAN_SLOT_LUNGS)
if((!lungs && !HAS_TRAIT(owner, TRAIT_NOBREATH)) || (lungs && ((lungs.damage > lungs.high_threshold) || (lungs.organ_flags & ORGAN_SYNTHETIC))))
replace_lungs(lungs)
return
var/obj/item/organ/stomach/stomach = owner.getorganslot(ORGAN_SLOT_STOMACH)
var/obj/item/organ/internal/stomach/stomach = owner.getorganslot(ORGAN_SLOT_STOMACH)
if((!stomach && !HAS_TRAIT(owner, TRAIT_NOHUNGER)) || (stomach && ((stomach.damage > stomach.high_threshold) || (stomach.organ_flags & ORGAN_SYNTHETIC))))
replace_stomach(stomach)
return
var/obj/item/organ/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
var/obj/item/organ/internal/eyes/eyes = owner.getorganslot(ORGAN_SLOT_EYES)
if(!eyes || (eyes && ((eyes.damage > eyes.low_threshold) || (eyes.organ_flags & ORGAN_SYNTHETIC))))
replace_eyes(eyes)
return
@@ -76,19 +76,19 @@
replace_chest(chest)
return
/obj/item/organ/heart/gland/heal/proc/reject_implant(obj/item/implant/implant)
/obj/item/organ/internal/heart/gland/heal/proc/reject_implant(obj/item/implant/implant)
owner.visible_message(span_warning("[owner] vomits up a tiny mangled implant!"), span_userdanger("You suddenly vomit up a tiny mangled implant!"))
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
implant.removed(owner)
qdel(implant)
/obj/item/organ/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/cyberimp/implant)
/obj/item/organ/internal/heart/gland/heal/proc/reject_cyberimp(obj/item/organ/internal/cyberimp/implant)
owner.visible_message(span_warning("[owner] vomits up his [implant.name]!"), span_userdanger("You suddenly vomit up your [implant.name]!"))
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
implant.Remove(owner)
implant.forceMove(owner.drop_location())
/obj/item/organ/heart/gland/heal/proc/replace_appendix(obj/item/organ/appendix/appendix)
/obj/item/organ/internal/heart/gland/heal/proc/replace_appendix(obj/item/organ/internal/appendix/appendix)
if(appendix)
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
appendix.Remove(owner)
@@ -97,13 +97,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble in your bowels..."))
var/appendix_type = /obj/item/organ/appendix
var/appendix_type = /obj/item/organ/internal/appendix
if(owner?.dna?.species?.mutantappendix)
appendix_type = owner.dna.species.mutantappendix
var/obj/item/organ/appendix/new_appendix = new appendix_type()
var/obj/item/organ/internal/appendix/new_appendix = new appendix_type()
new_appendix.Insert(owner)
/obj/item/organ/heart/gland/heal/proc/replace_liver(obj/item/organ/liver/liver)
/obj/item/organ/internal/heart/gland/heal/proc/replace_liver(obj/item/organ/internal/liver/liver)
if(liver)
owner.visible_message(span_warning("[owner] vomits up his [liver.name]!"), span_userdanger("You suddenly vomit up your [liver.name]!"))
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
@@ -112,13 +112,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble in your bowels..."))
var/liver_type = /obj/item/organ/liver
var/liver_type = /obj/item/organ/internal/liver
if(owner?.dna?.species?.mutantliver)
liver_type = owner.dna.species.mutantliver
var/obj/item/organ/liver/new_liver = new liver_type()
var/obj/item/organ/internal/liver/new_liver = new liver_type()
new_liver.Insert(owner)
/obj/item/organ/heart/gland/heal/proc/replace_lungs(obj/item/organ/lungs/lungs)
/obj/item/organ/internal/heart/gland/heal/proc/replace_lungs(obj/item/organ/internal/lungs/lungs)
if(lungs)
owner.visible_message(span_warning("[owner] vomits up his [lungs.name]!"), span_userdanger("You suddenly vomit up your [lungs.name]!"))
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
@@ -127,13 +127,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble inside your chest..."))
var/lung_type = /obj/item/organ/lungs
var/lung_type = /obj/item/organ/internal/lungs
if(owner.dna.species && owner.dna.species.mutantlungs)
lung_type = owner.dna.species.mutantlungs
var/obj/item/organ/lungs/new_lungs = new lung_type()
var/obj/item/organ/internal/lungs/new_lungs = new lung_type()
new_lungs.Insert(owner)
/obj/item/organ/heart/gland/heal/proc/replace_stomach(obj/item/organ/stomach/stomach)
/obj/item/organ/internal/heart/gland/heal/proc/replace_stomach(obj/item/organ/internal/stomach/stomach)
if(stomach)
owner.visible_message(span_warning("[owner] vomits up his [stomach.name]!"), span_userdanger("You suddenly vomit up your [stomach.name]!"))
owner.vomit(0, TRUE, TRUE, 1, FALSE, FALSE, FALSE, TRUE)
@@ -142,13 +142,13 @@
else
to_chat(owner, span_warning("You feel a weird rumble in your bowels..."))
var/stomach_type = /obj/item/organ/stomach
var/stomach_type = /obj/item/organ/internal/stomach
if(owner?.dna?.species?.mutantstomach)
stomach_type = owner.dna.species.mutantstomach
var/obj/item/organ/stomach/new_stomach = new stomach_type()
var/obj/item/organ/internal/stomach/new_stomach = new stomach_type()
new_stomach.Insert(owner)
/obj/item/organ/heart/gland/heal/proc/replace_eyes(obj/item/organ/eyes/eyes)
/obj/item/organ/internal/heart/gland/heal/proc/replace_eyes(obj/item/organ/internal/eyes/eyes)
if(eyes)
owner.visible_message(span_warning("[owner]'s [eyes.name] fall out of their sockets!"), span_userdanger("Your [eyes.name] fall out of their sockets!"))
playsound(owner, 'sound/effects/splat.ogg', 50, TRUE)
@@ -159,15 +159,15 @@
addtimer(CALLBACK(src, .proc/finish_replace_eyes), rand(100, 200))
/obj/item/organ/heart/gland/heal/proc/finish_replace_eyes()
var/eye_type = /obj/item/organ/eyes
/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_eyes()
var/eye_type = /obj/item/organ/internal/eyes
if(owner.dna.species && owner.dna.species.mutanteyes)
eye_type = owner.dna.species.mutanteyes
var/obj/item/organ/eyes/new_eyes = new eye_type()
var/obj/item/organ/internal/eyes/new_eyes = new eye_type()
new_eyes.Insert(owner)
owner.visible_message(span_warning("A pair of new eyes suddenly inflates into [owner]'s eye sockets!"), span_userdanger("A pair of new eyes suddenly inflates into your eye sockets!"))
/obj/item/organ/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
/obj/item/organ/internal/heart/gland/heal/proc/replace_limb(body_zone, obj/item/bodypart/limb)
if(limb)
owner.visible_message(span_warning("[owner]'s [limb.plaintext_zone] suddenly detaches from [owner.p_their()] body!"), span_userdanger("Your [limb.plaintext_zone] suddenly detaches from your body!"))
playsound(owner, SFX_DESECRATION, 50, TRUE, -1)
@@ -177,18 +177,18 @@
addtimer(CALLBACK(src, .proc/finish_replace_limb, body_zone), rand(150, 300))
/obj/item/organ/heart/gland/heal/proc/finish_replace_limb(body_zone)
/obj/item/organ/internal/heart/gland/heal/proc/finish_replace_limb(body_zone)
owner.visible_message(span_warning("With a loud snap, [owner]'s [parse_zone(body_zone)] rapidly grows back from [owner.p_their()] body!"),
span_userdanger("With a loud snap, your [parse_zone(body_zone)] rapidly grows back from your body!"),
span_warning("Your hear a loud snap."))
playsound(owner, 'sound/magic/demon_consume.ogg', 50, TRUE)
owner.regenerate_limb(body_zone)
/obj/item/organ/heart/gland/heal/proc/replace_blood()
/obj/item/organ/internal/heart/gland/heal/proc/replace_blood()
owner.visible_message(span_warning("[owner] starts vomiting huge amounts of blood!"), span_userdanger("You suddenly start vomiting huge amounts of blood!"))
keep_replacing_blood()
/obj/item/organ/heart/gland/heal/proc/keep_replacing_blood()
/obj/item/organ/internal/heart/gland/heal/proc/keep_replacing_blood()
var/keep_going = FALSE
owner.vomit(0, TRUE, FALSE, 3, FALSE, FALSE, FALSE, TRUE)
owner.Stun(15)
@@ -207,7 +207,7 @@
if(keep_going)
addtimer(CALLBACK(src, .proc/keep_replacing_blood), 30)
/obj/item/organ/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
/obj/item/organ/internal/heart/gland/heal/proc/replace_chest(obj/item/bodypart/chest/chest)
if(!IS_ORGANIC_LIMB(chest))
owner.visible_message(span_warning("[owner]'s [chest.name] rapidly expels its mechanical components, replacing them with flesh!"), span_userdanger("Your [chest.name] rapidly expels its mechanical components, replacing them with flesh!"))
playsound(owner, 'sound/magic/clockwork/anima_fragment_attack.ogg', 50, TRUE)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/mindshock
/obj/item/organ/internal/heart/gland/mindshock
abductor_hint = "neural crosstalk uninhibitor. The abductee emits a disrupting psychic wave every so often. This will either stun, cause hallucinations or deal random brain damage to people nearby."
cooldown_low = 40 SECONDS
cooldown_high = 70 SECONDS
@@ -8,7 +8,7 @@
mind_control_duration = 120 SECONDS
var/list/mob/living/carbon/human/broadcasted_mobs = list()
/obj/item/organ/heart/gland/mindshock/activate()
/obj/item/organ/internal/heart/gland/mindshock/activate()
to_chat(owner, span_notice("You get a headache."))
var/turf/owner_turf = get_turf(owner)
@@ -30,7 +30,7 @@
if(3)
target.hallucination += 60
/obj/item/organ/heart/gland/mindshock/mind_control(command, mob/living/user)
/obj/item/organ/internal/heart/gland/mindshock/mind_control(command, mob/living/user)
if(!ownerCheck() || !mind_control_uses || active_mind_control)
return FALSE
mind_control_uses--
@@ -62,7 +62,7 @@
update_gland_hud()
return TRUE
/obj/item/organ/heart/gland/mindshock/clear_mind_control()
/obj/item/organ/internal/heart/gland/mindshock/clear_mind_control()
if(!active_mind_control || !LAZYLEN(broadcasted_mobs))
return FALSE
for(var/target_mob in broadcasted_mobs)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/plasma
/obj/item/organ/internal/heart/gland/plasma
abductor_hint = "effluvium sanguine-synonym emitter. The abductee randomly emits clouds of plasma."
cooldown_low = 1200
cooldown_high = 1800
@@ -7,12 +7,12 @@
mind_control_uses = 1
mind_control_duration = 800
/obj/item/organ/heart/gland/plasma/activate()
/obj/item/organ/internal/heart/gland/plasma/activate()
to_chat(owner, span_warning("You feel bloated."))
addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, owner, span_userdanger("A massive stomachache overcomes you.")), 150)
addtimer(CALLBACK(src, .proc/vomit_plasma), 200)
/obj/item/organ/heart/gland/plasma/proc/vomit_plasma()
/obj/item/organ/internal/heart/gland/plasma/proc/vomit_plasma()
if(!owner)
return
owner.visible_message(span_danger("[owner] vomits a cloud of plasma!"))
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/quantum
/obj/item/organ/internal/heart/gland/quantum
abductor_hint = "quantic de-observation matrix. Periodically links with a random person in view, then the abductee later swaps positions with that person."
cooldown_low = 150
cooldown_high = 150
@@ -8,7 +8,7 @@
mind_control_duration = 1200
var/mob/living/carbon/entangled_mob
/obj/item/organ/heart/gland/quantum/activate()
/obj/item/organ/internal/heart/gland/quantum/activate()
if(entangled_mob)
return
for(var/mob/M in oview(owner, 7))
@@ -18,7 +18,7 @@
addtimer(CALLBACK(src, .proc/quantum_swap), rand(600, 2400))
return
/obj/item/organ/heart/gland/quantum/proc/quantum_swap()
/obj/item/organ/internal/heart/gland/quantum/proc/quantum_swap()
if(QDELETED(entangled_mob))
entangled_mob = null
return
@@ -30,7 +30,7 @@
if(!active_mind_control) //Do not reset entangled mob while mind control is active
entangled_mob = null
/obj/item/organ/heart/gland/quantum/mind_control(command, mob/living/user)
/obj/item/organ/internal/heart/gland/quantum/mind_control(command, mob/living/user)
if(..())
if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD))
to_chat(entangled_mob, span_userdanger("You suddenly feel an irresistible compulsion to follow an order..."))
@@ -41,7 +41,7 @@
log_game("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]")
update_gland_hud()
/obj/item/organ/heart/gland/quantum/clear_mind_control()
/obj/item/organ/internal/heart/gland/quantum/clear_mind_control()
if(active_mind_control)
to_chat(entangled_mob, span_userdanger("You feel the compulsion fade, and you completely forget about your previous orders."))
entangled_mob.clear_alert(ALERT_MIND_CONTROL)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/slime
/obj/item/organ/internal/heart/gland/slime
abductor_hint = "gastric animation galvanizer. The abductee occasionally vomits slimes. Slimes will no longer attack the abductee."
cooldown_low = 600
cooldown_high = 1200
@@ -7,17 +7,17 @@
mind_control_uses = 1
mind_control_duration = 2400
/obj/item/organ/heart/gland/slime/Insert(mob/living/carbon/M, special = 0)
/obj/item/organ/internal/heart/gland/slime/Insert(mob/living/carbon/M, special = 0)
..()
owner.faction |= "slime"
owner.grant_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND)
/obj/item/organ/heart/gland/slime/Remove(mob/living/carbon/M, special = 0)
/obj/item/organ/internal/heart/gland/slime/Remove(mob/living/carbon/M, special = 0)
owner.faction -= "slime"
owner.remove_language(/datum/language/slime, TRUE, TRUE, LANGUAGE_GLAND)
..()
/obj/item/organ/heart/gland/slime/activate()
/obj/item/organ/internal/heart/gland/slime/activate()
to_chat(owner, span_warning("You feel nauseated!"))
owner.vomit(20)
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/spiderman
/obj/item/organ/internal/heart/gland/spiderman
abductor_hint = "araneae cloister accelerator. The abductee occasionally exhales spider pheromones and will spawn spiderlings."
cooldown_low = 450
cooldown_high = 900
@@ -7,7 +7,7 @@
mind_control_uses = 2
mind_control_duration = 2400
/obj/item/organ/heart/gland/spiderman/activate()
/obj/item/organ/internal/heart/gland/spiderman/activate()
to_chat(owner, span_warning("You feel something crawling in your skin."))
owner.faction |= "spiders"
var/obj/structure/spider/spiderling/S = new(owner.drop_location())
@@ -1,4 +1,4 @@
/obj/item/organ/heart/gland/transform
/obj/item/organ/internal/heart/gland/transform
abductor_hint = "anthropmorphic transmorphosizer. The abductee will occasionally change appearance and species."
cooldown_low = 900
cooldown_high = 1800
@@ -8,7 +8,7 @@
mind_control_uses = 7
mind_control_duration = 300
/obj/item/organ/heart/gland/transform/activate()
/obj/item/organ/internal/heart/gland/transform/activate()
to_chat(owner, span_notice("You feel unlike yourself."))
randomize_human(owner)
var/species = pick(list(/datum/species/human, /datum/species/lizard, /datum/species/moth, /datum/species/fly))

Some files were not shown because too many files have changed in this diff Show More