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 += "" + dat += "
[marking_list[2]] - [actual_name] ˄ ˅ X [color_marking_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:

+ +

timothyteakettle updated:

+ + +

19 May 2021

+

WanderingFox95 updated:

+ +

shellspeed1 updated:

+ +

zeroisthebiggay updated:

+ + +

15 May 2021

+

bunny232 updated:

+ +

timothyteakettle updated:

+ +

14 May 2021

keronshb updated:

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