diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm
index 216b2a3db7..93c625b238 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,
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/__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/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/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/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index e584cad9e8..aa48930d6c 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -649,6 +649,9 @@
pre_noise = TRUE
post_noise = FALSE
+ var/stun_delay = 0 // how long it takes for you to be able to stun someone with the spraycan again
+ var/last_stun_time = 0
+
/obj/item/toy/crayon/spraycan/isValidSurface(surface)
return (istype(surface, /turf/open/floor) || istype(surface, /turf/closed/wall))
@@ -716,7 +719,8 @@
if(C.client)
C.blur_eyes(3)
C.blind_eyes(1)
- if(C.get_eye_protection() <= 0) // no eye protection? ARGH IT BURNS.
+ if(C.get_eye_protection() <= 0 && (last_stun_time + stun_delay) <= world.time) // no eye protection? ARGH IT BURNS.
+ last_stun_time = world.time
C.confused = max(C.confused, 3)
C.DefaultCombatKnockdown(60)
if(ishuman(C) && actually_paints)
@@ -771,6 +775,7 @@
name = "cyborg spraycan"
desc = "A metallic container containing shiny synthesised paint."
charges = -1
+ stun_delay = 5 SECONDS
/obj/item/toy/crayon/spraycan/borg/draw_on(atom/target,mob/user,proximity, params)
var/diff = ..()
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/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..ba3d8106ef 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)
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/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm
index 36ceabe3b4..551c1c5536 100644
--- a/code/modules/awaymissions/gateway.dm
+++ b/code/modules/awaymissions/gateway.dm
@@ -172,13 +172,15 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
/// bumper object, the thing that starts actual teleport
var/obj/effect/gateway_portal_bumper/portal
/// Visual object for handling the viscontents
- var/obj/effect/gateway_portal_effect/portal_visuals
+ /// DISABLED DUE TO BYOND BUG CAUSING STACK OVERFLOWS OF ANY HUMAN INSTANTIATION NEAR AN ACTIVATED GATEWAY.
+ /// Probably due to it referencing each other through the gateway (there's a deep loop, maybe BYOND isn't catching something when it usually would)
+ // var/obj/effect/gateway_portal_effect/portal_visuals
/obj/machinery/gateway/Initialize()
generate_destination()
update_icon()
- portal_visuals = new
- vis_contents += portal_visuals
+ // portal_visuals = new
+ // vis_contents += portal_visuals
return ..()
/obj/machinery/gateway/proc/generate_destination()
@@ -195,7 +197,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
if(use_power == ACTIVE_POWER_USE)
use_power = IDLE_POWER_USE
update_icon()
- portal_visuals.reset_visuals()
+ // portal_visuals.reset_visuals()
/obj/machinery/gateway/process()
if((stat & (NOPOWER)) && use_power)
@@ -215,7 +217,7 @@ GLOBAL_LIST_EMPTY(gateway_destinations)
return
target = D
target.activate(destination)
- portal_visuals.setup_visuals(target)
+ // portal_visuals.setup_visuals(target)
generate_bumper()
use_power = ACTIVE_POWER_USE
update_icon()
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 += "| [marking_list[2]] - [actual_name] | ˄ ˅ X [color_marking_dat] |
"
+ 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/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/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_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/simple_animal/hostile/megafauna/bubblegum.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
index b1441ce55f..5305813ebf 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/bubblegum.dm
@@ -134,7 +134,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/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/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/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/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..19aaf87564 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -50,6 +50,46 @@
-->
+
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:
@@ -721,80 +761,6 @@
- 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
- - fixes clockwork guardians inheriting marauders blocking
- - 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:
-
- 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:
-
- 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:
-
- 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..4bf762d148 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -29301,3 +29301,31 @@ 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
diff --git a/html/changelogs/AutoChangeLog-pr-14738.yml b/html/changelogs/AutoChangeLog-pr-14738.yml
new file mode 100644
index 0000000000..5c51f8929b
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-14738.yml
@@ -0,0 +1,4 @@
+author: "Putnam3145"
+delete-after: True
+changes:
+ - bugfix: "Fixed activity being attached to minds instead of mobs on antag attach."
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/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/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/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi
index 1ed3d8fbbe..a8209f25c5 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