diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 216b2a3db7..8221deeadb 100644
--- a/_maps/map_files/MetaStation/MetaStation.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.dmm
@@ -16060,10 +16060,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 10
},
-/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=14-Starboard-Central";
- location = "13.3-Engineering-Central"
- },
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
@@ -21712,7 +21708,7 @@
icon_state = "1-2"
},
/obj/machinery/navbeacon{
- codes_txt = "patrol;next_patrol=13.3-Engineering-Central";
+ codes_txt = "patrol;next_patrol=14-Starboard-Central";
location = "13.2-Tcommstore"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
@@ -74464,9 +74460,6 @@
},
/turf/open/floor/plasteel/dark,
/area/command/bridge)
-"sKV" = (
-/turf/open/space/basic,
-/area/command/heads_quarters/captain)
"sLs" = (
/obj/effect/decal/cleanable/cobweb,
/obj/machinery/field/generator,
@@ -122070,7 +122063,7 @@ oRp
oRp
aaa
aai
-sKV
+aaa
aaa
aaa
aaa
@@ -130641,7 +130634,7 @@ aaf
aaf
aaa
aaa
-sKV
+aaa
aaa
aaa
aaa
diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm
index eacbc74508..cdc6d424dd 100644
--- a/_maps/map_files/PubbyStation/PubbyStation.dmm
+++ b/_maps/map_files/PubbyStation/PubbyStation.dmm
@@ -24647,6 +24647,12 @@
},
/turf/open/space,
/area/solars/starboard)
+"beW" = (
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 5
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"beY" = (
/obj/machinery/camera{
c_tag = "Arrivals Central";
@@ -40355,15 +40361,9 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/components/binary/pump{
+/obj/machinery/atmospherics/components/binary/pump/on{
dir = 8;
- name = "Mix to Ports"
- },
-/turf/open/floor/plasteel,
-/area/engineering/atmos)
-"bNk" = (
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
+ name = "Unfiltered to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -40372,8 +40372,9 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/machinery/atmospherics/pipe/manifold/green/visible{
- dir = 1
+/obj/machinery/atmospherics/components/binary/pump/on{
+ dir = 4;
+ name = "Unfiltered & Air to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -40809,23 +40810,19 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
-"bOo" = (
-/obj/machinery/atmospherics/pipe/manifold/general/visible,
-/turf/open/floor/plasteel,
-/area/engineering/atmos)
"bOp" = (
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible{
- dir = 10
+/obj/machinery/atmospherics/components/binary/pump{
+ dir = 8;
+ name = "Pure to Mix"
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bOq" = (
-/obj/machinery/atmospherics/components/binary/pump{
- dir = 1;
- name = "Pure to Mix"
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 1
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -41089,13 +41086,6 @@
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
-"bPa" = (
-/obj/machinery/portable_atmospherics/canister,
-/obj/machinery/atmospherics/components/unary/portables_connector/visible{
- dir = 1
- },
-/turf/open/floor/plasteel,
-/area/engineering/atmos)
"bPd" = (
/obj/machinery/atmospherics/pipe/manifold/yellow/visible{
dir = 8
@@ -41407,7 +41397,6 @@
/obj/structure/cable{
icon_state = "1-2"
},
-/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bPW" = (
@@ -41785,14 +41774,16 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bQK" = (
+/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/obj/machinery/atmospherics/pipe/simple/general/visible{
dir = 4
},
-/obj/machinery/atmospherics/pipe/simple/cyan/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bQL" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
+/obj/machinery/atmospherics/pipe/manifold/green/visible{
+ dir = 8
+ },
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bQM" = (
@@ -41800,9 +41791,8 @@
/obj/effect/turf_decal/tile/yellow{
dir = 4
},
-/obj/machinery/atmospherics/components/binary/pump/on{
- dir = 1;
- name = "Unfiltered to Mix"
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 10
},
/turf/open/floor/plasteel,
/area/engineering/atmos)
@@ -42109,8 +42099,7 @@
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bRw" = (
-/obj/machinery/atmospherics/pipe/manifold4w/general/visible,
-/obj/machinery/meter,
+/obj/machinery/atmospherics/pipe/simple/general/visible,
/turf/open/floor/plasteel,
/area/engineering/atmos)
"bRx" = (
@@ -53829,6 +53818,12 @@
},
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"eEd" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 6
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"eEp" = (
/obj/machinery/atmospherics/components/unary/vent_scrubber/on{
dir = 4
@@ -55198,6 +55193,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plasteel,
/area/construction/mining/aux_base)
+"hEi" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/general/visible{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"hEX" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 6
@@ -56739,6 +56743,12 @@
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel/dark,
/area/engineering/main)
+"kWG" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"kWQ" = (
/obj/machinery/atmospherics/pipe/simple/orange/visible,
/obj/structure/cable/yellow{
@@ -57443,6 +57453,15 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/closed/wall,
/area/maintenance/department/engine)
+"mAR" = (
+/obj/machinery/atmospherics/pipe/simple/green/visible{
+ dir = 5
+ },
+/obj/machinery/atmospherics/pipe/simple/yellow/visible{
+ dir = 10
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"mCe" = (
/obj/effect/spawner/structure/window/reinforced,
/obj/machinery/door/poddoor/preopen{
@@ -58849,6 +58868,10 @@
},
/turf/open/floor/wood,
/area/service/lawoffice)
+"pEM" = (
+/obj/machinery/atmospherics/pipe/manifold/general/visible,
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"pFe" = (
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/obj/effect/turf_decal/tile/red{
@@ -59370,6 +59393,13 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/department/crew_quarters/dorms)
+"qQu" = (
+/obj/machinery/portable_atmospherics/canister,
+/obj/machinery/atmospherics/components/unary/portables_connector/visible{
+ dir = 4
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"qRl" = (
/obj/item/radio/intercom{
name = "Station Intercom (General)";
@@ -60110,6 +60140,13 @@
},
/turf/open/floor/plating,
/area/maintenance/department/security/brig)
+"sGJ" = (
+/obj/structure/cable{
+ icon_state = "1-2"
+ },
+/obj/machinery/atmospherics/pipe/simple/general/visible,
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"sIK" = (
/obj/effect/turf_decal/stripes/line{
dir = 8
@@ -61031,6 +61068,12 @@
},
/turf/open/floor/engine,
/area/engineering/main)
+"uST" = (
+/obj/machinery/atmospherics/components/binary/pump{
+ name = "Mix to Ports"
+ },
+/turf/open/floor/plasteel,
+/area/engineering/atmos)
"uUQ" = (
/obj/machinery/door/airlock/maintenance{
name = "Engineering Maintenance";
@@ -99648,7 +99691,7 @@ bJN
bKS
bMe
bNh
-bOo
+pEM
bOX
bMf
bMf
@@ -100162,9 +100205,9 @@ bHw
bKU
bOr
bPU
+kWG
bRw
-bPa
-bMf
+beW
bMf
bMf
bMf
@@ -100418,13 +100461,13 @@ bIF
bHw
bKV
bOX
-bUv
+eEd
bQL
-bPa
-bMf
-bMf
-bMf
+uST
+pEM
bMf
+qQu
+qQu
bSU
bTT
bUv
@@ -100678,10 +100721,10 @@ bMg
bNj
bOp
bPV
-bPV
-bPV
-bPV
-bPV
+hEi
+sGJ
+bUw
+bUw
bUw
bUw
bUw
@@ -100932,8 +100975,8 @@ bIH
bHw
cqG
bOX
-bNk
bOq
+mAR
bPd
bPW
bPW
diff --git a/_maps/templates/shelter_4.dmm b/_maps/templates/shelter_4.dmm
new file mode 100644
index 0000000000..abb85a09f8
--- /dev/null
+++ b/_maps/templates/shelter_4.dmm
@@ -0,0 +1,191 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/wall/mineral/titanium/survival/pod,
+/area/survivalpod/nonpowered)
+"j" = (
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"k" = (
+/obj/item/gps/computer,
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"p" = (
+/obj/machinery/light,
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"x" = (
+/obj/machinery/smartfridge/survival_pod,
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"H" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/obj/structure/table/survival_pod,
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"J" = (
+/obj/machinery/light{
+ dir = 8
+ },
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"P" = (
+/obj/machinery/door/airlock/survival_pod,
+/obj/machinery/poweredfans,
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"U" = (
+/obj/machinery/light{
+ dir = 1
+ },
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+"Y" = (
+/obj/machinery/power/apc/auto_name/north,
+/turf/open/floor/pod/dark,
+/area/survivalpod/nonpowered)
+
+(1,1,1) = {"
+a
+a
+a
+a
+a
+P
+a
+a
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+j
+j
+J
+j
+j
+j
+j
+j
+j
+a
+"}
+(3,1,1) = {"
+a
+j
+j
+j
+j
+j
+j
+j
+j
+j
+a
+"}
+(4,1,1) = {"
+a
+U
+j
+j
+j
+j
+j
+j
+j
+p
+a
+"}
+(5,1,1) = {"
+a
+j
+j
+j
+j
+j
+j
+j
+j
+j
+a
+"}
+(6,1,1) = {"
+P
+j
+j
+j
+j
+j
+j
+j
+j
+j
+P
+"}
+(7,1,1) = {"
+a
+Y
+j
+j
+j
+j
+j
+j
+j
+j
+a
+"}
+(8,1,1) = {"
+a
+H
+j
+j
+j
+j
+j
+j
+j
+p
+a
+"}
+(9,1,1) = {"
+a
+x
+j
+j
+j
+j
+j
+j
+j
+j
+a
+"}
+(10,1,1) = {"
+a
+k
+j
+j
+j
+j
+j
+j
+j
+j
+a
+"}
+(11,1,1) = {"
+a
+a
+a
+a
+a
+P
+a
+a
+a
+a
+a
+"}
diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm
index ded183ba0b..3807b66b06 100644
--- a/code/__DEFINES/traits.dm
+++ b/code/__DEFINES/traits.dm
@@ -165,6 +165,7 @@
#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events"
#define TRAIT_NO_MIDROUND_ANTAG "no-midround-antag" //can't be turned into an antag by random events
#define TRAIT_PUGILIST "pugilist" //This guy punches people for a living
+#define TRAIT_NOPUGILIST "nopugilist" // for preventing ((((((((((extreme)))))))))) punch stacking
#define TRAIT_KI_VAMPIRE "ki-vampire" //when someone with this trait rolls maximum damage on a punch and stuns the target, they regain some stamina and do clone damage
#define TRAIT_MAULER "mauler" // this guy punches the shit out of people to hurt them, not to drain their stamina
#define TRAIT_PASSTABLE "passtable"
diff --git a/code/__HELPERS/global_lists.dm b/code/__HELPERS/global_lists.dm
index 9719157d4d..0a17f0d1df 100644
--- a/code/__HELPERS/global_lists.dm
+++ b/code/__HELPERS/global_lists.dm
@@ -14,7 +14,6 @@
//socks
init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/socks, GLOB.socks_list)
//bodypart accessories (blizzard intensifies)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/lizard, GLOB.tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails_animated/lizard, GLOB.animated_tails_list_lizard)
init_sprite_accessory_subtypes(/datum/sprite_accessory/tails/human, GLOB.tails_list_human)
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index 92cf7050e0..02af6fab79 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -64,8 +64,6 @@
init_sprite_accessory_subtypes(/datum/sprite_accessory/spines, GLOB.spines_list)
if(!GLOB.legs_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/legs, GLOB.legs_list)
- if(!GLOB.body_markings_list.len)
- init_sprite_accessory_subtypes(/datum/sprite_accessory/body_markings, GLOB.body_markings_list)
if(!GLOB.wings_list.len)
init_sprite_accessory_subtypes(/datum/sprite_accessory/wings, GLOB.wings_list)
if(!GLOB.deco_wings_list.len)
@@ -115,15 +113,6 @@
continue
if(!S.ckeys_allowed)
snowflake_mam_tails_list[S.name] = mtpath
- var/list/snowflake_markings_list = list()
- for(var/mmpath in GLOB.mam_body_markings_list)
- var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[mmpath]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if(intendedspecies && S.recommended_species && !S.recommended_species.Find(intendedspecies))
- continue
- if(!S.ckeys_allowed)
- snowflake_markings_list[S.name] = mmpath
var/list/snowflake_ears_list = list()
for(var/mepath in GLOB.mam_ears_list)
var/datum/sprite_accessory/ears/mam_ears/instance = GLOB.mam_ears_list[mepath]
@@ -177,7 +166,6 @@
"ears" = "None",
"frills" = pick(GLOB.frills_list),
"spines" = pick(GLOB.spines_list),
- "body_markings" = pick(GLOB.body_markings_list),
"legs" = pick("Plantigrade","Digitigrade"),
"caps" = pick(GLOB.caps_list),
"insect_wings" = pick(GLOB.insect_wings_list),
@@ -187,7 +175,7 @@
"arachnid_spinneret" = pick(GLOB.arachnid_spinneret_list),
"arachnid_mandibles" = pick(GLOB.arachnid_mandibles_list),
"taur" = "None",
- "mam_body_markings" = snowflake_markings_list.len ? pick(snowflake_markings_list) : "None",
+ "mam_body_markings" = list(),
"mam_ears" = snowflake_ears_list ? pick(snowflake_ears_list) : "None",
"mam_snouts" = snowflake_mam_snouts_list ? pick(snowflake_mam_snouts_list) : "None",
"mam_tail" = snowflake_mam_tails_list ? pick(snowflake_mam_tails_list) : "None",
diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm
index f0a8a4e2c6..d94c677a42 100644
--- a/code/_globalvars/lists/flavor_misc.dm
+++ b/code/_globalvars/lists/flavor_misc.dm
@@ -17,7 +17,6 @@ GLOBAL_LIST_EMPTY(undershirt_f) //stores only undershirt name
//Socks
GLOBAL_LIST_EMPTY_TYPED(socks_list, /datum/sprite_accessory/underwear/socks) //stores socks indexed by name
//Lizard Bits (all datum lists indexed by name)
-GLOBAL_LIST_EMPTY(body_markings_list)
GLOBAL_LIST_EMPTY(tails_list_lizard)
GLOBAL_LIST_EMPTY(animated_tails_list_lizard)
GLOBAL_LIST_EMPTY(snouts_list)
@@ -55,7 +54,6 @@ GLOBAL_LIST_INIT(mutant_reference_list, list(
"frills" = GLOB.frills_list,
"horns" = GLOB.horns_list,
"ears" = GLOB.ears_list,
- "body_markings" = GLOB.body_markings_list,
"wings" = GLOB.wings_list,
"wingsopen" = GLOB.wings_open_list,
"deco_wings" = GLOB.deco_wings_list,
@@ -299,7 +297,7 @@ GLOBAL_LIST_INIT(roundstart_languages, get_roundstart_languages())
//locked parts are those that your picked species requires to have
//unlocked parts are those that anyone can choose on customisation regardless
//parts not in unlocked, but in all, are thus locked
-GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "body_markings" = "Body Markings", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
+GLOBAL_LIST_INIT(all_mutant_parts, list("tail_lizard" = "Tail", "mam_tail" = "Tail", "tail_human" = "Tail", "snout" = "Snout", "frills" = "Frills", "spines" = "Spines", "mam_body_markings" = "Species Markings" , "mam_ears" = "Ears", "ears" = "Ears", "mam_snouts" = "Snout", "legs" = "Legs", "deco_wings" = "Decorative Wings", "insect_wings" = "Insect Wings", "insect_fluff" = "Insect Fluff", "taur" = "Tauric Body", "insect_markings" = "Insect Markings", "wings" = "Wings", "arachnid_legs" = "Arachnid Legs", "arachnid_spinneret" = "Spinneret", "arachnid_mandibles" = "Mandibles", "xenohead" = "Caste Head", "xenotail" = "Tail", "xenodorsal" = "Dorsal Spines", "ipc_screen" = "Screen", "ipc_antenna" = "Antenna", "meat_type" = "Meat Type", "horns" = "Horns"))
GLOBAL_LIST_INIT(unlocked_mutant_parts, list("horns", "insect_fluff"))
//parts in either of the above two lists that require a second option that allows them to be coloured
@@ -350,3 +348,8 @@ GLOBAL_LIST_INIT(nongendered_limb_types, list("fly", "zombie" ,"synth", "shadow"
//list of eye types, corresponding to a respective left and right icon state for the set of eyes
GLOBAL_LIST_INIT(eye_types, list("normal", "insect", "moth", "double", "double2", "double3", "cyclops"))
+
+//list linking bodypart bitflags to their actual names
+GLOBAL_LIST_INIT(bodypart_names, list(num2text(HEAD) = "Head", num2text(CHEST) = "Chest", num2text(LEG_LEFT) = "Left Leg", num2text(LEG_RIGHT) = "Right Leg", num2text(ARM_LEFT) = "Left Arm", num2text(ARM_RIGHT) = "Right Arm"))
+// list linking bodypart names back to the bitflags
+GLOBAL_LIST_INIT(bodypart_values, list("Head" = num2text(HEAD), "Chest" = num2text(CHEST), "Left Leg" = num2text(LEG_LEFT), "Right Leg" = num2text(LEG_RIGHT), "Left Arm" = num2text(ARM_LEFT), "Right Arm" = num2text(ARM_RIGHT)))
diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm
index a1b7a74384..d1fff25dae 100644
--- a/code/_onclick/hud/_defines.dm
+++ b/code/_onclick/hud/_defines.dm
@@ -89,6 +89,7 @@
//Generic living
#define ui_living_pull "EAST-1:28,CENTER-2:15"
#define ui_living_health "EAST-1:28,CENTER:15"
+#define ui_living_healthdoll "EAST-1:28,CENTER-1:15"
//Monkeys
#define ui_monkey_head "CENTER-5:13,SOUTH:5"
diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm
index 34fd90f4f0..b27abad841 100644
--- a/code/_onclick/hud/screen_objects.dm
+++ b/code/_onclick/hud/screen_objects.dm
@@ -637,6 +637,11 @@
name = "health doll"
screen_loc = ui_healthdoll
+/obj/screen/healthdoll/living
+ icon_state = "fullhealth0"
+ screen_loc = ui_living_healthdoll
+ var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update
+
/obj/screen/mood
name = "mood"
icon_state = "mood5"
diff --git a/code/_onclick/hud/simple_animal.dm b/code/_onclick/hud/simple_animal.dm
new file mode 100644
index 0000000000..ef46c0d66e
--- /dev/null
+++ b/code/_onclick/hud/simple_animal.dm
@@ -0,0 +1,15 @@
+/datum/hud/living/simple_animal
+ ui_style = 'icons/mob/screen_gen.dmi'
+/datum/hud/living/simple_animal/New(mob/living/owner)
+ ..()
+ pull_icon = new /obj/screen/pull()
+ pull_icon.icon = ui_style
+ pull_icon.update_icon()
+ pull_icon.screen_loc = ui_living_pull
+ pull_icon.hud = src
+ static_inventory += pull_icon
+
+ //mob health doll! assumes whatever sprite the mob is
+ healthdoll = new /obj/screen/healthdoll/living()
+ healthdoll.hud = src
+ infodisplay += healthdoll
diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm
index 58238247ff..a7a3e87672 100755
--- a/code/controllers/subsystem/ticker.dm
+++ b/code/controllers/subsystem/ticker.dm
@@ -713,7 +713,8 @@ SUBSYSTEM_DEF(ticker)
'sound/roundend/disappointed.ogg',
'sound/roundend/gondolabridge.ogg',
'sound/roundend/haveabeautifultime.ogg',
- 'sound/roundend/CitadelStationHasSeenBetterDays.ogg'\
+ 'sound/roundend/CitadelStationHasSeenBetterDays.ogg',
+ 'sound/roundend/approachingbaystation.ogg'\
)
SEND_SOUND(world, sound(round_end_sound))
diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm
index 5881c76827..9b9ea3c86e 100644
--- a/code/datums/martial/sleeping_carp.dm
+++ b/code/datums/martial/sleeping_carp.dm
@@ -165,6 +165,7 @@
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
ADD_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
ADD_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
+ ADD_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT) // cqc doesn't get this as it's intended to be able to stack with northstar gloves
H.physiology.brute_mod *= 0.4 //brute is really not gonna cut it
H.physiology.burn_mod *= 0.7 //burn is distinctly more useful against them than brute but they're still resistant
H.physiology.stamina_mod *= 0.4 //You take less stamina damage overall, but you do not reduce the damage from stun batons as much
@@ -181,6 +182,7 @@
REMOVE_TRAIT(H, TRAIT_PIERCEIMMUNE, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_NODISMEMBER, SLEEPING_CARP_TRAIT)
REMOVE_TRAIT(H, TRAIT_TASED_RESISTANCE, SLEEPING_CARP_TRAIT)
+ REMOVE_TRAIT(H, TRAIT_NOPUGILIST, SLEEPING_CARP_TRAIT)
H.physiology.brute_mod = initial(H.physiology.brute_mod)
H.physiology.burn_mod = initial(H.physiology.burn_mod)
H.physiology.stamina_mod = initial(H.physiology.stamina_mod)
diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm
index 5621b47885..822302789f 100755
--- a/code/game/machinery/computer/communications.dm
+++ b/code/game/machinery/computer/communications.dm
@@ -84,6 +84,7 @@
authorize_access = get_all_accesses()
to_chat(user, "You scramble the communication routing circuits!")
playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
+ SSshuttle.shuttle_purchase_requirements_met["emagged"] = TRUE
return
/obj/machinery/computer/communications/ui_act(action, list/params)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 4eed168ad6..477f72ee3b 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -688,7 +688,7 @@
else
. += "It looks very robust."
- if(hasSiliconAccessInArea(user) && (!stat & BROKEN))
+ if(hasSiliconAccessInArea(user) && !(stat & BROKEN))
. += "Shift-click [src] to [ density ? "open" : "close"] it."
. += "Ctrl-click [src] to [ locked ? "raise" : "drop"] its bolts."
. += "Alt-click [src] to [ secondsElectrified ? "un-electrify" : "permanently electrify"] it."
diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm
index 417fd96c85..2e7cef2c9f 100644
--- a/code/game/objects/items/kitchen.dm
+++ b/code/game/objects/items/kitchen.dm
@@ -100,6 +100,42 @@
"[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku."))
return (BRUTELOSS)
+/obj/item/kitchen/efink
+ name = "E-Fink"
+ icon_state = "efink"
+ desc = "The E-Fink is a product by Mending Solutions Inc. Unfortunately it can only mend sliced meat, fruits and dough back to their original state. Unbutchering is not possible."
+ flags_1 = CONDUCT_1
+ force = 10
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 10
+ hitsound = 'sound/weapons/bladesliceb.ogg'
+ throw_speed = 3
+ throw_range = 6
+ custom_materials = list(/datum/material/iron=12000)
+ attack_verb = list("slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
+ sharpness = SHARP_POINTY
+ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 50, "acid" = 50)
+ var/bayonet = FALSE //Can this be attached to a gun?
+ wound_bonus = -5
+ bare_wound_bonus = 10
+ custom_price = PRICE_NORMAL
+
+/obj/item/kitchen/efink/Initialize()
+ . = ..()
+ AddComponent(/datum/component/butchering, 80 - force, 100, force - 10) //bonus chance increases depending on force
+
+/obj/item/kitchen/efink/attack(mob/living/carbon/M, mob/living/carbon/user)
+ if(user.zone_selected == BODY_ZONE_PRECISE_EYES)
+ return eyestab(M,user)
+ else
+ return ..()
+
+/obj/item/kitchen/efink/suicide_act(mob/user)
+ user.visible_message(pick("[user] is slitting [user.p_their()] wrists with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \
+ "[user] is slitting [user.p_their()] throat with the [src.name]! It looks like [user.p_theyre()] trying to commit suicide.", \
+ "[user] is slitting [user.p_their()] stomach open with the [src.name]! It looks like [user.p_theyre()] trying to commit seppuku."))
+ return (BRUTELOSS)
+
/obj/item/kitchen/knife/ritual
name = "ritual knife"
desc = "The unearthly energies that once powered this blade are now dormant."
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 6e66f833c2..f888927411 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -383,7 +383,7 @@
. = ..()
/obj/item/stack/medical/mesh/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags)
- if(!is_open & user.get_inactive_held_item() == src)
+ if(!is_open && (user.get_inactive_held_item() == src))
to_chat(user, "You need to open [src] first.")
return
. = ..()
diff --git a/code/game/objects/structures/spawner.dm b/code/game/objects/structures/spawner.dm
index 9032a80d91..7d13af1e3e 100644
--- a/code/game/objects/structures/spawner.dm
+++ b/code/game/objects/structures/spawner.dm
@@ -73,3 +73,15 @@
name = "wumborian fugu den"
desc = "A den housing a nest of wumborian fugus, how do they all even fit in there?"
mob_types = list(/mob/living/simple_animal/hostile/asteroid/fugu)
+
+/obj/structure/spawner/clown
+ name = "Laughing Larry"
+ desc = "A laughing, jovial figure. Something seems stuck in his throat."
+ icon_state = "clownbeacon"
+ icon = 'icons/obj/device.dmi'
+ max_integrity = 200
+ max_mobs = 15
+ spawn_time = 150
+ mob_types = list(/mob/living/simple_animal/hostile/retaliate/clown, /mob/living/simple_animal/hostile/retaliate/clown/fleshclown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk, /mob/living/simple_animal/hostile/retaliate/clown/longface, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/chlown, /mob/living/simple_animal/hostile/retaliate/clown/clownhulk/honcmunculus, /mob/living/simple_animal/hostile/retaliate/clown/mutant/blob)
+ spawn_text = "climbs out of"
+ faction = list("clown")
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index fba79ac2b0..6356424aaf 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -127,7 +127,7 @@
to_chat(user, "Throwing [pushed_mob] onto the table might hurt them!")
return
var/added_passtable = FALSE
- if(!pushed_mob.pass_flags & PASSTABLE)
+ if(!(pushed_mob.pass_flags & PASSTABLE))
added_passtable = TRUE
pushed_mob.pass_flags |= PASSTABLE
pushed_mob.Move(src.loc)
diff --git a/code/modules/admin/create_mob.dm b/code/modules/admin/create_mob.dm
index 0679d9ffac..9a74b63040 100644
--- a/code/modules/admin/create_mob.dm
+++ b/code/modules/admin/create_mob.dm
@@ -41,7 +41,6 @@
H.dna.features["horns"] = pick(GLOB.horns_list)
H.dna.features["frills"] = pick(GLOB.frills_list)
H.dna.features["spines"] = pick(GLOB.spines_list)
- H.dna.features["body_markings"] = pick(GLOB.body_markings_list)
H.dna.features["insect_wings"] = pick(GLOB.insect_wings_list)
H.dna.features["deco_wings"] = pick(GLOB.deco_wings_list)
H.dna.features["insect_fluff"] = pick(GLOB.insect_fluffs_list)
diff --git a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
index 4f518b7f8e..ca07f9a50b 100644
--- a/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
+++ b/code/modules/admin/verbs/SDQL2/SDQL_2_wrappers.dm
@@ -238,3 +238,9 @@
/proc/__nan()
var/list/L = json_decode("{\"value\":NaN}")
return L["value"]
+
+/**
+ * Wrapper to return a copy of contents, as SDQL2 can't tell an internal list from a normal list.
+ */
+/atom/proc/_contents()
+ return contents.Copy()
diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm
index 93b2e20271..b92b659183 100644
--- a/code/modules/antagonists/_common/antag_datum.dm
+++ b/code/modules/antagonists/_common/antag_datum.dm
@@ -111,7 +111,7 @@ GLOBAL_LIST_EMPTY(antagonists)
var/datum/skill_modifier/job/M = GLOB.skill_modifiers[GET_SKILL_MOD_ID(A, type)]
if(istype(M))
M.name = "[name] Training"
- owner.AddComponent(/datum/component/activity)
+ owner.current.AddComponent(/datum/component/activity)
SEND_SIGNAL(owner.current, COMSIG_MOB_ANTAG_ON_GAIN, src)
/datum/antagonist/proc/is_banned(mob/M)
@@ -164,14 +164,12 @@ GLOBAL_LIST_EMPTY(antagonists)
/datum/antagonist/proc/remove_blacklisted_quirks()
var/mob/living/L = owner.current
if(istype(L))
- var/list/my_quirks = L.client?.prefs.all_quirks.Copy()
- SSquirks.filter_quirks(my_quirks,blacklisted_quirks)
for(var/q in L.roundstart_quirks)
var/datum/quirk/Q = q
- if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks))
+ if(Q.type in blacklisted_quirks)
if(initial(Q.antag_removal_text))
to_chat(L, "[initial(Q.antag_removal_text)]")
- L.remove_quirk(Q.type)
+ qdel(Q)
//Returns the team antagonist belongs to if any.
/datum/antagonist/proc/get_team()
diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm
index 5b6a7648c8..b7aeb23e6f 100644
--- a/code/modules/antagonists/changeling/powers/mutations.dm
+++ b/code/modules/antagonists/changeling/powers/mutations.dm
@@ -680,6 +680,11 @@
glove_type = /obj/item/clothing/gloves/fingerless/pugilist/cling // just punch his head off dude
glove_name_simple = "bone gauntlets"
+/obj/effect/proc_holder/changeling/gloves/gauntlets/sting_action(mob/living/user)
+ if(HAS_TRAIT(user, TRAIT_NOPUGILIST))
+ to_chat(user, "We would gain nothing by forming our fists into brute-force weapons when we are trained in precision martial arts!")
+ return
+
/obj/item/clothing/gloves/fingerless/pugilist/cling // switches between lesser GotNS and Big Punchy Rib Breaky Hands
name = "hewn bone gauntlets"
icon_state = "ling_gauntlets"
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_items.dm b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
index a6380a81b2..86ef2afacb 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_items.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_items.dm
@@ -229,8 +229,8 @@
flags_inv = NONE
flags_cover = NONE
desc = "Black like tar, doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing."
- item_flags = EXAMINE_SKIP
armor = list("melee" = 30, "bullet" = 30, "laser" = 30,"energy" = 30, "bomb" = 15, "bio" = 0, "rad" = 0, "fire" = 0, "acid" = 0)
+ obj_flags = NONE | EXAMINE_SKIP
/obj/item/clothing/suit/hooded/cultrobes/void
name = "void cloak"
@@ -253,9 +253,10 @@
//We need to account for the hood shenanigans, and that way we can make sure items always fit, even if one of the slots is used by the fucking hood.
if(suittoggled)
to_chat(carbon_user,"The light shifts around you making the cloak invisible!")
- else
+ obj_flags |= EXAMINE_SKIP
+ else if(obj_flags & EXAMINE_SKIP) // ensures that it won't toggle visibility if raising the hood failed
to_chat(carbon_user,"The kaleidoscope of colours collapses around you, as the cloak shifts to visibility!")
- item_flags = suittoggled ? EXAMINE_SKIP : ~EXAMINE_SKIP
+ obj_flags ^= EXAMINE_SKIP
else
to_chat(carbon_user,"You can't force the hood onto your head!")
diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
index 4aeb2e1b73..4d6576ee92 100644
--- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
+++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm
@@ -50,7 +50,7 @@
/obj/item/melee/touch_attack/mansus_fist/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
- if(!proximity_flag | target == user)
+ if(!proximity_flag || (target == user))
return
playsound(user, 'sound/items/welder.ogg', 75, TRUE)
if(ishuman(target))
diff --git a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
index 8184beb3aa..aa927ffcfc 100644
--- a/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
+++ b/code/modules/antagonists/eldritch_cult/knowledge/rust_lore.dm
@@ -24,7 +24,7 @@
var/check = FALSE
if(ismob(target))
var/mob/living/mobster = target
- if(!mobster.mob_biotypes & MOB_ROBOTIC)
+ if(!(mobster.mob_biotypes & MOB_ROBOTIC))
return FALSE
else
check = TRUE
diff --git a/code/modules/antagonists/slaughter/slaughter.dm b/code/modules/antagonists/slaughter/slaughter.dm
index a26d081f08..f616f2c848 100644
--- a/code/modules/antagonists/slaughter/slaughter.dm
+++ b/code/modules/antagonists/slaughter/slaughter.dm
@@ -84,6 +84,9 @@
if(slam_cooldown + slam_cooldown_time > world.time)
to_chat(src, "Your slam ability is still on cooldown!")
return
+ if(!isopenturf(loc))
+ to_chat(src, "You need to be on open flooring to do that!")
+ return
face_atom(A)
var/mob/living/victim = A
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 81d267fcf1..251bcc72ad 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -124,7 +124,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/eye_type = DEFAULT_EYES_TYPE //Eye type
var/split_eye_colors = FALSE
var/datum/species/pref_species = new /datum/species/human() //Mutant race
- var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
+ var/list/features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = list(), "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
var/custom_speech_verb = "default" //if your say_mod is to be something other than your races
var/custom_tongue = "default" //if your tongue is to be something other than your races
@@ -514,7 +514,76 @@ GLOBAL_LIST_EMPTY(preferences_datums)
dat += ""
mutant_category = 0
+ // rp marking selection
+ // assume you can only have mam markings or regular markings or none, never both
+ var/marking_type
+ if(parent.can_have_part("mam_body_markings"))
+ marking_type = "mam_body_markings"
+ if(marking_type)
+ dat += APPEARANCE_CATEGORY_COLUMN
+ dat += "
[GLOB.all_mutant_parts[marking_type]]
" // give it the appropriate title for the type of marking
+ dat += "Add marking"
+ // list out the current markings you have
+ if(length(features[marking_type]))
+ dat += "
"
+ var/list/markings = features[marking_type]
+ if(!islist(markings))
+ // something went terribly wrong
+ markings = list()
+ var/list/reverse_markings = reverseList(markings)
+ for(var/list/marking_list in reverse_markings)
+ var/marking_index = markings.Find(marking_list) // consider changing loop to go through indexes over lists instead of using Find here
+ var/limb_value = marking_list[1]
+ var/actual_name = GLOB.bodypart_names[num2text(limb_value)] // get the actual name from the bitflag representing the part the marking is applied to
+ var/color_marking_dat = ""
+ var/number_colors = 1
+ var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
+ var/matrixed_sections = S.covered_limbs[actual_name]
+ if(S && matrixed_sections)
+ // if it has nothing initialize it to white
+ if(length(marking_list) == 2)
+ var/first = "#FFFFFF"
+ var/second = "#FFFFFF"
+ var/third = "#FFFFFF"
+ if(features["mcolor"])
+ first = "#[features["mcolor"]]"
+ if(features["mcolor2"])
+ second = "#[features["mcolor2"]]"
+ if(features["mcolor3"])
+ third = "#[features["mcolor3"]]"
+ marking_list += list(list(first, second, third)) // just assume its 3 colours if it isnt it doesnt matter we just wont use the other values
+ // index magic
+ var/primary_index = 1
+ var/secondary_index = 2
+ var/tertiary_index = 3
+ switch(matrixed_sections)
+ if(MATRIX_GREEN)
+ primary_index = 2
+ if(MATRIX_BLUE)
+ primary_index = 3
+ if(MATRIX_RED_BLUE)
+ secondary_index = 2
+ if(MATRIX_GREEN_BLUE)
+ primary_index = 2
+ secondary_index = 3
+
+ // we know it has one matrixed section at minimum
+ color_marking_dat += ""
+ // if it has a second section, add it
+ if(matrixed_sections == MATRIX_RED_BLUE || matrixed_sections == MATRIX_GREEN_BLUE || matrixed_sections == MATRIX_RED_GREEN || matrixed_sections == MATRIX_ALL)
+ color_marking_dat += ""
+ number_colors = 2
+ // if it has a third section, add it
+ if(matrixed_sections == MATRIX_ALL)
+ color_marking_dat += ""
+ number_colors = 3
+ color_marking_dat += " Change "
+ dat += "
"
+
for(var/mutant_part in GLOB.all_mutant_parts)
+ if(mutant_part == "mam_body_markings")
+ continue
if(parent.can_have_part(mutant_part))
if(!mutant_category)
dat += APPEARANCE_CATEGORY_COLUMN
@@ -533,8 +602,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(accessory)
if(accessory.color_src == MATRIXED || accessory.color_src == MUTCOLORS || accessory.color_src == MUTCOLORS2 || accessory.color_src == MUTCOLORS3) //mutcolors1-3 are deprecated now, please don't rely on these in the future
var/mutant_string = accessory.mutant_part_string
- if(istype(accessory, /datum/sprite_accessory/mam_body_markings) || istype(accessory, /datum/sprite_accessory/body_markings))
- continue
var/primary_feature = "[mutant_string]_primary"
var/secondary_feature = "[mutant_string]_secondary"
var/tertiary_feature = "[mutant_string]_tertiary"
@@ -1726,13 +1793,11 @@ GLOBAL_LIST_EMPTY(preferences_datums)
pref_species = new newtype()
//let's ensure that no weird shit happens on species swapping.
custom_species = null
- if(!parent.can_have_part("body_markings"))
- features["body_markings"] = "None"
if(!parent.can_have_part("mam_body_markings"))
- features["mam_body_markings"] = "None"
+ features["mam_body_markings"] = list()
if(parent.can_have_part("mam_body_markings"))
if(features["mam_body_markings"] == "None")
- features["mam_body_markings"] = "Plain"
+ features["mam_body_markings"] = list()
if(parent.can_have_part("tail_lizard"))
features["tail_lizard"] = "Smooth"
if(pref_species.id == "felinid")
@@ -1961,14 +2026,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_spines)
features["spines"] = new_spines
- if("body_markings")
- var/new_body_markings
- new_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in GLOB.body_markings_list
- if(new_body_markings)
- features["body_markings"] = new_body_markings
- if(new_body_markings != "None")
- features["mam_body_markings"] = "None"
-
if("legs")
var/new_legs
new_legs = input(user, "Choose your character's legs:", "Character Preference") as null|anything in GLOB.legs_list
@@ -2088,26 +2145,6 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if(new_ears)
features["mam_ears"] = new_ears
- if("mam_body_markings")
- var/list/snowflake_markings_list = list()
- for(var/path in GLOB.mam_body_markings_list)
- var/datum/sprite_accessory/mam_body_markings/instance = GLOB.mam_body_markings_list[path]
- if(istype(instance, /datum/sprite_accessory))
- var/datum/sprite_accessory/S = instance
- if(!show_mismatched_markings && S.recommended_species && !S.recommended_species.Find(pref_species.id))
- continue
- if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
- snowflake_markings_list[S.name] = path
- var/new_mam_body_markings
- new_mam_body_markings = input(user, "Choose your character's body markings:", "Character Preference") as null|anything in snowflake_markings_list
- if(new_mam_body_markings)
- features["mam_body_markings"] = new_mam_body_markings
- if(new_mam_body_markings != "None")
- features["body_markings"] = "None"
- else if(new_mam_body_markings == "None")
- features["mam_body_markings"] = "Plain"
- features["body_markings"] = "None"
-
//Xeno Bodyparts
if("xenohead")//Head or caste type
var/new_head
@@ -2133,7 +2170,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
features["xenodorsal"] = new_dors
//every single primary/secondary/tertiary colouring done at once
- if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","body_markings_primary","body_markings_secondary","body_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary")
+ if("xenodorsal_primary","xenodorsal_secondary","xenodorsal_tertiary","xhead_primary","xhead_secondary","xhead_tertiary","tail_primary","tail_secondary","tail_tertiary","insect_markings_primary","insect_markings_secondary","insect_markings_tertiary","insect_fluff_primary","insect_fluff_secondary","insect_fluff_tertiary","ears_primary","ears_secondary","ears_tertiary","frills_primary","frills_secondary","frills_tertiary","ipc_antenna_primary","ipc_antenna_secondary","ipc_antenna_tertiary","taur_primary","taur_secondary","taur_tertiary","snout_primary","snout_secondary","snout_tertiary","spines_primary","spines_secondary","spines_tertiary", "mam_body_markings_primary", "mam_body_markings_secondary", "mam_body_markings_tertiary")
var/the_feature = features[href_list["preference"]]
if(!the_feature)
features[href_list["preference"]] = "FFFFFF"
@@ -2390,6 +2427,111 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/selected_body_sprite = input(user, "Choose your desired body sprite", "Character Preference") as null|anything in pref_species.allowed_limb_ids
if(selected_body_sprite)
chosen_limb_id = selected_body_sprite //this gets sanitized before loading
+
+ if("marking_down")
+ // move the specified marking down
+ var/index = text2num(href_list["marking_index"])
+ var/marking_type = href_list["marking_type"]
+ if(index && marking_type && features[marking_type] && index != length(features[marking_type]))
+ var/index_down = index + 1
+ var/markings = features[marking_type]
+ var/first_marking = markings[index]
+ var/second_marking = markings[index_down]
+ markings[index] = second_marking
+ markings[index_down] = first_marking
+
+ if("marking_up")
+ // move the specified marking up
+ var/index = text2num(href_list["marking_index"])
+ var/marking_type = href_list["marking_type"]
+ if(index && marking_type && features[marking_type] && index != 1)
+ var/index_up = index - 1
+ var/markings = features[marking_type]
+ var/first_marking = markings[index]
+ var/second_marking = markings[index_up]
+ markings[index] = second_marking
+ markings[index_up] = first_marking
+
+ if("marking_remove")
+ // move the specified marking up
+ var/index = text2num(href_list["marking_index"])
+ var/marking_type = href_list["marking_type"]
+ if(index && marking_type && features[marking_type])
+ // because linters are just absolutely awful:
+ var/list/L = features[marking_type]
+ L.Cut(index, index + 1)
+
+ if("marking_add")
+ // add a marking
+ var/marking_type = href_list["marking_type"]
+ if(marking_type && features[marking_type])
+ var/selected_limb = input(user, "Choose the limb to apply to.", "Character Preference") as null|anything in list("Head", "Chest", "Left Arm", "Right Arm", "Left Leg", "Right Leg", "All")
+ if(selected_limb)
+ var/list/marking_list = GLOB.mam_body_markings_list
+ var/list/snowflake_markings_list = list()
+ for(var/path in marking_list)
+ var/datum/sprite_accessory/S = marking_list[path]
+ if(istype(S))
+ if(istype(S, /datum/sprite_accessory/mam_body_markings))
+ var/datum/sprite_accessory/mam_body_markings/marking = S
+ if(!(selected_limb in marking.covered_limbs) && selected_limb != "All")
+ continue
+
+ if((!S.ckeys_allowed) || (S.ckeys_allowed.Find(user.client.ckey)))
+ snowflake_markings_list[S.name] = path
+
+ var/selected_marking = input(user, "Select the marking to apply to the limb.") as null|anything in snowflake_markings_list
+ if(selected_marking)
+ if(selected_limb != "All")
+ var/limb_value = text2num(GLOB.bodypart_values[selected_limb])
+ features[marking_type] += list(list(limb_value, selected_marking))
+ else
+ var/datum/sprite_accessory/mam_body_markings/S = marking_list[selected_marking]
+ for(var/limb in S.covered_limbs)
+ var/limb_value = text2num(GLOB.bodypart_values[limb])
+ features[marking_type] += list(list(limb_value, selected_marking))
+
+ if("marking_color")
+ var/index = text2num(href_list["marking_index"])
+ var/marking_type = href_list["marking_type"]
+ if(index && marking_type && features[marking_type])
+ // work out the input options to show the user
+ var/list/options = list("Primary")
+ var/number_colors = text2num(href_list["number_colors"])
+ var/color_number = 1 // 1-3 which color are we editing
+ if(number_colors >= 2)
+ options += "Secondary"
+ if(number_colors == 3)
+ options += "Tertiary"
+ var/color_option = input(user, "Select the colour you wish to edit") as null|anything in options
+ if(color_option)
+ if(color_option == "Secondary") color_number = 2
+ if(color_option == "Tertiary") color_number = 3
+ // perform some magic on the color number
+ var/list/marking_list = features[marking_type][index]
+ var/datum/sprite_accessory/mam_body_markings/S = GLOB.mam_body_markings_list[marking_list[2]]
+ var/matrixed_sections = S.covered_limbs[GLOB.bodypart_names[num2text(marking_list[1])]]
+ if(color_number == 1)
+ switch(matrixed_sections)
+ if(MATRIX_GREEN)
+ color_number = 2
+ if(MATRIX_BLUE)
+ color_number = 3
+ else if(color_number == 2)
+ switch(matrixed_sections)
+ if(MATRIX_RED_BLUE)
+ color_number = 3
+ if(MATRIX_GREEN_BLUE)
+ color_number = 3
+
+ var/color_list = features[marking_type][index][3]
+ var/new_marking_color = input(user, "Choose your character's marking color:", "Character Preference","#"+color_list[color_number]) as color|null
+ if(new_marking_color)
+ var/temp_hsv = RGBtoHSV(new_marking_color)
+ if((MUTCOLORS_PARTSONLY in pref_species.species_traits) || ReadHSV(temp_hsv)[3] >= ReadHSV(MINIMUM_MUTANT_COLOR)[3]) // mutantcolors must be bright, but only if they affect the skin
+ color_list[color_number] = "#[sanitize_hexcolor(new_marking_color, 6)]"
+ else
+ to_chat(user, "Invalid color. Your color is not bright enough.")
else
switch(href_list["preference"])
//CITADEL PREFERENCES EDIT - I can't figure out how to modularize these, so they have to go here. :c -Pooj
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 9cd16592ce..45c5357c4d 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -5,7 +5,7 @@
// You do not need to raise this if you are adding new values that have sane defaults.
// Only raise this value when changing the meaning/format/name/layout of an existing value
// where you would want the updater procs below to run
-#define SAVEFILE_VERSION_MAX 51
+#define SAVEFILE_VERSION_MAX 52
/*
SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Carn
@@ -283,7 +283,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
qdel(temporary_gear_item)
//it's double packed into a list because += will union the two lists contents
- S["loadout"] = safe_json_encode(loadout_data)
+ S["loadout"] = loadout_data
if(current_version < 48) //unlockable loadout items but we need to clear bad data from a mistake
S["unlockable_loadout"] = list()
@@ -299,6 +299,47 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
if(S["species"] == SPECIES_HUMAN)
features["legs"] = "Plantigrade"
+ if(current_version < 52) // rp markings means markings are now stored as a list, lizard markings now mam like the rest
+ var/marking_type
+ var/species_id = S["species"]
+ var/datum/species/actual_species = GLOB.species_datums[species_id]
+
+ // convert lizard markings to lizard markings
+ if(species_id == SPECIES_LIZARD && S["feature_lizard_body_markings"])
+ features["mam_body_markings"] = features["body_markings"]
+
+ // convert mam body marking data to the new rp marking data
+ if(actual_species.mutant_bodyparts["mam_body_markings"] && S["feature_mam_body_markings"]) marking_type = "feature_mam_body_markings"
+
+ if(marking_type)
+ var/old_marking_value = S[marking_type]
+ var/list/color_list = list("#FFFFFF","#FFFFFF","#FFFFFF")
+
+ if(S["feature_mcolor"]) color_list[1] = "#" + S["feature_mcolor"]
+ if(S["feature_mcolor2"]) color_list[2] = "#" + S["feature_mcolor2"]
+ if(S["feature_mcolor3"]) color_list[3] = "#" + S["feature_mcolor3"]
+
+ var/list/marking_list = list()
+ for(var/part in list(ARM_LEFT, ARM_RIGHT, LEG_LEFT, LEG_RIGHT, CHEST, HEAD))
+ var/list/copied_color_list = color_list.Copy()
+ var/datum/sprite_accessory/mam_body_markings/mam_marking = GLOB.mam_body_markings_list[old_marking_value]
+ var/part_name = GLOB.bodypart_names[num2text(part)]
+ if(length(mam_marking.covered_limbs) && mam_marking.covered_limbs[part_name])
+ var/matrixed_sections = mam_marking.covered_limbs[part_name]
+ // just trust me this is fine
+ switch(matrixed_sections)
+ if(MATRIX_GREEN)
+ copied_color_list[1] = copied_color_list[2]
+ if(MATRIX_BLUE)
+ copied_color_list[1] = copied_color_list[3]
+ if(MATRIX_RED_BLUE)
+ copied_color_list[2] = copied_color_list[3]
+ if(MATRIX_GREEN_BLUE)
+ copied_color_list[1] = copied_color_list[2]
+ copied_color_list[2] = copied_color_list[3]
+ marking_list += list(list(part, old_marking_value, copied_color_list))
+ features["mam_body_markings"] = marking_list
+
/datum/preferences/proc/load_path(ckey,filename="preferences.sav")
if(!ckey)
return
@@ -583,7 +624,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
var/savefile/S = new /savefile(path)
if(!S)
return FALSE
- features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
+ features = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF", "mcolor3" = "FFFFFF", "tail_lizard" = "Smooth", "tail_human" = "None", "snout" = "Round", "horns" = "None", "horns_color" = "85615a", "ears" = "None", "wings" = "None", "wings_color" = "FFF", "frills" = "None", "deco_wings" = "None", "spines" = "None", "legs" = "Plantigrade", "insect_wings" = "Plain", "insect_fluff" = "None", "insect_markings" = "None", "arachnid_legs" = "Plain", "arachnid_spinneret" = "Plain", "arachnid_mandibles" = "Plain", "mam_body_markings" = "Plain", "mam_ears" = "None", "mam_snouts" = "None", "mam_tail" = "None", "mam_tail_animated" = "None", "xenodorsal" = "Standard", "xenohead" = "Standard", "xenotail" = "Xenomorph Tail", "taur" = "None", "genitals_use_skintone" = FALSE, "has_cock" = FALSE, "cock_shape" = DEF_COCK_SHAPE, "cock_length" = COCK_SIZE_DEF, "cock_diameter_ratio" = COCK_DIAMETER_RATIO_DEF, "cock_color" = "ffffff", "cock_taur" = FALSE, "has_balls" = FALSE, "balls_color" = "ffffff", "balls_shape" = DEF_BALLS_SHAPE, "balls_size" = BALLS_SIZE_DEF, "balls_cum_rate" = CUM_RATE, "balls_cum_mult" = CUM_RATE_MULT, "balls_efficiency" = CUM_EFFICIENCY, "has_breasts" = FALSE, "breasts_color" = "ffffff", "breasts_size" = BREASTS_SIZE_DEF, "breasts_shape" = DEF_BREASTS_SHAPE, "breasts_producing" = FALSE, "has_vag" = FALSE, "vag_shape" = DEF_VAGINA_SHAPE, "vag_color" = "ffffff", "has_womb" = FALSE, "balls_visibility" = GEN_VISIBLE_NO_UNDIES, "breasts_visibility"= GEN_VISIBLE_NO_UNDIES, "cock_visibility" = GEN_VISIBLE_NO_UNDIES, "vag_visibility" = GEN_VISIBLE_NO_UNDIES, "ipc_screen" = "Sunburst", "ipc_antenna" = "None", "flavor_text" = "", "silicon_flavor_text" = "", "ooc_notes" = "", "meat_type" = "Mammalian", "body_model" = MALE, "body_size" = RESIZE_DEFAULT_SIZE, "color_scheme" = OLD_CHARACTER_COLORING)
S.cd = "/"
if(!slot)
@@ -653,7 +694,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_lizard_horns"] >> features["horns"]
S["feature_lizard_frills"] >> features["frills"]
S["feature_lizard_spines"] >> features["spines"]
- S["feature_lizard_body_markings"] >> features["body_markings"]
S["feature_lizard_legs"] >> features["legs"]
S["feature_human_tail"] >> features["tail_human"]
S["feature_human_ears"] >> features["ears"]
@@ -722,7 +762,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
S["feature_genitals_use_skintone"] >> features["genitals_use_skintone"]
S["feature_mcolor2"] >> features["mcolor2"]
S["feature_mcolor3"] >> features["mcolor3"]
- S["feature_mam_body_markings"] >> features["mam_body_markings"]
+ // note safe json decode will runtime the first time it migrates but this is fine and it solves itself don't worry about it if you see it error
+ features["mam_body_markings"] = safe_json_decode(S["feature_mam_body_markings"])
S["feature_mam_tail"] >> features["mam_tail"]
S["feature_mam_ears"] >> features["mam_ears"]
S["feature_mam_tail_animated"] >> features["mam_tail_animated"]
@@ -852,7 +893,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
features["ears"] = sanitize_inlist(features["ears"], GLOB.ears_list)
features["frills"] = sanitize_inlist(features["frills"], GLOB.frills_list)
features["spines"] = sanitize_inlist(features["spines"], GLOB.spines_list)
- features["body_markings"] = sanitize_inlist(features["body_markings"], GLOB.body_markings_list)
features["legs"] = sanitize_inlist(features["legs"], GLOB.legs_list, "Plantigrade")
features["deco_wings"] = sanitize_inlist(features["deco_wings"], GLOB.deco_wings_list, "None")
features["insect_fluff"] = sanitize_inlist(features["insect_fluff"], GLOB.insect_fluffs_list)
@@ -1021,7 +1061,6 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
WRITE_FILE(S["feature_human_ears"] , features["ears"])
WRITE_FILE(S["feature_lizard_frills"] , features["frills"])
WRITE_FILE(S["feature_lizard_spines"] , features["spines"])
- WRITE_FILE(S["feature_lizard_body_markings"] , features["body_markings"])
WRITE_FILE(S["feature_lizard_legs"] , features["legs"])
WRITE_FILE(S["feature_deco_wings"] , features["deco_wings"])
WRITE_FILE(S["feature_horns_color"] , features["horns_color"])
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index a558abbfe8..a337439931 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -37,14 +37,19 @@
/obj/item/clothing/gloves/fingerless/pugilist/equipped(mob/user, slot)
. = ..()
if(slot == SLOT_GLOVES)
- use_buffs(user, TRUE)
wornonce = TRUE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ to_chat(user, "What purpose is there to don the weapons of pugilism if you're already well-practiced in martial arts? Mixing arts is blasphemous!")
+ return
+ use_buffs(user, TRUE)
/obj/item/clothing/gloves/fingerless/pugilist/dropped(mob/user)
. = ..()
if(wornonce)
- use_buffs(user, FALSE)
wornonce = FALSE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ return
+ use_buffs(user, FALSE)
/obj/item/clothing/gloves/fingerless/pugilist/proc/use_buffs(mob/user, buff)
if(buff) // tarukaja
@@ -67,6 +72,7 @@
H.dna.species.punchdamagehigh -= enhancement
H.dna.species.punchdamagelow -= enhancement
H.dna.species.punchwoundbonus -= wound_enhancement
+ H.dna?.species?.attack_sound_override = null
if(!silent)
to_chat(user, "With [src] off of your arms, you feel less ready to punch things.")
@@ -223,6 +229,50 @@
parry_cooldown = 0
parry_failed_clickcd_duration = 0
+/obj/item/clothing/gloves/fingerless/pugilist/mauler
+ name = "mauler gauntlets"
+ desc = "Plastitanium gauntlets coated in a thick nano-weave carbon material and implanted with nanite injectors that boost the wielder's strength six-fold."
+ icon_state = "mauler_gauntlets"
+ item_state = "mauler_gauntlets"
+ transfer_prints = FALSE
+ body_parts_covered = ARMS|HANDS
+ cold_protection = ARMS|HANDS
+ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
+ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ armor = list("melee" = 30, "bullet" = 30, "laser" = 10, "energy" = 10, "bomb" = 55, "bio" = 15, "rad" = 15, "fire" = 80, "acid" = 50)
+ siemens_coefficient = 0
+ permeability_coefficient = 0.05
+ strip_delay = 80
+ enhancement = 12 // same as the changeling gauntlets but without changeling utility
+ wound_enhancement = 12
+ silent = TRUE
+ inherited_trait = TRAIT_CHUNKYFINGERS // your fingers are fat because the gloves are
+ secondary_trait = TRAIT_MAULER // commit table slam
+
+/obj/item/clothing/gloves/fingerless/pugilist/mauler/equipped(mob/user, slot)
+ . = ..()
+ if(slot == SLOT_GLOVES)
+ wornonce = TRUE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ return
+ use_mauls(user, TRUE)
+
+/obj/item/clothing/gloves/fingerless/pugilist/mauler/dropped(mob/user)
+ . = ..()
+ if(wornonce)
+ wornonce = FALSE
+ if((HAS_TRAIT(user, TRAIT_NOPUGILIST)))
+ return
+ use_mauls(user, FALSE)
+
+/obj/item/clothing/gloves/fingerless/pugilist/mauler/proc/use_mauls(mob/user, maul)
+ if(maul)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.dna?.species?.attack_sound_override = 'sound/weapons/mauler_punch.ogg'
+ if(silent)
+ to_chat(H, "You feel prickles around your wrists as [src] cling to them - strength courses through your veins!")
+
/obj/item/clothing/gloves/botanic_leather
name = "botanist's leather gloves"
desc = "These leather gloves protect against thorns, barbs, prickles, spikes and other harmful objects of floral origin. They're also quite warm."
@@ -253,7 +303,6 @@
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 50)
strip_mod = 1.5
-
/obj/item/clothing/gloves/bracer
name = "bone bracers"
desc = "For when you're expecting to get slapped on the wrist. Offers modest protection to your arms."
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index cc14424980..6858de59df 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -535,3 +535,9 @@
to_chat(user, "You insert [I] into [src].")
B.use(10)
icon_state = initial(icon_state)
+
+/obj/item/clothing/shoes/swagshoes
+ name = "swag shoes"
+ desc = "They got me for my foams!"
+ icon_state = "SwagShoes"
+ item_state = "SwagShoes"
diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm
index f8292738ee..60d82292ef 100644
--- a/code/modules/clothing/under/costume.dm
+++ b/code/modules/clothing/under/costume.dm
@@ -355,3 +355,10 @@
name = "Sakura Kimono'"
icon_state = "sakura_kimono"
item_state = "sakura_kimono"
+
+/obj/item/clothing/under/costume/swagoutfit
+ name = "Swag outfit"
+ desc = "Why don't you go secure some bitches?"
+ icon_state = "SwagOutfit"
+ item_state = "SwagOutfit"
+ can_adjust = FALSE
diff --git a/code/modules/events/brand_intelligence.dm b/code/modules/events/brand_intelligence.dm
index 7d4ea66d30..b9480a646c 100644
--- a/code/modules/events/brand_intelligence.dm
+++ b/code/modules/events/brand_intelligence.dm
@@ -61,7 +61,7 @@
originMachine.visible_message("[originMachine] beeps and seems lifeless.")
kill()
return
- vendingMachines = listclearnulls(vendingMachines)
+ listclearnulls(vendingMachines)
if(!vendingMachines.len) //if every machine is infected
for(var/obj/machinery/vending/upriser in infectedMachines)
if(prob(70) && !QDELETED(upriser))
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index e31a9704df..7377913c15 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -305,6 +305,15 @@
/obj/item/reagent_containers/food/drinks/bottle/hcider/empty
list_reagents = null
+/obj/item/reagent_containers/food/drinks/bottle/amaretto
+ name = "Luini Amaretto"
+ desc = "A gentle and syrup-like drink that tastes of almonds and apricots."
+ icon_state = "disaronno"
+ list_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 100)
+
+/obj/item/reagent_containers/food/drinks/bottle/amaretto/empty
+ list_reagents = null
+
/obj/item/reagent_containers/food/drinks/bottle/grappa
name = "Phillipes well-aged Grappa"
desc = "Bottle of Grappa."
@@ -615,6 +624,10 @@
icon_state = "hcider"
name = "Sealed Cider"
+/obj/item/export/bottle/amaretto
+ icon_state = "disaronno"
+ name = "Sealed Amaretto"
+
/obj/item/export/bottle/cognac
icon_state = "cognacbottle"
name = "Sealed Cognac"
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index 943f421a64..363e263ad4 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -29,6 +29,7 @@
id = /datum/reagent/consumable/nuka_cola
results = list(/datum/reagent/consumable/nuka_cola = 6)
required_reagents = list(/datum/reagent/uranium = 1, /datum/reagent/consumable/space_cola = 6)
+ mix_message = "The bitter-sweet smell of radiation almost makes you wish for a space winter."
/datum/chemical_reaction/moonshine
name = "Moonshine"
@@ -36,6 +37,7 @@
results = list(/datum/reagent/consumable/ethanol/moonshine = 10)
required_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/sugar = 5)
required_catalysts = list(/datum/reagent/consumable/enzyme = 5)
+ mix_message = "As the moisture in the glass settles, your entire face burns from the reaction's alcoholic virility."
/datum/chemical_reaction/wine
name = "Wine"
@@ -112,6 +114,7 @@
id = /datum/reagent/consumable/ethanol/screwdrivercocktail
results = list(/datum/reagent/consumable/ethanol/screwdrivercocktail = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 2, /datum/reagent/consumable/orangejuice = 1)
+ mix_message = "The mixture billows a sweet scent of orange, promptly drowned out by a thick nose-scrunching cloud of potato liquor."
/datum/chemical_reaction/bloody_mary
name = "Bloody Mary"
@@ -142,18 +145,21 @@
id = /datum/reagent/consumable/ethanol/toxins_special
results = list(/datum/reagent/consumable/ethanol/toxins_special = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ethanol/vermouth = 1, /datum/reagent/toxin/plasma = 2)
+ mix_message = "The surface of the mixture sets ablaze as toxic gas erupts into a mystical cloud of fire, shortly settling to but a humble - albeit eternal blaze."
/datum/chemical_reaction/beepsky_smash
name = "Beepksy Smash"
id = /datum/reagent/consumable/ethanol/beepsky_smash
results = list(/datum/reagent/consumable/ethanol/beepsky_smash = 5)
required_reagents = list(/datum/reagent/consumable/limejuice = 2, /datum/reagent/consumable/ethanol/quadruple_sec = 2, /datum/reagent/iron = 1)
+ mix_message = "You can hear the law nearby."
/datum/chemical_reaction/doctor_delight
name = "The Doctor's Delight"
id = /datum/reagent/consumable/doctor_delight
results = list(/datum/reagent/consumable/doctor_delight = 5)
required_reagents = list(/datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/tomatojuice = 1, /datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/medicine/cryoxadone = 1)
+ mix_message = "The scent of medicine hits you like a truck!"
/datum/chemical_reaction/irish_cream
name = "Irish Cream"
@@ -166,6 +172,7 @@
id = /datum/reagent/consumable/ethanol/manly_dorf
results = list(/datum/reagent/consumable/ethanol/manly_dorf = 3)
required_reagents = list (/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/ale = 2)
+ mix_message = "You can feel the hair growing on your chest!"
/datum/chemical_reaction/greenbeer
name = "Green Beer"
@@ -233,6 +240,7 @@
id = /datum/reagent/consumable/ethanol/hiveminderaser
results = list(/datum/reagent/consumable/ethanol/hiveminderaser = 4)
required_reagents = list(/datum/reagent/consumable/ethanol/black_russian = 2, /datum/reagent/consumable/ethanol/thirteenloko = 1, /datum/reagent/consumable/grenadine = 1)
+ mix_message = "Your head throbs as the purple-colored mixture swirls with alien-like vigor!"
/datum/chemical_reaction/manhattan
name = "Manhattan"
@@ -269,6 +277,8 @@
id = /datum/reagent/consumable/ethanol/singulo
results = list(/datum/reagent/consumable/ethanol/singulo = 10)
required_reagents = list(/datum/reagent/consumable/ethanol/vodka = 5, /datum/reagent/radium = 1, /datum/reagent/consumable/ethanol/wine = 5)
+ mix_message = "A horrible screeching fills your ears, and a wave of dread washes over you..."
+ mix_sound = 'sound/effects/supermatter.ogg'
/datum/chemical_reaction/alliescocktail
name = "Allies Cocktail"
@@ -447,6 +457,8 @@
id = /datum/reagent/consumable/ethanol/syndicatebomb
results = list(/datum/reagent/consumable/ethanol/syndicatebomb = 2)
required_reagents = list(/datum/reagent/consumable/ethanol/beer = 1, /datum/reagent/consumable/ethanol/whiskey_cola = 1)
+ mix_message = "You can hear beeping coming from behind you."
+ mix_sound = 'sound/items/timer.ogg'
/datum/chemical_reaction/erikasurprise
name = "Erika Surprise"
@@ -459,30 +471,38 @@
id = /datum/reagent/consumable/ethanol/devilskiss
results = list(/datum/reagent/consumable/ethanol/devilskiss = 3)
required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/rum = 1)
+ mix_message = "You can hear faint whispering in your ear and a burning on your cheeks as the mixture blends together into with a fiery swirl."
/datum/chemical_reaction/hippiesdelight
name = "Hippies Delight"
id = /datum/reagent/consumable/ethanol/hippies_delight
results = list(/datum/reagent/consumable/ethanol/hippies_delight = 2)
required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 1, /datum/reagent/consumable/ethanol/gargle_blaster = 1)
+ mix_message = "You can like... Smell the flowers, man - as the drink mixes."
/datum/chemical_reaction/bananahonk
name = "Banana Honk"
id = /datum/reagent/consumable/ethanol/bananahonk
results = list(/datum/reagent/consumable/ethanol/bananahonk = 2)
required_reagents = list(/datum/reagent/consumable/laughter = 1, /datum/reagent/consumable/cream = 1)
+ mix_message = "The mixture honks. Honk!"
+ mix_sound = 'sound/items/bikehorn.ogg'
/datum/chemical_reaction/silencer
name = "Silencer"
id = /datum/reagent/consumable/ethanol/silencer
results = list(/datum/reagent/consumable/ethanol/silencer = 3)
required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/cream = 1, /datum/reagent/consumable/sugar = 1)
+ mix_message = "As the drink mixes, you can hear nothing..."
+ mix_sound = null
/datum/chemical_reaction/driestmartini
name = "Driest Martini"
id = /datum/reagent/consumable/ethanol/driestmartini
results = list(/datum/reagent/consumable/ethanol/driestmartini = 2)
required_reagents = list(/datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/ethanol/gin = 1)
+ mix_message = "You feel like a prune beneath a sun as the mixture yanks the moisture from your tongue - yet, it's all so silent."
+ mix_sound = null
/datum/chemical_reaction/thirteenloko
name = "Thirteen Loko"
@@ -519,12 +539,14 @@
id = /datum/reagent/consumable/gibbfloats
results = list(/datum/reagent/consumable/gibbfloats = 15)
required_reagents = list(/datum/reagent/consumable/dr_gibb = 5, /datum/reagent/consumable/ice = 5, /datum/reagent/consumable/cream = 5)
+ mix_message = "As the cream floats to the top of the glass, you can feel your cholesterol levels rising just looking at it."
/datum/chemical_reaction/triple_citrus
name = "triple_citrus"
id = /datum/reagent/consumable/triple_citrus
results = list(/datum/reagent/consumable/triple_citrus = 5)
required_reagents = list(/datum/reagent/consumable/lemonjuice = 1, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/orangejuice = 1)
+ mix_message = "The glass's contents shift colors from a rainbow of fruity twinges before settling with a distinct flowery smell."
/datum/chemical_reaction/grape_soda
name = "grape soda"
@@ -567,6 +589,7 @@
results = list(/datum/reagent/consumable/ethanol/bacchus_blessing = 4)
required_reagents = list(/datum/reagent/consumable/ethanol/hooch = 1, /datum/reagent/consumable/ethanol/absinthe = 1, /datum/reagent/consumable/ethanol/manly_dorf = 1, /datum/reagent/consumable/ethanol/syndicatebomb = 1)
mix_message = "The mixture turns to a sickening froth."
+ mix_sound = 'sound/FermiChem/bufferadd.ogg'
/datum/chemical_reaction/lemonade
name = "Lemonade"
@@ -601,7 +624,7 @@
id = /datum/reagent/consumable/ethanol/cogchamp
results = list(/datum/reagent/consumable/ethanol/cogchamp = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/cognac = 1, /datum/reagent/fuel = 1, /datum/reagent/consumable/ethanol/screwdrivercocktail = 1)
- mix_message = "You hear faint sounds of gears turning as it mixes."
+ mix_message = "You hear faint sounds of gears turning as the mixture gives off virulent plumes of steam."
mix_sound = 'sound/machines/clockcult/steam_whoosh.ogg'
/datum/chemical_reaction/pinotmort
@@ -744,18 +767,22 @@
id = /datum/reagent/consumable/pwr_game
results = list(/datum/reagent/consumable/pwr_game = 5)
required_reagents = list(/datum/reagent/consumable/sodawater = 1, /datum/reagent/colorful_reagent/crayonpowder/black = 1, /datum/reagent/consumable/sodiumchloride = 1)
+ mix_message = "The mixture froths as it turns black, rousing a nauseating aroma of sweat and salt before settling to an eerie purple color."
/datum/chemical_reaction/pinkmilk
name = "Strawberry Milk"
id = /datum/reagent/consumable/pinkmilk
results = list(/datum/reagent/consumable/pinkmilk = 2)
required_reagents = list(/datum/reagent/consumable/strawberryjuice = 1, /datum/reagent/consumable/milk = 1)
+ mix_message = "You feel a sweet aroma drift up your nose as the lactic mixture swirls. It reminds you of... a cafeteria."
/datum/chemical_reaction/blank_paper
name = "Blank Paper"
id = /datum/reagent/consumable/ethanol/blank_paper
results = list(/datum/reagent/consumable/ethanol/blank_paper = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/silencer = 1, /datum/reagent/consumable/nothing = 1, /datum/reagent/consumable/nuka_cola = 1)
+ mix_message = "As the drink mixes, you can hear nothing..."
+ mix_sound = null
/datum/chemical_reaction/wizz_fizz
name = "Wizz Fizz"
@@ -785,18 +812,22 @@
id = /datum/reagent/consumable/ethanol/turbo
results = list(/datum/reagent/consumable/ethanol/turbo = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/moonshine = 2, /datum/reagent/nitrous_oxide = 1, /datum/reagent/consumable/ethanol/sugar_rush = 1, /datum/reagent/consumable/pwr_game = 1)
+ mix_message = "The mixture pops and fizzles, it's going to bl- oh, nevermind."
/datum/chemical_reaction/old_timer
name = "Old Timer"
id = /datum/reagent/consumable/ethanol/old_timer
results = list(/datum/reagent/consumable/ethanol/old_timer = 6)
required_reagents = list(/datum/reagent/consumable/ethanol/whiskeysoda = 3, /datum/reagent/consumable/parsnipjuice = 2, /datum/reagent/consumable/ethanol/alexander = 1)
+ mix_message = "You hear a faded record playing in the distance. Then, you hear nothing."
+ mix_sound = null
/datum/chemical_reaction/rubberneck
name = "Rubberneck"
id = /datum/reagent/consumable/ethanol/rubberneck
results = list(/datum/reagent/consumable/ethanol/rubberneck = 10)
required_reagents = list(/datum/reagent/consumable/ethanol = 4, /datum/reagent/consumable/grey_bull = 5, /datum/reagent/consumable/astrotame = 1)
+ mix_message = "The mixture boils and bubbles as the faint scent of rubber and heart disease hits your nose."
/datum/chemical_reaction/duplex
name = "Duplex"
@@ -809,6 +840,7 @@
id = /datum/reagent/consumable/ethanol/trappist
results = list(/datum/reagent/consumable/ethanol/trappist = 5)
required_reagents = list(/datum/reagent/consumable/ethanol/ale = 2, /datum/reagent/water/holywater = 2, /datum/reagent/consumable/sugar = 1)
+ mix_message = "As the mixture froths, you swear you can hear a distant holy choir."
/datum/chemical_reaction/cream_soda
name = "Cream Soda"
@@ -821,6 +853,8 @@
id = /datum/reagent/consumable/ethanol/blazaam
results = list(/datum/reagent/consumable/ethanol/blazaam = 3)
required_reagents = list(/datum/reagent/consumable/ethanol/gin = 2, /datum/reagent/consumable/peachjuice = 1, /datum/reagent/bluespace = 1)
+ mix_message = "The mixture- hey, where'd all the liquid go? Oh, there it is."
+ mix_sound = 'sound/magic/Teleport_app.ogg'
/datum/chemical_reaction/planet_cracker
name = "Planet Cracker"
@@ -841,6 +875,7 @@
results = list(/datum/reagent/consumable/ethanol/gunfire = 4)
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 1, /datum/reagent/consumable/tea = 3)
mix_message = "A loud popping begins to fill the air as the drink is mixed."
+ mix_sound = 'sound/effects/wounds/sizzle1.ogg'
/datum/chemical_reaction/hellfire
name = "Hellfire"
@@ -848,6 +883,7 @@
results = list(/datum/reagent/consumable/ethanol/hellfire = 4)
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/ethanol/crevice_spike = 1)
mix_message = "The liquid begins to churn as it changes to an amber orange and catches on fire."
+ mix_sound = 'sound/FermiChem/bufferadd.ogg'
/datum/chemical_reaction/sins_delight
name = "Sins Delight"
@@ -861,6 +897,7 @@
id = /datum/reagent/consumable/ethanol/strawberry_daiquiri
results = list(/datum/reagent/consumable/ethanol/strawberry_daiquiri = 7)
required_reagents = list(/datum/reagent/consumable/ethanol/rum = 2, /datum/reagent/consumable/limejuice = 1, /datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/strawberryjuice = 2, /datum/reagent/consumable/ice = 1)
+ mix_message = "The mixture settles as a nostril-flaring waft of strawberry hits your nose."
/datum/chemical_reaction/miami_vice
name = "Miami Vice"
@@ -879,18 +916,22 @@
id = /datum/reagent/consumable/ethanol/liz_fizz
results = list(/datum/reagent/consumable/ethanol/liz_fizz = 5)
required_reagents = list(/datum/reagent/consumable/triple_citrus = 3, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/cream = 1)
+ mix_message = "The smell of cream and lime hits your nose as everything feels very real for a split moment. You want to lick your eye."
/datum/chemical_reaction/hotlime_miami
name = "Hotlime Miami"
id = /datum/reagent/consumable/ethanol/hotlime_miami
results = list(/datum/reagent/consumable/ethanol/hotlime_miami = 2)
required_reagents = list(/datum/reagent/medicine/ephedrine = 1, /datum/reagent/consumable/ethanol/pina_colada = 1)
+ mix_message = "You can hear synthwave in the distance as you can feel your blood boiling with rage."
/datum/chemical_reaction/mauna_loa
name = "Mauna Loa"
id = /datum/reagent/consumable/ethanol/mauna_loa
results = list(/datum/reagent/consumable/ethanol/mauna_loa = 5)
required_reagents = list(/datum/reagent/consumable/capsaicin = 2, /datum/reagent/consumable/ethanol/kahlua = 1, /datum/reagent/consumable/ethanol/bahama_mama = 2)
+ mix_message = "The drink erupts as a plume of lava sprays all over the place! Oh, wait, it's just luke-warm liquor."
+ mix_sound = 'sound/effects/wounds/sizzle2.ogg'
/datum/chemical_reaction/commander_and_chief
name = "Commander and Chief"
@@ -899,6 +940,22 @@
required_reagents = list(/datum/reagent/consumable/ethanol/alliescocktail = 50, /datum/reagent/consumable/ethanol/champagne = 20, /datum/reagent/consumable/doctor_delight = 10, /datum/reagent/consumable/ethanol/quintuple_sec = 10, /datum/reagent/consumable/ethanol/screwdrivercocktail = 10)
mix_message = "When your powers combine, I am Captain Pl-..."
+/datum/chemical_reaction/godfather
+ results = list(/datum/reagent/consumable/ethanol/godfather = 2)
+ required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/whiskey = 1)
+
+/datum/chemical_reaction/godmother
+ results = list(/datum/reagent/consumable/ethanol/godmother = 2)
+ required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/vodka = 1)
+
+/datum/chemical_reaction/amaretto_alexander
+ results = list(/datum/reagent/consumable/ethanol/amaretto_alexander = 3)
+ required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/ethanol/creme_de_cacao = 1, /datum/reagent/consumable/cream = 1)
+
+/datum/chemical_reaction/ginger_amaretto
+ results = list(/datum/reagent/consumable/ethanol/ginger_amaretto = 4)
+ required_reagents = list(/datum/reagent/consumable/ethanol/amaretto = 1, /datum/reagent/consumable/sol_dry = 1, /datum/reagent/consumable/ice = 1, /datum/reagent/consumable/lemonjuice = 1)
+
////////////////////////////////////////// Tea Base Drinks //////////////////////////////////////
/datum/chemical_reaction/mush
@@ -906,6 +963,7 @@
id = /datum/reagent/consumable/tea/mush
results = list(/datum/reagent/consumable/tea/mush = 3)
required_reagents = list(/datum/reagent/drug/mushroomhallucinogen = 3, /datum/reagent/consumable/tea = 3)
+ mix_message = "The liquid stirs with a mixture of psychedelic colors that makes stars peek from the corner of your vision."
/datum/chemical_reaction/foresttea1
name = "Forest Tea"
@@ -967,7 +1025,7 @@
id = /datum/reagent/consumable/catnip_tea
results = list(/datum/reagent/consumable/catnip_tea = 3)
required_reagents = list(/datum/reagent/consumable/tea = 5, /datum/reagent/pax/catnip = 2)
-
+ mix_message = "The mixture seems to purr aloud as it stirs together."
////////////////////////////////////////// Race Base Drinks //////////////////////////////////////
@@ -976,54 +1034,65 @@
id = /datum/reagent/consumable/ethanol/species_drink/coldscales
results = list(/datum/reagent/consumable/ethanol/species_drink/coldscales = 3)
required_reagents = list(/datum/reagent/consumable/tea = 1, /datum/reagent/toxin/slimejelly = 1, /datum/reagent/consumable/menthol = 1)
+ mix_message = "Bubbles erupt from the glass and spill all over the place as it mixes, before settling with the faint smell of a reptile enclosure."
/datum/chemical_reaction/oil_drum
name = "Oil Drum"
id = /datum/reagent/consumable/ethanol/species_drink/oil_drum
results = list(/datum/reagent/consumable/ethanol/species_drink/oil_drum = 3)
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oil = 1, /datum/reagent/consumable/ethanol/champagne = 12)
+ mix_message = "You can taste oil in your mouth as the newly-formed mixture floats to the top of the glass."
/datum/chemical_reaction/nord_king
name = "Nord King"
id = /datum/reagent/consumable/ethanol/species_drink/nord_king
results = list(/datum/reagent/consumable/ethanol/species_drink/nord_king = 10)
required_reagents = list(/datum/reagent/consumable/ethanol = 5, /datum/reagent/consumable/honey = 1, /datum/reagent/consumable/ethanol/red_mead = 10)
+ mix_message = "You can feel hair growing on places it shouldn't be as the smell of salt water and flame burns into your senses."
/datum/chemical_reaction/velvet_kiss
name = "Velvet Kiss"
id = /datum/reagent/consumable/ethanol/species_drink/velvet_kiss
results = list(/datum/reagent/consumable/ethanol/species_drink/velvet_kiss = 15) //Limited races use this
required_reagents = list(/datum/reagent/blood = 5, /datum/reagent/consumable/tea = 1, /datum/reagent/consumable/ethanol/wine = 10)
+ mix_message = "The taste of blood rolls off your tongue as the mixture oozes a crimson secretion."
/datum/chemical_reaction/abduction_fruit
name = "Abduction Fruit"
id = /datum/reagent/consumable/ethanol/species_drink/abduction_fruit
results = list(/datum/reagent/consumable/ethanol/species_drink/abduction_fruit = 3)
required_reagents = list(/datum/reagent/consumable/limejuice = 10, /datum/reagent/consumable/strawberryjuice = 5, /datum/reagent/consumable/watermelonjuice = 10)
+ mix_message = "The mixture forms with a green cloud of smoke, carrying with a smell of bovines and medicine."
/datum/chemical_reaction/bug_zapper
name = "Bug Zapper"
id = /datum/reagent/consumable/ethanol/species_drink/bug_zapper
results = list(/datum/reagent/consumable/ethanol/species_drink/bug_zapper = 20) //Harder to make
required_reagents = list(/datum/reagent/consumable/lemonjuice = 10, /datum/reagent/teslium = 1, /datum/reagent/copper = 10)
+ mix_message = "The mixture comes to life with a spark and a zap - shortly after, you can hear the faint buzzing of moths circling your head."
+ mix_sound = 'sound/weapons/taser.ogg'
/datum/chemical_reaction/mush_crush
name = "Mush Crush"
id = /datum/reagent/consumable/ethanol/species_drink/mush_crush
results = list(/datum/reagent/consumable/ethanol/species_drink/mush_crush = 10)
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/ash = 5, /datum/reagent/toxin/coffeepowder = 10)
+ mix_message = "The mixture sputters and coughs as a mushroom suddenly emerges from the glass!"
/datum/chemical_reaction/darkbrew
name = "Darkbrew"
id = /datum/reagent/consumable/ethanol/species_drink/darkbrew
results = list(/datum/reagent/consumable/ethanol/species_drink/darkbrew = 20)//Limited races use this
required_reagents = list(/datum/reagent/liquid_dark_matter = 5, /datum/reagent/toxin/bungotoxin = 5, /datum/reagent/toxin/coffeepowder = 10)
+ mix_message = "As the glass turns into a shadowy pit, you can smell... nothing."
/datum/chemical_reaction/hollow_bone
name = "Hollow Bone"
id = /datum/reagent/consumable/ethanol/species_drink/hollow_bone
results = list(/datum/reagent/consumable/ethanol/species_drink/hollow_bone = 10)
required_reagents = list(/datum/reagent/toxin/bonehurtingjuice = 5, /datum/reagent/consumable/milk = 10, /datum/reagent/consumable/coconutmilk = 10)
+ mix_message = "Your bones feel weak."
+ mix_sound = 'sound/effects/wounds/crack1.ogg'
/datum/chemical_reaction/frisky_kitty
name = "Frisky Kitty"
@@ -1031,6 +1100,7 @@
results = list(/datum/reagent/consumable/ethanol/species_drink/frisky_kitty = 2)
required_reagents = list(/datum/reagent/consumable/catnip_tea = 1, /datum/reagent/consumable/milk = 1)
required_temp = 296 //Just above room temp (22.85'C)
+ mix_message = "The drink bubbles over the rim as it settles, and the smell of wet fur and felines makes it feel like you're in heat."
/datum/chemical_reaction/jell_wyrm
name = "Jell Wyrm"
@@ -1038,6 +1108,7 @@
results = list(/datum/reagent/consumable/ethanol/species_drink/jell_wyrm = 2)
required_reagents = list(/datum/reagent/toxin/slimejelly = 1, /datum/reagent/toxin/carpotoxin = 1, /datum/reagent/carbondioxide = 5)
required_temp = 333 // (59.85'C)
+ mix_message = "The smell of toxins scrunches your nose as your limbs grow limp and feel like jelly."
/datum/chemical_reaction/laval_spit
name = "Laval Spit"
@@ -1045,3 +1116,5 @@
results = list(/datum/reagent/consumable/ethanol/species_drink/laval_spit = 20) //Limited use
required_reagents = list(/datum/reagent/iron = 5, /datum/reagent/consumable/ethanol/mauna_loa = 10, /datum/reagent/sulfur = 5)
required_temp = 900 // (626.85'C)
+ mix_message = "The room grows warm as burning rock rockets over the edge of the drink before settling."
+ mix_sound = 'sound/effects/wounds/sizzle2.ogg'
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
index 5161ff349e..e0eaf35353 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_bread.dm
@@ -3,6 +3,15 @@
////////////////////////////////////////////////BREAD////////////////////////////////////////////////
+/datum/crafting_recipe/food/bread
+ name = "Bread"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/breadslice/plain = 5,
+ )
+ tools = list(/obj/item/kitchen/efink)
+ result = /obj/item/reagent_containers/food/snacks/store/bread/plain
+ subcategory = CAT_BREAD
+
/datum/crafting_recipe/food/banananutbread
name = "Banana nut bread"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
index 17ea36a160..2409032760 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_meat.dm
@@ -66,6 +66,16 @@
////////////////////////////////////////////////MISC RECIPE's////////////////////////////////////////////////
+/datum/crafting_recipe/food/meatslab
+ name = "Meat Slab"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/meat/rawcutlet = 3,
+ )
+ tools = list(/obj/item/kitchen/efink)
+ result = /obj/item/reagent_containers/food/snacks/meat/slab
+ subcategory = CAT_MEAT
+
+
/datum/crafting_recipe/food/ribs
name = "BBQ Ribs"
reqs = list(
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
index 93102e1ad0..eaebfbb44e 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_misc.dm
@@ -47,6 +47,24 @@
/////////////////////////////////MISC/////////////////////////////////////
+/datum/crafting_recipe/food/dough
+ name = "Dough"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/doughslice = 3,
+ )
+ tools = list(/obj/item/kitchen/efink)
+ result = /obj/item/reagent_containers/food/snacks/flatdough
+ subcategory = CAT_MISCFOOD
+
+/datum/crafting_recipe/food/Pineapple
+ name = "Pineapple"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/pineappleslice = 3,
+ )
+ tools = list(/obj/item/kitchen/efink)
+ result = /obj/item/reagent_containers/food/snacks/grown/pineapple
+ subcategory = CAT_MISCFOOD
+
/datum/crafting_recipe/food/beans
name = "Beans"
time = 40
diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
index 5343595f89..80f168fe2f 100644
--- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
+++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pastry.dm
@@ -194,6 +194,15 @@
////////////////////////////////////////////OTHER////////////////////////////////////////////
+/datum/crafting_recipe/food/piedough
+ name = "Pie Dough"
+ reqs = list(
+ /obj/item/reagent_containers/food/snacks/rawpastrybase = 3,
+ )
+ tools = list(/obj/item/kitchen/efink)
+ result = /obj/item/reagent_containers/food/snacks/piedough
+ subcategory = CAT_PASTRY
+
/datum/crafting_recipe/food/chococornet
name = "Choco cornet"
reqs = list(
diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm
index fff971c953..f780d889ea 100644
--- a/code/modules/mining/equipment/survival_pod.dm
+++ b/code/modules/mining/equipment/survival_pod.dm
@@ -8,6 +8,10 @@
area_flags = BLOBS_ALLOWED | UNIQUE_AREA
flags_1 = CAN_BE_DIRTY_1
+/area/survivalpod/nonpowered
+ name = "\proper Emergency Shelter"
+ requires_power = TRUE
+
//Survival Capsule
/obj/item/survivalcapsule
name = "bluespace shelter capsule"
@@ -81,6 +85,10 @@
desc = "A luxury bar in a capsule. Bartender required and not included."
template_id = "shelter_charlie"
+/obj/item/survivalcapsule/luxury/empty
+ name = "large empty capsule"
+ desc = "An extremly large capsule which requires power. Useful for projects all over."
+ template_id = "shelter_delta"
//Pod objects
//Window
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 48e8a4c338..acceb331ab 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -994,7 +994,6 @@
H.dna.features["wings"] = "None"
H.dna.features["frills"] = "None"
H.dna.features["spines"] = "Long"
- H.dna.features["body_markings"] = "Dark Tiger Body"
H.dna.features["legs"] = "Digitigrade"
H.dna.features["taur_body"] = "None"
H.left_eye_color = "fee5a3"
diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm
index ec6a430c0c..8a7c3a81bd 100644
--- a/code/modules/mining/machine_vending.dm
+++ b/code/modules/mining/machine_vending.dm
@@ -56,6 +56,7 @@
new /datum/data/mining_equipment("Ice hiking boots", /obj/item/clothing/shoes/winterboots/ice_boots, 2500),
new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000),
new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxury/elitebar, 10000),
+ new /datum/data/mining_equipment("Empty Capsule", /obj/item/survivalcapsule/luxury/empty, 5000),
new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800),
new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400),
new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400),
diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm
index 2481634e5f..6bd04ffd6d 100644
--- a/code/modules/mining/shelters.dm
+++ b/code/modules/mining/shelters.dm
@@ -73,3 +73,15 @@
. = ..()
whitelisted_turfs = typecacheof(/turf/closed/mineral)
banned_objects = typecacheof(/obj/structure/stone_tile)
+
+/datum/map_template/shelter/delta
+ name = "Shelter Delta"
+ shelter_id = "shelter_delta"
+ description = "A massive but barebones survival capsule useful\
+ for projects that require great deals of space."
+ mappath = "_maps/templates/shelter_4.dmm"
+
+/datum/map_template/shelter/delta/New()
+ . = ..()
+ whitelisted_turfs = typecacheof(/turf/closed/mineral)
+ banned_objects = typecacheof(/obj/structure/stone_tile)
diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm
index d198140c5f..a9233938ab 100644
--- a/code/modules/mob/dead/new_player/preferences_setup.dm
+++ b/code/modules/mob/dead/new_player/preferences_setup.dm
@@ -54,6 +54,8 @@
mannequin.job = previewJob.title
previewJob.equip(mannequin, TRUE, preference_source = parent)
+ mannequin.regenerate_icons()
+
COMPILE_OVERLAYS(mannequin)
parent.show_character_previews(new /mutable_appearance(mannequin))
unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES)
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm
index f58788d9af..016b12d8ec 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/Citadel_Snowflake.dm
@@ -12,6 +12,7 @@
name = "DataShark"
icon_state = "datashark"
ckeys_allowed = list("rubyflamewing")
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
//Sabresune
/datum/sprite_accessory/ears/mam_ears/sabresune
@@ -39,6 +40,7 @@
name = "Sabresune"
icon_state = "sabresune"
ckeys_allowed = list("poojawa")
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
//Lunasune
/datum/sprite_accessory/ears/mam_ears/lunasune
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
index bc6c4899dd..148af35247 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/body_markings.dm
@@ -1,39 +1,3 @@
-/******************************************
-************* Lizard Markings *************
-*******************************************/
-
-/datum/sprite_accessory/body_markings
- icon = 'icons/mob/mutant_bodyparts.dmi'
- relevant_layers = list(BODY_ADJ_LAYER)
- mutant_part_string = "body_markings"
-
-/datum/sprite_accessory/body_markings/none
- name = "None"
- icon_state = "none"
- relevant_layers = null
-
-/datum/sprite_accessory/body_markings/dtiger
- name = "Dark Tiger Body"
- icon_state = "dtiger"
- gender_specific = 1
-
-/datum/sprite_accessory/body_markings/guilmon
- name = "Guilmon"
- icon_state = "guilmon"
- color_src = MATRIXED
- icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
- matrixed_sections = MATRIX_ALL
-
-/datum/sprite_accessory/body_markings/ltiger
- name = "Light Tiger Body"
- icon_state = "ltiger"
- gender_specific = 1
-
-/datum/sprite_accessory/body_markings/lbelly
- name = "Light Belly"
- icon_state = "lbelly"
- gender_specific = 1
-
/******************************************
************ Furry Markings ***************
*******************************************/
@@ -49,7 +13,8 @@
gender_specific = 0
icon = 'modular_citadel/icons/mob/mam_markings.dmi'
recommended_species = list("mammal", "xeno", "slimeperson", "podweak")
- matrixed_sections = MATRIX_ALL
+ matrixed_sections = MATRIX_ALL // this value is used if there is no value in covered_limbs, don't rely on it, it's a backup value
+ var/list/covered_limbs = list("Head", "Chest", "Left Leg", "Right Leg", "Left Arm", "Right Arm")
/datum/sprite_accessory/mam_body_markings/none
name = "None"
@@ -62,87 +27,107 @@
/datum/sprite_accessory/mam_body_markings/redpanda
name = "Redpanda"
icon_state = "redpanda"
+ covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/bat
name = "Bat"
icon_state = "bat"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/bee
name = "Bee"
icon_state = "bee"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/belly
name = "Belly"
icon_state = "belly"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/bellyslim
name = "Bellyslim"
icon_state = "bellyslim"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/cow
name = "Bovine"
icon_state = "bovine"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/corgi
name = "Corgi"
icon_state = "corgi"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/corvid
name = "Corvid"
icon_state = "corvid"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/dalmation
name = "Dalmation"
icon_state = "dalmation"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/deer
name = "Deer"
icon_state = "deer"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/dog
name = "Dog"
icon_state = "dog"
+ covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_GREEN_BLUE, "Right Leg" = MATRIX_GREEN_BLUE, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL)
/datum/sprite_accessory/mam_body_markings/eevee
name = "Eevee"
icon_state = "eevee"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/fennec
name = "Fennec"
icon_state = "Fennec"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/fox
name = "Fox"
icon_state = "fox"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
/datum/sprite_accessory/mam_body_markings/frog
name = "Frog"
icon_state = "frog"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/goat
name = "Goat"
icon_state = "goat"
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
/datum/sprite_accessory/mam_body_markings/handsfeet
name = "Handsfeet"
icon_state = "handsfeet"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/hawk
name = "Hawk"
icon_state = "hawk"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/husky
name = "Husky"
icon_state = "husky"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/hyena
name = "Hyena"
icon_state = "hyena"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/insect
name = "Insect"
@@ -152,78 +137,118 @@
/datum/sprite_accessory/mam_body_markings/lab
name = "Lab"
icon_state = "lab"
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/orca
name = "Orca"
icon_state = "orca"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/otie
name = "Otie"
icon_state = "otie"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_ALL, "Right Arm" = MATRIX_ALL)
/datum/sprite_accessory/mam_body_markings/otter
name = "Otter"
icon_state = "otter"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/panther
name = "Panther"
icon_state = "panther"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/plain
name = "Plain"
icon_state = "plain"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/possum
name = "Possum"
icon_state = "possum"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
/datum/sprite_accessory/mam_body_markings/raccoon
name = "Raccoon"
icon_state = "raccoon"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/sergal
name = "Sergal"
icon_state = "sergal"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/pede
name = "Scolipede"
icon_state = "scolipede"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_GREEN, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/shark
name = "Shark"
icon_state = "shark"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED_GREEN, "Right Arm" = MATRIX_RED_GREEN)
/datum/sprite_accessory/mam_body_markings/shepherd
name = "Shepherd"
icon_state = "shepherd"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/skunk
name = "Skunk"
icon_state = "skunk"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED_GREEN, "Right Leg" = MATRIX_RED_GREEN, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/tajaran
name = "Tajaran"
icon_state = "tajaran"
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED_GREEN, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/tiger
name = "Tiger"
icon_state = "tiger"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_ALL, "Right Leg" = MATRIX_ALL, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
/datum/sprite_accessory/mam_body_markings/turian
name = "Turian"
icon_state = "turian"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED_GREEN, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/datum/sprite_accessory/mam_body_markings/wolf
name = "Wolf"
icon_state = "wolf"
+ covered_limbs = list("Head" = MATRIX_ALL, "Chest" = MATRIX_ALL, "Left Leg" = MATRIX_RED_BLUE, "Right Leg" = MATRIX_RED_BLUE, "Left Arm" = MATRIX_RED_BLUE, "Right Arm" = MATRIX_RED_BLUE)
/datum/sprite_accessory/mam_body_markings/xeno
name = "Xeno"
icon_state = "xeno"
icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_BLUE, "Chest" = MATRIX_GREEN, "Left Leg" = MATRIX_GREEN, "Right Leg" = MATRIX_GREEN, "Left Arm" = MATRIX_GREEN, "Right Arm" = MATRIX_GREEN)
+
+// sticking old lizard markings here for now
+/datum/sprite_accessory/mam_body_markings/dtiger
+ name = "Dark Tiger Body"
+ icon_state = "dtiger"
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
+
+/datum/sprite_accessory/mam_body_markings/guilmon
+ name = "Guilmon"
+ icon_state = "guilmon"
+ icon = 'modular_citadel/icons/mob/markings_notmammals.dmi'
+ covered_limbs = list("Head" = MATRIX_RED_BLUE, "Chest" = MATRIX_GREEN_BLUE, "Left Leg" = MATRIX_BLUE, "Right Leg" = MATRIX_BLUE, "Left Arm" = MATRIX_GREEN_BLUE, "Right Arm" = MATRIX_GREEN_BLUE)
+
+/datum/sprite_accessory/mam_body_markings/ltiger
+ name = "Light Tiger Body"
+ icon_state = "ltiger"
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
+
+/datum/sprite_accessory/mam_body_markings/lbelly
+ name = "Light Belly"
+ icon_state = "lbelly"
+ covered_limbs = list("Head" = MATRIX_RED, "Chest" = MATRIX_RED, "Left Leg" = MATRIX_RED, "Right Leg" = MATRIX_RED, "Left Arm" = MATRIX_RED, "Right Arm" = MATRIX_RED)
/******************************************
************* Insect Markings *************
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
index 8fb735e10a..b8fab56159 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/ears.dm
@@ -162,12 +162,19 @@
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
/datum/sprite_accessory/ears/human/rabbit
- name = "Rabbit"
+ name = "Rabbit (Lop-eared)"
icon_state = "rabbit"
color_src = MATRIXED
matrixed_sections = MATRIX_RED_GREEN
icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+/datum/sprite_accessory/ears/human/rabbitalt
+ name = "Rabbit (Straight-eared)"
+ icon_state = "rabbitalt"
+ color_src = MATRIXED
+ matrixed_sections = MATRIX_ALL
+ icon = 'modular_citadel/icons/mob/mam_ears.dmi'
+
/datum/sprite_accessory/ears/human/pede
name = "Scolipede"
icon_state = "pede"
@@ -296,7 +303,7 @@
/datum/sprite_accessory/ears/mam_ears/deer
name = "Deer"
icon_state = "deer"
- color_src = MUTCOLORS3
+ matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/eevee
name = "Eevee"
@@ -359,10 +366,15 @@
matrixed_sections = MATRIX_RED_GREEN
/datum/sprite_accessory/ears/mam_ears/rabbit
- name = "Rabbit"
+ name = "Rabbit (Lop-eared)"
icon_state = "rabbit"
matrixed_sections = MATRIX_RED_GREEN
+/datum/sprite_accessory/ears/mam_ears/rabbitalt
+ name = "Rabbit (Straight-eared)"
+ icon_state = "rabbitalt"
+ matrixed_sections = MATRIX_ALL
+
/datum/sprite_accessory/ears/mam_ears/pede
name = "Scolipede"
icon_state = "pede"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
index a4bd0afdcb..88dda923a0 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/hair_head.dm
@@ -17,6 +17,10 @@
name = "Adhara"
icon_state = "hair_adhara"
+/datum/sprite_accessory/hair/africanpigtails
+ name = "African Pig Tails"
+ icon_state = "hair_africanpigtails"
+
/datum/sprite_accessory/hair/afro
name = "Afro"
icon_state = "hair_afro"
@@ -25,10 +29,26 @@
name = "Afro 2"
icon_state = "hair_afro2"
+/datum/sprite_accessory/hair/afro2alt
+ name = "Afro 2 (Alt)"
+ icon_state = "hair_afro2alt"
+
/datum/sprite_accessory/hair/afro_large
name = "Afro (Large)"
icon_state = "hair_bigafro"
+/datum/sprite_accessory/hair/afropuffdouble
+ name = "Afropuff (Double)"
+ icon_state = "hair_afropuffdouble"
+
+/datum/sprite_accessory/hair/afropuffleft
+ name = "Afropuff (Left)"
+ icon_state = "hair_afropuffleft"
+
+/datum/sprite_accessory/hair/afropuffright
+ name = "Afropuff (Right)"
+ icon_state = "hair_afropuffright"
+
/datum/sprite_accessory/hair/antenna
name = "Ahoge"
icon_state = "hair_antenna"
@@ -41,10 +61,18 @@
name = "Anita"
icon_state = "hair_anita"
+/datum/sprite_accessory/hair/astolfo
+ name = "Astolfo"
+ icon_state = "hair_astolfo"
+
/datum/sprite_accessory/hair/balding
name = "Balding Hair"
icon_state = "hair_e"
+/datum/sprite_accessory/hair/baum
+ name = "Baum"
+ icon_state = "hair_baum"
+
/datum/sprite_accessory/hair/bedhead
name = "Bedhead"
icon_state = "hair_bedhead"
@@ -85,6 +113,14 @@
name = "Belle"
icon_state = "hair_belle"
+/datum/sprite_accessory/hair/bluntbangs
+ name = "Bluntbangs"
+ icon_state = "hair_bluntbangs"
+
+/datum/sprite_accessory/hair/bluntbangsalt
+ name = "Bluntbangs (Alt)"
+ icon_state = "hair_bluntbangsalt"
+
/datum/sprite_accessory/hair/bob
name = "Bob Hair"
icon_state = "hair_bob"
@@ -109,6 +145,10 @@
name = "Bobcut (Alt)"
icon_state = "hair_bobcutalt"
+/datum/sprite_accessory/hair/bobcutalt2
+ name = "Bobcut (Alt) 2"
+ icon_state = "hair_bobcutalt2"
+
/datum/sprite_accessory/hair/boddicker
name = "Boddicker"
icon_state = "hair_boddicker"
@@ -205,6 +245,14 @@
name = "CIA"
icon_state = "hair_cia"
+/datum/sprite_accessory/hair/combedback
+ name = "Combed Back"
+ icon_state = "hair_combedback"
+
+/datum/sprite_accessory/hair/combedbob
+ name = "Combed Bob"
+ icon_state = "hair_combedbob"
+
/datum/sprite_accessory/hair/combover
name = "Combover"
icon_state = "hair_combover"
@@ -233,6 +281,14 @@
name = "Cornrow Tail"
icon_state = "hair_cornrowtail"
+/datum/sprite_accessory/hair/cotton
+ name = "Cotton"
+ icon_state = "hair_cotton"
+
+/datum/sprite_accessory/hair/cottonalt
+ name = "Cotton (Alt)"
+ icon_state = "hair_cottonalt"
+
/datum/sprite_accessory/hair/country
name = "Country"
icon_state = "hair_country"
@@ -261,6 +317,10 @@
name = "Devil Lock"
icon_state = "hair_devillock"
+/datum/sprite_accessory/hair/diagonalbangs
+ name = "Diagonal Bangs"
+ icon_state = "hair_diagonalbangs"
+
/datum/sprite_accessory/hair/dreadlocks
name = "Dreadlocks"
icon_state = "hair_dreads"
@@ -337,10 +397,22 @@
name = "Fluffy"
icon_state = "hair_fluffy"
+/datum/sprite_accessory/hair/fortuneteller
+ name = "Fortune Teller"
+ icon_state = "hair_fortuneteller"
+
/datum/sprite_accessory/hair/fringetail
name = "Fringe Tail"
icon_state = "hair_fringetail"
+/datum/sprite_accessory/hair/froofy
+ name = "Froofy"
+ icon_state = "hair_froofy"
+
+/datum/sprite_accessory/hair/geisha
+ name = "Geisha"
+ icon_state = "hair_geisha"
+
/datum/sprite_accessory/hair/gelled
name = "Gelled Back"
icon_state = "hair_gelled"
@@ -349,6 +421,26 @@
name = "Gentle"
icon_state = "hair_gentle"
+/datum/sprite_accessory/hair/glammetal
+ name = "Glam Metal"
+ icon_state = "hair_glammetal"
+
+/datum/sprite_accessory/hair/gloomy
+ name = "Gloomy"
+ icon_state = "hair_gloomy"
+
+/datum/sprite_accessory/hair/gloomylong
+ name = "Gloomy (Long)"
+ icon_state = "hair_gloomylong"
+
+/datum/sprite_accessory/hair/hajime
+ name = "Hajime"
+ icon_state = "hair_hajime"
+
+/datum/sprite_accessory/hair/hajimealt
+ name = "Hajime (Alt)"
+ icon_state = "hair_hajimealt"
+
/datum/sprite_accessory/hair/halfbang
name = "Half-banged Hair"
icon_state = "hair_halfbang"
@@ -365,6 +457,10 @@
name = "Half-shaved Hair"
icon_state = "hair_halfshaved"
+/datum/sprite_accessory/hair/harold
+ name = "Harold"
+ icon_state = "hair_harold"
+
/datum/sprite_accessory/hair/hedgehog
name = "Hedgehog Hair"
icon_state = "hair_hedgehog"
@@ -393,6 +489,10 @@
name = "Hitop"
icon_state = "hair_hitop"
+/datum/sprite_accessory/hair/inari
+ name = "Inari"
+ icon_state = "hair_inari"
+
/datum/sprite_accessory/hair/inkling
name = "Inkling"
icon_state = "hair_inkling"
@@ -421,14 +521,18 @@
name = "Keanu"
icon_state = "hair_keanu"
-/datum/sprite_accessory/hair/kusangi
- name = "Kusanagi"
- icon_state = "hair_kusanagi"
+/datum/sprite_accessory/hair/kisaragi
+ name = "Kisaragi"
+ icon_state = "hair_kisaragi"
/datum/sprite_accessory/hair/kleeia
name = "Kleeia"
icon_state = "hair_kleeia"
+/datum/sprite_accessory/hair/kusangi
+ name = "Kusanagi"
+ icon_state = "hair_kusanagi"
+
/datum/sprite_accessory/hair/long
name = "Long Hair 1"
icon_state = "hair_long"
@@ -449,6 +553,10 @@
name = "Long Over Eye"
icon_state = "hair_longovereye"
+/datum/sprite_accessory/hair/long_over_eyealt
+ name = "Long Over Eye (Alt)"
+ icon_state = "hair_longovereyealt"
+
/datum/sprite_accessory/hair/longbangs
name = "Long Bangs"
icon_state = "hair_lbangs"
@@ -489,10 +597,6 @@
name = "Mohawk"
icon_state = "hair_d"
-/datum/sprite_accessory/hair/newyou
- name = "New You"
- icon_state = "hair_newyou"
-
/datum/sprite_accessory/hair/reversemohawk
name = "Mohawk (Reverse)"
icon_state = "hair_reversemohawk"
@@ -509,6 +613,10 @@
name = "Mulder"
icon_state = "hair_mulder"
+/datum/sprite_accessory/hair/newyou
+ name = "New You"
+ icon_state = "hair_newyou"
+
/datum/sprite_accessory/hair/nia
name = "Nia"
icon_state = "hair_nia"
@@ -579,10 +687,18 @@
name = "Pompadour (Big)"
icon_state = "hair_bigpompadour"
+/datum/sprite_accessory/hair/bigpompadouralt
+ name = "Pompadour (Big) (Alt)"
+ icon_state = "hair_bigpompadouralt"
+
/datum/sprite_accessory/hair/ponytail1
name = "Ponytail"
icon_state = "hair_ponytail"
+/datum/sprite_accessory/hair/ponytail1alt
+ name = "Ponytail (Alt)"
+ icon_state = "hair_ponytailalt"
+
/datum/sprite_accessory/hair/ponytail2
name = "Ponytail 2"
icon_state = "hair_ponytail2"
@@ -591,14 +707,26 @@
name = "Ponytail 3"
icon_state = "hair_ponytail3"
+/datum/sprite_accessory/hair/ponytail3alt
+ name = "Ponytail 3 (Alt)"
+ icon_state = "hair_ponytail3alt"
+
/datum/sprite_accessory/hair/ponytail4
name = "Ponytail 4"
icon_state = "hair_ponytail4"
+/datum/sprite_accessory/hair/ponytail4alt
+ name = "Ponytail 4 (Alt)"
+ icon_state = "hair_ponytail4alt"
+
/datum/sprite_accessory/hair/ponytail5
name = "Ponytail 5"
icon_state = "hair_ponytail5"
+/datum/sprite_accessory/hair/ponytail6
+ name = "Ponytail 6"
+ icon_state = "hair_ponytail6"
+
/datum/sprite_accessory/hair/highponytail
name = "Ponytail (High)"
icon_state = "hair_highponytail"
@@ -623,6 +751,10 @@
name = "Ponytail (Side) 4"
icon_state = "hair_sidetail4"
+/datum/sprite_accessory/hair/sidetail5
+ name = "Ponytail (Side) 5"
+ icon_state = "hair_sidetail5"
+
/datum/sprite_accessory/hair/sharptail
name = "Ponytail (Sharp)"
icon_state = "hair_sharptail"
@@ -639,10 +771,18 @@
name = "Poofy 2"
icon_state = "hair_poofy2"
+/datum/sprite_accessory/hair/quadcurls
+ name = "Quad Curls"
+ icon_state = "hair_quadcurls"
+
/datum/sprite_accessory/hair/quiff
name = "Quiff"
icon_state = "hair_quiff"
+/datum/sprite_accessory/hair/rockstar
+ name = "Rockstar"
+ icon_state = "hair_rockstar"
+
/datum/sprite_accessory/hair/ronin
name = "Ronin"
icon_state = "hair_ronin"
@@ -759,6 +899,10 @@
name = "Slightly Long Hair"
icon_state = "hair_protagonist"
+/datum/sprite_accessory/hair/slightlymessy
+ name = "Slightly Messy Hair"
+ icon_state = "hair_slightlymessy"
+
/datum/sprite_accessory/hair/spiky
name = "Spiky"
icon_state = "hair_spikey"
@@ -771,6 +915,26 @@
name = "Spiky 3"
icon_state = "hair_spiky2"
+/datum/sprite_accessory/hair/slimedroplet
+ name = "Slime Droplet"
+ icon_state = "hair_slimedroplet"
+
+/datum/sprite_accessory/hair/slimedropletalt
+ name = "Slime Droplet (Alt)"
+ icon_state = "hair_slimedropletalt"
+
+/datum/sprite_accessory/hair/slimespikes
+ name = "Slime Spikes"
+ icon_state = "hair_slimespikes"
+
+/datum/sprite_accessory/hair/slimetendrils
+ name = "Slime Tendrils"
+ icon_state = "hair_slimetendrils"
+
+/datum/sprite_accessory/hair/slimetendrilsalt
+ name = "Slime Tendrils (Alt)"
+ icon_state = "hair_slimetendrilsalt"
+
/datum/sprite_accessory/hair/supernova
name = "Supernova"
icon_state = "hair_supernova"
@@ -851,6 +1015,10 @@
name = "Very Long Hair 2"
icon_state = "hair_longest"
+/datum/sprite_accessory/hair/longestalt
+ name = "Very Long Hair 2 (Alt)"
+ icon_state = "hair_longestalt"
+
/datum/sprite_accessory/hair/longest2
name = "Very Long Over Eye"
icon_state = "hair_longest2"
@@ -886,3 +1054,7 @@
/datum/sprite_accessory/hair/ziegler
name = "Ziegler"
icon_state = "hair_ziegler"
+
+/datum/sprite_accessory/hair/zone
+ name = "Zone"
+ icon_state = "hair_zone"
diff --git a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
index bc4d4dd00d..c7cd699ec9 100644
--- a/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
+++ b/code/modules/mob/dead/new_player/sprite_accessories/synthliz.dm
@@ -32,20 +32,20 @@
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Pecs"
icon_state = "synthlizpecs"
- matrixed_sections = MATRIX_GREEN
+ covered_limbs = list("Chest" = MATRIX_GREEN)
/datum/sprite_accessory/mam_body_markings/synthliz/synthliz_pecslight
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Pecs Light"
icon_state = "synthlizpecslight"
- matrixed_sections = MATRIX_GREEN_BLUE
+ covered_limbs = list("Chest" = MATRIX_GREEN_BLUE)
/datum/sprite_accessory/mam_body_markings/synthliz
recommended_species = list("synthliz")
icon = 'modular_citadel/icons/mob/synthliz_body_markings.dmi'
name = "Synthetic Lizard - Plates"
icon_state = "synthlizscutes"
- matrixed_sections = MATRIX_GREEN
+ covered_limbs = list("Chest" = MATRIX_GREEN)
//Synth tails
/datum/sprite_accessory/tails/mam_tails/synthliz
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 31ab636ceb..aa14fe6013 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -41,10 +41,10 @@
. += "[t_He] [t_is] wearing [w_uniform.get_examine_string(user)][accessory_msg]."
//head
- if(head && !(head.item_flags & EXAMINE_SKIP))
+ if(head && !(head.obj_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [head.get_examine_string(user)] on [t_his] head."
//suit/armor
- if(wear_suit && !(wear_suit.item_flags & EXAMINE_SKIP))
+ if(wear_suit && !(wear_suit.obj_flags & EXAMINE_SKIP))
. += "[t_He] [t_is] wearing [wear_suit.get_examine_string(user)]."
//suit/armor storage
if(s_store && !(SLOT_S_STORE in obscured))
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 1aa3749589..3f456a9b43 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -149,6 +149,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
///
var/sound/attack_sound = 'sound/weapons/punch1.ogg'
var/sound/miss_sound = 'sound/weapons/punchmiss.ogg'
+ var/attack_sound_override = null
var/list/mob/living/ignored_by = list() // list of mobs that will ignore this species
//Breathing!
@@ -569,12 +570,10 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
/datum/species/proc/remove_blacklisted_quirks(mob/living/carbon/C)
var/mob/living/L = C.mind?.current
if(istype(L))
- var/list/my_quirks = L.client?.prefs.all_quirks.Copy()
- SSquirks.filter_quirks(my_quirks, blacklisted_quirks)
for(var/q in L.roundstart_quirks)
var/datum/quirk/Q = q
- if(!(SSquirks.quirk_name_by_path(Q.type) in my_quirks))
- L.remove_quirk(Q.type)
+ if(Q.type in blacklisted_quirks)
+ qdel(Q)
removed_quirks += Q.type
// restore any quirks that we removed
@@ -1615,7 +1614,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
var/armor_block = target.run_armor_check(affecting, "melee")
- playsound(target.loc, user.dna.species.attack_sound, 25, 1, -1)
+ playsound(target.loc, user.dna.species.attack_sound_override || attack_sound, 25, 1, -1)
target.visible_message("[user] [atk_verb]ed [target]!", \
"[user] [atk_verb]ed you!", null, COMBAT_MESSAGE_RANGE, null, \
user, "You [atk_verb]ed [target]!")
diff --git a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm
index 328a557931..95cb9cca59 100644
--- a/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm
+++ b/code/modules/mob/living/carbon/human/species_types/anthropomorph.dm
@@ -5,7 +5,7 @@
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE)
inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BEAST
mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "deco_wings" = "None",
- "mam_body_markings" = "Husky", "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
+ "mam_body_markings" = list(), "taur" = "None", "horns" = "None", "legs" = "Plantigrade", "meat_type" = "Mammalian")
attack_verb = "claw"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
index cfbb8c31c0..07fa78a88a 100644
--- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm
@@ -11,7 +11,7 @@
coldmod = 1.5
heatmod = 0.67
mutant_bodyparts = list("mcolor" = "0F0", "mcolor2" = "0F0", "mcolor3" = "0F0", "tail_lizard" = "Smooth", "mam_snouts" = "Round",
- "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None",
+ "horns" = "None", "frills" = "None", "spines" = "None", "mam_body_markings" = list(),
"legs" = "Digitigrade", "taur" = "None", "deco_wings" = "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
index 0fcafaa208..ed0fa9ae87 100644
--- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm
+++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm
@@ -74,7 +74,7 @@
name = "Anthropomorphic Plant"
id = SPECIES_POD_WEAK
species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS,CAN_SCAR,HAS_FLESH,HAS_BONE)
- mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = "Husky", "taur" = "None", "legs" = "Normal Legs")
+ mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_snouts" = "Husky", "mam_tail" = "Husky", "mam_ears" = "Husky", "mam_body_markings" = list(), "taur" = "None", "legs" = "Normal Legs")
limbs_id = SPECIES_POD
light_nutrition_gain_factor = 3
light_bruteheal = -0.2
diff --git a/code/modules/mob/living/carbon/human/species_types/xeno.dm b/code/modules/mob/living/carbon/human/species_types/xeno.dm
index 9d5a700417..e9d9aa2d5b 100644
--- a/code/modules/mob/living/carbon/human/species_types/xeno.dm
+++ b/code/modules/mob/living/carbon/human/species_types/xeno.dm
@@ -5,7 +5,7 @@
say_mod = "hisses"
default_color = "00FF00"
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,CAN_SCAR,HAS_FLESH,HAS_BONE)
- mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = "Xeno","mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None")
+ mutant_bodyparts = list("xenotail"="Xenomorph Tail","xenohead"="Standard","xenodorsal"="Standard", "mam_body_markings" = list(),"mcolor" = "0F0","mcolor2" = "0F0","mcolor3" = "0F0","taur" = "None", "legs" = "Digitigrade","deco_wings"= "None")
attack_verb = "slash"
attack_sound = 'sound/weapons/slash.ogg'
miss_sound = 'sound/weapons/slashmiss.ogg'
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index 5f77d25eae..f18d768df3 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -729,11 +729,8 @@ use_mob_overlay_icon: if FALSE, it will always use the default_icon_file even if
. += "-[BP.digitigrade_type]"
if(BP.dmg_overlay_type)
. += "-[BP.dmg_overlay_type]"
- if(BP.body_markings)
- . += "-[BP.body_markings]"
- if(length(BP.markings_color) && length(BP.markings_color[1]))
- for(var/color in BP.markings_color[1])
- . += "-[color]"
+ if(BP.body_markings_list)
+ . += "-[safe_json_encode(BP.body_markings_list)]"
if(BP.icon)
. += "-[BP.icon]"
else
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6aaa2cca87..ae716efc71 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -542,8 +542,48 @@
update_stat()
med_hud_set_health()
med_hud_set_status()
+ update_health_hud()
-//proc used to ressuscitate a mob
+/mob/living/update_health_hud()
+ var/severity = 0
+ var/healthpercent = (health/maxHealth) * 100
+ if(hud_used?.healthdoll) //to really put you in the boots of a simplemob
+ var/obj/screen/healthdoll/living/livingdoll = hud_used.healthdoll
+ switch(healthpercent)
+ if(100 to INFINITY)
+ livingdoll.icon_state = "living0"
+ if(80 to 100)
+ livingdoll.icon_state = "living1"
+ severity = 1
+ if(60 to 80)
+ livingdoll.icon_state = "living2"
+ severity = 2
+ if(40 to 60)
+ livingdoll.icon_state = "living3"
+ severity = 3
+ if(20 to 40)
+ livingdoll.icon_state = "living4"
+ severity = 4
+ if(1 to 20)
+ livingdoll.icon_state = "living5"
+ severity = 5
+ else
+ livingdoll.icon_state = "living6"
+ severity = 6
+ if(!livingdoll.filtered)
+ livingdoll.filtered = TRUE
+ var/icon/mob_mask = icon(icon, icon_state)
+ if(mob_mask.Height() > world.icon_size || mob_mask.Width() > world.icon_size)
+ var/health_doll_icon_state = health_doll_icon ? health_doll_icon : "megasprite"
+ mob_mask = icon('icons/mob/screen_gen.dmi', health_doll_icon_state) //swap to something generic if they have no special doll
+ UNLINT(livingdoll.filters += filter(type="alpha", icon = mob_mask))
+ livingdoll.filters += filter(type="drop_shadow", size = -1)
+ if(severity > 0)
+ overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity)
+ else
+ clear_fullscreen("brute")
+
+//Proc used to resuscitate a mob, for full_heal see fully_heal()
/mob/living/proc/revive(full_heal = FALSE, admin_revive = FALSE)
SEND_SIGNAL(src, COMSIG_LIVING_REVIVE, full_heal, admin_revive)
if(full_heal)
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 386f1174e1..f5919f389c 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -94,6 +94,7 @@
var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
var/bubble_icon = "default" //what icon the mob uses for speechbubbles
+ var/health_doll_icon //if this exists AND the normal sprite is bigger than 32x32, this is the replacement icon state (because health doll size limitations). the icon will always be screen_gen.dmi
var/last_bumped = 0
var/unique_name = 0 //if a mob's name should be appended with an id when created e.g. Mob (666)
diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm
index c0a4822b6d..57ddbe6290 100644
--- a/code/modules/mob/living/simple_animal/hostile/alien.dm
+++ b/code/modules/mob/living/simple_animal/hostile/alien.dm
@@ -149,6 +149,7 @@
icon_state = "alienq"
icon_living = "alienq"
icon_dead = "alienq_dead"
+ health_doll_icon = "alienq"
bubble_icon = "alienroyal"
move_to_delay = 4
maxHealth = 400
diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm
index 51a646f668..8388d6501a 100644
--- a/code/modules/mob/living/simple_animal/hostile/carp.dm
+++ b/code/modules/mob/living/simple_animal/hostile/carp.dm
@@ -73,6 +73,7 @@
icon_living = "megacarp"
icon_dead = "megacarp_dead"
icon_gib = "megacarp_gib"
+ health_doll_icon = "megacarp"
regen_amount = 6
maxHealth = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
index ec0b7acd07..67cecd3832 100644
--- a/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
+++ b/code/modules/mob/living/simple_animal/hostile/gorilla/gorilla.dm
@@ -9,6 +9,7 @@
icon_state = "crawling"
icon_living = "crawling"
icon_dead = "dead"
+ health_doll_icon = "crawling"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
speak_chance = 80
maxHealth = 220
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
index 61f1fe0c9d..a60c5504e6 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm
@@ -28,6 +28,7 @@ Difficulty: Medium
icon_state = "miner"
icon_living = "miner"
icon = 'icons/mob/broadMobs.dmi'
+ health_doll_icon = "miner"
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
light_color = "#E4C7C5"
movement_type = GROUND
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index b1441ce55f..b80e6cc72f 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -33,6 +33,7 @@ Difficulty: Hard
icon_state = "bubblegum"
icon_living = "bubblegum"
icon_dead = ""
+ health_doll_icon = "bubblegum"
friendly_verb_continuous = "stares down"
friendly_verb_simple = "stare down"
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
@@ -134,7 +135,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/grant_achievement(medaltype,scoretype)
. = ..()
if(.)
- SSshuttle.shuttle_purchase_requirements_met |= "bubblegum"
+ SSshuttle.shuttle_purchase_requirements_met["bubblegum"] = TRUE
/mob/living/simple_animal/hostile/megafauna/bubblegum/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect)
if(!charging)
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
index 787c15a5b4..5751512b19 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm
@@ -32,6 +32,7 @@ Difficulty: Very Hard
icon_state = "eva"
icon_living = "eva"
icon_dead = "dragon_dead"
+ health_doll_icon = "eva"
friendly_verb_continuous = "stares down"
friendly_verb_simple = "stare down"
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
index 6c1e9eef6e..a3d51744b9 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm
@@ -48,6 +48,7 @@ Difficulty: Medium
icon_state = "dragon"
icon_living = "dragon"
icon_dead = "dragon_dead"
+ health_doll_icon = "dragon"
friendly_verb_continuous = "stares down"
friendly_verb_simple = "stare down"
speak_emote = list("roars")
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index 32300dea18..14b71b3bac 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -44,6 +44,7 @@ Difficulty: Normal
attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "hierophant"
icon_living = "hierophant"
+ health_doll_icon = "hierophant"
friendly_verb_continuous = "stares down"
friendly_verb_simple = "stare down"
icon = 'icons/mob/lavaland/hierophant_new.dmi'
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
index 07c1957da2..15bfe2b7f7 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/legion.dm
@@ -26,6 +26,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza
spacewalk = TRUE
icon_state = "mega_legion"
icon_living = "mega_legion"
+ health_doll_icon = "mega_legion"
desc = "One of many."
icon = 'icons/mob/lavaland/96x96megafauna.dmi'
attack_verb_continuous = "chomps"
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
index bda898ef17..f2ece50af2 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm
@@ -75,6 +75,7 @@
icon_living = "watcher"
icon_aggro = "watcher"
icon_dead = "watcher_dead"
+ health_doll_icon = "watcher"
pixel_x = -10
throw_message = "bounces harmlessly off of"
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
index ef51dc572f..5ee249c767 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/goliath_broodmother.dm
@@ -25,6 +25,7 @@
icon_aggro = "broodmother"
icon_dead = "egg_sac"
icon_gib = "syndicate_gib"
+ health_doll_icon = "broodmother"
maxHealth = 800
health = 800
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
index 032bc2d60d..4425bce532 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/herald.dm
@@ -24,6 +24,7 @@
icon_aggro = "herald"
icon_dead = "herald_dying"
icon_gib = "syndicate_gib"
+ health_doll_icon = "herald"
maxHealth = 800
health = 800
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
index 6c13bb903e..dca508cfeb 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/legionnaire.dm
@@ -24,6 +24,7 @@
icon_aggro = "legionnaire"
icon_dead = "legionnaire_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "legionnaire"
maxHealth = 800
health = 800
melee_damage_lower = 30
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
index e3a5d5f762..50b15933a9 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm
@@ -24,6 +24,7 @@
icon_aggro = "pandora"
icon_dead = "pandora_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "pandora"
maxHealth = 800
health = 800
melee_damage_lower = 15
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
index 446fe80c7d..7db91b50ad 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord.dm
@@ -253,6 +253,7 @@
icon_state = "legion"
icon_living = "legion"
icon_dead = "legion"
+ health_doll_icon = "legion"
health = 450
maxHealth = 450
melee_damage_lower = 20
diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
index 96418686d3..5750d1ecb9 100644
--- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
+++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm
@@ -6,6 +6,7 @@
icon_living = "clown"
icon_dead = "clown_dead"
icon_gib = "clown_gib"
+ health_doll_icon = "clown" //if >32x32, it will use this generic. for all the huge clown mobs that subtype from this
mob_biotypes = MOB_ORGANIC|MOB_HUMANOID
turns_per_move = 5
response_disarm_continuous = "gently pushes aside"
diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm
index 46a5a8ec68..0e106caf46 100644
--- a/code/modules/mob/living/simple_animal/hostile/tree.dm
+++ b/code/modules/mob/living/simple_animal/hostile/tree.dm
@@ -6,6 +6,7 @@
icon_living = "pine_1"
icon_dead = "pine_1"
icon_gib = "pine_1"
+ health_doll_icon = "pine_1"
gender = NEUTER
speak_chance = 0
turns_per_move = 5
@@ -72,5 +73,6 @@
icon_living = "festivus_pole"
icon_dead = "festivus_pole"
icon_gib = "festivus_pole"
+ health_doll_icon = "festivus_pole"
loot = list(/obj/item/stack/rods)
speak_emote = list("polls")
diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
index bce1a01c8a..f10b184a45 100644
--- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
+++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm
@@ -8,6 +8,7 @@
icon_aggro = "Fugu0"
icon_dead = "Fugu_dead"
icon_gib = "syndicate_gib"
+ health_doll_icon = "Fugu0"
mob_biotypes = MOB_ORGANIC|MOB_BEAST
mouse_opacity = MOUSE_OPACITY_ICON
move_to_delay = 5
diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm
index 5fa6a0c22d..e46c57f245 100644
--- a/code/modules/mob/living/simple_animal/simple_animal.dm
+++ b/code/modules/mob/living/simple_animal/simple_animal.dm
@@ -7,6 +7,7 @@
///How much blud it has for bloodsucking
blood_volume = 550
rad_flags = RAD_NO_CONTAMINATE
+ hud_type = /datum/hud/living/simple_animal
status_flags = CANPUSH
diff --git a/code/modules/photography/camera/camera.dm b/code/modules/photography/camera/camera.dm
index b925c67940..49821e55e0 100644
--- a/code/modules/photography/camera/camera.dm
+++ b/code/modules/photography/camera/camera.dm
@@ -158,12 +158,12 @@
return FALSE
size_x = clamp(size_x, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT)
size_y = clamp(size_y, 0, CAMERA_PICTURE_SIZE_HARD_LIMIT)
- var/list/desc = list("This is a photo of an area of [size_x+1] meters by [size_y+1] meters.")
+ var/list/desc = list("This is a photo of an area of [size_x*2 + 1] meters by [size_y*2 + 1] meters.")
var/ai_user = isAI(user)
var/list/seen
- var/list/viewlist = (user && user.client)? getviewsize(user.client.view) : getviewsize(world.view)
+ var/list/viewlist = user?.client? getviewsize(user.client.view) : getviewsize(world.view)
var/viewr = max(viewlist[1], viewlist[2]) + max(size_x, size_y)
- var/viewc = user.client? user.client.eye : target
+ var/viewc = user?.client? user.client.eye : target
seen = get_hear(viewr, viewc)
var/list/turfs = list()
var/list/mobs = list()
@@ -184,7 +184,7 @@
var/psize_y = (size_y * 2 + 1) * world.icon_size
var/get_icon = camera_get_icon(turfs, target_turf, psize_x, psize_y, clone_area, size_x, size_y, (size_x * 2 + 1), (size_y * 2 + 1))
qdel(clone_area)
- var/icon/temp = icon('icons/effects/96x96.dmi',"")
+ var/icon/temp = icon('icons/effects/camera_image_base.dmi',"")
temp.Blend("#000", ICON_OVERLAY)
temp.Scale(psize_x, psize_y)
temp.Blend(get_icon, ICON_OVERLAY)
diff --git a/code/modules/photography/camera/camera_image_capturing.dm b/code/modules/photography/camera/camera_image_capturing.dm
index 5bd9c108d1..a5a1cbeedc 100644
--- a/code/modules/photography/camera/camera_image_capturing.dm
+++ b/code/modules/photography/camera/camera_image_capturing.dm
@@ -47,7 +47,7 @@
atoms += A
CHECK_TICK
- var/icon/res = icon('icons/effects/96x96.dmi', "")
+ var/icon/res = icon('icons/effects/camera_image_base.dmi', "")
res.Scale(psize_x, psize_y)
var/list/sorted = list()
@@ -64,7 +64,6 @@
var/xcomp = FLOOR(psize_x / 2, 1) - 15
var/ycomp = FLOOR(psize_y / 2, 1) - 15
-
for(var/atom/A in sorted)
var/xo = (A.x - center.x) * world.icon_size + A.pixel_x + xcomp
var/yo = (A.y - center.y) * world.icon_size + A.pixel_y + ycomp
diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
index f53ac7ac40..2882a85b5e 100644
--- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm
@@ -360,6 +360,18 @@ All effects don't start immediately, but rather get worse over time; the rate is
glass_desc = "A fine drink originally made to prevent waste by using the leftovers from winemaking."
pH = 3.5
+/datum/reagent/consumable/ethanol/amaretto
+ name = "Amaretto"
+ description = "A gentle drink that carries a sweet aroma."
+ color = "#E17600"
+ boozepwr = 25
+ taste_description = "fruity and nutty sweetness"
+ glass_icon_state = "amarettoglass"
+ shot_glass_icon_state = "shotglassgold"
+ glass_name = "glass of amaretto"
+ glass_desc = "A sweet and syrupy-looking drink."
+ pH = 3.5
+
/datum/reagent/consumable/ethanol/cognac
name = "Cognac"
description = "A sweet and strongly alcoholic drink, made after numerous distillations and years of maturing. Classy as fornication."
@@ -1790,6 +1802,50 @@ All effects don't start immediately, but rather get worse over time; the rate is
to_chat(L,"You notice [mighty_shield] looks worn again. Weird.")
..()
+/datum/reagent/consumable/ethanol/amaretto_alexander
+ name = "Amaretto Alexander"
+ description = "A weaker version of the Alexander, what it lacks in strength it makes up for in flavor."
+ color = "#DBD5AE"
+ boozepwr = 35
+ quality = DRINK_VERYGOOD
+ taste_description = "sweet, creamy cacao"
+ glass_icon_state = "alexanderam"
+ glass_name = "Amaretto Alexander"
+ glass_desc = "A creamy, indulgent delight that is in fact as gentle as it seems."
+
+/datum/reagent/consumable/ethanol/ginger_amaretto
+ name = "Ginger Amaretto"
+ description = "A delightfully simple cocktail that pleases the senses."
+ boozepwr = 30
+ color = "#EFB42A"
+ quality = DRINK_GOOD
+ taste_description = "sweetness followed by a soft sourness and warmth"
+ glass_icon_state = "gingeramaretto"
+ glass_name = "Ginger Amaretto"
+ glass_desc = "The sprig of rosemary adds a nice aroma to the drink, and isn't just to be pretentious afterall!"
+
+/datum/reagent/consumable/ethanol/godfather
+ name = "Godfather"
+ description = "A rough cocktail with illegal connections."
+ boozepwr = 50
+ color = "#E68F00"
+ quality = DRINK_GOOD
+ taste_description = "a delightful softened punch"
+ glass_icon_state = "godfather"
+ glass_name = "Godfather"
+ glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth."
+
+/datum/reagent/consumable/ethanol/godmother
+ name = "Godmother"
+ description = "A twist on a classic, liked more by mature women."
+ boozepwr = 50
+ color = "#E68F00"
+ quality = DRINK_GOOD
+ taste_description = "sweetness and a zesty twist"
+ glass_icon_state = "godmother"
+ glass_name = "Godmother"
+ glass_desc = "A lovely fresh-smelling cocktail, a true Sicilian delight."
+
/datum/reagent/consumable/ethanol/sidecar
name = "Sidecar"
description = "The one ride you'll gladly give up the wheel for."
diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
index 574c7c9282..76b016e3de 100644
--- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
+++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm
@@ -13,6 +13,14 @@
build_path = /obj/item/kitchen/knife
category = list("initial","Dinnerware")
+/datum/design/efink
+ name = "E-Fink"
+ id = "efink"
+ build_type = AUTOLATHE | NO_PUBLIC_LATHE
+ materials = list(/datum/material/iron = 12000)
+ build_path = /obj/item/kitchen/efink
+ category = list("initial","Dinnerware")
+
/datum/design/fork
name = "Fork"
id = "fork"
diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm
index d3cf755de2..946dec3f49 100644
--- a/code/modules/research/nanites/nanite_programs.dm
+++ b/code/modules/research/nanites/nanite_programs.dm
@@ -254,14 +254,14 @@
software_error()
/datum/nanite_program/proc/on_shock(shock_damage)
- if(!program_flags & NANITE_SHOCK_IMMUNE)
+ if(!(program_flags & NANITE_SHOCK_IMMUNE))
if(prob(10))
software_error()
else if(prob(33))
self_destruct()
/datum/nanite_program/proc/on_minor_shock()
- if(!program_flags & NANITE_SHOCK_IMMUNE)
+ if(!(program_flags & NANITE_SHOCK_IMMUNE))
if(prob(10))
software_error()
diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm
index 38f53c93a5..168a12a2ef 100644
--- a/code/modules/surgery/bodyparts/_bodyparts.dm
+++ b/code/modules/surgery/bodyparts/_bodyparts.dm
@@ -47,10 +47,11 @@
var/species_color = ""
var/mutation_color = ""
var/no_update = 0
- var/body_markings = "" //for bodypart markings
- var/body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi'
+ var/body_markings = "" //for bodypart markings, deprecated
+ var/list/body_markings_list // stores body markings as lists, with the first value being the name of the bodypart, the second value being the name of the marking, and the third being the colour
+ var/marking_value // combination of old aux_marking and body_marking variables as they were always set together to the same value
+ var/static/default_body_markings_icon = 'modular_citadel/icons/mob/mam_markings.dmi'
var/list/markings_color = list()
- var/aux_marking
var/digitigrade_type
var/animal_origin = null //for nonhuman bodypart (e.g. monkey)
@@ -614,6 +615,7 @@
//we inform the bodypart of the changes that happened to the owner, or give it the informations from a source mob.
/obj/item/bodypart/proc/update_limb(dropping_limb, mob/living/carbon/source)
+ body_markings_list = list()
var/mob/living/carbon/C
if(source)
C = source
@@ -632,8 +634,7 @@
color_src = FALSE
base_bp_icon = DEFAULT_BODYPART_ICON
no_update = TRUE
- body_markings = "husk" // reeee
- aux_marking = "husk"
+ marking_value = "husk"
if(no_update)
return
@@ -649,11 +650,7 @@
//body marking memes
var/list/colorlist = list()
- //var/advanced_color_system = (H.dna.features["color_scheme"] == ADVANCED_CHARACTER_COLORING)
colorlist.Cut()
- //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_primary"]]00") : ReadRGB("[H.dna.features["mcolor"]]00")
- //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_secondary"]]00") : ReadRGB("[H.dna.features["mcolor2"]]00")
- //colorlist += advanced_color_system ? ReadRGB("[H.dna.features["mam_body_markings_tertiary"]]00") : ReadRGB("[H.dna.features["mcolor3"]]00")
colorlist += ReadRGB("[H.dna.features["mcolor"]]00")
colorlist += ReadRGB("[H.dna.features["mcolor2"]]00")
colorlist += ReadRGB("[H.dna.features["mcolor3"]]00")
@@ -688,21 +685,31 @@
else
digitigrade_type = null
- if(S.mutant_bodyparts["mam_body_markings"])
- var/datum/sprite_accessory/Smark
- Smark = GLOB.mam_body_markings_list[H.dna.features["mam_body_markings"]]
- if(Smark)
- body_markings_icon = Smark.icon
- if(H.dna.features["mam_body_markings"] != "None")
- body_markings = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
- aux_marking = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
- else
- body_markings = "plain"
- aux_marking = "plain"
+ if(S.mutant_bodyparts["mam_body_markings"]) // checks if the species can actually have body markings
+ // get all markings for this bodypart type
+ for(var/list/marking in H.dna.features["mam_body_markings"])
+ // marking is a list containing bodypart type, bodymarking name, and then the colour (colour won't be used in v1)
+ if(marking[1] == body_part)
+ var/datum/sprite_accessory/Smark
+ Smark = GLOB.mam_body_markings_list[marking[2]]
+ var/body_markings_icon = default_body_markings_icon
+ if(Smark)
+ body_markings_icon = Smark.icon
+ var/marking_value = "" // combination of body and aux markings from old system
+ if(H.dna.features["mam_body_markings"] != "None")
+ marking_value = Smark?.icon_state || lowertext(H.dna.features["mam_body_markings"])
+ else
+ marking_value = "plain"
+ var/list/color_values
+ if(length(marking) == 3)
+ color_values = marking[3]
+ else
+ color_values = list("#FFFFFF", "#FFFFFF", "#FFFFFF")
+ body_markings_list += list(list(body_markings_icon, marking_value, color_values))
+
markings_color = list(colorlist)
else
- body_markings = null
- aux_marking = null
+ marking_value = null
if(S.override_bp_icon)
base_bp_icon = S.override_bp_icon
@@ -728,8 +735,7 @@
if(is_robotic_limb())
dmg_overlay_type = "robotic"
if(is_robotic_limb(FALSE))
- body_markings = null
- aux_marking = null
+ marking_value = null
if(dropping_limb)
no_update = TRUE //when attached, the limb won't be affected by the appearance changes of its mob owner.
@@ -765,17 +771,18 @@
. += image('icons/mob/dam_mob.dmi', "[dmg_overlay_type]_[body_zone]_0[burnstate]", -DAMAGE_LAYER, image_dir)
if(!isnull(body_markings) && is_organic_limb(FALSE))
- if(!use_digitigrade)
- if(body_zone == BODY_ZONE_CHEST)
- . += image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ for(var/list/marking_list in body_markings_list)
+ // marking stores icon and value for the specific bodypart
+ if(!use_digitigrade)
+ if(body_zone == BODY_ZONE_CHEST)
+ . += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ else
+ . += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)
else
- . += image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
- else
- . += image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir)
var/list/aux = list()
- var/image/marking
var/list/auxmarking = list()
. += limb
@@ -795,6 +802,7 @@
if((body_zone != BODY_ZONE_HEAD && body_zone != BODY_ZONE_CHEST))
should_draw_gender = FALSE
+ var/list/markings_list = list()
if(is_organic_limb())
limb.icon = base_bp_icon || 'icons/mob/human_parts.dmi'
if(should_draw_gender)
@@ -808,21 +816,26 @@
limb.icon_state = "[species_id]_[body_zone]"
// Body markings
- if(!isnull(body_markings))
+ if(length(body_markings_list))
if(species_id == "husk")
- marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
-
- else if(!use_digitigrade)
- if(body_zone == BODY_ZONE_CHEST)
- marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
- else
- marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
+ for(var/list/marking_list in body_markings_list)
+ // marking stores icon and value for the specific bodypart
+ if(!use_digitigrade)
+ if(body_zone == BODY_ZONE_CHEST)
+ markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir))
+ else
+ markings_list.Add(image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir))
+ else
+ markings_list.Add(image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir))
- . += marking
+ if(color_src && length(marking_list) == 3)
+ var/image/I = markings_list[length(markings_list)]
+ I.color = marking_list[3]
+ . += markings_list
// Citadel End
@@ -830,11 +843,14 @@
for(var/I in aux_icons)
var/aux_layer = aux_icons[I]
aux += image(limb.icon, "[species_id]_[I]", -aux_layer, image_dir)
- if(!isnull(aux_marking))
- if(species_id == "husk")
- auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir)
- else
- auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir)
+ if(species_id == "husk")
+ auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir)
+ else
+ for(var/marking_list in body_markings_list)
+ var/image/aux_marking_image = image(marking_list[1], "[marking_list[2]]_[I]", -aux_layer, image_dir)
+ if(length(marking_list) == 3)
+ aux_marking_image.color = marking_list[3]
+ auxmarking += aux_marking_image
. += aux
. += auxmarking
@@ -849,31 +865,35 @@
for(var/I in aux_icons)
var/aux_layer = aux_icons[I]
aux += image(limb.icon, "[I]", -aux_layer, image_dir)
- if(!isnull(aux_marking))
- if(species_id == "husk")
- auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir)
- else
- auxmarking += image(body_markings_icon, "[body_markings]_[I]", -aux_layer, image_dir)
+ if(species_id == "husk")
+ auxmarking += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[I]", -aux_layer, image_dir)
+ else
+ for(var/marking_list in body_markings_list)
+ var/image/aux_marking_image = image(marking_list[1], "[marking_list[2]]_[I]", -aux_layer, image_dir)
+ if(length(marking_list) == 3)
+ aux_marking_image.color = marking_list[3]
+ auxmarking += aux_marking_image
. += auxmarking
. += aux
- if(!isnull(body_markings))
+ if(length(body_markings))
if(species_id == "husk")
- marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_[body_zone]", -MARKING_LAYER, image_dir)
else if(species_id == "husk" && use_digitigrade)
- marking = image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
-
- else if(!use_digitigrade)
- if(body_zone == BODY_ZONE_CHEST)
- marking = image(body_markings_icon, "[body_markings]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
- else
- marking = image(body_markings_icon, "[body_markings]_[body_zone]", -MARKING_LAYER, image_dir)
+ . += image('modular_citadel/icons/mob/markings_notmammals.dmi', "husk_digitigrade_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
else
- marking = image(body_markings_icon, "[body_markings]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
- . += marking
+ for(var/list/marking_list in body_markings_list)
+ // marking stores icon and value for the specific bodypart
+ if(!use_digitigrade)
+ if(body_zone == BODY_ZONE_CHEST)
+ . += image(marking_list[1], "[marking_list[2]]_[body_zone]_[icon_gender]", -MARKING_LAYER, image_dir)
+ else
+ . += image(marking_list[1], "[marking_list[2]]_[body_zone]", -MARKING_LAYER, image_dir)
+ else
+ . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir)
return
- if(color_src) //TODO - add color matrix support for base species limbs
+ if(color_src) //TODO - add color matrix support for base species limbs (or dont because color matrixes suck)
var/draw_color = mutation_color || species_color
var/grayscale = FALSE
if(!draw_color)
@@ -891,20 +911,15 @@
if(grayscale)
I.icon_state += "_g"
I.color = draw_color
- if(!isnull(aux_marking))
- for(var/a in auxmarking)
- var/image/I = a
- if(species_id == "husk")
- I.color = "#141414"
- else
- I.color = list(markings_color)
+ for(var/a in auxmarking)
+ var/image/I = a
+ if(species_id == "husk")
+ I.color = "#141414"
if(!isnull(body_markings))
if(species_id == "husk")
- marking.color = "#141414"
- else
- marking.color = list(markings_color)
-
+ for(var/image/marking in markings_list)
+ marking.color = "#141414"
/obj/item/bodypart/deconstruct(disassembled = TRUE)
drop_organs()
diff --git a/code/modules/uplink/uplink_items/uplink_bundles.dm b/code/modules/uplink/uplink_items/uplink_bundles.dm
index 9b17162532..cf33c893ad 100644
--- a/code/modules/uplink/uplink_items/uplink_bundles.dm
+++ b/code/modules/uplink/uplink_items/uplink_bundles.dm
@@ -38,7 +38,7 @@
specialised contractor baton, and three randomly selected low cost items. Can include otherwise unobtainable items."
item = /obj/item/storage/box/syndie_kit/contract_kit
cost = 20
- player_minimum = 30
+ player_minimum = 25
exclude_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops)
restricted = TRUE
diff --git a/code/modules/uplink/uplink_items/uplink_dangerous.dm b/code/modules/uplink/uplink_items/uplink_dangerous.dm
index a8ca068ad2..948d17d168 100644
--- a/code/modules/uplink/uplink_items/uplink_dangerous.dm
+++ b/code/modules/uplink/uplink_items/uplink_dangerous.dm
@@ -228,6 +228,15 @@
surplus = 50
include_modes = list(/datum/game_mode/nuclear)
+/datum/uplink_item/dangerous/maulergauntlets
+ name = "Mauler Gauntlets"
+ desc = "Mauler gauntlets are a pair of high-tech plastitanium gauntlets fused with illegal nanite auto-injectors designed \
+ to grant the wearer sextuple the strength of an average human being. Wearing these, you will punch harder, inflict more injuries \
+ with your fists, and be able to slam people through tables with immense force. \
+ Unfortunately, due to the size of the gloves you will be unable to wield firearms with them equipped."
+ item = /obj/item/clothing/gloves/fingerless/pugilist/mauler
+ cost = 8
+
/datum/uplink_item/dangerous/powerfist
name = "Power Fist"
desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm
index 97efbecb77..5ec0987111 100644
--- a/code/modules/vending/boozeomat.dm
+++ b/code/modules/vending/boozeomat.dm
@@ -18,6 +18,7 @@
/obj/item/reagent_containers/food/drinks/bottle/absinthe = 5,
/obj/item/reagent_containers/food/drinks/bottle/grappa = 5,
/obj/item/reagent_containers/food/drinks/bottle/sake = 5,
+ /obj/item/reagent_containers/food/drinks/bottle/amaretto = 5,
/obj/item/reagent_containers/food/drinks/ale = 6,
/obj/item/reagent_containers/food/drinks/bottle/orangejuice = 4,
/obj/item/reagent_containers/food/drinks/bottle/tomatojuice = 4,
diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm
index fedaeff98c..da3c740a1b 100644
--- a/code/modules/vending/clothesmate.dm
+++ b/code/modules/vending/clothesmate.dm
@@ -212,6 +212,8 @@
/obj/item/clothing/suit/jacket/leather/overcoat = 4,
/obj/item/clothing/under/pants/mustangjeans = 3,
/obj/item/clothing/neck/necklace/dope = 5,
+ /obj/item/clothing/under/costume/swagoutfit = 5,
+ /obj/item/clothing/shoes/swagshoes = 5,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 5,
/obj/item/clothing/under/misc/corporateuniform = 5,
/obj/item/clothing/suit/hooded/wintercoat/polychromic = 5,
diff --git a/code/modules/vending/dinnerware.dm b/code/modules/vending/dinnerware.dm
index c5b85ed61c..95fd8e04d8 100644
--- a/code/modules/vending/dinnerware.dm
+++ b/code/modules/vending/dinnerware.dm
@@ -7,6 +7,7 @@
/obj/item/storage/bag/tray = 8,
/obj/item/kitchen/fork = 6,
/obj/item/kitchen/knife = 6,
+ /obj/item/kitchen/efink = 2,
/obj/item/kitchen/rollingpin = 4,
/obj/item/kitchen/unrollingpin = 4,
/obj/item/reagent_containers/food/drinks/drinkingglass = 8,
diff --git a/html/changelog.html b/html/changelog.html
index 7e3f24bf3b..4eb95b34d7 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,102 @@
-->
+
29 May 2021
+
Kraseo updated:
+
+
No more slamming into people while bloodcrawled.
+
+
Linzolle updated:
+
+
brand intelligence event works again
+
+
keronshb updated:
+
+
swag outfit available in clothesmate
+
swag shoes availble in clothesmate resprite: changed swag shoes icon to the one twaticus made.
+
Adds the clown mob spawner for admins
+
+
zeroisthebiggay updated:
+
+
puglism damage can no longer stack with scarp
+
+
+
26 May 2021
+
bunny232 updated:
+
+
Removed two random 'captain's office' tiles from space on meta station
+
+
+
24 May 2021
+
zeroisthebiggay updated:
+
+
New traitor item: the Mauler Gauntlets! Punch hard, punch good! Eight telecrystals, buy today!
+
hairs from Airborne Snitch
+
+
+
23 May 2021
+
Putnam3145 updated:
+
+
Antag and species no longer remove all traits if one has a blacklisted trait
+
+
WanderingFox95 updated:
+
+
Replaced the antlers showing up when you select deer ears with actual deer ears. Literally why was that even a thing before?
+
Straight rabbit ears are now a thing.
+
+
keronshb updated:
+
+
30 > 25 pop req for contractor kit
+
adds a special hud for simple mobs.
+
a lot of >32x32 mobs now have icons for their health dolls
+
+
+
21 May 2021
+
Putnam3145 updated:
+
+
Fixed activity being attached to minds instead of mobs on antag attach.
+
+
+
20 May 2021
+
qweq12yt updated:
+
+
Fixed void cloak voiding itself into oblivion.
+
You can now order emag shuttles again.
+
+
timothyteakettle updated:
+
+
ports rp's marking system
+
+
+
19 May 2021
+
WanderingFox95 updated:
+
+
The E-Fink, a mending tool for food.
+
A backwards bladeslice. (Yes, for the E-fink)
+
And Icons for the E-fink, of course.
+
+
shellspeed1 updated:
+
+
Survival pods can now be designated as requiring power. Survival pods with this feature should include an APC when created and will run out of power rather quickly if no source is added. Perfect for true emergencies.
+
An empty survival pod has been added to the mining vendor. This is an extremely barebones pod featuring only a gps, table, apc, and the standard fridge for some donk pockets.
+
+
zeroisthebiggay updated:
+
+
New Alcohol Amaretto and various cocktails
+
more drink mixture flavortext
+
you're going to Baystation
+
+
+
15 May 2021
+
bunny232 updated:
+
+
Corrects the bot pathing by engineering on meta station
+
+
timothyteakettle updated:
+
+
borg spraycans have a five second delay before being able to knock someone down again
+
+
14 May 2021
keronshb updated:
@@ -484,317 +580,6 @@
piratepayment
-
-
29 March 2021
-
BlueWildrose updated:
-
-
Fixed being unable to fix suit sensors if damaged at all unless destroyed completely
-
-
YakumoChen updated:
-
-
A less-than-new Syndicate bundle that reminds you of the good old days when we didn't need all those newfangled traitor items the young-uns get. We had 6 items in the uplink and we had Monkey in rotation and by god we made do.
-
-
qweq12yt updated:
-
-
Added Earmuffs
-
Added Random Drink
-
Added Clear PDA
-
Added Internals Box
-
Added Meson Goggles
-
Added Smoke Grenade
-
-
silicons updated:
-
-
automated hydroponics system design now works properly
-
-
-
28 March 2021
-
CuteMoff updated:
-
-
Changed Strength Modifier from the default (1.0) too .7
-
-
Hatterhat updated:
-
-
As a heretic, shattering your blade no longer interferes with bluespace.
-
-
Putnam3145 updated:
-
-
Threat tracking is now universal, rather than dynamic-only
-
Slaughter demon event now increases weight based on how much blood there is.
-
-
R3dtail updated:
-
-
Removed ichor creates
-
Removed ichor crates and adjusted crate rolling appropriately
-
Removed the bonespear from the blackmarket uplink, and made EMP grenades harder to get from the same item.
-
Added a description to the black market uplink
-
-
Shadow-Quill updated:
-
-
Added small versions of the walk icon for all hud styles, except Retro.
-
-
dzahlus updated:
-
-
Added radial menu to joy mask for alt reskins
-
added pensive, angry and flushed sprites to joy mask
-
-
keronshb updated:
-
-
Radioactive microlasers can no longer knock out creatures who are immune to the effects of radiation.
-
The radioactive microlaser now calculates the strength of its delay effect using the intensity setting it had when you initially used it on your victim, not the intensity setting it currently has. This prevents people from "cheating out" its intensity 20 effect with only a 2 second delay and a 1 second cooldown.
-
Radioactive microlasers no longer contain twice as much metal as normal health analyzers do.
-
-
necromanceranne updated:
-
-
Replaces the useless bullet and laser shields with new Kinetic and Ablative shields, which do as they advertise.
-
Replaces the shield implants shield with a hardlight shield that can take large amounts of brute damage, but disintegrates when shot with disablers.
-
Fixes Fake Roman Shields being able to be used as normal riot shields.
Fixes tower shields not doing anything, while also giving them intergrity to match their advertised durability.
-
Uses additional flags to determine what kind effects work well and what works poorly against various shields.
-
-
timothyteakettle updated:
-
-
ghost cafe residents can now disguise themselves as any mob or object
-
fixes character preview not updating when selecting the loadout tab
-
-
zeroisthebiggay updated:
-
-
triple kitsune tail
-
-
-
26 March 2021
-
BlueWildrose updated:
-
-
Clothing no longer drops when shredded. It just becomes useless.
-
Suit sensors are guaranteed to short out when the clothes become shredded, not damaged now.
-
Uniform limb integrity increased from 30 to 120.
-
Suit sensor damage has been added. The more damaged your suit sensors get, the less features that will be available from these suit sensors. It takes two e-sword hits to ruin your tracking beacon for instance. tweak: Examine text on uniforms is now more clear about needing cable coil to repair your suit sensors.
-
Fixed prisoner uniform sprite paths
-
-
CuteMoff updated:
-
-
Diamond's forcemod was changed from 1.1x to 1.2x
-
-
Hatterhat updated:
-
-
Lever-action rifles, chambered in .38, are now sitting in the code. They might be buyable from Cargo or the Black Market soon. Watch this space.
-
Sawed-off shotguns now look like shotguns, but short, when inhand, instead of "generic gun".
-
-
timothyteakettle updated:
-
-
slimes can be delimbed
-
the loadout now colours pet collars correctly
-
-
-
25 March 2021
-
zeroisthebiggay updated:
-
-
strained muscles isn't free
-
-
-
24 March 2021
-
BlueWildrose updated:
-
-
The nightmare's light eater can now destroy messes that emit light, like glowing goo or ectoplasmic puddles.
-
-
Hatterhat updated:
-
-
The NOGUNS trait now takes precedence over the triggerguard checks.
-
Medicated sutures and advanced regenerative mesh are now easier to make. Reagent-quantity wise, anyway.
-
-
ItzGabby updated:
-
-
Fluff Items with polychromic support
-
A new vendor called Bark box
-
A new form of snack with it's own box
-
Two harness, one of them being lewd
-
One new collar, with a ribbon. Classy.
-
More locked forms of collars
-
Purged old balls
-
Removed the funny buffs each colored tennis ball had, down with the powergame!
-
Added polychromic fluff icons, vendor icons, suit icons, snack icons, fancy box icons, and a polychromic version of Izzy's ball.
-
Deleted old balls, Izzy's Ball, except the rainbow one since it's special and as I did not go out of my way to get permission to touch.
-
Walked into vending.dm and glared for a moment at hydroponics' grammar.
-
-
LetterN updated:
-
-
fixed laptops pickability
-
fixed closets being unweldable
-
-
YakumoChen updated:
-
-
Genetics - Thermal vision is a recipe instead of a natural gene now. Nearsighted+Stimmed. Other minor nerfs, Thermal is 40 instability.
-
Research - X-ray eyes are now an illegal tech.
-
-
qweq12yt updated:
-
-
added the black market uplink
-
added blackmarket.dmi
-
increased the black market interface's width, now the delivery options will show properly when the LTSRBT is built
-
-
zeroisthebiggay updated:
-
-
biodegrade works on legcuffs
-
-
-
23 March 2021
-
LetterN updated:
-
-
NIRM departamental purchases now work. Have fun spending the entire R&D Budget!
-
-
-
21 March 2021
-
Arturlang updated:
-
-
Vampire statpanel no longer shows spans unnecesary
-
-
GrayRachnid updated:
-
-
fixed the holopad autocall bug
-
properly incorporated the secure holopad that was commented out in the code.
-
the in_character_filter.txt is now usable
-
headmins should edit the in_character_filter.txt
-
someone with box access should delete racism with the in_character_filter.txt
-
buffed particle defender disabler shots from 13->15 stamina (15*6=90)
-
buffed particle defender laser ammo to 4 shots
-
-
Hatterhat updated:
-
-
removes pacifism from ghost cafe. have fun beating up your coworkers
-
-
LetterN updated:
-
-
Art gallery (meta)
-
Laptop vendor (meta, delta, box)
-
-
Putnam3145 updated:
-
-
Buffed supermatter surge massively.
-
-
The-Sun-In-Splendour updated:
-
-
You cannot revive yourself (as a changeling) if you've been absorbed anymore
-
-
dzahlus updated:
-
-
rebalanced hierophant STAFF to do 15 damage on all attacks
-
-
timothyteakettle updated:
-
-
using the puddle ability when stunned wont break it
-
-
-
20 March 2021
-
Hatterhat updated:
-
-
Bluespace beaker filling icons for that narrow band between 90 and 80% full now actually exist.
-
-
-
19 March 2021
-
DeltaFire15 updated:
-
-
Bluespace jars can no longer be printed / acquired from lathes / techwebs. tweak: The travelling animal trader now gives you your reward in a one-use bluespace jar.
-
-
Putnam3145 updated:
-
-
"Antag" role that can be toggled to disable all antags
-
-
SandPoot updated:
-
-
Tactitool Skirtleneck.
-
Adds the tactitool skirtleneck to the loadout.
-
-
kiwedespars updated:
-
-
New heretic path - Path of Void- it specializes in being extremely stealthy. tweak : Removed curse of blindness replaced with mask of madness. hey it even rhymes.
-
fixes heretic mass deletion during transmutation bug.
-
Fixes heretic brews being permanent.
-
Fixes void storm breaking after resurrecting. tweak: Heretic has received a minor textual facelift. tweak: Heretics who finish the Void Path and become an Aristocrat of the Void can now survive in the Void (space).
-
Heretics who research Aristocrats Way on the Void Path will no longer suffocate in their own storm when they ascend (no longer breathes).
-
Mark of Void and Seeking Blade are once again exclusive only to Void.
-
Carving knife now deals more damage on throw and can embed in your enemies. tweak: Grasp of Rust only rusts floors and machines on harm intent. tweak: when u choose a sac target as heretic it ll also tell the job of the sac
-
2 new void spells, one a placeholder.
-
flesh mansus grasp buffed, now gives you 5u eldritch fluid when hitting someone.
-
-
zeroisthebiggay updated:
-
-
fixes spriteless heretic book
-
-
-
18 March 2021
-
Arturlang updated:
-
-
Combat mode right click and right click verb give's are now actualyl targeted
-
-
Hatterhat updated:
-
-
Hypospray vials are now printable from the medical techshift start.
-
Empty hypospray kits are now printable behind biological technology. tweak: Quantum electromag (T4 lasers) are now behind Advanced Bluespace like the rest of T4.
-
-
-
17 March 2021
-
KeRSedChaplain updated:
-
-
Added three new rites, and makes soul vessels obtainable
added sounds for the ratvar end sequence, voiced by @dzahlus
-
-
timothyteakettle updated:
-
-
speech panel added to main menu customization
-
-
-
16 March 2021
-
GrayRachnid updated:
-
-
removed red toolbox, agent id, and guerilla gloves from unlocking illegal tech.
-
-
HeroWithYay updated:
-
-
fixed spelling error
-
-
LetterN updated:
-
-
Borg light icons not turning off
-
Double ai icon select + Fixes ai core not having icons
-
Missing air tank icon
-
Computer boards being dumb and nullspacing/qdeling itself
-
-
Putnam3145 updated:
-
-
Supernova now much lower chance to be inconsequential
-
Made hyper-nob's point values way lower (25/20 for science/cargo instead of 1000/1000)
-
Made nitryl's cargo sell value less (10 instead of 30)
-
-
SandPoot updated:
-
-
Fixed interacting with telecomms.
-
-
-
14 March 2021
-
Adelphon updated:
-
-
messy2
-
papermask
-
-
Hatterhat updated:
-
-
Robotic limb repair surgery now has tiers.
-
Pubby and Delta now have roundstart limb-growers relatively close to, if not in, the operating theaters. tweak: Box QM's console now can announce things.
-
-
Putnam3145 updated:
-
-
chaos loads now
-
-
kiwedespars updated:
-
-
adds a cute new plushie
-
-
necromanceranne updated:
-
-
Fixes cosmetic augments missing their foot sprites.
-
GoonStation 13 Development Team
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index ca2426d1f0..475730286e 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -29301,3 +29301,66 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- balance: Removes VOG sleep command since it was an undocumented readd.
zeroisthebiggay:
- spellcheck: consealed
+2021-05-15:
+ bunny232:
+ - bugfix: Corrects the bot pathing by engineering on meta station
+ timothyteakettle:
+ - balance: borg spraycans have a five second delay before being able to knock someone
+ down again
+2021-05-19:
+ WanderingFox95:
+ - rscadd: The E-Fink, a mending tool for food.
+ - soundadd: A backwards bladeslice. (Yes, for the E-fink)
+ - imageadd: And Icons for the E-fink, of course.
+ shellspeed1:
+ - rscadd: Survival pods can now be designated as requiring power. Survival pods
+ with this feature should include an APC when created and will run out of power
+ rather quickly if no source is added. Perfect for true emergencies.
+ - rscadd: An empty survival pod has been added to the mining vendor. This is an
+ extremely barebones pod featuring only a gps, table, apc, and the standard fridge
+ for some donk pockets.
+ zeroisthebiggay:
+ - rscadd: New Alcohol Amaretto and various cocktails
+ - rscadd: more drink mixture flavortext
+ - soundadd: you're going to Baystation
+2021-05-20:
+ qweq12yt:
+ - bugfix: Fixed void cloak voiding itself into oblivion.
+ - bugfix: You can now order emag shuttles again.
+ timothyteakettle:
+ - rscadd: ports rp's marking system
+2021-05-21:
+ Putnam3145:
+ - bugfix: Fixed activity being attached to minds instead of mobs on antag attach.
+2021-05-23:
+ Putnam3145:
+ - bugfix: Antag and species no longer remove all traits if one has a blacklisted
+ trait
+ WanderingFox95:
+ - imageadd: Replaced the antlers showing up when you select deer ears with actual
+ deer ears. Literally why was that even a thing before?
+ - imageadd: Straight rabbit ears are now a thing.
+ keronshb:
+ - balance: 30 > 25 pop req for contractor kit
+ - code_imp: adds a special hud for simple mobs.
+ - imageadd: a lot of >32x32 mobs now have icons for their health dolls
+2021-05-24:
+ zeroisthebiggay:
+ - rscadd: 'New traitor item: the Mauler Gauntlets! Punch hard, punch good! Eight
+ telecrystals, buy today!'
+ - rscadd: hairs from Airborne Snitch
+2021-05-26:
+ bunny232:
+ - bugfix: Removed two random 'captain's office' tiles from space on meta station
+2021-05-29:
+ Kraseo:
+ - bugfix: No more slamming into people while bloodcrawled.
+ Linzolle:
+ - bugfix: brand intelligence event works again
+ keronshb:
+ - rscadd: swag outfit available in clothesmate
+ - rscadd: 'swag shoes availble in clothesmate resprite: changed swag shoes icon
+ to the one twaticus made.'
+ - rscadd: Adds the clown mob spawner for admins
+ zeroisthebiggay:
+ - balance: puglism damage can no longer stack with scarp
diff --git a/html/changelogs/AutoChangeLog-pr-14627.yml b/html/changelogs/AutoChangeLog-pr-14627.yml
deleted file mode 100644
index cde6b62174..0000000000
--- a/html/changelogs/AutoChangeLog-pr-14627.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "timothyteakettle"
-delete-after: True
-changes:
- - balance: "borg spraycans have a five second delay before being able to knock someone down again"
diff --git a/icons/effects/camera_image_base.dmi b/icons/effects/camera_image_base.dmi
new file mode 100644
index 0000000000..4f5867e07e
Binary files /dev/null and b/icons/effects/camera_image_base.dmi differ
diff --git a/icons/mob/clothing/feet.dmi b/icons/mob/clothing/feet.dmi
index d93543805b..de50a0d9dc 100644
Binary files a/icons/mob/clothing/feet.dmi and b/icons/mob/clothing/feet.dmi differ
diff --git a/icons/mob/clothing/feet_digi.dmi b/icons/mob/clothing/feet_digi.dmi
index 43244e99b9..1cc1e801c7 100644
Binary files a/icons/mob/clothing/feet_digi.dmi and b/icons/mob/clothing/feet_digi.dmi differ
diff --git a/icons/mob/clothing/hands.dmi b/icons/mob/clothing/hands.dmi
index 406b0fe62a..5155f06134 100644
Binary files a/icons/mob/clothing/hands.dmi and b/icons/mob/clothing/hands.dmi differ
diff --git a/icons/mob/clothing/uniform.dmi b/icons/mob/clothing/uniform.dmi
index f2611b3ab7..6c29fdfa75 100644
Binary files a/icons/mob/clothing/uniform.dmi and b/icons/mob/clothing/uniform.dmi differ
diff --git a/icons/mob/clothing/uniform_digi.dmi b/icons/mob/clothing/uniform_digi.dmi
index 98ec436b86..a957b60a9b 100644
Binary files a/icons/mob/clothing/uniform_digi.dmi and b/icons/mob/clothing/uniform_digi.dmi differ
diff --git a/icons/mob/hair.dmi b/icons/mob/hair.dmi
index 7322b2cfaf..55c79b9740 100644
Binary files a/icons/mob/hair.dmi and b/icons/mob/hair.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_lefthand.dmi b/icons/mob/inhands/equipment/kitchen_lefthand.dmi
index bd3e1f779f..af16e06a39 100644
Binary files a/icons/mob/inhands/equipment/kitchen_lefthand.dmi and b/icons/mob/inhands/equipment/kitchen_lefthand.dmi differ
diff --git a/icons/mob/inhands/equipment/kitchen_righthand.dmi b/icons/mob/inhands/equipment/kitchen_righthand.dmi
index 9e9f21b0f5..539ef42a19 100644
Binary files a/icons/mob/inhands/equipment/kitchen_righthand.dmi and b/icons/mob/inhands/equipment/kitchen_righthand.dmi differ
diff --git a/icons/mob/mutant_bodyparts.dmi b/icons/mob/mutant_bodyparts.dmi
index ca047a93bd..7b93a3ff73 100644
Binary files a/icons/mob/mutant_bodyparts.dmi and b/icons/mob/mutant_bodyparts.dmi differ
diff --git a/icons/mob/screen_gen.dmi b/icons/mob/screen_gen.dmi
index 95aaf330ce..4377a0d7c6 100644
Binary files a/icons/mob/screen_gen.dmi and b/icons/mob/screen_gen.dmi differ
diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi
index 629b989520..25cde38df9 100644
Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ
diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi
index aee67da199..cb2391b5ba 100644
Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ
diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi
index 6171e032dd..22464b3def 100644
Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ
diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi
index 1c3b10b9de..b7f21a1fe4 100644
Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ
diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi
index 9a4af82449..7ada41dbcf 100644
Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ
diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm
index 0c59c3e711..39ed9d6ec8 100644
--- a/modular_citadel/code/modules/client/loadout/__donator.dm
+++ b/modular_citadel/code/modules/client/loadout/__donator.dm
@@ -550,7 +550,7 @@
ckeywhitelist = list("sneka")
/datum/gear/donator/smaiden
- name = "Shrine Maiden"
- slot = SLOT_WEAR_SUIT
- path = /obj/item/clothing/suit/smaiden
+ name = "shrine maiden outfit"
+ slot = SLOT_W_UNIFORM
+ path = /obj/item/clothing/under/smaiden
ckeywhitelist = list("ultimarifox")
diff --git a/modular_citadel/code/modules/client/preferences_savefile.dm b/modular_citadel/code/modules/client/preferences_savefile.dm
index bbd71d22e3..102ae41921 100644
--- a/modular_citadel/code/modules/client/preferences_savefile.dm
+++ b/modular_citadel/code/modules/client/preferences_savefile.dm
@@ -23,7 +23,7 @@
WRITE_FILE(S["feature_genitals_use_skintone"], features["genitals_use_skintone"])
WRITE_FILE(S["feature_mcolor2"], features["mcolor2"])
WRITE_FILE(S["feature_mcolor3"], features["mcolor3"])
- WRITE_FILE(S["feature_mam_body_markings"], features["mam_body_markings"])
+ WRITE_FILE(S["feature_mam_body_markings"], safe_json_encode(features["mam_body_markings"]))
WRITE_FILE(S["feature_mam_tail"], features["mam_tail"])
WRITE_FILE(S["feature_mam_ears"], features["mam_ears"])
WRITE_FILE(S["feature_mam_tail_animated"], features["mam_tail_animated"])
diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm
index 89734106cf..b7d04e0780 100644
--- a/modular_citadel/code/modules/custom_loadout/custom_items.dm
+++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm
@@ -602,8 +602,8 @@
mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi'
icon_state = "mmask"
-/obj/item/clothing/suit/smaiden
- name = "shrine maiden"
+/obj/item/clothing/under/smaiden
+ name = "shrine maiden outfit"
desc = "Seems questionably tight for religious purposes."
icon_state = "smaiden"
item_state = "smaiden"
diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index 1ed3d8fbbe..e615b7f7ee 100644
Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ
diff --git a/modular_citadel/icons/mob/mam_markings.dmi b/modular_citadel/icons/mob/mam_markings.dmi
index 3fe7f0060e..05cc1731fd 100644
Binary files a/modular_citadel/icons/mob/mam_markings.dmi and b/modular_citadel/icons/mob/mam_markings.dmi differ
diff --git a/sound/roundend/approachingbaystation.ogg b/sound/roundend/approachingbaystation.ogg
new file mode 100644
index 0000000000..83f5f6aae7
Binary files /dev/null and b/sound/roundend/approachingbaystation.ogg differ
diff --git a/sound/weapons/bladesliceb.ogg b/sound/weapons/bladesliceb.ogg
new file mode 100644
index 0000000000..b916363acd
Binary files /dev/null and b/sound/weapons/bladesliceb.ogg differ
diff --git a/sound/weapons/mauler_punch.ogg b/sound/weapons/mauler_punch.ogg
new file mode 100644
index 0000000000..3e610ea238
Binary files /dev/null and b/sound/weapons/mauler_punch.ogg differ
diff --git a/tgstation.dme b/tgstation.dme
index 2e5bd87e51..e516733757 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -272,6 +272,7 @@
#include "code\_onclick\hud\revenanthud.dm"
#include "code\_onclick\hud\robot.dm"
#include "code\_onclick\hud\screen_objects.dm"
+#include "code\_onclick\hud\simple_animal.dm"
#include "code\_onclick\hud\swarmer.dm"
#include "code\_onclick\hud\screen_objects\clickdelay.dm"
#include "code\_onclick\hud\screen_objects\sprint.dm"