diff --git a/code/_helpers/_global_objects.dm b/code/_helpers/_global_objects.dm
new file mode 100644
index 0000000000..4cbbcf3314
--- /dev/null
+++ b/code/_helpers/_global_objects.dm
@@ -0,0 +1 @@
+var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
\ No newline at end of file
diff --git a/code/datums/underwear/bottom.dm b/code/datums/underwear/bottom.dm
index 04e2c42622..7f91a18608 100644
--- a/code/datums/underwear/bottom.dm
+++ b/code/datums/underwear/bottom.dm
@@ -2,144 +2,55 @@
name = "None"
always_last = TRUE
-/datum/category_item/underwear/bottom/briefs_white
- name = "Briefs, white"
- icon_state = "b1"
+/datum/category_item/underwear/bottom/briefs
+ name = "Briefs"
+ icon_state = "briefs"
+ has_color = TRUE
-/datum/category_item/underwear/bottom/briefs_white/is_default(var/gender)
+/datum/category_item/underwear/bottom/briefs/is_default(var/gender)
return gender != FEMALE
-/datum/category_item/underwear/bottom/briefs_grey
- name = "Briefs, grey"
- icon_state = "b2"
-
-/datum/category_item/underwear/bottom/briefs_green
- name = "Briefs, green"
- icon_state = "b3"
-
-/datum/category_item/underwear/bottom/briefs_blue
- name = "Briefs, blue"
- icon_state = "b4"
-
-/datum/category_item/underwear/bottom/briefs_black
- name = "Briefs, black"
- icon_state = "b5"
-
-/datum/category_item/underwear/bottom/panties_noback
- name = "Panties, noback"
- icon_state = "b6"
-
/datum/category_item/underwear/bottom/boxers_loveheart
name = "Boxers, Loveheart"
- icon_state = "b7"
+ icon_state = "boxers_loveheart"
-/datum/category_item/underwear/bottom/boxers_black
- name = "Boxers, black"
- icon_state = "b8"
-
-/datum/category_item/underwear/bottom/boxers_grey
- name = "Boxers, grey"
- icon_state = "b9"
+/datum/category_item/underwear/bottom/boxers
+ name = "Boxers"
+ icon_state = "boxers"
+ has_color = TRUE
/datum/category_item/underwear/bottom/boxers_green_and_blue
name = "Boxers, green & blue striped"
- icon_state = "b10"
+ icon_state = "boxers_green_and_blue"
-/datum/category_item/underwear/bottom/panties_red
- name = "Panties, red"
- icon_state = "b11"
+/datum/category_item/underwear/bottom/panties
+ name = "Panties"
+ icon_state = "panties"
+ has_color = TRUE
-/datum/category_item/underwear/bottom/panties_white
- name = "Panties, white"
- icon_state = "b12"
-
-/datum/category_item/underwear/bottom/panties_white/is_default(var/gender)
+/datum/category_item/underwear/bottom/panties/is_default(var/gender)
return gender == FEMALE
-/datum/category_item/underwear/bottom/panties_yellow
- name = "Panties, yellow"
- icon_state = "b13"
+/datum/category_item/underwear/bottom/lacy_thong
+ name = "Lacy thong"
+ icon_state = "lacy_thong"
-/datum/category_item/underwear/bottom/panties_blue
- name = "Panties, blue"
- icon_state = "b14"
+/datum/category_item/underwear/bottom/lacy_thong_alt
+ name = "Lacy thong, alt"
+ icon_state = "lacy_thong_alt"
+ has_color = TRUE
-/datum/category_item/underwear/bottom/panties_light_black
- name = "Panties, light-black"
- icon_state = "b15"
+/datum/category_item/underwear/bottom/panties_alt
+ name = "Panties, alt"
+ icon_state = "panties_alt"
+ has_color = TRUE
+
+/datum/category_item/underwear/bottom/compression_shorts
+ name = "Compression shorts"
+ icon_state = "compression_shorts"
+ has_color = TRUE
/datum/category_item/underwear/bottom/thong
name = "Thong"
- icon_state = "b16"
-
-/datum/category_item/underwear/bottom/panties_black
- name = "Panties, black"
- icon_state = "b17"
-
-/datum/category_item/underwear/bottom/panties_white_alt
- name = "Bra, white alt"
- icon_state = "b18"
-
-/datum/category_item/underwear/bottom/compression_shorts_black
- name = "Compression shorts, black"
- icon_state = "b19"
-
-/datum/category_item/underwear/bottom/compression_shorts_white
- name = "Compression shorts, white"
- icon_state = "b20"
-
-/datum/category_item/underwear/bottom/compression_shorts_baby_blue
- name = "Compression shorts, baby-blue"
- icon_state = "b21"
-
-/datum/category_item/underwear/bottom/panties_green
- name = "Panties, green"
- icon_state = "b22"
-
-/datum/category_item/underwear/bottom/compression_shorts_pink
- name = "Compression shorts, pink"
- icon_state = "b23"
-
-/datum/category_item/underwear/bottom/thong_violet
- name = "Thong, violet"
- icon_state = "b24"
-
-/datum/category_item/underwear/bottom/thong_alt
- name = "Thong, alt"
- icon_state = "b25"
-
-/datum/category_item/underwear/bottom/thong_violet_alt
- name = "Thong, violet alt"
- icon_state = "b26"
-
-/datum/category_item/underwear/bottom/alt_thong_black
- name = "Alt. thong, black"
- icon_state = "b27"
-
-/datum/category_item/underwear/bottom/alt_thong_blue
- name = "Alt. thong, blue"
- icon_state = "b28"
-
-/datum/category_item/underwear/bottom/alt_thong_green
- name = "Alt. thong, green"
- icon_state = "b29"
-
-/datum/category_item/underwear/bottom/alt_thong_purple
- name = "Alt. thong, purple"
- icon_state = "b30"
-
-/datum/category_item/underwear/bottom/alt_thong_red
- name = "Alt. thong, red"
- icon_state = "b31"
-
-/datum/category_item/underwear/bottom/alt_thong_teal
- name = "Alt. thong, teal"
- icon_state = "b32"
-
-/datum/category_item/underwear/bottom/alt_thong_violet
- name = "Alt. thong, violet"
- icon_state = "b33"
-
-/datum/category_item/underwear/bottom/alt_thong_white
- name = "Alt. thong, white"
- icon_state = "b34"
\ No newline at end of file
+ icon_state = "thong"
+ has_color = TRUE
\ No newline at end of file
diff --git a/code/datums/underwear/socks.dm b/code/datums/underwear/socks.dm
index ab33162e04..fc1c96ce53 100644
--- a/code/datums/underwear/socks.dm
+++ b/code/datums/underwear/socks.dm
@@ -2,57 +2,49 @@
always_last = TRUE
name = "None"
-/datum/category_item/underwear/socks/white_normal
- name = "Normal, white"
- icon_state = "white_norm"
+/datum/category_item/underwear/socks/normal
+ name = "Normal"
+ icon_state = "socks_norm"
+ has_color = TRUE
-/datum/category_item/underwear/socks/white_short
- name = "Short, white"
- icon_state = "white_short"
+/datum/category_item/underwear/socks/short
+ name = "Short"
+ icon_state = "socks_short"
+ has_color = TRUE
-/datum/category_item/underwear/socks/white_knee
- name = "Knee, white"
- icon_state = "white_knee"
+/datum/category_item/underwear/socks/thigh
+ name = "Thigh"
+ icon_state = "socks_thigh"
+ has_color = TRUE
-/datum/category_item/underwear/socks/white_thigh
- name = "Thigh, white"
- icon_state = "white_thigh"
+/datum/category_item/underwear/socks/knee
+ name = "Knee"
+ icon_state = "socks_knee"
+ has_color = TRUE
-/datum/category_item/underwear/socks/black_normal
- name = "Normal, black"
- icon_state = "black_norm"
+/datum/category_item/underwear/socks/striped_knee
+ name = "Knee, striped"
+ icon_state = "striped_knee"
+ has_color = TRUE
-/datum/category_item/underwear/socks/black_short
- name = "Short, black"
- icon_state = "black_short"
-
-/datum/category_item/underwear/socks/black_knee
- name = "Knee, black"
- icon_state = "black_knee"
-
-/datum/category_item/underwear/socks/black_thigh
- name = "Thigh, black"
- icon_state = "black_thigh"
-
-/datum/category_item/underwear/socks/thin_knee
- name = "Knee, thin"
- icon_state = "thin_knee"
-
-/datum/category_item/underwear/socks/thin_thigh
- name = "Thigh, thin"
- icon_state = "thin_thigh"
+/datum/category_item/underwear/socks/striped_thigh
+ name = "Thigh, striped"
+ icon_state = "striped_thigh"
+ has_color = TRUE
/datum/category_item/underwear/socks/pantyhose
name = "Pantyhose"
icon_state = "pantyhose"
-/datum/category_item/underwear/socks/striped_thigh
- name = "Thigh, striped"
- icon_state = "striped_thigh"
+/datum/category_item/underwear/socks/thin_thigh
+ name = "Thigh, thin"
+ icon_state = "thin_thigh"
+ has_color = TRUE
-/datum/category_item/underwear/socks/striped_knee
- name = "Knee, striped"
- icon_state = "striped_knee"
+/datum/category_item/underwear/socks/thin_knee
+ name = "Knee, thin"
+ icon_state = "thin_knee"
+ has_color = TRUE
/datum/category_item/underwear/socks/rainbow_thigh
name = "Thigh, rainbow"
@@ -64,12 +56,4 @@
/datum/category_item/underwear/socks/fishnet
name = "Fishnet"
- icon_state = "fishnet"
-
-/datum/category_item/underwear/socks/thinwhite_thigh
- name = "Thigh, thin white"
- icon_state = "thinwhite_thigh"
-
-/datum/category_item/underwear/socks/thinwhite_knee
- name = "Knee, thin white"
- icon_state = "thinwhite_knee"
\ No newline at end of file
+ icon_state = "fishnet"
\ No newline at end of file
diff --git a/code/datums/underwear/top.dm b/code/datums/underwear/top.dm
index 4e23a70295..8640e77da9 100644
--- a/code/datums/underwear/top.dm
+++ b/code/datums/underwear/top.dm
@@ -5,102 +5,39 @@
/datum/category_item/underwear/top/none/is_default(var/gender)
return gender != FEMALE
-/datum/category_item/underwear/top/bra_red
- name = "Bra, red"
- icon_state = "t1"
-
-/datum/category_item/underwear/top/bra_white
+/datum/category_item/underwear/top/bra
is_default = TRUE
- name = "Bra, white"
- icon_state = "t2"
+ name = "Bra"
+ icon_state = "bra"
+ has_color = TRUE
-/datum/category_item/underwear/top/bra_white/is_default(var/gender)
+/datum/category_item/underwear/top/bra/is_default(var/gender)
return gender == FEMALE
-/datum/category_item/underwear/top/bra_yellow
- name = "Bra, yellow"
- icon_state = "t3"
+/datum/category_item/underwear/top/sports_bra
+ name = "Sports bra"
+ icon_state = "sports_bra"
+ has_color = TRUE
-/datum/category_item/underwear/top/bra_blue
- name = "Bra, blue"
- icon_state = "t4"
-
-/datum/category_item/underwear/top/bra_black
- name = "Bra, black"
- icon_state = "t5"
+/datum/category_item/underwear/top/sports_bra_alt
+ name = "Sports bra, alt"
+ icon_state = "sports_bra_alt"
+ has_color = TRUE
/datum/category_item/underwear/top/lacy_bra
name = "Lacy bra"
- icon_state = "t6"
-
-/datum/category_item/underwear/top/sports_bra_black
- name = "Sports bra, black"
- icon_state = "t7"
-
-/datum/category_item/underwear/top/sports_bra_white
- name = "Sports bra, white"
- icon_state = "t8"
-
-/datum/category_item/underwear/top/sports_bra_black_alt
- name = "Sports bra, black alt"
- icon_state = "t9"
-
-/datum/category_item/underwear/top/sports_bra_white_alt
- name = "Sports bra, white alt"
- icon_state = "t10"
-
-/datum/category_item/underwear/top/bra_baby_blue
- name = "Bra, baby blue"
- icon_state = "t11"
-
-/datum/category_item/underwear/top/bra_green
- name = "Bra, green"
- icon_state = "t12"
-
-/datum/category_item/underwear/top/bra_pink
- name = "Bra, pink"
- icon_state = "t13"
-
-/datum/category_item/underwear/top/bra_violet
- name = "Bra, violet"
- icon_state = "t14"
+ icon_state = "lacy_bra"
/datum/category_item/underwear/top/lacy_bra_alt
name = "Lacy bra, alt"
- icon_state = "t15"
+ icon_state = "lacy_bra_alt"
+ has_color = TRUE
-/datum/category_item/underwear/top/bra_lacy_violet
- name = "Lacy bra, violet"
- icon_state = "t16"
+/datum/category_item/underwear/top/lacy_bra_alt_stripe
+ name = "Lacy bra, alt, stripe"
+ icon_state = "lacy_bra_alt_stripe"
-/datum/category_item/underwear/top/halterneck_bra_black
- name = "Halterneck bra, black"
- icon_state = "t17"
-
-/datum/category_item/underwear/top/halterneck_bra_blue
- name = "Halterneck bra, blue"
- icon_state = "t18"
-
-/datum/category_item/underwear/top/halterneck_bra_green
- name = "Halterneck bra, green"
- icon_state = "t19"
-
-/datum/category_item/underwear/top/halterneck_bra_purple
- name = "Halterneck bra, purple"
- icon_state = "t20"
-
-/datum/category_item/underwear/top/halterneck_bra_red
- name = "Halterneck bra, red"
- icon_state = "t21"
-
-/datum/category_item/underwear/top/halterneck_bra_teal
- name = "Halterneck bra, teal"
- icon_state = "t22"
-
-/datum/category_item/underwear/top/halterneck_bra_violet
- name = "Halterneck bra, violet"
- icon_state = "t23"
-
-/datum/category_item/underwear/top/halterneck_bra_white
- name = "Halterneck bra, white"
- icon_state = "t24"
\ No newline at end of file
+/datum/category_item/underwear/top/halterneck_bra
+ name = "Halterneck bra"
+ icon_state = "halterneck_bra"
+ has_color = TRUE
\ No newline at end of file
diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm
index f1149dabb7..33886f997d 100644
--- a/code/datums/underwear/undershirts.dm
+++ b/code/datums/underwear/undershirts.dm
@@ -3,74 +3,25 @@
name = "None"
always_last = TRUE
-/datum/category_item/underwear/undershirt/tank_top_white
- name = "Tank top, white"
- icon_state = "u1"
+/datum/category_item/underwear/undershirt/shirt
+ name = "Shirt"
+ icon_state = "undershirt"
+ has_color = TRUE
-/datum/category_item/underwear/undershirt/tank_top_white_alt
- name = "Tank top, white alt"
- icon_state = "tank_white_s"
+/datum/category_item/underwear/undershirt/tank_top
+ name = "Tank top"
+ icon_state = "tanktop"
+ has_color = TRUE
-/datum/category_item/underwear/undershirt/tank_top_black
- name = "Tank top, black"
- icon_state = "u2"
-
-/datum/category_item/underwear/undershirt/tank_top_red
- name = "Tank top, red"
- icon_state = "tank_red_s"
+/datum/category_item/underwear/undershirt/tank_top_alt
+ name = "Tank top, alt"
+ icon_state = "tanktop_alt"
+ has_color = TRUE
/datum/category_item/underwear/undershirt/tank_top_fire
name = "Tank top, fire"
icon_state = "tank_fire_s"
-/datum/category_item/underwear/undershirt/shirt_black
- name = "Shirt, black"
- icon_state = "u3"
-
-/datum/category_item/underwear/undershirt/shirt_black_alt
- name = "Shirt, black alt"
- icon_state = "shirt_black_s"
-
-/datum/category_item/underwear/undershirt/shirt_white
- name = "Shirt, white"
- icon_state = "u4"
-
-/datum/category_item/underwear/undershirt/shirt_white_alt
- name = "Shirt, white alt"
- icon_state = "shirt_white_s"
-
-/datum/category_item/underwear/undershirt/shirt_grey
- name = "Shirt, grey"
- icon_state = "shirt_grey_s"
-
-/datum/category_item/underwear/undershirt/shirt_blue
- name = "Shirt, blue"
- icon_state = "blueshirt_s"
-
-/datum/category_item/underwear/undershirt/shirt_blue_alt
- name = "Shirt, blue alt"
- icon_state = "shirt_blue_s"
-
-/datum/category_item/underwear/undershirt/shirt_red
- name = "Shirt, red"
- icon_state = "redshirt_s"
-
-/datum/category_item/underwear/undershirt/shirt_red_alt
- name = "Shirt, red alt"
- icon_state = "shirt_red_s"
-
-/datum/category_item/underwear/undershirt/shirt_yellow
- name = "Shirt, yellow"
- icon_state = "yellowshirt_s"
-
-/datum/category_item/underwear/undershirt/shirt_green
- name = "Shirt, green"
- icon_state = "greenshirt_s"
-
-/datum/category_item/underwear/undershirt/shirt_green_alt
- name = "Shirt, green alt"
- icon_state = "shirt_green_s"
-
/datum/category_item/underwear/undershirt/shirt_heart
name = "Shirt, heart"
icon_state = "lover_s"
@@ -80,44 +31,18 @@
icon_state = "shirt_nano_s"
/datum/category_item/underwear/undershirt/shirt_love_nt
- name = "Shirt, I<3NT"
+ name = "Shirt, I<3NT"
icon_state = "lover_s"
-/datum/category_item/underwear/undershirt/shortsleeve_shirt_white
- name = "Shortsleeve shirt, white"
- icon_state = "whiteshortsleeve_s"
+/datum/category_item/underwear/undershirt/shortsleeve_shirt
+ name = "Shortsleeve shirt"
+ icon_state = "shortsleeve"
+ has_color = TRUE
-/datum/category_item/underwear/undershirt/shortsleeve_shirt_purple
- name = "Shortsleeve shirt, purple"
- icon_state = "purpleshortsleeve_s"
-
-/datum/category_item/underwear/undershirt/shortsleeve_shirt_blue
- name = "Shortsleeve shirt, blue"
- icon_state = "blueshortsleeve_s"
-
-/datum/category_item/underwear/undershirt/shortsleeve_shirt_green
- name = "Shortsleeve shirt, green"
- icon_state = "greenshortsleeve_s"
-
-/datum/category_item/underwear/undershirt/shortsleeve_shirt_black
- name = "Shortsleeve shirt, black"
- icon_state = "blackshortsleeve_s"
-
-/datum/category_item/underwear/undershirt/polo_shirt_blue
- name = "Polo shirt, blue"
- icon_state = "bluepolo_s"
-
-/datum/category_item/underwear/undershirt/polo_shirt_red
- name = "Polo shirt, red"
- icon_state = "redpolo_s"
-
-/datum/category_item/underwear/undershirt/polo_shirt_white
- name = "Polo shirt, white"
- icon_state = "whitepolo_s"
-
-/datum/category_item/underwear/undershirt/polo_shirt_grey_yellow
- name = "Polo shirt, grey and yellow"
- icon_state = "grayyellowpolo_s"
+/datum/category_item/underwear/undershirt/polo_shirt
+ name = "Polo shirt"
+ icon_state = "polo"
+ has_color = TRUE
/datum/category_item/underwear/undershirt/sport_shirt_green
name = "Sport shirt, green"
diff --git a/code/datums/underwear/underwear.dm b/code/datums/underwear/underwear.dm
index 8b73dbddbb..d14ddea133 100644
--- a/code/datums/underwear/underwear.dm
+++ b/code/datums/underwear/underwear.dm
@@ -41,6 +41,12 @@ datum/category_group/underwear/dd_SortValue()
var/is_default = FALSE // Should this entry be considered the default for its type?
var/icon = 'icons/mob/human.dmi' // Which icon to get the underwear from
var/icon_state // And the particular item state
+ var/list/tweaks = list() // Underwear customizations.
+ var/has_color = FALSE
+
+/datum/category_item/underwear/New()
+ if(has_color)
+ tweaks += gear_tweak_free_color_choice
/datum/category_item/underwear/dd_SortValue()
if(always_last)
@@ -50,7 +56,11 @@ datum/category_group/underwear/dd_SortValue()
/datum/category_item/underwear/proc/is_default(var/gender)
return is_default
-/datum/category_item/underwear/proc/apply_to_icon(var/icon/I)
+/datum/category_item/underwear/proc/generate_image(var/list/metadata)
if(!icon_state)
return
- I.Blend(new /icon('icons/mob/human.dmi', icon_state), ICON_OVERLAY)
\ No newline at end of file
+
+ var/image/I = image(icon = 'icons/mob/human.dmi', icon_state = icon_state)
+ for(var/datum/gear_tweak/gt in tweaks)
+ gt.tweak_item(I, metadata && metadata["[gt]"] ? metadata["[gt]"] : gt.get_default())
+ return I
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
index dd1489248f..6dd22efab9 100644
--- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
+++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm
@@ -6,10 +6,10 @@
Shocking someone costs ten chemicals per use."
enhancedtext = "Shocking biologicals without grabbing only requires five chemicals, and has more disabling power."
genomecost = 2
- verbpath = /mob/proc/changeling_bioelectrogenesis
+ verbpath = /mob/living/carbon/human/proc/changeling_bioelectrogenesis
//Recharge whatever's in our hand, or shock people.
-/mob/proc/changeling_bioelectrogenesis()
+/mob/living/carbon/human/proc/changeling_bioelectrogenesis()
set category = "Changeling"
set name = "Bioelectrogenesis (20 + 10/shock)"
set desc = "Recharges anything in your hand, or shocks people."
@@ -33,19 +33,28 @@
return 0
else
+ // Handle glove conductivity.
+ var/obj/item/clothing/gloves/gloves = src.gloves
+ var/siemens = 1
+ if(gloves)
+ siemens = gloves.siemens_coefficient
+
//If we're grabbing someone, electrocute them.
if(istype(held_item,/obj/item/weapon/grab))
var/obj/item/weapon/grab/G = held_item
if(G.affecting)
- G.affecting.electrocute_act(10,src,1.0,BP_TORSO)
- var/agony = 80 //Does more than if hit with an electric hand, since grabbing is slower.
+ G.affecting.electrocute_act(10 * siemens,src,1.0,BP_TORSO)
+ var/agony = 80 * siemens //Does more than if hit with an electric hand, since grabbing is slower.
G.affecting.stun_effect_act(0, agony, BP_TORSO, src)
msg_admin_attack("[key_name(src)] shocked [key_name(G.affecting)] with the [src].")
- visible_message("Arcs of electricity strike [G.affecting]!",
- "Our hand channels raw electricity into [G.affecting].",
- "You hear sparks!")
+ if(siemens)
+ visible_message("Arcs of electricity strike [G.affecting]!",
+ "Our hand channels raw electricity into [G.affecting].",
+ "You hear sparks!")
+ else
+ src << "Our gloves block us from shocking \the [G.affecting]."
src.mind.changeling.chem_charges -= 10
return 1
@@ -69,17 +78,19 @@
"Our hand channels raw electricity into \the [held_item].",
"You hear sparks!")
var/i = 10
- while(i)
- cell.charge += 100 //This should be a nice compromise between recharging guns and other batteries.
- if(cell.charge > cell.maxcharge)
- cell.charge = cell.maxcharge
- break
- var/T = get_turf(src)
- new /obj/effect/effect/sparks(T)
- held_item.update_icon()
- i--
- sleep(1 SECOND)
- success = 1
+ if(siemens)
+ while(i)
+ cell.charge += 100 * siemens //This should be a nice compromise between recharging guns and other batteries.
+ if(cell.charge > cell.maxcharge)
+ cell.charge = cell.maxcharge
+ break
+ if(siemens)
+ var/T = get_turf(src)
+ new /obj/effect/effect/sparks(T)
+ held_item.update_icon()
+ i--
+ sleep(1 SECOND)
+ success = 1
if(success == 0) //If we couldn't do anything with the ability, don't deduct the chemicals.
src << "We are unable to affect \the [held_item]."
else
@@ -113,11 +124,18 @@
if(src)
qdel(src)
-/obj/item/weapon/electric_hand/afterattack(var/atom/target, var/mob/living/user, proximity)
+/obj/item/weapon/electric_hand/afterattack(var/atom/target, var/mob/living/carbon/human/user, proximity)
if(!target)
return
if(!proximity)
return
+
+ // Handle glove conductivity.
+ var/obj/item/clothing/gloves/gloves = user.gloves
+ var/siemens = 1
+ if(gloves)
+ siemens = gloves.siemens_coefficient
+
//Excuse the copypasta.
if(istype(target,/mob/living/carbon))
var/mob/living/carbon/C = target
@@ -126,14 +144,17 @@
src << "We require more chemicals to electrocute [C]!"
return 0
- C.electrocute_act(electrocute_amount,src,1.0,BP_TORSO)
- C.stun_effect_act(0, agony_amount, BP_TORSO, src)
+ C.electrocute_act(electrocute_amount * siemens,src,1.0,BP_TORSO)
+ C.stun_effect_act(0, agony_amount * siemens, BP_TORSO, src)
msg_admin_attack("[key_name(user)] shocked [key_name(C)] with the [src].")
- visible_message("Arcs of electricity strike [C]!",
- "Our hand channels raw electricity into [C]",
- "You hear sparks!")
+ if(siemens)
+ visible_message("Arcs of electricity strike [C]!",
+ "Our hand channels raw electricity into [C]",
+ "You hear sparks!")
+ else
+ src << "Our gloves block us from shocking \the [C]."
//qdel(src) //Since we're no longer a one hit stun, we need to stick around.
user.mind.changeling.chem_charges -= shock_cost
return 1
@@ -145,11 +166,12 @@
src << "We require more chemicals to electrocute [S]!"
return 0
- S.electrocute_act(60,src,1.0) //If only they had surge protectors.
- visible_message("Arcs of electricity strike [S]!",
- "Our hand channels raw electricity into [S]",
- "You hear sparks!")
- S << "Warning: Electrical surge detected!"
+ S.electrocute_act(60 * siemens,src,1.0) //If only they had surge protectors.
+ if(siemens)
+ visible_message("Arcs of electricity strike [S]!",
+ "Our hand channels raw electricity into [S]",
+ "You hear sparks!")
+ S << "Warning: Electrical surge detected!"
//qdel(src)
user.mind.changeling.chem_charges -= 10
return 1
@@ -164,20 +186,22 @@
"Our hand channels raw electricity into \the [target].",
"You hear sparks!")
var/i = 10
- while(i)
- cell.charge += 100 //This should be a nice compromise between recharging guns and other batteries.
- if(cell.charge > cell.maxcharge)
- cell.charge = cell.maxcharge
- break //No point making sparks if the cell's full.
-// if(!Adjacent(T))
-// break
- var/Turf = get_turf(src)
- new /obj/effect/effect/sparks(Turf)
- T.update_icon()
- i--
- sleep(1 SECOND)
- success = 1
- break
+ if(siemens)
+ while(i)
+ cell.charge += 100 * siemens //This should be a nice compromise between recharging guns and other batteries.
+ if(cell.charge > cell.maxcharge)
+ cell.charge = cell.maxcharge
+ break //No point making sparks if the cell's full.
+ // if(!Adjacent(T))
+ // break
+ if(siemens)
+ var/Turf = get_turf(src)
+ new /obj/effect/effect/sparks(Turf)
+ T.update_icon()
+ i--
+ sleep(1 SECOND)
+ success = 1
+ break
if(success == 0)
src << "We are unable to affect \the [target]."
else
diff --git a/code/game/gamemodes/changeling/powers/fake_death.dm b/code/game/gamemodes/changeling/powers/fake_death.dm
index 0018eabad6..ac7080301b 100644
--- a/code/game/gamemodes/changeling/powers/fake_death.dm
+++ b/code/game/gamemodes/changeling/powers/fake_death.dm
@@ -18,14 +18,13 @@
var/mob/living/carbon/C = src
if(changeling.max_geneticpoints < 0) //Absorbed by another ling
- src << "You have no genomes, not even your own, and cannot regenerate."
+ src << "We have no genomes, not even our own, and cannot regenerate."
return 0
- if(!C.stat && alert("Are we sure we wish to fake our death?",,"Yes","No") == "No")//Confirmation for living changelings if they want to fake their death
+ if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
return
C << "We will attempt to regenerate our form."
- C.status_flags |= FAKEDEATH //play dead
C.update_canmove()
C.remove_changeling_powers()
@@ -33,13 +32,12 @@
C.suiciding = 0
if(C.stat != DEAD)
- C.emote("deathgasp")
- C.tod = worldtime2text()
+ C.adjustOxyLoss(C.maxHealth * 2)
spawn(rand(800,2000))
//The ling will now be able to choose when to revive
src.verbs += /mob/proc/changeling_revive
- src << "We are ready to rise. Use the Revive verb when you are ready."
+ src << "We are ready to rise. Use the Revive verb when you are ready."
feedback_add_details("changeling_powers","FD")
return 1
\ No newline at end of file
diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm
index 4f53c95b46..79fd2dcf74 100644
--- a/code/game/gamemodes/changeling/powers/revive.dm
+++ b/code/game/gamemodes/changeling/powers/revive.dm
@@ -25,8 +25,6 @@
C.SetStunned(0)
C.SetWeakened(0)
C.radiation = 0
- C.halloss = 0
- C.shock_stage = 0 //Pain
C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss())
C.reagents.clear_reagents()
C.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above.
@@ -36,8 +34,13 @@
H.mutations.Remove(HUSK)
H.status_flags -= DISFIGURED
H.update_body(1)
+ for(var/limb in H.organs_by_name)
+ var/obj/item/organ/external/current_limb = H.organs_by_name[limb]
+ current_limb.undislocate()
+
+ C.halloss = 0
+ C.shock_stage = 0 //Pain
C << "We have regenerated."
- C.status_flags &= ~FAKEDEATH
C.update_canmove()
C.mind.changeling.purchased_powers -= C
feedback_add_details("changeling_powers","CR")
diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm
index ff87fb58e4..5e2b40d952 100644
--- a/code/game/jobs/job/assistant.dm
+++ b/code/game/jobs/job/assistant.dm
@@ -13,21 +13,16 @@
minimal_access = list() //See /datum/job/assistant/get_access()
alt_titles = list("Technical Assistant","Medical Intern","Research Assistant","Visitor", "Resident")
-/datum/job/assistant/equip(var/mob/living/carbon/human/H)
+/datum/job/assistant/equip(var/mob/living/carbon/human/H, var/alt_title)
if(!H) return 0
switch(H.backbag)
if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back)
if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back)
if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back)
- if (H.mind.role_alt_title)
- switch(H.mind.role_alt_title)
- if("Visitor") //I doubt someone visiting the station would want to wear an ugly grey uniform
- H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform)
-
- if("Resident")
- H.equip_to_slot_or_del(new /obj/item/clothing/under/color/white(H), slot_w_uniform)
- else
- H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
+ if(has_alt_title(H, alt_title,"Visitor")) //I doubt someone visiting the station would want to wear an ugly grey uniform
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform)
+ else if(has_alt_title(H, alt_title,"Resident"))
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/color/white(H), slot_w_uniform)
else
H.equip_to_slot_or_del(new /obj/item/clothing/under/color/grey(H), slot_w_uniform)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes)
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 77aed2300f..71d63afc0a 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -7,7 +7,7 @@ obj/machinery/recharger
anchored = 1
use_power = 1
idle_power_usage = 4
- active_power_usage = 15000 //15 kW
+ active_power_usage = 40000 //40 kW
var/obj/item/charging = null
var/list/allowed_devices = list(/obj/item/weapon/gun/energy, /obj/item/weapon/melee/baton, /obj/item/device/laptop, /obj/item/weapon/cell)
var/icon_state_charged = "recharger2"
diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm
index e0047a08bf..36c8c62814 100644
--- a/code/game/machinery/spaceheater.dm
+++ b/code/game/machinery/spaceheater.dm
@@ -6,9 +6,9 @@
name = "space heater"
desc = "Made by Space Amish using traditional space techniques, this heater is guaranteed not to set the station on fire."
var/obj/item/weapon/cell/cell
- var/cell_type = /obj/item/weapon/cell/apc
+ var/cell_type = /obj/item/weapon/cell/high
var/on = 0
- var/set_temperature = T0C + 50 //K
+ var/set_temperature = T0C + 20 //K
var/heating_power = 40000
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index ad1797756c..375c6727ea 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -101,6 +101,78 @@ LINEN BINS
icon_state = "sheetbrown"
item_state = "sheetbrown"
+/obj/item/weapon/bedsheet/ian
+ icon_state = "sheetian"
+ item_state = "bedsheet"
+
+/obj/item/weapon/bedsheet/double
+ icon_state = "doublesheet"
+ item_state = "bedsheet"
+
+/obj/item/weapon/bedsheet/bluedouble
+ icon_state = "doublesheetblue"
+ item_state = "sheetblue"
+
+/obj/item/weapon/bedsheet/greendouble
+ icon_state = "doublesheetgreen"
+ item_state = "sheetgreen"
+
+/obj/item/weapon/bedsheet/orangedouble
+ icon_state = "doublesheetorange"
+ item_state = "sheetorange"
+
+/obj/item/weapon/bedsheet/purpledouble
+ icon_state = "doublesheetpurple"
+ item_state = "sheetpurple"
+
+/obj/item/weapon/bedsheet/doublerainbow //all the way across the sky.
+ icon_state = "doublesheetrainbow"
+ item_state = "sheetrainbow"
+
+/obj/item/weapon/bedsheet/doublered
+ icon_state = "doublesheetred"
+ item_state = "sheetred"
+
+/obj/item/weapon/bedsheet/doubleyellow
+ icon_state = "doublesheetyellow"
+ item_state = "sheetyellow"
+
+/obj/item/weapon/bedsheet/doublemime
+ icon_state = "doublesheetmime"
+ item_state = "sheetmime"
+
+/obj/item/weapon/bedsheet/doubleclown
+ icon_state = "doublesheetclown"
+ item_state = "sheetclown"
+
+/obj/item/weapon/bedsheet/doublecaptain
+ icon_state = "doublesheetcaptain"
+ item_state = "sheetcaptain"
+
+/obj/item/weapon/bedsheet/doublerd
+ icon_state = "doublesheetrd"
+ item_state = "sheetrd"
+
+/obj/item/weapon/bedsheet/doublehos
+ icon_state = "doublesheethos"
+ item_state = "sheethos"
+
+/obj/item/weapon/bedsheet/doublehop
+ icon_state = "doublesheethop"
+ item_state = "sheethop"
+
+/obj/item/weapon/bedsheet/doublece
+ icon_state = "doublesheetce"
+ item_state = "sheetce"
+
+/obj/item/weapon/bedsheet/doublebrown
+ icon_state = "doublesheetbrown"
+ item_state = "sheetbrown"
+
+/obj/item/weapon/bedsheet/doubleian
+ icon_state = "doublesheetian"
+ item_state = "bedsheet"
+
/obj/structure/bedsheetbin
name = "linen bin"
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index 73914e113c..511709200c 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -176,6 +176,19 @@
/obj/structure/bed/alien/New(var/newloc)
..(newloc,"resin")
+/obj/structure/bed/double
+ name = "double bed"
+ icon_state = "doublebed"
+ base_icon = "doublebed"
+
+/obj/structure/bed/double/post_buckle_mob(mob/living/M as mob)
+ if(M == buckled_mob)
+ M.pixel_y = 13
+ M.old_y = 13
+ else
+ M.pixel_y = 0
+ M.old_y = 0
+
/*
* Roller beds
*/
diff --git a/code/game/objects/structures/under_wardrobe.dm b/code/game/objects/structures/under_wardrobe.dm
index 2ded3ef17e..6a06ef26fb 100644
--- a/code/game/objects/structures/under_wardrobe.dm
+++ b/code/game/objects/structures/under_wardrobe.dm
@@ -17,11 +17,31 @@
for(var/datum/category_group/underwear/UWC in global_underwear.categories)
var/datum/category_item/underwear/UWI = H.all_underwear[UWC.name]
var/item_name = UWI ? UWI.name : "None"
- dat += "[UWC.name]: [item_name] (Remove)
"
+ dat += "[UWC.name]: [item_name]"
+ if(UWI)
+ for(var/datum/gear_tweak/gt in UWI.tweaks)
+ dat += " [gt.get_contents(get_metadata(H, UWC.name, gt))]"
+ dat += " (Remove)
"
- dat = jointext(dat)
+ dat = jointext(dat,null)
H << browse(dat, "window=wardrobe;size=400x200")
+/obj/structure/undies_wardrobe/proc/get_metadata(var/mob/living/carbon/human/H, var/underwear_category, var/datum/gear_tweak/gt)
+ var/metadata = H.all_underwear_metadata[underwear_category]
+ if(!metadata)
+ metadata = list()
+ H.all_underwear_metadata[underwear_category] = metadata
+
+ var/tweak_data = metadata["[gt]"]
+ if(!tweak_data)
+ tweak_data = gt.get_default()
+ metadata["[gt]"] = tweak_data
+ return tweak_data
+
+/obj/structure/undies_wardrobe/proc/set_metadata(var/mob/living/carbon/human/H, var/underwear_category, var/datum/gear_tweak/gt, var/new_metadata)
+ var/list/metadata = H.all_underwear_metadata[underwear_category]
+ metadata["[gt]"] = new_metadata
+
/obj/structure/undies_wardrobe/proc/human_who_can_use_underwear(var/mob/living/carbon/human/H)
if(!istype(H) || !H.species || !(H.species.appearance_flags & HAS_UNDERWEAR))
return FALSE
@@ -50,6 +70,18 @@
if(selected_underwear && CanUseTopic(H, default_state))
H.all_underwear[UWC.name] = selected_underwear
. = TRUE
+ else if(href_list["underwear"] && href_list["tweak"])
+ var/underwear = href_list["underwear"]
+ if(!(underwear in H.all_underwear))
+ return
+ var/datum/gear_tweak/gt = locate(href_list["tweak"])
+ if(!gt)
+ return
+ var/new_metadata = gt.get_metadata(usr, get_metadata(H, underwear, gt), "Wardrobe Underwear Selection")
+ if(new_metadata)
+ set_metadata(H, underwear, gt, new_metadata)
+ . = TRUE
+
if(.)
- H.update_body(1)
+ H.update_underwear()
interact(H)
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm
index b7758a6fa9..c455cef524 100644
--- a/code/modules/client/preference_setup/general/04_equipment.dm
+++ b/code/modules/client/preference_setup/general/04_equipment.dm
@@ -1,5 +1,6 @@
/datum/preferences
var/list/all_underwear
+ var/list/all_underwear_metadata
/datum/category_item/player_setup_item/general/equipment
name = "Clothing"
@@ -7,11 +8,13 @@
/datum/category_item/player_setup_item/general/equipment/load_character(var/savefile/S)
S["all_underwear"] >> pref.all_underwear
+ S["all_underwear_metadata"] >> pref.all_underwear_metadata
S["backbag"] >> pref.backbag
S["pdachoice"] >> pref.pdachoice
/datum/category_item/player_setup_item/general/equipment/save_character(var/savefile/S)
S["all_underwear"] << pref.all_underwear
+ S["all_underwear_metadata"] << pref.all_underwear_metadata
S["backbag"] << pref.backbag
S["pdachoice"] << pref.pdachoice
@@ -27,15 +30,21 @@
pref.all_underwear[WRC.name] = WRI.name
break
+ if(!istype(pref.all_underwear_metadata))
+ pref.all_underwear_metadata = list()
+
for(var/underwear_category in pref.all_underwear)
var/datum/category_group/underwear/UWC = global_underwear.categories_by_name[underwear_category]
if(!UWC)
- pref.all_underwear -= UWC
+ pref.all_underwear -= underwear_category
else
var/datum/category_item/underwear/UWI = UWC.items_by_name[pref.all_underwear[underwear_category]]
if(!UWI)
- pref.all_underwear -= UWC
+ pref.all_underwear -= underwear_category
+ for(var/underwear_metadata in pref.all_underwear_metadata)
+ if(!(underwear_metadata in pref.all_underwear))
+ pref.all_underwear_metadata -= underwear_metadata
pref.backbag = sanitize_integer(pref.backbag, 1, backbaglist.len, initial(pref.backbag))
pref.pdachoice = sanitize_integer(pref.pdachoice, 1, pdachoicelist.len, initial(pref.pdachoice))
@@ -44,11 +53,34 @@
. += "Equipment:
"
for(var/datum/category_group/underwear/UWC in global_underwear.categories)
var/item_name = pref.all_underwear[UWC.name] ? pref.all_underwear[UWC.name] : "None"
- . += "[UWC.name]: [item_name]
"
+ . += "[UWC.name]: [item_name]"
+ var/datum/category_item/underwear/UWI = UWC.items_by_name[item_name]
+ if(UWI)
+ for(var/datum/gear_tweak/gt in UWI.tweaks)
+ . += " [gt.get_contents(get_metadata(UWC.name, gt))]"
+
+ . += "
"
. += "Backpack Type: [backbaglist[pref.backbag]]
"
. += "PDA Type: [pdachoicelist[pref.pdachoice]]
"
- return jointext(.)
+ return jointext(.,null)
+
+/datum/category_item/player_setup_item/general/equipment/proc/get_metadata(var/underwear_category, var/datum/gear_tweak/gt)
+ var/metadata = pref.all_underwear_metadata[underwear_category]
+ if(!metadata)
+ metadata = list()
+ pref.all_underwear_metadata[underwear_category] = metadata
+
+ var/tweak_data = metadata["[gt]"]
+ if(!tweak_data)
+ tweak_data = gt.get_default()
+ metadata["[gt]"] = tweak_data
+ return tweak_data
+
+/datum/category_item/player_setup_item/general/equipment/proc/set_metadata(var/underwear_category, var/datum/gear_tweak/gt, var/new_metadata)
+ var/list/metadata = pref.all_underwear_metadata[underwear_category]
+ metadata["[gt]"] = new_metadata
+
/datum/category_item/player_setup_item/general/equipment/OnTopic(var/href,var/list/href_list, var/mob/user)
if(href_list["change_backpack"])
@@ -72,4 +104,16 @@
pref.all_underwear[UWC.name] = selected_underwear.name
return TOPIC_REFRESH_UPDATE_PREVIEW
+ else if(href_list["underwear"] && href_list["tweak"])
+ var/underwear = href_list["underwear"]
+ if(!(underwear in pref.all_underwear))
+ return TOPIC_NOACTION
+ var/datum/gear_tweak/gt = locate(href_list["tweak"])
+ if(!gt)
+ return TOPIC_NOACTION
+ var/new_metadata = gt.get_metadata(usr, get_metadata(underwear, gt))
+ if(new_metadata)
+ set_metadata(underwear, gt, new_metadata)
+ return TOPIC_REFRESH_UPDATE_PREVIEW
+
return ..()
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/gear_tweaks.dm b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
index 820c95f324..e8b1a56d62 100644
--- a/code/modules/client/preference_setup/loadout/gear_tweaks.dm
+++ b/code/modules/client/preference_setup/loadout/gear_tweaks.dm
@@ -17,8 +17,6 @@
* Color adjustment
*/
-var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
-
/datum/gear_tweak/color
var/list/valid_colors
@@ -32,10 +30,10 @@ var/datum/gear_tweak/color/gear_tweak_free_color_choice = new()
/datum/gear_tweak/color/get_default()
return valid_colors ? valid_colors[1] : COLOR_GRAY
-/datum/gear_tweak/color/get_metadata(var/user, var/metadata)
+/datum/gear_tweak/color/get_metadata(var/user, var/metadata, var/title = "Character Preference")
if(valid_colors)
- return input(user, "Choose an item color.", "Character Preference", metadata) as null|anything in valid_colors
- return input(user, "Choose an item color.", "Global Preference", metadata) as color|null
+ return input(user, "Choose a color.", title, metadata) as null|anything in valid_colors
+ return input(user, "Choose a color.", title, metadata) as color|null
/datum/gear_tweak/color/tweak_item(var/obj/item/I, var/metadata)
if(valid_colors && !(metadata in valid_colors))
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
index a5c66d2e79..e8a66117cc 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm
@@ -53,10 +53,26 @@
display_name = "tie, blue"
path = /obj/item/clothing/accessory/blue
+/datum/gear/accessory/tie/blue_clip
+ display_name = "tie, blue with clip"
+ path = /obj/item/clothing/accessory/blue_clip
+
/datum/gear/accessory/tie/red
display_name = "tie, red"
path = /obj/item/clothing/accessory/red
+/datum/gear/accessory/tie/red_long
+ display_name = "tie, red long"
+ path = /obj/item/clothing/accessory/red_long
+
+/datum/gear/accessory/tie/yellow
+ display_name = "tie, yellow"
+ path = /obj/item/clothing/accessory/yellow
+
+/datum/gear/accessory/tie/navy
+ display_name = "tie, navy blue"
+ path = /obj/item/clothing/accessory/navy
+
/datum/gear/accessory/tie/horrible
display_name = "tie, socially disgraceful"
path = /obj/item/clothing/accessory/horrible
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 915a5db9ea..8064479e6e 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -350,10 +350,17 @@ datum/preferences
I.robotize()
character.all_underwear.Cut()
+ character.all_underwear_metadata.Cut()
+
for(var/underwear_category_name in all_underwear)
- var/underwear_item_name = all_underwear[underwear_category_name]
var/datum/category_group/underwear/underwear_category = global_underwear.categories_by_name[underwear_category_name]
- character.all_underwear[underwear_category_name] = underwear_category.items_by_name[underwear_item_name]
+ if(underwear_category)
+ var/underwear_item_name = all_underwear[underwear_category_name]
+ character.all_underwear[underwear_category_name] = underwear_category.items_by_name[underwear_item_name]
+ if(all_underwear_metadata[underwear_category_name])
+ character.all_underwear_metadata[underwear_category_name] = all_underwear_metadata[underwear_category_name]
+ else
+ all_underwear -= underwear_category_name
if(backbag > 4 || backbag < 1)
backbag = 1 //Same as above
@@ -367,6 +374,7 @@ datum/preferences
character.force_update_limbs()
character.update_mutations(0)
character.update_body(0)
+ character.update_underwear(0)
character.update_hair(0)
character.update_icons()
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 036d2094ea..6b877dcb04 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -36,6 +36,7 @@
var/datum/robolimb/synthetic //If they are a synthetic (aka synthetic torso)
var/list/all_underwear = list()
+ var/list/all_underwear_metadata = list()
var/backbag = 2 //Which backpack type the player has chosen. Nothing, Satchel or Backpack.
var/pdachoice = 1 //Which PDA type the player has chosen. Default, Slim, or Old.
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index aee262477c..871a873fe4 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -109,29 +109,30 @@ Please contact me on #coderbus IRC. ~Carn x
#define MUTATIONS_LAYER 1
#define DAMAGE_LAYER 2
#define SURGERY_LEVEL 3 //bs12 specific.
-#define UNIFORM_LAYER 4
-#define ID_LAYER 5
-#define SHOES_LAYER 6
-#define GLOVES_LAYER 7
-#define BELT_LAYER 8
-#define SUIT_LAYER 9
-#define TAIL_LAYER 10 //bs12 specific. this hack is probably gonna come back to haunt me
-#define GLASSES_LAYER 11
-#define BELT_LAYER_ALT 12
-#define SUIT_STORE_LAYER 13
-#define BACK_LAYER 14
-#define HAIR_LAYER 15 //TODO: make part of head layer?
-#define EARS_LAYER 16
-#define FACEMASK_LAYER 17
-#define HEAD_LAYER 18
-#define COLLAR_LAYER 19
-#define HANDCUFF_LAYER 20
-#define LEGCUFF_LAYER 21
-#define L_HAND_LAYER 22
-#define R_HAND_LAYER 23
-#define FIRE_LAYER 24 //If you're on fire
-#define TARGETED_LAYER 25 //BS12: Layer for the target overlay from weapon targeting system
-#define TOTAL_LAYERS 25
+#define UNDERWEAR_LAYER 4
+#define UNIFORM_LAYER 5
+#define ID_LAYER 6
+#define SHOES_LAYER 7
+#define GLOVES_LAYER 8
+#define BELT_LAYER 9
+#define SUIT_LAYER 10
+#define TAIL_LAYER 11 //bs12 specific. this hack is probably gonna come back to haunt me
+#define GLASSES_LAYER 12
+#define BELT_LAYER_ALT 13
+#define SUIT_STORE_LAYER 14
+#define BACK_LAYER 15
+#define HAIR_LAYER 16 //TODO: make part of head layer?
+#define EARS_LAYER 17
+#define FACEMASK_LAYER 18
+#define HEAD_LAYER 19
+#define COLLAR_LAYER 20
+#define HANDCUFF_LAYER 21
+#define LEGCUFF_LAYER 22
+#define L_HAND_LAYER 23
+#define R_HAND_LAYER 24
+#define FIRE_LAYER 25 //If you're on fire
+#define TARGETED_LAYER 26 //BS12: Layer for the target overlay from weapon targeting system
+#define TOTAL_LAYERS 26
//////////////////////////////////
/mob/living/carbon/human
@@ -148,8 +149,12 @@ Please contact me on #coderbus IRC. ~Carn x
if (icon_update)
icon = stand_icon
- for(var/image/I in overlays_standing)
- overlays += I
+ for(var/entry in overlays_standing)
+ if(istype(entry, /image))
+ overlays += entry
+ else if(istype(entry, /list))
+ for(var/inner_entry in entry)
+ overlays += inner_entry
if(lying && !species.prone_icon) //Only rotate them if we're not drawing a specific icon for being prone.
var/matrix/M = matrix()
@@ -318,18 +323,24 @@ var/global/list/damage_icon_parts = list()
//END CACHED ICON GENERATION.
stand_icon.Blend(base_icon,ICON_OVERLAY)
- //Underwear
- if(species.appearance_flags & HAS_UNDERWEAR)
- for(var/category in all_underwear)
- var/datum/category_item/underwear/UW = all_underwear[category]
- UW.apply_to_icon(stand_icon)
-
if(update_icons)
update_icons()
//tail
update_tail_showing(0)
+//UNDERWEAR OVERLAY
+/mob/living/carbon/human/proc/update_underwear(var/update_icons=1)
+ overlays_standing[UNDERWEAR_LAYER] = null
+
+ if(species.appearance_flags & HAS_UNDERWEAR)
+ overlays_standing[UNDERWEAR_LAYER] = list()
+ for(var/category in all_underwear)
+ var/datum/category_item/underwear/UWI = all_underwear[category]
+ overlays_standing[UNDERWEAR_LAYER] += UWI.generate_image(all_underwear_metadata[category])
+
+ if(update_icons) update_icons()
+
//HAIR OVERLAY
/mob/living/carbon/human/proc/update_hair(var/update_icons=1)
//Reset our hair
@@ -429,6 +440,7 @@ var/global/list/damage_icon_parts = list()
update_mutations(0)
update_body(0)
+ update_underwear(0)
update_hair(0)
update_inv_w_uniform(0)
update_inv_wear_id(0)
diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm
index 04544035c0..df74367d0d 100644
--- a/code/modules/organs/subtypes/machine.dm
+++ b/code/modules/organs/subtypes/machine.dm
@@ -25,6 +25,7 @@
organ_tag = "brain"
parent_organ = BP_HEAD
vital = 1
+ var/brain_type = /obj/item/device/mmi
var/obj/item/device/mmi/stored_mmi
/obj/item/organ/internal/mmi_holder/Destroy()
@@ -35,8 +36,10 @@
/obj/item/organ/internal/mmi_holder/New(var/mob/living/carbon/human/new_owner, var/internal)
..(new_owner, internal)
- if(!stored_mmi)
- stored_mmi = new(src)
+ var/mob/living/carbon/human/dummy/mannequin/M = new_owner
+ if(istype(M))
+ return
+ stored_mmi = new brain_type(src)
sleep(-1)
update_from_mmi()
@@ -80,10 +83,8 @@
/obj/item/organ/internal/mmi_holder/posibrain
name = "positronic brain interface"
-
-/obj/item/organ/internal/mmi_holder/posibrain/New()
- stored_mmi = new /obj/item/device/mmi/digital/posibrain(src)
- ..()
+ brain_type = /obj/item/device/mmi/digital/posibrain
+
/obj/item/organ/internal/mmi_holder/posibrain/update_from_mmi()
..()
diff --git a/html/changelog.html b/html/changelog.html
index 7199a0ef38..e5cdf2a7a2 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -53,6 +53,13 @@
-->