diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 21d155d3680..cb4277fdc5f 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -4948,7 +4948,7 @@
"bRi" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bRj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bRk" = (/obj/structure/table,/obj/item/FixOVein,/obj/item/surgicaldrill,/obj/item/bonegel,/obj/item/bonesetter,/obj/item/retractor,/obj/item/hemostat,/obj/item/cautery,/obj/item/stack/medical/bruise_pack/advanced{pixel_x = -4; pixel_y = 4},/turf/simulated/floor/plasteel,/area/assembly/robotics)
-"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi/posibrain,/obj/item/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics)
+"bRl" = (/obj/effect/decal/warning_stripes/east,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"; tag = ""},/obj/structure/table,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi,/obj/item/mmi/robotic_brain,/obj/item/robotanalyzer,/turf/simulated/floor/plasteel,/area/assembly/robotics)
"bRm" = (/obj/structure/table,/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/healthanalyzer,/obj/item/healthanalyzer,/obj/item/healthanalyzer,/obj/machinery/newscaster{pixel_x = 26; pixel_y = 1},/turf/simulated/floor/plasteel{icon_state = "white"},/area/assembly/robotics)
"bRn" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
"bRo" = (/obj/machinery/door/poddoor{density = 0; icon_state = "open"; id_tag = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/camera{c_tag = "Research Hallway Entrance"; dir = 2; network = list("Research","SS13")},/turf/simulated/floor/plasteel{icon_state = "bot"},/area/medical/research{name = "Research Division"})
diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm
index 0ec1567f86d..cd6688d095f 100644
--- a/code/__DEFINES/flags.dm
+++ b/code/__DEFINES/flags.dm
@@ -101,7 +101,6 @@
//turf-only flags
#define NOJAUNT 1
-#define RPD_ALLOWED_HERE 2//By default, RPD is disabled on turfs.
//ITEM INVENTORY SLOT BITMASKS
#define SLOT_OCLOTHING 1
diff --git a/code/__DEFINES/genetics.dm b/code/__DEFINES/genetics.dm
index aba6e6baea9..65b7f0f24d0 100644
--- a/code/__DEFINES/genetics.dm
+++ b/code/__DEFINES/genetics.dm
@@ -142,4 +142,5 @@
#define VIRUSIMMUNE 14
#define NOCRITDAMAGE 15
#define RESISTHOT 16
-#define RESISTCOLD 17
\ No newline at end of file
+#define RESISTCOLD 17
+#define NO_EXAMINE 18
\ No newline at end of file
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 023ebe426d9..1d47ae409b3 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -130,7 +130,31 @@
#define EYE_SHINE_THRESHOLD 6 //dark_view threshold past which a humanoid's eyes will 'shine' in the dark.
//Human sub-species
-#define isabductor(A) (is_species(A, "Abductor"))
+#define isshadowling(A) (is_species(A, /datum/species/shadow/ling))
+#define isshadowlinglesser(A) (is_species(A, /datum/species/shadow/ling/lesser))
+#define isabductor(A) (is_species(A, /datum/species/abductor))
+#define isgolem(A) (is_species(A, /datum/species/golem))
+#define ismonkeybasic(A) (is_species(A, /datum/species/monkey))
+#define isfarwa(A) (is_species(A, /datum/species/monkey/tajaran))
+#define iswolpin(A) (is_species(A, /datum/species/monkey/vulpkanin))
+#define isneara(A) (is_species(A, /datum/species/monkey/skrell))
+#define isstok(A) (is_species(A, /datum/species/monkey/unathi))
+#define isplasmaman(A) (is_species(A, /datum/species/plasmaman))
+#define isshadowperson(A) (is_species(A, /datum/species/shadow))
+#define isskeleton(A) (is_species(A, /datum/species/skeleton))
+#define ishumanbasic(A) (is_species(A, /datum/species/human))
+#define isunathi(A) (is_species(A, /datum/species/unathi))
+#define istajaran(A) (is_species(A, /datum/species/tajaran))
+#define isvulpkanin(A) (is_species(A, /datum/species/vulpkanin))
+#define isskrell(A) (is_species(A, /datum/species/skrell))
+#define isvox(A) (is_species(A, /datum/species/vox))
+#define isvoxarmalis(A) (is_species(A, /datum/species/vox/armalis))
+#define iskidan(A) (is_species(A, /datum/species/kidan))
+#define isslimeperson(A) (is_species(A, /datum/species/slime))
+#define isgrey(A) (is_species(A, /datum/species/grey))
+#define isdiona(A) (is_species(A, /datum/species/diona))
+#define ismachine(A) (is_species(A, /datum/species/machine))
+#define isdrask(A) (is_species(A, /datum/species/drask))
#define isanimal(A) (istype((A), /mob/living/simple_animal))
#define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/corgi))
diff --git a/code/__DEFINES/pipes.dm b/code/__DEFINES/pipes.dm
new file mode 100644
index 00000000000..c855a5e4260
--- /dev/null
+++ b/code/__DEFINES/pipes.dm
@@ -0,0 +1,76 @@
+//Atmospherics pipes
+
+#define PIPE_SIMPLE_STRAIGHT 0
+#define PIPE_SIMPLE_BENT 1
+#define PIPE_HE_STRAIGHT 2
+#define PIPE_HE_BENT 3
+#define PIPE_CONNECTOR 4
+#define PIPE_MANIFOLD 5
+#define PIPE_JUNCTION 6
+#define PIPE_UVENT 7
+#define PIPE_MVALVE 8
+#define PIPE_PUMP 9
+#define PIPE_SCRUBBER 10
+#define PIPE_INSULATED_STRAIGHT 11
+#define PIPE_INSULATED_BENT 12
+#define PIPE_GAS_FILTER 13
+#define PIPE_GAS_MIXER 14
+#define PIPE_PASSIVE_GATE 15
+#define PIPE_VOLUME_PUMP 16
+#define PIPE_HEAT_EXCHANGE 17
+#define PIPE_TVALVE 18
+#define PIPE_MANIFOLD4W 19
+#define PIPE_CAP 20
+#define PIPE_OMNI_MIXER 21
+#define PIPE_OMNI_FILTER 22
+#define PIPE_UNIVERSAL 23
+#define PIPE_SUPPLY_STRAIGHT 24
+#define PIPE_SUPPLY_BENT 25
+#define PIPE_SCRUBBERS_STRAIGHT 26
+#define PIPE_SCRUBBERS_BENT 27
+#define PIPE_SUPPLY_MANIFOLD 28
+#define PIPE_SCRUBBERS_MANIFOLD 29
+#define PIPE_SUPPLY_MANIFOLD4W 30
+#define PIPE_SCRUBBERS_MANIFOLD4W 31
+#define PIPE_SUPPLY_CAP 32
+#define PIPE_SCRUBBERS_CAP 33
+#define PIPE_INJECTOR 34
+#define PIPE_DVALVE 35
+#define PIPE_DP_VENT 36
+#define PIPE_PASV_VENT 37
+#define PIPE_DTVALVE 38
+#define PIPE_CIRCULATOR 39
+#define PIPE_GAS_SENSOR 98
+#define PIPE_METER 99
+
+//Disposals pipes
+
+#define PIPE_DISPOSALS_STRAIGHT 100
+#define PIPE_DISPOSALS_BENT 101
+#define PIPE_DISPOSALS_JUNCTION_RIGHT 102
+#define PIPE_DISPOSALS_JUNCTION_LEFT 103
+#define PIPE_DISPOSALS_Y_JUNCTION 104
+#define PIPE_DISPOSALS_TRUNK 105
+#define PIPE_DISPOSALS_BIN 106
+#define PIPE_DISPOSALS_OUTLET 107
+#define PIPE_DISPOSALS_CHUTE 108
+#define PIPE_DISPOSALS_SORT_RIGHT 109
+#define PIPE_DISPOSALS_SORT_LEFT 110
+
+
+//RPD stuff
+
+#define RPD_ATMOS_MODE 1
+#define RPD_DISPOSALS_MODE 2
+#define RPD_ROTATE_MODE 3
+#define RPD_FLIP_MODE 4
+#define RPD_DELETE_MODE 5
+
+#define RPD_ATMOS_PIPING 1
+#define RPD_SUPPLY_PIPING 2
+#define RPD_SCRUBBERS_PIPING 3
+#define RPD_DEVICES 4
+#define RPD_HEAT_PIPING 5
+
+#define PIPETYPE_ATMOS 1
+#define PIPETYPE_DISPOSAL 2
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index d0e1feb3d62..2a81cca7045 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -50,6 +50,12 @@
init_subtypes(/datum/crafting_recipe, crafting_recipes)
+ //Pipe list building
+ init_subtypes(/datum/pipes, GLOB.construction_pipe_list)
+ for(var/D in GLOB.construction_pipe_list)
+ var/datum/pipes/P = D
+ if(P.rpd_dispensable)
+ GLOB.rpd_pipe_list += list(list("pipe_name" = P.pipe_name, "pipe_id" = P.pipe_id, "pipe_type" = P.pipe_type, "pipe_category" = P.pipe_category, "orientations" = P.orientations, "pipe_icon" = P.pipe_icon, "bendy" = P.bendy))
return 1
/* // Uncomment to debug chemical reaction list.
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 8628e6957cf..3a6e8be62ac 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -373,11 +373,11 @@ This is always put in the attack log.
if(progress)
qdel(progbar)
-/proc/is_species(A, species_name)
+/proc/is_species(A, species_datum)
. = FALSE
if(ishuman(A))
var/mob/living/carbon/human/H = A
- if(H.get_species() == species_name)
+ if(H.dna && istype(H.dna.species, species_datum))
. = TRUE
/proc/spawn_atom_to_turf(spawn_type, target, amount, admin_spawn=FALSE, list/extra_args)
diff --git a/code/_globalvars/lists/names.dm b/code/_globalvars/lists/names.dm
index 959c930bbf1..f403695b0f6 100644
--- a/code/_globalvars/lists/names.dm
+++ b/code/_globalvars/lists/names.dm
@@ -9,7 +9,6 @@ var/list/first_names_female = file2list("config/names/first_female.txt")
var/list/last_names = file2list("config/names/last.txt")
var/list/clown_names = file2list("config/names/clown.txt")
var/list/mime_names = file2list("config/names/mime.txt")
-var/list/diona_names = file2list ("config/names/diona.txt")
var/list/verbs = file2list("config/names/verbs.txt")
var/list/adjectives = file2list("config/names/adjectives.txt")
diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm
index 5a025702877..82d4c113997 100644
--- a/code/_globalvars/lists/objects.dm
+++ b/code/_globalvars/lists/objects.dm
@@ -43,4 +43,4 @@ var/global/list/meteor_list = list() //list of all meteors
var/global/list/poi_list = list() //list of points of interest for observe/follow
var/global/list/active_jammers = list() // List of active radio jammers
-var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
\ No newline at end of file
+var/global/list/active_diseases = list() //List of Active disease in all mobs; purely for quick referencing.
diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm
index bf481d4e747..0299a7ec2fc 100644
--- a/code/_onclick/item_attack.dm
+++ b/code/_onclick/item_attack.dm
@@ -17,7 +17,7 @@
return SendSignal(COMSIG_PARENT_ATTACKBY, W, user, params)
/obj/attackby(obj/item/I, mob/living/user, params)
- return ..() || I.attack_obj(src, user)
+ return ..() || (can_be_hit && I.attack_obj(src, user))
/mob/living/attackby(obj/item/I, mob/living/user, params)
user.changeNext_move(CLICK_CD_MELEE)
@@ -43,7 +43,7 @@
else
return 1
- if(isscrewdriver(src) && M.get_species() == "Machine")
+ if(isscrewdriver(src) && ismachine(M))
if(!attempt_initiate_surgery(src, M, user))
return 0
else
diff --git a/code/controllers/communications.dm b/code/controllers/communications.dm
index 9b056472bde..177e670d6c9 100644
--- a/code/controllers/communications.dm
+++ b/code/controllers/communications.dm
@@ -351,7 +351,7 @@ var/global/datum/controller/radio/radio_controller
/datum/signal/proc/get_race(mob/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- . = H.species.name
+ . = H.dna.species.name
else if(isbrain(M))
var/mob/living/carbon/brain/B = M
. = B.get_race()
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 1a22131d55f..4fc2522ce65 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -280,7 +280,7 @@ var/record_id_num = 1001
G.fields["p_stat"] = "Active"
G.fields["m_stat"] = "Stable"
G.fields["sex"] = capitalize(H.gender)
- G.fields["species"] = H.get_species()
+ G.fields["species"] = H.dna.species.name
G.fields["photo"] = get_id_photo(H)
G.fields["photo-south"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = SOUTH))]'"
G.fields["photo-west"] = "'data:image/png;base64,[icon2base64(icon(G.fields["photo"], dir = WEST))]'"
@@ -357,7 +357,7 @@ var/record_id_num = 1001
temp = new /icon(icobase, "groin_[g]")
preview_icon.Blend(temp, ICON_OVERLAY)
var/head = "head"
- if(head_organ.alt_head && head_organ.species.bodyflags & HAS_ALT_HEADS)
+ if(head_organ.alt_head && head_organ.dna.species.bodyflags & HAS_ALT_HEADS)
var/datum/sprite_accessory/alt_heads/alternate_head = alt_heads_list[head_organ.alt_head]
if(alternate_head.icon_state)
head = alternate_head.icon_state
@@ -368,7 +368,7 @@ var/record_id_num = 1001
if(H.body_accessory && istype(H.body_accessory, /datum/body_accessory/tail))
temp = new/icon("icon" = H.body_accessory.icon, "icon_state" = H.body_accessory.icon_state)
preview_icon.Blend(temp, ICON_OVERLAY)
- else if(H.tail && H.species.bodyflags & HAS_TAIL)
+ else if(H.tail && H.dna.species.bodyflags & HAS_TAIL)
temp = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[H.tail]_s")
preview_icon.Blend(temp, ICON_OVERLAY)
@@ -376,19 +376,19 @@ var/record_id_num = 1001
preview_icon.Blend(E.get_icon(), ICON_OVERLAY)
// Skin tone
- if(H.species.bodyflags & HAS_SKIN_TONE)
+ if(H.dna.species.bodyflags & HAS_SKIN_TONE)
if(H.s_tone >= 0)
preview_icon.Blend(rgb(H.s_tone, H.s_tone, H.s_tone), ICON_ADD)
else
preview_icon.Blend(rgb(-H.s_tone, -H.s_tone, -H.s_tone), ICON_SUBTRACT)
// Proper Skin color - Fix, you can't have HAS_SKIN_TONE *and* HAS_SKIN_COLOR
- if(H.species.bodyflags & HAS_SKIN_COLOR)
+ if(H.dna.species.bodyflags & HAS_SKIN_COLOR)
preview_icon.Blend(H.skin_colour, ICON_ADD)
//Tail Markings
var/icon/t_marking_s
- if(H.species.bodyflags & HAS_TAIL_MARKINGS)
+ if(H.dna.species.bodyflags & HAS_TAIL_MARKINGS)
var/tail_marking = H.m_styles["tail"]
var/datum/sprite_accessory/tail_marking_style = marking_styles_list[tail_marking]
if(tail_marking_style && tail_marking_style.species_allowed)
@@ -398,8 +398,8 @@ var/record_id_num = 1001
preview_icon.Blend(t_marking_s, ICON_OVERLAY)
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
- if(!(H.species.bodyflags & NO_EYES))
- var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.species ? H.species.eyes : "eyes_s")
+ if(!(H.dna.species.bodyflags & NO_EYES))
+ var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = H.dna.species ? H.dna.species.eyes : "eyes_s")
if(!eyes_organ)
return
eyes_s.Blend(eyes_organ.eye_colour, ICON_ADD)
@@ -410,7 +410,7 @@ var/record_id_num = 1001
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
// I'll want to make a species-specific proc for this sooner or later
// But this'll do for now
- if(head_organ.species.name == "Slime People")
+ if(istype(head_organ.dna.species, /datum/species/slime))
hair_s.Blend("[H.skin_colour]A0", ICON_AND) //A0 = 160 alpha.
else
hair_s.Blend(head_organ.hair_colour, ICON_ADD)
@@ -424,7 +424,7 @@ var/record_id_num = 1001
face_s.Blend(hair_s, ICON_OVERLAY)
//Head Accessory
- if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+ if(head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style]
if(head_accessory_style && head_accessory_style.species_allowed)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
@@ -434,7 +434,7 @@ var/record_id_num = 1001
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
if(facial_hair_style && facial_hair_style.species_allowed)
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(head_organ.species.name == "Slime People")
+ if(istype(head_organ.dna.species, /datum/species/slime))
facial_s.Blend("[H.skin_colour]A0", ICON_ADD) //A0 = 160 alpha.
else
facial_s.Blend(head_organ.facial_colour, ICON_ADD)
@@ -448,15 +448,15 @@ var/record_id_num = 1001
face_s.Blend(facial_s, ICON_OVERLAY)
//Markings
- if((H.species.bodyflags & HAS_HEAD_MARKINGS) || (H.species.bodyflags & HAS_BODY_MARKINGS))
- if(H.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
+ if((H.dna.species.bodyflags & HAS_HEAD_MARKINGS) || (H.dna.species.bodyflags & HAS_BODY_MARKINGS))
+ if(H.dna.species.bodyflags & HAS_BODY_MARKINGS) //Body markings.
var/body_marking = H.m_styles["body"]
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
if(body_marking_style && body_marking_style.species_allowed)
var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
b_marking_s.Blend(H.m_colours["body"], ICON_ADD)
face_s.Blend(b_marking_s, ICON_OVERLAY)
- if(H.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
+ if(H.dna.species.bodyflags & HAS_HEAD_MARKINGS) //Head markings.
var/head_marking = H.m_styles["head"]
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
if(head_marking_style && head_marking_style.species_allowed)
@@ -615,7 +615,7 @@ var/record_id_num = 1001
temp.Shift(EAST, H.body_accessory.pixel_x_offset)
if(H.body_accessory.pixel_y_offset)
temp.Shift(NORTH, H.body_accessory.pixel_y_offset)
- if(H.species.bodyflags & HAS_SKIN_COLOR)
+ if(H.dna.species.bodyflags & HAS_SKIN_COLOR)
temp.Blend(H.skin_colour, H.body_accessory.blend_mode)
if(t_marking_s)
temp.Blend(t_marking_s, ICON_OVERLAY)
diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm
index 9526a3e671a..18d80b40e21 100644
--- a/code/datums/datumvars.dm
+++ b/code/datums/datumvars.dm
@@ -781,6 +781,30 @@
log_admin("[key_name(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)")
message_admins("[key_name_admin(usr)] deleted all objects of type or subtype of [O_type] ([i] objects deleted)")
+ else if(href_list["makespeedy"])
+ if(!check_rights(R_DEBUG|R_ADMIN))
+ return
+ var/obj/A = locateUID(href_list["makespeedy"])
+ if(!istype(A))
+ return
+ A.var_edited = TRUE
+ A.makeSpeedProcess()
+ log_admin("[key_name(usr)] has made [A] speed process")
+ message_admins("[key_name(usr)] has made [A] speed process")
+ return TRUE
+
+ else if(href_list["makenormalspeed"])
+ if(!check_rights(R_DEBUG|R_ADMIN))
+ return
+ var/obj/A = locateUID(href_list["makenormalspeed"])
+ if(!istype(A))
+ return
+ A.var_edited = TRUE
+ A.makeNormalProcess()
+ log_admin("[key_name(usr)] has made [A] process normally")
+ message_admins("[key_name(usr)] has made [A] process normally")
+ return TRUE
+
else if(href_list["addreagent"]) /* Made on /TG/, credit to them. */
if(!check_rights(R_DEBUG|R_ADMIN)) return
@@ -992,8 +1016,9 @@
to_chat(usr, "Mob doesn't exist anymore")
return
- if(H.set_species(new_species))
- to_chat(usr, "Set species of [H] to [H.species].")
+ var/datum/species/S = all_species[new_species]
+ if(H.set_species(S.type))
+ to_chat(usr, "Set species of [H] to [H.dna.species].")
H.regenerate_icons()
message_admins("[key_name_admin(usr)] has changed the species of [key_name_admin(H)] to [new_species]")
log_admin("[key_name(usr)] has changed the species of [key_name(H)] to [new_species]")
@@ -1327,4 +1352,4 @@
if(href_list["listrefresh"])
debug_variables(locate(href_list["listrefresh"]))
- return TRUE
\ No newline at end of file
+ return TRUE
diff --git a/code/datums/diseases/_MobProcs.dm b/code/datums/diseases/_MobProcs.dm
index e39a592bc3b..1bbba44f78b 100644
--- a/code/datums/diseases/_MobProcs.dm
+++ b/code/datums/diseases/_MobProcs.dm
@@ -134,7 +134,7 @@
/mob/living/carbon/human/CanContractDisease(datum/disease/D)
- if((VIRUSIMMUNE in species.species_traits) && !D.bypasses_immunity)
+ if((VIRUSIMMUNE in dna.species.species_traits) && !D.bypasses_immunity)
return 0
for(var/thing in D.required_organs)
if(!((locate(thing) in bodyparts) || (locate(thing) in internal_organs)))
diff --git a/code/datums/diseases/advance/symptoms/voice_change.dm b/code/datums/diseases/advance/symptoms/voice_change.dm
index 8a90b848f22..8ba3ed64008 100644
--- a/code/datums/diseases/advance/symptoms/voice_change.dm
+++ b/code/datums/diseases/advance/symptoms/voice_change.dm
@@ -36,7 +36,7 @@ Bonus
else
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.SetSpecialVoice(H.species.get_random_name(H.gender))
+ H.SetSpecialVoice(H.dna.species.get_random_name(H.gender))
return
diff --git a/code/datums/diseases/kingstons.dm b/code/datums/diseases/kingstons.dm
index abad7dcf720..260f01e0301 100644
--- a/code/datums/diseases/kingstons.dm
+++ b/code/datums/diseases/kingstons.dm
@@ -16,26 +16,26 @@
switch(stage)
if(1)
if(prob(10))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
to_chat(affected_mob, "You feel good.")
else
to_chat(affected_mob, "You feel like playing with string.")
if(2)
if(prob(10))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
to_chat(affected_mob, "Something in your throat itches.")
else
to_chat(affected_mob, "You NEED to find a mouse.")
if(3)
if(prob(10))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
to_chat(affected_mob, "You feel something in your throat!")
affected_mob.emote("cough")
else
affected_mob.say(pick(list("Mew", "Meow!", "Nya!~")))
if(4)
if(prob(5))
- if(affected_mob.get_species() == "Tajaran")
+ if(istajaran(affected_mob))
affected_mob.visible_message("[affected_mob] coughs up a hairball!", \
"You cough up a hairball!")
affected_mob.Stun(5)
@@ -43,7 +43,7 @@
affected_mob.visible_message("[affected_mob]'s form contorts into something more feline!", \
"YOU TURN INTO A TAJARAN!")
var/mob/living/carbon/human/catface = affected_mob
- catface.set_species("Tajaran")
+ catface.set_species(/datum/species/tajaran)
/datum/disease/kingstons/advanced
@@ -57,9 +57,9 @@
permeability_mod = 0.75
desc = "If left untreated the subject will mutate to a different species."
severity = BIOHAZARD
- var/list/virspecies = list("Human", "Tajaran", "Unathi", "Skrell", "Vulpkanin")//no karma races sorrys.
+ var/list/virspecies = list(/datum/species/human, /datum/species/tajaran, /datum/species/unathi,/datum/species/skrell, /datum/species/vulpkanin) //no karma races sorrys.
var/list/virsuffix = list("pox", "rot", "flu", "cough", "-gitis", "cold", "rash", "itch", "decay")
- var/chosentype
+ var/datum/species/chosentype
var/chosensuff
/datum/disease/kingstons/advanced/New()
@@ -70,26 +70,27 @@
/datum/disease/kingstons/advanced/stage_act()
..()
- switch(stage)
- if(1)
- if(prob(10))
- to_chat(affected_mob, "You feel awkward.")
- if(2)
- if(prob(10))
- to_chat(affected_mob, "You itch.")
- if(3)
- if(prob(10))
- to_chat(affected_mob, "Your skin starts to flake!")
+ if(ishuman(affected_mob))
+ var/mob/living/carbon/human/twisted = affected_mob
+ switch(stage)
+ if(1)
+ if(prob(10))
+ to_chat(twisted, "You feel awkward.")
+ if(2)
+ if(prob(10))
+ to_chat(twisted, "You itch.")
+ if(3)
+ if(prob(10))
+ to_chat(twisted, "Your skin starts to flake!")
- if(4)
- if(prob(5))
- if(affected_mob.get_species() != chosentype)
- affected_mob.visible_message("[affected_mob]'s skin splits and form contorts!", \
- "Your body mutates into a [chosentype]!")
- var/mob/living/carbon/human/twisted = affected_mob
- twisted.set_species(chosentype)
- else
- affected_mob.visible_message("[affected_mob] scratches at thier skin!", \
- "You scratch your skin to try not to itch!")
- affected_mob.adjustBruteLoss(-5)
- affected_mob.adjustStaminaLoss(5)
\ No newline at end of file
+ if(4)
+ if(prob(5))
+ if(!istype(twisted.dna.species, chosentype))
+ twisted.visible_message("[twisted]'s skin splits and form contorts!", \
+ "Your body mutates into a [initial(chosentype.name)]!")
+ twisted.set_species(chosentype)
+ else
+ twisted.visible_message("[twisted] scratches at thier skin!", \
+ "You scratch your skin to try not to itch!")
+ twisted.adjustBruteLoss(-5)
+ twisted.adjustStaminaLoss(5)
\ No newline at end of file
diff --git a/code/datums/diseases/transformation.dm b/code/datums/diseases/transformation.dm
index 5546efe537e..444b4838319 100644
--- a/code/datums/diseases/transformation.dm
+++ b/code/datums/diseases/transformation.dm
@@ -194,13 +194,13 @@
if(1)
if(ishuman(affected_mob))
var/mob/living/carbon/human/H = affected_mob
- if(H.species.name == "Slime People")
+ if(isslimeperson(H))
stage = 5
if(3)
if(ishuman(affected_mob))
var/mob/living/carbon/human/human = affected_mob
- if(human.species.name != "Slime People")
- human.set_species("Slime People")
+ if(!isslimeperson(human))
+ human.set_species(/datum/species/slime)
/datum/disease/transformation/corgi
name = "The Barkening"
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 3f62c8ffaed..0e8d655c546 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -61,7 +61,6 @@
var/linglink
var/datum/vampire/vampire //vampire holder
var/datum/nations/nation //nation holder
- var/datum/abductor/abductor //abductor holder
var/antag_hud_icon_state = null //this mind's ANTAG_HUD should have this icon_state
var/datum/atom_hud/antag/antag_hud = null //this mind's antag HUD
@@ -1132,14 +1131,17 @@
log_admin("[key_name(usr)] turned [current] into abductor.")
ticker.mode.update_abductor_icons_added(src)
if("equip")
+ if(!ishuman(current))
+ to_chat(usr, "This only works on humans!")
+ return
+
+ var/mob/living/carbon/human/H = current
var/gear = alert("Agent or Scientist Gear","Gear","Agent","Scientist")
if(gear)
- var/datum/game_mode/abduction/temp = new
- temp.equip_common(current)
if(gear=="Agent")
- temp.equip_agent(current)
+ H.equipOutfit(/datum/outfit/abductor/agent)
else
- temp.equip_scientist(current)
+ H.equipOutfit(/datum/outfit/abductor/scientist)
else if(href_list["silicon"])
switch(href_list["silicon"])
@@ -1424,36 +1426,32 @@
var/mob/living/carbon/human/H = current
- H.set_species("Abductor")
+ H.set_species(/datum/species/abductor)
+ var/datum/species/abductor/S = H.dna.species
- switch(role)
- if("Agent")
- H.mind.abductor.agent = 1
- if("Scientist")
- H.mind.abductor.scientist = 1
- H.mind.abductor.team = team
+ if(role == "Scientist")
+ S.scientist = TRUE
+
+ S.team = team
var/list/obj/effect/landmark/abductor/agent_landmarks = new
var/list/obj/effect/landmark/abductor/scientist_landmarks = new
agent_landmarks.len = 4
scientist_landmarks.len = 4
for(var/obj/effect/landmark/abductor/A in landmarks_list)
- if(istype(A,/obj/effect/landmark/abductor/agent))
+ if(istype(A, /obj/effect/landmark/abductor/agent))
agent_landmarks[text2num(A.team)] = A
- else if(istype(A,/obj/effect/landmark/abductor/scientist))
+ else if(istype(A, /obj/effect/landmark/abductor/scientist))
scientist_landmarks[text2num(A.team)] = A
var/obj/effect/landmark/L
- if(teleport=="Yes")
+ if(teleport == "Yes")
switch(role)
if("Agent")
- H.mind.abductor.agent = 1
L = agent_landmarks[team]
- H.loc = L.loc
if("Scientist")
- H.mind.abductor.scientist = 1
L = agent_landmarks[team]
- H.loc = L.loc
+ H.forceMove(L.loc)
// check whether this mind's mob has been brigged for the given duration
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index b31084aee9f..edb254203bf 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -371,7 +371,7 @@
)
/datum/outfit/admin/vox/equip(mob/living/carbon/human/H, visualsOnly = FALSE)
- if(H.get_species() == "Vox Armalis")
+ if(isvoxarmalis(H))
. = ..()
else
H.equip_vox_raider()
diff --git a/code/datums/pipe_datums.dm b/code/datums/pipe_datums.dm
new file mode 100644
index 00000000000..cf2ec79fe85
--- /dev/null
+++ b/code/datums/pipe_datums.dm
@@ -0,0 +1,390 @@
+GLOBAL_LIST_EMPTY(construction_pipe_list) //List of all pipe datums
+GLOBAL_LIST_EMPTY(rpd_pipe_list) //Some pipes we don't want to be dispensable by the RPD, so we have a separate thing
+
+/datum/pipes
+ var/pipe_name //What the pipe is called in the interface
+ var/pipe_id //Use the pipe define for this
+ var/pipe_type //Atmos, disposals etc.
+ var/pipe_category //What category of pipe
+ var/bendy = FALSE //Is this pipe bendy?
+ var/orientations //Number of orientations (for interface purposes)
+ var/pipe_icon //icon_state of the dispensed pipe (for interface purposes)
+ var/rpd_dispensable = FALSE
+
+/datum/pipes/atmospheric
+ pipe_type = PIPETYPE_ATMOS
+ pipe_category = PIPETYPE_ATMOS
+
+/datum/pipes/disposal
+ pipe_type = PIPETYPE_DISPOSAL
+
+//Normal pipes
+
+/datum/pipes/atmospheric/simple
+ pipe_name = "straight pipe"
+ pipe_id = PIPE_SIMPLE_STRAIGHT
+ orientations = 2
+ pipe_icon = "simple"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/bent //Why is this not atmospheric/simple/bent you ask? Because otherwise the ordering of the pipes in the UI menu gets weird
+ pipe_name = "bent pipe"
+ pipe_id = PIPE_SIMPLE_BENT
+ orientations = 4
+ bendy = TRUE
+ pipe_icon = "simple"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/manifold
+ pipe_name = "t-manifold"
+ pipe_id = PIPE_MANIFOLD
+ orientations = 4
+ pipe_icon = "manifold"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/manifold4w
+ pipe_name = "4-way manifold"
+ pipe_id = PIPE_MANIFOLD4W
+ orientations = 1
+ pipe_icon = "manifold4w"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/cap
+ pipe_name = "pipe cap"
+ pipe_id = PIPE_CAP
+ orientations = 4
+ pipe_icon = "cap"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/valve
+ pipe_name = "manual valve"
+ pipe_id = PIPE_MVALVE
+ orientations = 2
+ pipe_icon = "mvalve"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/valve/digital
+ pipe_name = "digital valve"
+ pipe_id = PIPE_DVALVE
+ pipe_icon = "dvalve"
+
+/datum/pipes/atmospheric/tvalve
+ pipe_name = "manual t-valve"
+ pipe_id = PIPE_TVALVE
+ orientations = 4
+ pipe_icon = "tvalve"
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/tvalve/digital
+ pipe_name = "digital t-valve"
+ pipe_id = PIPE_DTVALVE
+ pipe_icon = "dtvalve"
+
+//Supply pipes
+
+/datum/pipes/atmospheric/simple/supply
+ pipe_name = "straight supply pipe"
+ pipe_id = PIPE_SUPPLY_STRAIGHT
+ pipe_category = RPD_SUPPLY_PIPING
+
+/datum/pipes/atmospheric/bent/supply
+ pipe_name = "bent supply pipe"
+ pipe_id = PIPE_SUPPLY_BENT
+ pipe_category = RPD_SUPPLY_PIPING
+
+/datum/pipes/atmospheric/manifold/supply
+ pipe_name = "supply T-manifold"
+ pipe_id = PIPE_SUPPLY_MANIFOLD
+ pipe_category = RPD_SUPPLY_PIPING
+
+/datum/pipes/atmospheric/manifold4w/supply
+ pipe_name = "4-way supply manifold"
+ pipe_id = PIPE_SUPPLY_MANIFOLD4W
+ pipe_category = RPD_SUPPLY_PIPING
+
+/datum/pipes/atmospheric/cap/supply
+ pipe_name = "supply pipe cap"
+ pipe_id = PIPE_SUPPLY_CAP
+ pipe_category = RPD_SUPPLY_PIPING
+
+//Scrubbers pipes
+
+/datum/pipes/atmospheric/simple/scrubbers
+ pipe_name = "straight scrubbers pipe"
+ pipe_id = PIPE_SCRUBBERS_STRAIGHT
+ pipe_category = RPD_SCRUBBERS_PIPING
+
+/datum/pipes/atmospheric/bent/scrubbers
+ pipe_name = "bent scrubbers pipe"
+ pipe_id = PIPE_SCRUBBERS_BENT
+ pipe_category = RPD_SCRUBBERS_PIPING
+
+/datum/pipes/atmospheric/manifold/scrubbers
+ pipe_name = "scrubbers t-manifold"
+ pipe_id = PIPE_SCRUBBERS_MANIFOLD
+ pipe_category = RPD_SCRUBBERS_PIPING
+
+/datum/pipes/atmospheric/manifold4w/scrubbers
+ pipe_name = "4-way scrubbers manifold"
+ pipe_id = PIPE_SCRUBBERS_MANIFOLD4W
+ pipe_category = RPD_SCRUBBERS_PIPING
+
+/datum/pipes/atmospheric/cap/scrubbers
+ pipe_name = "scrubbers pipe cap"
+ pipe_id = PIPE_SCRUBBERS_CAP
+ pipe_category = RPD_SCRUBBERS_PIPING
+
+//Devices
+
+/datum/pipes/atmospheric/upa
+ pipe_name = "universal pipe adapter"
+ pipe_id = PIPE_UNIVERSAL
+ orientations = 2
+ pipe_icon = "universal"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/connector
+ pipe_name = "connector"
+ pipe_id = PIPE_CONNECTOR
+ orientations = 4
+ pipe_icon = "connector"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/unaryvent
+ pipe_name = "unary vent"
+ pipe_id = PIPE_UVENT
+ orientations = 4
+ pipe_icon = "uvent"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/scrubber
+ pipe_name = "scrubber"
+ pipe_id = PIPE_SCRUBBER
+ orientations = 4
+ pipe_icon = "scrubber"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/pump
+ pipe_name = "pump"
+ pipe_id = PIPE_PUMP
+ orientations = 4
+ pipe_icon = "pump"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/volume_pump
+ pipe_name = "volume pump"
+ pipe_id = PIPE_VOLUME_PUMP
+ orientations = 4
+ pipe_icon = "volumepump"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/gate
+ pipe_name = "passive gate"
+ pipe_id = PIPE_PASSIVE_GATE
+ orientations = 4
+ pipe_icon = "passivegate"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/filter
+ pipe_name = "gas filter"
+ pipe_id = PIPE_GAS_FILTER
+ orientations = 4
+ pipe_icon = "filter"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/mixer
+ pipe_name = "gas mixer"
+ pipe_id = PIPE_GAS_MIXER
+ orientations = 4
+ pipe_icon = "mixer"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/sensor
+ pipe_name = "gas sensor"
+ pipe_id = PIPE_GAS_SENSOR
+ orientations = 1
+ pipe_icon = "sensor"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/meter
+ pipe_name = "meter"
+ pipe_id = PIPE_METER
+ orientations = 1
+ pipe_icon = "meter"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/passive_vent
+ pipe_name = "passive vent"
+ pipe_id = PIPE_PASV_VENT
+ orientations = 4
+ pipe_icon = "passive vent"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/dual_vent_pump
+ pipe_name = "dual-port vent pump"
+ pipe_id = PIPE_DP_VENT
+ orientations = 2
+ pipe_icon = "dual-port vent"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/injector
+ pipe_name = "air injector"
+ pipe_id = PIPE_INJECTOR
+ orientations = 4
+ pipe_icon = "injector"
+ pipe_category = RPD_DEVICES
+ rpd_dispensable = TRUE
+
+//Heat exchange pipes
+
+/datum/pipes/atmospheric/simple/he
+ pipe_name = "straight h/e pipe"
+ pipe_id = PIPE_HE_STRAIGHT
+ pipe_icon = "he"
+ pipe_category = RPD_HEAT_PIPING
+
+/datum/pipes/atmospheric/bent/he
+ pipe_name = "bent h/e pipe"
+ pipe_id = PIPE_HE_BENT
+ pipe_icon = "he"
+ bendy = TRUE
+ pipe_category = RPD_HEAT_PIPING
+
+/datum/pipes/atmospheric/he_junction
+ pipe_name = "junction"
+ pipe_id = PIPE_JUNCTION
+ orientations = 4
+ pipe_icon = "junction"
+ pipe_category = RPD_HEAT_PIPING
+ rpd_dispensable = TRUE
+
+/datum/pipes/atmospheric/heat_exchanger
+ pipe_name = "heat exchanger"
+ pipe_id = PIPE_HEAT_EXCHANGE
+ orientations = 4
+ pipe_icon = "heunary"
+ pipe_category = RPD_HEAT_PIPING
+ rpd_dispensable = TRUE
+
+//DISPOSALS PIPES
+
+/datum/pipes/disposal/straight
+ pipe_name = "straight disposals pipe"
+ pipe_id = PIPE_DISPOSALS_STRAIGHT
+ orientations = 2
+ pipe_icon = "pipe-s"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/bent
+ pipe_name = "bent disposals pipe"
+ pipe_id = PIPE_DISPOSALS_BENT
+ orientations = 4
+ pipe_icon = "pipe-c"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/junction
+ pipe_name = "disposals junction"
+ pipe_id = PIPE_DISPOSALS_JUNCTION_RIGHT
+ orientations = 4
+ pipe_icon = "pipe-j1"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/y_junction
+ pipe_name = "disposals y-junction"
+ pipe_id = PIPE_DISPOSALS_Y_JUNCTION
+ orientations = 4
+ pipe_icon = "pipe-y"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/trunk
+ pipe_name = "disposals trunk"
+ pipe_id = PIPE_DISPOSALS_TRUNK
+ orientations = 4
+ pipe_icon = "pipe-t"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/bin
+ pipe_name = "disposals pipe bin"
+ pipe_id = PIPE_DISPOSALS_BIN
+ orientations = 1
+ pipe_icon = "disposal"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/outlet
+ pipe_name = "disposals outlet"
+ pipe_id = PIPE_DISPOSALS_OUTLET
+ orientations = 4
+ pipe_icon = "outlet"
+ rpd_dispensable = TRUE
+
+/datum/pipes/disposal/chute
+ pipe_name = "disposals chute"
+ pipe_id = PIPE_DISPOSALS_CHUTE
+ orientations = 4
+ pipe_icon = "intake"
+ rpd_dispensable = TRUE
+
+//Pipes the RPD can't dispense. Since these don't use an interface, we don't need to bother with setting an icon. We do, however, want to name these for other purposes
+
+/datum/pipes/atmospheric/circulator
+ pipe_name = "circulator / heat exchanger"
+ pipe_id = PIPE_CIRCULATOR
+ pipe_icon = "circ"
+
+/datum/pipes/atmospheric/omni_filter
+ pipe_name = "omni filter"
+ pipe_id = PIPE_OMNI_FILTER
+ pipe_icon = "omni_filter"
+
+/datum/pipes/atmospheric/omni_mixer
+ pipe_name = "omni mixer"
+ pipe_id = PIPE_OMNI_MIXER
+ pipe_icon = "omni_mixer"
+
+/datum/pipes/atmospheric/insulated
+ pipe_name = "insulated pipe"
+ pipe_id = PIPE_INSULATED_STRAIGHT
+ pipe_icon = "insulated"
+
+/datum/pipes/atmospheric/insulated/bent
+ pipe_name = "bent insulated pipe"
+ pipe_id = PIPE_INSULATED_BENT
+
+/datum/pipes/disposal/sortjunction
+ pipe_name = "disposals sort junction"
+ pipe_id = PIPE_DISPOSALS_SORT_RIGHT
+ pipe_icon = "pipe-j1s"
+
+/datum/pipes/disposal/sortjunction/left
+ pipe_id = PIPE_DISPOSALS_SORT_LEFT
+ pipe_icon = "pipe-j2s"
+
+/datum/pipes/disposal/left_junction
+ pipe_name = "disposals junction"
+ pipe_id = PIPE_DISPOSALS_JUNCTION_LEFT
+ pipe_icon = "pipe-j2"
+
+/proc/get_pipe_name(var/pipe_id, var/pipe_type)
+ for(var/datum/pipes/P in GLOB.construction_pipe_list)
+ if(P.pipe_id == pipe_id && P.pipe_type == pipe_type)
+ return P.pipe_name
+ return "unknown pipe"
+
+/proc/get_pipe_icon(var/pipe_id)
+ for(var/datum/pipes/P in GLOB.construction_pipe_list)
+ if(P.pipe_id == pipe_id)
+ return P.pipe_icon
+ return "unknown icon"
diff --git a/code/datums/spells/lichdom.dm b/code/datums/spells/lichdom.dm
index 84c3a552c03..f1744e22550 100644
--- a/code/datums/spells/lichdom.dm
+++ b/code/datums/spells/lichdom.dm
@@ -68,7 +68,7 @@
lich.real_name = M.mind.name
M.mind.transfer_to(lich)
- lich.set_species("Skeleton")
+ lich.set_species(/datum/species/skeleton)
to_chat(lich, "Your bones clatter and shutter as they're pulled back into this world!")
charge_max += 600
var/mob/old_body = current_body
@@ -122,7 +122,7 @@
current_body = M.mind.current
if(ishuman(M))
var/mob/living/carbon/human/H = M
- H.set_species("Skeleton")
+ H.set_species(/datum/species/skeleton)
H.unEquip(H.wear_suit)
H.unEquip(H.head)
H.unEquip(H.shoes)
diff --git a/code/datums/weather/weather_types/radiation_storm.dm b/code/datums/weather/weather_types/radiation_storm.dm
index acd155e7560..a1c6a83da61 100644
--- a/code/datums/weather/weather_types/radiation_storm.dm
+++ b/code/datums/weather/weather_types/radiation_storm.dm
@@ -34,7 +34,7 @@
if(prob(40))
if(ishuman(L))
var/mob/living/carbon/human/H = L
- if(!(RADIMMUNE in H.species.species_traits))
+ if(!(RADIMMUNE in H.dna.species.species_traits))
if(prob(max(0, 100 - resist)))
randmuti(H) // Applies bad mutation
if(prob(50))
diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm
index ee25f8c3898..609dce59e84 100644
--- a/code/datums/wires/camera.dm
+++ b/code/datums/wires/camera.dm
@@ -3,52 +3,33 @@
/datum/wires/camera
random = 0
holder_type = /obj/machinery/camera
- wire_count = 6
+ wire_count = 2
/datum/wires/camera/get_status()
. = ..()
var/obj/machinery/camera/C = holder
. += "The focus light is [(C.view_range == initial(C.view_range)) ? "on" : "off"]."
. += "The power link light is [C.can_use() ? "on" : "off"]."
- . += "The camera light is [C.light_disabled ? "off" : "on"]."
- . += "The alarm light is [C.alarm_on ? "on" : "off"]."
/datum/wires/camera/CanUse(mob/living/L)
var/obj/machinery/camera/C = holder
if(!C.panel_open)
- return 0
- return 1
+ return FALSE
+ return TRUE
var/const/CAMERA_WIRE_FOCUS = 1
var/const/CAMERA_WIRE_POWER = 2
-var/const/CAMERA_WIRE_LIGHT = 4
-var/const/CAMERA_WIRE_ALARM = 8
-var/const/CAMERA_WIRE_NOTHING1 = 16
-var/const/CAMERA_WIRE_NOTHING2 = 32
/datum/wires/camera/GetWireName(index)
switch(index)
if(CAMERA_WIRE_FOCUS)
return "Focus"
-
+
if(CAMERA_WIRE_POWER)
return "Power"
-
- if(CAMERA_WIRE_LIGHT)
- return "Light"
-
- if(CAMERA_WIRE_ALARM)
- return "Alarm"
-
- if(CAMERA_WIRE_NOTHING1)
- return "Nothing"
-
- if(CAMERA_WIRE_NOTHING2)
- return "Nothing"
/datum/wires/camera/UpdateCut(index, mended)
var/obj/machinery/camera/C = holder
-
switch(index)
if(CAMERA_WIRE_FOCUS)
var/range = (mended ? initial(C.view_range) : C.short_range)
@@ -56,16 +37,8 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
if(CAMERA_WIRE_POWER)
if(C.status && !mended || !C.status && mended)
- C.toggle_cam(usr, 1)
-
- if(CAMERA_WIRE_LIGHT)
- C.light_disabled = !mended
-
- if(CAMERA_WIRE_ALARM)
- if(!mended)
- C.triggerCameraAlarm()
- else
- C.cancelCameraAlarm()
+ C.toggle_cam(usr, TRUE)
+ C.obj_integrity = C.max_integrity //this is a pretty simplistic way to heal the camera, but there's no reason for this to be complex.
..()
/datum/wires/camera/UpdatePulsed(index)
@@ -79,16 +52,10 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
if(CAMERA_WIRE_POWER)
C.toggle_cam(null) // Deactivate the camera
-
- if(CAMERA_WIRE_LIGHT)
- C.light_disabled = !C.light_disabled
-
- if(CAMERA_WIRE_ALARM)
- C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
..()
/datum/wires/camera/proc/CanDeconstruct()
- if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
- return 1
+ if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS))
+ return TRUE
else
- return 0
\ No newline at end of file
+ return FALSE
\ No newline at end of file
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 136c8950028..ea3b9df4f54 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -302,6 +302,9 @@
/atom/proc/emag_act()
return
+/atom/proc/rpd_act()
+ return
+
/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked)
if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...).
addtimer(CALLBACK(src, .proc/hitby_react, AM), 2)
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index f21c2948b01..cba96ded0db 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -99,8 +99,7 @@ var/global/list/bad_blocks[0]
var/b_type = "A+" // Should probably change to an integer => string map but I'm lazy.
var/real_name // Stores the real name of the person who originally got this dna datum. Used primarily for changelings,
- // New stuff
- var/species = "Human"
+ var/datum/species/species = new /datum/species/human //The type of mutant race the player is if applicable (i.e. potato-man)
// Make a copy of this strand.
// USE THIS WHEN COPYING STUFF OR YOU'LL GET CORRUPTION!
@@ -110,7 +109,7 @@ var/global/list/bad_blocks[0]
new_dna.struc_enzymes_original=struc_enzymes_original // will make clone's SE the same as the original, do we want this?
new_dna.b_type=b_type
new_dna.real_name=real_name
- new_dna.species=species
+ new_dna.species = new species.type
for(var/b=1;b<=DNA_SE_LENGTH;b++)
new_dna.SE[b]=SE[b]
if(b<=DNA_UI_LENGTH)
@@ -141,7 +140,7 @@ var/global/list/bad_blocks[0]
// FIXME: Species-specific defaults pls
var/obj/item/organ/external/head/H = character.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
- var/datum/species/S = character.species
+ var/datum/species/S = character.dna.species
/*// Body Accessory
if(!character.body_accessory)
@@ -421,7 +420,7 @@ var/global/list/bad_blocks[0]
data["UE"] = unique_enzymes
data["SE"] = SE.Copy() // This is probably too lazy for my own good
data["UI"] = UI.Copy()
- data["species"] = species // This works because `species` is a string, not a datum
+ data["species"] = species.type
// Because old DNA coders were insane or something
data["b_type"] = b_type
data["real_name"] = real_name
@@ -434,10 +433,7 @@ var/global/list/bad_blocks[0]
UI = data["UI"]
UpdateUI()
UpdateSE()
- species = data["species"]
+ var/datum/species/S = data["species"]
+ species = new S
b_type = data["b_type"]
- real_name = data["real_name"]
-
-// a nice hook for if/when we refactor species on dna
-/datum/dna/proc/get_species_name()
- return species
+ real_name = data["real_name"]
\ No newline at end of file
diff --git a/code/game/dna/dna2_domutcheck.dm b/code/game/dna/dna2_domutcheck.dm
index f2ad2b2fe03..07979f40b7c 100644
--- a/code/game/dna/dna2_domutcheck.dm
+++ b/code/game/dna/dna2_domutcheck.dm
@@ -16,7 +16,7 @@
/proc/genemutcheck(var/mob/living/M, var/block, var/connected=null, var/flags=0)
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
var/mob/living/carbon/human/H = M
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
return
if(!M)
return
@@ -42,7 +42,7 @@
var/defaultgenes // Do not mutate inherent species abilities
if(ishuman(M))
var/mob/living/carbon/human/H = M
- defaultgenes = H.species.default_genes
+ defaultgenes = H.dna.species.default_genes
if((gene in defaultgenes) && gene_active)
return
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index 6c05dfd6f2b..d392ab303ca 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -133,7 +133,7 @@
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/obj/item/organ/internal/eyes/eye_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
- var/datum/species/S = H.species
+ var/datum/species/S = H.dna.species
if(istype(head_organ))
dna.write_head_attributes(head_organ)
if(istype(eye_organ))
diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm
index 93d9977b5e8..354536561c1 100644
--- a/code/game/dna/dna_modifier.dm
+++ b/code/game/dna/dna_modifier.dm
@@ -327,7 +327,7 @@
if(ishuman(occupant))
var/mob/living/carbon/human/H = occupant
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
return 1
var/radiation_protection = occupant.run_armor_check(null, "rad", "Your clothes feel warm.", "Your clothes feel warm.")
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index e59dd3fc558..b39b31a1c5a 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -44,7 +44,7 @@
return 0
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if((RADIMMUNE in H.species.species_traits) && !(flags & MUTCHK_FORCED))
+ if((RADIMMUNE in H.dna.species.species_traits) && !(flags & MUTCHK_FORCED))
return 0
return 1
diff --git a/code/game/dna/genes/monkey.dm b/code/game/dna/genes/monkey.dm
index 666cb057635..d0c32b19620 100644
--- a/code/game/dna/genes/monkey.dm
+++ b/code/game/dna/genes/monkey.dm
@@ -7,8 +7,8 @@
/datum/dna/gene/monkey/can_activate(var/mob/M,var/flags)
return ishuman(M)
-/datum/dna/gene/monkey/activate(var/mob/living/carbon/human/H, var/connected, var/flags)
- if(!istype(H,/mob/living/carbon/human))
+/datum/dna/gene/monkey/activate(mob/living/carbon/human/H, connected, flags)
+ if(!istype(H))
return
if(issmall(H))
return
@@ -24,6 +24,9 @@
H.canmove = 0
H.icon = null
H.invisibility = 101
+ var/has_primitive_form = H.dna.species.primitive_form // cache this
+ if(has_primitive_form)
+ H.set_species(has_primitive_form)
new /obj/effect/temp_visual/monkeyify(H.loc)
sleep(22)
@@ -31,23 +34,24 @@
H.SetStunned(0)
H.invisibility = initial(H.invisibility)
- if(!H.species.primitive_form) //If the creature in question has no primitive set, this is going to be messy.
+ if(!has_primitive_form) //If the pre-change mob in question has no primitive set, this is going to be messy.
H.gib()
return
- H.set_species(H.species.primitive_form)
-
QDEL_NULL(H.hud_used)
if(H.client)
H.hud_used = new /datum/hud/monkey(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha)
+ H.hud_used.show_hud(H.hud_used.hud_version)
- to_chat(H, "You are now a [H.species.name].")
+ to_chat(H, "You are now a [H.dna.species.name].")
return H
-/datum/dna/gene/monkey/deactivate(var/mob/living/carbon/human/H, var/connected, var/flags)
- if(!istype(H,/mob/living/carbon/human))
+/datum/dna/gene/monkey/deactivate(mob/living/carbon/human/H, connected, flags)
+ if(!istype(H))
+ return
+ if(!issmall(H))
return
for(var/obj/item/W in H)
if(W == H.w_uniform) // will be torn
@@ -62,6 +66,9 @@
H.canmove = 0
H.icon = null
H.invisibility = 101
+ var/has_greater_form = H.dna.species.greater_form //cache this
+ if(has_greater_form)
+ H.set_species(has_greater_form)
new /obj/effect/temp_visual/monkeyify/humanify(H.loc)
sleep(22)
@@ -69,11 +76,10 @@
H.SetStunned(0)
H.invisibility = initial(H.invisibility)
- if(!H.species.greater_form) //If the creature in question has no primitive set, this is going to be messy.
+ if(!has_greater_form) //If the pre-change mob in question has no primitive set, this is going to be messy.
H.gib()
return
- H.set_species(H.species.greater_form)
H.real_name = H.dna.real_name
H.name = H.real_name
@@ -81,7 +87,8 @@
if(H.client)
H.hud_used = new /datum/hud/human(H, ui_style2icon(H.client.prefs.UI_style), H.client.prefs.UI_style_color, H.client.prefs.UI_style_alpha)
+ H.hud_used.show_hud(H.hud_used.hud_version)
- to_chat(H, "You are now a [H.species.name].")
+ to_chat(H, "You are now a [H.dna.species.name].")
return H
diff --git a/code/game/dna/genes/powers.dm b/code/game/dna/genes/powers.dm
index e9d69c2b904..1e5e6b66842 100644
--- a/code/game/dna/genes/powers.dm
+++ b/code/game/dna/genes/powers.dm
@@ -39,7 +39,7 @@
return 0
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.species && H.species.slowdown && !(flags & MUTCHK_FORCED))
+ if(H.dna.species && H.dna.species.slowdown && !(flags & MUTCHK_FORCED))
return 0
return 1
diff --git a/code/game/dna/genes/vg_powers.dm b/code/game/dna/genes/vg_powers.dm
index 3e709560a45..f9e8620bef1 100644
--- a/code/game/dna/genes/vg_powers.dm
+++ b/code/game/dna/genes/vg_powers.dm
@@ -50,7 +50,7 @@
M.change_eye_color(new_eyes)
//Alt heads.
- if(head_organ.species.bodyflags & HAS_ALT_HEADS)
+ if(head_organ.dna.species.bodyflags & HAS_ALT_HEADS)
var/list/valid_alt_heads = M.generate_valid_alt_heads()
var/new_alt_head = input("Please select alternate head", "Character Generation", head_organ.alt_head) as null|anything in valid_alt_heads
if(new_alt_head)
@@ -92,7 +92,7 @@
M.change_facial_hair_color(new_facial, 1)
//Head accessory.
- if(head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+ if(head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
var/list/valid_head_accessories = M.generate_valid_head_accessories()
var/new_head_accessory = input("Please select head accessory style", "Character Generation", head_organ.ha_style) as null|anything in valid_head_accessories
if(new_head_accessory)
@@ -103,7 +103,7 @@
M.change_head_accessory_color(new_head_accessory_colour)
//Body accessory.
- if(M.species.tail && M.species.bodyflags & HAS_TAIL)
+ if(M.dna.species.tail && M.dna.species.bodyflags & HAS_TAIL)
var/list/valid_body_accessories = M.generate_valid_body_accessories()
if(valid_body_accessories.len > 1) //By default valid_body_accessories will always have at the very least a 'none' entry populating the list, even if the user's species is not present in any of the list items.
var/new_body_accessory = input("Please select body accessory style", "Character Generation", M.body_accessory) as null|anything in valid_body_accessories
@@ -111,7 +111,7 @@
M.change_body_accessory(new_body_accessory)
//Head markings.
- if(M.species.bodyflags & HAS_HEAD_MARKINGS)
+ if(M.dna.species.bodyflags & HAS_HEAD_MARKINGS)
var/list/valid_head_markings = M.generate_valid_markings("head")
var/new_marking = input("Please select head marking style", "Character Generation", M.m_styles["head"]) as null|anything in valid_head_markings
if(new_marking)
@@ -121,7 +121,7 @@
if(new_marking_colour)
M.change_marking_color(new_marking_colour, "head")
//Body markings.
- if(M.species.bodyflags & HAS_BODY_MARKINGS)
+ if(M.dna.species.bodyflags & HAS_BODY_MARKINGS)
var/list/valid_body_markings = M.generate_valid_markings("body")
var/new_marking = input("Please select body marking style", "Character Generation", M.m_styles["body"]) as null|anything in valid_body_markings
if(new_marking)
@@ -131,7 +131,7 @@
if(new_marking_colour)
M.change_marking_color(new_marking_colour, "body")
//Tail markings.
- if(M.species.bodyflags & HAS_TAIL_MARKINGS)
+ if(M.dna.species.bodyflags & HAS_TAIL_MARKINGS)
var/list/valid_tail_markings = M.generate_valid_markings("tail")
var/new_marking = input("Please select tail marking style", "Character Generation", M.m_styles["tail"]) as null|anything in valid_tail_markings
if(new_marking)
@@ -142,7 +142,7 @@
M.change_marking_color(new_marking_colour, "tail")
//Skin tone.
- if(M.species.bodyflags & HAS_SKIN_TONE)
+ if(M.dna.species.bodyflags & HAS_SKIN_TONE)
var/new_tone = input("Please select skin tone level: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation", M.s_tone) as null|text
if(!new_tone)
new_tone = 35
@@ -150,11 +150,11 @@
new_tone = 35 - max(min(round(text2num(new_tone)), 220), 1)
M.change_skin_tone(new_tone)
- if(M.species.bodyflags & HAS_ICON_SKIN_TONE)
- var/prompt = "Please select skin tone: 1-[M.species.icon_skin_tones.len] ("
- for(var/i = 1 to M.species.icon_skin_tones.len)
- prompt += "[i] = [M.species.icon_skin_tones[i]]"
- if(i != M.species.icon_skin_tones.len)
+ if(M.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
+ var/prompt = "Please select skin tone: 1-[M.dna.species.icon_skin_tones.len] ("
+ for(var/i = 1 to M.dna.species.icon_skin_tones.len)
+ prompt += "[i] = [M.dna.species.icon_skin_tones[i]]"
+ if(i != M.dna.species.icon_skin_tones.len)
prompt += ", "
prompt += ")"
@@ -162,11 +162,11 @@
if(!new_tone)
new_tone = 0
else
- new_tone = max(min(round(text2num(new_tone)), M.species.icon_skin_tones.len), 1)
+ new_tone = max(min(round(text2num(new_tone)), M.dna.species.icon_skin_tones.len), 1)
M.change_skin_tone(new_tone)
//Skin colour.
- if(M.species.bodyflags & HAS_SKIN_COLOR)
+ if(M.dna.species.bodyflags & HAS_SKIN_COLOR)
var/new_body_colour = input("Please select body colour.", "Character Generation", M.skin_colour) as null|color
if(new_body_colour)
M.change_skin_color(new_body_colour)
diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm
index 329408bffce..477a0de2573 100644
--- a/code/game/gamemodes/changeling/changeling.dm
+++ b/code/game/gamemodes/changeling/changeling.dm
@@ -112,7 +112,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
if(identity_theft.target && identity_theft.target.current)
identity_theft.target_real_name = kill_objective.target.current.real_name //Whoops, forgot this.
var/mob/living/carbon/human/H = identity_theft.target.current
- if(can_absorb_species(H.species)) // For species that can't be absorbed - should default to an escape objective
+ if(can_absorb_species(H.dna.species)) // For species that can't be absorbed - should default to an escape objective
identity_theft.explanation_text = "Escape on the shuttle or an escape pod with the identity of [identity_theft.target_real_name], the [identity_theft.target.assigned_role] while wearing [identity_theft.target.p_their()] identification card."
changeling.objectives += identity_theft
else
@@ -273,7 +273,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
/datum/changeling/proc/find_dna(datum/dna/tDNA)
for(var/datum/dna/D in (absorbed_dna + protected_dna))
- if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species == D.species)
+ if(tDNA.unique_enzymes == D.unique_enzymes && tDNA.uni_identity == D.uni_identity && tDNA.species.type == D.species.type)
return D
return null
@@ -316,7 +316,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon"
to_chat(user, "DNA of [target] is ruined beyond usability!")
return
- if(NO_DNA in T.species.species_traits)
+ if(NO_DNA in T.dna.species.species_traits)
to_chat(user, "This creature does not have DNA!")
return
diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm
index a7af2b94482..befdf899253 100644
--- a/code/game/gamemodes/changeling/evolution_menu.dm
+++ b/code/game/gamemodes/changeling/evolution_menu.dm
@@ -375,7 +375,7 @@ var/list/sting_paths
path.on_purchase(src)
var/mob/living/carbon/C = src //only carbons have dna now, so we have to typecaste
- mind.changeling.absorbed_dna |= C.dna
+ mind.changeling.absorbed_dna |= C.dna.Clone()
mind.changeling.trim_dna()
return 1
diff --git a/code/game/gamemodes/changeling/powers/humanform.dm b/code/game/gamemodes/changeling/powers/humanform.dm
index fb3012cd274..72b0e821e66 100644
--- a/code/game/gamemodes/changeling/powers/humanform.dm
+++ b/code/game/gamemodes/changeling/powers/humanform.dm
@@ -26,10 +26,10 @@
to_chat(user, "We transform our appearance.")
user.dna.SetSEState(MONKEYBLOCK,0,1)
genemutcheck(user,MONKEYBLOCK,null,MUTCHK_FORCED)
+ if(istype(user))
+ user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- if(istype(user))
- user.set_species(chosen_dna.species)
domutcheck(user,null,MUTCHK_FORCED)
user.flavor_text = ""
user.dna.UpdateSE()
diff --git a/code/game/gamemodes/changeling/powers/lesserform.dm b/code/game/gamemodes/changeling/powers/lesserform.dm
index 3d3b7f2bc07..2197163cbd5 100644
--- a/code/game/gamemodes/changeling/powers/lesserform.dm
+++ b/code/game/gamemodes/changeling/powers/lesserform.dm
@@ -17,17 +17,13 @@
var/mob/living/carbon/human/H = user
- if(!istype(H) || !H.species.primitive_form)
+ if(!istype(H) || !H.dna.species.primitive_form)
to_chat(H, "We cannot perform this ability in this form!")
return
- user.dna = user.dna.Clone()
H.visible_message("[H] transforms!")
changeling.geneticdamage = 30
to_chat(H, "Our genes cry out!")
- var/list/implants = list() //Try to preserve implants.
- for(var/obj/item/implant/W in H)
- implants += W
H.monkeyize()
changeling.purchasedpowers += new /obj/effect/proc_holder/changeling/humanform(null)
feedback_add_details("changeling_powers","LF")
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index b3881ee54fb..3e03d49dc49 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -31,7 +31,7 @@
H.traumatic_shock = 0
H.shock_stage = 0
H.next_pain_time = 0
- H.species.create_organs(H)
+ H.dna.species.create_organs(H)
// Now that recreating all organs is necessary, the rest of this organ stuff probably
// isn't, but I don't want to remove it, just in case.
for(var/organ_name in H.bodyparts_by_name)
diff --git a/code/game/gamemodes/changeling/powers/swap_form.dm b/code/game/gamemodes/changeling/powers/swap_form.dm
index 9015677c70e..c40a33284a1 100644
--- a/code/game/gamemodes/changeling/powers/swap_form.dm
+++ b/code/game/gamemodes/changeling/powers/swap_form.dm
@@ -17,7 +17,7 @@
if((NOCLONE || SKELETON || HUSK) in target.mutations)
to_chat(user, "DNA of [target] is ruined beyond usability!")
return
- if(!istype(target) || issmall(target) || NO_DNA in target.species.species_traits)
+ if(!istype(target) || issmall(target) || NO_DNA in target.dna.species.species_traits)
to_chat(user, "[target] is not compatible with this ability.")
return
return 1
diff --git a/code/game/gamemodes/changeling/powers/tiny_prick.dm b/code/game/gamemodes/changeling/powers/tiny_prick.dm
index c344897c624..bb216ddad35 100644
--- a/code/game/gamemodes/changeling/powers/tiny_prick.dm
+++ b/code/game/gamemodes/changeling/powers/tiny_prick.dm
@@ -80,8 +80,7 @@
selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA")
if(!selected_dna)
return
- var/datum/species/newspecies = all_species[selected_dna.species]
- if((NOTRANSSTING in newspecies.species_traits) || newspecies.is_small)
+ if((NOTRANSSTING in selected_dna.species.species_traits) || selected_dna.species.is_small)
to_chat(user, "The selected DNA is incompatible with our sting.")
return
..()
@@ -94,7 +93,7 @@
return FALSE
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
to_chat(user, "This won't work on a creature without DNA.")
return FALSE
return TRUE
@@ -112,11 +111,11 @@
target.visible_message("[target] begins to violenty convulse!","You feel a tiny prick and a begin to uncontrollably convulse!")
spawn(10)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ H.set_species(NewDNA.species.type)
target.dna = NewDNA.Clone()
target.real_name = NewDNA.real_name
- var/mob/living/carbon/human/H = target
- if(istype(H))
- H.set_species()
target.UpdateAppearance()
domutcheck(target, null)
feedback_add_details("changeling_powers","TS")
diff --git a/code/game/gamemodes/changeling/powers/transform.dm b/code/game/gamemodes/changeling/powers/transform.dm
index b7c8abefd1d..bacdc8b0d8b 100644
--- a/code/game/gamemodes/changeling/powers/transform.dm
+++ b/code/game/gamemodes/changeling/powers/transform.dm
@@ -14,10 +14,10 @@
if(!chosen_dna)
return
+ if(ishuman(user))
+ user.set_species(chosen_dna.species.type)
user.dna = chosen_dna.Clone()
user.real_name = chosen_dna.real_name
- if(ishuman(user))
- user.set_species(chosen_dna.species)
domutcheck(user, null, MUTCHK_FORCED) //Ensures species that get powers by the species proc handle_dna keep them
user.flavor_text = ""
user.dna.UpdateSE()
diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm
index 2edbfca609f..b8e5365cb5d 100644
--- a/code/game/gamemodes/cult/cult_items.dm
+++ b/code/game/gamemodes/cult/cult_items.dm
@@ -50,7 +50,7 @@
..()
if(ishuman(target))
var/mob/living/carbon/human/H = target
- if((H.stat != DEAD) && !(NO_BLOOD in H.species.species_traits))
+ if((H.stat != DEAD) && !(NO_BLOOD in H.dna.species.species_traits))
H.bleed(50)
/obj/item/restraints/legcuffs/bola/cult
@@ -201,6 +201,7 @@
increment = 5
max = 40
prefix = "darkened"
+ claw_damage_increase = 2
/obj/item/whetstone/cult/update_icon()
icon_state = "cult_sharpener[used ? "_used" : ""]"
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 8d858c6fade..70e78176463 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -279,7 +279,7 @@
var/mob/living/carbon/human/H = user
user.visible_message("Otherworldly armor suddenly appears on [user]!", \
"You speak the words of the talisman, arming yourself!")
- if(H.get_species() == "Plasmaman")
+ if(isplasmaman(H))
H.equip_to_slot(new /obj/item/clothing/suit/space/eva/plasmaman/cultist(H), slot_wear_suit)
H.equip_to_slot(new /obj/item/clothing/head/helmet/space/eva/plasmaman/cultist(H), slot_head)
else
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
index 3b908952de7..4cbe909ef84 100644
--- a/code/game/gamemodes/heist/heist.dm
+++ b/code/game/gamemodes/heist/heist.dm
@@ -101,7 +101,7 @@ var/global/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind'
vox.name = vox.real_name
newraider.name = vox.name
vox.age = rand(12,20)
- vox.set_species("Vox")
+ vox.set_species(/datum/species/vox)
vox.s_tone = rand(1, 6)
vox.languages = list() // Removing language from chargen.
vox.flavor_text = ""
diff --git a/code/game/gamemodes/intercept_report.dm b/code/game/gamemodes/intercept_report.dm
index 50b749a62a2..ca868f4874e 100644
--- a/code/game/gamemodes/intercept_report.dm
+++ b/code/game/gamemodes/intercept_report.dm
@@ -116,7 +116,7 @@
if((man.mind.assigned_role in ticker.mode.protected_jobs) || (man.mind.assigned_role in ticker.mode.restricted_jobs))
return
//don't include suspects who can't possibly be the antag based on their species (no suspecting the machines of being sneaky changelings)
- if(man.get_species() in ticker.mode.protected_species)
+ if(man.dna.species.name in ticker.mode.protected_species)
return
dudes += man
for(var/i = 0, i < max(player_list.len/10,2), i++)
diff --git a/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
new file mode 100644
index 00000000000..af2920c4626
--- /dev/null
+++ b/code/game/gamemodes/miniantags/abduction/abductee_objectives.dm
@@ -0,0 +1,147 @@
+/datum/objective/abductee
+ completed = 1
+
+/datum/objective/abductee/steal
+ explanation_text = "Steal all"
+
+/datum/objective/abductee/steal/New()
+ var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
+ explanation_text+=" [target]."
+
+/datum/objective/abductee/paint
+ explanation_text = "The station is hideous. You must color it all"
+
+/datum/objective/abductee/paint/New()
+ var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
+ explanation_text+= " [color]!"
+
+/datum/objective/abductee/speech
+ explanation_text = "Your brain is broken... you can only communicate in"
+
+/datum/objective/abductee/speech/New()
+ var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
+ explanation_text+= " [style]."
+
+/datum/objective/abductee/capture
+ explanation_text = "Capture"
+
+/datum/objective/abductee/capture/New()
+ var/list/jobs = job_master.occupations.Copy()
+ for(var/datum/job/J in jobs)
+ if(J.current_positions < 1)
+ jobs -= J
+ if(jobs.len > 0)
+ var/datum/job/target = pick(jobs)
+ explanation_text += " a [target.title]."
+ else
+ explanation_text += " someone."
+
+/datum/objective/abductee/shuttle
+ explanation_text = "You must escape the station! Get the shuttle called!"
+
+/datum/objective/abductee/noclone
+ explanation_text = "Don't allow anyone to be cloned."
+
+/datum/objective/abductee/oxygen
+ explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station."
+
+/datum/objective/abductee/blazeit
+ explanation_text = "Your body must be improved. Ingest as many drugs as you can."
+
+/datum/objective/abductee/yumyum
+ explanation_text = "You are hungry. Eat as much food as you can find."
+
+/datum/objective/abductee/insane
+ explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL"
+
+/datum/objective/abductee/cannotmove
+ explanation_text = "Convince the crew that you are a paraplegic."
+
+/datum/objective/abductee/deadbodies
+ explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
+
+/datum/objective/abductee/floors
+ explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
+
+/datum/objective/abductee/POWERUNLIMITED
+ explanation_text = "Flood the station's powernet with as much electricity as you can."
+
+/datum/objective/abductee/pristine
+ explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
+
+/datum/objective/abductee/nowalls
+ explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
+
+/datum/objective/abductee/nations
+ explanation_text = "Ensure your department prospers over all else."
+
+/datum/objective/abductee/abductception
+ explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
+
+/datum/objective/abductee/summon
+ explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
+
+/datum/objective/abductee/machine
+ explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
+
+/datum/objective/abductee/calling
+ explanation_text = "Call forth a spirit from the other side."
+
+/datum/objective/abductee/calling/New()
+ var/mob/dead/D = pick(dead_mob_list)
+ if(D)
+ explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
+
+/datum/objective/abductee/social_experiment
+ explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
+
+/datum/objective/abductee/vr
+ explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR."
+
+/datum/objective/abductee/pets
+ explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
+
+/datum/objective/abductee/defect
+ explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
+
+/datum/objective/abductee/promote
+ explanation_text = "Climb the corporate ladder all the way to the top!"
+
+/datum/objective/abductee/science
+ explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe."
+
+/datum/objective/abductee/build
+ explanation_text = "Expand the station."
+
+/datum/objective/abductee/pragnant
+ explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
+
+/datum/objective/abductee/engine
+ explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
+
+/datum/objective/abductee/music
+ explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
+
+/datum/objective/abductee/clown
+ explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
+
+/datum/objective/abductee/party
+ explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
+
+/datum/objective/abductee/pets
+ explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
+
+/datum/objective/abductee/conspiracy
+ explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
+
+/datum/objective/abductee/stalker
+ explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
+
+/datum/objective/abductee/narrator
+ explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
+
+/datum/objective/abductee/lurve
+ explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
+
+/datum/objective/abductee/sixthsense
+ explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index 1c6dc7d3022..5d5c3342010 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -89,62 +89,14 @@
return 1
/datum/game_mode/abduction/post_setup()
- //Spawn Team
- var/list/obj/effect/landmark/abductor/agent_landmarks = new
- var/list/obj/effect/landmark/abductor/scientist_landmarks = new
- agent_landmarks.len = max_teams
- scientist_landmarks.len = max_teams
- for(var/obj/effect/landmark/abductor/A in landmarks_list)
- if(istype(A,/obj/effect/landmark/abductor/agent))
- agent_landmarks[text2num(A.team)] = A
- else if(istype(A,/obj/effect/landmark/abductor/scientist))
- scientist_landmarks[text2num(A.team)] = A
-
- var/datum/mind/agent
- var/obj/effect/landmark/L
- var/datum/mind/scientist
- var/team_name
- var/mob/living/carbon/human/H
for(var/team_number=1,team_number<=abductor_teams,team_number++)
- team_name = team_names[team_number]
- agent = agents[team_number]
- H = agent.current
- L = agent_landmarks[team_number]
- H.forceMove(get_turf(L))
- H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.agent = 1
- H.mind.abductor.team = team_number
- H.real_name = team_name + " Agent"
- H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
- H.overeatduration = 0
- equip_common(H,team_number)
- equip_agent(H,team_number)
- greet_agent(agent,team_number)
- update_abductor_icons_added(agent)
-
- scientist = scientists[team_number]
- H = scientist.current
- L = scientist_landmarks[team_number]
- H.forceMove(get_turf(L))
- H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.scientist = 1
- H.mind.abductor.team = team_number
- H.real_name = team_name + " Scientist"
- H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
- H.overeatduration = 0
- equip_common(H,team_number)
- equip_scientist(H,team_number)
- greet_scientist(scientist,team_number)
- update_abductor_icons_added(scientist)
-
+ post_setup_team(team_number)
return ..()
//Used for create antag buttons
/datum/game_mode/abduction/proc/post_setup_team(team_number)
- var/list/obj/effect/landmark/abductor/agent_landmarks = new
- var/list/obj/effect/landmark/abductor/scientist_landmarks = new
+ var/list/obj/effect/landmark/abductor/agent_landmarks = list()
+ var/list/obj/effect/landmark/abductor/scientist_landmarks = list()
agent_landmarks.len = max_teams
scientist_landmarks.len = max_teams
for(var/obj/effect/landmark/abductor/A in landmarks_list)
@@ -153,11 +105,13 @@
else if(istype(A,/obj/effect/landmark/abductor/scientist))
scientist_landmarks[text2num(A.team)] = A
+ var/team_name = team_names[team_number]
+
var/datum/mind/agent
var/obj/effect/landmark/L
var/datum/mind/scientist
- var/team_name
var/mob/living/carbon/human/H
+ var/datum/species/abductor/S
team_name = team_names[team_number]
agent = agents[team_number]
@@ -165,12 +119,13 @@
L = agent_landmarks[team_number]
H.forceMove(get_turf(L))
H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.agent = 1
- H.mind.abductor.team = team_number
+ H.set_species(/datum/species/abductor)
+ S = H.dna.species
+ S.team = team_number
H.real_name = team_name + " Agent"
- equip_common(H,team_number)
- equip_agent(H,team_number)
+ H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
+ H.overeatduration = 0
+ H.equipOutfit(/datum/outfit/abductor/agent)
greet_agent(agent,team_number)
update_abductor_icons_added(agent)
@@ -179,21 +134,17 @@
L = scientist_landmarks[team_number]
H.forceMove(get_turf(L))
H.body_accessory = null
- H.set_species("Abductor")
- H.mind.abductor.scientist = 1
- H.mind.abductor.team = team_number
+ H.set_species(/datum/species/abductor)
+ S = H.dna.species
+ S.scientist = TRUE
+ S.team = team_number
H.real_name = team_name + " Scientist"
- equip_common(H,team_number)
- equip_scientist(H,team_number)
+ H.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ayys.
+ H.overeatduration = 0
+ H.equipOutfit(/datum/outfit/abductor/scientist)
greet_scientist(scientist,team_number)
update_abductor_icons_added(scientist)
-
-/datum/abductor //stores abductor's team and whether they're a scientist or agent; since species datums are global, we have to use this, instead.
- var/scientist = 0
- var/agent = 0
- var/team = 1
-
/datum/game_mode/abduction/proc/greet_agent(datum/mind/abductor,team_number)
abductor.objectives += team_objectives[team_number]
var/team_name = team_names[team_number]
@@ -202,11 +153,7 @@
to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!")
to_chat(abductor.current, "Use your stealth technology and equipment to incapacitate humans for your scientist to retrieve.")
- var/obj_count = 1
- for(var/datum/objective/objective in abductor.objectives)
- to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]")
- obj_count++
- return
+ abductor.announce_objectives()
/datum/game_mode/abduction/proc/greet_scientist(datum/mind/abductor,team_number)
abductor.objectives += team_objectives[team_number]
@@ -216,64 +163,12 @@
to_chat(abductor.current, "With the help of your teammate, kidnap and experiment on station crew members!")
to_chat(abductor.current, "Use your tool and ship consoles to support the agent and retrieve human specimens.")
- var/obj_count = 1
- for(var/datum/objective/objective in abductor.objectives)
- to_chat(abductor.current, "Objective #[obj_count]: [objective.explanation_text]")
- obj_count++
- return
-
-/datum/game_mode/abduction/proc/equip_common(mob/living/carbon/human/agent,team_number)
- var/radio_freq = SYND_FREQ
-
- var/obj/item/radio/R = new /obj/item/radio/headset/syndicate/alt(agent)
- R.set_frequency(radio_freq)
- R.name = "alien headset"
- agent.equip_to_slot_or_del(R, slot_l_ear)
- agent.equip_to_slot_or_del(new /obj/item/clothing/shoes/combat(agent), slot_shoes)
- agent.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(agent), slot_w_uniform) //they're greys gettit
- agent.equip_to_slot_or_del(new /obj/item/storage/backpack(agent), slot_back)
-
-/datum/game_mode/abduction/proc/get_team_console(team)
- var/obj/machinery/abductor/console/console
- for(var/obj/machinery/abductor/console/c in abductor_equipment)
- if(c.team == team)
- console = c
- break
- return console
-
-/datum/game_mode/abduction/proc/equip_agent(mob/living/carbon/human/agent,team_number)
- if(!team_number)
- team_number = agent.mind.abductor.team
-
- var/obj/machinery/abductor/console/console = get_team_console(team_number)
- var/obj/item/clothing/suit/armor/abductor/vest/V = new /obj/item/clothing/suit/armor/abductor/vest(agent)
- if(console!=null)
- console.vest = V
- V.flags |= NODROP
- agent.equip_to_slot_or_del(V, slot_wear_suit)
- agent.equip_to_slot_or_del(new /obj/item/abductor_baton(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/gun/energy/alien(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/abductor/silencer(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
- agent.equip_to_slot_or_del(new /obj/item/storage/belt/military/abductor/full(agent), slot_belt)
- agent.update_icons()
-
-
-/datum/game_mode/abduction/proc/equip_scientist(var/mob/living/carbon/human/scientist,var/team_number)
- if(!team_number)
- team_number = scientist.mind.abductor.team
-
- var/obj/machinery/abductor/console/console = get_team_console(team_number)
- var/obj/item/abductor/gizmo/G = new /obj/item/abductor/gizmo(scientist)
- if(console!=null)
- console.gizmo = G
- G.console = console
- scientist.equip_to_slot_or_del(G, slot_in_backpack)
-
- var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(scientist)
- beamplant.implant(scientist)
- scientist.update_icons()
+ abductor.announce_objectives()
+/datum/game_mode/abduction/proc/get_team_console(team_number)
+ for(var/obj/machinery/abductor/console/C in machines)
+ if(C.team == team_number)
+ return C
/datum/game_mode/abduction/check_finished()
if(!finished)
@@ -336,18 +231,19 @@
var/ab_team = team
if(owner)
if(!owner.current || !ishuman(owner.current))
- return 0
+ return FALSE
var/mob/living/carbon/human/H = owner.current
- if(H.get_species() != "Abductor")
- return 0
- ab_team = H.mind.abductor.team
- for(var/obj/machinery/abductor/experiment/E in abductor_equipment)
+ if(!isabductor(H))
+ return FALSE
+ var/datum/species/abductor/S = H.dna.species
+ ab_team = S.team
+ for(var/obj/machinery/abductor/experiment/E in machines)
if(E.team == ab_team)
if(E.points >= target_amount)
- return 1
+ return TRUE
else
- return 0
- return 0
+ return FALSE
+ return FALSE
/datum/game_mode/proc/remove_abductor(datum/mind/abductor_mind)
if(abductor_mind in abductors)
@@ -358,7 +254,7 @@
to_chat(abductor_mind.current, "You have been turned into a robot! You are no longer an abductor.")
else
to_chat(abductor_mind.current, "You have been brainwashed! You are no longer an abductor.")
- ticker.mode.update_abductor_icons_added(abductor_mind)
+ ticker.mode.update_abductor_icons_removed(abductor_mind)
/datum/game_mode/proc/update_abductor_icons_added(datum/mind/alien_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR]
@@ -368,152 +264,4 @@
/datum/game_mode/proc/update_abductor_icons_removed(datum/mind/alien_mind)
var/datum/atom_hud/antag/hud = huds[ANTAG_HUD_ABDUCTOR]
hud.leave_hud(alien_mind.current)
- set_antag_hud(alien_mind.current, null)
-
-/datum/objective/abductee
- completed = 1
-
-/datum/objective/abductee/steal
- explanation_text = "Steal all"
-
-/datum/objective/abductee/steal/New()
- var/target = pick(list("pets","lights","monkeys","fruits","shoes","bars of soap", "weapons", "computers", "organs"))
- explanation_text+=" [target]."
-
-/datum/objective/abductee/paint
- explanation_text = "The station is hideous. You must color it all"
-
-/datum/objective/abductee/paint/New()
- var/color = pick(list("red", "blue", "green", "yellow", "orange", "purple", "black", "in rainbows", "in blood"))
- explanation_text+= " [color]!"
-
-/datum/objective/abductee/speech
- explanation_text = "Your brain is broken... you can only communicate in"
-
-/datum/objective/abductee/speech/New()
- var/style = pick(list("pantomime", "rhyme", "haiku", "extended metaphors", "riddles", "extremely literal terms", "sound effects", "military jargon"))
- explanation_text+= " [style]."
-
-/datum/objective/abductee/capture
- explanation_text = "Capture"
-
-/datum/objective/abductee/capture/New()
- var/list/jobs = job_master.occupations.Copy()
- for(var/datum/job/J in jobs)
- if(J.current_positions < 1)
- jobs -= J
- if(jobs.len > 0)
- var/datum/job/target = pick(jobs)
- explanation_text += " a [target.title]."
- else
- explanation_text += " someone."
-
-/datum/objective/abductee/shuttle
- explanation_text = "You must escape the station! Get the shuttle called!"
-
-/datum/objective/abductee/noclone
- explanation_text = "Don't allow anyone to be cloned."
-
-/datum/objective/abductee/oxygen
- explanation_text = "The oxygen is killing them all and they don't even know it. Make sure no oxygen is on the station."
-
-/datum/objective/abductee/blazeit
- explanation_text = "Your body must be improved. Ingest as many drugs as you can."
-
-/datum/objective/abductee/yumyum
- explanation_text = "You are hungry. Eat as much food as you can find."
-
-/datum/objective/abductee/insane
- explanation_text = "You see you see what they cannot you see the open door you seeE you SEeEe you SEe yOU seEee SHOW THEM ALL"
-
-/datum/objective/abductee/cannotmove
- explanation_text = "Convince the crew that you are a paraplegic."
-
-/datum/objective/abductee/deadbodies
- explanation_text = "Start a collection of corpses. Don't kill people to get these corpses."
-
-/datum/objective/abductee/floors
- explanation_text = "Replace all the floor tiles with wood, carpeting, grass or bling."
-
-/datum/objective/abductee/POWERUNLIMITED
- explanation_text = "Flood the station's powernet with as much electricity as you can."
-
-/datum/objective/abductee/pristine
- explanation_text = "The CEO of Nanotrasen is coming! Ensure the station is in absolutely pristine condition."
-
-/datum/objective/abductee/nowalls
- explanation_text = "The crew must get to know one another better. Break down the walls inside the station!"
-
-/datum/objective/abductee/nations
- explanation_text = "Ensure your department prospers over all else."
-
-/datum/objective/abductee/abductception
- explanation_text = "You have been changed forever. Find the ones that did this to you and give them a taste of their own medicine."
-
-/datum/objective/abductee/summon
- explanation_text = "The elder gods hunger. Gather a cult and conduct a ritual to summon one."
-
-/datum/objective/abductee/machine
- explanation_text = "You are secretly an android. Interface with as many machines as you can to boost your own power so the AI may acknowledge you at last."
-
-/datum/objective/abductee/calling
- explanation_text = "Call forth a spirit from the other side."
-
-/datum/objective/abductee/calling/New()
- var/mob/dead/D = pick(dead_mob_list)
- if(D)
- explanation_text = "You know that [D] has perished. Hold a seance to call them from the spirit realm."
-
-/datum/objective/abductee/social_experiment
- explanation_text = "This is a secret social experiment conducted by Nanotrasen. Convince the crew that this is the truth."
-
-/datum/objective/abductee/vr
- explanation_text = "It's all an entirely virtual simulation within an underground vault. Convince the crew to escape the shackles of VR."
-
-/datum/objective/abductee/pets
- explanation_text = "Nanotrasen is abusing the animals! Save as many as you can!"
-
-/datum/objective/abductee/defect
- explanation_text = "Fuck the system! Defect from the station and start an independent colony in space, Mining Outpost or the derelict. Recruit crewmates if you can."
-
-/datum/objective/abductee/promote
- explanation_text = "Climb the corporate ladder all the way to the top!"
-
-/datum/objective/abductee/science
- explanation_text = "So much lies undiscovered. Look deeper into the machinations of the universe."
-
-/datum/objective/abductee/build
- explanation_text = "Expand the station."
-
-/datum/objective/abductee/pragnant
- explanation_text = "You are pregnant and soon due. Find a safe place to deliver your baby."
-
-/datum/objective/abductee/engine
- explanation_text = "Go have a good conversation with the singularity/tesla/supermatter crystal. Bonus points if it responds."
-
-/datum/objective/abductee/music
- explanation_text = "You burn with passion for music. Share your vision. If anyone hates it, beat them on the head with your instrument!"
-
-/datum/objective/abductee/clown
- explanation_text = "The clown is not funny. You can do better! Steal his audience and make the crew laugh!"
-
-/datum/objective/abductee/party
- explanation_text = "You're throwing a huge rager. Make it as awesome as possible so the whole crew comes... OR ELSE!"
-
-/datum/objective/abductee/pets
- explanation_text = "All the pets around here suck. You need to make them cooler. Replace them with exotic beasts!"
-
-/datum/objective/abductee/conspiracy
- explanation_text = "The leaders of this station are hiding a grand, evil conspiracy. Only you can learn what it is, and expose it to the people!"
-
-/datum/objective/abductee/stalker
- explanation_text = "The Syndicate has hired you to compile dossiers on all important members of the crew. Be sure they don't know you're doing it."
-
-/datum/objective/abductee/narrator
- explanation_text = "You're the narrator of this tale. Follow around the protagonists to tell their story."
-
-/datum/objective/abductee/lurve
- explanation_text = "You are doomed to feel woefully incomplete forever... until you find your true love on this station. They're waiting for you!"
-
-/datum/objective/abductee/sixthsense
- explanation_text = "You died back there and went to heaven... or is it hell? No one here seems to know they're dead. Convince them, and maybe you can escape this limbo."
\ No newline at end of file
+ set_antag_hud(alien_mind.current, null)
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 9a43df56926..40d48f7fd59 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -117,8 +117,8 @@
/obj/item/abductor/proc/ScientistCheck(user)
var/mob/living/carbon/human/H = user
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
+ var/datum/species/abductor/S = H.dna.species
+ return S.scientist
/obj/item/abductor/gizmo
name = "science tool"
@@ -248,7 +248,7 @@
name = "alien pistol"
desc = "A complicated gun that fires bursts of high-intensity radiation."
ammo_type = list(/obj/item/ammo_casing/energy/declone)
- restricted_species = list("Abductor")
+ restricted_species = list(/datum/species/abductor)
icon_state = "alienpistol"
item_state = "alienpistol"
origin_tech = "combat=4;magnets=7;powerstorage=3;abductor=3"
@@ -258,7 +258,6 @@
name = "Dissection Guide"
icon_state = "alienpaper_words"
info = {"Dissection for Dummies
-
1.Acquire fresh specimen.
2.Put the specimen on operating table.
@@ -432,7 +431,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
if(ishuman(L))
var/mob/living/carbon/human/H = L
- species = "[H.species.name]"
+ species = "[H.dna.species.name]"
if(L.mind && L.mind.changeling)
species = "Changeling lifeform"
var/obj/item/organ/internal/heart/gland/temp = locate() in H.internal_organs
@@ -477,6 +476,25 @@ Congratulations! You are now trained for invasive xenobiology research!"}
to_chat(user, "The baton is in probing mode.")
+/obj/item/radio/headset/abductor
+ name = "alien headset"
+ desc = "An advanced alien headset designed to monitor communications of human space stations. Why does it have a microphone? No one knows."
+ flags = EARBANGPROTECT
+ origin_tech = "magnets=2;abductor=3"
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "abductor_headset"
+ item_state = "abductor_headset"
+ ks2type = /obj/item/encryptionkey/heads/captain
+
+/obj/item/radio/headset/abductor/New()
+ ..()
+ make_syndie()
+
+/obj/item/radio/headset/abductor/attackby(obj/item/I, mob/user, params)
+ if(isscrewdriver(I))
+ return // Stops humans from disassembling abductor headsets.
+ return ..()
+
/obj/item/scalpel/alien
name = "alien scalpel"
desc = "It's a gleaming sharp knife made out of silvery-green metal."
@@ -593,7 +611,7 @@ Congratulations! You are now trained for invasive xenobiology research!"}
icon = 'icons/obj/abductor.dmi'
icon_state = "bed"
no_icon_updates = 1 //no icon updates for this; it's static.
- injected_reagents = list("corazone")
+ injected_reagents = list("corazone","spaceacillin")
/obj/structure/closet/abductor
name = "alien locker"
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
new file mode 100644
index 00000000000..bb39e90cd01
--- /dev/null
+++ b/code/game/gamemodes/miniantags/abduction/abduction_outfits.dm
@@ -0,0 +1,62 @@
+/datum/outfit/abductor
+ name = "Abductor Basic"
+ uniform = /obj/item/clothing/under/color/grey //they're greys gettit
+ shoes = /obj/item/clothing/shoes/combat
+ back = /obj/item/storage/backpack
+ l_ear = /obj/item/radio/headset/abductor
+
+/datum/outfit/abductor/proc/get_team_console(team_number)
+ for(var/obj/machinery/abductor/console/C in machines)
+ if(C.team == team_number)
+ return C
+
+/datum/outfit/abductor/proc/link_to_console(mob/living/carbon/human/H, team_number)
+ if(!team_number && isabductor(H))
+ var/datum/species/abductor/S = H.dna.species
+ team_number = S.team
+
+ if(!team_number)
+ team_number = 1
+
+ var/obj/machinery/abductor/console/console = get_team_console(team_number)
+ if(console)
+ var/obj/item/clothing/suit/armor/abductor/vest/V = locate() in H
+ if(V)
+ console.vest = V
+ V.flags |= NODROP
+
+ var/obj/item/abductor/gizmo/G = locate() in H.get_item_by_slot(slot_back)
+ if(G)
+ console.gizmo = G
+ G.console = console
+
+/datum/outfit/abductor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(!visualsOnly)
+ link_to_console(H)
+
+
+/datum/outfit/abductor/agent
+ name = "Abductor Agent"
+ head = /obj/item/clothing/head/helmet/abductor
+ suit = /obj/item/clothing/suit/armor/abductor/vest
+ belt = /obj/item/storage/belt/military/abductor/full
+
+ backpack_contents = list(
+ /obj/item/abductor_baton = 1,
+ /obj/item/gun/energy/alien = 1,
+ /obj/item/abductor/silencer = 1
+ )
+
+/datum/outfit/abductor/scientist
+ name = "Abductor Scientist"
+
+ backpack_contents = list(
+ /obj/item/abductor/gizmo = 1
+ )
+
+/datum/outfit/abductor/scientist/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+ ..()
+ if(!visualsOnly)
+ var/obj/item/implant/abductor/beamplant = new /obj/item/implant/abductor(H)
+ beamplant.implant(H)
\ No newline at end of file
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
index d07381b7cce..d4d791c5b19 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_surgery.dm
@@ -15,7 +15,7 @@
return FALSE
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if((H.get_species() == "Abductor" || (locate(/obj/item/implant/abductor) in H)))
+ if((isabductor(H) || (locate(/obj/item/implant/abductor) in H)))
return TRUE
return FALSE
@@ -37,7 +37,7 @@
/datum/surgery_step/internal/extract_organ/end_step(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/mob/living/carbon/human/AB = target
- if(NO_INTORGANS in AB.species.species_traits)
+ if(NO_INTORGANS in AB.dna.species.species_traits)
user.visible_message("[user] prepares [target]'s [target_zone] for further dissection!", "You prepare [target]'s [target_zone] for further dissection.")
return TRUE
if(IC)
@@ -93,7 +93,7 @@
return FALSE
var/mob/living/carbon/human/H = user
// You must either: Be of the abductor species, or contain an abductor implant
- if((H.get_species() == "Abductor" || (locate(/obj/item/implant/abductor) in H)))
+ if((isabductor(H) || (locate(/obj/item/implant/abductor) in H)))
return TRUE
return FALSE
diff --git a/code/game/gamemodes/miniantags/abduction/gland.dm b/code/game/gamemodes/miniantags/abduction/gland.dm
index 8e7219e401a..ebc14225cd7 100644
--- a/code/game/gamemodes/miniantags/abduction/gland.dm
+++ b/code/game/gamemodes/miniantags/abduction/gland.dm
@@ -108,7 +108,7 @@
/obj/item/organ/internal/heart/gland/pop/activate()
to_chat(owner, "You feel unlike yourself.")
- var/species = pick("Unathi","Skrell","Diona","Tajaran","Vulpkanin","Kidan","Grey","Diona")
+ var/species = pick(/datum/species/unathi, /datum/species/skrell, /datum/species/diona, /datum/species/tajaran, /datum/species/vulpkanin, /datum/species/kidan, /datum/species/grey)
owner.set_species(species)
/obj/item/organ/internal/heart/gland/ventcrawling
@@ -217,8 +217,8 @@
var/mob/living/carbon/human/interactive/greytide/clone = new(src)
var/datum/dna/owner_dna = H.dna
clone.rename_character(clone.name, owner_dna.real_name)
+ clone.set_species(owner_dna.species.type)
clone.dna = owner_dna.Clone()
- clone.set_species(H.species.name)
clone.body_accessory = H.body_accessory
domutcheck(clone)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
index 219ae4b6e54..cd4f80f2527 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/camera.dm
@@ -2,7 +2,6 @@
name = "Human Observation Console"
var/team = 0
networks = list("SS13","Abductor")
- off_action = new /datum/action/innate/camera_off/abductor //specific datum
var/datum/action/innate/teleport_in/tele_in_action = new
var/datum/action/innate/teleport_out/tele_out_action = new
var/datum/action/innate/teleport_self/tele_self_action = new
@@ -25,65 +24,43 @@
eyeobj.icon_state = "camera_target"
/obj/machinery/computer/camera_advanced/abductor/GrantActions(mob/living/carbon/user)
- off_action.target = user
- off_action.Grant(user)
+ ..()
- jump_action.target = user
- jump_action.Grant(user)
- //TODO : add null checks
- tele_in_action.target = console.pad
- tele_in_action.Grant(user)
+ if(tele_in_action)
+ tele_in_action.target = console.pad
+ tele_in_action.Grant(user)
+ actions += tele_in_action
- tele_out_action.target = console
- tele_out_action.Grant(user)
+ if(tele_out_action)
+ tele_out_action.target = console
+ tele_out_action.Grant(user)
+ actions += tele_out_action
- tele_self_action.target = console.pad
- tele_self_action.Grant(user)
+ if(tele_self_action)
+ tele_self_action.target = console.pad
+ tele_self_action.Grant(user)
+ actions += tele_self_action
- vest_mode_action.target = console
- vest_mode_action.Grant(user)
+ if(vest_mode_action)
+ vest_mode_action.target = console
+ vest_mode_action.Grant(user)
+ actions += vest_mode_action
- vest_disguise_action.target = console
- vest_disguise_action.Grant(user)
+ if(vest_disguise_action)
+ vest_disguise_action.target = console
+ vest_disguise_action.Grant(user)
+ actions += vest_disguise_action
- set_droppoint_action.target = console
- set_droppoint_action.Grant(user)
-
-/obj/machinery/computer/camera_advanced/abductor/proc/IsScientist(mob/living/carbon/human/H)
- if(H.mind && H.mind.abductor)
- return H.mind.abductor.scientist
+ if(set_droppoint_action)
+ set_droppoint_action.target = console
+ set_droppoint_action.Grant(user)
+ actions += set_droppoint_action
/obj/machinery/computer/camera_advanced/abductor/attack_hand(mob/user)
if(!isabductor(user))
return
return ..()
-/datum/action/innate/camera_off/abductor/Activate()
- if(!target || !iscarbon(target))
- return
- var/mob/living/carbon/C = target
- var/mob/camera/aiEye/remote/remote_eye = C.remote_control
- var/obj/machinery/computer/camera_advanced/abductor/origin = remote_eye.origin
- C.remote_view = 0
- origin.current_user = null
- origin.jump_action.Remove(C)
- origin.tele_in_action.Remove(C)
- origin.tele_out_action.Remove(C)
- origin.tele_self_action.Remove(C)
- origin.vest_mode_action.Remove(C)
- origin.vest_disguise_action.Remove(C)
- origin.set_droppoint_action.Remove(C)
- remote_eye.eye_user = null
- C.reset_perspective(null)
- if(C.client)
- C.client.images -= remote_eye.user_image
- for(var/datum/camerachunk/chunk in remote_eye.visibleCameraChunks)
- C.client.images -= chunk.obscured
- C.remote_control = null
- C.unset_machine()
- src.Remove(C)
-
-
/datum/action/innate/teleport_in
name = "Send To"
button_icon_state = "beam_down"
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
index 8682b50fc05..3b339ad7c40 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/experiment.dm
@@ -47,9 +47,9 @@
/obj/machinery/abductor/experiment/proc/dissection_icon(mob/living/carbon/human/H)
var/icon/I = icon(H.stand_icon)
- var/icon/splat = icon(H.species.damage_overlays, "30")
- splat.Blend(icon(H.species.damage_mask, "torso"), ICON_MULTIPLY)
- splat.Blend(H.species.blood_color, ICON_MULTIPLY)
+ var/icon/splat = icon(H.dna.species.damage_overlays, "30")
+ splat.Blend(icon(H.dna.species.damage_mask, "torso"), ICON_MULTIPLY)
+ splat.Blend(H.dna.species.blood_color, ICON_MULTIPLY)
I.Blend(splat, ICON_OVERLAY)
return I
diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
index 03b7d2e1b56..6b976ad7f05 100644
--- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
+++ b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm
@@ -123,7 +123,7 @@
to_chat(src, "Prime Directives:")
to_chat(src, "1. Consume resources and replicate until there are no more resources left.")
to_chat(src, "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.")
- to_chat(src, "3. Biological and Sentient resources will be harvested at a later date, do not harm them.")
+ to_chat(src, "3. Biological and sentient resources will be harvested at a later date, do not harm them.")
/mob/living/simple_animal/hostile/swarmer/New()
..()
@@ -306,6 +306,12 @@
/obj/spacepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
to_chat(S, "Destroying this vehicle would destroy us. Aborting.")
+/obj/machinery/clonepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
+ if(occupant)
+ to_chat(S, "Destroying this machine while it is occupied would result in biological and sentient resources to be harmed. Aborting.")
+ return
+ ..()
+
/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)
S.DisperseTarget(src)
diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm
index feffadcf9ab..17afd375952 100644
--- a/code/game/gamemodes/nuclear/nuclear.dm
+++ b/code/game/gamemodes/nuclear/nuclear.dm
@@ -141,15 +141,15 @@ proc/issyndicate(mob/living/M as mob)
return ..()
-/datum/game_mode/proc/create_syndicate(var/datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
+/datum/game_mode/proc/create_syndicate(datum/mind/synd_mind) // So we don't have inferior species as ops - randomize a human
var/mob/living/carbon/human/M = synd_mind.current
- var/obj/item/organ/external/head/head_organ = M.get_organ("head")
- M.set_species("Human",1)
+ M.set_species(/datum/species/human, TRUE)
M.dna.ready_dna(M) // Quadriplegic Nuke Ops won't be participating in the paralympics
M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ops.
M.overeatduration = 0
+ var/obj/item/organ/external/head/head_organ = M.get_organ("head")
var/hair_c = pick("#8B4513","#000000","#FF4500","#FFD700") // Brown, black, red, blonde
var/eye_c = pick("#000000","#8B4513","1E90FF") // Black, brown, blue
var/skin_tone = pick(-50, -30, -10, 0, 0, 0, 10) // Caucasian/black
@@ -159,8 +159,8 @@ proc/issyndicate(mob/living/M as mob)
head_organ.sec_hair_colour = hair_c
M.change_eye_color(eye_c)
M.s_tone = skin_tone
- head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name)
M.body_accessory = null
M.regenerate_icons()
M.update_body()
@@ -253,7 +253,7 @@ proc/issyndicate(mob/living/M as mob)
U.hidden_uplink.uses = 20
synd_mob.equip_to_slot_or_del(U, slot_in_backpack)
- if(synd_mob.species)
+ if(synd_mob.dna.species)
/*
Incase anyone ever gets the burning desire to have nukeops with randomized apperances. -- Dave
@@ -262,7 +262,7 @@ proc/issyndicate(mob/living/M as mob)
A.randomize_appearance_for(synd_mob)
*/
- var/race = synd_mob.species.name
+ var/race = synd_mob.dna.species.name
switch(race)
if("Vox" || "Vox Armalis")
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 07395aa0578..b7364970351 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -281,7 +281,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
for(var/datum/mind/possible_target in ticker.minds)
if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != DEAD) && possible_target.current.client)
var/mob/living/carbon/human/H = possible_target.current
- if(!(NO_DNA in H.species.species_traits))
+ if(!(NO_DNA in H.dna.species.species_traits))
possible_targets += possible_target
if(possible_targets.len > 0)
target = pick(possible_targets)
@@ -445,7 +445,7 @@ var/list/potential_theft_objectives = subtypesof(/datum/theft_objective) - /datu
n_p++
else if(ticker.current_state == GAME_STATE_PLAYING)
for(var/mob/living/carbon/human/P in player_list)
- if(NO_DNA in P.species.species_traits)
+ if(NO_DNA in P.dna.species.species_traits)
continue
if(P.client && !(P.mind in ticker.mode.changelings) && P.mind!=owner)
n_p++
diff --git a/code/game/gamemodes/shadowling/shadowling.dm b/code/game/gamemodes/shadowling/shadowling.dm
index 1d0bb3adf03..3c1f5d47ed8 100644
--- a/code/game/gamemodes/shadowling/shadowling.dm
+++ b/code/game/gamemodes/shadowling/shadowling.dm
@@ -209,7 +209,7 @@ Made by Xhuis
if(shadow.special_role == SPECIAL_ROLE_SHADOWLING && config.shadowling_max_age)
if(ishuman(shadow.current))
var/mob/living/carbon/human/H = shadow.current
- if(H.get_species() != "Shadow")
+ if(!isshadowling(H))
for(var/obj/effect/proc_holder/spell/targeted/shadowling_hatch/hatch_ability in shadow.spell_list)
hatch_ability.cycles_unused++
if(!H.stunned && prob(20) && hatch_ability.cycles_unused > config.shadowling_max_age)
@@ -317,7 +317,7 @@ Made by Xhuis
blood_color = "#555555"
flesh_color = "#222222"
- species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS) //Can't use guns due to muzzle flash
+ species_traits = list(NO_BLOOD, NO_BREATHE, RADIMMUNE, NOGUNS, NO_EXAMINE) //Can't use guns due to muzzle flash
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
oxy_mod = 0
heatmod = 1.5
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 89aee290422..f8f55f0e126 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -2,8 +2,10 @@
/obj/effect/proc_holder/spell/proc/shadowling_check(var/mob/living/carbon/human/H)
if(!H || !istype(H)) return
- if(H.get_species() == "Shadowling" && is_shadow(H)) return 1
- if(H.get_species() == "Lesser Shadowling" && is_thrall(H)) return 1
+ if(isshadowling(H) && is_shadow(H))
+ return 1
+ if(isshadowlinglesser(H) && is_thrall(H))
+ return 1
if(!is_shadow_or_thrall(usr))
to_chat(usr, "You can't wrap your head around how to do this.")
else if(is_thrall(usr))
@@ -267,7 +269,7 @@
listclearnulls(ticker.mode.shadowling_thralls)
if(!(ling.mind in ticker.mode.shadows))
return
- if(ling.get_species() != "Shadowling")
+ if(!isshadowling(ling))
if(ticker.mode.shadowling_thralls.len >= 5)
charge_counter = charge_max
return
@@ -371,7 +373,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(H), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(H), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(H), slot_glasses)
- H.set_species("Shadowling")
+ H.set_species(/datum/species/shadow/ling)
/obj/effect/proc_holder/spell/targeted/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount
name = "Collective Hivemind"
@@ -610,7 +612,7 @@
to_chat(user, "[thrallToRevive] must be conscious to become empowered.")
charge_counter = charge_max
return
- if(thrallToRevive.get_species() == "Lesser Shadowling")
+ if(isshadowlinglesser(thrallToRevive))
to_chat(user, "[thrallToRevive] is already empowered.")
charge_counter = charge_max
return
@@ -619,7 +621,7 @@
if(!ishuman(M.current))
return
var/mob/living/carbon/human/H = M.current
- if(H.get_species() == "Lesser Shadowling")
+ if(isshadowlinglesser(H))
empowered_thralls++
if(empowered_thralls >= EMPOWERED_THRALL_LIMIT)
to_chat(user, "You cannot spare this much energy. There are too many empowered thralls.")
@@ -644,7 +646,7 @@
thrallToRevive.visible_message("[thrallToRevive] slowly rises, no longer recognizable as human.", \
"You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \
darkness but wither slowly in light. In addition, you now have glare and true shadow walk.")
- thrallToRevive.set_species("Lesser Shadowling")
+ thrallToRevive.set_species(/datum/species/shadow/ling/lesser)
thrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_shadow_walk)
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/glare(null))
thrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/shadow_walk(null))
diff --git a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
index 4239b5db327..03780f7a47e 100644
--- a/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/special_shadowling_abilities.dm
@@ -91,7 +91,7 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
H.equip_to_slot_or_del(new /obj/item/clothing/gloves/shadowling(user), slot_gloves)
H.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/shadowling(user), slot_wear_mask)
H.equip_to_slot_or_del(new /obj/item/clothing/glasses/shadowling(user), slot_glasses)
- H.set_species("Shadowling") //can't be a shadowling without being a shadowling
+ H.set_species(/datum/species/shadow/ling) //can't be a shadowling without being a shadowling
H.mind.RemoveSpell(src)
diff --git a/code/game/gamemodes/vampire/vampire_powers.dm b/code/game/gamemodes/vampire/vampire_powers.dm
index c9dad5c510d..6d82f6c48e1 100644
--- a/code/game/gamemodes/vampire/vampire_powers.dm
+++ b/code/game/gamemodes/vampire/vampire_powers.dm
@@ -239,7 +239,7 @@
if(ishuman(user))
var/mob/living/carbon/human/H = user
scramble(1, H, 100)
- H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species.
+ H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
H.sync_organ_dna(assimilate = 1)
H.update_body(0)
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
diff --git a/code/game/gamemodes/wizard/artefact.dm b/code/game/gamemodes/wizard/artefact.dm
index 7c1a3526002..2ac4bc0b2f8 100644
--- a/code/game/gamemodes/wizard/artefact.dm
+++ b/code/game/gamemodes/wizard/artefact.dm
@@ -321,11 +321,11 @@ var/global/list/multiverse = list()
to_chat(M, "You are an alternate version of [user.real_name] from another universe! Help [user.p_them()] accomplish [user.p_their()] goals at all costs.")
M.faction = list("[user.real_name]")
if(duplicate_self)
- M.set_species(user.get_species()) //duplicate the sword user's species.
+ M.set_species(user.dna.species.type) //duplicate the sword user's species.
else
if(prob(50))
- var/list/all_species = list("Human","Unathi","Skrell","Tajaran","Kidan","Golem","Diona","Machine","Slime People","Grey","Vulpkanin")
- M.set_species(pick(all_species))
+ var/list/list_all_species = list(/datum/species/human, /datum/species/unathi, /datum/species/skrell, /datum/species/tajaran, /datum/species/kidan, /datum/species/golem, /datum/species/diona, /datum/species/machine, /datum/species/slime, /datum/species/grey, /datum/species/vulpkanin)
+ M.set_species(pick(list_all_species))
M.real_name = user.real_name //this is clear down here in case the user happens to become a golem; that way they have the proper name.
M.name = user.real_name
if(duplicate_self)
@@ -429,7 +429,7 @@ var/global/list/multiverse = list()
M.equip_to_slot_or_del(sword, slot_r_hand) //Don't duplicate what's equipped to hands, or else duplicate swords could be generated...or weird cases of factionless swords.
else
- if(M.get_species() == "Tajaran" || M.get_species() == "Unathi")
+ if(istajaran(M) || isunathi(M))
M.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(M), slot_shoes) //If they can't wear shoes, give them a pair of sandals.
var/randomize = pick("mobster","roman","wizard","cyborg","syndicate","assistant", "animu", "cultist", "highlander", "clown", "killer", "pirate", "soviet", "officer", "gladiator")
@@ -461,7 +461,7 @@ var/global/list/multiverse = list()
M.equip_to_slot_or_del(sword, slot_r_hand)
if("cyborg")
- if(M.get_species() != "Machine")
+ if(!ismachine(M))
for(var/obj/item/organ/O in M.bodyparts)
O.robotize(make_tough = 1)
M.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal/eyepatch(M), slot_glasses)
@@ -584,10 +584,10 @@ var/global/list/multiverse = list()
W.SetOwnerInfo(M)
M.equip_to_slot_or_del(W, slot_wear_id)
- if(M.get_species() == "Vox")
- M.species.after_equip_job(null, M) //Voxygen(tm)
- if(M.get_species() == "Plasmaman")
- M.species.after_equip_job(null, M) //No fireballs from other dimensions.
+ if(isvox(M))
+ M.dna.species.after_equip_job(null, M) //Nitrogen tanks
+ if(isplasmaman(M))
+ M.dna.species.after_equip_job(null, M) //No fireballs from other dimensions.
M.update_icons()
@@ -646,7 +646,7 @@ var/global/list/multiverse = list()
if(heresy)
spawnheresy(M)//oh god why
else
- M.set_species("Skeleton")
+ M.set_species(/datum/species/skeleton)
M.visible_message(" A massive amount of flesh sloughs off [M] and a skeleton rises up!")
M.revive()
equip_skeleton(M)
@@ -713,7 +713,7 @@ var/global/list/multiverse = list()
H.equip_to_slot_or_del(new /obj/item/twohanded/spear(H), slot_back)
/obj/item/necromantic_stone/proc/spawnheresy(mob/living/carbon/human/H as mob)
- H.set_species("Human")
+ H.set_species(/datum/species/human)
if(H.gender == MALE)
H.change_gender(FEMALE)
diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm
index b5e798b95c7..18dda0fcbc4 100644
--- a/code/game/gamemodes/wizard/wizard.dm
+++ b/code/game/gamemodes/wizard/wizard.dm
@@ -141,7 +141,7 @@
wizard_mob.equip_to_slot_or_del(new /obj/item/radio/headset(wizard_mob), slot_l_ear)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(wizard_mob), slot_w_uniform)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(wizard_mob), slot_shoes)
- if(wizard_mob.get_species() != "Plasmaman") //handled in the species file for plasmen on the afterjob equip proc for now
+ if(!isplasmaman(wizard_mob)) //handled in the species file for plasmen on the afterjob equip proc for now
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/suit/wizrobe(wizard_mob), slot_wear_suit)
wizard_mob.equip_to_slot_or_del(new /obj/item/clothing/head/wizard(wizard_mob), slot_head)
wizard_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/satchel(wizard_mob), slot_back)
@@ -153,7 +153,7 @@
wizard_mob.faction = list("wizard")
- wizard_mob.species.after_equip_job(null, wizard_mob)
+ wizard_mob.dna.species.after_equip_job(null, wizard_mob)
to_chat(wizard_mob, "You will find a list of available spells in your spell book. Choose your magic arsenal carefully.")
to_chat(wizard_mob, "The spellbook is bound to you, and others cannot use it.")
diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm
index ffcb288c1c5..418539b5bed 100644
--- a/code/game/jobs/job/job.dm
+++ b/code/game/jobs/job/job.dm
@@ -74,12 +74,12 @@
if(!H)
return 0
- H.species.before_equip_job(src, H, visualsOnly)
+ H.dna.species.before_equip_job(src, H, visualsOnly)
if(outfit)
H.equipOutfit(outfit, visualsOnly)
- H.species.after_equip_job(src, H, visualsOnly)
+ H.dna.species.after_equip_job(src, H, visualsOnly)
if(!visualsOnly && announce)
announce(H)
@@ -183,7 +183,7 @@
else
permitted = TRUE
- if(G.whitelisted && (G.whitelisted != H.species.name || !is_alien_whitelisted(H, G.whitelisted)))
+ if(G.whitelisted && (G.whitelisted != H.dna.species.name || !is_alien_whitelisted(H, G.whitelisted)))
permitted = FALSE
if(!permitted)
diff --git a/code/game/jobs/job/support.dm b/code/game/jobs/job/support.dm
index 154a34750cd..5c4c559a8b0 100644
--- a/code/game/jobs/job/support.dm
+++ b/code/game/jobs/job/support.dm
@@ -244,7 +244,7 @@
if(visualsOnly)
return
- if(H.get_species() == "Machine")
+ if(ismachine(H))
var/obj/item/organ/internal/cyberimp/brain/clown_voice/implant = new
implant.insert(H)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 934e925ce62..44ef4ee26da 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -92,7 +92,7 @@
if(filtering > 0)
if(beaker)
// To prevent runtimes from drawing blood from runtime, and to prevent getting IPC blood.
- if(!istype(occupant) || !occupant.dna || (NO_BLOOD in occupant.species.species_traits))
+ if(!istype(occupant) || !occupant.dna || (NO_BLOOD in occupant.dna.species.species_traits))
filtering = 0
return
@@ -167,10 +167,10 @@
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
// Because we can put simple_animals in here, we need to do something tricky to get things working nice
occupantData["temperatureSuitability"] = 0 // 0 is the baseline
- if(ishuman(occupant) && occupant.species)
+ if(ishuman(occupant) && occupant.dna.species)
// I wanna do something where the bar gets bluer as the temperature gets lower
// For now, I'll just use the standard format for the temperature status
- var/datum/species/sp = occupant.species
+ var/datum/species/sp = occupant.dna.species
if(occupant.bodytemperature < sp.cold_level_3)
occupantData["temperatureSuitability"] = -3
else if(occupant.bodytemperature < sp.cold_level_2)
@@ -197,7 +197,7 @@
crisis = (occupant.health < min_health)
// I'm not sure WHY you'd want to put a simple_animal in a sleeper, but precedent is precedent
// Runtime is aptly named, isn't she?
- if(ishuman(occupant) && !(NO_BLOOD in occupant.species.species_traits))
+ if(ishuman(occupant) && !(NO_BLOOD in occupant.dna.species.species_traits))
occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL)
occupantData["hasBlood"] = 1
occupantData["bloodLevel"] = round(occupant.blood_volume)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 1d70b389a94..2566cc0f410 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -387,7 +387,7 @@
var/bloodData[0]
bloodData["hasBlood"] = 0
- if(ishuman(H) && !(NO_BLOOD in H.species.species_traits))
+ if(ishuman(H) && !(NO_BLOOD in H.dna.species.species_traits))
bloodData["hasBlood"] = 1
bloodData["volume"] = H.blood_volume
bloodData["percent"] = round(((H.blood_volume / BLOOD_VOLUME_NORMAL)*100))
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index 0e9f261d73d..e555ee91ce8 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -6,15 +6,18 @@
use_power = 2
idle_power_usage = 5
active_power_usage = 10
- layer = 5
+ layer = WALL_OBJ_LAYER
+
armor = list(melee = 50, bullet = 20, laser = 20, energy = 20, bomb = 0, bio = 0, rad = 0)
var/datum/wires/camera/wires = null // Wires datum
+ max_integrity = 100
+ integrity_failure = 50
var/list/network = list("SS13")
var/c_tag = null
var/c_tag_order = 999
var/status = 1
- anchored = 1
- var/start_active = 0 //If it ignores the random chance to start broken on round start
+ anchored = TRUE
+ var/start_active = FALSE //If it ignores the random chance to start broken on round start
var/invuln = null
var/obj/item/camera_bug/bug = null
var/obj/item/camera_assembly/assembly = null
@@ -24,17 +27,14 @@
var/view_range = 7
var/short_range = 2
- var/light_disabled = 0
- var/alarm_on = 0
- var/busy = 0
- var/emped = 0 //Number of consecutive EMP's on this camera
+ var/busy = FALSE
+ var/emped = FALSE //Number of consecutive EMP's on this camera
- var/toggle_message = 'sound/items/Wirecutter.ogg'
+ var/toggle_sound = 'sound/items/Wirecutter.ogg'
/obj/machinery/camera/New()
..()
wires = new(src)
-
assembly = new(src)
assembly.state = 4
assembly.anchored = 1
@@ -46,14 +46,14 @@
/obj/machinery/camera/Initialize()
..()
if(is_station_level(z) && prob(3) && !start_active)
- toggle_cam()
+ toggle_cam(null, FALSE)
wires.CutAll()
/obj/machinery/camera/Destroy()
- toggle_cam(null, 0) //kick anyone viewing out
+ toggle_cam(null, FALSE) //kick anyone viewing out
QDEL_NULL(assembly)
if(istype(bug))
- bug.bugged_cameras -= src.c_tag
+ bug.bugged_cameras -= c_tag
if(bug.current == src)
bug.current = null
bug = null
@@ -71,147 +71,124 @@
return
if(!isEmpProof())
if(prob(150/severity))
- icon_state = "[initial(icon_state)]emp"
+ update_icon()
var/list/previous_network = network
network = list()
cameranet.removeCamera(src)
stat |= EMPED
set_light(0)
emped = emped+1 //Increase the number of consecutive EMP's
+ update_icon()
var/thisemp = emped //Take note of which EMP this proc is for
spawn(900)
- if(loc) //qdel limbo
+ if(!QDELETED(src))
triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect.
if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again
network = previous_network
- icon_state = initial(icon_state)
stat &= ~EMPED
- cancelCameraAlarm()
+ update_icon()
if(can_use())
cameranet.addCamera(src)
emped = 0 //Resets the consecutive EMP count
spawn(100)
if(!QDELETED(src))
cancelCameraAlarm()
- for(var/mob/O in mob_list)
- if(O.client && O.client.eye == src)
- O.unset_machine()
- O.reset_perspective(null)
- to_chat(O, "The screen bursts into static.")
+ for(var/mob/M in player_list)
+ if(M.client && M.client.eye == src)
+ M.unset_machine()
+ M.reset_perspective(null)
+ to_chat(M, "The screen bursts into static.")
..()
-/obj/machinery/camera/tesla_act(var/power)//EMP proof upgrade also makes it tesla immune
+/obj/machinery/camera/tesla_act(power)//EMP proof upgrade also makes it tesla immune
if(isEmpProof())
return
..()
qdel(src)//to prevent bomb testing camera from exploding over and over forever
-/obj/machinery/camera/ex_act(severity, target)
- if(src.invuln)
+/obj/machinery/camera/ex_act(severity)
+ if(invuln)
return
- else
- ..()
- return
-
-/obj/machinery/camera/blob_act()
- qdel(src)
- return
-
-/obj/machinery/camera/attack_ghost(mob/user)
- if(panel_open)
- wires.Interact(user)
-
-/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user)
- if(!istype(user))
- return
- user.do_attack_animation(src)
- add_hiddenprint(user)
- status = 0
- visible_message("\The [user] slashes at [src]!")
- playsound(src.loc, 'sound/weapons/slash.ogg', 100, 1)
- toggle_cam(user, 0)
-
+ ..()
/obj/machinery/camera/proc/setViewRange(num = 7)
- src.view_range = num
+ view_range = num
cameranet.updateVisibility(src, 0)
-/obj/machinery/camera/attackby(obj/item/W, mob/living/user as mob, params)
- var/msg = "You attach [W] into the assembly inner circuits."
+/obj/machinery/camera/attackby(obj/item/I, mob/living/user, params)
+ var/msg = "You attach [I] into the assembly inner circuits."
var/msg2 = "The camera already has that upgrade!"
// DECONSTRUCTION
- if(istype(W, /obj/item/screwdriver))
-// to_chat(user, "You start to [panel_open ? "close" : "open"] the camera's panel.")
- //if(toggle_panel(user)) // No delay because no one likes screwdrivers trying to be hip and have a duration cooldown
+ if(isscrewdriver(I))
panel_open = !panel_open
- user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!",
- "You screw the camera's panel [panel_open ? "open" : "closed"].")
- playsound(src.loc, W.usesound, 50, 1)
+ to_chat(user, "You screw the camera's panel [panel_open ? "open" : "closed"].")
+ playsound(loc, I.usesound, 50, 1)
- else if((istype(W, /obj/item/wirecutters) || istype(W, /obj/item/multitool)) && panel_open)
+ else if((iswirecutter(I) || ismultitool(I)) && panel_open)
wires.Interact(user)
- else if(istype(W, /obj/item/weldingtool) && wires.CanDeconstruct())
- if(weld(W, user))
- to_chat(user, "You unweld the camera leaving it as just a frame screwed to the wall.")
- if(!assembly)
- assembly = new()
- assembly.loc = src.loc
- assembly.state = 1
- assembly.dir = src.dir
- assembly.update_icon()
- assembly = null
- qdel(src)
+ else if(iswelder(I) && panel_open && wires.CanDeconstruct())
+ var/obj/item/weldingtool/WT = I
+ if(!WT.remove_fuel(0, user))
return
- else if(istype(W, /obj/item/analyzer) && panel_open) //XRay
- if(!user.unEquip(W))
- to_chat(user, "[W] is stuck!")
+ to_chat(user, "You start to weld [src]...")
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 100 * WT.toolspeed, target = src))
+ user.visible_message("[user] unwelds [src], leaving it as just a frame bolted to the wall.",
+ "You unweld [src], leaving it as just a frame bolted to the wall")
+ deconstruct(TRUE)
+
+ else if(istype(I, /obj/item/analyzer) && panel_open) //XRay
+ if(!user.drop_item())
+ to_chat(user, "[I] is stuck to your hand!")
return
if(!isXRay())
upgradeXRay()
- qdel(W)
+ qdel(I)
to_chat(user, "[msg]")
else
to_chat(user, "[msg2]")
- else if(istype(W, /obj/item/stack/sheet/mineral/plasma) && panel_open)
- if(!user.unEquip(W))
- to_chat(user, "[W] is stuck!")
+ else if(istype(I, /obj/item/stack/sheet/mineral/plasma) && panel_open)
+ if(!user.drop_item())
+ to_chat(user, "[I] is stuck to your hand!")
return
if(!isEmpProof())
+ var/obj/item/stack/sheet/mineral/plasma/P = I
upgradeEmpProof()
to_chat(user, "[msg]")
- qdel(W)
+ P.use(1)
else
to_chat(user, "[msg2]")
- else if(istype(W, /obj/item/assembly/prox_sensor) && panel_open)
- if(!user.unEquip(W))
+ else if(istype(I, /obj/item/assembly/prox_sensor) && panel_open)
+ if(!user.drop_item())
+ to_chat(user, "[I] is stuck to your hand!")
return
if(!isMotion())
upgradeMotion()
to_chat(user, "[msg]")
- qdel(W)
+ qdel(I)
else
to_chat(user, "[msg2]")
// OTHER
- else if((istype(W, /obj/item/paper) || istype(W, /obj/item/pda)) && isliving(user))
+ else if((istype(I, /obj/item/paper) || istype(I, /obj/item/pda)) && isliving(user))
var/mob/living/U = user
var/obj/item/paper/X = null
- var/obj/item/pda/P = null
+ var/obj/item/pda/PDA = null
var/itemname = ""
var/info = ""
- if(istype(W, /obj/item/paper))
- X = W
+ if(istype(I, /obj/item/paper))
+ X = I
itemname = X.name
info = X.info
else
- P = W
- var/datum/data/pda/app/notekeeper/N = P.find_program(/datum/data/pda/app/notekeeper)
+ PDA = I
+ var/datum/data/pda/app/notekeeper/N = PDA.find_program(/datum/data/pda/app/notekeeper)
if(N)
- itemname = P.name
+ itemname = PDA.name
info = N.notehtml
to_chat(U, "You hold \the [itemname] up to the camera ...")
U.changeNext_move(CLICK_CD_MELEE)
@@ -229,37 +206,59 @@
to_chat(O, "[U] holds \a [itemname] up to one of the cameras ...")
O << browse(text("
[][]", itemname, info), text("window=[]", itemname))
- else if(istype(W, /obj/item/camera_bug))
- if(!src.can_use())
+ else if(istype(I, /obj/item/camera_bug))
+ if(!can_use())
to_chat(user, "Camera non-functional.")
return
- if(istype(src.bug))
+ if(istype(bug))
to_chat(user, "Camera bug removed.")
- src.bug.bugged_cameras -= src.c_tag
- src.bug = null
+ bug.bugged_cameras -= c_tag
+ bug = null
else
to_chat(user, "Camera bugged.")
- src.bug = W
- src.bug.bugged_cameras[src.c_tag] = src
+ bug = I
+ bug.bugged_cameras[c_tag] = src
- else if(istype(W, /obj/item/melee/energy/blade))//Putting it here last since it's a special case. I wonder if there is a better way to do these than type casting.
- toggle_cam(user, 1)
- var/datum/effect_system/spark_spread/spark_system = new /datum/effect_system/spark_spread()
- spark_system.set_up(5, 0, loc)
- spark_system.start()
- playsound(loc, W.usesound, 50, 1)
- playsound(loc, "sparks", 50, 1)
- visible_message("[user] has sliced the camera apart with an energy blade!")
- qdel(src)
-
- else if(istype(W, /obj/item/laser_pointer))
- var/obj/item/laser_pointer/L = W
+ else if(istype(I, /obj/item/laser_pointer))
+ var/obj/item/laser_pointer/L = I
L.laser_act(src, user)
else
- ..()
- return
+ return ..()
-/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = 1)
+/obj/machinery/camera/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir)
+ if(damage_flag == "melee" && damage_amount < 12 && !(stat & BROKEN))
+ return 0
+ . = ..()
+
+/obj/machinery/camera/obj_break(damage_flag)
+ if(status)
+ triggerCameraAlarm()
+ toggle_cam(null, FALSE)
+ wires.CutAll()
+
+/obj/machinery/camera/deconstruct(disassembled = TRUE)
+ if(disassembled)
+ if(!assembly)
+ assembly = new()
+ assembly.forceMove(loc)
+ assembly.state = 1
+ assembly.setDir(dir)
+ assembly.update_icon()
+ assembly = null
+ else
+ new /obj/item/camera_assembly(loc)
+ new /obj/item/stack/cable_coil(loc, 2)
+ qdel(src)
+
+/obj/machinery/camera/update_icon()
+ if(!status)
+ icon_state = "[initial(icon_state)]1"
+ else if(stat & EMPED)
+ icon_state = "[initial(icon_state)]emp"
+ else
+ icon_state = "[initial(icon_state)]"
+
+/obj/machinery/camera/proc/toggle_cam(mob/user, displaymessage = TRUE)
status = !status
if(can_use())
cameranet.addCamera(src)
@@ -268,10 +267,7 @@
cameranet.removeCamera(src)
cameranet.updateChunk(x, y, z)
var/change_msg = "deactivates"
- if(!status)
- icon_state = "[initial(icon_state)]1"
- else
- icon_state = initial(icon_state)
+ if(status)
change_msg = "reactivates"
triggerCameraAlarm()
spawn(100)
@@ -284,7 +280,8 @@
else
visible_message("\The [src] [change_msg]!")
- playsound(src.loc, toggle_message, 100, 1)
+ playsound(loc, toggle_sound, 100, 1)
+ update_icon()
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -295,16 +292,11 @@
O.reset_perspective(null)
to_chat(O, "The screen bursts into static.")
-/obj/machinery/camera/proc/triggerCameraAlarm(var/duration = 0)
- alarm_on = 1
- motion_alarm.triggerAlarm(loc, src)
+/obj/machinery/camera/proc/triggerCameraAlarm()
+ camera_alarm.triggerAlarm(loc, src)
/obj/machinery/camera/proc/cancelCameraAlarm()
- if(wires.IsIndexCut(CAMERA_WIRE_ALARM))
- return
-
- alarm_on = 0
- motion_alarm.clearAlarm(loc, src)
+ camera_alarm.clearAlarm(loc, src)
/obj/machinery/camera/proc/can_use()
if(!status)
@@ -331,25 +323,25 @@
//If someone knows a better way to do this, let me know. -Giacom
switch(i)
if(NORTH)
- src.dir = SOUTH
+ setDir(SOUTH)
if(SOUTH)
- src.dir = NORTH
+ setDir(NORTH)
if(WEST)
- src.dir = EAST
+ setDir(EAST)
if(EAST)
- src.dir = WEST
+ setDir(WEST)
break
//Return a working camera that can see a given mob
//or null if none
-/proc/seen_by_camera(var/mob/M)
+/proc/seen_by_camera(mob/M)
for(var/obj/machinery/camera/C in oview(4, M))
if(C.can_use()) // check if camera disabled
return C
break
return null
-/proc/near_range_camera(var/mob/M)
+/proc/near_range_camera(mob/M)
for(var/obj/machinery/camera/C in range(4, M))
if(C.can_use()) // check if camera disabled
return C
@@ -357,32 +349,15 @@
return null
-/obj/machinery/camera/proc/weld(var/obj/item/weldingtool/WT, var/mob/user)
- if(busy)
- return 0
- if(!WT.remove_fuel(0, user))
- return 0
-
- to_chat(user, "You start to weld [src]...")
- playsound(src.loc, WT.usesound, 50, 1)
- busy = 1
- if(do_after(user, 100 * WT.toolspeed, target = src))
- busy = 0
- if(!WT.isOn())
- return 0
- return 1
- busy = 0
- return 0
-
-/obj/machinery/camera/proc/Togglelight(on=0)
+/obj/machinery/camera/proc/Togglelight(on = FALSE)
for(var/mob/living/silicon/ai/A in ai_list)
for(var/obj/machinery/camera/cam in A.lit_cameras)
if(cam == src)
return
if(on)
- src.set_light(AI_CAMERA_LUMINOSITY)
+ set_light(AI_CAMERA_LUMINOSITY)
else
- src.set_light(0)
+ set_light(0)
/obj/machinery/camera/proc/nano_structure()
var/cam[0]
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index dc5a0141b27..8baf02088bb 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -6,7 +6,8 @@
w_class = WEIGHT_CLASS_SMALL
anchored = 0
materials = list(MAT_METAL=400, MAT_GLASS=250)
-
+ max_integrity = 150
+ can_be_hit = TRUE
// Motion, EMP-Proof, X-Ray
var/list/obj/item/possible_upgrades = list(/obj/item/assembly/prox_sensor, /obj/item/stack/sheet/mineral/plasma, /obj/item/analyzer)
var/list/upgrades = list()
@@ -24,13 +25,13 @@
QDEL_LIST(upgrades)
return ..()
-/obj/item/camera_assembly/attackby(obj/item/W, mob/living/user, params)
+/obj/item/camera_assembly/attackby(obj/item/I, mob/living/user, params)
switch(state)
if(0)
// State 0
- if(iswrench(W) && isturf(src.loc))
- playsound(src.loc, W.usesound, 50, 1)
+ if(iswrench(I) && isturf(loc))
+ playsound(loc, I.usesound, 50, 1)
to_chat(user, "You wrench the assembly into place.")
anchored = 1
state = 1
@@ -40,15 +41,15 @@
if(1)
// State 1
- if(iswelder(W))
- if(weld(W, user))
+ if(iswelder(I))
+ if(weld(I, user))
to_chat(user, "You weld the assembly securely into place.")
anchored = 1
state = 2
return
- else if(iswrench(W))
- playsound(src.loc, W.usesound, 50, 1)
+ else if(iswrench(I))
+ playsound(loc, I.usesound, 50, 1)
to_chat(user, "You unattach the assembly from it's place.")
anchored = 0
update_icon()
@@ -57,19 +58,18 @@
if(2)
// State 2
- if(iscoil(W))
- var/obj/item/stack/cable_coil/C = W
+ if(iscoil(I))
+ var/obj/item/stack/cable_coil/C = I
if(C.use(2))
to_chat(user, "You add wires to the assembly.")
- playsound(loc, W.usesound, 50, 1)
+ playsound(loc, I.usesound, 50, 1)
state = 3
else
to_chat(user, "You need 2 coils of wire to wire the assembly.")
return
- else if(iswelder(W))
-
- if(weld(W, user))
+ else if(iswelder(I))
+ if(weld(I, user))
to_chat(user, "You unweld the assembly from it's place.")
state = 1
anchored = 1
@@ -78,8 +78,8 @@
if(3)
// State 3
- if(isscrewdriver(W))
- playsound(src.loc, W.usesound, 50, 1)
+ if(isscrewdriver(I))
+ playsound(loc, I.usesound, 50, 1)
var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
if(!input)
@@ -96,8 +96,8 @@
input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag))
state = 4
- var/obj/machinery/camera/C = new(src.loc)
- src.loc = C
+ var/obj/machinery/camera/C = new(loc)
+ loc = C
C.assembly = src
C.auto_turn()
@@ -119,35 +119,36 @@
break
return
- else if(iswirecutter(W))
+ else if(iswirecutter(I))
new/obj/item/stack/cable_coil(get_turf(src), 2)
- playsound(src.loc, W.usesound, 50, 1)
+ playsound(loc, I.usesound, 50, 1)
to_chat(user, "You cut the wires from the circuits.")
state = 2
return
// Upgrades!
- if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already.
- if(!user.unEquip(W))
- to_chat(user, "[W] is stuck!")
+ if(is_type_in_list(I, possible_upgrades) && !is_type_in_list(I, upgrades)) // Is a possible upgrade and isn't in the camera already.
+ if(!user.unEquip(I))
+ to_chat(user, "[I] is stuck!")
return
- to_chat(user, "You attach \the [W] into the assembly inner circuits.")
- upgrades += W
+ to_chat(user, "You attach [I] into the assembly inner circuits.")
+ upgrades += I
user.drop_item()
- W.loc = src
+ I.loc = src
return
// Taking out upgrades
- else if(iscrowbar(W) && upgrades.len)
+ else if(iscrowbar(I) && upgrades.len)
var/obj/U = locate(/obj) in upgrades
if(U)
to_chat(user, "You unattach an upgrade from the assembly.")
- playsound(src.loc, W.usesound, 50, 1)
+ playsound(loc, I.usesound, 50, 1)
U.loc = get_turf(src)
upgrades -= U
return
- ..()
+ else
+ return ..()
/obj/item/camera_assembly/update_icon()
if(anchored)
@@ -159,7 +160,7 @@
if(!anchored)
..()
-/obj/item/camera_assembly/proc/weld(var/obj/item/weldingtool/WT, var/mob/living/user)
+/obj/item/camera_assembly/proc/weld(obj/item/weldingtool/WT, mob/living/user)
if(busy)
return 0
@@ -167,7 +168,7 @@
return 0
to_chat(user, "You start to weld the [src]..")
- playsound(src.loc, WT.usesound, 50, 1)
+ playsound(loc, WT.usesound, 50, 1)
busy = 1
if(do_after(user, 20 * WT.toolspeed, target = src))
busy = 0
@@ -176,3 +177,7 @@
return 1
busy = 0
return 0
+
+/obj/item/camera_assembly/deconstruct(disassembled = TRUE)
+ new /obj/item/stack/sheet/metal(loc)
+ qdel(src)
\ No newline at end of file
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 881136dbd58..798a01f2bda 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -231,7 +231,7 @@
R.dna = new /datum/dna()
var/mob/living/carbon/human/H = new /mob/living/carbon/human(src)
- H.set_species(R.dna.species)
+ H.set_species(R.dna.species.type)
occupant = H
if(!R.dna.real_name) //to prevent null names
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 42061760d92..00bd309b21e 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -123,8 +123,8 @@
occupantData["maxTemp"] = 1000 // If you get a burning vox armalis into the sleeper, congratulations
// Because we can put simple_animals in here, we need to do something tricky to get things working nice
occupantData["temperatureSuitability"] = 0 // 0 is the baseline
- if(ishuman(occupant) && occupant.species)
- var/datum/species/sp = occupant.species
+ if(ishuman(occupant) && occupant.dna.species)
+ var/datum/species/sp = occupant.dna.species
if(occupant.bodytemperature < sp.cold_level_3)
occupantData["temperatureSuitability"] = -3
else if(occupant.bodytemperature < sp.cold_level_2)
@@ -147,7 +147,7 @@
occupantData["btCelsius"] = occupant.bodytemperature - T0C
occupantData["btFaren"] = ((occupant.bodytemperature - T0C) * (9.0/5.0))+ 32
- if(ishuman(occupant) && !(NO_BLOOD in occupant.species.species_traits))
+ if(ishuman(occupant) && !(NO_BLOOD in occupant.dna.species.species_traits))
occupantData["pulse"] = occupant.get_pulse(GETPULSE_TOOL)
occupantData["hasBlood"] = 1
occupantData["bloodLevel"] = round(occupant.blood_volume)
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 2b3c338fa3d..67f1dba85f0 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -117,7 +117,7 @@
return
laws = M.laws
- if(istype(P, /obj/item/mmi) || istype(P, /obj/item/mmi/posibrain))
+ if(istype(P, /obj/item/mmi))
if(!P:brainmob)
to_chat(user, "Sticking an empty [P] into the frame would sort of defeat the purpose.")
return
diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm
index 00f6a98f2bc..99eaeae3fe6 100644
--- a/code/game/machinery/computer/camera_advanced.dm
+++ b/code/game/machinery/computer/camera_advanced.dm
@@ -31,6 +31,7 @@
for(var/V in actions)
var/datum/action/A = V
A.Remove(user)
+ actions.Cut()
if(user.client)
user.reset_perspective(null)
eyeobj.RemoveImages()
@@ -52,6 +53,7 @@
if(current_user)
current_user.unset_machine()
QDEL_NULL(eyeobj)
+ QDEL_LIST(actions)
return ..()
/obj/machinery/computer/camera_advanced/on_unset_machine(mob/M)
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index 95aee7cb9fe..c134747cd41 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -356,15 +356,14 @@
return
if(scan_brain && !can_brainscan())
return
- if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (NO_SCAN in subject.species.species_traits))
+ if((isnull(subject)) || (!(ishuman(subject))) || (!subject.dna) || (NO_SCAN in subject.dna.species.species_traits))
scantemp = "Error: Unable to locate valid genetic data."
SSnanoui.update_uis(src)
return
if(subject.get_int_organ(/obj/item/organ/internal/brain))
var/obj/item/organ/internal/brain/Brn = subject.get_int_organ(/obj/item/organ/internal/brain)
if(istype(Brn))
- var/datum/species/S = all_species[Brn.dna.species] // stepladder code wooooo
- if(NO_SCAN in S.species_traits)
+ if(NO_SCAN in Brn.dna.species.species_traits)
scantemp = "Error: Subject's brain is incompatible."
SSnanoui.update_uis(src)
return
@@ -402,10 +401,9 @@
var/obj/item/organ/B = subject.get_int_organ(/obj/item/organ/internal/brain)
B.dna.check_integrity()
R.dna=B.dna.Clone()
- var/datum/species/S = all_species[R.dna.species]
- if(NO_SCAN in S.species_traits)
+ if(NO_SCAN in R.dna.species.species_traits)
extra_info = "Proper genetic interface not found, defaulting to genetic data of the body."
- R.dna.species = subject.species.name
+ R.dna.species = new subject.dna.species.type
R.id= copytext(md5(B.dna.real_name), 2, 6)
R.name=B.dna.real_name
else
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 0f09d337897..332dc2854e1 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -239,7 +239,7 @@
)
// These items will NOT be preserved
var/list/do_not_preserve_items = list (
- /obj/item/mmi/posibrain
+ /obj/item/mmi/robotic_brain
)
/obj/machinery/cryopod/right
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 527ed23639c..f06f7ac1b37 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -8,6 +8,20 @@ var/list/doppler_arrays = list()
density = 1
anchored = 1
atom_say_verb = "states coldly"
+ var/list/logged_explosions = list()
+
+/datum/explosion_log
+ var/logged_time
+ var/epicenter
+ var/actual_size_message
+ var/theoretical_size_message
+
+/datum/explosion_log/New(var/log_time, var/log_epicenter, var/log_actual_size_message, var/log_theoretical_size_message)
+ ..()
+ logged_time = log_time
+ epicenter = log_epicenter
+ actual_size_message = log_actual_size_message
+ theoretical_size_message = log_theoretical_size_message
/obj/machinery/doppler_array/New()
..()
@@ -15,6 +29,7 @@ var/list/doppler_arrays = list()
/obj/machinery/doppler_array/Destroy()
doppler_arrays -= src
+ logged_explosions.Cut()
return ..()
/obj/machinery/doppler_array/process()
@@ -34,53 +49,102 @@ var/list/doppler_arrays = list()
else
return ..()
-/obj/machinery/doppler_array/verb/rotate()
+/obj/machinery/doppler_array/attack_hand(mob/user)
+ if(..())
+ return
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/doppler_array/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/machinery/doppler_array/AltClick(mob/user)
+ rotate(user)
+
+/obj/machinery/doppler_array/verb/rotate(mob/user)
set name = "Rotate Tachyon-doppler Dish"
set category = "Object"
set src in oview(1)
- if(!usr || !isturf(usr.loc))
+ if(user.incapacitated())
return
- if(usr.stat || usr.restrained() || !usr.canmove)
+ if(!Adjacent(user))
return
- src.dir = turn(src.dir, 90)
- return
+ if(!user.IsAdvancedToolUser())
+ to_chat(user, "You don't have the dexterity to do that!")
+ return
+ dir = turn(dir, 90)
+ to_chat(user, "You rotate [src].")
+
+/obj/machinery/doppler_array/proc/print_explosive_logs(mob/user)
+ if(!logged_explosions.len)
+ atom_say("No logs currently stored in internal database.")
+ return
+ if(active_timers)
+ to_chat(user, "[src] is already printing something, please wait.")
+ return
+ atom_say("Printing explosive log. Standby...")
+ addtimer(CALLBACK(src, .print), 50)
+
+/obj/machinery/doppler_array/proc/print()
+ visible_message("[src] prints a piece of paper!")
+ playsound(loc, 'sound/goonstation/machines/printer_dotmatrix.ogg', 50, 1)
+ var/obj/item/paper/explosive_log/P = new(get_turf(src))
+ for(var/D in logged_explosions)
+ var/datum/explosion_log/E = D
+ P.info += "\
+ | [E.logged_time] | \
+ [E.epicenter] | \
+ [E.actual_size_message] | \
+ [E.theoretical_size_message] | \
+
"
+ P.info += "
\
+ Printed at [station_time_timestamp()]."
/obj/machinery/doppler_array/proc/sense_explosion(var/x0,var/y0,var/z0,var/devastation_range,var/heavy_impact_range,var/light_impact_range,
var/took,var/orig_dev_range,var/orig_heavy_range,var/orig_light_range)
- if(stat & NOPOWER) return
- if(z != z0) return
+ if(stat & NOPOWER)
+ return
+ if(z != z0)
+ return
var/dx = abs(x0-x)
var/dy = abs(y0-y)
var/distance
var/direct
+ var/capped = FALSE
if(dx > dy)
distance = dx
- if(x0 > x) direct = EAST
- else direct = WEST
+ if(x0 > x)
+ direct = EAST
+ else
+ direct = WEST
else
distance = dy
- if(y0 > y) direct = NORTH
- else direct = SOUTH
-
- if(distance > 100) return
- if(!(direct & dir)) return
+ if(y0 > y)
+ direct = NORTH
+ else
+ direct = SOUTH
+ if(distance > 100)
+ return
+ if(!(direct & dir))
+ return
var/list/messages = list("Explosive disturbance detected.", \
"Epicenter at: grid ([x0],[y0]). Temporal displacement of tachyons: [took] seconds.", \
"Factual: Epicenter radius: [devastation_range]. Outer radius: [heavy_impact_range]. Shockwave radius: [light_impact_range].")
- // If the bomb was capped, say it's theoretical size.
+ // If the bomb was capped, say its theoretical size.
if(devastation_range < orig_dev_range || heavy_impact_range < orig_heavy_range || light_impact_range < orig_light_range)
+ capped = TRUE
messages += "Theoretical: Epicenter radius: [orig_dev_range]. Outer radius: [orig_heavy_range]. Shockwave radius: [orig_light_range]."
-
+ logged_explosions.Insert(1, new /datum/explosion_log(station_time_timestamp(), "[x0],[y0]", "[devastation_range], [heavy_impact_range], [light_impact_range]", capped ? "[orig_dev_range], [orig_heavy_range], [orig_light_range]" : "n/a")) //Newer logs appear first
+ messages += "Event successfully logged in internal database."
for(var/message in messages)
atom_say(message)
-
/obj/machinery/doppler_array/power_change()
if(stat & BROKEN)
icon_state = "[initial(icon_state)]-broken"
@@ -90,4 +154,55 @@ var/list/doppler_arrays = list()
stat &= ~NOPOWER
else
icon_state = "[initial(icon_state)]-off"
- stat |= NOPOWER
\ No newline at end of file
+ stat |= NOPOWER
+
+/obj/machinery/doppler_array/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = SSnanoui.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "doppler_array.tmpl", "Tachyon-doppler array", 500, 650)
+ ui.open()
+ ui.set_auto_update(1)
+
+/obj/machinery/doppler_array/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
+ var/data[0]
+ var/list/explosion_data = list()
+ for(var/D in logged_explosions)
+ var/datum/explosion_log/E = D
+ explosion_data += list(list(
+ "logged_time" = E.logged_time,
+ "epicenter" = E.epicenter,
+ "actual_size_message" = E.actual_size_message,
+ "theoretical_size_message" = E.theoretical_size_message,
+ "unique_datum_id" = E.UID()))
+ data["explosion_data"] = explosion_data
+ data["printing"] = active_timers
+ return data
+
+/obj/machinery/doppler_array/Topic(href, href_list)
+ if(..())
+ return
+ if(href_list["log_to_delete"])
+ var/log_to_delete = sanitize(href_list["log_to_delete"])
+ for(var/D in logged_explosions)
+ var/datum/explosion_log/E = D
+ if(E.UID() == log_to_delete)
+ logged_explosions -= E
+ qdel(E)
+ to_chat(usr, "Log deletion successful.")
+ break
+ else if(href_list["print_logs"])
+ print_explosive_logs(usr)
+ else
+ return
+ SSnanoui.update_uis(src)
+
+/obj/item/paper/explosive_log
+ name = "explosive log"
+ info = "Explosive Log Report
\
+ \
+ \
+ | Time logged | \
+ Epicenter | \
+ Actual | \
+ Theoretical | \
+
" //NB: the tag is left open, it is closed later on, when the doppler array adds its data
diff --git a/code/game/machinery/dye_generator.dm b/code/game/machinery/dye_generator.dm
index 89974f9b337..52b11da599b 100644
--- a/code/game/machinery/dye_generator.dm
+++ b/code/game/machinery/dye_generator.dm
@@ -98,11 +98,11 @@
var/mob/living/carbon/human/H = M
var/dye_list = list("hair", "alt. hair theme")
- if(H.gender == MALE || H.get_species() == "Vulpkanin")
+ if(H.gender == MALE || isvulpkanin(H))
dye_list += "facial hair"
dye_list += "alt. facial hair theme"
- if(H && (H.species.bodyflags & HAS_SKIN_COLOR))
+ if(H && (H.dna.species.bodyflags & HAS_SKIN_COLOR))
dye_list += "body"
var/what_to_dye = input(user, "Choose an area to apply the dye", "Dye Application") in dye_list
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index a29dcb9e274..aef8de7c306 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -117,7 +117,6 @@ Class Procs:
var/use_log = list()
var/list/settagwhitelist = list()//WHITELIST OF VARIABLES THAT THE set_tag HREF CAN MODIFY, DON'T PUT SHIT YOU DON'T NEED ON HERE, AND IF YOU'RE GONNA USE set_tag (format_tag() proc), ADD TO THIS LIST.
atom_say_verb = "beeps"
- var/speed_process = 0 // Process as fast as possible?
var/defer_process = 0
/obj/machinery/Initialize()
@@ -138,7 +137,7 @@ Class Procs:
isprocessing = TRUE // all of these isprocessing = TRUE can be removed when the PS is dead
// gotta go fast
-/obj/machinery/proc/makeSpeedProcess()
+/obj/machinery/makeSpeedProcess()
if(speed_process)
return
speed_process = 1
@@ -147,7 +146,7 @@ Class Procs:
isprocessing = TRUE
// gotta go slow
-/obj/machinery/proc/makeNormalProcess()
+/obj/machinery/makeNormalProcess()
if(!speed_process)
return
speed_process = 0
@@ -562,7 +561,7 @@ Class Procs:
if(istype(perp.belt, /obj/item/gun) || istype(perp.belt, /obj/item/melee))
threatcount += 2
- if(perp.species.name != "Human") //beepsky so racist.
+ if(!ishumanbasic(perp)) //beepsky so racist.
threatcount += 2
if(check_records || check_arrest)
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index 2d5a885aba1..270b2a99411 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -1,44 +1,3 @@
-#define PIPE_SIMPLE_STRAIGHT 0
-#define PIPE_SIMPLE_BENT 1
-#define PIPE_HE_STRAIGHT 2
-#define PIPE_HE_BENT 3
-#define PIPE_CONNECTOR 4
-#define PIPE_MANIFOLD 5
-#define PIPE_JUNCTION 6
-#define PIPE_UVENT 7
-#define PIPE_MVALVE 8
-#define PIPE_PUMP 9
-#define PIPE_SCRUBBER 10
-#define PIPE_INSULATED_STRAIGHT 11
-#define PIPE_INSULATED_BENT 12
-#define PIPE_GAS_FILTER 13
-#define PIPE_GAS_MIXER 14
-#define PIPE_PASSIVE_GATE 15
-#define PIPE_VOLUME_PUMP 16
-#define PIPE_HEAT_EXCHANGE 17
-#define PIPE_TVALVE 18
-#define PIPE_MANIFOLD4W 19
-#define PIPE_CAP 20
-#define PIPE_OMNI_MIXER 21
-#define PIPE_OMNI_FILTER 22
-#define PIPE_UNIVERSAL 23
-#define PIPE_SUPPLY_STRAIGHT 24
-#define PIPE_SUPPLY_BENT 25
-#define PIPE_SCRUBBERS_STRAIGHT 26
-#define PIPE_SCRUBBERS_BENT 27
-#define PIPE_SUPPLY_MANIFOLD 28
-#define PIPE_SCRUBBERS_MANIFOLD 29
-#define PIPE_SUPPLY_MANIFOLD4W 30
-#define PIPE_SCRUBBERS_MANIFOLD4W 31
-#define PIPE_SUPPLY_CAP 32
-#define PIPE_SCRUBBERS_CAP 33
-#define PIPE_INJECTOR 34
-#define PIPE_DVALVE 35
-#define PIPE_DP_VENT 36
-#define PIPE_PASV_VENT 37
-#define PIPE_DTVALVE 38
-#define PIPE_CIRCULATOR 39
-
/obj/item/pipe
name = "pipe"
desc = "A pipe"
@@ -180,93 +139,19 @@
//update the name and icon of the pipe item depending on the type
+/obj/item/pipe/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ if(our_rpd.mode == RPD_ROTATE_MODE)
+ rotate()
+ else if(our_rpd.mode == RPD_FLIP_MODE)
+ flip()
+ else if(our_rpd.mode == RPD_DELETE_MODE)
+ our_rpd.delete_single_pipe(user, src)
+ else
+ ..()
+
/obj/item/pipe/proc/update(var/obj/machinery/atmospherics/make_from)
- var/list/nlist = list( \
- "pipe", \
- "bent pipe", \
- "h/e pipe", \
- "bent h/e pipe", \
- "connector", \
- "manifold", \
- "junction", \
- "uvent", \
- "mvalve", \
- "pump", \
- "scrubber", \
- "insulated pipe", \
- "bent insulated pipe", \
- "gas filter", \
- "gas mixer", \
- "passive gate", \
- "volume pump", \
- "heat exchanger", \
- "t-valve", \
- "4-way manifold", \
- "pipe cap", \
- "omni mixer", \
- "omni filter", \
- "universal pipe adapter", \
- "supply pipe", \
- "bent supply pipe", \
- "scrubbers pipe", \
- "bent scrubbers pipe", \
- "supply manifold", \
- "scrubbers manifold", \
- "supply 4-way manifold", \
- "scrubbers 4-way manifold", \
- "supply pipe cap", \
- "scrubbers pipe cap", \
- "air injector", \
- "digital valve", \
- "dual-port vent", \
- "passive vent", \
- "digital t-valve", \
- "circulator/heat exchanger", \
- )
- name = nlist[pipe_type+1] + " fitting"
- var/list/islist = list( \
- "simple", \
- "simple", \
- "he", \
- "he", \
- "connector", \
- "manifold", \
- "junction", \
- "uvent", \
- "mvalve", \
- "pump", \
- "scrubber", \
- "insulated", \
- "insulated", \
- "filter", \
- "mixer", \
- "passivegate", \
- "volumepump", \
- "heunary", \
- "tvalve", \
- "manifold4w", \
- "cap", \
- "omni_mixer", \
- "omni_filter", \
- "universal", \
- "simple", \
- "simple", \
- "simple", \
- "simple", \
- "manifold", \
- "manifold", \
- "manifold4w", \
- "manifold4w", \
- "cap", \
- "cap", \
- "injector", \
- "dvalve", \
- "dual-port vent", \
- "passive vent", \
- "dtvalve", \
- "circ", \
- )
- icon_state = islist[pipe_type + 1]
+ name = "[get_pipe_name(pipe_type, PIPETYPE_ATMOS)] fitting"
+ icon_state = get_pipe_icon(pipe_type)
var/obj/machinery/atmospherics/trinary/triP = make_from
if(istype(triP) && triP.flipped)
icon_state = "m_[icon_state]"
@@ -650,6 +535,12 @@
to_chat(user, "You have fastened the meter to the pipe.")
qdel(src)
+/obj/item/pipe_meter/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ if(our_rpd.mode == RPD_DELETE_MODE)
+ our_rpd.delete_single_pipe(user, src)
+ else
+ ..()
+
/obj/item/pipe_gsensor
name = "gas sensor"
desc = "A sensor that can be hooked to a computer"
@@ -667,43 +558,8 @@
to_chat(user, "You have fastened the gas sensor.")
qdel(src)
-#undef PIPE_SIMPLE_STRAIGHT
-#undef PIPE_SIMPLE_BENT
-#undef PIPE_HE_STRAIGHT
-#undef PIPE_HE_BENT
-#undef PIPE_CONNECTOR
-#undef PIPE_MANIFOLD
-#undef PIPE_JUNCTION
-#undef PIPE_UVENT
-#undef PIPE_MVALVE
-#undef PIPE_PUMP
-#undef PIPE_SCRUBBER
-#undef PIPE_INSULATED_STRAIGHT
-#undef PIPE_INSULATED_BENT
-#undef PIPE_GAS_FILTER
-#undef PIPE_GAS_MIXER
-#undef PIPE_PASSIVE_GATE
-#undef PIPE_VOLUME_PUMP
-#undef PIPE_HEAT_EXCHANGE
-#undef PIPE_TVALVE
-#undef PIPE_MANIFOLD4W
-#undef PIPE_CAP
-#undef PIPE_OMNI_MIXER
-#undef PIPE_OMNI_FILTER
-#undef PIPE_UNIVERSAL
-#undef PIPE_SUPPLY_STRAIGHT
-#undef PIPE_SUPPLY_BENT
-#undef PIPE_SCRUBBERS_STRAIGHT
-#undef PIPE_SCRUBBERS_BENT
-#undef PIPE_SUPPLY_MANIFOLD
-#undef PIPE_SCRUBBERS_MANIFOLD
-#undef PIPE_SUPPLY_MANIFOLD4W
-#undef PIPE_SCRUBBERS_MANIFOLD4W
-#undef PIPE_SUPPLY_CAP
-#undef PIPE_SCRUBBERS_CAP
-#undef PIPE_INJECTOR
-#undef PIPE_DVALVE
-#undef PIPE_DP_VENT
-#undef PIPE_PASV_VENT
-#undef PIPE_DTVALVE
-#undef PIPE_CIRCULATOR
+/obj/item/pipe_gsensor/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ if(our_rpd.mode == RPD_DELETE_MODE)
+ our_rpd.delete_single_pipe(user, src)
+ else
+ ..()
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index cb2892722aa..43613ef4990 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -10,12 +10,12 @@
/obj/machinery/pipedispenser/attack_hand(mob/user)
if(..())
return 1
-
+
interact(user)
-
+
/obj/machinery/pipedispenser/attack_ghost(mob/user)
interact(user)
-
+
/obj/machinery/pipedispenser/interact(mob/user)
var/dat = {"
Regular pipes:
@@ -163,22 +163,22 @@
/obj/machinery/pipedispenser/disposal/attack_hand(mob/user)
if(..())
return
-
+
interact(user)
-
+
/obj/machinery/pipedispenser/disposal/attack_ghost(mob/user)
interact(user)
-
+
/obj/machinery/pipedispenser/disposal/interact(mob/user)
var/dat = {"Disposal Pipes
-Pipe
-Bent Pipe
-Junction
-Y-Junction
-Trunk
-Bin
-Outlet
-Chute
+Pipe
+Bent Pipe
+Junction
+Y-Junction
+Trunk
+Bin
+Outlet
+Chute
"}
var/datum/browser/popup = new(user, "pipedispenser", name, 400, 400)
@@ -194,29 +194,10 @@
if(!wait)
var/p_type = text2num(href_list["dmake"])
- var/obj/structure/disposalconstruct/C = new (loc)
- switch(p_type)
- if(0)
- C.ptype = 0
- if(1)
- C.ptype = 1
- if(2)
- C.ptype = 2
- if(3)
- C.ptype = 4
- if(4)
- C.ptype = 5
- if(5)
- C.ptype = 6
- C.density = 1
- if(6)
- C.ptype = 7
- C.density = 1
- if(7)
- C.ptype = 8
- C.density = 1
+ var/obj/structure/disposalconstruct/C = new(loc, p_type)
+ if(p_type in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE))
+ C.density = TRUE
C.add_fingerprint(usr)
- C.update()
wait = 1
spawn(15)
- wait = 0
\ No newline at end of file
+ wait = 0
diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm
index 39f67a72add..3d7f6a52e70 100644
--- a/code/game/machinery/poolcontroller.dm
+++ b/code/game/machinery/poolcontroller.dm
@@ -90,9 +90,9 @@
if(drownee && (drownee.lying || deep_water)) //Mob lying down or water is deep (determined by controller)
if(drownee.internal)
return //Has internals, no drowning
- if((NO_BREATHE in drownee.species.species_traits) || (BREATHLESS in drownee.mutations))
+ if((NO_BREATHE in drownee.dna.species.species_traits) || (BREATHLESS in drownee.mutations))
return //doesn't breathe, no drowning
- if(drownee.get_species() == "Skrell" || drownee.get_species() == "Neara")
+ if(isskrell(drownee) || isneara(drownee))
return //fish things don't drown
if(drownee.stat == DEAD) //Dead spacemen don't drown more
diff --git a/code/game/machinery/transformer.dm b/code/game/machinery/transformer.dm
index 09385fa3a3e..5e99a954650 100644
--- a/code/game/machinery/transformer.dm
+++ b/code/game/machinery/transformer.dm
@@ -289,18 +289,18 @@
qdel(I)
H.equipOutfit(selected_outfit)
- H.species.after_equip_job(null, H)
+ H.dna.species.after_equip_job(null, H)
/obj/machinery/transformer/transmogrifier
name = "species transmogrifier"
desc = "As promoted in Calvin & Hobbes!"
- var/target_species = "Human"
+ var/datum/species/target_species = /datum/species/human
/obj/machinery/transformer/transmogrifier/do_transform(mob/living/carbon/human/H)
if(!istype(H))
return
- if(!(target_species in all_species))
+ if(!ispath(target_species))
to_chat(H, "'[target_species]' is not a valid species!")
return
H.set_species(target_species)
@@ -336,7 +336,7 @@
to_chat(H, "No genetic template configured!")
return
var/prev_ue = H.dna.unique_enzymes
- H.set_species(template.species)
+ H.set_species(template.species.type)
H.dna = template.Clone()
H.real_name = template.real_name
H.sync_organ_dna(assimilate = 0, old_ue = prev_ue)
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 88c15e687ac..d0af747dc64 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -158,14 +158,14 @@
overlays -= "fab-active"
desc = initial(desc)
- var/obj/item/I = new D.build_path
+ var/obj/item/I = new D.build_path(loc)
if(D.locked)
- var/obj/item/storage/lockbox/large/L = new /obj/item/storage/lockbox/large(get_step(src,SOUTH)) //(Don't use capitals in paths, or single letters.
- I.loc = L
+ var/obj/item/storage/lockbox/large/L = new /obj/item/storage/lockbox/large(get_step(src, SOUTH)) //(Don't use capitals in paths, or single letters.
+ I.forceMove(L)
L.name += " [initial(I.name)]"
L.origin_tech = I.origin_tech
else
- I.loc = get_step(src,SOUTH)
+ I.forceMove(get_step(src, SOUTH))
if(istype(I))
I.materials = res_coef
atom_say("[I] is complete.")
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index d054c163732..a2fa4220c3c 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -1206,10 +1206,10 @@
occupant = brainmob
brainmob.forceMove(src) //should allow relaymove
brainmob.canmove = 1
- if(istype(mmi_as_oc, /obj/item/mmi/posibrain))
- var/obj/item/mmi/posibrain/P = mmi_as_oc
- if(P.imprinted_master)
- to_chat(brainmob, "Your imprint to [P.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.")
+ if(istype(mmi_as_oc, /obj/item/mmi/robotic_brain))
+ var/obj/item/mmi/robotic_brain/R = mmi_as_oc
+ if(R.imprinted_master)
+ to_chat(brainmob, "Your imprint to [R.imprinted_master] has been temporarily disabled. You should help the crew and not commit harm.")
mmi_as_oc.loc = src
mmi_as_oc.mecha = src
verbs -= /obj/mecha/verb/eject
@@ -1309,10 +1309,10 @@
mmi.mecha = null
mmi.update_icon()
L.canmove = 0
- if(istype(mmi, /obj/item/mmi/posibrain))
- var/obj/item/mmi/posibrain/P = mmi
- if(P.imprinted_master)
- to_chat(L, "Imprint re-enabled, you are once again bound to [P.imprinted_master]'s commands.")
+ if(istype(mmi, /obj/item/mmi/robotic_brain))
+ var/obj/item/mmi/robotic_brain/R = mmi
+ if(R.imprinted_master)
+ to_chat(L, "Imprint re-enabled, you are once again bound to [R.imprinted_master]'s commands.")
icon_state = initial(icon_state)+"-open"
dir = dir_in
diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm
index 0e8bd6691f2..5836136401e 100644
--- a/code/game/objects/effects/effects.dm
+++ b/code/game/objects/effects/effects.dm
@@ -6,6 +6,7 @@
icon = 'icons/effects/effects.dmi'
burn_state = LAVA_PROOF | FIRE_PROOF
resistance_flags = INDESTRUCTIBLE
+ can_be_hit = FALSE
/obj/effect/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir)
return
diff --git a/code/game/objects/effects/mines.dm b/code/game/objects/effects/mines.dm
index a11236df0e5..18506a5c882 100644
--- a/code/game/objects/effects/mines.dm
+++ b/code/game/objects/effects/mines.dm
@@ -60,7 +60,7 @@
victim.apply_effect(radiation_amount, IRRADIATE, 0)
if(ishuman(victim))
var/mob/living/carbon/human/V = victim
- if(NO_DNA in V.species.species_traits)
+ if(NO_DNA in V.dna.species.species_traits)
return
randmutb(victim)
domutcheck(victim ,null)
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 646c93977fc..03b4f4adfaa 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -15,6 +15,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/inhand_x_dimension = 32
var/inhand_y_dimension = 32
+ can_be_hit = FALSE
+
var/r_speed = 1.0
var/health = null
var/hitsound = null
@@ -277,25 +279,25 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
// Due to storage type consolidation this should get used more now.
// I have cleaned it up a little, but it could probably use more. -Sayu
-/obj/item/attackby(obj/item/W as obj, mob/user as mob, params)
- if(istype(W,/obj/item/storage))
- var/obj/item/storage/S = W
+/obj/item/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/storage))
+ var/obj/item/storage/S = I
if(S.use_to_pickup)
if(S.collection_mode) //Mode is set to collect all items on a tile and we clicked on a valid one.
- if(isturf(src.loc))
+ if(isturf(loc))
var/list/rejections = list()
var/success = 0
var/failure = 0
- for(var/obj/item/I in src.loc)
- if(I.type in rejections) // To limit bag spamming: any given type only complains once
+ for(var/obj/item/IT in loc)
+ if(IT.type in rejections) // To limit bag spamming: any given type only complains once
continue
- if(!S.can_be_inserted(I)) // Note can_be_inserted still makes noise when the answer is no
- rejections += I.type // therefore full bags are still a little spammy
+ if(!S.can_be_inserted(IT)) // Note can_be_inserted still makes noise when the answer is no
+ rejections += IT.type // therefore full bags are still a little spammy
failure = 1
continue
success = 1
- S.handle_item_insertion(I, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
+ S.handle_item_insertion(IT, 1) //The 1 stops the "You put the [src] into [S]" insertion message from being displayed.
if(success && !failure)
to_chat(user, "You put everything in [S].")
else if(success)
@@ -305,8 +307,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
else if(S.can_be_inserted(src))
S.handle_item_insertion(src)
-
- return
+ else
+ return ..()
/obj/item/proc/hit_reaction(mob/living/carbon/human/owner, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK)
if(prob(final_block_chance))
diff --git a/code/game/objects/items/devices/laserpointer.dm b/code/game/objects/items/devices/laserpointer.dm
index c8ab2e1fc4f..32b548c38aa 100644
--- a/code/game/objects/items/devices/laserpointer.dm
+++ b/code/game/objects/items/devices/laserpointer.dm
@@ -81,7 +81,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if((HULK in H.mutations) || (NOGUNS in H.species.species_traits))
+ if((HULK in H.mutations) || (NOGUNS in H.dna.species.species_traits))
user << "Your fingers can't press the button!"
return
diff --git a/code/game/objects/items/devices/megaphone.dm b/code/game/objects/items/devices/megaphone.dm
index 4bbdaa2f723..4fea8e93a39 100644
--- a/code/game/objects/items/devices/megaphone.dm
+++ b/code/game/objects/items/devices/megaphone.dm
@@ -24,7 +24,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/abductor/H = user
- if(H && H.mind.abductor)
+ if(isabductor(H))
to_chat(user, "Megaphones can't project psionic communication!")
return
if(ishuman(user))
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index 12ffe91cef5..b69c1114bd6 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -1,7 +1,7 @@
/obj/item/pizza_bomb
name = "pizza box"
desc = "A box suited for pizzas."
- icon = 'icons/obj/food/food.dmi'
+ icon = 'icons/obj/food/pizza.dmi'
icon_state = "pizzabox1"
var/timer = 10 //Adjustable timer
var/timer_set = 0
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index bba03c4b07b..38a21f86b2c 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -12,6 +12,7 @@
var/self_delay = 20
var/unique_handling = 0 //some things give a special prompt, do we want to bypass some checks in parent?
var/stop_bleeding = 0
+ var/healverb = "bandage"
/obj/item/stack/medical/attack(mob/living/M, mob/user)
if(!iscarbon(M) && !isanimal(M))
@@ -77,6 +78,40 @@
"You apply [src] on [M].")
use(1)
+/obj/item/stack/medical/proc/heal(mob/living/M, mob/user)
+ var/mob/living/carbon/human/H = M
+ var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+ user.visible_message("[user] [healverb]s the wounds on [H]'s [affecting.name].", \
+ "You [healverb] the wounds on [H]'s [affecting.name]." )
+
+ var/rembrute = max(0, heal_brute - affecting.brute_dam) // Maxed with 0 since heal_damage let you pass in a negative value
+ var/remburn = max(0, heal_burn - affecting.burn_dam) // And deduct it from their health (aka deal damage)
+ var/nrembrute = rembrute
+ var/nremburn = remburn
+ affecting.heal_damage(heal_brute, heal_burn)
+ var/list/achildlist = affecting.children.Copy()
+ var/parenthealed = FALSE
+ while(rembrute + remburn > 0) // Don't bother if there's not enough leftover heal
+ var/obj/item/organ/external/E
+ if(achildlist.len)
+ E = pick_n_take(achildlist) // Pick a random children and then remove it from the list
+ else if(affecting.parent && !parenthealed) // If there's a parent and no healing attempt was made on it
+ E = affecting.parent
+ parenthealed = TRUE
+ else
+ break // If the organ have no child left and no parent / parent healed, break
+ if(E.status & ORGAN_ROBOT || E.open) // Ignore robotic or open limb
+ continue
+ else if(!E.brute_dam && !E.burn_dam) // Ignore undamaged limb
+ continue
+ nrembrute = max(0, rembrute - E.brute_dam) // Deduct the healed damage from the remain
+ nremburn = max(0, remburn - E.burn_dam)
+ E.heal_damage(rembrute, remburn)
+ rembrute = nrembrute
+ remburn = nremburn
+ user.visible_message("[user] [healverb]s the wounds on [H]'s [E.name] with the remaining medication.", \
+ "You [healverb] the wounds on [H]'s [E.name] with the remaining medication." )
+
//Bruise Packs//
/obj/item/stack/medical/bruise_pack
@@ -98,13 +133,12 @@
if(affecting.open == 0)
affecting.germ_level = 0
- user.visible_message("[user] bandages the wounds on [H]'s [affecting.name].", \
- "You bandage the wounds on [H]'s [affecting.name]." )
-
if(stop_bleeding)
if(!H.bleedsuppress) //so you can't stack bleed suppression
H.suppress_bloodloss(stop_bleeding)
- affecting.heal_damage(heal_brute, heal_burn)
+
+ heal(H, user)
+
H.UpdateDamageIcon()
use(1)
else
@@ -131,6 +165,7 @@
singular_name = "ointment"
icon_state = "ointment"
origin_tech = "biotech=2"
+ healverb = "salve"
/obj/item/stack/medical/ointment/attack(mob/living/M, mob/user)
if(..())
@@ -143,9 +178,8 @@
if(affecting.open == 0)
affecting.germ_level = 0
- user.visible_message("[user] salves the wounds on [H]'s [affecting.name].", \
- "You salve the wounds on [H]'s [affecting.name]." )
- affecting.heal_damage(heal_brute, heal_burn)
+ heal(H, user)
+
H.UpdateDamageIcon()
use(1)
else
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index ec8a2a5e325..c28fd68fc62 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -99,7 +99,7 @@
if(!get_location_accessible(H, "mouth"))
to_chat(user, "The mask is in the way.")
return
- if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
+ if((C.dna.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "You find yourself disappointed at the appalling lack of facial hair.")
return
if(C.f_style == "Shaved")
@@ -130,13 +130,13 @@
if(!get_location_accessible(H, "head"))
to_chat(user, "The headgear is in the way.")
return
- if((C.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
+ if((C.dna.species.bodyflags & ALL_RPARTS) && robohead.is_monitor) //If the target is of a species that can have prosthetic heads, but the head doesn't support human hair 'wigs'...
to_chat(user, "You find yourself disappointed at the appalling lack of hair.")
return
if(C.h_style == "Bald" || C.h_style == "Balding Hair" || C.h_style == "Skinhead")
to_chat(user, "There is not enough hair left to shave...")
return
- if(M.get_species() == "Skrell")
+ if(isskrell(M))
to_chat(user, "Your razor isn't going to cut through tentacles.")
return
if(H == user) //shaving yourself
diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm
index 3a8bf12b143..3a7e203101d 100644
--- a/code/game/objects/items/weapons/dna_injector.dm
+++ b/code/game/objects/items/weapons/dna_injector.dm
@@ -74,7 +74,7 @@
H = M
spawn(0) //Some mutations have sleeps in them, like monkey
- if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.species.species_traits))) // prevents drained people from having their DNA changed
+ if(!(NOCLONE in M.mutations) && !(H && (NO_DNA in H.dna.species.species_traits))) // prevents drained people from having their DNA changed
var/prev_ue = M.dna.unique_enzymes
var/mutflags = 0
// UI in syringe.
@@ -113,7 +113,7 @@
if(ishuman(M)) // Would've done this via species instead of type, but the basic mob doesn't have a species, go figure.
var/mob/living/carbon/human/H = M
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
return 0
if(!user.IsAdvancedToolUser())
diff --git a/code/game/objects/items/weapons/dnascrambler.dm b/code/game/objects/items/weapons/dnascrambler.dm
index 2866e8d06ec..fc13fa69f79 100644
--- a/code/game/objects/items/weapons/dnascrambler.dm
+++ b/code/game/objects/items/weapons/dnascrambler.dm
@@ -24,7 +24,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(NO_DNA in H.species.species_traits)
+ if(NO_DNA in H.dna.species.species_traits)
to_chat(user, "You failed to inject [M], as [M.p_they()] [M.p_have()] no DNA to scramble, nor flesh to inject.")
return
@@ -43,7 +43,7 @@
if(istype(target))
var/mob/living/carbon/human/H = target
scramble(1, H, 100)
- H.real_name = random_name(H.gender, H.species.name) //Give them a name that makes sense for their species.
+ H.real_name = random_name(H.gender, H.dna.species.name) //Give them a name that makes sense for their species.
H.sync_organ_dna(assimilate = 1)
H.update_body(0)
H.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover.
diff --git a/code/game/objects/items/weapons/implants/implant_abductor.dm b/code/game/objects/items/weapons/implants/implant_abductor.dm
index 0d5bc869e44..3ec571c94a6 100644
--- a/code/game/objects/items/weapons/implants/implant_abductor.dm
+++ b/code/game/objects/items/weapons/implants/implant_abductor.dm
@@ -28,8 +28,9 @@
var/obj/machinery/abductor/console/console
if(ishuman(source))
var/mob/living/carbon/human/H = source
- if(H.get_species() == "Abductor")
- console = get_team_console(H.mind.abductor.team)
+ if(isabductor(H))
+ var/datum/species/abductor/S = H.dna.species
+ console = get_team_console(S.team)
home = console.pad
if(!home)
diff --git a/code/game/objects/items/weapons/rpd.dm b/code/game/objects/items/weapons/rpd.dm
index aaaf034b933..e130c3ed606 100644
--- a/code/game/objects/items/weapons/rpd.dm
+++ b/code/game/objects/items/weapons/rpd.dm
@@ -2,28 +2,8 @@
Rapid Pipe Dispenser
*/
-#define SIMPLE_CAP 20
-#define SUPPLY_CAP 32
-#define SCRUBBERS_CAP 33
-#define HE_EXCHANGER 17
-#define CONNECTOR 4
-#define UNARY_VENT 7
-#define PASSIVE_VENT 37
-#define GAS_SCRUBBER 10
-#define INJECTOR 34
-#define GAS_SENSOR 98
-#define METER 99
-#define DISPOSALS_JUNCTION 2
-#define ATMOS_MODE 1
-#define DISPOSALS_MODE 2
-#define ROTATION_MODE 3
-#define FLIP_MODE 4
-#define DELETE_MODE 5
-#define ATMOS_PIPING 1
-#define SUPPLY_PIPING 2
-#define SCRUBBERS_PIPING 3
-#define DEVICES 4
-#define HEAT_PIPING 5
+#define RPD_COOLDOWN_TIME 4 //How long should we have to wait between dispensing pipes?
+#define RPD_WALLBUILD_TIME 40 //How long should drilling into a wall take?
/obj/item/rpd
name = "rapid pipe dispenser"
@@ -43,13 +23,13 @@
origin_tech = "engineering=4;materials=2"
var/datum/effect_system/spark_spread/spark_system
var/lastused
- var/iconrotation = 0 //used to orient icons and pipes
- var/mode = 1 //Disposals, atmospherics, etc.
- var/pipetype = 1//For nanoUI menus
- var/whatpipe = 0 //What kind of pipe is it? See code/game/machinery/pipe/construction.dm for a list of defines
- var/whatdpipe = 0 //What kind of disposals pipe is it? See code/game/machinery/pipe/dispenser.dm for a list of defines
- var/spawndelay = 4 //How long should we have to wait between dispensing pipes?
- var/walldelay = 40 //How long should drilling into a wall take?
+ var/iconrotation = 0 //Used to orient icons and pipes
+ var/mode = RPD_ATMOS_MODE //Disposals, atmospherics, etc.
+ var/pipe_category = RPD_ATMOS_PIPING//For nanoUI menus, this is a subtype of pipes e.g. scrubbers pipes, devices
+ var/whatpipe = PIPE_SIMPLE_STRAIGHT //What kind of atmos pipe is it?
+ var/whatdpipe = PIPE_DISPOSALS_STRAIGHT //What kind of disposals pipe is it?
+ var/spawndelay = RPD_COOLDOWN_TIME
+ var/walldelay = RPD_WALLBUILD_TIME
/obj/item/rpd/New()
..()
@@ -57,82 +37,112 @@
spark_system.set_up(1, 0, src)
spark_system.attach(src)
+/obj/item/rpd/Destroy()
+ QDEL_NULL(spark_system)
+ return ..()
+
//Procs
-/obj/item/rpd/proc/Activaterpd(delay)
+/obj/item/rpd/proc/activate_rpd(delay) //Maybe makes sparks and activates cooldown if there is a delay
playsound(loc, "sound/machines/click.ogg", 50, 1)
if(prob(15))
spark_system.start()
if(delay)
lastused = world.time
-/obj/item/rpd/proc/Manipulatepipes(subject, atmosverb, disposalsverb)
- if(istype(subject, /obj/item/pipe))
- call(subject, atmosverb)()
- else if(istype(subject, /obj/structure/disposalconstruct/))
- call(subject, disposalsverb)()
+/obj/item/rpd/proc/can_dispense_pipe(var/pipe_id, var/pipe_type) //Returns TRUE if this is a legit pipe we can dispense, otherwise returns FALSE
+ for(var/list/L in GLOB.rpd_pipe_list)
+ if(pipe_type != L["pipe_type"]) //Sometimes pipes in different categories have the same pipe_id, so we need to skip anything not in the category we want
+ continue
+ if(pipe_id == L["pipe_id"]) //Found the pipe, we can dispense it
+ return TRUE
+
+/obj/item/rpd/proc/create_atmos_pipe(mob/user, turf/T) //Make an atmos pipe, meter, or gas sensor
+ if(!can_dispense_pipe(whatpipe, RPD_ATMOS_MODE))
+ log_runtime(EXCEPTION("Failed to spawn [get_pipe_name(whatpipe, PIPETYPE_ATMOS)] - possible tampering detected")) //Damn dirty apes -- I mean hackers
+ return
+ var/obj/item/pipe/P
+ if(whatpipe == PIPE_GAS_SENSOR)
+ P = new /obj/item/pipe_gsensor(T)
+ else if(whatpipe == PIPE_METER)
+ P = new /obj/item/pipe_meter(T)
+ else
+ P = new(T, whatpipe, iconrotation) //Make the pipe, BUT WAIT! There's more!
+ if(!iconrotation && P.is_bent_pipe()) //Automatically rotates dispensed pipes if the user selected auto-rotation
+ P.dir = turn(user.dir, 135)
+ else if(!iconrotation && P.pipe_type in list(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_CAP, PIPE_SUPPLY_CAP, PIPE_SCRUBBERS_CAP, PIPE_INJECTOR, PIPE_PASV_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
+ P.flip()
+ else if(iconrotation && P.is_bent_pipe()) //If user selected a rotation and the pipe is bent
+ P.dir = turn(iconrotation, -45)
+ else if(!iconrotation) //If user selected a rotation
+ P.dir = user.dir
+ to_chat(user, "[src] rapidly dispenses [P]!")
+ activate_rpd(TRUE)
+
+/obj/item/rpd/proc/create_disposals_pipe(mob/user, turf/T) //Make a disposals pipe / construct
+ if(!can_dispense_pipe(whatdpipe, RPD_DISPOSALS_MODE))
+ log_runtime(EXCEPTION("Failed to spawn [get_pipe_name(whatdpipe, PIPETYPE_DISPOSAL)] - possible tampering detected"))
+ return
+ var/obj/structure/disposalconstruct/P = new(T, whatdpipe, iconrotation)
+ if(!iconrotation) //Automatic rotation
+ P.dir = user.dir
+ if(!iconrotation && whatdpipe != PIPE_DISPOSALS_JUNCTION_RIGHT) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though
+ P.flip()
+ to_chat(user, "[src] rapidly dispenses [P]!")
+ activate_rpd(TRUE)
+
+/obj/item/rpd/proc/rotate_all_pipes(mob/user, turf/T) //Rotate all pipes on a turf
+ for(var/obj/item/pipe/P in T)
+ P.rotate()
+ for(var/obj/structure/disposalconstruct/D in T)
+ D.rotate()
+
+/obj/item/rpd/proc/flip_all_pipes(mob/user, turf/T) //Flip all pipes on a turf
+ for(var/obj/item/pipe/P in T)
+ P.flip()
+ for(var/obj/structure/disposalconstruct/D in T)
+ D.flip()
+
+/obj/item/rpd/proc/delete_all_pipes(mob/user, turf/T) //Delete all pipes on a turf
+ var/eaten
+ for(var/obj/item/pipe/P in T)
+ QDEL_NULL(P)
+ eaten = TRUE
+ for(var/obj/item/pipe_gsensor/G in T)
+ QDEL_NULL(G)
+ eaten = TRUE
+ for(var/obj/item/pipe_meter/M in T)
+ QDEL_NULL(M)
+ eaten = TRUE
+ for(var/obj/structure/disposalconstruct/D in T)
+ if(!D.anchored)
+ QDEL_NULL(D)
+ eaten = TRUE
+ if(eaten)
+ to_chat(user, "[src] sucks up the loose pipes on [T].")
+ activate_rpd()
+ else
+ to_chat(user, "There were no loose pipes on [T].")
+
+/obj/item/rpd/proc/delete_single_pipe(mob/user, obj/P) //Delete a single pipe
+ to_chat(user, "[src] sucks up [P].")
+ QDEL_NULL(P)
+ activate_rpd()
//Lists of things
-var/list/pipelist = list( //id refers to the pipe_type found in construction.dm, icon refers to the name of the icon state in icons/obj/pipe-item.dmi. Icons are made with the asset-cache
- list("pipename" = "Straight pipe", "id" = 0, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "simple"),
- list("pipename" = "Bent pipe", "id" = 1, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1),
- list("pipename" = "T-manifold", "id" = 5, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "manifold"),
- list("pipename" = "4-way manifold", "id" = 19, "category" = ATMOS_PIPING, "orientations" = 1, "icon" = "manifold4w"),
- list("pipename" = "Pipe cap", "id" = 20, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "cap"),
- list("pipename" = "Manual valve", "id" = 8, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "mvalve"),
- list("pipename" = "Digital valve", "id" = 35, "category" = ATMOS_PIPING, "orientations" = 2, "icon" = "dvalve"),
- list("pipename" = "Manual T-valve", "id" = 18, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "tvalve"),
- list("pipename" = "Digital T-valve", "id" = 38, "category" = ATMOS_PIPING, "orientations" = 4, "icon" = "dtvalve"),
- list("pipename" = "Straight supply pipe", "id" = 24, "category" = SUPPLY_PIPING, "orientations" = 2, "icon" = "simple"),
- list("pipename" = "Bent supply pipe", "id" = 25, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1),
- list("pipename" = "Supply T-manifold", "id" = 28, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "manifold"),
- list("pipename" = "4-way supply manifold", "id" = 30, "category" = SUPPLY_PIPING, "orientations" = 1, "icon" = "manifold4w"),
- list("pipename" = "Supply pipe cap", "id" = 32, "category" = SUPPLY_PIPING, "orientations" = 4, "icon" = "cap"),
- list("pipename" = "Straight scrubbers pipe", "id" = 26, "category" = SCRUBBERS_PIPING, "orientations" = 2, "icon" = "simple"),
- list("pipename" = "Bent scrubbers pipe", "id" = 27, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "simple", "bendy" = 1),
- list("pipename" = "Scrubbers T-manifold", "id" = 29, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "manifold"),
- list("pipename" = "4-way scrubbers manifold", "id" = 31, "category" = SCRUBBERS_PIPING, "orientations" = 1, "icon" = "manifold4w"),
- list("pipename" = "Scrubbers pipe cap", "id" = 33, "category" = SCRUBBERS_PIPING, "orientations" = 4, "icon" = "cap"),
- list("pipename" = "Universal pipe adapter", "id" = 23, "category" = DEVICES, "orientations" = 2, "icon" = "universal"),
- list("pipename" = "Connector", "id" = 4, "category" = DEVICES, "orientations" = 4, "icon" = "connector"),
- list("pipename" = "Unary vent", "id" = 7, "category" = DEVICES, "orientations" = 4, "icon" = "uvent"),
- list("pipename" = "Scrubber", "id" = 10, "category" = DEVICES, "orientations" = 4, "icon" = "scrubber"),
- list("pipename" = "Gas pump", "id" = 9, "category" = DEVICES, "orientations" = 4, "icon" = "pump"),
- list("pipename" = "Volume pump", "id" = 16, "category" = DEVICES, "orientations" = 4, "icon" = "volumepump"),
- list("pipename" = "Passive gate", "id" = 15, "category" = DEVICES, "orientations" = 4, "icon" = "passivegate"),
- list("pipename" = "Gas filter", "id" = 13, "category" = DEVICES, "orientations" = 4, "icon" = "filter"),
- list("pipename" = "Gas mixer", "id" = 14, "category" = DEVICES, "orientations" = 4, "icon" = "mixer"),
- list("pipename" = "Gas sensor", "id" = 98, "category" = DEVICES, "orientations" = 1, "icon" = "sensor"),
- list("pipename" = "Meter", "id" = 99, "category" = DEVICES, "orientations" = 1, "icon" = "meter"),
- list("pipename" = "Passive vent", "id" = 37, "category" = DEVICES, "orientations" = 4, "icon" = "passive vent"),
- list("pipename" = "Dual-port vent pump", "id" = 36, "category" = DEVICES, "orientations" = 2, "icon" = "dual-port vent"),
- list("pipename" = "Air injector", "id" = 34, "category" = DEVICES, "orientations" = 4, "icon" = "injector"),
- list("pipename" = "Straight HE pipe", "id" = 2, "category" = HEAT_PIPING, "orientations" = 2, "icon" = "he"),
- list("pipename" = "Bent HE pipe", "id" = 3, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "he", "bendy" = 1),
- list("pipename" = "Junction", "id" = 6, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "junction"),
- list("pipename" = "Heat exchanger", "id" = 17, "category" = HEAT_PIPING, "orientations" = 4, "icon" = "heunary"))
-var/list/dpipelist = list(
- list("pipename" = "Straight pipe", "id" = 0, "orientations" = 2, "icon" = "conpipe-s"),
- list("pipename" = "Bent pipe", "id" = 1, "orientations" = 4, "icon" = "conpipe-c"),
- list("pipename" = "Junction", "id" = 2, "orientations" = 4, "icon" = "conpipe-j1"),
- list("pipename" = "Y-junction", "id" = 4, "orientations" = 4, "icon" = "conpipe-y"),
- list("pipename" = "Trunk", "id" = 5, "orientations" = 4, "icon" = "conpipe-t"),
- list("pipename" = "Bin", "id" = 6, "orientations" = 1, "icon" = "condisposal"),
- list("pipename" = "Outlet", "id" = 7, "orientations" = 4, "icon" = "outlet"),
- list("pipename" = "Chute", "id" = 8, "orientations" = 4, "icon" = "intake"))
var/list/mainmenu = list(
- list("category" = "Atmospherics", "mode" = 1, "icon" = "wrench"),
- list("category" = "Disposals", "mode" = 2, "icon" = "recycle"),
- list("category" = "Rotate", "mode" = 3, "icon" = "rotate-right"),
- list("category" = "Flip", "mode" = 4, "icon" = "exchange"),
- list("category" = "Recycle", "mode" = 5, "icon" = "trash"))
+ list("category" = "Atmospherics", "mode" = RPD_ATMOS_MODE, "icon" = "wrench"),
+ list("category" = "Disposals", "mode" = RPD_DISPOSALS_MODE, "icon" = "recycle"),
+ list("category" = "Rotate", "mode" = RPD_ROTATE_MODE, "icon" = "rotate-right"),
+ list("category" = "Flip", "mode" = RPD_FLIP_MODE, "icon" = "exchange"),
+ list("category" = "Recycle", "mode" = RPD_DELETE_MODE, "icon" = "trash"))
var/list/pipemenu = list(
- list("pipecategory" = "Normal", "pipemode" = 1),
- list("pipecategory" = "Supply", "pipemode" = 2),
- list("pipecategory" = "Scrubber", "pipemode" = 3),
- list("pipecategory" = "Devices", "pipemode" = 4),
- list("pipecategory" = "Heat exchange", "pipemode" = 5))
+ list("category" = "Normal", "pipemode" = RPD_ATMOS_PIPING),
+ list("category" = "Supply", "pipemode" = RPD_SUPPLY_PIPING),
+ list("category" = "Scrubber", "pipemode" = RPD_SCRUBBERS_PIPING),
+ list("category" = "Devices", "pipemode" = RPD_DEVICES),
+ list("category" = "Heat exchange", "pipemode" = RPD_HEAT_PIPING))
//NanoUI stuff
@@ -148,13 +158,12 @@ var/list/pipemenu = list(
/obj/item/rpd/ui_data(mob/user, ui_key = "main", datum/topic_state/state = inventory_state)
var/data[0]
- data["dpipelist"] = dpipelist
data["iconrotation"] = iconrotation
data["mainmenu"] = mainmenu
data["mode"] = mode
- data["pipelist"] = pipelist
+ data["pipelist"] = GLOB.rpd_pipe_list
data["pipemenu"] = pipemenu
- data["pipetype"] = pipetype
+ data["pipe_category"] = pipe_category
data["whatdpipe"] = whatdpipe
data["whatpipe"] = whatpipe
return data
@@ -167,99 +176,23 @@ var/list/pipemenu = list(
whatpipe = text2num(sanitize(href_list["whatpipe"]))
else if(href_list["whatdpipe"])
whatdpipe = text2num(sanitize(href_list["whatdpipe"]))
- else if(href_list["pipetype"])
- pipetype = text2num(sanitize(href_list["pipetype"]))
+ else if(href_list["pipe_category"])
+ pipe_category = text2num(sanitize(href_list["pipe_category"]))
else if(href_list["mode"])
mode = text2num(sanitize(href_list["mode"]))
else
return
SSnanoui.update_uis(src)
-//What the RPD actually does
-
/obj/item/rpd/afterattack(atom/target, mob/user, proximity)
..()
- var/turf/T = get_turf(target)
- if(loc != user || ismob(target) || istype(target, /obj/structure/window) || !proximity || world.time < lastused + spawndelay)
+ if(loc != user)
return
- if(!(T.flags & RPD_ALLOWED_HERE))
- to_chat(user, "[src] beeps, \"Unable to interface with [T]. Please try again later.\"")
+ if(!proximity)
return
- if(mode == ATMOS_MODE)
- if(istype(T, /turf/simulated/wall)) //Drilling into walls takes time
- playsound(loc, "sound/weapons/circsawhit.ogg", 50, 1)
- user.visible_message("[user] starts drilling a hole in [T]...", "You start drilling a hole in [T]...", "You hear a drill.")
- if(!do_after(user, walldelay, target = T))
- return
- user.visible_message("[user] finishes drilling a hole in [T]!", "You finish drilling a hole in [T]!", "You hear clanking.")
- var/obj/item/pipe/P
- if(whatpipe == GAS_SENSOR)
- P = new /obj/item/pipe_gsensor(T)
- else if(whatpipe == METER)
- P = new /obj/item/pipe_meter(T)
- else
- P = new(T, pipe_type = whatpipe, dir = user.dir)
- if(iconrotation == 0 && P.is_bent_pipe()) //Automatic rotation of dispensed pipes
- P.dir = turn(user.dir, 135)
- else if(iconrotation == 0 && P.pipe_type in list(CONNECTOR, UNARY_VENT, GAS_SCRUBBER, HE_EXCHANGER, SIMPLE_CAP, SUPPLY_CAP, SCRUBBERS_CAP, INJECTOR, PASSIVE_VENT)) //Some pipes dispense oppositely to what you'd expect, but we don't want to do anything if they selected a direction
- P.flip()
- else if(iconrotation != 0 && P.is_bent_pipe()) //If they selected a rotation and the pipe is bent
- P.dir = turn(iconrotation, -45)
- else if(iconrotation != 0)
- P.dir = iconrotation
- to_chat(user, "[src] rapidly dispenses [P]!")
- Activaterpd(1)
- else if(mode == DISPOSALS_MODE && !istype(T, /turf/simulated/shuttle))
- if(istype(T, /turf/simulated/wall)) //No disposals pipes on walls
- to_chat(user, "That type of pipe won't fit on [T]!")
- return
- var/obj/structure/disposalconstruct/P = new(T) //Now we make the pipe
- P.dir = iconrotation
- P.ptype = whatdpipe
- if(iconrotation == 0) //Automatic rotation
- P.dir = user.dir
- if(iconrotation == 0 && whatdpipe != DISPOSALS_JUNCTION) //Disposals pipes are in the opposite direction to atmos pipes, so we need to flip them. Junctions don't have this quirk though
- P.flip()
- P.update()
- to_chat(user, "[src] rapidly dispenses [P]!")
- Activaterpd(1)
- else if(mode == ROTATION_MODE)
- for(var/obj/W in T)
- Manipulatepipes(W, /obj/item/pipe/verb/rotate, /obj/structure/disposalconstruct/verb/rotate)
- else if(mode == FLIP_MODE)
- for(var/obj/W in T)
- Manipulatepipes(W, /obj/item/pipe/verb/flip, /obj/structure/disposalconstruct/verb/flip)
- else if(mode == DELETE_MODE)
- var/eaten
- for(var/obj/W in T)
- if(istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter) || istype(W, /obj/item/pipe_gsensor) || istype(W, /obj/structure/disposalconstruct) && !W.anchored)
- QDEL_NULL(W)
- eaten = TRUE
- if(eaten)
- to_chat(user, "[src] sucks up the loose pipes on [T].")
- Activaterpd()
- else
- to_chat(user, "There were no loose pipes on [T].")
+ if(world.time < lastused + spawndelay)
+ return
+ target.rpd_act(user, src) //Handle RPD effects in separate procs
-#undef SIMPLE_CAP
-#undef SUPPLY_CAP
-#undef SCRUBBERS_CAP
-#undef HE_EXCHANGER
-#undef CONNECTOR
-#undef UNARY_VENT
-#undef PASSIVE_VENT
-#undef GAS_SCRUBBER
-#undef INJECTOR
-#undef GAS_SENSOR
-#undef METER
-#undef DISPOSALS_JUNCTION
-#undef ATMOS_MODE
-#undef DISPOSALS_MODE
-#undef ROTATION_MODE
-#undef FLIP_MODE
-#undef DELETE_MODE
-#undef ATMOS_PIPING
-#undef SUPPLY_PIPING
-#undef SCRUBBERS_PIPING
-#undef DEVICES
-#undef HEAT_PIPING
+#undef RPD_COOLDOWN_TIME
+#undef RPD_WALLBUILD_TIME
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 6ff1fbe95b0..2f53a1200a9 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -33,19 +33,19 @@
var/list/species_facial_hair = list()
var/obj/item/organ/external/head/C = H.get_organ("head")
var/datum/robolimb/robohead = all_robolimbs[C.model]
- if(H.gender == MALE || H.get_species() == "Vulpkanin")
- if(C.species)
+ if(H.gender == MALE || isvulpkanin(H))
+ if(C.dna.species)
for(var/i in facial_hair_styles_list)
var/datum/sprite_accessory/facial_hair/tmp_facial = facial_hair_styles_list[i]
- if(C.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
- if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(C.dna.species.name in tmp_facial.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human hair styles.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "You are unable to find anything on [H]'s face worth cutting. How disappointing.")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_facial_hair += i
else
- if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_facial.species_allowed)
species_facial_hair += i
@@ -57,18 +57,18 @@
var/f_new_style = input(user, "Select a facial hair style", "Grooming") as null|anything in species_facial_hair
//handle normal hair
var/list/species_hair = list()
- if(C.species)
+ if(C.dna.species)
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
- if(C.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
- if(C.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
+ if(C.dna.species.name in tmp_hair.species_allowed) //If the species is allowed to have the style, add the style to the list. Or, if the character has a prosthetic head, give them the human facial hair styles.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the character is of a species that can have full body prosthetics and their head doesn't suport human hair 'wigs', don't add the style to the list.
if(robohead.is_monitor)
to_chat(user, "You are unable to find anything on [H]'s head worth cutting. How disappointing.")
return
continue //If the head DOES support human hair wigs, make sure they don't get monitor-oriented styles.
species_hair += i
else
- if(C.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
+ if(C.dna.species.bodyflags & ALL_RPARTS) //If the target is of a species that can have prosthetic heads, and the head supports human hair 'wigs' AND the hair-style is human-suitable, add it to the list.
if(!robohead.is_monitor)
if("Human" in tmp_hair.species_allowed)
species_hair += i
diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm
index a6046b575f7..742f5b3d0c0 100644
--- a/code/game/objects/items/weapons/soap.dm
+++ b/code/game/objects/items/weapons/soap.dm
@@ -26,7 +26,7 @@
to_chat(user, "You need to take that [target.name] off before cleaning it.")
else if(target == user && user.a_intent == INTENT_GRAB && ishuman(target))
var/mob/living/carbon/human/muncher = user
- if(muncher && muncher.get_species() == "Drask")
+ if(muncher && isdrask(muncher))
to_chat(user, "You take a bite of the [name]. Delicious!")
playsound(user.loc, 'sound/items/eatfood.ogg', 50, 0)
user.nutrition += 2
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 26793a8165b..3e7f2f6f8c9 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -371,7 +371,7 @@
*/
/obj/item/storage/bag/tray
name = "tray"
- icon = 'icons/obj/food/food.dmi'
+ icon = 'icons/obj/food/containers.dmi'
icon_state = "tray"
desc = "A metal tray to lay food on."
force = 5
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 4896f2cfb60..03b5ac86870 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -14,7 +14,7 @@
*/
/obj/item/storage/fancy/
- icon = 'icons/obj/food/food.dmi'
+ icon = 'icons/obj/food/containers.dmi'
icon_state = "donutbox6"
name = "donut box"
burn_state = FLAMMABLE
@@ -43,7 +43,6 @@
*/
/obj/item/storage/fancy/donut_box
- icon = 'icons/obj/food/food.dmi'
icon_state = "donutbox6"
icon_type = "donut"
name = "donut box"
@@ -61,7 +60,6 @@
*/
/obj/item/storage/fancy/egg_box
- icon = 'icons/obj/food/food.dmi'
icon_state = "eggbox"
icon_type = "egg"
name = "egg box"
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index 93f230a07e8..66316b6f7ef 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -357,19 +357,22 @@
remove_from_storage(Item, loc, burn)
//This proc is called when you want to place an item into the storage item.
-/obj/item/storage/attackby(obj/item/W as obj, mob/user as mob, params)
+/obj/item/storage/attackby(obj/item/I, mob/user, params)
..()
-
+ if(istype(I, /obj/item/hand_labeler))
+ var/obj/item/hand_labeler/labeler = I
+ if(labeler.mode)
+ return FALSE
+ . = 1 //no afterattack
if(isrobot(user))
- to_chat(user, "You're a robot. No.")
- return 1//Robots can't interact with storage items.
+ return //Robots can't interact with storage items.
- if(!can_be_inserted(W))
- return 0
-
- handle_item_insertion(W)
- return 1
+ if(!can_be_inserted(I))
+ if(contents.len >= storage_slots) //don't use items on the backpack if they don't fit
+ return TRUE
+ return FALSE
+ handle_item_insertion(I)
/obj/item/storage/attack_hand(mob/user as mob)
playsound(src.loc, "rustle", 50, 1, -5)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index abe546d25b1..3e7f3eaffe3 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -58,7 +58,7 @@
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- if(H.species.is_small)
+ if(H.dna.species.is_small)
to_chat(user, "It's too heavy for you to wield fully.")
return
if(user.get_inactive_hand())
diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm
index 6cbc2e0e972..fcb2fab2d4e 100644
--- a/code/game/objects/items/weapons/whetstone.dm
+++ b/code/game/objects/items/weapons/whetstone.dm
@@ -10,6 +10,7 @@
var/max = 30
var/prefix = "sharpened"
var/requires_sharpness = 1
+ var/claw_damage_increase = 1
/obj/item/whetstone/attackby(obj/item/I, mob/user, params)
@@ -46,16 +47,24 @@
playsound(get_turf(src), usesound, 50, 1)
name = "worn out [name]"
desc = "[desc] At least, it used to."
- used = 1
+ used = TRUE
update_icon()
-/obj/item/whetstone/attack_self(mob/user as mob) //This is just fluff for now. Species datums are global and not newly created instances, so we can't adjust unarmed damage on a per mob basis.
+/obj/item/whetstone/attack_self(mob/user)
+ if(used)
+ to_chat(user, "The whetstone is too worn to use again!")
+ return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- var/datum/unarmed_attack/attack = H.species.unarmed
+ var/datum/unarmed_attack/attack = H.dna.species.unarmed
if(istype(attack, /datum/unarmed_attack/claws))
- H.visible_message("[H] sharpens [H.p_their()] claws on the [src]!", "You sharpen your claws on the [src].")
+ attack.damage += claw_damage_increase
+ H.visible_message("[H] sharpens [H.p_their()] claws on [src]!", "You sharpen your claws on [src].")
playsound(get_turf(H), usesound, 50, 1)
+ name = "worn out [name]"
+ desc = "[desc] At least, it used to."
+ used = TRUE
+ update_icon()
/obj/item/whetstone/super
name = "super whetstone block"
@@ -64,3 +73,4 @@
max = 200
prefix = "super-sharpened"
requires_sharpness = 0
+ claw_damage_increase = 200
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index fe9e8444378..a7e57ce5a52 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -17,6 +17,7 @@
var/integrity_failure = 0 //0 if we have no special broken behavior
var/resistance_flags = NONE // INDESTRUCTIBLE
+ var/can_be_hit = TRUE //can this be bludgeoned by items?
var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it
@@ -24,6 +25,7 @@
var/burntime = 10 //How long it takes to burn to ashes, in seconds
var/burn_world_time //What world time the object will burn up completely
var/being_shocked = 0
+ var/speed_process = FALSE
var/on_blueprints = FALSE //Are we visible on the station blueprints at roundstart?
var/force_blueprints = FALSE //forces the obj to be on the blueprints, regardless of when it was created.
@@ -65,9 +67,14 @@
/obj/Destroy()
machines -= src
processing_objects -= src
+ fast_processing -= src
SSnanoui.close_uis(src)
return ..()
+/obj/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ var/turf/T = get_turf(src) //This preserves RPD behaviour on specific turfs
+ T.rpd_act(user, our_rpd)
+
/obj/proc/process()
set waitfor = 0
processing_objects.Remove(src)
@@ -279,6 +286,24 @@ a {
/obj/proc/on_mob_move(dir, mob/user)
return
+/obj/proc/makeSpeedProcess()
+ if(speed_process)
+ return
+ speed_process = TRUE
+ processing_objects.Remove(src)
+ fast_processing.Add(src)
+
+/obj/proc/makeNormalProcess()
+ if(!speed_process)
+ return
+ speed_process = FALSE
+ processing_objects.Add(src)
+ fast_processing.Remove(src)
+
/obj/vv_get_dropdown()
. = ..()
.["Delete all of type"] = "?_src_=vars;delall=[UID()]"
+ if(!speed_process)
+ .["Make speed process"] = "?_src_=vars;makespeedy=[UID()]"
+ else
+ .["Make normal process"] = "?_src_=vars;makenormalspeed=[UID()]"
diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm
index 348c92a5335..a7233bf6a82 100644
--- a/code/game/objects/structures/dresser.dm
+++ b/code/game/objects/structures/dresser.dm
@@ -23,7 +23,7 @@
var/list/valid_underwear = list()
for(var/underwear in underwear_list)
var/datum/sprite_accessory/S = underwear_list[underwear]
- if(!(H.species.name in S.species_allowed))
+ if(!(H.dna.species.name in S.species_allowed))
continue
valid_underwear[underwear] = underwear_list[underwear]
var/new_underwear = input(user, "Choose your underwear:", "Changing") as null|anything in valid_underwear
@@ -34,7 +34,7 @@
var/list/valid_undershirts = list()
for(var/undershirt in undershirt_list)
var/datum/sprite_accessory/S = undershirt_list[undershirt]
- if(!(H.species.name in S.species_allowed))
+ if(!(H.dna.species.name in S.species_allowed))
continue
valid_undershirts[undershirt] = undershirt_list[undershirt]
var/new_undershirt = input(user, "Choose your undershirt:", "Changing") as null|anything in valid_undershirts
@@ -45,7 +45,7 @@
var/list/valid_sockstyles = list()
for(var/sockstyle in socks_list)
var/datum/sprite_accessory/S = socks_list[sockstyle]
- if(!(H.species.name in S.species_allowed))
+ if(!(H.dna.species.name in S.species_allowed))
continue
valid_sockstyles[sockstyle] = socks_list[sockstyle]
var/new_socks = input(user, "Choose your socks:", "Changing") as null|anything in valid_sockstyles
diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm
index 8d22732e5dd..3911d366ad6 100644
--- a/code/game/objects/structures/plasticflaps.dm
+++ b/code/game/objects/structures/plasticflaps.dm
@@ -86,7 +86,7 @@
return ..()
if(istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/H = M
- if(H.species.is_small)
+ if(H.dna.species.is_small)
return ..()
return 0
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 8a30f18f7bd..25c78f6e972 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -123,6 +123,9 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
new/obj/structure/window/reinforced/clockwork/fulltile(get_turf(src))
qdel(src)
+/obj/structure/window/rpd_act()
+ return
+
/obj/structure/window/singularity_pull(S, current_size)
if(current_size >= STAGE_FIVE)
deconstruct(FALSE)
diff --git a/code/game/response_team.dm b/code/game/response_team.dm
index c59dd7bd78f..646adfa2038 100644
--- a/code/game/response_team.dm
+++ b/code/game/response_team.dm
@@ -143,7 +143,7 @@ var/ert_request_answered = 0
else
M.change_gender(FEMALE)
- M.set_species("Human",1)
+ M.set_species(/datum/species/human, TRUE)
M.dna.ready_dna(M)
M.reagents.add_reagent("mutadone", 1) //No fat/blind/colourblind/epileptic/whatever ERT.
M.overeatduration = 0
@@ -158,8 +158,8 @@ var/ert_request_answered = 0
head_organ.sec_hair_colour = hair_c
M.change_eye_color(eye_c)
M.s_tone = skin_tone
- head_organ.h_style = random_hair_style(M.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(M.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(M.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(M.gender, head_organ.dna.species.name)
M.rename_character(null, "[pick("Corporal", "Sergeant", "Staff Sergeant", "Sergeant First Class", "Master Sergeant", "Sergeant Major")] [pick(last_names)]")
M.age = rand(23,35)
diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm
index 89c40be8641..61f622c071f 100644
--- a/code/game/turfs/simulated.dm
+++ b/code/game/turfs/simulated.dm
@@ -4,7 +4,6 @@
var/image/wet_overlay = null
var/thermite = 0
- flags = RPD_ALLOWED_HERE
oxygen = MOLES_O2STANDARD
nitrogen = MOLES_N2STANDARD
var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed
diff --git a/code/game/turfs/simulated/shuttle.dm b/code/game/turfs/simulated/shuttle.dm
index 0c5e6c08f6b..7a781679173 100644
--- a/code/game/turfs/simulated/shuttle.dm
+++ b/code/game/turfs/simulated/shuttle.dm
@@ -1,7 +1,6 @@
/turf/simulated/shuttle
name = "shuttle"
icon = 'icons/turf/shuttle.dmi'
- flags = null
thermal_conductivity = 0.05
heat_capacity = 0
layer = 2
@@ -13,6 +12,9 @@
density = 1
blocks_air = 1
+/turf/simulated/shuttle/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ if(our_rpd.mode == RPD_DELETE_MODE)//No pipes on shuttles
+ our_rpd.delete_all_pipes(user, src)
/turf/simulated/shuttle/narsie_act()
if(prob(20))
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index db85329f8c1..a24e6f2953f 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -168,6 +168,18 @@
if(prob(50))
dismantle_wall()
+/turf/simulated/wall/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ if(our_rpd.mode == RPD_ATMOS_MODE)
+ playsound(src, "sound/weapons/circsawhit.ogg", 50, 1)
+ user.visible_message("[user] starts drilling a hole in [src]...", "You start drilling a hole in [src]...", "You hear drilling.")
+ if(!do_after(user, our_rpd.walldelay, target = src)) //Drilling into walls takes time
+ return
+ our_rpd.create_atmos_pipe(user, src)
+ else if(our_rpd.mode == RPD_DISPOSALS_MODE)
+ return
+ else
+ ..()
+
/turf/simulated/wall/mech_melee_attack(obj/mecha/M)
if(M.damtype == "brute")
playsound(src, 'sound/weapons/punch4.ogg', 50, 1)
diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm
index 60c63d0f221..58911d952b4 100644
--- a/code/game/turfs/space/space.dm
+++ b/code/game/turfs/space/space.dm
@@ -3,7 +3,6 @@
name = "\proper space"
icon_state = "0"
dynamic_lighting = 0
- flags = RPD_ALLOWED_HERE
luminosity = 1
temperature = TCMB
diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm
index 2831894e3ea..c08189e4d93 100644
--- a/code/game/turfs/space/transit.dm
+++ b/code/game/turfs/space/transit.dm
@@ -1,5 +1,4 @@
/turf/space/transit
- flags = null
var/pushdirection // push things that get caught in the transit tile this direction
//Overwrite because we dont want people building rods in space.
@@ -118,7 +117,8 @@
AM.newtonian_move(dir)
-
+/turf/space/transit/rpd_act()
+ return
//Overwrite because we dont want people building rods in space.
/turf/space/transit/attackby()
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index f70aee9740f..337233b5bf4 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -71,6 +71,21 @@
/turf/ex_act(severity)
return 0
+/turf/rpd_act(mob/user, obj/item/rpd/our_rpd) //This is the default turf behaviour for the RPD; override it as required
+ if(our_rpd.mode == RPD_ATMOS_MODE)
+ our_rpd.create_atmos_pipe(user, src)
+ else if(our_rpd.mode == RPD_DISPOSALS_MODE)
+ for(var/obj/machinery/door/airlock/A in src)
+ if(A.density)
+ to_chat(user, "That type of pipe won't fit under [A]!")
+ return
+ our_rpd.create_disposals_pipe(user, src)
+ else if(our_rpd.mode == RPD_ROTATE_MODE)
+ our_rpd.rotate_all_pipes(user, src)
+ else if(our_rpd.mode == RPD_FLIP_MODE)
+ our_rpd.flip_all_pipes(user, src)
+ else if(our_rpd.mode == RPD_DELETE_MODE)
+ our_rpd.delete_all_pipes(user, src)
/turf/bullet_act(var/obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam/pulse))
diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm
index 5c9509a3d68..35b6c2056e3 100644
--- a/code/game/turfs/unsimulated.dm
+++ b/code/game/turfs/unsimulated.dm
@@ -7,6 +7,9 @@
/turf/unsimulated/can_lay_cable()
return 0
+/turf/unsimulated/rpd_act()
+ return
+
/turf/unsimulated/floor/plating/vox
icon_state = "plating"
name = "plating"
diff --git a/code/game/verbs/suicide.dm b/code/game/verbs/suicide.dm
index 32d5824c4d5..da843d8e53c 100644
--- a/code/game/verbs/suicide.dm
+++ b/code/game/verbs/suicide.dm
@@ -37,7 +37,7 @@
// Failing that...
if(!(damagetype & BRUTELOSS) && !(damagetype & FIRELOSS) && !(damagetype & TOXLOSS) && !(damagetype & OXYLOSS))
- if(NO_BREATHE in species.species_traits)
+ if(NO_BREATHE in dna.species.species_traits)
// the ultimate fallback
take_overall_damage(max(dmgamt - getToxLoss() - getFireLoss() - getBruteLoss() - getOxyLoss(), 0), 0)
else
@@ -84,7 +84,7 @@
do_suicide(damagetype, held_item)
return
- to_chat(viewers(src), "[src] [replacetext(pick(species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.")
+ to_chat(viewers(src), "[src] [replacetext(pick(dna.species.suicide_messages), "their", p_their())] It looks like [p_theyre()] trying to commit suicide.")
do_suicide(0)
updatehealth()
diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm
index 91c237a0328..72334496ea5 100644
--- a/code/modules/admin/admin_verbs.dm
+++ b/code/modules/admin/admin_verbs.dm
@@ -826,10 +826,10 @@ var/list/admin_verbs_ticket = list(
if(!istype(H))
if(istype(H, /mob/living/carbon/brain))
var/mob/living/carbon/brain/B = H
- if(istype(B.container, /obj/item/mmi/posibrain/ipc))
- var/obj/item/mmi/posibrain/ipc/C = B.container
+ if(istype(B.container, /obj/item/mmi/robotic_brain/positronic))
+ var/obj/item/mmi/robotic_brain/positronic/C = B.container
var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc
- if(istype(P.owner, /mob/living/carbon/human))
+ if(ishuman(P.owner))
H = P.owner
else
return
@@ -852,10 +852,10 @@ var/list/admin_verbs_ticket = list(
if(!istype(H))
if(istype(H, /mob/living/carbon/brain))
var/mob/living/carbon/brain/B = H
- if(istype(B.container, /obj/item/mmi/posibrain/ipc))
- var/obj/item/mmi/posibrain/ipc/C = B.container
+ if(istype(B.container, /obj/item/mmi/robotic_brain/positronic))
+ var/obj/item/mmi/robotic_brain/positronic/C = B.container
var/obj/item/organ/internal/brain/mmi_holder/posibrain/P = C.loc
- if(istype(P.owner, /mob/living/carbon/human))
+ if(ishuman(P.owner))
H = P.owner
else
return
diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm
index abfc807f9df..798185188ff 100644
--- a/code/modules/admin/topic.dm
+++ b/code/modules/admin/topic.dm
@@ -337,7 +337,7 @@
if("queen") M.change_mob_type( /mob/living/carbon/alien/humanoid/queen/large , null, null, delmob, 1 )
if("sentinel") M.change_mob_type( /mob/living/carbon/alien/humanoid/sentinel , null, null, delmob, 1 )
if("larva") M.change_mob_type( /mob/living/carbon/alien/larva , null, null, delmob, 1 )
- if("human") M.change_mob_type( /mob/living/carbon/human/human , null, null, delmob, 1 )
+ if("human") M.change_mob_type( /mob/living/carbon/human, null, null, delmob, 1 )
if("slime") M.change_mob_type( /mob/living/carbon/slime , null, null, delmob, 1 )
if("monkey") M.change_mob_type( /mob/living/carbon/human/monkey , null, null, delmob, 1 )
if("robot") M.change_mob_type( /mob/living/silicon/robot , null, null, delmob, 1 )
diff --git a/code/modules/admin/verbs/onlyone.dm b/code/modules/admin/verbs/onlyone.dm
index 3d524e863cd..bffaaa9bc9c 100644
--- a/code/modules/admin/verbs/onlyone.dm
+++ b/code/modules/admin/verbs/onlyone.dm
@@ -3,14 +3,14 @@
alert("The game hasn't started yet!")
return
- var/list/incompatible_species = list("Plasmaman", "Vox")
+ var/list/incompatible_species = list(/datum/species/plasmaman, /datum/species/vox)
for(var/mob/living/carbon/human/H in player_list)
if(H.stat == DEAD || !(H.client))
continue
if(is_special_character(H))
continue
- if(H.species.name in incompatible_species)
- H.set_species("Human")
+ if(is_type_in_list(H.dna.species, incompatible_species))
+ H.set_species(/datum/species/human)
var/datum/preferences/A = new() // Randomize appearance
A.copy_to(H)
@@ -49,7 +49,7 @@
W.assignment = "Highlander"
W.registered_name = H.real_name
H.equip_to_slot_or_del(W, slot_wear_id)
- H.species.after_equip_job(null, H)
+ H.dna.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used THERE CAN BE ONLY ONE! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/admin/verbs/onlyoneteam.dm b/code/modules/admin/verbs/onlyoneteam.dm
index 12567cec70b..715472128b8 100644
--- a/code/modules/admin/verbs/onlyoneteam.dm
+++ b/code/modules/admin/verbs/onlyoneteam.dm
@@ -3,15 +3,15 @@
alert("The game hasn't started yet!")
return
- var/list/incompatible_species = list("Plasmaman", "Vox")
+ var/list/incompatible_species = list(/datum/species/plasmaman, /datum/species/vox)
var/team_toggle = 0
for(var/mob/living/carbon/human/H in player_list)
if(H.stat == DEAD || !(H.client))
continue
if(is_special_character(H))
continue
- if(H.species.name in incompatible_species)
- H.set_species("Human")
+ if(is_type_in_list(H.dna.species, incompatible_species))
+ H.set_species(/datum/species/human)
var/datum/preferences/A = new() // Randomize appearance
A.copy_to(H)
@@ -55,7 +55,7 @@
H.equip_to_slot_or_del(W, slot_wear_id)
team_toggle = !team_toggle
- H.species.after_equip_job(null, H)
+ H.dna.species.after_equip_job(null, H)
H.regenerate_icons()
message_admins("[key_name_admin(usr)] used DODGEBAWWWWWWWL! -NO ATTACK LOGS WILL BE SENT TO ADMINS FROM THIS POINT FORTH-", 1)
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 94e0ea2acce..627cde823fa 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -37,7 +37,7 @@
createCorpse()
/obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it.
- var/mob/living/carbon/human/human/M = new /mob/living/carbon/human/human (src.loc)
+ var/mob/living/carbon/human/M = new /mob/living/carbon/human(src.loc)
M.real_name = src.name
M.death(1) //Kills the new mob
M.adjustOxyLoss(oxy_damage)
@@ -293,6 +293,6 @@
/obj/effect/landmark/corpse/abductor //Connected to ruins, for some reason?
name = "abductor"
mobname = "???"
- mob_species = "abductor"
+ mob_species = /datum/species/abductor
corpseuniform = /obj/item/clothing/under/color/grey
corpseshoes = /obj/item/clothing/shoes/combat
diff --git a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
index dcf4a48a280..5426516f86b 100644
--- a/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
+++ b/code/modules/awaymissions/mission_code/spacehotel_npcs.dm
@@ -3,8 +3,8 @@
override_under = /obj/item/clothing/under/mafia
chattyness = SNPC_CHANCE_TALK / 4
-/mob/living/carbon/human/interactive/away/hotel/New(loc)
- ..(loc, "Skrell")
+/mob/living/carbon/human/interactive/away/hotel/Initialize(mapload)
+ ..(loc, /datum/species/skrell)
/mob/living/carbon/human/interactive/away/hotel/doSetup()
..()
diff --git a/code/modules/awaymissions/mission_code/wildwest.dm b/code/modules/awaymissions/mission_code/wildwest.dm
index d159ed70eb2..b26bdba7d92 100644
--- a/code/modules/awaymissions/mission_code/wildwest.dm
+++ b/code/modules/awaymissions/mission_code/wildwest.dm
@@ -82,12 +82,12 @@
user.mutations.Add(XRAY)
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("Wealth")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -95,12 +95,12 @@
new /obj/structure/closet/syndicate/resources/everything(loc)
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("Immortality")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -108,12 +108,12 @@
user.verbs += /mob/living/carbon/proc/immortality
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("To Kill")
to_chat(user, "Your wish is granted, but at a terrible cost...")
@@ -130,12 +130,12 @@
obj_count++
if(ishuman(user))
var/mob/living/carbon/human/human = user
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(user, "Your flesh rapidly mutates!")
to_chat(user, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(user, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(user, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
user.regenerate_icons()
if("Peace")
to_chat(user, "Whatever alien sentience that the Wish Granter possesses is satisfied with your wish. There is a distant wailing as the last of the Faithless begin to die, then silence.")
diff --git a/code/modules/awaymissions/snpc.dm b/code/modules/awaymissions/snpc.dm
index 0b0de76ead3..8dc2b1b31e9 100644
--- a/code/modules/awaymissions/snpc.dm
+++ b/code/modules/awaymissions/snpc.dm
@@ -4,7 +4,7 @@
var/squad_member = 0 // was spawned by squad
var/home_z
-/mob/living/carbon/human/interactive/away/New()
+/mob/living/carbon/human/interactive/away/Initialize(mapload)
..()
TRAITS |= TRAIT_ROBUST
faction += "away"
diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm
index 471c1334bf8..c7f8504f13e 100644
--- a/code/modules/client/asset_cache.dm
+++ b/code/modules/client/asset_cache.dm
@@ -324,7 +324,7 @@ proc/getFilesSlow(var/client/client, var/list/files, var/register_asset = TRUE)
for(var/D in cardinal)
assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipe-item.dmi', state, D)
for(var/state in icon_states('icons/obj/pipes/disposal.dmi'))
- if(!(state in list("conpipe-c", "conpipe-j1", "conpipe-s", "conpipe-t", "conpipe-y", "intake", "outlet"))) //Pipes we want sprites for
+ if(!(state in list("pipe-c", "pipe-j1", "pipe-s", "pipe-t", "pipe-y", "intake", "outlet"))) //Pipes we want sprites for
continue
for(var/D in cardinal)
assets["[state]-[dir2text(D)].png"] = icon('icons/obj/pipes/disposal.dmi', state, D)
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 0582b92be67..8edec3a7b29 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -2084,7 +2084,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
/datum/preferences/proc/copy_to(mob/living/carbon/human/character)
var/datum/species/S = all_species[species]
- character.change_species(species) // Yell at me if this causes everything to melt
+ character.change_species(S.type) // Yell at me if this causes everything to melt
if(be_random_name)
real_name = random_name(gender,species)
@@ -2170,10 +2170,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.undershirt = undershirt
character.socks = socks
- if(character.species.bodyflags & HAS_HEAD_ACCESSORY)
+ if(character.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
H.headacc_colour = hacc_colour
H.ha_style = ha_style
- if(character.species.bodyflags & HAS_MARKINGS)
+ if(character.dna.species.bodyflags & HAS_MARKINGS)
character.m_colours = m_colours
character.m_styles = m_styles
@@ -2183,14 +2183,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
- if(S.has_gender && (character.gender in list(PLURAL, NEUTER)))
+ if(character.dna.species.has_gender && (character.gender in list(PLURAL, NEUTER)))
if(isliving(src)) //Ghosts get neuter by default
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
character.change_gender(MALE)
character.change_eye_color(e_colour)
- if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.species.species_traits))
+ if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in character.dna.species.species_traits))
character.dna.SetSEState(FATBLOCK,1,1)
character.overeatduration = 600
@@ -2233,7 +2233,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if(disabilities & DISABILITY_FLAG_SCRAMBLED)
character.dna.SetSEState(SCRAMBLEBLOCK,1,1)
- S.handle_dna(character)
+ character.dna.species.handle_dna(character)
if(character.dna.dirtySE)
character.dna.UpdateSE()
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 060e53df5b7..a5b4e614551 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -49,12 +49,12 @@
if("exclude" in species_restricted)
exclusive = 1
- if(H.species)
+ if(H.dna.species)
if(exclusive)
- if(!(H.species.name in species_restricted))
+ if(!(H.dna.species.name in species_restricted))
wearable = 1
else
- if(H.species.name in species_restricted)
+ if(H.dna.species.name in species_restricted)
wearable = 1
if(!wearable)
@@ -504,7 +504,7 @@ BLIND // can't see anything
/obj/item/clothing/suit/equipped(var/mob/living/carbon/human/user, var/slot) //Handle tail-hiding on a by-species basis.
..()
if(ishuman(user) && hide_tail_by_species && slot == slot_wear_suit)
- if(user.species.name in hide_tail_by_species)
+ if(user.dna.species.name in hide_tail_by_species)
if(!(flags_inv & HIDETAIL)) //Hide the tail if the user's species is in the hide_tail_by_species list and the tail isn't already hidden.
flags_inv |= HIDETAIL
else
diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm
index 8ee357b1ffb..1e874772478 100644
--- a/code/modules/clothing/spacesuits/miscellaneous.dm
+++ b/code/modules/clothing/spacesuits/miscellaneous.dm
@@ -16,7 +16,7 @@
/obj/item/clothing/head/helmet/space/capspace/equipped(mob/living/carbon/human/user, slot)
if(ishuman(user) && slot == slot_head)
- if(user.species.name == "Vox")
+ if(isvox(user))
if(flags & BLOCKHAIR)
flags &= ~BLOCKHAIR
else
diff --git a/code/modules/clothing/spacesuits/rig/modules/computer.dm b/code/modules/clothing/spacesuits/rig/modules/computer.dm
index 49991df72d7..74af696e76e 100644
--- a/code/modules/clothing/spacesuits/rig/modules/computer.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/computer.dm
@@ -116,7 +116,7 @@
return 1
// Okay, it wasn't a terminal being touched, check for all the simple insertions.
- if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/posibrain))
+ if(input_device.type in list(/obj/item/paicard, /obj/item/mmi, /obj/item/mmi/robotic_brain))
if(integrated_ai)
integrated_ai.attackby(input_device,user)
// If the transfer was successful, we can clear out our vars.
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index eab5aa0c5bb..c65ea335c4d 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -609,8 +609,8 @@
var/species_icon = 'icons/mob/rig_back.dmi'
// Since setting mob_icon will override the species checks in
// update_inv_wear_suit(), handle species checks here.
- if(wearer && sprite_sheets && sprite_sheets[wearer.get_species()])
- species_icon = sprite_sheets[wearer.get_species()]
+ if(wearer && sprite_sheets && sprite_sheets[wearer.dna.species.name])
+ species_icon = sprite_sheets[wearer.dna.species.name]
mob_icon = image("icon" = species_icon, "icon_state" = "[icon_state]")
if(installed_modules.len)
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index aac34032dfb..764ee71583a 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -136,7 +136,7 @@
user.visible_message("[user] places \the [src] against [M]'s chest and listens attentively.", "You place \the [src] against [M]'s chest...")
var/obj/item/organ/internal/H = M.get_int_organ(/obj/item/organ/internal/heart)
var/obj/item/organ/internal/L = M.get_int_organ(/obj/item/organ/internal/lungs)
- if((H && M.pulse) || (L && !(BREATHLESS in M.mutations) && !(NO_BREATHE in M.species.species_traits)))
+ if((H && M.pulse) || (L && !(BREATHLESS in M.mutations) && !(NO_BREATHE in M.dna.species.species_traits)))
var/color = "notice"
if(H)
var/heart_sound
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index ce3e9df0655..2a734e91dcd 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -45,7 +45,7 @@
var/mob/living/carbon/human/target = M
- if(istype(target.species, /datum/species/machine))
+ if(ismachine(target))
to_chat(user, "[target] has no skin, how do you expect to tattoo [target.p_them()]?")
return
@@ -54,7 +54,7 @@
return
var/datum/sprite_accessory/body_markings/tattoo/temp_tatt = marking_styles_list[tattoo_icon]
- if(!(target.species.name in temp_tatt.species_allowed))
+ if(!(target.dna.species.name in temp_tatt.species_allowed))
to_chat(user, "You can't think of a way to make the [tattoo_name] design work on [target == user ? "your" : "[target]'s"] body type.")
return
@@ -268,7 +268,7 @@
return
var/mob/living/carbon/human/target = user
- if(!istype(target) || target.get_species() != "Tajaran") // Only catbeasts, kthnx.
+ if(!istype(target) || !istajaran(target)) // Only catbeasts, kthnx.
return
if(target.change_body_accessory("Jay Wingler Tail"))
@@ -1276,7 +1276,7 @@
/obj/item/fluff/zekemirror/attack_self(mob/user)
var/mob/living/carbon/human/target = user
- if(!istype(target) || target.get_species() != "Skrell") // It'd be strange to see other races with head tendrils.
+ if(!istype(target) || !isskrell(target)) // It'd be strange to see other races with head tendrils.
return
if(target.change_hair("Zekes Tentacles", 1))
diff --git a/code/modules/events/carp_migration.dm b/code/modules/events/carp_migration.dm
index abab5c39254..cd9b0c02206 100644
--- a/code/modules/events/carp_migration.dm
+++ b/code/modules/events/carp_migration.dm
@@ -2,6 +2,10 @@
announceWhen = 50
endWhen = 900
+ var/list/spawned_mobs = list(
+ /mob/living/simple_animal/hostile/carp = 95,
+ /mob/living/simple_animal/hostile/carp/megacarp = 5,
+ )
var/list/spawned_carp = list()
/datum/event/carp_migration/setup()
@@ -17,6 +21,7 @@
event_announcement.Announce(announcement, "Lifesign Alert")
/datum/event/carp_migration/start()
+
if(severity == EVENT_LEVEL_MAJOR)
spawn_fish(landmarks_list.len)
else if(severity == EVENT_LEVEL_MODERATE)
@@ -32,19 +37,17 @@
spawn_locations.Add(C.loc)
spawn_locations = shuffle(spawn_locations)
num_groups = min(num_groups, spawn_locations.len)
-
+
var/i = 1
while(i <= num_groups)
var/group_size = rand(group_size_min, group_size_max)
for(var/j = 1, j <= group_size, j++)
- var/carptype = /mob/living/simple_animal/hostile/carp
- if(prob(5))
- carptype = /mob/living/simple_animal/hostile/carp/megacarp
+ var/carptype = pickweight(spawned_mobs)
spawned_carp.Add(new carptype(spawn_locations[i]))
i++
/datum/event/carp_migration/end()
- for(var/mob/living/simple_animal/hostile/carp/C in spawned_carp)
+ for(var/mob/living/simple_animal/hostile/C in spawned_carp)
if(!C.stat)
var/turf/T = get_turf(C)
if(istype(T, /turf/space))
diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm
index cf2e3621498..87836f217b8 100644
--- a/code/modules/events/disease_outbreak.dm
+++ b/code/modules/events/disease_outbreak.dm
@@ -18,7 +18,7 @@
continue
if(!H.client)
continue
- if(VIRUSIMMUNE in H.species.species_traits) //don't let virus immune things get diseases they're not supposed to get.
+ if(VIRUSIMMUNE in H.dna.species.species_traits) //don't let virus immune things get diseases they're not supposed to get.
continue
var/turf/T = get_turf(H)
if(!T)
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index ef7b99e1133..888e2b38dd1 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -139,7 +139,8 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Vermin Infestation",/datum/event/infestation, 100, list(ASSIGNMENT_JANITOR = 100)),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Sentience", /datum/event/sentience, 50),
new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Wallrot", /datum/event/wallrot, 0, list(ASSIGNMENT_ENGINEER = 30, ASSIGNMENT_GARDENER = 50)),
- new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE)
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Aurora Caelus", /datum/event/aurora_caelus, 15, is_one_shot = TRUE),
+ new /datum/event_meta(EVENT_LEVEL_MUNDANE, "Koi School", /datum/event/carp_migration/koi, 80,)
)
/datum/event_container/moderate
diff --git a/code/modules/events/koi_mirgration.dm b/code/modules/events/koi_mirgration.dm
new file mode 100644
index 00000000000..868457721b2
--- /dev/null
+++ b/code/modules/events/koi_mirgration.dm
@@ -0,0 +1,9 @@
+/datum/event/carp_migration
+ spawned_mobs = list(
+ /mob/living/simple_animal/hostile/retaliate/carp/koi = 95,
+ /mob/living/simple_animal/hostile/retaliate/carp/koi/honk = 2,
+ )
+
+
+/datum/event/carp_migration/koi/start()
+ spawn_fish(landmarks_list.len)
\ No newline at end of file
diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm
index cc59ec78128..321a8135150 100644
--- a/code/modules/events/mass_hallucination.dm
+++ b/code/modules/events/mass_hallucination.dm
@@ -4,7 +4,7 @@
/datum/event/mass_hallucination/start()
for(var/mob/living/carbon/human/H in living_mob_list)
var/armor = H.getarmor(type = "rad")
- if((RADIMMUNE in H.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
+ if((RADIMMUNE in H.dna.species.species_traits) || armor >= 75) // Leave radiation-immune species/rad armored players completely unaffected
continue
H.AdjustHallucinate(rand(50, 100))
diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm
index 02f743d7478..33987737fa2 100644
--- a/code/modules/food_and_drinks/food/customizables.dm
+++ b/code/modules/food_and_drinks/food/customizables.dm
@@ -57,7 +57,7 @@
name = "sandwich"
desc = "A sandwich! A timeless classic."
icon_state = "breadslice"
- baseicon = "sandwich"
+ baseicon = "sandwichcustom"
basename = "sandwich"
toptype = new /obj/item/reagent_containers/food/snacks/breadslice()
@@ -66,9 +66,10 @@
/obj/item/reagent_containers/food/snacks/customizable
name = "sandwich"
desc = "A sandwich! A timeless classic."
- icon_state = "breadslice"
- var/baseicon = "sandwich"
- var/basename = "sandwich"
+ icon = 'icons/obj/food/custom.dmi'
+ icon_state = "sandwichcustom"
+ var/baseicon = "sandwichcustom"
+ var/basename = "sandwichcustom"
bitesize = 4
var/top = 1 //Do we have a top?
var/obj/item/toptype
@@ -94,7 +95,7 @@
desc = "Noodles. With stuff. Delicious."
icon_state = "pasta_bot"
baseicon = "pasta_bot"
- basename = "spaghetti"
+ basename = "pasta"
add_overlays = 0
top = 0
@@ -312,7 +313,7 @@
name = "burger bun"
desc = "A bun for a burger. Delicious."
icon_state = "burger"
- baseicon = "burger"
+ baseicon = "burgercustom"
basename = "burger"
toptype = new /obj/item/reagent_containers/food/snacks/bun()
diff --git a/code/modules/food_and_drinks/food/foods/baked_goods.dm b/code/modules/food_and_drinks/food/foods/baked_goods.dm
new file mode 100644
index 00000000000..9da07f4f0b8
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/baked_goods.dm
@@ -0,0 +1,434 @@
+
+//////////////////////
+// Cakes //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/sliceable/carrotcake
+ name = "carrot cake"
+ desc = "A favorite desert of a certain wascally wabbit. Not a lie."
+ icon_state = "carrotcake"
+ slice_path = /obj/item/reagent_containers/food/snacks/carrotcakeslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#FFD675"
+ list_reagents = list("nutriment" = 20, "oculine" = 10, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/carrotcakeslice
+ name = "carrot cake slice"
+ desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
+ icon_state = "carrotcake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FFD675"
+
+/obj/item/reagent_containers/food/snacks/sliceable/braincake
+ name = "brain cake"
+ desc = "A squishy cake-thing."
+ icon_state = "braincake"
+ slice_path = /obj/item/reagent_containers/food/snacks/braincakeslice
+ slices_num = 5
+ filling_color = "#E6AEDB"
+ bitesize = 3
+ list_reagents = list("protein" = 10, "nutriment" = 10, "mannitol" = 10, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/braincakeslice
+ name = "brain cake slice"
+ desc = "Lemme tell you something about prions. THEY'RE DELICIOUS."
+ icon_state = "braincakeslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#E6AEDB"
+
+/obj/item/reagent_containers/food/snacks/sliceable/cheesecake
+ name = "cheese cake"
+ desc = "DANGEROUSLY cheesy."
+ icon_state = "cheesecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/cheesecakeslice
+ slices_num = 5
+ filling_color = "#FAF7AF"
+ bitesize = 3
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/cheesecakeslice
+ name = "cheese cake slice"
+ desc = "Slice of pure cheestisfaction."
+ icon_state = "cheesecake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FAF7AF"
+
+/obj/item/reagent_containers/food/snacks/sliceable/plaincake
+ name = "vanilla cake"
+ desc = "A plain cake, not a lie."
+ icon_state = "plaincake"
+ slice_path = /obj/item/reagent_containers/food/snacks/plaincakeslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#F7EDD5"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/plaincakeslice
+ name = "vanilla cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "plaincake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#F7EDD5"
+
+/obj/item/reagent_containers/food/snacks/sliceable/orangecake
+ name = "orange cake"
+ desc = "A cake with added orange."
+ icon_state = "orangecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/orangecakeslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#FADA8E"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/orangecakeslice
+ name = "orange cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "orangecake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FADA8E"
+
+/obj/item/reagent_containers/food/snacks/sliceable/limecake
+ name = "lime cake"
+ desc = "A cake with added lime."
+ icon_state = "limecake"
+ bitesize = 3
+ slice_path = /obj/item/reagent_containers/food/snacks/limecakeslice
+ slices_num = 5
+ filling_color = "#CBFA8E"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/limecakeslice
+ name = "lime cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "limecake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#CBFA8E"
+
+/obj/item/reagent_containers/food/snacks/sliceable/lemoncake
+ name = "lemon cake"
+ desc = "A cake with added lemon."
+ icon_state = "lemoncake"
+ slice_path = /obj/item/reagent_containers/food/snacks/lemoncakeslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#FAFA8E"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/lemoncakeslice
+ name = "lemon cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "lemoncake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FAFA8E"
+
+/obj/item/reagent_containers/food/snacks/sliceable/chocolatecake
+ name = "chocolate cake"
+ desc = "A cake with added chocolate."
+ icon_state = "chocolatecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/chocolatecakeslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#805930"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/chocolatecakeslice
+ name = "chocolate cake slice"
+ desc = "Just a slice of cake, it is enough for everyone."
+ icon_state = "chocolatecake_slice"
+ trash = /obj/item/trash/plate
+ filling_color = "#805930"
+
+/obj/item/reagent_containers/food/snacks/sliceable/birthdaycake
+ name = "birthday cake"
+ desc = "Happy Birthday..."
+ icon_state = "birthdaycake"
+ slice_path = /obj/item/reagent_containers/food/snacks/birthdaycakeslice
+ slices_num = 5
+ filling_color = "#FFD6D6"
+ bitesize = 3
+ list_reagents = list("nutriment" = 20, "sprinkles" = 10, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/birthdaycakeslice
+ name = "birthday cake slice"
+ desc = "A slice of your birthday"
+ icon_state = "birthdaycakeslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FFD6D6"
+
+/obj/item/reagent_containers/food/snacks/sliceable/applecake
+ name = "apple cake"
+ desc = "A cake centered with Apple."
+ icon_state = "applecake"
+ slice_path = /obj/item/reagent_containers/food/snacks/applecakeslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#EBF5B8"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/applecakeslice
+ name = "apple cake slice"
+ desc = "A slice of heavenly cake."
+ icon_state = "applecakeslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#EBF5B8"
+
+
+//////////////////////
+// Cookies //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/cookie
+ name = "cookie"
+ desc = "COOKIE!!!"
+ icon_state = "COOKIE!!!"
+ bitesize = 1
+ filling_color = "#DBC94F"
+ list_reagents = list("nutriment" = 1)
+
+/obj/item/reagent_containers/food/snacks/fortunecookie
+ name = "fortune cookie"
+ desc = "A true prophecy in each cookie!"
+ icon_state = "fortune_cookie"
+ filling_color = "#E8E79E"
+ list_reagents = list("nutriment" = 3)
+ trash = /obj/item/paper/fortune
+
+/obj/item/reagent_containers/food/snacks/sugarcookie
+ name = "sugar cookie"
+ desc = "Just like your little sister used to make."
+ icon_state = "sugarcookie"
+ list_reagents = list("nutriment" = 3, "sugar" = 3)
+
+
+//////////////////////
+// Pies //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/pie
+ name = "banana cream pie"
+ desc = "Just like back home, on clown planet! HONK!"
+ icon_state = "pie"
+ trash = /obj/item/trash/plate
+ filling_color = "#FBFFB8"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom)
+ ..()
+ new/obj/effect/decal/cleanable/pie_smudge(loc)
+ visible_message("[src] splats.","You hear a splat.")
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/meatpie
+ name = "meat-pie"
+ icon_state = "meatpie"
+ desc = "An old barber recipe, very delicious!"
+ trash = /obj/item/trash/plate
+ filling_color = "#948051"
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/tofupie
+ name = "tofu-pie"
+ icon_state = "meatpie"
+ desc = "A delicious tofu pie."
+ trash = /obj/item/trash/plate
+ filling_color = "#FFFEE0"
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/amanita_pie
+ name = "amanita pie"
+ desc = "Sweet and tasty poison pie."
+ icon_state = "amanita_pie"
+ filling_color = "#FFCCCC"
+ bitesize = 4
+ list_reagents = list("nutriment" = 6, "amanitin" = 3, "psilocybin" = 1, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/plump_pie
+ name = "plump pie"
+ desc = "I bet you love stuff made out of plump helmets!"
+ icon_state = "plump_pie"
+ filling_color = "#B8279B"
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/plump_pie/New()
+ ..()
+ if(prob(10))
+ name = "exceptional plump pie"
+ desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" // What
+ reagents.add_reagent("omnizine", 5)
+
+/obj/item/reagent_containers/food/snacks/xemeatpie
+ name = "Xeno-pie"
+ icon_state = "xenomeatpie"
+ desc = "A delicious meatpie. Probably heretical."
+ trash = /obj/item/trash/plate
+ filling_color = "#43DE18"
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/applepie
+ name = "apple pie"
+ desc = "A pie containing sweet sweet love... or apple."
+ icon_state = "applepie"
+ filling_color = "#E0EDC5"
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/cherrypie
+ name = "cherry pie"
+ desc = "Taste so good, make a grown man cry."
+ icon_state = "cherrypie"
+ filling_color = "#FF525A"
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/sliceable/pumpkinpie
+ name = "pumpkin pie"
+ desc = "A delicious treat for the autumn months."
+ icon_state = "pumpkinpie"
+ slice_path = /obj/item/reagent_containers/food/snacks/pumpkinpieslice
+ slices_num = 5
+ bitesize = 3
+ filling_color = "#F5B951"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/pumpkinpieslice
+ name = "pumpkin pie slice"
+ desc = "A slice of pumpkin pie, with whipped cream on top. Perfection."
+ icon_state = "pumpkinpieslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#F5B951"
+
+
+//////////////////////
+// Donuts //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/donut
+ name = "donut"
+ desc = "Goes great with Robust Coffee."
+ icon_state = "donut1"
+ bitesize = 5
+ list_reagents = list("nutriment" = 3, "sugar" = 2)
+ var/extra_reagent = null
+ filling_color = "#D2691E"
+ var/randomized_sprinkles = 1
+
+/obj/item/reagent_containers/food/snacks/donut/New()
+ ..()
+ if(randomized_sprinkles && prob(30))
+ icon_state = "donut2"
+ name = "frosted donut"
+ reagents.add_reagent("sprinkles", 2)
+ filling_color = "#FF69B4"
+
+/obj/item/reagent_containers/food/snacks/donut/sprinkles
+ name = "frosted donut"
+ icon_state = "donut2"
+ list_reagents = list("nutriment" = 3, "sugar" = 2, "spinkles" = 2)
+ filling_color = "#FF69B4"
+ randomized_sprinkles = 0
+
+/obj/item/reagent_containers/food/snacks/donut/chaos
+ name = "chaos donut"
+ desc = "Like life, it never quite tastes the same."
+ bitesize = 10
+
+/obj/item/reagent_containers/food/snacks/donut/chaos/New()
+ ..()
+ extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
+ reagents.add_reagent("[extra_reagent]", 3)
+ if(prob(30))
+ icon_state = "donut2"
+ name = "frosted chaos donut"
+ reagents.add_reagent("sprinkles", 2)
+ filling_color = "#FF69B4"
+
+/obj/item/reagent_containers/food/snacks/donut/jelly
+ name = "jelly donut"
+ desc = "You jelly?"
+ icon_state = "jdonut1"
+ extra_reagent = "berryjuice"
+
+/obj/item/reagent_containers/food/snacks/donut/jelly/New()
+ ..()
+ if(extra_reagent)
+ reagents.add_reagent("[extra_reagent]", 3)
+ if(prob(30))
+ icon_state = "jdonut2"
+ name = "frosted jelly Donut"
+ reagents.add_reagent("sprinkles", 2)
+ filling_color = "#FF69B4"
+
+/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
+ name = "jelly donut"
+ desc = "You jelly?"
+ icon_state = "jdonut1"
+ extra_reagent = "slimejelly"
+
+/obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly
+ name = "jelly donut"
+ desc = "You jelly?"
+ icon_state = "jdonut1"
+ extra_reagent = "cherryjelly"
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/muffin
+ name = "muffin"
+ desc = "A delicious and spongy little cake."
+ icon_state = "muffin"
+ filling_color = "#E0CF9B"
+ list_reagents = list("nutriment" = 6)
+
+/obj/item/reagent_containers/food/snacks/berryclafoutis
+ name = "berry clafoutis"
+ desc = "No black birds, this is a good sign."
+ icon_state = "berryclafoutis"
+ trash = /obj/item/trash/plate
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "berryjuice" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/poppypretzel
+ name = "poppy pretzel"
+ desc = "A large soft pretzel full of POP! It's all twisted up!"
+ icon_state = "poppypretzel"
+ filling_color = "#916E36"
+ list_reagents = list("nutriment" = 5)
+
+/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit
+ name = "plump helmet biscuit"
+ desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour."
+ icon_state = "phelmbiscuit"
+ filling_color = "#CFB4C4"
+ list_reagents = list("nutriment" = 5)
+
+/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/New()
+ ..()
+ if(prob(10))
+ name = "exceptional plump helmet biscuit"
+ desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" // Is this a reference?
+ reagents.add_reagent("omnizine", 5)
+
+/obj/item/reagent_containers/food/snacks/appletart
+ name = "golden apple streusel tart"
+ desc = "A tasty dessert that won't make it through a metal detector."
+ icon_state = "gappletart"
+ trash = /obj/item/trash/plate
+ filling_color = "#FFFF00"
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/cracker
+ name = "cracker"
+ desc = "It's a salted cracker."
+ icon_state = "cracker"
+ bitesize = 1
+ filling_color = "#F5DEB8"
+ list_reagents = list("nutriment" = 1)
diff --git a/code/modules/food_and_drinks/food/foods/bread.dm b/code/modules/food_and_drinks/food/foods/bread.dm
new file mode 100644
index 00000000000..c841f8d65fa
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/bread.dm
@@ -0,0 +1,183 @@
+
+//////////////////////
+// Breads //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/sliceable/meatbread
+ name = "meatbread loaf"
+ desc = "The culinary base of every self-respecting eloquen/tg/entleman."
+ icon_state = "meatbread"
+ slice_path = /obj/item/reagent_containers/food/snacks/meatbreadslice
+ slices_num = 5
+ filling_color = "#FF7575"
+ list_reagents = list("protein" = 20, "nutriment" = 10, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/meatbreadslice
+ name = "meatbread slice"
+ desc = "A slice of delicious meatbread."
+ icon_state = "meatbreadslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FF7575"
+
+/obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread
+ name = "xenomeatbread loaf"
+ desc = "The culinary base of every self-respecting eloquent gentleman. Extra Heretical."
+ icon_state = "xenomeatbread"
+ slice_path = /obj/item/reagent_containers/food/snacks/xenomeatbreadslice
+ slices_num = 5
+ filling_color = "#8AFF75"
+ list_reagents = list("protein" = 20, "nutriment" = 10, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/xenomeatbreadslice
+ name = "xenomeatbread slice"
+ desc = "A slice of delicious meatbread. Extra Heretical."
+ icon_state = "xenobreadslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#8AFF75"
+
+/obj/item/reagent_containers/food/snacks/sliceable/spidermeatbread
+ name = "spider meat loaf"
+ desc = "Reassuringly green meatloaf made from spider meat."
+ icon_state = "spidermeatbread"
+ slice_path = /obj/item/reagent_containers/food/snacks/spidermeatbreadslice
+ slices_num = 5
+ list_reagents = list("protein" = 20, "nutriment" = 10, "toxin" = 15, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/spidermeatbreadslice
+ name = "spider meat bread slice"
+ desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
+ icon_state = "xenobreadslice"
+ trash = /obj/item/trash/plate
+ list_reagents = list("toxin" = 2)
+
+/obj/item/reagent_containers/food/snacks/sliceable/bananabread
+ name = "Banana-nut bread"
+ desc = "A heavenly and filling treat."
+ icon_state = "bananabread"
+ slice_path = /obj/item/reagent_containers/food/snacks/bananabreadslice
+ slices_num = 5
+ filling_color = "#EDE5AD"
+ list_reagents = list("banana" = 20, "nutriment" = 20)
+
+/obj/item/reagent_containers/food/snacks/bananabreadslice
+ name = "Banana-nut bread slice"
+ desc = "A slice of delicious banana bread."
+ icon_state = "bananabreadslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#EDE5AD"
+
+/obj/item/reagent_containers/food/snacks/sliceable/tofubread
+ name = "Tofubread"
+ icon_state = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
+ icon_state = "tofubread"
+ slice_path = /obj/item/reagent_containers/food/snacks/tofubreadslice
+ slices_num = 5
+ filling_color = "#F7FFE0"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/tofubreadslice
+ name = "Tofubread slice"
+ desc = "A slice of delicious tofubread."
+ icon_state = "tofubreadslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#F7FFE0"
+
+/obj/item/reagent_containers/food/snacks/sliceable/bread
+ name = "Bread"
+ icon_state = "Some plain old Earthen bread."
+ icon_state = "bread"
+ slice_path = /obj/item/reagent_containers/food/snacks/breadslice
+ slices_num = 6
+ filling_color = "#FFE396"
+ list_reagents = list("nutriment" = 10)
+
+/obj/item/reagent_containers/food/snacks/breadslice
+ name = "Bread slice"
+ desc = "A slice of home."
+ icon_state = "breadslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#D27332"
+ list_reagents = list("nutriment" = 2, "bread" = 5)
+
+/obj/item/reagent_containers/food/snacks/sliceable/creamcheesebread
+ name = "Cream Cheese Bread"
+ desc = "Yum yum yum!"
+ icon_state = "creamcheesebread"
+ slice_path = /obj/item/reagent_containers/food/snacks/creamcheesebreadslice
+ slices_num = 5
+ filling_color = "#FFF896"
+ list_reagents = list("nutriment" = 20, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/creamcheesebreadslice
+ name = "Cream Cheese Bread slice"
+ desc = "A slice of yum!"
+ icon_state = "creamcheesebreadslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#FFF896"
+ list_reagents = list("nutriment" = 4, "vitamin" = 1)
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/bun
+ name = "bun"
+ desc = "The base for any self-respecting burger."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "bun"
+ list_reagents = list("nutriment" = 1)
+
+/obj/item/reagent_containers/food/snacks/flatbread
+ name = "flatbread"
+ desc = "Bland but filling."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "flatbread"
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/baguette
+ name = "baguette"
+ desc = "Bon appetit!"
+ icon_state = "baguette"
+ filling_color = "#E3D796"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/twobread
+ name = "Two Bread"
+ desc = "It is very bitter and winy."
+ icon_state = "twobread"
+ filling_color = "#DBCC9A"
+ bitesize = 3
+ list_reagents = list("nutriment" = 2, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/jelliedtoast
+ name = "Jellied Toast"
+ desc = "A slice of bread covered with delicious jam."
+ icon_state = "jellytoast"
+ trash = /obj/item/trash/plate
+ filling_color = "#B572AB"
+ bitesize = 3
+
+/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
+ list_reagents = list("nutriment" = 1, "cherryjelly" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/jelliedtoast/slime
+ list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/rofflewaffles
+ name = "Roffle Waffles"
+ desc = "Waffles from Roffle. Co."
+ icon_state = "rofflewaffles"
+ trash = /obj/item/trash/waffles
+ filling_color = "#FF00F7"
+ bitesize = 4
+ list_reagents = list("nutriment" = 8, "psilocybin" = 2, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/waffles
+ name = "waffles"
+ desc = "Mmm, waffles."
+ icon_state = "waffles"
+ trash = /obj/item/trash/waffles
+ filling_color = "#E6DEB5"
+ list_reagents = list("nutriment" = 8, "vitamin" = 1)
diff --git a/code/modules/food_and_drinks/food/candy.dm b/code/modules/food_and_drinks/food/foods/candy.dm
similarity index 100%
rename from code/modules/food_and_drinks/food/candy.dm
rename to code/modules/food_and_drinks/food/foods/candy.dm
diff --git a/code/modules/food_and_drinks/food/foods/desserts.dm b/code/modules/food_and_drinks/food/foods/desserts.dm
new file mode 100644
index 00000000000..ff99efd07be
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/desserts.dm
@@ -0,0 +1,97 @@
+
+//////////////////////
+// Ice Cream //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/icecream
+ name = "ice cream"
+ desc = "Delicious ice cream."
+ icon = 'icons/obj/kitchen.dmi'
+ icon_state = "icecream_cone"
+ bitesize = 3
+ list_reagents = list("nutriment" = 1, "sugar" = 1)
+
+/obj/item/reagent_containers/food/snacks/icecream/New()
+ ..()
+ update_icon()
+
+/obj/item/reagent_containers/food/snacks/icecream/update_icon()
+ overlays.Cut()
+ var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color")
+ filling.icon += mix_color_from_reagents(reagents.reagent_list)
+ overlays += filling
+
+/obj/item/reagent_containers/food/snacks/icecream/icecreamcone
+ name = "ice cream cone"
+ desc = "Delicious ice cream."
+ icon_state = "icecream_cone"
+ volume = 50
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "sugar" = 7, "ice" = 2)
+
+/obj/item/reagent_containers/food/snacks/icecream/icecreamcup
+ name = "chocolate ice cream cone"
+ desc = "Delicious ice cream."
+ icon_state = "icecream_cup"
+ volume = 50
+ bitesize = 6
+ list_reagents = list("nutriment" = 5, "chocolate" = 8, "ice" = 2)
+
+/obj/item/reagent_containers/food/snacks/icecreamsandwich
+ name = "icecream sandwich"
+ desc = "Portable Ice-cream in it's own packaging."
+ icon_state = "icecreamsandwich"
+ list_reagents = list("nutriment" = 2, "ice" = 2)
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/friedbanana
+ name = "Fried Banana"
+ desc = "Goreng Pisang, also known as fried bananas."
+ icon_state = "friedbanana"
+ list_reagents = list("sugar" = 5, "nutriment" = 8, "cornoil" = 4)
+
+/obj/item/reagent_containers/food/snacks/ricepudding
+ name = "Rice Pudding"
+ desc = "Where's the Jam!"
+ icon_state = "rpudding"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#FFFBDB"
+ list_reagents = list("nutriment" = 7, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/spacylibertyduff
+ name = "Spacy Liberty Duff"
+ desc = "Jello gelatin, from Alfred Hubbard's cookbook."
+ icon_state = "spacylibertyduff"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#42B873"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "psilocybin" = 6)
+
+/obj/item/reagent_containers/food/snacks/amanitajelly
+ name = "Amanita Jelly"
+ desc = "Looks curiously toxic."
+ icon_state = "amanitajelly"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#ED0758"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "amanitin" = 6, "psilocybin" = 3)
+
+/obj/item/reagent_containers/food/snacks/candiedapple
+ name = "Candied Apple"
+ desc = "An apple coated in sugary sweetness."
+ icon_state = "candiedapple"
+ filling_color = "#F21873"
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "sugar" = 2)
+
+/obj/item/reagent_containers/food/snacks/mint
+ name = "mint"
+ desc = "it is only wafer thin."
+ icon_state = "mint"
+ bitesize = 1
+ filling_color = "#F2F2F2"
+ list_reagents = list("minttoxin" = 1)
diff --git a/code/modules/food_and_drinks/food/foods/ethnic.dm b/code/modules/food_and_drinks/food/foods/ethnic.dm
new file mode 100644
index 00000000000..ae8fc289798
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/ethnic.dm
@@ -0,0 +1,135 @@
+
+//////////////////////
+// Mexican //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/taco
+ name = "taco"
+ desc = "Take a bite!"
+ icon_state = "taco"
+ bitesize = 3
+ list_reagents = list("nutriment" = 7, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/burrito
+ name = "Burrito"
+ desc = "Meat, beans, cheese, and rice wrapped up as an easy-to-hold meal."
+ icon_state = "burrito"
+ trash = /obj/item/trash/plate
+ filling_color = "#A36A1F"
+ list_reagents = list("nutriment" = 4, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/chimichanga
+ name = "Chimichanga"
+ desc = "Time to eat a chimi-f***ing-changa."
+ icon_state = "chimichanga"
+ trash = /obj/item/trash/plate
+ filling_color = "#A36A1F"
+ list_reagents = list("omnizine" = 4, "cheese" = 2) //Deadpool reference. Deal with it.
+
+/obj/item/reagent_containers/food/snacks/enchiladas
+ name = "Enchiladas"
+ desc = "Viva La Mexico!"
+ icon_state = "enchiladas"
+ trash = /obj/item/trash/tray
+ filling_color = "#A36A1F"
+ bitesize = 4
+ list_reagents = list("nutriment" = 8, "capsaicin" = 6)
+
+/obj/item/reagent_containers/food/snacks/cornchips
+ name = "corn chips"
+ desc = "Goes great with salsa! OLE!"
+ icon_state = "chips"
+ bitesize = 1
+ trash = /obj/item/trash/chips
+ filling_color = "#E8C31E"
+ list_reagents = list("nutriment" = 3)
+
+
+//////////////////////
+// Chinese //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/chinese/chowmein
+ name = "chow mein"
+ desc = "What is in this anyways?"
+ icon_state = "chinese1"
+ junkiness = 25
+ list_reagents = list("nutriment" = 1, "beans" = 3, "msg" = 4, "sugar" = 2)
+
+/obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball
+ name = "Sweet & Sour Chicken Balls"
+ desc = "Is this chicken cooked? The odds are better than wok paper scissors."
+ icon_state = "chickenball"
+ junkiness = 25
+ list_reagents = list("nutriment" = 2, "msg" = 4, "sugar" = 2)
+
+/obj/item/reagent_containers/food/snacks/chinese/tao
+ name = "Admiral Yamamoto carp"
+ desc = "Tastes like chicken."
+ icon_state = "chinese2"
+ junkiness = 25
+ list_reagents = list("nutriment" = 1, "protein" = 1, "msg" = 4, "sugar" = 4)
+
+/obj/item/reagent_containers/food/snacks/chinese/newdles
+ name = "chinese newdles"
+ desc = "Made fresh, weekly!"
+ icon_state = "chinese3"
+ junkiness = 25
+ list_reagents = list("nutriment" = 1, "msg" = 4, "sugar" = 3)
+
+/obj/item/reagent_containers/food/snacks/chinese/rice
+ name = "fried rice"
+ desc = "A timeless classic."
+ icon_state = "chinese4"
+ junkiness = 20
+ list_reagents = list("nutriment" = 1, "rice" = 3, "msg" = 4, "sugar" = 2)
+
+
+//////////////////////
+// Japanese //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/chawanmushi
+ name = "chawanmushi"
+ desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat."
+ icon_state = "chawanmushi"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#F0F2E4"
+ list_reagents = list("nutriment" = 5)
+
+/obj/item/reagent_containers/food/snacks/yakiimo
+ name = "yaki imo"
+ desc = "Made with roasted sweet potatoes!"
+ icon_state = "yakiimo"
+ trash = /obj/item/trash/plate
+ list_reagents = list("nutriment" = 5, "vitamin" = 4)
+ filling_color = "#8B1105"
+
+
+//////////////////////
+// Middle Eastern //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/human/kabob
+ name = "-kabob"
+ icon_state = "kabob"
+ desc = "A human meat, on a stick."
+ trash = /obj/item/stack/rods
+ filling_color = "#A85340"
+ list_reagents = list("nutriment" = 8)
+
+/obj/item/reagent_containers/food/snacks/monkeykabob
+ name = "Meat-kabob"
+ icon_state = "kabob"
+ desc = "Delicious meat, on a stick."
+ trash = /obj/item/stack/rods
+ filling_color = "#A85340"
+ list_reagents = list("nutriment" = 8)
+
+/obj/item/reagent_containers/food/snacks/tofukabob
+ name = "Tofu-kabob"
+ icon_state = "kabob"
+ desc = "Vegan meat, on a stick."
+ trash = /obj/item/stack/rods
+ filling_color = "#FFFEE0"
+ list_reagents = list("nutriment" = 8)
diff --git a/code/modules/food_and_drinks/food/foods/ingredients.dm b/code/modules/food_and_drinks/food/foods/ingredients.dm
new file mode 100644
index 00000000000..65c20eb7eba
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/ingredients.dm
@@ -0,0 +1,160 @@
+
+//////////////////////
+// Tofu & Soy //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/tofu
+ name = "Tofu"
+ icon_state = "tofu"
+ desc = "We all love tofu."
+ filling_color = "#FFFEE0"
+ bitesize = 3
+ list_reagents = list("plantmatter" = 2)
+
+/obj/item/reagent_containers/food/snacks/fried_tofu
+ name = "Fried Tofu"
+ icon_state = "tofu"
+ desc = "Proof that even vegetarians crave unhealthy foods."
+ filling_color = "#FFFEE0"
+ bitesize = 3
+ list_reagents = list("plantmatter" = 3)
+
+/obj/item/reagent_containers/food/snacks/soydope
+ name = "Soy Dope"
+ desc = "Dope from a soy."
+ icon_state = "soydope"
+ trash = /obj/item/trash/plate
+ filling_color = "#C4BF76"
+ list_reagents = list("nutriment" = 2)
+
+
+//////////////////////
+// Cheese //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel
+ name = "Cheese wheel"
+ desc = "A big wheel of delicious Cheddar."
+ icon_state = "cheesewheel"
+ slice_path = /obj/item/reagent_containers/food/snacks/cheesewedge
+ slices_num = 5
+ filling_color = "#FFF700"
+ list_reagents = list("nutriment" = 15, "vitamin" = 5, "cheese" = 20)
+
+/obj/item/reagent_containers/food/snacks/cheesewedge
+ name = "Cheese wedge"
+ desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far."
+ icon_state = "cheesewedge"
+ filling_color = "#FFF700"
+
+/obj/item/reagent_containers/food/snacks/weirdcheesewedge
+ name = "Weird Cheese"
+ desc = "Some kind of... gooey, messy, gloopy thing. Similar to cheese, but only in the looser sense of the word."
+ icon_state = "weirdcheesewedge"
+ filling_color = "#00FF33"
+ list_reagents = list("mercury" = 5, "lsd" = 5, "ethanol" = 5, "weird_cheese" = 5)
+
+
+//////////////////////
+// Plants //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/hugemushroomslice
+ name = "huge mushroom slice"
+ desc = "A slice from a huge mushroom."
+ icon_state = "hugemushroomslice"
+ filling_color = "#E0D7C5"
+ bitesize = 6
+ list_reagents = list("plantmatter" = 3, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/tomatomeat
+ name = "tomato slice"
+ desc = "A slice from a huge tomato."
+ icon_state = "tomatomeat"
+ filling_color = "#DB0000"
+ bitesize = 6
+ list_reagents = list("protein" = 2)
+
+/obj/item/reagent_containers/food/snacks/watermelonslice
+ name = "Watermelon Slice"
+ desc = "A slice of watery goodness."
+ icon_state = "watermelonslice"
+ filling_color = "#FF3867"
+
+/obj/item/reagent_containers/food/snacks/pineappleslice
+ name = "Pineapple Slices"
+ desc = "Rings of pineapple."
+ icon_state = "pineappleslice"
+ filling_color = "#e5b437"
+
+
+//////////////////////
+// Dough //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/dough
+ name = "dough"
+ desc = "A piece of dough."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "dough"
+ list_reagents = list("nutriment" = 6)
+
+// Dough + rolling pin = flat dough
+/obj/item/reagent_containers/food/snacks/dough/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/kitchen/rollingpin))
+ if(isturf(loc))
+ new /obj/item/reagent_containers/food/snacks/sliceable/flatdough(loc)
+ to_chat(user, "You flatten [src].")
+ qdel(src)
+ else
+ to_chat(user, "You need to put [src] on a surface to roll it out!")
+ else
+ ..()
+
+// slicable into 3xdoughslices
+/obj/item/reagent_containers/food/snacks/sliceable/flatdough
+ name = "flat dough"
+ desc = "Some flattened dough."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "flat dough"
+ slice_path = /obj/item/reagent_containers/food/snacks/doughslice
+ slices_num = 3
+ list_reagents = list("nutriment" = 6)
+
+/obj/item/reagent_containers/food/snacks/doughslice
+ name = "dough slice"
+ desc = "The building block of an impressive dish."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "doughslice"
+ list_reagents = list("nutriment" = 1)
+
+
+//////////////////////
+// Chocolate //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/chocolatebar
+ name = "Chocolate Bar"
+ desc = "Such sweet, fattening food."
+ icon_state = "chocolatebar"
+ filling_color = "#7D5F46"
+ list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2)
+
+/obj/item/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs
+ name = "Pile of Chocolate"
+ desc = "A pile of pure chocolate pieces."
+ icon_state = "cocoa"
+ filling_color = "#7D5F46"
+ list_reagents = list("chocolate" = 5)
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/ectoplasm
+ name = "ectoplasm"
+ desc = "A luminescent blob of what scientists refer to as 'ghost goo'."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "ectoplasm"
+ list_reagents = list("ectoplasm" = 10)
diff --git a/code/modules/food_and_drinks/food/foods/junkfood.dm b/code/modules/food_and_drinks/food/foods/junkfood.dm
new file mode 100644
index 00000000000..b221348e8d8
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/junkfood.dm
@@ -0,0 +1,93 @@
+
+//////////////////////
+// Vendor //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/chips
+ name = "chips"
+ desc = "Commander Riker's What-The-Crisps."
+ icon_state = "chips"
+ bitesize = 1
+ trash = /obj/item/trash/chips
+ filling_color = "#E8C31E"
+ junkiness = 20
+ list_reagents = list("nutriment" = 1, "sodiumchloride" = 1, "sugar" = 3)
+
+/obj/item/reagent_containers/food/snacks/sosjerky
+ name = "Scaredy's Private Reserve Beef Jerky"
+ icon_state = "sosjerky"
+ desc = "Beef jerky made from the finest space cows."
+ trash = /obj/item/trash/sosjerky
+ filling_color = "#631212"
+ junkiness = 25
+ list_reagents = list("protein" = 1, "sugar" = 3)
+
+/obj/item/reagent_containers/food/snacks/pistachios
+ name = "Pistachios"
+ icon_state = "pistachios"
+ desc = "A snack of deliciously salted pistachios. A perfectly valid choice..."
+ trash = /obj/item/trash/pistachios
+ filling_color = "#BAD145"
+ junkiness = 20
+ list_reagents = list("plantmatter" = 2, "sodiumchloride" = 1, "sugar" = 4)
+
+/obj/item/reagent_containers/food/snacks/no_raisin
+ name = "4no Raisins"
+ icon_state = "4no_raisins"
+ desc = "Best raisins in the universe. Not sure why."
+ trash = /obj/item/trash/raisins
+ filling_color = "#343834"
+ junkiness = 25
+ list_reagents = list("plantmatter" = 2, "sugar" = 4)
+
+/obj/item/reagent_containers/food/snacks/spacetwinkie
+ name = "Space Twinkie"
+ icon_state = "space_twinkie"
+ desc = "Guaranteed to survive longer then you will."
+ filling_color = "#FFE591"
+ junkiness = 25
+ list_reagents = list("sugar" = 4)
+
+/obj/item/reagent_containers/food/snacks/cheesiehonkers
+ name = "Cheesie Honkers"
+ icon_state = "cheesie_honkers"
+ desc = "Bite sized cheesie snacks that will honk all over your mouth."
+ trash = /obj/item/trash/cheesie
+ filling_color = "#FFA305"
+ junkiness = 25
+ list_reagents = list("nutriment" = 1, "fake_cheese" = 2, "sugar" = 3)
+
+/obj/item/reagent_containers/food/snacks/syndicake
+ name = "Syndi-Cakes"
+ icon_state = "syndi_cakes"
+ desc = "An extremely moist snack cake that tastes just as good after being nuked."
+ filling_color = "#FF5D05"
+ trash = /obj/item/trash/syndi_cakes
+ bitesize = 3
+ list_reagents = list("nutriment" = 4, "salglu_solution" = 5)
+
+/obj/item/reagent_containers/food/snacks/tastybread
+ name = "bread tube"
+ desc = "Bread in a tube. Chewy...and surprisingly tasty."
+ icon_state = "tastybread"
+ trash = /obj/item/trash/tastybread
+ filling_color = "#A66829"
+ junkiness = 20
+ list_reagents = list("nutriment" = 2, "sugar" = 4)
+
+
+//////////////////////
+// Homemade //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/sosjerky/healthy
+ name = "homemade beef jerky"
+ desc = "Homemade beef jerky made from the finest space cows."
+ list_reagents = list("nutriment" = 3, "vitamin" = 1)
+ junkiness = 0
+
+/obj/item/reagent_containers/food/snacks/no_raisin/healthy
+ name = "homemade raisins"
+ desc = "homemade raisins, the best in all of spess."
+ list_reagents = list("nutriment" = 3, "vitamin" = 2)
+ junkiness = 0
diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm
new file mode 100644
index 00000000000..c59b6b9b1ee
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/meat.dm
@@ -0,0 +1,422 @@
+
+//////////////////////
+// Raw Meat //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/meat
+ name = "meat"
+ desc = "A slab of meat"
+ icon_state = "meat"
+ health = 180
+ filling_color = "#FF1C1C"
+ bitesize = 3
+ list_reagents = list("protein" = 3)
+
+/obj/item/reagent_containers/food/snacks/meat/attackby(obj/item/W, mob/user, params)
+ if(istype(W, /obj/item/kitchen/knife) || istype(W, /obj/item/scalpel))
+ new /obj/item/reagent_containers/food/snacks/rawcutlet(src)
+ new /obj/item/reagent_containers/food/snacks/rawcutlet(src)
+ new /obj/item/reagent_containers/food/snacks/rawcutlet(src)
+ to_chat(user, "You cut the meat in thin strips.")
+ qdel(src)
+ else
+ ..()
+
+/obj/item/reagent_containers/food/snacks/meat/syntiflesh
+ name = "synthetic meat"
+ desc = "A synthetic slab of flesh."
+
+/obj/item/reagent_containers/food/snacks/meat/human
+ name = "-meat"
+ var/subjectname = ""
+ var/subjectjob = null
+
+/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct
+ name = "meat product"
+ desc = "A slab of station reclaimed and chemically processed meat product."
+
+/obj/item/reagent_containers/food/snacks/meat/monkey
+ //same as plain meat
+
+/obj/item/reagent_containers/food/snacks/meat/corgi
+ name = "Corgi meat"
+ desc = "Tastes like... well you know..."
+
+/obj/item/reagent_containers/food/snacks/meat/pug
+ name = "Pug meat"
+ desc = "Tastes like... well you know..."
+
+/obj/item/reagent_containers/food/snacks/meat/ham
+ name = "Ham"
+ desc = "Taste like bacon."
+ list_reagents = list("protein" = 3, "porktonium" = 10)
+
+/obj/item/reagent_containers/food/snacks/meat/meatwheat
+ name = "meatwheat clump"
+ desc = "This doesn't look like meat, but your standards aren't that high to begin with."
+ list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5)
+ filling_color = rgb(150, 0, 0)
+ icon_state = "meatwheat_clump"
+ bitesize = 4
+
+/obj/item/reagent_containers/food/snacks/rawcutlet
+ name = "raw cutlet"
+ desc = "A thin piece of raw meat."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "rawcutlet"
+ bitesize = 1
+ list_reagents = list("protein" = 1)
+
+/obj/item/reagent_containers/food/snacks/rawcutlet/attackby(obj/item/W, mob/user, params)
+ if(istype(W,/obj/item/kitchen/knife))
+ user.visible_message( \
+ "[user] cuts the raw cutlet with the knife!", \
+ "You cut the raw cutlet with your knife!" \
+ )
+ new /obj/item/reagent_containers/food/snacks/raw_bacon(loc)
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/bearmeat
+ name = "bear meat"
+ desc = "A very manly slab of meat."
+ icon_state = "bearmeat"
+ filling_color = "#DB0000"
+ bitesize = 3
+ list_reagents = list("protein" = 12, "morphine" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/xenomeat
+ name = "meat"
+ desc = "A slab of meat."
+ icon_state = "xenomeat"
+ filling_color = "#43DE18"
+ bitesize = 6
+ list_reagents = list("protein" = 3, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/spidermeat
+ name = "spider meat"
+ desc = "A slab of spider meat."
+ icon_state = "spidermeat"
+ bitesize = 3
+ list_reagents = list("protein" = 3, "toxin" = 3, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/lizardmeat
+ name = "mutant lizard meat"
+ desc = "Seems to be a slab of meat from some mutant lizard thing?"
+ icon_state = "xenomeat"
+ filling_color = "#43DE18"
+ bitesize = 3
+ list_reagents = list("protein" = 3, "toxin" = 3)
+
+/obj/item/reagent_containers/food/snacks/spiderleg
+ name = "spider leg"
+ desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
+ icon_state = "spiderleg"
+ list_reagents = list("protein" = 2, "toxin" = 2)
+
+/obj/item/reagent_containers/food/snacks/raw_bacon
+ name = "raw bacon"
+ desc = "It's fleshy and pink!"
+ icon_state = "raw_bacon"
+ list_reagents = list("nutriment" = 1, "porktonium" = 10)
+
+/obj/item/reagent_containers/food/snacks/spidereggs
+ name = "spider eggs"
+ desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health."
+ icon_state = "spidereggs"
+ list_reagents = list("protein" = 2, "toxin" = 2)
+
+//////////////////////
+// Cooked Meat //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/meatsteak
+ name = "Meat steak"
+ desc = "A piece of hot spicy meat."
+ icon_state = "meatstake"
+ trash = /obj/item/trash/plate
+ filling_color = "#7A3D11"
+ bitesize = 3
+ list_reagents = list("nutriment" = 5)
+
+/obj/item/reagent_containers/food/snacks/bacon
+ name = "bacon"
+ desc = "It looks juicy and tastes amazing!"
+ icon_state = "bacon2"
+ list_reagents = list("nutriment" = 4, "porktonium" = 10, "msg" = 4)
+
+/obj/item/reagent_containers/food/snacks/telebacon
+ name = "Tele Bacon"
+ desc = "It tastes a little odd but it is still delicious."
+ icon_state = "bacon"
+ var/obj/item/radio/beacon/bacon/baconbeacon
+ list_reagents = list("nutriment" = 4, "porktonium" = 10)
+
+/obj/item/reagent_containers/food/snacks/telebacon/New()
+ ..()
+ baconbeacon = new /obj/item/radio/beacon/bacon(src)
+
+/obj/item/reagent_containers/food/snacks/telebacon/On_Consume(mob/M, mob/user)
+ if(!reagents.total_volume)
+ baconbeacon.loc = user
+ baconbeacon.digest_delay()
+
+/obj/item/reagent_containers/food/snacks/meatball
+ name = "Meatball"
+ desc = "A great meal all round."
+ icon_state = "meatball"
+ filling_color = "#DB0000"
+ list_reagents = list("protein" = 4, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/sausage
+ name = "Sausage"
+ desc = "A piece of mixed, long meat."
+ icon_state = "sausage"
+ filling_color = "#DB0000"
+ list_reagents = list("protein" = 6, "vitamin" = 1, "porktonium" = 10)
+
+/obj/item/reagent_containers/food/snacks/cutlet
+ name = "cutlet"
+ desc = "A tasty meat slice."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "cutlet"
+ list_reagents = list("protein" = 2)
+
+/obj/item/reagent_containers/food/snacks/spidereggsham
+ name = "green eggs and ham"
+ desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
+ icon_state = "spidereggsham"
+ trash = /obj/item/trash/plate
+ bitesize = 4
+ list_reagents = list("nutriment" = 6)
+
+/obj/item/reagent_containers/food/snacks/boiledspiderleg
+ name = "boiled spider leg"
+ desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
+ icon_state = "spiderlegcooked"
+ trash = /obj/item/trash/plate
+ bitesize = 3
+ list_reagents = list("nutriment" = 3, "capsaicin" = 2)
+
+/obj/item/reagent_containers/food/snacks/wingfangchu
+ name = "Wing Fang Chu"
+ desc = "A savory dish of alien wing wang in soy."
+ icon_state = "wingfangchu"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#43DE18"
+ list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2)
+
+
+//////////////////////
+// Cubes //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/monkeycube
+ name = "monkey cube"
+ desc = "Just add water!"
+ icon_state = "monkeycube"
+ bitesize = 12
+ filling_color = "#ADAC7F"
+ var/datum/species/monkey_type = /datum/species/monkey
+ list_reagents = list("nutriment" = 2)
+
+/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
+ if(volume >= 5)
+ return Expand()
+
+/obj/item/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
+ user.drop_item()
+ forceMove(get_turf(source))
+ return 1
+
+/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand()
+ if(!QDELETED(src))
+ visible_message("[src] expands!")
+ if(fingerprintslast)
+ log_game("Cube ([monkey_type]) inflated, last touched by: " + fingerprintslast)
+ else
+ log_game("Cube ([monkey_type]) inflated, last touched by: NO_DATA")
+ var/mob/living/carbon/human/creature = new /mob/living/carbon/human(get_turf(src))
+ if(LAZYLEN(fingerprintshidden))
+ creature.fingerprintshidden = fingerprintshidden.Copy()
+ creature.set_species(monkey_type)
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/monkeycube/farwacube
+ name = "farwa cube"
+ monkey_type = /datum/species/monkey/tajaran
+
+/obj/item/reagent_containers/food/snacks/monkeycube/wolpincube
+ name = "wolpin cube"
+ monkey_type = /datum/species/monkey/vulpkanin
+
+/obj/item/reagent_containers/food/snacks/monkeycube/stokcube
+ name = "stok cube"
+ monkey_type = /datum/species/monkey/unathi
+
+/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube
+ name = "neaera cube"
+ monkey_type = /datum/species/monkey/skrell
+
+
+//////////////////////
+// Eggs //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/egg
+ name = "egg"
+ desc = "An egg!"
+ icon_state = "egg"
+ filling_color = "#FDFFD1"
+ list_reagents = list("protein" = 1, "egg" = 5)
+
+/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom)
+ ..()
+ var/turf/T = get_turf(hit_atom)
+ new/obj/effect/decal/cleanable/egg_smudge(T)
+ if(reagents)
+ reagents.reaction(hit_atom, TOUCH)
+ qdel(src)
+
+/obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W, mob/user, params)
+ if(istype( W, /obj/item/toy/crayon ))
+ var/obj/item/toy/crayon/C = W
+ var/clr = C.colourName
+
+ if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow")))
+ to_chat(usr, "The egg refuses to take on this color!")
+ return
+
+ to_chat(usr, "You color \the [src] [clr]")
+ icon_state = "egg-[clr]"
+ item_color = clr
+ else
+ ..()
+
+/obj/item/reagent_containers/food/snacks/egg/blue
+ icon_state = "egg-blue"
+ item_color = "blue"
+
+/obj/item/reagent_containers/food/snacks/egg/green
+ icon_state = "egg-green"
+ item_color = "green"
+
+/obj/item/reagent_containers/food/snacks/egg/mime
+ icon_state = "egg-mime"
+ item_color = "mime"
+
+/obj/item/reagent_containers/food/snacks/egg/orange
+ icon_state = "egg-orange"
+ item_color = "orange"
+
+/obj/item/reagent_containers/food/snacks/egg/purple
+ icon_state = "egg-purple"
+ item_color = "purple"
+
+/obj/item/reagent_containers/food/snacks/egg/rainbow
+ icon_state = "egg-rainbow"
+ item_color = "rainbow"
+
+/obj/item/reagent_containers/food/snacks/egg/red
+ icon_state = "egg-red"
+ item_color = "red"
+
+/obj/item/reagent_containers/food/snacks/egg/yellow
+ icon_state = "egg-yellow"
+ item_color = "yellow"
+
+/obj/item/reagent_containers/food/snacks/friedegg
+ name = "Fried egg"
+ desc = "A fried egg, with a touch of salt and pepper."
+ icon_state = "friedegg"
+ filling_color = "#FFDF78"
+ bitesize = 1
+ list_reagents = list("nutriment" = 3, "egg" = 5)
+
+/obj/item/reagent_containers/food/snacks/boiledegg
+ name = "Boiled egg"
+ desc = "A hard boiled egg."
+ icon_state = "egg"
+ filling_color = "#FFFFFF"
+ list_reagents = list("nutriment" = 2, "egg" = 5, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/chocolateegg
+ name = "Chocolate Egg"
+ desc = "Such sweet, fattening food."
+ icon_state = "chocolateegg"
+ filling_color = "#7D5F46"
+ list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
+
+/obj/item/reagent_containers/food/snacks/omelette
+ name = "Omelette Du Fromage"
+ desc = "That's all you can say!"
+ icon_state = "omelette"
+ trash = /obj/item/trash/plate
+ filling_color = "#FFF9A8"
+ list_reagents = list("nutriment" = 8, "vitamin" = 1)
+ bitesize = 1
+
+/obj/item/reagent_containers/food/snacks/benedict
+ name = "eggs benedict"
+ desc = "There is only one egg on this, how rude."
+ icon_state = "benedict"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "egg" = 3, "vitamin" = 4)
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/hotdog
+ name = "hotdog"
+ desc = "Fresh footlong ready to go down on."
+ icon_state = "hotdog"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "ketchup" = 3, "vitamin" = 3)
+
+/obj/item/reagent_containers/food/snacks/meatbun
+ name = "meat bun"
+ desc = "Has the potential to not be dog."
+ icon_state = "meatbun"
+ bitesize = 6
+ list_reagents = list("nutriment" = 6, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/sliceable/turkey
+ name = "Turkey"
+ desc = "A traditional turkey served with stuffing."
+ icon_state = "turkey"
+ slice_path = /obj/item/reagent_containers/food/snacks/turkeyslice
+ slices_num = 6
+ list_reagents = list("protein" = 24, "nutriment" = 18, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/turkeyslice
+ name = "turkey serving"
+ desc = "A serving of some tender and delicious turkey."
+ icon_state = "turkeyslice"
+ trash = /obj/item/trash/plate
+ filling_color = "#B97A57"
+
+/obj/item/reagent_containers/food/snacks/organ
+ name = "organ"
+ desc = "It's good for you."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "appendix"
+ filling_color = "#E00D34"
+ bitesize = 3
+ list_reagents = list("protein" = 4, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/appendix
+//yes, this is the same as meat. I might do something different in future
+ name = "appendix"
+ desc = "An appendix which looks perfectly healthy."
+ icon = 'icons/obj/surgery.dmi'
+ icon_state = "appendix"
+ filling_color = "#E00D34"
+ bitesize = 3
+ list_reagents = list("protein" = 3, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/appendix/inflamed
+ name = "inflamed appendix"
+ desc = "An appendix which appears to be inflamed."
+ icon_state = "appendixinflamed"
+ filling_color = "#E00D7A"
diff --git a/code/modules/food_and_drinks/food/foods/misc.dm b/code/modules/food_and_drinks/food/foods/misc.dm
new file mode 100644
index 00000000000..4c6c607eacb
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/misc.dm
@@ -0,0 +1,171 @@
+
+//////////////////////
+// Meals //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/eggplantparm
+ name = "Eggplant Parmigiana"
+ desc = "The only good recipe for eggplant."
+ icon_state = "eggplantparm"
+ trash = /obj/item/trash/plate
+ filling_color = "#4D2F5E"
+ list_reagents = list("nutriment" = 6, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/soylentgreen
+ name = "Soylent Green"
+ desc = "Not made of people. Honest." //Totally people.
+ icon_state = "soylent_green"
+ trash = /obj/item/trash/waffles
+ filling_color = "#B8E6B5"
+ list_reagents = list("nutriment" = 10, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/soylentviridians
+ name = "Soylent Virdians"
+ desc = "Not made of people. Honest." //Actually honest for once.
+ icon_state = "soylent_yellow"
+ trash = /obj/item/trash/waffles
+ filling_color = "#E6FA61"
+ list_reagents = list("nutriment" = 10, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/monkeysdelight
+ name = "monkey's Delight"
+ desc = "Eeee Eee!"
+ icon_state = "monkeysdelight"
+ trash = /obj/item/trash/tray
+ filling_color = "#5C3C11"
+ bitesize = 6
+ list_reagents = list("nutriment" = 10, "banana" = 5, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/dionaroast
+ name = "roast diona"
+ desc = "It's like an enormous, leathery carrot. With an eye."
+ icon_state = "dionaroast"
+ trash = /obj/item/trash/plate
+ filling_color = "#75754B"
+ list_reagents = list("plantmatter" = 4, "nutriment" = 2, "radium" = 2, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/tofurkey
+ name = "Tofurkey"
+ desc = "A fake turkey made from tofu."
+ icon_state = "tofurkey"
+ filling_color = "#FFFEE0"
+ bitesize = 3
+ list_reagents = list("nutriment" = 12, "ether" = 3)
+
+
+//////////////////////
+// Salads //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/aesirsalad
+ name = "Aesir salad"
+ desc = "Probably too incredible for mortal men to fully enjoy."
+ icon_state = "aesirsalad"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#468C00"
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "omnizine" = 8, "vitamin" = 6)
+
+/obj/item/reagent_containers/food/snacks/herbsalad
+ name = "herb salad"
+ desc = "A tasty salad with apples on top."
+ icon_state = "herbsalad"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#76B87F"
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/validsalad
+ name = "valid salad"
+ desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it."
+ icon_state = "validsalad"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#76B87F"
+ bitesize = 3
+ list_reagents = list("nutriment" = 8, "salglu_solution" = 5, "vitamin" = 2)
+
+
+//////////////////////
+// Donk Pockets //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/donkpocket
+ name = "Donk-pocket"
+ desc = "The food of choice for the seasoned traitor."
+ icon_state = "donkpocket"
+ filling_color = "#DEDEAB"
+ list_reagents = list("nutriment" = 4)
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket
+ name = "Warm Donk-pocket"
+ desc = "The food of choice for the seasoned traitor."
+ icon_state = "donkpocket"
+ filling_color = "#DEDEAB"
+ list_reagents = list("nutriment" = 4)
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket/Post_Consume(mob/living/M)
+ M.reagents.add_reagent("omnizine", 15)
+
+/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak
+ name = "Lightly Warm Donk-pocket"
+ desc = "The food of choice for the seasoned traitor. This one is lukewarm."
+ icon_state = "donkpocket"
+ filling_color = "#DEDEAB"
+ list_reagents = list("nutriment" = 4, "weak_omnizine" = 3)
+
+/obj/item/reagent_containers/food/snacks/syndidonkpocket
+ name = "Donk-pocket"
+ desc = "This donk-pocket is emitting a small amount of heat."
+ icon_state = "donkpocket"
+ filling_color = "#DEDEAB"
+ bitesize = 100 //nom the whole thing at once.
+ list_reagents = list("nutriment" = 1)
+
+/obj/item/reagent_containers/food/snacks/syndidonkpocket/Post_Consume(mob/living/M)
+ M.reagents.add_reagent("omnizine", 15)
+ M.reagents.add_reagent("teporone", 15)
+ M.reagents.add_reagent("synaptizine", 15)
+ M.reagents.add_reagent("salglu_solution", 15)
+ M.reagents.add_reagent("salbutamol", 15)
+ M.reagents.add_reagent("methamphetamine", 15)
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/boiledslimecore
+ name = "Boiled Slime Core"
+ desc = "A boiled red thing."
+ icon_state = "boiledrorocore"
+ bitesize = 3
+ list_reagents = list("slimejelly" = 5)
+
+/obj/item/reagent_containers/food/snacks/popcorn
+ name = "Popcorn"
+ desc = "Now let's find some cinema."
+ icon_state = "popcorn"
+ trash = /obj/item/trash/popcorn
+ var/unpopped = 0
+ filling_color = "#FFFAD4"
+ bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0
+ list_reagents = list("nutriment" = 2)
+
+/obj/item/reagent_containers/food/snacks/popcorn/New()
+ ..()
+ unpopped = rand(1,10)
+
+/obj/item/reagent_containers/food/snacks/popcorn/On_Consume(mob/M, mob/user)
+ if(prob(unpopped)) //lol ...what's the point?
+ to_chat(user, "You bite down on an un-popped kernel!")
+ unpopped = max(0, unpopped-1)
+ ..()
+
+/obj/item/reagent_containers/food/snacks/liquidfood
+ name = "\improper LiquidFood Ration"
+ desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy?"
+ icon_state = "liquidfood"
+ trash = /obj/item/trash/liquidfood
+ filling_color = "#A8A8A8"
+ bitesize = 4
+ list_reagents = list("nutriment" = 20, "iron" = 3, "vitamin" = 2)
diff --git a/code/modules/food_and_drinks/food/foods/pasta.dm b/code/modules/food_and_drinks/food/foods/pasta.dm
new file mode 100644
index 00000000000..1b9c253ab53
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/pasta.dm
@@ -0,0 +1,70 @@
+
+//////////////////////
+// Raw Pasta //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/spaghetti
+ name = "Spaghetti"
+ desc = "A bundle of raw spaghetti."
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "spaghetti"
+ filling_color = "#EDDD00"
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/macaroni
+ name = "Macaroni twists"
+ desc = "These are little twists of raw macaroni."
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "macaroni"
+ filling_color = "#EDDD00"
+ list_reagents = list("nutriment" = 1, "vitamin" = 1)
+
+
+//////////////////////
+// Pasta Dishes //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/boiledspaghetti
+ name = "Boiled Spaghetti"
+ desc = "A plain dish of noodles, this sucks."
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "spaghettiboiled"
+ trash = /obj/item/trash/plate
+ filling_color = "#FCEE81"
+ list_reagents = list("nutriment" = 2, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/pastatomato
+ name = "spaghetti"
+ desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "pastatomato"
+ trash = /obj/item/trash/plate
+ filling_color = "#DE4545"
+ bitesize = 4
+ list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/meatballspaghetti
+ name = "spaghetti & Meatballs"
+ desc = "Now thats a nic'e meatball!"
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "meatballspaghetti"
+ trash = /obj/item/trash/plate
+ filling_color = "#DE4545"
+ list_reagents = list("nutriment" = 8, "synaptizine" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/spesslaw
+ name = "Spesslaw"
+ desc = "A lawyer's favourite."
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "spesslaw"
+ filling_color = "#DE4545"
+ list_reagents = list("nutriment" = 8, "synaptizine" = 10, "vitamin" = 6)
+
+/obj/item/reagent_containers/food/snacks/macncheese
+ name = "Macaroni cheese"
+ desc = "One of the most comforting foods in the world. Apparently."
+ trash = /obj/item/trash/snack_bowl
+ icon = 'icons/obj/food/pasta.dmi'
+ icon_state = "macncheese"
+ filling_color = "#ffe45d"
+ list_reagents = list("nutriment" = 5, "vitamin" = 2, "cheese" = 4)
diff --git a/code/modules/food_and_drinks/food/foods/pizza.dm b/code/modules/food_and_drinks/food/foods/pizza.dm
new file mode 100644
index 00000000000..c34d8943da7
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/pizza.dm
@@ -0,0 +1,254 @@
+
+//////////////////////
+// Pizzas //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza
+ icon = 'icons/obj/food/pizza.dmi'
+ slices_num = 6
+ filling_color = "#BAA14C"
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita
+ name = "Margherita"
+ desc = "The golden standard of pizzas."
+ icon_state = "pizzamargherita"
+ slice_path = /obj/item/reagent_containers/food/snacks/margheritaslice
+ list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/margheritaslice
+ name = "Margherita slice"
+ desc = "A slice of the classic pizza."
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "pizzamargheritaslice"
+ filling_color = "#BAA14C"
+ list_reagents = list("nutriment" = 5)
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza
+ name = "Meatpizza"
+ desc = "A pizza with meat topping."
+ icon_state = "meatpizza"
+ slice_path = /obj/item/reagent_containers/food/snacks/meatpizzaslice
+ list_reagents = list("protein" = 30, "tomatojuice" = 6, "vitamin" = 8)
+
+/obj/item/reagent_containers/food/snacks/meatpizzaslice
+ name = "Meatpizza slice"
+ desc = "A slice of a meaty pizza."
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "meatpizzaslice"
+ filling_color = "#BAA14C"
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
+ name = "Mushroompizza"
+ desc = "Very special pizza."
+ icon_state = "mushroompizza"
+ slice_path = /obj/item/reagent_containers/food/snacks/mushroompizzaslice
+ list_reagents = list("plantmatter" = 30, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/mushroompizzaslice
+ name = "Mushroompizza slice"
+ desc = "Maybe it is the last slice of pizza in your life."
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "mushroompizzaslice"
+ filling_color = "#BAA14C"
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
+ name = "Vegetable pizza"
+ desc = "No one of Tomato Sapiens were harmed during making this pizza."
+ icon_state = "vegetablepizza"
+ slice_path = /obj/item/reagent_containers/food/snacks/vegetablepizzaslice
+ list_reagents = list("plantmatter" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/vegetablepizzaslice
+ name = "Vegetable pizza slice"
+ desc = "A slice of the most green pizza of all pizzas not containing green ingredients."
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "vegetablepizzaslice"
+ filling_color = "#BAA14C"
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza
+ name = "Hawaiian Pizza"
+ desc = "Love it or hate it, this pizza divides opinions. Complete with juicy pineapple."
+ icon_state = "hawaiianpizza" //NEEDED
+ slice_path = /obj/item/reagent_containers/food/snacks/hawaiianpizzaslice
+ list_reagents = list("protein" = 15, "tomatojuice" = 6, "plantmatter" = 20, "pineapplejuice" = 6, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/hawaiianpizzaslice
+ name = "Hawaiian pizza slice"
+ desc = "A slice of polarising pizza."
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "hawaiianpizzaslice"
+ filling_color = "#e5b437"
+
+/obj/item/reagent_containers/food/snacks/sliceable/pizza/macpizza
+ name = "Macaroni cheese pizza"
+ desc = "Gastronomists have yet to classify this dish as 'pizza'."
+ icon_state = "macpizza"
+ slice_path = /obj/item/reagent_containers/food/snacks/macpizzaslice
+ list_reagents = list("nutriment" = 40, "vitamin" = 5) //More nutriment because carbs, but it's not any more vitaminicious
+ filling_color = "#ffe45d"
+
+/obj/item/reagent_containers/food/snacks/macpizzaslice
+ name = "Macaroni cheese pizza slice"
+ desc = "A delicious slice of pizza topped with macaroni cheese... wait, what the hell? Who would do this?!"
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "macpizzaslice"
+ filling_color = "#ffe45d"
+
+
+//////////////////////
+// Boxes //
+//////////////////////
+
+/obj/item/pizzabox
+ name = "pizza box"
+ desc = "A box suited for pizzas."
+ icon = 'icons/obj/food/pizza.dmi'
+ icon_state = "pizzabox1"
+
+ var/open = 0 // Is the box open?
+ var/ismessy = 0 // Fancy mess on the lid
+ var/obj/item/reagent_containers/food/snacks/sliceable/pizza/pizza // Content pizza
+ var/list/boxes = list() // If the boxes are stacked, they come here
+ var/boxtag = ""
+
+/obj/item/pizzabox/update_icon()
+ overlays = list()
+
+ // Set appropriate description
+ if(open && pizza)
+ desc = "A box suited for pizzas. It appears to have a [pizza.name] inside."
+ else if(boxes.len > 0)
+ desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile."
+ var/obj/item/pizzabox/topbox = boxes[boxes.len]
+ var/toptag = topbox.boxtag
+ if(toptag != "")
+ desc = "[desc] The box on top has a tag, it reads: '[toptag]'."
+ else
+ desc = "A box suited for pizzas."
+ if(boxtag != "")
+ desc = "[desc] The box has a tag, it reads: '[boxtag]'."
+
+ // Icon states and overlays
+ if(open)
+ if(ismessy)
+ icon_state = "pizzabox_messy"
+ else
+ icon_state = "pizzabox_open"
+ if(pizza)
+ var/image/pizzaimg = image("food/pizza.dmi", icon_state = pizza.icon_state)
+ pizzaimg.pixel_y = -3
+ overlays += pizzaimg
+
+ return
+ else
+ // Stupid code because byondcode sucks
+ var/doimgtag = 0
+ if(boxes.len > 0)
+ var/obj/item/pizzabox/topbox = boxes[boxes.len]
+ if(topbox.boxtag != "")
+ doimgtag = 1
+ else
+ if(boxtag != "")
+ doimgtag = 1
+ if(doimgtag)
+ var/image/tagimg = image("food/pizza.dmi", icon_state = "pizzabox_tag")
+ tagimg.pixel_y = boxes.len * 3
+ overlays += tagimg
+ icon_state = "pizzabox[boxes.len+1]"
+
+/obj/item/pizzabox/attack_hand(mob/user)
+ if(open && pizza)
+ user.put_in_hands(pizza)
+ to_chat(user, "You take the [pizza] out of the [src].")
+ pizza = null
+ update_icon()
+ return
+
+ if(boxes.len > 0)
+ if(user.is_in_inactive_hand(src))
+ ..()
+ return
+ var/obj/item/pizzabox/box = boxes[boxes.len]
+ boxes -= box
+ user.put_in_hands(box)
+ to_chat(user, "You remove the topmost [src] from your hand.")
+ box.update_icon()
+ update_icon()
+ return
+ ..()
+
+/obj/item/pizzabox/attack_self(mob/user)
+ if(boxes.len > 0)
+ return
+ open = !open
+ if(open && pizza)
+ ismessy = 1
+ update_icon()
+
+/obj/item/pizzabox/attackby(obj/item/I, mob/user, params)
+ if(istype(I, /obj/item/pizzabox/))
+ var/obj/item/pizzabox/box = I
+ if(!box.open && !open)
+ // Make a list of all boxes to be added
+ var/list/boxestoadd = list()
+ boxestoadd += box
+ for(var/obj/item/pizzabox/i in box.boxes)
+ boxestoadd += i
+ if((boxes.len+1) + boxestoadd.len <= 5)
+ user.drop_item()
+ box.loc = src
+ box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit
+ boxes.Add(boxestoadd)
+ box.update_icon()
+ update_icon()
+ to_chat(user, "You put the [box] ontop of the [src]!")
+ else
+ to_chat(user, "The stack is too high!")
+ else
+ to_chat(user, "Close the [box] first!")
+ return
+
+ if(istype(I, /obj/item/reagent_containers/food/snacks/sliceable/pizza/)) // Long ass fucking object name
+ if(open)
+ user.drop_item()
+ I.loc = src
+ pizza = I
+
+ update_icon()
+
+ to_chat(user, "You put the [I] in the [src]!")
+ else
+ to_chat(user, "You try to push the [I] through the lid but it doesn't work!")
+ return
+
+ if(istype(I, /obj/item/pen/))
+ if(open)
+ return
+ var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text
+ var/obj/item/pizzabox/boxtotagto = src
+ if(boxes.len > 0)
+ boxtotagto = boxes[boxes.len]
+ boxtotagto.boxtag = copytext("[boxtotagto.boxtag][t]", 1, 30)
+ update_icon()
+ return
+ ..()
+
+/obj/item/pizzabox/margherita/New()
+ pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita(src)
+ boxtag = "Margherita Deluxe"
+
+/obj/item/pizzabox/vegetable/New()
+ pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza(src)
+ boxtag = "Gourmet Vegatable"
+
+/obj/item/pizzabox/mushroom/New()
+ pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza(src)
+ boxtag = "Mushroom Special"
+
+/obj/item/pizzabox/meat/New()
+ pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src)
+ boxtag = "Meatlover's Supreme"
+
+/obj/item/pizzabox/hawaiian/New()
+ pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza(src)
+ boxtag = "Hawaiian Feast"
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/foods/sandwiches.dm b/code/modules/food_and_drinks/food/foods/sandwiches.dm
new file mode 100644
index 00000000000..a55a92ae3d1
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/sandwiches.dm
@@ -0,0 +1,196 @@
+
+//////////////////////
+// Burgers //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/brainburger
+ name = "brainburger"
+ desc = "A strange looking burger. It looks almost sentient."
+ icon_state = "brainburger"
+ filling_color = "#F2B6EA"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "prions" = 10, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/ghostburger
+ name = "Ghost Burger"
+ desc = "Spooky! It doesn't look very filling."
+ icon_state = "ghostburger"
+ filling_color = "#FFF2FF"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/human
+ var/hname = ""
+ var/job = null
+ filling_color = "#D63C3C"
+
+/obj/item/reagent_containers/food/snacks/human/burger
+ name = "-burger"
+ desc = "A bloody burger."
+ icon_state = "hburger"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/cheeseburger
+ name = "cheeseburger"
+ desc = "The cheese adds a good flavor."
+ icon_state = "cheeseburger"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/monkeyburger
+ name = "burger"
+ desc = "The cornerstone of every nutritious breakfast."
+ icon_state = "hburger"
+ filling_color = "#D63C3C"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/tofuburger
+ name = "Tofu Burger"
+ desc = "What.. is that meat?"
+ icon_state = "tofuburger"
+ filling_color = "#FFFEE0"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/roburger
+ name = "roburger"
+ desc = "The lettuce is the only organic component. Beep."
+ icon_state = "roburger"
+ filling_color = "#CCCCCC"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "nanomachines" = 10, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/roburgerbig
+ name = "roburger"
+ desc = "This massive patty looks like poison. Beep."
+ icon_state = "roburger"
+ filling_color = "#CCCCCC"
+ volume = 120
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "nanomachines" = 70, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/xenoburger
+ name = "xenoburger"
+ desc = "Smells caustic. Tastes like heresy."
+ icon_state = "xburger"
+ filling_color = "#43DE18"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/clownburger
+ name = "Clown Burger"
+ desc = "This tastes funny..."
+ icon_state = "clownburger"
+ filling_color = "#FF00FF"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/mimeburger
+ name = "Mime Burger"
+ desc = "Its taste defies language."
+ icon_state = "mimeburger"
+ filling_color = "#FFFFFF"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/baseballburger
+ name = "home run baseball burger"
+ desc = "It's still warm. The steam coming off of it looks like baseball."
+ icon_state = "baseball"
+ filling_color = "#CD853F"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/spellburger
+ name = "Spell Burger"
+ desc = "This is absolutely Ei Nath."
+ icon_state = "spellburger"
+ filling_color = "#D505FF"
+ bitesize = 3
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/bigbiteburger
+ name = "Big Bite Burger"
+ desc = "Forget the Big Mac. THIS is the future!"
+ icon_state = "bigbiteburger"
+ filling_color = "#E3D681"
+ bitesize = 3
+ list_reagents = list("nutriment" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/superbiteburger
+ name = "Super Bite Burger"
+ desc = "This is a mountain of a burger. FOOD!"
+ icon_state = "superbiteburger"
+ filling_color = "#CCA26A"
+ bitesize = 7
+ list_reagents = list("nutriment" = 40, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/jellyburger
+ name = "Jelly Burger"
+ desc = "Culinary delight..?"
+ icon_state = "jellyburger"
+ filling_color = "#B572AB"
+ bitesize = 3
+
+/obj/item/reagent_containers/food/snacks/jellyburger/slime
+ list_reagents = list("nutriment" = 6, "slimejelly" = 5, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/jellyburger/cherry
+ list_reagents = list("nutriment" = 6, "cherryjelly" = 5, "vitamin" = 1)
+
+
+//////////////////////
+// Sandwiches //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/sandwich
+ name = "Sandwich"
+ desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud."
+ icon_state = "sandwich"
+ trash = /obj/item/trash/plate
+ filling_color = "#D9BE29"
+ list_reagents = list("nutriment" = 6, "vitamin" = 1)
+
+/obj/item/reagent_containers/food/snacks/toastedsandwich
+ name = "Toasted Sandwich"
+ desc = "Now if you only had a pepper bar."
+ icon_state = "toastedsandwich"
+ trash = /obj/item/trash/plate
+ filling_color = "#D9BE29"
+ list_reagents = list("nutriment" = 6, "carbon" = 2)
+
+/obj/item/reagent_containers/food/snacks/grilledcheese
+ name = "Grilled Cheese Sandwich"
+ desc = "Goes great with Tomato soup!"
+ icon_state = "toastedsandwich"
+ trash = /obj/item/trash/plate
+ filling_color = "#D9BE29"
+ list_reagents = list("nutriment" = 7, "vitamin" = 1) //why make a regualr sandwhich when you can make grilled cheese, with this nutriment value?
+
+/obj/item/reagent_containers/food/snacks/jellysandwich
+ name = "Jelly Sandwich"
+ desc = "You wish you had some peanut butter to go with this..."
+ icon_state = "jellysandwich"
+ trash = /obj/item/trash/plate
+ filling_color = "#9E3A78"
+ bitesize = 3
+
+/obj/item/reagent_containers/food/snacks/jellysandwich/slime
+ list_reagents = list("nutriment" = 2, "slimejelly" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/jellysandwich/cherry
+ list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/notasandwich
+ name = "not-a-sandwich"
+ desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
+ icon_state = "notasandwich"
+ list_reagents = list("nutriment" = 6, "vitamin" = 6)
+
+/obj/item/reagent_containers/food/snacks/wrap
+ name = "egg wrap"
+ desc = "The precursor to Pigs in a Blanket."
+ icon_state = "wrap"
+ list_reagents = list("nutriment" = 5)
diff --git a/code/modules/food_and_drinks/food/seafood.dm b/code/modules/food_and_drinks/food/foods/seafood.dm
similarity index 100%
rename from code/modules/food_and_drinks/food/seafood.dm
rename to code/modules/food_and_drinks/food/foods/seafood.dm
diff --git a/code/modules/food_and_drinks/food/foods/side_dishes.dm b/code/modules/food_and_drinks/food/foods/side_dishes.dm
new file mode 100644
index 00000000000..7b563519ca3
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/side_dishes.dm
@@ -0,0 +1,105 @@
+
+//////////////////////
+// Raw //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/rawsticks
+ name = "raw potato sticks"
+ desc = "Raw fries, not very tasty."
+ icon = 'icons/obj/food/food_ingredients.dmi'
+ icon_state = "rawsticks"
+ list_reagents = list("plantmatter" = 3)
+
+
+//////////////////////
+// Fried //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/fries
+ name = "Space fries"
+ desc = "AKA: French Fries, Freedom Fries, etc."
+ icon_state = "fries"
+ trash = /obj/item/trash/plate
+ filling_color = "#EDDD00"
+ list_reagents = list("nutriment" = 4)
+
+/obj/item/reagent_containers/food/snacks/cheesyfries
+ name = "cheesy fries"
+ desc = "Fries. Covered in cheese. Duh."
+ icon_state = "cheesyfries"
+ trash = /obj/item/trash/plate
+ filling_color = "#EDDD00"
+ list_reagents = list("nutriment" = 6)
+
+/obj/item/reagent_containers/food/snacks/tatortot
+ name = "tator tot"
+ desc = "A large fried potato nugget that may or may not try to valid you."
+ icon_state = "tatortot"
+ list_reagents = list("nutriment" = 4)
+ filling_color = "FFD700"
+
+/obj/item/reagent_containers/food/snacks/onionrings
+ name = "onion rings"
+ desc = "Onion slices coated in batter."
+ icon_state = "onionrings"
+ list_reagents = list("nutriment" = 3)
+ filling_color = "#C0C9A0"
+ gender = PLURAL
+
+/obj/item/reagent_containers/food/snacks/carrotfries
+ name = "carrot fries"
+ desc = "Tasty fries from fresh carrots."
+ icon_state = "carrotfries"
+ trash = /obj/item/trash/plate
+ filling_color = "#FAA005"
+ list_reagents = list("plantmatter" = 3, "oculine" = 3, "vitamin" = 2)
+
+
+//////////////////////
+// Misc //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/beans
+ name = "tin of beans"
+ desc = "Musical fruit in a slightly less musical container."
+ icon_state = "beans"
+ list_reagents = list("nutriment" = 10, "beans" = 10, "vitamin" = 3)
+
+/obj/item/reagent_containers/food/snacks/mashed_potatoes //mashed taters
+ name = "mashed potatoes"
+ desc = "Some soft, creamy, and irresistible mashed potatoes."
+ icon_state = "mashedtaters"
+ trash = /obj/item/trash/plate
+ filling_color = "#D6D9C1"
+ list_reagents = list("nutriment" = 5, "gravy" = 5, "mashedpotatoes" = 10, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/stuffing
+ name = "Stuffing"
+ desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!"
+ icon_state = "stuffing"
+ filling_color = "#C9AC83"
+ list_reagents = list("nutriment" = 3)
+
+/obj/item/reagent_containers/food/snacks/loadedbakedpotato
+ name = "loaded baked potato"
+ desc = "Totally baked."
+ icon_state = "loadedbakedpotato"
+ filling_color = "#9C7A68"
+ list_reagents = list("nutriment" = 6)
+
+/obj/item/reagent_containers/food/snacks/boiledrice
+ name = "Boiled Rice"
+ desc = "A boring dish of boring rice."
+ icon_state = "boiledrice"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#FFFBDB"
+ list_reagents = list("nutriment" = 5, "vitamin" = 1)
+
+
+/obj/item/reagent_containers/food/snacks/roastparsnip
+ name = "roast parsnip"
+ desc = "Sweet and crunchy."
+ icon_state = "roastparsnip"
+ trash = /obj/item/trash/plate
+ list_reagents = list("nutriment" = 3, "vitamin" = 4)
+ filling_color = "#FF5500"
diff --git a/code/modules/food_and_drinks/food/foods/soups.dm b/code/modules/food_and_drinks/food/foods/soups.dm
new file mode 100644
index 00000000000..76e4d752a41
--- /dev/null
+++ b/code/modules/food_and_drinks/food/foods/soups.dm
@@ -0,0 +1,166 @@
+
+//////////////////////
+// Soups //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/meatballsoup
+ name = "Meatball soup"
+ desc = "You've got balls kid, BALLS!"
+ icon_state = "meatballsoup"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#785210"
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/slimesoup
+ name = "slime soup"
+ desc = "If no water is available, you may substitute tears."
+ icon_state = "slimesoup"
+ filling_color = "#C4DBA0"
+ bitesize = 5
+ list_reagents = list("nutriment" = 5, "slimejelly" = 5, "water" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/bloodsoup
+ name = "Tomato soup"
+ desc = "Smells like copper."
+ icon_state = "tomatosoup"
+ filling_color = "#FF0000"
+ bitesize = 5
+ list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/clownstears
+ name = "Clown's Tears"
+ desc = "Not very funny."
+ icon_state = "clownstears"
+ filling_color = "#C4FBFF"
+ bitesize = 5
+ list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 5, "vitamin" = 8)
+
+/obj/item/reagent_containers/food/snacks/vegetablesoup
+ name = "Vegetable soup"
+ desc = "A true vegan meal." //TODO
+ icon_state = "vegetablesoup"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#AFC4B5"
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/nettlesoup
+ name = "Nettle soup"
+ desc = "To think, the botanist would've beat you to death with one of these."
+ icon_state = "nettlesoup"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#AFC4B5"
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/mysterysoup
+ name = "mystery soup"
+ desc = "The mystery is, why aren't you eating it?"
+ icon_state = "mysterysoup"
+ var/extra_reagent = null
+ bitesize = 5
+ list_reagents = list("nutriment" = 6)
+
+/obj/item/reagent_containers/food/snacks/mysterysoup/New()
+ ..()
+ extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine")
+ reagents.add_reagent("[extra_reagent]", 5)
+
+/obj/item/reagent_containers/food/snacks/wishsoup
+ name = "Wish Soup"
+ desc = "I wish this was soup."
+ icon_state = "wishsoup"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#D1F4FF"
+ bitesize = 5
+ list_reagents = list("water" = 10)
+
+/obj/item/reagent_containers/food/snacks/wishsoup/New()
+ ..()
+ if(prob(25))
+ desc = "A wish come true!" // hue
+ reagents.add_reagent("nutriment", 9)
+ reagents.add_reagent("vitamin", 1)
+
+/obj/item/reagent_containers/food/snacks/tomatosoup
+ name = "Tomato Soup"
+ desc = "Drinking this feels like being a vampire! A tomato vampire..."
+ icon_state = "tomatosoup"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#D92929"
+ bitesize = 5
+ list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3)
+
+/obj/item/reagent_containers/food/snacks/milosoup
+ name = "Milosoup"
+ desc = "The universe's best soup! Yum!!!"
+ icon_state = "milosoup"
+ trash = /obj/item/trash/snack_bowl
+ bitesize = 5
+ list_reagents = list("nutriment" = 7, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/mushroomsoup
+ name = "chantrelle soup"
+ desc = "A delicious and hearty mushroom soup."
+ icon_state = "mushroomsoup"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#E386BF"
+ bitesize = 5
+ list_reagents = list("nutriment" = 8, "vitamin" = 4)
+
+/obj/item/reagent_containers/food/snacks/beetsoup
+ name = "beet soup"
+ desc = "Wait, how do you spell it again..?"
+ icon_state = "beetsoup"
+ trash = /obj/item/trash/snack_bowl
+ bitesize = 5
+ filling_color = "#FAC9FF"
+ list_reagents = list("nutriment" = 7, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/beetsoup/New()
+ ..()
+ name = pick("borsch","bortsch","borstch","borsh","borshch","borscht")
+
+
+//////////////////////
+// Stews //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/stew
+ name = "Stew"
+ desc = "A nice and warm stew. Healthy and strong."
+ icon_state = "stew"
+ filling_color = "#9E673A"
+ bitesize = 7
+ list_reagents = list("nutriment" = 10, "oculine" = 5, "tomatojuice" = 5, "vitamin" = 5)
+
+/obj/item/reagent_containers/food/snacks/stewedsoymeat
+ name = "Stewed Soy Meat"
+ desc = "Even non-vegetarians will LOVE this!"
+ icon_state = "stewedsoymeat"
+ trash = /obj/item/trash/plate
+ list_reagents = list("nutriment" = 8)
+
+
+//////////////////////
+// Chili //
+//////////////////////
+
+/obj/item/reagent_containers/food/snacks/hotchili
+ name = "Hot Chili"
+ desc = "A five alarm Texan Chili!"
+ icon_state = "hotchili"
+ trash = /obj/item/trash/snack_bowl
+ filling_color = "#FF3C00"
+ bitesize = 5
+ list_reagents = list("nutriment" = 5, "capsaicin" = 1, "tomatojuice" = 2, "vitamin" = 2)
+
+/obj/item/reagent_containers/food/snacks/coldchili
+ name = "Cold Chili"
+ desc = "This slush is barely a liquid!"
+ icon_state = "coldchili"
+ filling_color = "#2B00FF"
+ trash = /obj/item/trash/snack_bowl
+ bitesize = 5
+ list_reagents = list("nutriment" = 5, "frostoil" = 1, "tomatojuice" = 2, "vitamin" = 2)
diff --git a/code/modules/food_and_drinks/food/meat.dm b/code/modules/food_and_drinks/food/meat.dm
deleted file mode 100644
index 7940050b35a..00000000000
--- a/code/modules/food_and_drinks/food/meat.dm
+++ /dev/null
@@ -1,55 +0,0 @@
-/obj/item/reagent_containers/food/snacks/meat
- name = "meat"
- desc = "A slab of meat"
- icon_state = "meat"
- health = 180
- filling_color = "#FF1C1C"
- bitesize = 3
- list_reagents = list("protein" = 3)
-
-/obj/item/reagent_containers/food/snacks/meat/attackby(obj/item/W, mob/user, params)
- if(istype(W, /obj/item/kitchen/knife) || istype(W, /obj/item/scalpel))
- new /obj/item/reagent_containers/food/snacks/rawcutlet(src)
- new /obj/item/reagent_containers/food/snacks/rawcutlet(src)
- new /obj/item/reagent_containers/food/snacks/rawcutlet(src)
- to_chat(user, "You cut the meat in thin strips.")
- qdel(src)
- else
- ..()
-
-/obj/item/reagent_containers/food/snacks/meat/syntiflesh
- name = "synthetic meat"
- desc = "A synthetic slab of flesh."
-
-/obj/item/reagent_containers/food/snacks/meat/human
- name = "-meat"
- var/subjectname = ""
- var/subjectjob = null
-
-/obj/item/reagent_containers/food/snacks/meat/slab/meatproduct
- name = "meat product"
- desc = "A slab of station reclaimed and chemically processed meat product."
-
-/obj/item/reagent_containers/food/snacks/meat/monkey
- //same as plain meat
-
-/obj/item/reagent_containers/food/snacks/meat/corgi
- name = "Corgi meat"
- desc = "Tastes like... well you know..."
-
-/obj/item/reagent_containers/food/snacks/meat/pug
- name = "Pug meat"
- desc = "Tastes like... well you know..."
-
-/obj/item/reagent_containers/food/snacks/meat/ham
- name = "Ham"
- desc = "Taste like bacon."
- list_reagents = list("protein" = 3, "porktonium" = 10)
-
-/obj/item/reagent_containers/food/snacks/meat/meatwheat
- name = "meatwheat clump"
- desc = "This doesn't look like meat, but your standards aren't that high to begin with."
- list_reagents = list("nutriment" = 3, "vitamin" = 2, "blood" = 5)
- filling_color = rgb(150, 0, 0)
- icon_state = "meatwheat_clump"
- bitesize = 4
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm
index 3a730c3868d..4803405520a 100644
--- a/code/modules/food_and_drinks/food/snacks.dm
+++ b/code/modules/food_and_drinks/food/snacks.dm
@@ -271,807 +271,6 @@
// bitesize = 3 //This is the amount each bite consumes.
-
-
-/obj/item/reagent_containers/food/snacks/aesirsalad
- name = "Aesir salad"
- desc = "Probably too incredible for mortal men to fully enjoy."
- icon_state = "aesirsalad"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#468C00"
- bitesize = 3
- list_reagents = list("nutriment" = 8, "omnizine" = 8, "vitamin" = 6)
-
-/obj/item/reagent_containers/food/snacks/chips
- name = "chips"
- desc = "Commander Riker's What-The-Crisps."
- icon_state = "chips"
- bitesize = 1
- trash = /obj/item/trash/chips
- filling_color = "#E8C31E"
- junkiness = 20
- list_reagents = list("nutriment" = 1, "sodiumchloride" = 1, "sugar" = 3)
-
-/obj/item/reagent_containers/food/snacks/cornchips
- name = "corn chips"
- desc = "Goes great with salsa! OLE!"
- icon_state = "chips"
- bitesize = 1
- trash = /obj/item/trash/chips
- filling_color = "#E8C31E"
- list_reagents = list("nutriment" = 3)
-
-/obj/item/reagent_containers/food/snacks/cookie
- name = "cookie"
- desc = "COOKIE!!!"
- icon_state = "COOKIE!!!"
- bitesize = 1
- filling_color = "#DBC94F"
- list_reagents = list("nutriment" = 1)
-
-/obj/item/reagent_containers/food/snacks/chocolatebar
- name = "Chocolate Bar"
- desc = "Such sweet, fattening food."
- icon_state = "chocolatebar"
- filling_color = "#7D5F46"
- list_reagents = list("nutriment" = 2, "sugar" = 2, "cocoa" = 2)
-
-/obj/item/reagent_containers/food/snacks/choc_pile //for reagent chocolate being spilled on turfs
- name = "Pile of Chocolate"
- desc = "A pile of pure chocolate pieces."
- icon_state = "cocoa"
- filling_color = "#7D5F46"
- list_reagents = list("chocolate" = 5)
-
-/obj/item/reagent_containers/food/snacks/chocolateegg
- name = "Chocolate Egg"
- desc = "Such sweet, fattening food."
- icon_state = "chocolateegg"
- filling_color = "#7D5F46"
- list_reagents = list("nutriment" = 4, "sugar" = 2, "cocoa" = 2)
-
-/obj/item/reagent_containers/food/snacks/donut
- name = "donut"
- desc = "Goes great with Robust Coffee."
- icon_state = "donut1"
- bitesize = 5
- list_reagents = list("nutriment" = 3, "sugar" = 2)
- var/extra_reagent = null
- filling_color = "#D2691E"
- var/randomized_sprinkles = 1
-
-/obj/item/reagent_containers/food/snacks/donut/New()
- ..()
- if(randomized_sprinkles && prob(30))
- icon_state = "donut2"
- name = "frosted donut"
- reagents.add_reagent("sprinkles", 2)
- filling_color = "#FF69B4"
-
-/obj/item/reagent_containers/food/snacks/donut/sprinkles
- name = "frosted donut"
- icon_state = "donut2"
- list_reagents = list("nutriment" = 3, "sugar" = 2, "spinkles" = 2)
- filling_color = "#FF69B4"
- randomized_sprinkles = 0
-
-/obj/item/reagent_containers/food/snacks/donut/chaos
- name = "chaos donut"
- desc = "Like life, it never quite tastes the same."
- bitesize = 10
-
-/obj/item/reagent_containers/food/snacks/donut/chaos/New()
- ..()
- extra_reagent = pick("nutriment", "capsaicin", "frostoil", "krokodil", "plasma", "cocoa", "slimejelly", "banana", "berryjuice", "omnizine")
- reagents.add_reagent("[extra_reagent]", 3)
- if(prob(30))
- icon_state = "donut2"
- name = "frosted chaos donut"
- reagents.add_reagent("sprinkles", 2)
- filling_color = "#FF69B4"
-
-/obj/item/reagent_containers/food/snacks/donut/jelly
- name = "jelly donut"
- desc = "You jelly?"
- icon_state = "jdonut1"
- extra_reagent = "berryjuice"
-
-/obj/item/reagent_containers/food/snacks/donut/jelly/New()
- ..()
- if(extra_reagent)
- reagents.add_reagent("[extra_reagent]", 3)
- if(prob(30))
- icon_state = "jdonut2"
- name = "frosted jelly Donut"
- reagents.add_reagent("sprinkles", 2)
- filling_color = "#FF69B4"
-
-/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly
- name = "jelly donut"
- desc = "You jelly?"
- icon_state = "jdonut1"
- extra_reagent = "slimejelly"
-
-/obj/item/reagent_containers/food/snacks/donut/jelly/cherryjelly
- name = "jelly donut"
- desc = "You jelly?"
- icon_state = "jdonut1"
- extra_reagent = "cherryjelly"
-
-/obj/item/reagent_containers/food/snacks/egg
- name = "egg"
- desc = "An egg!"
- icon_state = "egg"
- filling_color = "#FDFFD1"
- list_reagents = list("protein" = 1, "egg" = 5)
-
-/obj/item/reagent_containers/food/snacks/egg/throw_impact(atom/hit_atom)
- ..()
- var/turf/T = get_turf(hit_atom)
- new/obj/effect/decal/cleanable/egg_smudge(T)
- if(reagents)
- reagents.reaction(hit_atom, TOUCH)
- qdel(src)
-
-/obj/item/reagent_containers/food/snacks/egg/attackby(obj/item/W, mob/user, params)
- if(istype( W, /obj/item/toy/crayon ))
- var/obj/item/toy/crayon/C = W
- var/clr = C.colourName
-
- if(!(clr in list("blue","green","mime","orange","purple","rainbow","red","yellow")))
- to_chat(usr, "The egg refuses to take on this color!")
- return
-
- to_chat(usr, "You color \the [src] [clr]")
- icon_state = "egg-[clr]"
- item_color = clr
- else
- ..()
-
-/obj/item/reagent_containers/food/snacks/egg/blue
- icon_state = "egg-blue"
- item_color = "blue"
-
-/obj/item/reagent_containers/food/snacks/egg/green
- icon_state = "egg-green"
- item_color = "green"
-
-/obj/item/reagent_containers/food/snacks/egg/mime
- icon_state = "egg-mime"
- item_color = "mime"
-
-/obj/item/reagent_containers/food/snacks/egg/orange
- icon_state = "egg-orange"
- item_color = "orange"
-
-/obj/item/reagent_containers/food/snacks/egg/purple
- icon_state = "egg-purple"
- item_color = "purple"
-
-/obj/item/reagent_containers/food/snacks/egg/rainbow
- icon_state = "egg-rainbow"
- item_color = "rainbow"
-
-/obj/item/reagent_containers/food/snacks/egg/red
- icon_state = "egg-red"
- item_color = "red"
-
-/obj/item/reagent_containers/food/snacks/egg/yellow
- icon_state = "egg-yellow"
- item_color = "yellow"
-
-/obj/item/reagent_containers/food/snacks/friedegg
- name = "Fried egg"
- desc = "A fried egg, with a touch of salt and pepper."
- icon_state = "friedegg"
- filling_color = "#FFDF78"
- bitesize = 1
- list_reagents = list("nutriment" = 3, "egg" = 5)
-
-/obj/item/reagent_containers/food/snacks/boiledegg
- name = "Boiled egg"
- desc = "A hard boiled egg."
- icon_state = "egg"
- filling_color = "#FFFFFF"
- list_reagents = list("nutriment" = 2, "egg" = 5, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/organ
-
- name = "organ"
- desc = "It's good for you."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "appendix"
- filling_color = "#E00D34"
- bitesize = 3
- list_reagents = list("protein" = 4, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/appendix
-//yes, this is the same as meat. I might do something different in future
- name = "appendix"
- desc = "An appendix which looks perfectly healthy."
- icon = 'icons/obj/surgery.dmi'
- icon_state = "appendix"
- filling_color = "#E00D34"
- bitesize = 3
- list_reagents = list("protein" = 3, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/appendix/inflamed
- name = "inflamed appendix"
- desc = "An appendix which appears to be inflamed."
- icon_state = "appendixinflamed"
- filling_color = "#E00D7A"
-
-/obj/item/reagent_containers/food/snacks/tofu
- name = "Tofu"
- icon_state = "tofu"
- desc = "We all love tofu."
- filling_color = "#FFFEE0"
- bitesize = 3
- list_reagents = list("plantmatter" = 2)
-
-/obj/item/reagent_containers/food/snacks/fried_tofu
- name = "Fried Tofu"
- icon_state = "tofu"
- desc = "Proof that even vegetarians crave unhealthy foods."
- filling_color = "#FFFEE0"
- bitesize = 3
- list_reagents = list("plantmatter" = 3)
-
-/obj/item/reagent_containers/food/snacks/tofurkey
- name = "Tofurkey"
- desc = "A fake turkey made from tofu."
- icon_state = "tofurkey"
- filling_color = "#FFFEE0"
- bitesize = 3
- list_reagents = list("nutriment" = 12, "ether" = 3)
-
-/obj/item/reagent_containers/food/snacks/stuffing
- name = "Stuffing"
- desc = "Moist, peppery breadcrumbs for filling the body cavities of dead birds. Dig in!"
- icon_state = "stuffing"
- filling_color = "#C9AC83"
- list_reagents = list("nutriment" = 3)
-
-/obj/item/reagent_containers/food/snacks/hugemushroomslice
- name = "huge mushroom slice"
- desc = "A slice from a huge mushroom."
- icon_state = "hugemushroomslice"
- filling_color = "#E0D7C5"
- bitesize = 6
- list_reagents = list("plantmatter" = 3, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/tomatomeat
- name = "tomato slice"
- desc = "A slice from a huge tomato."
- icon_state = "tomatomeat"
- filling_color = "#DB0000"
- bitesize = 6
- list_reagents = list("protein" = 2)
-
-/obj/item/reagent_containers/food/snacks/bearmeat
- name = "bear meat"
- desc = "A very manly slab of meat."
- icon_state = "bearmeat"
- filling_color = "#DB0000"
- bitesize = 3
- list_reagents = list("protein" = 12, "morphine" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/xenomeat
- name = "meat"
- desc = "A slab of meat."
- icon_state = "xenomeat"
- filling_color = "#43DE18"
- bitesize = 6
- list_reagents = list("protein" = 3, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/spidermeat
- name = "spider meat"
- desc = "A slab of spider meat."
- icon_state = "spidermeat"
- bitesize = 3
- list_reagents = list("protein" = 3, "toxin" = 3, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/lizardmeat
- name = "mutant lizard meat"
- desc = "Seems to be a slab of meat from some mutant lizard thing?"
- icon_state = "xenomeat"
- filling_color = "#43DE18"
- bitesize = 3
- list_reagents = list("protein" = 3, "toxin" = 3)
-
-/obj/item/reagent_containers/food/snacks/spiderleg
- name = "spider leg"
- desc = "A still twitching leg of a giant spider... you don't really want to eat this, do you?"
- icon_state = "spiderleg"
- list_reagents = list("protein" = 2, "toxin" = 2)
-
-/obj/item/reagent_containers/food/snacks/meatball
- name = "Meatball"
- desc = "A great meal all round."
- icon_state = "meatball"
- filling_color = "#DB0000"
- list_reagents = list("protein" = 4, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/sausage
- name = "Sausage"
- desc = "A piece of mixed, long meat."
- icon_state = "sausage"
- filling_color = "#DB0000"
- list_reagents = list("protein" = 6, "vitamin" = 1, "porktonium" = 10)
-
-/obj/item/reagent_containers/food/snacks/donkpocket
- name = "Donk-pocket"
- desc = "The food of choice for the seasoned traitor."
- icon_state = "donkpocket"
- filling_color = "#DEDEAB"
- list_reagents = list("nutriment" = 4)
-
-/obj/item/reagent_containers/food/snacks/warmdonkpocket
- name = "Warm Donk-pocket"
- desc = "The food of choice for the seasoned traitor."
- icon_state = "donkpocket"
- filling_color = "#DEDEAB"
- list_reagents = list("nutriment" = 4)
-
-/obj/item/reagent_containers/food/snacks/warmdonkpocket/Post_Consume(mob/living/M)
- M.reagents.add_reagent("omnizine", 15)
-
-/obj/item/reagent_containers/food/snacks/warmdonkpocket_weak
- name = "Lightly Warm Donk-pocket"
- desc = "The food of choice for the seasoned traitor. This one is lukewarm."
- icon_state = "donkpocket"
- filling_color = "#DEDEAB"
- list_reagents = list("nutriment" = 4, "weak_omnizine" = 3)
-
-/obj/item/reagent_containers/food/snacks/syndidonkpocket
- name = "Donk-pocket"
- desc = "This donk-pocket is emitting a small amount of heat."
- icon_state = "donkpocket"
- filling_color = "#DEDEAB"
- bitesize = 100 //nom the whole thing at once.
- list_reagents = list("nutriment" = 1)
-
-/obj/item/reagent_containers/food/snacks/syndidonkpocket/Post_Consume(mob/living/M)
- M.reagents.add_reagent("omnizine", 15)
- M.reagents.add_reagent("teporone", 15)
- M.reagents.add_reagent("synaptizine", 15)
- M.reagents.add_reagent("salglu_solution", 15)
- M.reagents.add_reagent("salbutamol", 15)
- M.reagents.add_reagent("methamphetamine", 15)
-
-/obj/item/reagent_containers/food/snacks/brainburger
- name = "brainburger"
- desc = "A strange looking burger. It looks almost sentient."
- icon_state = "brainburger"
- filling_color = "#F2B6EA"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "prions" = 10, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/ghostburger
- name = "Ghost Burger"
- desc = "Spooky! It doesn't look very filling."
- icon_state = "ghostburger"
- filling_color = "#FFF2FF"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/human
- var/hname = ""
- var/job = null
- filling_color = "#D63C3C"
-
-/obj/item/reagent_containers/food/snacks/human/burger
- name = "-burger"
- desc = "A bloody burger."
- icon_state = "hburger"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/cheeseburger
- name = "cheeseburger"
- desc = "The cheese adds a good flavor."
- icon_state = "cheeseburger"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/monkeyburger
- name = "burger"
- desc = "The cornerstone of every nutritious breakfast."
- icon_state = "hburger"
- filling_color = "#D63C3C"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/tofuburger
- name = "Tofu Burger"
- desc = "What.. is that meat?"
- icon_state = "tofuburger"
- filling_color = "#FFFEE0"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/roburger
- name = "roburger"
- desc = "The lettuce is the only organic component. Beep."
- icon_state = "roburger"
- filling_color = "#CCCCCC"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "nanomachines" = 10, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/roburgerbig
- name = "roburger"
- desc = "This massive patty looks like poison. Beep."
- icon_state = "roburger"
- filling_color = "#CCCCCC"
- volume = 120
- bitesize = 3
- list_reagents = list("nutriment" = 6, "nanomachines" = 70, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/xenoburger
- name = "xenoburger"
- desc = "Smells caustic. Tastes like heresy."
- icon_state = "xburger"
- filling_color = "#43DE18"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/clownburger
- name = "Clown Burger"
- desc = "This tastes funny..."
- icon_state = "clownburger"
- filling_color = "#FF00FF"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/mimeburger
- name = "Mime Burger"
- desc = "Its taste defies language."
- icon_state = "mimeburger"
- filling_color = "#FFFFFF"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/baseballburger
- name = "home run baseball burger"
- desc = "It's still warm. The steam coming off of it looks like baseball."
- icon_state = "baseball"
- filling_color = "#CD853F"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/omelette
- name = "Omelette Du Fromage"
- desc = "That's all you can say!"
- icon_state = "omelette"
- trash = /obj/item/trash/plate
- filling_color = "#FFF9A8"
- list_reagents = list("nutriment" = 8, "vitamin" = 1)
- bitesize = 1
-
-/obj/item/reagent_containers/food/snacks/muffin
- name = "Muffin"
- desc = "A delicious and spongy little cake."
- icon_state = "muffin"
- filling_color = "#E0CF9B"
- list_reagents = list("nutriment" = 6)
-
-/obj/item/reagent_containers/food/snacks/pie
- name = "Banana Cream Pie"
- desc = "Just like back home, on clown planet! HONK!"
- icon_state = "pie"
- trash = /obj/item/trash/plate
- filling_color = "#FBFFB8"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "banana" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/pie/throw_impact(atom/hit_atom)
- ..()
- new/obj/effect/decal/cleanable/pie_smudge(loc)
- visible_message("[src] splats.","You hear a splat.")
- qdel(src)
-
-/obj/item/reagent_containers/food/snacks/berryclafoutis
- name = "Berry Clafoutis"
- desc = "No black birds, this is a good sign."
- icon_state = "berryclafoutis"
- trash = /obj/item/trash/plate
- bitesize = 3
- list_reagents = list("nutriment" = 10, "berryjuice" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/waffles
- name = "waffles"
- desc = "Mmm, waffles."
- icon_state = "waffles"
- trash = /obj/item/trash/waffles
- filling_color = "#E6DEB5"
- list_reagents = list("nutriment" = 8, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/eggplantparm
- name = "Eggplant Parmigiana"
- desc = "The only good recipe for eggplant."
- icon_state = "eggplantparm"
- trash = /obj/item/trash/plate
- filling_color = "#4D2F5E"
- list_reagents = list("nutriment" = 6, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/soylentgreen
- name = "Soylent Green"
- desc = "Not made of people. Honest." //Totally people.
- icon_state = "soylent_green"
- trash = /obj/item/trash/waffles
- filling_color = "#B8E6B5"
- list_reagents = list("nutriment" = 10, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/soylentviridians
- name = "Soylent Virdians"
- desc = "Not made of people. Honest." //Actually honest for once.
- icon_state = "soylent_yellow"
- trash = /obj/item/trash/waffles
- filling_color = "#E6FA61"
- list_reagents = list("nutriment" = 10, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/meatpie
- name = "Meat-pie"
- icon_state = "meatpie"
- desc = "An old barber recipe, very delicious!"
- trash = /obj/item/trash/plate
- filling_color = "#948051"
- bitesize = 3
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/tofupie
- name = "Tofu-pie"
- icon_state = "meatpie"
- desc = "A delicious tofu pie."
- trash = /obj/item/trash/plate
- filling_color = "#FFFEE0"
- bitesize = 3
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/amanita_pie
- name = "amanita pie"
- desc = "Sweet and tasty poison pie."
- icon_state = "amanita_pie"
- filling_color = "#FFCCCC"
- bitesize = 4
- list_reagents = list("nutriment" = 6, "amanitin" = 3, "psilocybin" = 1, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/plump_pie
- name = "plump pie"
- desc = "I bet you love stuff made out of plump helmets!"
- icon_state = "plump_pie"
- filling_color = "#B8279B"
- bitesize = 3
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/plump_pie/New()
- ..()
- if(prob(10))
- name = "exceptional plump pie"
- desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!" // What
- reagents.add_reagent("omnizine", 5)
-
-/obj/item/reagent_containers/food/snacks/xemeatpie
- name = "Xeno-pie"
- icon_state = "xenomeatpie"
- desc = "A delicious meatpie. Probably heretical."
- trash = /obj/item/trash/plate
- filling_color = "#43DE18"
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/wingfangchu
- name = "Wing Fang Chu"
- desc = "A savory dish of alien wing wang in soy."
- icon_state = "wingfangchu"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#43DE18"
- list_reagents = list("nutriment" = 6, "soysauce" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/human/kabob
- name = "-kabob"
- icon_state = "kabob"
- desc = "A human meat, on a stick."
- trash = /obj/item/stack/rods
- filling_color = "#A85340"
- list_reagents = list("nutriment" = 8)
-
-/obj/item/reagent_containers/food/snacks/monkeykabob
- name = "Meat-kabob"
- icon_state = "kabob"
- desc = "Delicious meat, on a stick."
- trash = /obj/item/stack/rods
- filling_color = "#A85340"
- list_reagents = list("nutriment" = 8)
-
-/obj/item/reagent_containers/food/snacks/tofukabob
- name = "Tofu-kabob"
- icon_state = "kabob"
- desc = "Vegan meat, on a stick."
- trash = /obj/item/stack/rods
- filling_color = "#FFFEE0"
- list_reagents = list("nutriment" = 8)
-
-/obj/item/reagent_containers/food/snacks/popcorn
- name = "Popcorn"
- desc = "Now let's find some cinema."
- icon_state = "popcorn"
- trash = /obj/item/trash/popcorn
- var/unpopped = 0
- filling_color = "#FFFAD4"
- bitesize = 0.1 //this snack is supposed to be eating during looooong time. And this it not dinner food! --rastaf0
- list_reagents = list("nutriment" = 2)
-
-/obj/item/reagent_containers/food/snacks/popcorn/New()
- ..()
- unpopped = rand(1,10)
-
-/obj/item/reagent_containers/food/snacks/popcorn/On_Consume(mob/M, mob/user)
- if(prob(unpopped)) //lol ...what's the point?
- to_chat(user, "You bite down on an un-popped kernel!")
- unpopped = max(0, unpopped-1)
- ..()
-
-/obj/item/reagent_containers/food/snacks/sosjerky
- name = "Scaredy's Private Reserve Beef Jerky"
- icon_state = "sosjerky"
- desc = "Beef jerky made from the finest space cows."
- trash = /obj/item/trash/sosjerky
- filling_color = "#631212"
- junkiness = 25
- list_reagents = list("protein" = 1, "sugar" = 3)
-
-/obj/item/reagent_containers/food/snacks/sosjerky/healthy
- name = "homemade beef jerky"
- desc = "Homemade beef jerky made from the finest space cows."
- list_reagents = list("nutriment" = 3, "vitamin" = 1)
- junkiness = 0
-
-/obj/item/reagent_containers/food/snacks/pistachios
- name = "Pistachios"
- icon_state = "pistachios"
- desc = "A snack of deliciously salted pistachios. A perfectly valid choice..."
- trash = /obj/item/trash/pistachios
- filling_color = "#BAD145"
- junkiness = 20
- list_reagents = list("plantmatter" = 2, "sodiumchloride" = 1, "sugar" = 4)
-
-/obj/item/reagent_containers/food/snacks/no_raisin
- name = "4no Raisins"
- icon_state = "4no_raisins"
- desc = "Best raisins in the universe. Not sure why."
- trash = /obj/item/trash/raisins
- filling_color = "#343834"
- junkiness = 25
- list_reagents = list("plantmatter" = 2, "sugar" = 4)
-
-/obj/item/reagent_containers/food/snacks/no_raisin/healthy
- name = "homemade raisins"
- desc = "homemade raisins, the best in all of spess."
- list_reagents = list("nutriment" = 3, "vitamin" = 2)
- junkiness = 0
-
-/obj/item/reagent_containers/food/snacks/spacetwinkie
- name = "Space Twinkie"
- icon_state = "space_twinkie"
- desc = "Guaranteed to survive longer then you will."
- filling_color = "#FFE591"
- junkiness = 25
- list_reagents = list("sugar" = 4)
-
-/obj/item/reagent_containers/food/snacks/cheesiehonkers
- name = "Cheesie Honkers"
- icon_state = "cheesie_honkers"
- desc = "Bite sized cheesie snacks that will honk all over your mouth."
- trash = /obj/item/trash/cheesie
- filling_color = "#FFA305"
- junkiness = 25
- list_reagents = list("nutriment" = 1, "fake_cheese" = 2, "sugar" = 3)
-
-/obj/item/reagent_containers/food/snacks/chinese/chowmein
- name = "chow mein"
- desc = "What is in this anyways?"
- icon_state = "chinese1"
- junkiness = 25
- list_reagents = list("nutriment" = 1, "beans" = 3, "msg" = 4, "sugar" = 2)
-
-/obj/item/reagent_containers/food/snacks/chinese/sweetsourchickenball
- name = "Sweet & Sour Chicken Balls"
- desc = "Is this chicken cooked? The odds are better than wok paper scissors."
- icon_state = "chickenball"
- junkiness = 25
- list_reagents = list("nutriment" = 2, "msg" = 4, "sugar" = 2)
-
-/obj/item/reagent_containers/food/snacks/chinese/tao
- name = "Admiral Yamamoto carp"
- desc = "Tastes like chicken."
- icon_state = "chinese2"
- junkiness = 25
- list_reagents = list("nutriment" = 1, "protein" = 1, "msg" = 4, "sugar" = 4)
-
-/obj/item/reagent_containers/food/snacks/chinese/newdles
- name = "chinese newdles"
- desc = "Made fresh, weekly!"
- icon_state = "chinese3"
- junkiness = 25
- list_reagents = list("nutriment" = 1, "msg" = 4, "sugar" = 3)
-
-/obj/item/reagent_containers/food/snacks/chinese/rice
- name = "fried rice"
- desc = "A timeless classic."
- icon_state = "chinese4"
- junkiness = 20
- list_reagents = list("nutriment" = 1, "rice" = 3, "msg" = 4, "sugar" = 2)
-
-/obj/item/reagent_containers/food/snacks/syndicake
- name = "Syndi-Cakes"
- icon_state = "syndi_cakes"
- desc = "An extremely moist snack cake that tastes just as good after being nuked."
- filling_color = "#FF5D05"
- trash = /obj/item/trash/syndi_cakes
- bitesize = 3
- list_reagents = list("nutriment" = 4, "salglu_solution" = 5)
-
-/obj/item/reagent_containers/food/snacks/loadedbakedpotato
- name = "Loaded Baked Potato"
- desc = "Totally baked."
- icon_state = "loadedbakedpotato"
- filling_color = "#9C7A68"
- list_reagents = list("nutriment" = 6)
-
-/obj/item/reagent_containers/food/snacks/fries
- name = "Space Fries"
- desc = "AKA: French Fries, Freedom Fries, etc."
- icon_state = "fries"
- trash = /obj/item/trash/plate
- filling_color = "#EDDD00"
- list_reagents = list("nutriment" = 4)
-
-/obj/item/reagent_containers/food/snacks/soydope
- name = "Soy Dope"
- desc = "Dope from a soy."
- icon_state = "soydope"
- trash = /obj/item/trash/plate
- filling_color = "#C4BF76"
- list_reagents = list("nutriment" = 2)
-
-/obj/item/reagent_containers/food/snacks/spaghetti
- name = "Spaghetti"
- desc = "A bundle of raw spaghetti."
- icon_state = "spaghetti"
- filling_color = "#EDDD00"
- list_reagents = list("nutriment" = 1, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/macaroni
- name = "Macaroni twists"
- desc = "These are little twists of raw macaroni."
- icon_state = "macaroni"
- filling_color = "#EDDD00"
- list_reagents = list("nutriment" = 1, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/macncheese
- name = "Macaroni cheese"
- desc = "One of the most comforting foods in the world. Apparently."
- trash = /obj/item/trash/snack_bowl
- icon_state = "macncheese"
- filling_color = "#ffe45d"
- list_reagents = list("nutriment" = 5, "vitamin" = 2, "cheese" = 4)
-
-/obj/item/reagent_containers/food/snacks/cheesyfries
- name = "Cheesy Fries"
- desc = "Fries. Covered in cheese. Duh."
- icon_state = "cheesyfries"
- trash = /obj/item/trash/plate
- filling_color = "#EDDD00"
- list_reagents = list("nutriment" = 6)
-
-/obj/item/reagent_containers/food/snacks/fortunecookie
- name = "Fortune cookie"
- desc = "A true prophecy in each cookie!"
- icon_state = "fortune_cookie"
- filling_color = "#E8E79E"
- list_reagents = list("nutriment" = 3)
- trash = /obj/item/paper/fortune
-
/obj/item/reagent_containers/food/snacks/badrecipe
name = "Burned mess"
desc = "Someone should be demoted from chef for this."
@@ -1085,1347 +284,7 @@
cooktype["grilled"] = 1
cooktype["deep fried"] = 1
-/obj/item/reagent_containers/food/snacks/meatsteak
- name = "Meat steak"
- desc = "A piece of hot spicy meat."
- icon_state = "meatstake"
- trash = /obj/item/trash/plate
- filling_color = "#7A3D11"
- bitesize = 3
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/spacylibertyduff
- name = "Spacy Liberty Duff"
- desc = "Jello gelatin, from Alfred Hubbard's cookbook."
- icon_state = "spacylibertyduff"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#42B873"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "psilocybin" = 6)
-
-/obj/item/reagent_containers/food/snacks/amanitajelly
- name = "Amanita Jelly"
- desc = "Looks curiously toxic."
- icon_state = "amanitajelly"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#ED0758"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "amanitin" = 6, "psilocybin" = 3)
-
-/obj/item/reagent_containers/food/snacks/poppypretzel
- name = "Poppy pretzel"
- desc = "It's all twisted up!"
- icon_state = "poppypretzel"
- filling_color = "#916E36"
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/meatballsoup
- name = "Meatball soup"
- desc = "You've got balls kid, BALLS!"
- icon_state = "meatballsoup"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#785210"
- bitesize = 5
- list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/slimesoup
- name = "slime soup"
- desc = "If no water is available, you may substitute tears."
- icon_state = "slimesoup"
- filling_color = "#C4DBA0"
- bitesize = 5
- list_reagents = list("nutriment" = 5, "slimejelly" = 5, "water" = 5, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/bloodsoup
- name = "Tomato soup"
- desc = "Smells like copper."
- icon_state = "tomatosoup"
- filling_color = "#FF0000"
- bitesize = 5
- list_reagents = list("nutriment" = 2, "blood" = 10, "water" = 5, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/clownstears
- name = "Clown's Tears"
- desc = "Not very funny."
- icon_state = "clownstears"
- filling_color = "#C4FBFF"
- bitesize = 5
- list_reagents = list("nutriment" = 4, "banana" = 5, "water" = 5, "vitamin" = 8)
-
-/obj/item/reagent_containers/food/snacks/vegetablesoup
- name = "Vegetable soup"
- desc = "A true vegan meal." //TODO
- icon_state = "vegetablesoup"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#AFC4B5"
- bitesize = 5
- list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/nettlesoup
- name = "Nettle soup"
- desc = "To think, the botanist would've beat you to death with one of these."
- icon_state = "nettlesoup"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#AFC4B5"
- bitesize = 5
- list_reagents = list("nutriment" = 8, "water" = 5, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/mysterysoup
- name = "mystery soup"
- desc = "The mystery is, why aren't you eating it?"
- icon_state = "mysterysoup"
- var/extra_reagent = null
- bitesize = 5
- list_reagents = list("nutriment" = 6)
-
-/obj/item/reagent_containers/food/snacks/mysterysoup/New()
- ..()
- extra_reagent = pick("capsaicin", "frostoil", "omnizine", "banana", "blood", "slimejelly", "toxin", "banana", "carbon", "oculine")
- reagents.add_reagent("[extra_reagent]", 5)
-
-/obj/item/reagent_containers/food/snacks/wishsoup
- name = "Wish Soup"
- desc = "I wish this was soup."
- icon_state = "wishsoup"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#D1F4FF"
- bitesize = 5
- list_reagents = list("water" = 10)
-
-/obj/item/reagent_containers/food/snacks/wishsoup/New()
- ..()
- if(prob(25))
- desc = "A wish come true!" // hue
- reagents.add_reagent("nutriment", 9)
- reagents.add_reagent("vitamin", 1)
-
-/obj/item/reagent_containers/food/snacks/hotchili
- name = "Hot Chili"
- desc = "A five alarm Texan Chili!"
- icon_state = "hotchili"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#FF3C00"
- bitesize = 5
- list_reagents = list("nutriment" = 5, "capsaicin" = 1, "tomatojuice" = 2, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/coldchili
- name = "Cold Chili"
- desc = "This slush is barely a liquid!"
- icon_state = "coldchili"
- filling_color = "#2B00FF"
- trash = /obj/item/trash/snack_bowl
- bitesize = 5
- list_reagents = list("nutriment" = 5, "frostoil" = 1, "tomatojuice" = 2, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/raw_bacon
- name = "raw bacon"
- desc = "It's fleshy and pink!"
- icon_state = "raw_bacon"
- list_reagents = list("nutriment" = 1, "porktonium" = 10)
-
-/obj/item/reagent_containers/food/snacks/bacon
- name = "bacon"
- desc = "It looks juicy and tastes amazing!"
- icon_state = "bacon2"
- list_reagents = list("nutriment" = 4, "porktonium" = 10, "msg" = 4)
-
-/obj/item/reagent_containers/food/snacks/telebacon
- name = "Tele Bacon"
- desc = "It tastes a little odd but it is still delicious."
- icon_state = "bacon"
- var/obj/item/radio/beacon/bacon/baconbeacon
- list_reagents = list("nutriment" = 4, "porktonium" = 10)
-
-/obj/item/reagent_containers/food/snacks/telebacon/New()
- ..()
- baconbeacon = new /obj/item/radio/beacon/bacon(src)
-
-/obj/item/reagent_containers/food/snacks/telebacon/On_Consume(mob/M, mob/user)
- if(!reagents.total_volume)
- baconbeacon.loc = user
- baconbeacon.digest_delay()
-
-
-/obj/item/reagent_containers/food/snacks/monkeycube
- name = "monkey cube"
- desc = "Just add water!"
- icon_state = "monkeycube"
- bitesize = 12
- filling_color = "#ADAC7F"
- var/monkey_type = "Monkey"
- list_reagents = list("nutriment" = 2)
-
-/obj/item/reagent_containers/food/snacks/monkeycube/water_act(volume, temperature)
- if(volume >= 5)
- return Expand()
-
-/obj/item/reagent_containers/food/snacks/monkeycube/wash(mob/user, atom/source)
- user.drop_item()
- forceMove(get_turf(source))
- return 1
-
-/obj/item/reagent_containers/food/snacks/monkeycube/proc/Expand()
- if(!QDELETED(src))
- visible_message("[src] expands!")
- if(fingerprintslast)
- log_game("Cube ([monkey_type]) inflated, last touched by: " + fingerprintslast)
- else
- log_game("Cube ([monkey_type]) inflated, last touched by: NO_DATA")
- var/mob/living/carbon/human/creature = new /mob/living/carbon/human(get_turf(src))
- if(LAZYLEN(fingerprintshidden))
- creature.fingerprintshidden = fingerprintshidden.Copy()
- creature.set_species(monkey_type)
- qdel(src)
-
-/obj/item/reagent_containers/food/snacks/monkeycube/farwacube
- name = "farwa cube"
- monkey_type = "Farwa"
-
-/obj/item/reagent_containers/food/snacks/monkeycube/wolpincube
- name = "wolpin cube"
- monkey_type = "Wolpin"
-
-/obj/item/reagent_containers/food/snacks/monkeycube/stokcube
- name = "stok cube"
- monkey_type = "Stok"
-
-/obj/item/reagent_containers/food/snacks/monkeycube/neaeracube
- name = "neaera cube"
- monkey_type = "Neara"
-
-
-/obj/item/reagent_containers/food/snacks/spellburger
- name = "Spell Burger"
- desc = "This is absolutely Ei Nath."
- icon_state = "spellburger"
- filling_color = "#D505FF"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/bigbiteburger
- name = "Big Bite Burger"
- desc = "Forget the Big Mac. THIS is the future!"
- icon_state = "bigbiteburger"
- filling_color = "#E3D681"
- bitesize = 3
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/enchiladas
- name = "Enchiladas"
- desc = "Viva La Mexico!"
- icon_state = "enchiladas"
- trash = /obj/item/trash/tray
- filling_color = "#A36A1F"
- bitesize = 4
- list_reagents = list("nutriment" = 8, "capsaicin" = 6)
-
-/obj/item/reagent_containers/food/snacks/burrito
- name = "Burrito"
- desc = "Meat, beans, cheese, and rice wrapped up as an easy-to-hold meal."
- icon_state = "burrito"
- trash = /obj/item/trash/plate
- filling_color = "#A36A1F"
- list_reagents = list("nutriment" = 4, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/chimichanga
- name = "Chimichanga"
- desc = "Time to eat a chimi-f***ing-changa."
- icon_state = "chimichanga"
- trash = /obj/item/trash/plate
- filling_color = "#A36A1F"
- list_reagents = list("omnizine" = 4, "cheese" = 2) //Deadpool reference. Deal with it.
-
-/obj/item/reagent_containers/food/snacks/monkeysdelight
- name = "monkey's Delight"
- desc = "Eeee Eee!"
- icon_state = "monkeysdelight"
- trash = /obj/item/trash/tray
- filling_color = "#5C3C11"
- bitesize = 6
- list_reagents = list("nutriment" = 10, "banana" = 5, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/baguette
- name = "Baguette"
- desc = "Bon appetit!"
- icon_state = "baguette"
- filling_color = "#E3D796"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/sandwich
- name = "Sandwich"
- desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud."
- icon_state = "sandwich"
- trash = /obj/item/trash/plate
- filling_color = "#D9BE29"
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/toastedsandwich
- name = "Toasted Sandwich"
- desc = "Now if you only had a pepper bar."
- icon_state = "toastedsandwich"
- trash = /obj/item/trash/plate
- filling_color = "#D9BE29"
- list_reagents = list("nutriment" = 6, "carbon" = 2)
-
-/obj/item/reagent_containers/food/snacks/grilledcheese
- name = "Grilled Cheese Sandwich"
- desc = "Goes great with Tomato soup!"
- icon_state = "toastedsandwich"
- trash = /obj/item/trash/plate
- filling_color = "#D9BE29"
- list_reagents = list("nutriment" = 7, "vitamin" = 1) //why make a regualr sandwhich when you can make grilled cheese, with this nutriment value?
-
-/obj/item/reagent_containers/food/snacks/tomatosoup
- name = "Tomato Soup"
- desc = "Drinking this feels like being a vampire! A tomato vampire..."
- icon_state = "tomatosoup"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#D92929"
- bitesize = 5
- list_reagents = list("nutriment" = 5, "tomatojuice" = 10, "vitamin" = 3)
-
-/obj/item/reagent_containers/food/snacks/rofflewaffles
- name = "Roffle Waffles"
- desc = "Waffles from Roffle. Co."
- icon_state = "rofflewaffles"
- trash = /obj/item/trash/waffles
- filling_color = "#FF00F7"
- bitesize = 4
- list_reagents = list("nutriment" = 8, "psilocybin" = 2, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/stew
- name = "Stew"
- desc = "A nice and warm stew. Healthy and strong."
- icon_state = "stew"
- filling_color = "#9E673A"
- bitesize = 7
- list_reagents = list("nutriment" = 10, "oculine" = 5, "tomatojuice" = 5, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/jelliedtoast
- name = "Jellied Toast"
- desc = "A slice of bread covered with delicious jam."
- icon_state = "jellytoast"
- trash = /obj/item/trash/plate
- filling_color = "#B572AB"
- bitesize = 3
-
-/obj/item/reagent_containers/food/snacks/jelliedtoast/cherry
- list_reagents = list("nutriment" = 1, "cherryjelly" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/jelliedtoast/slime
- list_reagents = list("nutriment" = 1, "slimejelly" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/jellyburger
- name = "Jelly Burger"
- desc = "Culinary delight..?"
- icon_state = "jellyburger"
- filling_color = "#B572AB"
- bitesize = 3
-
-/obj/item/reagent_containers/food/snacks/jellyburger/slime
- list_reagents = list("nutriment" = 6, "slimejelly" = 5, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/jellyburger/cherry
- list_reagents = list("nutriment" = 6, "cherryjelly" = 5, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/milosoup
- name = "Milosoup"
- desc = "The universe's best soup! Yum!!!"
- icon_state = "milosoup"
- trash = /obj/item/trash/snack_bowl
- bitesize = 5
- list_reagents = list("nutriment" = 7, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/stewedsoymeat
- name = "Stewed Soy Meat"
- desc = "Even non-vegetarians will LOVE this!"
- icon_state = "stewedsoymeat"
- trash = /obj/item/trash/plate
- list_reagents = list("nutriment" = 8)
-
-/obj/item/reagent_containers/food/snacks/boiledspaghetti
- name = "Boiled Spaghetti"
- desc = "A plain dish of noodles, this sucks."
- icon_state = "spaghettiboiled"
- trash = /obj/item/trash/plate
- filling_color = "#FCEE81"
- list_reagents = list("nutriment" = 2, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/boiledrice
- name = "Boiled Rice"
- desc = "A boring dish of boring rice."
- icon_state = "boiledrice"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#FFFBDB"
- list_reagents = list("nutriment" = 5, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/ricepudding
- name = "Rice Pudding"
- desc = "Where's the Jam!"
- icon_state = "rpudding"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#FFFBDB"
- list_reagents = list("nutriment" = 7, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/pastatomato
- name = "spaghetti"
- desc = "Spaghetti and crushed tomatoes. Just like your abusive father used to make!"
- icon_state = "pastatomato"
- trash = /obj/item/trash/plate
- filling_color = "#DE4545"
- bitesize = 4
- list_reagents = list("nutriment" = 6, "tomatojuice" = 10, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/meatballspaghetti
- name = "spaghetti & Meatballs"
- desc = "Now thats a nic'e meatball!"
- icon_state = "meatballspaghetti"
- trash = /obj/item/trash/plate
- filling_color = "#DE4545"
- list_reagents = list("nutriment" = 8, "synaptizine" = 5, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/spesslaw
- name = "Spesslaw"
- desc = "A lawyer's favourite."
- icon_state = "spesslaw"
- filling_color = "#DE4545"
- list_reagents = list("nutriment" = 8, "synaptizine" = 10, "vitamin" = 6)
-
-/obj/item/reagent_containers/food/snacks/poppypretzel
- name = "Poppy Pretzel"
- desc = "A large soft pretzel full of POP!"
- icon_state = "poppypretzel"
- filling_color = "#AB7D2E"
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/carrotfries
- name = "Carrot Fries"
- desc = "Tasty fries from fresh carrots."
- icon_state = "carrotfries"
- trash = /obj/item/trash/plate
- filling_color = "#FAA005"
- list_reagents = list("plantmatter" = 3, "oculine" = 3, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/superbiteburger
- name = "Super Bite Burger"
- desc = "This is a mountain of a burger. FOOD!"
- icon_state = "superbiteburger"
- filling_color = "#CCA26A"
- bitesize = 7
- list_reagents = list("nutriment" = 40, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/candiedapple
- name = "Candied Apple"
- desc = "An apple coated in sugary sweetness."
- icon_state = "candiedapple"
- filling_color = "#F21873"
- bitesize = 3
- list_reagents = list("nutriment" = 3, "sugar" = 2)
-
-/obj/item/reagent_containers/food/snacks/applepie
- name = "Apple Pie"
- desc = "A pie containing sweet sweet love... or apple."
- icon_state = "applepie"
- filling_color = "#E0EDC5"
- bitesize = 3
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/cherrypie
- name = "Cherry Pie"
- desc = "Taste so good, make a grown man cry."
- icon_state = "cherrypie"
- filling_color = "#FF525A"
- bitesize = 3
- list_reagents = list("nutriment" = 10, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/twobread
- name = "Two Bread"
- desc = "It is very bitter and winy."
- icon_state = "twobread"
- filling_color = "#DBCC9A"
- bitesize = 3
- list_reagents = list("nutriment" = 2, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/jellysandwich
- name = "Jelly Sandwich"
- desc = "You wish you had some peanut butter to go with this..."
- icon_state = "jellysandwich"
- trash = /obj/item/trash/plate
- filling_color = "#9E3A78"
- bitesize = 3
-
-/obj/item/reagent_containers/food/snacks/jellysandwich/slime
- list_reagents = list("nutriment" = 2, "slimejelly" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/jellysandwich/cherry
- list_reagents = list("nutriment" = 2, "cherryjelly" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/boiledslimecore
- name = "Boiled Slime Core"
- desc = "A boiled red thing."
- icon_state = "boiledrorocore"
- bitesize = 3
- list_reagents = list("slimejelly" = 5)
-
-/obj/item/reagent_containers/food/snacks/mint
- name = "mint"
- desc = "it is only wafer thin."
- icon_state = "mint"
- bitesize = 1
- filling_color = "#F2F2F2"
- list_reagents = list("minttoxin" = 1)
-
-/obj/item/reagent_containers/food/snacks/mushroomsoup
- name = "chantrelle soup"
- desc = "A delicious and hearty mushroom soup."
- icon_state = "mushroomsoup"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#E386BF"
- bitesize = 5
- list_reagents = list("nutriment" = 8, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit
- name = "plump helmet biscuit"
- desc = "This is a finely-prepared plump helmet biscuit. The ingredients are exceptionally minced plump helmet, and well-minced dwarven wheat flour."
- icon_state = "phelmbiscuit"
- filling_color = "#CFB4C4"
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/plumphelmetbiscuit/New()
- ..()
- if(prob(10))
- name = "exceptional plump helmet biscuit"
- desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!" // Is this a reference?
- reagents.add_reagent("omnizine", 5)
-
-/obj/item/reagent_containers/food/snacks/chawanmushi
- name = "chawanmushi"
- desc = "A legendary egg custard that makes friends out of enemies. Probably too hot for a cat to eat."
- icon_state = "chawanmushi"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#F0F2E4"
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/beetsoup
- name = "beet soup"
- desc = "Wait, how do you spell it again..?"
- icon_state = "beetsoup"
- trash = /obj/item/trash/snack_bowl
- bitesize = 5
- filling_color = "#FAC9FF"
- list_reagents = list("nutriment" = 7, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/beetsoup/New()
- ..()
- name = pick("borsch","bortsch","borstch","borsh","borshch","borscht")
-
-/obj/item/reagent_containers/food/snacks/herbsalad
- name = "herb salad"
- desc = "A tasty salad with apples on top."
- icon_state = "herbsalad"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#76B87F"
- bitesize = 3
- list_reagents = list("nutriment" = 8, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/validsalad
- name = "valid salad"
- desc = "It's just an herb salad with meatballs and fried potato slices. Nothing suspicious about it."
- icon_state = "validsalad"
- trash = /obj/item/trash/snack_bowl
- filling_color = "#76B87F"
- bitesize = 3
- list_reagents = list("nutriment" = 8, "salglu_solution" = 5, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/appletart
- name = "golden apple streusel tart"
- desc = "A tasty dessert that won't make it through a metal detector."
- icon_state = "gappletart"
- trash = /obj/item/trash/plate
- filling_color = "#FFFF00"
- bitesize = 3
- list_reagents = list("nutriment" = 8, "gold" = 5, "vitamin" = 4)
-
-/////////////////////////////////////////////////Sliceable////////////////////////////////////////
-// All the food items that can be sliced into smaller bits like Meatbread and Cheesewheels
-
-// sliceable is just an organization type path, it doesn't have any additional code or variables tied to it.
-
-/obj/item/reagent_containers/food/snacks/sliceable/meatbread
- name = "meatbread loaf"
- desc = "The culinary base of every self-respecting eloquen/tg/entleman."
- icon_state = "meatbread"
- slice_path = /obj/item/reagent_containers/food/snacks/meatbreadslice
- slices_num = 5
- filling_color = "#FF7575"
- list_reagents = list("protein" = 20, "nutriment" = 10, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/meatbreadslice
- name = "meatbread slice"
- desc = "A slice of delicious meatbread."
- icon_state = "meatbreadslice"
- trash = /obj/item/trash/plate
- filling_color = "#FF7575"
-
-/obj/item/reagent_containers/food/snacks/sliceable/xenomeatbread
- name = "xenomeatbread loaf"
- desc = "The culinary base of every self-respecting eloquent gentleman. Extra Heretical."
- icon_state = "xenomeatbread"
- slice_path = /obj/item/reagent_containers/food/snacks/xenomeatbreadslice
- slices_num = 5
- filling_color = "#8AFF75"
- list_reagents = list("protein" = 20, "nutriment" = 10, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/xenomeatbreadslice
- name = "xenomeatbread slice"
- desc = "A slice of delicious meatbread. Extra Heretical."
- icon_state = "xenobreadslice"
- trash = /obj/item/trash/plate
- filling_color = "#8AFF75"
-
-/obj/item/reagent_containers/food/snacks/sliceable/spidermeatbread
- name = "spider meat loaf"
- desc = "Reassuringly green meatloaf made from spider meat."
- icon_state = "spidermeatbread"
- slice_path = /obj/item/reagent_containers/food/snacks/spidermeatbreadslice
- slices_num = 5
- list_reagents = list("protein" = 20, "nutriment" = 10, "toxin" = 15, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/spidermeatbreadslice
- name = "spider meat bread slice"
- desc = "A slice of meatloaf made from an animal that most likely still wants you dead."
- icon_state = "xenobreadslice"
- trash = /obj/item/trash/plate
- list_reagents = list("toxin" = 2)
-
-/obj/item/reagent_containers/food/snacks/sliceable/bananabread
- name = "Banana-nut bread"
- desc = "A heavenly and filling treat."
- icon_state = "bananabread"
- slice_path = /obj/item/reagent_containers/food/snacks/bananabreadslice
- slices_num = 5
- filling_color = "#EDE5AD"
- list_reagents = list("banana" = 20, "nutriment" = 20)
-
-/obj/item/reagent_containers/food/snacks/bananabreadslice
- name = "Banana-nut bread slice"
- desc = "A slice of delicious banana bread."
- icon_state = "bananabreadslice"
- trash = /obj/item/trash/plate
- filling_color = "#EDE5AD"
-
-/obj/item/reagent_containers/food/snacks/sliceable/tofubread
- name = "Tofubread"
- icon_state = "Like meatbread but for vegetarians. Not guaranteed to give superpowers."
- icon_state = "tofubread"
- slice_path = /obj/item/reagent_containers/food/snacks/tofubreadslice
- slices_num = 5
- filling_color = "#F7FFE0"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/tofubreadslice
- name = "Tofubread slice"
- desc = "A slice of delicious tofubread."
- icon_state = "tofubreadslice"
- trash = /obj/item/trash/plate
- filling_color = "#F7FFE0"
-
-/obj/item/reagent_containers/food/snacks/sliceable/carrotcake
- name = "Carrot Cake"
- desc = "A favorite desert of a certain wascally wabbit. Not a lie."
- icon_state = "carrotcake"
- slice_path = /obj/item/reagent_containers/food/snacks/carrotcakeslice
- slices_num = 5
- bitesize = 3
- filling_color = "#FFD675"
- list_reagents = list("nutriment" = 20, "oculine" = 10, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/carrotcakeslice
- name = "Carrot Cake slice"
- desc = "Carrotty slice of Carrot Cake, carrots are good for your eyes! Also not a lie."
- icon_state = "carrotcake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#FFD675"
-
-/obj/item/reagent_containers/food/snacks/sliceable/braincake
- name = "Brain Cake"
- desc = "A squishy cake-thing."
- icon_state = "braincake"
- slice_path = /obj/item/reagent_containers/food/snacks/braincakeslice
- slices_num = 5
- filling_color = "#E6AEDB"
- bitesize = 3
- list_reagents = list("protein" = 10, "nutriment" = 10, "mannitol" = 10, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/braincakeslice
- name = "Brain Cake slice"
- desc = "Lemme tell you something about prions. THEY'RE DELICIOUS."
- icon_state = "braincakeslice"
- trash = /obj/item/trash/plate
- filling_color = "#E6AEDB"
-
-/obj/item/reagent_containers/food/snacks/sliceable/cheesecake
- name = "Cheese Cake"
- desc = "DANGEROUSLY cheesy."
- icon_state = "cheesecake"
- slice_path = /obj/item/reagent_containers/food/snacks/cheesecakeslice
- slices_num = 5
- filling_color = "#FAF7AF"
- bitesize = 3
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/cheesecakeslice
- name = "Cheese Cake slice"
- desc = "Slice of pure cheestisfaction."
- icon_state = "cheesecake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#FAF7AF"
-
-/obj/item/reagent_containers/food/snacks/sliceable/plaincake
- name = "Vanilla Cake"
- desc = "A plain cake, not a lie."
- icon_state = "plaincake"
- slice_path = /obj/item/reagent_containers/food/snacks/plaincakeslice
- slices_num = 5
- bitesize = 3
- filling_color = "#F7EDD5"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/plaincakeslice
- name = "Vanilla Cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "plaincake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#F7EDD5"
-
-/obj/item/reagent_containers/food/snacks/sliceable/orangecake
- name = "Orange Cake"
- desc = "A cake with added orange."
- icon_state = "orangecake"
- slice_path = /obj/item/reagent_containers/food/snacks/orangecakeslice
- slices_num = 5
- bitesize = 3
- filling_color = "#FADA8E"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/orangecakeslice
- name = "Orange Cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "orangecake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#FADA8E"
-
-/obj/item/reagent_containers/food/snacks/sliceable/limecake
- name = "Lime Cake"
- desc = "A cake with added lime."
- icon_state = "limecake"
- bitesize = 3
- slice_path = /obj/item/reagent_containers/food/snacks/limecakeslice
- slices_num = 5
- filling_color = "#CBFA8E"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/limecakeslice
- name = "Lime Cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "limecake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#CBFA8E"
-
-/obj/item/reagent_containers/food/snacks/sliceable/lemoncake
- name = "Lemon Cake"
- desc = "A cake with added lemon."
- icon_state = "lemoncake"
- slice_path = /obj/item/reagent_containers/food/snacks/lemoncakeslice
- slices_num = 5
- bitesize = 3
- filling_color = "#FAFA8E"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/lemoncakeslice
- name = "Lemon Cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "lemoncake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#FAFA8E"
-
-/obj/item/reagent_containers/food/snacks/sliceable/chocolatecake
- name = "Chocolate Cake"
- desc = "A cake with added chocolate."
- icon_state = "chocolatecake"
- slice_path = /obj/item/reagent_containers/food/snacks/chocolatecakeslice
- slices_num = 5
- bitesize = 3
- filling_color = "#805930"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/chocolatecakeslice
- name = "Chocolate Cake slice"
- desc = "Just a slice of cake, it is enough for everyone."
- icon_state = "chocolatecake_slice"
- trash = /obj/item/trash/plate
- filling_color = "#805930"
-
-/obj/item/reagent_containers/food/snacks/sliceable/cheesewheel
- name = "Cheese wheel"
- desc = "A big wheel of delicious Cheddar."
- icon_state = "cheesewheel"
- slice_path = /obj/item/reagent_containers/food/snacks/cheesewedge
- slices_num = 5
- filling_color = "#FFF700"
- list_reagents = list("nutriment" = 15, "vitamin" = 5, "cheese" = 20)
-
-/obj/item/reagent_containers/food/snacks/cheesewedge
- name = "Cheese wedge"
- desc = "A wedge of delicious Cheddar. The cheese wheel it was cut from can't have gone far."
- icon_state = "cheesewedge"
- filling_color = "#FFF700"
-
-/obj/item/reagent_containers/food/snacks/weirdcheesewedge
- name = "Weird Cheese"
- desc = "Some kind of... gooey, messy, gloopy thing. Similar to cheese, but only in the looser sense of the word."
- icon_state = "weirdcheesewedge"
- filling_color = "#00FF33"
- list_reagents = list("mercury" = 5, "lsd" = 5, "ethanol" = 5, "weird_cheese" = 5)
-
-/obj/item/reagent_containers/food/snacks/sliceable/birthdaycake
- name = "Birthday Cake"
- desc = "Happy Birthday..."
- icon_state = "birthdaycake"
- slice_path = /obj/item/reagent_containers/food/snacks/birthdaycakeslice
- slices_num = 5
- filling_color = "#FFD6D6"
- bitesize = 3
- list_reagents = list("nutriment" = 20, "sprinkles" = 10, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/birthdaycakeslice
- name = "Birthday Cake slice"
- desc = "A slice of your birthday"
- icon_state = "birthdaycakeslice"
- trash = /obj/item/trash/plate
- filling_color = "#FFD6D6"
-
-/obj/item/reagent_containers/food/snacks/sliceable/bread
- name = "Bread"
- icon_state = "Some plain old Earthen bread."
- icon_state = "bread"
- slice_path = /obj/item/reagent_containers/food/snacks/breadslice
- slices_num = 6
- filling_color = "#FFE396"
- list_reagents = list("nutriment" = 10)
-
-/obj/item/reagent_containers/food/snacks/breadslice
- name = "Bread slice"
- desc = "A slice of home."
- icon_state = "breadslice"
- trash = /obj/item/trash/plate
- filling_color = "#D27332"
- list_reagents = list("nutriment" = 2, "bread" = 5)
-
-/obj/item/reagent_containers/food/snacks/sliceable/creamcheesebread
- name = "Cream Cheese Bread"
- desc = "Yum yum yum!"
- icon_state = "creamcheesebread"
- slice_path = /obj/item/reagent_containers/food/snacks/creamcheesebreadslice
- slices_num = 5
- filling_color = "#FFF896"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/creamcheesebreadslice
- name = "Cream Cheese Bread slice"
- desc = "A slice of yum!"
- icon_state = "creamcheesebreadslice"
- trash = /obj/item/trash/plate
- filling_color = "#FFF896"
- list_reagents = list("nutriment" = 4, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/watermelonslice
- name = "Watermelon Slice"
- desc = "A slice of watery goodness."
- icon_state = "watermelonslice"
- filling_color = "#FF3867"
-
-/obj/item/reagent_containers/food/snacks/pineappleslice
- name = "Pineapple Slices"
- desc = "Rings of pineapple."
- icon_state = "pineappleslice"
- filling_color = "#e5b437"
-
-/obj/item/reagent_containers/food/snacks/sliceable/applecake
- name = "Apple Cake"
- desc = "A cake centered with Apple."
- icon_state = "applecake"
- slice_path = /obj/item/reagent_containers/food/snacks/applecakeslice
- slices_num = 5
- bitesize = 3
- filling_color = "#EBF5B8"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/applecakeslice
- name = "Apple Cake slice"
- desc = "A slice of heavenly cake."
- icon_state = "applecakeslice"
- trash = /obj/item/trash/plate
- filling_color = "#EBF5B8"
-
-/obj/item/reagent_containers/food/snacks/sliceable/pumpkinpie
- name = "Pumpkin Pie"
- desc = "A delicious treat for the autumn months."
- icon_state = "pumpkinpie"
- slice_path = /obj/item/reagent_containers/food/snacks/pumpkinpieslice
- slices_num = 5
- bitesize = 3
- filling_color = "#F5B951"
- list_reagents = list("nutriment" = 20, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/pumpkinpieslice
- name = "Pumpkin Pie slice"
- desc = "A slice of pumpkin pie, with whipped cream on top. Perfection."
- icon_state = "pumpkinpieslice"
- trash = /obj/item/trash/plate
- filling_color = "#F5B951"
-
-/obj/item/reagent_containers/food/snacks/cracker
- name = "Cracker"
- desc = "It's a salted cracker."
- icon_state = "cracker"
- bitesize = 1
- filling_color = "#F5DEB8"
- list_reagents = list("nutriment" = 1)
-
-/obj/item/reagent_containers/food/snacks/rawcutlet
- name = "raw cutlet"
- desc = "A thin piece of raw meat."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "rawcutlet"
- bitesize = 1
- list_reagents = list("protein" = 1)
-
-/obj/item/reagent_containers/food/snacks/rawcutlet/attackby(obj/item/W, mob/user, params)
- if(istype(W,/obj/item/kitchen/knife))
- user.visible_message( \
- "[user] cuts the raw cutlet with the knife!", \
- "You cut the raw cutlet with your knife!" \
- )
- new /obj/item/reagent_containers/food/snacks/raw_bacon(loc)
- qdel(src)
-
-
-/////////////////////////////////////////////////PIZZA////////////////////////////////////////
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza
- slices_num = 6
- filling_color = "#BAA14C"
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita
- name = "Margherita"
- desc = "The golden standard of pizzas."
- icon_state = "pizzamargherita"
- slice_path = /obj/item/reagent_containers/food/snacks/margheritaslice
- slices_num = 6
- list_reagents = list("nutriment" = 30, "tomatojuice" = 6, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/margheritaslice
- name = "Margherita slice"
- desc = "A slice of the classic pizza."
- icon_state = "pizzamargheritaslice"
- filling_color = "#BAA14C"
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza
- name = "Meatpizza"
- desc = "A pizza with meat topping."
- icon_state = "meatpizza"
- slice_path = /obj/item/reagent_containers/food/snacks/meatpizzaslice
- slices_num = 6
- list_reagents = list("protein" = 30, "tomatojuice" = 6, "vitamin" = 8)
-
-/obj/item/reagent_containers/food/snacks/meatpizzaslice
- name = "Meatpizza slice"
- desc = "A slice of a meaty pizza."
- icon_state = "meatpizzaslice"
- filling_color = "#BAA14C"
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza
- name = "Mushroompizza"
- desc = "Very special pizza."
- icon_state = "mushroompizza"
- slice_path = /obj/item/reagent_containers/food/snacks/mushroompizzaslice
- slices_num = 6
- list_reagents = list("plantmatter" = 30, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/mushroompizzaslice
- name = "Mushroompizza slice"
- desc = "Maybe it is the last slice of pizza in your life."
- icon_state = "mushroompizzaslice"
- filling_color = "#BAA14C"
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza
- name = "Vegetable pizza"
- desc = "No one of Tomato Sapiens were harmed during making this pizza."
- icon_state = "vegetablepizza"
- slice_path = /obj/item/reagent_containers/food/snacks/vegetablepizzaslice
- slices_num = 6
- list_reagents = list("plantmatter" = 25, "tomatojuice" = 6, "oculine" = 12, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/vegetablepizzaslice
- name = "Vegetable pizza slice"
- desc = "A slice of the most green pizza of all pizzas not containing green ingredients."
- icon_state = "vegetablepizzaslice"
- filling_color = "#BAA14C"
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza
- name = "Hawaiian Pizza"
- desc = "Love it or hate it, this pizza divides opinions. Complete with juicy pineapple."
- icon_state = "hawaiianpizza" //NEEDED
- slice_path = /obj/item/reagent_containers/food/snacks/hawaiianpizzaslice
- slices_num = 6
- list_reagents = list("protein" = 15, "tomatojuice" = 6, "plantmatter" = 20, "pineapplejuice" = 6, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/hawaiianpizzaslice
- name = "Hawaiian pizza slice"
- desc = "A slice of polarising pizza."
- icon_state = "hawaiianpizzaslice"
- filling_color = "#e5b437"
-
-/obj/item/reagent_containers/food/snacks/sliceable/pizza/macpizza
- name = "Macaroni cheese pizza"
- desc = "Gastronomists have yet to classify this dish as 'pizza'."
- icon_state = "macpizza"
- slice_path = /obj/item/reagent_containers/food/snacks/macpizzaslice
- list_reagents = list("nutriment" = 40, "vitamin" = 5) //More nutriment because carbs, but it's not any more vitaminicious
- filling_color = "#ffe45d"
-
-/obj/item/reagent_containers/food/snacks/macpizzaslice
- name = "Macaroni cheese pizza slice"
- desc = "A delicious slice of pizza topped with macaroni cheese... wait, what the hell? Who would do this?!"
- icon_state = "macpizzaslice"
- filling_color = "#ffe45d"
-
-/obj/item/pizzabox
- name = "pizza box"
- desc = "A box suited for pizzas."
- icon = 'icons/obj/food/food.dmi'
- icon_state = "pizzabox1"
-
- var/open = 0 // Is the box open?
- var/ismessy = 0 // Fancy mess on the lid
- var/obj/item/reagent_containers/food/snacks/sliceable/pizza/pizza // Content pizza
- var/list/boxes = list() // If the boxes are stacked, they come here
- var/boxtag = ""
-
-/obj/item/pizzabox/update_icon()
-
- overlays = list()
-
- // Set appropriate description
- if( open && pizza )
- desc = "A box suited for pizzas. It appears to have a [pizza.name] inside."
- else if( boxes.len > 0 )
- desc = "A pile of boxes suited for pizzas. There appears to be [boxes.len + 1] boxes in the pile."
-
- var/obj/item/pizzabox/topbox = boxes[boxes.len]
- var/toptag = topbox.boxtag
- if( toptag != "" )
- desc = "[desc] The box on top has a tag, it reads: '[toptag]'."
- else
- desc = "A box suited for pizzas."
-
- if( boxtag != "" )
- desc = "[desc] The box has a tag, it reads: '[boxtag]'."
-
- // Icon states and overlays
- if( open )
- if( ismessy )
- icon_state = "pizzabox_messy"
- else
- icon_state = "pizzabox_open"
-
- if( pizza )
- var/image/pizzaimg = image("food/food.dmi", icon_state = pizza.icon_state)
- pizzaimg.pixel_y = -3
- overlays += pizzaimg
-
- return
- else
- // Stupid code because byondcode sucks
- var/doimgtag = 0
- if( boxes.len > 0 )
- var/obj/item/pizzabox/topbox = boxes[boxes.len]
- if( topbox.boxtag != "" )
- doimgtag = 1
- else
- if( boxtag != "" )
- doimgtag = 1
-
- if( doimgtag )
- var/image/tagimg = image("food/food.dmi", icon_state = "pizzabox_tag")
- tagimg.pixel_y = boxes.len * 3
- overlays += tagimg
-
- icon_state = "pizzabox[boxes.len+1]"
-
-/obj/item/pizzabox/attack_hand(mob/user)
- if(open && pizza)
- user.put_in_hands(pizza)
- to_chat(user, "You take the [pizza] out of the [src].")
- pizza = null
- update_icon()
- return
-
- if(boxes.len > 0)
- if(user.is_in_inactive_hand(src))
- ..()
- return
-
- var/obj/item/pizzabox/box = boxes[boxes.len]
- boxes -= box
-
- user.put_in_hands( box )
- to_chat(user, "You remove the topmost [src] from your hand.")
- box.update_icon()
- update_icon()
- return
- ..()
-
-/obj/item/pizzabox/attack_self(mob/user)
- if(boxes.len > 0)
- return
-
- open = !open
-
- if( open && pizza )
- ismessy = 1
-
- update_icon()
-
-/obj/item/pizzabox/attackby( obj/item/I, mob/user, params)
- if(istype(I, /obj/item/pizzabox/))
- var/obj/item/pizzabox/box = I
-
- if(!box.open && !open)
- // Make a list of all boxes to be added
- var/list/boxestoadd = list()
- boxestoadd += box
- for(var/obj/item/pizzabox/i in box.boxes)
- boxestoadd += i
-
- if( (boxes.len+1) + boxestoadd.len <= 5 )
- user.drop_item()
-
- box.loc = src
- box.boxes = list() // Clear the box boxes so we don't have boxes inside boxes. - Xzibit
- boxes.Add( boxestoadd )
-
- box.update_icon()
- update_icon()
-
- to_chat(user, "You put the [box] ontop of the [src]!")
- else
- to_chat(user, "The stack is too high!")
- else
- to_chat(user, "Close the [box] first!")
-
- return
-
- if(istype(I, /obj/item/reagent_containers/food/snacks/sliceable/pizza/)) // Long ass fucking object name
-
- if(open)
- user.drop_item()
- I.loc = src
- pizza = I
-
- update_icon()
-
- to_chat(user, "You put the [I] in the [src]!")
- else
- to_chat(user, "You try to push the [I] through the lid but it doesn't work!")
- return
-
- if(istype(I, /obj/item/pen/))
-
- if(open)
- return
-
- var/t = input("Enter what you want to add to the tag:", "Write", null, null) as text
-
- var/obj/item/pizzabox/boxtotagto = src
- if( boxes.len > 0 )
- boxtotagto = boxes[boxes.len]
-
- boxtotagto.boxtag = copytext("[boxtotagto.boxtag][t]", 1, 30)
-
- update_icon()
- return
- ..()
-
-/obj/item/pizzabox/margherita/New()
- pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/margherita(src)
- boxtag = "Margherita Deluxe"
-
-/obj/item/pizzabox/vegetable/New()
- pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/vegetablepizza(src)
- boxtag = "Gourmet Vegatable"
-
-/obj/item/pizzabox/mushroom/New()
- pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/mushroompizza(src)
- boxtag = "Mushroom Special"
-
-/obj/item/pizzabox/meat/New()
- pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/meatpizza(src)
- boxtag = "Meatlover's Supreme"
-
-/obj/item/pizzabox/hawaiian/New()
- pizza = new /obj/item/reagent_containers/food/snacks/sliceable/pizza/hawaiianpizza(src)
- boxtag = "Hawaiian Feast"
-
-////////////////////////////////FOOD ADDITIONS////////////////////////////////////////////
-
-/obj/item/reagent_containers/food/snacks/wrap
- name = "egg wrap"
- desc = "The precursor to Pigs in a Blanket."
- icon_state = "wrap"
- list_reagents = list("nutriment" = 5)
-
-/obj/item/reagent_containers/food/snacks/beans
- name = "tin of beans"
- desc = "Musical fruit in a slightly less musical container."
- icon_state = "beans"
- list_reagents = list("nutriment" = 10, "beans" = 10, "vitamin" = 3)
-
-/obj/item/reagent_containers/food/snacks/benedict
- name = "eggs benedict"
- desc = "There is only one egg on this, how rude."
- icon_state = "benedict"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "egg" = 3, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/hotdog
- name = "hotdog"
- desc = "Fresh footlong ready to go down on."
- icon_state = "hotdog"
- bitesize = 3
- list_reagents = list("nutriment" = 6, "ketchup" = 3, "vitamin" = 3)
-
-/obj/item/reagent_containers/food/snacks/meatbun
- name = "meat bun"
- desc = "Has the potential to not be Dog."
- icon_state = "meatbun"
- bitesize = 6
- list_reagents = list("nutriment" = 6, "vitamin" = 2)
-
-/obj/item/reagent_containers/food/snacks/icecreamsandwich
- name = "icecream sandwich"
- desc = "Portable Ice-cream in it's own packaging."
- icon_state = "icecreamsandwich"
- list_reagents = list("nutriment" = 2, "ice" = 2)
-
-/obj/item/reagent_containers/food/snacks/notasandwich
- name = "not-a-sandwich"
- desc = "Something seems to be wrong with this, you can't quite figure what. Maybe it's his moustache."
- icon_state = "notasandwich"
- list_reagents = list("nutriment" = 6, "vitamin" = 6)
-
-/obj/item/reagent_containers/food/snacks/sugarcookie
- name = "sugar cookie"
- desc = "Just like your little sister used to make."
- icon_state = "sugarcookie"
- list_reagents = list("nutriment" = 3, "sugar" = 3)
-
-/obj/item/reagent_containers/food/snacks/friedbanana
- name = "Fried Banana"
- desc = "Goreng Pisang, also known as fried bananas."
- icon_state = "friedbanana"
- list_reagents = list("sugar" = 5, "nutriment" = 8, "cornoil" = 4)
-
-/obj/item/reagent_containers/food/snacks/dionaroast
- name = "roast diona"
- desc = "It's like an enormous, leathery carrot. With an eye."
- icon_state = "dionaroast"
- trash = /obj/item/trash/plate
- filling_color = "#75754B"
- list_reagents = list("plantmatter" = 4, "nutriment" = 2, "radium" = 2, "vitamin" = 4)
-
-/obj/item/reagent_containers/food/snacks/boiledspiderleg
- name = "boiled spider leg"
- desc = "A giant spider's leg that's still twitching after being cooked. Gross!"
- icon_state = "spiderlegcooked"
- trash = /obj/item/trash/plate
- bitesize = 3
- list_reagents = list("nutriment" = 3, "capsaicin" = 2)
-
-/obj/item/reagent_containers/food/snacks/spidereggs
- name = "spider eggs"
- desc = "A cluster of juicy spider eggs. A great side dish for when you care not for your health."
- icon_state = "spidereggs"
- list_reagents = list("protein" = 2, "toxin" = 2)
-
-/obj/item/reagent_containers/food/snacks/spidereggsham
- name = "green eggs and ham"
- desc = "Would you eat them on a train? Would you eat them on a plane? Would you eat them on a state of the art corporate deathtrap floating through space?"
- icon_state = "spidereggsham"
- trash = /obj/item/trash/plate
- bitesize = 4
- list_reagents = list("nutriment" = 6)
-
-/obj/item/reagent_containers/food/snacks/sliceable/turkey
- name = "Turkey"
- desc = "A traditional turkey served with stuffing."
- icon_state = "turkey"
- slice_path = /obj/item/reagent_containers/food/snacks/turkeyslice
- slices_num = 6
- list_reagents = list("protein" = 24, "nutriment" = 18, "vitamin" = 5)
-
-/obj/item/reagent_containers/food/snacks/turkeyslice
- name = "turkey serving"
- desc = "A serving of some tender and delicious turkey."
- icon_state = "turkeyslice"
- trash = /obj/item/trash/plate
- filling_color = "#B97A57"
-
-/obj/item/reagent_containers/food/snacks/mashed_potatoes //mashed taters
- name = "mashed potatoes"
- desc = "Some sot creamy, and irresistible mashed potatoes."
- icon_state = "mashedtaters"
- trash = /obj/item/trash/plate
- filling_color = "#D6D9C1"
- list_reagents = list("nutriment" = 5, "gravy" = 5, "mashedpotatoes" = 10, "vitamin" = 2)
-
-////////////////////////////////ICE CREAM///////////////////////////////////
-/obj/item/reagent_containers/food/snacks/icecream
- name = "ice cream"
- desc = "Delicious ice cream."
- icon = 'icons/obj/kitchen.dmi'
- icon_state = "icecream_cone"
- bitesize = 3
- list_reagents = list("nutriment" = 1, "sugar" = 1)
-
-/obj/item/reagent_containers/food/snacks/icecream/New()
- ..()
- update_icon()
-
-/obj/item/reagent_containers/food/snacks/icecream/update_icon()
- overlays.Cut()
- var/image/filling = image('icons/obj/kitchen.dmi', src, "icecream_color")
- filling.icon += mix_color_from_reagents(reagents.reagent_list)
- overlays += filling
-
-/obj/item/reagent_containers/food/snacks/icecream/icecreamcone
- name = "ice cream cone"
- desc = "Delicious ice cream."
- icon_state = "icecream_cone"
- volume = 50
- bitesize = 3
- list_reagents = list("nutriment" = 3, "sugar" = 7, "ice" = 2)
-
-/obj/item/reagent_containers/food/snacks/icecream/icecreamcup
- name = "chocolate ice cream cone"
- desc = "Delicious ice cream."
- icon_state = "icecream_cup"
- volume = 50
- bitesize = 6
- list_reagents = list("nutriment" = 5, "chocolate" = 8, "ice" = 2)
+// MISC
/obj/item/reagent_containers/food/snacks/cereal
name = "box of cereal"
@@ -2441,131 +300,5 @@
icon_state = "deepfried_holder_icon"
list_reagents = list("nutriment" = 3)
-/obj/item/reagent_containers/food/snacks/dough
- name = "dough"
- desc = "A piece of dough."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "dough"
- list_reagents = list("nutriment" = 6)
-// Dough + rolling pin = flat dough
-/obj/item/reagent_containers/food/snacks/dough/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/kitchen/rollingpin))
- if(isturf(loc))
- new /obj/item/reagent_containers/food/snacks/sliceable/flatdough(loc)
- to_chat(user, "You flatten [src].")
- qdel(src)
- else
- to_chat(user, "You need to put [src] on a surface to roll it out!")
- else
- ..()
-
-// slicable into 3xdoughslices
-/obj/item/reagent_containers/food/snacks/sliceable/flatdough
- name = "flat dough"
- desc = "Some flattened dough."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "flat dough"
- slice_path = /obj/item/reagent_containers/food/snacks/doughslice
- slices_num = 3
- list_reagents = list("nutriment" = 6)
-
-/obj/item/reagent_containers/food/snacks/doughslice
- name = "dough slice"
- desc = "The building block of an impressive dish."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "doughslice"
- list_reagents = list("nutriment" = 1)
-
-/obj/item/reagent_containers/food/snacks/bun
- name = "bun"
- desc = "The base for any self-respecting burger."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "bun"
- list_reagents = list("nutriment" = 1)
-
-/obj/item/reagent_containers/food/snacks/taco
- name = "taco"
- desc = "Take a bite!"
- icon_state = "taco"
- bitesize = 3
- list_reagents = list("nutriment" = 7, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/cutlet
- name = "cutlet"
- desc = "A tasty meat slice."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "cutlet"
- list_reagents = list("protein" = 2)
-
-/obj/item/reagent_containers/food/snacks/flatbread
- name = "flatbread"
- desc = "Bland but filling."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "flatbread"
- list_reagents = list("nutriment" = 6, "vitamin" = 1)
-
-/obj/item/reagent_containers/food/snacks/rawsticks
- name = "raw potato sticks"
- desc = "Raw fries, not very tasty."
- icon = 'icons/obj/food/food_ingredients.dmi'
- icon_state = "rawsticks"
- list_reagents = list("plantmatter" = 3)
-
-/obj/item/reagent_containers/food/snacks/ectoplasm
- name = "ectoplasm"
- desc = "A luminescent blob of what scientists refer to as 'ghost goo'."
- icon = 'icons/obj/wizard.dmi'
- icon_state = "ectoplasm"
- list_reagents = list("ectoplasm" = 10)
-
-/obj/item/reagent_containers/food/snacks/liquidfood
- name = "\improper LiquidFood Ration"
- desc = "A prepackaged grey slurry of all the essential nutrients for a spacefarer on the go. Should this be crunchy?"
- icon_state = "liquidfood"
- trash = /obj/item/trash/liquidfood
- filling_color = "#A8A8A8"
- bitesize = 4
- list_reagents = list("nutriment" = 20, "iron" = 3, "vitamin" = 2)
-
-
-/obj/item/reagent_containers/food/snacks/tastybread
- name = "bread tube"
- desc = "Bread in a tube. Chewy...and surprisingly tasty."
- icon_state = "tastybread"
- trash = /obj/item/trash/tastybread
- filling_color = "#A66829"
- junkiness = 20
- list_reagents = list("nutriment" = 2, "sugar" = 4)
-
-/obj/item/reagent_containers/food/snacks/yakiimo
- name = "yaki imo"
- desc = "Made with roasted sweet potatoes!"
- icon_state = "yakiimo"
- trash = /obj/item/trash/plate
- list_reagents = list("nutriment" = 5, "vitamin" = 4)
- filling_color = "#8B1105"
-
-/obj/item/reagent_containers/food/snacks/roastparsnip
- name = "roast parsnip"
- desc = "Sweet and crunchy."
- icon_state = "roastparsnip"
- trash = /obj/item/trash/plate
- list_reagents = list("nutriment" = 3, "vitamin" = 4)
- filling_color = "#FF5500"
-
-/obj/item/reagent_containers/food/snacks/tatortot
- name = "tator tot"
- desc = "A large fried potato nugget that may or may not try to valid you."
- icon_state = "tatortot"
- list_reagents = list("nutriment" = 4)
- filling_color = "FFD700"
-
-/obj/item/reagent_containers/food/snacks/onionrings
- name = "onion rings"
- desc = "Onion slices coated in batter."
- icon_state = "onionrings"
- list_reagents = list("nutriment" = 3)
- filling_color = "#C0C9A0"
- gender = PLURAL
#undef MAX_WEIGHT_CLASS
\ No newline at end of file
diff --git a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
index a67b88f97d4..1e3c5602a22 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/gibber.dm
@@ -122,7 +122,7 @@
to_chat(user, "The [src] is locked and running, wait for it to finish.")
return
- if(!ishuman(victim) || issmall(victim))
+ if(!ishuman(victim))
to_chat(user, "This is not suitable for the [src]!")
return
@@ -255,8 +255,11 @@
if(occupant.reagents)
occupant.reagents.trans_to(new_meat, round(occupant.reagents.total_volume/slab_count,1))
- if(occupant.get_species() == "Human")
- new /obj/item/stack/sheet/animalhide/human(src)
+ if(ishuman(occupant))
+ var/mob/living/carbon/human/H = occupant
+ var/skinned = H.dna.species.skinned_type
+ if(skinned)
+ new skinned(src)
new /obj/effect/decal/cleanable/blood/gibs(src)
if(!UserOverride)
diff --git a/code/modules/hydroponics/beekeeping/beebox.dm b/code/modules/hydroponics/beekeeping/beebox.dm
index 950b873af55..7acd3efc961 100644
--- a/code/modules/hydroponics/beekeeping/beebox.dm
+++ b/code/modules/hydroponics/beekeeping/beebox.dm
@@ -23,7 +23,7 @@
return 1
/mob/living/carbon/human/bee_friendly()
- if(get_species() == "Diona") //bees pollinate plants, duh.
+ if(isdiona(src)) //bees pollinate plants, duh.
return 1
if((wear_suit && (wear_suit.flags & THICKMATERIAL)) && (head && (head.flags & THICKMATERIAL)))
return 1
diff --git a/code/modules/martial_arts/brawling.dm b/code/modules/martial_arts/brawling.dm
index a40a52b86be..b326e9f8b33 100644
--- a/code/modules/martial_arts/brawling.dm
+++ b/code/modules/martial_arts/brawling.dm
@@ -15,7 +15,7 @@
var/atk_verb = pick("left hook","right hook","straight punch")
- var/damage = rand(5, 8) + A.species.punchdamagelow
+ var/damage = rand(5, 8) + A.dna.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("[A] has attempted to hit [D] with a [atk_verb]!")
diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm
index f42b7963104..bff0cf0d2e4 100644
--- a/code/modules/martial_arts/martial.dm
+++ b/code/modules/martial_arts/martial.dm
@@ -33,8 +33,8 @@
/datum/martial_art/proc/basic_hit(var/mob/living/carbon/human/A,var/mob/living/carbon/human/D)
- var/damage = rand(A.species.punchdamagelow, A.species.punchdamagehigh)
- var/datum/unarmed_attack/attack = A.species.unarmed
+ var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh)
+ var/datum/unarmed_attack/attack = A.dna.species.unarmed
var/atk_verb = "[pick(attack.attack_verb)]"
if(D.lying)
@@ -62,7 +62,7 @@
add_attack_logs(A, D, "Melee attacked with martial-art [src]", (damage > 0) ? null : ATKLOG_ALL)
- if((D.stat != DEAD) && damage >= A.species.punchstunthreshold)
+ if((D.stat != DEAD) && damage >= A.dna.species.punchstunthreshold)
D.visible_message("[A] has weakened [D]!!", \
"[A] has weakened [D]!")
D.apply_effect(4, WEAKEN, armor_block)
diff --git a/code/modules/martial_arts/mimejutsu.dm b/code/modules/martial_arts/mimejutsu.dm
index 38605c3538d..e8aa7a53d03 100644
--- a/code/modules/martial_arts/mimejutsu.dm
+++ b/code/modules/martial_arts/mimejutsu.dm
@@ -23,7 +23,7 @@
/datum/martial_art/mimejutsu/proc/mimeChuck(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
if(!D.stat && !D.stunned && !D.weakened)
- var/damage = rand(5, 8) + A.species.punchdamagelow
+ var/damage = rand(5, 8) + A.dna.species.punchdamagelow
if(!damage)
playsound(D.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
D.visible_message("[A] swings invisible nunchcuks at [D]..and misses?")
diff --git a/code/modules/mining/lavaland/loot/ashdragon_loot.dm b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
index ff0db975895..d88ec709dce 100644
--- a/code/modules/mining/lavaland/loot/ashdragon_loot.dm
+++ b/code/modules/mining/lavaland/loot/ashdragon_loot.dm
@@ -116,7 +116,7 @@
switch(random)
if(1)
to_chat(user, "Your flesh begins to melt! Miraculously, you seem fine otherwise.")
- H.set_species("Skeleton")
+ H.set_species(/datum/species/skeleton)
if(2)
to_chat(user, "Power courses through you! You can now shift your form at will.")
if(user.mind)
diff --git a/code/modules/mining/lavaland/loot/colossus_loot.dm b/code/modules/mining/lavaland/loot/colossus_loot.dm
index ddf1255cca0..59d3a715f32 100644
--- a/code/modules/mining/lavaland/loot/colossus_loot.dm
+++ b/code/modules/mining/lavaland/loot/colossus_loot.dm
@@ -289,7 +289,7 @@
if(ishuman(i))
var/mob/living/carbon/human/H = i
if(H.stat == DEAD)
- H.set_species("Shadow")
+ H.set_species(/datum/species/shadow)
H.revive()
H.disabilities |= NOCLONE //Free revives, but significantly limits your options for reviving except via the crystal
H.grab_ghost(force = TRUE)
diff --git a/code/modules/mining/lavaland/loot/tendril_loot.dm b/code/modules/mining/lavaland/loot/tendril_loot.dm
index e1c6c7f28a9..a80c2ae6c18 100644
--- a/code/modules/mining/lavaland/loot/tendril_loot.dm
+++ b/code/modules/mining/lavaland/loot/tendril_loot.dm
@@ -105,13 +105,13 @@
to_chat(M, "This item is currently non-functional.")
/*if(ishuman(M) && M.stat != DEAD)
var/mob/living/carbon/human/H = M
- if(H.species.name != "Human" || reac_volume < 5) // implying xenohumans are holy
+ if(!ishumanbasic(H) || reac_volume < 5) // implying xenohumans are holy
if(method == INGEST && show_message)
to_chat(H, "You feel nothing but a terrible aftertaste.")
return ..()
to_chat(H, "A terrible pain travels down your back as wings burst out!")
- H.set_species("Angel")
+ H.set_species(/datum/species/angel)
playsound(H.loc, 'sound/items/poster_ripped.ogg', 50, 1, -1)
H.adjustBruteLoss(20)
H.emote("scream")
diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm
index 93bdfe30c27..1a6f29a6dd0 100644
--- a/code/modules/mob/language.dm
+++ b/code/modules/mob/language.dm
@@ -226,7 +226,14 @@
"SKRE","AHK","EHK","RAWK","KRA","AAA","EEE","KI","II","KRI","KA")
/datum/language/vox/get_random_name()
- return ..(FEMALE,1,6)
+ var/sounds = rand(2, 8)
+ var/i = 0
+ var/newname = ""
+
+ while(i <= sounds)
+ i++
+ newname += pick(vox_name_syllables)
+ return capitalize(newname)
/datum/language/diona
name = "Rootspeak"
@@ -240,8 +247,8 @@
syllables = list("hs","zt","kr","st","sh")
/datum/language/diona/get_random_name()
- var/new_name = "[pick(list("To Sleep Beneath","Wind Over","Embrace of","Dreams of","Witnessing","To Walk Beneath","Approaching the"))]"
- new_name += " [pick(list("the Void","the Sky","Encroaching Night","Planetsong","Starsong","the Wandering Star","the Empty Day","Daybreak","Nightfall","the Rain"))]"
+ var/new_name = "[pick(list("To Sleep Beneath", "Wind Over", "Embrace of", "Dreams of", "Witnessing", "To Walk Beneath", "Approaching the", "Glimmer of", "The Ripple of", "Colors of", "The Still of", "Silence of", "Gentle Breeze of", "Glistening Waters under", "Child of", "Blessed Plant-ling of", "Grass-Walker of", "Element of", "Spawn of"))]"
+ new_name += " [pick(list("the Void", "the Sky", "Encroaching Night", "Planetsong", "Starsong", "the Wandering Star", "the Empty Day", "Daybreak", "Nightfall", "the Rain", "the Stars", "the Waves", "Dusk", "Night", "the Wind", "the Summer Wind", "the Blazing Sun", "the Scorching Sun", "Eternal Fields", "the Soothing Plains", "the Undying Fiona", "Mother Nature's Bousum"))]"
return new_name
/datum/language/trinary
@@ -507,8 +514,10 @@
..(speaker,message,speaker.real_name)
/datum/language/abductor/check_special_condition(mob/living/carbon/human/other, mob/living/carbon/human/speaker)
- if(other.mind && other.mind.abductor)
- if(other.mind.abductor.team == speaker.mind.abductor.team)
+ if(isabductor(other) && isabductor(speaker))
+ var/datum/species/abductor/A = speaker.dna.species
+ var/datum/species/abductor/A2 = other.dna.species
+ if(A.team == A2.team)
return TRUE
return FALSE
@@ -553,7 +562,7 @@
if(!message)
return
-
+
log_say("(ROBOT) [message]", speaker)
var/message_start = "[name], [speaker.name]"
var/message_body = "[speaker.say_quote(message)],\"[message]\""
diff --git a/code/modules/mob/living/autohiss.dm b/code/modules/mob/living/autohiss.dm
index da19b6a35b2..df1bde34306 100644
--- a/code/modules/mob/living/autohiss.dm
+++ b/code/modules/mob/living/autohiss.dm
@@ -4,7 +4,7 @@
/mob/living/carbon/human/handle_autohiss(message, datum/language/L)
if(!client || client.prefs.autohiss_mode == AUTOHISS_OFF) // no need to process if there's no client or they have autohiss off
return message
- return species.handle_autohiss(message, L, client.prefs.autohiss_mode)
+ return dna.species.handle_autohiss(message, L, client.prefs.autohiss_mode)
/client/verb/toggle_autohiss()
set name = "Toggle Auto-Accent"
diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm
index 7b0e58ba5eb..9d50d8bf2ea 100644
--- a/code/modules/mob/living/carbon/brain/MMI.dm
+++ b/code/modules/mob/living/carbon/brain/MMI.dm
@@ -121,10 +121,10 @@
brainmob.dna = H.dna.Clone()
brainmob.container = src
- if(!istype(H.species) || isnull(H.species.return_organ("brain"))) // Diona/buggy people
+ if(!istype(H.dna.species) || isnull(H.dna.species.return_organ("brain"))) // Diona/buggy people
held_brain = new(src)
else // We have a species, and it has a brain
- var/brain_path = H.species.return_organ("brain")
+ var/brain_path = H.dna.species.return_organ("brain")
if(!ispath(brain_path, /obj/item/organ/internal/brain))
brain_path = /obj/item/organ/internal/brain
held_brain = new brain_path(src) // Slime people will keep their slimy brains this way
@@ -265,8 +265,6 @@
forceMove(holder)
holder.stored_mmi = src
holder.update_from_mmi()
- if(istype(src, /obj/item/mmi/posibrain))
- holder.robotize()
if(brainmob && brainmob.mind)
brainmob.mind.transfer_to(H)
holder.insert(H)
diff --git a/code/modules/mob/living/carbon/brain/brain.dm b/code/modules/mob/living/carbon/brain/brain.dm
index 82e062246b6..c64318d804b 100644
--- a/code/modules/mob/living/carbon/brain/brain.dm
+++ b/code/modules/mob/living/carbon/brain/brain.dm
@@ -84,12 +84,12 @@ I'm using this for Stat to give it a more nifty interface to work with
if(container)
var/obj/item/mmi/M = container
if(istype(M) && M.held_brain)
- return M.held_brain.dna.get_species_name()
+ return M.held_brain.dna.species.name
else
return "Artificial Life"
if(istype(loc, /obj/item/organ/internal/brain))
var/obj/item/organ/internal/brain/B = loc
- return B.dna.get_species_name()
+ return B.dna.species.name
/mob/living/carbon/brain/Stat()
..()
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/robotic_brain.dm
similarity index 61%
rename from code/modules/mob/living/carbon/brain/posibrain.dm
rename to code/modules/mob/living/carbon/brain/robotic_brain.dm
index 9ab4a153f4d..ea83ab90206 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/robotic_brain.dm
@@ -1,37 +1,41 @@
-/obj/item/mmi/posibrain
+/obj/item/mmi/robotic_brain
name = "robotic brain"
- desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
- icon = 'icons/obj/assemblies.dmi'
- icon_state = "posibrain"
+ desc = "An advanced circuit, capable of housing a non-sentient synthetic intelligence."
+ icon = 'icons/obj/module.dmi'
+ icon_state = "boris_blank"
+ var/blank_icon = "boris_blank"
+ var/searching_icon = "boris_recharging"
+ var/occupied_icon = "boris"
w_class = WEIGHT_CLASS_NORMAL
origin_tech = "biotech=3;programming=3;plasmatech=2"
- var/searching = 0
+ var/searching = FALSE
var/askDelay = 10 * 60 * 1
//var/mob/living/carbon/brain/brainmob = null
var/list/ghost_volunteers[0]
req_access = list(access_robotics)
mecha = null//This does not appear to be used outside of reference in mecha.dm.
- var/silenced = 0 //if set to 1, they can't talk.
+ var/silenced = FALSE //if TRUE, they can't talk.
var/next_ping_at = 0
var/requires_master = TRUE
var/mob/living/carbon/human/imprinted_master = null
+ var/ejected_flavor_text = "circuit"
-/obj/item/mmi/posibrain/Destroy()
+/obj/item/mmi/robotic_brain/Destroy()
imprinted_master = null
return ..()
-/obj/item/mmi/posibrain/attack_self(mob/user)
+/obj/item/mmi/robotic_brain/attack_self(mob/user)
if(requires_master && !imprinted_master)
to_chat(user, "You press your thumb on [src] and imprint your user information.")
imprinted_master = user
return
- if(brainmob && !brainmob.key && searching == 0)
+ if(brainmob && !brainmob.key && !searching)
//Start the process of searching for a new user.
to_chat(user, "You carefully locate the manual activation switch and start [src]'s boot process.")
- icon_state = "posibrain-searching"
+ icon_state = searching_icon
ghost_volunteers.Cut()
- searching = 1
+ searching = TRUE
request_player()
spawn(600)
if(ghost_volunteers.len)
@@ -47,38 +51,39 @@
if(brainmob && brainmob.key)
to_chat(brainmob, "Your internal speaker has been toggled [silenced ? "off" : "on"].")
-/obj/item/mmi/posibrain/proc/request_player()
+/obj/item/mmi/robotic_brain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
if(check_observer(O))
to_chat(O, "\A [src] has been activated. (Teleport | Sign Up)")
-/obj/item/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
+/obj/item/mmi/robotic_brain/proc/check_observer(mob/dead/observer/O)
if(cannotPossess(O))
- return 0
+ return FALSE
if(jobban_isbanned(O, "Cyborg") || jobban_isbanned(O,"nonhumandept"))
- return 0
+ return FALSE
if(!O.can_reenter_corpse)
- return 0
+ return FALSE
if(O.client)
- return 1
- return 0
+ return TRUE
+ return FALSE
-/obj/item/mmi/posibrain/proc/question(var/client/C)
+/obj/item/mmi/robotic_brain/proc/question(client/C)
spawn(0)
- if(!C) return
+ if(!C)
+ return
var/response = alert(C, "Someone is requesting a personality for a [src]. Would you like to play as one?", "[src] request", "Yes", "No", "Never for this round")
- if(!C || brainmob.key || 0 == searching) return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
+ if(!C || brainmob.key || !searching)
+ return //handle logouts that happen whilst the alert is waiting for a response, and responses issued after a brain has been located.
if(response == "Yes")
transfer_personality(C.mob)
else if(response == "Never for this round")
C.prefs.be_special -= ROLE_POSIBRAIN
// This should not ever happen, but let's be safe
-/obj/item/mmi/posibrain/dropbrain(var/turf/dropspot)
+/obj/item/mmi/robotic_brain/dropbrain(turf/dropspot)
log_runtime(EXCEPTION("[src] at [loc] attempted to drop brain without a contained brain."), src)
- return
-/obj/item/mmi/posibrain/transfer_identity(var/mob/living/carbon/H)
+/obj/item/mmi/robotic_brain/transfer_identity(mob/living/carbon/H)
name = "[src] ([H])"
if(isnull(brainmob.dna))
brainmob.dna = H.dna.Clone()
@@ -90,51 +95,48 @@
brainmob.mind.assigned_role = "Positronic Brain"
if(H.mind)
H.mind.transfer_to(brainmob)
- to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a metal cube.")
- become_occupied("posibrain-occupied")
+ to_chat(brainmob, "You feel slightly disoriented. That's normal when you're just a [ejected_flavor_text].")
+ become_occupied(occupied_icon)
if(radio)
radio_action.ApplyIcon()
- return
-/obj/item/mmi/posibrain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H)
+/obj/item/mmi/robotic_brain/attempt_become_organ(obj/item/organ/external/parent, mob/living/carbon/human/H)
if(..())
if(imprinted_master)
to_chat(H, "You are permanently imprinted to [imprinted_master], obey [imprinted_master]'s every order and assist [imprinted_master.p_them()] in completing [imprinted_master.p_their()] goals at any cost.")
-/obj/item/mmi/posibrain/proc/transfer_personality(mob/candidate)
- searching = 0
+/obj/item/mmi/robotic_brain/proc/transfer_personality(mob/candidate)
+ searching = FALSE
brainmob.key = candidate.key
name = "[src] ([brainmob.name])"
to_chat(brainmob, "You are a [src], brought into existence on [station_name()].")
- to_chat(brainmob, "As a synthetic intelligence, you answer to [imprinted_master], unless otherwise placed inside of a lawed synthetic structure or mech.")
+ to_chat(brainmob, "As a non-sentient synthetic intelligence, you answer to [imprinted_master], unless otherwise placed inside of a lawed synthetic structure or mech.")
to_chat(brainmob, "Remember, the purpose of your existence is to serve [imprinted_master]'s every word, unless lawed or placed into a mech in the future.")
brainmob.mind.assigned_role = "Positronic Brain"
- var/turf/T = get_turf_or_move(loc)
- for(var/mob/M in viewers(T))
- M.show_message("[src] chimes quietly.")
- become_occupied("posibrain-occupied")
+ visible_message("[src] chimes quietly.")
+ become_occupied(occupied_icon)
-/obj/item/mmi/posibrain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
- if(src.brainmob && src.brainmob.key) return
+/obj/item/mmi/robotic_brain/proc/reset_search() //We give the players sixty seconds to decide, then reset the timer.
+ if(brainmob && brainmob.key)
+ return
- src.searching = 0
- icon_state = "posibrain"
+ searching = FALSE
+ icon_state = blank_icon
- var/turf/T = get_turf_or_move(src.loc)
- for(var/mob/M in viewers(T))
- M.show_message("The [src] buzzes quietly, and the golden lights fade away. Perhaps you could try again?")
+ visible_message("[src] buzzes quietly as the light fades out. Perhaps you could try again?")
-/obj/item/mmi/posibrain/Topic(href,href_list)
+/obj/item/mmi/robotic_brain/Topic(href, href_list)
if("signup" in href_list)
var/mob/dead/observer/O = locate(href_list["signup"])
- if(!O) return
+ if(!O)
+ return
volunteer(O)
-/obj/item/mmi/posibrain/proc/volunteer(var/mob/dead/observer/O)
+/obj/item/mmi/robotic_brain/proc/volunteer(mob/dead/observer/O)
if(!searching)
to_chat(O, "Not looking for a ghost, yet.")
return
@@ -158,7 +160,7 @@
ghost_volunteers.Add(O)
-/obj/item/mmi/posibrain/examine(mob/user)
+/obj/item/mmi/robotic_brain/examine(mob/user)
to_chat(user, "Its speaker is turned [silenced ? "off" : "on"].")
to_chat(user, "*---------*")
. = ..()
@@ -171,40 +173,41 @@
if(brainmob && brainmob.key)
switch(brainmob.stat)
if(CONSCIOUS)
- if(!brainmob.client) msg += "It appears to be in stand-by mode.\n" //afk
- if(UNCONSCIOUS) msg += "It doesn't seem to be responsive.\n"
- if(DEAD) msg += "It appears to be completely inactive.\n"
+ if(!brainmob.client)
+ msg += "It appears to be in stand-by mode.\n" //afk
+ if(UNCONSCIOUS)
+ msg += "It doesn't seem to be responsive.\n"
+ if(DEAD)
+ msg += "It appears to be completely inactive.\n"
else
msg += "It appears to be completely inactive.\n"
msg += "*---------*"
to_chat(user, msg.Join(""))
-/obj/item/mmi/posibrain/emp_act(severity)
- if(!src.brainmob)
+/obj/item/mmi/robotic_brain/emp_act(severity)
+ if(!brainmob)
return
- else
- switch(severity)
- if(1)
- src.brainmob.emp_damage += rand(20,30)
- if(2)
- src.brainmob.emp_damage += rand(10,20)
- if(3)
- src.brainmob.emp_damage += rand(0,10)
+ switch(severity)
+ if(1)
+ brainmob.emp_damage += rand(20, 30)
+ if(2)
+ brainmob.emp_damage += rand(10, 20)
+ if(3)
+ brainmob.emp_damage += rand(0, 10)
..()
-/obj/item/mmi/posibrain/New()
- src.brainmob = new(src)
- src.brainmob.name = "[pick(list("PBU","HIU","SINA","ARMA","OSI"))]-[rand(100, 999)]"
- src.brainmob.real_name = src.brainmob.name
- src.brainmob.loc = src
- src.brainmob.container = src
- src.brainmob.stat = 0
- src.brainmob.SetSilence(0)
- dead_mob_list -= src.brainmob
-
+/obj/item/mmi/robotic_brain/New()
+ brainmob = new(src)
+ brainmob.name = "[pick(list("PBU", "HIU", "SINA", "ARMA", "OSI"))]-[rand(100, 999)]"
+ brainmob.real_name = brainmob.name
+ brainmob.forceMove(src)
+ brainmob.container = src
+ brainmob.stat = CONSCIOUS
+ brainmob.SetSilence(0)
+ dead_mob_list -= brainmob
..()
-/obj/item/mmi/posibrain/attack_ghost(var/mob/dead/observer/O)
+/obj/item/mmi/robotic_brain/attack_ghost(mob/dead/observer/O)
if(searching)
volunteer(O)
return
@@ -213,12 +216,16 @@
if(check_observer(O) && (world.time >= next_ping_at))
next_ping_at = world.time + (20 SECONDS)
playsound(get_turf(src), 'sound/items/posiping.ogg', 80, 0)
- var/turf/T = get_turf_or_move(src.loc)
- for(var/mob/M in viewers(T))
- M.show_message("[src] pings softly.")
+ visible_message("[src] pings softly.")
-/obj/item/mmi/posibrain/ipc
+/obj/item/mmi/robotic_brain/positronic
name = "positronic brain"
+ icon = 'icons/obj/assemblies.dmi'
+ icon_state = "posibrain"
+ blank_icon = "posibrain"
+ searching_icon = "posibrain-searching"
+ occupied_icon = "posibrain-occupied"
desc = "A cube of shining metal, four inches to a side and covered in shallow grooves."
- silenced = 1
+ silenced = TRUE
requires_master = FALSE
+ ejected_flavor_text = "metal cube"
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/brain/say.dm b/code/modules/mob/living/carbon/brain/say.dm
index 4a34d2d1b05..907a2e4862d 100644
--- a/code/modules/mob/living/carbon/brain/say.dm
+++ b/code/modules/mob/living/carbon/brain/say.dm
@@ -22,9 +22,9 @@
if(!istype(container, /obj/item/mmi))
. = FALSE
- else if(istype(container, /obj/item/mmi/posibrain))
- var/obj/item/mmi/posibrain/P = container
- if(P && P.silenced)
+ else if(istype(container, /obj/item/mmi/robotic_brain))
+ var/obj/item/mmi/robotic_brain/R = container
+ if(R && R.silenced)
if(warning)
to_chat(usr, "You cannot speak, as your internal speaker is turned off.")
. = FALSE
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 604dfc36f32..4b00bf832c8 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -382,7 +382,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
if(!ventcrawler)
if(ishuman(src))
var/mob/living/carbon/human/H = src
- ventcrawlerlocal = H.species.ventcrawler
+ ventcrawlerlocal = H.dna.species.ventcrawler
if(!ventcrawlerlocal) return
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index 152262b69ea..3f79b90628d 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -3,20 +3,20 @@
AC.flags = flags
AC.ui_interact(user, state = state)
-/mob/living/carbon/human/proc/change_species(var/new_species)
- if(!new_species || species == new_species || !(new_species in all_species))
- return
+/mob/living/carbon/human/proc/change_species(datum/species/new_species)
+ if(!new_species || dna.species.type == new_species || !ispath(new_species, /datum/species))
+ return FALSE
- set_species(new_species, null, 1)
+ set_species(new_species, null, TRUE)
reset_hair()
- if(species.bodyflags & HAS_MARKINGS)
+ if(dna.species.bodyflags & HAS_MARKINGS)
reset_markings()
- return 1
+ return TRUE
/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
var/obj/item/organ/external/head/H = bodyparts_by_name["head"]
- if(gender == new_gender || (gender == PLURAL && species.has_gender))
+ if(gender == new_gender || (gender == PLURAL && dna.species.has_gender))
return
gender = new_gender
@@ -129,7 +129,7 @@
/mob/living/carbon/human/proc/change_alt_head(var/alternate_head)
var/obj/item/organ/external/head/H = get_organ("head")
- if(!H || H.alt_head == alternate_head || H.is_robotic() || (!(species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
+ if(!H || H.alt_head == alternate_head || H.is_robotic() || (!(dna.species.bodyflags & HAS_ALT_HEADS) && alternate_head != "None") || !(alternate_head in alt_heads_list))
return
H.alt_head = alternate_head
@@ -296,7 +296,7 @@
/mob/living/carbon/human/proc/change_skin_color(var/colour = "#000000")
- if(colour == skin_colour || !(species.bodyflags & HAS_SKIN_COLOR))
+ if(colour == skin_colour || !(dna.species.bodyflags & HAS_SKIN_COLOR))
return
skin_colour = colour
@@ -306,7 +306,7 @@
return 1
/mob/living/carbon/human/proc/change_skin_tone(var/tone)
- if(s_tone == tone || !((species.bodyflags & HAS_SKIN_TONE) || (species.bodyflags & HAS_ICON_SKIN_TONE)))
+ if(s_tone == tone || !((dna.species.bodyflags & HAS_SKIN_TONE) || (dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
return
s_tone = tone
@@ -350,16 +350,16 @@
continue
if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
- if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
+ if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if((H.dna.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(H.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
valid_hairstyles += hairstyle
return valid_hairstyles
@@ -378,17 +378,17 @@
continue
if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
continue
- if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
+ if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
- if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
- if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if(H.dna.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
+ if((H.dna.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(H.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ if(H.dna.species.name in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
valid_facial_hairstyles += facialhairstyle
return valid_facial_hairstyles
@@ -402,7 +402,7 @@
for(var/head_accessory in head_accessory_styles_list)
var/datum/sprite_accessory/S = head_accessory_styles_list[head_accessory]
- if(!(H.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list.
+ if(!(H.dna.species.name in S.species_allowed)) //If the user's head is not of a species the head accessory style allows, skip it. Otherwise, add it to the list.
continue
valid_head_accessories += head_accessory
@@ -421,7 +421,7 @@
continue
if(S.marking_location != location) //If the marking isn't for the location we desire, skip.
continue
- if(!(species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
+ if(!(dna.species.name in S.species_allowed)) //If the user is not of a species the marking style allows, skip it. Otherwise, add it to the list.
continue
if(location == "tail")
if(!body_accessory)
@@ -432,7 +432,7 @@
continue
if(location == "head")
var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
- if(H.species.bodyflags & ALL_RPARTS)//If the user is a species that can have a robotic head...
+ if(H.dna.species.bodyflags & ALL_RPARTS) //If the user is a species that can have a robotic head...
var/datum/robolimb/robohead = all_robolimbs[H.model]
if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
continue
@@ -456,7 +456,7 @@
if(!istype(A))
valid_body_accessories["None"] = "None" //The only null entry should be the "None" option.
continue
- if(species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
+ if(dna.species.name in A.allowed_species) //If the user is not of a species the body accessory style allows, skip it. Otherwise, add it to the list.
valid_body_accessories += B
return valid_body_accessories
@@ -469,7 +469,7 @@
valid_alt_heads["None"] = alt_heads_list["None"] //The only null entry should be the "None" option, and there should always be a "None" option.
for(var/alternate_head in alt_heads_list)
var/datum/sprite_accessory/alt_heads/head = alt_heads_list[alternate_head]
- if(!(H.species.name in head.species_allowed))
+ if(!(H.dna.species.name in head.species_allowed))
continue
valid_alt_heads += alternate_head
diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm
index 37749c0dd76..bdca496d256 100644
--- a/code/modules/mob/living/carbon/human/death.dm
+++ b/code/modules/mob/living/carbon/human/death.dm
@@ -62,7 +62,7 @@
animation.master = src
flick("dust-h", animation)
- new species.remains_type(get_turf(src))
+ new dna.species.remains_type(get_turf(src))
spawn(15)
if(animation) qdel(animation)
@@ -103,8 +103,8 @@
set_heartattack(FALSE)
//Handle species-specific deaths.
- if(species)
- species.handle_death(src)
+ if(dna.species)
+ dna.species.handle_death(src)
callHook("death", list(src, gibbed))
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index be46cc9fa7d..c1eb8641820 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -29,34 +29,42 @@
switch(act)
//Cooldown-inducing emotes
if("ping", "pings", "buzz", "buzzes", "beep", "beeps", "yes", "no", "buzz2")
- if(species.name == "Machine") //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise.
+ var/found_machine_head = FALSE
+ if(ismachine(src)) //Only Machines can beep, ping, and buzz, yes, no, and make a silly sad trombone noise.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
- else //Everyone else fails, skip the emote attempt
- return
+ found_machine_head = TRUE
+ else
+ var/obj/item/organ/external/head/H = get_organ("head") // If you have a robotic head, you can make beep-boop noises
+ if(H && H.is_robotic())
+ on_CD = handle_emote_CD()
+ found_machine_head = TRUE
+
+ if(!found_machine_head) //Everyone else fails, skip the emote attempt
+ return //Everyone else fails, skip the emote attempt
if("drone","drones","hum","hums","rumble","rumbles")
- if(get_species() == "Drask") //Only Drask can make whale noises
+ if(isdrask(src)) //Only Drask can make whale noises
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
else
return
if("howl", "howls")
- if(get_species() == "Vulpkanin") //Only Vulpkanin can howl
+ if(isvulpkanin(src)) //Only Vulpkanin can howl
on_CD = handle_emote_CD(100)
else
return
if("growl", "growls")
- if(get_species() == "Vulpkanin") //Only Vulpkanin can growl
+ if(isvulpkanin(src)) //Only Vulpkanin can growl
on_CD = handle_emote_CD()
else
return
if("squish", "squishes")
var/found_slime_bodypart = 0
- if(get_species() == "Slime People") //Only Slime People can squish
+ if(isslimeperson(src)) //Only Slime People can squish
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
found_slime_bodypart = 1
else
for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too!
- if(L.dna.species in list("Slime People"))
+ if(istype(L.dna.species, /datum/species/slime))
on_CD = handle_emote_CD()
found_slime_bodypart = 1
break
@@ -65,31 +73,31 @@
return
if("clack", "clacks")
- if(get_species() == "Kidan") //Only Kidan can clack and rightfully so.
+ if(iskidan(src)) //Only Kidan can clack and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("click", "clicks")
- if(get_species() == "Kidan") //Only Kidan can click and rightfully so.
+ if(iskidan(src)) //Only Kidan can click and rightfully so.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("creaks", "creak")
- if(get_species() == "Diona") //Only Dionas can Creaks.
+ if(isdiona(src)) //Only Dionas can Creaks.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("hiss", "hisses")
- if(get_species() == "Unathi") //Only Unathi can hiss.
+ if(isunathi(src)) //Only Unathi can hiss.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
if("quill", "quills")
- if(get_species() == "Vox") //Only Vox can rustle their quills.
+ if(isvox(src)) //Only Vox can rustle their quills.
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm'
else //Everyone else fails, skip the emote attempt
return
@@ -225,7 +233,7 @@
message = "[src] starts wagging [p_their()] tail."
start_tail_wagging(1)
- else if(species.bodyflags & TAIL_WAGGING)
+ else if(dna.species.bodyflags & TAIL_WAGGING)
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
message = "[src] starts wagging [p_their()] tail."
start_tail_wagging(1)
@@ -236,7 +244,7 @@
m_type = 1
if("swag", "swags")
- if(species.bodyflags & TAIL_WAGGING || body_accessory)
+ if(dna.species.bodyflags & TAIL_WAGGING || body_accessory)
message = "[src] stops wagging [p_their()] tail."
stop_tail_wagging(1)
else
@@ -431,11 +439,11 @@
message = "[src] coughs!"
m_type = 2
if(gender == FEMALE)
- if(species.female_cough_sounds)
- playsound(src, pick(species.female_cough_sounds), 120)
+ if(dna.species.female_cough_sounds)
+ playsound(src, pick(dna.species.female_cough_sounds), 120)
else
- if(species.male_cough_sounds)
- playsound(src, pick(species.male_cough_sounds), 120)
+ if(dna.species.male_cough_sounds)
+ playsound(src, pick(dna.species.male_cough_sounds), 120)
else
message = "[src] makes a strong noise."
m_type = 2
@@ -479,7 +487,7 @@
m_type = 2
if("deathgasp", "deathgasps")
- message = "[src] [replacetext(species.death_message, "their", p_their())]"
+ message = "[src] [replacetext(dna.species.death_message, "their", p_their())]"
m_type = 1
if("giggle", "giggles")
@@ -676,9 +684,9 @@
if(!muzzled)
message = "[src] sneezes."
if(gender == FEMALE)
- playsound(src, species.female_sneeze_sound, 70)
+ playsound(src, dna.species.female_sneeze_sound, 70)
else
- playsound(src, species.male_sneeze_sound, 70)
+ playsound(src, dna.species.male_sneeze_sound, 70)
m_type = 2
else
message = "[src] makes a strange noise."
@@ -784,12 +792,12 @@
m_type = 1
else
if(!muzzled)
- message = "[src] [species.scream_verb][M ? " at [M]" : ""]!"
+ message = "[src] [dna.species.scream_verb][M ? " at [M]" : ""]!"
m_type = 2
if(gender == FEMALE)
- playsound(loc, "[species.female_scream_sound]", 80, 1, frequency = get_age_pitch())
+ playsound(loc, "[dna.species.female_scream_sound]", 80, 1, frequency = get_age_pitch())
else
- playsound(loc, "[species.male_scream_sound]", 80, 1, frequency = get_age_pitch()) //default to male screams if no gender is present.
+ playsound(loc, "[dna.species.male_scream_sound]", 80, 1, frequency = get_age_pitch()) //default to male screams if no gender is present.
else
message = "[src] makes a very loud noise[M ? " at [M]" : ""]."
@@ -890,9 +898,7 @@
+ " shiver(s), shrug(s), sigh(s), signal(s)-#1-10,slap(s)-(none)/mob, smile(s),snap(s), sneeze(s), sniff(s), snore(s), stare(s)-(none)/mob, swag(s), tremble(s), twitch(es), twitch(es)_s," \
+ " wag(s), wave(s), whimper(s), wink(s), yawn(s), quill(s)"
- switch(species.name)
- if("Machine")
- emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
+ switch(dna.species.name)
if("Drask")
emotelist += "\nDrask specific emotes :- drone(s)-(none)/mob, hum(s)-(none)/mob, rumble(s)-(none)/mob"
if("Kidan")
@@ -906,11 +912,18 @@
if("Diona")
emotelist += "\nDiona specific emotes :- creak(s)"
- if (species.name == "Slime People")
+ if(ismachine(src))
+ emotelist += "\nMachine specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
+ else
+ var/obj/item/organ/external/head/H = get_organ("head") // If you have a robotic head, you can make beep-boop noises
+ if(H && H.is_robotic())
+ emotelist += "\nRobotic head specific emotes :- beep(s)-(none)/mob, buzz(es)-none/mob, no-(none)/mob, ping(s)-(none)/mob, yes-(none)/mob, buzz2-(none)/mob"
+
+ if(isslimeperson(src))
emotelist += "\nSlime people specific emotes :- squish(es)-(none)/mob"
else
for(var/obj/item/organ/external/L in bodyparts) // if your limbs are squishy you can squish too!
- if(L.dna.species in list("Slime People"))
+ if(istype(L.dna.species, /datum/species/slime))
emotelist += "\nSlime people body part specific emotes :- squish(es)-(none)/mob"
break
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 83a10576b8f..7533873cedc 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -29,14 +29,12 @@
msg += "[bicon(icon(icon, dir=SOUTH))] " //fucking BYOND: this should stop dreamseeker crashing if we -somehow- examine somebody before their icon is generated
msg += "[name]"
- var/list/nospecies = list("Abductor", "Shadowling", "Neara", "Monkey", "Stok", "Farwa", "Wolpin") //species that won't show their race no matter what
-
- var/displayed_species = get_species()
+ var/displayed_species = dna.species.name
for(var/obj/item/clothing/C in src) //Disguise checks
if(C == src.head || C == src.wear_suit || C == src.wear_mask || C == src.w_uniform || C == src.belt || C == src.back)
if(C.species_disguise)
displayed_species = C.species_disguise
- if(skipjumpsuit && skipface || (displayed_species in nospecies)) //either obscured or on the nospecies list
+ if(skipjumpsuit && skipface || (NO_EXAMINE in dna.species.species_traits)) //either obscured or on the nospecies list
msg += "!\n" //omit the species when examining
else if(displayed_species == "Slime People") //snowflakey because Slime People are defined as a plural
msg += ", a slime person!\n"
@@ -199,9 +197,9 @@
var/list/wound_flavor_text = list()
var/list/is_destroyed = list()
- for(var/organ_tag in species.has_limbs)
+ for(var/organ_tag in dna.species.has_limbs)
- var/list/organ_data = species.has_limbs[organ_tag]
+ var/list/organ_data = dna.species.has_limbs[organ_tag]
var/organ_descriptor = organ_data["descriptor"]
is_destroyed["[organ_data["descriptor"]]"] = 1
@@ -325,7 +323,7 @@
var/dodebug = auto.doing2string(auto.doing)
var/interestdebug = auto.interest2string(auto.interest)
msg += "[p_they(TRUE)] [p_are()] appears to be [interestdebug] and [dodebug].\n"
- else if(species.show_ssd)
+ else if(dna.species.show_ssd)
if(!key)
msg += "[p_they(TRUE)] [p_are()] totally catatonic. The stresses of life in deep-space must have been too much for [p_them()]. Any recovery is unlikely.\n"
else if(!client)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index 06a287e1645..1cf1a8bb942 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -4,10 +4,6 @@
voice_name = "unknown"
icon = 'icons/mob/human.dmi'
icon_state = "body_m_s"
-
- //why are these here and not in human_defines.dm
- //var/list/hud_list[10]
- var/datum/species/species //Contains icon generation and language information, set during New().
var/obj/item/rig/wearing_rig // This is very not good, but it's much much better than calling get_rig() every update_canmove() call.
/mob/living/carbon/human/New(loc)
@@ -15,21 +11,17 @@
log_runtime(EXCEPTION("human/New called with more than 1 argument (REPORT THIS ENTIRE RUNTIME TO A CODER)"))
. = ..()
-/mob/living/carbon/human/Initialize(mapload, new_species = null)
+/mob/living/carbon/human/Initialize(mapload, datum/species/new_species = /datum/species/human)
if(!dna)
dna = new /datum/dna(null)
// Species name is handled by set_species()
- if(!species)
- if(new_species)
- set_species(new_species, 1, delay_icon_update = 1)
- else
- set_species(delay_icon_update = 1)
+ set_species(new_species, 1, delay_icon_update = 1, skip_same_check = TRUE)
..()
- if(species)
- real_name = species.get_random_name(gender)
+ if(dna.species)
+ real_name = dna.species.get_random_name(gender)
name = real_name
if(mind)
mind.name = real_name
@@ -74,92 +66,92 @@
status_flags = GODMODE|CANPUSH
/mob/living/carbon/human/skrell/Initialize(mapload)
- ..(mapload, "Skrell")
+ ..(mapload, /datum/species/skrell)
/mob/living/carbon/human/tajaran/Initialize(mapload)
- ..(mapload, "Tajaran")
+ ..(mapload, /datum/species/tajaran)
/mob/living/carbon/human/vulpkanin/Initialize(mapload)
- ..(mapload, "Vulpkanin")
+ ..(mapload, /datum/species/vulpkanin)
/mob/living/carbon/human/unathi/Initialize(mapload)
- ..(mapload, "Unathi")
+ ..(mapload, /datum/species/unathi)
/mob/living/carbon/human/vox/Initialize(mapload)
- ..(mapload, "Vox")
+ ..(mapload, /datum/species/vox)
/mob/living/carbon/human/voxarmalis/Initialize(mapload)
- ..(mapload, "Vox Armalis")
+ ..(mapload, /datum/species/vox/armalis)
/mob/living/carbon/human/skeleton/Initialize(mapload)
- ..(mapload, "Skeleton")
+ ..(mapload, /datum/species/skeleton)
/mob/living/carbon/human/kidan/Initialize(mapload)
- ..(mapload, "Kidan")
+ ..(mapload, /datum/species/kidan)
/mob/living/carbon/human/plasma/Initialize(mapload)
- ..(mapload, "Plasmaman")
+ ..(mapload, /datum/species/plasmaman)
/mob/living/carbon/human/slime/Initialize(mapload)
- ..(mapload, "Slime People")
+ ..(mapload, /datum/species/slime)
/mob/living/carbon/human/grey/Initialize(mapload)
- ..(mapload, "Grey")
+ ..(mapload, /datum/species/grey)
/mob/living/carbon/human/abductor/Initialize(mapload)
- ..(mapload, "Abductor")
-
-/mob/living/carbon/human/human/Initialize(mapload)
- ..(mapload, "Human")
+ ..(mapload, /datum/species/abductor)
/mob/living/carbon/human/diona/Initialize(mapload)
- ..(mapload, "Diona")
+ ..(mapload, /datum/species/diona)
/mob/living/carbon/human/machine/Initialize(mapload)
- ..(mapload, "Machine")
+ ..(mapload, /datum/species/machine)
/mob/living/carbon/human/machine/created
name = "Integrated Robotic Chassis"
/mob/living/carbon/human/machine/created/Initialize(mapload)
..()
- real_name = "Integrated Robotic Chassis ([rand(1, 9999)])"
+ rename_character(null, "Integrated Robotic Chassis ([rand(1, 9999)])")
+ update_dna()
for(var/obj/item/organ/external/E in bodyparts)
if(istype(E, /obj/item/organ/external/chest) || istype(E, /obj/item/organ/external/groin))
continue
qdel(E)
for(var/obj/item/organ/O in internal_organs)
qdel(O)
+ regenerate_icons()
+ death()
/mob/living/carbon/human/shadow/Initialize(mapload)
- ..(mapload, "Shadow")
+ ..(mapload, /datum/species/shadow)
/mob/living/carbon/human/golem/Initialize(mapload)
- ..(mapload, "Golem")
+ ..(mapload, /datum/species/golem)
/mob/living/carbon/human/wryn/Initialize(mapload)
- ..(mapload, "Wryn")
+ ..(mapload, /datum/species/wryn)
/mob/living/carbon/human/nucleation/Initialize(mapload)
- ..(mapload, "Nucleation")
+ ..(mapload, /datum/species/nucleation)
/mob/living/carbon/human/drask/Initialize(mapload)
- ..(mapload, "Drask")
+ ..(mapload, /datum/species/drask)
/mob/living/carbon/human/monkey/Initialize(mapload)
- ..(mapload, "Monkey")
+ ..(mapload, /datum/species/monkey)
/mob/living/carbon/human/farwa/Initialize(mapload)
- ..(mapload, "Farwa")
+ ..(mapload, /datum/species/monkey/tajaran)
/mob/living/carbon/human/wolpin/Initialize(mapload)
- ..(mapload, "Wolpin")
+ ..(mapload, /datum/species/monkey/vulpkanin)
/mob/living/carbon/human/neara/Initialize(mapload)
- ..(mapload, "Neara")
+ ..(mapload, /datum/species/monkey/skrell)
/mob/living/carbon/human/stok/Initialize(mapload)
- ..(mapload, "Stok")
+ ..(mapload, /datum/species/monkey/unathi)
/mob/living/carbon/human/Stat()
..()
@@ -563,7 +555,7 @@
grant_death_vision()
return
- species.update_sight(src)
+ dna.species.update_sight(src)
//Removed the horrible safety parameter. It was only being used by ninja code anyways.
//Now checks siemens_coefficient of the affected area by default
@@ -593,8 +585,8 @@
if(gloves)
var/obj/item/clothing/gloves/G = gloves
gloves_siemens_coeff = G.siemens_coefficient
- if(species)
- species_siemens_coeff = species.siemens_coeff
+ if(dna.species)
+ species_siemens_coeff = dna.species.siemens_coeff
siemens_coeff = gloves_siemens_coeff * species_siemens_coeff
if(undergoing_cardiac_arrest())
if(shock_damage * siemens_coeff >= 1 && prob(25))
@@ -1045,14 +1037,6 @@
/mob/living/carbon/human/proc/check_dna()
dna.check_integrity(src)
- return
-
-/mob/living/carbon/human/get_species()
-
- if(!species)
- set_species()
-
- return species.name
/mob/living/carbon/human/proc/play_xylophone()
if(!src.xylophone)
@@ -1153,9 +1137,9 @@
//Replacing lost limbs with the species default.
var/mob/living/carbon/human/temp_holder
- for(var/limb_type in H.species.has_limbs)
+ for(var/limb_type in H.dna.species.has_limbs)
if(!(limb_type in H.bodyparts_by_name))
- var/list/organ_data = H.species.has_limbs[limb_type]
+ var/list/organ_data = H.dna.species.has_limbs[limb_type]
var/limb_path = organ_data["path"]
var/obj/item/organ/external/O = new limb_path(temp_holder)
if(H.get_limb_by_name(O.name)) //Check to see if the user already has an limb with the same name as the 'missing limb'. If they do, skip regrowth.
@@ -1168,8 +1152,8 @@
//Replacing lost organs with the species default.
temp_holder = new /mob/living/carbon/human()
- for(var/index in H.species.has_organ)
- var/organ = H.species.has_organ[index]
+ for(var/index in H.dna.species.has_organ)
+ var/organ = H.dna.species.has_organ[index]
if(!(organ in types_of_int_organs)) //If the mob is missing this particular organ...
var/obj/item/organ/internal/I = new organ(temp_holder) //Create the organ inside our holder so we can check it before implantation.
if(H.get_organ_slot(I.slot)) //Check to see if the user already has an organ in the slot the 'missing organ' belongs to. If they do, skip implantation.
@@ -1186,7 +1170,7 @@
surgeries.Cut() //End all surgeries.
update_revive()
- if(species.name != "Skeleton" && (SKELETON in mutations))
+ if(!isskeleton(src) && (SKELETON in mutations))
mutations.Remove(SKELETON)
if(NOCLONE in mutations)
mutations.Remove(NOCLONE)
@@ -1249,7 +1233,7 @@
..()
/mob/living/carbon/human/generate_name()
- name = species.makeName(gender,src)
+ name = dna.species.get_random_name(gender)
real_name = name
if(dna)
dna.real_name = name
@@ -1288,88 +1272,90 @@
else
to_chat(usr, "[self ? "Your" : "[src]'s"] pulse is [src.get_pulse(GETPULSE_HAND)].")
-/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
- var/datum/species/oldspecies = species
- var/datum/species/NS = all_species[new_species]
- if(!dna)
- if(!new_species)
- new_species = "Human"
- else
- if(!new_species)
- new_species = dna.species
- else
- dna.species = new_species
-
- if(species)
- if(species.name && species.name == new_species)
+/mob/living/carbon/human/proc/set_species(datum/species/new_species, default_colour, delay_icon_update = FALSE, skip_same_check = FALSE)
+ if(!skip_same_check)
+ if(dna.species.name == initial(new_species.name))
return
-
- if(species.language)
- remove_language(species.language)
-
- if(species.default_language)
- remove_language(species.default_language)
-
- if(gender == PLURAL && NS.has_gender)
- change_gender(pick(MALE,FEMALE))
- species.handle_pre_change(src)
-
- species = all_species[new_species]
+ var/datum/species/oldspecies = dna.species
if(oldspecies)
+ if(oldspecies.language)
+ remove_language(oldspecies.language)
+
+ if(oldspecies.default_language)
+ remove_language(oldspecies.default_language)
+
+ if(gender == PLURAL && oldspecies.has_gender)
+ change_gender(pick(MALE, FEMALE))
+
if(oldspecies.default_genes.len)
- oldspecies.handle_dna(src,1) // Remove any genes that belong to the old species
+ oldspecies.handle_dna(src, TRUE) // Remove any genes that belong to the old species
- tail = species.tail
+ oldspecies.handle_pre_change(src)
- maxHealth = species.total_health
+ dna.species = new new_species()
- if(species.language)
- add_language(species.language)
+ tail = dna.species.tail
- if(species.default_language)
- add_language(species.default_language)
+ maxHealth = dna.species.total_health
- hunger_drain = species.hunger_drain
- digestion_ratio = species.digestion_ratio
+ if(dna.species.language)
+ add_language(dna.species.language)
- if(species.base_color && default_colour)
+ if(dna.species.default_language)
+ add_language(dna.species.default_language)
+
+ hunger_drain = dna.species.hunger_drain
+ digestion_ratio = dna.species.digestion_ratio
+
+ if(dna.species.base_color && default_colour)
//Apply colour.
- skin_colour = species.base_color
+ skin_colour = dna.species.base_color
else
skin_colour = "#000000"
- if(!(species.bodyflags & HAS_SKIN_TONE))
+ if(!(dna.species.bodyflags & HAS_SKIN_TONE))
s_tone = 0
- species.create_organs(src)
+ var/list/thing_to_check = list(slot_wear_mask, slot_head, slot_shoes, slot_gloves, slot_l_ear, slot_r_ear, slot_glasses, slot_l_hand, slot_r_hand)
+ var/list/kept_items[0]
+
+ for(var/thing in thing_to_check)
+ var/obj/item/I = get_item_by_slot(thing)
+ if(I)
+ kept_items[I] = thing
+
+ dna.species.create_organs(src)
+
+ for(var/thing in kept_items)
+ equip_to_slot_or_del(thing, kept_items[thing])
//Handle default hair/head accessories for created mobs.
var/obj/item/organ/external/head/H = get_organ("head")
- if(species.default_hair)
- H.h_style = species.default_hair
+ if(dna.species.default_hair)
+ H.h_style = dna.species.default_hair
else
H.h_style = "Bald"
- if(species.default_fhair)
- H.f_style = species.default_fhair
+ if(dna.species.default_fhair)
+ H.f_style = dna.species.default_fhair
else
H.f_style = "Shaved"
- if(species.default_headacc)
- H.ha_style = species.default_headacc
+ if(dna.species.default_headacc)
+ H.ha_style = dna.species.default_headacc
else
H.ha_style = "None"
- if(species.default_hair_colour)
+ if(dna.species.default_hair_colour)
//Apply colour.
- H.hair_colour = species.default_hair_colour
+ H.hair_colour = dna.species.default_hair_colour
else
H.hair_colour = "#000000"
- if(species.default_fhair_colour)
- H.facial_colour = species.default_fhair_colour
+ if(dna.species.default_fhair_colour)
+ H.facial_colour = dna.species.default_fhair_colour
else
H.facial_colour = "#000000"
- if(species.default_headacc_colour)
- H.headacc_colour = species.default_headacc_colour
+ if(dna.species.default_headacc_colour)
+ H.headacc_colour = dna.species.default_headacc_colour
else
H.headacc_colour = "#000000"
@@ -1377,43 +1363,39 @@
m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings.
body_accessory = null
- if(!dna)
- dna = new /datum/dna(null)
- dna.species = species.name
- dna.real_name = real_name
+ dna.real_name = real_name
- species.handle_post_spawn(src)
+ dna.species.handle_post_spawn(src)
- see_in_dark = species.get_resultant_darksight(src)
+ see_in_dark = dna.species.get_resultant_darksight(src)
if(see_in_dark > 2)
see_invisible = SEE_INVISIBLE_LEVEL_ONE
else
see_invisible = SEE_INVISIBLE_LIVING
- species.handle_dna(src) //Give them whatever special dna business they got.
+ dna.species.handle_dna(src) //Give them whatever special dna business they got.
update_client_colour(0)
- spawn(0)
- overlays.Cut()
- update_mutantrace(1)
- regenerate_icons()
-
if(!delay_icon_update)
UpdateAppearance()
- if(species)
- return 1
+ overlays.Cut()
+ update_mutantrace(1)
+ regenerate_icons()
+
+ if(dna.species)
+ return TRUE
else
- return 0
+ return FALSE
/mob/living/carbon/human/get_default_language()
if(default_language)
return default_language
- if(!species)
+ if(!dna.species)
return null
- return species.default_language ? all_languages[species.default_language] : null
+ return dna.species.default_language ? all_languages[dna.species.default_language] : null
/mob/living/carbon/human/proc/bloody_doodle()
set category = "IC"
@@ -1480,7 +1462,7 @@
to_chat(src, "Where's your head at? Can't change your monitor/display without one.")
return
- if(species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body...
+ if(dna.species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body...
var/datum/robolimb/robohead = all_robolimbs[head_organ.model]
if(!head_organ)
return
@@ -1496,7 +1478,7 @@
var/list/hair = list()
for(var/i in hair_styles_public_list)
var/datum/sprite_accessory/hair/tmp_hair = hair_styles_public_list[i]
- if((head_organ.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
+ if((head_organ.dna.species.name in tmp_hair.species_allowed) && (robohead.company in tmp_hair.models_allowed)) //Populate the list of available monitor styles only with styles that the monitor-head is allowed to use.
hair += i
var/new_style = input(src, "Select a monitor display", "Monitor Display", head_organ.h_style) as null|anything in hair
@@ -1584,8 +1566,8 @@
/mob/living/carbon/human/proc/get_eyecon()
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
var/obj/item/organ/internal/cyberimp/eyes/eye_implant = get_int_organ(/obj/item/organ/internal/cyberimp/eyes)
- if(istype(species) && species.eyes)
- var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', species.eyes)
+ if(istype(dna.species) && dna.species.eyes)
+ var/icon/eyes_icon = new/icon('icons/mob/human_face.dmi', dna.species.eyes)
if(eye_implant) //Eye implants override native DNA eye colo(u)r
eyes_icon = eye_implant.generate_icon()
else if(eyes)
@@ -1791,7 +1773,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/IsAdvancedToolUser()
- if(species.has_fine_manipulation)
+ if(dna.species.has_fine_manipulation)
return 1
return 0
@@ -1826,7 +1808,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
return 1
/mob/living/carbon/human/can_eat(flags = 255)
- return species && (species.dietflags & flags)
+ return dna.species && (dna.species.dietflags & flags)
/mob/living/carbon/human/selfFeed(var/obj/item/reagent_containers/food/toEat, fullness)
if(!check_has_mouth())
@@ -1836,14 +1818,14 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
/mob/living/carbon/human/forceFed(var/obj/item/reagent_containers/food/toEat, mob/user, fullness)
if(!check_has_mouth())
- if(!((istype(toEat, /obj/item/reagent_containers/food/drinks) && (get_species() == "Machine"))))
+ if(!((istype(toEat, /obj/item/reagent_containers/food/drinks) && (ismachine(src)))))
to_chat(user, "Where do you intend to put \the [toEat]? \The [src] doesn't have a mouth!")
return 0
return ..()
/mob/living/carbon/human/selfDrink(var/obj/item/reagent_containers/food/drinks/toDrink)
if(!check_has_mouth())
- if(!get_species() == "Machine")
+ if(!ismachine(src))
to_chat(src, "Where do you intend to put \the [src]? You don't have a mouth!")
return 0
else
@@ -1887,7 +1869,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. |= A.GetAccess()
/mob/living/carbon/human/is_mechanical()
- return ..() || (species.bodyflags & ALL_RPARTS) != 0
+ return ..() || (dna.species.bodyflags & ALL_RPARTS) != 0
/mob/living/carbon/human/can_use_guns(var/obj/item/gun/G)
. = ..()
@@ -1896,7 +1878,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
if(HULK in mutations)
to_chat(src, "Your meaty finger is much too large for the trigger guard!")
return 0
- if(NOGUNS in species.species_traits)
+ if(NOGUNS in dna.species.species_traits)
to_chat(src, "Your fingers don't fit in the trigger guard!")
return 0
@@ -1963,7 +1945,7 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
dna.deserialize(data["dna"])
real_name = dna.real_name
name = real_name
- set_species(dna.species)
+ set_species(dna.species.type, skip_same_check = TRUE)
age = data["age"]
undershirt = data["ushirt"]
underwear = data["uwear"]
@@ -2025,8 +2007,8 @@ Eyes need to have significantly high darksight to shine unless the mob has the X
. += "---"
/mob/living/carbon/human/get_taste_sensitivity()
- if(species)
- return species.taste_sensitivity
+ if(dna.species)
+ return dna.species.taste_sensitivity
else
return 1
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index c2c16382995..80c128ee07f 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -17,7 +17,7 @@
//TODO: fix husking
if(((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD)
ChangeToHusk()
- if(species.can_revive_by_healing)
+ if(dna.species.can_revive_by_healing)
var/obj/item/organ/internal/brain/B = get_int_organ(/obj/item/organ/internal/brain)
if(B)
if((health >= (config.health_threshold_dead + config.health_threshold_crit) * 0.5) && stat == DEAD && getBrainLoss()<120)
@@ -32,11 +32,11 @@
if(status_flags & GODMODE)
return 0 //godmode
- if(species && species.has_organ["brain"])
+ if(dna.species && dna.species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
- if(species)
- amount = amount * species.brain_mod
+ if(dna.species)
+ amount = amount * dna.species.brain_mod
sponge.receive_damage(amount, 1)
brainloss = sponge.damage
else
@@ -48,11 +48,11 @@
if(status_flags & GODMODE)
return 0 //godmode
- if(species && species.has_organ["brain"])
+ if(dna.species && dna.species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
- if(species)
- amount = amount * species.brain_mod
+ if(dna.species)
+ amount = amount * dna.species.brain_mod
sponge.damage = min(max(amount, 0), (maxHealth*2))
brainloss = sponge.damage
else
@@ -64,7 +64,7 @@
if(status_flags & GODMODE)
return 0 //godmode
- if(species && species.has_organ["brain"])
+ if(dna.species && dna.species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
brainloss = min(sponge.damage,maxHealth*2)
@@ -89,24 +89,24 @@
/mob/living/carbon/human/adjustBruteLoss(amount, damage_source)
- if(species)
- amount = amount * species.brute_mod
+ if(dna.species)
+ amount = amount * dna.species.brute_mod
if(amount > 0)
take_overall_damage(amount, 0, used_weapon = damage_source)
else
heal_overall_damage(-amount, 0)
/mob/living/carbon/human/adjustFireLoss(amount, damage_source)
- if(species)
- amount = amount * species.burn_mod
+ if(dna.species)
+ amount = amount * dna.species.burn_mod
if(amount > 0)
take_overall_damage(0, amount, used_weapon = damage_source)
else
heal_overall_damage(0, -amount)
/mob/living/carbon/human/proc/adjustBruteLossByPart(amount, organ_name, obj/damage_source = null)
- if(species)
- amount = amount * species.brute_mod
+ if(dna.species)
+ amount = amount * dna.species.brute_mod
if(organ_name in bodyparts_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
@@ -119,8 +119,8 @@
/mob/living/carbon/human/proc/adjustFireLossByPart(amount, organ_name, obj/damage_source = null)
- if(species)
- amount = amount * species.burn_mod
+ if(dna.species)
+ amount = amount * dna.species.burn_mod
if(organ_name in bodyparts_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
@@ -139,8 +139,8 @@
..()
/mob/living/carbon/human/adjustCloneLoss(amount)
- if(species)
- amount = amount * species.clone_mod
+ if(dna.species)
+ amount = amount * dna.species.clone_mod
..()
var/heal_prob = max(0, 80 - getCloneLoss())
@@ -179,23 +179,23 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/adjustOxyLoss(amount)
- if(species)
- amount = amount * species.oxy_mod
+ if(dna.species)
+ amount = amount * dna.species.oxy_mod
..()
/mob/living/carbon/human/setOxyLoss(amount)
- if(species)
- amount = amount * species.oxy_mod
+ if(dna.species)
+ amount = amount * dna.species.oxy_mod
..()
/mob/living/carbon/human/adjustToxLoss(amount)
- if(species)
- amount = amount * species.tox_mod
+ if(dna.species)
+ amount = amount * dna.species.tox_mod
..()
/mob/living/carbon/human/setToxLoss(amount)
- if(species)
- amount = amount * species.tox_mod
+ if(dna.species)
+ amount = amount * dna.species.tox_mod
..()
////////////////////////////////////////////
@@ -352,8 +352,8 @@ This function restores all organs.
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
- if(species)
- damage = damage * species.brute_mod
+ if(dna.species)
+ damage = damage * dna.species.brute_mod
if(organ.receive_damage(damage, 0, sharp, used_weapon))
UpdateDamageIcon()
@@ -376,8 +376,8 @@ This function restores all organs.
if(BURN)
damageoverlaytemp = 20
- if(species)
- damage = damage * species.burn_mod
+ if(dna.species)
+ damage = damage * dna.species.burn_mod
if(organ.receive_damage(0, damage, sharp, used_weapon))
UpdateDamageIcon()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2991e0a7111..6c2bb844155 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -354,7 +354,7 @@ emp_act
if(check_shields(user, 15, "the [hulk_verb]ing"))
return
..(user, TRUE)
- playsound(loc, user.species.unarmed.attack_sound, 25, 1, -1)
+ playsound(loc, user.dna.species.unarmed.attack_sound, 25, 1, -1)
var/message = "[user] has [hulk_verb]ed [src]!"
visible_message("[message]", "[message]")
adjustBruteLoss(15)
@@ -365,7 +365,7 @@ emp_act
return
if(ishuman(user))
var/mob/living/carbon/human/H = user
- species.spec_attack_hand(H, src)
+ dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L)
if(..()) //successful larva bite.
@@ -494,7 +494,7 @@ emp_act
/mob/living/carbon/human/water_act(volume, temperature, source)
..()
- species.water_act(src,volume,temperature,source)
+ dna.species.water_act(src,volume,temperature,source)
/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm
index a835133f4d0..71a5f0396a1 100644
--- a/code/modules/mob/living/carbon/human/human_movement.dm
+++ b/code/modules/mob/living/carbon/human/human_movement.dm
@@ -2,7 +2,7 @@
. = 0
. += ..()
. += config.human_delay
- . += species.movement_delay(src)
+ . += dna.species.movement_delay(src)
/mob/living/carbon/human/Process_Spacemove(movement_dir = 0)
@@ -39,12 +39,12 @@
if(!lying && !buckled && !throwing)
for(var/obj/item/organ/external/splinted in splinted_limbs)
splinted.update_splints()
-
+
if(!has_gravity(loc))
return
-
+
var/obj/item/clothing/shoes/S = shoes
-
+
//Bloody footprints
var/turf/T = get_turf(src)
var/obj/item/organ/external/l_foot = get_organ("l_foot")
@@ -119,7 +119,7 @@
if(step_count % 3) //this basically says, every three moves make a noise
return 0 //1st - none, 1%3==1, 2nd - none, 2%3==2, 3rd - noise, 3%3==0
- if(species.silent_steps)
+ if(dna.species.silent_steps)
return 0 //species is silent
playsound(T, S, volume, 1, range)
diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm
index 3f478e65d40..5dcae16b87a 100644
--- a/code/modules/mob/living/carbon/human/human_organs.dm
+++ b/code/modules/mob/living/carbon/human/human_organs.dm
@@ -62,7 +62,7 @@
// standing is poor
if(stance_damage >= 8)
if(!(lying || resting))
- if(!(NO_PAIN in species.species_traits))
+ if(!(NO_PAIN in dna.species.species_traits))
emote("scream")
custom_emote(1, "collapses!")
Weaken(5) //can't emote while weakened, apparently.
@@ -90,7 +90,7 @@
continue
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
- custom_emote(1, "[(NO_PAIN in species.species_traits) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
+ custom_emote(1, "[(NO_PAIN in dna.species.species_traits) ? "" : emote_scream ]drops what [p_they()] [p_were()] holding in [p_their()] [E.name]!")
else if(E.is_malfunctioning())
diff --git a/code/modules/mob/living/carbon/human/interactive/interactive.dm b/code/modules/mob/living/carbon/human/interactive/interactive.dm
index a93fd9e8635..fe50206aedc 100644
--- a/code/modules/mob/living/carbon/human/interactive/interactive.dm
+++ b/code/modules/mob/living/carbon/human/interactive/interactive.dm
@@ -128,7 +128,7 @@
//this is here because this has no client/prefs/brain whatever.
age = rand(AGE_MIN, AGE_MAX)
change_gender(pick("male", "female"))
- rename_character(real_name, species.get_random_name(gender))
+ rename_character(real_name, dna.species.get_random_name(gender))
//job handling
myjob = new default_job()
job = myjob.title
@@ -208,9 +208,9 @@
var/datum/dna/toDoppel = chosen.dna
T.real_name = toDoppel.real_name
- T.set_species(chosen.species.name)
- T.body_accessory = chosen.body_accessory
+ T.set_species(chosen.dna.species.type)
T.dna = toDoppel.Clone()
+ T.body_accessory = chosen.body_accessory
T.UpdateAppearance()
domutcheck(T)
@@ -403,7 +403,7 @@
if(!hud_used)
hud_used = new /datum/hud/human(src)
-/mob/living/carbon/human/interactive/New(var/new_loc, var/new_species = null)
+/mob/living/carbon/human/interactive/Initialize(mapload)
..()
snpc_list += src
diff --git a/code/modules/mob/living/carbon/human/interactive/prefabs.dm b/code/modules/mob/living/carbon/human/interactive/prefabs.dm
index 6553bb26b70..85824145019 100644
--- a/code/modules/mob/living/carbon/human/interactive/prefabs.dm
+++ b/code/modules/mob/living/carbon/human/interactive/prefabs.dm
@@ -1,10 +1,10 @@
-/mob/living/carbon/human/interactive/angry/New()
+/mob/living/carbon/human/interactive/angry/Initialize(mapload)
TRAITS |= TRAIT_ROBUST
TRAITS |= TRAIT_MEAN
faction += "bot_angry"
..()
-/mob/living/carbon/human/interactive/friendly/New()
+/mob/living/carbon/human/interactive/friendly/Initialize(mapload)
TRAITS |= TRAIT_FRIENDLY
TRAITS |= TRAIT_UNROBUST
faction += "bot_friendly"
@@ -12,7 +12,7 @@
functions -= "combat"
..()
-/mob/living/carbon/human/interactive/greytide/New()
+/mob/living/carbon/human/interactive/greytide/Initialize(mapload)
TRAITS |= TRAIT_ROBUST
TRAITS |= TRAIT_MEAN
TRAITS |= TRAIT_THIEVING
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 882501c49f2..50848851646 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -419,7 +419,7 @@
..(what, who, where, silent = is_silent)
/mob/living/carbon/human/can_equip(obj/item/I, slot, disable_warning = 0)
- switch(species.handle_can_equip(I, slot, disable_warning, src))
+ switch(dna.species.handle_can_equip(I, slot, disable_warning, src))
if(1) return 1
if(2) return 0 //if it returns 2, it wants no normal handling
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index d72f9e919e7..b021954a54c 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -15,10 +15,10 @@
handle_heartbeat()
handle_heartattack()
handle_drunk()
- species.handle_life(src)
+ dna.species.handle_life(src)
if(!client)
- species.handle_npc(src)
+ dna.species.handle_npc(src)
if(stat != DEAD)
//Stuff jammed in your limbs hurts
@@ -178,7 +178,7 @@
if(gene_stability < GENETIC_DAMAGE_STAGE_3)
gib()
- if(!(RADIMMUNE in species.species_traits))
+ if(!(RADIMMUNE in dna.species.species_traits))
if(radiation)
radiation = Clamp(radiation, 0, 200)
@@ -238,7 +238,7 @@
chest.add_autopsy_data("Radiation Poisoning", autopsy_damage)
/mob/living/carbon/human/breathe()
- if(!species.breathe(src))
+ if(!dna.species.breathe(src))
..()
/mob/living/carbon/human/check_breath(datum/gas_mixture/breath)
@@ -253,8 +253,8 @@
failed_last_breath = TRUE
- if(species)
- var/datum/species/S = species
+ if(dna.species)
+ var/datum/species/S = dna.species
if(S.breathid == "o2")
throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy)
@@ -332,39 +332,39 @@
bodytemperature += min((1-thermal_protection) * ((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR), BODYTEMP_HEATING_MAX)
// +/- 50 degrees from 310.15K is the 'safe' zone, where no damage is dealt.
- if(bodytemperature > species.heat_level_1)
+ if(bodytemperature > dna.species.heat_level_1)
//Body temperature is too hot.
if(status_flags & GODMODE) return 1 //godmode
- var/mult = species.heatmod
+ var/mult = dna.species.heatmod
- if(bodytemperature >= species.heat_level_1 && bodytemperature <= species.heat_level_2)
+ if(bodytemperature >= dna.species.heat_level_1 && bodytemperature <= dna.species.heat_level_2)
throw_alert("temp", /obj/screen/alert/hot, 1)
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_1, used_weapon = "High Body Temperature")
- if(bodytemperature > species.heat_level_2 && bodytemperature <= species.heat_level_3)
+ if(bodytemperature > dna.species.heat_level_2 && bodytemperature <= dna.species.heat_level_3)
throw_alert("temp", /obj/screen/alert/hot, 2)
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature")
- if(bodytemperature > species.heat_level_3 && bodytemperature < INFINITY)
+ if(bodytemperature > dna.species.heat_level_3 && bodytemperature < INFINITY)
throw_alert("temp", /obj/screen/alert/hot, 3)
if(on_fire)
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_3, used_weapon = "Fire")
else
take_overall_damage(burn=mult*HEAT_DAMAGE_LEVEL_2, used_weapon = "High Body Temperature")
- else if(bodytemperature < species.cold_level_1)
+ else if(bodytemperature < dna.species.cold_level_1)
if(status_flags & GODMODE)
return 1
if(stat == DEAD)
return 1
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
- var/mult = species.coldmod
- if(bodytemperature >= species.cold_level_2 && bodytemperature <= species.cold_level_1)
+ var/mult = dna.species.coldmod
+ if(bodytemperature >= dna.species.cold_level_2 && bodytemperature <= dna.species.cold_level_1)
throw_alert("temp", /obj/screen/alert/cold, 1)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, used_weapon = "Low Body Temperature")
- if(bodytemperature >= species.cold_level_3 && bodytemperature < species.cold_level_2)
+ if(bodytemperature >= dna.species.cold_level_3 && bodytemperature < dna.species.cold_level_2)
throw_alert("temp", /obj/screen/alert/cold, 2)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_2, used_weapon = "Low Body Temperature")
- if(bodytemperature > -INFINITY && bodytemperature < species.cold_level_3)
+ if(bodytemperature > -INFINITY && bodytemperature < dna.species.cold_level_3)
throw_alert("temp", /obj/screen/alert/cold, 3)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_3, used_weapon = "Low Body Temperature")
else
@@ -379,18 +379,18 @@
var/adjusted_pressure = calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
if(status_flags & GODMODE) return 1 //godmode
- if(adjusted_pressure >= species.hazard_high_pressure)
+ if(adjusted_pressure >= dna.species.hazard_high_pressure)
if(!(HEATRES in mutations))
- var/pressure_damage = min( ( (adjusted_pressure / species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
+ var/pressure_damage = min( ( (adjusted_pressure / dna.species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
take_overall_damage(brute=pressure_damage, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else
clear_alert("pressure")
- else if(adjusted_pressure >= species.warning_high_pressure)
+ else if(adjusted_pressure >= dna.species.warning_high_pressure)
throw_alert("pressure", /obj/screen/alert/highpressure, 1)
- else if(adjusted_pressure >= species.warning_low_pressure)
+ else if(adjusted_pressure >= dna.species.warning_low_pressure)
clear_alert("pressure")
- else if(adjusted_pressure >= species.hazard_low_pressure)
+ else if(adjusted_pressure >= dna.species.hazard_low_pressure)
throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
else
if(COLDRES in mutations)
@@ -430,13 +430,13 @@
//END FIRE CODE
/mob/living/carbon/human/proc/stabilize_temperature_from_calories()
- var/body_temperature_difference = species.body_temperature - bodytemperature
+ var/body_temperature_difference = dna.species.body_temperature - bodytemperature
- if(bodytemperature <= species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
+ if(bodytemperature <= dna.species.cold_level_1) //260.15 is 310.15 - 50, the temperature where you start to feel effects.
bodytemperature += max((body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR), BODYTEMP_AUTORECOVERY_MINIMUM)
- if(bodytemperature >= species.cold_level_1 && bodytemperature <= species.heat_level_1)
+ if(bodytemperature >= dna.species.cold_level_1 && bodytemperature <= dna.species.heat_level_1)
bodytemperature += body_temperature_difference * metabolism_efficiency / BODYTEMP_AUTORECOVERY_DIVISOR
- if(bodytemperature >= species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
+ if(bodytemperature >= dna.species.heat_level_1) //360.15 is 310.15 + 50, the temperature where you start to feel effects.
//We totally need a sweat system cause it totally makes sense...~
bodytemperature += min((body_temperature_difference / BODYTEMP_AUTORECOVERY_DIVISOR), -BODYTEMP_AUTORECOVERY_MINIMUM) //We're dealing with negative numbers
@@ -588,7 +588,7 @@
return 0 //godmode
//The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered.
- if(CAN_BE_FAT in species.species_traits)
+ if(CAN_BE_FAT in dna.species.species_traits)
if(FAT in mutations)
if(overeatduration < 100)
becomeSlim()
@@ -652,7 +652,7 @@
AdjustDizzy(-3)
AdjustJitter(-3)
- if(NO_INTORGANS in species.species_traits)
+ if(NO_INTORGANS in dna.species.species_traits)
return
handle_trace_chems()
@@ -766,10 +766,10 @@
//Vision //god knows why this is here
var/obj/item/organ/vision
- if(species.vision_organ)
- vision = get_int_organ(species.vision_organ)
+ if(dna.species.vision_organ)
+ vision = get_int_organ(dna.species.vision_organ)
- if(!species.vision_organ) // Presumably if a species has no vision organs, they see via some other means.
+ if(!dna.species.vision_organ) // Presumably if a species has no vision organs, they see via some other means.
SetEyeBlind(0)
blinded = 0
SetEyeBlurry(0)
@@ -860,10 +860,10 @@
remoteview_target = null
reset_perspective(null)
- species.handle_vision(src)
+ dna.species.handle_vision(src)
/mob/living/carbon/human/handle_hud_icons()
- species.handle_hud_icons(src)
+ dna.species.handle_hud_icons(src)
/mob/living/carbon/human/handle_random_events()
// Puke if toxloss is too high
@@ -907,7 +907,7 @@
if(times_fired % 5 == 1)
return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
- if(NO_BLOOD in species.species_traits)
+ if(NO_BLOOD in dna.species.species_traits)
return PULSE_NONE //No blood, no pulse.
if(stat == DEAD)
@@ -977,7 +977,7 @@
var/obj/item/clothing/mask/M = H.wear_mask
if(M && (M.flags_cover & MASKCOVERSMOUTH))
return
- if(NO_BREATHE in H.species.species_traits)
+ if(NO_BREATHE in H.dna.species.species_traits)
return //no puking if you can't smell!
// Humans can lack a mind datum, y'know
if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner"))
@@ -1054,9 +1054,9 @@
/mob/living/carbon/human/proc/can_heartattack()
- if(NO_BLOOD in species.species_traits)
+ if(NO_BLOOD in dna.species.species_traits)
return FALSE
- if(NO_INTORGANS in species.species_traits)
+ if(NO_INTORGANS in dna.species.species_traits)
return FALSE
return TRUE
diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm
index d4b160509ea..e16c67a56d0 100644
--- a/code/modules/mob/living/carbon/human/login.dm
+++ b/code/modules/mob/living/carbon/human/login.dm
@@ -1,7 +1,7 @@
/mob/living/carbon/human/Login()
..()
- if(species && species.ventcrawler)
+ if(dna.species && dna.species.ventcrawler)
to_chat(src, "You can ventcrawl! Use alt+click on vents to quickly travel about the station.")
update_pipe_vision()
return
diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm
index 7657a3be3be..7d408ce9199 100644
--- a/code/modules/mob/living/carbon/human/say.dm
+++ b/code/modules/mob/living/carbon/human/say.dm
@@ -42,7 +42,7 @@
if(has_brain_worms()) //Brain worms translate everything. Even mice and alien speak.
return 1
- if(species.can_understand(other))
+ if(dna.species.can_understand(other))
return 1
//These only pertain to common. Languages are handled by mob/say_understands()
@@ -87,7 +87,7 @@
/mob/living/carbon/human/IsVocal()
// how do species that don't breathe talk? magic, that's what.
- var/breathes = (!(NO_BREATHE in species.species_traits))
+ var/breathes = (!(NO_BREATHE in dna.species.species_traits))
var/obj/item/organ/internal/L = get_organ_slot("lungs")
if((breathes && !L) || breathes && L && (L.status & ORGAN_DEAD))
return FALSE
@@ -219,8 +219,8 @@
/mob/living/carbon/human/handle_speech_sound()
var/list/returns[2]
- if(species.speech_sounds && prob(species.speech_chance))
- returns[1] = sound(pick(species.speech_sounds))
+ if(dna.species.speech_sounds && prob(dna.species.speech_chance))
+ returns[1] = sound(pick(dna.species.speech_sounds))
returns[2] = 50
return returns
diff --git a/code/modules/mob/living/carbon/human/shock.dm b/code/modules/mob/living/carbon/human/shock.dm
index d8dc9356de7..e2d5dd79cec 100644
--- a/code/modules/mob/living/carbon/human/shock.dm
+++ b/code/modules/mob/living/carbon/human/shock.dm
@@ -23,7 +23,7 @@
/mob/living/carbon/human/proc/handle_shock()
if(status_flags & GODMODE) //godmode
return
- if(NO_PAIN in species.species_traits)
+ if(NO_PAIN in dna.species.species_traits)
return
updateshock()
diff --git a/code/modules/mob/living/carbon/human/species/abductor.dm b/code/modules/mob/living/carbon/human/species/abductor.dm
index 8aeb6f88a3d..d50be2e73e8 100644
--- a/code/modules/mob/living/carbon/human/species/abductor.dm
+++ b/code/modules/mob/living/carbon/human/species/abductor.dm
@@ -3,7 +3,6 @@
name_plural = "Abductors"
icobase = 'icons/mob/human_races/r_abductor.dmi'
deform = 'icons/mob/human_races/r_abductor.dmi'
- path = /mob/living/carbon/human/abductor
language = "Abductor Mindlink"
default_language = "Abductor Mindlink"
eyes = "blank_eyes"
@@ -16,7 +15,7 @@
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
)
- species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS)
+ species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS, NO_EXAMINE)
oxy_mod = 0
@@ -27,14 +26,14 @@
female_scream_sound = 'sound/goonstation/voice/male_scream.ogg'
female_cough_sounds = list('sound/effects/mob_effects/m_cougha.ogg','sound/effects/mob_effects/m_coughb.ogg', 'sound/effects/mob_effects/m_coughc.ogg')
female_sneeze_sound = 'sound/effects/mob_effects/sneeze.ogg' //Abductors always scream like guys
+ var/team = 1
+ var/scientist = FALSE // vars to not pollute spieces list with castes
/datum/species/abductor/can_understand(mob/other) //Abductors can understand everyone, but they can only speak over their mindlink to another team-member
- return 1
+ return TRUE
/datum/species/abductor/handle_post_spawn(mob/living/carbon/human/H)
H.gender = NEUTER
- if(H.mind)
- H.mind.abductor = new /datum/abductor
H.languages.Cut() //Under no condition should you be able to speak any language
H.add_language("Abductor Mindlink") //other than over the abductor's own mindlink
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/golem.dm b/code/modules/mob/living/carbon/human/species/golem.dm
index 74f3e97d879..772a5ca5ba6 100644
--- a/code/modules/mob/living/carbon/human/species/golem.dm
+++ b/code/modules/mob/living/carbon/human/species/golem.dm
@@ -5,7 +5,6 @@
icobase = 'icons/mob/human_races/r_golem.dmi'
deform = 'icons/mob/human_races/r_golem.dmi'
- default_language = "Galactic Common"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, NOGUNS)
oxy_mod = 0
diff --git a/code/modules/mob/living/carbon/human/species/monkey.dm b/code/modules/mob/living/carbon/human/species/monkey.dm
index c5003b21330..4128024a8c9 100644
--- a/code/modules/mob/living/carbon/human/species/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/monkey.dm
@@ -8,10 +8,11 @@
damage_overlays = 'icons/mob/human_races/masks/dam_monkey.dmi'
damage_mask = 'icons/mob/human_races/masks/dam_mask_monkey.dmi'
blood_mask = 'icons/mob/human_races/masks/blood_monkey.dmi'
- path = /mob/living/carbon/human/monkey
language = null
default_language = "Chimpanzee"
- greater_form = "Human"
+ species_traits = list(NO_EXAMINE)
+ skinned_type = /obj/item/stack/sheet/animalhide/monkey
+ greater_form = /datum/species/human
is_small = 1
has_fine_manipulation = 0
ventcrawler = 1
@@ -99,7 +100,7 @@
icobase = 'icons/mob/human_races/monkeys/r_farwa.dmi'
deform = 'icons/mob/human_races/monkeys/r_farwa.dmi'
- greater_form = "Tajaran"
+ greater_form = /datum/species/tajaran
default_language = "Farwa"
flesh_color = "#AFA59E"
base_color = "#000000"
@@ -123,7 +124,7 @@
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
deform = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
- greater_form = "Vulpkanin"
+ greater_form = /datum/species/vulpkanin
default_language = "Wolpin"
flesh_color = "#966464"
base_color = "#000000"
@@ -147,7 +148,7 @@
icobase = 'icons/mob/human_races/monkeys/r_neara.dmi'
deform = 'icons/mob/human_races/monkeys/r_neara.dmi'
- greater_form = "Skrell"
+ greater_form = /datum/species/skrell
default_language = "Neara"
flesh_color = "#8CD7A3"
blood_color = "#1D2CBF"
@@ -162,7 +163,7 @@
deform = 'icons/mob/human_races/monkeys/r_stok.dmi'
tail = "stoktail"
- greater_form = "Unathi"
+ greater_form = /datum/species/unathi
default_language = "Stok"
flesh_color = "#34AF10"
base_color = "#000000"
diff --git a/code/modules/mob/living/carbon/human/species/plasmaman.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm
index 692a23c470a..46270219735 100644
--- a/code/modules/mob/living/carbon/human/species/plasmaman.dm
+++ b/code/modules/mob/living/carbon/human/species/plasmaman.dm
@@ -6,6 +6,7 @@
//language = "Clatter"
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
+ skinned_type = /obj/item/stack/sheet/mineral/plasma // We're low on plasma, R&D! *eyes plasmaman co-worker intently*
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG
diff --git a/code/modules/mob/living/carbon/human/species/shadow.dm b/code/modules/mob/living/carbon/human/species/shadow.dm
index 7480d7e3a66..0e8bd2e91e2 100644
--- a/code/modules/mob/living/carbon/human/species/shadow.dm
+++ b/code/modules/mob/living/carbon/human/species/shadow.dm
@@ -5,7 +5,6 @@
icobase = 'icons/mob/human_races/r_shadow.dmi'
deform = 'icons/mob/human_races/r_shadow.dmi'
- default_language = "Galactic Common"
unarmed_type = /datum/unarmed_attack/claws
ignored_by = list(/mob/living/simple_animal/hostile/faithless)
diff --git a/code/modules/mob/living/carbon/human/species/skeleton.dm b/code/modules/mob/living/carbon/human/species/skeleton.dm
index 9da4d1222f6..8afc35f743a 100644
--- a/code/modules/mob/living/carbon/human/species/skeleton.dm
+++ b/code/modules/mob/living/carbon/human/species/skeleton.dm
@@ -6,13 +6,12 @@
icobase = 'icons/mob/human_races/r_skeleton.dmi'
deform = 'icons/mob/human_races/r_skeleton.dmi'
- path = /mob/living/carbon/human/skeleton
- default_language = "Galactic Common"
blood_color = "#FFFFFF"
flesh_color = "#E6E6C6"
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
+ skinned_type = /obj/item/stack/sheet/bone
oxy_mod = 0
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index 05a6d8f5297..282eed5acb9 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -1,11 +1,6 @@
-/*
- Datum-based species. Should make for much cleaner and easier to maintain mutantrace code.
-*/
-
/datum/species
var/name // Species name.
var/name_plural // Pluralized name (since "[name]s" is not always valid)
- var/path // Species path
var/icobase = 'icons/mob/human_races/r_human.dmi' // Normal icon set.
var/deform = 'icons/mob/human_races/r_def_human.dmi' // Mutated icon set.
@@ -18,8 +13,8 @@
var/blurb = "A completely nondescript species." // A brief lore summary for use in the chargen screen.
var/butt_sprite = "human"
- var/primitive_form // Lesser form, if any (ie. monkey for humans)
- var/greater_form // Greater form, if any, ie. human for monkeys.
+ var/datum/species/primitive_form = null // Lesser form, if any (ie. monkey for humans)
+ var/datum/species/greater_form = null // Greater form, if any, ie. human for monkeys.
var/tail // Name of tail image in species effects icon file.
var/datum/unarmed_attack/unarmed //For empty hand harm-intent attack
var/unarmed_type = /datum/unarmed_attack
@@ -80,6 +75,7 @@
var/clothing_flags = 0 // Underwear and socks.
var/exotic_blood
+ var/skinned_type
var/bodyflags = 0
var/dietflags = 0 // Make sure you set this, otherwise it won't be able to digest a lot of foods
@@ -94,6 +90,7 @@
//Used in icon caching.
var/race_key = 0
var/icon/icon_template
+
var/is_small
var/show_ssd = 1
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
@@ -165,11 +162,11 @@
unarmed = new unarmed_type()
-/datum/species/proc/get_random_name(var/gender)
+/datum/species/proc/get_random_name(gender)
var/datum/language/species_language = all_languages[language]
return species_language.get_random_name(gender)
-/datum/species/proc/create_organs(var/mob/living/carbon/human/H) //Handles creation of mob organs.
+/datum/species/proc/create_organs(mob/living/carbon/human/H) //Handles creation of mob organs.
QDEL_LIST(H.internal_organs)
QDEL_LIST(H.bodyparts)
@@ -262,28 +259,24 @@
. -= 2
return .
-/datum/species/proc/handle_post_spawn(var/mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
+/datum/species/proc/handle_post_spawn(mob/living/carbon/C) //Handles anything not already covered by basic species assignment.
grant_abilities(C)
+
+/datum/species/proc/updatespeciescolor(mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
return
-/datum/species/proc/updatespeciescolor(var/mob/living/carbon/human/H) //Handles changing icobase for species that have multiple skin colors.
- return
-
-/datum/species/proc/grant_abilities(var/mob/living/carbon/human/H)
+/datum/species/proc/grant_abilities(mob/living/carbon/human/H)
for(var/proc/ability in species_abilities)
H.verbs += ability
- return
-/datum/species/proc/handle_pre_change(var/mob/living/carbon/human/H)
- if(H.butcher_results)//clear it out so we don't butcher a actual human.
+/datum/species/proc/handle_pre_change(mob/living/carbon/human/H)
+ if(H.butcher_results) //clear it out so we don't butcher a actual human.
H.butcher_results = null
remove_abilities(H)
- return
-/datum/species/proc/remove_abilities(var/mob/living/carbon/human/H)
+/datum/species/proc/remove_abilities(mob/living/carbon/human/H)
for(var/proc/ability in species_abilities)
H.verbs -= ability
- return
// Do species-specific reagent handling here
// Return 1 if it should do normal processing too
@@ -294,12 +287,12 @@
if(R.id == exotic_blood)
H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_NORMAL)
H.reagents.del_reagent(R.id)
- return 0
- return 1
+ return FALSE
+ return TRUE
// For special snowflake species effects
// (Slime People changing color based on the reagents they consume)
-/datum/species/proc/handle_life(var/mob/living/carbon/human/H)
+/datum/species/proc/handle_life(mob/living/carbon/human/H)
if((NO_BREATHE in species_traits) || (BREATHLESS in H.mutations))
H.setOxyLoss(0)
H.SetLoseBreath(0)
@@ -311,34 +304,29 @@
/datum/species/proc/handle_dna(var/mob/living/carbon/C, var/remove) //Handles DNA mutations, as that doesn't work at init. Make sure you call genemutcheck on any blocks changed here
return
-// Used for species-specific names (Vox, etc)
-/datum/species/proc/makeName(var/gender,var/mob/living/carbon/human/H=null)
- if(gender==FEMALE) return capitalize(pick(first_names_female)) + " " + capitalize(pick(last_names))
- else return capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names))
-
-/datum/species/proc/handle_death(var/mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
+/datum/species/proc/handle_death(mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
return
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.help_act(user, target))//adminfu only...
- return 1
+ return TRUE
if(target.health >= config.health_threshold_crit)
target.help_shake_act(user)
- return 1
+ return TRUE
else
user.do_cpr(target)
/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.grab_act(user, target))
- return 1
+ return TRUE
else
target.grabbedby(user)
- return 1
+ return TRUE
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
//Vampire code
if(user.mind && user.mind.vampire && (user.mind in ticker.mode.vampires) && !user.mind.vampire.draining && user.zone_sel && user.zone_sel.selecting == "head" && target != user)
- if((NO_BLOOD in target.species.species_traits) || target.species.exotic_blood || !target.blood_volume)
+ if((NO_BLOOD in target.dna.species.species_traits) || target.dna.species.exotic_blood || !target.blood_volume)
to_chat(user, "They have no blood!")
return
if(target.mind && target.mind.vampire && (target.mind in ticker.mode.vampires))
@@ -356,9 +344,9 @@
return
//end vampire codes
if(attacker_style && attacker_style.harm_act(user, target))
- return 1
+ return TRUE
else
- var/datum/unarmed_attack/attack = user.species.unarmed
+ var/datum/unarmed_attack/attack = user.dna.species.unarmed
user.do_attack_animation(target, attack.animation_type)
add_attack_logs(user, target, "Melee attacked with fists", target.ckey ? null : ATKLOG_ALL)
@@ -368,12 +356,12 @@
else
target.LAssailant = user
- var/damage = rand(user.species.punchdamagelow, user.species.punchdamagehigh)
+ var/damage = rand(user.dna.species.punchdamagelow, user.dna.species.punchdamagehigh)
damage += attack.damage
if(!damage)
playsound(target.loc, attack.miss_sound, 25, 1, -1)
target.visible_message("[user] tried to [pick(attack.attack_verb)] [target]!")
- return 0
+ return FALSE
var/obj/item/organ/external/affecting = target.get_organ(ran_zone(user.zone_sel.selecting))
@@ -384,7 +372,7 @@
target.visible_message("[user] [pick(attack.attack_verb)]ed [target]!")
target.apply_damage(damage, BRUTE, affecting, armor_block, sharp = attack.sharp) //moving this back here means Armalis are going to knock you down 70% of the time, but they're pure adminbus anyway.
- if((target.stat != DEAD) && damage >= user.species.punchstunthreshold)
+ if((target.stat != DEAD) && damage >= user.dna.species.punchstunthreshold)
target.visible_message("[user] has weakened [target]!", \
"[user] has weakened [target]!")
target.apply_effect(4, WEAKEN, armor_block)
@@ -394,7 +382,7 @@
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(attacker_style && attacker_style.disarm_act(user, target))
- return 1
+ return TRUE
else
add_attack_logs(user, target, "Disarmed", ATKLOG_ALL)
user.do_attack_animation(target, ATTACK_EFFECT_DISARM)
@@ -467,7 +455,7 @@
if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(0, M.name, attack_type = UNARMED_ATTACK))
add_attack_logs(M, H, "Melee attacked with fists (miss/block)")
H.visible_message("[M] attempted to touch [H]!")
- return 0
+ return FALSE
switch(M.a_intent)
if(INTENT_HELP)
@@ -491,11 +479,11 @@
/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H, visualsOnly = FALSE)
return
-/datum/species/proc/can_understand(var/mob/other)
+/datum/species/proc/can_understand(mob/other)
return
// Called in life() when the mob has no client.
-/datum/species/proc/handle_npc(var/mob/living/carbon/human/H)
+/datum/species/proc/handle_npc(mob/living/carbon/human/H)
return
//Species unarmed attacks
@@ -529,7 +517,7 @@
damage = 6
/datum/species/proc/handle_can_equip(obj/item/I, slot, disable_warning = 0, mob/living/carbon/human/user)
- return 0
+ return FALSE
/datum/species/proc/handle_vision(mob/living/carbon/human/H)
// Right now this just handles blind, blurry, and similar states
@@ -635,7 +623,7 @@ Returns the path corresponding to the corresponding organ
It'll return null if the organ doesn't correspond, so include null checks when using this!
*/
//Fethas Todo:Do i need to redo this?
-/datum/species/proc/return_organ(var/organ_slot)
+/datum/species/proc/return_organ(organ_slot)
if(!(organ_slot in has_organ))
return null
return has_organ[organ_slot]
@@ -733,4 +721,4 @@ It'll return null if the organ doesn't correspond, so include null checks when u
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source)
if(abs(temperature - M.bodytemperature) > 10) //If our water and mob temperature varies by more than 10K, cool or/ heat them appropriately
- M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
+ M.bodytemperature = (temperature + M.bodytemperature) * 0.5 //Approximation for gradual heating or cooling
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index 22b79c34dcd..de555e30700 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -3,10 +3,10 @@
name_plural = "Humans"
icobase = 'icons/mob/human_races/r_human.dmi'
deform = 'icons/mob/human_races/r_def_human.dmi'
- primitive_form = "Monkey"
- path = /mob/living/carbon/human/human
+ primitive_form = /datum/species/monkey
language = "Sol Common"
species_traits = list(LIPS, CAN_BE_FAT)
+ skinned_type = /obj/item/stack/sheet/animalhide/human
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
dietflags = DIET_OMNI
@@ -24,12 +24,11 @@
name_plural = "Unathi"
icobase = 'icons/mob/human_races/r_lizard.dmi'
deform = 'icons/mob/human_races/r_def_lizard.dmi'
- path = /mob/living/carbon/human/unathi
- default_language = "Galactic Common"
language = "Sinta'unathi"
tail = "sogtail"
+ skinned_type = /obj/item/stack/sheet/animalhide/lizard
unarmed_type = /datum/unarmed_attack/claws
- primitive_form = "Stok"
+ primitive_form = /datum/species/monkey/unathi
blurb = "A heavily reptillian species, Unathi (or 'Sinta as they call themselves) hail from the \
Uuosa-Eso system, which roughly translates to 'burning mother'.
Coming from a harsh, radioactive \
@@ -118,10 +117,9 @@
name_plural = "Tajaran"
icobase = 'icons/mob/human_races/r_tajaran.dmi'
deform = 'icons/mob/human_races/r_def_tajaran.dmi'
- path = /mob/living/carbon/human/tajaran
- default_language = "Galactic Common"
language = "Siik'tajr"
tail = "tajtail"
+ skinned_type = /obj/item/stack/sheet/fur
unarmed_type = /datum/unarmed_attack/claws
blurb = "The Tajaran race is a species of feline-like bipeds hailing from the planet of Ahdomai in the \
@@ -138,7 +136,7 @@
heat_level_2 = 380
heat_level_3 = 440
- primitive_form = "Farwa"
+ primitive_form = /datum/species/monkey/tajaran
species_traits = list(LIPS, CAN_BE_FAT)
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
@@ -178,11 +176,10 @@
name_plural = "Vulpkanin"
icobase = 'icons/mob/human_races/r_vulpkanin.dmi'
deform = 'icons/mob/human_races/r_vulpkanin.dmi'
- path = /mob/living/carbon/human/vulpkanin
- default_language = "Galactic Common"
language = "Canilunzt"
- primitive_form = "Wolpin"
+ primitive_form = /datum/species/monkey/vulpkanin
tail = "vulptail"
+ skinned_type = /obj/item/stack/sheet/fur
unarmed_type = /datum/unarmed_attack/claws
blurb = "Vulpkanin are a species of sharp-witted canine-pideds residing on the planet Altam just barely within the \
@@ -232,10 +229,8 @@
name_plural = "Skrell"
icobase = 'icons/mob/human_races/r_skrell.dmi'
deform = 'icons/mob/human_races/r_def_skrell.dmi'
- path = /mob/living/carbon/human/skrell
- default_language = "Galactic Common"
language = "Skrellian"
- primitive_form = "Neara"
+ primitive_form = /datum/species/monkey/skrell
blurb = "An amphibious species, Skrell come from the star system known as Qerr'Vallis, which translates to 'Star of \
the royals' or 'Light of the Crown'.
Skrell are a highly advanced and logical race who live under the rule \
@@ -281,9 +276,6 @@
name_plural = "Vox"
icobase = 'icons/mob/human_races/vox/r_vox.dmi'
deform = 'icons/mob/human_races/vox/r_def_vox.dmi'
- path = /mob/living/carbon/human/vox
-
- default_language = "Galactic Common"
language = "Vox-pidgin"
tail = "voxtail"
speech_sounds = list('sound/voice/shriek1.ogg')
@@ -348,7 +340,7 @@
"brain" = /obj/item/organ/internal/brain,
"appendix" = /obj/item/organ/internal/appendix,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
- "stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
+ "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
suicide_messages = list(
@@ -361,16 +353,6 @@
/datum/species/vox/handle_death(var/mob/living/carbon/human/H)
H.stop_tail_wagging(1)
-/datum/species/vox/makeName(var/gender,var/mob/living/carbon/human/H=null)
- var/sounds = rand(2,8)
- var/i = 0
- var/newname = ""
-
- while(i<=sounds)
- i++
- newname += pick(vox_name_syllables)
- return capitalize(newname)
-
/datum/species/vox/after_equip_job(datum/job/J, mob/living/carbon/human/H)
if(!H.mind || !H.mind.assigned_role || H.mind.assigned_role != "Clown" && H.mind.assigned_role != "Mime")
H.unEquip(H.wear_mask)
@@ -393,7 +375,7 @@
..()
/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H, var/owner_sensitive = 1) //Handling species-specific skin-tones for the Vox race.
- if(H.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
+ if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE) //Making sure we don't break Armalis.
var/new_icobase = 'icons/mob/human_races/vox/r_vox.dmi' //Default Green Vox.
var/new_deform = 'icons/mob/human_races/vox/r_def_vox.dmi' //Default Green Vox.
switch(H.s_tone)
@@ -441,7 +423,6 @@
name_plural = "Vox Armalis"
icobase = 'icons/mob/human_races/r_armalis.dmi'
deform = 'icons/mob/human_races/r_armalis.dmi'
- path = /mob/living/carbon/human/voxarmalis
unarmed_type = /datum/unarmed_attack/claws/armalis
warning_low_pressure = 50
@@ -479,7 +460,7 @@
"kidneys" = /obj/item/organ/internal/kidneys,
"brain" = /obj/item/organ/internal/brain,
"eyes" = /obj/item/organ/internal/eyes, //Default darksight of 2.
- "stack" = /obj/item/organ/internal/stack/vox //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
+ "stack" = /obj/item/organ/internal/stack //Not the same as the cortical stack implant Vox Raiders spawn with. The cortical stack implant is used
) //for determining the success of the heist game-mode's 'leave nobody behind' objective, while this is just an organ.
suicide_messages = list(
@@ -497,8 +478,6 @@
name_plural = "Kidan"
icobase = 'icons/mob/human_races/r_kidan.dmi'
deform = 'icons/mob/human_races/r_def_kidan.dmi'
- path = /mob/living/carbon/human/kidan
- default_language = "Galactic Common"
language = "Chittin"
unarmed_type = /datum/unarmed_attack/claws
@@ -539,11 +518,9 @@
/datum/species/slime
name = "Slime People"
name_plural = "Slime People"
- default_language = "Galactic Common"
language = "Bubblish"
icobase = 'icons/mob/human_races/r_slime.dmi'
deform = 'icons/mob/human_races/r_slime.dmi'
- path = /mob/living/carbon/human/slime
remains_type = /obj/effect/decal/remains/slime
// More sensitive to the cold
@@ -580,7 +557,7 @@
"is ripping out their own core!",
"is turning a dull, brown color and melting into a puddle!")
- var/list/mob/living/carbon/human/recolor_list = list()
+ var/reagent_skin_coloring = FALSE
var/datum/action/innate/regrow/grow = new()
@@ -609,7 +586,7 @@
#define SLIMEPERSON_ICON_UPDATE_PERIOD 200 // 20 seconds
#define SLIMEPERSON_BLOOD_SCALING_FACTOR 5 // Used to adjust how much of an effect the blood has on the rate of color change. Higher is slower.
// Slowly shifting to the color of the reagents
- if((H in recolor_list) && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER)
+ if(reagent_skin_coloring && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER)
var/blood_amount = H.blood_volume
var/r_color = mix_color_from_reagents(H.reagents.reagent_list)
var/new_body_color = BlendRGB(r_color, H.skin_colour, (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume)))
@@ -617,7 +594,7 @@
if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller
for(var/organname in H.bodyparts_by_name)
var/obj/item/organ/external/E = H.bodyparts_by_name[organname]
- if(istype(E) && E.dna.species == "Slime People")
+ if(istype(E) && E.dna && istype(E.dna.species, /datum/species/slime))
E.sync_colour_to_human(H)
H.update_hair(0)
H.update_body()
@@ -627,19 +604,19 @@
#undef SLIMEPERSON_ICON_UPDATE_PERIOD
#undef SLIMEPERSON_BLOOD_SCALING_FACTOR
-/mob/living/carbon/human/proc/toggle_recolor(var/silent = 0)
- var/datum/species/slime/S = all_species[get_species()]
- if(!istype(S))
+/mob/living/carbon/human/proc/toggle_recolor(silent = FALSE)
+ if(!isslimeperson(src))
if(!silent)
to_chat(src, "You're not a slime person!")
return
- if(src in S.recolor_list)
- S.recolor_list -= src
+ var/datum/species/slime/S = dna.species
+ if(S.reagent_skin_coloring)
+ S.reagent_skin_coloring = TRUE
if(!silent)
to_chat(src, "You adjust your internal chemistry to filter out pigments from things you consume.")
else
- S.recolor_list += src
+ S.reagent_skin_coloring = TRUE
if(!silent)
to_chat(src, "You adjust your internal chemistry to permit pigments in chemicals you consume to tint you.")
@@ -672,7 +649,7 @@
for(var/l in bodyparts_by_name)
var/obj/item/organ/external/E = bodyparts_by_name[l]
if(!istype(E))
- var/list/limblist = species.has_limbs[l]
+ var/list/limblist = dna.species.has_limbs[l]
var/obj/item/organ/external/limb = limblist["path"]
var/parent_organ = initial(limb.parent_organ)
var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ]
@@ -708,7 +685,7 @@
stored_burn = doomedStump.burn_dam
qdel(O)
- var/limb_list = species.has_limbs[chosen_limb]
+ var/limb_list = dna.species.has_limbs[chosen_limb]
var/obj/item/organ/external/limb_path = limb_list["path"]
// Parent check
var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)]
@@ -734,9 +711,9 @@
#undef SLIMEPERSON_MINHUNGER
#undef SLIMEPERSON_REGROWTHDELAY
-/datum/species/slime/handle_pre_change(var/mob/living/carbon/human/H)
+/datum/species/slime/handle_pre_change(mob/living/carbon/human/H)
..()
- if(H in recolor_list)
+ if(reagent_skin_coloring)
H.toggle_recolor(silent = 1)
/datum/species/grey
@@ -744,7 +721,6 @@
name_plural = "Greys"
icobase = 'icons/mob/human_races/r_grey.dmi'
deform = 'icons/mob/human_races/r_def_grey.dmi'
- default_language = "Galactic Common"
language = "Psionic Communication"
eyes = "grey_eyes_s"
butt_sprite = "grey"
@@ -801,8 +777,6 @@
name_plural = "Dionaea"
icobase = 'icons/mob/human_races/r_diona.dmi'
deform = 'icons/mob/human_races/r_def_plant.dmi'
- path = /mob/living/carbon/human/diona
- default_language = "Galactic Common"
language = "Rootspeak"
speech_sounds = list('sound/voice/dionatalk1.ogg') //Credit https://www.youtube.com/watch?v=ufnvlRjsOTI [0:13 - 0:16]
speech_chance = 20
@@ -836,6 +810,7 @@
default_hair_colour = "#000000"
dietflags = 0 //Diona regenerate nutrition in light and water, no diet necessary
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
+ skinned_type = /obj/item/stack/sheet/wood
oxy_mod = 0
@@ -924,10 +899,9 @@
icobase = 'icons/mob/human_races/r_machine.dmi'
deform = 'icons/mob/human_races/r_machine.dmi'
- path = /mob/living/carbon/human/machine
- default_language = "Galactic Common"
language = "Trinary"
remains_type = /obj/effect/decal/remains/robot
+ skinned_type = /obj/item/stack/sheet/metal // Let's grind up IPCs for station resources!
eyes = "blank_eyes"
brute_mod = 2.28 // 100% * 2.28 * 0.66 (robolimbs) ~= 150%
@@ -1010,8 +984,6 @@
name_plural = "Drask"
icobase = 'icons/mob/human_races/r_drask.dmi'
deform = 'icons/mob/human_races/r_drask.dmi'
- path = /mob/living/carbon/human/drask
- default_language = "Galactic Common"
language = "Orluum"
eyes = "drask_eyes_s"
diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm
index 5f74f202603..e7a65129017 100644
--- a/code/modules/mob/living/carbon/human/status_procs.dm
+++ b/code/modules/mob/living/carbon/human/status_procs.dm
@@ -1,19 +1,19 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
- if(species)
- amount = amount * species.stun_mod
+ if(dna.species)
+ amount = amount * dna.species.stun_mod
..()
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 3a1ac4d3a83..af134052a66 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -185,7 +185,7 @@ var/global/list/damage_icon_parts = list()
previous_damage_appearance = damage_appearance
- var/icon/standing = new /icon(species.damage_overlays, "00")
+ var/icon/standing = new /icon(dna.species.damage_overlays, "00")
var/image/standing_image = new /image("icon" = standing)
@@ -194,12 +194,12 @@ var/global/list/damage_icon_parts = list()
O.update_icon()
if(O.damage_state == "00") continue
var/icon/DI
- var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
+ var/cache_index = "[O.damage_state]/[O.icon_name]/[dna.species.blood_color]/[dna.species.name]"
if(damage_icon_parts[cache_index] == null)
- DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
- DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
- DI.Blend(species.blood_color, ICON_MULTIPLY)
+ DI = new /icon(dna.species.damage_overlays, O.damage_state) // the damage icon for whole human
+ DI.Blend(new /icon(dna.species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
+ DI.Blend(dna.species.blood_color, ICON_MULTIPLY)
damage_icon_parts[cache_index] = DI
else
DI = damage_icon_parts[cache_index]
@@ -220,15 +220,15 @@ var/global/list/damage_icon_parts = list()
var/hulk = (HULK in mutations)
var/skeleton = (SKELETON in mutations)
- if(species && species.bodyflags & HAS_ICON_SKIN_TONE)
- species.updatespeciescolor(src)
+ if(dna.species && dna.species.bodyflags & HAS_ICON_SKIN_TONE)
+ dna.species.updatespeciescolor(src)
//CACHING: Generate an index key from visible bodyparts.
//0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic.
//Create a new, blank icon for our mob to use.
if(stand_icon)
qdel(stand_icon)
- stand_icon = new(species.icon_template ? species.icon_template : 'icons/mob/human.dmi',"blank")
+ stand_icon = new(dna.species.icon_template ? dna.species.icon_template : 'icons/mob/human.dmi',"blank")
var/icon_key = ""
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
@@ -237,7 +237,7 @@ var/global/list/damage_icon_parts = list()
else
icon_key += "#000000"
- for(var/organ_tag in species.has_limbs)
+ for(var/organ_tag in dna.species.has_limbs)
var/obj/item/organ/external/part = bodyparts_by_name[organ_tag]
if(isnull(part))
icon_key += "0"
@@ -249,7 +249,7 @@ var/global/list/damage_icon_parts = list()
icon_key += "1"
if(part)
- icon_key += "[part.species.race_key]"
+ icon_key += "[part.dna.species.race_key]"
icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
if(part.s_col)
@@ -307,7 +307,7 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the user's species is flagged to have a tail that needs to be overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
overlays_standing[LIMBS_LAYER] = image(stand_icon) // Diverts limbs to their own layer so they can overlay things (i.e. tails).
else
overlays_standing[LIMBS_LAYER] = null // So we don't get the old species' sprite splatted on top of the new one's
@@ -316,18 +316,18 @@ var/global/list/damage_icon_parts = list()
overlays_standing[UNDERWEAR_LAYER] = null
var/icon/underwear_standing = new/icon('icons/mob/underwear.dmi',"nude")
- if(underwear && species.clothing_flags & HAS_UNDERWEAR)
+ if(underwear && dna.species.clothing_flags & HAS_UNDERWEAR)
var/datum/sprite_accessory/underwear/U = underwear_list[underwear]
if(U)
underwear_standing.Blend(new /icon(U.icon, "uw_[U.icon_state]_s"), ICON_OVERLAY)
- if(undershirt && species.clothing_flags & HAS_UNDERSHIRT)
+ if(undershirt && dna.species.clothing_flags & HAS_UNDERSHIRT)
var/datum/sprite_accessory/undershirt/U2 = undershirt_list[undershirt]
if(U2)
underwear_standing.Blend(new /icon(U2.icon, "us_[U2.icon_state]_s"), ICON_OVERLAY)
- if(socks && species.clothing_flags & HAS_SOCKS)
+ if(socks && dna.species.clothing_flags & HAS_SOCKS)
var/datum/sprite_accessory/socks/U3 = socks_list[socks]
if(U3)
underwear_standing.Blend(new /icon(U3.icon, "sk_[U3.icon_state]_s"), ICON_OVERLAY)
@@ -339,7 +339,7 @@ var/global/list/damage_icon_parts = list()
if(update_icons)
update_icons()
- if(lip_style && (LIPS in species.species_traits))
+ if(lip_style && (LIPS in dna.species.species_traits))
var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s")
lips.Blend(lip_color, ICON_ADD)
@@ -369,7 +369,7 @@ var/global/list/damage_icon_parts = list()
if(chest_organ && m_styles["body"])
var/body_marking = m_styles["body"]
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
- if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
+ if(body_marking_style && body_marking_style.species_allowed && (dna.species.name in body_marking_style.species_allowed))
var/icon/b_marking_s = new/icon("icon" = body_marking_style.icon, "icon_state" = "[body_marking_style.icon_state]_s")
if(body_marking_style.do_colouration)
b_marking_s.Blend(m_colours["body"], ICON_ADD)
@@ -379,7 +379,7 @@ var/global/list/damage_icon_parts = list()
if(head_organ && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
var/head_marking = m_styles["head"]
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
- if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
+ if(head_marking_style && head_marking_style.species_allowed && (head_organ.dna.species.name in head_marking_style.species_allowed))
var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
if(head_marking_style.do_colouration)
h_marking_s.Blend(m_colours["head"], ICON_ADD)
@@ -407,10 +407,10 @@ var/global/list/damage_icon_parts = list()
//base icons
var/icon/head_accessory_standing = new /icon('icons/mob/body_accessory.dmi',"accessory_none_s")
- if(head_organ.ha_style && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY))
+ if(head_organ.ha_style && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY))
var/datum/sprite_accessory/head_accessory/head_accessory_style = head_accessory_styles_list[head_organ.ha_style]
if(head_accessory_style && head_accessory_style.species_allowed)
- if(head_organ.species.name in head_accessory_style.species_allowed)
+ if(head_organ.dna.species.name in head_accessory_style.species_allowed)
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
if(head_accessory_style.do_colouration)
head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD)
@@ -448,12 +448,12 @@ var/global/list/damage_icon_parts = list()
if(head_organ.h_style && !(head && (head.flags & BLOCKHEADHAIR) && !(isSynthetic())))
var/datum/sprite_accessory/hair/hair_style = hair_styles_full_list[head_organ.h_style]
- //if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN
+ //if(!src.get_int_organ(/obj/item/organ/internal/brain) && !ismachine(src))//make it obvious we have NO BRAIN
// hair_standing.Blend(debrained_s, ICON_OVERLAY)
if(hair_style && hair_style.species_allowed)
- if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
+ if((head_organ.dna.species.name in hair_style.species_allowed) || (head_organ.dna.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- if(head_organ.species.name == "Slime People") // I am el worstos
+ if(istype(head_organ.dna.species, /datum/species/slime)) // I am el worstos
hair_s.Blend("[skin_colour]A0", ICON_AND)
else if(hair_style.do_colouration)
hair_s.Blend(head_organ.hair_colour, ICON_ADD)
@@ -497,9 +497,9 @@ var/global/list/damage_icon_parts = list()
if(head_organ.f_style)
var/datum/sprite_accessory/facial_hair/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
if(facial_hair_style && facial_hair_style.species_allowed)
- if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
+ if((head_organ.dna.species.name in facial_hair_style.species_allowed) || (head_organ.dna.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(head_organ.species.name == "Slime People") // I am el worstos
+ if(istype(head_organ.dna.species, /datum/species/slime)) // I am el worstos
facial_s.Blend("[skin_colour]A0", ICON_AND)
else if(facial_hair_style.do_colouration)
facial_s.Blend(head_organ.facial_colour, ICON_ADD)
@@ -644,11 +644,11 @@ var/global/list/damage_icon_parts = list()
if(w_uniform.icon_override)
standing.icon = w_uniform.icon_override
- else if(w_uniform.sprite_sheets && w_uniform.sprite_sheets[species.name])
- standing.icon = w_uniform.sprite_sheets[species.name]
+ else if(w_uniform.sprite_sheets && w_uniform.sprite_sheets[dna.species.name])
+ standing.icon = w_uniform.sprite_sheets[dna.species.name]
if(w_uniform.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "uniformblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "uniformblood")
bloodsies.color = w_uniform.blood_color
standing.overlays += bloodsies
@@ -658,8 +658,8 @@ var/global/list/damage_icon_parts = list()
if(!tie_color) tie_color = A.icon_state
if(A.icon_override)
standing.overlays += image("icon" = A.icon_override, "icon_state" = "[A.icon_state]")
- else if(A.sprite_sheets && A.sprite_sheets[species.name])
- standing.overlays += image("icon" = A.sprite_sheets[species.name], "icon_state" = "[A.icon_state]")
+ else if(A.sprite_sheets && A.sprite_sheets[dna.species.name])
+ standing.overlays += image("icon" = A.sprite_sheets[dna.species.name], "icon_state" = "[A.icon_state]")
else
standing.overlays += image("icon" = 'icons/mob/ties.dmi', "icon_state" = "[tie_color]")
@@ -720,19 +720,19 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(gloves.icon_override)
standing = image("icon" = gloves.icon_override, "icon_state" = "[t_state]")
- else if(gloves.sprite_sheets && gloves.sprite_sheets[species.name])
- standing = image("icon" = gloves.sprite_sheets[species.name], "icon_state" = "[t_state]")
+ else if(gloves.sprite_sheets && gloves.sprite_sheets[dna.species.name])
+ standing = image("icon" = gloves.sprite_sheets[dna.species.name], "icon_state" = "[t_state]")
else
standing = image("icon" = 'icons/mob/hands.dmi', "icon_state" = "[t_state]")
if(gloves.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands")
bloodsies.color = gloves.blood_color
standing.overlays += bloodsies
overlays_standing[GLOVES_LAYER] = standing
else
if(blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "bloodyhands")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "bloodyhands")
bloodsies.color = hand_blood_color
overlays_standing[GLOVES_LAYER] = bloodsies
else
@@ -759,8 +759,8 @@ var/global/list/damage_icon_parts = list()
if(glasses.icon_override)
new_glasses = image("icon" = glasses.icon_override, "icon_state" = "[glasses.icon_state]")
- else if(glasses.sprite_sheets && glasses.sprite_sheets[head_organ.species.name])
- new_glasses = image("icon" = glasses.sprite_sheets[head_organ.species.name], "icon_state" = "[glasses.icon_state]")
+ else if(glasses.sprite_sheets && glasses.sprite_sheets[head_organ.dna.species.name])
+ new_glasses = image("icon" = glasses.sprite_sheets[head_organ.dna.species.name], "icon_state" = "[glasses.icon_state]")
else
new_glasses = image("icon" = 'icons/mob/eyes.dmi', "icon_state" = "[glasses.icon_state]")
@@ -795,9 +795,9 @@ var/global/list/damage_icon_parts = list()
if(l_ear.icon_override)
t_type = "[t_type]_l"
overlays_standing[EARS_LAYER] = image("icon" = l_ear.icon_override, "icon_state" = "[t_type]")
- else if(l_ear.sprite_sheets && l_ear.sprite_sheets[species.name])
+ else if(l_ear.sprite_sheets && l_ear.sprite_sheets[dna.species.name])
t_type = "[t_type]_l"
- overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[species.name], "icon_state" = "[t_type]")
+ overlays_standing[EARS_LAYER] = image("icon" = l_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]")
else
overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
@@ -811,9 +811,9 @@ var/global/list/damage_icon_parts = list()
if(r_ear.icon_override)
t_type = "[t_type]_r"
overlays_standing[EARS_LAYER] = image("icon" = r_ear.icon_override, "icon_state" = "[t_type]")
- else if(r_ear.sprite_sheets && r_ear.sprite_sheets[species.name])
+ else if(r_ear.sprite_sheets && r_ear.sprite_sheets[dna.species.name])
t_type = "[t_type]_r"
- overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[species.name], "icon_state" = "[t_type]")
+ overlays_standing[EARS_LAYER] = image("icon" = r_ear.sprite_sheets[dna.species.name], "icon_state" = "[t_type]")
else
overlays_standing[EARS_LAYER] = image("icon" = 'icons/mob/ears.dmi', "icon_state" = "[t_type]")
@@ -837,20 +837,20 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(shoes.icon_override)
standing = image("icon" = shoes.icon_override, "icon_state" = "[shoes.icon_state]")
- else if(shoes.sprite_sheets && shoes.sprite_sheets[species.name])
- standing = image("icon" = shoes.sprite_sheets[species.name], "icon_state" = "[shoes.icon_state]")
+ else if(shoes.sprite_sheets && shoes.sprite_sheets[dna.species.name])
+ standing = image("icon" = shoes.sprite_sheets[dna.species.name], "icon_state" = "[shoes.icon_state]")
else
standing = image("icon" = 'icons/mob/feet.dmi', "icon_state" = "[shoes.icon_state]")
if(shoes.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = shoes.blood_color
standing.overlays += bloodsies
overlays_standing[SHOES_LAYER] = standing
else
if(feet_blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "shoeblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "shoeblood")
bloodsies.color = feet_blood_color
overlays_standing[SHOES_LAYER] = bloodsies
else
@@ -891,13 +891,13 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(head.icon_override)
standing = image("icon" = head.icon_override, "icon_state" = "[head.icon_state]")
- else if(head.sprite_sheets && head.sprite_sheets[species.name])
- standing = image("icon" = head.sprite_sheets[species.name], "icon_state" = "[head.icon_state]")
+ else if(head.sprite_sheets && head.sprite_sheets[dna.species.name])
+ standing = image("icon" = head.sprite_sheets[dna.species.name], "icon_state" = "[head.icon_state]")
else
standing = image("icon" = 'icons/mob/head.dmi', "icon_state" = "[head.icon_state]")
if(head.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "helmetblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "helmetblood")
bloodsies.color = head.blood_color
standing.overlays += bloodsies
overlays_standing[HEAD_LAYER] = standing
@@ -925,8 +925,8 @@ var/global/list/damage_icon_parts = list()
if(belt.icon_override)
t_state = "[t_state]_be"
overlays_standing[BELT_LAYER] = image("icon" = belt.icon_override, "icon_state" = "[t_state]")
- else if(belt.sprite_sheets && belt.sprite_sheets[species.name])
- overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[species.name], "icon_state" = "[t_state]")
+ else if(belt.sprite_sheets && belt.sprite_sheets[dna.species.name])
+ overlays_standing[BELT_LAYER] = image("icon" = belt.sprite_sheets[dna.species.name], "icon_state" = "[t_state]")
else
overlays_standing[BELT_LAYER] = image("icon" = 'icons/mob/belt.dmi', "icon_state" = "[t_state]")
else
@@ -949,8 +949,8 @@ var/global/list/damage_icon_parts = list()
var/image/standing
if(wear_suit.icon_override)
standing = image("icon" = wear_suit.icon_override, "icon_state" = "[wear_suit.icon_state]")
- else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
- standing = image("icon" = wear_suit.sprite_sheets[species.name], "icon_state" = "[wear_suit.icon_state]")
+ else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name])
+ standing = image("icon" = wear_suit.sprite_sheets[dna.species.name], "icon_state" = "[wear_suit.icon_state]")
else if(FAT in mutations)
if(wear_suit.flags_size & ONESIZEFITSALL)
standing = image("icon" = 'icons/mob/suit_fat.dmi', "icon_state" = "[wear_suit.icon_state]")
@@ -969,7 +969,7 @@ var/global/list/damage_icon_parts = list()
if(wear_suit.blood_DNA)
var/obj/item/clothing/suit/S = wear_suit
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "[S.blood_overlay_type]blood")
bloodsies.color = wear_suit.blood_color
standing.overlays += bloodsies
@@ -1035,14 +1035,14 @@ var/global/list/damage_icon_parts = list()
if(wear_mask.icon_override)
mask_icon = new(wear_mask.icon_override)
standing = image("icon" = wear_mask.icon_override, "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
- else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[species.name])
- mask_icon = new(wear_mask.sprite_sheets[species.name])
- standing = image("icon" = wear_mask.sprite_sheets[species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
+ else if(wear_mask.sprite_sheets && wear_mask.sprite_sheets[dna.species.name])
+ mask_icon = new(wear_mask.sprite_sheets[dna.species.name])
+ standing = image("icon" = wear_mask.sprite_sheets[dna.species.name], "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
else
standing = image("icon" = 'icons/mob/mask.dmi', "icon_state" = "[wear_mask.icon_state][(alternate_head && ("[wear_mask.icon_state]_[alternate_head.suffix]" in mask_icon.IconStates())) ? "_[alternate_head.suffix]" : ""]")
if(!istype(wear_mask, /obj/item/clothing/mask/cigarette) && wear_mask.blood_DNA)
- var/image/bloodsies = image("icon" = species.blood_mask, "icon_state" = "maskblood")
+ var/image/bloodsies = image("icon" = dna.species.blood_mask, "icon_state" = "maskblood")
bloodsies.color = wear_mask.blood_color
standing.overlays += bloodsies
overlays_standing[FACEMASK_LAYER] = standing
@@ -1062,8 +1062,8 @@ var/global/list/damage_icon_parts = list()
//If this is a rig and a mob_icon is set, it will take species into account in the rig update_icon() proc.
var/obj/item/rig/rig = back
standing = rig.mob_icon
- else if(back.sprite_sheets && back.sprite_sheets[species.name])
- standing = image("icon" = back.sprite_sheets[species.name], "icon_state" = "[back.icon_state]")
+ else if(back.sprite_sheets && back.sprite_sheets[dna.species.name])
+ standing = image("icon" = back.sprite_sheets[dna.species.name], "icon_state" = "[back.icon_state]")
else
standing = image("icon" = 'icons/mob/back.dmi', "icon_state" = "[back.icon_state]")
@@ -1163,7 +1163,7 @@ var/global/list/damage_icon_parts = list()
var/icon/tail_marking_icon
var/datum/sprite_accessory/body_markings/tail/tail_marking_style
- if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ if(m_styles["tail"] != "None" && (dna.species.bodyflags & HAS_TAIL_MARKINGS))
var/tail_marking = m_styles["tail"]
tail_marking_style = marking_styles_list[tail_marking]
tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]_s")
@@ -1172,11 +1172,11 @@ var/global/list/damage_icon_parts = list()
if(body_accessory)
if(body_accessory.try_restrictions(src))
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/mob/body_accessory.dmi', "icon_state" = "accessory_none_s")
under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
@@ -1194,14 +1194,14 @@ var/global/list/damage_icon_parts = list()
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- else if(tail && species.bodyflags & HAS_TAIL) //no tailless tajaran
+ else if(tail && dna.species.bodyflags & HAS_TAIL) //no tailless tajaran
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s")
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
tail_s.Blend(skin_colour, ICON_ADD)
if(tail_marking_icon && !tail_marking_style.tails_allowed)
tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "blank")
under.Insert(new/icon(tail_s, dir=SOUTH), dir=SOUTH)
@@ -1230,7 +1230,7 @@ var/global/list/damage_icon_parts = list()
var/icon/tail_marking_icon
var/datum/sprite_accessory/body_markings/tail/tail_marking_style
- if(m_styles["tail"] != "None" && (species.bodyflags & HAS_TAIL_MARKINGS))
+ if(m_styles["tail"] != "None" && (dna.species.bodyflags & HAS_TAIL_MARKINGS))
var/tail_marking = m_styles["tail"]
tail_marking_style = marking_styles_list[tail_marking]
tail_marking_icon = new/icon("icon" = tail_marking_style.icon, "icon_state" = "[tail_marking_style.icon_state]w_s")
@@ -1238,15 +1238,15 @@ var/global/list/damage_icon_parts = list()
if(body_accessory)
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
- if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species))
- under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ if(body_accessory.allowed_species && (dna.species.name in body_accessory.allowed_species))
+ under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
under.Insert(new/icon(accessory_s, dir=SOUTH), dir=SOUTH)
under.Insert(new/icon(accessory_s, dir=EAST), dir=EAST)
under.Insert(new/icon(accessory_s, dir=WEST), dir=WEST)
@@ -1255,23 +1255,23 @@ var/global/list/damage_icon_parts = list()
// Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "Vulpkanin_tail_delay")
- if(body_accessory.allowed_species && (species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
- over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ if(body_accessory.allowed_species && (dna.species.name in body_accessory.allowed_species)) // If the user's species is in the list of allowed species for the currently selected body accessory, use the appropriate animation timing blank
+ over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
over.Insert(new/icon(accessory_s, dir=NORTH), dir=NORTH)
overlays_standing[TAIL_LAYER] = image(over, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
else // Otherwise, since the user's tail isn't overlapped by limbs, go ahead and use default icon generation.
overlays_standing[TAIL_LAYER] = image(accessory_s, "pixel_x" = body_accessory.pixel_x_offset, "pixel_y" = body_accessory.pixel_y_offset)
- else if(tail && species.bodyflags & HAS_TAIL)
+ else if(tail && dna.species.bodyflags & HAS_TAIL)
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s")
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
tailw_s.Blend(skin_colour, ICON_ADD)
if(tail_marking_icon && !tail_marking_style.tails_allowed)
tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
- if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
+ if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && dna.species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
// Gives the underlimbs layer SEW direction icons since it's overlayed by limbs and just about everything else anyway.
- var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ var/icon/under = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
under.Insert(new/icon(tailw_s, dir=SOUTH), dir=SOUTH)
under.Insert(new/icon(tailw_s, dir=EAST), dir=EAST)
under.Insert(new/icon(tailw_s, dir=WEST), dir=WEST)
@@ -1279,7 +1279,7 @@ var/global/list/damage_icon_parts = list()
overlays_standing[TAIL_UNDERLIMBS_LAYER] = image(under)
// Creates a blank icon, and copies accessory_s' north direction sprite into it before passing that to the tail layer that overlays uniforms and such.
- var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.name]_tail_delay")
+ var/icon/over = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[dna.species.name]_tail_delay")
over.Insert(new/icon(tailw_s, dir=NORTH), dir=NORTH)
overlays_standing[TAIL_LAYER] = image(over)
@@ -1314,8 +1314,8 @@ var/global/list/damage_icon_parts = list()
var/icon/icon_file = new(icon_path)
if(wear_suit.icon_state in icon_file.IconStates())
standing = image("icon" = icon_file, "icon_state" = "[wear_suit.icon_state]")
- else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[species.name])
- var/icon_path = "[wear_suit.sprite_sheets[species.name]]"
+ else if(wear_suit.sprite_sheets && wear_suit.sprite_sheets[dna.species.name])
+ var/icon_path = "[wear_suit.sprite_sheets[dna.species.name]]"
icon_path = "[copytext(icon_path, 1, findtext(icon_path, "/suit.dmi"))]/collar.dmi" //If this file doesn't exist, the end result is that COLLAR_LAYER will be unchanged (empty).
if(fexists(icon_path)) //Just ensuring the nonexistance of a file with the above path won't cause a runtime.
var/icon/icon_file = new(icon_path)
diff --git a/code/modules/mob/living/carbon/slime/life.dm b/code/modules/mob/living/carbon/slime/life.dm
index 80ed9fdbffd..5b0ee885ce7 100644
--- a/code/modules/mob/living/carbon/slime/life.dm
+++ b/code/modules/mob/living/carbon/slime/life.dm
@@ -337,7 +337,7 @@
if(istype(L, /mob/living/carbon/human)) //Ignore slime(wo)men
var/mob/living/carbon/human/H = L
- if(H.species.name == "Slime People")
+ if(isslimeperson(H))
continue
if(!L.canmove) // Only one slime can latch on at a time.
diff --git a/code/modules/mob/living/carbon/superheroes.dm b/code/modules/mob/living/carbon/superheroes.dm
index d9c7a9f12ef..50b22a2c8ed 100644
--- a/code/modules/mob/living/carbon/superheroes.dm
+++ b/code/modules/mob/living/carbon/superheroes.dm
@@ -217,7 +217,7 @@
to_chat(target, "You must follow the orders of [user], and help [user.p_them()] succeed in [user.p_their()] dastardly schemes.")
to_chat(target, "You may not harm other Greyshirt or [user]. However, you do not need to obey other Greyshirts.")
ticker.mode.greyshirts += target.mind
- target.set_species("Human")
+ target.set_species(/datum/species/human)
head_organ.h_style = "Bald"
head_organ.f_style = "Shaved"
target.s_tone = 35
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index bff49e7c527..ee23633f4b6 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -660,14 +660,14 @@
TH.transfer_mob_blood_dna(src)
if(ishuman(src))
var/mob/living/carbon/human/H = src
- if(H.species.blood_color)
- TH.color = H.species.blood_color
+ if(H.dna.species.blood_color)
+ TH.color = H.dna.species.blood_color
else
TH.color = "#A10808"
/mob/living/carbon/human/makeTrail(turf/T)
- if((NO_BLOOD in species.species_traits) || species.exotic_blood || !bleed_rate || bleedsuppress)
+ if((NO_BLOOD in dna.species.species_traits) || dna.species.exotic_blood || !bleed_rate || bleedsuppress)
return
..()
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index 4f6707e93f0..755b874667a 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -131,8 +131,8 @@ var/list/robot_verbs_default = list(
camera.status = 0
if(mmi == null)
- mmi = new /obj/item/mmi/posibrain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a posibrain, but it works)
- mmi.icon_state="posibrain-occupied"
+ mmi = new /obj/item/mmi/robotic_brain(src) //Give the borg an MMI if he spawns without for some reason. (probably not the correct way to spawn a robotic brain, but it works)
+ mmi.icon_state = "boris"
initialize_components()
//if(!unfinished)
@@ -210,7 +210,7 @@ var/list/robot_verbs_default = list(
if(prefix)
modtype = prefix
if(mmi)
- if(istype(mmi, /obj/item/mmi/posibrain))
+ if(istype(mmi, /obj/item/mmi/robotic_brain))
braintype = "Android"
else
braintype = "Cyborg"
diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm
index 6cdffd48f16..a60dfc344ca 100644
--- a/code/modules/mob/living/simple_animal/bot/medbot.dm
+++ b/code/modules/mob/living/simple_animal/bot/medbot.dm
@@ -373,7 +373,7 @@
// is secretly a silicon
if(ishuman(C))
var/mob/living/carbon/human/H = C
- if(H.species && H.species.reagent_tag == PROCESS_SYN)
+ if(H.dna.species && H.dna.species.reagent_tag == PROCESS_SYN)
return 0
if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins)
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 3243061273f..0efaefcce07 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -715,7 +715,7 @@
var/list/blood_dna = H.get_blood_dna_list()
if(blood_dna)
transfer_blood_dna(blood_dna)
- currentBloodColor = H.species.blood_color
+ currentBloodColor = H.dna.species.blood_color
return
/mob/living/simple_animal/bot/mulebot/bot_control_message(command, mob/user, user_turf)
diff --git a/code/modules/mob/living/simple_animal/friendly/diona.dm b/code/modules/mob/living/simple_animal/friendly/diona.dm
index 64fe7d05b9b..669271f3ead 100644
--- a/code/modules/mob/living/simple_animal/friendly/diona.dm
+++ b/code/modules/mob/living/simple_animal/friendly/diona.dm
@@ -54,7 +54,7 @@
/mob/living/simple_animal/diona/attack_hand(mob/living/carbon/human/M)
//Let people pick the little buggers up.
if(M.a_intent == INTENT_HELP)
- if(M.species && M.species.name == "Diona")
+ if(isdiona(M))
to_chat(M, "You feel your being twine with that of [src] as it merges with your biomass.")
to_chat(src, "You feel your being twine with that of [M] as you merge with its biomass.")
verbs += /mob/living/simple_animal/diona/proc/split
@@ -82,7 +82,7 @@
if(ishuman(C))
var/mob/living/carbon/human/D = C
- if(D.species && D.species.name == "Diona")
+ if(isdiona(D))
choices += C
var/mob/living/M = input(src,"Who do you wish to merge with?") in null|choices
@@ -142,7 +142,7 @@
visible_message("[src] begins to shift and quiver, and erupts in a shower of shed bark as it splits into a tangle of nearly a dozen new dionaea.","You begin to shift and quiver, feeling your awareness splinter. All at once, we consume our stored nutrients to surge with growth, splitting into a tangle of at least a dozen new dionaea. We have attained our gestalt form.")
var/mob/living/carbon/human/diona/adult = new(get_turf(loc))
- adult.set_species("Diona")
+ adult.set_species(/datum/species/diona)
if(istype(loc, /obj/item/holder/diona))
var/obj/item/holder/diona/L = loc
@@ -156,8 +156,7 @@
adult.name = "diona ([rand(100,999)])"
adult.real_name = adult.name
adult.ckey = ckey
- adult.real_name = pick(diona_names) //I hate this being here of all places but unfortunately dna is based on real_name!
- adult.rename_self("diona")
+ adult.real_name = adult.dna.species.get_random_name() //I hate this being here of all places but unfortunately dna is based on real_name!
for(var/obj/item/W in contents)
unEquip(W)
@@ -178,7 +177,7 @@
if(!M || !src)
return
- if(NO_BLOOD in M.species.species_traits)
+ if(NO_BLOOD in M.dna.species.species_traits)
to_chat(src, "That donor has no blood to take.")
return
diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
index b98d4181475..37ed25f15e8 100644
--- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
+++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm
@@ -157,7 +157,7 @@
if(istype(mmi, /obj/item/mmi))
icon_state = "spiderbot-chassis-mmi"
icon_living = "spiderbot-chassis-mmi"
- if(istype(mmi, /obj/item/mmi/posibrain))
+ if(istype(mmi, /obj/item/mmi/robotic_brain))
icon_state = "spiderbot-chassis-posi"
icon_living = "spiderbot-chassis-posi"
diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm
index 283936acb44..f3e31925228 100644
--- a/code/modules/mob/living/simple_animal/hostile/hostile.dm
+++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm
@@ -178,7 +178,7 @@
if(ishuman(the_target))
var/mob/living/carbon/human/H = the_target
- if(is_type_in_list(src, H.species.ignored_by))
+ if(is_type_in_list(src, H.dna.species.ignored_by))
return 0
if(istype(the_target, /obj/mecha))
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
index 3462e8e18e7..7b10c0e828a 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/fish.dm
@@ -27,4 +27,41 @@
speak_emote = list("gnashes")
faction = list("carp")
- flying = 1
\ No newline at end of file
+ flying = 1
+
+
+/mob/living/simple_animal/hostile/retaliate/carp/koi
+ name = "space koi"
+ desc = "A gentle space-faring koi."
+ icon = 'icons/obj/fish_items.dmi'
+ icon_state = "koi1"
+ icon_living = "koi1"
+ icon_dead = "koi1-dead"
+
+ harm_intent_damage = 1
+ melee_damage_lower = 2
+ melee_damage_upper = 2
+ speak_emote = list("blurps")
+ butcher_results = null
+
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 0
+ maxbodytemp = 1500
+
+ gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
+
+/mob/living/simple_animal/hostile/retaliate/carp/koi/New()
+ ..()
+ var/koinum = rand(1, 4)
+ icon_state = "koi[koinum]"
+ icon_living = "koi[koinum]"
+ icon_dead = "koi[koinum]-dead"
+
+
+/mob/living/simple_animal/hostile/retaliate/carp/koi/Process_Spacemove(var/movement_dir)
+ return TRUE
+
+/mob/living/simple_animal/hostile/retaliate/carp/koi/honk
+ icon_state = "koi5"
+ icon_living = "koi5"
+ icon_dead = "koi5-dead"
\ No newline at end of file
diff --git a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
index 235a161c595..693ca724ac6 100644
--- a/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
+++ b/code/modules/mob/living/simple_animal/hostile/terror_spiders/terror_spiders.dm
@@ -196,7 +196,7 @@ var/global/list/ts_spiderling_list = list()
var/can_poison = 1
if(ishuman(G))
var/mob/living/carbon/human/H = G
- if(!(H.species.reagent_tag & PROCESS_ORG) || (!H.species.tox_mod))
+ if(!(H.dna.species.reagent_tag & PROCESS_ORG) || (!H.dna.species.tox_mod))
can_poison = 0
spider_specialattack(G,can_poison)
else
diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm
index fb62ad3a629..2d024ec786e 100644
--- a/code/modules/mob/login.dm
+++ b/code/modules/mob/login.dm
@@ -58,8 +58,8 @@
if(istype(src,/mob/living/carbon/human))
var/mob/living/carbon/human/H = src
- if(H.species && H.species.abilities)
- client.verbs |= H.species.abilities
+ if(H.dna.species && H.dna.species.abilities)
+ client.verbs |= H.dna.species.abilities
client.screen += client.void
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index beba84eaa3f..84f9503066a 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1080,9 +1080,6 @@ var/list/slot_equipment_priority = list( \
/mob/proc/activate_hand(selhand)
return
-/mob/proc/get_species()
- return ""
-
/mob/dead/observer/verb/respawn()
set name = "Respawn as NPC"
set category = "Ghost"
diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm
index 458138b9db0..93941d6e7d2 100644
--- a/code/modules/mob/mob_grab.dm
+++ b/code/modules/mob/mob_grab.dm
@@ -410,7 +410,7 @@
return 1
var/mob/living/carbon/human/H = attacker
- if(ishuman(H) && is_type_in_list(prey, H.species.allowed_consumed_mobs)) //species eating of other mobs
+ if(ishuman(H) && is_type_in_list(prey, H.dna.species.allowed_consumed_mobs)) //species eating of other mobs
return 1
return 0
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index d06028625b8..d622c78f680 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -1,7 +1,7 @@
/proc/issmall(A)
if(A && istype(A, /mob/living/carbon/human))
var/mob/living/carbon/human/H = A
- if(H.species && H.species.is_small)
+ if(H.dna.species && H.dna.species.is_small)
return 1
return 0
@@ -16,9 +16,9 @@
return 0
/mob/living/carbon/human/isSynthetic()
- if(get_species() == "Machine")
- return 1
- return 0
+ if(ismachine(src))
+ return TRUE
+ return FALSE
/mob/proc/get_screen_colour()
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index 274c1602e04..d8bfb77e725 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -395,7 +395,7 @@
var/arrivalmessage = announcer.arrivalmsg
arrivalmessage = replacetext(arrivalmessage,"$name",character.real_name)
arrivalmessage = replacetext(arrivalmessage,"$rank",rank ? "[rank]" : "visitor")
- arrivalmessage = replacetext(arrivalmessage,"$species",character.species.name)
+ arrivalmessage = replacetext(arrivalmessage,"$species",character.dna.species.name)
arrivalmessage = replacetext(arrivalmessage,"$age",num2text(character.age))
arrivalmessage = replacetext(arrivalmessage,"$gender",character.gender == FEMALE ? "Female" : "Male")
announcer.say(";[arrivalmessage]")
@@ -537,9 +537,6 @@
else if(mind.assigned_role == "Mime")
new_character.real_name = pick(mime_names)
new_character.rename_self("mime")
- else if(new_character.species == "Diona")
- new_character.real_name = pick(diona_names) //I hate this being here of all places but unfortunately dna is based on real_name!
- new_character.rename_self("diona")
mind.original = new_character
mind.transfer_to(new_character) //won't transfer key since the mind is not active
@@ -591,19 +588,6 @@
if(!S) return 1
return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(IS_WHITELISTED in S.species_traits)
-/mob/new_player/get_species()
- var/datum/species/chosen_species
- if(client.prefs.species)
- chosen_species = all_species[client.prefs.species]
-
- if(!chosen_species)
- return "Human"
-
- if(is_species_whitelisted(chosen_species) || has_admin_rights())
- return chosen_species.name
-
- return "Human"
-
/mob/new_player/get_gender()
if(!client || !client.prefs) ..()
return client.prefs.gender
diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm
index d57c46e513c..511816124f7 100644
--- a/code/modules/mob/new_player/preferences_setup.dm
+++ b/code/modules/mob/new_player/preferences_setup.dm
@@ -223,13 +223,13 @@
if(current_species)
if(current_species.bodyflags & HAS_ICON_SKIN_TONE) //Handling species-specific icon-based skin tones by flagged race.
var/mob/living/carbon/human/H = new
- H.species = current_species
+ H.dna.species = current_species
H.s_tone = s_tone
- H.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive.
+ H.dna.species.updatespeciescolor(H, 0) //The mob's species wasn't set, so it's almost certainly different than the character's species at the moment. Thus, we need to be owner-insensitive.
var/obj/item/organ/external/chest/C = H.get_organ("chest")
- icobase = C.icobase ? C.icobase : C.species.icobase
- if(H.species.bodyflags & HAS_TAIL)
- coloured_tail = H.tail ? H.tail : H.species.tail
+ icobase = C.icobase ? C.icobase : C.dna.species.icobase
+ if(H.dna.species.bodyflags & HAS_TAIL)
+ coloured_tail = H.tail ? H.tail : H.dna.species.tail
qdel(H)
else
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 82aebda3a42..a1ed4f0bde9 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -86,7 +86,7 @@
if(O.mind && O.mind.assigned_role == "Cyborg")
if(O.mind.role_alt_title == "Android")
- O.mmi = new /obj/item/mmi/posibrain(O)
+ O.mmi = new /obj/item/mmi/robotic_brain(O)
else if(O.mind.role_alt_title == "Robot")
O.mmi = null //Robots do not have removable brains.
else
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index ad7a8f5cff6..880553a63bc 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -31,7 +31,8 @@
if(href_list["race"])
if(can_change(APPEARANCE_RACE) && (href_list["race"] in valid_species))
- if(owner.change_species(href_list["race"]))
+ var/datum/species/S = all_species[href_list["race"]]
+ if(owner.change_species(S.type))
cut_and_generate_data()
// Species change creates new organs - runtimes ahoy if we forget this
head_organ = owner.get_organ("head")
@@ -44,24 +45,24 @@
if(href_list["skin_tone"])
if(can_change_skin_tone())
var/new_s_tone = null
- if(owner.species.bodyflags & HAS_SKIN_TONE)
+ if(owner.dna.species.bodyflags & HAS_SKIN_TONE)
new_s_tone = input(usr, "Choose your character's skin tone:\n(Light 1 - 220 Dark)", "Skin Tone", owner.s_tone) as num|null
if(isnum(new_s_tone) && can_still_topic(state))
new_s_tone = 35 - max(min(round(new_s_tone), 220),1)
- else if(owner.species.bodyflags & HAS_ICON_SKIN_TONE)
+ else if(owner.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
var/const/MAX_LINE_ENTRIES = 4
- var/prompt = "Choose your character's skin tone: 1-[owner.species.icon_skin_tones.len]\n("
- for(var/i = 1 to owner.species.icon_skin_tones.len)
+ var/prompt = "Choose your character's skin tone: 1-[owner.dna.species.icon_skin_tones.len]\n("
+ for(var/i = 1 to owner.dna.species.icon_skin_tones.len)
if(i > MAX_LINE_ENTRIES && !((i - 1) % MAX_LINE_ENTRIES))
prompt += "\n"
- prompt += "[i] = [owner.species.icon_skin_tones[i]]"
- if(i != owner.species.icon_skin_tones.len)
+ prompt += "[i] = [owner.dna.species.icon_skin_tones[i]]"
+ if(i != owner.dna.species.icon_skin_tones.len)
prompt += ", "
prompt += ")"
new_s_tone = input(usr, prompt, "Skin Tone", owner.s_tone) as num|null
if(isnum(new_s_tone) && can_still_topic(state))
- new_s_tone = max(min(round(new_s_tone), owner.species.icon_skin_tones.len), 1)
+ new_s_tone = max(min(round(new_s_tone), owner.dna.species.icon_skin_tones.len), 1)
if(new_s_tone)
return owner.change_skin_tone(new_s_tone)
@@ -183,9 +184,9 @@
generate_data(check_whitelist, whitelist, blacklist)
var/data[0]
- data["specimen"] = owner.species.name
+ data["specimen"] = owner.dna.species.name
data["gender"] = owner.gender
- data["has_gender"] = owner.species.has_gender
+ data["has_gender"] = owner.dna.species.has_gender
data["change_race"] = can_change(APPEARANCE_RACE)
if(data["change_race"])
var/species[0]
@@ -283,25 +284,25 @@
return owner && (flags & flag)
/datum/nano_module/appearance_changer/proc/can_change_skin_tone()
- return owner && (flags & APPEARANCE_SKIN) && ((owner.species.bodyflags & HAS_SKIN_TONE) || (owner.species.bodyflags & HAS_ICON_SKIN_TONE))
+ return owner && (flags & APPEARANCE_SKIN) && ((owner.dna.species.bodyflags & HAS_SKIN_TONE) || (owner.dna.species.bodyflags & HAS_ICON_SKIN_TONE))
/datum/nano_module/appearance_changer/proc/can_change_skin_color()
- return owner && (flags & APPEARANCE_SKIN) && (owner.species.bodyflags & HAS_SKIN_COLOR)
+ return owner && (flags & APPEARANCE_SKIN) && (owner.dna.species.bodyflags & HAS_SKIN_COLOR)
/datum/nano_module/appearance_changer/proc/can_change_head_accessory()
if(!head_organ)
log_runtime(EXCEPTION("Missing head!"), owner)
return 0
- return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.species.bodyflags & HAS_HEAD_ACCESSORY)
+ return owner && (flags & APPEARANCE_HEAD_ACCESSORY) && (head_organ.dna.species.bodyflags & HAS_HEAD_ACCESSORY)
/datum/nano_module/appearance_changer/proc/can_change_markings(var/location = "body")
var/marking_flag = HAS_BODY_MARKINGS
- var/body_flags = owner.species.bodyflags
+ var/body_flags = owner.dna.species.bodyflags
if(location == "head")
if(!head_organ)
log_debug("Missing head!")
return 0
- body_flags = head_organ.species.bodyflags
+ body_flags = head_organ.dna.species.bodyflags
marking_flag = HAS_HEAD_MARKINGS
if(location == "body")
marking_flag = HAS_BODY_MARKINGS
@@ -311,13 +312,13 @@
return owner && (flags & APPEARANCE_MARKINGS) && (body_flags & marking_flag)
/datum/nano_module/appearance_changer/proc/can_change_body_accessory()
- return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.species.bodyflags & HAS_TAIL)
+ return owner && (flags & APPEARANCE_BODY_ACCESSORY) && (owner.dna.species.bodyflags & HAS_TAIL)
/datum/nano_module/appearance_changer/proc/can_change_alt_head()
if(!head_organ)
log_debug("Missing head!")
return 0
- return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.species.bodyflags & HAS_ALT_HEADS)
+ return owner && (flags & APPEARANCE_ALT_HEAD) && (head_organ.dna.species.bodyflags & HAS_ALT_HEADS)
/datum/nano_module/appearance_changer/proc/cut_and_generate_data()
// Making the assumption that the available species remain constant
diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm
index e3cceb9738a..74bee9867ab 100644
--- a/code/modules/paperwork/handlabeler.dm
+++ b/code/modules/paperwork/handlabeler.dm
@@ -7,30 +7,23 @@
var/labels_left = 30
var/mode = 0 //off or on.
-/obj/item/hand_labeler/afterattack(atom/A, mob/user as mob, proximity)
- if(!proximity) return
+/obj/item/hand_labeler/afterattack(atom/A, mob/user, proximity)
+ if(!proximity)
+ return
if(!mode) //if it's off, give up.
return
- if(A == loc) // if placing the labeller into something (e.g. backpack)
- return // don't set a label
if(!labels_left)
- to_chat(user, "No labels left.")
+ to_chat(user, "No labels left!")
return
if(!label || !length(label))
- to_chat(user, "No text set.")
+ to_chat(user, "No text set!")
return
if(length(A.name) + length(label) > 64)
- to_chat(user, "Label too big.")
+ to_chat(user, "Label too big!")
return
- if(ishuman(A))
- to_chat(user, "You can't label humans.")
- return
- if(issilicon(A))
- to_chat(user, "You can't label cyborgs.")
- return
- if(istype(A, /obj/item/reagent_containers/glass))
- to_chat(user, "The label can't stick to the [A.name]. (Try using a pen)")
+ if(ismob(A))
+ to_chat(user, "You can't label creatures!") // use a collar
return
user.visible_message("[user] labels [A] as [label].", \
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index 41799958c4f..ed5b7c1cfd4 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -260,7 +260,7 @@
emag_cooldown = world.time + EMAG_DELAY
if(ishuman(ass)) //Suit checks are in check_ass
var/mob/living/carbon/human/H = ass
- temp_img = icon('icons/obj/butts.dmi', H.species.butt_sprite)
+ temp_img = icon('icons/obj/butts.dmi', H.dna.species.butt_sprite)
else if(istype(ass,/mob/living/silicon/robot/drone))
temp_img = icon('icons/obj/butts.dmi', "drone")
else if(istype(ass,/mob/living/simple_animal/diona))
diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm
index 51bf515ca1e..165e75f1875 100644
--- a/code/modules/projectiles/gun.dm
+++ b/code/modules/projectiles/gun.dm
@@ -153,10 +153,10 @@
process_fire(target,user,1,params)
-/obj/item/gun/proc/can_trigger_gun(var/mob/living/user)
+/obj/item/gun/proc/can_trigger_gun(mob/living/user)
if(!user.can_use_guns(src))
return 0
- if(restricted_species && restricted_species.len && !(user.get_species() in restricted_species))
+ if(restricted_species && restricted_species.len && !is_type_in_list(user.dna.species, restricted_species))
to_chat(user, "[src] is incompatible with your biology!")
return 0
return 1
diff --git a/code/modules/projectiles/guns/alien.dm b/code/modules/projectiles/guns/alien.dm
index 7093d587b3c..95e1a586469 100644
--- a/code/modules/projectiles/guns/alien.dm
+++ b/code/modules/projectiles/guns/alien.dm
@@ -11,7 +11,7 @@
can_suppress = 0
var/charge_tick = 0
var/charge_delay = 15
- restricted_species = list("Vox", "Vox Armalis")
+ restricted_species = list(/datum/species/vox)
/obj/item/gun/projectile/automatic/spikethrower/New()
..()
@@ -79,7 +79,7 @@
force = 10
ammo_type = list(/obj/item/ammo_casing/energy/sonic)
cell_type = /obj/item/stock_parts/cell/super
- restricted_species = list("Vox Armalis")
+ restricted_species = list(/datum/species/vox/armalis)
/obj/item/gun/energy/noisecannon/update_icon()
return
diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index e38a42ff88f..e19cd1165b5 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -83,7 +83,7 @@
var/blood_color = "#C80000"
if(ishuman(target))
H = target
- blood_color = H.species.blood_color
+ blood_color = H.dna.species.blood_color
new /obj/effect/temp_visual/dir_setting/bloodsplatter(target_loca, splatter_dir, blood_color)
if(prob(33))
var/list/shift = list("x" = 0, "y" = 0)
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index 3fe2277ed3b..1df45dbe064 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -24,15 +24,15 @@
var/exp_flash = 3
var/exp_fire = 2
-/obj/item/projectile/magic/death/on_hit(var/mob/living/carbon/G)
+/obj/item/projectile/magic/death/on_hit(mob/living/carbon/C)
. = ..()
- if(isliving(G))
- if(G.get_species() == "Machine") //speshul snowfleks deserv speshul treetment
- G.adjustFireLoss(6969) //remember - slimes love fire
+ if(isliving(C))
+ if(ismachine(C)) //speshul snowfleks deserv speshul treetment
+ C.adjustFireLoss(6969) //remember - slimes love fire
else
- G.death()
+ C.death()
- visible_message("[G] topples backwards as the death bolt impacts [G.p_them()]!")
+ visible_message("[C] topples backwards as the death bolt impacts [C.p_them()]!")
/obj/item/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
@@ -225,20 +225,17 @@ proc/wabbajack(mob/living/M)
else new_mob = new /mob/living/simple_animal/chick(M.loc)
new_mob.universal_speak = 1
if("human")
- new_mob = new /mob/living/carbon/human/human(M.loc)
+ new_mob = new /mob/living/carbon/human(M.loc)
// Include standard, whitelisted, and monkey species...
- var/list/new_species = list("Human","Tajaran","Skrell","Unathi","Diona","Vulpkanin")
- new_species |= whitelisted_species
- for(var/SN in all_species)
- var/datum/species/S = all_species[SN]
- if(S.greater_form) // Monkeys
- new_species |= SN
- new_species -= "Vox Armalis" // ... but not Armalis. They're not really designed to be playable
- new_species |= "Golem" // Also, golems, sure, why not
- var/picked_species = pick(new_species)
+ var/list/new_species = list()
+ for(var/datum/species/S in subtypesof(/datum/species))
+ if(istype(S, /datum/species/vox/armalis))
+ continue
+ new_species.Add(S)
var/mob/living/carbon/human/H = new_mob
- H.set_species(picked_species)
- randomize = picked_species
+ var/datum/species/S = pick(new_species)
+ H.set_species(S)
+ randomize = initial(S.name)
var/datum/preferences/A = new() //Randomize appearance for the human
A.copy_to(new_mob)
else
diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm
index 2c774b7f3dd..2003e78b780 100644
--- a/code/modules/projectiles/projectile/special.dm
+++ b/code/modules/projectiles/projectile/special.dm
@@ -133,7 +133,7 @@
var/mob/living/M = target
if(ishuman(target))
var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.species.species_traits)
+ if(IS_PLANT in H.dna.species.species_traits)
if(prob(15))
M.apply_effect((rand(30,80)),IRRADIATE)
M.Weaken(5)
@@ -166,7 +166,7 @@
var/mob/M = target
if(ishuman(target)) //These rays make plantmen fat.
var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.species.species_traits)
+ if(IS_PLANT in H.dna.species.species_traits)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
else if(iscarbon(target))
M.show_message("The radiation beam dissipates harmlessly through your body.")
diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm
index 83a000fa693..73a591f9ddb 100644
--- a/code/modules/reagents/chemistry/holder.dm
+++ b/code/modules/reagents/chemistry/holder.dm
@@ -209,17 +209,17 @@ var/const/INGEST = 2
//Check if this mob's species is set and can process this type of reagent
var/can_process = 0
//If we somehow avoided getting a species or reagent_tag set, we'll assume we aren't meant to process ANY reagents (CODERS: SET YOUR SPECIES AND TAG!)
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ if(H.dna.species && H.dna.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
can_process = 1
//Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_DUO))
can_process = 1
//If handle_reagents returns 0, it's doing the reagent removal on its own
- var/species_handled = !(H.species.handle_reagents(H, R))
+ var/species_handled = !(H.dna.species.handle_reagents(H, R))
can_process = can_process && !species_handled
//If the mob can't process it, remove the reagent at it's normal rate without doing any addictions, overdoses, or on_mob_life() for the reagent
if(can_process == 0)
@@ -481,13 +481,13 @@ var/const/INGEST = 2
if(ishuman(M))
var/mob/living/carbon/human/H = M
//Check if this mob's species is set and can process this type of reagent
- if(H.species && H.species.reagent_tag)
- if((R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
+ if(H.dna.species && H.dna.species.reagent_tag)
+ if((R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_SYN)) //SYNTHETIC-oriented reagents require PROCESS_SYN
can_process = 1
- if((R.process_flags & ORGANIC) && (H.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
+ if((R.process_flags & ORGANIC) && (H.dna.species.reagent_tag & PROCESS_ORG)) //ORGANIC-oriented reagents require PROCESS_ORG
can_process = 1
//Species with PROCESS_DUO are only affected by reagents that affect both organics and synthetics, like acid and hellwater
- if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.species.reagent_tag & PROCESS_DUO))
+ if((R.process_flags & ORGANIC) && (R.process_flags & SYNTHETIC) && (H.dna.species.reagent_tag & PROCESS_DUO))
can_process = 1
//We'll assume that non-human mobs lack the ability to process synthetic-oriented reagents (adjust this if we need to change that assumption)
else
diff --git a/code/modules/reagents/chemistry/reagents/food.dm b/code/modules/reagents/chemistry/reagents/food.dm
index bdabfd21956..7426844e292 100644
--- a/code/modules/reagents/chemistry/reagents/food.dm
+++ b/code/modules/reagents/chemistry/reagents/food.dm
@@ -31,7 +31,7 @@
if(H.can_eat(diet_flags)) //Make sure the species has it's dietflag set, otherwise it can't digest any nutrients
if(prob(50))
M.adjustBruteLoss(-1)
- if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature.
+ if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.4
..()
@@ -66,7 +66,7 @@
M.satiety += 30
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature.
+ if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.5
..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine.dm b/code/modules/reagents/chemistry/reagents/medicine.dm
index c9f89743e7c..f603d5eb0d1 100644
--- a/code/modules/reagents/chemistry/reagents/medicine.dm
+++ b/code/modules/reagents/chemistry/reagents/medicine.dm
@@ -221,7 +221,7 @@
M.adjustFireLoss(-2*REAGENTS_EFFECT_MULTIPLIER)
if(ishuman(M) && prob(33))
var/mob/living/carbon/human/H = M
- if(!(NO_BLOOD in H.species.species_traits))//do not restore blood on things with no blood by nature.
+ if(!(NO_BLOOD in H.dna.species.species_traits))//do not restore blood on things with no blood by nature.
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 1
..()
diff --git a/code/modules/reagents/chemistry/reagents/misc.dm b/code/modules/reagents/chemistry/reagents/misc.dm
index 586b197945d..7f3614077c9 100644
--- a/code/modules/reagents/chemistry/reagents/misc.dm
+++ b/code/modules/reagents/chemistry/reagents/misc.dm
@@ -155,7 +155,7 @@
/datum/reagent/iron/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(!H.species.exotic_blood && !(NO_BLOOD in H.species.species_traits))
+ if(!H.dna.species.exotic_blood && !(NO_BLOOD in H.dna.species.species_traits))
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
H.blood_volume += 0.8
..()
@@ -318,8 +318,8 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
- head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
- head_organ.f_style = random_facial_hair_style(H.gender, head_organ.species.name)
+ head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
+ head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
H.update_fhair()
..()
@@ -340,14 +340,14 @@
var/datum/sprite_accessory/tmp_hair_style = hair_styles_full_list["Very Long Hair"]
var/datum/sprite_accessory/tmp_facial_hair_style = facial_hair_styles_list["Very Long Beard"]
- if(head_organ.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
+ if(head_organ.dna.species.name in tmp_hair_style.species_allowed) //If 'Very Long Hair' is a style the person's species can have, give it to them.
head_organ.h_style = "Very Long Hair"
else //Otherwise, give them a random hair style.
- head_organ.h_style = random_hair_style(H.gender, head_organ.species.name)
- if(head_organ.species.name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them.
+ head_organ.h_style = random_hair_style(H.gender, head_organ.dna.species.name)
+ if(head_organ.dna.species.name in tmp_facial_hair_style.species_allowed) //If 'Very Long Beard' is a style the person's species can have, give it to them.
head_organ.f_style = "Very Long Beard"
else //Otherwise, give them a random facial hair style.
- head_organ.f_style = random_facial_hair_style(H.gender, head_organ.species.name)
+ head_organ.f_style = random_facial_hair_style(H.gender, head_organ.dna.species.name)
H.update_hair()
H.update_fhair()
if(!H.wear_mask || H.wear_mask && !istype(H.wear_mask, /obj/item/clothing/mask/fakemoustache))
diff --git a/code/modules/reagents/chemistry/reagents/toxins.dm b/code/modules/reagents/chemistry/reagents/toxins.dm
index 7bff61218c6..a3fc113339e 100644
--- a/code/modules/reagents/chemistry/reagents/toxins.dm
+++ b/code/modules/reagents/chemistry/reagents/toxins.dm
@@ -61,12 +61,12 @@
/datum/reagent/slimetoxin/on_mob_life(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/human = M
- if(human.species.name != "Shadow")
+ if(!isshadowperson(human))
to_chat(M, "Your flesh rapidly mutates!")
to_chat(M, "You are now a Shadow Person, a mutant race of darkness-dwelling humanoids.")
to_chat(M, "Your body reacts violently to light. However, it naturally heals in darkness.")
to_chat(M, "Aside from your new traits, you are mentally unchanged and retain your prior obligations.")
- human.set_species("Shadow")
+ human.set_species(/datum/species/shadow)
..()
/datum/reagent/aslimetoxin
@@ -217,7 +217,7 @@
if(method == TOUCH)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() == "Grey")
+ if(isgrey(H))
return
if(volume > 25)
@@ -246,7 +246,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() == "Grey")
+ if(isgrey(H))
return
if(volume >=10 && volume <=25)
@@ -961,7 +961,7 @@
C.adjustToxLoss(lethality)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(IS_PLANT in H.species.species_traits) //plantmen take a LOT of damage
+ if(IS_PLANT in H.dna.species.species_traits) //plantmen take a LOT of damage
H.adjustToxLoss(50)
..()
else if(istype(M, /mob/living/simple_animal/diona)) //plantmen monkeys (diona) take EVEN MORE damage
@@ -995,7 +995,7 @@
C.adjustToxLoss(2)
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() == "Kidan") //RIP
+ if(iskidan(H)) //RIP
H.adjustToxLoss(20)
/datum/reagent/capulettium
diff --git a/code/modules/reagents/chemistry/reagents/water.dm b/code/modules/reagents/chemistry/reagents/water.dm
index cd338cb048d..199edb72fb4 100644
--- a/code/modules/reagents/chemistry/reagents/water.dm
+++ b/code/modules/reagents/chemistry/reagents/water.dm
@@ -29,7 +29,7 @@
var/mob/living/carbon/human/H = M
- if(H.get_species() != "Grey") //God this is so gross I hate it.
+ if(!isgrey(H)) //God this is so gross I hate it.
return
if(volume > 25)
@@ -58,7 +58,7 @@
if(ishuman(M))
var/mob/living/carbon/human/H = M
- if(H.get_species() != "Grey")
+ if(!isgrey(H))
return
if(volume < 10)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index c7acc705150..a5d37cb8b60 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -26,6 +26,33 @@
empulse(location, round(created_volume / 24), round(created_volume / 14), 1)
holder.clear_reagents()
+/datum/chemical_reaction/beesplosion
+ name = "Bee Explosion"
+ id = "beesplosion"
+ result = null
+ required_reagents = list("honey" = 1, "strange_reagent" = 1, "radium" = 1)
+ result_amount = 1
+
+/datum/chemical_reaction/beesplosion/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ if(created_volume < 5)
+ playsound(location,'sound/effects/sparks1.ogg', 100, 1)
+ else
+ playsound(location,'sound/creatures/bee.ogg', 100, 1)
+ var/list/beeagents = list()
+ for(var/X in holder.reagent_list)
+ var/datum/reagent/R = X
+ if(R.id in required_reagents)
+ continue
+ if(!R.can_synth)
+ continue
+ beeagents += R
+ var/bee_amount = round(created_volume * 0.2)
+ for(var/i in 1 to bee_amount)
+ var/mob/living/simple_animal/hostile/poison/bees/new_bee = new(location)
+ if(LAZYLEN(beeagents))
+ new_bee.assign_reagent(pick(beeagents))
+
/datum/chemical_reaction/nitroglycerin
name = "Nitroglycerin"
id = "nitroglycerin"
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 3658846a696..c7e276cae17 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -11,66 +11,57 @@
density = 0
pressure_resistance = 5*ONE_ATMOSPHERE
level = 2
- var/ptype = 0
- // 0=straight, 1=bent, 2=junction-j1, 3=junction-j2, 4=junction-y, 5=trunk, 6=disposal bin, 7=outlet, 8=inlet
-
+ var/ptype = PIPE_DISPOSALS_STRAIGHT //Use the defines
+ var/base_state
var/dpdir = 0 // directions as disposalpipe
- var/base_state = "pipe-s"
+
+/obj/structure/disposalconstruct/New(loc, pipe_type, direction)
+ ..()
+ if(pipe_type)
+ ptype = pipe_type
+ if(dir)
+ dir = direction
+ update()
// update iconstate and dpdir due to dir and type
/obj/structure/disposalconstruct/proc/update()
+ base_state = get_pipe_icon(ptype)
+ icon_state = "con[base_state]"
var/flip = turn(dir, 180)
var/left = turn(dir, 90)
var/right = turn(dir, -90)
-
+ name = get_pipe_name(ptype, PIPETYPE_DISPOSAL)
switch(ptype)
- if(0)
- base_state = "pipe-s"
+ if(PIPE_DISPOSALS_STRAIGHT)
dpdir = dir | flip
- if(1)
- base_state = "pipe-c"
+ if(PIPE_DISPOSALS_BENT)
dpdir = dir | right
- if(2)
- base_state = "pipe-j1"
+ if(PIPE_DISPOSALS_JUNCTION_RIGHT)
dpdir = dir | right | flip
- if(3)
- base_state = "pipe-j2"
+ if(PIPE_DISPOSALS_JUNCTION_LEFT)
dpdir = dir | left | flip
- if(4)
- base_state = "pipe-y"
+ if(PIPE_DISPOSALS_Y_JUNCTION)
dpdir = dir | left | right
- if(5)
- base_state = "pipe-t"
+ if(PIPE_DISPOSALS_TRUNK)
dpdir = dir
- // disposal bin has only one dir, thus we don't need to care about setting it
- if(6)
- if(anchored)
- base_state = "disposal"
- else
- base_state = "condisposal"
-
- if(7)
- base_state = "outlet"
- dpdir = dir
-
- if(8)
- base_state = "intake"
- dpdir = dir
-
- if(9)
- base_state = "pipe-j1s"
+ if(PIPE_DISPOSALS_SORT_RIGHT)
dpdir = dir | right | flip
-
- if(10)
- base_state = "pipe-j2s"
+ if(PIPE_DISPOSALS_SORT_LEFT)
dpdir = dir | left | flip
-
-
- if(ptype<6 || ptype>8)
+ // disposal bin has only one dir, thus we don't need to care about setting it
+ if(PIPE_DISPOSALS_BIN)
+ if(!anchored)
+ icon_state = "[base_state]-unanchored"
+ else
+ icon_state = base_state
+ if(PIPE_DISPOSALS_OUTLET)
+ dpdir = dir
+ icon_state = base_state
+ if(PIPE_DISPOSALS_CHUTE)
+ dpdir = dir
+ icon_state = base_state
+ if(!(ptype in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)))
icon_state = "con[base_state]"
- else
- icon_state = base_state
-
if(invisibility) // if invisible, fade icon
icon -= rgb(0,0,0,128)
@@ -116,33 +107,33 @@
dir = turn(dir, 180)
switch(ptype)
- if(2)
- ptype = 3
- if(3)
- ptype = 2
- if(9)
- ptype = 10
- if(10)
- ptype = 9
+ if(PIPE_DISPOSALS_JUNCTION_RIGHT)
+ ptype = PIPE_DISPOSALS_JUNCTION_LEFT
+ if(PIPE_DISPOSALS_JUNCTION_LEFT)
+ ptype = PIPE_DISPOSALS_JUNCTION_RIGHT
+ if(PIPE_DISPOSALS_SORT_RIGHT)
+ ptype = PIPE_DISPOSALS_SORT_LEFT
+ if(PIPE_DISPOSALS_SORT_LEFT)
+ ptype = PIPE_DISPOSALS_SORT_RIGHT
update()
// returns the type path of disposalpipe corresponding to this item dtype
/obj/structure/disposalconstruct/proc/dpipetype()
switch(ptype)
- if(0,1)
+ if(PIPE_DISPOSALS_STRAIGHT, PIPE_DISPOSALS_BENT)
return /obj/structure/disposalpipe/segment
- if(2,3,4)
+ if(PIPE_DISPOSALS_JUNCTION_RIGHT, PIPE_DISPOSALS_JUNCTION_LEFT, PIPE_DISPOSALS_Y_JUNCTION)
return /obj/structure/disposalpipe/junction
- if(5)
+ if(PIPE_DISPOSALS_TRUNK)
return /obj/structure/disposalpipe/trunk
- if(6)
+ if(PIPE_DISPOSALS_BIN)
return /obj/machinery/disposal
- if(7)
+ if(PIPE_DISPOSALS_OUTLET)
return /obj/structure/disposaloutlet
- if(8)
+ if(PIPE_DISPOSALS_CHUTE)
return /obj/machinery/disposal/deliveryChute
- if(9,10)
+ if(PIPE_DISPOSALS_SORT_RIGHT, PIPE_DISPOSALS_SORT_LEFT)
return /obj/structure/disposalpipe/sortjunction
return
@@ -157,13 +148,13 @@
var/ispipe = 0 // Indicates if we should change the level of this pipe
src.add_fingerprint(user)
switch(ptype)
- if(6)
+ if(PIPE_DISPOSALS_BIN)
nicetype = "disposal bin"
- if(7)
+ if(PIPE_DISPOSALS_OUTLET)
nicetype = "disposal outlet"
- if(8)
+ if(PIPE_DISPOSALS_CHUTE)
nicetype = "delivery chute"
- if(9, 10)
+ if(PIPE_DISPOSALS_SORT_RIGHT, PIPE_DISPOSALS_SORT_LEFT)
nicetype = "sorting pipe"
ispipe = 1
else
@@ -197,7 +188,7 @@
return
var/obj/structure/disposalpipe/CP = locate() in T
- if(ptype>=6 && ptype <= 8) // Disposal or outlet
+ if(ptype in list(PIPE_DISPOSALS_BIN, PIPE_DISPOSALS_OUTLET, PIPE_DISPOSALS_CHUTE)) // Disposal or outlet
if(CP) // There's something there
if(!istype(CP,/obj/structure/disposalpipe/trunk))
to_chat(user, "The [nicetype] requires a trunk underneath it in order to work.")
@@ -236,22 +227,22 @@
P.update_icon()
//Needs some special treatment ;)
- if(ptype==9 || ptype==10)
+ if(ptype == PIPE_DISPOSALS_SORT_RIGHT || ptype == PIPE_DISPOSALS_SORT_LEFT)
var/obj/structure/disposalpipe/sortjunction/SortP = P
SortP.updatedir()
- else if(ptype==6) // Disposal bin
+ else if(ptype == PIPE_DISPOSALS_BIN) // Disposal bin
var/obj/machinery/disposal/P = new /obj/machinery/disposal(src.loc)
src.transfer_fingerprints_to(P)
P.mode = 0 // start with pump off
- else if(ptype==7) // Disposal outlet
+ else if(ptype == PIPE_DISPOSALS_OUTLET) // Disposal outlet
var/obj/structure/disposaloutlet/P = new /obj/structure/disposaloutlet(src.loc)
src.transfer_fingerprints_to(P)
P.dir = dir
- else if(ptype==8) // Disposal outlet
+ else if(ptype==PIPE_DISPOSALS_CHUTE) // Disposal outlet
var/obj/machinery/disposal/deliveryChute/P = new /obj/machinery/disposal/deliveryChute(src.loc)
src.transfer_fingerprints_to(P)
@@ -265,3 +256,13 @@
else
to_chat(user, "You need to attach it to the plating first!")
return
+
+/obj/structure/disposalconstruct/rpd_act(mob/user, obj/item/rpd/our_rpd)
+ if(our_rpd.mode == RPD_ROTATE_MODE)
+ rotate()
+ else if(our_rpd.mode == RPD_FLIP_MODE)
+ flip()
+ else if(our_rpd.mode == RPD_DELETE_MODE)
+ our_rpd.delete_single_pipe(user, src)
+ else
+ ..()
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index 00b3b06a3a5..476028b4532 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -97,7 +97,7 @@
to_chat(user, "You sliced the floorweld off the disposal unit.")
var/obj/structure/disposalconstruct/C = new (src.loc)
src.transfer_fingerprints_to(C)
- C.ptype = 6 // 6 = disposal unit
+ C.ptype = PIPE_DISPOSALS_BIN
C.anchored = 1
C.density = 1
C.update()
@@ -889,21 +889,21 @@
var/obj/structure/disposalconstruct/C = new (src.loc)
switch(base_icon_state)
if("pipe-s")
- C.ptype = 0
+ C.ptype = PIPE_DISPOSALS_STRAIGHT
if("pipe-c")
- C.ptype = 1
+ C.ptype = PIPE_DISPOSALS_BENT
if("pipe-j1")
- C.ptype = 2
+ C.ptype = PIPE_DISPOSALS_JUNCTION_RIGHT
if("pipe-j2")
- C.ptype = 3
+ C.ptype = PIPE_DISPOSALS_JUNCTION_LEFT
if("pipe-y")
- C.ptype = 4
+ C.ptype = PIPE_DISPOSALS_Y_JUNCTION
if("pipe-t")
- C.ptype = 5
+ C.ptype = PIPE_DISPOSALS_TRUNK
if("pipe-j1s")
- C.ptype = 9
+ C.ptype = PIPE_DISPOSALS_SORT_RIGHT
if("pipe-j2s")
- C.ptype = 10
+ C.ptype = PIPE_DISPOSALS_SORT_LEFT
src.transfer_fingerprints_to(C)
C.dir = dir
C.density = 0
@@ -1339,7 +1339,7 @@
to_chat(user, "You sliced the floorweld off the disposal outlet.")
var/obj/structure/disposalconstruct/C = new (src.loc)
src.transfer_fingerprints_to(C)
- C.ptype = 7 // 7 = outlet
+ C.ptype = PIPE_DISPOSALS_OUTLET
C.update()
C.anchored = 1
C.density = 1
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index c40ed9fe73b..8b2f7c4197f 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -349,7 +349,7 @@
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the delivery chute.")
var/obj/structure/disposalconstruct/C = new (src.loc)
- C.ptype = 8 // 8 = Delivery chute
+ C.ptype = PIPE_DISPOSALS_CHUTE
C.update()
C.anchored = 1
C.density = 1
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 5782d9f19c8..638a614fc85 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -103,15 +103,15 @@
build_path = /obj/item/mass_spectrometer
category = list("Medical")
-/datum/design/posibrain
+/datum/design/robotic_brain
name = "Robotic Brain"
- desc = "The latest in Artificial Intelligences."
- id = "mmi_posi"
+ desc = "The latest in non-sentient Artificial Intelligences."
+ id = "mmi_robotic"
req_tech = list("programming" = 5, "biotech" = 4, "plasmatech" = 3)
build_type = PROTOLATHE | MECHFAB
materials = list(MAT_METAL = 1700, MAT_GLASS = 1350, MAT_GOLD = 500) //Gold, because SWAG.
construction_time = 75
- build_path = /obj/item/mmi/posibrain
+ build_path = /obj/item/mmi/robotic_brain
category = list("Misc","Medical")
/datum/design/mmi_radio_upgrade
diff --git a/code/modules/surgery/helpers.dm b/code/modules/surgery/helpers.dm
index 715f3e9837b..1ae29143496 100644
--- a/code/modules/surgery/helpers.dm
+++ b/code/modules/surgery/helpers.dm
@@ -84,7 +84,7 @@
/proc/get_pain_modifier(mob/living/carbon/human/M) //returns modfier to make surgery harder if patient is conscious and feels pain
if(M.stat) //stat=0 if CONSCIOUS, 1=UNCONSCIOUS and 2=DEAD. Operating on dead people is easy, too. Just sleeping won't work, though.
return 1
- if(NO_PAIN in M.species.species_traits)//if you don't feel pain, you can hold still
+ if(NO_PAIN in M.dna.species.species_traits)//if you don't feel pain, you can hold still
return 1
if(M.reagents.has_reagent("hydrocodone"))//really good pain killer
return 0.99
diff --git a/code/modules/surgery/limb_reattach.dm b/code/modules/surgery/limb_reattach.dm
index 2e8a3b85300..42db2e97da1 100644
--- a/code/modules/surgery/limb_reattach.dm
+++ b/code/modules/surgery/limb_reattach.dm
@@ -32,7 +32,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
var/obj/item/organ/external/affected = H.get_organ(user.zone_sel.selecting)
- if(target.get_species() == "Machine")
+ if(ismachine(target))
// RIP bi-centennial man
return 0
if(!affected)
@@ -76,7 +76,7 @@
var/obj/item/organ/external/affected = target.get_organ(target_zone)
if(affected)
return 0
- var/list/organ_data = target.species.has_limbs["[target_zone]"]
+ var/list/organ_data = target.dna.species.has_limbs["[target_zone]"]
return !isnull(organ_data)
/datum/surgery_step/limb/attach
@@ -233,7 +233,7 @@
for(var/part_name in L.part)
if(!isnull(target.get_organ(part_name)))
continue
- var/list/organ_data = target.species.has_limbs["[part_name]"]
+ var/list/organ_data = target.dna.species.has_limbs["[part_name]"]
if(!organ_data)
continue
// This will break if there's more than one stump ever
diff --git a/code/modules/surgery/organs/augments_eyes.dm b/code/modules/surgery/organs/augments_eyes.dm
index 305bbb2c603..fe1adce42fb 100644
--- a/code/modules/surgery/organs/augments_eyes.dm
+++ b/code/modules/surgery/organs/augments_eyes.dm
@@ -33,7 +33,7 @@
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
- var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.species.eyes)
+ var/icon/cybereyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes)
cybereyes_icon.Blend(eye_colour, ICON_ADD) // Eye implants override native DNA eye color
return cybereyes_icon
diff --git a/code/modules/surgery/organs/blood.dm b/code/modules/surgery/organs/blood.dm
index 9789798c6c6..3497d86eb02 100644
--- a/code/modules/surgery/organs/blood.dm
+++ b/code/modules/surgery/organs/blood.dm
@@ -18,7 +18,7 @@
/mob/living/carbon/human/handle_blood()
var/list/blood_data = get_blood_data(get_blood_id())//PROCCEPTION
- if(NO_BLOOD in species.species_traits)
+ if(NO_BLOOD in dna.species.species_traits)
bleed_rate = 0
return
@@ -43,14 +43,14 @@
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
if(prob(5))
to_chat(src, "You feel [word].")
- apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1), species.blood_damage_type)
+ apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1), dna.species.blood_damage_type)
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
- apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1), species.blood_damage_type)
+ apply_damage_type(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1), dna.species.blood_damage_type)
if(prob(5))
EyeBlurry(6)
to_chat(src, "You feel very [word].")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
- apply_damage_type(5, species.blood_damage_type)
+ apply_damage_type(5, dna.species.blood_damage_type)
if(prob(15))
Paralyse(rand(1,3))
to_chat(src, "You feel extremely [word].")
@@ -99,9 +99,9 @@
add_splatter_floor(loc, 1)
/mob/living/carbon/human/bleed(amt)
- if(!(NO_BLOOD in species.species_traits))
+ if(!(NO_BLOOD in dna.species.species_traits))
..()
- if(species.exotic_blood)
+ if(dna.species.exotic_blood)
var/datum/reagent/R = chemical_reagents_list[get_blood_id()]
if(istype(R) && isturf(loc))
R.reaction_turf(get_turf(src), amt)
@@ -186,7 +186,7 @@
blood_data["blood_type"] = copytext(src.dna.b_type,1,0)
blood_data["gender"] = gender
blood_data["real_name"] = real_name
- blood_data["blood_color"] = species.blood_color
+ blood_data["blood_color"] = dna.species.blood_color
blood_data["factions"] = faction
return blood_data
@@ -199,9 +199,9 @@
return "blood"
/mob/living/carbon/human/get_blood_id()
- if(species.exotic_blood)//some races may bleed water..or kethcup..
- return species.exotic_blood
- else if((NO_BLOOD in species.species_traits) || (NOCLONE in mutations))
+ if(dna.species.exotic_blood)//some races may bleed water..or kethcup..
+ return dna.species.exotic_blood
+ else if((NO_BLOOD in dna.species.species_traits) || (NOCLONE in mutations))
return
return "blood"
@@ -279,7 +279,7 @@
B.layer = BELOW_MOB_LAYER //So the blood lands ontop of things like posters, windows, etc.
/mob/living/carbon/human/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
- if(!(NO_BLOOD in species.species_traits))
+ if(!(NO_BLOOD in dna.species.species_traits))
..()
/mob/living/carbon/alien/add_splatter_floor(turf/T, small_drip, shift_x, shift_y)
diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm
index bce0f0f8046..51d73fc9873 100644
--- a/code/modules/surgery/organs/eyes.dm
+++ b/code/modules/surgery/organs/eyes.dm
@@ -20,7 +20,7 @@
var/mob/living/carbon/human/H = HA
if(!istype(H))
H = owner
- var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.species.eyes)
+ var/icon/eyes_icon = new /icon('icons/mob/human_face.dmi', H.dna.species.eyes)
eyes_icon.Blend(eye_colour, ICON_ADD)
return eyes_icon
diff --git a/code/modules/surgery/organs/heart.dm b/code/modules/surgery/organs/heart.dm
index 59643723d78..bd7cca63779 100644
--- a/code/modules/surgery/organs/heart.dm
+++ b/code/modules/surgery/organs/heart.dm
@@ -85,7 +85,7 @@
/obj/item/organ/internal/heart/cursed/attack(mob/living/carbon/human/H, mob/living/carbon/human/user, obj/target)
if(H == user && istype(H))
- if(NO_BLOOD in H.species.species_traits)
+ if(NO_BLOOD in H.dna.species.species_traits)
to_chat(H, "\The [src] is not compatible with your form!")
return
playsound(user,'sound/effects/singlebeat.ogg', 40, 1)
@@ -98,7 +98,7 @@
if(world.time > (last_pump + pump_delay))
if(ishuman(owner) && owner.client) //While this entire item exists to make people suffer, they can't control disconnects.
var/mob/living/carbon/human/H = owner
- if(!(NO_BLOOD in H.species.species_traits))
+ if(!(NO_BLOOD in H.dna.species.species_traits))
H.blood_volume = max(H.blood_volume - blood_loss, 0)
to_chat(H, "You have to keep pumping your blood!")
if(H.client)
@@ -131,7 +131,7 @@
var/mob/living/carbon/human/H = owner
if(istype(H))
- if(!(NO_BLOOD in H.species.species_traits))
+ if(!(NO_BLOOD in H.dna.species.species_traits))
H.blood_volume = min(H.blood_volume + cursed_heart.blood_loss*0.5, BLOOD_VOLUME_NORMAL)
if(owner.client)
owner.client.color = ""
diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm
index 7968d06064f..6182f1f4138 100644
--- a/code/modules/surgery/organs/lungs.dm
+++ b/code/modules/surgery/organs/lungs.dm
@@ -154,12 +154,12 @@
if(safe_nitro_min)
if(N2_pp < safe_nitro_min)
gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.nitrogen)
- H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro)
+ H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro)
else
H.failed_last_breath = FALSE
H.adjustOxyLoss(-5)
gas_breathed = breath.nitrogen
- H.clear_alert("nitro")
+ H.clear_alert("not_enough_nitro")
//Exhale
breath.nitrogen -= gas_breathed
@@ -271,11 +271,11 @@
var/breath_temperature = breath.temperature
var/species_traits = list()
- if(H && H.species && H.species.species_traits)
- species_traits = H.species.species_traits
+ if(H && H.dna.species && H.dna.species.species_traits)
+ species_traits = H.dna.species.species_traits
if(!(COLDRES in H.mutations) && !(RESISTCOLD in species_traits)) // COLD DAMAGE
- var/CM = abs(H.species.coldmod)
+ var/CM = abs(H.dna.species.coldmod)
var/TC = 0
if(breath_temperature < cold_level_3_threshold)
TC = cold_level_3_damage
@@ -291,7 +291,7 @@
to_chat(H, "You feel [cold_message] in your [name]!")
if(!(HEATRES in H.mutations) && !(RESISTHOT in species_traits)) // HEAT DAMAGE
- var/HM = abs(H.species.heatmod)
+ var/HM = abs(H.dna.species.heatmod)
var/TH = 0
if(breath_temperature > heat_level_1_threshold && breath_temperature < heat_level_2_threshold)
TH = heat_level_1_damage
@@ -315,7 +315,6 @@
name = "plasma filter"
desc = "A spongy rib-shaped mass for filtering plasma from the air."
icon_state = "lungs-plasma"
- species = "Plasmaman"
safe_oxygen_min = 0 //We don't breath this
safe_toxins_min = 16 //We breathe THIS!
@@ -324,7 +323,6 @@
/obj/item/organ/internal/lungs/vox
name = "Vox lungs"
desc = "They're filled with dust....wow."
- species = "Vox"
safe_oxygen_min = 0 //We don't breathe this
safe_oxygen_max = 1 //This is toxic to us
@@ -333,7 +331,6 @@
/obj/item/organ/internal/lungs/drask
icon = 'icons/obj/surgery_drask.dmi'
- species = "Drask"
cold_message = "an invigorating coldness"
cold_level_3_threshold = 60
diff --git a/code/modules/surgery/organs/mmi_holder.dm b/code/modules/surgery/organs/mmi_holder.dm
new file mode 100644
index 00000000000..8b5834bd8fc
--- /dev/null
+++ b/code/modules/surgery/organs/mmi_holder.dm
@@ -0,0 +1,36 @@
+// Used for an MMI or robotic brain being installed into a human.
+/obj/item/organ/internal/brain/mmi_holder
+ name = "Man-Machine Interface"
+ parent_organ = "chest"
+ status = ORGAN_ROBOT
+ var/obj/item/mmi/stored_mmi
+
+/obj/item/organ/internal/brain/mmi_holder/Destroy()
+ QDEL_NULL(stored_mmi)
+ return ..()
+
+/obj/item/organ/internal/brain/mmi_holder/insert(mob/living/target, special = 0)
+ ..()
+ // To supersede the over-writing of the MMI's name from `insert`
+ update_from_mmi()
+
+/obj/item/organ/internal/brain/mmi_holder/remove(mob/living/user, special = 0)
+ if(!special)
+ if(stored_mmi)
+ . = stored_mmi
+ if(owner.mind)
+ owner.mind.transfer_to(stored_mmi.brainmob)
+ stored_mmi.forceMove(get_turf(owner))
+ stored_mmi = null
+ ..()
+ if(!QDELETED(src))
+ qdel(src)
+
+/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi()
+ if(!stored_mmi)
+ return
+ name = stored_mmi.name
+ desc = stored_mmi.desc
+ icon = stored_mmi.icon
+ icon_state = stored_mmi.icon_state
+ set_dna(stored_mmi.brainmob.dna)
\ No newline at end of file
diff --git a/code/modules/surgery/organs/organ.dm b/code/modules/surgery/organs/organ.dm
index 6cca1117b28..991a5d252ce 100644
--- a/code/modules/surgery/organs/organ.dm
+++ b/code/modules/surgery/organs/organ.dm
@@ -19,7 +19,6 @@
// links chemical IDs to number of ticks for which they'll stay in the blood
germ_level = 0
var/datum/dna/dna
- var/datum/species/species = "Human"
// Stuff for tracking if this is on a tile with an open freezer or not
var/last_freezer_update_time = 0
@@ -30,6 +29,7 @@
var/tough = FALSE //can organ be easily damaged?
var/emp_proof = FALSE //is the organ immune to EMPs?
var/hidden_pain = FALSE //will it skip pain messages?
+ var/requires_robotic_bodypart = FALSE
/obj/item/organ/Destroy()
@@ -43,15 +43,13 @@
/obj/item/organ/proc/update_health()
return
-/obj/item/organ/New(var/mob/living/carbon/holder)
+/obj/item/organ/New(mob/living/carbon/holder, datum/species/species_override = null)
..(holder)
if(!max_damage)
max_damage = min_broken_damage * 2
if(istype(holder))
- species = all_species["Human"]
if(holder.dna)
dna = holder.dna.Clone()
- species = all_species[dna.species]
else
log_runtime(EXCEPTION("[holder] spawned without a proper DNA."), holder)
var/mob/living/carbon/human/H = holder
@@ -61,8 +59,9 @@
blood_DNA = list()
blood_DNA[dna.unique_enzymes] = dna.b_type
else
- if(istext(species))
- species = all_species[species]
+ dna = new /datum/dna(null)
+ if(species_override)
+ dna.species = new species_override
/obj/item/organ/proc/set_dna(var/datum/dna/new_dna)
if(new_dna)
@@ -92,7 +91,7 @@
return
//Process infections
- if(is_robotic() || sterile || (owner && (IS_PLANT in owner.species.species_traits)))
+ if(is_robotic() || sterile || (owner && (IS_PLANT in owner.dna.species.species_traits)))
germ_level = 0
return
@@ -154,7 +153,7 @@
germ_level++
if(germ_level >= INFECTION_LEVEL_ONE)
- var/fever_temperature = (owner.species.heat_level_1 - owner.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.species.body_temperature
+ var/fever_temperature = (owner.dna.species.heat_level_1 - owner.dna.species.body_temperature - 5)* min(germ_level/INFECTION_LEVEL_TWO, 1) + owner.dna.species.body_temperature
owner.bodytemperature += between(0, (fever_temperature - T20C)/BODYTEMP_COLD_DIVISOR + 1, fever_temperature - owner.bodytemperature)
if(germ_level >= INFECTION_LEVEL_TWO)
diff --git a/code/modules/surgery/organs/organ_external.dm b/code/modules/surgery/organs/organ_external.dm
index bd064a7d062..04ce880d5f5 100644
--- a/code/modules/surgery/organs/organ_external.dm
+++ b/code/modules/surgery/organs/organ_external.dm
@@ -105,13 +105,12 @@
/obj/item/organ/external/New(var/mob/living/carbon/holder)
..()
var/mob/living/carbon/human/H = holder
- icobase = species.icobase
- deform = species.deform
+ icobase = dna.species.icobase
+ deform = dna.species.deform
if(istype(H))
replaced(H)
sync_colour_to_human(H)
- spawn(1)
- get_icon()
+ get_icon()
/obj/item/organ/external/replaced(var/mob/living/carbon/human/target)
owner = target
@@ -279,7 +278,8 @@ This function completely restores a damaged organ to perfect condition.
for(var/obj/item/organ/external/EO in contents)
EO.rejuvenate()
- owner.updatehealth()
+ if(owner)
+ owner.updatehealth()
update_icon()
if(!owner)
processing_objects |= src
@@ -328,7 +328,7 @@ Note that amputating the affected organ does in fact remove the infection from t
*/
/obj/item/organ/external/proc/update_germs()
- if(is_robotic() || (IS_PLANT in owner.species.species_traits)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
+ if(is_robotic() || (IS_PLANT in owner.dna.species.species_traits)) //Robotic limbs shouldn't be infected, nor should nonexistant limbs.
germ_level = 0
return
@@ -400,7 +400,7 @@ Note that amputating the affected organ does in fact remove the infection from t
fracture()
/obj/item/organ/external/proc/check_for_internal_bleeding(damage)
- if(NO_BLOOD in owner.species.species_traits)
+ if(NO_BLOOD in owner.dna.species.species_traits)
return
var/local_damage = brute_dam + damage
if(damage > 15 && local_damage > 30 && prob(damage) && !is_robotic())
@@ -449,7 +449,7 @@ Note that amputating the affected organ does in fact remove the infection from t
****************************************************/
//Handles dismemberment
-/obj/item/organ/external/proc/droplimb(var/clean, var/disintegrate, var/ignore_children, var/nodamage)
+/obj/item/organ/external/proc/droplimb(clean, disintegrate, ignore_children, nodamage)
if(cannot_amputate || !owner)
return
@@ -494,16 +494,17 @@ Note that amputating the affected organ does in fact remove the infection from t
parent.receive_damage(total_brute, total_burn, ignore_resists = TRUE) //Transfer the full damage to the parent, bypass limb damage reduction.
parent = null
- spawn(1)
- if(victim)
- victim.updatehealth()
- victim.UpdateDamageIcon()
- victim.regenerate_icons()
dir = 2
+
+ if(victim)
+ victim.updatehealth()
+ victim.UpdateDamageIcon()
+ victim.regenerate_icons()
+
switch(disintegrate)
if(DROPLIMB_SHARP)
compile_icon()
- add_blood(victim.blood_DNA, victim.species.blood_color)
+ add_blood(victim.blood_DNA, victim.dna.species.blood_color)
var/matrix/M = matrix()
M.Turn(rand(180))
src.transform = M
@@ -513,7 +514,7 @@ Note that amputating the affected organ does in fact remove the infection from t
dropped_part.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30)
dir = 2
brute_dam = 0
- burn_dam = 0 //Reset the damage on the limb; the damage should have transferred to the parent; we don't want extra damage being re-applie when then limb is re-attached
+ burn_dam = 0 //Reset the damage on the limb; the damage should have transferred to the parent; we don't want extra damage being re-applied when then limb is re-attached
return dropped_part
else
qdel(src) // If you flashed away to ashes, YOU FLASHED AWAY TO ASHES
@@ -606,7 +607,7 @@ Note that amputating the affected organ does in fact remove the infection from t
"You hear a loud cracking sound coming from \the [owner].",\
"Something feels like it shattered in your [name]!",\
"You hear a sickening crack.")
- if(owner.species && !(NO_PAIN in owner.species.species_traits))
+ if(owner.dna.species && !(NO_PAIN in owner.dna.species.species_traits))
owner.emote("scream")
status |= ORGAN_BROKEN
diff --git a/code/modules/surgery/organs/organ_icon.dm b/code/modules/surgery/organs/organ_icon.dm
index d1c1070b19d..43d699c0408 100644
--- a/code/modules/surgery/organs/organ_icon.dm
+++ b/code/modules/surgery/organs/organ_icon.dm
@@ -16,7 +16,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/change_organ_icobase(var/new_icobase, var/new_deform, var/owner_sensitive) //Change the icobase/deform of this organ. If owner_sensitive is set, that means the proc won't mess with frankenstein limbs.
if(owner_sensitive) //This and the below statements mean that the icobase/deform will only get updated if the limb is the same species as and is owned by the mob it's attached to.
- if(species && owner.species && species.name != owner.species.name)
+ if(dna.species && owner.dna.species && dna.species.name != owner.dna.species.name)
return
if(dna.unique_enzymes != owner.dna.unique_enzymes) // This isn't MY arm
return
@@ -25,31 +25,31 @@ var/global/list/limb_icon_cache = list()
deform = new_deform ? new_deform : deform
/obj/item/organ/external/proc/sync_colour_to_human(var/mob/living/carbon/human/H)
- if(is_robotic() && !(species && species.name == "Machine")) //machine people get skin color
+ if(is_robotic() && !istype(dna.species, /datum/species/machine)) //machine people get skin color
return
- if(species && H.species && species.name != H.species.name)
+ if(dna.species && H.dna.species && dna.species.name != H.dna.species.name)
return
if(dna.unique_enzymes != H.dna.unique_enzymes) // This isn't MY arm
- if(!(H.species.bodyflags & HAS_ICON_SKIN_TONE))
+ if(!(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE))
sync_colour_to_dna()
return
- if(!isnull(H.s_tone) && ((H.species.bodyflags & HAS_SKIN_TONE) || (H.species.bodyflags & HAS_ICON_SKIN_TONE)))
+ if(!isnull(H.s_tone) && ((H.dna.species.bodyflags & HAS_SKIN_TONE) || (H.dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
s_col = null
s_tone = H.s_tone
- if(H.species.bodyflags & HAS_SKIN_COLOR)
+ if(H.dna.species.bodyflags & HAS_SKIN_COLOR)
s_tone = null
s_col = H.skin_colour
- if(H.species.bodyflags & HAS_ICON_SKIN_TONE)
+ if(H.dna.species.bodyflags & HAS_ICON_SKIN_TONE)
var/obj/item/organ/external/chest/C = H.get_organ("chest")
change_organ_icobase(C.icobase, C.deform)
/obj/item/organ/external/proc/sync_colour_to_dna()
if(is_robotic())
return
- if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && ((species.bodyflags & HAS_SKIN_TONE) || (species.bodyflags & HAS_ICON_SKIN_TONE)))
+ if(!isnull(dna.GetUIValue(DNA_UI_SKIN_TONE)) && ((dna.species.bodyflags & HAS_SKIN_TONE) || (dna.species.bodyflags & HAS_ICON_SKIN_TONE)))
s_col = null
s_tone = dna.GetUIValue(DNA_UI_SKIN_TONE)
- if(species.bodyflags & HAS_SKIN_COLOR)
+ if(dna.species.bodyflags & HAS_SKIN_COLOR)
s_tone = null
s_col = rgb(dna.GetUIValue(DNA_UI_SKIN_R), dna.GetUIValue(DNA_UI_SKIN_G), dna.GetUIValue(DNA_UI_SKIN_B))
@@ -64,11 +64,9 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/proc/get_icon(skeletal, fat)
// Kasparrov, you monster
- if(istext(species))
- species = all_species[species]
if(force_icon)
mob_icon = new /icon(force_icon, "[icon_name]")
- if(species && species.name == "Machine") //snowflake for IPC's, sorry.
+ if(istype(dna.species, /datum/species/machine)) //snowflake for IPC's, sorry.
if(s_col)
mob_icon.Blend(s_col, ICON_ADD)
else
@@ -101,13 +99,13 @@ var/global/list/limb_icon_cache = list()
if(!owner)
return
- if(species.has_organ["eyes"])
+ if(dna.species.has_organ["eyes"])
var/icon/eyes_icon = owner.get_eyecon()
if(eyes_icon)
mob_icon.Blend(eyes_icon, ICON_OVERLAY)
overlays |= eyes_icon
- if(owner.lip_style && (LIPS in species.species_traits))
+ if(owner.lip_style && (LIPS in dna.species.species_traits))
var/icon/lip_icon = new/icon('icons/mob/human_face.dmi', "lips_[owner.lip_style]_s")
overlays |= lip_icon
mob_icon.Blend(lip_icon, ICON_OVERLAY)
@@ -115,7 +113,7 @@ var/global/list/limb_icon_cache = list()
var/head_marking = owner.m_styles["head"]
if(head_marking && head_marking != "None")
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
- if(head_marking_style && head_marking_style.species_allowed && (species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
+ if(head_marking_style && head_marking_style.species_allowed && (dna.species.name in head_marking_style.species_allowed) && head_marking_style.marking_location == "head")
var/icon/h_marking_s = new/icon("icon" = head_marking_style.icon, "icon_state" = "[head_marking_style.icon_state]_s")
if(head_marking_style.do_colouration)
h_marking_s.Blend(owner.m_colours["head"], ICON_ADD)
@@ -123,7 +121,7 @@ var/global/list/limb_icon_cache = list()
if(ha_style)
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
- if(head_accessory_style && head_accessory_style.species_allowed && (species.name in head_accessory_style.species_allowed))
+ if(head_accessory_style && head_accessory_style.species_allowed && (dna.species.name in head_accessory_style.species_allowed))
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
if(head_accessory_style.do_colouration)
head_accessory_s.Blend(headacc_colour, ICON_ADD)
@@ -131,9 +129,9 @@ var/global/list/limb_icon_cache = list()
if(f_style)
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
- if(facial_hair_style && ((facial_hair_style.species_allowed && (species.name in facial_hair_style.species_allowed)) || (src.species.bodyflags & ALL_RPARTS)))
+ if(facial_hair_style && ((facial_hair_style.species_allowed && (dna.species.name in facial_hair_style.species_allowed)) || (dna.species.bodyflags & ALL_RPARTS)))
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
- if(species.name == "Slime People") // I am el worstos
+ if(istype(dna.species, /datum/species/slime)) // I am el worstos
facial_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha.
else if(facial_hair_style.do_colouration)
facial_s.Blend(facial_colour, ICON_ADD)
@@ -141,9 +139,9 @@ var/global/list/limb_icon_cache = list()
if(h_style && !(owner.head && (owner.head.flags & BLOCKHEADHAIR)))
var/datum/sprite_accessory/hair_style = hair_styles_full_list[h_style]
- if(hair_style && ((species.name in hair_style.species_allowed) || (src.species.bodyflags & ALL_RPARTS)))
+ if(hair_style && ((dna.species.name in hair_style.species_allowed) || (dna.species.bodyflags & ALL_RPARTS)))
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
- if(species.name == "Slime People") // I am el worstos
+ if(istype(dna.species, /datum/species/slime)) // I am el worstos
hair_s.Blend("[owner.skin_colour]A0", ICON_AND) //A0 = 160 alpha.
else if(hair_style.do_colouration)
hair_s.Blend(hair_colour, ICON_ADD)
@@ -184,7 +182,7 @@ var/global/list/limb_icon_cache = list()
/obj/item/organ/external/chest/get_icon_state(skeletal)
var/result = ..()
- if(fat && !skeletal && !is_robotic() && (CAN_BE_FAT in species.species_traits))
+ if(fat && !skeletal && !is_robotic() && (CAN_BE_FAT in dna.species.species_traits))
result[2] += "_fat"
return result
diff --git a/code/modules/surgery/organs/pain.dm b/code/modules/surgery/organs/pain.dm
index e3386aef1b3..4863bd63901 100644
--- a/code/modules/surgery/organs/pain.dm
+++ b/code/modules/surgery/organs/pain.dm
@@ -34,7 +34,7 @@ mob/living/carbon/human/proc/custom_pain(message)
if(stat >= UNCONSCIOUS)
return
- if(NO_PAIN in species.species_traits)
+ if(NO_PAIN in dna.species.species_traits)
return
if(reagents.has_reagent("morphine"))
return
@@ -54,7 +54,7 @@ mob/living/carbon/human/proc/handle_pain()
if(stat >= UNCONSCIOUS)
return
- if(NO_PAIN in species.species_traits)
+ if(NO_PAIN in dna.species.species_traits)
return
if(reagents.has_reagent("morphine"))
return
diff --git a/code/modules/surgery/organs/subtypes/abductor.dm b/code/modules/surgery/organs/subtypes/abductor.dm
index 6fd234bc501..58efd0094ed 100644
--- a/code/modules/surgery/organs/subtypes/abductor.dm
+++ b/code/modules/surgery/organs/subtypes/abductor.dm
@@ -1,4 +1,3 @@
/obj/item/organ/internal/eyes/abductor
name = "abductor eyeballs"
- dark_view = 3
- species = "Abductor"
+ dark_view = 3
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/diona.dm b/code/modules/surgery/organs/subtypes/diona.dm
index 951ca862317..be05b2917c3 100644
--- a/code/modules/surgery/organs/subtypes/diona.dm
+++ b/code/modules/surgery/organs/subtypes/diona.dm
@@ -6,7 +6,6 @@
amputation_point = "trunk"
encased = null
gendered_icon = 0
- species = "Diona"
/obj/item/organ/external/groin/diona
name = "fork"
@@ -14,7 +13,6 @@
cannot_break = 1
amputation_point = "lower trunk"
gendered_icon = 0
- species = "Diona"
/obj/item/organ/external/arm/diona
name = "left upper tendril"
@@ -22,7 +20,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper left trunk"
- species = "Diona"
/obj/item/organ/external/arm/right/diona
name = "right upper tendril"
@@ -30,7 +27,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "upper right trunk"
- species = "Diona"
/obj/item/organ/external/leg/diona
name = "left lower tendril"
@@ -38,7 +34,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower left fork"
- species = "Diona"
/obj/item/organ/external/leg/right/diona
name = "right lower tendril"
@@ -46,7 +41,6 @@
min_broken_damage = 20
cannot_break = 1
amputation_point = "lower right fork"
- species = "Diona"
/obj/item/organ/external/foot/diona
name = "left foot"
@@ -54,7 +48,6 @@
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/foot/right/diona
name = "right foot"
@@ -62,19 +55,16 @@
min_broken_damage = 10
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/hand/diona
name = "left grasper"
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/hand/right/diona
name = "right grasper"
cannot_break = 1
amputation_point = "branch"
- species = "Diona"
/obj/item/organ/external/head/diona
max_damage = 50
@@ -83,16 +73,6 @@
encased = null
amputation_point = "upper trunk"
gendered_icon = 0
- species = "Diona"
-
-//DIONA ORGANS.
-/* /obj/item/organ/external/diona/removed()
- var/mob/living/carbon/human/H = owner
- ..()
- if(!istype(H) || !H.bodyparts || !H.bodyparts.len)
- H.death()
- if(prob(50) && spawn_diona_nymph_from_organ(src))
- qdel(src) */
/obj/item/organ/diona/process()
return
@@ -101,31 +81,26 @@
name = "neural strata"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/brain/diona // Turns into a nymph instantly, no transplanting possible.
name = "gas bladder"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/kidneys/diona // Turns into a nymph instantly, no transplanting possible.
name = "polyp segment"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/appendix/diona // Turns into a nymph instantly, no transplanting possible.
name = "anchoring ligament"
icon = 'icons/obj/objects.dmi'
icon_state = "nymph"
- species = "Diona"
/obj/item/organ/internal/eyes/diona // Turns into a nymph instantly, no transplanting possible.
name = "receptor node"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- species = "Diona"
//TODO:Make absorb rads on insert
@@ -133,15 +108,4 @@
name = "nutrient vessel"
icon = 'icons/mob/alien.dmi'
icon_state = "claw"
- alcohol_intensity = 0.5
- species = "Diona"
-
-//TODO:Make absorb light on insert.
-
-/*/obj/item/organ/diona/removed(var/mob/living/user)
- var/mob/living/carbon/human/H = owner
- ..()
- if(!istype(H) || !H.bodyparts || !H.bodyparts.len)
- H.death()
- if(prob(50) && spawn_diona_nymph_from_organ(src))
- qdel(src) */
+ alcohol_intensity = 0.5
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/drask.dm b/code/modules/surgery/organs/subtypes/drask.dm
index 8560d2408ec..6e11cf2993e 100644
--- a/code/modules/surgery/organs/subtypes/drask.dm
+++ b/code/modules/surgery/organs/subtypes/drask.dm
@@ -4,31 +4,26 @@
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "innards"
desc = "A greenish, slightly translucent organ. It is extremely cold."
- species = "Drask"
/obj/item/organ/internal/heart/drask
name = "drask heart"
icon = 'icons/obj/surgery_drask.dmi'
parent_organ = "head"
- species = "Drask"
/obj/item/organ/internal/liver/drask
name = "metabolic strainer"
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "kidneys"
alcohol_intensity = 0.8
- species = "Drask"
/obj/item/organ/internal/brain/drask
icon = 'icons/obj/surgery_drask.dmi'
icon_state = "brain2"
mmi_icon = 'icons/obj/surgery_drask.dmi'
mmi_icon_state = "mmi_full"
- species = "Drask"
/obj/item/organ/internal/eyes/drask
name = "drask eyeballs"
icon = 'icons/obj/surgery_drask.dmi'
desc = "Drask eyes. They look even stranger disembodied"
- dark_view = 5
- species = "Drask"
+ dark_view = 5
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/grey.dm b/code/modules/surgery/organs/subtypes/grey.dm
index 6c06da373b7..177e4ae5be1 100644
--- a/code/modules/surgery/organs/subtypes/grey.dm
+++ b/code/modules/surgery/organs/subtypes/grey.dm
@@ -1,11 +1,9 @@
/obj/item/organ/internal/liver/grey
alcohol_intensity = 1.6
- species = "Grey"
/obj/item/organ/internal/brain/grey
icon_state = "brain-x"
mmi_icon_state = "mmi_alien"
- species = "Grey"
/obj/item/organ/internal/brain/grey/insert(var/mob/living/carbon/M, var/special = 0)
..()
@@ -17,5 +15,4 @@
/obj/item/organ/internal/eyes/grey
name = "grey eyeballs"
- dark_view = 5
- species = "Grey"
+ dark_view = 5
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/kidan.dm b/code/modules/surgery/organs/subtypes/kidan.dm
index 000e2984443..72290fd624b 100644
--- a/code/modules/surgery/organs/subtypes/kidan.dm
+++ b/code/modules/surgery/organs/subtypes/kidan.dm
@@ -1,6 +1,5 @@
/obj/item/organ/internal/liver/kidan
alcohol_intensity = 0.5
- species = "Kidan"
#define KIDAN_LANTERN_HUNGERCOST 0.5
#define KIDAN_LANTERN_MINHUNGER 150
diff --git a/code/modules/surgery/organs/subtypes/machine.dm b/code/modules/surgery/organs/subtypes/machine.dm
index 15f0bc5c118..7c2aae08894 100644
--- a/code/modules/surgery/organs/subtypes/machine.dm
+++ b/code/modules/surgery/organs/subtypes/machine.dm
@@ -5,100 +5,90 @@
min_broken_damage = 30
encased = null
status = ORGAN_ROBOT
- species = "Machine"
-/obj/item/organ/external/head/ipc/New()
+/obj/item/organ/external/head/ipc/New(mob/living/carbon/holder, datum/species/species_override = null)
+ ..(holder, /datum/species/machine) // IPC heads need to be explicitly set to this since you can print them
robotize("Morpheus Cyberkinetics")
- ..()
/obj/item/organ/external/chest/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/chest/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/groin/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/groin/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/arm/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/arm/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/arm/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/arm/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
+
/obj/item/organ/external/leg/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/leg/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/leg/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/leg/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/foot/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/foot/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/foot/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/foot/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/hand/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/hand/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/external/hand/right/ipc
encased = null
status = ORGAN_ROBOT
- species = "Machine"
/obj/item/organ/external/hand/right/ipc/New()
- robotize("Morpheus Cyberkinetics")
..()
+ robotize("Morpheus Cyberkinetics")
/obj/item/organ/internal/cell
name = "microbattery"
@@ -110,86 +100,30 @@
slot = "heart"
vital = TRUE
status = ORGAN_ROBOT
- species = "Machine"
-
-/obj/item/organ/internal/cell/New()
- robotize()
- ..()
/obj/item/organ/internal/eyes/optical_sensor
name = "optical sensor"
icon = 'icons/obj/robot_component.dmi'
icon_state = "camera"
status = ORGAN_ROBOT
- species = "Machine"
// dead_icon = "camera_broken"
weld_proof = 1
-/obj/item/organ/internal/eyes/optical_sensor/New()
- robotize()
- ..()
-
-
/obj/item/organ/internal/eyes/optical_sensor/remove(var/mob/living/user,special = 0)
if(!special)
to_chat(owner, "Error 404:Optical Sensors not found.")
. = ..()
-// Used for an MMI or posibrain being installed into a human.
-/obj/item/organ/internal/brain/mmi_holder
- name = "brain"
- organ_tag = "brain"
- parent_organ = "chest"
- vital = TRUE
- max_damage = 200
- slot = "brain"
- status = ORGAN_ROBOT
- species = "Machine"
- var/obj/item/mmi/stored_mmi
-
-/obj/item/organ/internal/brain/mmi_holder/Destroy()
- QDEL_NULL(stored_mmi)
- return ..()
-
-/obj/item/organ/internal/brain/mmi_holder/insert(var/mob/living/target,special = 0)
- ..()
- // To supersede the over-writing of the MMI's name from `insert`
- update_from_mmi()
-
-/obj/item/organ/internal/brain/mmi_holder/remove(var/mob/living/user,special = 0)
- if(!special)
- if(stored_mmi)
- . = stored_mmi
- if(owner.mind)
- owner.mind.transfer_to(stored_mmi.brainmob)
- stored_mmi.forceMove(get_turf(owner))
- stored_mmi = null
- ..()
- if(!QDELETED(src))
- qdel(src)
-
-/obj/item/organ/internal/brain/mmi_holder/proc/update_from_mmi()
- if(!stored_mmi)
- return
- name = stored_mmi.name
- desc = stored_mmi.desc
- icon = stored_mmi.icon
- icon_state = stored_mmi.icon_state
- set_dna(stored_mmi.brainmob.dna)
-
/obj/item/organ/internal/brain/mmi_holder/posibrain/New()
- robotize()
- stored_mmi = new /obj/item/mmi/posibrain/ipc(src)
..()
- spawn(1)
- if(!QDELETED(src))
- if(owner)
- stored_mmi.name = "positronic brain ([owner.real_name])"
- stored_mmi.brainmob.real_name = owner.real_name
- stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
- stored_mmi.icon_state = "posibrain-occupied"
- update_from_mmi()
- else
- stored_mmi.loc = get_turf(src)
- qdel(src)
+ stored_mmi = new /obj/item/mmi/robotic_brain/positronic(src)
+ if(owner)
+ stored_mmi.name = "positronic brain ([owner.real_name])"
+ stored_mmi.brainmob.real_name = owner.real_name
+ stored_mmi.brainmob.name = stored_mmi.brainmob.real_name
+ stored_mmi.icon_state = "posibrain-occupied"
+ update_from_mmi()
+ else
+ stored_mmi.forceMove(get_turf(src))
+ qdel(src)
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/nucleation.dm b/code/modules/surgery/organs/subtypes/nucleation.dm
index 4223834501d..3be564fc800 100644
--- a/code/modules/surgery/organs/subtypes/nucleation.dm
+++ b/code/modules/surgery/organs/subtypes/nucleation.dm
@@ -3,7 +3,6 @@
name = "nucleation organ"
icon = 'icons/obj/surgery.dmi'
desc = "A crystalized human organ. /red It has a strangely iridescent glow."
- species = "Nucleation"
/obj/item/organ/internal/nucleation/resonant_crystal
name = "resonant crystal"
@@ -11,7 +10,6 @@
organ_tag = "resonant crystal"
parent_organ = "head"
slot = "res_crystal"
- species = "Nucleation"
/obj/item/organ/internal/nucleation/strange_crystal
name = "strange crystal"
@@ -19,14 +17,12 @@
organ_tag = "strange crystal"
parent_organ = "chest"
slot = "heart"
- species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal
name = "luminescent eyes"
icon_state = "crystal-eyes"
organ_tag = "luminescent eyes"
light_color = "#1C1C00"
- species = "Nucleation"
/obj/item/organ/internal/eyes/luminescent_crystal/New()
set_light(2)
@@ -35,5 +31,4 @@
/obj/item/organ/internal/brain/crystal
name = "crystallized brain"
icon_state = "crystal-brain"
- organ_tag = "crystallized brain"
- species = "Nucleation"
+ organ_tag = "crystallized brain"
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/shadow.dm b/code/modules/surgery/organs/subtypes/shadow.dm
index f81fc54bfb1..26a0bc50577 100644
--- a/code/modules/surgery/organs/subtypes/shadow.dm
+++ b/code/modules/surgery/organs/subtypes/shadow.dm
@@ -1,4 +1,3 @@
/obj/item/organ/internal/eyes/shadow
name = "dark orbs"
- dark_view = 8
- species = "Shadow"
+ dark_view = 8
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm
index cb87d1c11c1..fd8a02f18d3 100644
--- a/code/modules/surgery/organs/subtypes/skrell.dm
+++ b/code/modules/surgery/organs/subtypes/skrell.dm
@@ -1,6 +1,5 @@
/obj/item/organ/internal/liver/skrell
alcohol_intensity = 4
- species = "Skrell"
/obj/item/organ/internal/headpocket
name = "headpocket"
@@ -10,7 +9,6 @@
w_class = WEIGHT_CLASS_TINY
parent_organ = "head"
slot = "headpocket"
- species = "Skrell"
actions_types = list(/datum/action/item_action/organ_action/toggle)
var/obj/item/storage/internal/pocket
diff --git a/code/modules/surgery/organs/subtypes/standard.dm b/code/modules/surgery/organs/subtypes/standard.dm
index 1a548de7d0a..c83678a71a5 100644
--- a/code/modules/surgery/organs/subtypes/standard.dm
+++ b/code/modules/surgery/organs/subtypes/standard.dm
@@ -194,12 +194,10 @@
owner.unEquip(owner.r_ear)
if(owner.wear_mask)
owner.unEquip(owner.wear_mask)
- spawn(1)
- if(owner)//runtimer no runtiming
- owner.update_hair()
- owner.update_fhair()
- owner.update_head_accessory()
- owner.update_markings()
+ owner.update_hair()
+ owner.update_fhair()
+ owner.update_head_accessory()
+ owner.update_markings()
. = ..()
/obj/item/organ/external/head/replaced()
diff --git a/code/modules/surgery/organs/subtypes/tajaran.dm b/code/modules/surgery/organs/subtypes/tajaran.dm
index a1313934037..1857fc5e45a 100644
--- a/code/modules/surgery/organs/subtypes/tajaran.dm
+++ b/code/modules/surgery/organs/subtypes/tajaran.dm
@@ -1,17 +1,14 @@
/obj/item/organ/internal/liver/tajaran
alcohol_intensity = 1.4
- species = "Tajaran"
/obj/item/organ/internal/eyes/tajaran
name = "tajaran eyeballs"
- species = "Tajaran"
colourblind_matrix = MATRIX_TAJ_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
replace_colours = LIST_TAJ_REPLACE
dark_view = 8
/obj/item/organ/internal/eyes/tajaran/farwa //Being the lesser form of Tajara, Farwas have an utterly incurable version of their colourblindness.
name = "farwa eyeballs"
- species = "Farwa"
colourmatrix = MATRIX_TAJ_CBLIND
dark_view = 8
replace_colours = LIST_TAJ_REPLACE
diff --git a/code/modules/surgery/organs/subtypes/unathi.dm b/code/modules/surgery/organs/subtypes/unathi.dm
index 0fb45319ce5..219ef0447e6 100644
--- a/code/modules/surgery/organs/subtypes/unathi.dm
+++ b/code/modules/surgery/organs/subtypes/unathi.dm
@@ -1,8 +1,6 @@
/obj/item/organ/internal/liver/unathi
alcohol_intensity = 0.8
- species = "Unathi"
/obj/item/organ/internal/eyes/unathi
name = "unathi eyeballs"
- dark_view = 3
- species = "Unathi"
+ dark_view = 3
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/vox.dm b/code/modules/surgery/organs/subtypes/vox.dm
index ba19a3cc948..e53c02040cc 100644
--- a/code/modules/surgery/organs/subtypes/vox.dm
+++ b/code/modules/surgery/organs/subtypes/vox.dm
@@ -1,7 +1,5 @@
/obj/item/organ/internal/liver/vox
- name = "Vox liver"
alcohol_intensity = 1.6
- species = "Vox"
/obj/item/organ/internal/stack
@@ -14,10 +12,7 @@
vital = TRUE
var/stackdamaged = FALSE
-/obj/item/organ/internal/stack/vox
- name = "vox cortical stack"
-
-/obj/item/organ/internal/stack/vox/on_life()
+/obj/item/organ/internal/stack/on_life()
if(damage < 1 && stackdamaged)
owner.mutations.Remove(SCRAMBLED)
owner.dna.SetSEState(SCRAMBLEBLOCK,0)
@@ -26,7 +21,7 @@
..()
-/obj/item/organ/internal/stack/vox/emp_act(severity)
+/obj/item/organ/internal/stack/emp_act(severity)
if(owner)
owner.mutations.Add(SCRAMBLED)
owner.dna.SetSEState(SCRAMBLEBLOCK,1,1)
diff --git a/code/modules/surgery/organs/subtypes/vulpkanin.dm b/code/modules/surgery/organs/subtypes/vulpkanin.dm
index be851c43486..959fbcc926c 100644
--- a/code/modules/surgery/organs/subtypes/vulpkanin.dm
+++ b/code/modules/surgery/organs/subtypes/vulpkanin.dm
@@ -1,18 +1,14 @@
/obj/item/organ/internal/liver/vulpkanin
alcohol_intensity = 1.4
- species = "Vulpkanin"
-
/obj/item/organ/internal/eyes/vulpkanin
name = "vulpkanin eyeballs"
- species = "Vulpkanin"
colourblind_matrix = MATRIX_VULP_CBLIND //The colour matrix and darksight parameters that the mob will recieve when they get the disability.
replace_colours = LIST_VULP_REPLACE
dark_view = 8
/obj/item/organ/internal/eyes/vulpkanin/wolpin //Being the lesser form of Vulpkanin, Wolpins have an utterly incurable version of their colourblindness.
name = "wolpin eyeballs"
- species = "Wolpin"
colourmatrix = MATRIX_VULP_CBLIND
dark_view = 8
- replace_colours = LIST_VULP_REPLACE
+ replace_colours = LIST_VULP_REPLACE
\ No newline at end of file
diff --git a/code/modules/surgery/organs/subtypes/wryn.dm b/code/modules/surgery/organs/subtypes/wryn.dm
index ee1a12fd1ab..ab30c16f61f 100644
--- a/code/modules/surgery/organs/subtypes/wryn.dm
+++ b/code/modules/surgery/organs/subtypes/wryn.dm
@@ -6,8 +6,6 @@
icon_state = "antennae"
parent_organ = "head"
slot = "hivenode"
- species = "Wryn"
/obj/item/organ/internal/eyes/wryn
- dark_view = 3
- species = "Wryn"
+ dark_view = 3
\ No newline at end of file
diff --git a/code/modules/surgery/organs_internal.dm b/code/modules/surgery/organs_internal.dm
index 11e16d10b1a..32270c329c2 100644
--- a/code/modules/surgery/organs_internal.dm
+++ b/code/modules/surgery/organs_internal.dm
@@ -101,6 +101,9 @@
if(is_int_organ(tool))
current_type = "insert"
I = tool
+ if(I.requires_robotic_bodypart)
+ to_chat(user, "[I] is an organ that requires a robotic interface[target].")
+ return -1
if(target_zone != I.parent_organ || target.get_organ_slot(I.slot))
to_chat(user, "There is no room for [I] in [target]'s [parse_zone(target_zone)]!")
return -1
@@ -257,12 +260,14 @@
else if(current_type == "insert")
I = tool
- user.drop_item()
- I.insert(target)
- spread_germs_to_organ(I, user, tool)
- if(!user.canUnEquip(I, 0))
+ if(I.requires_robotic_bodypart)
+ to_chat(user, "[I] is an organ that requires a robotic interface[target].")
+ return FALSE
+ if(!user.drop_item())
to_chat(user, "[I] is stuck to your hand, you can't put it in [target]!")
return 0
+ I.insert(target)
+ spread_germs_to_organ(I, user, tool)
if(affected)
user.visible_message(" [user] has transplanted [tool] into [target]'s [affected.name].",
diff --git a/code/modules/surgery/other.dm b/code/modules/surgery/other.dm
index 467f1e64a00..bcb5151d359 100644
--- a/code/modules/surgery/other.dm
+++ b/code/modules/surgery/other.dm
@@ -303,7 +303,7 @@
..()
/datum/surgery_step/internal/dethrall/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
- if(target.get_species() == "Lesser Shadowling") //Empowered thralls cannot be deconverted
+ if(isshadowlinglesser(target)) //Empowered thralls cannot be deconverted
to_chat(target, "NOT LIKE THIS!")
user.visible_message("[target] suddenly slams upward and knocks down [user]!", \
"[target] suddenly bolts up and slams you with tremendous force!")
diff --git a/code/modules/surgery/plastic_surgery.dm b/code/modules/surgery/plastic_surgery.dm
index a0e4c2a3976..9483818d153 100644
--- a/code/modules/surgery/plastic_surgery.dm
+++ b/code/modules/surgery/plastic_surgery.dm
@@ -24,7 +24,7 @@
/datum/surgery_step/reshape_face/end_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/external/head/head = target.get_organ(target_zone)
- var/species_names = target.get_species()
+ var/species_names = target.dna.species.name
if(head.disfigured)
head.disfigured = FALSE
user.visible_message("[user] successfully restores [target]'s appearance!", "You successfully restore [target]'s appearance.")
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index 3de2d350ee0..762c4e6040b 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -347,12 +347,12 @@
to_chat(user, "You cannot install a computer brain into a meat enclosure.")
return -1
- if(!target.species)
+ if(!target.dna.species)
to_chat(user, "You have no idea what species this person is. Report this on the bug tracker.")
return -1
- if(!target.species.has_organ["brain"])
- to_chat(user, "You're pretty sure [target.species.name_plural] don't normally have a brain.")
+ if(!target.dna.species.has_organ["brain"])
+ to_chat(user, "You're pretty sure [target.dna.species.name_plural] don't normally have a brain.")
return -1
if(target.get_int_organ(/obj/item/organ/internal/brain/))
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index 8007c40749b..72bf70c7e81 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -67,10 +67,6 @@
//How much blood this step can get on surgeon. 1 - hands, 2 - full body.
var/blood_level = 0
- var/list/allowed_mob = list()
- var/list/disallowed_mob = list()
-
-
/datum/surgery_step/proc/try_op(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/success = 0
if(accept_hand)
@@ -146,19 +142,8 @@
// Checks if this step applies to the user mob at all
/datum/surgery_step/proc/is_valid_target(mob/living/carbon/human/target)
if(!hasorgans(target))
- return 0
-
- if(allowed_mob)//can i just remove this and/or change it?
- for(var/species in allowed_mob)
- if(target.get_species() == species)
- return 1
-
- if(disallowed_mob)
- for(var/species in disallowed_mob)
- if(target.get_species() == species)
- return 0
-
- return 1
+ return FALSE
+ return TRUE
// checks whether this step can be applied with the given user and target
/datum/surgery_step/proc/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool,datum/surgery/surgery)
@@ -206,7 +191,7 @@
for(var/mob/living/carbon/human/H in view(2, E.loc))//germs from people
if(AStar(E.loc, H.loc, /turf/proc/Distance, 2, simulated_only = 0))
- if((!(BREATHLESS in H.mutations) || !(NO_BREATHE in H.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
+ if((!(BREATHLESS in H.mutations) || !(NO_BREATHE in H.dna.species.species_traits)) && !H.wear_mask) //wearing a mask helps preventing people from breathing cooties into open incisions
germs += H.germ_level * 0.25
for(var/obj/effect/decal/cleanable/M in view(2, E.loc))//germs from messes
diff --git a/code/modules/vr/vr_controller.dm b/code/modules/vr/vr_controller.dm
index 45bf2a6cc74..564291b2999 100644
--- a/code/modules/vr/vr_controller.dm
+++ b/code/modules/vr/vr_controller.dm
@@ -31,12 +31,12 @@ proc/build_virtual_avatar(mob/living/carbon/human/H, location, datum/map_templat
var/mob/living/carbon/human/virtual_reality/vr_avatar
location = get_turf(location)
vr_avatar = new /mob/living/carbon/human/virtual_reality(location)
- vr_avatar.set_species(H.species.name)
if(istype(H, /mob/living/carbon/human/virtual_reality))
var/mob/living/carbon/human/virtual_reality/V = H
vr_avatar.real_me = V.real_me
else
vr_avatar.real_me = H
+ vr_avatar.set_species(H.dna.species.type)
vr_avatar.dna = H.dna.Clone()
vr_avatar.name = H.name
vr_avatar.real_name = H.real_name
diff --git a/config/names/diona.txt b/config/names/diona.txt
deleted file mode 100644
index 3eb4b5f4498..00000000000
--- a/config/names/diona.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-Blade of Grass Bent Before Wind
-Glimmer Of The Stars
-The Ripple Of the Waves
-Colors Of Dusk
-The Still Of Night
-Silence Of The Wind
-Gentle Breeze of the Summer Wind
-Glistening Water under the Blazing Sun
-Child of the Scorching Sun
-Blessed Plant-ling of Eternal Fields
-Grass-walker of the Soothing Plains
-Element of the Undying Fiona
-Spawn of Mother Nature's Busum
\ No newline at end of file
diff --git a/html/changelog.html b/html/changelog.html
index 2d6490402bc..eb8e9b3d9c8 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -56,6 +56,74 @@
-->
+
22 July 2018
+
Fox McCloud updated:
+
+ - Fixes monkeys not having their own HUD
+ - Fixes monkey to human transformations missing their HUD
+ - Fixes changing species unequipping items
+ - Fixes organs not being rejuvinated properly by mitocholide
+ - Fixes shadowlings not being forced to hatch
+ - Having a robotic head will allow you to use buzz, ping, beep, and the likes
+ - Claw sharpening now works
+ - Abductors have their own headset instead of a syndicate one
+ - Can put monkeys in the gibber
+ - gibbing some species will now generate different types of hides (monkeys give monkey hides, unathi give lizard hides, the likes)
+ - fixes Vox name generation based on the wrong syllables
+ - consolidates diona name lists; you'll no longer be asked to rename your Diona when you start the shift
+ - botany grown diona can no longer rename themselves (as is consistent with ghost roles)
+ - Fixes DNA scrambler so it gives a proper randomized species name
+ - Fixed an edge case were Vox would have a permanent nitrogen alert
+ - Fixes operatives being bald most of the time
+ - Adds beesplosion chemical reaction
+
+
and taukausanake updated:
+
+ - Swarmers can no longer destroy active clone pods.
+
+
+
17 July 2018
+
Citinited updated:
+
+ - volume pumps can be dispensed by the RPD again
+
+
datlo updated:
+
+ - Provided abductors with an infection free surgery table.
+
+
+
16 July 2018
+
Citinited updated:
+
+ - RPD behaviour has been slightly tweaked - for example you can now rotate / flip / delete individual pipes by clicking on them without affecting other pipes on that tile.
+
+
Fox McCloud updated:
+
+ - Fixes hand labelers not being able to label storage objects
+ - Cameras can now be destroyed with weapons that have a force of 12 or greater
+ - Cameras have 2 wires as opposed to 6; camera focus and power wires still remain
+ - You can use hand labelers on reagent containers now
+
+
+
14 July 2018
+
Anasari updated:
+
+ - Assuming there is heal left, bandages and ointments used on limbs now heal both the limb and the hand / foot. Bandages and ointments used on the torso now heal head, arms, and lower body. The one on lower body heals the legs too.
+
+
Aurorablade updated:
+
+ - Adds Spess Koi and related event.
+
+
Citinited updated:
+
+ - The tachyon-doppler array now has a logging interface, and can print off stored explosive logs. Brag to your friends about your bomb-making skills!
+
+
Fox McCloud updated:
+
+ - Robotic brains have their own unique sprite and full flavortext's now
+ - Fixed a bug where IRC's would have IPC names
+
+
11 July 2018
Alffd updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 1d6450ffaef..829a38bbfbe 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -6623,3 +6623,57 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
datlo:
- bugfix: Replaced instances of "Human" in ion laws by "Crew".
- bugfix: Fixed the ability of Service Borgs to spawn items on floors. Dosh!
+2018-07-14:
+ Anasari:
+ - tweak: Assuming there is heal left, bandages and ointments used on limbs now heal
+ both the limb and the hand / foot. Bandages and ointments used on the torso
+ now heal head, arms, and lower body. The one on lower body heals the legs too.
+ Aurorablade:
+ - rscadd: Adds Spess Koi and related event.
+ Citinited:
+ - tweak: The tachyon-doppler array now has a logging interface, and can print off
+ stored explosive logs. Brag to your friends about your bomb-making skills!
+ Fox McCloud:
+ - tweak: Robotic brains have their own unique sprite and full flavortext's now
+ - bugfix: Fixed a bug where IRC's would have IPC names
+2018-07-16:
+ Citinited:
+ - tweak: RPD behaviour has been slightly tweaked - for example you can now rotate
+ / flip / delete individual pipes by clicking on them without affecting other
+ pipes on that tile.
+ Fox McCloud:
+ - bugfix: Fixes hand labelers not being able to label storage objects
+ - rscadd: Cameras can now be destroyed with weapons that have a force of 12 or greater
+ - tweak: Cameras have 2 wires as opposed to 6; camera focus and power wires still
+ remain
+ - tweak: You can use hand labelers on reagent containers now
+2018-07-17:
+ Citinited:
+ - bugfix: volume pumps can be dispensed by the RPD again
+ datlo:
+ - rscadd: Provided abductors with an infection free surgery table.
+2018-07-22:
+ Fox McCloud:
+ - bugfix: Fixes monkeys not having their own HUD
+ - bugfix: Fixes monkey to human transformations missing their HUD
+ - bugfix: Fixes changing species unequipping items
+ - bugfix: Fixes organs not being rejuvinated properly by mitocholide
+ - bugfix: Fixes shadowlings not being forced to hatch
+ - rscadd: Having a robotic head will allow you to use buzz, ping, beep, and the
+ likes
+ - tweak: Claw sharpening now works
+ - rscadd: Abductors have their own headset instead of a syndicate one
+ - tweak: Can put monkeys in the gibber
+ - rscadd: gibbing some species will now generate different types of hides (monkeys
+ give monkey hides, unathi give lizard hides, the likes)
+ - bugfix: fixes Vox name generation based on the wrong syllables
+ - tweak: consolidates diona name lists; you'll no longer be asked to rename your
+ Diona when you start the shift
+ - rscdel: botany grown diona can no longer rename themselves (as is consistent with
+ ghost roles)
+ - bugfix: Fixes DNA scrambler so it gives a proper randomized species name
+ - bugfix: Fixed an edge case were Vox would have a permanent nitrogen alert
+ - bugfix: Fixes operatives being bald most of the time
+ - rscadd: Adds beesplosion chemical reaction
+ and taukausanake:
+ - tweak: Swarmers can no longer destroy active clone pods.
diff --git a/icons/mob/ears.dmi b/icons/mob/ears.dmi
index 13d5981c458..597029a456c 100644
Binary files a/icons/mob/ears.dmi and b/icons/mob/ears.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 7bcd0607116..2adfdba5670 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi
index fd8eea36540..76a9486fee6 100644
Binary files a/icons/obj/fish_items.dmi and b/icons/obj/fish_items.dmi differ
diff --git a/icons/obj/food/containers.dmi b/icons/obj/food/containers.dmi
index 6825f6c652d..ff25b77ab45 100644
Binary files a/icons/obj/food/containers.dmi and b/icons/obj/food/containers.dmi differ
diff --git a/icons/obj/food/custom.dmi b/icons/obj/food/custom.dmi
new file mode 100644
index 00000000000..42d28790790
Binary files /dev/null and b/icons/obj/food/custom.dmi differ
diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi
index 3a0ec216714..487b36d3e97 100644
Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ
diff --git a/icons/obj/food/pasta.dmi b/icons/obj/food/pasta.dmi
new file mode 100644
index 00000000000..0179c3f5cc7
Binary files /dev/null and b/icons/obj/food/pasta.dmi differ
diff --git a/icons/obj/food/pizza.dmi b/icons/obj/food/pizza.dmi
new file mode 100644
index 00000000000..c26e792f2a0
Binary files /dev/null and b/icons/obj/food/pizza.dmi differ
diff --git a/icons/obj/module.dmi b/icons/obj/module.dmi
index 0a269e0d8b7..ab76789a0f0 100644
Binary files a/icons/obj/module.dmi and b/icons/obj/module.dmi differ
diff --git a/icons/obj/pipes/disposal.dmi b/icons/obj/pipes/disposal.dmi
index 707a064dd94..83440fc1b52 100644
Binary files a/icons/obj/pipes/disposal.dmi and b/icons/obj/pipes/disposal.dmi differ
diff --git a/nano/templates/doppler_array.tmpl b/nano/templates/doppler_array.tmpl
new file mode 100644
index 00000000000..d3bb40744b2
--- /dev/null
+++ b/nano/templates/doppler_array.tmpl
@@ -0,0 +1,25 @@
+Logged explosions:
+{{if data.explosion_data == 0}}
+ No explosions logged this shift.
+{{else}}
+
+ Time logged
+ Epicenter
+ Actual size
+ Theoretical size
+
+
+ {{for data.explosion_data}}
+
+
+ {{:value.logged_time}}
+ {{:value.epicenter}}
+ {{:value.actual_size_message}}
+ {{:value.theoretical_size_message}}
+ {{:helper.link("Delete", "trash", {"log_to_delete": value.unique_datum_id})}}
+
+
+ {{/for}}
+
+ {{:helper.link("Print all logs", "print", {"print_logs": 'yes'}, data.printing ? 'disabled' : null)}}
+{{/if}}
diff --git a/nano/templates/rpd.tmpl b/nano/templates/rpd.tmpl
index bd92b91c979..6a9c2ccb517 100644
--- a/nano/templates/rpd.tmpl
+++ b/nano/templates/rpd.tmpl
@@ -4,101 +4,104 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm
Mode:
{{for data.mainmenu}}
- {{:helper.link(String(value.category), String(value.icon), {"mode": Number(value.mode)}, data.mode == Number(value.mode) ? "linkOn" : null)}}
+ {{:helper.link(value.category, value.icon, {mode: value.mode}, data.mode == value.mode ? "linkOn" : null)}}
{{/for}}
{{if data.mode == 1}}
Pipe type:
{{for data.pipemenu}}
- {{:helper.link(String(value.pipecategory), null, {"pipetype": Number(value.pipemode)}, data.pipetype == Number(value.pipemode) ? "linkOn" : null)}}
+ {{:helper.link(value.category, null, {pipe_category: value.pipemode}, data.pipe_category == value.pipemode ? "linkOn" : null)}}
{{/for}}
Available pipes:
{{for data.pipelist}}
- {{if value.category == data.pipetype}}
-
{{:helper.link(String(value.pipename), "arrow-right", {"whatpipe": Number(value.id)}, data.whatpipe == Number(value.id) ? "linkOn" : null)}}
+ {{if value.pipe_type == 1 && value.pipe_category == data.pipe_category}}
+
{{:helper.link(value.pipe_name, "arrow-right", {whatpipe: value.pipe_id}, data.whatpipe == value.pipe_id ? "linkOn" : null)}}
{{/if}}
{{/for}}
{{for data.pipelist}}
+ {{if value.pipe_type != 1 || value.pipe_id != data.whatpipe || value.orientations == 1}}
+ {{continue;}}
+ {{/if}}
- {{if value.id == data.whatpipe && value.orientations != 1}}
-
- {{:helper.link("Orient automatically", null, {"iconrotation": 0}, data.iconrotation == 0 ? "linkOn" : null)}}
-
- {{/if}}
- {{if value.id == data.whatpipe && value.orientations != 1 && value.bendy != 1}}
+
+ {{:helper.link("Orient automatically", null, {iconrotation: 0}, data.iconrotation == 0 ? "linkOn" : null)}}
+
+ {{if value.bendy}}
- {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}}
-

+ {{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}}
+
- {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}}
-

-
- {{/if}}
- {{if value.id == data.whatpipe && value.orientations == 4 && value.bendy != 1}}
-
- {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}}
-

+ {{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}}
+
- {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}}
-

-
- {{/if}}
- {{if value.id == data.whatpipe && value.bendy == 1}}
-
- {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}}
-

+ {{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}}
+
- {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}}
-

+ {{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}}
+

+
+ {{else}}
+
+ {{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}}
+
- {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}}
-

-
-
- {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}}
-

+ {{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}}
+
+ {{if value.orientations == 4}}
+
+ {{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}}
+

+
+
+ {{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}}
+

+
+ {{/if}}
{{/if}}
{{/for}}
{{else data.mode == 2}}
Available pipes:
- {{for data.dpipelist}}
-
{{:helper.link(String(value.pipename), "arrow-right", {"whatdpipe": Number(value.id)}, data.whatdpipe == Number(value.id) ? "linkOn" : null)}}
+ {{for data.pipelist}}
+ {{if value.pipe_type == 2}}
+
{{:helper.link(value.pipe_name, "arrow-right", {whatdpipe: value.pipe_id}, data.whatdpipe == value.pipe_id ? "linkOn" : null)}}
+ {{/if}}
{{/for}}
- {{for data.dpipelist}}
+ {{for data.pipelist}}
+ {{if value.pipe_type != 2 || value.pipe_id != data.whatdpipe || value.orientations == 1}}
+ {{continue;}}
+ {{/if}}
- {{if value.id == data.whatdpipe && value.orientations != 1}}
-
- {{:helper.link("Orient automatically", null, {"iconrotation": 0}, data.iconrotation == 0 ? "linkOn" : null)}}
+
+ {{:helper.link("Orient automatically", null, {iconrotation: 0}, data.iconrotation == 0 ? "linkOn" : null)}}
+
+
+ {{:helper.link("", "arrow-right", {iconrotation: 1}, data.iconrotation == 1 ? "linkOn" : null)}}
+

+
+
+ {{:helper.link("", "arrow-right", {iconrotation: 4}, data.iconrotation == 4 ? "linkOn" : null)}}
+

+
+ {{if value.orientations == 4}}
+
+ {{:helper.link("", "arrow-right", {iconrotation: 2}, data.iconrotation == 2 ? "linkOn" : null)}}
+
- {{:helper.link("", "arrow-right", {"iconrotation": 1}, data.iconrotation == 1 ? "linkOn" : null)}}
-

-
-
- {{:helper.link("", "arrow-right", {"iconrotation": 4}, data.iconrotation == 4 ? "linkOn" : null)}}
-

-
- {{/if}}
- {{if value.id == data.whatdpipe && value.orientations == 4}}
-
- {{:helper.link("", "arrow-right", {"iconrotation": 2}, data.iconrotation == 2 ? "linkOn" : null)}}
-

-
-
- {{:helper.link("", "arrow-right", {"iconrotation": 8}, data.iconrotation == 8 ? "linkOn" : null)}}
-

+ {{:helper.link("", "arrow-right", {iconrotation: 8}, data.iconrotation == 8 ? "linkOn" : null)}}
+
{{/if}}
@@ -109,4 +112,4 @@ Used In File(s): /code/game/objects/items/weapons/rpd.dm
Device ready to flip loose pipes...
{{else data.mode == 5}}
Device ready to eat loose pipes...
-{{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/paradise.dme b/paradise.dme
index 85bf34aeeac..8993f3f625d 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -45,6 +45,7 @@
#include "code\__DEFINES\misc.dm"
#include "code\__DEFINES\mobs.dm"
#include "code\__DEFINES\pda.dm"
+#include "code\__DEFINES\pipes.dm"
#include "code\__DEFINES\preferences.dm"
#include "code\__DEFINES\process_scheduler.dm"
#include "code\__DEFINES\qdel.dm"
@@ -231,6 +232,7 @@
#include "code\datums\mixed.dm"
#include "code\datums\mutable_appearance.dm"
#include "code\datums\periodic_news.dm"
+#include "code\datums\pipe_datums.dm"
#include "code\datums\progressbar.dm"
#include "code\datums\recipe.dm"
#include "code\datums\ruins.dm"
@@ -470,8 +472,10 @@
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
#include "code\game\gamemodes\meteor\meteors.dm"
+#include "code\game\gamemodes\miniantags\abduction\abductee_objectives.dm"
#include "code\game\gamemodes\miniantags\abduction\abduction.dm"
#include "code\game\gamemodes\miniantags\abduction\abduction_gear.dm"
+#include "code\game\gamemodes\miniantags\abduction\abduction_outfits.dm"
#include "code\game\gamemodes\miniantags\abduction\abduction_surgery.dm"
#include "code\game\gamemodes\miniantags\abduction\gland.dm"
#include "code\game\gamemodes\miniantags\abduction\machinery\camera.dm"
@@ -1346,6 +1350,7 @@
#include "code\modules\events\immovable_rod.dm"
#include "code\modules\events\infestation.dm"
#include "code\modules\events\ion_storm.dm"
+#include "code\modules\events\koi_mirgration.dm"
#include "code\modules\events\mass_hallucination.dm"
#include "code\modules\events\meaty_gore.dm"
#include "code\modules\events\meaty_ops.dm"
@@ -1397,12 +1402,24 @@
#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm"
#include "code\modules\food_and_drinks\drinks\drinks\mugs.dm"
#include "code\modules\food_and_drinks\drinks\drinks\shotglass.dm"
-#include "code\modules\food_and_drinks\food\candy.dm"
#include "code\modules\food_and_drinks\food\condiment.dm"
#include "code\modules\food_and_drinks\food\customizables.dm"
-#include "code\modules\food_and_drinks\food\meat.dm"
-#include "code\modules\food_and_drinks\food\seafood.dm"
#include "code\modules\food_and_drinks\food\snacks.dm"
+#include "code\modules\food_and_drinks\food\foods\baked_goods.dm"
+#include "code\modules\food_and_drinks\food\foods\bread.dm"
+#include "code\modules\food_and_drinks\food\foods\candy.dm"
+#include "code\modules\food_and_drinks\food\foods\desserts.dm"
+#include "code\modules\food_and_drinks\food\foods\ethnic.dm"
+#include "code\modules\food_and_drinks\food\foods\ingredients.dm"
+#include "code\modules\food_and_drinks\food\foods\junkfood.dm"
+#include "code\modules\food_and_drinks\food\foods\meat.dm"
+#include "code\modules\food_and_drinks\food\foods\misc.dm"
+#include "code\modules\food_and_drinks\food\foods\pasta.dm"
+#include "code\modules\food_and_drinks\food\foods\pizza.dm"
+#include "code\modules\food_and_drinks\food\foods\sandwiches.dm"
+#include "code\modules\food_and_drinks\food\foods\seafood.dm"
+#include "code\modules\food_and_drinks\food\foods\side_dishes.dm"
+#include "code\modules\food_and_drinks\food\foods\soups.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\candy_maker.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\cereal_maker.dm"
#include "code\modules\food_and_drinks\kitchen_machinery\cooker.dm"
@@ -1621,7 +1638,7 @@
#include "code\modules\mob\living\carbon\brain\login.dm"
#include "code\modules\mob\living\carbon\brain\MMI.dm"
#include "code\modules\mob\living\carbon\brain\MMI_radio.dm"
-#include "code\modules\mob\living\carbon\brain\posibrain.dm"
+#include "code\modules\mob\living\carbon\brain\robotic_brain.dm"
#include "code\modules\mob\living\carbon\brain\say.dm"
#include "code\modules\mob\living\carbon\brain\update_status.dm"
#include "code\modules\mob\living\carbon\human\appearance.dm"
@@ -2191,6 +2208,7 @@
#include "code\modules\surgery\organs\kidneys.dm"
#include "code\modules\surgery\organs\liver.dm"
#include "code\modules\surgery\organs\lungs.dm"
+#include "code\modules\surgery\organs\mmi_holder.dm"
#include "code\modules\surgery\organs\organ.dm"
#include "code\modules\surgery\organs\organ_external.dm"
#include "code\modules\surgery\organs\organ_icon.dm"
diff --git a/sound/creatures/bee.ogg b/sound/creatures/bee.ogg
new file mode 100644
index 00000000000..ea8dcc2b369
Binary files /dev/null and b/sound/creatures/bee.ogg differ