diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm
index f485dc347d2..9452ceb1c8e 100644
--- a/code/controllers/subsystem/processing/quirks.dm
+++ b/code/controllers/subsystem/processing/quirks.dm
@@ -18,14 +18,16 @@ PROCESSING_SUBSYSTEM_DEF(quirks)
/// A list of quirks that can not be used with each other. Format: list(quirk1,quirk2),list(quirk3,quirk4)
var/static/list/quirk_blacklist = list(
- list("Blind","Nearsighted"),
- list("Jolly","Depression","Apathetic","Hypersensitive"),
- list("Ageusia","Vegetarian","Deviant Tastes", "Gamer"),
- list("Ananas Affinity","Ananas Aversion", "Gamer"),
- list("Alcohol Tolerance","Light Drinker"),
- list("Clown Enjoyer","Mime Fan"),
+ list("Blind", "Nearsighted"),
+ list("Jolly", "Depression", "Apathetic", "Hypersensitive"),
+ list("Ageusia", "Vegetarian", "Deviant Tastes", "Gamer"),
+ list("Ananas Affinity", "Ananas Aversion", "Gamer"),
+ list("Alcohol Tolerance", "Light Drinker"),
+ list("Clown Enjoyer", "Mime Fan"),
list("Bad Touch", "Friendly"),
list("Extrovert", "Introvert"),
+ list("Prosthetic Limb", "Quadruple Amputee"),
+ list("Quadruple Amputee", "Paraplegic","Frail"),
)
/datum/controller/subsystem/processing/quirks/Initialize()
diff --git a/code/datums/quirks/negative.dm b/code/datums/quirks/negative.dm
index 2fb02a5dc1f..51b59d13a9f 100644
--- a/code/datums/quirks/negative.dm
+++ b/code/datums/quirks/negative.dm
@@ -420,11 +420,13 @@
medical_record_text = "Patient suffers from prosopagnosia and cannot recognize faces."
hardcore_value = 5
+
+
/datum/quirk/prosthetic_limb
name = "Prosthetic Limb"
desc = "An accident caused you to lose one of your limbs. Because of this, you now have a random prosthetic!"
icon = "tg-prosthetic-leg"
- value = -4
+ value = -3
var/slot_string = "limb"
medical_record_text = "During physical examination, patient was found to have a prosthetic limb."
hardcore_value = 3
@@ -432,7 +434,6 @@
/datum/quirk/prosthetic_limb/add_unique()
var/limb_slot = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
var/mob/living/carbon/human/human_holder = quirk_holder
- var/obj/item/bodypart/old_part = human_holder.get_bodypart(limb_slot)
var/obj/item/bodypart/prosthetic
switch(limb_slot)
if(BODY_ZONE_L_ARM)
@@ -447,13 +448,30 @@
if(BODY_ZONE_R_LEG)
prosthetic = new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder)
slot_string = "right leg"
- prosthetic.replace_limb(human_holder)
- qdel(old_part)
- human_holder.regenerate_icons()
+ human_holder.del_and_replace_bodypart(limb_slot, prosthetic)
/datum/quirk/prosthetic_limb/post_add()
- to_chat(quirk_holder, "Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \
- you need to use a welding tool and cables to repair it, instead of bruise packs and ointment.")
+ to_chat(quirk_holder, span_boldannounce("Your [slot_string] has been replaced with a surplus prosthetic. It is fragile and will easily come apart under duress. Additionally, \
+ you need to use a welding tool and cables to repair it, instead of bruise packs and ointment."))
+
+/datum/quirk/quadruple_amputee
+ name = "Quadruple Amputee"
+ desc = "Oops! All Prosthetics! Due to some truly cruel cosmic punishment, all your limbs have been taken from you."
+ icon = "tg-prosthetic-full"
+ value = -6
+ medical_record_text = "During physical examination, patient was found to have all prosthetic limbs."
+ hardcore_value = 6
+
+/datum/quirk/quadruple_amputee/add_unique()
+ var/mob/living/carbon/human/human_holder = quirk_holder
+ human_holder.del_and_replace_bodypart(BODY_ZONE_L_ARM, new/obj/item/bodypart/l_arm/robot/surplus(quirk_holder))
+ human_holder.del_and_replace_bodypart(BODY_ZONE_R_ARM, new/obj/item/bodypart/r_arm/robot/surplus(quirk_holder))
+ human_holder.del_and_replace_bodypart(BODY_ZONE_L_LEG, new/obj/item/bodypart/l_leg/robot/surplus(quirk_holder))
+ human_holder.del_and_replace_bodypart(BODY_ZONE_R_LEG, new/obj/item/bodypart/r_leg/robot/surplus(quirk_holder))
+
+/datum/quirk/quadruple_amputee/post_add()
+ to_chat(quirk_holder, span_boldannounce("All your limbs have been replaced with surplus prosthetics. They are fragile and will easily come apart under duress. Additionally, \
+ you need to use a welding tool and cables to repair them, instead of bruise packs and ointment."))
/datum/quirk/pushover
name = "Pushover"
@@ -547,7 +565,7 @@
for(var/word in message_split)
if(prob(max(5,(nearby_people*12.5*moodmod))) && word != message_split[1]) //Minimum 1/20 chance of filler
new_message += pick("uh,","erm,","um,")
- if(prob(min(5,(0.05*(nearby_people*12.5)*moodmod)))) //Max 1 in 20 chance of cutoff after a succesful filler roll, for 50% odds in a 15 word sentence
+ if(prob(min(5,(0.05*(nearby_people*12.5)*moodmod)))) //Max 1 in 20 chance of cutoff after a successful filler roll, for 50% odds in a 15 word sentence
quirker.silent = max(3, quirker.silent)
to_chat(quirker, span_danger("You feel self-conscious and stop talking. You need a moment to recover!"))
break
@@ -569,7 +587,7 @@
new/obj/item/food/spaghetti/pastatomato(get_turf(quirker)) //now that's what I call spaghetti code
else
to_chat(quirk_holder, span_warning("You think that wouldn't add much to the conversation and decide not to say it."))
- if(prob(min(25,(0.25*(nearby_people*12.75)*moodmod)))) //Max 25% chance of silence stacks after succesful not talking roll
+ if(prob(min(25,(0.25*(nearby_people*12.75)*moodmod)))) //Max 25% chance of silence stacks after successful not talking roll
to_chat(quirker, span_danger("You retreat into yourself. You really don't feel up to talking."))
quirker.silent = max(5, quirker.silent)
speech_args[SPEECH_MESSAGE] = pick("Uh.","Erm.","Um.")
diff --git a/code/modules/surgery/bodyparts/helpers.dm b/code/modules/surgery/bodyparts/helpers.dm
index 60be92d76d0..ca9ca0fae44 100644
--- a/code/modules/surgery/bodyparts/helpers.dm
+++ b/code/modules/surgery/bodyparts/helpers.dm
@@ -11,6 +11,12 @@
if(bodypart.body_zone == zone)
return bodypart
+///Replaces a single limb and deletes the old one if there was one
+/mob/living/carbon/proc/del_and_replace_bodypart(obj/item/bodypart/new_limb, special)
+ var/obj/item/bodypart/old_limb = get_bodypart(new_limb.body_zone)
+ if(old_limb)
+ qdel(old_limb)
+ new_limb.attach_limb(src, special = special)
/mob/living/carbon/has_hand_for_held_index(i)
if(!i)
diff --git a/tgui/packages/tgfont/README_ICON_TUTORIAL.txt b/tgui/packages/tgfont/README_ICON_TUTORIAL.txt
new file mode 100644
index 00000000000..70b52e5a183
--- /dev/null
+++ b/tgui/packages/tgfont/README_ICON_TUTORIAL.txt
@@ -0,0 +1,13 @@
+The following is the process to implement your own icon using an svg.
+
+If you plan on making your own SVG, consider [Inkscape](https://inkscape.org/). It is free and pretty powerful for vector graphics.
+
+1. Get whatever SVG you plan on using and put it in the `tgstation\tgui\packages\tgfont\icons` folder.
+
+2. In VS Code, press Ctrl+Shift+B, and select "tgui: rebuild tgfont". Wait for it to comlpete.
+
+Now your SVG will be able to be used in the game.
+
+When you reference your icon that you prefix it with "tg-", otherwise it will not find it. For example, with an SVG named "prosthetic-leg.svg", you would reference it with `icon_state = "tg-prosthetic-leg"`.
+
+Keep your SVG as simple as possible, the engine has trouble rendering SVGs that have a lot of little disconnected parts.
diff --git a/tgui/packages/tgfont/icons/prosthetic-full.svg b/tgui/packages/tgfont/icons/prosthetic-full.svg
new file mode 100644
index 00000000000..21915870fe3
--- /dev/null
+++ b/tgui/packages/tgfont/icons/prosthetic-full.svg
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/tgui/packages/tgfont/static/tgfont.css b/tgui/packages/tgfont/static/tgfont.css
index ad732b8fc06..992f088913c 100644
--- a/tgui/packages/tgfont/static/tgfont.css
+++ b/tgui/packages/tgfont/static/tgfont.css
@@ -1,7 +1,7 @@
@font-face {
font-family: "tgfont";
- src: url("./tgfont.woff2?45c3c7acc69dd413375d77898d24e41e") format("woff2"),
-url("./tgfont.eot?45c3c7acc69dd413375d77898d24e41e#iefix") format("embedded-opentype");
+ src: url("./tgfont.woff2?b809fa4bdd4aff7084540f130e4e524b") format("woff2"),
+url("./tgfont.eot?b809fa4bdd4aff7084540f130e4e524b#iefix") format("embedded-opentype");
}
i[class^="tg-"]:before, i[class*=" tg-"]:before {
@@ -36,15 +36,18 @@ i[class^="tg-"]:before, i[class*=" tg-"]:before {
.tg-non-binary:before {
content: "\f107";
}
-.tg-prosthetic-leg:before {
+.tg-prosthetic-full:before {
content: "\f108";
}
-.tg-sound-minus:before {
+.tg-prosthetic-leg:before {
content: "\f109";
}
-.tg-sound-plus:before {
+.tg-sound-minus:before {
content: "\f10a";
}
-.tg-syndicate-logo:before {
+.tg-sound-plus:before {
content: "\f10b";
}
+.tg-syndicate-logo:before {
+ content: "\f10c";
+}
diff --git a/tgui/packages/tgfont/static/tgfont.eot b/tgui/packages/tgfont/static/tgfont.eot
index 09e774836e3..e879c327d3f 100644
Binary files a/tgui/packages/tgfont/static/tgfont.eot and b/tgui/packages/tgfont/static/tgfont.eot differ
diff --git a/tgui/packages/tgfont/static/tgfont.woff2 b/tgui/packages/tgfont/static/tgfont.woff2
index 0590bf6c44f..6a3be3d2cb4 100644
Binary files a/tgui/packages/tgfont/static/tgfont.woff2 and b/tgui/packages/tgfont/static/tgfont.woff2 differ