diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm
index c87b9942df..db1a71c77a 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_modular_limbs.dm b/code/modules/mob/living/carbon/human/human_modular_limbs.dm
new file mode 100644
index 0000000000..aab466dae7
--- /dev/null
+++ b/code/modules/mob/living/carbon/human/human_modular_limbs.dm
@@ -0,0 +1,191 @@
+/*
+ A system for easily and quickly removing your own bodyparts, with a view towards
+ swapping them out for new ones, or just doing it as a party trick to horrify an
+ audience. Current implementation only supports robolimbs and uses a modular_bodypart
+ value on the manufacturer datum, but I have tried to keep it generic for future work.
+ PS. jesus christ this was meant to be a half an hour port
+*/
+
+// External organ procs:
+// Does this bodypart count as a modular limb, and if so, what kind?
+/obj/item/organ/external/proc/get_modular_limb_category()
+ . = MODULAR_BODYPART_INVALID
+ if(robotic >= ORGAN_ROBOT && model)
+ var/datum/robolimb/manufacturer = all_robolimbs[model]
+ if(!isnull(manufacturer?.modular_bodyparts))
+ . = manufacturer.modular_bodyparts
+
+// Checks if a limb could theoretically be removed.
+// Note that this does not currently bother checking if a child or internal organ is vital.
+/obj/item/organ/external/proc/can_remove_modular_limb(var/mob/living/carbon/human/user)
+ if(vital || cannot_amputate)
+ return FALSE
+ var/bodypart_cat = get_modular_limb_category()
+ if(bodypart_cat == MODULAR_BODYPART_CYBERNETIC)
+ if(!parent_organ)
+ return FALSE
+ var/obj/item/organ/external/parent = user?.get_organ(parent_organ)
+ if(!parent || parent.get_modular_limb_category(user) < MODULAR_BODYPART_CYBERNETIC)
+ return FALSE
+ . = (bodypart_cat != MODULAR_BODYPART_INVALID)
+
+// Note that this proc is checking if the organ can be attached -to-, not attached itself.
+/obj/item/organ/external/proc/can_attach_modular_limb_here(var/mob/living/carbon/human/user)
+ var/list/limb_data = user?.species?.has_limbs[organ_tag]
+ if(islist(limb_data) && limb_data["has_children"] > 0)
+ . = (length(children) < limb_data["has_children"])
+
+/obj/item/organ/external/proc/can_be_attached_modular_limb(var/mob/living/carbon/user)
+ var/bodypart_cat = get_modular_limb_category()
+ if(bodypart_cat == MODULAR_BODYPART_INVALID)
+ return FALSE
+ if(!parent_organ)
+ return FALSE
+ var/obj/item/organ/external/parent = user?.get_organ(parent_organ)
+ if(!parent)
+ return FALSE
+ if(!parent.can_attach_modular_limb_here(user))
+ return FALSE
+ if(bodypart_cat == MODULAR_BODYPART_CYBERNETIC && parent.get_modular_limb_category(src) < MODULAR_BODYPART_CYBERNETIC)
+ return FALSE
+ return TRUE
+
+// Checks if an organ (or the parent of one) is in a fit state for modular limb stuff to happen.
+/obj/item/organ/external/proc/check_modular_limb_damage(var/mob/living/carbon/human/user)
+ . = damage >= min_broken_damage || (status & ORGAN_BROKEN) || is_stump() // can't use is_broken() as the limb has ORGAN_CUT_AWAY
+
+// Human mob procs:
+// Checks the organ list for limbs meeting a predicate. Way overengineered for such a limited use
+// case but I can see it being expanded in the future if meat limbs or doona limbs use it.
+/mob/living/carbon/human/proc/get_modular_limbs(var/return_first_found = FALSE, var/validate_proc)
+ for(var/bp in organs)
+ var/obj/item/organ/external/E = bp
+ if(!validate_proc || call(E, validate_proc)(src) > MODULAR_BODYPART_INVALID)
+ LAZYADD(., E)
+ if(return_first_found)
+ return
+ // Prune children so we can't remove every individual component of an entire prosthetic arm
+ // piece by piece. Technically a circular dependency here would remove the limb entirely but
+ // if there's a parent whose child is also its parent, there's something wrong regardless.
+ for(var/bp in .)
+ var/obj/item/organ/external/E = bp
+ if(length(E.children))
+ . -= E.children
+
+// Called in robotize(), replaced() and removed() to update our modular limb verbs.
+/mob/living/carbon/human/proc/refresh_modular_limb_verbs()
+ if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_attach_modular_limb_here)))
+ verbs |= .proc/attach_limb_verb
+ else
+ verbs -= .proc/attach_limb_verb
+ if(length(get_modular_limbs(return_first_found = TRUE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb)))
+ verbs |= .proc/detach_limb_verb
+ else
+ verbs -= .proc/detach_limb_verb
+
+// Proc helper for attachment verb.
+/mob/living/carbon/human/proc/check_can_attach_modular_limb(var/obj/item/organ/external/E)
+ if(world.time < last_special + (2 SECONDS) || get_active_hand() != E)
+ return FALSE
+ if(incapacitated() || restrained())
+ to_chat(src, SPAN_WARNING("You can't do that in your current state!"))
+ return FALSE
+ if(QDELETED(E) || !istype(E))
+ to_chat(src, SPAN_WARNING("You are not holding a compatible limb to attach."))
+ return FALSE
+ if(!E.can_be_attached_modular_limb(src))
+ to_chat(src, SPAN_WARNING("\The [E] cannot be attached to your current body."))
+ return FALSE
+ if(E.get_modular_limb_category() <= MODULAR_BODYPART_INVALID)
+ to_chat(src, SPAN_WARNING("\The [E] cannot be attached by your own hand."))
+ return FALSE
+ var/install_to_zone = E.organ_tag
+ if(!isnull(get_organ(install_to_zone)))
+ to_chat(src, SPAN_WARNING("There is already a limb attached at that part of your body."))
+ return FALSE
+ if(E.check_modular_limb_damage(src))
+ to_chat(src, SPAN_WARNING("\The [E] is too damaged to be attached."))
+ return FALSE
+ var/obj/item/organ/external/parent = E.parent_organ && get_organ(E.parent_organ)
+ if(!parent)
+ to_chat(src, SPAN_WARNING("\The [E] needs an existing limb to be attached to."))
+ return FALSE
+ if(parent.check_modular_limb_damage(src))
+ to_chat(src, SPAN_WARNING("Your [parent.name] is too damaged to have anything attached."))
+ return FALSE
+ return TRUE
+
+// Proc helper for detachment verb.
+/mob/living/carbon/human/proc/check_can_detach_modular_limb(var/obj/item/organ/external/E)
+ if(world.time < last_special + (2 SECONDS))
+ return FALSE
+ if(incapacitated() || restrained())
+ to_chat(src, SPAN_WARNING("You can't do that in your current state!"))
+ return FALSE
+ if(!istype(E) || QDELETED(src) || QDELETED(E) || E.owner != src || E.loc != src)
+ return FALSE
+ if(E.check_modular_limb_damage(src))
+ to_chat(src, SPAN_WARNING("That limb is too damaged to be removed!"))
+ return FALSE
+ var/obj/item/organ/external/parent = E.parent_organ && get_organ(E.parent_organ)
+ if(!parent)
+ return FALSE
+ if(parent.check_modular_limb_damage(src))
+ to_chat(src, SPAN_WARNING("Your [parent.name] is too damaged to detach anything from it."))
+ return FALSE
+ return (E in get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb))
+
+// Verbs below:
+// Add or remove robotic limbs; check refresh_modular_limb_verbs() above.
+/mob/living/carbon/human/proc/attach_limb_verb()
+ set name = "Attach Limb"
+ set category = "Object"
+ set desc = "Attach a replacement limb."
+ set usr = src
+
+ var/obj/item/organ/external/E = get_active_hand()
+ if(!check_can_attach_modular_limb(E))
+ return FALSE
+ if(!do_after(src, 2 SECONDS, src))
+ return FALSE
+ if(!check_can_attach_modular_limb(E))
+ return FALSE
+
+ last_special = world.time
+ drop_from_inventory(E)
+ E.replaced(src)
+ E.status &= ~ORGAN_CUT_AWAY
+ var/datum/gender/G = gender_datums[gender]
+ visible_message(
+ SPAN_NOTICE("\The [src] attaches \the [E] to [G.his] body!"),
+ SPAN_NOTICE("You attach \the [E] to your body!"))
+ regenerate_icons() // Not sure why this isn't called by removed(), but without it we don't update our limb appearance.
+ return TRUE
+
+/mob/living/carbon/human/proc/detach_limb_verb()
+ set name = "Remove Limb"
+ set category = "Object"
+ set desc = "Detach one of your limbs."
+ set usr = src
+
+ var/list/detachable_limbs = get_modular_limbs(return_first_found = FALSE, validate_proc = /obj/item/organ/external/proc/can_remove_modular_limb)
+ if(!length(detachable_limbs))
+ to_chat(src, SPAN_WARNING("You have no detachable limbs."))
+ return FALSE
+ var/obj/item/organ/external/E = input(usr, "Which limb do you wish to detach?", "Limb Removal") as null|anything in detachable_limbs
+ if(!check_can_detach_modular_limb(E))
+ return FALSE
+ if(!do_after(src, 2 SECONDS, src))
+ return FALSE
+ if(!check_can_detach_modular_limb(E))
+ return FALSE
+
+ last_special = world.time
+ E.removed(src)
+ E.dropInto(loc)
+ put_in_hands(E)
+ var/datum/gender/G = gender_datums[gender]
+ visible_message(
+ SPAN_NOTICE("\The [src] detaches [G.his] [E.name]!"),
+ SPAN_NOTICE("You detach your [E.name]!"))
+ return TRUE
diff --git a/code/modules/mob/living/carbon/human/human_powers.dm b/code/modules/mob/living/carbon/human/human_powers.dm
index d63b866e6f..d7c66d5289 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 3566010050..3604e201f3 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 15757d2d2b..9dba62d622 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -350,6 +350,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 05f7e4c201..00fd0d98a8 100644
--- a/code/modules/organs/organ_external.dm
+++ b/code/modules/organs/organ_external.dm
@@ -236,6 +236,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]
@@ -1132,6 +1133,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]."
@@ -1163,7 +1166,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()
@@ -1264,6 +1267,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 a39d4b1286..73ae0c3e44 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"
@@ -76,13 +78,27 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Unbranded - Protez"
desc = "A simple robotic limb with retro design. Seems rather stiff."
icon = 'icons/mob/human_races/cyberlimbs/unbranded/unbranded_alt1.dmi'
+<<<<<<< HEAD
unavailable_to_build = 0 // CHOMP Edit
+||||||| parent of 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
+ unavailable_to_build = 1
+=======
+ unavailable_to_build = 1
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
+>>>>>>> 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
/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'
+<<<<<<< HEAD
unavailable_to_build = 0 // CHOMP Edit
+||||||| parent of 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
+ unavailable_to_build = 1
+=======
+ unavailable_to_build = 1
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
+>>>>>>> 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
/datum/robolimb/unbranded_tajaran
company = "Unbranded - Tajaran"
@@ -91,6 +107,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 +116,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 +125,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 +148,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 +158,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 +168,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"
@@ -186,19 +215,28 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Cyber Solutions"
desc = "This limb is grey and rough, with little in the way of aesthetic."
icon = 'icons/mob/human_races/cyberlimbs/cybersolutions/cybersolutions_main.dmi'
+<<<<<<< HEAD
unavailable_to_build = 0 // CHOMP Edit
+||||||| parent of 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
+ unavailable_to_build = 1
+=======
+ unavailable_to_build = 1
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
+>>>>>>> 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
/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"
@@ -211,7 +249,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Einstein Engines"
desc = "This limb is lightweight with a sleek design."
icon = 'icons/mob/human_races/cyberlimbs/einstein/einstein_main.dmi'
+<<<<<<< HEAD
unavailable_to_build = 0 // CHOMP Edit
+||||||| parent of 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
+ unavailable_to_build = 1
+=======
+ unavailable_to_build = 1
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
+>>>>>>> 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
/datum/robolimb/grayson
company = "Grayson"
@@ -223,6 +268,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 +332,7 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
icon = 'icons/mob/human_races/cyberlimbs/morpheus/morpheus_main.dmi'
unavailable_to_build = 0 // CHOMP Edit
monitor_styles = standard_monitor_styles
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
/datum/robolimb/morpheus_alt1
company = "Morpheus - Zenith"
@@ -333,7 +380,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Ward-Takahashi"
desc = "This limb features sleek black and white polymers."
icon = 'icons/mob/human_races/cyberlimbs/wardtakahashi/wardtakahashi_main.dmi'
+<<<<<<< HEAD
unavailable_to_build = 0 // CHOMP Edit
+||||||| parent of 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
+ unavailable_to_build = 1
+=======
+ unavailable_to_build = 1
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
+>>>>>>> 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
/datum/robolimb/wardtakahashi_alt1
company = "Ward-Takahashi - Shroud"
@@ -360,7 +414,14 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\
company = "Xion"
desc = "This limb has a minimalist black and red casing."
icon = 'icons/mob/human_races/cyberlimbs/xion/xion_main.dmi'
+<<<<<<< HEAD
unavailable_to_build = 0 // CHOMP Edit
+||||||| parent of 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
+ unavailable_to_build = 1
+=======
+ unavailable_to_build = 1
+ modular_bodyparts = MODULAR_BODYPART_CYBERNETIC
+>>>>>>> 827b30c844... Merge pull request #9787 from VOREStation/upstream-merge-7905
/datum/robolimb/xion_alt1
company = "Xion - Breach"
@@ -379,12 +440,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 +472,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 0000000000..5dbf1ee175
Binary files /dev/null and b/icons/mob/human_races/cyberlimbs/prosthesis/wooden.dmi differ
diff --git a/vorestation.dme b/vorestation.dme
index 47be260e5b..edb13ba0f9 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -2741,6 +2741,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_movement_ch.dm"
#include "code\modules\mob\living\carbon\human\human_organs.dm"