From 2754c2fd14421284e6ef3ec9ca2347729522d0a0 Mon Sep 17 00:00:00 2001 From: 13spacemen <46101244+13spacemen@users.noreply.github.com> Date: Thu, 29 Feb 2024 01:26:34 +0500 Subject: [PATCH] Cosmetic Tail Organs [NO WAGGING] (#36060) * mob part bitflags in proper format, added tail part bitflag, hidetail clothing cover flag, reordered tail layer, added tail_underlimbs_layer for overlapping tails, limbs_layer for limbs placed under, tail_wagging + has_icon_skin_tone + tail_overlapped species anatomical flags, mutable_appearance() helper, made many suits cover tail, added tail wagging emote for species that can wag, made a species folder for species files, rewrote update_tail_showing(), character preview can show tails, vox tails are now separate from the body instead of being baked into the chest, vox tails will show slightly in north dir instead of being invisible * added color defines, undid bitfield format change, wag emote is shorter and doesnt show text on stopping wag, vox tails have their own file and have better names, removed icon manipulation from tail updating, species can have own tail icon, made vox tail north sprites full/complete sprites * wag emote no longer displays runechat, custom emotes can choose to not show runechat, restores old husk overlays * limb_tail tail define, moved 2 tail species flags to organ level, added span define, tail is on organ level, added support for cosmetic organs, tail preview icon shows better, added tail support to common surgeries * fix double tail organ, tail organ item only uses east sprite and is shifted to center it more * removes tail wagging * rename tail define, minor tweaks * more checks, fix char preview issues, remove unused proc, frankensteins spawn with random kind of tail, repaired tajaran and unathi tails credit to falcon2346, robotail support, rambler will not spawn with tail, gibbing drops tails * Update species.dm --- __DEFINES/colors.dm | 5 + __DEFINES/limb_defines.dm | 2 + __DEFINES/setup.dm | 51 +++-- __DEFINES/span.dm | 2 + code/datums/emotes.dm | 23 +- .../dynamic/dynamic_rulesets_midround.dm | 2 +- code/datums/mutable_appearance.dm | 31 +++ code/game/objects/items/robot/robot_parts.dm | 37 ++++ code/modules/clothing/clothing.dm | 2 +- code/modules/clothing/spacesuits/captain.dm | 2 +- code/modules/clothing/suits/bio.dm | 2 +- code/modules/clothing/suits/miscellaneous.dm | 2 +- code/modules/clothing/suits/utility.dm | 5 +- code/modules/mob/emote.dm | 16 +- code/modules/mob/living/carbon/human/death.dm | 2 + code/modules/mob/living/carbon/human/human.dm | 21 +- .../mob/living/carbon/human/human_damage.dm | 10 +- .../species.dm => species/plasmaman.dm} | 0 .../mob/living/carbon/human/species/vox.dm | 160 ++++++++++++++ .../mob/living/carbon/human/update_icons.dm | 63 ++++-- code/modules/mob/living/carbon/species.dm | 207 +++--------------- code/modules/mob/living/emote.dm | 3 + .../mob/new_player/preferences_setup.dm | 42 +++- code/modules/organs/organ.dm | 2 + code/modules/organs/organ_external.dm | 148 ++++++++++++- code/modules/overlays/mobs.dm | 16 +- code/modules/research/designs/robot.dm | 12 +- code/modules/surgery/generic.dm | 68 +++--- code/modules/surgery/robolimbs.dm | 46 ++-- code/modules/surgery/surgery.dm | 17 +- icons/effects/species.dmi | Bin 19753 -> 22105 bytes icons/mob/human_races/vox/r_def_vox.dmi | Bin 2030 -> 2055 bytes icons/mob/human_races/vox/r_def_voxazu.dmi | Bin 2042 -> 2055 bytes icons/mob/human_races/vox/r_def_voxbrn.dmi | Bin 2030 -> 2055 bytes icons/mob/human_races/vox/r_def_voxemrl.dmi | Bin 2046 -> 2055 bytes icons/mob/human_races/vox/r_def_voxgry.dmi | Bin 2216 -> 2241 bytes icons/mob/human_races/vox/r_def_voxlgrn.dmi | Bin 2029 -> 2038 bytes icons/mob/human_races/vox/r_vox.dmi | Bin 2675 -> 2670 bytes icons/mob/human_races/vox/r_voxazu.dmi | Bin 2105 -> 1978 bytes icons/mob/human_races/vox/r_voxbrn.dmi | Bin 2649 -> 2674 bytes icons/mob/human_races/vox/r_voxemrl.dmi | Bin 2110 -> 1980 bytes icons/mob/human_races/vox/r_voxgry.dmi | Bin 2840 -> 2855 bytes icons/mob/human_races/vox/r_voxlgrn.dmi | Bin 2110 -> 1965 bytes icons/mob/human_races/vox/tails.dmi | Bin 0 -> 1698 bytes icons/mob/tails.dmi | Bin 0 -> 1287 bytes vgstation13.dme | 5 +- 46 files changed, 671 insertions(+), 333 deletions(-) create mode 100644 __DEFINES/span.dm create mode 100644 code/datums/mutable_appearance.dm rename code/modules/mob/living/carbon/human/{plasmaman/species.dm => species/plasmaman.dm} (100%) create mode 100644 code/modules/mob/living/carbon/human/species/vox.dm create mode 100644 icons/mob/human_races/vox/tails.dmi create mode 100644 icons/mob/tails.dmi diff --git a/__DEFINES/colors.dm b/__DEFINES/colors.dm index ad5404c0813..201b2a1cbbe 100644 --- a/__DEFINES/colors.dm +++ b/__DEFINES/colors.dm @@ -16,3 +16,8 @@ #define COLOR_GLUE "#FFFFCC" #define COLOR_BEESWAX "#FFB700" #define COLOR_DEFAULT_CANDLE "#BE0000" +#define COLOR_RED "#FF0000" +#define COLOR_GREEN "#00FF00" +#define COLOR_BLUE "#0000FF" + +#define COLOR_MATRIX_ADD(color) list(COLOR_RED, COLOR_GREEN, COLOR_BLUE, color) diff --git a/__DEFINES/limb_defines.dm b/__DEFINES/limb_defines.dm index 3179ab63844..266e7f382d2 100644 --- a/__DEFINES/limb_defines.dm +++ b/__DEFINES/limb_defines.dm @@ -15,3 +15,5 @@ #define UNCUFF_LEGS -1 #define UNCUFF_BOTH 0 #define UNCUFF_HANDS 1 + +#define COSMETIC_ORGAN_TAIL "tail" diff --git a/__DEFINES/setup.dm b/__DEFINES/setup.dm index 559089e54b5..6c6dfeb7b01 100644 --- a/__DEFINES/setup.dm +++ b/__DEFINES/setup.dm @@ -326,6 +326,7 @@ var/MAX_EXPLOSION_RANGE = 32 #define ARM_RIGHT 256 #define HAND_LEFT 512 #define HAND_RIGHT 1024 +#define TAIL 524288 // bitflags for clothing parts @@ -352,6 +353,7 @@ var/MAX_EXPLOSION_RANGE = 32 #define HIDEEARS EARS #define HIDEEYES EYES #define HIDEFACE FACE +#define HIDETAIL TAIL #define HIDEHEADHAIR 65536 #define MASKHEADHAIR 131072 #define HIDEBEARDHAIR BEARD @@ -1006,6 +1008,7 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define ACID4WATER 4096 //Acid now acts like water, and vice versa. #define NO_BALD 8192 //cannot lose hair through being shaved/radiation/etc #define RGBSKINTONE 16384 +#define HAS_ICON_SKIN_TONE 32768 var/default_colour_matrix = list(1,0,0,0,\ 0,1,0,0,\ @@ -1252,29 +1255,31 @@ var/default_colour_matrix = list(1,0,0,0,\ //Human Overlays Indexes/////////THIS DEFINES WHAT LAYERS APPEARS ON TOP OF OTHERS #define FIRE_LAYER 1 //If you're on fire (/tg/ shit) #define MUTANTRACE_LAYER 2 //TODO: make part of body? -#define MUTATIONS_LAYER 3 -#define DAMAGE_LAYER 4 -#define UNIFORM_LAYER 5 -#define SHOES_LAYER 6 -#define GLOVES_LAYER 7 -#define EARS_LAYER 8 -#define SUIT_LAYER 9 -#define GLASSES_LAYER 10 -#define BELT_LAYER 11 //Possible make this an overlay of somethign required to wear a belt? -#define SUIT_STORE_LAYER 12 -#define HAIR_LAYER 13 //TODO: make part of head layer? -#define GLASSES_OVER_HAIR_LAYER 14 -#define FACEMASK_LAYER 15 -#define HEAD_LAYER 16 -#define BACK_LAYER 17 //Back should be above head so that headgear doesn't hides backpack when facing north -#define ID_LAYER 18 //IDs should be visible above suits and backpacks -#define HANDCUFF_LAYER 19 -#define MUTUALCUFF_LAYER 20 -#define LEGCUFF_LAYER 21 -#define HAND_LAYER 22 -#define TAIL_LAYER 23 //bs12 specific. this hack is probably gonna come back to haunt me -#define TARGETED_LAYER 24 //BS12: Layer for the target overlay from weapon targeting system -#define TOTAL_LAYERS 24 +#define TAIL_UNDERLIMBS_LAYER 3 +#define LIMBS_LAYER 4 +#define MUTATIONS_LAYER 5 +#define DAMAGE_LAYER 6 +#define UNIFORM_LAYER 7 +#define SHOES_LAYER 8 +#define GLOVES_LAYER 9 +#define EARS_LAYER 10 +#define SUIT_LAYER 11 +#define GLASSES_LAYER 12 +#define BELT_LAYER 13 //Possible make this an overlay of somethign required to wear a belt? +#define SUIT_STORE_LAYER 14 +#define HAIR_LAYER 15 //TODO: make part of head layer? +#define GLASSES_OVER_HAIR_LAYER 16 +#define TAIL_LAYER 17 +#define FACEMASK_LAYER 18 +#define HEAD_LAYER 19 +#define BACK_LAYER 20 //Back should be above head so that headgear doesn't hides backpack when facing north +#define ID_LAYER 21 //IDs should be visible above suits and backpacks +#define HANDCUFF_LAYER 22 +#define MUTUALCUFF_LAYER 23 +#define LEGCUFF_LAYER 24 +#define HAND_LAYER 25 +#define TARGETED_LAYER 26 //BS12: Layer for the target overlay from weapon targeting system +#define TOTAL_LAYERS 26 ////////////////////////////////// //Snake stuff so leaderboard can see it too diff --git a/__DEFINES/span.dm b/__DEFINES/span.dm new file mode 100644 index 00000000000..bf07f4e4fe3 --- /dev/null +++ b/__DEFINES/span.dm @@ -0,0 +1,2 @@ +// Sorted alphabetically +#define span_warning(str) ("" + str + "") diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index 920e192fbe0..9fd72b04937 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -1,5 +1,6 @@ -#define EMOTE_VISIBLE 1 -#define EMOTE_AUDIBLE 2 +#define EMOTE_VISIBLE (1<<0) +#define EMOTE_AUDIBLE (1<<1) +#define EMOTE_NO_RUNECHAT (1<<2) /* Emote datums, ported from TG station. */ @@ -66,17 +67,19 @@ if (user.client && M?.client?.prefs.mob_chat_on_map && get_dist(M, user) < M?.client.view) M.create_chat_message(user, null, msg_runechat, "", list("italics")) - if (emote_type == EMOTE_VISIBLE) + if(emote_type & EMOTE_VISIBLE) user.visible_message(msg) - for(var/z0 in GetOpenConnectedZlevels(user)) - for (var/mob/O in viewers(world.view, locate(user.x,user.y,z0))) - if (user.client && O?.client?.prefs.mob_chat_on_map && O.stat != UNCONSCIOUS && !(isinvisible(user))) - O.create_chat_message(user, null, msg_runechat, "", list("italics")) - else + if(!(emote_type & EMOTE_NO_RUNECHAT)) + for(var/z0 in GetOpenConnectedZlevels(user)) + for (var/mob/O in viewers(world.view, locate(user.x,user.y,z0))) + if (user.client && O?.client?.prefs.mob_chat_on_map && O.stat != UNCONSCIOUS && !(isinvisible(user))) + O.create_chat_message(user, null, msg_runechat, "", list("italics")) + else if(emote_type & EMOTE_AUDIBLE) for(var/mob/O in get_hearers_in_view(world.view, user)) O.show_message(msg) - if (user.client && O?.client?.prefs.mob_chat_on_map && O.stat != UNCONSCIOUS && !O.is_deaf()) - O.create_chat_message(user, null, msg_runechat, "", list("italics")) + if(!(emote_type & EMOTE_NO_RUNECHAT)) + if(user.client && O?.client?.prefs.mob_chat_on_map && O.stat != UNCONSCIOUS && !O.is_deaf()) + O.create_chat_message(user, null, msg_runechat, "", list("italics")) var/turf/T = get_turf(user) var/location = T ? "[T.x],[T.y],[T.z]" : "nullspace" diff --git a/code/datums/gamemode/dynamic/dynamic_rulesets_midround.dm b/code/datums/gamemode/dynamic/dynamic_rulesets_midround.dm index 4be4c08f75c..7edaddd1e4a 100644 --- a/code/datums/gamemode/dynamic/dynamic_rulesets_midround.dm +++ b/code/datums/gamemode/dynamic/dynamic_rulesets_midround.dm @@ -564,7 +564,7 @@ return ..() /datum/dynamic_ruleset/midround/from_ghosts/rambler/generate_ruleset_body(mob/applicant) - var/mob/living/carbon/human/frankenstein/new_frank = new(pick(latejoin)) + var/mob/living/carbon/human/frankenstein/new_frank = new(pick(latejoin), no_tail = TRUE) var/gender = pick(MALE, FEMALE) new_frank.randomise_appearance_for(gender) new_frank.key = applicant.key diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm new file mode 100644 index 00000000000..42b72a2f72f --- /dev/null +++ b/code/datums/mutable_appearance.dm @@ -0,0 +1,31 @@ +// Mutable appearances are an inbuilt byond datastructure. Read the documentation on them by hitting F1 in DM. +// Basically use them instead of images for overlays/underlays and when changing an object's appearance if you're doing so with any regularity. +// Unless you need the overlay/underlay to have a different direction than the base object. Then you have to use an image due to a bug. + +// Mutable appearances are children of images, just so you know. + +// Mutable appearances erase template vars on new, because they accept an appearance to copy as an arg +// If we have nothin to copy, we set the float plane +/mutable_appearance/New(mutable_appearance/to_copy) + ..() + if(!to_copy) + plane = FLOAT_PLANE + +/** Helper similar to image() + * + * icon - Our appearance's icon + * icon_state - Our appearance's icon state + * layer - Our appearance's layer + * plane - The plane to use for the appearance. + * alpha - Our appearance's alpha + * appearance_flags - Our appearance's appearance_flags +**/ +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE) + var/mutable_appearance/appearance = new() + appearance.icon = icon + appearance.icon_state = icon_state + appearance.layer = layer + appearance.plane = plane + appearance.alpha = alpha + appearance.appearance_flags |= appearance_flags + return appearance diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index d60e0e72c1b..afc5660913a 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -12,6 +12,9 @@ var/brute_dam = 0 var/burn_dam = 0 +/obj/item/robot_parts/proc/on_attach(datum/organ/external/attached_site) + return + /obj/item/robot_parts/l_arm name = "robot left arm" desc = "A skeletal limb wrapped in pseudomuscles, with a low-conductivity case." @@ -36,6 +39,40 @@ icon_state = LIMB_RIGHT_LEG part = list(LIMB_RIGHT_LEG,LIMB_RIGHT_FOOT) +/obj/item/robot_parts/tail + name = "robot tail" + desc = "A skeletal appendage wrapped in pseudomuscles, with a low-conductivity case." + icon_state = null + part = list(COSMETIC_ORGAN_TAIL) + var/tail_icon_file = 'icons/mob/tails.dmi' + var/tail_type = "vox" + var/static/list/tail_icons = list() + +/obj/item/robot_parts/tail/New(loc, type_of_tail) + if(type_of_tail) + tail_type = type_of_tail + update_icon() + return ..() + +/obj/item/robot_parts/tail/on_attach(datum/organ/external/tail/attached_site) + attached_site.tail_type = tail_type + +/obj/item/robot_parts/tail/attackby(obj/item/W, mob/user) + if(!ismultitool(W)) + return ..() + var/type_of_tail = input(user, "Configure tail type", "Robotic tail design", "vox") as null|anything in list("vox", "tajaran", "unathi") + tail_type = type_of_tail + update_icon() + +/obj/item/robot_parts/tail/update_icon() + var/returned_tail_icon = tail_icons[tail_type] + if(!returned_tail_icon) + var/icon/new_tail_icon = icon(tail_icon_file, "[tail_type]_robotic_BEHIND", EAST) + new_tail_icon.Shift(EAST, 6) + new_tail_icon.Shift(NORTH, 3) + returned_tail_icon = tail_icons[tail_type] = new_tail_icon + icon = returned_tail_icon + /obj/item/robot_parts/chest name = "robot torso" desc = "A heavily reinforced case containing cyborg logic boards, with space for a standard power cell." diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index e1d100fab90..f0a3937c35c 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1027,7 +1027,7 @@ var/global/maxStackDepth = 10 permeability_coefficient = 0.02 flags = FPRINT pressure_resistance = 5 * ONE_ATMOSPHERE - body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS + body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS|TAIL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/) slowdown = HARDSUIT_SLOWDOWN_BULKY armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 50) diff --git a/code/modules/clothing/spacesuits/captain.dm b/code/modules/clothing/spacesuits/captain.dm index 65ace76c0b2..58fa127e733 100644 --- a/code/modules/clothing/spacesuits/captain.dm +++ b/code/modules/clothing/spacesuits/captain.dm @@ -54,7 +54,7 @@ permeability_coefficient = 0.02 clothing_flags = ONESIZEFITSALL pressure_resistance = 200 * ONE_ATMOSPHERE - body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET + body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|TAIL allowed = list(/obj/item/weapon/tank, /obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy, /obj/item/weapon/gun/projectile, /obj/item/ammo_storage, /obj/item/ammo_casing, /obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_nitrogen) slowdown = HARDSUIT_SLOWDOWN_HIGH armor = list(melee = 65, bullet = 50, laser = 50, energy = 25, bomb = 50, bio = 100, rad = 50) diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index ce7618f0091..91d7a9ef09f 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -25,7 +25,7 @@ permeability_coefficient = 0.01 flags = FPRINT clothing_flags = PLASMAGUARD - body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS + body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS|TAIL slowdown = HARDSUIT_SLOWDOWN_LOW allowed = list(/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_nitrogen,/obj/item/weapon/pen,/obj/item/device/flashlight/pen) armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 9425bf14638..6bb13285842 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -487,7 +487,7 @@ var/list/tag_suits_list = list() icon_state = "strait_jacket" item_state = "strait_jacket" origin_tech = Tc_BIOTECH + "=2" - body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS + body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS|TAIL species_fit = list(INSECT_SHAPED) /obj/item/clothing/suit/ianshirt diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 0a08c5f5413..95079c14c0e 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -18,7 +18,7 @@ w_class = W_CLASS_LARGE//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 - body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS + body_parts_covered = ARMS|LEGS|FULL_TORSO|FEET|HANDS|TAIL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_nitrogen,/obj/item/weapon/extinguisher,/obj/item/tool/irons,/obj/item/tool/crowbar/halligan) slowdown = HARDSUIT_SLOWDOWN_LOW clothing_flags = ONESIZEFITSALL @@ -85,6 +85,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 flags = FPRINT + body_parts_covered = ARMS|LEGS|FULL_TORSO|TAIL slowdown = HARDSUIT_SLOWDOWN_HIGH armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 100, bio = 0, rad = 0) max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE @@ -157,7 +158,7 @@ w_class = W_CLASS_LARGE//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 - body_parts_covered = FULL_BODY + body_parts_covered = FULL_BODY|TAIL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_nitrogen) slowdown = 1.5 armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm index 70a1793e5f8..24c8bc44589 100644 --- a/code/modules/mob/emote.dm +++ b/code/modules/mob/emote.dm @@ -75,16 +75,18 @@ if(isobserver(M) && M.client.prefs && (M.client.prefs.toggles & CHAT_GHOSTSIGHT) && !(M in viewers(user))) M.show_message("(Follow) " + msg) - if (emote_type == EMOTE_VISIBLE) + if(emote_type & EMOTE_VISIBLE) user.visible_message(msg) - for(var/mob/O in viewers(world.view, user)) - if (O.client && O?.client?.prefs.mob_chat_on_map && get_dist(O, user) < O?.client.view) - O.create_chat_message(user, null, message, "", list("italics")) - else + if(!(emote_type & EMOTE_NO_RUNECHAT)) + for(var/mob/O in viewers(world.view, user)) + if(O.client && O?.client?.prefs.mob_chat_on_map && get_dist(O, user) < O?.client.view) + O.create_chat_message(user, null, message, "", list("italics")) + else if(emote_type & EMOTE_AUDIBLE) for(var/mob/O in get_hearers_in_view(world.view, user)) O.show_message(msg) - if (O.client && O?.client?.prefs.mob_chat_on_map && get_dist(O, user) < O?.client.view) - O.create_chat_message(user, null, message, "", list("italics")) + if(!(emote_type & EMOTE_NO_RUNECHAT)) + if(O.client && O?.client?.prefs.mob_chat_on_map && get_dist(O, user) < O?.client.view) + O.create_chat_message(user, null, message, "", list("italics")) var/location = T ? "[T.x],[T.y],[T.z]" : "nullspace" log_emote("[user.name]/[user.key] (@[location]): [message]") diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index fcff75175f3..68013d85a65 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -14,6 +14,8 @@ if(prob(100 - E.get_damage())) //Override the current limb status and don't cause an explosion E.droplimb(1, 1) + for(var/datum/organ/external/cosmetic_organ in cosmetic_organs) + cosmetic_organ.droplimb(TRUE, TRUE) var/gib_radius = 0 if(reagents.has_reagent(LUBE)) gib_radius = 6 //Your insides are all lubed, so gibs travel much further diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ad557589825..d23693d0ee5 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -97,7 +97,7 @@ ..(new_loc) initialize_basic_NPC_components() -/mob/living/carbon/human/frankenstein/New(var/new_loc, delay_ready_dna = 0) //Just fuck my shit up: the mob +/mob/living/carbon/human/frankenstein/New(var/new_loc, delay_ready_dna = 0, no_tail = FALSE) //Just fuck my shit up: the mob var/list/valid_species = (all_species - list("Krampus", "Horror", "Manifested")) var/datum/species/new_species = all_species[pick(valid_species)] @@ -109,7 +109,20 @@ for(var/datum/organ/external/E in organs) E.species = all_species[pick(valid_species)] - + var/datum/organ/external/tail/tail_datum = get_cosmetic_organ(COSMETIC_ORGAN_TAIL) + if(no_tail) + tail_datum.droplimb(TRUE, spawn_limb = FALSE) + else + var/list/tailed_species = list() + for(var/species_name in all_species) + var/datum/species/picked_species = all_species[species_name] + if(picked_species.anatomy_flags & HAS_TAIL) + tailed_species += picked_species + var/datum/species/species_with_tail = pick(tailed_species) + tail_datum.fleshify() + tail_datum.create_tail_info(species_with_tail) + tail_datum.species = species_with_tail + tail_datum.update_tail(src, random = TRUE) update_body() /mob/living/carbon/human/mushroom/New(var/new_loc, delay_ready_dna = 0) @@ -167,6 +180,8 @@ obj_overlays[FIRE_LAYER] = new /obj/abstract/Overlays/fire_layer obj_overlays[MUTANTRACE_LAYER] = new /obj/abstract/Overlays/mutantrace_layer + obj_overlays[TAIL_UNDERLIMBS_LAYER] = new /obj/abstract/Overlays/tail_underlimbs_layer + obj_overlays[LIMBS_LAYER] = new /obj/abstract/Overlays/limbs_layer obj_overlays[MUTATIONS_LAYER] = new /obj/abstract/Overlays/mutations_layer obj_overlays[DAMAGE_LAYER] = new /obj/abstract/Overlays/damage_layer obj_overlays[UNIFORM_LAYER] = new /obj/abstract/Overlays/uniform_layer @@ -181,13 +196,13 @@ obj_overlays[BACK_LAYER] = new /obj/abstract/Overlays/back_layer obj_overlays[HAIR_LAYER] = new /obj/abstract/Overlays/hair_layer obj_overlays[GLASSES_OVER_HAIR_LAYER] = new /obj/abstract/Overlays/glasses_over_hair_layer + obj_overlays[TAIL_LAYER] = new /obj/abstract/Overlays/tail_layer obj_overlays[FACEMASK_LAYER] = new /obj/abstract/Overlays/facemask_layer obj_overlays[HEAD_LAYER] = new /obj/abstract/Overlays/head_layer obj_overlays[HANDCUFF_LAYER] = new /obj/abstract/Overlays/handcuff_layer obj_overlays[MUTUALCUFF_LAYER] = new /obj/abstract/Overlays/mutualcuff_layer obj_overlays[LEGCUFF_LAYER] = new /obj/abstract/Overlays/legcuff_layer //obj_overlays[HAND_LAYER] = new /obj/abstract/Overlays/hand_layer - obj_overlays[TAIL_LAYER] = new /obj/abstract/Overlays/tail_layer obj_overlays[TARGETED_LAYER] = new /obj/abstract/Overlays/targeted_layer ..() diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index bee1f1fc0ef..d4fd6c8eade 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -307,14 +307,20 @@ This function restores all organs. return -/mob/living/carbon/human/get_organ(var/zone) +/mob/living/carbon/human/get_organ(var/zone, cosmetic = FALSE) RETURN_TYPE(/datum/organ/external) if(!zone) zone = LIMB_CHEST if (zone in list( "eyes", "mouth" )) zone = LIMB_HEAD - return organs_by_name[zone] + var/list/organ_list = organs_by_name.Copy() + if(cosmetic) + organ_list |= cosmetic_organs_by_name + return organ_list[zone] +/mob/living/carbon/human/proc/get_cosmetic_organ(zone) + RETURN_TYPE(/datum/organ/external) + return cosmetic_organs_by_name[zone] //Picks a random usable organ from the organs passed to the arguments //You can feed organ references, or organ strings into this obj diff --git a/code/modules/mob/living/carbon/human/plasmaman/species.dm b/code/modules/mob/living/carbon/human/species/plasmaman.dm similarity index 100% rename from code/modules/mob/living/carbon/human/plasmaman/species.dm rename to code/modules/mob/living/carbon/human/species/plasmaman.dm diff --git a/code/modules/mob/living/carbon/human/species/vox.dm b/code/modules/mob/living/carbon/human/species/vox.dm new file mode 100644 index 00000000000..64c3142692a --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/vox.dm @@ -0,0 +1,160 @@ +/datum/species/vox + name = "Vox" + icobase = 'icons/mob/human_races/vox/r_vox.dmi' + deform = 'icons/mob/human_races/vox/r_def_vox.dmi' + known_languages = list(LANGUAGE_VOX) + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/rawchicken/vox + tacklePower = 40 + anatomy_flags = HAS_SWEAT_GLANDS | HAS_ICON_SKIN_TONE | HAS_TAIL + + survival_gear = /obj/item/weapon/storage/box/survival/vox + + primitive = /mob/living/carbon/monkey/vox + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + eyes = "vox_eyes_s" + breath_type = GAS_NITROGEN + + default_mutations = list(M_BEAK, M_TALONS) + flags = PLAYABLE | WHITELISTED + blood_color = VOX_BLOOD + flesh_color = "#808D11" + max_skin_tone = 6 + tail = "green" + tail_icon = 'icons/mob/human_races/vox/tails.dmi' + tail_type = "vox" + footprint_type = /obj/effect/decal/cleanable/blood/tracks/footprints/vox //Bird claws + + uniform_icons = 'icons/mob/species/vox/uniform.dmi' +// fat_uniform_icons = 'icons/mob/uniform_fat.dmi' + gloves_icons = 'icons/mob/species/vox/gloves.dmi' + glasses_icons = 'icons/mob/species/vox/eyes.dmi' +// ears_icons = 'icons/mob/ears.dmi' + shoes_icons = 'icons/mob/species/vox/shoes.dmi' + head_icons = 'icons/mob/species/vox/head.dmi' +// belt_icons = 'icons/mob/belt.dmi' + wear_suit_icons = 'icons/mob/species/vox/suit.dmi' + wear_mask_icons = 'icons/mob/species/vox/masks.dmi' + back_icons = 'icons/mob/species/vox/back.dmi' + + has_mutant_race = 0 + has_organ = list( + "heart" = /datum/organ/internal/heart/vox, + "lungs" = /datum/organ/internal/lungs/vox, + "liver" = /datum/organ/internal/liver, + "kidneys" = /datum/organ/internal/kidney, + "brain" = /datum/organ/internal/brain, + "appendix" = /datum/organ/internal/appendix, + "eyes" = /datum/organ/internal/eyes/vox + ) + + species_intro = "You are a Vox.
\ + You are somewhat more adept at handling the lower pressures of space and colder temperatures.
\ + You have talons with which you can slice others in a fist fight, and a beak which can be used to butcher corpses without the need for finer tools.
\ + However, Oxygen is incredibly toxic to you, in breathing it or consuming it. You can only breathe nitrogen." + +// -- Outfit datums -- +/datum/species/vox/final_equip(var/mob/living/carbon/human/H) + var/tank_slot = slot_s_store + var/tank_slot_name = "suit storage" + if(tank_slot) + H.equip_or_collect(new/obj/item/weapon/tank/nitrogen(H), tank_slot) + else + H.put_in_hands(new/obj/item/weapon/tank/nitrogen(H)) + to_chat(H, "You are now running on nitrogen internals from the [H.s_store] in your [tank_slot_name].") + var/obj/item/weapon/tank/nitrogen/N = H.get_item_by_slot(tank_slot) + if(!N) + N = H.get_item_by_slot(slot_back) + H.internal = N + if (H.internals) + H.internals.icon_state = "internal1" + +/datum/species/vox/makeName(var/gender,var/mob/living/carbon/human/H=null) + var/sounds = rand(3,8) + var/newname = "" + + for(var/i = 1 to sounds) + newname += pick(vox_name_syllables) + return capitalize(newname) + +/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) + if(myhuman != H) + return + updatespeciescolor(H) + H.update_icon() + +/datum/species/vox/updatespeciescolor(mob/living/carbon/human/vox) + var/datum/organ/external/tail/vox_tail = vox.get_cosmetic_organ(COSMETIC_ORGAN_TAIL) + switch(vox.my_appearance.s_tone) + if(VOXEMERALD) + icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' + deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi' + if(VOXAZURE) + icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' + deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi' + if(VOXLGREEN) + icobase = 'icons/mob/human_races/vox/r_voxlgrn.dmi' + deform = 'icons/mob/human_races/vox/r_def_voxlgrn.dmi' + if(VOXGRAY) + icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' + deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi' + if(VOXBROWN) + icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' + deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi' + else + icobase = 'icons/mob/human_races/vox/r_vox.dmi' + deform = 'icons/mob/human_races/vox/r_def_vox.dmi' + if(vox_tail && (vox_tail.status & ORGAN_DESTROYED)) + return + vox_tail.update_tail(vox) + +/datum/species/skellington/skelevox // Science never goes too far, it's the public that's too conservative + name = "Skeletal Vox" + icobase = 'icons/mob/human_races/vox/r_voxboney.dmi' + deform = 'icons/mob/human_races/vox/r_voxboney.dmi' //Do bones deform noticeably? + known_languages = list(LANGUAGE_VOX, LANGUAGE_CLATTER) + + survival_gear = /obj/item/weapon/storage/box/survival/vox + + primitive = /mob/living/carbon/monkey/vox/skeletal + + warning_low_pressure = 50 + hazard_low_pressure = 0 + + cold_level_1 = 80 + cold_level_2 = 50 + cold_level_3 = 0 + + eyes = "vox_eyes_s" + + default_mutations = list(M_BEAK, M_TALONS) + + footprint_type = /obj/effect/decal/cleanable/blood/tracks/footprints/vox + + uniform_icons = 'icons/mob/species/vox/uniform.dmi' +// fat_uniform_icons = 'icons/mob/uniform_fat.dmi' + gloves_icons = 'icons/mob/species/vox/gloves.dmi' + glasses_icons = 'icons/mob/species/vox/eyes.dmi' +// ears_icons = 'icons/mob/ears.dmi' + shoes_icons = 'icons/mob/species/vox/shoes.dmi' + head_icons = 'icons/mob/species/vox/head.dmi' +// belt_icons = 'icons/mob/belt.dmi' + wear_suit_icons = 'icons/mob/species/vox/suit.dmi' + wear_mask_icons = 'icons/mob/species/vox/masks.dmi' +// back_icons = 'icons/mob/back.dmi' + + has_organ = list( + "brain" = /datum/organ/internal/brain, + "eyes" = /datum/organ/internal/eyes/vox + ) + +/datum/species/skellington/skelevox/makeName(var/gender,var/mob/living/carbon/human/H=null) + var/sounds = rand(3,8) + var/newname = "" + + for(var/i = 1 to sounds) + newname += pick(vox_name_syllables) + return capitalize(newname) diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index c35bc3acf69..00fc82d0af5 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -194,7 +194,8 @@ var/global/list/damage_icon_parts = list() var/g = "m" if(gender == FEMALE) g = "f" - + if(species && species.anatomy_flags & HAS_ICON_SKIN_TONE) + species.updatespeciescolor(src) var/datum/organ/external/chest = get_organ(LIMB_CHEST) stand_icon = chest.get_icon(g,fat) if(!skeleton) @@ -269,7 +270,15 @@ var/global/list/damage_icon_parts = list() mask.MapColors(0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,1, 0,0,0,0) husk_over.Blend(mask, ICON_ADD) stand_icon.Blend(husk_over, ICON_OVERLAY) - + var/datum/organ/external/tail/tail = get_cosmetic_organ(COSMETIC_ORGAN_TAIL) + if(tail && (!(tail.status & ORGAN_DESTROYED) && tail.overlap_overlays)) + var/obj/abstract/Overlays/limbs_overlay = obj_overlays[LIMBS_LAYER] + var/mutable_appearance/stand_icon_image = mutable_appearance(stand_icon) + limbs_overlay.icon = stand_icon_image.icon + limbs_overlay.icon_state = stand_icon_image.icon_state + obj_to_plane_overlay(limbs_overlay, LIMBS_LAYER) + else + overlays -= obj_overlays[LIMBS_LAYER] if(has_head) //Eyes if(!skeleton) @@ -307,7 +316,7 @@ var/global/list/damage_icon_parts = list() stand_icon -= rgb(0,0,0,lowest_alpha) //tail - update_tail_showing(0) + update_tail_layer(FALSE) //HAIR OVERLAY @@ -523,6 +532,7 @@ var/global/list/damage_icon_parts = list() update_inv_mutual_handcuffed(0) update_inv_legcuffed(0) update_inv_pockets(0) + update_tail_layer() QueueUpdateDamageIcon(1) update_icons() //Hud Stuff @@ -1298,10 +1308,7 @@ var/global/list/damage_icon_parts = list() O.pixel_y = species.inventory_offsets["[slot_wear_suit]"]["pixel_y"] * PIXEL_MULTIPLIER obj_to_plane_overlay(O,SUIT_LAYER) //overlays_standing[SUIT_LAYER] = standing - update_tail_showing(0) - else - //overlays_standing[SUIT_LAYER] = null - update_tail_showing(0) + update_tail_layer() if(update_icons) update_icons() @@ -1547,22 +1554,34 @@ var/global/list/damage_icon_parts = list() /mob/living/carbon/human/update_inv_l_hand(var/update_icons=1) return update_inv_hand(GRASP_LEFT_HAND, update_icons) -/mob/living/carbon/human/proc/update_tail_showing(var/update_icons=1) - //overlays_standing[TAIL_LAYER] = null +/mob/living/carbon/human/proc/update_tail_layer(update_icons = TRUE) + overlays -= obj_overlays[TAIL_UNDERLIMBS_LAYER] overlays -= obj_overlays[TAIL_LAYER] - if(species && species.tail && species.anatomy_flags & HAS_TAIL) - if(!wear_suit || !is_slot_hidden(wear_suit.body_parts_covered, HIDEJUMPSUIT, 0, wear_suit.body_parts_visible_override)) - var/obj/abstract/Overlays/O = obj_overlays[TAIL_LAYER] - O.icon = 'icons/effects/species.dmi' - O.icon_state = "[species.tail]_s" - obj_to_plane_overlay(O,TAIL_LAYER) - //if(!old_tail_state) //only update if we didnt show our tail already - - //overlays_standing[TAIL_LAYER] = image("icon" = 'icons/effects/species.dmi', "icon_state" = "[species.tail]_s") -// to_chat(src, "update: tail is different") - //else - //overlays_standing[TAIL_LAYER] = null - + var/datum/organ/external/tail/tail_organ = get_cosmetic_organ(COSMETIC_ORGAN_TAIL) + if(!tail_organ || (tail_organ.status & ORGAN_DESTROYED)) + return + if(wear_suit || check_hidden_body_flags(HIDETAIL)) + return + var/tail_file = tail_organ.tail_icon_file + var/tail_icon_state = tail_organ.icon_name + if(!tail_file || !tail_icon_state) + return + var/mutable_appearance/tail_image = mutable_appearance(tail_file, tail_icon_state, layer = -TAIL_LAYER) + if(species.anatomy_flags & MULTICOLOR) + tail_image.color = COLOR_MATRIX_ADD(rgb(multicolor_skin_r, multicolor_skin_g, multicolor_skin_b)) + if(tail_organ.overlap_overlays) // Tail is overlapped by limbs, so we need special tail icon generation + // Gives the underlimbs layer SEW directions since it's overlayed by limbs and just about everything else anyway. + var/mutable_appearance/tail_underlimbs = mutable_appearance(tail_file, "[tail_icon_state]_BEHIND", -TAIL_UNDERLIMBS_LAYER) + var/obj/abstract/Overlays/underlimbs_overlay = obj_overlays[TAIL_UNDERLIMBS_LAYER] + underlimbs_overlay.icon = tail_underlimbs.icon + underlimbs_overlay.icon_state = tail_underlimbs.icon_state + obj_to_plane_overlay(underlimbs_overlay, TAIL_UNDERLIMBS_LAYER) + // North direction sprite before passing that to the tail layer that overlays uniforms and such. + tail_image.icon_state = "[tail_icon_state]_FRONT" + var/obj/abstract/Overlays/tail_overlay = obj_overlays[TAIL_LAYER] + tail_overlay.icon = tail_image.icon + tail_overlay.icon_state = tail_image.icon_state + obj_to_plane_overlay(tail_overlay, TAIL_LAYER) if(update_icons) update_icons() diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index fac52aed432..4bafdb1aa19 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -42,7 +42,10 @@ var/global/list/playable_species = list("Human") var/eyes = "eyes_s" // Icon for eyes. var/primitive // Lesser form, if any (ie. monkey for humans) - var/tail // Name of tail image in species effects icon file. + var/tail // Name of tail icon state + var/tail_icon = 'icons/mob/tails.dmi' + var/tail_type + var/tail_overlapping = TRUE var/list/known_languages = list(LANGUAGE_GALACTIC_COMMON) // Languages that this species innately knows. var/default_language = LANGUAGE_GALACTIC_COMMON // Default language is used when 'say' is used without modifiers. var/attack_verb = "punches" // Empty hand hurt intent verb. @@ -204,9 +207,15 @@ var/global/list/playable_species = list("Human") for(var/datum/organ/I in H.internal_organs) qdel(I) H.internal_organs.len=0 + if(H.cosmetic_organs) + for(var/organ in H.cosmetic_organs) + qdel(organ) + H.cosmetic_organs.len=0 //The rest SHOULD only refer to organs that were already deleted by the above loops, so we can just clear the lists. if(H.organs_by_name) H.organs_by_name.len=0 + if(H.cosmetic_organs_by_name) + H.cosmetic_organs_by_name.len = 0 if(H.internal_organs_by_name) H.internal_organs_by_name.len=0 if(H.grasp_organs) @@ -219,6 +228,7 @@ var/global/list/playable_species = list("Human") //This is a basic humanoid limb setup. H.organs = list() + H.cosmetic_organs = list() H.organs_by_name[LIMB_CHEST] = new/datum/organ/external/chest() H.organs_by_name[LIMB_GROIN] = new/datum/organ/external/groin(H.organs_by_name[LIMB_CHEST]) H.organs_by_name[LIMB_HEAD] = new/datum/organ/external/head(H.organs_by_name[LIMB_CHEST]) @@ -231,6 +241,8 @@ var/global/list/playable_species = list("Human") H.organs_by_name[LIMB_LEFT_FOOT] = new/datum/organ/external/l_foot(H.organs_by_name[LIMB_LEFT_LEG]) H.organs_by_name[LIMB_RIGHT_FOOT] = new/datum/organ/external/r_foot(H.organs_by_name[LIMB_RIGHT_LEG]) + H.cosmetic_organs_by_name[COSMETIC_ORGAN_TAIL] = new/datum/organ/external/tail(H.organs_by_name[LIMB_GROIN], src) + H.internal_organs = list() for(var/organ in has_organ) var/organ_type = has_organ[organ] @@ -245,9 +257,13 @@ var/global/list/playable_species = list("Human") H.organs += OE if(OE.grasp_id) H.grasp_organs += OE - - for(var/datum/organ/external/O in H.organs) - O.owner = H + for(var/organ in H.cosmetic_organs_by_name) + var/datum/organ/external/cosmetic_organ = H.cosmetic_organs_by_name[organ] + H.cosmetic_organs += cosmetic_organ + for(var/datum/organ/external/external_organ in H.organs) + external_organ.owner = H + for(var/datum/organ/external/cosmetic_organ as anything in H.cosmetic_organs) + cosmetic_organ.owner = H /datum/species/proc/handle_post_spawn(var/mob/living/carbon/human/H) //Handles anything not already covered by basic species assignment. return @@ -385,7 +401,8 @@ var/global/list/playable_species = list("Human") icobase = 'icons/mob/human_races/r_lizard.dmi' deform = 'icons/mob/human_races/r_def_lizard.dmi' known_languages = list(LANGUAGE_UNATHI) - tail = "sogtail" + tail = "unathi" + tail_type = "unathi" attack_verb = "scratches" punch_damage = 2 primitive = /mob/living/carbon/monkey/unathi @@ -467,61 +484,13 @@ var/global/list/playable_species = list("Human") H.drop_all() qdel(src) - -/datum/species/skellington/skelevox // Science never goes too far, it's the public that's too conservative - name = "Skeletal Vox" - icobase = 'icons/mob/human_races/vox/r_voxboney.dmi' - deform = 'icons/mob/human_races/vox/r_voxboney.dmi' //Do bones deform noticeably? - known_languages = list(LANGUAGE_VOX, LANGUAGE_CLATTER) - - survival_gear = /obj/item/weapon/storage/box/survival/vox - - primitive = /mob/living/carbon/monkey/vox/skeletal - - warning_low_pressure = 50 - hazard_low_pressure = 0 - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - eyes = "vox_eyes_s" - - default_mutations = list(M_BEAK, M_TALONS) - - footprint_type = /obj/effect/decal/cleanable/blood/tracks/footprints/vox - - uniform_icons = 'icons/mob/species/vox/uniform.dmi' -// fat_uniform_icons = 'icons/mob/uniform_fat.dmi' - gloves_icons = 'icons/mob/species/vox/gloves.dmi' - glasses_icons = 'icons/mob/species/vox/eyes.dmi' -// ears_icons = 'icons/mob/ears.dmi' - shoes_icons = 'icons/mob/species/vox/shoes.dmi' - head_icons = 'icons/mob/species/vox/head.dmi' -// belt_icons = 'icons/mob/belt.dmi' - wear_suit_icons = 'icons/mob/species/vox/suit.dmi' - wear_mask_icons = 'icons/mob/species/vox/masks.dmi' -// back_icons = 'icons/mob/back.dmi' - - has_organ = list( - "brain" = /datum/organ/internal/brain, - "eyes" = /datum/organ/internal/eyes/vox - ) - -/datum/species/skellington/skelevox/makeName(var/gender,var/mob/living/carbon/human/H=null) - var/sounds = rand(3,8) - var/newname = "" - - for(var/i = 1 to sounds) - newname += pick(vox_name_syllables) - return capitalize(newname) - /datum/species/tajaran name = "Tajaran" icobase = 'icons/mob/human_races/r_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi' known_languages = list(LANGUAGE_CATBEAST, LANGUAGE_MOUSE) - tail = "tajtail" + tail = "tajaran_brown" + tail_type = "tajaran" attack_verb = "scratches" punch_damage = 2 //Claws add 3 damage without gloves, so the total is 5 @@ -536,7 +505,7 @@ var/global/list/playable_species = list("Human") primitive = /mob/living/carbon/monkey/tajara flags = WHITELISTED - anatomy_flags = HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SWEAT_GLANDS + anatomy_flags = HAS_LIPS | HAS_UNDERWEAR | HAS_TAIL | HAS_SWEAT_GLANDS | HAS_ICON_SKIN_TONE default_mutations=list(M_CLAWS) @@ -568,18 +537,20 @@ var/global/list/playable_species = list("Human") updatespeciescolor(H) H.update_icon() -/datum/species/tajaran/updatespeciescolor(var/mob/living/carbon/human/H) - switch(H.my_appearance.s_tone) +/datum/species/tajaran/updatespeciescolor(mob/living/carbon/human/tajaran) + var/datum/organ/external/tail/tajaran_tail = tajaran.get_cosmetic_organ(COSMETIC_ORGAN_TAIL) + switch(tajaran.my_appearance.s_tone) if(CATBEASTBLACK) icobase = 'icons/mob/human_races/r_tajaranblack.dmi' deform = 'icons/mob/human_races/r_def_tajaranblack.dmi' - tail = "tajtailb" - H.my_appearance.h_style = "Black Tajaran Ears" + tajaran.my_appearance.h_style = "Black Tajaran Ears" else icobase = 'icons/mob/human_races/r_tajaran.dmi' deform = 'icons/mob/human_races/r_def_tajaran.dmi' - tail = "tajtail" - H.my_appearance.h_style = "Tajaran Ears" + tajaran.my_appearance.h_style = "Tajaran Ears" + if(tajaran_tail && (tajaran_tail.status & ORGAN_DESTROYED)) + return + tajaran_tail.update_tail(tajaran) /datum/species/tajaran/handle_speech(var/datum/speech/speech, mob/living/carbon/human/H) if (prob(15)) @@ -610,7 +581,7 @@ var/global/list/playable_species = list("Human") primitive = /mob/living/carbon/monkey/grey flags = PLAYABLE | WHITELISTED - anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS | ACID4WATER + anatomy_flags = HAS_LIPS | HAS_SWEAT_GLANDS | ACID4WATER | HAS_ICON_SKIN_TONE spells = list(/spell/targeted/telepathy) @@ -736,114 +707,6 @@ var/global/list/playable_species = list("Human") head_icons = 'icons/mob/species/skrell/head.dmi' wear_suit_icons = 'icons/mob/species/skrell/suit.dmi' -/datum/species/vox - name = "Vox" - icobase = 'icons/mob/human_races/vox/r_vox.dmi' - deform = 'icons/mob/human_races/vox/r_def_vox.dmi' - known_languages = list(LANGUAGE_VOX) - meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat/rawchicken/vox - tacklePower = 40 - anatomy_flags = HAS_SWEAT_GLANDS - - survival_gear = /obj/item/weapon/storage/box/survival/vox - - primitive = /mob/living/carbon/monkey/vox - - cold_level_1 = 80 - cold_level_2 = 50 - cold_level_3 = 0 - - eyes = "vox_eyes_s" - breath_type = GAS_NITROGEN - - default_mutations = list(M_BEAK, M_TALONS) - flags = PLAYABLE | WHITELISTED - - blood_color = VOX_BLOOD - flesh_color = "#808D11" - max_skin_tone = 6 - - footprint_type = /obj/effect/decal/cleanable/blood/tracks/footprints/vox //Bird claws - - uniform_icons = 'icons/mob/species/vox/uniform.dmi' -// fat_uniform_icons = 'icons/mob/uniform_fat.dmi' - gloves_icons = 'icons/mob/species/vox/gloves.dmi' - glasses_icons = 'icons/mob/species/vox/eyes.dmi' -// ears_icons = 'icons/mob/ears.dmi' - shoes_icons = 'icons/mob/species/vox/shoes.dmi' - head_icons = 'icons/mob/species/vox/head.dmi' -// belt_icons = 'icons/mob/belt.dmi' - wear_suit_icons = 'icons/mob/species/vox/suit.dmi' - wear_mask_icons = 'icons/mob/species/vox/masks.dmi' - back_icons = 'icons/mob/species/vox/back.dmi' - - has_mutant_race = 0 - has_organ = list( - "heart" = /datum/organ/internal/heart/vox, - "lungs" = /datum/organ/internal/lungs/vox, - "liver" = /datum/organ/internal/liver, - "kidneys" = /datum/organ/internal/kidney, - "brain" = /datum/organ/internal/brain, - "appendix" = /datum/organ/internal/appendix, - "eyes" = /datum/organ/internal/eyes/vox - ) - - species_intro = "You are a Vox.
\ - You are somewhat more adept at handling the lower pressures of space and colder temperatures.
\ - You have talons with which you can slice others in a fist fight, and a beak which can be used to butcher corpses without the need for finer tools.
\ - However, Oxygen is incredibly toxic to you, in breathing it or consuming it. You can only breathe nitrogen." - -// -- Outfit datums -- -/datum/species/vox/final_equip(var/mob/living/carbon/human/H) - var/tank_slot = slot_s_store - var/tank_slot_name = "suit storage" - if(tank_slot) - H.equip_or_collect(new/obj/item/weapon/tank/nitrogen(H), tank_slot) - else - H.put_in_hands(new/obj/item/weapon/tank/nitrogen(H)) - to_chat(H, "You are now running on nitrogen internals from the [H.s_store] in your [tank_slot_name].") - var/obj/item/weapon/tank/nitrogen/N = H.get_item_by_slot(tank_slot) - if(!N) - N = H.get_item_by_slot(slot_back) - H.internal = N - if (H.internals) - H.internals.icon_state = "internal1" - -/datum/species/vox/makeName(var/gender,var/mob/living/carbon/human/H=null) - var/sounds = rand(3,8) - var/newname = "" - - for(var/i = 1 to sounds) - newname += pick(vox_name_syllables) - return capitalize(newname) - -/datum/species/vox/handle_post_spawn(var/mob/living/carbon/human/H) - if(myhuman != H) - return - updatespeciescolor(H) - H.update_icon() - -/datum/species/vox/updatespeciescolor(var/mob/living/carbon/human/H) - switch(H.my_appearance.s_tone) - if(6) - icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxemrl.dmi' - if(5) - icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxazu.dmi' - if(4) - icobase = 'icons/mob/human_races/vox/r_voxlgrn.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxlgrn.dmi' - if(3) - icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxgry.dmi' - if(2) - icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' - deform = 'icons/mob/human_races/vox/r_def_voxbrn.dmi' - else - icobase = 'icons/mob/human_races/vox/r_vox.dmi' - deform = 'icons/mob/human_races/vox/r_def_vox.dmi' - /datum/species/diona name = "Diona" icobase = 'icons/mob/human_races/r_plant.dmi' @@ -1421,4 +1284,4 @@ var/list/has_died_as_golem = list() head_organ.droplimb(1,1) H.drop_all() - qdel(src) \ No newline at end of file + qdel(src) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 0d378974686..37a9c9cd9f5 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -352,6 +352,9 @@ var/list/animals_with_wings = list( else alert("Unable to use this emote, must be either hearable or visible.") return + var/display_runechat = input("Display Runechat?") as null|anything in list("Yes", "No") + if(display_runechat == "No") + emote_type |= EMOTE_NO_RUNECHAT message = custom_emote else message = params diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index c672b2c41f0..c584fd8102d 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -174,25 +174,25 @@ if(current_species) if(current_species.name == "Vox") switch(s_tone) - if(6) + if(VOXEMERALD) icobase = 'icons/mob/human_races/vox/r_voxemrl.dmi' - if(5) + if(VOXAZURE) icobase = 'icons/mob/human_races/vox/r_voxazu.dmi' - if(4) + if(VOXLGREEN) icobase = 'icons/mob/human_races/vox/r_voxlgrn.dmi' - if(3) + if(VOXGRAY) icobase = 'icons/mob/human_races/vox/r_voxgry.dmi' - if(2) + if(VOXBROWN) icobase = 'icons/mob/human_races/vox/r_voxbrn.dmi' else icobase = 'icons/mob/human_races/vox/r_vox.dmi' else if(current_species.name == "Grey") switch(s_tone) - if(4) + if(GREYBLUE) icobase = 'icons/mob/human_races/grey/r_greyblue.dmi' - if(3) + if(GREYGREEN) icobase = 'icons/mob/human_races/grey/r_greygreen.dmi' - if(2) + if(GREYLIGHT) icobase = 'icons/mob/human_races/grey/r_greylight.dmi' else icobase = 'icons/mob/human_races/grey/r_grey.dmi' @@ -230,7 +230,31 @@ var/icon/temp = new /icon(o_icobase, "[name]") preview_icon.Blend(temp, ICON_OVERLAY) - + //Tail + if(current_species && (current_species.anatomy_flags & HAS_TAIL)) + var/tail_icon_state = current_species.tail + if(current_species.name == "Vox") + switch(s_tone) + if(VOXEMERALD) + tail_icon_state = "emerald" + if(VOXAZURE) + tail_icon_state = "azure" + if(VOXLGREEN) + tail_icon_state = "lightgreen" + if(VOXGRAY) + tail_icon_state = "grey" + if(VOXBROWN) + tail_icon_state = "brown" + else + tail_icon_state = "green" + if(current_species.name == "Tajaran") + switch(s_tone) + if(CATBEASTBLACK) + tail_icon_state = "tajaran_black" + else + tail_icon_state = "tajaran_brown" + var/icon/temp_tail_icon = icon(current_species.tail_icon, "[tail_icon_state]_BEHIND") + preview_icon.Blend(temp_tail_icon, ICON_UNDERLAY) // Skin tone if(current_species && (current_species.anatomy_flags & HAS_SKIN_TONE)) if (s_tone >= 0) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index e16afd28040..e64081c17eb 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -78,7 +78,9 @@ W.time_inflicted = world.time /mob/living/carbon/human/var/list/organs = list() +/mob/living/carbon/human/var/list/cosmetic_organs = list() /mob/living/carbon/human/var/list/datum/organ/external/organs_by_name = list() //Map organ names to organs +/mob/living/carbon/human/var/list/datum/organ/external/cosmetic_organs_by_name = list() /mob/living/carbon/human/var/list/datum/organ/internal/internal_organs_by_name = list() //So internal organs have less ickiness too /mob/living/carbon/human/var/list/grasp_organs = list() diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 7ff4b2fc0db..055e3df562b 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -50,7 +50,7 @@ var/wound_update_accuracy = 1 var/has_fat = 0 //Has a _fat variant - + var/cosmetic_only = FALSE var/grasp_id = 0 //Does this organ affect other grasping organs? var/can_grasp = 0 //Can this organ actually grasp something? @@ -154,6 +154,8 @@ droplimb(1, spawn_limb = 0, display_message = FALSE) /datum/organ/external/proc/take_damage(brute, burn, sharp, edge, used_weapon = null, list/forbidden_limbs = list()) + if(cosmetic_only) + return if(owner?.status_flags & GODMODE) return 0 //godmode if((brute <= 0) && (burn <= 0)) @@ -277,6 +279,8 @@ return result /datum/organ/external/proc/heal_damage(brute, burn, internal = 0, robo_repair = 0) + if(cosmetic_only) + return if(is_robotic() && !robo_repair) //This item can't fix robotic limbs return @@ -330,6 +334,8 @@ owner.updatehealth() /datum/organ/external/proc/createwound(var/type = CUT, var/damage) + if(cosmetic_only) + return if(!damage || damage < 0) //We weren't passed a damage value, or it's negative for some reason return @@ -409,7 +415,6 @@ return 0 /datum/organ/external/process() - //Process wounds, doing healing etc. Only do this every few ticks to save processing power if(owner.life_tick % wound_update_accuracy == 0) update_wounds() @@ -448,7 +453,6 @@ //Cancer growth for external organs is simple, it grows, hurts, damages, and suddenly grows out of control //Limb cancer is relatively benign until it grows large, then it cripples you and metastases /datum/organ/external/handle_cancer() - if(..()) return 1 @@ -500,6 +504,8 @@ Note that amputating the affected organ does in fact remove the infection from t */ /datum/organ/external/proc/update_germs() + if(cosmetic_only) + return if(!is_existing() || !is_organic()) //Needs to be organic and existing germ_level = 0 return @@ -590,7 +596,8 @@ Note that amputating the affected organ does in fact remove the infection from t //Updating wounds. Handles wound natural healing, internal bleedings and infections /datum/organ/external/proc/update_wounds() - + if(cosmetic_only) + return if(!is_organic()) //Non-organic limbs don't heal or get worse return @@ -748,7 +755,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(body_part == (UPPER_TORSO || LOWER_TORSO)) //We can't lose either, those cannot be amputated and will cause extremely serious problems return - var/datum/species/species = src.species || owner.species + var/datum/species/species = src.species || owner?.species var/obj/item/organ/external/organ //Dropped limb object if(override) @@ -837,7 +844,8 @@ Note that amputating the affected organ does in fact remove the infection from t //Throw organs around var/randomdir = pick(cardinal) step(organ, randomdir) - + if(!owner) + return organ owner.update_body(1) owner.handle_organs(1) @@ -873,7 +881,7 @@ Note that amputating the affected organ does in fact remove the infection from t O.removed(owner,owner) O.loc = headloc QDEL_NULL(organ) - + organ?.update_icon() return organ /datum/organ/external/proc/get_organ_item() @@ -941,6 +949,8 @@ Note that amputating the affected organ does in fact remove the infection from t return rval /datum/organ/external/proc/clamp_wounds() //Inconsistent with the other names but clamp is a reserved word now + if(cosmetic_only) + return var/rval = 0 src.status &= ~ORGAN_BLEEDING for(var/datum/wound/W in wounds) @@ -958,6 +968,8 @@ Note that amputating the affected organ does in fact remove the infection from t return rval /datum/organ/external/proc/fracture() + if(cosmetic_only) + return if(owner?.status_flags & GODMODE) return 0 //godmode var/datum/species/species = src.species || owner.species @@ -1053,7 +1065,7 @@ Note that amputating the affected organ does in fact remove the infection from t src.status = organ.status src.brute_dam = organ.brute_dam src.burn_dam = organ.burn_dam - + on_attach(organ) owner.butchering_drops += organ.butchering_drops //Transfer any internal_organs from the organ item to the body @@ -1086,7 +1098,7 @@ Note that amputating the affected organ does in fact remove the infection from t else if(istype(I, /obj/item/robot_parts)) //Robotic limb var/obj/item/robot_parts/R = I - + R.on_attach(src) src.robotize() src.sabotaged = R.sabotaged @@ -1103,6 +1115,9 @@ Note that amputating the affected organ does in fact remove the infection from t owner.updatehealth() owner.UpdateDamageIcon() +/datum/organ/external/proc/on_attach() + return + /datum/organ/external/proc/mutate() src.status |= ORGAN_MUTATED owner.update_body() @@ -1247,6 +1262,85 @@ Note that amputating the affected organ does in fact remove the infection from t body_part = LOWER_TORSO vital = 1 +/datum/organ/external/tail + name = COSMETIC_ORGAN_TAIL + display_name = "tail" + icon_name = "tail" + max_damage = 75 + min_broken_damage = 30 + body_part = TAIL + cosmetic_only = TRUE + var/tail_icon_file = 'icons/mob/tails.dmi' + var/tail_type + var/overlap_overlays = TRUE + +/datum/organ/external/tail/New(datum/organ/external/parent, datum/species/passed_species) + if(passed_species && (!(passed_species.anatomy_flags & HAS_TAIL))) + droplimb(TRUE, spawn_limb = FALSE) + return + create_tail_info(passed_species) + return ..() + +/datum/organ/external/tail/proc/create_tail_info(datum/species/passed_species, obj/item/organ/external/tail/tail_item) + icon_name = passed_species?.tail || tail_item?.tail_state_name + tail_icon_file = passed_species?.tail_icon || tail_item?.tail_icon_file + tail_type = passed_species?.tail_type || tail_item?.tail_type + overlap_overlays = passed_species?.tail_overlapping || tail_item?.tail_overlapping + +/datum/organ/external/tail/generate_dropped_organ(current_organ) + if(!current_organ) + if(is_robotic()) + current_organ = new /obj/item/robot_parts/tail(owner.loc, tail_type) + else + current_organ = new /obj/item/organ/external/tail(owner.loc, owner, src) + return current_organ + +/datum/organ/external/tail/on_attach(obj/item/organ/external/tail/tail_item) + create_tail_info(tail_item = tail_item) + +/datum/organ/external/tail/proc/update_tail(mob/living/carbon/human/tail_owner, skin_tone, random = FALSE) + if(!skin_tone) + skin_tone = tail_owner?.my_appearance.s_tone || owner?.my_appearance.s_tone + if(is_robotic(src)) + icon_name = "[tail_type]_robotic" + else + switch(tail_type) + if("vox") + if(random) + skin_tone = rand(1, 6) + switch(skin_tone) + if(VOXEMERALD) + icon_name = "emerald" + if(VOXAZURE) + icon_name = "azure" + if(VOXLGREEN) + icon_name = "lightgreen" + if(VOXGRAY) + icon_name = "grey" + if(VOXBROWN) + icon_name = "brown" + else + icon_name = "green" + if("tajaran") + if(random) + skin_tone = rand(1, 2) + switch(skin_tone) + if(CATBEASTBLACK) + icon_name = "tajaran_black" + else + icon_name = "tajaran_brown" + var/mob/living/carbon/human/tail_haver = tail_owner || owner + tail_haver?.update_tail_layer() + +/datum/organ/external/tail/robotize() + tail_icon_file = initial(tail_icon_file) + ..() + if(owner) + update_tail(owner) + +/datum/organ/external/tail/peggify() + return + //=====Legs====== /datum/organ/external/l_leg @@ -1607,6 +1701,7 @@ Note that amputating the affected organ does in fact remove the infection from t ..(loc) if(!istype(H)) return + post_creation(source) if(H.dna) owner_dna = H.dna.Clone() if(!blood_DNA) @@ -1641,6 +1736,9 @@ Note that amputating the affected organ does in fact remove the infection from t //The reason why B isn't just transferred from H.butchering_drops to src.butchering_drops is: //on examine(), each butchering drop's "desc_modifier()" is added to the description. This adds stuff like "he HAS NO TEETH AT ALL!!!" to the resulting description. +/obj/item/organ/external/proc/post_creation(datum/organ/external/organ_datum) + return + /obj/item/organ/external/examine(mob/user) ..() @@ -1675,8 +1773,6 @@ Note that amputating the affected organ does in fact remove the infection from t to_chat(user, "[butchery]") /obj/item/organ/external/update_icon(mob/living/carbon/human/H) - ..() - if(!H && !species) return @@ -1804,6 +1900,34 @@ Note that amputating the affected organ does in fact remove the infection from t if(B) B.infest_limb(src) +/obj/item/organ/external/tail + name = "tail" + part = COSMETIC_ORGAN_TAIL + w_class = W_CLASS_SMALL + var/tail_icon_file + var/tail_type + var/tail_icon_key + var/tail_state_name + var/tail_overlapping = TRUE + var/static/list/tail_organ_icons = list() + +/obj/item/organ/external/tail/post_creation(datum/organ/external/tail/organ_datum) + tail_icon_file = organ_datum.tail_icon_file + tail_state_name = organ_datum.icon_name + tail_type = organ_datum.tail_type + tail_overlapping = organ_datum.overlap_overlays + update_icon() + +/obj/item/organ/external/tail/update_icon() + tail_icon_key = "[tail_state_name]_[tail_type]" + var/returned_tail_icon = tail_organ_icons[tail_icon_key] + if(!returned_tail_icon) + var/icon/new_tail_icon = icon(tail_icon_file, "[tail_state_name]_BEHIND", EAST) + new_tail_icon.Shift(EAST, 6) + new_tail_icon.Shift(NORTH, 3) + returned_tail_icon = tail_organ_icons[tail_icon_key] = new_tail_icon + icon = returned_tail_icon + /obj/item/organ/external/head dir = NORTH name = LIMB_HEAD @@ -2030,6 +2154,8 @@ Note that amputating the affected organ does in fact remove the infection from t return FALSE /datum/organ/external/send_to_past(var/duration) + if(cosmetic_only) + return ..() var/static/list/resettable_vars = list( "damage_state", diff --git a/code/modules/overlays/mobs.dm b/code/modules/overlays/mobs.dm index 700dd55adeb..02db8a62942 100644 --- a/code/modules/overlays/mobs.dm +++ b/code/modules/overlays/mobs.dm @@ -9,6 +9,12 @@ /obj/abstract/Overlays/mutantrace_layer layer = FLOAT_LAYER - (TOTAL_LAYERS - MUTANTRACE_LAYER) +/obj/abstract/Overlays/tail_underlimbs_layer + layer = FLOAT_LAYER - (TOTAL_LAYERS - TAIL_UNDERLIMBS_LAYER) + +/obj/abstract/Overlays/limbs_layer + layer = FLOAT_LAYER - (TOTAL_LAYERS - LIMBS_LAYER) + /obj/abstract/Overlays/mutations_layer layer = FLOAT_LAYER - (TOTAL_LAYERS - MUTATIONS_LAYER) @@ -45,6 +51,9 @@ /obj/abstract/Overlays/glasses_over_hair_layer layer = FLOAT_LAYER - (TOTAL_LAYERS - GLASSES_OVER_HAIR_LAYER) +/obj/abstract/Overlays/tail_layer + layer = FLOAT_LAYER - (TOTAL_LAYERS - TAIL_LAYER) + /obj/abstract/Overlays/facemask_layer layer = FLOAT_LAYER - (TOTAL_LAYERS - FACEMASK_LAYER) @@ -69,9 +78,6 @@ /obj/abstract/Overlays/hand_layer layer = FLOAT_LAYER - (TOTAL_LAYERS - HAND_LAYER) -/obj/abstract/Overlays/tail_layer - layer = FLOAT_LAYER - (TOTAL_LAYERS - TAIL_LAYER) - /obj/abstract/Overlays/targeted_layer layer = FLOAT_LAYER - (TOTAL_LAYERS - TARGETED_LAYER) @@ -84,6 +90,8 @@ /* var/obj/abstract/Overlays/fire_layer/fire_layer = new var/obj/abstract/Overlays/mutantrace_layer/mutantrace_layer = new + var/obj/abstract/Overlays/tail_underlimbs_layer/tail_underlimbs_layer = new + var/obj/abstract/Overlays/limbs_layer/limbs_layer = new var/obj/abstract/Overlays/mutations_layer/mutations_layer = new var/obj/abstract/Overlays/damage_layer/damage_layer = new var/obj/abstract/Overlays/uniform_layer/uniform_layer = new @@ -98,12 +106,12 @@ var/obj/abstract/Overlays/back_layer/back_layer = new var/obj/abstract/Overlays/hair_layer/hair_layer = new var/obj/abstract/Overlays/glasses_over_hair_layer/glasses_over_hair_layer = new + var/obj/abstract/Overlays/tail_layer/tail_layer = new var/obj/abstract/Overlays/facemask_layer/facemask_layer = new var/obj/abstract/Overlays/head_layer/head_layer = new var/obj/abstract/Overlays/handcuff_layer/handcuff_layer = new var/obj/abstract/Overlays/legcuff_layer/legcuff_layer = new var/obj/abstract/Overlays/l_hand_layer/l_hand_layer = new var/obj/abstract/Overlays/r_hand_layer/r_hand_layer = new - var/obj/abstract/Overlays/tail_layer/tail_layer = new var/obj/abstract/Overlays/targeted_layer/targeted_layer = new */ diff --git a/code/modules/research/designs/robot.dm b/code/modules/research/designs/robot.dm index 03b7616d649..3228574da5f 100644 --- a/code/modules/research/designs/robot.dm +++ b/code/modules/research/designs/robot.dm @@ -58,6 +58,16 @@ category = "Robot" materials = list(MAT_IRON=15000) +/datum/design/robot/tail + name = "Cyborg Component (Robot tail)" + desc = "Used to build a Robot tail." + id = "robot_tail" + req_tech = list(Tc_ENGINEERING = 1) + build_type = MECHFAB + build_path = /obj/item/robot_parts/tail + category = "Robot" + materials = list(MAT_IRON=15000) + /datum/design/robot/head name = "Cyborg Component (Robot head)" desc = "Used to build a Robot head." @@ -198,4 +208,4 @@ build_type = MECHFAB build_path = /obj/item/robot_parts/robot_component/armour/reinforced category = "Robot_Part" - materials = list(MAT_IRON=5000, MAT_DIAMOND=5000) \ No newline at end of file + materials = list(MAT_IRON=5000, MAT_DIAMOND=5000) diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index fab84860e83..2daff4596d3 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -5,6 +5,7 @@ /datum/surgery_step/generic/ can_infect = 1 + supports_cosmetic_organs = TRUE var/painful=1 /datum/surgery_step/generic/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -14,7 +15,7 @@ return 0 if (!hasorgans(target)) return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if (affected == null) return 0 if (affected.status & ORGAN_DESTROYED) @@ -40,7 +41,6 @@ ) priority = 0.1 //so the tool checks for this step before /generic/cut_open - duration = 4 SECONDS /datum/surgery_step/generic/cut_with_laser/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -48,29 +48,30 @@ if(target.species && (target.species.anatomy_flags & NO_SKIN)) to_chat(user, "[target] has no skin!") return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) return affected.open == 0 && target_zone != "mouth" /datum/surgery_step/generic/cut_with_laser/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts the bloodless incision on [target]'s [affected.display_name] with \the [tool].", \ "You start the bloodless incision on [target]'s [affected.display_name] with \the [tool].") target.custom_pain("You feel a horrible, searing pain in your [affected.display_name]!",1, scream=TRUE) ..() /datum/surgery_step/generic/cut_with_laser/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has made a bloodless incision on [target]'s [affected.display_name] with \the [tool].", \ "You have made a bloodless incision on [target]'s [affected.display_name] with \the [tool].",) //Could be cleaner ... affected.open = 1 - affected.status |= ORGAN_BLEEDING + if(!affected.cosmetic_only) + affected.status |= ORGAN_BLEEDING affected.createwound(CUT, 1) affected.clamp_wounds() //spread_germs_to_organ(affected, user) //a laser scalpel shouldn't spread germs. /datum/surgery_step/generic/cut_with_laser/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user]'s hand slips as the blade sputters, searing a long gash in [target]'s [affected.display_name] with \the [tool]!", \ "Your hand slips as the blade sputters, searing a long gash in [target]'s [affected.display_name] with \the [tool]!") affected.createwound(CUT, 7.5) @@ -88,7 +89,6 @@ ) priority = 0.1 //so the tool checks for this step before /generic/cut_open - duration = 8 SECONDS /datum/surgery_step/generic/incision_manager/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -97,11 +97,11 @@ to_chat(user, "[target] has no skin!") return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) return affected.open == 0 && target_zone != "mouth" /datum/surgery_step/generic/incision_manager/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts to construct a prepared incision on and within [target]'s [affected.display_name] with \the [tool].", \ "You start to construct a prepared incision on and within [target]'s [affected.display_name] with \the [tool].") target.custom_pain("You feel a horrible, searing pain in your [affected.display_name] as it is pushed apart!",1, scream=TRUE) @@ -111,18 +111,19 @@ ..() /datum/surgery_step/generic/incision_manager/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].", \ "You have constructed a prepared incision on and within [target]'s [affected.display_name] with \the [tool].",) affected.open = 1 - affected.status |= ORGAN_BLEEDING + if(!affected.cosmetic_only) + affected.status |= ORGAN_BLEEDING affected.createwound(CUT, 1) affected.clamp_wounds() affected.open = 2 tool.icon_state = "[initial(tool.icon_state)]_off" /datum/surgery_step/generic/incision_manager/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user]'s hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.display_name] with \the [tool]!", \ "Your hand jolts as the system sparks, ripping a gruesome hole in [target]'s [affected.display_name] with \the [tool]!") affected.createwound(CUT, 20) @@ -148,7 +149,6 @@ ) priority = 0 - duration = 4 SECONDS /datum/surgery_step/generic/cut_open/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -157,28 +157,29 @@ to_chat(user, "[target] has no skin!") return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if(. && !affected.open && target_zone != "mouth") return . return 0 /datum/surgery_step/generic/cut_open/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts the incision on [target]'s [affected.display_name] with \the [tool].", \ "You start the incision on [target]'s [affected.display_name] with \the [tool].") target.custom_pain("You feel a horrible pain as if from a sharp knife in your [affected.display_name]!",1, scream=TRUE) ..() /datum/surgery_step/generic/cut_open/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has made an incision on [target]'s [affected.display_name] with \the [tool].", \ "You have made an incision on [target]'s [affected.display_name] with \the [tool].",) affected.open = 1 - affected.status |= ORGAN_BLEEDING + if(!affected.cosmetic_only) + affected.status |= ORGAN_BLEEDING affected.createwound(CUT, 1) /datum/surgery_step/generic/cut_open/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user]'s hand slips, slicing open [target]'s [affected.display_name] in the wrong place with \the [tool]!", \ "Your hand slips, slicing open [target]'s [affected.display_name] in the wrong place with \the [tool]!") affected.createwound(CUT, 10) @@ -193,7 +194,7 @@ /obj/item/weapon/talisman = 70, /obj/item/device/assembly/mousetrap = 20, ) - + supports_cosmetic_organs = FALSE duration = 3 SECONDS /datum/surgery_step/generic/clamp_bleeders/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -234,7 +235,6 @@ /obj/item/tool/crowbar = 75, /obj/item/weapon/kitchen/utensil/fork = 50 ) - duration = 3 SECONDS /datum/surgery_step/generic/retract_skin/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -243,11 +243,11 @@ to_chat(user, "[target] has no skin!") return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) return affected.open == 1 //&& !(affected.status & ORGAN_BLEEDING) /datum/surgery_step/generic/retract_skin/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) var/msg = "[user] starts to pry open the incision on [target]'s [affected.display_name] with \the [tool]." var/self_msg = "You start to pry open the incision on [target]'s [affected.display_name] with \the [tool]." if (target_zone == LIMB_CHEST) @@ -261,7 +261,7 @@ ..() /datum/surgery_step/generic/retract_skin/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) var/msg = "[user] keeps the incision open on [target]'s [affected.display_name] with \the [tool]." var/self_msg = "You keep the incision open on [target]'s [affected.display_name] with \the [tool]." if (target_zone == LIMB_CHEST) @@ -274,7 +274,7 @@ affected.open = 2 /datum/surgery_step/generic/retract_skin/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) var/msg = "[user]'s hand slips, tearing the edges of the incision on [target]'s [affected.display_name] with \the [tool]!" var/self_msg = "Your hand slips, tearing the edges of the incision on [target]'s [affected.display_name] with \the [tool]!" if (target_zone == LIMB_CHEST) @@ -303,7 +303,6 @@ /obj/item/weapon/lighter = 50, /obj/item/tool/weldingtool = 25, ) - duration = 3 SECONDS /datum/surgery_step/generic/cauterize/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -312,18 +311,18 @@ to_chat(user, "[target] has no skin!") return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) return affected.open && target_zone != "mouth" /datum/surgery_step/generic/cauterize/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] is beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool]." , \ "You are beginning to cauterize the incision on [target]'s [affected.display_name] with \the [tool].") target.custom_pain("Your [affected.display_name] is being burned!",1, scream=TRUE) ..() /datum/surgery_step/generic/cauterize/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] cauterizes the incision on [target]'s [affected.display_name] with \the [tool].", \ "You cauterize the incision on [target]'s [affected.display_name] with \the [tool].") affected.open = 0 @@ -331,7 +330,7 @@ affected.status &= ~ORGAN_BLEEDING /datum/surgery_step/generic/cauterize/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user]'s hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!", \ "Your hand slips, leaving a small burn on [target]'s [affected.display_name] with \the [tool]!") target.apply_damage(3, BURN, affected) @@ -345,7 +344,6 @@ /obj/item/weapon/kitchen/utensil/knife/large/butch = 75, /obj/item/weapon/hatchet = 75, ) - duration = 11 SECONDS /datum/surgery_step/generic/cut_limb/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -353,7 +351,7 @@ return 0 if (!hasorgans(target)) return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if (affected == null) return 0 if (affected.status & ORGAN_DESTROYED) @@ -363,14 +361,14 @@ return target_zone != LIMB_CHEST && target_zone != LIMB_GROIN && target_zone != LIMB_HEAD /datum/surgery_step/generic/cut_limb/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] is beginning to cut off [target]'s [affected.display_name] with \the [tool]." , \ "You are beginning to cut off [target]'s [affected.display_name] with \the [tool].") target.custom_pain("Your [affected.display_name] is being ripped apart!",1, scream=TRUE) ..() /datum/surgery_step/generic/cut_limb/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] cuts off [target]'s [affected.display_name] with \the [tool].", \ "You cut off [target]'s [affected.display_name] with \the [tool].") affected.open = 0 //Resets surgery status on limb, should prevent conflicting/phantom surgery @@ -397,7 +395,7 @@ ) priority = 0.1 //Tries to inject biofoam before other steps - + supports_cosmetic_organs = FALSE duration = 1 SECONDS /datum/surgery_step/generic/injectfoam/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/surgery/robolimbs.dm b/code/modules/surgery/robolimbs.dm index a900f2b11bd..86d9c9dd68f 100644 --- a/code/modules/surgery/robolimbs.dm +++ b/code/modules/surgery/robolimbs.dm @@ -5,10 +5,12 @@ /datum/surgery_step/limb can_infect = 1 + supports_cosmetic_organs = TRUE + /datum/surgery_step/limb/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) if (!hasorgans(target)) return 0 - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if (!affected || affected.name == LIMB_HEAD) return 0 if (!(affected.status & ORGAN_DESTROYED)) @@ -38,19 +40,19 @@ duration = 8 SECONDS /datum/surgery_step/limb/cut/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \ "You start cutting away flesh where [target]'s [affected.display_name] used to be with \the [tool].") ..() /datum/surgery_step/limb/cut/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] cuts away flesh where [target]'s [affected.display_name] used to be with \the [tool].", \ "You cut away flesh where [target]'s [affected.display_name] used to be with \the [tool].") affected.status |= ORGAN_CUT_AWAY /datum/surgery_step/limb/cut/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if (affected.parent) affected = affected.parent user.visible_message("[user]'s hand slips, cutting [target]'s [affected.display_name] open!", \ @@ -70,23 +72,23 @@ duration = 8 SECONDS /datum/surgery_step/limb/mend/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) return ..() && affected.status & ORGAN_CUT_AWAY /datum/surgery_step/limb/mend/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] is beginning to reposition flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].", \ "You start repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].") ..() /datum/surgery_step/limb/mend/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].", \ "You have finished repositioning flesh and nerve endings where [target]'s [affected.display_name] used to be with [tool].") affected.open = 3 /datum/surgery_step/limb/mend/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if (affected.parent) affected = affected.parent user.visible_message("[user]'s hand slips, tearing flesh on [target]'s [affected.display_name]!", \ @@ -114,17 +116,17 @@ duration = 6 SECONDS /datum/surgery_step/limb/prepare/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) return ..() && affected.open == 3 /datum/surgery_step/limb/prepare/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts adjusting area around [target]'s [affected.display_name] with \the [tool].", \ "You start adjusting area around [target]'s [affected.display_name] with \the [tool].") ..() /datum/surgery_step/limb/prepare/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has finished adjusting the area around [target]'s [affected.display_name] with \the [tool].", \ "You have finished adjusting the area around [target]'s [affected.display_name] with \the [tool].") affected.status |= ORGAN_ATTACHABLE @@ -133,7 +135,7 @@ affected.open = 0 /datum/surgery_step/limb/prepare/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if (affected.parent) affected = affected.parent user.visible_message("[user]'s hand slips, searing [target]'s [affected.display_name]!", \ @@ -147,15 +149,13 @@ allowed_tools = list( /obj/item/robot_parts = 100, ) - can_infect = 0 - duration = 8 SECONDS /datum/surgery_step/limb/attach/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/robot_parts/p = tool - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if(!(affected.status & ORGAN_ATTACHABLE) || !istype(p)) return 0 //not even ready for this and we're assuming they're using a fucking robot part! if (p.part) @@ -167,19 +167,19 @@ return ..() /datum/surgery_step/limb/attach/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \ "You start attaching [tool] where [target]'s [affected.display_name] used to be.") /datum/surgery_step/limb/attach/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has attached [tool] where [target]'s [affected.display_name] used to be.", \ "You have attached [tool] where [target]'s [affected.display_name] used to be.") affected.attach(tool) /datum/surgery_step/limb/attach/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ "Your hand slips, damaging connectors on [target]'s [affected.display_name]!") target.apply_damage(10, BRUTE, affected) @@ -193,7 +193,7 @@ ) can_infect = 0 - + supports_cosmetic_organs = FALSE duration = 8 SECONDS /datum/surgery_step/limb/attach_plank/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) @@ -236,7 +236,7 @@ /datum/surgery_step/limb/attach_flesh/can_use(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) var/obj/item/organ/external/o = tool - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) if(!(affected.status & ORGAN_ATTACHABLE) || !istype(o)) return 0 if (o.part) @@ -249,19 +249,19 @@ return ..() /datum/surgery_step/limb/attach_flesh/begin_step(mob/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] starts attaching [tool] where [target]'s [affected.display_name] used to be.", \ "You start attaching [tool] where [target]'s [affected.display_name] used to be.") /datum/surgery_step/limb/attach_flesh/end_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user] has attached [tool] where [target]'s [affected.display_name] used to be.", \ "You have attached [tool] where [target]'s [affected.display_name] used to be.") affected.attach(tool) /datum/surgery_step/limb/attach_flesh/fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) - var/datum/organ/external/affected = target.get_organ(target_zone) + var/datum/organ/external/affected = target.get_organ(target_zone, cosmetic = TRUE) user.visible_message("[user]'s hand slips, damaging connectors on [target]'s [affected.display_name]!", \ "Your hand slips, damaging connectors on [target]'s [affected.display_name]!") target.apply_damage(10, BRUTE, affected) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index c3c6d92bd8f..a162bd5790a 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -10,7 +10,7 @@ var/list/disallowed_species = null var/duration = 0 - + var/supports_cosmetic_organs = FALSE var/list/mob/doing_surgery = list() //who's doing this RIGHT NOW // evil infection stuff that will make everyone hate me @@ -65,7 +65,7 @@ if (can_infect && affected) spread_germs_to_organ(affected, user) - if(!(affected.status & (ORGAN_ROBOT|ORGAN_PEG)))//robot organs and pegs can't spread diseases or splatter blood + if((!(affected.status & (ORGAN_ROBOT|ORGAN_PEG))) && !affected.cosmetic_only)//robot organs and pegs can't spread diseases or splatter blood var/block = user.check_contact_sterility(HANDS) var/bleeding = user.check_bodypart_bleeding(HANDS) target.oneway_contact_diseases(user,block,bleeding)//potentially spreads diseases from us to them, wear latex gloves! @@ -108,7 +108,7 @@ return null /proc/spread_germs_to_organ(datum/organ/external/E, mob/living/carbon/human/user) - if(!istype(user) || !istype(E)) + if(!istype(user) || !istype(E) || E.cosmetic_only) return var/germ_level = user.germ_level @@ -131,8 +131,19 @@ clumsy = 1 var/target_area = user.zone_sel ? user.zone_sel.selecting : get_random_zone_sel() + if(target_area == LIMB_GROIN) + var/groin_or_tail = input(user, "Groin or tail?", "Choose Target Zone", "Groin") as null|anything in list("Groin", "Tail") + switch(groin_or_tail) + if("Groin") + target_area = LIMB_GROIN + if("Tail") + target_area = COSMETIC_ORGAN_TAIL for(var/datum/surgery_step/S in surgery_steps) + if(ishuman(M)) + var/mob/living/carbon/human/human_target = M + if((target_area in human_target.cosmetic_organs_by_name) && !S.supports_cosmetic_organs) + continue //check if tool is right or close enough and if this step is possible sleep_fail = 0 if(S.tool_quality(tool)) diff --git a/icons/effects/species.dmi b/icons/effects/species.dmi index dea7af2b0ef9af81cb3d2a53b6ac053f9d81a062..f7ca464f73ee26cd87a48e9f0b6702862c1f4634 100644 GIT binary patch literal 22105 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%0A!`r(e)&`Tp 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 delta 1941 zcmYk6dpy&N8^@QKTNoADp-n<&WNs0fS-Fi2r}{Pq0td7jVny#M%6l{Vn%XHiEE*)Z-Io_9m+ z&@tq2I1t?n5X%h6-c#!8>U+?gruVPw06c5CHmtnV7$2A9yviFA6l*_}?^a1|ahpA^ zS#Q`Fmm7%LL&+FpiS7>2D1f>{--z^j%F1AdeKz6lME$2}%e~7Ys&`-7NDScj3|<>wQ_;YNK%{b=kK3KO{@3T+JJGZH zO37_HH9JUaM|=fM+ZjlFeVxZ8O=CIab}xH`9+7=MOIwl~s0R6|7_{^mTXdPc3)QG{ z*rka0;#s0Lz-Nl>QVSIy-#>%bt7L0sxRJ7=>}KEI76*SdP6JZ{(WDA9%1qJXHrbZt}ybFvyfO~IS`KVOR~Q7G5Ula0vEbZ>wR@d_GvpbqJMbx zH%&j|UnJK_Cp@9byaPil)!Bnd6hH6vf*O)85RBK)zqs*m57#PWgXs^pFG&km!%}Ym z2UMJJMKfr6mQIRS_`-!hdv=#NH#C=*Nd$b;Ovc_}Cg(*e&*)9S3Hvh?1;eHax|FB~ zqb#xeFqxu|?Wl1yopH=wC_qG3fyP8fm0@TtQ|vB)!8C5F9*W|iA1n3bV#a*_20}e4 z>&{SzEuoFCHQM4nu#B+{c@xcJvSWWD_oG!8E_F7~JFtmddTrkqmw8+zk&AnAaJklb zYF5@j(^Pf%=_a(!l#Bk)-#Kj)5{#F-(UyH2&PhJ!7> zGnV|jfWTI?l?M8Q9UtBbC8fR_DJ-&dPRH5{CsGDI26(${>lTy5ud zRt(i?@T1A86t>6fDI}1ccF{Ue?V51zn#>>qOnd&S`TY3a1ta;f?DCH%uUcK6zE;dT z4o$4!m$t{?Yl!yy;zz0jwhyT?s@7@uL-22!S|uu^Q`GJ6rf}y^lt!}ag9U`aY=O!bo@zYX^4{tTKL-N9b8vKXP(*J)I>9P`Pg>cGW_I%f*JP3Ep zU}c{3?BcJ`)G&X@OYtOxI<`48U#`5An39E_OpfUsGR5*?Qe2~O*SAq9^@K~#v7k?E zJUOWmSZH1FJ*$cuvuffnAC%@@@eKsUy)yFOjXcj&kZIFTWNdECgLNWERBU`u+P=kc z-0b1%Zq|Vq!J`1_3ilt{e{dpWyf;;f|__o#KI|-sY%+ zZb5VOfn954A^%QXl9FXGxc2=Jy&-p%S*E!0rgv6s7tH_szYjhxFy%8x`S zYYkJU5pc2^3he0hJpDjvnQq*|HM{CbitK}ada`p8s-zNxwlu%-$1v8HXxxz6jznmaStg?u(@>M}`yh9WQ0P9KlHKNVo8vM=K3FsRk zOe(yC39Y+_Av!8rcG~C2GNC`1=PM9o!g%|&!1W$hj(Ci?fbR!&jr!S3J- z_j~2iSu6BUAk906Hq&*nj47^(ep#6Z6a~0P&M|0>Z%R7Ng1$vd;qN+oIk5vt$dm%I zC_W|7tMpu_(Jr@sv0T{Is|zKTrj=9D3ZG7O91Au?{UEdTc)o2qGYWUYex`jMKHgSL z)u0koqB7eGZtj#Efmgr?nGw6o3{>pBcgrtIo*T{B8@`2IzLhF*#r9WVbMeFWuiHzR zqQ>OYnH#TLvfbU_mHo-f=V`2Dc&+Tz!E6K50Fz+3gU%!TMIDI~#n`UCdN{Ahj1 zo`%b1?;By{)neIk!UlX(G1=vPG>n`{hYivy*OtQGA_o#KTCO$7ybK7JwB6uJz7dVIW9d-KRy5e z02LPl048DpIFkSuQ5zc@IW9bchg3*QFHV=-0C=2@lDi7SFbqX!`zuVcm%i36C4Zr0Xnw&M{G?6ccNLRXJ~zCX8FL`m`t&QYZ_M37A*2CScLHDg|ZHQGKL;rbiV< zk_OT=kfwnojeiW7fN-yk`|Hq(e(cu&`vQTSxPh8#A{77t2C7L!K~#90?VXEu<0uS< z&Be3^+$8Pn_Wj>M|13CG>oXMO90YV5HgDnpO00000000000002sSy6iV zPb*HqSo*R?EJWKyDhnm)j_V)PI9mFQtOCkdYYm%xs((dDSFCP5)SqlWQuTt7lrg3H zx6r!&RD+VsFQq?v{Qv*}0000yDN4zc?Na(8LKiIgq;w@yoa(o&-_RAaaJi+7rjJ;L zq6=25b1E34Q<~Vm4(d0822{VcTGT*Mdg5}`!hEGj?Q2^<BFQ1YESw~%d zEEu41{eOdcd3DaczOV``K4keNt0Y3zo0nHLP3H;Iq+VZ4Qb904{5Hr^;2f&y?3mPI(nd7hDp`i;M}~iv~jd$K!PEqTIy((SL9KNrSeFj;-ql000000000000000 z000000B|Foe*0IvQLPj5D&FXMCGkG3PRKsFr|fu>!p#F%KxZs)tM(7_t$KZsyP580 z1~A4|-?7sQ?JrfF{EZBtT&DES2$?>bT)0i)%J*-8AzbJ<`5U!=i2aWMGC<{T*YN-b z0Dk}g0000Dh_h!?Vnz1ij5So0(vmobyajxyGJq=x6$P3zzlFEV&mqinP4<}2eu5Iq zJ^}y$0000000000z)E^wbgSUvCWgta$SoQma*MvV!JhtYBluqynB1y6L<9>&cl8}2 zRX3NZLaePye%~YWw(brY!Cm6@cL>!PK!1+6C%<9gn;3r?APP&(ne2ShF78UXnFc6b zbDx^%0m(WQWe~ezC;nZ`US0A9Bi8`ZzQO{c2dET{uWEPUcNWb{Y z&wqJKe4oQPOMOWQ6QT2h&QR44XMeM+rdC(18L~9?05w)_Sq!WN(o2RmYOx>6=Yfj3 z@HI(lh4PF6Cda*HYz>9>$y4Q$fRH%(6$Z#}uT9=<*cCj@-%Io0Qwz8Yf<=J6S~w&N zFg2`+Pmqgmkc#kIHlB}KmktCa0}N#Y`>r1JvO zS>T<`xXJ+epSK4l*bg7#AlRB-7HG;x^5FO7e=hw!T`pgnK76FhZJ~nZ>}ik=2i{8; znbJ{0_JDr7e_{Ust5)ES)OG%bsbcruRioghsdD!g5ZRX&gbV3klxEZYvh578PO1gf zie2yJ-L^eZywLk0dSznQ?SD_c*|~xM0000000000004kBbp5p0s`vz%_y$M(A1PDM z23Q%N;3B@kS1JGe%V+Aj{j1;L5q$O$K|=JHju#QNG2HB_AMQp;-)eZpDEz1>>_PZBlVEB zBc~uWVDSLK0@S_Q@_z=fnw+HD_NNZEq$AtKsR1+yco!!ZP{J5kMu6(q0muMH58w@u zJb>-sVetTMBo9bqtX~5p7tp)|94#P?faNHt6n_v@s^?>1I*XG5gcJ3+cz_UWB@F;0 zMb=K~?F>*1{hz{OOTqD%V}KQkpwocV#mh9|1_rpcgmUQrWq$|=$+qADDHMx55z@Cf z1V}|l;p+>b|0_tR2|3(QF^r5LP#ei;l#D0_x8MHqhmoHpZAZ!8^}h~66K6wRBnG$d z_z+C`jqD`sr__$`#@XE21MW%+%wLYgWEA(BgE-8AJU}=I_uc*>*sA#b(Q|vCF}UEQ z>uoXge|zfU_h<9*|A*+xvHiP#?>8UW|4fQE6Jq-V00000006*qg8g~y&trcc`}5eJ z$NoI_=ehjYpKrTAU*u8t=kLdZ?9aF3zWei!z+Ly}0RR910KnhmKT%CGl4n27l>h($ M07*qoM6N<$f=8LWZU6uP delta 2005 zcmX|B3pmpY6yHcvm^@=-#7rI|@@TY?iVX>wS12T0=9x$M8$-z}k8*Qsr1A(!mdP`Z zA&ij7+oY@Vh%&R>a zh0cjHcE%bTYVL?pLW;dP4haH*B&2w)(8ukL9>7K2l={JLZEXd?FMU2T(^`U-Pit2}YIjjOQ5+#YztND5iTDYZ6bT&vCT518Py>1K*SSAJkE zuctwV;TQl0e)Ctah!b`1r2jKbL?8kLz6%E4sf*A;MNGS=@t*AAO*SwD4)#B{5?`u(p4{S6_bQmV024T6 z`a*bzI|vj{22&&lWjZev8XWC#$}YcUS40wWNm)FCi7mTvFW3ZIaPCeZ&x7wk&S6Q! z#e6}VCpTiXq}K!xOobvb>By1Ih&wn;QY0Llcry$uw-G6qgGTL~W8P?pt@aD-x0j zu>HR$`(=%w&JO!6Dm+4Hr0|5?Mw?WJDSOeVikaU)hV?-M)<+{;)1H)@5RK64ztdm}Ze7cmKno zwZo)t$msvXe>wm1j|XlAYuxNQHTL1!iLsp_v?4;ppBN5=WkIuGBFz(AUQoF87*1VR|)lh=2GwNWV+>F}n zY1Lqu+bp%uulNi2=W4m|T-JjuwM;loOTMQqXQ(Dq)E_#7IAlx@WVNbp7jAf8x8I6X zHJxl0>d;R}i0nKX+Nt0=Du~x3i07k~hc+qc@|u52`)~RC&7t@;cK*K_!26TncD`r;7BcF#w|cY;W->{Hc0q7oqQGq-F+~DL zG$m1rA2j(4@Ik6oK=}7kjO#{L$FmV-UUu&lhEx@6%gnip|JQx~G;yM*xi3mw^;Aoz z@)-^5-;_S!iht938XK5cr9W01YroRykdn z8}7%%5XDjw<7C$s9G16WCUtScAp>SfV+2>!LPa$PIuCk0kC z2B5m{jla&;Z6Wa-$>W+&G*+kEy8;w2p&4;1%hn;t{)5U32dk$RGiCKrmb~t!P7LcA zZTrcX)x-NE-`YfNNQ)RQYVPrQ#jT!tX_LXGgTfs&5R%WEZxgOe@JcYgQlRxq%aGVm c1`qiq;g2*!^B#^`{J$%*IB9KGW$Kae4^}Fi)&Kwi diff --git a/icons/mob/human_races/vox/r_def_voxemrl.dmi b/icons/mob/human_races/vox/r_def_voxemrl.dmi index 339bd6f2f0e7c63bb092cc5627d0d0354094cc56..c9e622a1d6a04d247c1dc269cc8cdbc9b02df05e 100644 GIT binary patch delta 1954 zcmV;T2VMC74~GztSswrccNLRXJ~zCX8FL z`m`t&QYZ_M37A*2CScLHDg|ZHe^Gs;f2KzjMv?~7G?1o&B#jK1fN-yk`|Hq(e(cu& z`vQTSxPh8#A{77t2C7L!K~#90?VXEu<0uS<&Be3^+$8Pn_Wj>M|13CG> zoXMO90YV5HgDnpO00000000000002sSy6iVPb*HqSo*R?EJWKyDhnm)e~#-P)HquD zjI096SZfWNe5yrASFCP5)SqlWQuTt7lrg3Hx6r!&RD+VsFQq?v{Qv*}0000yDN4zc z?Na(8LKiIgq;w@yoa(o&-_RAaaJi+7rjJ;Lq6=25b1E34Q<~Vm4(d0822{VcTGT*M zdg5}`!hEGj?Q2^<TEas7jOd3DaczOV``K4keNt0Y3z zo0nHLP3H;Iq+VZ4Qb904{5Hr^;2f&y?3mP zI(nd7hDp`i;M}JOh{fh=d{m0{U z?V{Yo{?Tv!NrSeFj;-ql000000000000000000000B|Foe*0IvQLPj5D&FXMCGkG3 zPRKsFr|fu>!p#F%KxZs)tM(7_t$KZsyP5801~A4|-?7sQ?JrfF{EZBtT&DES2$?>b zT)0i)%J*-8AzbJ&cl8}2RX3NZLaePye}3O1^S15|8NprR^>+x> z89Wb{Y&wqJKe|(?AIZJ&>2os_6g3eIY4`;Kh zrdC(18L~9?05w)_Sq!WN(o2RmYOx>6=Yfj3@HI(lh4PF6Cda*HYz>9>$y4Q$fRH%( z6$Z#}uT9=<*cCj@-%Io0Qwz8Yf<=J6S~w&NFg2`+Pmqgmkc#kIHlB}KmktCa0}N#Y zT<`xXJ+epSK4l*bg7#AlRB-7HG;x z^5FO7e=hw!T`pgnK76FhZJ~nZ>}ik=2i{8;nbJ{0_JDr7e_{Ust5)ES)OG%bsbcru zRioghsdD!g5ZRX&gbV3klxEZYvh578PO1gfe~Ml2<=wVDQM}OmA$nzE*X>Wf*|~xM z0000000000004kBbp5p0s`vz%_y$M(A1PDM23Q%N;3B@kS1JGe%V+Aj{j1;L5q$O$ zK|=J zHju#QNG2HB_AMQp;-)eZpDEz1>>_PZe-sVetTMBo9bqtX~5p7tp)|94#P? zfaNHt6n_v@s^?>1I*XG5gcJ3+cz_UWB@F;0Mb=K~?F>*1{hz{OOTqD%V}KQkf1uNV z)Wyp*;RXh{wuEx%|78dW$+qADDHMx55z@Cf1V}|l;p+>b|0_tR2|3(QF^r5LP#ei; zl#D0_x8MHqhmoHpZAZ!8^}h~66K6wRBnG$d_z+C`jqD`sr__$`#@XE21MW%+%wLYg zWEA(BgE-8AJU}=I_uc*>*sA#bc+qovpfR}Mr0Z=l^nZKm;`j6M|A*+xvHiP#?>8UW z|4fQE6Jq-V00000006*qg8g~y&trcc`}5eJ$NoI_=ehjYpKrTAU*u8t=kLdZ?9aF3 ozWei!z+Ly}0RR910KnhmKT%CGl4n27l>h($07*qoM6N<$f==n9(*OVf delta 1945 zcmYk4dpHw{8^?EP)@ft9AXZVtOlIl0M-m~ zDhW2&7M?%TB)>MA8BRswM&3f#jBkR5X7@brunt`)Z!+Qv`isoEmf0rywGl28=IL11 z$(Sl|6<^=)P3U z_X$4uuYKYQ)Lz8HSV636dw{cEuVs;t__%>`D1NA0RA79|CU9qFly|**4LK`2EbyB~ zZuADl!;c>NjM{l5&L@s_uQCpcY7NR7IVfXb3TnIAVEK`7Ad5~pD&nt zKtT)HOWEAY>|LnwfQkfUvE^}28@Y1REYO!^b3=(?r##$Uq-4(bLZ`<<98fo@T&5v) z%r2K|MJRM1P!wv4268k;OXBJbHU9;yF8LD3NtMIhZkajMdoMkX|-wP(XcXY=pPJxK=xEPe~sHupF@M@Eakma!B z2bGd5sf+PJ-|ztSa&hZ9D;n^xOLmZ_&zkgu>?Oi0Cfi0m^UrPygUN}(fWl{VF0n+Q zP0>kK3b^HxnIo9hL+xMC{!h?-jNhGGK@Fz+;ZgQsBLHnPL5Jd^Y{4}3aU*9&RiwOm zAGZCKrDLXPVa-o<^$wUNYCmP)B0cXA)v`(bnwt07Xq!5KsV0aBc z#^s+rZohdx`;p^U<>HTXTS?_-!CA%0L05sew(ldL$kzW$NkH{B2_m#;znzGj#HrZs z;6C^9@xz9WqnSp&#vi?5PYPEfs)lppSedoe;+(B3l>WtrPk*; zcsXj4W9mi|2y%0FHahJ8kAN|rj51mw2V9kd@T;0N#7OYrI}p{UP*$dq*lW;sU3$qh zeErR}!@Qtg*Xi=j6zb25=ftVNg5{ej!2p3ILC__oCHWpu+)5xX;S+|e^zOt}hZs3s zQPwO~vmysj0GP+#Ztft#@xWC7)3d?NH!7fFC$*~@iL5T_HhLmQnWK-@63o|fGO(d*nwfEyCa9>@U{ z3N0#b`8Ck3PvwI)w3t83O@ICOTLJ(?=w14c0=uio&Ym?JDfi^`GbuHx`oQ)`xq8t} zcXhe!jkLx*31$&D9d2lKY8O8|(zZ=TsBI~?k6iZC6jiznKj$VdG8~4-Y?0>foyHb6 zbJVQ6FPvKV@k~8f*q}St6B3KqsF8c2g|E_h>tGFOd4y9SZPd+H$=xc&;QY!rXck)& zB|C{HZ1iJ6q4ceTSsI|f(r?g8yU|vw5J4|w|Vr*dgy=Ce2EyLX{{Fg`R z+mtc%@4tb&SB}QnY1g~;#=SE>LRw=}&+F8e4)vAa7(00_;ZBLs%j-b&V2uXCZ zg%6)Bm=rgS5|je8;`}{Mu-lYk>}d4^7Vw$&_X9t7vL_zmRkL1>n?4XM;-@2gyDo|~ Xm)uRtG9ugXeXDMHZ3wmz`(#diiIHn0004W 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 WpapbS9yE3SH!u@~CA{3wBmO`99`=X; diff --git a/icons/mob/human_races/vox/r_def_voxlgrn.dmi b/icons/mob/human_races/vox/r_def_voxlgrn.dmi index a3c5076f62a5bf49d1d1920c78294490b32b5973..cdcdc18726345e084b6c41606f1dfcdb5a72582e 100644 GIT binary patch delta 1937 zcmYk4dpy&N8^Aad^VjpdUZ3ZAKCjQ~&6C@a%Wy$~uvF0bERejd zf`S6c3EtV+Ip_LBa4!f0WImJb#>o(V7M`+h&TSvo#*}*d#dM+nS3!a_PrUDF%({_4 z4R}gZJ)h|s%nRyPe=6+sgxWJ)+qP`;T zbO6)EAL2{!={^+bh^~=ii4MQfWOp9*PEiRh;DaEBJ@!!CotGjyE9!vK&xW?-fVz zKy`5I_AwW!?55%4273-E84cvA=xY3UOvS3y_ZnVSe+HF?iJG98Tu&=tdmsGo!AQI8 zOtpyz+p3r4we~6^G4{+=*29@WWDAY`Ahj}`oLB~TsteIXmwV-pwtusFE)MF@@z|AX zVjI11bLa*AfhEu14Zmpc>K?RS0&uFbA;#91S1Q4we(vIut5*v{8g=R=UMFdFcq0kb z(Vw?!D_1W4l+XQ?a!2#f-x|O@D7a;Q#NFXIVN2P;aD_5Ouk1Q=vEVwN9n-(I6ct{d zY8YMOo_J@-jX%kj7>H7EM8IhC`x-1YskX?Y+M%69k_MlH+-RqstqTK0M9I>F`QWGF zwt-afN7g~L=>(y7_)p2NqWjW5IbzcxIyGHAd^idjwB42&S?r|dT|8+Y-bS2T0&A7% zqnZ0HD>c8bQ;5&iA=pP*cyL-7(Sk~${N4g}sJZ>jh z4!!lMMflfc&Io|MwujHm%xSqak>cerXvRG6br5+M8}A7{^ujI#d$G6`{>(105^Oax zS%r-@X(bVk^#qRI0pwepbLm}uXBn-Hj~E}pn&$I$;~u+HiH>j8l8$6u`8kwX*7 z7rWid*#gq`W`for8!S=fS*>f5F`;yNFhck@fDGTYl@^Q#s-|x$PZVoxXGlCDP1rb@ zWF|l6T$-0v)sF$I1m`=Wl{=mrybbJbn7wvzH6K>&+UbE%1@By+L!9p9KEfKC zYPXweQKy?X>D;HG%Ie1`>I%xmt=h(2fDio_FBLZw-6r|Dl9K6MZfH{%9}ZGj3C+XBOgd>mMnzjr@B*0tCE?Uc7l>VH8qFrCidqd1nb) zf9d{h`&A%$OFY{o`t(8Yc~h)p^jKT~)WLBrT16|@JkxkU0`-d*#z`v;jY=&{b9#}0 zvA0=hCfXff9CcgH^f&)&AF3*(^BUSdD}=2(cagjac(W=|41-KqkM3|IxD4($4NgO4n41_%Yra&1{JOe_ zMsq%RgXXRnVdW5U4|~9rioS8(=Y` zmYeYDqNp{F7x10%^Jww%mKV^@JD}gQ7%T2jl557#qzTtKc!`LqV%Wb+z-#=Phc2r~ Rk9+N(nMfdAX}C;@`wRL(od5s; delta 1928 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 S5L)%`IbXD}F|RW7y!RiM-W{p{ delta 2635 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 Kn>WaSr2ha*L;%?U diff --git a/icons/mob/human_races/vox/r_voxazu.dmi b/icons/mob/human_races/vox/r_voxazu.dmi index e8283333af6e184885c68d7f008ec0a5b6c43bfa..8ad3b14c35b4e06993f006b0f5738cec07cf9691 100644 GIT binary patch delta 1956 zcmY+BdpHvc7{<4@DH4)eOEb=fj>0OJDQs?=dumy$h;arB z000nfP7o~}c>-Sgn31#*ZZ{MJRMoUGGB(gMEK1TmeFA2~ya`=fsi~;}sQCaesQ@TZ zQBl#Lk)^(Q45X3l9RRq|o^zX`EXvV^W_~u@mr4nxQ9^~*upkWf9>}g3it~8S)|(D=%6A9GYv`-j0&bb|brRW8Cg?)FR|1 zbdI#tll9r2_;RADv*n~pyS?N6+5XAMD-?=Da$)?hzO6&e8+!FV6wk8??k8c!E`)p$ zi6Q`3d;yz5GYG} zyrs9!%cmGzsz%oup+(oMf712|&ntY}_*Q2n=8?5~uv4@6YlBs~8L(U(`w^}q8tH4q zFY}DovRWCq^5KIlr`XB&3Fb{X8+p@ab?&D?)aC13m)v02(lG9HvFZ60Ufexot$6}PA@VuSYh@9}^BbBHf_o8NiiCr@e zQv@k(R70Ihg7DI&0#gEs#Py=Ot^awlz12i43Tex3A2G1#)0W;Sk-o@x(Rcar#6AN)kDNRmZ$f@Hyn! zenTzyx@(xbkY0@SGo+&4Uk$(r)9M7`E;b`qc2sG6 zS;8OA1!ud)LQ`C0?Lsr%l+E)YBm`8xRWBwuu13Gc>Ou!-j#$rHS01inC1kKxQ#-_SUR2+=qG{Yw!k=5p5z@IN+y66Q|>ZNX)azS=|i{3L4R zUv{M|vSkoCn==R~buL_XRX+l2eOhqmEurUZ2voGN@teYtXI+c*+-!ih;d0oHRG@W@ zRFj^%^$_8)sxtogCgh`Uj!I?)x*qu6m~+dBJhE!|!Z znU7{Juk?G|x8A7*s(i;X#rrqkWt#sX0v$NV_&wTihv}Ac3&qt!Yn+#KJ$Wo)ajkm# zD=+FR&8cPmL<7^q@s&e4bmJ-6nN{6{_0tyIh7PC!OXLJiHpR4u?1%W?a?_5Y*^_X$ zUdw+1#!pbZk2Fue%FKXpI)p@5fnPakG`b1lCF7X0TDE7e}1o3ry`>bW_B03A(O9 z=)NaSAIkT0HTq8PJroe`I`0&C0d=ePczDD_`17s`l!<3YSF73pd)@*#e3W7+9GIj*Z7JllbRO7Jg2dTVPEdTdIV7g2n~b#JFJ| zN(bsf)H`*VrC{0u_!DwUpN-kRf?0djxLWZ{OVQHrLNe>cn$p!Nhfk6j8QnWLv$vzB z3G3X08 delta 2084 zcmX|92{hCT7oX*gDcdO9Xv7dI#_}XvEy1?y~uHPXVK#p6IAkhCn+Nb5v7Rnx;p4y>xlVzEGK7eR&@ zAXz&U3MF;)!?E2ZaJW6`4-jEuz-PCqiaO^MZsr~48R{1t?iX|!1d7Z_=`|5<))5ur z4&rWDuJ!`#A-c*v(NEHMn`~yx(6yTNu{19YselY_<$B7OI{^TS*fRp>>t;bdjw^T8 zVtwcHE44pOw?8y!+Ne8zv^3Ca&@fTQniE_EE#k@f%Jg|^7*1d=E%+y}DQ1z6vu8Qi1xV?Kc2F?RJ2wRf+v(%qmKi6-%^rVhN0dB7l zjQFbOb=4q{(6FW1$#ao8b2M;tsk&&A7&`kRJ8V8TVoT8Y6B5DkvxYdEOwFyW8gc&G ztI|?@3t20^%llU>JWspRC=~)3T2~|{ryP-_r>`sbRq&~sU)OEA4iJWr1%tqNhRov} zCysNsV$5jt%JmG3*&M!0@eBMVG;`Kg5>pk3*hH%6lcO>{?H`M)xq(MhZp6_B8$01irs= zb3?|&nbLV<+*M^hvG9pl8`W1vwBWd1^oPw@Zxd>PxA!F~fhl(I3(9wn3GO$RJR@RgqWxRr zQX)4wjpL@(M2l=j&$89H@e85_j%i*rS{SkeQn1~N2<#J(T%WOpN?OCSjR*lQbr+w? z_}A%&APqu6gJ!cSWBWOmDlTWY`2~)GX|=C*=QDsobt60yE=8%K!h?5T0lQhuszME> zm*hu9w9E)Qm%OhE^F!P%YX|Eex+h)S`QuZ)YD2{38jTVhy)m~$oYac-g<<>KD;{y&e(||y}v=A*?$Q5e?N4ZtB>7l@MaR%yPtfizPI6B>} zLO0oRUw-Uwj0>E}X+OPbXjyjK{^r)iaI^lwwt0X`qE1ihWjg)Hk@k$4#C9{FYMl)w zE#Qn{0XP2j7UCDzZS~g5=|JW9VHYwd>5d}R$5%5&J*zT6dPXEjF8n$Ctu;lza+3WR z)^#7fv;!YmOU#NC#fL|2O z-;NSzMu~s8n0l_{HMH;xL}VFyo+rER&&vZgtg=^tIa8JCm*e!H?qJW*)hkFC9FzPz z_&vDy8?e}$z=Livd=9APvG}PAS=UIXrma4?c1S4UPH3C4-fn|(>ITk`5^Bm@VD;Ut zGzVgb0?YA2mSS9q(xgy3FCYE+@aW=|qt%m#+@G?EEC-BLRmjQ61$<-gImrh^kC_OP zZ|`Bf`n1mvpKOCZw~s(+IaeH_4(Db$=i|IL0Py-YWW;Nk34PS5(djF0m@z(*IQ+|D zws7TiwSzHZ#QBQGRLTy!%WJ2RQUt5&b;hhgVy=;Q8r}$wS`;@pT19r8m~!l>3**fb zk2YN&+N{N`n@{J`vSa7#_hLDe@ZhW{Zd2XizxTkTw_SH7sYTpQILdG;iJuzAPGYow&8Q}Z#GZG z(i0`U6>C_$->teFkmbgJ*S?o4+gt$F;1EU9^kU`A`1s=a8vS((_Z=ZkLjuvndN zm2x&wD0?yL!b-KD_`|y4wr&Y=1^SO~Sb~fM!LYqnveXx#?Bm!J-k$lu(B~2NH1*vC zmP^LpQCLvk&-~!0uYsTSu3cI=?6%vfkja|cU=LmXp*Ntw5{Ad#JdibU|C!V(4)JJdGpe-c@q LCYhC)x?lerqV~^8 diff --git a/icons/mob/human_races/vox/r_voxbrn.dmi b/icons/mob/human_races/vox/r_voxbrn.dmi index 22a1291294d545260ffa5718a035951fd9db57c4..b9c791e57c9d1f7db35c887b9137962fe06534a3 100644 GIT binary patch delta 2578 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 P|Gu>OO=}apktgOqt#8)z delta 2553 zcmY*Zc{tQ-8~!n5&ywx4jwE9popXe&$Vlb8{X3SuWnQ1#MXXkZ!xJ`3tI*W+>a8&9If%M`0x#rgLOqC zei_b7S8hFl46lj=NWKp&J0!b6Y-@IdC)0JrB6+VDeZoiv@J$H~i)PlsN+hA8uWd9r zte~%|JGK;etb)uxkD{miV^4^$fJ3s=)`tO!%z^emhX4E|{C)j^{nB7o7Xa{5Y%R{a z##U}U61wpTCYY(EGyI}^aPH&wHk2@ch=q()Y6!WLk4C z-U;LU!SiSX|Cazjh{7(VFH%q_xwwm5)PI2Z6qtr=rs&ZdWO9aPt{mi0cII>w$M z=ykcNfwf>x;}={@cp^k4H*0cc;3=24y}Vbia^&n9%150)oHiKBS`+!5LqFM2{fStSa+@7W zPEJg_Rs;owGvpX14=$%#;NO2E3@q%=nfqaz9x^Xug#TavQ56gL)9I^upAQp@o)w~4 zrlZ?ER@+g7>hDyQwIgn0<}WFKloflfp|$6cu1kGhs{EYjdsWUg@8<1k#8u7RQEf-O zj0%9zs=gl$4P9771*hk}3@fT1{iKF!yBCqJ8WSV1Nb^kxI&NHGHffphnNfN`taFL- zNZu?$sU4upO9pRnI8NKugp=W%N9#h~w>n3%=3ubmok8ul1U>)DDie)Fcw zYi#`7-bjX*rYTQ3wTLV4M1ZTBTN{RT?@(MRWN`YWt62-jP@1?`h%ZkrqIB19D>4N! zDSBayyUwaZn?2~uBc~RsgE4!kvG{64>Q9thd5BqbN{F}oVsT{H_p%PY5Zyj7w6csH zwQUz3&gkTSc8#Nz=c{Dwa3+2g>>EqJ_KuPI1j{T>I@P{NoXhRg1ZGnGO>x zzodvv=h|hfCw?t!$KubuEAon~@5HbwqnrF<)=UChrt;SxcWm79Z;5_5(h#)0?r$LO z$>SZskn?F)fzh70La06;IvG1)&=tk(S<5`UY_bZ&?LbG%z$Q-G8L>TXhq;$UL!*oe ztkvS63m0!ze2{AYdti^&fpN`fsX3y`t@4ESNNj!Ern3*@W6W?6Zf;zvGWcI@pUYqm zCNL+bSq#qoN6Y82M2}8lA4ZpsUmJzcwBPNABN>Ufu{c$N3o!sZehDQ8H@x`UQ##HL zh(;6M(G(XLiUdoZ2wCTbbmg-oEW7%8hqxewb+A3ltpXT+T35AC-lfzkkM`J*(tTTn zhx4Tr1Z(x?4lkooXZMNv@xKOOgPNWA|I+(1bq5v;ZluuqUkC*AEXJ{?4$py_dlu^oqR~^)PzkD7>q|FKa!Qas#za>mUIsUbScq8l;3H(5a&T`N+aI?vyxtyASv zGUXFxx=m5xO$60H*+&S;xe4ktQxpoM(uUTlPAJnw$7{(Zf2@$!*QxOyA3J$Ut0pc} zXfc^oJglJHwM;z*PmsD$faegRGhWAe6Sh&+-z$5O4&JI$a5`hT>FF!>9+MTp@T&i}pYb%M)K#OoJuxZRBCC(CS+xN_*8oqDyoRbFN<`K#{_jN#% z&Y0o2QnbTklJS8`lSe^w=#0+b;9G&x0))0LosW^cSiFfHYwi`$O0j%)GVc`9S#`^+{!-VM>3d>e zyg)(Sn_VRZh-iK$jNMbzpbX#)%w{Mtx-lz-(9(?7za%n#2eoLgsyGcTJNF_@t5+*D zIt@?rJ*f4>1spFnTnRq<_FrayZcEy{$L0xRXnTs}v_S;j%YuIQF||37n&#VaAD}u*zEJ z9b`r-(;jhbdQcBJ+vzNguL55pF_Gj!;H)A$Jbbn3=7Zkev%R2S5=T@r==MuZd=1TZ y&#I--)KZBP085!zZhTC|vZr~VtBU-c{i diff --git a/icons/mob/human_races/vox/r_voxemrl.dmi b/icons/mob/human_races/vox/r_voxemrl.dmi index 7651192eea69ca7c68e71a30d16b742780ddaeff..7f754b65c7050f60154ac701029f5cad81465cec 100644 GIT binary patch delta 1958 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 E1KX1rkN^Mx delta 2657 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%0A7oc{$Gl&Xcn>+x zG>Zc@XK3nFHIKFU;{`n3AbUvCtB$ z4M1d%m=hPHFl7SVeWz`oCe47cVC&!z3J6-A87T!*oXR})d|@fUP;S1rnwK&H@Pr9| zkK=5}um=xobn;tibSkwBYCy`y!2}#X?_DX_6*HO??G^k>;=am~2>|)#Wz5%{VejuC zbgodPY6jfRoE+yU*NM{2<*zFJYkOzrWm$p!$?dfX4GVv#Ku)sCz5pS?-wHD(n;XS+#3xAVql5C-Ih z7oSWnROnr>yB?bGsb(^cDEv&|uFJ&rMfvr*<_nt#z!^S?slY?>4Z8$r5wqoSKSFMG(n@Qmxd-h&Cwziy@Mv^an%8bGxD5mcdMEzx5t{q&zNMiBK* z>hE55;g-47w@{<`9%(aVeW>pPo#90Ub)I3t7-Y_WF*2II|8Xko526sOo4X>#k|CrCEG&Kmb?bwFr{p% zc$8O#rMVbmknVrOE6+quUdR7~@%hGe4iWA49Mhu8i+@(*7%V67fe*aN5EZ^A_{iRW z!ltSwc3_xZ##hvuv=`Ob`f11W$N>FusP5zyUf1LiPp{NUewMcGK)YxeCik~5Q-g^A z{V>yjk`I+3<@#s81BPah_x7Doij#VnaEDmDr&qHJX7+hhfaiEtviMjQVWFYlqz8w^ zQhe_D^>#O?2f9lz5N1rZ%%<8PX2a5*hD=npHqosR69`T{s|&ay;fs5C0Np&<-tijz zP&P}9Wn0g_s~m^^u`>~09J9L_tc8U9QwsO2@r*na5HY^mW;Mqf|4wpdVyQEx;iBby zSlr9|eW4AnhGIUtyynib;@f;bLHsc7zL>=o<3MfNCN#-$AdLB3BxydYZCWsH@$%?; zIDOA85yFluoE)~pPs4VlV5)b?6tjOd3IyuZ4y`EGU9L+hi}cM^Oj zjNvEfhdIv6eI$&`4G;c#R1}Y+&OrWvZc^aa#~!5ldw+N3YtY&uzjE$UyH)+XYgP4Y zNc}a6B{j-4nb3|di>bbSK+t)mPmo@h7%sNgVoBW$T{rE;dk4kLmZ%mJcz`ALn{T-9 z5&LuBHnihs#lSkNRz?9)S?B}P3*H}ODYNrO-tGC#7M9D|Bu?WE%9^y3lJ)SmK>wQ~Qg5f{a NMOxUIldgJW{|j_po45b~ delta 2079 zcmX|Bc{J3E7oU6?lWk~d^d!nMWak+?#XQ+fV@M^YN2SOhB%@@$gI2rjmGH|Fg{drK zUmH|Rj9p}zi6J{<*H7o2-u>sEd+z%AoO^E}yjC<$-UElnI+)eh*E?Pox)BV&<|jgl z7Q5^%TpXijb2}cnvlZxigi&Z3;VXa1_RyUxG7tzv0tw*G37)-(BwUrWvO{IjFNbY1ZXJGq$va)9Wc6Y#qH`F%#lwN zYL|#=u$?xQtx~HANq18bCnk)(UytsNAc9inox}XQ+NnIB$B%VXophhie6P{YX-(5> z*r?W3e(hyFpnp%(X2>@e$YmdLKiK1zyty!wTd-_?y^)sGlV_G6_divPqGs{6)2^Mg z0uy`fY*68pleWCVC(3@9NjD@h+Sc}vX68ghw@|LbBWw$NRfQbvon6&Cev5SB`n7?J) zAu*<|WSloDN2d2tw1-sA6MVc6=m_R*j&$X@3*+fd#QyPwgIR>PWu=+M>$RxWu!KY{ zgPn4`Gx#Nw#l6X96#e2F0-?x6*e|sO7M+Or!e>*dL}+ufU7eZM3;3W)@KJurkt@rZ z3hS9p+)tmvD{_nX?U++3E5z4kg5pX1Meb^!&p+<2tK7^l(~41b1%;`9k^Q0afG#=B z4|8=V{m$)M9W}L7XtU(I?ZmU9M_0eI&k8r)ZqR(yheTjS592R@sW<#yPD~OUzDBU3 z@f?rvTN7z~O;cXoBk#xsKj?k|Z=#%z;eDETS9=XfK9rjyP(-sZZO=E`2GN+iuLJl# zIrDMrCQz-B+Fk$_8av5Oxp0{|3I4#AMb&0F-z}6hafbglYyW9q6nT5r#V^ZAF8g#f zbJ=?QuR?Q6ql!E)FooWZ2*RLF_!jSymh5ZLmTI|G&wwbu4=RD4SuI4w!$q73UcK|q zmGx#x;f`;4e!6Azln$2x{V38j27N9vbYtkf2&G@lj zv*$yod0_ciiy&Ocr$<1n0Z16CHp%wzOZ&(gJkIh5qdyN-N@$zVutVozNd}mXa#Y== zF*q||jAE7QiF25YUeVTRE0>~D&G-NIm~^p zyJjS$`WCfdOI-7Eyd-w)q*N5}xz;uMI-18?dO=fr=!xB3-XBTZVM%7#2*@e1QIfYz zULM$)OQMngun|Hcx|G?~#O=8$RvH<1W7th0>)p{kW$UL{eG1{P2=t@Hf~| zXXO{C-4Xj)Bc4O(g7qLNURg`gAm- zR1U}0*62nRZG06yL0kf|mjuCkiu9I|^$?|*C4exAbo}G?^!~oHB9>ru^S_;35m(wK z7VQs)q8QTnWEl!WW8p^yFtY7Dz*9Edp(8iDTmhgZp})t1Kz-y$Z`C;eELS&uazy2yEvT?DsOav(ugu%~A(g^{a2A6&4NIXR z1Rdc7TMSktj)||df1jdl`UuVt6r*YzLr@y%1SW=?M9V~0(sTx`2Y~g0z1o_(tgn!Y z!{Q&gZKS&wt!Fo2{b_|_z8dEg25GV<)-znLdy1!+Uz!elajf1_?8}M??ndMifR!V` z!GNU>Lr!|oWzW#fL^l8EvS2{Mr%4fyzl!xU3`VgLB!vI(Q@}_k+IM9G5+fXGZfxg` z-OaQ&Kl>OZl+Fhk@%!2G^(lS5wmqCY*{rR9h-1pjnJz@bo9y>JPSnh@-6HsIXRiC? zwaFLQsR8cG@TP7RIjx6>Y%YP1JZI(|Y>#v$r$5bsj>BLF&`ALkMZ>jttXOZXPi?kQuJQ%}jWB{?5Sp&~tz%xiu?vP@+`7A2tcCP1 zU2Qq~WgDV;kYF+D)mSHa!BY{bLPlkKP`)d@3g;5x-95GzcG?(y5YP4FRbR7{iIm`m zhfO2-(gJQo@T?#ohxD7RSvYS_)W~t>tiD2L**kq7D57_IYa{swgHp+Ge{+=d-Y@cf zn|vU34Xw-bX@`2Dwr7Zf<;ufF7{XRw{l-j?K{v$3PmWt za+30|M>uX+l7rT&idMbFDJ_dky`N1P6E1@YFlOv|UakB+MAq_y!SOr`4C@O!7T}v~ z9GXF6=;j*^2B^5gi}B2j;JFj)-N0O!tN``AV9O{NdhR0CF1~0vbNNGc*~O~`3jZ{O&8p^+mpZtpV)=$;d$Q*HKkV_q3EtT zC5!8U8b>WKRZTJme+EB=*4}^DP&elAc4O+e)~)n?(O$ucdP8gV5z8xu>0XsTkD{gY7R0s%myC?kUfWg~|2ixyGn{FWiEG&Z0c|tf A9smFU diff --git a/icons/mob/human_races/vox/tails.dmi b/icons/mob/human_races/vox/tails.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9cd42af7f60828c272cf22129ada9b04f4e8981a GIT binary patch literal 1698 zcmV;T23`4yP)QRXUp*U2QA|Y&rlq9}-7K3_U;rB`qIYRRu0Iz`($jg%W)L0004W zQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ> zRWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5DF-B$UX+@e7w;D2?-!!P#hH>> zR1DJ3#hF%=n41b>8)DVq{;fYnHMX5v@4N;5VU}XhYKNoP40szXftkbr2hi(7>1v5!RK~#90?VRh9 zqA(DJ5pYBhK?N05c>lNDbWm%yYG%xZPJlWeKes#NYgU(D|i>wBA`q|n8XS?=#1 z000000001(0gJzKi=r^}W*s;nmKOa&e_V^+d|C91yi{D%J=@d5))u%)HskMT z+n`U|LffXBB(vVZ?_|j)-P$ff`b^!kZJKOY1#S|1fi~A{v#6le22xgiq%h@u!Jlk1 z<_;ZtH1kzM>Q82UQlYml6%!`o@1HCiW6l_{Wj=o|vc#J}M=ydvF1DGI`$KP2loYxc zGG0IF0RR910001BQEUnJ6n|`!BuVwGs%@Hzq?srrryPB>FnkwABZ7A+paBYFRe5ac-!urw)BTrmBpVyFKgFbBwZC~v2Qa4G1 zGT#;Z-~KVn5~cf7(r4Na)0P;ijqPXL&obT zJpcdz00000EQ&qBp5l*vp67+0Rkbe)ku(#9`kDN=mdeNzS8O^F_Oj?b z+UOb#TiuB+EeeI(y&c6p3$88ja6IUyjDU2)$P*XO=V%!==+m~)PSxR9>n4pwS>{Uj zv!u_|Jv&v$gExUBQEA_bVL#!uf-b15Me94&emj&K>dz(XqX|9u&4OrbUYrbN^85PsuD>vQAkcht?6ji(xR{D zp-?KTk5#SMbRz6!(YtpjOz!7~tsX>|R+U2bf#RM8*A{rboOM(FLv)(nS&~R6Oem!1 zbF>T_^l4jY*XDd_b(6kBbuc{_b$wK-Kj|}d&#ukoY$wpDg70j#eJh6jgmnewtgu>u zm$tFgCwp|V!~5FWc4#on3X3k~g!|qRctyD_Oj^RI}|4ObHi58qDz}bA^S{m&w^_UyxniQDgPllP46s8q!T6- z((^f5h7J0(Ewo2>yZ5?D-=R8~o{P4?tZfqXjH*>w%WcG!+yfLf^t?^ zEx=3PS?ZHLI@#g<=xsYR7-oe?!_u-0%0U)7tK%>qOE_6q3`>YdV^} zwCMYJD3r?jd)F&Aod|nb^zI!Bll!@0t2fc5U8j(Jqqt|moeLD5rgxSk(g_m^>G>Qj z!v=ls|AZIS!Sr18{ava4q|cjsW>&#>w%WcG!+4-s;qUDZpdOvc@HT{Ig+-Un05L0; sEs)OP!UYBpIA^|Q^A*^Xeq#Fm0T;7RJ?sx_T>t<807*qoM6N<$g5GB!djJ3c literal 0 HcmV?d00001 diff --git a/icons/mob/tails.dmi b/icons/mob/tails.dmi new file mode 100644 index 0000000000000000000000000000000000000000..919848840581771de5a00ddfe574c79258ff2b34 GIT binary patch literal 1287 zcmV+i1^D`jP)Yg$yHY3MYjOD1{6nZ3;Ct zHHC$RSXfxk&(HtNGZ2uis;a8u;^In5O2ELt05kt@Vgqmh0004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sU$Hgu_!SwKB*|bJTKnK)x*=zMTv_uC9|j)WCj;! zT2W$dDu``}OOsoWzh4OPdU6tzvq`oHtcf^_O7jv+GBSy^0jiobKNRIB<(Fh8lc|d| zmyu={nkFKxD$B1R(H>+S_$^UZaP@NmCrtppz{+ov5BtLa00WyzL_t(|obB6xQ{x~I z#_`senxvjT2(2yS`+uDWiQaf)$1V#5oB4kJW(!X@(K~kBYybcN0001hvbJ~I+DG_N zbKj(WKvF<)seX^j0fn{Fbr%ru>fU$v>fOa(j{aM0?o$J9wg~|nX+Y`1Z;~6B(!z*i zYZGQ@;G8i2CGjPV{K4DaHSv2iO_qFNcQ0~xf8vOI@#{BJ_wwYMx}oV{RE=T}-@!cj z000000001F)$ZEbNBB|l`I0_BT&mxrazJ6Nbls&=0$%+9{U@{!(ty&1-zyW2_aP;q zv{c`Q3_k;R>Vy%SYtNaXf%Av#cF|RByOTe7?Zd8(ei6eKS$>K6kJ-g0^e2wU7r*}V zSb2U)xAEU@bd6#U&9MLg00000&}Cov%d9z-eHVMJx`w|aS&KGJ!Fc%ccx zE_|)@`u;Vp=(X=dUG!#J@lCibswMyc000000040N%xKDPFbvgZi<9C3A1fy;9OV z00011>$rKVeT1@-raQ;%3-e0~XoTH=)9*2+UVf(q6xK@DU2sUf{!SY2ED+F)VStg+ zgoOEyxcdo@i3uZ`q=*SE6qlw=0YgM<)e(IQmAhMcUyOE-kMfze`Y*#iIo000003i4aGlBXzWfq*Bw$X}LRW{hxbcGO?$o}F{b z+GJ*w4`;N)3v)i5k^-8;IO?XC#>lUFje3HV+QD!keNYvKZ$^CAtDhjbb4mlJCXCWC z?tg{W#tkEM6C~sFS#`kACd7ZQs$r0#$b@*>eDO_KUdjuYHj!J1N&5l%`{u(7Rr`0zR00000Rz-X3R^~MM`TwV$&gaN0!m}^Bk%ZxWs_E@Nd$(2L%32@;?o0pQ0oe xBCb4P%4>KN+^zf*N{xWG%&a`0kN3;+{RJAGGsg4dwIBch002ovPDHLkV1g9yXfXf) literal 0 HcmV?d00001 diff --git a/vgstation13.dme b/vgstation13.dme index b749fcc0b24..7009e6cb34a 100644 --- a/vgstation13.dme +++ b/vgstation13.dme @@ -71,6 +71,7 @@ #include "__DEFINES\simple_animal_defines.dm" #include "__DEFINES\snow.dm" #include "__DEFINES\sort.dm" +#include "__DEFINES\span.dm" #include "__DEFINES\spell_defines.dm" #include "__DEFINES\striketeam_defines.dm" #include "__DEFINES\stylesheet.dm" @@ -296,6 +297,7 @@ #include "code\datums\mind.dm" #include "code\datums\mixed.dm" #include "code\datums\modules.dm" +#include "code\datums\mutable_appearance.dm" #include "code\datums\next_map.dm" #include "code\datums\periodic_news.dm" #include "code\datums\profiling.dm" @@ -1986,7 +1988,8 @@ #include "code\modules\mob\living\carbon\human\life\handle_statis_bag.dm" #include "code\modules\mob\living\carbon\human\life\handle_stomach.dm" #include "code\modules\mob\living\carbon\human\life\life_helpers.dm" -#include "code\modules\mob\living\carbon\human\plasmaman\species.dm" +#include "code\modules\mob\living\carbon\human\species\plasmaman.dm" +#include "code\modules\mob\living\carbon\human\species\vox.dm" #include "code\modules\mob\living\carbon\monkey\combat.dm" #include "code\modules\mob\living\carbon\monkey\death.dm" #include "code\modules\mob\living\carbon\monkey\diona.dm"