diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index c87b9942dfc..db1a71c77a6 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -61,4 +61,8 @@ #define INFECTION_LEVEL_ONE 100 #define INFECTION_LEVEL_TWO 500 #define INFECTION_LEVEL_THREE 1000 -#define INFECTION_LEVEL_MAX 1500 \ No newline at end of file +#define INFECTION_LEVEL_MAX 1500 + +#define MODULAR_BODYPART_INVALID 0 // Cannot be detached or reattached. +#define MODULAR_BODYPART_PROSTHETIC 1 // Can be detached or reattached freely. +#define MODULAR_BODYPART_CYBERNETIC 2 // Can be detached or reattached to compatible parent organs. diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm index d63b866e6fa..d7c66d52895 100644 --- a/code/modules/mob/living/carbon/human/human_powers.dm +++ b/code/modules/mob/living/carbon/human/human_powers.dm @@ -366,7 +366,7 @@ return var/datum/robolimb/robohead = all_robolimbs[E.model] if(!robohead.monitor_styles || !robohead.monitor_icon) - to_chat(src,"Your head doesn't have a monitor or it doens't support to be changed!") + to_chat(src,"Your head doesn't have a monitor, or it doesn't support being changed!") return var/list/states if(!states) diff --git a/code/modules/mob/living/carbon/human/species/outsider/event.dm b/code/modules/mob/living/carbon/human/species/outsider/event.dm index 3566010050b..3604e201f39 100644 --- a/code/modules/mob/living/carbon/human/species/outsider/event.dm +++ b/code/modules/mob/living/carbon/human/species/outsider/event.dm @@ -122,7 +122,7 @@ Variables you may want to make use of are: has_limbs = list( BP_TORSO = list("path" = /obj/item/organ/external/chest), BP_GROIN = list("path" = /obj/item/organ/external/groin), - BP_HEAD = list("path" = /obj/item/organ/external/head), + BP_HEAD = list("path" = /obj/item/organ/external/head), BP_L_ARM = list("path" = /obj/item/organ/external/arm), BP_R_ARM = list("path" = /obj/item/organ/external/arm/right), BP_L_LEG = list("path" = /obj/item/organ/external/leg), diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index de182ae8299..40de5e97997 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -349,6 +349,9 @@ var/limb_path = organ_data["path"] var/obj/item/organ/O = new limb_path(H) organ_data["descriptor"] = O.name + if(O.parent_organ) + organ_data = has_limbs[O.parent_organ] + organ_data["has_children"] = organ_data["has_children"]+1 for(var/organ_tag in has_organ) var/organ_type = has_organ[organ_tag] diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index ab8a91f721d..d9b21f6ceca 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -235,6 +235,7 @@ owner.organs |= src for(var/obj/item/organ/organ in src) organ.replaced(owner,src) + owner.refresh_modular_limb_verbs() if(parent_organ) parent = owner.organs_by_name[src.parent_organ] @@ -1129,6 +1130,8 @@ Note that amputating the affected organ does in fact remove the infection from t if(R.lifelike) robotic = ORGAN_LIFELIKE name = "[initial(name)]" + else if(R.modular_bodyparts == MODULAR_BODYPART_PROSTHETIC) + name = "prosthetic [initial(name)]" else name = "robotic [initial(name)]" desc = "[R.desc] It looks like it was produced by [R.company]." @@ -1160,7 +1163,7 @@ Note that amputating the affected organ does in fact remove the infection from t while(null in owner.internal_organs) owner.internal_organs -= null - + owner.refresh_modular_limb_verbs() return 1 /obj/item/organ/external/proc/mutate() @@ -1261,6 +1264,7 @@ Note that amputating the affected organ does in fact remove the infection from t qdel(spark_system) qdel(src) + victim.refresh_modular_limb_verbs() victim.update_icons_body() /obj/item/organ/external/proc/disfigure(var/type = "brute") diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 9eb4c97d4b3..3fa3b910f98 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -47,22 +47,24 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ var/icon = 'icons/mob/human_races/robotic.dmi' // Icon base to draw from. var/monitor_icon = 'icons/mob/monitor_icons.dmi' // Where it draws the monitor icon from. var/unavailable_at_chargen // If set, not available at chargen. - var/unavailable_to_build // If set, can't be constructed. - var/lifelike // If set, appears organic. - var/skin_tone // If set, applies skin tone rather than part color Overrides color. - var/skin_color // If set, applies skin color rather than part color. - var/blood_color = "#030303" - var/blood_name = "oil" + var/unavailable_to_build // If set, can't be constructed. + var/lifelike // If set, appears organic. + var/skin_tone // If set, applies skin tone rather than part color Overrides color. + var/skin_color // If set, applies skin color rather than part color. + var/blood_color = SYNTH_BLOOD_COLOUR // Colour for blood splatters. + var/blood_name = "oil" // Descriptor for blood splatters. + var/list/monitor_styles // If empty, the model of limbs offers a head compatible with monitors. + var/parts = BP_ALL // Defines what parts said brand can replace on a body. + var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator. + var/suggested_species = "Human" // If it should make the torso a species + var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons. + var/modular_bodyparts = MODULAR_BODYPART_INVALID // Whether or not this limb allows attaching/detaching, and whether or not it checks its parent as well. + var/robo_brute_mod = 1 // Multiplier for incoming brute damage. + var/robo_burn_mod = 1 // As above for burn. + // Species in this list cannot take these prosthetics. var/list/species_cannot_use = list(SPECIES_TESHARI, SPECIES_PROMETHEAN, SPECIES_DIONA, SPECIES_XENOCHIMERA) //VOREStation Edit - var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") //"Species Name" = "Robolimb Company" , List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites. - var/list/monitor_styles //If empty, the model of limbs offers a head compatible with monitors. - var/parts = BP_ALL //Defines what parts said brand can replace on a body. - var/health_hud_intensity = 1 // Intensity modifier for the health GUI indicator. - var/suggested_species = "Human" //If it should make the torso a species - var/speech_bubble_appearance = "synthetic" // What icon_state to use for speech bubbles when talking. Check talk.dmi for all the icons. - - var/robo_brute_mod = 1 // Multiplier for incoming brute damage. - var/robo_burn_mod = 1 // As above for burn. + // "Species Name" = "Robolimb Company", List, when initialized, will become "Species Name" = RobolimbDatum, used for alternate species sprites. + var/list/species_alternates = list(SPECIES_TAJ = "Unbranded - Tajaran", SPECIES_UNATHI = "Unbranded - Unathi") /datum/robolimb/unbranded_monitor company = "Unbranded Monitor" @@ -77,12 +79,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with retro design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/unbranded_alt2 company = "Unbranded - Mantis Prosis" desc = "This limb has a casing of sleek black metal and repulsive insectile design." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt2.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/unbranded_tajaran company = "Unbranded - Tajaran" @@ -91,6 +95,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with feline design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_tajaran.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/unbranded_unathi company = "Unbranded - Unathi" @@ -99,6 +104,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with reptilian design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_unathi.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/unbranded_teshari company = "Unbranded - Teshari" @@ -107,12 +113,20 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple robotic limb with a small, raptor-like design. Seems rather stiff." icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_teshari.dmi' unavailable_to_build = 0 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC + parts = list(BP_HEAD, BP_TORSO, BP_GROIN) + +/datum/robolimb/unbranded_teshari/limbs + company = "Unbranded - Teshari (Limbs)" + parts = list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC /datum/robolimb/nanotrasen company = "NanoTrasen" desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_main.dmi' species_alternates = list(SPECIES_TAJ = "NanoTrasen - Tajaran", SPECIES_UNATHI = "NanoTrasen - Unathi") + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/nanotrasen_tajaran company = "NanoTrasen - Tajaran" @@ -122,6 +136,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_tajaran.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/nanotrasen_unathi company = "NanoTrasen - Unathi" @@ -131,6 +146,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "A simple but efficient robotic limb, created by NanoTrasen." icon = 'icons/mob/human_races/cyberlimbs/nanotrasen/nanotrasen_unathi.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/cenilimicybernetics_teshari company = "Cenilimi Cybernetics" @@ -140,6 +156,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "Made by a Teshari-owned company, for Teshari." icon = 'icons/mob/human_races/cyberlimbs/cenilimicybernetics/cenilimicybernetics_teshari.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/bishop company = "Bishop" @@ -187,18 +204,21 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "This limb is grey and rough, with little in the way of aesthetic." icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_main.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/cybersolutions_alt2 company = "Cyber Solutions - Outdated" desc = "This limb is of severely outdated design; there's no way it's comfortable or very functional to use." icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt2.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/cybersolutions_alt1 company = "Cyber Solutions - Wight" desc = "This limb has cheap plastic panels mounted on grey metal." icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_alt1.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/cybersolutions_alt3 company = "Cyber Solutions - Array" @@ -212,6 +232,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "This limb is lightweight with a sleek design." icon = 'icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/grayson company = "Grayson" @@ -223,6 +244,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ green=grayson_green;\ blue=grayson_blue;\ rgb=grayson_rgb" + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/grayson_alt1 company = "Grayson - Reinforced" @@ -286,6 +308,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi' unavailable_to_build = 1 monitor_styles = standard_monitor_styles + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/morpheus_alt1 company = "Morpheus - Zenith" @@ -334,6 +357,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "This limb features sleek black and white polymers." icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/wardtakahashi_alt1 company = "Ward-Takahashi - Shroud" @@ -361,6 +385,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ desc = "This limb has a minimalist black and red casing." icon = 'icons/mob/human_races/cyberlimbs/xion/xion_main.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/xion_alt1 company = "Xion - Breach" @@ -379,12 +404,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ green=xion_green;\ blue=xion_blue;\ rgb=xion_rgb" + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/xion_alt3 company = "Xion - Whiteout" desc = "This limb has a minimalist black and white casing." icon = 'icons/mob/human_races/cyberlimbs/xion/xion_alt3.dmi' unavailable_to_build = 1 + modular_bodyparts = MODULAR_BODYPART_CYBERNETIC /datum/robolimb/xion_alt4 company = "Xion - Breach - Whiteout" @@ -409,6 +436,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ unavailable_to_build = 1 skin_tone = 1 +/datum/robolimb/wooden + company = "Morgan Trading Co" + desc = "A simplistic, metal-banded, wood-panelled prosthetic." + icon = 'icons/mob/human_races/cyberlimbs/prosthesis/wooden.dmi' + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC + parts = list(BP_L_ARM, BP_R_ARM, BP_L_HAND, BP_R_HAND, BP_L_LEG, BP_R_LEG, BP_L_FOOT, BP_R_FOOT) + modular_bodyparts = MODULAR_BODYPART_PROSTHETIC + /obj/item/weapon/disk/limb name = "Limb Blueprints" desc = "A disk containing the blueprints for prosthetics." diff --git a/icons/mob/human_races/cyberlimbs/prosthesis/wooden.dmi b/icons/mob/human_races/cyberlimbs/prosthesis/wooden.dmi new file mode 100644 index 00000000000..5dbf1ee1756 Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/prosthesis/wooden.dmi differ diff --git a/vorestation.dme b/vorestation.dme index 6692d493378..a16dc5853dd 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -2587,6 +2587,7 @@ #include "code\modules\mob\living\carbon\human\human_defines_vr.dm" #include "code\modules\mob\living\carbon\human\human_helpers.dm" #include "code\modules\mob\living\carbon\human\human_helpers_vr.dm" +#include "code\modules\mob\living\carbon\human\human_modular_limbs.dm" #include "code\modules\mob\living\carbon\human\human_movement.dm" #include "code\modules\mob\living\carbon\human\human_organs.dm" #include "code\modules\mob\living\carbon\human\human_powers.dm"