diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 244bd6116651..192dcdd71688 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -84194,7 +84194,7 @@ dir = 1 }, /obj/effect/turf_decal/bot, -/obj/machinery/oven/range, +/obj/machinery/smartfridge/drying, /turf/open/floor/iron/dark, /area/station/service/kitchen) "wWo" = ( diff --git a/_maps/map_files/LimaStation/LimaStation.dmm b/_maps/map_files/LimaStation/LimaStation.dmm index dab2f0904eb5..484910a7992a 100644 --- a/_maps/map_files/LimaStation/LimaStation.dmm +++ b/_maps/map_files/LimaStation/LimaStation.dmm @@ -40437,6 +40437,11 @@ dir = 4 }, /area/station/science/xenobiology) +"mYh" = ( +/obj/machinery/smartfridge/drying, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/freezer, +/area/station/service/kitchen/coldroom) "mYs" = ( /obj/structure/cable, /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, @@ -170970,7 +170975,7 @@ jWl jWl fsA aZw -aZw +mYh nSX dRd xGV diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 74bbc8ab16ae..01dca5bcf8a6 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -12387,11 +12387,10 @@ /obj/machinery/light_switch/directional/north{ pixel_x = 5 }, -/obj/structure/closet/secure_closet/freezer/meat, +/obj/machinery/smartfridge/drying, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "aIS" = ( -/obj/effect/turf_decal/bot, /obj/machinery/computer/order_console/cook, /obj/item/toy/figure/chef{ pixel_y = 0 @@ -12827,6 +12826,8 @@ network = list("ss13","service") }, /obj/machinery/airalarm/directional/south, +/obj/structure/closet/secure_closet/freezer/meat, +/obj/effect/turf_decal/bot, /turf/open/floor/iron/freezer, /area/station/service/kitchen/coldroom) "aKa" = ( diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 1e888f93d972..3c9c17c3f63f 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -13877,6 +13877,9 @@ /area/station/maintenance/department/crew_quarters/bar) "aYR" = ( /obj/item/radio/intercom/directional/north, +/obj/structure/rack, +/obj/item/stack/package_wrap, +/obj/item/hand_labeler, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "aYT" = ( @@ -13884,7 +13887,6 @@ /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "aYU" = ( -/obj/machinery/processor, /obj/machinery/firealarm/directional/north, /obj/machinery/light/directional/north, /turf/open/floor/iron/cafeteria, @@ -15319,9 +15321,7 @@ name = "Kitchen Window Shutters Control"; req_access = list("kitchen") }, -/obj/structure/rack, -/obj/item/stack/package_wrap, -/obj/item/hand_labeler, +/obj/machinery/smartfridge/drying, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "bfr" = ( @@ -35064,6 +35064,8 @@ /area/station/ai_monitored/turret_protected/ai) "ftU" = ( /obj/structure/cable, +/obj/structure/table, +/obj/machinery/processor, /turf/open/floor/iron/cafeteria, /area/station/service/kitchen) "ftW" = ( diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 8c0219d3674a..dcf6d772c3f4 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -185,6 +185,7 @@ //Brain Damage defines #define BRAIN_DAMAGE_MILD 50 +#define BRAIN_DAMAGE_ASYNC_BLINKING 100 #define BRAIN_DAMAGE_SEVERE 150 #define BRAIN_DAMAGE_DEATH 300 diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 054cd3b3967e..143d01020a3a 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -389,6 +389,7 @@ atom_storage.insert_preposition = "on" atom_storage.max_slots = 8 atom_storage.max_total_storage = 16 + atom_storage.storage_sound = 'maplestation_modules/sound/items/drop/food.ogg' /obj/item/storage/bag/tray/attack(mob/living/M, mob/living/user) . = ..() diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index c59d7bc73939..0dea13fb2706 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -544,6 +544,7 @@ /obj/item/storage/fancy/pickles_jar/Initialize(mapload) . = ..() atom_storage.set_holdable(/obj/item/food/pickle) + atom_storage.storage_sound = 'maplestation_modules/sound/items/drop/food.ogg' /obj/item/storage/fancy/pickles_jar/update_icon_state() . = ..() diff --git a/code/modules/client/verbs/ooc.dm b/code/modules/client/verbs/ooc.dm index 0cb766c6eb6c..0ab5d2737d29 100644 --- a/code/modules/client/verbs/ooc.dm +++ b/code/modules/client/verbs/ooc.dm @@ -6,7 +6,11 @@ GLOBAL_VAR_INIT(normal_ooc_colour, "#002eb8") set name = "OOC" //Gave this shit a shorter name so you only have to time out "ooc" rather than "ooc message" to use it --NeoFite set category = "OOC" - if(GLOB.say_disabled) //This is here to try to identify lag problems + if(!SSticker?.HasRoundStarted()) + lobby_chat(msg) + return + + if(GLOB.say_disabled) // This is here to try to identify lag problems to_chat(usr, span_danger("Speech is currently admin-disabled.")) return diff --git a/code/modules/clothing/head/costume.dm b/code/modules/clothing/head/costume.dm index 7a9bd455bef1..a15922731215 100644 --- a/code/modules/clothing/head/costume.dm +++ b/code/modules/clothing/head/costume.dm @@ -175,7 +175,7 @@ inhand_icon_state = null /obj/item/clothing/head/costume/tmc - name = "Lost M.C. bandana" + name = "thin head bandana" desc = "A small, red bandana tied thin." icon_state = "tmc_hat" inhand_icon_state = null diff --git a/code/modules/clothing/suits/costume.dm b/code/modules/clothing/suits/costume.dm index 035a0ce668ce..b89641d5a2f6 100644 --- a/code/modules/clothing/suits/costume.dm +++ b/code/modules/clothing/suits/costume.dm @@ -652,7 +652,7 @@ body_parts_covered = CHEST|GROIN|ARMS /obj/item/clothing/suit/costume/tmc - name = "\improper Lost M.C. cut" + name = "biker cut" desc = "Making sure everyone knows you're in the best biker gang this side of Alderney." icon_state = "tmc_suit" inhand_icon_state = null diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 132ae86ed535..a3b084d8f4bf 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -424,7 +424,7 @@ /client/proc/lobby_chat(message) VALIDATE_CLIENT(src) - if(GLOB.say_disabled) //This is here to try to identify lag problems + if(GLOB.say_disabled) to_chat(src, span_danger("Speech is currently admin-disabled.")) return if(is_banned_from(ckey, "OOC")) diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index a245ba179755..0d0079301102 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -241,8 +241,8 @@ /datum/emote/living/carbon/human/blink/run_emote(mob/living/carbon/human/user, params, type_override, intentional) . = ..() - // Set to update_body until update_body_parts_head_only is fixed - user.update_body() // Refreshing instantly makes the user blink + var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) + eyes.blink() /datum/emote/living/carbon/human/blink_r key = "blink_r" @@ -259,9 +259,10 @@ /datum/emote/living/carbon/human/blink_r/run_emote(mob/user, params, type_override, intentional) . = ..() - // Set to update_body until update_body_parts_head_only is fixed + var/obj/item/organ/eyes/eyes = user.get_organ_slot(ORGAN_SLOT_EYES) for (var/i in 1 to 3) - addtimer(CALLBACK(user, TYPE_PROC_REF(/mob, update_body)), i * 0.3 SECONDS) + addtimer(CALLBACK(eyes, TYPE_PROC_REF(/obj/item/organ/eyes, blink), 0.1 SECONDS, FALSE), i * 0.2 SECONDS) + eyes.animate_eyelids(user) /datum/emote/living/carbon/human/close_eyes key = "close" diff --git a/code/modules/surgery/organs/external/tails.dm b/code/modules/surgery/organs/external/tails.dm index a06ed81c57ae..cc2e77fcf6f5 100644 --- a/code/modules/surgery/organs/external/tails.dm +++ b/code/modules/surgery/organs/external/tails.dm @@ -97,7 +97,7 @@ /obj/item/organ/tail/proc/start_wag(mob/living/carbon/organ_owner, stop_after = INFINITY) if(wag_flags & WAG_WAGGING || !(wag_flags & WAG_ABLE)) // we are already wagging return FALSE - if(organ_owner.stat == DEAD || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied + if(organ_owner.stat >= SOFT_CRIT || HAS_TRAIT(organ_owner, TRAIT_KNOCKEDOUT) || organ_owner != owner) // no wagging when owner is dead or tail has been disembodied return FALSE if(stop_after != INFINITY) @@ -109,12 +109,12 @@ if(tail_spines_overlay) //if there are spines, they should wag with the tail tail_spines_overlay.wagging = TRUE organ_owner.update_body_parts() - RegisterSignal(organ_owner, COMSIG_MOB_STATCHANGE, PROC_REF(owner_stat_change)) + RegisterSignals(organ_owner, list(COMSIG_MOB_STATCHANGE, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT)), PROC_REF(owner_stat_change)) return TRUE /obj/item/organ/tail/proc/owner_stat_change(mob/living/carbon/organ_owner) // Resisting the urge to replace owner with daddy SIGNAL_HANDLER - if(organ_owner.stat >= SOFT_CRIT) + if(organ_owner.stat >= SOFT_CRIT || HAS_TRAIT(organ_owner, TRAIT_KNOCKEDOUT)) stop_wag(organ_owner) ///We need some special behaviour for accessories, wrapped here so we can easily add more interactions later @@ -136,7 +136,7 @@ return succeeded organ_owner.update_body_parts() - UnregisterSignal(organ_owner, COMSIG_MOB_STATCHANGE) + UnregisterSignal(organ_owner, list(COMSIG_MOB_STATCHANGE, SIGNAL_ADDTRAIT(TRAIT_KNOCKEDOUT))) return succeeded /obj/item/organ/tail/proc/get_butt_sprite() diff --git a/code/modules/surgery/organs/internal/eyes/_eyes.dm b/code/modules/surgery/organs/internal/eyes/_eyes.dm index 44ead0137039..945b37cdcb92 100644 --- a/code/modules/surgery/organs/internal/eyes/_eyes.dm +++ b/code/modules/surgery/organs/internal/eyes/_eyes.dm @@ -327,15 +327,7 @@ eyelid_right.render_target = "*[REF(parent)]_eyelid_right" parent.vis_contents += eyelid_left parent.vis_contents += eyelid_right - var/sync_blinking = synchronized_blinking && (parent.get_organ_loss(ORGAN_SLOT_BRAIN) < ASYNC_BLINKING_BRAIN_DAMAGE) - // Randomize order for unsynched animations - if (sync_blinking || prob(50)) - var/list/anim_times = animate_eyelid(eyelid_left, parent, sync_blinking) - animate_eyelid(eyelid_right, parent, sync_blinking, anim_times) - else - var/list/anim_times = animate_eyelid(eyelid_right, parent, sync_blinking) - animate_eyelid(eyelid_left, parent, sync_blinking, anim_times) - + animate_eyelids(parent) var/mutable_appearance/left_eyelid_overlay = mutable_appearance(layer = -BODY_LAYER, offset_spokesman = parent) var/mutable_appearance/right_eyelid_overlay = mutable_appearance(layer = -BODY_LAYER, offset_spokesman = parent) left_eyelid_overlay.render_source = "*[REF(parent)]_eyelid_left" @@ -345,25 +337,73 @@ /// Animates one eyelid at a time, thanks BYOND and thanks animation chains /obj/item/organ/eyes/proc/animate_eyelid(obj/effect/abstract/eyelid_effect/eyelid, mob/living/carbon/human/parent, sync_blinking = TRUE, list/anim_times = null) . = list() + if(isnull(eyelid)) // Can't blink if we don't have an eyelid + return var/prevent_loops = HAS_TRAIT(parent, TRAIT_PREVENT_BLINK_LOOPS) animate(eyelid, alpha = 0, time = 0, loop = (prevent_loops ? 0 : -1)) - for (var/i in 1 to (prevent_loops ? 1 : BLINK_LOOPS)) - var/wait_time = rand(BASE_BLINKING_DELAY - RAND_BLINKING_DELAY, BASE_BLINKING_DELAY + RAND_BLINKING_DELAY) + + var/wait_time = rand(BASE_BLINKING_DELAY - RAND_BLINKING_DELAY, BASE_BLINKING_DELAY + RAND_BLINKING_DELAY) + if (anim_times) + if (sync_blinking) + wait_time = anim_times[1] + else + wait_time = rand(max(BASE_BLINKING_DELAY - RAND_BLINKING_DELAY, anim_times[1] - RAND_BLINKING_DELAY), anim_times[1]) + + animate(time = wait_time) + . += wait_time + + var/cycles = (prevent_loops ? 1 : BLINK_LOOPS) + for (var/i in 1 to cycles) if (anim_times) if (sync_blinking) - wait_time = anim_times[1] - anim_times.Cut(1, 2) + wait_time = anim_times[i + 1] else - wait_time = rand(max(BASE_BLINKING_DELAY - RAND_BLINKING_DELAY, anim_times[1] - RAND_BLINKING_DELAY), anim_times[1]) + wait_time = rand(max(BASE_BLINKING_DELAY - RAND_BLINKING_DELAY, anim_times[i + 1] - RAND_BLINKING_DELAY), anim_times[i + 1]) + else + wait_time = rand(BASE_BLINKING_DELAY - RAND_BLINKING_DELAY, BASE_BLINKING_DELAY + RAND_BLINKING_DELAY) . += wait_time if (anim_times && !sync_blinking) // Make sure that we're somewhat in sync with the other eye - animate(time = anim_times[1] - wait_time) - anim_times.Cut(1, 2) + var/offset_time = anim_times[i + 1] - wait_time + if(offset_time) // For some reason having time == 0 in this case breaks animate + animate(time = offset_time) animate(alpha = 255, time = 0) animate(time = BLINK_DURATION) - animate(alpha = 0, time = 0) - animate(time = wait_time) + if (i != cycles) + animate(alpha = 0, time = 0) + animate(time = wait_time) + +/obj/item/organ/eyes/proc/blink(duration = BLINK_DURATION, restart_animation = TRUE) + if(!blink_animation) + return + var/left_delayed = prob(50) + // Storing blink delay so mistimed blinks of lizards don't get cut short + var/sync_blinking = synchronized_blinking && (owner.get_organ_loss(ORGAN_SLOT_BRAIN) < BRAIN_DAMAGE_ASYNC_BLINKING) + var/blink_delay = sync_blinking ? 0 : rand(0, RAND_BLINKING_DELAY) + animate(eyelid_left, alpha = 0, time = 0) + if (!sync_blinking && left_delayed) + animate(time = blink_delay) + animate(alpha = 255, time = 0) + animate(time = duration) + animate(alpha = 0, time = 0) + animate(eyelid_right, alpha = 0, time = 0) + if (!sync_blinking && !left_delayed) + animate(time = blink_delay) + animate(alpha = 255, time = 0) + animate(time = duration) + animate(alpha = 0, time = 0) + if (restart_animation) + addtimer(CALLBACK(src, PROC_REF(animate_eyelids), owner), blink_delay + duration) + +/obj/item/organ/eyes/proc/animate_eyelids(mob/living/carbon/human/parent) + var/sync_blinking = synchronized_blinking && (parent.get_organ_loss(ORGAN_SLOT_BRAIN) < BRAIN_DAMAGE_ASYNC_BLINKING) + // Randomize order for unsynched animations + if (sync_blinking || prob(50)) + var/list/anim_times = animate_eyelid(eyelid_left, parent, sync_blinking) + animate_eyelid(eyelid_right, parent, sync_blinking, anim_times) + else + var/list/anim_times = animate_eyelid(eyelid_right, parent, sync_blinking) + animate_eyelid(eyelid_left, parent, sync_blinking, anim_times) /obj/effect/abstract/eyelid_effect name = "eyelid" diff --git a/maplestation_modules/code/game/objects/items/storage/pouch.dm b/maplestation_modules/code/game/objects/items/storage/pouch.dm index efb4f198d802..ab6500953b0a 100644 --- a/maplestation_modules/code/game/objects/items/storage/pouch.dm +++ b/maplestation_modules/code/game/objects/items/storage/pouch.dm @@ -53,6 +53,7 @@ /obj/item/grenade, /obj/item/hand_tele, /obj/item/implanter, + /obj/item/inhaler, /obj/item/instrument/harmonica, /obj/item/instrument/piano_synth/headphones, /obj/item/knife,