From a17713393652101cada7ccc42e2d3db85ccffddc Mon Sep 17 00:00:00 2001 From: Changelogs Date: Tue, 16 Apr 2024 01:11:43 +0000 Subject: [PATCH 01/20] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-1654.yml | 4 ---- html/changelogs/archive/2024-04.yml | 3 +++ 2 files changed, 3 insertions(+), 4 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-1654.yml diff --git a/html/changelogs/AutoChangeLog-pr-1654.yml b/html/changelogs/AutoChangeLog-pr-1654.yml deleted file mode 100644 index 75bf62c0e1e9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1654.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KnigTheThrasher" -delete-after: True -changes: - - bugfix: "Fixed Icebox tests" \ No newline at end of file diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml index 28d6899e2947..fabf91a4b596 100644 --- a/html/changelogs/archive/2024-04.yml +++ b/html/changelogs/archive/2024-04.yml @@ -178,3 +178,6 @@ - qol: Mute people who can still use sign language are now capable of using sign language to invoke spells. Wizards are still too egotistical to even consider doing so, tho. +2024-04-16: + KnigTheThrasher: + - bugfix: Fixed Icebox tests From c5b112e5df0053036bf50aaade5cd2324f2cf128 Mon Sep 17 00:00:00 2001 From: TTNT789 <105447889+TTNT789@users.noreply.github.com> Date: Mon, 15 Apr 2024 20:16:23 -0600 Subject: [PATCH 02/20] aaaaaaaaaaaaaaaaaa (#1667) --- code/modules/vending/autodrobe.dm | 2 ++ monkestation/code/modules/viking/viking_armour.dm | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/code/modules/vending/autodrobe.dm b/code/modules/vending/autodrobe.dm index deae8acc20fe..6a8f4fa52bb8 100644 --- a/code/modules/vending/autodrobe.dm +++ b/code/modules/vending/autodrobe.dm @@ -14,6 +14,8 @@ "products" = list( /obj/item/clothing/under/costume/gladiator = 1, /obj/item/clothing/head/helmet/gladiator = 1, + /obj/item/clothing/head/viking/fake_helmet = 1, //monkestation edit + /obj/item/clothing/under/viking/fake_tunic = 1, //monkestation edit /obj/item/clothing/suit/toggle/labcoat/mad = 1, /obj/item/clothing/suit/bio_suit/plaguedoctorsuit = 1, /obj/item/clothing/head/bio_hood/plague = 1, diff --git a/monkestation/code/modules/viking/viking_armour.dm b/monkestation/code/modules/viking/viking_armour.dm index 9c5bacd94e5e..046378082285 100644 --- a/monkestation/code/modules/viking/viking_armour.dm +++ b/monkestation/code/modules/viking/viking_armour.dm @@ -97,6 +97,18 @@ clothing_flags = STOPSPRESSUREDAMAGE female_sprite_flags = FEMALE_UNIFORM_TOP_ONLY +/obj/item/clothing/under/viking/fake_tunic + name = "viking pelt" + desc = "A faux wolf pelt made to cosplay with" + worn_icon_state = "pelts" + icon_state = "pelts" + w_class = WEIGHT_CLASS_NORMAL + +/obj/item/clothing/head/viking/fake_helmet + name = "foam helmet" + desc = "a foam helmet that looks like that of a vikings helmet" + worn_icon_state = "honeless_helm_worn" + icon_state = "hornless_helm_item" /datum/armor/viking melee = 45 bullet = 30 From 7cbdf5515753f0cb7949079a089fc83c7de4b996 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 02:16:51 +0000 Subject: [PATCH 03/20] Automatic changelog for PR #1667 [ci skip] --- html/changelogs/AutoChangeLog-pr-1667.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1667.yml diff --git a/html/changelogs/AutoChangeLog-pr-1667.yml b/html/changelogs/AutoChangeLog-pr-1667.yml new file mode 100644 index 000000000000..80a3ea02973d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1667.yml @@ -0,0 +1,4 @@ +author: "TTNT789" +delete-after: True +changes: + - rscadd: "adds a viking costume to the autodrobe" \ No newline at end of file From 134d67711ec9d0c8ddc17c65567b4219d74c41a6 Mon Sep 17 00:00:00 2001 From: Yawet330 <65188584+Yawet330@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:38:12 +0100 Subject: [PATCH 04/20] {FIX} Fusion no longer glasses the station. (#1675) * never let this man cook again * yippiee (balancing) * Update reactions.dm --- code/modules/atmospherics/gasmixtures/reactions.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 736e438ab6c1..b1c08db0e731 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -1227,8 +1227,8 @@ var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up. if(prob(PERCENT(particle_chance))) location.fire_nuclear_particle() - var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + 5000, 0) - radiation_pulse(location,rad_power) + var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + 250, 15000) //Wow! + radiation_pulse(location, rand(1,30), 9, 60, 2 SECONDS, rad_power, 1) // Nonmodular. Fixes fusion going wacko mode - makes it significantly harder to irradiate people through walls, and fixes the range issue. var/new_heat_capacity = air.heat_capacity() if(new_heat_capacity > MINIMUM_HEAT_CAPACITY && (air.temperature <= FUSION_MAXIMUM_TEMPERATURE || reaction_energy <= 0)) //If above FUSION_MAXIMUM_TEMPERATURE, will only adjust temperature for endothermic reactions. air.temperature = clamp(((air.temperature*old_heat_capacity + reaction_energy)/new_heat_capacity),TCMB,INFINITY) From 953010c33beb0e9f9526624e994d5abdb26c1a99 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:38:32 +0000 Subject: [PATCH 05/20] Automatic changelog for PR #1675 [ci skip] --- html/changelogs/AutoChangeLog-pr-1675.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1675.yml diff --git a/html/changelogs/AutoChangeLog-pr-1675.yml b/html/changelogs/AutoChangeLog-pr-1675.yml new file mode 100644 index 000000000000..6ae936c6fe55 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1675.yml @@ -0,0 +1,4 @@ +author: "Yawet330" +delete-after: True +changes: + - bugfix: "Fusion, why?" \ No newline at end of file From ed2cfed2833720833538af1dc2188581ff0297c4 Mon Sep 17 00:00:00 2001 From: KittyNoodle <78111117+KittyNoodle@users.noreply.github.com> Date: Tue, 16 Apr 2024 11:38:52 -0500 Subject: [PATCH 06/20] Makes some nerfs to hardlight spears (#1580) * nerfs * guh --- .../game/objects/items/implants/hardlight.dm | 38 +++++++------------ 1 file changed, 13 insertions(+), 25 deletions(-) diff --git a/monkestation/code/game/objects/items/implants/hardlight.dm b/monkestation/code/game/objects/items/implants/hardlight.dm index 5d7518b40a53..c77e5885472c 100644 --- a/monkestation/code/game/objects/items/implants/hardlight.dm +++ b/monkestation/code/game/objects/items/implants/hardlight.dm @@ -234,12 +234,6 @@ back_spear_overlay.pixel_x = -32 . += back_spear_overlay - -/obj/item/gun/magic/hardlight_spear/can_trigger_gun(mob/living/user, akimbo_usage) // This isn't really a gun, so it shouldn't be checking for TRAIT_NOGUNS, a firing pin (pinless), or a trigger guard (guardless) - if(akimbo_usage) - return FALSE //this would be kinda weird while shooting someone down. - return TRUE - /obj/item/gun/magic/hardlight_spear/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0) . = ..() if(!.) @@ -247,11 +241,16 @@ if(spears_left) var/obj/item/gun/magic/hardlight_spear/spear = new type spear.spears_left = spears_left - 1 + spear.apply_cooldown() qdel(src) user.put_in_hands(spear) else user.dropItemToGround(src, TRUE) +/obj/item/gun/magic/hardlight_spear/proc/apply_cooldown() + semicd = TRUE + addtimer(CALLBACK(src, PROC_REF(reset_semicd)), 1.5 SECONDS) + /obj/item/ammo_casing/magic/hardlight_spear name = "please god report this" desc = "Why god why" @@ -259,34 +258,23 @@ projectile_type = /obj/projectile/bullet/hardlight_spear heavy_metal = FALSE -/obj/item/ammo_casing/magic/hardlight_spear/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from) - if(!loaded_projectile) - return - - if(isliving(target)) - loaded_projectile.homing = TRUE - loaded_projectile.homing_turn_speed = 40 - loaded_projectile.set_homing_target(target) - - return ..() - /obj/projectile/bullet/hardlight_spear name = "hardlight spear" icon = 'monkestation/icons/obj/guns/projectiles.dmi' icon_state = "lightspear" - damage = 45 - armour_penetration = 10 - wound_bonus = 5 - bare_wound_bonus = 60 - wound_falloff_tile = 0 - embed_falloff_tile = 0 - speed = 0.4 //lower = faster + damage = 40 + armour_penetration = 5 + wound_bonus = -5 + bare_wound_bonus = 50 + wound_falloff_tile = -1 + embed_falloff_tile = -1 + speed = 0.7 //lower = faster shrapnel_type = /obj/item/shrapnel/bullet/spear light_outer_range = 1 light_power = 1 hitsound = 'sound/weapons/bladeslice.ogg' hitsound_wall = 'sound/weapons/parry.ogg' - embedding = list(embed_chance=100, fall_chance=2, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=5, jostle_pain_mult=6, rip_time=10) + embedding = list(embed_chance=70, fall_chance=6, jostle_chance=4, ignore_throwspeed_threshold=TRUE, pain_stam_pct=0.5, pain_mult=2, jostle_pain_mult=3, rip_time=10) /obj/item/shrapnel/bullet/spear name = "hardlight spear" From 88214dcf975885f0e5df9ab0d8522df72068cd30 Mon Sep 17 00:00:00 2001 From: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> Date: Tue, 16 Apr 2024 09:39:04 -0700 Subject: [PATCH 07/20] my obligatory quarterly CWC PR (#1626) * easy nerfs * not actually working --- code/__DEFINES/~monkestation/clock_cult.dm | 11 ++++++ monkestation/code/__HELPERS/reagents.dm | 5 +-- .../machines/observation_console.dm | 33 +++++++++++++++--- .../clock_cult/structures/airlock.dm | 5 +++ .../clock_cult/structures/the_ark.dm | 10 ------ .../modules/antagonists/clock_cult/turf.dm | 3 ++ .../code/modules/trading/lootbox_odds.dm | 5 +-- .../icons/mob/clock_cult/actions_clock.dmi | Bin 83392 -> 83575 bytes 8 files changed, 54 insertions(+), 18 deletions(-) diff --git a/code/__DEFINES/~monkestation/clock_cult.dm b/code/__DEFINES/~monkestation/clock_cult.dm index 8a1bb92a7446..e9c9424b50dd 100644 --- a/code/__DEFINES/~monkestation/clock_cult.dm +++ b/code/__DEFINES/~monkestation/clock_cult.dm @@ -5,5 +5,16 @@ #define SIGIL_TRANSMISSION_RANGE 4 +///base state the ark is created in, any state besides this will be a hostile environment +#define ARK_STATE_BASE 0 +///state for the grace period after the cult has reached its member count max and have enough activing anchoring crystals to summon +#define ARK_STATE_CHARGING 1 +///state for after the cult has been annouced as well as the first half of the assault +#define ARK_STATE_ACTIVE 2 +///state for the halfway point of ark activation +#define ARK_STATE_SUMMONING 3 +///the ark has either finished opening or been destroyed in this state +#define ARK_STATE_FINAL 4 + ///max damage taken per hit by "important" clock structures #define MAX_IMPORTANT_CLOCK_DAMAGE 30 diff --git a/monkestation/code/__HELPERS/reagents.dm b/monkestation/code/__HELPERS/reagents.dm index 4803b2044356..5400bdedafed 100644 --- a/monkestation/code/__HELPERS/reagents.dm +++ b/monkestation/code/__HELPERS/reagents.dm @@ -1,7 +1,8 @@ ///Returns a random reagent object minus ethanol reagents /proc/get_random_reagent_id_unrestricted_non_ethanol() - var/static/list/random_reagents = list() - if(!random_reagents.len) + var/static/list/random_reagents + if(!random_reagents) + random_reagents = list() for(var/datum/reagent/reagent_path as anything in subtypesof(/datum/reagent)) if(istype(reagent_path, /datum/reagent/consumable) && !initial(reagent_path.bypass_restriction)) continue diff --git a/monkestation/code/modules/antagonists/clock_cult/machines/observation_console.dm b/monkestation/code/modules/antagonists/clock_cult/machines/observation_console.dm index be7c8c793de2..42b7795e2773 100644 --- a/monkestation/code/modules/antagonists/clock_cult/machines/observation_console.dm +++ b/monkestation/code/modules/antagonists/clock_cult/machines/observation_console.dm @@ -4,18 +4,23 @@ icon_screen = "ratvar1" icon_keyboard = "ratvar_key1" icon_state = "ratvarcomputer" + resistance_flags = INDESTRUCTIBLE clockwork = TRUE lock_override = TRUE circuit = /obj/item/circuitboard/machine/camera_console_ratvar + ///List of areas we are allowed to warp to + var/static/list/allowed_areas = list() /obj/machinery/computer/camera_advanced/ratvar/Initialize(mapload) . = ..() START_PROCESSING(SSobj, src) actions += new /datum/action/innate/clockcult/warp(src) + actions += new /datum/action/innate/clockcult/console_info(src) + actions += new /datum/action/innate/clockcult/add_warp_area(src, src) /obj/machinery/computer/camera_advanced/ratvar/Destroy() STOP_PROCESSING(SSobj, src) - . = ..() + return ..() /obj/machinery/computer/camera_advanced/ratvar/process(seconds_per_tick) if(SPT_PROB(3, seconds_per_tick)) @@ -52,7 +57,7 @@ /datum/action/innate/clockcult/warp/Activate() if(!isliving(owner)) return - if(GLOB.clock_ark && GLOB.clock_ark.current_state >= 2) //equal to ARK_STATE_ACTIVE, not using the defines so we can #undef them + if(GLOB.clock_ark && GLOB.clock_ark.current_state >= ARK_STATE_ACTIVE) to_chat(owner, span_brass("You cannot warp while the gateway is opening!")) return if(warping) @@ -76,14 +81,34 @@ warping = TRUE button_icon_state = "warp_cancel" build_all_button_icons(UPDATE_BUTTON_ICON) - if(do_after(cam_user, 5 SECONDS, target = target_loc, extra_checks = CALLBACK(src, PROC_REF(special_check)))) + if(do_after(cam_user, 5 SECONDS, target = target_loc, extra_checks = CALLBACK(src, PROC_REF(warping_check)))) try_servant_warp(cam_user, target_loc) button_icon_state = "warp_down" build_all_button_icons(UPDATE_BUTTON_ICON) warping = FALSE -/datum/action/innate/clockcult/warp/proc/special_check() +/datum/action/innate/clockcult/warp/proc/warping_check() return warping +/datum/action/innate/clockcult/console_info + name = "Console info" + desc = "Get info on this console." + button_icon_state = "console_info" + +/datum/action/innate/clockcult/add_warp_area + name = "Add Warp Area" + desc = "Add an additional area you can warp to." + button_icon_state = "Spatial Warp" + ///Ref to the console we are linked to + var/obj/machinery/computer/camera_advanced/ratvar/linked_console + +/datum/action/innate/clockcult/add_warp_area/New(Target, console) + . = ..() + linked_console = console + +/datum/action/innate/clockcult/add_warp_area/Destroy() + linked_console = null + return ..() + /obj/item/circuitboard/machine/camera_console_ratvar build_path = /obj/machinery/computer/camera_advanced/ratvar diff --git a/monkestation/code/modules/antagonists/clock_cult/structures/airlock.dm b/monkestation/code/modules/antagonists/clock_cult/structures/airlock.dm index 0b678db0a8e0..c14bf31356c6 100644 --- a/monkestation/code/modules/antagonists/clock_cult/structures/airlock.dm +++ b/monkestation/code/modules/antagonists/clock_cult/structures/airlock.dm @@ -11,6 +11,11 @@ req_access = list(ACCESS_CLOCKCULT) damage_deflection = 10 +/obj/machinery/door/airlock/bronze/clock/Initialize(mapload) + . = ..() + if(on_reebe(src)) + damage_deflection = 0 + /obj/machinery/door/airlock/bronze/clock/canAIControl(mob/user) return (IS_CLOCK(user) && !isAllPowerCut()) diff --git a/monkestation/code/modules/antagonists/clock_cult/structures/the_ark.dm b/monkestation/code/modules/antagonists/clock_cult/structures/the_ark.dm index 48fb92ad8923..a10d48c3f560 100644 --- a/monkestation/code/modules/antagonists/clock_cult/structures/the_ark.dm +++ b/monkestation/code/modules/antagonists/clock_cult/structures/the_ark.dm @@ -1,11 +1,6 @@ GLOBAL_DATUM(clock_ark, /obj/structure/destructible/clockwork/the_ark) //set to be equal to the ark on creation if none GLOBAL_VAR_INIT(ratvar_risen, FALSE) -#define ARK_STATE_BASE 0 //base state the ark is created in, any state besides this will be a hostile environment -#define ARK_STATE_CHARGING 1 //state for the grace period after the cult has reached its member count max and have an active anchor crystal -#define ARK_STATE_ACTIVE 2 //state for after the cult has been annouced as well as the first half of the assault -#define ARK_STATE_SUMMONING 3 //state for the halfway point of ark activation -#define ARK_STATE_FINAL 4 //the ark has either finished opening or been destroyed in this state #define ARK_READY_PERIOD 300 SECONDS //how long until the cult is annouced after they reach max members, 5 minutes #define ARK_GRACE_PERIOD 210 SECONDS //how long until the portals open after the cult is annouced, 3 minutes 30 seconds #define ARK_ASSAULT_PERIOD 600 //how long the crew has to destroy the ark after the assault begins, 10 minutes @@ -239,11 +234,6 @@ GLOBAL_VAR_INIT(ratvar_risen, FALSE) explosion(pick(GLOB.abscond_markers), 50, 40, 30, 30, FALSE, TRUE) SSticker.force_ending = TRUE -#undef ARK_STATE_BASE -#undef ARK_STATE_CHARGING -#undef ARK_STATE_ACTIVE -#undef ARK_STATE_SUMMONING -#undef ARK_STATE_FINAL #undef ARK_READY_PERIOD #undef ARK_GRACE_PERIOD #undef ARK_ASSAULT_PERIOD diff --git a/monkestation/code/modules/antagonists/clock_cult/turf.dm b/monkestation/code/modules/antagonists/clock_cult/turf.dm index c8e33fe5e01d..8bd077ff4d42 100644 --- a/monkestation/code/modules/antagonists/clock_cult/turf.dm +++ b/monkestation/code/modules/antagonists/clock_cult/turf.dm @@ -195,6 +195,9 @@ //do the deconstruction stuff, this really should be a proc on Rwalls as well /turf/closed/wall/clockwork/proc/next_decon_state(obj/item/used_tool, mob/user, current_state, set_state, sent_message, use_time = 4 SECONDS) + if(on_reebe(src)) + use_time = round(use_time / 2, 0.1) //each stage takes half as long on reebe + if(used_tool.use_tool(src, user, use_time, volume=100)) if(!istype(src, /turf/closed/wall/clockwork) || d_state != current_state) return TRUE diff --git a/monkestation/code/modules/trading/lootbox_odds.dm b/monkestation/code/modules/trading/lootbox_odds.dm index 33619926ab6c..18773422b2bb 100644 --- a/monkestation/code/modules/trading/lootbox_odds.dm +++ b/monkestation/code/modules/trading/lootbox_odds.dm @@ -32,8 +32,9 @@ user.client.client_token_holder.adjust_antag_tokens(LOW_THREAT, 1) if("Loadout Item") - var/static/list/viable_types = list() - if(!length(viable_types)) + var/static/list/viable_types + if(!viable_types) + viable_types = list() for(var/datum/loadout_item/type as anything in subtypesof(/datum/loadout_item)) var/datum/loadout_item/listed = new type() if(!istype(listed)) diff --git a/monkestation/icons/mob/clock_cult/actions_clock.dmi b/monkestation/icons/mob/clock_cult/actions_clock.dmi index 76cda1eed5697944cbc3ec57e8934fc9e60c3b67..a6b6f3832af34c7b35c71fe775455e1a86f3e67b 100644 GIT binary patch delta 4919 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 M07*qoM6N<$f=xqPeE Date: Tue, 16 Apr 2024 11:41:25 -0500 Subject: [PATCH 08/20] 2 tail (#1671) --- .../new_player/sprite_accessories/anime.dm | 10 ++++++++++ monkestation/icons/mob/anime/anime_bottom.dmi | Bin 5152 -> 5754 bytes 2 files changed, 10 insertions(+) diff --git a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/anime.dm b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/anime.dm index 2ffaa4b5f2ef..6faea383a344 100644 --- a/monkestation/code/modules/mob/dead/new_player/sprite_accessories/anime.dm +++ b/monkestation/code/modules/mob/dead/new_player/sprite_accessories/anime.dm @@ -165,3 +165,13 @@ /datum/sprite_accessory/anime_bottom/bunny name = "Bunny Puff" icon_state = "playbunny" + +/datum/sprite_accessory/anime_bottom/mouse + name = "Mouse Tail" + icon_state = "mouse" + color_src = null + +/datum/sprite_accessory/anime_bottom/plug + name = "Plug" + icon_state = "plug" + hasinner = TRUE diff --git a/monkestation/icons/mob/anime/anime_bottom.dmi b/monkestation/icons/mob/anime/anime_bottom.dmi index bc6d43e412f063cfb4f2bc01f2d0b6928d55e3a7..03db829882112bd8b6ae07d3994638bf25433634 100644 GIT binary patch literal 5754 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 literal 5152 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 U-w@$u=eL#i)=pN%$GzhI2Xtf2q5uE@ From be02e08cd7d8c7e62dd657f6dc5720d30724e592 Mon Sep 17 00:00:00 2001 From: Lucy Date: Tue, 16 Apr 2024 12:41:55 -0400 Subject: [PATCH 09/20] Heavily increases and randomizes the speech cooldown of parrots (#1666) * Revert "Reduces common/loudmode poly spam" This reverts commit 28cfa315cc851e5576b9a5f0f8295e20d7261fcc. * Heavily increases the speech cooldown of parrots --- .../living/basic/pets/parrot/parrot_ai/parroting_action.dm | 7 ------- .../living/basic/pets/parrot/parrot_ai/parroting_action.dm | 5 +++++ tgstation.dme | 1 + 3 files changed, 6 insertions(+), 7 deletions(-) create mode 100644 monkestation/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm diff --git a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm index 52f516ee4060..d1488a60b3bb 100644 --- a/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm +++ b/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm @@ -36,13 +36,6 @@ modified_speech = copytext_char(speech, 3) else - // monke start - stfu poly - var/speak_prob = speaking_pawn.ears.use_command ? 25 : 50 - for(var/channel in list(RADIO_KEY_COMMON, RADIO_TOKEN_COMMAND)) - if(channel in available_channels) - speak_prob = max(FLOOR(speak_prob * 0.4, 5), 5) - use_radio = prob(speak_prob) - // monke end if(HAS_CHANNEL_PREFIX) modified_speech = "[use_radio ? pick(available_channels) : ""][copytext_char(speech, 3)]" else diff --git a/monkestation/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm b/monkestation/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm new file mode 100644 index 000000000000..96c6ed44340c --- /dev/null +++ b/monkestation/code/modules/mob/living/basic/pets/parrot/parrot_ai/parroting_action.dm @@ -0,0 +1,5 @@ +/datum/ai_behavior/perform_speech/parrot + action_cooldown = 45 SECONDS // SHUT UP + +/datum/ai_behavior/perform_speech/parrot/perform(seconds_per_tick, datum/ai_controller/controller, ...) + controller.behavior_cooldowns[src] = world.time + rand(45 SECONDS, 3 MINUTES) diff --git a/tgstation.dme b/tgstation.dme index 4745f7942a9b..f548884e8d07 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6412,6 +6412,7 @@ #include "monkestation\code\modules\mob\living\basic\animatronic.dm" #include "monkestation\code\modules\mob\living\basic\ggg\glerm.dm" #include "monkestation\code\modules\mob\living\basic\ggg\susflash.dm" +#include "monkestation\code\modules\mob\living\basic\pets\parrot\parrot_ai\parroting_action.dm" #include "monkestation\code\modules\mob\living\basic\space_fauna\fugu_gland.dm" #include "monkestation\code\modules\mob\living\basic\vermin\mouse.dm" #include "monkestation\code\modules\mob\living\carbon\carbon_death.dm" From f4ef72cce58e61b9d8ef1ba87e8a7854eb07c3cf Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:42:03 +0000 Subject: [PATCH 10/20] Automatic changelog for PR #1580 [ci skip] --- html/changelogs/AutoChangeLog-pr-1580.yml | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1580.yml diff --git a/html/changelogs/AutoChangeLog-pr-1580.yml b/html/changelogs/AutoChangeLog-pr-1580.yml new file mode 100644 index 000000000000..8c900dfc8c72 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1580.yml @@ -0,0 +1,8 @@ +author: "KittyNoodle" +delete-after: True +changes: + - balance: "Hardlight spears can no longer be used with scarp." + - balance: "Hardlight spear damage and wounding reduced." + - balance: "Hardlight spear homing removed." + - balance: "Hardlight spear embed chance halved" + - balance: "Hardlight spears now have cooldown after firing before you can use another spear." \ No newline at end of file From 0567b45827603d5b8807cda5192fd12cdf4d9ef8 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:42:03 +0000 Subject: [PATCH 11/20] Automatic changelog for PR #1626 [ci skip] --- html/changelogs/AutoChangeLog-pr-1626.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1626.yml diff --git a/html/changelogs/AutoChangeLog-pr-1626.yml b/html/changelogs/AutoChangeLog-pr-1626.yml new file mode 100644 index 000000000000..b1e10aac090f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1626.yml @@ -0,0 +1,5 @@ +author: "wraith-54321" +delete-after: True +changes: + - balance: "Clockwork airlocks lose their damage deflection when placed on reebe" + - balance: "Clockwork walls take half as long to deconstruct on reebe" \ No newline at end of file From 11a8bb6164c4f34acb0fb0ade0c4b1580b24915d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:43:28 +0000 Subject: [PATCH 12/20] Automatic changelog for PR #1671 [ci skip] --- html/changelogs/AutoChangeLog-pr-1671.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1671.yml diff --git a/html/changelogs/AutoChangeLog-pr-1671.yml b/html/changelogs/AutoChangeLog-pr-1671.yml new file mode 100644 index 000000000000..390459ed91bb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1671.yml @@ -0,0 +1,4 @@ +author: "DimWhat" +delete-after: True +changes: + - rscadd: "Added two new tails to the anime quirk" \ No newline at end of file From b1f8bd4cc573f745ea305c00a32c74295efe1291 Mon Sep 17 00:00:00 2001 From: KnigTheThrasher <152086196+KnigTheThrasher@users.noreply.github.com> Date: Tue, 16 Apr 2024 18:47:42 +0200 Subject: [PATCH 13/20] Fixes tramstation disposals (#1665) * fixes disposals on tram * even more fixes --------- Co-authored-by: KnighTheThrasher --- _maps/map_files/tramstation/tramstation.dmm | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 096c0677e899..4903964ca680 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -19077,6 +19077,16 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) +"eXC" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central) "eYi" = ( /obj/machinery/camera/directional/east, /mob/living/basic/chicken/brown, @@ -126540,8 +126550,8 @@ hFC bwz xks qxm -icR -icR +eXC +lLW iix tuN tuN @@ -127825,7 +127835,7 @@ oys oys gDw gDw -nop +bay nop hPn eyE @@ -128080,8 +128090,8 @@ kHX gDw gDw gDw -nop -nop +bay +uJu nop oys oys From 5e408619190f485b5be181b7863e76f6ee3cbcec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 16:50:33 +0000 Subject: [PATCH 14/20] Automatic changelog for PR #1666 [ci skip] --- html/changelogs/AutoChangeLog-pr-1666.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1666.yml diff --git a/html/changelogs/AutoChangeLog-pr-1666.yml b/html/changelogs/AutoChangeLog-pr-1666.yml new file mode 100644 index 000000000000..5558f3f0e7c6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1666.yml @@ -0,0 +1,4 @@ +author: "Absolucy" +delete-after: True +changes: + - qol: "Heavily increases and randomizes the speech cooldown of parrots." \ No newline at end of file From 813cc05d3916987d5f2038d6e4da1a4b294d5bf0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 17:03:15 +0000 Subject: [PATCH 15/20] Automatic changelog for PR #1665 [ci skip] --- html/changelogs/AutoChangeLog-pr-1665.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1665.yml diff --git a/html/changelogs/AutoChangeLog-pr-1665.yml b/html/changelogs/AutoChangeLog-pr-1665.yml new file mode 100644 index 000000000000..29d21e3074e5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1665.yml @@ -0,0 +1,4 @@ +author: "KnigTheThrasher" +delete-after: True +changes: + - bugfix: "Tram disposals should work now" \ No newline at end of file From 78f17a1bee2973baa5211d1177833897a27b328a Mon Sep 17 00:00:00 2001 From: Changelogs Date: Wed, 17 Apr 2024 01:12:23 +0000 Subject: [PATCH 16/20] Automatic changelog compile [ci skip] --- html/changelogs/AutoChangeLog-pr-1580.yml | 8 -------- html/changelogs/AutoChangeLog-pr-1626.yml | 5 ----- html/changelogs/AutoChangeLog-pr-1665.yml | 4 ---- html/changelogs/AutoChangeLog-pr-1666.yml | 4 ---- html/changelogs/AutoChangeLog-pr-1667.yml | 4 ---- html/changelogs/AutoChangeLog-pr-1671.yml | 4 ---- html/changelogs/AutoChangeLog-pr-1675.yml | 4 ---- html/changelogs/archive/2024-04.yml | 21 +++++++++++++++++++++ 8 files changed, 21 insertions(+), 33 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-1580.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1626.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1665.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1666.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1667.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1671.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-1675.yml diff --git a/html/changelogs/AutoChangeLog-pr-1580.yml b/html/changelogs/AutoChangeLog-pr-1580.yml deleted file mode 100644 index 8c900dfc8c72..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1580.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "KittyNoodle" -delete-after: True -changes: - - balance: "Hardlight spears can no longer be used with scarp." - - balance: "Hardlight spear damage and wounding reduced." - - balance: "Hardlight spear homing removed." - - balance: "Hardlight spear embed chance halved" - - balance: "Hardlight spears now have cooldown after firing before you can use another spear." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1626.yml b/html/changelogs/AutoChangeLog-pr-1626.yml deleted file mode 100644 index b1e10aac090f..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1626.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "wraith-54321" -delete-after: True -changes: - - balance: "Clockwork airlocks lose their damage deflection when placed on reebe" - - balance: "Clockwork walls take half as long to deconstruct on reebe" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1665.yml b/html/changelogs/AutoChangeLog-pr-1665.yml deleted file mode 100644 index 29d21e3074e5..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1665.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KnigTheThrasher" -delete-after: True -changes: - - bugfix: "Tram disposals should work now" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1666.yml b/html/changelogs/AutoChangeLog-pr-1666.yml deleted file mode 100644 index 5558f3f0e7c6..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1666.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Absolucy" -delete-after: True -changes: - - qol: "Heavily increases and randomizes the speech cooldown of parrots." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1667.yml b/html/changelogs/AutoChangeLog-pr-1667.yml deleted file mode 100644 index 80a3ea02973d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1667.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "TTNT789" -delete-after: True -changes: - - rscadd: "adds a viking costume to the autodrobe" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1671.yml b/html/changelogs/AutoChangeLog-pr-1671.yml deleted file mode 100644 index 390459ed91bb..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1671.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DimWhat" -delete-after: True -changes: - - rscadd: "Added two new tails to the anime quirk" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1675.yml b/html/changelogs/AutoChangeLog-pr-1675.yml deleted file mode 100644 index 6ae936c6fe55..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1675.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Yawet330" -delete-after: True -changes: - - bugfix: "Fusion, why?" \ No newline at end of file diff --git a/html/changelogs/archive/2024-04.yml b/html/changelogs/archive/2024-04.yml index fabf91a4b596..b77717544386 100644 --- a/html/changelogs/archive/2024-04.yml +++ b/html/changelogs/archive/2024-04.yml @@ -181,3 +181,24 @@ 2024-04-16: KnigTheThrasher: - bugfix: Fixed Icebox tests +2024-04-17: + Absolucy: + - qol: Heavily increases and randomizes the speech cooldown of parrots. + DimWhat: + - rscadd: Added two new tails to the anime quirk + KittyNoodle: + - balance: Hardlight spears can no longer be used with scarp. + - balance: Hardlight spear damage and wounding reduced. + - balance: Hardlight spear homing removed. + - balance: Hardlight spear embed chance halved + - balance: Hardlight spears now have cooldown after firing before you can use another + spear. + KnigTheThrasher: + - bugfix: Tram disposals should work now + TTNT789: + - rscadd: adds a viking costume to the autodrobe + Yawet330: + - bugfix: Fusion, why? + wraith-54321: + - balance: Clockwork airlocks lose their damage deflection when placed on reebe + - balance: Clockwork walls take half as long to deconstruct on reebe From 391c7c705e8480c5b9fd5c51d21544ad2c0d9568 Mon Sep 17 00:00:00 2001 From: Lucy Date: Wed, 17 Apr 2024 21:11:30 -0400 Subject: [PATCH 17/20] Fix holoparasite resetting not working (#1658) --- code/controllers/subsystem/polling.dm | 3 +++ code/modules/mob/living/basic/guardian/guardian_verbs.dm | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/polling.dm b/code/controllers/subsystem/polling.dm index 2bed96ac7d40..6d9821ca85be 100644 --- a/code/controllers/subsystem/polling.dm +++ b/code/controllers/subsystem/polling.dm @@ -181,6 +181,9 @@ SUBSYSTEM_DEF(polling) /datum/controller/subsystem/polling/proc/poll_ghost_candidates_for_mob(question, role, check_jobban, poll_time = 30 SECONDS, mob/target_mob, ignore_category = null, flashwindow = TRUE, pic_source, role_name_text) var/static/list/mob/currently_polling_mobs = list() + if(!isnull(target_mob) && !ismob(target_mob)) + stack_trace("attempted to use a non-mob as the target mob ([target_mob] | [target_mob.type])") + if(currently_polling_mobs.Find(target_mob)) return list() diff --git a/code/modules/mob/living/basic/guardian/guardian_verbs.dm b/code/modules/mob/living/basic/guardian/guardian_verbs.dm index abf536503b2a..f2e81306c515 100644 --- a/code/modules/mob/living/basic/guardian/guardian_verbs.dm +++ b/code/modules/mob/living/basic/guardian/guardian_verbs.dm @@ -170,9 +170,8 @@ "Do you want to play as [owner.real_name]'s [chosen_guardian.theme.name]?", check_jobban = ROLE_PAI, poll_time = 10 SECONDS, - target_mob = src, + target_mob = owner, ignore_category = POLL_IGNORE_HOLOPARASITE, - pic_source = src, role_name_text = chosen_guardian.theme.name ) if (!LAZYLEN(ghost_candidates)) From 5b2bde3971186a1d05b499155a7330a3dfa63c26 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 01:11:50 +0000 Subject: [PATCH 18/20] Automatic changelog for PR #1658 [ci skip] --- html/changelogs/AutoChangeLog-pr-1658.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1658.yml diff --git a/html/changelogs/AutoChangeLog-pr-1658.yml b/html/changelogs/AutoChangeLog-pr-1658.yml new file mode 100644 index 000000000000..6e6f666425ed --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1658.yml @@ -0,0 +1,5 @@ +author: "Absolucy" +delete-after: True +changes: + - bugfix: "Fix holoparasite resetting not working." + - code_imp: "Added a safety check that'll emit a (harmless) runtime if something tries to pass an invalid target mob to `SSpolling.poll_ghost_candidates_for_mob`." \ No newline at end of file From 19d3df10ca9d081e7ce798df45b79ec76e5b9ee7 Mon Sep 17 00:00:00 2001 From: Lucy Date: Thu, 18 Apr 2024 14:14:16 -0400 Subject: [PATCH 19/20] Xenobiology QoL/fixup pass (#1638) * Slime Rancher fixups * lol * weh * Only show status overlay on shift-click * alt -> ctrl * proper power usage defines * Make it easier to see output * Upgrade roundstart power cells of xenobio APCs; add more lights to Delta xenobio * Ensure all xenobio APCs start fully charged * Mutation syringes are now smol. * Fix mapping helpers * Fix Meta APC wiring --- _maps/map_files/BoxStation/BoxStation.dmm | 3 +- .../map_files/Deltastation/DeltaStation2.dmm | 15 ++- .../map_files/IceBoxStation/IceBoxStation.dmm | 2 + _maps/map_files/MetaStation/MetaStation.dmm | 8 +- _maps/map_files/tramstation/tramstation.dmm | 42 +++--- code/__DEFINES/maths.dm | 3 + code/game/objects/items/storage/bags.dm | 1 + .../crossbreeding/_status_effects.dm | 4 +- .../slimecore/items/mutation_syringe.dm | 51 +++++-- .../slimecore/machines/biomass_recycler.dm | 38 +++--- .../slimecore/machines/extract_requestor.dm | 4 +- .../ooze_compressor/ooze_compressor.dm | 82 +++++++---- .../ooze_compressor/ooze_compressor_hud.dm | 127 ++++++++++++++++++ .../ooze_compressor/recipes/_base_recipe.dm | 12 ++ .../modules/slimecore/machines/ooze_sucker.dm | 50 ++++++- .../slimecore/machines/slime_grinder.dm | 7 +- .../slimecore/machines/slime_market.dm | 82 ++++++----- .../machines/slime_market_computer.dm | 20 +-- .../machines/slime_pen_controller.dm | 46 +++---- .../modules/slimecore/mobs/_base_slime.dm | 9 +- tgstation.dme | 1 + 21 files changed, 444 insertions(+), 163 deletions(-) create mode 100644 monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_hud.dm diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index c157be159a4e..c1472d132ff8 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -9908,8 +9908,9 @@ "doR" = ( /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, -/obj/effect/mapping_helpers/apc/cell_5k, /obj/machinery/plumbing/ooze_compressor, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/full_charge, /turf/open/floor/iron/white, /area/station/science/xenobiology) "doW" = ( diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 29a07339b6ba..43768adc6127 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -42678,6 +42678,8 @@ /obj/effect/turf_decal/siding/purple{ dir = 9 }, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/full_charge, /turf/open/floor/iron, /area/station/science/xenobiology) "kpy" = ( @@ -89711,6 +89713,11 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/station/engineering/atmos) +"vUy" = ( +/obj/machinery/duct, +/obj/machinery/light/floor/has_bulb, +/turf/open/floor/engine, +/area/station/science/xenobiology) "vUz" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/iron/white, @@ -121069,7 +121076,7 @@ feF gcr pTC iLv -gvX +vUy duq fMl fMl @@ -121079,7 +121086,7 @@ taA fMl fMl xsN -gvX +vUy iLv mAt aAx @@ -122868,7 +122875,7 @@ woj rrU pTC iLv -gvX +vUy pQz fMl fMl @@ -122878,7 +122885,7 @@ taA fMl fMl esm -gvX +vUy iLv mAt cZl diff --git a/_maps/map_files/IceBoxStation/IceBoxStation.dmm b/_maps/map_files/IceBoxStation/IceBoxStation.dmm index 6cae56e2d386..10dc68395186 100644 --- a/_maps/map_files/IceBoxStation/IceBoxStation.dmm +++ b/_maps/map_files/IceBoxStation/IceBoxStation.dmm @@ -1194,6 +1194,8 @@ }, /obj/machinery/power/apc/auto_name/directional/south, /obj/structure/cable, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/full_charge, /turf/open/floor/iron/white, /area/station/science/xenobiology) "aut" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index bcc8844dcc25..b477ff8f1011 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -13278,6 +13278,8 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 8 }, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/full_charge, /turf/open/floor/iron/white, /area/station/science/cytology) "eYw" = ( @@ -32577,8 +32579,6 @@ /obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, /obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, /obj/machinery/duct, -/obj/machinery/power/apc/auto_name/directional/west, -/obj/structure/cable, /turf/open/floor/stone, /area/station/science/xenobiology) "lJh" = ( @@ -49930,6 +49930,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/effect/mapping_helpers/apc/full_charge, +/obj/structure/cable, /turf/open/floor/stone, /area/station/science/xenobiology) "rMz" = ( diff --git a/_maps/map_files/tramstation/tramstation.dmm b/_maps/map_files/tramstation/tramstation.dmm index 4903964ca680..cef5e292f535 100644 --- a/_maps/map_files/tramstation/tramstation.dmm +++ b/_maps/map_files/tramstation/tramstation.dmm @@ -19077,16 +19077,6 @@ }, /turf/open/floor/plating, /area/station/engineering/atmos/pumproom) -"eXC" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, -/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, -/obj/structure/cable, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/catwalk_floor, -/area/station/maintenance/starboard/central) "eYi" = ( /obj/machinery/camera/directional/east, /mob/living/basic/chicken/brown, @@ -44319,6 +44309,16 @@ /obj/structure/cable, /turf/open/floor/carpet, /area/station/command/heads_quarters/hos) +"nme" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 1 + }, +/obj/machinery/power/apc/auto_name/directional/north, +/obj/structure/cable, +/obj/effect/mapping_helpers/apc/cell_10k, +/obj/effect/mapping_helpers/apc/full_charge, +/turf/open/floor/stone, +/area/station/science/xenobiology) "nmf" = ( /obj/structure/table/wood, /obj/machinery/computer/security/wooden_tv, @@ -54568,14 +54568,6 @@ /obj/structure/cable, /turf/open/space/basic, /area/space/nearstation) -"qCW" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 1 - }, -/obj/machinery/power/apc/auto_name/directional/north, -/obj/structure/cable, -/turf/open/floor/stone, -/area/station/science/xenobiology) "qCX" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -67180,6 +67172,16 @@ /obj/machinery/door/firedoor, /turf/open/floor/iron, /area/station/cargo/drone_bay) +"uAW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2, +/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4, +/obj/structure/cable, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/catwalk_floor, +/area/station/maintenance/starboard/central) "uAZ" = ( /obj/effect/turf_decal/trimline/white/warning{ dir = 8 @@ -124267,7 +124269,7 @@ xPQ vud tml qVr -qCW +nme pbt xcM dtN @@ -126550,7 +126552,7 @@ hFC bwz xks qxm -eXC +uAW lLW iix tuN diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 18a07c0d0197..b86931a592a5 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -7,6 +7,9 @@ #define IS_FINITE__UNSAFE(a) (a-a == a-a) #define IS_FINITE(a) (isnum(a) && IS_FINITE__UNSAFE(a)) + +#define IS_SAFE_NUM(a) (isnum(a) && !IS_INF__UNSAFE(a) && IS_FINITE__UNSAFE(a)) + // ------------------------------------ // Aight dont remove the rest diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index 2ef99e3dc5f2..99d5fd4e91c9 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -508,6 +508,7 @@ /obj/item/reagent_containers/syringe, /obj/item/slime_extract, /obj/item/swab, + /obj/item/stack/biomass // monke: make science bags able to hold biomass cubes )) /* diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index a7c6c3baed07..366e4d2e692a 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -470,8 +470,8 @@ colour = "grey" /datum/status_effect/stabilized/grey/tick() - for(var/mob/living/basic/slime/S in range(1, get_turf(owner))) - SEND_SIGNAL(S, COMSIG_FRIENDSHIP_CHANGE, owner, 1) + for(var/mob/living/basic/slime/new_friend in range(3, get_turf(owner))) + SEND_SIGNAL(new_friend, COMSIG_FRIENDSHIP_CHANGE, owner, 1) return ..() /datum/status_effect/stabilized/orange diff --git a/monkestation/code/modules/slimecore/items/mutation_syringe.dm b/monkestation/code/modules/slimecore/items/mutation_syringe.dm index fd3998c06be8..75883df8a3ff 100644 --- a/monkestation/code/modules/slimecore/items/mutation_syringe.dm +++ b/monkestation/code/modules/slimecore/items/mutation_syringe.dm @@ -5,25 +5,41 @@ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' icon_state = "mutation_syringe" - ///the path we infuse + w_class = WEIGHT_CLASS_SMALL + + /// Type path of the slime trait to infuse. var/datum/slime_trait/infusing_trait_path - /// have we been used? - var/used = FALSE + /// Amount of uses remaining. + var/uses = 1 +/obj/item/slime_mutation_syringe/examine(mob/user) + . = ..() + if(uses) + . += span_notice("It has [uses] uses left.") + else + . += span_warning("It has been completely used up.") /obj/item/slime_mutation_syringe/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() - if(!infusing_trait_path || used) + if(!ispath(infusing_trait_path)) + return + if(!uses) + user.balloon_alert(user, "used up") + to_chat(user, span_warning("[src] has been completely used up!")) return if(!istype(target, /mob/living/basic/slime)) return var/mob/living/basic/slime/slime = target if(slime.add_trait(infusing_trait_path)) - used = TRUE - icon_state = "mutation_syringe-empty" + uses-- + update_icon_state() + user.balloon_alert_to_viewers("injected mutator") to_chat(user, span_notice("You inject [target] with [src].")) +/obj/item/slime_mutation_syringe/update_icon_state() + . = ..() + icon_state = uses ? initial(icon_state) : "[initial(icon_state)]-empty" /obj/item/slime_mutation_syringe/cleaner name = "cleaner slime mutation syringe" @@ -64,19 +80,32 @@ icon = 'monkestation/code/modules/slimecore/icons/slimes.dmi' icon_state = "mutation_syringe" - /// have we been used? - var/used = FALSE + /// Amount of uses remaining. + var/uses = 1 +/obj/item/slime_mutation_syringe_random/examine(mob/user) + . = ..() + if(uses) + . += span_notice("It has [uses] uses left.") + else + . += span_warning("It has been completely used up.") /obj/item/slime_mutation_syringe_random/afterattack(atom/target, mob/user, proximity_flag, click_parameters) . = ..() - if(used) + if(!uses) + user.balloon_alert(user, "used up") + to_chat(user, span_warning("[src] has been completely used up!")) return if(!istype(target, /mob/living/basic/slime)) return var/mob/living/basic/slime/slime = target slime.start_mutating(TRUE) - used = TRUE - icon_state = "mutation_syringe-empty" + uses-- + update_icon_state() + user.balloon_alert_to_viewers("injected mutator") to_chat(user, span_notice("You inject [target] with [src].")) + +/obj/item/slime_mutation_syringe_random/update_icon_state() + . = ..() + icon_state = uses ? initial(icon_state) : "[initial(icon_state)]-empty" diff --git a/monkestation/code/modules/slimecore/machines/biomass_recycler.dm b/monkestation/code/modules/slimecore/machines/biomass_recycler.dm index be89b669ffe2..bdb0a50209e1 100644 --- a/monkestation/code/modules/slimecore/machines/biomass_recycler.dm +++ b/monkestation/code/modules/slimecore/machines/biomass_recycler.dm @@ -34,37 +34,38 @@ GLOBAL_LIST_INIT(biomass_unlocks, list()) power_change() return TOOL_ACT_TOOLTYPE_SUCCESS -/obj/machinery/biomass_recycler/attackby(obj/item/O, mob/user, params) - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) - return - - if(default_pry_open(O)) - return - - if(default_deconstruction_crowbar(O)) +/obj/machinery/biomass_recycler/attackby(obj/item/item, mob/user, params) + . = ..() + if(. || default_deconstruction_screwdriver(user, "grinder_open", "grinder", item) || default_pry_open(item) || default_deconstruction_crowbar(item) || machine_stat) return - - if(machine_stat) //NOPOWER etc + if(istype(item, /obj/item/storage/bag/xeno)) + var/total_biomass = 0 + for(var/obj/item/stack/biomass/biomass in item) + total_biomass += biomass.amount + stored_matter += biomass.amount + qdel(biomass) + if(total_biomass > 0) + to_chat(user, span_notice("You dump [total_biomass] cube\s of biomass from [item] into [src].")) + user.balloon_alert_to_viewers("inserted biomass") return - - if(HAS_TRAIT(O, TRAIT_NODROP)) + else if(HAS_TRAIT(item, TRAIT_NODROP)) return - - if(istype(O, /obj/item/stack/biomass)) - var/obj/item/stack/biomass/biomass = O + else if(istype(item, /obj/item/stack/biomass)) + var/obj/item/stack/biomass/biomass = item to_chat(user, span_notice("You insert [biomass.amount] cube\s of biomass into [src].")) + user.balloon_alert_to_viewers("inserted biomass") stored_matter += biomass.amount qdel(biomass) return var/can_recycle for(var/recycable_type in recyclable_types) - if(istype(O, recycable_type)) + if(istype(item, recycable_type)) can_recycle = recycable_type break if(can_recycle) - recycle(O, user, can_recycle) + recycle(item, user, can_recycle) /obj/machinery/biomass_recycler/MouseDrop_T(mob/living/target, mob/living/user) if(!istype(target)) @@ -125,6 +126,7 @@ GLOBAL_LIST_INIT(biomass_unlocks, list()) var/spawn_type = item_names[pick] if(stored_matter < printable_types[spawn_type]) to_chat(user, span_warning("[src] does not have enough stored biomass for that! It currently has [stored_matter] out of [printable_types[spawn_type]] unit\s required.")) + balloon_alert(user, "not enough biomass") return var/spawned = new spawn_type(user.loc) @@ -139,7 +141,7 @@ GLOBAL_LIST_INIT(biomass_unlocks, list()) icon = 'monkestation/code/modules/slimecore/icons/stack_objects.dmi' icon_state = "biomass" base_icon_state = "biomass" - max_amount = 5 + max_amount = 15 singular_name = "biomass cube" merge_type = /obj/item/stack/biomass flags_1 = CONDUCT_1 diff --git a/monkestation/code/modules/slimecore/machines/extract_requestor.dm b/monkestation/code/modules/slimecore/machines/extract_requestor.dm index 1e254d48b130..faed4fff0690 100644 --- a/monkestation/code/modules/slimecore/machines/extract_requestor.dm +++ b/monkestation/code/modules/slimecore/machines/extract_requestor.dm @@ -6,8 +6,8 @@ base_icon_state = "civilian_pad" density = TRUE use_power = IDLE_POWER_USE - idle_power_usage = 10 - active_power_usage = 2000 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION circuit = /obj/item/circuitboard/machine/slime_extract_requestor var/obj/machinery/computer/slime_market/console var/list/current_requests = list() diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm index 8baef0b70d46..5ed9b18e56d8 100644 --- a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor.dm @@ -18,12 +18,13 @@ icon = 'monkestation/code/modules/slimecore/icons/machinery.dmi' base_icon_state = "cross_compressor" icon_state = "cross_compressor" - category="Distribution" + category = "Distribution" anchored = TRUE - idle_power_usage = 10 - active_power_usage = 1000 + use_power = IDLE_POWER_USE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION buffer = 5000 reagent_flags = NO_REACT @@ -74,9 +75,12 @@ /obj/machinery/plumbing/ooze_compressor/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() - context[SCREENTIP_CONTEXT_ALT_LMB] = "Toggle Repeated Extract Compression" - context[SCREENTIP_CONTEXT_LMB] = "Select a normal extract to make" - context[SCREENTIP_CONTEXT_RMB] = "Select a crossbreed to make" + if(current_recipe) + context[SCREENTIP_CONTEXT_RMB] = "Cancel current recipe" + else + context[SCREENTIP_CONTEXT_LMB] = "Select a normal extract to make" + context[SCREENTIP_CONTEXT_RMB] = "Select a crossbreed to make" + context[SCREENTIP_CONTEXT_CTRL_LMB] = "[repeat_recipe ? "Disable" : "Enable"] repeated extract compression" return CONTEXTUAL_SCREENTIP_SET /obj/machinery/plumbing/ooze_compressor/create_reagents(max_vol, flags) @@ -86,10 +90,7 @@ /obj/machinery/plumbing/ooze_compressor/update_icon_state() . = ..() - if(compressing) - icon_state = "cross_compressor_running" - else - icon_state = base_icon_state + icon_state = compressing ? "cross_compressor_running" : base_icon_state /obj/machinery/plumbing/ooze_compressor/examine(mob/user) . = ..() @@ -152,44 +153,73 @@ update_appearance() if(holder.total_volume == 0 && !compressing) //we were emptying, but now we aren't holder.flags |= NO_REACT + manage_hud_as_needed() return NONE -/obj/machinery/plumbing/ooze_compressor/process(seconds_per_tick) - if(!compressing) - use_power(active_power_usage * seconds_per_tick) - /obj/machinery/plumbing/ooze_compressor/proc/compress_recipe() compressing = TRUE update_appearance() if(!repeat_recipe) reagents_for_recipe = list() + manage_hud_as_needed() + update_power_usage() addtimer(CALLBACK(src, PROC_REF(finish_compressing)), 3 SECONDS) /obj/machinery/plumbing/ooze_compressor/proc/finish_compressing() for(var/i in 1 to current_recipe.created_amount) - new current_recipe.output_item(loc) + new current_recipe.output_item(drop_location()) compressing = FALSE update_appearance() reagents.clear_reagents() if(!repeat_recipe) current_recipe = null + update_power_usage() + manage_hud_as_needed() + +/obj/machinery/plumbing/ooze_compressor/proc/update_power_usage() + if(compressing) + update_use_power(ACTIVE_POWER_USE) + else if(current_recipe) + update_use_power(IDLE_POWER_USE) + else + update_use_power(NO_POWER_USE) /obj/machinery/plumbing/ooze_compressor/attack_hand(mob/living/user, list/modifiers) . = ..() + if(. || !can_interact(user)) + return + if(!anchored) + balloon_alert(user, "unanchored!") + return TRUE if(change_recipe(user)) reagents.clear_reagents() + return TRUE /obj/machinery/plumbing/ooze_compressor/attack_hand_secondary(mob/living/user, list/modifiers) . = ..() - if(change_recipe(user, TRUE)) - reagents.clear_reagents() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || !can_interact(user)) + return + . = SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!anchored) + balloon_alert(user, "unanchored!") + return + if(current_recipe) + repeat_recipe = FALSE + if(!compressing) + current_recipe = null + reagents.clear_reagents() + update_power_usage() + balloon_alert_to_viewers("cancelled recipe") + else + if(change_recipe(user, TRUE)) + reagents.clear_reagents() -/obj/machinery/plumbing/ooze_compressor/AltClick(mob/user) - if(anchored) - visible_message(span_notice("[user] presses a button turning the repeat recipe system [repeat_recipe ? "Off" : "On"]")) +/obj/machinery/plumbing/ooze_compressor/CtrlClick(mob/user) + if(anchored && can_interact(user)) repeat_recipe = !repeat_recipe - return TRUE - . = ..() + balloon_alert_to_viewers("[repeat_recipe ? "enabled" : "disabled"] repeating") + visible_message(span_notice("[user] presses a button turning the repeat recipe system [repeat_recipe ? span_green("on") : span_red("off")]")) + return ..() /obj/machinery/plumbing/ooze_compressor/proc/change_recipe(mob/user, cross_breed = FALSE) var/choice @@ -201,14 +231,14 @@ else choice = show_radial_menu(user, src, recipe_choices, require_near = TRUE, tooltips = TRUE) - if(!(choice in choice_to_datum)) - return - - if(compressing) + if(compressing || !(choice in choice_to_datum)) return current_recipe = choice_to_datum[choice] reagents_for_recipe = list() reagents_for_recipe += current_recipe.required_oozes + balloon_alert_to_viewers("set extract recipe") + manage_hud_as_needed() + update_power_usage() #undef CROSSBREED_BASE_PATHS diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_hud.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_hud.dm new file mode 100644 index 000000000000..bec098500afa --- /dev/null +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/ooze_compressor_hud.dm @@ -0,0 +1,127 @@ +/obj/machinery/plumbing/ooze_compressor + var/image/hover_appearance + var/datum/atom_hud/alternate_appearance/basic/ooze_compressor/hover_popup + +/obj/machinery/plumbing/ooze_compressor/Destroy() + QDEL_NULL(hover_popup) + return ..() + +/obj/machinery/plumbing/ooze_compressor/MouseEntered(location, control, params) + . = ..() + if(!QDELETED(usr) && anchored) + manage_hud_as_needed() + hover_popup?.show_to(usr) + +/obj/machinery/plumbing/ooze_compressor/MouseExited(location, control, params) + . = ..() + if(!QDELETED(usr) && !QDELETED(hover_popup)) + hover_popup.hide_from(usr) + manage_hud_as_needed(cleanup = TRUE) + +/obj/machinery/plumbing/ooze_compressor/set_anchored(anchorvalue) + . = ..() + if(!anchored) + manage_hud_as_needed() + +/obj/machinery/plumbing/ooze_compressor/proc/manage_hud_as_needed(cleanup = FALSE) + if(!anchored || (cleanup && !QDELETED(hover_popup) && !length(hover_popup.hud_users_all_z_levels))) + // don't bother keeping the hud around if it isn't needed + QDEL_NULL(hover_popup) + return + setup_hud() + +/obj/machinery/plumbing/ooze_compressor/proc/setup_hud() + // delete old hud if it exists and collect a list of its users + var/list/mob/old_users + if(!QDELETED(hover_popup)) + old_users = hover_popup.hud_users_all_z_levels.Copy() + QDEL_NULL(hover_popup) + + if(!length(GLOB.compressor_recipe_previews)) // we can't initialize this normally bc it will shit itself if initialized early + GLOB.compressor_recipe_previews = create_compressor_previews() + + // setup new hover appearance + if(current_recipe) + hover_appearance = image(GLOB.compressor_recipe_previews[current_recipe.type], loc = src, layer = CHAT_LAYER) + hover_appearance.add_filter("extract_outline", 1, outline_filter(size = 1, color = COLOR_WHITE)) + hover_appearance.pixel_y = 10 + else + hover_appearance = image(loc = src, layer = CHAT_LAYER) + hover_appearance.pixel_y = 18 + SET_PLANE_EXPLICIT(hover_appearance, HUD_PLANE, src) + hover_appearance.plane = HUD_PLANE + hover_appearance.appearance_flags = RESET_COLOR + + // now setup the actual hud + hover_popup = add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/ooze_compressor, "ooze_compressor", hover_appearance) + // and the cooldown maptext + refresh_info_maptext() + + for(var/mob/old_user as anything in old_users) + if(QDELETED(old_user)) + continue + hover_popup.show_to(old_user) + +/obj/machinery/plumbing/ooze_compressor/proc/refresh_info_maptext() + if(!hover_popup) + return + if(!hover_popup.info_maptext) + hover_popup.info_maptext = image(loc = src, layer = CHAT_LAYER + 0.1) + SET_PLANE_EXPLICIT(hover_popup.info_maptext, HUD_PLANE, src) + hover_popup.info_maptext.plane = HUD_PLANE + hover_popup.info_maptext.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA | KEEP_APART + hover_popup.info_maptext.maptext_height = world.icon_size / 2 + hover_popup.info_maptext.maptext_y = 4 + var/maptext + if(compressing) + hover_popup.info_maptext.maptext_width = world.icon_size * 2 + hover_popup.info_maptext.maptext_x = -(world.icon_size / 2) + maptext = "compressing..." + else + hover_popup.info_maptext.maptext_width = world.icon_size + hover_popup.info_maptext.maptext_x = 0 + maptext = current_recipe ? "[get_progress()]%" : "inactive" + hover_popup.info_maptext.maptext = MAPTEXT_TINY_UNICODE("[maptext]") + hover_popup.give_info() + +/obj/machinery/plumbing/ooze_compressor/proc/get_progress() + if(!current_recipe || compressing) + return 0 + var/current = 0 + var/needed = 0 + for(var/datum/reagent/reagent as anything in current_recipe.required_oozes) + needed += current_recipe.required_oozes[reagent] || 0 + for(var/datum/reagent/listed_reagent as anything in reagents.reagent_list) + if(listed_reagent.type != reagent) + continue + current += listed_reagent.volume + return clamp(round((current / needed) * 100, 1), 0, 100) + +/datum/atom_hud/alternate_appearance/basic/ooze_compressor + var/image/info_maptext + +/datum/atom_hud/alternate_appearance/basic/ooze_compressor/show_to(mob/new_viewer) + . = ..() + if(info_maptext && !QDELETED(new_viewer) && !QDELETED(new_viewer.client)) + new_viewer.client.images |= info_maptext + +/datum/atom_hud/alternate_appearance/basic/ooze_compressor/hide_from(mob/former_viewer, absolute) + . = ..() + if(info_maptext && !QDELETED(former_viewer) && !QDELETED(former_viewer.client)) + former_viewer.client.images -= info_maptext + +/datum/atom_hud/alternate_appearance/basic/ooze_compressor/proc/give_info() + if(!info_maptext) + return + for(var/mob/user as anything in hud_users_all_z_levels) + if(QDELETED(user) || QDELETED(user.client)) + continue + user.client.images |= info_maptext + +/datum/atom_hud/alternate_appearance/basic/ooze_compressor/proc/take_cooldowns() + if(!info_maptext) + return + for(var/mob/user as anything in hud_users_all_z_levels) + if(QDELETED(user) || QDELETED(user.client)) + continue + user.client.images -= info_maptext diff --git a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm index a60288732cb3..dbc827f25b35 100644 --- a/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm +++ b/monkestation/code/modules/slimecore/machines/ooze_compressor/recipes/_base_recipe.dm @@ -1,6 +1,18 @@ +GLOBAL_LIST_EMPTY_TYPED(compressor_recipe_previews, /image) + /datum/compressor_recipe var/list/required_oozes = list() var/obj/item/output_item var/created_amount = 1 /datum/compressor_recipe/crossbreed + +/proc/create_compressor_previews() + . = list() + for(var/datum/compressor_recipe/recipe as anything in subtypesof(/datum/compressor_recipe)) + var/output_type = recipe::output_item + if(!ispath(output_type, /obj/item)) + continue + var/obj/item/preview = new output_type(null) + .[recipe] = image(getFlatIcon(preview)) + qdel(preview) diff --git a/monkestation/code/modules/slimecore/machines/ooze_sucker.dm b/monkestation/code/modules/slimecore/machines/ooze_sucker.dm index 216edb7dfdbe..69f2f497ee76 100644 --- a/monkestation/code/modules/slimecore/machines/ooze_sucker.dm +++ b/monkestation/code/modules/slimecore/machines/ooze_sucker.dm @@ -7,10 +7,13 @@ icon_state = "ooze_sucker" anchored = FALSE density = FALSE - idle_power_usage = 10 - active_power_usage = 1000 + + use_power = IDLE_POWER_USE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION * 0.1 + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION * 0.15 + buffer = 3000 - category="Distribution" + category = "Distribution" reagent_flags = NO_REACT /// Pump is turned on by engineer, etc. @@ -31,6 +34,9 @@ /// Additional ratio of liquid volume to drain var/drain_percent = 1 + /// Whether draining was performed last process or not. + var/drained_last_process = FALSE + /obj/machinery/plumbing/ooze_sucker/Initialize(mapload, bolt, layer) . = ..() AddComponent(/datum/component/plumbing/simple_supply, bolt, layer) @@ -68,6 +74,22 @@ turned_on = FALSE update_icon_state() +/obj/machinery/plumbing/ooze_sucker/create_reagents(max_vol, flags) + . = ..() + RegisterSignals(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED), PROC_REF(on_reagent_change)) + RegisterSignal(reagents, COMSIG_QDELETING, PROC_REF(on_reagents_del)) + +/// Handles properly detaching signal hooks. +/obj/machinery/plumbing/ooze_sucker/proc/on_reagents_del(datum/reagents/reagents) + SIGNAL_HANDLER + UnregisterSignal(reagents, list(COMSIG_REAGENTS_REM_REAGENT, COMSIG_REAGENTS_DEL_REAGENT, COMSIG_REAGENTS_CLEAR_REAGENTS, COMSIG_REAGENTS_REACTED, COMSIG_QDELETING)) + return NONE + +/// Handles ensuring power usage becomes idle when reagents are full. +/obj/machinery/plumbing/ooze_sucker/proc/on_reagent_change(datum/reagents/holder, ...) + SIGNAL_HANDLER + update_power_usage() + return NONE /obj/machinery/plumbing/ooze_sucker/proc/toggle_state() turned_on = !turned_on @@ -109,12 +131,25 @@ // We're good, actually pump. for(var/turf/affected_turf as anything in affected_turfs) pump_turf(affected_turf, seconds_per_tick, multiplier) + update_power_usage() + +/obj/machinery/plumbing/ooze_sucker/proc/update_power_usage() + if(!turned_on) + update_use_power(NO_POWER_USE) + else if(reagents && reagents.total_volume >= reagents.maximum_volume) + update_use_power(IDLE_POWER_USE) + else if(drained_last_process) + update_use_power(ACTIVE_POWER_USE) + else + update_use_power(IDLE_POWER_USE) /obj/machinery/plumbing/ooze_sucker/proc/pump_turf(turf/affected_turf, seconds_per_tick, multiplier) if(processes < processes_required) processes++ return processes = 0 + drained_last_process = FALSE + if(!affected_turf.liquids || !affected_turf.liquids.liquid_group) return @@ -128,3 +163,12 @@ if(!targeted_group.reagents_per_turf) return targeted_group.transfer_specific_reagents(reagents, target_value, reagents_to_check = typesof(/datum/reagent/slime_ooze), merge = TRUE) + drained_last_process = TRUE + +/obj/machinery/plumbing/ooze_sucker/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return + toggle_state() + balloon_alert_to_viewers("[turned_on ? "enabled" : "disabled"] ooze sucker") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/monkestation/code/modules/slimecore/machines/slime_grinder.dm b/monkestation/code/modules/slimecore/machines/slime_grinder.dm index 4cb79b472b19..b5ef7280e7c1 100644 --- a/monkestation/code/modules/slimecore/machines/slime_grinder.dm +++ b/monkestation/code/modules/slimecore/machines/slime_grinder.dm @@ -7,8 +7,11 @@ icon = 'monkestation/code/modules/slimecore/icons/slime_grinder.dmi' icon_state = "slime_grinder_backdrop" base_icon_state = "slime_grinder_backdrop" - idle_power_usage = 10 - active_power_usage = 1000 + + use_power = IDLE_POWER_USE + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION + buffer = 3000 category="Distribution" diff --git a/monkestation/code/modules/slimecore/machines/slime_market.dm b/monkestation/code/modules/slimecore/machines/slime_market.dm index 8e299bec9cda..57cd96c8397b 100644 --- a/monkestation/code/modules/slimecore/machines/slime_market.dm +++ b/monkestation/code/modules/slimecore/machines/slime_market.dm @@ -6,25 +6,11 @@ base_icon_state = "market_pad" density = TRUE use_power = IDLE_POWER_USE - idle_power_usage = 10 - active_power_usage = 2000 + idle_power_usage = BASE_MACHINE_IDLE_CONSUMPTION + active_power_usage = BASE_MACHINE_ACTIVE_CONSUMPTION circuit = /obj/item/circuitboard/machine/slime_market_pad var/obj/machinery/computer/slime_market/console -/obj/machinery/slime_market_pad/attackby(obj/item/I, mob/user, params) - if(default_deconstruction_screwdriver(user, icon_state, icon_state, I)) - user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src].")) - update_appearance() - return TRUE - - if(default_unfasten_wrench(user, I)) - return TRUE - - if(default_deconstruction_crowbar(I)) - return TRUE - - . = ..() - /obj/machinery/slime_market_pad/examine(mob/user) . = ..() if(!panel_open) @@ -41,6 +27,8 @@ /obj/machinery/slime_market_pad/AltClick(mob/user) . = ..() + if(!.) + return link_console() /obj/machinery/slime_market_pad/proc/link_console() @@ -53,30 +41,39 @@ console.link_market_pad() break -/obj/machinery/slime_market_pad/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/slime_market_pad/attackby(obj/item/item, mob/living/user, params) . = ..() - if(!console) + if(. || !can_interact(user)) + return + if(default_deconstruction_screwdriver(user, icon_state, icon_state, item)) + user.visible_message(span_notice("\The [user] [panel_open ? "opens" : "closes"] the hatch on \the [src]."), span_notice("You [panel_open ? "open" : "close"] the hatch on \the [src].")) + update_appearance() + return TRUE + if(default_unfasten_wrench(user, item) || default_deconstruction_crowbar(item)) + return TRUE + if(QDELETED(console)) to_chat(user, span_warning("[src] does not have a console linked to it!")) return - - if(istype(I, /obj/item/slime_extract)) - var/obj/item/slime_extract/extract = I + if(istype(item, /obj/item/slime_extract)) + var/obj/item/slime_extract/extract = item if(extract.tier == 0) to_chat(user, span_warning("[src] doesn't seem to accept this extract!")) return flick("[base_icon_state]_vend", src) sell_extract(extract) return - - else if(istype(I, /obj/item/storage/bag/xeno)) - if(tgui_alert(user, "Are you sure you want to sell all extracts from [I]?", "<3?", list("Yes", "No")) != "Yes") + else if(istype(item, /obj/item/storage/bag/xeno)) + if(tgui_alert(user, "Are you sure you want to sell all extracts from [item]?", "<3?", list("Yes", "No")) != "Yes") return - flick("[base_icon_state]_vend", src) - for(var/obj/item/slime_extract/extract in I) + var/sold_extracts = 0 + for(var/obj/item/slime_extract/extract in item) if(extract.tier == 0) continue sell_extract(extract) + sold_extracts++ + if(sold_extracts > 0) + user.balloon_alert_to_viewers("sold [sold_extracts] extracts") return /obj/machinery/slime_market_pad/proc/sell_extract(obj/item/slime_extract/extract) @@ -97,23 +94,38 @@ SSresearch.slime_core_prices[core_type] = (1 + price_mod * price_limiter) * SSresearch.slime_core_prices[core_type] qdel(extract) -/obj/machinery/slime_market_pad/attackby_secondary(obj/item/weapon, mob/user, params) - if(!console) - to_chat(user, span_warning("[src] does not have a console linked to it!")) +/obj/machinery/slime_market_pad/attackby_secondary(obj/item/item, mob/user, params) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN || !can_interact(user)) return + if(QDELETED(console)) + to_chat(user, span_warning("[src] does not have a console linked to it!")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(!console.request_pad) + if(istype(item, /obj/item/storage/bag/xeno)) + flick("[base_icon_state]_vend", src) + var/sold_extracts = 0 + for(var/obj/item/slime_extract/extract in item) + if(extract.tier == 0) + continue + sell_extract(extract) + sold_extracts++ + if(sold_extracts > 0) + user.balloon_alert_to_viewers("sold [sold_extracts] extracts") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + if(QDELETED(console.request_pad)) to_chat(user, span_warning("[console] does not have a request_pad linked to it!")) - return + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(!length(console.request_pad.current_requests)) to_chat(user, span_warning("There are no current extract requests!")) - return + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN - if(istype(weapon, /obj/item/slime_extract)) + if(istype(item, /obj/item/slime_extract)) var/list/radial_choices = list() var/list/choice_to_request = list() - var/obj/item/slime_extract/extract = weapon + var/obj/item/slime_extract/extract = item for(var/datum/extract_request_data/current as anything in console.request_pad.current_requests) if((current.extract_path != extract.type) || current.ready_for_pickup) continue @@ -134,4 +146,4 @@ flick("[base_icon_state]_vend", src) qdel(extract) - return + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN diff --git a/monkestation/code/modules/slimecore/machines/slime_market_computer.dm b/monkestation/code/modules/slimecore/machines/slime_market_computer.dm index 3c86eb44af7a..a3394c7a0105 100644 --- a/monkestation/code/modules/slimecore/machines/slime_market_computer.dm +++ b/monkestation/code/modules/slimecore/machines/slime_market_computer.dm @@ -66,7 +66,7 @@ GLOBAL_DATUM(default_slime_market, /obj/machinery/computer/slime_market) /obj/machinery/computer/slime_market/ui_assets(mob/user) return list( - get_asset_datum(/datum/asset/spritesheet/xenobio_market), + get_asset_datum(/datum/asset/spritesheet/xenobio_market) ) /obj/machinery/computer/slime_market/ui_interact(mob/user, datum/tgui/ui) @@ -110,19 +110,21 @@ GLOBAL_DATUM(default_slime_market, /obj/machinery/computer/slime_market) iter += 1 var/obj/item/slime_extract/core = core_type - var/list/core_data = list("icon" = "[initial(core.icon_state)]", - "price" = SSresearch.slime_core_prices[core_type], - "key" = iter % 4, - ) + var/list/core_data = list( + "icon" = "[initial(core.icon_state)]", + "price" = SSresearch.slime_core_prices[core_type], + "key" = iter % 4 + ) price_row.Add(list(core_data)) iter += 1 if(core_type == /obj/item/slime_extract/grey) core = /obj/item/slime_extract/rainbow - var/list/rainbow_core_data = list("icon" = "[initial(core.icon_state)]", - "price" = SSresearch.slime_core_prices[/obj/item/slime_extract/rainbow], - "key" = iter % 4, - ) + var/list/rainbow_core_data = list( + "icon" = "[initial(core.icon_state)]", + "price" = SSresearch.slime_core_prices[/obj/item/slime_extract/rainbow], + "key" = iter % 4 + ) price_row.Add(list(rainbow_core_data)) iter += 1 price_row.Add(list(list("key" = iter % 4))) diff --git a/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm index e071ac929ecb..862b41467872 100644 --- a/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm +++ b/monkestation/code/modules/slimecore/machines/slime_pen_controller.dm @@ -28,7 +28,6 @@ . = ..() locate_machinery() - /obj/machinery/slime_pen_controller/add_context(atom/source, list/context, obj/item/held_item, mob/user) . = ..() @@ -69,13 +68,13 @@ var/list/mutation_info = list() var/mob_string for(var/mob/living/mob as anything in mutation_data.latch_needed) - mob_string += "[mutation_data.latch_needed[mob]] units of genetic data from [initial(mob.name)]. \n" + mob_string += "[mutation_data.latch_needed[mob]] units of genetic data from [mob::name]. \n" var/item_string for(var/obj/item/item as anything in mutation_data.needed_items) - item_string += "[initial(item.name)]. \n" + item_string += "[item:name]. \n" mutation_info += list( - "color" = capitalize(initial(mutation_data.output.name)), + "color" = capitalize(mutation_data.output::name), "weight" = mutation_data.weight, "mutate_chance" = mutation_data.mutate_probability, "mobs_needed" = mob_string, @@ -135,7 +134,6 @@ . = ..() if(.) return - switch(action) if("buy") for(var/datum/corral_upgrade/item as anything in subtypesof(/datum/corral_upgrade)) @@ -146,7 +144,7 @@ /obj/machinery/slime_pen_controller/proc/try_buy(datum/corral_upgrade/item) if(!linked_data) return - if(SSresearch.xenobio_points < initial(item.cost)) + if(SSresearch.xenobio_points < item::cost) return var/datum/corral_upgrade/new_upgrade = new item @@ -165,25 +163,23 @@ return /obj/machinery/slime_pen_controller/attack_hand_secondary(mob/user, list/modifiers) - if(linked_sucker) - visible_message(span_notice("[user] fiddles with the [src] toggling the pens ooze sucker.")) - linked_sucker.toggle_state() - return TRUE . = ..() - -/obj/machinery/slime_pen_controller/attackby(obj/item/weapon, mob/user, params) - if(weapon.tool_behaviour == TOOL_MULTITOOL) - if(!multitool_check_buffer(user, weapon)) - return - var/obj/item/multitool/M = weapon - if(!M.buffer) - return - var/obj/machinery/corral_corner/pad = M.buffer - if(!istype(pad)) - return - if(!pad.connected_data) - return - linked_data = pad.connected_data - to_chat(user, span_notice("You link the [pad] to the [src].")) + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) return + if(!QDELETED(linked_sucker)) + linked_sucker.toggle_state() + balloon_alert_to_viewers("[linked_sucker.turned_on ? "enabled" : "disabled"] ooze sucker") + visible_message(span_notice("[user] fiddles with the [src], [linked_sucker.turned_on ? "enabling" : "disabling"] the pens ooze sucker.")) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/machinery/slime_pen_controller/multitool_act(mob/living/user, obj/item/multitool/multitool) . = ..() + if(!multitool_check_buffer(user, multitool) || QDELETED(multitool.buffer)) + return + var/obj/machinery/corral_corner/pad = multitool.buffer + if(!istype(pad) || !pad.connected_data) + return + linked_data = pad.connected_data + balloon_alert_to_viewers("linked pad") + pad.balloon_alert_to_viewers("linked to controller") + to_chat(user, span_notice("You link the [pad] to the [src].")) diff --git a/monkestation/code/modules/slimecore/mobs/_base_slime.dm b/monkestation/code/modules/slimecore/mobs/_base_slime.dm index dfbe5d102b8a..5b21399ca0ba 100644 --- a/monkestation/code/modules/slimecore/mobs/_base_slime.dm +++ b/monkestation/code/modules/slimecore/mobs/_base_slime.dm @@ -162,6 +162,7 @@ /mob/living/basic/slime/mob_try_pickup(mob/living/user, instant) if(!SEND_SIGNAL(src, COMSIG_FRIENDSHIP_CHECK_LEVEL, user, FRIENDSHIP_FRIEND)) to_chat(user, span_notice("[src] doesn't trust you enough to let you pick them up")) + balloon_alert(user, "not enough trust!") return FALSE . = ..() @@ -188,10 +189,9 @@ /mob/living/basic/slime/proc/recompile_ai_tree() var/list/new_planning_subtree = list() + RemoveElement(/datum/element/basic_eating, food_types = compiled_liked_foods) rebuild_foods() - RemoveElement(/datum/element/basic_eating) - new_planning_subtree |= add_or_replace_tree(/datum/ai_planning_subtree/pet_planning) if(!HAS_TRAIT(src, TRAIT_SLIME_RABID)) @@ -310,6 +310,7 @@ slime_flags |= SPLITTING_SLIME visible_message(span_notice("[name] starts to flatten, it looks to be splitting.")) + balloon_alert_to_viewers("splitting...") addtimer(CALLBACK(src, PROC_REF(finish_splitting)), 15 SECONDS) @@ -331,6 +332,7 @@ ai_controller.set_ai_status(AI_STATUS_OFF) visible_message(span_notice("[name] starts to undulate, it looks to be mutating.")) + balloon_alert_to_viewers("mutating...") slime_flags |= MUTATING_SLIME ungulate() @@ -414,8 +416,9 @@ . = ..() if(worn_accessory) visible_message("[user] takes the [worn_accessory] off the [src].") + balloon_alert_to_viewers("removed accessory") + worn_accessory.forceMove(user.drop_location()) worn_accessory = null - worn_accessory.forceMove(get_turf(user)) update_appearance() /mob/living/basic/slime/Life(seconds_per_tick, times_fired) diff --git a/tgstation.dme b/tgstation.dme index f548884e8d07..c31a3328ff04 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6759,6 +6759,7 @@ #include "monkestation\code\modules\slimecore\machines\slime_market_computer.dm" #include "monkestation\code\modules\slimecore\machines\slime_pen_controller.dm" #include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor.dm" +#include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor_hud.dm" #include "monkestation\code\modules\slimecore\machines\ooze_compressor\ooze_compressor_plumbing.dm" #include "monkestation\code\modules\slimecore\machines\ooze_compressor\shitcode.dm" #include "monkestation\code\modules\slimecore\machines\ooze_compressor\recipes\_base_recipe.dm" From 1fd9c6c43e21e4e9858e51a8264d30a2b1d54634 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 18:14:40 +0000 Subject: [PATCH 20/20] Automatic changelog for PR #1638 [ci skip] --- html/changelogs/AutoChangeLog-pr-1638.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-1638.yml diff --git a/html/changelogs/AutoChangeLog-pr-1638.yml b/html/changelogs/AutoChangeLog-pr-1638.yml new file mode 100644 index 000000000000..f4143ee6fb7c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1638.yml @@ -0,0 +1,16 @@ +author: "Absolucy" +delete-after: True +changes: + - rscadd: "Added a HUD that appears when hovering your mouse over ooze compressors, showing the current extract it is making, and the progress on making said extract." + - bugfix: "Fixed the normal slime extract menu coming up on ooze compressors after selecting a crossbreed." + - bugfix: "Fixed xenobiology machinery taking up absurd amounts of power while doing nothing." + - balance: "Increased range of stabilized grey extract from 1 to 3." + - qol: "Increased biomass cube stack size (5 -> 15)." + - qol: "Biocubes now fit in science bags." + - qol: "You can dump biocubes from a science bag into the biomass recycler." + - qol: "You can right click the slime market with a science bag to sell all the extracts without the confirmation prompt." + - rscadd: "Added balloon alerts to lots of xenobio-related actions." + - qol: "You can toggle ooze suckers directly via right click." + - qol: "You can now right click an active ooze compressor to cancel the current recipe." + - qol: "Slime mutation syringes now show whether they've been used or not in the examine text." + - bugfix: "Removing accessories from slimes now works properly." \ No newline at end of file