From 0bd779981b6fbfb9e06e4de57699a46fe084140e Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 13:15:04 -0500 Subject: [PATCH 001/162] https://github.com/tgstation/tgstation/pull/49844 --- code/game/objects/items/RCD.dm | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index d899c38641ee2..03cef576b003c 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -49,11 +49,11 @@ RLD /obj/item/construction/examine(mob/user) . = ..() - . += "\A [src]. It currently holds [matter]/[max_matter] matter-units." + . += "It currently holds [matter]/[max_matter] matter-units." if(upgrade & RCD_UPGRADE_SILO_LINK) - . += "\A [src]. Remote storage link state: [silo_link ? "[silo_mats.on_hold() ? "ON HOLD" : "ON"]" : "OFF"]." - if(silo_link && !silo_mats.on_hold() && silo_mats.mat_container) - . += "\A [src]. Remote connection have iron in equivalent to [silo_mats.mat_container.get_material_amount(/datum/material/iron)/500] rcd units." // 1 matter for 1 floortile, as 4 tiles are produced from 1 iron + . += "Remote storage link state: [silo_link ? "[silo_mats.on_hold() ? "ON HOLD" : "ON"]" : "OFF"]." + if(silo_link && silo_mats.mat_container && !silo_mats.on_hold()) + . += "Remote connection has iron in equivalent to [silo_mats.mat_container.get_material_amount(/datum/material/iron)/500] RCD unit\s." //1 matter for 1 floor tile, as 4 tiles are produced from 1 metal /obj/item/construction/Destroy() QDEL_NULL(spark_system) @@ -145,6 +145,9 @@ RLD if(user) to_chat(user, "Mineral access is on hold, please contact the quartermaster.") return FALSE + if(!silo_mats.mat_container) + to_chat(user, "No silo link detected. Connect to silo via multitool.") + return FALSE if(!silo_mats.mat_container?.has_materials(matlist, amount)) if(user) to_chat(user, no_ammo_message) @@ -155,7 +158,7 @@ RLD return TRUE /obj/item/construction/proc/checkResource(amount, mob/user) - if(!silo_mats || !silo_link) + if(!silo_link || !silo_mats || !silo_mats.mat_container) . = matter >= amount else if(silo_mats.on_hold()) @@ -277,6 +280,9 @@ RLD /obj/item/construction/rcd/proc/toggle_silo_link(mob/user) if(silo_mats) + if(!silo_mats.mat_container) + to_chat(user, "No silo link detected. Connect to silo via multitool.") + return FALSE silo_link = !silo_link to_chat(user, "You change \the [src]'s storage link state: [silo_link ? "ON" : "OFF"].") else From 966bf1a2d41e2375fba0965f267eac7374dfaaaf Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 13:16:32 -0500 Subject: [PATCH 002/162] https://github.com/tgstation/tgstation/pull/53140 --- code/game/objects/effects/temporary_visuals/miscellaneous.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index fbd37d90d2aec..94fbdfa71bb3d 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -491,6 +491,7 @@ icon_state = "" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT var/status = 0 var/delay = 0 From 0ef8a73a976ebf026f681638fa53c50c3c0dedf9 Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 13:18:15 -0500 Subject: [PATCH 003/162] https://github.com/tgstation/tgstation/pull/55371 --- code/game/objects/items/RCD.dm | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 03cef576b003c..c8a425ce83b70 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -501,16 +501,29 @@ RLD return FALSE var/delay = rcd_results["delay"] * delay_mod var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) - if(checkResource(rcd_results["cost"], user)) - if(do_after(user, delay, target = A)) - if(checkResource(rcd_results["cost"], user)) - if(A.rcd_act(user, src, rcd_results["mode"])) - rcd_effect.end_animation() - useResource(rcd_results["cost"], user) - activate() - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - return TRUE - qdel(rcd_effect) + if(!checkResource(rcd_results["cost"], user)) + qdel(rcd_effect) + return FALSE + if(rcd_results["mode"] == RCD_MACHINE || rcd_results["mode"] == RCD_COMPUTER || rcd_results["mode"] == RCD_FURNISHING) + var/turf/target_turf = get_turf(A) + if(target_turf.is_blocked_turf(exclude_mobs = TRUE)) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + qdel(rcd_effect) + return FALSE + if(!do_after(user, delay, target = A)) + qdel(rcd_effect) + return FALSE + if(!checkResource(rcd_results["cost"], user)) + qdel(rcd_effect) + return FALSE + if(!A.rcd_act(user, src, rcd_results["mode"])) + qdel(rcd_effect) + return FALSE + rcd_effect.end_animation() + useResource(rcd_results["cost"], user) + activate() + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) + return TRUE /obj/item/construction/rcd/Initialize(mapload) . = ..() From 945c9cef0b102f5ce3064fe46788b65faa11bb22 Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 21:44:26 -0500 Subject: [PATCH 004/162] https://github.com/tgstation/tgstation/pull/58029 --- beestation.dme | 1 + code/__DEFINES/construction.dm | 11 ++- code/__HELPERS/construction.dm | 10 +++ code/__HELPERS/icons.dm | 4 +- .../objects/effects/spawners/structure.dm | 7 ++ code/game/objects/items/RCD.dm | 78 ++++++++++++++++++ code/game/objects/structures/girders.dm | 5 +- code/game/objects/structures/grille.dm | 12 ++- code/game/turfs/change_turf.dm | 2 + code/game/turfs/closed/wall/misc_walls.dm | 2 + code/game/turfs/closed/walls.dm | 1 + code/game/turfs/open/floor.dm | 10 ++- code/game/turfs/turf.dm | 5 ++ sound/items/rcdscan.ogg | Bin 0 -> 142015 bytes 14 files changed, 140 insertions(+), 8 deletions(-) create mode 100644 code/__HELPERS/construction.dm create mode 100644 sound/items/rcdscan.ogg diff --git a/beestation.dme b/beestation.dme index b8d52d1a0c4bc..e25f3e801c693 100644 --- a/beestation.dme +++ b/beestation.dme @@ -250,6 +250,7 @@ #include "code\__HELPERS\chat.dm" #include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\colors.dm" +#include "code\__HELPERS\construction.dm" #include "code\__HELPERS\dates.dm" #include "code\__HELPERS\datums.dm" #include "code\__HELPERS\debug_procs.dm" diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 3d416afead97c..154f5a17b543b 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -123,9 +123,18 @@ #define RCD_UPGRADE_SILO_LINK (1<<2) #define RCD_UPGRADE_FURNISHING (1<<3) +#define RPD_UPGRADE_UNWRENCH (1<<0) + #define RCD_WINDOW_FULLTILE "full tile" #define RCD_WINDOW_DIRECTIONAL "directional" #define RCD_WINDOW_NORMAL "glass" #define RCD_WINDOW_REINFORCED "reinforced glass" -#define RPD_UPGRADE_UNWRENCH (1<<0) +#define RCD_MEMORY_WALL 1 +#define RCD_MEMORY_WINDOWGRILLE 2 + +// How much faster to use the RCD when on a tile with memory +#define RCD_MEMORY_SPEED_BUFF 5 + +/// How much less resources the RCD uses when reconstructing +#define RCD_MEMORY_COST_BUFF 8 diff --git a/code/__HELPERS/construction.dm b/code/__HELPERS/construction.dm new file mode 100644 index 0000000000000..ad9f24cef3c17 --- /dev/null +++ b/code/__HELPERS/construction.dm @@ -0,0 +1,10 @@ +/// Produces a new RCD result from the given one if it can be calculated that +/// the RCD should speed up with the remembered form. +/proc/rcd_result_with_memory(list/defaults, turf/place, expected_memory) + if (place?.rcd_memory == expected_memory) + return defaults + list( + "cost" = defaults["cost"] / RCD_MEMORY_COST_BUFF, + "delay" = defaults["delay"] / RCD_MEMORY_SPEED_BUFF, + ) + else + return defaults diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index d6a4b15c867f7..f6473d991c524 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1004,10 +1004,10 @@ world I.pixel_y++ add_overlay(I)//And finally add the overlay. -/proc/getHologramIcon(icon/A, safety=1)//If safety is on, a new icon is not created. +/proc/getHologramIcon(icon/A, safety = TRUE, opacity = 0.5)//If safety is on, a new icon is not created. var/icon/flat_icon = safety ? A : new(A)//Has to be a new icon to not constantly change the same icon. flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish. - flat_icon.ChangeOpacity(0.5)//Make it half transparent. + flat_icon.ChangeOpacity(opacity) var/icon/alpha_mask = new('icons/effects/effects.dmi', "scanline")//Scanline effect. flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect. return flat_icon diff --git a/code/game/objects/effects/spawners/structure.dm b/code/game/objects/effects/spawners/structure.dm index 7487fb7822649..30415e4e27bcf 100644 --- a/code/game/objects/effects/spawners/structure.dm +++ b/code/game/objects/effects/spawners/structure.dm @@ -26,6 +26,13 @@ again. pipe_astar_cost = 1\ ) +/obj/effect/spawner/structure/window/Initialize(mapload) + . = ..() + + if (is_station_level(z)) + var/turf/current_turf = get_turf(src) + current_turf.rcd_memory = RCD_MEMORY_WINDOWGRILLE + /obj/effect/spawner/structure/window/hollow name = "hollow window spawner" icon_state = "hwindow_spawner_full" diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index c8a425ce83b70..209288ae2d6fe 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -194,6 +194,10 @@ RLD return FALSE return TRUE +#define RCD_DESTRUCTIVE_SCAN_RANGE 10 +#define RCD_HOLOGRAM_FADE_TIME (15 SECONDS) +#define RCD_DESTRUCTIVE_SCAN_COOLDOWN (RCD_HOLOGRAM_FADE_TIME + 1 SECONDS) + /obj/item/construction/rcd name = "rapid-construction-device (RCD)" icon = 'icons/obj/tools.dmi' @@ -206,6 +210,7 @@ RLD slot_flags = ITEM_SLOT_BELT item_flags = NO_MAT_REDEMPTION | NOBLUDGEON has_ammobar = TRUE + actions_types = list(/datum/action/item_action/rcd_scan) var/mode = RCD_FLOORWALL var/ranged = FALSE var/computer_dir = 1 @@ -223,6 +228,75 @@ RLD /// Integrated airlock electronics for setting access to a newly built airlocks var/obj/item/electronics/airlock/airlock_electronics + COOLDOWN_DECLARE(destructive_scan_cooldown) + +GLOBAL_VAR_INIT(icon_holographic_wall, init_holographic_wall()) +GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) + +// `initial` does not work here. Neither does instantiating a wall/whatever +// and referencing that. I don't know why. +/proc/init_holographic_wall() + return getHologramIcon( + icon('icons/turf/walls/wall.dmi', "wall-0"), + opacity = 1, + ) + +/proc/init_holographic_window() + var/icon/grille_icon = icon('icons/obj/structures.dmi', "grille") + var/icon/window_icon = icon('icons/obj/smooth_structures/windows/window.dmi', "window-0") + + grille_icon.Blend(window_icon, ICON_OVERLAY) + + return getHologramIcon(grille_icon) + +/obj/item/construction/rcd/ui_action_click(mob/user, actiontype) + if (!COOLDOWN_FINISHED(src, destructive_scan_cooldown)) + to_chat(user, "[src] lets out a low buzz.") + return + + COOLDOWN_START(src, destructive_scan_cooldown, RCD_DESTRUCTIVE_SCAN_COOLDOWN) + + playsound(src, 'sound/items/rcdscan.ogg', 50, vary = TRUE, pressure_affected = FALSE) + + var/turf/source_turf = get_turf(src) + for (var/turf/open/surrounding_turf in RANGE_TURFS(RCD_DESTRUCTIVE_SCAN_RANGE, source_turf)) + var/rcd_memory = surrounding_turf.rcd_memory + if (!rcd_memory) + continue + + var/skip_to_next_turf = FALSE + + for (var/atom/content_of_turf as anything in surrounding_turf.contents) + if (content_of_turf.density) + skip_to_next_turf = TRUE + break + + if (skip_to_next_turf) + continue + + var/hologram_icon + switch (rcd_memory) + if (RCD_MEMORY_WALL) + hologram_icon = GLOB.icon_holographic_wall + if (RCD_MEMORY_WINDOWGRILLE) + hologram_icon = GLOB.icon_holographic_window + + var/obj/effect/rcd_hologram/hologram = new (surrounding_turf) + hologram.icon = hologram_icon + animate(hologram, alpha = 0, time = RCD_HOLOGRAM_FADE_TIME, easing = CIRCULAR_EASING | EASE_IN) + +/obj/effect/rcd_hologram + name = "hologram" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/effect/rcd_hologram/Initialize(mapload) + . = ..() + QDEL_IN(src, RCD_HOLOGRAM_FADE_TIME) + +#undef RCD_DESTRUCTIVE_SCAN_COOLDOWN +#undef RCD_DESTRUCTIVE_SCAN_RANGE +#undef RCD_HOLOGRAM_FADE_TIME + /obj/item/construction/rcd/suicide_act(mob/living/user) user.visible_message("[user] sets the RCD to 'Wall' and points it down [user.p_their()] throat! It looks like [user.p_theyre()] trying to commit suicide..") return BRUTELOSS @@ -1034,6 +1108,10 @@ RLD desc = "It contains the design for chairs, stools, tables, and glass tables." upgrade = RCD_UPGRADE_FURNISHING +/datum/action/item_action/rcd_scan + name = "Destruction Scan" + desc = "Scans the surrounding area for destruction. Scanned structures will rebuild significantly faster." + #undef GLOW_MODE #undef LIGHT_MODE #undef REMOVE_MODE diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm index b016188c0b4c9..c1f0df23f3199 100644 --- a/code/game/objects/structures/girders.dm +++ b/code/game/objects/structures/girders.dm @@ -395,7 +395,10 @@ /obj/structure/girder/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 8) + return rcd_result_with_memory( + list("mode" = RCD_FLOORWALL, "delay" = 2 SECONDS, "cost" = 8), + get_turf(src), RCD_MEMORY_WALL, + ) if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 13) return FALSE diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 5d5f99b5e0f8a..3152d367dbf4d 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -53,9 +53,17 @@ if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 20, "cost" = 5) if(RCD_WINDOWGRILLE) + var/cost = 8 + var/delay = 2 SECONDS + if(the_rcd.window_glass == RCD_WINDOW_REINFORCED) - return list("mode" = RCD_WINDOWGRILLE, "delay" = 40, "cost" = 12) - return list("mode" = RCD_WINDOWGRILLE, "delay" = 20, "cost" = 8) + delay = 4 SECONDS + cost = 12 + + return rcd_result_with_memory( + list("mode" = RCD_WINDOWGRILLE, "delay" = delay, "cost" = cost), + get_turf(src), RCD_MEMORY_WINDOWGRILLE, + ) return FALSE /obj/structure/grille/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 77ae7704e3236..c4e3061cc1862 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -86,6 +86,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( var/old_lighting_corner_NW = lighting_corner_NW var/old_directional_opacity = directional_opacity var/old_dynamic_lumcount = dynamic_lumcount + var/old_rcd_memory = rcd_memory var/old_opacity = opacity // Z-Mimic: copy above @@ -133,6 +134,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( new_turf.AfterChange(flags) new_turf.blueprint_data = old_bp + new_turf.rcd_memory = old_rcd_memory lighting_corner_NE = old_lighting_corner_NE lighting_corner_SE = old_lighting_corner_SE diff --git a/code/game/turfs/closed/wall/misc_walls.dm b/code/game/turfs/closed/wall/misc_walls.dm index 93ec8a029dd50..25bf34ac5e914 100644 --- a/code/game/turfs/closed/wall/misc_walls.dm +++ b/code/game/turfs/closed/wall/misc_walls.dm @@ -49,6 +49,7 @@ smoothing_flags = NONE canSmoothWith = null smoothing_groups = null + rcd_memory = null /turf/closed/wall/vault/rock name = "rocky wall" @@ -71,6 +72,7 @@ smoothing_flags = SMOOTH_BITMASK desc = "A wall covered in a thick sheet of ice." canSmoothWith = null + rcd_memory = null hardness = 35 slicing_duration = 150 //welding through the ice+metal bullet_sizzle = TRUE diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 1b53cc53ad8e5..194cbe1cd5caa 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -10,6 +10,7 @@ smoothing_groups = list(SMOOTH_GROUP_CLOSED_TURFS, SMOOTH_GROUP_WALLS) canSmoothWith = list(SMOOTH_GROUP_WALLS) //note consider "canSmoothWith = list(SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_AIRLOCK)" if the artstyle permits it! + rcd_memory = RCD_MEMORY_WALL explosion_block = 1 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 5f8ec518aee3d..10b6935787f42 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -182,7 +182,10 @@ /turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_FLOORWALL) - return list("mode" = RCD_FLOORWALL, "delay" = 20, "cost" = 16) + return rcd_result_with_memory( + list("mode" = RCD_FLOORWALL, "delay" = 2 SECONDS, "cost" = 16), + src, RCD_MEMORY_WALL, + ) if(RCD_LADDER) return list("mode" = RCD_LADDER, "delay" = 25, "cost" = 16) if(RCD_AIRLOCK) @@ -193,7 +196,10 @@ if(RCD_DECONSTRUCT) return list("mode" = RCD_DECONSTRUCT, "delay" = 50, "cost" = 33) if(RCD_WINDOWGRILLE) - return list("mode" = RCD_WINDOWGRILLE, "delay" = 10, "cost" = 4) + return rcd_result_with_memory( + list("mode" = RCD_WINDOWGRILLE, "delay" = 1 SECONDS, "cost" = 4), + src, RCD_MEMORY_WINDOWGRILLE, + ) if(RCD_MACHINE) return list("mode" = RCD_MACHINE, "delay" = 20, "cost" = 25) if(RCD_COMPUTER) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index bbeab37719b8f..c0a5cc490813b 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -59,6 +59,11 @@ GLOBAL_LIST_EMPTY(created_baseturf_lists) ///the holodeck can load onto this turf if TRUE var/holodeck_compatible = FALSE + /// If this turf contained an RCD'able object (or IS one, for walls) + /// but is now destroyed, this will preserve the value. + /// See __DEFINES/construction.dm for RCD_MEMORY_*. + var/rcd_memory + ///Icon-smoothing variable to map a diagonal wall corner with a fixed underlay. var/list/fixed_underlay = null diff --git a/sound/items/rcdscan.ogg b/sound/items/rcdscan.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ce2099c86b9114fc9849a198141a154b6b73be9d GIT binary patch literal 142015 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

(FgscJ!*Yz90RKIk(1_RgzH0Un?<_j<7mxP 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

UZ2#8 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 literal 0 HcmV?d00001 From b7fb61df5811ef88be2cb3e6c815c281d0bfffff Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 21:49:11 -0500 Subject: [PATCH 005/162] https://github.com/tgstation/tgstation/pull/58812 --- code/game/objects/structures/grille.dm | 61 ++++++++++++++++++++++---- 1 file changed, 53 insertions(+), 8 deletions(-) diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 3152d367dbf4d..753abd9bc564d 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -1,3 +1,6 @@ +/// Max number of unanchored items that will be moved from a tile when attempting to add a window to a grille. +#define CLEAR_TILE_MOVE_LIMIT 20 + /obj/structure/grille desc = "A flimsy framework of iron rods." name = "grille" @@ -16,8 +19,6 @@ var/rods_type = /obj/item/stack/rods var/rods_amount = 2 var/rods_broken = TRUE - var/grille_type = null - var/broken_type = /obj/structure/grille/broken rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE FASTDMM_PROP(\ pipe_astar_cost = 1\ @@ -78,6 +79,12 @@ return FALSE var/turf/local_turf = loc + if(repair_grille()) + to_chat(user, "You rebuild the broken grille.") + + if(!clear_tile(user)) + return FALSE + if(!ispath(the_rcd.window_type, /obj/structure/window)) CRASH("Invalid window path type in RCD: [the_rcd.window_type]") var/obj/structure/window/window_path = the_rcd.window_type @@ -98,6 +105,29 @@ new /obj/structure/grille/ratvar(src.loc) qdel(src) +/obj/structure/grille/proc/clear_tile(mob/user) + var/at_users_feet = get_turf(user) + + var/unanchored_items_on_tile + var/obj/item/last_item_moved + for(var/obj/item/item_to_move in loc.contents) + if(!item_to_move.anchored) + if(unanchored_items_on_tile <= CLEAR_TILE_MOVE_LIMIT) + item_to_move.forceMove(at_users_feet) + last_item_moved = item_to_move + unanchored_items_on_tile++ + + if(!unanchored_items_on_tile) + return TRUE + + to_chat(user, "You move [unanchored_items_on_tile == 1 ? "[last_item_moved]" : "some things"] out of the way.") + + if(unanchored_items_on_tile - CLEAR_TILE_MOVE_LIMIT > 0) + to_chat(user, "There's still too much stuff in the way!") + return FALSE + + return TRUE + /obj/structure/grille/Bumped(atom/movable/AM) if(!ismob(AM)) return @@ -172,9 +202,8 @@ if(!shock(user, 90 * W.siemens_coefficient)) user.visible_message("[user] rebuilds the broken grille.", \ "You rebuild the broken grille.") - new grille_type(src.loc) + repair_grille() R.use(1) - qdel(src) return //window placing begin @@ -191,12 +220,16 @@ for(var/obj/structure/window/WINDOW in loc) to_chat(user, "There is already a window there!") return + if(!clear_tile(user)) + return to_chat(user, "You start placing the window...") if(do_after(user,20, target = src)) if(!src.loc || !anchored) //Grille broken or unanchored while waiting return for(var/obj/structure/window/WINDOW in loc) //Another window already installed on grille return + if(!clear_tile(user)) + return var/obj/structure/window/WD if(istype(W, /obj/item/stack/sheet/plasmarglass)) WD = new/obj/structure/window/plasma/reinforced/fulltile(drop_location()) //reinforced plasma window @@ -248,15 +281,29 @@ /obj/structure/grille/obj_break() . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) - new broken_type(src.loc) + icon_state = "brokengrille" + density = FALSE + obj_integrity = 20 + broken = TRUE + rods_amount = 1 + rods_broken = FALSE var/drop_loc = drop_location() var/obj/R = new rods_type(drop_loc, rods_broken) if(QDELETED(R)) // the rods merged with something on the tile R = locate(rods_type) in drop_loc if(R) transfer_fingerprints_to(R) - qdel(src) +/obj/structure/grille/proc/repair_grille() + if(broken) + icon_state = "grille" + density = TRUE + obj_integrity = max_integrity + broken = FALSE + rods_amount = 2 + rods_broken = TRUE + return TRUE + return FALSE // shock user with probability prb (if all connections & power are working) // returns 1 if shocked, 0 otherwise @@ -308,8 +355,6 @@ broken = TRUE rods_amount = 1 rods_broken = FALSE - grille_type = /obj/structure/grille - broken_type = null /obj/structure/grille/broken/Initialize(mapload) . = ..() From e350ba35c339aa57a3485ba4f75cf56c7d561ca1 Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 21:55:33 -0500 Subject: [PATCH 006/162] https://github.com/tgstation/tgstation/pull/71369 --- code/game/turfs/open/floor.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/code/game/turfs/open/floor.dm b/code/game/turfs/open/floor.dm index 10b6935787f42..8a4200e4f887c 100644 --- a/code/game/turfs/open/floor.dm +++ b/code/game/turfs/open/floor.dm @@ -182,6 +182,9 @@ /turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) if(RCD_FLOORWALL) + var/obj/structure/girder/girder = locate() in src + if(girder) + return girder.rcd_vals(user, the_rcd) return rcd_result_with_memory( list("mode" = RCD_FLOORWALL, "delay" = 2 SECONDS, "cost" = 16), src, RCD_MEMORY_WALL, @@ -211,6 +214,9 @@ /turf/open/floor/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) switch(passed_mode) if(RCD_FLOORWALL) + var/obj/structure/girder/girder = locate() in src + if(girder) + return girder.rcd_act(user, the_rcd, passed_mode) to_chat(user, "You build a wall.") log_attack("[key_name(user)] has constructed a wall at [loc_name(src)] using [format_text(initial(the_rcd.name))]") var/overlapping_lattice = locate(/obj/structure/lattice) in get_turf(src) From 63b7424945ef473570e6eea52073f747291af487 Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 22:30:36 -0500 Subject: [PATCH 007/162] fix ratvar shit --- .../antagonists/clock_cult/clockwork_turfs.dm | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/code/modules/antagonists/clock_cult/clockwork_turfs.dm b/code/modules/antagonists/clock_cult/clockwork_turfs.dm index 329b56ba411c8..b88180601d351 100644 --- a/code/modules/antagonists/clock_cult/clockwork_turfs.dm +++ b/code/modules/antagonists/clock_cult/clockwork_turfs.dm @@ -476,7 +476,6 @@ icon_state = "ratvargrille" name = "cog grille" desc = "A strangely-shaped grille." - broken_type = /obj/structure/grille/ratvar/broken /obj/structure/grille/ratvar/Initialize(mapload) . = ..() @@ -497,6 +496,32 @@ /obj/structure/grille/ratvar/ratvar_act() return +/obj/structure/grille/ratvar/obj_break() + if(!broken && !(flags_1 & NODECONSTRUCT_1)) + icon_state = "brokenratvargrille" + density = FALSE + obj_integrity = 20 + broken = TRUE + rods_amount = 1 + rods_broken = FALSE + var/drop_loc = drop_location() + var/obj/R = new rods_type(drop_loc, rods_broken) + if(QDELETED(R)) // the rods merged with something on the tile + R = locate(rods_type) in drop_loc + if(R) + transfer_fingerprints_to(R) + +/obj/structure/grille/ratvar/repair_grille() + if(broken) + icon_state = "ratvargrille" + density = TRUE + obj_integrity = max_integrity + broken = FALSE + rods_amount = 2 + rods_broken = TRUE + return TRUE + return FALSE + /obj/structure/grille/ratvar/broken icon_state = "brokenratvargrille" density = FALSE @@ -504,8 +529,6 @@ rods_type = /obj/item/stack/sheet/brass rods_amount = 1 rods_broken = FALSE - grille_type = /obj/structure/grille/ratvar - broken_type = null /obj/structure/grille/ratvar/broken/Initialize(mapload) . = ..() From 6e02d0196ff8fddf91c75f90a8afc2bcda91b6f2 Mon Sep 17 00:00:00 2001 From: RKz Date: Wed, 27 Dec 2023 23:02:19 -0500 Subject: [PATCH 008/162] fixers --- code/game/objects/items/RCD.dm | 5 ++++- code/game/turfs/closed/walls.dm | 9 +++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 209288ae2d6fe..19428d44edaf4 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -570,11 +570,14 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) furnish_delay = 20 /obj/item/construction/rcd/proc/rcd_create(atom/A, mob/user) + //does this atom allow for rcd actions? var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) return FALSE + var/turf/target_turf = get_turf(A) + //start animation & check resource for the action var/delay = rcd_results["delay"] * delay_mod - var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) + var/obj/effect/constructing_effect/rcd_effect = new(target_turf, delay, src.mode) if(!checkResource(rcd_results["cost"], user)) qdel(rcd_effect) return FALSE diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 194cbe1cd5caa..15e769167b12b 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -138,11 +138,12 @@ var/obj/item/wallframe/F = W if(F.try_build(src, user)) F.attach(src, user) - return TRUE + return TRUE + return FALSE //Poster stuff - else if(istype(W, /obj/item/poster)) - place_poster(W,user) - return TRUE + else if(istype(W, /obj/item/poster) && Adjacent(user)) //no tk memes. + return place_poster(W,user) + return FALSE /turf/closed/wall/try_decon(obj/item/I, mob/user, turf/T) From 1dcedde25055cf386ed363653fc8a014d277a34f Mon Sep 17 00:00:00 2001 From: RKz Date: Tue, 21 May 2024 13:30:35 -0400 Subject: [PATCH 009/162] tweaks --- code/__DEFINES/construction.dm | 33 ++++++++++++++++----------------- code/game/objects/items/RCD.dm | 30 ++++++++++++++++-------------- 2 files changed, 32 insertions(+), 31 deletions(-) diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index 154f5a17b543b..c30c5dba962ba 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -107,23 +107,22 @@ #define CAT_STRUCTURE "Structures" -// rcd buildtype defines -// these aren't even used as bitflags so who even knows why they are treated like them -#define RCD_FLOORWALL (1<<0) -#define RCD_AIRLOCK (1<<1) -#define RCD_DECONSTRUCT (1<<2) -#define RCD_WINDOWGRILLE (1<<3) -#define RCD_MACHINE (1<<4) -#define RCD_COMPUTER (1<<5) -#define RCD_FURNISHING (1<<6) -#define RCD_LADDER (1<<7) - -#define RCD_UPGRADE_FRAMES (1<<0) -#define RCD_UPGRADE_SIMPLE_CIRCUITS (1<<1) -#define RCD_UPGRADE_SILO_LINK (1<<2) -#define RCD_UPGRADE_FURNISHING (1<<3) - -#define RPD_UPGRADE_UNWRENCH (1<<0) +//rcd modes +#define RCD_FLOORWALL 0 +#define RCD_AIRLOCK 1 +#define RCD_DECONSTRUCT 2 +#define RCD_WINDOWGRILLE 3 +#define RCD_MACHINE 4 +#define RCD_COMPUTER 5 +#define RCD_FURNISHING 6 +#define RCD_LADDER 7 + +#define RCD_UPGRADE_FRAMES 0 +#define RCD_UPGRADE_SIMPLE_CIRCUITS 1 +#define RCD_UPGRADE_SILO_LINK 2 +#define RCD_UPGRADE_FURNISHING 3 + +#define RPD_UPGRADE_UNWRENCH 0 #define RCD_WINDOW_FULLTILE "full tile" #define RCD_WINDOW_DIRECTIONAL "directional" diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 19428d44edaf4..b3f4363b41a84 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -137,7 +137,7 @@ RLD to_chat(user, no_ammo_message) return FALSE matter -= amount - update_icon() + update_appearance() return TRUE else var/list/matlist = list(SSmaterials.GetMaterialRef(/datum/material/iron) = 500) @@ -249,6 +249,15 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) return getHologramIcon(grille_icon) +/obj/item/construction/rcd/Initialize(mapload) + . = ..() + AddElement(/datum/element/openspace_item_click_handler) + +/obj/item/construction/rcd/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) + if(proximity_flag) + mode = RCD_FLOORWALL + rcd_create(target, user) + /obj/item/construction/rcd/ui_action_click(mob/user, actiontype) if (!COOLDOWN_FINISHED(src, destructive_scan_cooldown)) to_chat(user, "[src] lets out a low buzz.") @@ -608,18 +617,12 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) airlock_electronics.name = "Access Control" airlock_electronics.holder = src GLOB.rcd_list += src - AddElement(/datum/element/openspace_item_click_handler) /obj/item/construction/rcd/Destroy() QDEL_NULL(airlock_electronics) GLOB.rcd_list -= src . = ..() -/obj/item/construction/rcd/handle_openspace_click(turf/target, mob/user, proximity_flag, click_parameters) - if(proximity_flag) - mode = RCD_FLOORWALL - rcd_create(target, user) - /obj/item/construction/rcd/attack_self(mob/user) ..() var/list/choices = list( @@ -732,7 +735,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) /obj/item/construction/rcd/Initialize(mapload) . = ..() - update_icon() + update_appearance() /obj/item/construction/rcd/borg no_ammo_message = "Insufficient charge." @@ -898,7 +901,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) if(checkResource(deconcost, user)) to_chat(user, "You start deconstructing [A]...") user.Beam(A,icon_state="nzcrentrs_power", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) + playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) if(do_after(user, decondelay, target = A)) if(!useResource(deconcost, user)) return 0 @@ -913,7 +916,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) to_chat(user, "You start building a wall light...") user.Beam(A,icon_state="nzcrentrs_power", time = 15) playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 0) + playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, FALSE) if(do_after(user, floordelay, target = A)) if(!istype(W)) return FALSE @@ -927,7 +930,7 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) candidates += C if(!candidates.len) to_chat(user, "Valid target not found...") - playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, 1) + playsound(src.loc, 'sound/misc/compiler-failure.ogg', 30, TRUE) return FALSE for(var/turf/open/O in candidates) if(istype(O)) @@ -958,8 +961,8 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) if(checkResource(floorcost, user)) to_chat(user, "You start building a floor light...") user.Beam(A,icon_state="nzcrentrs_power", time = 15) - playsound(src.loc, 'sound/machines/click.ogg', 50, 1) - playsound(src.loc, 'sound/effects/light_flicker.ogg', 50, 1) + playsound(loc, 'sound/machines/click.ogg', 50, TRUE) + playsound(loc, 'sound/effects/light_flicker.ogg', 50, TRUE) if(do_after(user, floordelay, target = A)) if(!istype(F)) return 0 @@ -1014,7 +1017,6 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) . = ..() set_plumbing_designs() - ///Set the list of designs this plumbing rcd can make /obj/item/construction/plumbing/proc/set_plumbing_designs() plumbing_design_types = list( From 0e57219826de1c480ed8f59b52b5db19cfedf247 Mon Sep 17 00:00:00 2001 From: RKz Date: Tue, 21 May 2024 14:13:08 -0400 Subject: [PATCH 010/162] bad var --- code/game/objects/items/RCD.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index b3f4363b41a84..64400f96130c8 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -583,10 +583,9 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) var/list/rcd_results = A.rcd_vals(user, src) if(!rcd_results) return FALSE - var/turf/target_turf = get_turf(A) //start animation & check resource for the action var/delay = rcd_results["delay"] * delay_mod - var/obj/effect/constructing_effect/rcd_effect = new(target_turf, delay, src.mode) + var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode) if(!checkResource(rcd_results["cost"], user)) qdel(rcd_effect) return FALSE From 7aff751fc488233528973b9ad69aec4063953d3b Mon Sep 17 00:00:00 2001 From: RKz Date: Fri, 2 Aug 2024 15:45:14 -0400 Subject: [PATCH 011/162] obj_break --- code/modules/antagonists/clock_cult/clockwork_turfs.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/antagonists/clock_cult/clockwork_turfs.dm b/code/modules/antagonists/clock_cult/clockwork_turfs.dm index b88180601d351..36a9381d42eac 100644 --- a/code/modules/antagonists/clock_cult/clockwork_turfs.dm +++ b/code/modules/antagonists/clock_cult/clockwork_turfs.dm @@ -497,6 +497,7 @@ return /obj/structure/grille/ratvar/obj_break() + . = ..() if(!broken && !(flags_1 & NODECONSTRUCT_1)) icon_state = "brokenratvargrille" density = FALSE From d747ee6374908abe59805326cd278a650481181c Mon Sep 17 00:00:00 2001 From: RKz Date: Tue, 6 Aug 2024 10:44:00 -0400 Subject: [PATCH 012/162] WIP on modsuits-take5 --- beestation.dme | 16 + code/__DEFINES/ai.dm | 7 + code/__DEFINES/cargo.dm | 2 + .../__DEFINES/dcs/signals/signals_lighting.dm | 3 + .../dcs/signals/signals_mob/signals_human.dm | 4 + .../dcs/signals/signals_mob/signals_living.dm | 6 + .../dcs/signals/signals_obj/signals_mod.dm | 7 + code/__DEFINES/mobs.dm | 6 + code/__DEFINES/mod.dm | 31 + code/__DEFINES/obj_flags.dm | 3 + code/__DEFINES/traits.dm | 42 +- code/__DEFINES/wiremod.dm | 5 +- code/__HELPERS/colors.dm | 6 + code/_globalvars/bitfields.dm | 3 +- code/_onclick/hud/radial.dm | 2 + code/controllers/subsystem/traumas.dm | 34 +- code/datums/action.dm | 24 + code/datums/ai/objects/mod.dm | 48 + code/datums/components/crafting/recipes.dm | 12 + code/datums/components/shell.dm | 44 +- code/datums/components/shielded.dm | 45 +- code/datums/components/storage/storage.dm | 10 +- code/datums/holocall.dm | 2 +- code/datums/outfit.dm | 10 + code/datums/wires/mod.dm | 57 + code/game/atoms.dm | 2 +- code/game/atoms_movable.dm | 3 + code/game/gamemodes/nuclear/nuclear.dm | 3 +- code/game/machinery/doors/door.dm | 2 +- .../game/machinery/fabricators/exosuit_fab.dm | 2 + code/game/machinery/rechargestation.dm | 4 +- code/game/machinery/suit_storage_unit.dm | 108 +- code/game/objects/items.dm | 4 + code/game/objects/items/RCD.dm | 36 +- code/game/objects/items/cards_ids.dm | 12 + code/game/objects/items/devices/aicard.dm | 14 +- code/game/objects/items/singularityhammer.dm | 19 +- code/game/objects/items/storage/backpack.dm | 8 +- code/game/objects/items/storage/belt.dm | 17 + code/game/objects/items/storage/boxes.dm | 31 + code/game/objects/items/storage/storage.dm | 3 - .../game/objects/items/storage/uplink_kits.dm | 2 +- code/game/objects/items/tanks/jetpack.dm | 41 +- code/game/objects/objs.dm | 2 +- .../crates_lockers/closets/gimmick.dm | 4 +- .../closets/secure/engineering.dm | 1 - code/game/objects/structures/false_walls.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/closed/walls.dm | 2 +- .../changeling/powers/mutations.dm | 2 +- code/modules/antagonists/ert/ert.dm | 32 +- .../role_preference/role_antagonists.dm | 23 +- .../antagonists/wizard/equipment/spellbook.dm | 53 +- .../atmospherics/machinery/atmosmachinery.dm | 3 +- code/modules/awaymissions/capture_the_flag.dm | 1 - code/modules/awaymissions/corpse.dm | 8 +- .../awaymissions/mission_code/TheFactory.dm | 2 +- code/modules/cargo/packs.dm | 16 + .../preferences/entries/player/mod_select.dm | 23 + code/modules/clothing/clothing.dm | 12 +- code/modules/clothing/glasses/_glasses.dm | 6 +- code/modules/clothing/glasses/hud.dm | 2 +- code/modules/clothing/gloves/color.dm | 4 + code/modules/clothing/outfits/ert.dm | 274 +-- code/modules/clothing/outfits/standard.dm | 60 +- code/modules/clothing/shoes/_shoes.dm | 3 - code/modules/clothing/shoes/magboots.dm | 19 +- code/modules/clothing/spacesuits/hardsuit.dm | 29 +- code/modules/clothing/suits/armor.dm | 2 +- code/modules/clothing/suits/wiz_robe.dm | 33 - code/modules/clothing/under/miscellaneous.dm | 2 +- .../kitchen_machinery/griddle.dm | 2 +- code/modules/jobs/job_types/_job.dm | 31 +- .../jobs/job_types/atmospheric_technician.dm | 8 +- code/modules/jobs/job_types/captain.dm | 10 +- code/modules/jobs/job_types/chief_engineer.dm | 10 +- .../jobs/job_types/chief_medical_officer.dm | 10 +- .../jobs/job_types/head_of_security.dm | 11 +- code/modules/jobs/job_types/medical_doctor.dm | 10 + .../jobs/job_types/research_director.dm | 11 +- code/modules/jobs/job_types/roboticist.dm | 8 + code/modules/jobs/job_types/shaft_miner.dm | 8 +- .../jobs/job_types/station_engineer.dm | 9 +- code/modules/mob/living/carbon/carbon.dm | 12 +- .../mob/living/carbon/carbon_defense.dm | 2 +- .../mob/living/carbon/carbon_movement.dm | 10 - code/modules/mob/living/carbon/human/human.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 3 + .../mob/living/carbon/human/human_helpers.dm | 22 - .../mob/living/carbon/human/human_movement.dm | 17 +- code/modules/mob/living/living.dm | 8 +- code/modules/mob/living/silicon/ai/ai.dm | 4 +- .../modules/mob/living/silicon/robot/robot.dm | 2 - .../mob/living/silicon/robot/robot_modules.dm | 4 +- .../living/silicon/robot/robot_movement.dm | 10 - .../mob/living/simple_animal/corpse.dm | 6 +- .../simple_animal/friendly/drone/_drone.dm | 8 +- .../friendly/drone/extra_drone_types.dm | 3 +- code/modules/mob/mob_helpers.dm | 4 + code/modules/mob/mob_movement.dm | 10 +- code/modules/mod/mod_actions.dm | 71 + code/modules/mod/mod_activation.dm | 217 ++ code/modules/mod/mod_ai.dm | 88 + code/modules/mod/mod_clothes.dm | 123 ++ code/modules/mod/mod_construction.dm | 278 +++ code/modules/mod/mod_control.dm | 560 ++++++ code/modules/mod/mod_theme.dm | 854 ++++++++ code/modules/mod/mod_types.dm | 157 ++ code/modules/mod/mod_ui.dm | 80 + code/modules/mod/modules/_module.dm | 252 +++ code/modules/mod/modules/modules.dm | 1775 +++++++++++++++++ .../multiz/movement/mob/living_zfall.dm | 2 + code/modules/recycling/disposal/bin.dm | 2 +- .../designs/mechfabricator_designs.dm | 337 +++- code/modules/research/techweb/all_nodes.dm | 119 ++ .../ruins/spaceruin_code/oldstation.dm | 127 +- .../objective_types/assassination.dm | 2 +- code/modules/spells/spell.dm | 23 +- .../spells/spell_types/rightandwrong.dm | 2 - code/modules/surgery/organs/augments_chest.dm | 6 + code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/modsuit.dm | 25 + code/modules/unit_tests/outfit_sanity.dm | 51 + code/modules/uplink/uplink_items.dm | 47 +- code/modules/vehicles/mecha/_mecha.dm | 6 +- code/modules/vehicles/mecha/mecha_wreckage.dm | 2 +- icons/mob/actions/actions_mod.dmi | Bin 0 -> 4229 bytes icons/mob/clothing/mod.dmi | Bin 0 -> 133664 bytes icons/obj/clothing/modsuit/mod_clothing.dmi | Bin 0 -> 73070 bytes .../obj/clothing/modsuit/mod_construction.dmi | Bin 0 -> 4600 bytes icons/obj/clothing/modsuit/mod_modules.dmi | Bin 0 -> 41257 bytes icons/obj/machines/mod_installer.dmi | Bin 0 -> 6399 bytes strings/tips.txt | 3 - tgui/packages/tgui/interfaces/MODsuit.js | 509 +++++ .../features/game_preferences/mod_select.tsx | 8 + 136 files changed, 6739 insertions(+), 607 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm create mode 100644 code/__DEFINES/mod.dm create mode 100644 code/datums/ai/objects/mod.dm create mode 100644 code/datums/wires/mod.dm create mode 100644 code/modules/client/preferences/entries/player/mod_select.dm create mode 100644 code/modules/mod/mod_actions.dm create mode 100644 code/modules/mod/mod_activation.dm create mode 100644 code/modules/mod/mod_ai.dm create mode 100644 code/modules/mod/mod_clothes.dm create mode 100644 code/modules/mod/mod_construction.dm create mode 100644 code/modules/mod/mod_control.dm create mode 100644 code/modules/mod/mod_theme.dm create mode 100644 code/modules/mod/mod_types.dm create mode 100644 code/modules/mod/mod_ui.dm create mode 100644 code/modules/mod/modules/_module.dm create mode 100644 code/modules/mod/modules/modules.dm create mode 100644 code/modules/unit_tests/modsuit.dm create mode 100644 code/modules/unit_tests/outfit_sanity.dm create mode 100644 icons/mob/actions/actions_mod.dmi create mode 100644 icons/mob/clothing/mod.dmi create mode 100644 icons/obj/clothing/modsuit/mod_clothing.dmi create mode 100644 icons/obj/clothing/modsuit/mod_construction.dmi create mode 100644 icons/obj/clothing/modsuit/mod_modules.dmi create mode 100644 icons/obj/machines/mod_installer.dmi create mode 100644 tgui/packages/tgui/interfaces/MODsuit.js create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx diff --git a/beestation.dme b/beestation.dme index e25f3e801c693..25878455122f9 100644 --- a/beestation.dme +++ b/beestation.dme @@ -118,6 +118,7 @@ #include "code\__DEFINES\metacoin.dm" #include "code\__DEFINES\mineral.dm" #include "code\__DEFINES\mobs.dm" +#include "code\__DEFINES\mod.dm" #include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" @@ -228,6 +229,7 @@ #include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_food.dm" #include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_grenade.dm" #include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_implant.dm" +#include "code\__DEFINES\dcs\signals\signals_obj\signals_mod.dm" #include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_item.dm" #include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_itemattack.dm" #include "code\__DEFINES\dcs\signals\signals_obj\signals_item\signals_organs.dm" @@ -598,6 +600,7 @@ #include "code\datums\ai\movement\ai_movement_basic_avoidance.dm" #include "code\datums\ai\movement\ai_movement_dumb.dm" #include "code\datums\ai\movement\ai_movement_jps.dm" +#include "code\datums\ai\objects\mod.dm" #include "code\datums\ai\tamed\tamed_behaviour.dm" #include "code\datums\ai\tamed\tamed_controller.dm" #include "code\datums\announcers\_announcer.dm" @@ -960,6 +963,7 @@ #include "code\datums\wires\fax.dm" #include "code\datums\wires\mass_driver.dm" #include "code\datums\wires\microwave.dm" +#include "code\datums\wires\mod.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\quantum_pad.dm" @@ -2377,6 +2381,7 @@ #include "code\modules\client\preferences\entries\player\hotkeys.dm" #include "code\modules\client\preferences\entries\player\item_outlines.dm" #include "code\modules\client\preferences\entries\player\ooc.dm" +#include "code\modules\client\preferences\entries\player\mod_select.dm" #include "code\modules\client\preferences\entries\player\parallax.dm" #include "code\modules\client\preferences\entries\player\pixel_size.dm" #include "code\modules\client\preferences\entries\player\preferred_map.dm" @@ -3297,6 +3302,17 @@ #include "code\modules\mob\living\simple_animal\slime\say.dm" #include "code\modules\mob\living\simple_animal\slime\slime.dm" #include "code\modules\mob\living\simple_animal\slime\subtypes.dm" +#include "code\modules\mod\mod_actions.dm" +#include "code\modules\mod\mod_activation.dm" +#include "code\modules\mod\mod_ai.dm" +#include "code\modules\mod\mod_clothes.dm" +#include "code\modules\mod\mod_construction.dm" +#include "code\modules\mod\mod_control.dm" +#include "code\modules\mod\mod_theme.dm" +#include "code\modules\mod\mod_types.dm" +#include "code\modules\mod\mod_ui.dm" +#include "code\modules\mod\modules\_module.dm" +#include "code\modules\mod\modules\modules.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\_modular_computer_shared.dm" #include "code\modules\modular_computers\computers\item\computer.dm" diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm index 7fe4abbd805a9..91a4b10991270 100644 --- a/code/__DEFINES/ai.dm +++ b/code/__DEFINES/ai.dm @@ -87,6 +87,13 @@ ///Amount of successful hits in a row this item has had #define BB_CURSED_THROW_ATTEMPT_COUNT "BB_cursed_throw_attempt_count" +///Mob the MOD is trying to attach to +#define BB_MOD_TARGET "BB_mod_target" +///The implant the AI was created from +#define BB_MOD_IMPLANT "BB_mod_implant" +///Range for a MOD AI controller. +#define MOD_AI_RANGE 100 + ///Vending machine AI controller blackboard keys #define BB_VENDING_CURRENT_TARGET "BB_vending_current_target" #define BB_VENDING_TILT_COOLDOWN "BB_vending_tilt_cooldown" diff --git a/code/__DEFINES/cargo.dm b/code/__DEFINES/cargo.dm index 721e48518b05c..24c2b61609e1d 100644 --- a/code/__DEFINES/cargo.dm +++ b/code/__DEFINES/cargo.dm @@ -46,6 +46,8 @@ #define SUPPLYPOD_X_OFFSET -16 +#define CARGO_CRATE_VALUE 200 + GLOBAL_LIST_EMPTY(supplypod_loading_bays) GLOBAL_LIST_INIT(podstyles, list(\ diff --git a/code/__DEFINES/dcs/signals/signals_lighting.dm b/code/__DEFINES/dcs/signals/signals_lighting.dm index 02265d2f16691..784bca46dc7f9 100644 --- a/code/__DEFINES/dcs/signals/signals_lighting.dm +++ b/code/__DEFINES/dcs/signals/signals_lighting.dm @@ -38,3 +38,6 @@ ///Called when the movable tries to toggle its dynamic light LIGHTING_ON status, from base atom/movable/lighting_overlay_toggle_on(): (new_state) #define COMSIG_MOVABLE_LIGHT_OVERLAY_TOGGLE_ON "movable_light_overlay_toggle_on" +/// from base of atom/movable/Process_Spacemove(): (movement_dir) +#define COMSIG_MOVABLE_SPACEMOVE "spacemove" + #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_human.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_human.dm index 9c57150679f92..89e1b1e39f5d0 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_human.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_human.dm @@ -21,3 +21,7 @@ #define COMSIG_MOB_PRE_CAST_SPELL "mob_cast_spell" /// Return to cancel the cast from beginning. #define COMPONENT_CANCEL_SPELL (1<<0) + +//from /mob/living/carbon/human/proc/check_shields(): (atom/hit_by, damage, attack_text, attack_type, armour_penetration) +#define COMSIG_HUMAN_CHECK_SHIELDS "human_check_shields" + #define SHIELD_BLOCK (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm index 66dd862db99d7..ed6222acd6eb4 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm @@ -67,3 +67,9 @@ // basic mob signals /// Called on /basic when updating its speed, from base of /mob/living/basic/update_basic_mob_varspeed(): () #define POST_BASIC_MOB_UPDATE_VARSPEED "post_basic_mob_update_varspeed" + +///From base of mob/living/MobBump() (mob/living) +#define COMSIG_LIVING_MOB_BUMP "living_mob_bump" +///From base of mob/living/ZImpactDamage() (mob/living, levels, turf/t) +#define COMSIG_LIVING_Z_IMPACT "living_z_impact" + #define NO_Z_IMPACT_DAMAGE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm new file mode 100644 index 0000000000000..4c8ec4d6dedf9 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm @@ -0,0 +1,7 @@ +//MODsuit signals +/// Called when a module is selected to be the active one from on_select() +#define COMSIG_MOD_MODULE_SELECTED "mod_module_selected" +/// Called when a MOD activation is called from toggle_activate(mob/user) +#define COMSIG_MOD_ACTIVATE "mod_activate" + /// Cancels the suit's activation + #define MOD_CANCEL_ACTIVATE (1 << 0) diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index be398a7d46e8e..45a3b16e8dc25 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -396,6 +396,12 @@ GLOBAL_LIST_INIT(available_random_trauma_list, list( #define REAGENTS_METABOLISM 0.4 //! How many units of reagent are consumed per tick, by default. #define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) //! By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism +// Eye protection +#define FLASH_PROTECTION_SENSITIVE -1 +#define FLASH_PROTECTION_NONE 0 +#define FLASH_PROTECTION_FLASH 1 +#define FLASH_PROTECTION_WELDER 2 + // Roundstart trait system #define MAX_QUIRKS 6 //! The maximum amount of quirks one character can have at roundstart diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm new file mode 100644 index 0000000000000..03163497d42c8 --- /dev/null +++ b/code/__DEFINES/mod.dm @@ -0,0 +1,31 @@ +/// Default value for the max_complexity var on MODsuits +#define DEFAULT_MAX_COMPLEXITY 15 + +/// Default cell drain per process on MODsuits +#define DEFAULT_CELL_DRAIN 5 + +/// Passive module, just acts when put in naturally. +#define MODULE_PASSIVE 0 +/// Usable module, does something when you press a button. +#define MODULE_USABLE 1 +/// Toggle module, you turn it on/off and it does stuff. +#define MODULE_TOGGLE 2 +/// Actively usable module, you may only have one selected at a time. +#define MODULE_ACTIVE 3 + +//Defines used by the theme for clothing flags and similar +#define HELMET_LAYER "helmet_layer" +#define HELMET_FLAGS "helmet_flags" +#define CHESTPLATE_FLAGS "chestplate_flags" +#define GAUNTLETS_FLAGS "gauntlets_flags" +#define BOOTS_FLAGS "boots_flags" + +#define UNSEALED_CLOTHING "unsealed_clothing" +#define SEALED_CLOTHING "sealed_clothing" +#define UNSEALED_INVISIBILITY "unsealed_invisibility" +#define SEALED_INVISIBILITY "sealed_invisibility" +#define UNSEALED_COVER "unsealed_cover" +#define SEALED_COVER "sealed_cover" + +/// Global list of all /datum/mod_theme +GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/__DEFINES/obj_flags.dm b/code/__DEFINES/obj_flags.dm index ccb1c97b78797..661b32d7242b8 100644 --- a/code/__DEFINES/obj_flags.dm +++ b/code/__DEFINES/obj_flags.dm @@ -33,6 +33,8 @@ #define ISWEAPON (1<<15) //! If this item should hit living mobs when used on harm intent #define EXAMINE_SKIP (1<<16) //! Examine will not read out this item #define ISCARVABLE (1<<17) //! Examine will not read out this item +///Can be equipped on digitigrade legs. +#define IGNORE_DIGITIGRADE (1<<18) // Flags for the clothing_flags var on /obj/item/clothing @@ -44,6 +46,7 @@ #define THICKMATERIAL (1<<5) //! prevents syringes, parapens and hypos if the external suit or helmet (if targeting head) has this flag. Example: space suits, biosuit, bombsuits, thick suits that cover your body. #define VOICEBOX_TOGGLABLE (1<<6) //! The voicebox in this clothing can be toggled. #define VOICEBOX_DISABLED (1<<7) //! The voicebox is currently turned off. +#define BLOCKS_SHOVE_KNOCKDOWN (1<<8) // Prevents shovies against a dense object from knocking the wearer down. #define SNUG_FIT (1<<9) //! prevents hat throwing from knocking this hat off #define EFFECT_HAT (1<<10) //! For hats with an effect that shouldn't get knocked off ie finfoil #define SCAN_REAGENTS (1<<11) //! Allows helmets and glasses to scan reagents. diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 5f17209e041d1..7a5d1ae891be3 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -183,8 +183,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_RADIMMUNE "rad_immunity" #define TRAIT_VIRUSIMMUNE "virus_immunity" #define TRAIT_PIERCEIMMUNE "pierce_immunity" -#define TRAIT_NODISMEMBER "dismember_immunity" -#define TRAIT_NOFIRE "nonflammable" +#define TRAIT_NODISMEMBER "dismember_immunity" +#define TRAIT_NOFIRE "nonflammable" +/// Prevents plasmamen from self-igniting +#define TRAIT_NOSELFIGNITION "no_selfignition" #define TRAIT_NOGUNS "no_guns" #define TRAIT_NOHUNGER "no_hunger" #define TRAIT_NOMETABOLISM "no_metabolism" @@ -197,7 +199,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_EASYLIMBDISABLE "easy_limb_disable" #define TRAIT_TOXINLOVER "toxinlover" #define TRAIT_NOHAIRLOSS "no_hair_loss" +/// reduces the use time of syringes, pills, patches and medigels but only when using on someone +#define TRAIT_FASTMED "fast_med_use" #define TRAIT_NOBREATH "no_breath" +/// Like antimagic, but doesn't block the user from casting +#define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock" #define TRAIT_SEE_ANTIMAGIC "see_anti_magic" #define TRAIT_DEPRESSION "depression" #define TRAIT_JOLLY "jolly" @@ -222,9 +228,21 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_DISK_VERIFIER "disk-verifier" #define TRAIT_MULTILINGUAL "multilingual" //I know another language #define TRAIT_LINGUIST "linguist" -#define TRAIT_NOMOBSWAP "no-mob-swap" -#define TRAIT_XRAY_VISION "xray_vision" -#define TRAIT_THERMAL_VISION "thermal_vision" +#define TRAIT_NOMOBSWAP "no-mob-swap" +/// Gives us turf, mob and object vision through walls +#define TRAIT_XRAY_VISION "xray_vision" +/// Gives us mob vision through walls and slight night vision +#define TRAIT_THERMAL_VISION "thermal_vision" +/// Gives us turf vision through walls and slight night vision +#define TRAIT_MESON_VISION "meson_vision" +/// Gives us Night vision +#define TRAIT_TRUE_NIGHT_VISION "true_night_vision" +/// Negates our gravity, letting us move normally on floors in 0-g +#define TRAIT_NEGATES_GRAVITY "negates_gravity" +/// Lets us scan reagents +#define TRAIT_REAGENT_SCANNER "reagent_scanner" +/// Lets us scan boozepower +#define TRAIT_BOOZEPOWER_SCANNER "boozepower_scanner" #define TRAIT_ABDUCTOR_TRAINING "abductor-training" #define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" #define TRAIT_SURGEON "surgeon" //Grants access to all surgeries @@ -237,16 +255,20 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_MEDICAL_METABOLISM "medical-metabolism" #define TRAIT_ALWAYS_CLEAN "always-clean" #define TRAIT_BOOZE_SLIDER "booze-slider" -#define TRAIT_QUICK_CARRY "quick-carry" -#define TRAIT_QUICKER_CARRY "quicker-carry" +/// We place people into a fireman carry quicker than standard +#define TRAIT_QUICK_CARRY "quick-carry" +/// We place people into a fireman carry especially quickly compared to quick_carry +#define TRAIT_QUICKER_CARRY "quicker-carry" +#define TRAIT_QUICK_BUILD "quick-build" #define TRAIT_UNINTELLIGIBLE_SPEECH "unintelligible-speech" #define TRAIT_UNSTABLE "unstable" #define TRAIT_OIL_FRIED "oil_fried" #define TRAIT_XENO_IMMUNE "xeno_immune" //prevents facehuggers implanting races that wouldn't be able to host an egg #define TRAIT_NECROPOLIS_INFECTED "necropolis-infection" #define TRAIT_BEEFRIEND "beefriend" -#define TRAIT_MEDICAL_HUD "med_hud" -#define TRAIT_SECURITY_HUD "sec_hud" +#define TRAIT_MEDICAL_HUD "med_hud" +#define TRAIT_SECURITY_HUD "sec_hud" +/// for something granting you a diagnostic hud #define TRAIT_DIAGNOSTIC_HUD "diag_hud" #define TRAIT_MEDIBOTCOMINGTHROUGH "medbot" //Is a medbot healing you #define TRAIT_PASSTABLE "passtable" @@ -489,6 +511,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define PAI_FOLDED "pai-folded" /// Trait applied to brain mobs when they lack external aid for locomotion, such as being inside a mech. #define BRAIN_UNAIDED "brain-unaided" +/// Trait applied by MODsuits. +#define MOD_TRAIT "mod" #define TRAIT_PRESERVE_UI_WITHOUT_CLIENT "preserve_ui_without_client" //this mob should never close ui even if it doesn't have a client #define EXPERIMENTAL_SURGERY_TRAIT "experimental_surgery" #define NINJA_KIDNAPPED_TRAIT "ninja_kidnapped" diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm index ea804f1c6a85b..ef00e7bada284 100644 --- a/code/__DEFINES/wiremod.dm +++ b/code/__DEFINES/wiremod.dm @@ -70,7 +70,7 @@ // Shells /// Whether a circuit is stuck on a shell and cannot be removed (by a user) -#define SHELL_FLAG_CIRCUIT_FIXED (1<<0) +#define SHELL_FLAG_CIRCUIT_UNREMOVABLE (1<<0) /// Whether the shell needs to be anchored for the circuit to be on. #define SHELL_FLAG_REQUIRE_ANCHOR (1<<1) @@ -81,6 +81,9 @@ /// Whether the shell allows actions to be peformed on a shell if the action fails. This will additionally block the messages from being displayed. #define SHELL_FLAG_ALLOW_FAILURE_ACTION (1<<3) +/// Whether a circuit is not able to be modified +#define SHELL_FLAG_CIRCUIT_UNMODIFIABLE (1<<5) + // Shell capacities. These can be converted to configs very easily later #define SHELL_CAPACITY_SMALL 25 #define SHELL_CAPACITY_MEDIUM 50 diff --git a/code/__HELPERS/colors.dm b/code/__HELPERS/colors.dm index 1161092c79afc..ed1b832224ab2 100644 --- a/code/__HELPERS/colors.dm +++ b/code/__HELPERS/colors.dm @@ -112,3 +112,9 @@ final_color += copytext(color, digit, digit + 1) return final_color + +/// Given a color in the format of "#RRGGBB", will return if the color +/// is dark. +/proc/is_color_dark(color, threshold = 25) + var/hsl = rgb2num(color, COLORSPACE_HSL) + return hsl[3] < threshold diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 1cdd42507f746..d40e65d7e46a4 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -210,9 +210,8 @@ DEFINE_BITFIELD(clothing_flags, list( "VOICEBOX_DISABLED" = VOICEBOX_DISABLED, "SNUG_FIT" = SNUG_FIT, "EFFECT_HAT" = EFFECT_HAT, - "SCAN_REAGENTS" = SCAN_REAGENTS, - "SCAN_BOOZEPOWER" = SCAN_BOOZEPOWER, "HEADINTERNALS" = HEADINTERNALS, + "BLOCKS_SHOVE_KNOCKDOWN" = BLOCKS_SHOVE_KNOCKDOWN, )) DEFINE_BITFIELD(tesla_flags, list( diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index d3346d2bde048..b6150f71c6628 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -123,6 +123,8 @@ GLOBAL_LIST_EMPTY(radial_menus) else py_shift = 32 restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth. + else if(hudfix_method && AM.loc) + anchor = get_atom_on_turf(anchor) //Sets defaults //These assume 45 deg min_angle diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm index 056bdb65eb4f6..326c651ed33ab 100644 --- a/code/controllers/subsystem/traumas.dm +++ b/code/controllers/subsystem/traumas.dm @@ -122,18 +122,27 @@ SUBSYSTEM_DEF(traumas) /obj/effect/decal/remains/human)), "conspiracies" = typecacheof(list( - /obj/item/clothing/under/rank/captain, /obj/item/clothing/under/rank/security/head_of_security, - /obj/item/clothing/under/rank/engineering/chief_engineer, /obj/item/clothing/under/rank/medical/chief_medical_officer, - /obj/item/clothing/under/rank/civilian/head_of_personnel, /obj/item/clothing/under/rank/rnd/research_director, - /obj/item/clothing/under/rank/security/head_of_security/white, /obj/item/clothing/under/rank/security/head_of_security/alt, - /obj/item/clothing/under/rank/rnd/research_director/alt, /obj/item/clothing/under/rank/rnd/research_director/turtleneck, - /obj/item/clothing/under/rank/captain/parade, /obj/item/clothing/under/rank/security/head_of_security/parade, /obj/item/clothing/under/rank/security/head_of_security/parade/female, - /obj/item/clothing/head/helmet/abductor, /obj/item/clothing/suit/armor/abductor/vest, /obj/item/abductor/baton, - /obj/item/storage/belt/military/abductor, /obj/item/gun/energy/alien, /obj/item/abductor/silencer, - /obj/item/abductor/gizmo, /obj/item/clothing/under/rank/centcom/official, - /obj/item/clothing/suit/space/hardsuit/ert, /obj/item/clothing/suit/space/hardsuit/ert/sec, - /obj/item/clothing/suit/space/hardsuit/ert/engi, /obj/item/clothing/suit/space/hardsuit/ert/med, - /obj/item/clothing/suit/space/hardsuit/deathsquad, /obj/item/clothing/head/helmet/space/hardsuit/deathsquad, + /obj/item/clothing/under/rank/captain, + /obj/item/clothing/under/rank/security/head_of_security, + /obj/item/clothing/under/rank/engineering/chief_engineer, + /obj/item/clothing/under/rank/medical/chief_medical_officer, + /obj/item/clothing/under/rank/civilian/head_of_personnel, + /obj/item/clothing/under/rank/rnd/research_director, + /obj/item/clothing/under/rank/security/head_of_security/white, + /obj/item/clothing/under/rank/security/head_of_security/alt, + /obj/item/clothing/under/rank/rnd/research_director/alt, + /obj/item/clothing/under/rank/rnd/research_director/turtleneck, + /obj/item/clothing/under/rank/captain/parade, + /obj/item/clothing/under/rank/security/head_of_security/parade, + /obj/item/clothing/under/rank/security/head_of_security/parade/female, + /obj/item/clothing/head/helmet/abductor, + /obj/item/clothing/suit/armor/abductor/vest, + /obj/item/abductor/baton, + /obj/item/storage/belt/military/abductor, + /obj/item/gun/energy/alien, + /obj/item/abductor/silencer, + /obj/item/abductor/gizmo, + /obj/item/clothing/under/rank/centcom/official, /obj/machinery/door/airlock/centcom)), "robots" = typecacheof(list( @@ -168,7 +177,6 @@ SUBSYSTEM_DEF(traumas) /obj/item/stack/sheet/brass, /obj/machinery/door/airlock/clockwork, /obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard, /obj/item/spellbook, /obj/item/staff, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/gun/magic/staff, /obj/item/gun/magic/wand, /obj/item/nullrod, /obj/item/clothing/under/rank/civilian/chaplain)), diff --git a/code/datums/action.dm b/code/datums/action.dm index 6792456a3f271..24b70cb49a9cf 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -26,6 +26,9 @@ var/has_cooldown_timer = FALSE + ///All mobs that are sharing our action button. + var/list/sharers = list() + /datum/action/New(Target) link_to(Target) button = new @@ -157,6 +160,27 @@ SIGNAL_HANDLER UpdateButtonIcon() +//Adds our action button to the screen of another player +/datum/action/proc/Share(mob/freeloader) + if(!freeloader.client) + return + sharers += WEAKREF(freeloader) + freeloader.client.screen += button + freeloader.actions += src + freeloader.update_action_buttons() + +//Removes our action button from the screen of another player +/datum/action/proc/Unshare(mob/freeloader) + if(!freeloader.client) + return + for(var/freeloader_reference in sharers) + if(IS_WEAKREF_OF(freeloader, freeloader_reference)) + sharers -= freeloader_reference + break + freeloader.client.screen -= button + freeloader.actions -= src + freeloader.update_action_buttons() + //Presets for item actions /datum/action/item_action check_flags = AB_CHECK_HANDS_BLOCKED|AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm new file mode 100644 index 0000000000000..6f9a763b060ed --- /dev/null +++ b/code/datums/ai/objects/mod.dm @@ -0,0 +1,48 @@ +/// An AI controller for the MODsuit pathfinder module. It's activated by implant and attaches itself to the user. +/datum/ai_controller/mod + blackboard = list( + BB_MOD_TARGET, + BB_MOD_IMPLANT, + ) + max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesnt run otherwise + ai_movement = /datum/ai_movement/jps + ///ID card generated from the suit's required access. Used for pathing. + var/obj/item/card/id/id_card + +/datum/ai_controller/mod/TryPossessPawn(atom/new_pawn) + if(!istype(new_pawn, /obj/item/mod/control)) + return AI_CONTROLLER_INCOMPATIBLE + var/obj/item/mod/control/mod = new_pawn + id_card = new /obj/item/card/id() + if(length(mod.req_access)) + id_card.set_access(mod.req_access) + return ..() //Run parent at end + +/datum/ai_controller/mod/UnpossessPawn(destroy) + QDEL_NULL(id_card) + return ..() //Run parent at end + +/datum/ai_controller/mod/SelectBehaviors(delta_time) + current_behaviors = list() + if(blackboard[BB_MOD_TARGET] && blackboard[BB_MOD_IMPLANT]) + queue_behavior(/datum/ai_behavior/mod_attach) + +/datum/ai_controller/mod/get_access() + return id_card + +/datum/ai_behavior/mod_attach + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM + +/datum/ai_behavior/mod_attach/perform(delta_time, datum/ai_controller/controller) + . = ..() + if(!controller.pawn.Adjacent(controller.blackboard[BB_MOD_TARGET])) + return + var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] + implant.module.attach(controller.blackboard[BB_MOD_TARGET]) + finish_action(controller, TRUE) + +/datum/ai_behavior/mod_attach/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.blackboard[BB_MOD_TARGET] = null + var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] + implant.end_recall(succeeded) diff --git a/code/datums/components/crafting/recipes.dm b/code/datums/components/crafting/recipes.dm index 1489651c899e3..dc19bcfcb49e7 100644 --- a/code/datums/components/crafting/recipes.dm +++ b/code/datums/components/crafting/recipes.dm @@ -1221,6 +1221,18 @@ tools = list(TOOL_WRENCH, TOOL_WIRECUTTER) category = CAT_MISC +/datum/crafting_recipe/mod_core + name = "MOD core" + result = /obj/item/mod/construction/core + tools = list(TOOL_SCREWDRIVER) + time = 10 SECONDS + reqs = list(/obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/organ/heart = 1 + ) + category = CAT_MISC + /datum/crafting_recipe/personal_locker name = "Personal Locker" result = /obj/structure/closet/secure_closet/personal/empty diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 9a98e816e6d5e..e233d07ac4eec 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -26,12 +26,13 @@ set_unremovable_circuit_components(unremovable_circuit_components) /datum/component/shell/RegisterWithParent() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attack_by)) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, PROC_REF(on_attack_ghost)) - if(!(shell_flags & SHELL_FLAG_CIRCUIT_FIXED)) - RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(on_screwdriver_act)) + if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNMODIFIABLE)) RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), PROC_REF(on_multitool_act)) + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(on_attack_by)) + if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE)) + RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(on_screwdriver_act)) RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_object_deconstruct)) if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) RegisterSignal(parent, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, PROC_REF(on_unfasten)) @@ -92,6 +93,10 @@ /datum/component/shell/proc/on_object_deconstruct() SIGNAL_HANDLER + if(!attached_circuit) + return + if(shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE) + return remove_circuit() /datum/component/shell/proc/on_attack_ghost(datum/source, mob/dead/observer/ghost) @@ -139,7 +144,7 @@ if(attached_circuit) if(attached_circuit.owner_id && item == attached_circuit.owner_id.resolve()) set_locked(!locked) - source.balloon_alert(attacker, "[locked? "locked" : "unlocked"] [source]") + source.balloon_alert(attacker, "[locked ? "locked" : "unlocked"] [source]") return COMPONENT_NO_AFTERATTACK if(!attached_circuit.owner_id && istype(item, /obj/item/card/id)) @@ -243,7 +248,10 @@ return locked = FALSE attached_circuit = circuitboard - RegisterSignal(circuitboard, COMSIG_MOVABLE_MOVED, PROC_REF(on_circuit_moved)) + if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE)) + RegisterSignal(circuitboard, COMSIG_MOVABLE_MOVED, PROC_REF(on_circuit_moved)) + //if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) + // RegisterSignal(circuitboard, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROEC_REF(override_power_usage)) RegisterSignal(circuitboard, COMSIG_PARENT_QDELETING, PROC_REF(on_circuit_delete)) for(var/obj/item/circuit_component/to_add as anything in unremovable_circuit_components) to_add.forceMove(attached_circuit) @@ -255,10 +263,13 @@ attached_circuit.set_locked(FALSE) if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) - on_unfasten(parent_atom, parent_atom.anchored) + attached_circuit.on = parent_atom.anchored - if(circuitboard.loc != parent_atom) + if((shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE)) + circuitboard.moveToNullspace() + else if(circuitboard.loc != parent_atom) circuitboard.forceMove(parent_atom) + attached_circuit.set_shell(parent_atom) /** * Removes the circuit from the component. Doesn't do any checks to see for an existing circuit so that should be done beforehand. @@ -294,3 +305,22 @@ usb_cable.attached_circuit = attached_circuit return COMSIG_USB_CABLE_CONNECTED_TO_CIRCUIT + +/** + * Determines if a user is authorized to see the existance of this shell. Returns false if they are not + * + * Arguments: + * * user - The user to check if they are authorized + */ +/datum/component/shell/proc/is_authorized(mob/user) + if((shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE) && (shell_flags & SHELL_FLAG_CIRCUIT_UNMODIFIABLE)) + return FALSE + + /* + if(attached_circuit?.admin_only) + if(check_rights_for(user.client, R_VAREDIT)) + return TRUE + return FALSE + */ + + return TRUE diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 9b0bbe696096d..449e6654405cf 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -23,6 +23,8 @@ var/shield_inhand = FALSE /// Should the shield lose charges equal to the damage dealt by a hit? var/lose_multiple_charges = FALSE + /// The item we use for recharging + var/recharge_path /// The cooldown tracking when we were last hit COOLDOWN_DECLARE(recently_hit_cd) /// The cooldown tracking when we last replenished a charge @@ -30,7 +32,7 @@ /// A callback for the sparks/message that play when a charge is used, see [/datum/component/shielded/proc/default_run_hit_callback] var/datum/callback/on_hit_effects -/datum/component/shielded/Initialize(max_charges = 3, recharge_start_delay = 20 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, shield_icon_file = 'icons/effects/effects.dmi', shield_icon = "shield-old", shield_inhand = FALSE, run_hit_callback) +/datum/component/shielded/Initialize(max_charges = 3, recharge_start_delay = 20 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, recharge_path = null, starting_charges = null, shield_icon_file = 'icons/effects/effects.dmi', shield_icon = "shield-old", shield_inhand = FALSE, run_hit_callback) if(!isitem(parent) || max_charges <= 0) return COMPONENT_INCOMPATIBLE @@ -39,12 +41,15 @@ src.charge_increment_delay = charge_increment_delay src.charge_recovery = charge_recovery src.lose_multiple_charges = lose_multiple_charges + src.recharge_path = recharge_path src.shield_icon_file = shield_icon_file src.shield_icon = shield_icon src.shield_inhand = shield_inhand src.on_hit_effects = run_hit_callback || CALLBACK(src, PROC_REF(default_run_hit_callback)) - - current_charges = max_charges + if(isnull(starting_charges)) + current_charges = max_charges + else + current_charges = starting_charges if(recharge_start_delay) START_PROCESSING(SSdcs, src) @@ -62,9 +67,18 @@ RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(lost_wearer)) RegisterSignal(parent, COMSIG_ITEM_HIT_REACT, PROC_REF(on_hit_react)) RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(check_recharge_rune)) + var/atom/shield = parent + if(ismob(shield.loc)) + var/mob/holder = shield.loc + if(holder.is_holding(parent) && !shield_inhand) + return + set_wearer(holder) /datum/component/shielded/UnregisterFromParent() UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED, COMSIG_ITEM_HIT_REACT, COMSIG_PARENT_ATTACKBY)) + var/atom/shield = parent + if(shield.loc == wearer) + lost_wearer(src, wearer) // Handle recharging, if we want to /datum/component/shielded/process(delta_time) @@ -96,12 +110,7 @@ if(slot == ITEM_SLOT_HANDS && !shield_inhand) lost_wearer(source, user) return - - wearer = user - RegisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) - RegisterSignal(wearer, COMSIG_PARENT_QDELETING, PROC_REF(lost_wearer)) - if(current_charges) - wearer.update_appearance(UPDATE_ICON) + set_wearer(source, user) /// Either we've been dropped or our wearer has been QDEL'd. Either way, they're no longer our problem /datum/component/shielded/proc/lost_wearer(datum/source, mob/user) @@ -112,6 +121,13 @@ wearer.update_appearance(UPDATE_ICON) wearer = null +/datum/component/shielded/proc/set_wearer(mob/user) + wearer = user + RegisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/on_update_overlays) + RegisterSignal(wearer, COMSIG_PARENT_QDELETING, .proc/lost_wearer) + if(current_charges) + wearer.update_appearance(UPDATE_ICON) + /// Used to draw the shield overlay on the wearer /datum/component/shielded/proc/on_update_overlays(atom/parent_atom, list/overlays) SIGNAL_HANDLER @@ -141,8 +157,6 @@ INVOKE_ASYNC(src, PROC_REF(actually_run_hit_callback), owner, attack_text, current_charges) if(!recharge_start_delay) // if recharge_start_delay is 0, we don't recharge - if(!current_charges) // obviously if someone ever adds a manual way to replenish charges, change this - qdel(src) return START_PROCESSING(SSdcs, src) // if we DO recharge, start processing so we can do that @@ -158,16 +172,13 @@ if(current_charges <= 0) owner.visible_message("[owner]'s shield overloads!") -/datum/component/shielded/proc/check_recharge_rune(datum/source, obj/item/wizard_armour_charge/recharge_rune, mob/living/user) +/datum/component/shielded/proc/check_recharge_rune(datum/source, obj/item/recharge_rune, mob/living/user) SIGNAL_HANDLER - if(!istype(recharge_rune)) + if(!istype(recharge_rune, recharge_path)) return . = COMPONENT_NO_AFTERATTACK - if(!istype(parent, /obj/item/clothing/suit/space/hardsuit/shielded/wizard)) - to_chat(user, "The rune can only be used on battlemage armour!") - return - current_charges += recharge_rune.restored_charges + adjust_charge(charge_recovery) to_chat(user, "You charge \the [parent]. It can now absorb [current_charges] hits.") qdel(recharge_rune) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 238c9f1460413..de226861f9839 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -502,8 +502,8 @@ //Tries to dump content /datum/component/storage/proc/dump_content_at(atom/dest_object, mob/M) var/atom/A = parent - var/atom/dump_destination = dest_object.get_dumping_location() - if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) + var/atom/dump_destination = get_dumping_location(dest_object) + if(M.CanReach(A) && dump_destination && M.CanReach(dump_destination)) if(locked) var/atom/host = parent host.balloon_alert(M, "[host] is locked.") @@ -513,6 +513,12 @@ return TRUE return FALSE +/datum/component/storage/proc/get_dumping_location(atom/dest_object) + var/datum/component/storage/storage = dest_object.GetComponent(/datum/component/storage) + if(storage) + return storage.real_location() + return dest_object.get_dumping_location() + //This proc is called when you want to place an item into the storage item. /datum/component/storage/proc/attackby(datum/source, obj/item/I, mob/M, params) SIGNAL_HANDLER diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index d6457fc2fa0e9..a7dd43cb0e5e0 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -337,7 +337,7 @@ DELAY 20"} /datum/preset_holoimage/engineer - outfit_type = /datum/outfit/job/engineer/gloved/rig + outfit_type = /datum/outfit/job/engineer/mod /datum/preset_holoimage/researcher outfit_type = /datum/outfit/job/scientist diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 6020dd534297b..69f4aa4517f4d 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -140,6 +140,14 @@ //to be overridden for toggling internals, id binding, access etc return +#define EQUIP_OUTFIT_ITEM(item_path, slot_name) if(##item_path) { \ + H.equip_to_slot_or_del(new ##item_path, ##slot_name, TRUE); \ + var/obj/item/outfit_item = H.get_item_by_slot(##slot_name); \ + if (outfit_item && outfit_item.type == ##item_path) { \ + outfit_item.on_outfit_equip(H, visualsOnly, ##slot_name); \ + } \ +} + /** * Equips all defined types and paths to the mob passed in * @@ -229,6 +237,8 @@ H.update_body() return TRUE +#undef EQUIP_OUTFIT_ITEM + /** * Apply a fingerprint from the passed in human to all items in the outfit * diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm new file mode 100644 index 0000000000000..b5805557eafaf --- /dev/null +++ b/code/datums/wires/mod.dm @@ -0,0 +1,57 @@ +/datum/wires/mod + holder_type = /obj/item/mod/control + proper_name = "MOD control unit" + +/datum/wires/mod/New(atom/holder) + wires = list(WIRE_HACK, WIRE_DISABLE, WIRE_SHOCK, WIRE_INTERFACE) + add_duds(2) + ..() + +/datum/wires/mod/interactable(mob/user) + if(!..()) + return FALSE + var/obj/item/mod/control/mod = holder + return mod.open + +/datum/wires/mod/get_status() + var/obj/item/mod/control/mod = holder + var/list/status = list() + status += "The orange light is [mod.seconds_electrified ? "on" : "off"]." + status += "The red light is [mod.malfunctioning ? "off" : "blinking"]." + status += "The green light is [mod.locked ? "on" : "off"]." + status += "The yellow light is [mod.interface_break ? "off" : "on"]." + return status + +/datum/wires/mod/on_pulse(wire) + var/obj/item/mod/control/mod = holder + switch(wire) + if(WIRE_HACK) + mod.locked = !mod.locked + if(WIRE_DISABLE) + mod.malfunctioning = TRUE + if(WIRE_SHOCK) + mod.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME + if(WIRE_INTERFACE) + mod.interface_break = !mod.interface_break + +/datum/wires/mod/on_cut(wire, mend) + var/obj/item/mod/control/mod = holder + switch(wire) + if(WIRE_HACK) + if(!mend) + mod.req_access = list() + if(WIRE_DISABLE) + mod.malfunctioning = !mend + if(WIRE_SHOCK) + if(mend) + mod.seconds_electrified = MACHINE_NOT_ELECTRIFIED + else + mod.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT + if(WIRE_INTERFACE) + mod.interface_break = !mend + +/datum/wires/mod/ui_act(action, params) + var/obj/item/mod/control/mod = holder + if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr)) + return FALSE + return ..() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 0deec87f6c61d..e8bd76f5041a2 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1060,7 +1060,7 @@ return TRUE ///Get the best place to dump the items contained in the source storage item? -/atom/proc/get_dumping_location(obj/item/storage/source,mob/user) +/atom/proc/get_dumping_location() return null /** diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ef28dc34e9189..072a57c0b3341 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -679,6 +679,9 @@ //Mobs should return 1 if they should be able to move of their own volition, see client/Move() in mob_movement.dm //movement_dir == 0 when stopping or any dir when trying to move /atom/movable/proc/Process_Spacemove(movement_dir = 0) + if(SEND_SIGNAL(src, COMSIG_MOVABLE_SPACEMOVE, movement_dir) & COMSIG_MOVABLE_STOP_SPACEMOVE) + return TRUE + if(has_gravity(src)) return 1 diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index d637e46021bb4..1bfed5f485ee4 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -168,13 +168,12 @@ glasses = /obj/item/clothing/glasses/night mask = /obj/item/clothing/mask/gas/syndicate - suit = /obj/item/clothing/suit/space/hardsuit/syndi + back = /obj/item/mod/control/pre_equipped/nuclear r_pocket = /obj/item/tank/internals/emergency_oxygen/engi internals_slot = ITEM_SLOT_RPOCKET belt = /obj/item/storage/belt/military r_hand = /obj/item/gun/ballistic/shotgun/automatic/bulldog backpack_contents = list(/obj/item/storage/box/syndie=1,\ - /obj/item/tank/jetpack/oxygen/harness=1,\ /obj/item/gun/ballistic/automatic/pistol=1,\ /obj/item/knife/combat/survival) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index b303eb31cd972..b489b8fbc2afa 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -395,7 +395,7 @@ /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' -/obj/machinery/door/get_dumping_location(obj/item/storage/source,mob/user) +/obj/machinery/door/get_dumping_location() return null /obj/machinery/door/proc/lock() diff --git a/code/game/machinery/fabricators/exosuit_fab.dm b/code/game/machinery/fabricators/exosuit_fab.dm index c8d73c124aeee..a9ace9f5545c3 100644 --- a/code/game/machinery/fabricators/exosuit_fab.dm +++ b/code/game/machinery/fabricators/exosuit_fab.dm @@ -31,6 +31,8 @@ "Cybernetics", "Implants", "Control Interfaces", + "MOD Construction", + "MOD Modules", "Misc" ) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 7e9930432e63d..4f3759ecadb4e 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -1,6 +1,6 @@ /obj/machinery/recharge_station - name = "cyborg recharging station" - desc = "This device recharges cyborgs and resupplies their materials." + name = "recharging station" + desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users." icon = 'icons/obj/objects.dmi' icon_state = "borgcharger0" density = FALSE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index cb3b618366e5e..740a486d80001 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -15,6 +15,7 @@ var/obj/item/clothing/suit/space/suit = null var/obj/item/clothing/head/helmet/space/helmet = null var/obj/item/clothing/mask/mask = null + var/obj/item/mod/control/mod = null var/obj/item/storage = null // if you add more storage slots, update cook() to clear their radiation too. @@ -24,6 +25,8 @@ var/helmet_type = null /// What type of breathmask the unit starts with when spawned. var/mask_type = null + /// What type of MOD the unit starts with when spawned. + var/mod_type = null /// What type of additional item the unit starts with when spawned. var/storage_type = null @@ -69,19 +72,29 @@ storage_type = /obj/item/gps /obj/machinery/suit_storage_unit/captain - suit_type = /obj/item/clothing/suit/space/hardsuit/swat/captain mask_type = /obj/item/clothing/mask/gas/sechailer storage_type = /obj/item/tank/jetpack/oxygen/captain + mod_type = /obj/item/mod/control/pre_equipped/magnate + +/obj/machinery/suit_storage_unit/centcom + mask_type = /obj/item/clothing/mask/gas/atmos/centcom + storage_type = /obj/item/tank/jetpack/oxygen/captain + mod_type = /obj/item/mod/control/pre_equipped/corporate /obj/machinery/suit_storage_unit/engine - suit_type = /obj/item/clothing/suit/space/hardsuit/engine mask_type = /obj/item/clothing/mask/breath + mod_type = /obj/item/mod/control/pre_equipped/engineering storage_type = /obj/item/clothing/shoes/magboots +/obj/machinery/suit_storage_unit/atmos + mask_type = /obj/item/clothing/mask/gas + storage_type = /obj/item/watertank/atmos + mod_type = /obj/item/mod/control/pre_equipped/atmospheric + /obj/machinery/suit_storage_unit/ce - suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite mask_type = /obj/item/clothing/mask/breath storage_type = /obj/item/clothing/shoes/magboots/advance + mod_type = /obj/item/mod/control/pre_equipped/advanced /obj/machinery/suit_storage_unit/security suit_type = /obj/item/clothing/suit/space/hardsuit/security @@ -89,14 +102,9 @@ storage_type = /obj/item/gps/security /obj/machinery/suit_storage_unit/hos - suit_type = /obj/item/clothing/suit/space/hardsuit/security/head_of_security mask_type = /obj/item/clothing/mask/gas/sechailer - storage_type = /obj/item/gps/security - -/obj/machinery/suit_storage_unit/atmos - suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos - mask_type = /obj/item/clothing/mask/gas - storage_type = /obj/item/watertank/atmos + storage_type = /obj/item/tank/internals/oxygen + mod_type = /obj/item/mod/control/pre_equipped/safeguard /obj/machinery/suit_storage_unit/mining suit_type = /obj/item/clothing/suit/hooded/explorer @@ -113,40 +121,25 @@ mask_type = /obj/item/clothing/mask/breath storage_type = /obj/item/gps/mining/exploration +/obj/machinery/suit_storage_unit/medical + mask_type = /obj/item/clothing/mask/breath/medical + storage_type = /obj/item/tank/internals/oxygen + mod_type = /obj/item/mod/control/pre_equipped/medical + /obj/machinery/suit_storage_unit/cmo - suit_type = /obj/item/clothing/suit/space/hardsuit/medical/cmo - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/gps + mask_type = /obj/item/clothing/mask/breath/medical + storage_type = /obj/item/tank/internals/oxygen + mod_type = /obj/item/mod/control/pre_equipped/rescue /obj/machinery/suit_storage_unit/rd - suit_type = /obj/item/clothing/suit/space/hardsuit/research_director mask_type = /obj/item/clothing/mask/breath + mod_type = /obj/item/mod/control/pre_equipped/research storage_type = /obj/item/gps /obj/machinery/suit_storage_unit/syndicate - suit_type = /obj/item/clothing/suit/space/hardsuit/syndi mask_type = /obj/item/clothing/mask/gas/syndicate storage_type = /obj/item/tank/jetpack/oxygen/harness - -/obj/machinery/suit_storage_unit/ert/command - suit_type = /obj/item/clothing/suit/space/hardsuit/ert - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/tank/internals/emergency_oxygen/double - -/obj/machinery/suit_storage_unit/ert/security - suit_type = /obj/item/clothing/suit/space/hardsuit/ert/sec - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/tank/internals/emergency_oxygen/double - -/obj/machinery/suit_storage_unit/ert/engineer - suit_type = /obj/item/clothing/suit/space/hardsuit/ert/engi - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/tank/internals/emergency_oxygen/double - -/obj/machinery/suit_storage_unit/ert/medical - suit_type = /obj/item/clothing/suit/space/hardsuit/ert/med - mask_type = /obj/item/clothing/mask/breath - storage_type = /obj/item/tank/internals/emergency_oxygen/double + mod_type = /obj/item/mod/control/pre_equipped/nuclear /obj/machinery/suit_storage_unit/radsuit name = "radiation suit storage unit" @@ -174,6 +167,8 @@ helmet = new helmet_type(src) if(mask_type) mask = new mask_type(src) + if(mod_type) + mod = new mod_type(src) if(storage_type) storage = new storage_type(src) RefreshParts() @@ -204,7 +199,7 @@ return . += "open" - if(suit) + if(suit || mod) . += "suit" if(helmet) . += "helm" @@ -235,6 +230,7 @@ helmet = null suit = null mask = null + mod = null storage = null set_occupant(null) @@ -269,6 +265,7 @@ "suit" = create_silhouette_of(/obj/item/clothing/suit/space/eva), "helmet" = create_silhouette_of(/obj/item/clothing/head/helmet/space/eva), "mask" = create_silhouette_of(/obj/item/clothing/mask/breath), + "mod" = create_silhouette_of(/obj/item/mod), "storage" = create_silhouette_of(/obj/item/tank/internals/oxygen), ) @@ -429,6 +426,8 @@ helmet.take_damage(burn_damage * 10, BURN, FIRE) if(suit) suit.take_damage(burn_damage * 10, BURN, FIRE) + if(mod) + mod.take_damage(burn_damage * 10, BURN, FIRE) if(mask) mask.take_damage(burn_damage * 10, BURN, FIRE) if(storage) @@ -453,6 +452,9 @@ if(mask) things_to_clear += mask things_to_clear += mask.GetAllContents() + if(mod) + things_to_clear += mod + things_to_clear += mod.GetAllContents() if(storage) things_to_clear += storage things_to_clear += storage.GetAllContents() @@ -466,17 +468,24 @@ if(mob_occupant) dump_inventory_contents() -/obj/machinery/suit_storage_unit/process() - if(!suit) - return - if(!istype(suit, /obj/item/clothing/suit/space)) - return - if(!suit.cell) +/obj/machinery/suit_storage_unit/process(delta_time) + var/obj/item/stock_parts/cell/cell + if(suit) + if(!istype(suit)) + return + if(!suit.cell) + return + cell = suit.cell + else if(mod) + if(!istype(mod)) + return + if(!mod.cell) + return + cell = mod.cell + else return - - var/obj/item/stock_parts/cell/C = suit.cell - use_power(charge_rate) - C.give(charge_rate) + use_power(charge_rate * delta_time) + cell.give(charge_rate * delta_time) /obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) if(!prob(prb)) @@ -557,6 +566,13 @@ if(!user.transferItemToLoc(I, src)) return mask = I + else if(istype(I, /obj/item/mod/control)) + if(mod) + to_chat(user, "The unit already contains a MOD!") + return + if(!user.transferItemToLoc(I, src)) + return + mod = I else if(storage) to_chat(user, "The auxiliary storage compartment is full!") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 396a55212e290..239e1ed6aca4f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1398,6 +1398,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) if(SEND_SIGNAL(src, COMSIG_ITEM_OFFER_TAKEN, offerer, taker) & COMPONENT_OFFER_INTERRUPT) return TRUE +/// Special stuff you want to do when an outfit equips this item. +/obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + return + /** * * Overridden to generate icons for monkey clothing */ diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 64400f96130c8..f0eb9c059faf3 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -264,35 +264,45 @@ GLOBAL_VAR_INIT(icon_holographic_window, init_holographic_window()) return COOLDOWN_START(src, destructive_scan_cooldown, RCD_DESTRUCTIVE_SCAN_COOLDOWN) - - playsound(src, 'sound/items/rcdscan.ogg', 50, vary = TRUE, pressure_affected = FALSE) - - var/turf/source_turf = get_turf(src) - for (var/turf/open/surrounding_turf in RANGE_TURFS(RCD_DESTRUCTIVE_SCAN_RANGE, source_turf)) + rcd_scan(src) + +/** + * Global proc that generates RCD hologram in a range. + * + * Arguments: + * * source - The atom the scans originate from + * * scan_range - The range of turfs we grab from the source + * * fade_time - The time for RCD holograms to fade + */ +/proc/rcd_scan(atom/source, scan_range = RCD_DESTRUCTIVE_SCAN_RANGE, fade_time = RCD_HOLOGRAM_FADE_TIME) + playsound(source, 'sound/items/rcdscan.ogg', 50, vary = TRUE, pressure_affected = FALSE) + + var/turf/source_turf = get_turf(source) + for(var/turf/open/surrounding_turf in RANGE_TURFS(scan_range, source_turf)) var/rcd_memory = surrounding_turf.rcd_memory - if (!rcd_memory) + if(!rcd_memory) continue var/skip_to_next_turf = FALSE - for (var/atom/content_of_turf as anything in surrounding_turf.contents) + for(var/atom/content_of_turf as anything in surrounding_turf.contents) if (content_of_turf.density) skip_to_next_turf = TRUE break - if (skip_to_next_turf) + if(skip_to_next_turf) continue var/hologram_icon - switch (rcd_memory) - if (RCD_MEMORY_WALL) + switch(rcd_memory) + if(RCD_MEMORY_WALL) hologram_icon = GLOB.icon_holographic_wall - if (RCD_MEMORY_WINDOWGRILLE) + if(RCD_MEMORY_WINDOWGRILLE) hologram_icon = GLOB.icon_holographic_window - var/obj/effect/rcd_hologram/hologram = new (surrounding_turf) + var/obj/effect/rcd_hologram/hologram = new(surrounding_turf) hologram.icon = hologram_icon - animate(hologram, alpha = 0, time = RCD_HOLOGRAM_FADE_TIME, easing = CIRCULAR_EASING | EASE_IN) + animate(hologram, alpha = 0, time = fade_time, easing = CIRCULAR_EASING | EASE_IN) /obj/effect/rcd_hologram name = "hologram" diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index a743677e5141e..dfdfec2d0adcc 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -201,6 +201,18 @@ user.visible_message("[user] shows you: [icon2html(src, viewers(user))] [src.name].", "You show \the [src.name].") add_fingerprint(user) +/// Used in ID card access adding procs. Will try to add all accesses and utilises free wildcards, skipping over any accesses it can't add. +#define TRY_ADD_ALL 0 +/// Used in ID card access adding procs. Will try to add all accesses and does not utilise wildcards, skipping anything requiring a wildcard. +#define TRY_ADD_ALL_NO_WILDCARD 1 +/// Used in ID card access adding procs. Will forcefully add all accesses. +#define FORCE_ADD_ALL 2 +/// Used in ID card access adding procs. Will stack trace on fail. +#define ERROR_ON_FAIL 3 + +/obj/item/card/id/proc/set_access(list/new_access_list, mode = ERROR_ON_FAIL) + return + /obj/item/card/id/vv_edit_var(var_name, var_value) . = ..() if(.) diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 60d4a756d150b..c8d50fe29b23d 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -28,18 +28,20 @@ user.visible_message("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!") return BRUTELOSS -/obj/item/aicard/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || !target) - return +/obj/item/aicard/pre_attack(atom/target, mob/living/user, params) if(AI) //AI is on the card, implies user wants to upload it. - log_combat(user, AI, "uploaded", src, "to [target].", important = FALSE) + var/our_ai = AI target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) + if(!AI) + log_combat(user, our_ai, "uploaded", src, "to [target].", important = FALSE) + return TRUE else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) if(AI) log_combat(user, AI, "carded", src, important = FALSE) - update_icon() //Whatever happened, update the card's state (icon, name) to match. + return TRUE + update_appearance() //Whatever happened, update the card's state (icon, name) to match. + return ..() /obj/item/aicard/update_icon_state() if(!AI) diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index ad2ae95a1219a..d08dffbf06dfc 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -50,21 +50,16 @@ for(var/atom/movable/A as mob|obj in orange(5,pull)) if(A == wielder) continue - if(A && !A.anchored && !ishuman(A)) + if(isliving(A)) + var/mob/living/vortexed_mob = A + if(vortexed_mob.mob_negates_gravity()) + continue + else + vortexed_mob.Paralyze(2 SECONDS) + if(!A.anchored && !isobserver(A)) step_towards(A,pull) step_towards(A,pull) step_towards(A,pull) - else if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(istype(H.shoes, /obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = H.shoes - if(M.magpulse) - continue - H.apply_effect(20, EFFECT_PARALYZE, 0) - step_towards(H,pull) - step_towards(H,pull) - step_towards(H,pull) - return /obj/item/singularityhammer/afterattack(atom/A as mob|obj|turf|area, mob/user, proximity) . = ..() diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index 413f29af2861d..e74dc2958755d 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -466,11 +466,11 @@ new /obj/item/razor(src) new /obj/item/reagent_containers/medspray/sterilizine(src) new /obj/item/blood_filter(src) - + /obj/item/storage/backpack/duffelbag/med/implant name = "surplus implants duffel bag" desc = "A large duffel bag for holding implants - this one has a material inlay with space for various implants." - + /obj/item/storage/backpack/duffelbag/med/implant/PopulateContents() var/implants = list(/obj/item/organ/cyberimp/arm/janitor, /obj/item/organ/cyberimp/arm/botany, @@ -695,12 +695,12 @@ new /obj/item/grenade/plastic/x4(src) /obj/item/storage/backpack/duffelbag/syndie/firestarter - desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite hardsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment." + desc = "A large duffel bag containing a New Russian pyro backpack sprayer, Elite MODsuit, a Stechkin APS pistol, minibomb, ammo, and other equipment." /obj/item/storage/backpack/duffelbag/syndie/firestarter/PopulateContents() new /obj/item/clothing/under/syndicate/soviet(src) new /obj/item/watertank/op(src) - new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src) + new /obj/item/mod/control/pre_equipped/elite(src) new /obj/item/gun/ballistic/automatic/pistol/APS(src) new /obj/item/ammo_box/magazine/pistolm9mm(src) new /obj/item/ammo_box/magazine/pistolm9mm(src) diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 5be91934e8016..d43a0cc5a216c 100644 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -147,6 +147,23 @@ new /obj/item/multitool(src) new /obj/item/stack/cable_coil(src,MAXCOIL,pick("red","yellow","orange")) +/obj/item/storage/belt/utility/full/powertools/PopulateContents() + new /obj/item/powertool/hand_drill(src) + new /obj/item/powertool/jaws_of_life(src) + new /obj/item/weldingtool/experimental(src) + new /obj/item/multitool(src) + new /obj/item/holosign_creator/atmos(src) + new /obj/item/extinguisher/mini(src) + new /obj/item/stack/cable_coil(src) + +/obj/item/storage/belt/utility/full/powertools/rcd/PopulateContents() + new /obj/item/powertool/hand_drill(src) + new /obj/item/powertool/jaws_of_life(src) + new /obj/item/weldingtool/experimental(src) + new /obj/item/multitool(src) + new /obj/item/construction/rcd/loaded(src) + new /obj/item/extinguisher/mini(src) + new /obj/item/stack/cable_coil(src) /obj/item/storage/belt/utility/atmostech/PopulateContents() new /obj/item/screwdriver(src) diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index cf574c3db3b5d..5d158a84bea16 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1325,3 +1325,34 @@ new /obj/item/encryptionkey/heads/ce/fake(src) new /obj/item/encryptionkey/heads/cmo/fake(src) new /obj/item/encryptionkey/heads/hop/fake(src) + +/obj/item/storage/box/stabilized //every single stabilized extract from xenobiology + name = "box of stabilized extracts" + icon_state = "syndiebox" + +/obj/item/storage/box/stabilized/PopulateContents() + var/static/items_inside = list( + /obj/item/slimecross/stabilized/grey=1,\ + /obj/item/slimecross/stabilized/orange=1,\ + /obj/item/slimecross/stabilized/purple=1,\ + /obj/item/slimecross/stabilized/blue=1,\ + /obj/item/slimecross/stabilized/metal=1,\ + /obj/item/slimecross/stabilized/yellow=1,\ + /obj/item/slimecross/stabilized/darkpurple=1,\ + /obj/item/slimecross/stabilized/darkblue=1,\ + /obj/item/slimecross/stabilized/silver=1,\ + /obj/item/slimecross/stabilized/bluespace=1,\ + /obj/item/slimecross/stabilized/sepia=1,\ + /obj/item/slimecross/stabilized/cerulean=1,\ + /obj/item/slimecross/stabilized/pyrite=1,\ + /obj/item/slimecross/stabilized/red=1,\ + /obj/item/slimecross/stabilized/green=1,\ + /obj/item/slimecross/stabilized/pink=1,\ + /obj/item/slimecross/stabilized/gold=1,\ + /obj/item/slimecross/stabilized/oil=1,\ + /obj/item/slimecross/stabilized/black=1,\ + /obj/item/slimecross/stabilized/lightpink=1,\ + /obj/item/slimecross/stabilized/adamantine=1,\ + /obj/item/slimecross/stabilized/rainbow=1,\ + ) + generate_items_inside(items_inside,src) diff --git a/code/game/objects/items/storage/storage.dm b/code/game/objects/items/storage/storage.dm index 7d3cdb082bf3f..1e6f0e73ebcc8 100644 --- a/code/game/objects/items/storage/storage.dm +++ b/code/game/objects/items/storage/storage.dm @@ -6,9 +6,6 @@ var/component_type = /datum/component/storage/concrete var/empty = FALSE -/obj/item/storage/get_dumping_location(obj/item/storage/source,mob/user) - return src - /obj/item/storage/Initialize(mapload) . = ..() if(!empty) diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index feb0e77a45678..5dc81f791e1ed 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -117,7 +117,7 @@ new /obj/item/clothing/under/suit/black_really(src) if("metaops") - new /obj/item/clothing/suit/space/hardsuit/syndi(src) // 8 tc + new /obj/item/mod/control/pre_equipped/nuclear(src) // 8 tc new /obj/item/gun/ballistic/shotgun/automatic/bulldog/unrestricted(src) // 8 tc new /obj/item/implanter/explosive(src) // 2 tc new /obj/item/ammo_box/magazine/m12g(src) // 2 tc diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 072351d11c440..9b573388f20e0 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -27,6 +27,20 @@ QDEL_NULL(ion_trail) return ..() +/obj/item/tank/jetpack/item_action_slot_check(slot) + if(slot == ITEM_SLOT_BACK) + return TRUE + +/obj/item/tank/jetpack/equipped(mob/user, slot, initial) + . = ..() + if(on && slot != ITEM_SLOT_BACK) + turn_off(user) + +/obj/item/tank/jetpack/dropped(mob/user, silent) + . = ..() + if(on) + turn_off(user) + /obj/item/tank/jetpack/populate_gas() if(gas_type) air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))) @@ -78,6 +92,7 @@ /obj/item/tank/jetpack/proc/on_user_add() RegisterSignal(known_user, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) RegisterSignal(known_user, COMSIG_PARENT_QDELETING, PROC_REF(lose_known_user)) + RegisterSignal(known_user, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) /// Resets our current user, preventing them from using the jetpack. /obj/item/tank/jetpack/proc/lose_known_user() @@ -90,6 +105,7 @@ known_user.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) UnregisterSignal(known_user, COMSIG_MOVABLE_MOVED) UnregisterSignal(known_user, COMSIG_PARENT_QDELETING) + UnregisterSignal(known_user, COMSIG_MOVABLE_SPACEMOVE) /obj/item/tank/jetpack/proc/turn_on(mob/user) if(!known_user) @@ -114,10 +130,27 @@ /obj/item/tank/jetpack/proc/move_react(mob/user) SIGNAL_HANDLER - if(on) - allow_thrust(THRUST_REQUIREMENT_SPACEMOVE, user) - // Update speed according to pressure - JETPACK_SPEED_CHECK(known_user, MOVESPEED_ID_JETPACK, -1, full_speed) + if(!on)//If jet dont work, it dont work + return + if(!user || !user.client)//Don't allow jet self using + return + if(!isturf(user.loc))//You can't use jet in nowhere or from mecha/closet + return + if(!(user.movement_type & FLOATING) || user.buckled)//You don't want use jet in gravity or while buckled. + return + if(user.pulledby)//You don't must use jet if someone pull you + return + if(user.throwing)//You don't must use jet if you thrown + return + allow_thrust(THRUST_REQUIREMENT_SPACEMOVE, user) + // Update speed according to pressure + JETPACK_SPEED_CHECK(known_user, MOVESPEED_ID_JETPACK, -1, full_speed) + +/obj/item/tank/jetpack/proc/spacemove_react(mob/user, movement_dir) + SIGNAL_HANDLER + + if(on && (movement_dir || stabilizers)) + return COMSIG_MOVABLE_STOP_SPACEMOVE /obj/item/tank/jetpack/proc/allow_thrust(num, mob/living/user, use_fuel = TRUE) if(!on || !known_user) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index b2613c87ab729..dc8e58434039b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -254,7 +254,7 @@ if(!anchored || current_size >= STAGE_FIVE) step_towards(src,S) -/obj/get_dumping_location(datum/component/storage/source,mob/user) +/obj/get_dumping_location() return get_turf(src) /** diff --git a/code/game/objects/structures/crates_lockers/closets/gimmick.dm b/code/game/objects/structures/crates_lockers/closets/gimmick.dm index 958bd22ca5be4..92c4322238dbe 100644 --- a/code/game/objects/structures/crates_lockers/closets/gimmick.dm +++ b/code/game/objects/structures/crates_lockers/closets/gimmick.dm @@ -44,8 +44,8 @@ new /obj/item/clothing/mask/gas/sechailer/swat(src) new /obj/item/clothing/shoes/combat/swat(src) new /obj/item/clothing/shoes/combat/swat(src) - new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) - new /obj/item/clothing/suit/space/hardsuit/deathsquad(src) + new /obj/item/mod/control/pre_equipped/apocryphal(src) + new /obj/item/mod/control/pre_equipped/apocryphal(src) new /obj/item/clothing/under/syndicate/tacticool(src) new /obj/item/clothing/under/syndicate/tacticool(src) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 04daa96aa50bf..f570198149bc4 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -14,7 +14,6 @@ new /obj/item/clothing/suit/hazardvest(src) new /obj/item/clothing/gloves/color/yellow(src) new /obj/item/clothing/mask/gas(src) - new /obj/item/tank/jetpack/suit(src) new /obj/item/radio/headset/heads/chief_engineer(src) new /obj/item/clothing/neck/petcollar(src) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index deaa9387817f0..500797156a337 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -129,7 +129,7 @@ new mineral(loc) qdel(src) -/obj/structure/falsewall/get_dumping_location(obj/item/storage/source,mob/user) +/obj/structure/falsewall/get_dumping_location() return null /obj/structure/falsewall/examine_status(mob/user) //So you can't detect falsewalls by examine. diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 753abd9bc564d..8a813a7f35fec 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -346,7 +346,7 @@ C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() -/obj/structure/grille/get_dumping_location(datum/component/storage/source,mob/user) +/obj/structure/grille/get_dumping_location() return null /obj/structure/grille/broken // Pre-broken grilles for map placement diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index d4e0708538617..ce34f45e75fe6 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -367,7 +367,7 @@ take_damage(round(exposed_volume / 100), BURN, 0, 0) ..() -/obj/structure/window/get_dumping_location(obj/item/storage/source,mob/user) +/obj/structure/window/get_dumping_location() return null /obj/structure/window/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index 15e769167b12b..f437601f913cb 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -196,7 +196,7 @@ if(.) ChangeTurf(/turf/closed/wall/clockwork) -/turf/closed/wall/get_dumping_location(obj/item/storage/source, mob/user) +/turf/closed/wall/get_dumping_location() return null /turf/closed/wall/acid_act(acidpwr, acid_volume) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 39da9eafa0d9c..59343421a228b 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -473,7 +473,7 @@ flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 - blocks_shove_knockdown = TRUE + clothing_flags = BLOCKS_SHOVE_KNOCKDOWN slowdown = 0.2 /obj/item/clothing/suit/armor/changeling/Initialize(mapload) diff --git a/code/modules/antagonists/ert/ert.dm b/code/modules/antagonists/ert/ert.dm index 4312278babd66..6c8ac1c8bf99a 100644 --- a/code/modules/antagonists/ert/ert.dm +++ b/code/modules/antagonists/ert/ert.dm @@ -12,7 +12,7 @@ name = "Emergency Response Officer" var/datum/team/ert/ert_team var/leader = FALSE - var/datum/outfit/outfit = /datum/outfit/ert/security + var/datum/outfit/outfit = /datum/outfit/centcom/ert/security var/datum/outfit/plasmaman_outfit = /datum/outfit/plasmaman/ert var/role = JOB_NAME_SECURITYOFFICER var/list/name_source @@ -58,28 +58,28 @@ /datum/antagonist/ert/security // kinda handled by the base template but here for completion /datum/antagonist/ert/security/red - outfit = /datum/outfit/ert/security/alert + outfit = /datum/outfit/centcom/ert/security/alert /datum/antagonist/ert/engineer role = "Engineer" - outfit = /datum/outfit/ert/engineer + outfit = /datum/outfit/centcom/ert/engineer /datum/antagonist/ert/engineer/red - outfit = /datum/outfit/ert/engineer/alert + outfit = /datum/outfit/centcom/ert/engineer/alert /datum/antagonist/ert/medic role = JOB_CENTCOM_MEDICAL_DOCTOR - outfit = /datum/outfit/ert/medic + outfit = /datum/outfit/centcom/ert/medic /datum/antagonist/ert/medic/red - outfit = /datum/outfit/ert/medic/alert + outfit = /datum/outfit/centcom/ert/medic/alert /datum/antagonist/ert/commander role = "Commander" - outfit = /datum/outfit/ert/commander + outfit = /datum/outfit/centcom/ert/commander /datum/antagonist/ert/commander/red - outfit = /datum/outfit/ert/commander/alert + outfit = /datum/outfit/centcom/ert/commander/alert /datum/antagonist/ert/deathsquad name = "Deathsquad Trooper" @@ -88,14 +88,14 @@ plasmaman_outfit = /datum/outfit/plasmaman/death_commando /datum/antagonist/ert/medic/inquisitor - outfit = /datum/outfit/ert/medic/inquisitor + outfit = /datum/outfit/centcom/ert/medic/inquisitor /datum/antagonist/ert/medic/inquisitor/on_gain() . = ..() owner.holy_role = HOLY_ROLE_PRIEST /datum/antagonist/ert/security/inquisitor - outfit = /datum/outfit/ert/security/inquisitor + outfit = /datum/outfit/centcom/ert/security/inquisitor /datum/antagonist/ert/security/inquisitor/on_gain() . = ..() @@ -103,17 +103,17 @@ /datum/antagonist/ert/chaplain role = JOB_NAME_CHAPLAIN - outfit = /datum/outfit/ert/chaplain + outfit = /datum/outfit/centcom/ert/chaplain /datum/antagonist/ert/chaplain/inquisitor - outfit = /datum/outfit/ert/chaplain/inquisitor + outfit = /datum/outfit/centcom/ert/chaplain/inquisitor /datum/antagonist/ert/chaplain/on_gain() . = ..() owner.holy_role = HOLY_ROLE_PRIEST /datum/antagonist/ert/commander/inquisitor - outfit = /datum/outfit/ert/commander/inquisitor + outfit = /datum/outfit/centcom/ert/commander/inquisitor /datum/antagonist/ert/commander/inquisitor/on_gain() . = ..() @@ -121,15 +121,15 @@ /datum/antagonist/ert/janitor role = JOB_NAME_JANITOR - outfit = /datum/outfit/ert/janitor + outfit = /datum/outfit/centcom/ert/janitor /datum/antagonist/ert/janitor/heavy role = "Heavy Duty Janitor" - outfit = /datum/outfit/ert/janitor/heavy + outfit = /datum/outfit/centcom/ert/janitor/heavy /datum/antagonist/ert/kudzu role = "Weed Whacker" - outfit = /datum/outfit/ert/kudzu + outfit = /datum/outfit/centcom/ert/kudzu /datum/antagonist/ert/deathsquad/leader name = "Deathsquad Officer" diff --git a/code/modules/antagonists/role_preference/role_antagonists.dm b/code/modules/antagonists/role_preference/role_antagonists.dm index 07f1b18a58bc0..0135cad353e31 100644 --- a/code/modules/antagonists/role_preference/role_antagonists.dm +++ b/code/modules/antagonists/role_preference/role_antagonists.dm @@ -368,8 +368,27 @@ /datum/outfit/nuclear_operative name = "Nuclear Operative (Preview only)" - suit = /obj/item/clothing/suit/space/hardsuit/syndipreview - head = /obj/item/clothing/head/helmet/space/hardsuit/syndi + back = /obj/item/mod/control/pre_equipped/syndicate_empty + +/datum/outfit/nuclear_operative/post_equip(mob/living/carbon/human/H, visualsOnly) + var/obj/item/mod/module/armor_booster/booster = locate() in H.back + booster.active = TRUE + H.update_inv_back() + +/datum/outfit/nuclear_operative_elite + name = "Nuclear Operative (Elite, Preview only)" + + back = /obj/item/mod/control/pre_equipped/syndicate_empty/elite + l_hand = /obj/item/modular_computer/tablet/nukeops + r_hand = /obj/item/shield/energy + +/datum/outfit/nuclear_operative_elite/post_equip(mob/living/carbon/human/H, visualsOnly) + var/obj/item/mod/module/armor_booster/elite/booster = locate() in H.back + booster.active = TRUE + H.update_inv_back() + var/obj/item/shield/energy/shield = locate() in H.held_items + shield.icon_state = "[shield.base_icon_state]1" + H.update_inv_hands() /datum/role_preference/antagonist/wizard name = "Wizard" diff --git a/code/modules/antagonists/wizard/equipment/spellbook.dm b/code/modules/antagonists/wizard/equipment/spellbook.dm index 8b4cf484bf103..69725e3e1633c 100644 --- a/code/modules/antagonists/wizard/equipment/spellbook.dm +++ b/code/modules/antagonists/wizard/equipment/spellbook.dm @@ -283,13 +283,13 @@ name = "Buy Item" refundable = FALSE buy_word = "Summon" - var/item_path= null + var/item_path = null /datum/spellbook_entry/item/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) - new item_path(get_turf(user)) + var/atom/spawned_path = new item_path(get_turf(user)) SSblackbox.record_feedback("tally", "wizard_spell_learned", 1, name) - return TRUE + return spawned_path /datum/spellbook_entry/item/GetInfo() var/dat ="" @@ -373,17 +373,34 @@ /datum/spellbook_entry/item/armor name = "Mastercrafted Armor Set" - desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space." - item_path = /obj/item/clothing/suit/space/hardsuit/wizard + desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space, also grants a battlemage shield." + item_path = /obj/item/mod/control/pre_equipped/enchanted category = "Defensive" -/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user,obj/item/spellbook/book) +/datum/spellbook_entry/item/armor/Buy(mob/living/carbon/human/user, obj/item/spellbook/book) . = ..() - if(.) - new /obj/item/clothing/shoes/sandal/magic(get_turf(user)) //In case they've lost them. - new /obj/item/clothing/gloves/color/purple(get_turf(user))//To complete the outfit - new /obj/item/clothing/mask/breath(get_turf(user)) // so the air gets to your mouth. Just an average mask. - new /obj/item/tank/internals/emergency_oxygen/magic_oxygen(get_turf(user)) // so you have something to actually breathe. Near infinite. + if(!.) + return + var/obj/item/mod/control/mod = . + var/obj/item/mod/module/storage/storage = locate() in mod.modules + var/obj/item/back = user.back + if(back) + if(!user.dropItemToGround(back)) + return + for(var/obj/item/item as anything in back.contents) + item.forceMove(storage) + if(!user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + if(!user.dropItemToGround(user.wear_suit) || !user.dropItemToGround(user.head)) + return + mod.quick_activation() + +/datum/spellbook_entry/item/battlemage_charge + name = "Battlemage Armour Charges" + desc = "A powerful defensive rune, it will grant eight additional charges to a battlemage shield." + item_path = /obj/item/wizard_armour_charge + category = "Defensive" + cost = 1 /datum/spellbook_entry/item/contract name = "Contract of Apprenticeship" @@ -431,20 +448,6 @@ desc = "A hammer that creates an intensely powerful field of gravity where it strikes, pulling everything nearby to the point of impact." item_path = /obj/item/singularityhammer -/datum/spellbook_entry/item/battlemage - name = "Battlemage Armour" - desc = "An ensorceled suit of armour, protected by a powerful shield. The shield can completely negate sixteen attacks before being permanently depleted." - item_path = /obj/item/clothing/suit/space/hardsuit/shielded/wizard - limit = 1 - category = "Defensive" - -/datum/spellbook_entry/item/battlemage_charge - name = "Battlemage Armour Charges" - desc = "A powerful defensive rune, it will grant eight additional charges to a suit of battlemage armour." - item_path = /obj/item/wizard_armour_charge - category = "Defensive" - cost = 1 - /datum/spellbook_entry/item/warpwhistle name = "Warp Whistle" desc = "A strange whistle that will transport you to a distant safe place on the station. There is a window of vulnerability at the beginning of every use." diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index f484ea71a372d..4bcfd72508646 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -226,8 +226,7 @@ return if(ishuman(user)) //other carbons like monkeys can unwrench but cant wear magboots if(istype(user.shoes, /obj/item/clothing/shoes/magboots)) - var/obj/item/clothing/shoes/magboots/M = user.shoes - if(M.negates_gravity()) + if(user.has_gravity()) return if(!pressures) var/datum/gas_mixture/int_air = return_air() diff --git a/code/modules/awaymissions/capture_the_flag.dm b/code/modules/awaymissions/capture_the_flag.dm index 556863d9f45a8..00004b573f0f1 100644 --- a/code/modules/awaymissions/capture_the_flag.dm +++ b/code/modules/awaymissions/capture_the_flag.dm @@ -569,7 +569,6 @@ ears = /obj/item/radio/headset uniform = /obj/item/clothing/under/syndicate suit = /obj/item/clothing/suit/armor/vest/ctf - toggle_helmet = FALSE // see the whites of their eyes shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat id = /obj/item/card/id/syndicate diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 307a09807e2dc..bbb73448cef10 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -349,8 +349,8 @@ name = "Engineer" outfit = /datum/outfit/job/engineer/gloved -/obj/effect/mob_spawn/human/engineer/rig - outfit = /datum/outfit/job/engineer/gloved/rig +/obj/effect/mob_spawn/human/engineer/mod + outfit = /datum/outfit/job/engineer/mod /obj/effect/mob_spawn/human/clown name = JOB_NAME_CLOWN @@ -364,8 +364,8 @@ name = JOB_NAME_SHAFTMINER outfit = /datum/outfit/job/miner -/obj/effect/mob_spawn/human/miner/rig - outfit = /datum/outfit/job/miner/equipped/hardsuit +/obj/effect/mob_spawn/human/miner/mod + outfit = /datum/outfit/job/engineer/mod /obj/effect/mob_spawn/human/miner/explorer outfit = /datum/outfit/job/miner/equipped diff --git a/code/modules/awaymissions/mission_code/TheFactory.dm b/code/modules/awaymissions/mission_code/TheFactory.dm index 8b8818a34ce4e..120fac884ac29 100644 --- a/code/modules/awaymissions/mission_code/TheFactory.dm +++ b/code/modules/awaymissions/mission_code/TheFactory.dm @@ -203,13 +203,13 @@ desc = "Strangely ancient technology used to help provide rudimentary eye cover. Also shows information about criminals and their condition. Has enhanced shielding which blocks flashes." icon_state = "t80sunglasses" darkness_view = 1 - clothing_flags = SCAN_REAGENTS vision_flags = SEE_MOBS flash_protect = 1 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE hud_type = list(DATA_HUD_SECURITY_ADVANCED, DATA_HUD_DIAGNOSTIC_BASIC, DATA_HUD_MEDICAL_ADVANCED) hud_trait = list(TRAIT_SECURITY_HUD, TRAIT_MEDICAL_HUD) + clothing_traits = list(TRAIT_REAGENT_SCANNER) //MOBS// diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index 1fdd34360450f..780f81ef91948 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -1066,6 +1066,10 @@ crate_name = "space shelter crate" crate_type = /obj/structure/closet/crate/engineering/electrical +/obj/item/stock_parts/cell/crystal_cell/wizard + desc = "A very high power cell made from crystallized magic." + chargerate = 5000 + /obj/item/stock_parts/cell/inducer_supply maxcharge = 5000 charge = 5000 @@ -2052,6 +2056,18 @@ crate_name = "xenobiology starter crate" crate_type = /obj/structure/closet/crate/secure/science +/datum/supply_pack/science/mod_core + name = "MOD core Crate" + desc = "Three cores, perfect for any MODsuit construction! Naturally harvestedâ„¢, of course." + cost = CARGO_CRATE_VALUE * 3 + access = ACCESS_ROBOTICS + access_budget = ACCESS_ROBOTICS + contains = list(/obj/item/mod/construction/core, + /obj/item/mod/construction/core, + /obj/item/mod/construction/core) + crate_name = "MOD core crate" + crate_type = /obj/structure/closet/crate/secure/science + ////////////////////////////////////////////////////////////////////////////// /////////////////////////////// Service ////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// diff --git a/code/modules/client/preferences/entries/player/mod_select.dm b/code/modules/client/preferences/entries/player/mod_select.dm new file mode 100644 index 0000000000000..cb9f532ea3a44 --- /dev/null +++ b/code/modules/client/preferences/entries/player/mod_select.dm @@ -0,0 +1,23 @@ +/// Switches between mouse buttons for MODsuit active modules +/datum/preference/choiced/mod_select + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + //savefile_key = "mod_select" + //savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/choiced/mod_select/init_possible_values() + return list(MIDDLE_CLICK, ALT_CLICK) + +/datum/preference/choiced/mod_select/create_default_value() + return MIDDLE_CLICK + +/datum/preference/choiced/mod_select/apply_to_client_updated(client/client, value) + if(!ishuman(client.mob)) + return + var/mob/living/carbon/human/client_owner = client.mob + if(!istype(client_owner.back, /obj/item/mod/control)) + return + var/obj/item/mod/control/mod = client_owner.back + if(!mod.selected_module) + return + UnregisterSignal(mod.wearer, mod.selected_module.used_signal) + mod.selected_module.update_signal(value) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 723509ef40772..97076f8572a19 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -27,8 +27,6 @@ var/cooldown = 0 var/envirosealed = FALSE //is it safe for plasmamen - var/blocks_shove_knockdown = FALSE //Whether wearing the clothing item blocks the ability for shove to knock down. - var/clothing_flags = NONE /// What items can be consumed to repair this clothing (must by an /obj/item/stack) @@ -42,6 +40,9 @@ /// Trait modification, lazylist of traits to add/take away, on equipment/drop in the correct slot + /// Trait modification, lazylist of traits to add/take away, on equipment/drop in the correct slot + var/list/clothing_traits + var/pocket_storage_component_path //These allow head/mask items to dynamically alter the user's hair @@ -254,6 +255,8 @@ if(!istype(user)) return UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + for(var/trait in clothing_traits) + REMOVE_TRAIT(user, trait, "[CLOTHING_TRAIT] [REF(src)]") if(LAZYLEN(user_vars_remembered)) for(var/variable in user_vars_remembered) @@ -269,8 +272,9 @@ if(slot_flags & slot) //Was equipped to a valid slot for this item? if(iscarbon(user) && LAZYLEN(zones_disabled)) RegisterSignal(user, COMSIG_MOVABLE_MOVED, PROC_REF(bristle)) - - if(LAZYLEN(user_vars_to_edit)) + for(var/trait in clothing_traits) + ADD_TRAIT(user, trait, "[CLOTHING_TRAIT] [REF(src)]") + if (LAZYLEN(user_vars_to_edit)) for(var/variable in user_vars_to_edit) if(variable in user.vars) LAZYSET(user_vars_remembered, variable, user.vars[variable]) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 7eb20bdca3c0c..10b202dbf79ff 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -140,11 +140,11 @@ icon_state = "purple" item_state = "glasses" emissive_state = "meson_emissive" - clothing_flags = SCAN_REAGENTS actions_types = list(/datum/action/item_action/toggle_research_scanner) glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) + clothing_traits = list(TRAIT_REAGENT_SCANNER) /obj/item/clothing/glasses/science/item_action_slot_check(slot) if(slot == ITEM_SLOT_EYES) @@ -283,7 +283,7 @@ /obj/item/clothing/glasses/sunglasses/advanced/reagent name = "beer goggles" desc = "A pair of sunglasses outfitted with apparatus to scan reagents, as well as providing an innate understanding of liquid viscosity while in motion. Has enhanced shielding which blocks flashes." - clothing_flags = SCAN_REAGENTS | SCAN_BOOZEPOWER + clothing_traits = list(TRAIT_BOOZE_SLIDER, TRAIT_REAGENT_SCANNER) /obj/item/clothing/glasses/sunglasses/advanced/reagent/equipped(mob/user, slot) . = ..() @@ -539,7 +539,7 @@ item_state = "godeye" vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS darkness_view = 8 - clothing_flags = SCAN_REAGENTS | SCAN_BOOZEPOWER + clothing_traits = list(TRAIT_BOOZE_SLIDER, TRAIT_REAGENT_SCANNER) lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF vision_correction = 1 // why should the eye of a god have bad vision? diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index b3beba00edd23..211113c3f5fe8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -379,7 +379,7 @@ darkness_view = 8 flash_protect = 2 vision_correction = 1 - clothing_flags = SCAN_REAGENTS | SCAN_BOOZEPOWER + clothing_traits = list(TRAIT_BOOZE_SLIDER, TRAIT_REAGENT_SCANNER) lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE hud_type = list(DATA_HUD_MEDICAL_ADVANCED, DATA_HUD_DIAGNOSTIC_ADVANCED, DATA_HUD_SECURITY_ADVANCED) resistance_flags = INDESTRUCTIBLE diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 7b6e4a9108017..23f98b9417c2b 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -211,6 +211,10 @@ if(ishuman(loc)) REMOVE_TRAIT(loc, carrytrait, CLOTHING_TRAIT) +#define NITRILE_GLOVES_MULTIPLIER 0.5 +///multiplies the time of do_mob by NITRILE_GLOVES_MULTIPLIER if the user has the TRAIT_FASTMED +#define CHEM_INTERACT_DELAY(delay, user) HAS_TRAIT(user, TRAIT_FASTMED) ? (delay * NITRILE_GLOVES_MULTIPLIER) : delay + /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" desc = "Pricy sterile gloves that are stronger than latex. Transfers intimate paramedic knowledge into the user via nanochips." diff --git a/code/modules/clothing/outfits/ert.dm b/code/modules/clothing/outfits/ert.dm index bcf67ded1cdc1..171a8c952f071 100644 --- a/code/modules/clothing/outfits/ert.dm +++ b/code/modules/clothing/outfits/ert.dm @@ -1,4 +1,11 @@ -/datum/outfit/ert +/datum/outfit/centcom/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + if(visualsOnly) + return + + var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H)//hmm lets have centcom officials become revs + L.implant(H, null, 1) + +/datum/outfit/centcom/ert name = "ERT Common" uniform = /obj/item/clothing/under/rank/centcom/official @@ -7,13 +14,10 @@ gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset/headset_cent/alt -/datum/outfit/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) return - var/obj/item/implant/mindshield/L = new/obj/item/implant/mindshield(H) - L.implant(H, null, 1) - var/obj/item/radio/R = H.ears R.set_frequency(FREQ_CENTCOM) R.freqlock = TRUE @@ -24,22 +28,24 @@ W.update_label() ..() -/datum/outfit/ert/commander +/datum/outfit/centcom/ert/commander name = "ERT Commander" id = /obj/item/card/id/ert - suit = /obj/item/clothing/suit/space/hardsuit/ert - suit_store = /obj/item/gun/energy/e_gun - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - back = /obj/item/storage/backpack/ert - belt = /obj/item/storage/belt/security/full - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/commander + l_hand = /obj/item/gun/energy/e_gun + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/melee/baton/loaded=1, - /obj/item/aiModule/core/full/ert=1) + /obj/item/aiModule/core/full/ert=1 + ) + belt = /obj/item/storage/belt/security/full + glasses = /obj/item/clothing/glasses/hud/security/sunglasses l_pocket = /obj/item/switchblade r_pocket = /obj/item/door_remote/omni -/datum/outfit/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/commander/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -48,7 +54,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/captain R.recalculateChannels() -/datum/outfit/ert/commander/alert +/datum/outfit/centcom/ert/commander/alert name = "ERT Commander - High Alert" glasses = /obj/item/clothing/glasses/thermal/eyepatch @@ -58,20 +64,22 @@ /obj/item/gun/energy/pulse/pistol/loyalpin=1) l_pocket = /obj/item/melee/transforming/energy/sword/saber -/datum/outfit/ert/security +/datum/outfit/centcom/ert/security name = "ERT Security" id = /obj/item/card/id/ert/Security - suit = /obj/item/clothing/suit/space/hardsuit/ert/sec - suit_store = /obj/item/gun/energy/e_gun/stun - glasses = /obj/item/clothing/glasses/hud/security/sunglasses - back = /obj/item/storage/backpack/ert/security - belt = /obj/item/storage/belt/security/full - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/security + l_hand = /obj/item/gun/energy/e_gun/stun + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/storage/box/handcuffs=1, - /obj/item/melee/baton/loaded=1) + /obj/item/melee/baton/loaded=1 + ) + belt = /obj/item/storage/belt/security/full + glasses = /obj/item/clothing/glasses/hud/security/sunglasses -/datum/outfit/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/security/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -81,31 +89,36 @@ R.keyslot = new /obj/item/encryptionkey/heads/hos R.recalculateChannels() -/datum/outfit/ert/security/alert +/datum/outfit/centcom/ert/security/alert name = "ERT Security - High Alert" + l_hand = /obj/item/gun/energy/pulse/carbine/loyalpin mask = /obj/item/clothing/mask/gas/sechailer/swat - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/storage/box/handcuffs=1, /obj/item/melee/baton/loaded=1, - /obj/item/gun/energy/pulse/carbine/loyalpin=1) + ) -/datum/outfit/ert/medic +/datum/outfit/centcom/ert/medic name = "ERT Medic" id = /obj/item/card/id/ert/Medical - suit = /obj/item/clothing/suit/space/hardsuit/ert/med - suit_store = /obj/item/gun/energy/e_gun - glasses = /obj/item/clothing/glasses/hud/health - back = /obj/item/storage/backpack/ert/medical + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/medic + backpack_contents = list( + /obj/item/gun/medbeam = 1, + /obj/item/storage/box/survival/engineer=1, + /obj/item/reagent_containers/hypospray/combat=1, + /obj/item/melee/baton/loaded=1 + ) belt = /obj/item/storage/belt/medical/ert + glasses = /obj/item/clothing/glasses/hud/health l_hand = /obj/item/storage/firstaid/compact - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, - /obj/item/reagent_containers/hypospray/combat=1, - /obj/item/melee/baton/loaded=1) + r_hand = /obj/item/gun/energy/e_gun -/datum/outfit/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/medic/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -115,7 +128,7 @@ R.keyslot = new /obj/item/encryptionkey/heads/cmo R.recalculateChannels() -/datum/outfit/ert/medic/alert +/datum/outfit/centcom/ert/medic/alert name = "ERT Medic - High Alert" mask = /obj/item/clothing/mask/gas/sechailer/swat @@ -125,23 +138,25 @@ /obj/item/gun/energy/pulse/pistol/loyalpin=1, /obj/item/reagent_containers/hypospray/combat/nanites=1) -/datum/outfit/ert/engineer +/datum/outfit/centcom/ert/engineer name = "ERT Engineer" id = /obj/item/card/id/ert/Engineer - suit = /obj/item/clothing/suit/space/hardsuit/ert/engi - suit_store = /obj/item/gun/energy/e_gun + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/engineer + l_hand = /obj/item/gun/energy/e_gun + r_hand = /obj/item/storage/firstaid/compact + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, + /obj/item/melee/baton/loaded=1, + /obj/item/construction/rcd/loaded = 1, + /obj/item/bluespace_anchor=1 + ) + belt = /obj/item/storage/belt/utility/full/powertools glasses = /obj/item/clothing/glasses/meson/engine - back = /obj/item/storage/backpack/ert/engineer - belt = /obj/item/storage/belt/utility/full l_pocket = /obj/item/rcd_ammo/large - l_hand = /obj/item/storage/firstaid/compact - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, - /obj/item/melee/baton/loaded=1, - /obj/item/construction/rcd/loaded=1, - /obj/item/bluespace_anchor=1) -/datum/outfit/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/engineer/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -151,33 +166,38 @@ R.keyslot = new /obj/item/encryptionkey/heads/ce R.recalculateChannels() -/datum/outfit/ert/engineer/alert +/datum/outfit/centcom/ert/engineer/alert name = "ERT Engineer - High Alert" mask = /obj/item/clothing/mask/gas/sechailer/swat - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/melee/baton/loaded=1, /obj/item/gun/energy/pulse/pistol/loyalpin=1, /obj/item/construction/rcd/combat=1, - /obj/item/bluespace_anchor=1) + /obj/item/bluespace_anchor=1 + ) /datum/outfit/centcom_official name = JOB_CENTCOM_OFFICIAL + id = /obj/item/card/id/centcom uniform = /obj/item/clothing/under/rank/centcom/official suit = /obj/item/clothing/suit/hooded/wintercoat/centcom - shoes = /obj/item/clothing/shoes/sneakers/black - gloves = /obj/item/clothing/gloves/color/black + back = /obj/item/storage/backpack/satchel + backpack_contents = list( + /obj/item/stamp/centcom = 1, + /obj/item/storage/box/survival = 1, + ) + belt = /obj/item/gun/energy/e_gun ears = /obj/item/radio/headset/headset_cent glasses = /obj/item/clothing/glasses/sunglasses/advanced - belt = /obj/item/gun/energy/e_gun + gloves = /obj/item/clothing/gloves/color/black + shoes = /obj/item/clothing/shoes/sneakers/black l_pocket = /obj/item/pen - back = /obj/item/storage/backpack/satchel r_pocket = /obj/item/modular_computer/tablet/pda/heads l_hand = /obj/item/clipboard - id = /obj/item/card/id/centcom - backpack_contents = list(/obj/item/stamp/centcom=1) /datum/outfit/centcom_official/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) @@ -196,38 +216,59 @@ W.registered_name = H.real_name W.update_label() -/datum/outfit/ert/commander/inquisitor +/datum/outfit/centcom/ert/commander/inquisitor name = "Inquisition Commander" - l_hand = /obj/item/nullrod/scythe/talking/chainsword - suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander + r_hand = /obj/item/nullrod/scythe/talking/chainsword + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/aiModule/core/full/ert=1, - /obj/item/door_remote/omni=1) + /obj/item/door_remote/omni=1 + ) -/datum/outfit/ert/security/inquisitor +/datum/outfit/centcom/ert/security/inquisitor name = "Inquisition Security" - suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor - suit_store = /obj/item/gun/energy/e_gun/stun + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/security - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/storage/box/handcuffs=1, /obj/item/melee/baton/loaded=1, - /obj/item/construction/rcd/loaded=1) + /obj/item/construction/rcd/loaded=1 + ) -/datum/outfit/ert/medic/inquisitor +/datum/outfit/centcom/ert/medic/inquisitor name = "Inquisition Medic" - suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor - suit_store = /obj/item/gun/energy/e_gun + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/medic - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/melee/baton/loaded=1, /obj/item/reagent_containers/hypospray/combat=1, /obj/item/reagent_containers/hypospray/combat/heresypurge=1, /obj/item/gun/medbeam=1) -/datum/outfit/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/chaplain + name = "ERT Chaplain" + + id = /obj/item/card/id/ert/chaplain + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/chaplain + l_hand = /obj/item/gun/energy/e_gun + belt = /obj/item/storage/belt/soulstone + glasses = /obj/item/clothing/glasses/hud/health + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, + /obj/item/nullrod=1 + ) + +/datum/outfit/centcom/ert/chaplain/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -237,49 +278,40 @@ R.keyslot = new /obj/item/encryptionkey/heads/hop R.recalculateChannels() -/datum/outfit/ert/chaplain - name = "ERT Chaplain" - - suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor // Chap role always gets this suit - suit_store = /obj/item/gun/energy/e_gun - id = /obj/item/card/id/ert/chaplain - glasses = /obj/item/clothing/glasses/hud/health - back = /obj/item/storage/backpack/cultpack - belt = /obj/item/storage/belt/soulstone - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, - /obj/item/nullrod=1) - -/datum/outfit/ert/chaplain/inquisitor +/datum/outfit/centcom/ert/chaplain/inquisitor name = "Inquisition Chaplain" - suit = /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor - suit_store = /obj/item/gun/energy/e_gun - - belt = /obj/item/storage/belt/soulstone/full/chappy - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + back = /obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/grenade/chem_grenade/holy=1, - /obj/item/nullrod=1) + /obj/item/nullrod=1 + ) + belt = /obj/item/storage/belt/soulstone/full/chappy -/datum/outfit/ert/janitor + +/datum/outfit/centcom/ert/janitor name = "ERT Janitor" id = /obj/item/card/id/ert/Janitor - suit = /obj/item/clothing/suit/space/hardsuit/ert/jani - glasses = /obj/item/clothing/glasses/night - back = /obj/item/storage/backpack - belt = /obj/item/storage/belt/janitor/full - r_pocket = /obj/item/grenade/chem_grenade/cleaner - l_pocket = /obj/item/grenade/chem_grenade/cleaner - l_hand = /obj/item/storage/bag/trash/bluespace - backpack_contents = list(/obj/item/storage/box/survival/engineer=1, + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/responsory/janitor + backpack_contents = list( + /obj/item/storage/box/survival/engineer=1, /obj/item/storage/box/lights/mixed=1, /obj/item/melee/baton/loaded=1, /obj/item/mop/advanced=1, /obj/item/reagent_containers/glass/bucket=1, /obj/item/grenade/clusterbuster/cleaner=1, - /obj/item/choice_beacon/janicart) + /obj/item/choice_beacon/janicart + ) + belt = /obj/item/storage/belt/janitor/full + glasses = /obj/item/clothing/glasses/night + r_pocket = /obj/item/grenade/chem_grenade/cleaner + l_pocket = /obj/item/grenade/chem_grenade/cleaner + l_hand = /obj/item/storage/bag/trash/bluespace -/datum/outfit/ert/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/janitor/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -289,7 +321,7 @@ R.keyslot = new /obj/item/encryptionkey/headset_service R.recalculateChannels() -/datum/outfit/ert/janitor/heavy +/datum/outfit/centcom/ert/janitor/heavy name = "ERT Janitor - Heavy Duty" backpack_contents = list(/obj/item/storage/box/survival/engineer=1, /obj/item/storage/box/lights/mixed=1, @@ -298,7 +330,7 @@ /obj/item/reagent_containers/spray/chemsprayer/janitor=1, /obj/item/choice_beacon/janicart) -/datum/outfit/ert/kudzu +/datum/outfit/centcom/ert/kudzu name = "ERT Weed Whacker" id = /obj/item/card/id/ert/kudzu @@ -315,7 +347,7 @@ /obj/item/choice_beacon/pet/goat, /obj/item/grenade/clusterbuster/antiweed=2) -/datum/outfit/ert/kudzu/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) +/datum/outfit/centcom/ert/kudzu/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) ..() if(visualsOnly) @@ -434,32 +466,32 @@ /obj/item/instrument/bikehorn = 1, /obj/item/megaphone/clown = 1, /obj/item/reagent_containers/spray/chemsprayer/janitor/clown = 1, - ) + ) /datum/outfit/death_commando name = JOB_ERT_DEATHSQUAD + id = /obj/item/card/id/centcom uniform = /obj/item/clothing/under/rank/centcom/commander - suit = /obj/item/clothing/suit/space/hardsuit/deathsquad - shoes = /obj/item/clothing/shoes/magboots/commando + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/apocryphal + backpack_contents = list( + /obj/item/storage/box=1, + /obj/item/ammo_box/a357=1, + /obj/item/storage/firstaid/compact=1, + /obj/item/storage/box/flashbangs=1, + /obj/item/flashlight=1, + /obj/item/grenade/plastic/x4=1 + ) + belt = /obj/item/gun/ballistic/revolver/mateba + ears = /obj/item/radio/headset/headset_cent/alt + glasses = /obj/item/clothing/glasses/hud/toggle/thermal gloves = /obj/item/clothing/gloves/combat mask = /obj/item/clothing/mask/gas/sechailer/swat - glasses = /obj/item/clothing/glasses/hud/toggle/thermal - back = /obj/item/storage/backpack/security + shoes = /obj/item/clothing/shoes/magboots/commando l_pocket = /obj/item/melee/transforming/energy/sword/saber r_pocket = /obj/item/shield/energy - suit_store = /obj/item/tank/internals/emergency_oxygen/double - belt = /obj/item/gun/ballistic/revolver/mateba l_hand = /obj/item/gun/energy/pulse/loyalpin - id = /obj/item/card/id/centcom - ears = /obj/item/radio/headset/headset_cent/alt - - backpack_contents = list(/obj/item/storage/box=1,\ - /obj/item/ammo_box/a357=1,\ - /obj/item/storage/firstaid/compact=1,\ - /obj/item/storage/box/flashbangs=1,\ - /obj/item/flashlight=1,\ - /obj/item/grenade/plastic/x4=1) /datum/outfit/death_commando/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) if(visualsOnly) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index 4c3778b87311f..83afcef469711 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -1,27 +1,28 @@ /datum/outfit/debug //Debug objs plus hardsuit name = "Debug outfit" + + id = /obj/item/card/id/syndicate/debug uniform = /obj/item/clothing/under/misc/patriotsuit - suit = /obj/item/clothing/suit/space/hardsuit/debug + suit_store = /obj/item/tank/internals/emergency_oxygen/magic_oxygen + back = /obj/item/mod/control/pre_equipped/debug + backpack_contents = list( + /obj/item/gun/magic/wand/resurrection/debug=1, + /obj/item/melee/transforming/energy/axe=1, + /obj/item/storage/part_replacer/bluespace/tier4=1, + /obj/item/debug/human_spawner=1, + /obj/item/debug/omnitool=1, + /obj/item/xenoartifact_labeler/debug=1, + /obj/item/map_template_diver=1, + /obj/item/debug/orb_of_power=1 + ) mask = /obj/item/clothing/mask/gas/welding/up gloves = /obj/item/clothing/gloves/combat belt = /obj/item/storage/belt/utility/chief/full shoes = /obj/item/clothing/shoes/magboots/advance - id = /obj/item/card/id/syndicate/debug - suit_store = /obj/item/tank/internals/emergency_oxygen/magic_oxygen internals_slot = ITEM_SLOT_SUITSTORE glasses = /obj/item/clothing/glasses/hud/debug ears = /obj/item/radio/headset/headset_cent/debug box = /obj/item/storage/box/debugtools - back = /obj/item/storage/backpack/debug - backpack_contents = list(/obj/item/gun/magic/wand/resurrection/debug=1,\ - /obj/item/melee/transforming/energy/axe=1,\ - /obj/item/storage/part_replacer/bluespace/tier4=1,\ - /obj/item/debug/human_spawner=1,\ - /obj/item/debug/omnitool=1,\ - /obj/item/xenoartifact_labeler/debug=1,\ - /obj/item/map_template_diver=1,\ - /obj/item/debug/orb_of_power=1 - ) /datum/outfit/debug/pre_equip(mob/living/carbon/human/H, visualsOnly) . = ..() @@ -33,6 +34,39 @@ var/obj/item/clothing/shoes/magboots/boots = H.shoes boots.toggle() +/* +/datum/outfit/admin //for admeem shenanigans and testing things that arent related to equipment, not a subtype of debug just in case debug changes things + name = "Admin outfit" + + id = /obj/item/card/id/advanced/debug + uniform = /obj/item/clothing/under/misc/patriotsuit + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/administrative + backpack_contents = list( + /obj/item/melee/energy/axe = 1, + /obj/item/storage/part_replacer/bluespace/tier4 = 1, + /obj/item/gun/magic/wand/resurrection/debug = 1, + /obj/item/gun/magic/wand/death/debug = 1, + /obj/item/debug/human_spawner = 1, + /obj/item/debug/omnitool = 1, + /obj/item/storage/box/stabilized = 1, +) + belt = /obj/item/storage/belt/utility/chief/full + ears = /obj/item/radio/headset/headset_cent/commander + glasses = /obj/item/clothing/glasses/hud/debug + gloves = /obj/item/clothing/gloves/combat + mask = /obj/item/clothing/mask/gas/welding/up + shoes = /obj/item/clothing/shoes/magboots/advance + + box = /obj/item/storage/box/debugtools + internals_slot = ITEM_SLOT_SUITSTORE + +/datum/outfit/admin/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE) + var/obj/item/card/id/W = H.wear_id + W.registered_name = H.real_name + W.update_label() + W.update_icon() +*/ /datum/outfit/space name = "Standard Space Gear" diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 7470dc01e32df..6a43975e6212f 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -66,6 +66,3 @@ if(ismob(loc)) var/mob/M = loc M.update_inv_shoes() - -/obj/item/proc/negates_gravity() - return FALSE diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 6e3a364ab8ff3..9596a799c1687 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -12,6 +12,16 @@ equip_delay_other = 70 resistance_flags = FIRE_PROOF +/obj/item/clothing/shoes/magboots/equipped(mob/user, slot) + . = ..() + if(slot == ITEM_SLOT_FEET) + update_gravity_trait(user) + else + REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type) + +/obj/item/clothing/shoes/magboots/dropped(mob/user) + . = ..() + REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type) /obj/item/clothing/shoes/magboots/verb/toggle() set name = "Toggle Magboots" @@ -36,13 +46,16 @@ user.update_gravity(user.has_gravity()) update_action_buttons() -/obj/item/clothing/shoes/magboots/negates_gravity() - return isspaceturf(get_turf(src)) ? FALSE : magpulse //We don't mimick gravity on space turfs - /obj/item/clothing/shoes/magboots/examine(mob/user) . = ..() . += "Its mag-pulse traction system appears to be [magpulse ? "enabled" : "disabled"]." +///Adds/removes the gravity negation trait from the wearer depending on if the magpulse system is turned on. +/obj/item/clothing/shoes/magboots/proc/update_gravity_trait(mob/user) + if(magpulse) + ADD_TRAIT(user, TRAIT_NEGATES_GRAVITY, type) + else + REMOVE_TRAIT(user, TRAIT_NEGATES_GRAVITY, type) /obj/item/clothing/shoes/magboots/advance desc = "Advanced magnetic boots that have a lighter magnetic pull, placing less burden on the wearer." diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 448e6be1c812e..a56fd87fa1977 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -414,29 +414,6 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/exploration heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS -//Cybersun Hardsuit -//A kind of side-grade to the explorer suit, sacrificing burn protection for brute. If you can kill the guy inside it, anyways. -/obj/item/clothing/head/helmet/space/hardsuit/cybersun - name = "Cybersun hardsuit helmet" - desc = "A bulbous red helmet designed for scavenging in hazardous, low pressure environments. Has dual floodlights, and a 360 Degree view." - icon_state = "hardsuit0-cybersun" - item_state = "death_commando_mask" - hardsuit_type = "cybersun" - armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15, BLEED = 70) - strip_delay = 600 - -/obj/item/clothing/suit/space/hardsuit/cybersun - icon_state = "cybersun" - name = "Cybersun hardsuit" - desc = "A bulky, protective suit designed to protect against the perils facing Cybersun Employed Engineers, Researchers, and more as they head from the safety of \ - more stable employment to the dangers of Nanotrasen Controlled Deep Space. Designed to get the job done despite on-site hazards in derelicts, laser armor was \ - sacrificed in favor of more effective blunt armor plates and radiation shielding." - armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15, BLEED = 70) - hardsuit_type = "cybersun" - item_state = "death_commando_mask" - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cybersun - jetpack = /obj/item/tank/jetpack/suit - //Syndicate hardsuit /obj/item/clothing/head/helmet/space/hardsuit/syndi name = "blood-red hardsuit helmet" @@ -694,7 +671,8 @@ hardsuit_type = "medical" flash_protect = 0 armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 70) - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | SCAN_REAGENTS | HEADINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | HEADINTERNALS + clothing_traits = list(TRAIT_REAGENT_SCANNER) /obj/item/clothing/suit/space/hardsuit/medical icon_state = "hardsuit-medical" @@ -726,7 +704,8 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30, BLEED = 70) var/obj/machinery/doppler_array/integrated/bomb_radar - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | SCAN_REAGENTS | HEADINTERNALS + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | HEADINTERNALS + clothing_traits = list(TRAIT_REAGENT_SCANNER) actions_types = list( /datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index c4738d10b14c4..ebdad78046fbb 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -148,7 +148,7 @@ cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 70) - blocks_shove_knockdown = TRUE + clothing_flags = BLOCKS_SHOVE_KNOCKDOWN strip_delay = 80 equip_delay_other = 60 slowdown = 0.15 diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index fb3781dbb0315..27a153c5b8ba7 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -203,42 +203,9 @@ to_chat(usr, "The robe hums, its internal magic supply restored.") -//Shielded Armour - -/obj/item/clothing/suit/space/hardsuit/shielded/wizard - name = "battlemage armour" - desc = "Not all wizards are afraid of getting up close and personal." - icon_state = "battlemage" - item_state = "battlemage" - min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT - max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70) - slowdown = 0 - resistance_flags = FIRE_PROOF | ACID_PROOF - -/obj/item/clothing/suit/space/hardsuit/shielded/wizard/setup_shielding() - AddComponent(/datum/component/shielded, max_charges = 15, recharge_start_delay = 0 SECONDS, charge_increment_delay = 1 SECONDS, charge_recovery = 1, lose_multiple_charges = FALSE, shield_icon = "shield-red") - -/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard - name = "battlemage helmet" - desc = "A suitably impressive helmet.." - icon_state = "battlemage" - item_state = "battlemage" - min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT - max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70) - actions_types = null //No inbuilt light - resistance_flags = FIRE_PROOF | ACID_PROOF - -/obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard/attack_self(mob/user) - return - // The actual code for this is handled in the shielded component, see [/datum/component/shielded/proc/check_recharge_rune] /obj/item/wizard_armour_charge name = "battlemage shield charges" desc = "A powerful rune that will increase the number of hits a suit of battlemage armour can take before failing.." icon = 'icons/effects/effects.dmi' icon_state = "electricity2" - /// How many charges get restored - var/restored_charges = 8 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index fe03c6e7e234a..6c5e274725fb7 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -47,7 +47,7 @@ max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = FALSE resistance_flags = FIRE_PROOF | ACID_PROOF - blocks_shove_knockdown = TRUE + clothing_flags = BLOCKS_SHOVE_KNOCKDOWN /obj/item/clothing/under/misc/burial name = "burial garments" diff --git a/code/modules/food_and_drinks/kitchen_machinery/griddle.dm b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm index 2d47a4e325322..2fa20ee14f0c0 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/griddle.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/griddle.dm @@ -131,7 +131,7 @@ return TRUE ///Override to prevent storage dumping onto the griddle until I figure out how to navigate the mess that is storage code to allow me to nicely move the dumped objects onto the griddle. -/obj/machinery/griddle/get_dumping_location(obj/item/storage/source, mob/user) +/obj/machinery/griddle/get_dumping_location() return /obj/machinery/griddle/process(delta_time) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index 522502a2d25fc..dcbbac09a5d0e 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -371,21 +371,22 @@ var/pda_slot = ITEM_SLOT_BELT /datum/outfit/job/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE) - switch(H.backbag) - if(GBACKPACK) - back = /obj/item/storage/backpack //Grey backpack - if(GSATCHEL) - back = /obj/item/storage/backpack/satchel //Grey satchel - if(GDUFFELBAG) - back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag - if(LSATCHEL) - back = /obj/item/storage/backpack/satchel/leather //Leather Satchel - if(DSATCHEL) - back = satchel //Department satchel - if(DDUFFELBAG) - back = duffelbag //Department duffel bag - else - back = backpack //Department backpack + if(ispath(back, /obj/item/storage/backpack)) + switch(H.backbag) + if(GBACKPACK) + back = /obj/item/storage/backpack //Grey backpack + if(GSATCHEL) + back = /obj/item/storage/backpack/satchel //Grey satchel + if(GDUFFELBAG) + back = /obj/item/storage/backpack/duffelbag //Grey Duffel bag + if(LSATCHEL) + back = /obj/item/storage/backpack/satchel/leather //Leather Satchel + if(DSATCHEL) + back = satchel //Department satchel + if(DDUFFELBAG) + back = duffelbag //Department duffel bag + else + back = backpack //Department backpack //converts the uniform string into the path we'll wear, whether it's the skirt or regular variant var/holder diff --git a/code/modules/jobs/job_types/atmospheric_technician.dm b/code/modules/jobs/job_types/atmospheric_technician.dm index ea50e71dacc03..4aef07f54c9ef 100644 --- a/code/modules/jobs/job_types/atmospheric_technician.dm +++ b/code/modules/jobs/job_types/atmospheric_technician.dm @@ -46,10 +46,10 @@ box = /obj/item/storage/box/survival/engineer pda_slot = ITEM_SLOT_LPOCKET -/datum/outfit/job/atmospheric_technician/rig - name = "Atmospheric Technician (Hardsuit)" +/datum/outfit/job/atmospheric_technician/mod + name = "Atmospheric Technician (MODsuit)" - mask = /obj/item/clothing/mask/gas - suit = /obj/item/clothing/suit/space/hardsuit/engine/atmos suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/atmospheric + mask = /obj/item/clothing/mask/gas/atmos internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/captain.dm b/code/modules/jobs/job_types/captain.dm index d219ba7c5591c..a50a0d3725774 100755 --- a/code/modules/jobs/job_types/captain.dm +++ b/code/modules/jobs/job_types/captain.dm @@ -72,9 +72,11 @@ chameleon_extras = list(/obj/item/gun/energy/e_gun, /obj/item/stamp/captain) -/datum/outfit/job/captain/hardsuit - name = "Captain (Hardsuit)" +/datum/outfit/job/captain/mod + name = "Captain (MODsuit)" - mask = /obj/item/clothing/mask/gas/sechailer - suit = /obj/item/clothing/suit/space/hardsuit/swat/captain suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/magnate + suit = null + head = null + mask = /obj/item/clothing/mask/gas/atmos diff --git a/code/modules/jobs/job_types/chief_engineer.dm b/code/modules/jobs/job_types/chief_engineer.dm index fef77efd53931..2ad93bd4357d6 100644 --- a/code/modules/jobs/job_types/chief_engineer.dm +++ b/code/modules/jobs/job_types/chief_engineer.dm @@ -61,14 +61,14 @@ pda_slot = ITEM_SLOT_LPOCKET chameleon_extras = /obj/item/stamp/chief_engineer -/datum/outfit/job/chief_engineer/rig - name = "Chief Engineer (Hardsuit)" +/datum/outfit/job/chief_engineer/mod + name = "Chief Engineer (MODsuit)" - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/engine/elite - shoes = /obj/item/clothing/shoes/magboots/advance suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/advanced glasses = /obj/item/clothing/glasses/meson/engine gloves = /obj/item/clothing/gloves/color/yellow head = null + mask = /obj/item/clothing/mask/breath + shoes = /obj/item/clothing/shoes/magboots/advance internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/chief_medical_officer.dm b/code/modules/jobs/job_types/chief_medical_officer.dm index 9c0244dd0bc3a..d69813aca14c0 100644 --- a/code/modules/jobs/job_types/chief_medical_officer.dm +++ b/code/modules/jobs/job_types/chief_medical_officer.dm @@ -71,10 +71,12 @@ chameleon_extras = list(/obj/item/gun/syringe, /obj/item/stamp/cmo) -/datum/outfit/job/chief_medical_officer/hardsuit - name = "Chief Medical Officer (Hardsuit)" +/datum/outfit/job/chief_medical_officer/mod + name = "Chief Medical Officer (MOD)" - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/medical/cmo suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/rescue + suit = null + mask = /obj/item/clothing/mask/breath r_pocket = /obj/item/flashlight/pen + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/head_of_security.dm b/code/modules/jobs/job_types/head_of_security.dm index 9776bb8c450b2..88089797b4857 100644 --- a/code/modules/jobs/job_types/head_of_security.dm +++ b/code/modules/jobs/job_types/head_of_security.dm @@ -68,11 +68,12 @@ chameleon_extras = list(/obj/item/gun/energy/e_gun/hos, /obj/item/stamp/hos) -/datum/outfit/job/head_of_security/hardsuit - name = "Head of Security (Hardsuit)" +/datum/outfit/job/head_of_security/mod + name = "Head of Security (MODsuit)" - mask = /obj/item/clothing/mask/gas/sechailer - suit = /obj/item/clothing/suit/space/hardsuit/security/head_of_security suit_store = /obj/item/tank/internals/oxygen - backpack_contents = list(/obj/item/melee/baton/loaded=1) + back = /obj/item/mod/control/pre_equipped/safeguard + suit = null + head = null + mask = /obj/item/clothing/mask/gas/sechailer diff --git a/code/modules/jobs/job_types/medical_doctor.dm b/code/modules/jobs/job_types/medical_doctor.dm index 8e66812bdd2b8..396e54eb5691e 100644 --- a/code/modules/jobs/job_types/medical_doctor.dm +++ b/code/modules/jobs/job_types/medical_doctor.dm @@ -59,3 +59,13 @@ duffelbag = /obj/item/storage/backpack/duffelbag/med chameleon_extras = /obj/item/gun/syringe + +/datum/outfit/job/doctor/mod + name = "Medical Doctor (MODsuit)" + + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/medical + suit = null + mask = /obj/item/clothing/mask/breath/medical + r_pocket = /obj/item/flashlight/pen + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/research_director.dm b/code/modules/jobs/job_types/research_director.dm index 90bb0625798e6..08ed100d4d8a3 100644 --- a/code/modules/jobs/job_types/research_director.dm +++ b/code/modules/jobs/job_types/research_director.dm @@ -71,11 +71,12 @@ chameleon_extras = /obj/item/stamp/research_director -/datum/outfit/job/research_director/rig - name = "Research Director (Hardsuit)" +/datum/outfit/job/research_director/mod + name = "Research Director (MODsuit)" - l_hand = null - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/research_director suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/research + suit = null + mask = /obj/item/clothing/mask/breath + l_hand = null internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/roboticist.dm b/code/modules/jobs/job_types/roboticist.dm index 1e74792bb1826..7d63e55c6bf27 100644 --- a/code/modules/jobs/job_types/roboticist.dm +++ b/code/modules/jobs/job_types/roboticist.dm @@ -52,3 +52,11 @@ duffelbag = /obj/item/storage/backpack/duffelbag/science pda_slot = ITEM_SLOT_LPOCKET + +/datum/outfit/job/roboticist/mod + name = "Roboticist (MODsuit)" + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/standard + suit = null + mask = /obj/item/clothing/mask/breath + internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/jobs/job_types/shaft_miner.dm b/code/modules/jobs/job_types/shaft_miner.dm index e354e11dfac6a..a07f3ce76c2ed 100644 --- a/code/modules/jobs/job_types/shaft_miner.dm +++ b/code/modules/jobs/job_types/shaft_miner.dm @@ -77,8 +77,10 @@ var/obj/item/clothing/suit/hooded/S = H.wear_suit S.ToggleHood() -/datum/outfit/job/miner/equipped/hardsuit - name = "Shaft Miner (Equipment + Hardsuit)" - suit = /obj/item/clothing/suit/space/hardsuit/mining +/datum/outfit/job/miner/equipped/mod + name = "Shaft Miner (Equipment + MODsuit)" + + back = /obj/item/mod/control/pre_equipped/mining + suit = null mask = /obj/item/clothing/mask/breath diff --git a/code/modules/jobs/job_types/station_engineer.dm b/code/modules/jobs/job_types/station_engineer.dm index 6f275877b348a..492fb50a2e012 100644 --- a/code/modules/jobs/job_types/station_engineer.dm +++ b/code/modules/jobs/job_types/station_engineer.dm @@ -53,11 +53,12 @@ name = "Station Engineer (Gloves)" gloves = /obj/item/clothing/gloves/color/yellow -/datum/outfit/job/engineer/gloved/rig - name = "Station Engineer (Hardsuit)" - mask = /obj/item/clothing/mask/breath - suit = /obj/item/clothing/suit/space/hardsuit/engine +/datum/outfit/job/engineer/mod + name = "Station Engineer (MODsuit)" + suit_store = /obj/item/tank/internals/oxygen + back = /obj/item/mod/control/pre_equipped/engineering head = null + mask = /obj/item/clothing/mask/breath internals_slot = ITEM_SLOT_SUITSTORE diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 6c2324f0f8bf5..79e13e48111ad 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -558,12 +558,20 @@ if(!isnull(G.lighting_alpha)) lighting_alpha = min(lighting_alpha, G.lighting_alpha) + if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION)) + lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + see_in_dark = max(see_in_dark, 8) + + if(HAS_TRAIT(src, TRAIT_MESON_VISION)) + sight |= SEE_TURFS + lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) - sight |= (SEE_MOBS) + sight |= SEE_MOBS lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) - sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = max(see_in_dark, 8) if(see_override) diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 04b250a5a5f42..f0289fa69bf21 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -260,7 +260,7 @@ /mob/living/carbon/is_shove_knockdown_blocked() //If you want to add more things that block shove knockdown, extend this for (var/obj/item/clothing/clothing in get_equipped_items()) - if(clothing.blocks_shove_knockdown) + if(clothing.clothing_flags & BLOCKS_SHOVE_KNOCKDOWN) return TRUE return FALSE diff --git a/code/modules/mob/living/carbon/carbon_movement.dm b/code/modules/mob/living/carbon/carbon_movement.dm index 33b556e736336..a2a9c71ba3f53 100644 --- a/code/modules/mob/living/carbon/carbon_movement.dm +++ b/code/modules/mob/living/carbon/carbon_movement.dm @@ -8,16 +8,6 @@ log_combat(src, (O ? O : get_turf(src)), "slipped on the", null, ((lube & SLIDE) ? "(LUBE)" : null)) return loc.handle_slip(src, knockdown_amount, O, lube, paralyze, force_drop) -/mob/living/carbon/Process_Spacemove(movement_dir = FALSE) - if(..()) - return TRUE - if(!isturf(loc)) - return FALSE - - // Do we have a jetpack implant (and is it on)? - if(has_jetpack_power(movement_dir)) - return TRUE - /mob/living/carbon/Move(NewLoc, direct) . = ..() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 7372fb37f1ef1..55b54a5f3f72b 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -509,7 +509,7 @@ threatcount += 2 //Check for dresscode violations - if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard)) + if(istype(head, /obj/item/clothing/head/wizard)) threatcount += 2 //Check for nonhuman scum diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ff02f8efca6fb..66c60125e87bc 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -150,6 +150,8 @@ if(wear_neck) if(wear_neck.hit_reaction(src, AM, attack_text, damage, attack_type)) return TRUE + if(SEND_SIGNAL(src, COMSIG_HUMAN_CHECK_SHIELDS, AM, damage, attack_text, attack_type, armour_penetration) & SHIELD_BLOCK) + return TRUE return FALSE /mob/living/carbon/human/proc/check_block() @@ -193,6 +195,7 @@ else affecting = get_bodypart(ran_zone(user.get_combat_bodyzone(src))) var/target_area = parse_zone(check_zone(user.get_combat_bodyzone(src))) //our intended target + if(affecting) if(I.force && I.damtype != STAMINA && (!IS_ORGANIC_LIMB(affecting))) // Bodpart_robotic sparks when hit, but only when it does real damage if(I.force >= 5) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index f268c0dae5a83..ce59e93a3f12c 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -241,28 +241,6 @@ return FALSE -/mob/living/carbon/human/can_see_reagents() - . = ..() - if(.) //No need to run through all of this if it's already true. - return - if(isclothing(glasses) && (glasses.clothing_flags & SCAN_REAGENTS)) - return TRUE - if(isclothing(head) && (head.clothing_flags & SCAN_REAGENTS)) - return TRUE - if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS)) - return TRUE - -/mob/living/carbon/human/can_see_boozepower() - . = ..() - if(.) - return - if(isclothing(glasses) && (glasses.clothing_flags & SCAN_BOOZEPOWER)) - return TRUE - if(isclothing(head) && (head.clothing_flags & SCAN_BOOZEPOWER)) - return TRUE - if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_BOOZEPOWER)) - return TRUE - ///copies over clothing preferences like underwear to another human /mob/living/carbon/human/proc/copy_clothing_prefs(mob/living/carbon/human/destination) destination.underwear = underwear diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 6a4e59b5da79e..7c2bbaf1f27bd 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -22,23 +22,8 @@ return FALSE return ..() - -/mob/living/carbon/human/experience_pressure_difference(pressure_difference) - if(pressure_difference > 100) - playsound_local(null, 'sound/effects/space_wind_big.ogg', clamp(pressure_difference / 50, 10, 100), 1) - else - playsound_local(null, 'sound/effects/space_wind.ogg', clamp(pressure_difference, 10, 100), 1) - if(shoes && isclothing(shoes)) - var/obj/item/clothing/S = shoes - if((S.clothing_flags & NOSLIP)) - return 0 - return ..() - -/mob/living/carbon/human/has_gravity(turf/T) - return ..() || mob_negates_gravity() - /mob/living/carbon/human/mob_negates_gravity() - return ((shoes && shoes.negates_gravity()) || (dna?.species?.negates_gravity(src))) + return dna.species.negates_gravity(src) || ..() /mob/living/carbon/human/Move(NewLoc, direct) . = ..() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index caf4b857864ca..ec098edacd69d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -91,6 +91,7 @@ //Called when we bump onto a mob /mob/living/proc/MobBump(mob/M) + SEND_SIGNAL(src, COMSIG_LIVING_MOB_BUMP, M) //Even if we don't push/swap places, we "touched" them, so spread fire spreadFire(M) @@ -830,7 +831,7 @@ return pick("trails_1", "trails_2") /mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) - if(buckled) + if(buckled || mob_negates_gravity()) return if(client && client.move_delay >= world.time + world.tick_lag*2) pressure_resistance_prob_delta -= 30 @@ -1179,11 +1180,6 @@ apply_effect((amount*RAD_MOB_COEFFICIENT)/max(1, (radiation**2)*RAD_OVERDOSE_REDUCTION), EFFECT_IRRADIATE, blocked) -/mob/living/anti_magic_check(magic = TRUE, holy = FALSE, major = TRUE, self = FALSE) - . = ..() - if(.) - return - /mob/living/proc/fakefireextinguish() return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index f8aa16bae1d83..a95849d8a277c 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -41,7 +41,7 @@ var/requires_power = POWER_REQ_ALL var/can_be_carded = TRUE var/icon/holo_icon //Default is assigned when AI is created. - var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. + var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/multitool/aiMulti @@ -479,7 +479,7 @@ log_game("Warning: possible href exploit by [key_name(usr)] - attempted control of a mecha without can_dominate_mechs or a control beacon in the mech.") return - if(controlled_mech) + if(controlled_equipment) to_chat(src, "You are already loaded into an onboard computer!") return if(!GLOB.cameranet.checkCameraVis(M)) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1715cb7dd0177..4d922aba66426 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -69,7 +69,6 @@ var/datum/station_alert/alert_control var/speed = 0 // VTEC speed boost. - var/magpulse = FALSE // Magboot-like effect. var/ionpulse = FALSE // Jetpack-like effect. var/ionpulse_on = FALSE // Jetpack-like effect. var/datum/effect_system/trail_follow/ion/ion_trail // Ionpulse effect. @@ -1113,7 +1112,6 @@ hat_offset = module.hat_offset - magpulse = module.magpulsing updatename() diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 7030ffef05079..946a07c204072 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -24,7 +24,6 @@ var/moduleselect_icon = "nomod" var/can_be_pushed = TRUE - var/magpulsing = FALSE var/clean_on_move = FALSE var/did_feedback = FALSE @@ -338,7 +337,6 @@ /obj/item/stack/sheet/brass/cyborg) cyborg_base_icon = "engineer" moduleselect_icon = "engineer" - magpulsing = TRUE hat_offset = -4 /obj/item/robot_module/deathsquad @@ -723,7 +721,7 @@ cyborg_base_icon = "synd_engi" moduleselect_icon = "malf" can_be_pushed = FALSE - magpulsing = TRUE + //module_traits = list(TRAIT_PUSHIMMUNE, TRAIT_NEGATES_GRAVITY) hat_offset = -4 canDispose = TRUE diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index aee4d7620d31b..8dd54ffc54425 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -12,13 +12,3 @@ if(ionpulse(thrust, use_fuel = use_fuel)) return TRUE return FALSE - -/mob/living/silicon/robot/mob_negates_gravity() - return isspaceturf(get_turf(src)) ? FALSE : magpulse //We don't mimick gravity on space turfs - -/mob/living/silicon/robot/has_gravity(turf/T) - return ..() || mob_negates_gravity() - -/mob/living/silicon/robot/experience_pressure_difference(pressure_difference, direction) - if(!magpulse) - return ..() diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm index c3ae98f78d06e..7035e24e4e033 100644 --- a/code/modules/mob/living/simple_animal/corpse.dm +++ b/code/modules/mob/living/simple_animal/corpse.dm @@ -37,12 +37,11 @@ /datum/outfit/syndicatecommandocorpse name = "Syndicate Commando Corpse" uniform = /obj/item/clothing/under/syndicate - suit = /obj/item/clothing/suit/space/hardsuit/syndi shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset mask = /obj/item/clothing/mask/gas/syndicate - back = /obj/item/tank/jetpack/oxygen + back = /obj/item/mod/control/pre_equipped/nuclear r_pocket = /obj/item/tank/internals/emergency_oxygen id = /obj/item/card/id/syndicate @@ -57,12 +56,11 @@ /datum/outfit/syndicatestormtroopercorpse name = "Syndicate Stormtrooper Corpse" uniform = /obj/item/clothing/under/syndicate - suit = /obj/item/clothing/suit/space/hardsuit/syndi/elite shoes = /obj/item/clothing/shoes/combat gloves = /obj/item/clothing/gloves/combat ears = /obj/item/radio/headset mask = /obj/item/clothing/mask/gas/syndicate - back = /obj/item/tank/jetpack/oxygen/harness + back = /obj/item/mod/control/pre_equipped/elite id = /obj/item/card/id/syndicate diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index 56faa85c449d3..6393d96b0a8ad 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -103,6 +103,8 @@ for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) diag_hud.add_to_hud(src) + ADD_TRAIT(src, TRAIT_NEGATES_GRAVITY, INNATE_TRAIT) + listener = new(list(ALARM_ATMOS, ALARM_FIRE, ALARM_POWER), list(z)) RegisterSignal(listener, COMSIG_ALARM_TRIGGERED, PROC_REF(alarm_triggered)) RegisterSignal(listener, COMSIG_ALARM_CLEARED, PROC_REF(alarm_cleared)) @@ -233,12 +235,6 @@ if(affect_silicon) return ..() -/mob/living/simple_animal/drone/mob_negates_gravity() - return !isspaceturf(get_turf(src)) //We don't mimick gravity on space turfs - -/mob/living/simple_animal/drone/has_gravity(turf/T) - return ..() || mob_negates_gravity() - /mob/living/simple_animal/drone/experience_pressure_difference(pressure_difference, direction) return diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 3b84f59d2d989..7b287e0cbb666 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -27,7 +27,7 @@ "2. Kill.\n"+\ "3. Destroy." default_storage = /obj/item/uplink - default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi + default_hatmask = /obj/item/clothing/head/helmet/swat hacked = TRUE flavortext = null @@ -44,7 +44,6 @@ /mob/living/simple_animal/drone/syndrone/badass name = "Badass Syndrone" - default_hatmask = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite default_storage = /obj/item/uplink/nuclear /mob/living/simple_animal/drone/syndrone/badass/Initialize(mapload) diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index f9c46bdedf7c4..6c20a4b8635be 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -605,6 +605,8 @@ return TRUE else if(has_unlimited_silicon_privilege) return TRUE + else if(HAS_TRAIT(src, TRAIT_REAGENT_SCANNER)) + return TRUE else if(HAS_TRAIT(src, TRAIT_BARMASTER)) // If they're a bar master, they know what reagents are at a glance return TRUE @@ -614,6 +616,8 @@ return TRUE else if(has_unlimited_silicon_privilege) return TRUE + else if(HAS_TRAIT(src, TRAIT_BOOZE_SLIDER)) + return TRUE else if(HAS_TRAIT(src, TRAIT_BARMASTER)) return TRUE diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 51f84602cb15e..6ac7e23ccaada 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -347,11 +347,15 @@ continue return rebound +/mob/has_gravity() + return mob_negates_gravity() || ..() + /** - * Does this mob ignore gravity - */ + * Does this mob ignore gravity + */ /mob/proc/mob_negates_gravity() - return FALSE + var/turf/turf = get_turf(src) + return !isgroundlessturf(turf) && HAS_TRAIT(src, TRAIT_NEGATES_GRAVITY) /mob/newtonian_move(direction, instant = FALSE) . = ..() diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm new file mode 100644 index 0000000000000..2c27879e798a7 --- /dev/null +++ b/code/modules/mod/mod_actions.dm @@ -0,0 +1,71 @@ +/datum/action/item_action/mod + background_icon_state = "bg_tech_blue" + icon_icon = 'icons/mob/actions/actions_mod.dmi' + check_flags = AB_CHECK_CONSCIOUS + var/obj/item/mod/control/mod + +/datum/action/item_action/mod/New(Target) + ..() + mod = Target + +/datum/action/item_action/mod/Grant(mob/M) + if(owner) + Share(M) + return + ..() + +/datum/action/item_action/mod/Remove(mob/M) + var/mob_to_grant + for(var/datum/weakref/reference as anything in sharers) + var/mob/freeloader = reference.resolve() + if(!freeloader) + continue + mob_to_grant = freeloader + break + ..() + if(mob_to_grant) + Grant(mob_to_grant) + +/datum/action/item_action/mod/deploy + name = "Deploy MODsuit" + desc = "Deploy/Conceal a part of the MODsuit." + button_icon_state = "deploy" + +/datum/action/item_action/mod/deploy/Trigger() + if(!IsAvailable()) + return FALSE + mod.choose_deploy(usr) + return TRUE + +/datum/action/item_action/mod/activate + name = "Activate MODsuit" + desc = "Activate/Deactivate the MODsuit." + button_icon_state = "activate" + +/datum/action/item_action/mod/activate/Trigger() + if(!IsAvailable()) + return FALSE + mod.toggle_activate(usr) + return TRUE + +/datum/action/item_action/mod/module + name = "Toggle Module" + desc = "Toggle a MODsuit module." + button_icon_state = "module" + +/datum/action/item_action/mod/module/Trigger() + if(!IsAvailable()) + return FALSE + mod.quick_module(usr) + return TRUE + +/datum/action/item_action/mod/panel + name = "MODsuit Panel" + desc = "Open the MODsuit's panel." + button_icon_state = "panel" + +/datum/action/item_action/mod/panel/Trigger() + if(!IsAvailable()) + return FALSE + mod.ui_interact(usr) + return TRUE diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm new file mode 100644 index 0000000000000..dc5621058c26b --- /dev/null +++ b/code/modules/mod/mod_activation.dm @@ -0,0 +1,217 @@ +#define MOD_ACTIVATION_STEP_TIME 2 SECONDS +#define MOD_ACTIVATION_STEP_FLAGS IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED + +/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted. +/obj/item/mod/control/proc/choose_deploy(mob/user) + if(!length(mod_parts)) + return + var/list/display_names = list() + var/list/items = list() + for(var/obj/item/piece as anything in mod_parts) + display_names[piece.name] = REF(piece) + var/image/piece_image = image(icon = piece.icon, icon_state = piece.icon_state) + items += list(piece.name = piece_image) + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) + if(!pick) + return + var/part_reference = display_names[pick] + var/obj/item/part = locate(part_reference) in mod_parts + if(!istype(part) || user.incapacitated()) + return + if(active || activating) + balloon_alert(user, "deactivate the suit first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + var/parts_to_check = mod_parts - part + if(part.loc == src) + deploy(user, part) + for(var/obj/item/piece as anything in parts_to_check) + if(piece.loc != src) + continue + choose_deploy(user) + break + else + conceal(user, part) + for(var/obj/item/piece as anything in parts_to_check) + if(piece.loc == src) + continue + choose_deploy(user) + break + +/// Deploys a part of the suit onto the user. +/obj/item/mod/control/proc/deploy(mob/user, part) + var/obj/item/piece = part + if(piece == gauntlets && wearer.gloves) + gauntlets.overslot = wearer.gloves + wearer.transferItemToLoc(gauntlets.overslot, gauntlets, force = TRUE) + if(piece == boots && wearer.shoes) + boots.overslot = wearer.shoes + wearer.transferItemToLoc(boots.overslot, boots, force = TRUE) + if(wearer.equip_to_slot_if_possible(piece, piece.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) + if(!user) + return TRUE + wearer.visible_message("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss.", + "[piece] deploy[piece.p_s()] with a mechanical hiss.", + "You hear a mechanical hiss.") + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + else if(piece.loc != src) + if(!user) + return FALSE + balloon_alert(user, "[piece] already deployed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + else + if(!user) + return FALSE + balloon_alert(user, "bodypart clothed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + +/// Retract a part of the suit from the user +/obj/item/mod/control/proc/conceal(mob/user, part) + var/obj/item/piece = part + REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) + wearer.transferItemToLoc(piece, src, force = TRUE) + if(piece == gauntlets) + gauntlets.show_overslot() + if(piece == boots) + boots.show_overslot() + if(!user) + return + wearer.visible_message("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss.", + "[piece] retract[piece.p_s()] back into [src] with a mechanical hiss.", + "You hear a mechanical hiss.") + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + +/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on +/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE) + if(!wearer) + if(!force_deactivate) + balloon_alert(user, "put suit on back!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE)) + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + for(var/obj/item/part as anything in mod_parts) + if(!force_deactivate && part.loc == src) + balloon_alert(user, "deploy all parts first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(locked && !active && !allowed(user) && !force_deactivate) + balloon_alert(user, "access insufficient!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(!cell?.charge && !force_deactivate) + balloon_alert(user, "suit not powered!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(open && !force_deactivate) + balloon_alert(user, "close the suit panel!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(activating) + if(!force_deactivate) + balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + for(var/obj/item/mod/module/module as anything in modules) + if(!module.active) + continue + module.on_deactivation() + activating = TRUE + to_chat(wearer, "MODsuit [active ? "shutting down" : "starting up"].") + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, "[boots] [active ? "relax their grip on your legs" : "seal around your feet"].") + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(boots, seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, "[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].") + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(gauntlets, seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, "[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].") + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(chestplate,seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, "[helmet] hisses [active ? "open" : "closed"].") + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(helmet, seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, "Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].") + if(ai) + to_chat(ai, "SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"") + finish_activation(on = !active) + if(active) + playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50)) + else + playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + activating = FALSE + return TRUE + +///Seals or unseals the given part +/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal) + if(seal) + part.clothing_flags |= part.visor_flags + part.flags_inv |= part.visor_flags_inv + part.flags_cover |= part.visor_flags_cover + part.heat_protection = initial(part.heat_protection) + part.cold_protection = initial(part.cold_protection) + else + part.flags_cover &= ~part.visor_flags_cover + part.flags_inv &= ~part.visor_flags_inv + part.clothing_flags &= ~part.visor_flags + part.heat_protection = NONE + part.cold_protection = NONE + if(part == boots) + boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]" + wearer.update_inv_shoes() + if(part == gauntlets) + gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]" + wearer.update_inv_gloves() + if(part == chestplate) + chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]" + wearer.update_inv_wear_suit() + wearer.update_inv_w_uniform() + if(part == helmet) + helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]" + if(seal) + helmet.alternate_worn_layer = null + else + helmet.alternate_worn_layer = helmet.alternate_layer + wearer.update_inv_head() + wearer.update_inv_wear_mask() + wearer.update_hair() + +/// Finishes the suit's activation, starts processing +/obj/item/mod/control/proc/finish_activation(on) + icon_state = "[skin]-control[on ? "-sealed" : ""]" + slowdown = on ? slowdown_active : slowdown_inactive + if(on) + for(var/obj/item/mod/module/module as anything in modules) + module.on_suit_activation() + START_PROCESSING(SSobj, src) + else + for(var/obj/item/mod/module/module as anything in modules) + module.on_suit_deactivation() + STOP_PROCESSING(SSobj, src) + wearer.update_equipment_speed_mods() + active = on + wearer.update_inv_back() + +/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. +/obj/item/mod/control/proc/quick_activation() + var/seal = TRUE + for(var/obj/item/part in mod_parts) + if(!deploy(null, part)) + seal = FALSE + if(!seal) + return + for(var/obj/item/part in mod_parts) + seal_part(part, seal = TRUE) + finish_activation(on = TRUE) + +#undef MOD_ACTIVATION_STEP_TIME +#undef MOD_ACTIVATION_STEP_FLAGS diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm new file mode 100644 index 0000000000000..851aa6dc3bc4c --- /dev/null +++ b/code/modules/mod/mod_ai.dm @@ -0,0 +1,88 @@ +/obj/item/mod/control/transfer_ai(interaction, mob/user, mob/living/silicon/ai/intAI, obj/item/aicard/card) + . = ..() + if(!.) + return + if(!open) //mod must be open + balloon_alert(user, "suit must be open to transfer!") + return + switch(interaction) + if(AI_TRANS_TO_CARD) + if(!ai) + balloon_alert(user, "no AI in suit!") + return + balloon_alert(user, "transferring to card...") + if(!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + intAI = ai + intAI.ai_restore_power()//So the AI initially has power. + intAI.control_disabled = TRUE + intAI.radio_enabled = FALSE + intAI.disconnect_shell() + intAI.forceMove(card) + card.AI = intAI + for(var/datum/action/action as anything in actions) + if(action.owner == intAI) + action.Remove(intAI) + else + action.Unshare(intAI) + intAI.controlled_equipment = null + intAI.remote_control = null + balloon_alert(intAI, "transferred to a card") + balloon_alert(user, "AI transferred to card") + ai = null + + if(AI_TRANS_FROM_CARD) //Using an AI card to upload to the suit. + intAI = card.AI + if(!intAI) + balloon_alert(user, "no AI in card!") + return + if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client + intAI.disconnect_shell() + if(intAI.stat || !intAI.client) + balloon_alert(user, "AI unresponsive!") + return + balloon_alert(user, "transferring to suit...") + if(!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + balloon_alert(user, "AI transferred to suit") + ai_enter_mod(intAI) + card.AI = null + +/obj/item/mod/control/proc/ai_enter_mod(mob/living/silicon/ai/new_ai) + new_ai.control_disabled = FALSE + new_ai.radio_enabled = TRUE + new_ai.ai_restore_power() + new_ai.cancel_camera() + new_ai.controlled_equipment = src + new_ai.remote_control = src + new_ai.forceMove(src) + ai = new_ai + balloon_alert(new_ai, "transferred to a suit") + for(var/datum/action/action as anything in actions) + action.Grant(new_ai) + +#define MOVE_DELAY 2 +#define WEARER_DELAY 1 +#define LONE_DELAY 5 +#define CELL_PER_STEP DEFAULT_CELL_DRAIN * 2.5 + +/obj/item/mod/control/relaymove(mob/user, direction) + if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) + return FALSE + var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? sqrt(2) : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) + COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) + playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) + cell.charge = max(0, cell.charge - CELL_PER_STEP) + if(ismovable(wearer?.loc)) + return wearer.loc.relaymove(wearer, direction) + if(wearer && !wearer.Process_Spacemove(direction)) + return FALSE + var/atom/movable/mover = wearer || src + return step(mover, direction) + +#undef MOVE_DELAY +#undef WEARER_DELAY +#undef LONE_DELAY +#undef CELL_PER_STEP diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm new file mode 100644 index 0000000000000..e8007f34905b6 --- /dev/null +++ b/code/modules/mod/mod_clothes.dm @@ -0,0 +1,123 @@ +/obj/item/clothing/head/helmet/space/mod + name = "MOD helmet" + desc = "A helmet for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "helmet" + worn_icon = 'icons/mob/clothing/mod.dmi' + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) + body_parts_covered = HEAD + heat_protection = HEAD + cold_protection = HEAD + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + resistance_flags = NONE + flash_protect = FLASH_PROTECTION_NONE + clothing_flags = SNUG_FIT + flags_inv = HIDEFACIALHAIR + flags_cover = NONE + visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE + visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT + visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES + var/alternate_layer = NECK_LAYER + var/obj/item/mod/control/mod + +/obj/item/clothing/head/helmet/space/mod/Destroy() + if(!QDELETED(mod)) + mod.helmet = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/obj/item/clothing/suit/armor/mod + name = "MOD chestplate" + desc = "A chestplate for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "chestplate" + worn_icon = 'icons/mob/clothing/mod.dmi' + blood_overlay_type = "armor" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) + body_parts_covered = CHEST|GROIN + heat_protection = CHEST|GROIN + cold_protection = CHEST|GROIN + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + visor_flags = STOPSPRESSUREDAMAGE + visor_flags_inv = HIDEJUMPSUIT + allowed = list(/obj/item/flashlight, /obj/item/tank/internals) + resistance_flags = NONE + var/obj/item/mod/control/mod + +/obj/item/clothing/suit/armor/mod/Destroy() + if(!QDELETED(mod)) + mod.chestplate = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/obj/item/clothing/gloves/mod + name = "MOD gauntlets" + desc = "A pair of gauntlets for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "gauntlets" + worn_icon = 'icons/mob/clothing/mod.dmi' + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) + body_parts_covered = HANDS|ARMS + heat_protection = HANDS|ARMS + cold_protection = HANDS|ARMS + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + resistance_flags = NONE + var/obj/item/mod/control/mod + var/obj/item/clothing/overslot + +/obj/item/clothing/gloves/mod/Destroy() + if(!QDELETED(mod)) + mod.gauntlets = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/// Replaces these gloves on the wearer with the overslot ones + +/obj/item/clothing/gloves/mod/proc/show_overslot() + if(!overslot) + return + if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) + overslot = null + +/obj/item/clothing/shoes/mod + name = "MOD boots" + desc = "A pair of boots for a MODsuit." + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "boots" + worn_icon = 'icons/mob/clothing/mod.dmi' + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) + body_parts_covered = FEET|LEGS + heat_protection = FEET|LEGS + cold_protection = FEET|LEGS + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + resistance_flags = NONE + item_flags = IGNORE_DIGITIGRADE + var/obj/item/mod/control/mod + var/obj/item/clothing/overslot + +/obj/item/clothing/shoes/mod/Destroy() + if(!QDELETED(mod)) + mod.boots = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/// Replaces these shoes on the wearer with the overslot ones +/obj/item/clothing/shoes/mod/proc/show_overslot() + if(!overslot) + return + if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) + overslot = null diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm new file mode 100644 index 0000000000000..47fb2d0c824d1 --- /dev/null +++ b/code/modules/mod/mod_construction.dm @@ -0,0 +1,278 @@ +/obj/item/mod/construction + desc = "A part used in MOD construction." + item_state = "rack_parts" + +/obj/item/mod/construction/helmet + name = "MOD helmet" + icon_state = "helmet" + +/obj/item/mod/construction/chestplate + name = "MOD chestplate" + icon_state = "chestplate" + +/obj/item/mod/construction/gauntlets + name = "MOD gauntlets" + icon_state = "gauntlets" + +/obj/item/mod/construction/boots + name = "MOD boots" + icon_state = "boots" + +/obj/item/mod/construction/core + name = "MOD core" + icon_state = "mod-core" + desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \ + These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \ + owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\ + Which one you have in your suit is unclear, but either way, \ + it's been repurposed to be an internal power source for a Modular Outerwear Device." + +/obj/item/mod/construction/broken_core + name = "broken MOD core" + icon_state = "mod-core-broken" + desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though." + +/obj/item/mod/construction/broken_core/examine(mob/user) + . = ..() + . += "You could repair it with a screwdriver..." + +/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(!tool.use_tool(src, user, 5 SECONDS, volume = 30)) + return + new /obj/item/mod/construction/core(drop_location()) + qdel(src) + +/obj/item/mod/construction/armor + name = "MOD armor plates" + desc = "Armor plates used to finish a MOD." + icon_state = "standard-armor" + var/datum/mod_theme/theme = /datum/mod_theme + +/obj/item/mod/construction/armor/Initialize(mapload) + . = ..() + var/datum/mod_theme/used_theme = GLOB.mod_themes[theme] + name = "MOD [used_theme.name] armor plates" + desc = "[desc] [used_theme.desc]" + icon_state = "[used_theme.default_skin]-armor" + +/obj/item/mod/construction/armor/engineering + theme = /datum/mod_theme/engineering + +/obj/item/mod/construction/armor/atmospheric + theme = /datum/mod_theme/atmospheric + +/obj/item/mod/construction/armor/mining + theme = /datum/mod_theme/mining + +/obj/item/mod/construction/armor/medical + theme = /datum/mod_theme/medical + +/obj/item/mod/construction/armor/security + theme = /datum/mod_theme/security + +/obj/item/mod/construction/armor/cosmohonk + theme = /datum/mod_theme/cosmohonk + +/obj/item/mod/paint + name = "MOD paint kit" + desc = "This kit will repaint your MODsuit to something unique." + icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' + icon_state = "paintkit" + +#define START_STEP "start" +#define CORE_STEP "core" +#define SCREWED_CORE_STEP "screwed_core" +#define HELMET_STEP "helmet" +#define CHESTPLATE_STEP "chestplate" +#define GAUNTLETS_STEP "gauntlets" +#define BOOTS_STEP "boots" +#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly" +#define SCREWED_ASSEMBLY_STEP "screwed_assembly" + +/obj/item/mod/construction/shell + name = "MOD shell" + icon_state = "mod-construction_start" + desc = "A MOD shell." + var/obj/item/core + var/obj/item/helmet + var/obj/item/chestplate + var/obj/item/gauntlets + var/obj/item/boots + var/step = START_STEP + +/obj/item/mod/construction/shell/examine(mob/user) + . = ..() + var/display_text + switch(step) + if(START_STEP) + display_text = "It looks like it's missing a MOD core..." + if(CORE_STEP) + display_text = "The core seems loose..." + if(SCREWED_CORE_STEP) + display_text = "It looks like it's missing a helmet..." + if(HELMET_STEP) + display_text = "It looks like it's missing a chestplate..." + if(CHESTPLATE_STEP) + display_text = "It looks like it's missing gauntlets..." + if(GAUNTLETS_STEP) + display_text = "It looks like it's missing boots..." + if(BOOTS_STEP) + display_text = "The assembly seems unsecured..." + if(WRENCHED_ASSEMBLY_STEP) + display_text = "The assembly seems loose..." + if(SCREWED_ASSEMBLY_STEP) + display_text = "All it's missing is external armor..." + . += "[display_text]" + +/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params) + . = ..() + switch(step) + if(START_STEP) + if(!istype(part, /obj/item/mod/construction/core)) + return + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "core stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "core inserted") + core = part + step = CORE_STEP + if(CORE_STEP) + if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "core screwed") + step = SCREWED_CORE_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + core.forceMove(drop_location()) + balloon_alert(user, "core taken out") + step = START_STEP + if(SCREWED_CORE_STEP) + if(istype(part, /obj/item/mod/construction/helmet)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "helmet stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "helmet added") + helmet = part + step = HELMET_STEP + else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "core unscrewed") + step = CORE_STEP + if(HELMET_STEP) + if(istype(part, /obj/item/mod/construction/chestplate)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "chestplate stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "chestplate added") + chestplate = part + step = CHESTPLATE_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + helmet.forceMove(drop_location()) + balloon_alert(user, "helmet removed") + helmet = null + step = SCREWED_CORE_STEP + if(CHESTPLATE_STEP) + if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "gauntlets stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "gauntlets added") + gauntlets = part + step = GAUNTLETS_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + chestplate.forceMove(drop_location()) + balloon_alert(user, "chestplate removed") + chestplate = null + step = HELMET_STEP + if(GAUNTLETS_STEP) + if(istype(part, /obj/item/mod/construction/boots)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "boots added") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "You fit [part] onto [src].") + boots = part + step = BOOTS_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + gauntlets.forceMove(drop_location()) + balloon_alert(user, "gauntlets removed") + gauntlets = null + step = CHESTPLATE_STEP + if(BOOTS_STEP) + if(part.tool_behaviour == TOOL_WRENCH) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly secured") + step = WRENCHED_ASSEMBLY_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + boots.forceMove(drop_location()) + balloon_alert(user, "boots removed") + boots = null + step = GAUNTLETS_STEP + if(WRENCHED_ASSEMBLY_STEP) + if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly screwed") + step = SCREWED_ASSEMBLY_STEP + else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly unsecured") + step = BOOTS_STEP + if(SCREWED_ASSEMBLY_STEP) + if(istype(part, /obj/item/mod/construction/armor)) //Construct + var/obj/item/mod/construction/armor/external_armor = part + if(!user.transferItemToLoc(part, src)) + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "suit finished") + var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme) + qdel(src) + user.put_in_hands(modsuit) + else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly unscrewed") + step = SCREWED_ASSEMBLY_STEP + update_icon_state() + +/obj/item/mod/construction/shell/update_icon_state() + . = ..() + icon_state = "mod-construction_[step]" + +/obj/item/mod/construction/shell/Destroy() + QDEL_NULL(core) + QDEL_NULL(helmet) + QDEL_NULL(chestplate) + QDEL_NULL(gauntlets) + QDEL_NULL(boots) + return ..() + +/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom) + if(deleted_atom == core) + core = null + if(deleted_atom == helmet) + helmet = null + if(deleted_atom == chestplate) + chestplate = null + if(deleted_atom == gauntlets) + gauntlets = null + if(deleted_atom == boots) + boots = null + return ..() + +#undef START_STEP +#undef CORE_STEP +#undef SCREWED_CORE_STEP +#undef HELMET_STEP +#undef CHESTPLATE_STEP +#undef GAUNTLETS_STEP +#undef BOOTS_STEP +#undef WRENCHED_ASSEMBLY_STEP +#undef SCREWED_ASSEMBLY_STEP diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm new file mode 100644 index 0000000000000..ccc5d42a1b7d8 --- /dev/null +++ b/code/modules/mod/mod_control.dm @@ -0,0 +1,560 @@ +/// MODsuits, trade-off between armor and utility +/obj/item/mod + name = "Base MOD" + desc = "You should not see this, yell at a coder!" + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + icon_state = "standard-control" + worn_icon = 'icons/mob/clothing/mod.dmi' + +/obj/item/mod/control + name = "MOD control unit" + desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments." + icon_state = "control" + item_state = "mod_control" + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + strip_delay = 10 SECONDS + slowdown = 2 + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + actions_types = list(/datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, /datum/action/item_action/mod/module, /datum/action/item_action/mod/panel) + resistance_flags = NONE + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + permeability_coefficient = 0.01 + siemens_coefficient = 0.5 + alternate_worn_layer = BODY_FRONT_LAYER + /// The MOD's theme, decides on some stuff like armor and statistics. + var/datum/mod_theme/theme = /datum/mod_theme + /// Looks of the MOD. + var/skin = "standard" + /// Theme of the MOD TGUI + var/ui_theme = "ntos" + /// If the suit is deployed and turned on. + var/active = FALSE + /// If the suit wire/module hatch is open. + var/open = FALSE + /// If the suit is ID locked. + var/locked = FALSE + /// If the suit is malfunctioning. + var/malfunctioning = FALSE + /// If the suit is currently activating/deactivating. + var/activating = FALSE + /// How long the MOD is electrified for. + var/seconds_electrified = MACHINE_NOT_ELECTRIFIED + /// If the suit interface is broken. + var/interface_break = FALSE + /// How much module complexity can this MOD carry. + var/complexity_max = DEFAULT_MAX_COMPLEXITY + /// How much module complexity this MOD is carrying. + var/complexity = 0 + /// Power usage of the MOD. + var/cell_drain = DEFAULT_CELL_DRAIN + /// Slowdown of the MOD when not active. + var/slowdown_inactive = 2 + /// Slowdown of the MOD when active. + var/slowdown_active = 1 + /// MOD cell. + var/obj/item/stock_parts/cell/cell + /// MOD helmet. + var/obj/item/clothing/head/helmet/space/mod/helmet + /// MOD chestplate. + var/obj/item/clothing/suit/armor/mod/chestplate + /// MOD gauntlets. + var/obj/item/clothing/gloves/mod/gauntlets + /// MOD boots. + var/obj/item/clothing/shoes/mod/boots + /// List of parts (helmet, chestplate, gauntlets, boots). + var/list/mod_parts = list() + /// Modules the MOD should spawn with. + var/list/initial_modules = list() + /// Modules the MOD currently possesses. + var/list/modules = list() + /// Currently used module. + var/obj/item/mod/module/selected_module + /// AI mob inhabiting the MOD. + var/mob/living/silicon/ai/ai + /// Delay between moves as AI. + var/movedelay = 0 + /// Cooldown for AI moves. + COOLDOWN_DECLARE(cooldown_mod_move) + /// Person wearing the MODsuit. + var/mob/living/carbon/human/wearer + +/obj/item/mod/control/Initialize(mapload, new_theme, new_skin) + . = ..() + if(new_theme) + theme = new_theme + theme = GLOB.mod_themes[theme] + slowdown_inactive = theme.slowdown_inactive + slowdown_active = theme.slowdown_active + slowdown = slowdown_inactive + complexity_max = theme.complexity_max + skin = new_skin || theme.default_skin + ui_theme = theme.ui_theme + cell_drain = theme.cell_drain + initial_modules += theme.inbuilt_modules + wires = new /datum/wires/mod(src) + if(length(req_access)) + locked = TRUE + if(ispath(cell)) + cell = new cell(src) + helmet = new /obj/item/clothing/head/helmet/space/mod(src) + helmet.mod = src + mod_parts += helmet + chestplate = new /obj/item/clothing/suit/armor/mod(src) + chestplate.mod = src + mod_parts += chestplate + gauntlets = new /obj/item/clothing/gloves/mod(src) + gauntlets.mod = src + mod_parts += gauntlets + boots = new /obj/item/clothing/shoes/mod(src) + boots.mod = src + mod_parts += boots + var/list/all_parts = mod_parts.Copy() + src + for(var/obj/item/piece as anything in all_parts) + piece.name = "[theme.name] [piece.name]" + piece.desc = "[piece.desc] [theme.desc]" + piece.armor = getArmor(arglist(theme.armor)) + piece.resistance_flags = theme.resistance_flags + piece.heat_protection = NONE + piece.cold_protection = NONE + piece.max_heat_protection_temperature = theme.max_heat_protection_temperature + piece.min_cold_protection_temperature = theme.min_cold_protection_temperature + piece.permeability_coefficient = theme.permeability_coefficient + piece.siemens_coefficient = theme.siemens_coefficient + piece.icon_state = "[skin]-[initial(piece.icon_state)]" + update_flags() + for(var/obj/item/mod/module/module as anything in initial_modules) + module = new module(src) + install(module) + RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + movedelay = CONFIG_GET(number/movedelay/run_delay) + +/obj/item/mod/control/Destroy() + if(active) + STOP_PROCESSING(SSobj, src) + var/atom/deleting_atom + if(!QDELETED(helmet)) + deleting_atom = helmet + helmet.mod = null + helmet = null + mod_parts -= deleting_atom + qdel(deleting_atom) + if(!QDELETED(chestplate)) + deleting_atom = chestplate + chestplate.mod = null + chestplate = null + mod_parts -= deleting_atom + qdel(deleting_atom) + if(!QDELETED(gauntlets)) + deleting_atom = gauntlets + gauntlets.mod = null + gauntlets = null + mod_parts -= deleting_atom + qdel(deleting_atom) + if(!QDELETED(boots)) + deleting_atom = boots + boots.mod = null + boots = null + mod_parts -= deleting_atom + qdel(deleting_atom) + for(var/obj/item/mod/module/module as anything in modules) + module.mod = null + modules -= module + QDEL_NULL(wires) + QDEL_NULL(cell) + return ..() + +/obj/item/mod/control/process(delta_time) + if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) + seconds_electrified-- + if((!cell || !cell.charge) && active && !activating) + power_off() + return PROCESS_KILL + var/malfunctioning_charge_drain = 0 + if(malfunctioning) + malfunctioning_charge_drain = rand(1,20) + cell.charge = max(0, cell.charge - (cell_drain + malfunctioning_charge_drain)*delta_time) + update_cell_alert() + for(var/obj/item/mod/module/module as anything in modules) + if(malfunctioning && module.active && DT_PROB(5, delta_time)) + module.on_deactivation() + module.on_process(delta_time) + +/obj/item/mod/control/equipped(mob/user, slot) + ..() + if(slot == ITEM_SLOT_BACK) + set_wearer(user) + else if(wearer) + unset_wearer() + +/obj/item/mod/control/dropped(mob/user) + . = ..() + if(wearer) + unset_wearer() + +/obj/item/mod/control/item_action_slot_check(slot) + if(slot == ITEM_SLOT_BACK) + return TRUE + +/obj/item/mod/control/allow_attack_hand_drop(mob/user) + var/mob/living/carbon/carbon_user = user + if(!istype(carbon_user) || src != carbon_user.back) + return ..() + for(var/obj/item/part in mod_parts) + if(part.loc != src) + balloon_alert(carbon_user, "retract parts first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) + return FALSE + +/obj/item/mod/control/MouseDrop(atom/over_object) + if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand)) + return ..() + for(var/obj/item/part in mod_parts) + if(part.loc != src) + balloon_alert(wearer, "retract parts first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) + return + if(!wearer.incapacitated()) + var/atom/movable/screen/inventory/hand/ui_hand = over_object + if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index)) + add_fingerprint(usr) + return ..() + +/obj/item/mod/control/attack_hand(mob/user) + if(seconds_electrified && cell?.charge) + if(shock(user)) + return + if(open && loc == user) + if(!cell) + balloon_alert(user, "no cell!") + return + balloon_alert(user, "removing cell...") + if(!do_after(user, 1.5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + balloon_alert(user, "cell removed") + playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + if(!user.put_in_hands(cell)) + cell.forceMove(drop_location()) + update_cell_alert() + return + return ..() + +/obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) + if(..()) + return TRUE + if(active || activating || ai_controller) + balloon_alert(user, "deactivate suit first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + balloon_alert(user, "[open ? "closing" : "opening"] panel...") + screwdriver.play_tool_sound(src, 100) + if(screwdriver.use_tool(src, user, 1 SECONDS)) + if(active || activating) + balloon_alert(user, "deactivate suit first!") + screwdriver.play_tool_sound(src, 100) + balloon_alert(user, "panel [open ? "closed" : "opened"]") + open = !open + else + balloon_alert(user, "interrupted!") + return TRUE + +/obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar) + . = ..() + if(!open) + balloon_alert(user, "open the panel first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(!allowed(user)) + balloon_alert(user, "insufficient access!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + if(length(modules)) + var/list/removable_modules = list() + for(var/obj/item/mod/module/module as anything in modules) + if(!module.removable) + continue + removable_modules += module + var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules) + if(!module_to_remove?.mod) + return FALSE + uninstall(module_to_remove) + module_to_remove.forceMove(drop_location()) + crowbar.play_tool_sound(src, 100) + return TRUE + balloon_alert(user, "no modules!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + +/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) + if(istype(attacking_item, /obj/item/mod/module)) + if(!open) + balloon_alert(user, "open the panel first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + install(attacking_item, user) + return TRUE + else if(istype(attacking_item, /obj/item/stock_parts/cell)) + if(!open) + balloon_alert(user, "open the panel first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(cell) + balloon_alert(user, "cell already installed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + attacking_item.forceMove(src) + cell = attacking_item + balloon_alert(user, "cell installed") + playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + update_cell_alert() + return TRUE + else if(is_wire_tool(attacking_item) && open) + wires.interact(user) + return TRUE + else if(istype(attacking_item, /obj/item/mod/paint)) + if(active || activating) + balloon_alert(user, "suit is active!") + else if(paint(user, attacking_item)) + balloon_alert(user, "suit painted") + else + balloon_alert(user, "not painted!") + return TRUE + else if(open && attacking_item.GetID()) + update_access(user, attacking_item) + return TRUE + return ..() + +/obj/item/mod/control/get_cell() + if(open) + return cell + +/obj/item/mod/control/GetAccess() + if(ai_controller) + return req_access.Copy() + else + return ..() + +/obj/item/mod/control/on_emag(mob/user) + ..() + locked = !locked + balloon_alert(user, "[locked ? "locked" : "unlocked"]") + +/obj/item/mod/control/emp_act(severity) + . = ..() + to_chat(wearer, "[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!") + if(!active || !wearer || . & EMP_PROTECT_CONTENTS) + return + selected_module = null + wearer.apply_damage(10 / severity, BURN) + to_chat(wearer, "You feel [src] heat up from the EMP, burning you slightly.") + if (wearer.stat < UNCONSCIOUS && prob(10)) + wearer.emote("scream") + +/obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + if(visuals_only) + set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped + quick_activation() + +/obj/item/mod/control/doStrip(mob/stripper, mob/owner) + if(active && !toggle_activate(stripper, force_deactivate = TRUE)) + return + for(var/obj/item/part in mod_parts) + conceal(null, part) + return ..() + +/obj/item/mod/control/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) + . = ..() + if(!active) + return + for(var/obj/item/mod/module/module as anything in modules) + var/list/module_icons = module.generate_worn_overlay(standing) + if(!length(module_icons)) + continue + . += module_icons + +/obj/item/mod/control/proc/set_wearer(mob/user) + wearer = user + RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit) + RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) + update_cell_alert() + for(var/obj/item/mod/module/module as anything in modules) + module.on_equip() + +/obj/item/mod/control/proc/unset_wearer() + for(var/obj/item/mod/module/module as anything in modules) + module.on_unequip() + UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)) + wearer.clear_alert("mod_charge") + wearer = null + +/obj/item/mod/control/proc/update_flags() + var/list/used_skin = theme.skins[skin] + for(var/obj/item/clothing/part as anything in mod_parts) + var/used_category + if(part == helmet) + used_category = HELMET_FLAGS + helmet.alternate_worn_layer = used_skin[HELMET_LAYER] + helmet.alternate_layer = used_skin[HELMET_LAYER] + if(part == chestplate) + used_category = CHESTPLATE_FLAGS + if(part == gauntlets) + used_category = GAUNTLETS_FLAGS + if(part == boots) + used_category = BOOTS_FLAGS + var/list/category = used_skin[used_category] + part.clothing_flags = category[UNSEALED_CLOTHING] || NONE + part.visor_flags = category[SEALED_CLOTHING] || NONE + part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE + part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE + part.flags_cover = category[UNSEALED_COVER] || NONE + part.visor_flags_cover = category[SEALED_COVER] || NONE + +/obj/item/mod/control/proc/quick_module(mob/user) + if(!length(modules)) + return + var/list/display_names = list() + var/list/items = list() + for(var/obj/item/mod/module/module as anything in modules) + if(module.module_type == MODULE_PASSIVE) + continue + display_names[module.name] = REF(module) + var/image/module_image = image(icon = module.icon, icon_state = module.icon_state) + items += list(module.name = module_image) + if(!length(items)) + return + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE) + if(!pick) + return + var/module_reference = display_names[pick] + var/obj/item/mod/module/selected_module = locate(module_reference) in modules + if(!istype(selected_module) || user.incapacitated()) + return + selected_module.on_select() + +/obj/item/mod/control/proc/paint(mob/user, obj/item/paint) + if(length(theme.skins) <= 1) + return FALSE + var/list/skins = list() + for(var/mod_skin in theme.skins) + skins[mod_skin] = image(icon = icon, icon_state = "[mod_skin]-control") + var/pick = show_radial_menu(user, src, skins, custom_check = FALSE, require_near = TRUE) + if(!pick || !user.is_holding(paint)) + return FALSE + skin = pick + var/list/skin_updating = mod_parts.Copy() + src + for(var/obj/item/piece as anything in skin_updating) + piece.icon_state = "[skin]-[initial(piece.icon_state)]" + update_flags() + wearer?.regenerate_icons() + return TRUE + +/obj/item/mod/control/proc/shock(mob/living/user) + if(!istype(user) || cell?.charge < 1) + return FALSE + do_sparks(5, TRUE, src) + var/check_range = TRUE + return electrocute_mob(user, cell, src, 0.7, check_range) + +/obj/item/mod/control/proc/install(module, mob/user) + var/obj/item/mod/module/new_module = module + for(var/obj/item/mod/module/old_module as anything in modules) + if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules)) + if(user) + balloon_alert(user, "[new_module] incompatible with [old_module]!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + if(is_type_in_list(module, theme.module_blacklist)) + if(user) + balloon_alert(user, "[src] doesn't accept [new_module]!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + var/complexity_with_module = complexity + complexity_with_module += new_module.complexity + if(complexity_with_module > complexity_max) + if(user) + balloon_alert(user, "[new_module] would make [src] too complex!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + new_module.forceMove(src) + modules += new_module + complexity += new_module.complexity + new_module.mod = src + new_module.on_install() + if(wearer) + new_module.on_equip() + if(user) + balloon_alert(user, "[new_module] added") + playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + +/obj/item/mod/control/proc/uninstall(module) + var/obj/item/mod/module/old_module = module + modules -= old_module + complexity -= old_module.complexity + if(active) + old_module.on_suit_deactivation() + if(old_module.active) + old_module.on_deactivation() + if(wearer) + old_module.on_unequip() + old_module.on_uninstall() + old_module.mod = null + +/obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) + if(!allowed(user)) + balloon_alert(user, "insufficient access!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + req_access = card.access.Copy() + balloon_alert(user, "access updated") + +/obj/item/mod/control/proc/update_cell_alert() + if(!wearer) + return + if(!cell) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell) + return + var/remaining_cell = cell.charge/cell.maxcharge + switch(remaining_cell) + if(0.75 to INFINITY) + wearer.clear_alert("mod_charge") + if(0.5 to 0.75) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1) + if(0.25 to 0.5) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2) + if(0.01 to 0.25) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3) + else + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell) + +/obj/item/mod/control/proc/power_off() + balloon_alert(wearer, "no power!") + toggle_activate(wearer, force_deactivate = TRUE) + +/obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction) + SIGNAL_HANDLER + + if(part.loc == src) + return + if(part == cell) + cell = null + update_cell_alert() + return + if(part.loc == wearer) + return + if(modules.Find(part)) + uninstall(part) + return + if(mod_parts.Find(part)) + conceal(wearer, part) + if(active) + INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE) + return + +/obj/item/mod/control/proc/on_borg_charge(datum/source, amount) + SIGNAL_HANDLER + + if(!cell) + return + cell.give(amount) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm new file mode 100644 index 0000000000000..c7d975224687e --- /dev/null +++ b/code/modules/mod/mod_theme.dm @@ -0,0 +1,854 @@ +/// Global proc that sets up all MOD themes as singletons in a list and returns it. +/proc/setup_mod_themes() + . = list() + for(var/path in typesof(/datum/mod_theme)) + var/datum/mod_theme/new_theme = new path() + .[path] = new_theme + +/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics. +/datum/mod_theme + /// Theme name for the MOD. + var/name = "standard" + /// Description added to the MOD. + var/desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement." + /// Default skin of the MOD. + var/default_skin = "standard" + /// Armor shared across the MOD pieces. + var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + /// Resistance flags shared across the MOD pieces. + var/resistance_flags = NONE + /// Max heat protection shared across the MOD pieces. + var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + /// Max cold protection shared across the MOD pieces. + var/min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + /// Permeability shared across the MOD pieces. + var/permeability_coefficient = 0.01 + /// Siemens shared across the MOD pieces. + var/siemens_coefficient = 0.5 + /// How much modules can the MOD carry without malfunctioning. + var/complexity_max = DEFAULT_MAX_COMPLEXITY + /// How much battery power the MOD uses by just being on + var/cell_drain = DEFAULT_CELL_DRAIN + /// Slowdown of the MOD when not active. + var/slowdown_inactive = 1.25 + /// Slowdown of the MOD when active. + var/slowdown_active = 0.75 + /// Theme used by the MOD TGUI. + var/ui_theme = "ntos" + /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity. + var/list/inbuilt_modules = list() + /// Modules blacklisted from the MOD. + var/list/module_blacklist = list() + /// List of skins with their appropriate clothing flags. + var/list/skins = list( + "standard" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + "civilian" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/engineering + name = "engineering" + desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." + default_skin = "engineering" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1.5 + slowdown_active = 1 + skins = list( + "engineering" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/atmospheric + name = "atmospheric" + desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit." + default_skin = "atmospheric" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + slowdown_inactive = 1.5 + slowdown_active = 1 + skins = list( + "atmospheric" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR, + UNSEALED_COVER = HEADCOVERSMOUTH, + SEALED_COVER = HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/advanced + name = "advanced" + desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish." + default_skin = "advanced" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1 + slowdown_active = 0.5 + inbuilt_modules = list(/obj/item/mod/module/magboot/advanced) + skins = list( + "advanced" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/mining + name = "mining" + desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain." + default_skin = "mining" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + cell_drain = DEFAULT_CELL_DRAIN * 2 + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + skins = list( + "mining" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/medical + name = "medical" + desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." + default_skin = "medical" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10) + cell_drain = DEFAULT_CELL_DRAIN * 1.5 + slowdown_inactive = 1 + slowdown_active = 0.5 + skins = list( + "medical" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + "corpsman" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/rescue + name = "rescue" + desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments." + default_skin = "rescue" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + cell_drain = DEFAULT_CELL_DRAIN * 1.5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) + skins = list( + "rescue" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/research + name = "research" + desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive." + default_skin = "research" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + slowdown_inactive = 2 + slowdown_active = 1.5 + inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced) + skins = list( + "research" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/security + name = "security" + desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity." + default_skin = "security" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20) + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slowdown_inactive = 1 + slowdown_active = 0.5 + skins = list( + "security" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, + UNSEALED_COVER = HEADCOVERSMOUTH, + SEALED_COVER = HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/safeguard + name = "safeguard" + desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model." + default_skin = "safeguard" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + skins = list( + "safeguard" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/magnate + name = "magnate" + desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed." + default_skin = "magnate" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + skins = list( + "magnate" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/cosmohonk + name = "cosmohonk" + desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost." + default_skin = "cosmohonk" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) + cell_drain = DEFAULT_CELL_DRAIN * 0.25 + slowdown_inactive = 1.75 + slowdown_active = 1.25 + skins = list( + "cosmohonk" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, + SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/syndicate + name = "syndicate" + desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." + default_skin = "syndicate" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25) + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1 + slowdown_active = 0.5 + ui_theme = "syndicate" + inbuilt_modules = list(/obj/item/mod/module/armor_booster) + skins = list( + "syndicate" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/elite + name = "elite" + desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values." + default_skin = "elite" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + ui_theme = "syndicate" + inbuilt_modules = list(/obj/item/mod/module/armor_booster/elite) + skins = list( + "elite" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/enchanted + name = "enchanted" + desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." + default_skin = "enchanted" + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + ui_theme = "wizard" + inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) + skins = list( + "enchanted" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/prototype + name = "prototype" + desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient." + default_skin = "prototype" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5) + resistance_flags = FIRE_PROOF + complexity_max = DEFAULT_MAX_COMPLEXITY + 10 + slowdown_inactive = 2.5 + slowdown_active = 2 + ui_theme = "hackerman" + inbuilt_modules = list(/obj/item/mod/module/kinesis) + skins = list( + "prototype" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/responsory + name = "responsory" + desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." + default_skin = "responsory" + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.5 + slowdown_active = 0 + skins = list( + "responsory" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + "inquisitory" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/apocryphal + name = "apocryphal" + desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." + default_skin = "apocryphal" + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY + 10 + skins = list( + "apocryphal" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, + SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/corporate + name = "corporate" + desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers." + default_skin = "corporate" + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.5 + slowdown_active = 0 + skins = list( + "corporate" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/debug + name = "debug" + desc = "Strangely nostalgic." + default_skin = "debug" + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + complexity_max = 50 + slowdown_inactive = 0.5 + slowdown_active = 0 + skins = list( + "debug" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, + UNSEALED_COVER = HEADCOVERSMOUTH, + SEALED_COVER = HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/administrative + name = "administrative" + desc = "A suit made of adminium. Who comes up with these stupid mineral names?" + default_skin = "debug" + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100) + resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + complexity_max = 1000 + cell_drain = DEFAULT_CELL_DRAIN * 0 + slowdown_inactive = 0 + slowdown_active = 0 + skins = list( + "debug" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + ), + ), + ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm new file mode 100644 index 0000000000000..f12897f7926d4 --- /dev/null +++ b/code/modules/mod/mod_types.dm @@ -0,0 +1,157 @@ +/obj/item/mod/control/pre_equipped + cell = /obj/item/stock_parts/cell/high + var/applied_skin + +/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin) + new_skin = applied_skin + return ..() + +/obj/item/mod/control/pre_equipped/standard + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight) + +/obj/item/mod/control/pre_equipped/engineering + theme = /datum/mod_theme/engineering + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /*/obj/item/mod/module/rad_protection,*/ /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot) + +/obj/item/mod/control/pre_equipped/atmospheric + theme = /datum/mod_theme/atmospheric + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /*/obj/item/mod/module/rad_protection,*/ /obj/item/mod/module/flashlight, /obj/item/mod/module/t_ray) + +/obj/item/mod/control/pre_equipped/advanced + theme = /datum/mod_theme/advanced + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /*/obj/item/mod/module/rad_protection,*/ /obj/item/mod/module/jetpack, /obj/item/mod/module/flashlight) + +/obj/item/mod/control/pre_equipped/mining + theme = /datum/mod_theme/mining + cell = /obj/item/stock_parts/cell/high/plus + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/orebag, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, /obj/item/mod/module/drill) + +/obj/item/mod/control/pre_equipped/medical + theme = /datum/mod_theme/medical + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/quick_carry) + +/obj/item/mod/control/pre_equipped/rescue + theme = /datum/mod_theme/rescue + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector) + +/obj/item/mod/control/pre_equipped/research + theme = /datum/mod_theme/research + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, /obj/item/mod/module/t_ray) + +/obj/item/mod/control/pre_equipped/security + theme = /datum/mod_theme/security + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/safeguard + theme = /datum/mod_theme/safeguard + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/magnate + theme = /datum/mod_theme/magnate + cell = /obj/item/stock_parts/cell/hyper + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder) + +/obj/item/mod/control/pre_equipped/traitor + theme = /datum/mod_theme/syndicate + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/tether, /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock) + +/obj/item/mod/control/pre_equipped/nuclear + theme = /datum/mod_theme/syndicate + cell = /obj/item/stock_parts/cell/hyper + initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/elite + theme = /datum/mod_theme/elite + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/enchanted + theme = /datum/mod_theme/enchanted + cell = /obj/item/stock_parts/cell/crystal_cell/wizard + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield) + +/obj/item/mod/control/pre_equipped/prototype + theme = /datum/mod_theme/prototype + cell = /obj/item/stock_parts/cell/high/plus + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /*/obj/item/mod/module/rad_protection,*/ /obj/item/mod/module/flashlight, /obj/item/mod/module/tether) + +/obj/item/mod/control/pre_equipped/responsory + theme = /datum/mod_theme/responsory + cell = /obj/item/stock_parts/cell/hyper + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + var/insignia_type = /obj/item/mod/module/insignia + +/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin) + initial_modules.Insert(1, insignia_type) + return ..() + +/obj/item/mod/control/pre_equipped/responsory/commander + insignia_type = /obj/item/mod/module/insignia/commander + +/obj/item/mod/control/pre_equipped/responsory/security + insignia_type = /obj/item/mod/module/insignia/security + +/obj/item/mod/control/pre_equipped/responsory/engineer + insignia_type = /obj/item/mod/module/insignia/engineer + +/obj/item/mod/control/pre_equipped/responsory/medic + insignia_type = /obj/item/mod/module/insignia/medic + +/obj/item/mod/control/pre_equipped/responsory/janitor + insignia_type = /obj/item/mod/module/insignia/janitor + +/obj/item/mod/control/pre_equipped/responsory/clown + insignia_type = /obj/item/mod/module/insignia/clown + +/obj/item/mod/control/pre_equipped/responsory/chaplain + insignia_type = /obj/item/mod/module/insignia/chaplain + +/obj/item/mod/control/pre_equipped/responsory/inquisitory + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/anti_magic, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + applied_skin = "inquisitory" + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/commander + insignia_type = /obj/item/mod/module/insignia/commander + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/security + insignia_type = /obj/item/mod/module/insignia/security + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/medic + insignia_type = /obj/item/mod/module/insignia/medic + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain + insignia_type = /obj/item/mod/module/insignia/chaplain + +/obj/item/mod/control/pre_equipped/apocryphal + theme = /datum/mod_theme/apocryphal + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/corporate + theme = /datum/mod_theme/corporate + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/debug + theme = /datum/mod_theme/debug + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/bikehorn, /*/obj/item/mod/module/rad_protection*/, /obj/item/mod/module/tether, /obj/item/mod/module/injector) //one of every type of module, for testing if they all work correctly + +/obj/item/mod/control/pre_equipped/administrative + theme = /datum/mod_theme/administrative + cell = /obj/item/stock_parts/cell/infinite/abductor + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack) + +//these exist for the prefs menu +/obj/item/mod/control/pre_equipped/syndicate_empty + theme = /datum/mod_theme/syndicate + +/obj/item/mod/control/pre_equipped/syndicate_empty/elite + theme = /datum/mod_theme/elite + +INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty) diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm new file mode 100644 index 0000000000000..1e719e93ebe9c --- /dev/null +++ b/code/modules/mod/mod_ui.dm @@ -0,0 +1,80 @@ +/obj/item/mod/control/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MODsuit", name) + ui.open() + +/obj/item/mod/control/ui_data() + var/data = list() + data["interface_break"] = interface_break + data["malfunctioning"] = malfunctioning + data["open"] = open + data["active"] = active + data["locked"] = locked + data["complexity"] = complexity + data["selected_module"] = selected_module?.name + data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant" + data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job" + data["AI"] = ai?.name + data["cell"] = cell?.name + data["charge"] = cell ? round(cell.percent(), 1) : 0 + data["modules"] = list() + for(var/obj/item/mod/module/module as anything in modules) + var/list/module_data = list( + name = module.name, + description = module.desc, + module_type = module.module_type, + active = module.active, + idle_power = module.idle_power_cost, + active_power = module.active_power_cost, + use_power = module.use_power_cost, + complexity = module.complexity, + cooldown_time = module.cooldown_time, + cooldown = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS), + id = module.tgui_id, + ref = REF(module), + configuration_data = module.get_configuration() + ) + module_data += module.add_ui_data() + data["modules"] += list(module_data) + return data + +/obj/item/mod/control/ui_static_data(mob/user) + var/data = list() + data["ui_theme"] = ui_theme + data["control"] = name + data["complexity_max"] = complexity_max + data["helmet"] = helmet?.name + data["chestplate"] = chestplate?.name + data["gauntlets"] = gauntlets?.name + data["boots"] = boots?.name + return data + +/obj/item/mod/control/ui_act(action, params) + . = ..() + if(.) + return + if(!allowed(usr) && locked) + balloon_alert(usr, "insufficient access!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + if(malfunctioning && prob(75)) + balloon_alert(usr, "button malfunctions!") + return + switch(action) + if("lock") + locked = !locked + balloon_alert(usr, "[locked ? "locked" : "unlocked"]!") + if("activate") + toggle_activate(usr) + if("select") + var/obj/item/mod/module/module = locate(params["ref"]) in modules + if(!module) + return + module.on_select() + if("configure") + var/obj/item/mod/module/module = locate(params["ref"]) in modules + if(!module) + return + module.configure_edit(params["key"], params["value"]) + return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm new file mode 100644 index 0000000000000..c57e4f877759b --- /dev/null +++ b/code/modules/mod/modules/_module.dm @@ -0,0 +1,252 @@ +/obj/item/mod/module + name = "MOD module" + icon_state = "module" + /// If it can be removed + var/removable = TRUE + /// If it's passive, togglable, usable or active + var/module_type = MODULE_PASSIVE + /// Is the module active + var/active = FALSE + /// How much space it takes up in the MOD + var/complexity = 0 + /// Power use when idle + var/idle_power_cost = DEFAULT_CELL_DRAIN * 0 + /// Power use when active + var/active_power_cost = DEFAULT_CELL_DRAIN * 0 + /// Power use when used, we call it manually + var/use_power_cost = DEFAULT_CELL_DRAIN * 0 + /// ID used by their TGUI + var/tgui_id + /// Linked MODsuit + var/obj/item/mod/control/mod + /// If we're an active module, what item are we? + var/obj/item/device + /// Overlay given to the user when the module is inactive + var/overlay_state_inactive + /// Overlay given to the user when the module is active + var/overlay_state_active + /// Overlay given to the user when the module is used, lasts until cooldown finishes + var/overlay_state_use + /// What modules are we incompatible with? + var/list/incompatible_modules = list() + /// Cooldown after use + var/cooldown_time = 0 + /// The mouse button needed to use this module + var/used_signal + /// Timer for the cooldown + COOLDOWN_DECLARE(cooldown_timer) + +/obj/item/mod/module/Initialize(mapload) + . = ..() + if(module_type != MODULE_ACTIVE) + return + if(ispath(device)) + device = new device(src) + ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT) + RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion) + RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + +/obj/item/mod/module/Destroy() + mod?.uninstall(src) + if(device) + UnregisterSignal(device, COMSIG_PARENT_PREQDELETED) + QDEL_NULL(device) + return ..() + +/obj/item/mod/module/examine(mob/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + . += "Complexity level: [complexity]" + +/// Called from MODsuit's install() proc, so when the module is installed. +/obj/item/mod/module/proc/on_install() + return + +/// Called from MODsuit's uninstall() proc, so when the module is uninstalled. +/obj/item/mod/module/proc/on_uninstall() + return + +/// Called when the MODsuit is activated +/obj/item/mod/module/proc/on_suit_activation() + return + +/// Called when the MODsuit is deactivated +/obj/item/mod/module/proc/on_suit_deactivation() + return + +/// Called when the MODsuit is equipped +/obj/item/mod/module/proc/on_equip() + return + +/// Called when the MODsuit is unequipped +/obj/item/mod/module/proc/on_unequip() + return + +/// Called when the module is selected from the TGUI +/obj/item/mod/module/proc/on_select() + if(!mod.active || mod.activating || module_type == MODULE_PASSIVE) + return + if(module_type != MODULE_USABLE) + if(active) + on_deactivation() + else + on_activation() + else + on_use() + SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED) + +/// Called when the module is activated +/obj/item/mod/module/proc/on_activation() + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + balloon_alert(mod.wearer, "on cooldown!") + return FALSE + if(!mod.active || mod.activating || !mod.cell?.charge) + balloon_alert(mod.wearer, "unpowered!") + return FALSE + if(module_type == MODULE_ACTIVE) + if(mod.selected_module && !mod.selected_module.on_deactivation()) + return + mod.selected_module = src + if(device) + if(mod.wearer.put_in_hands(device)) + balloon_alert(mod.wearer, "[device] extended") + RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit) + else + balloon_alert(mod.wearer, "can't extend [device]!") + return + else + var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK + update_signal(used_button) + balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") + active = TRUE + COOLDOWN_START(src, cooldown_timer, cooldown_time) + mod.wearer.update_inv_back() + return TRUE + +/// Called when the module is deactivated +/obj/item/mod/module/proc/on_deactivation() + active = FALSE + if(module_type == MODULE_ACTIVE) + mod.selected_module = null + if(device) + mod.wearer.transferItemToLoc(device, src, TRUE) + balloon_alert(mod.wearer, "[device] retracted") + UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED) + else + balloon_alert(mod.wearer, "[src] deactivated") + UnregisterSignal(mod.wearer, used_signal) + used_signal = null + mod.wearer.update_inv_back() + return TRUE + +/// Called when the module is used +/obj/item/mod/module/proc/on_use() + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + return FALSE + if(!check_power(use_power_cost)) + return FALSE + COOLDOWN_START(src, cooldown_timer, cooldown_time) + addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) + mod.wearer.update_inv_back() + return TRUE + +/// Called when an activated module without a device is used +/obj/item/mod/module/proc/on_select_use(atom/target) + mod.wearer.face_atom(target) + if(!on_use()) + return FALSE + return TRUE + +/// Called when an activated module without a device is active and the user alt/middle-clicks +/obj/item/mod/module/proc/on_special_click(mob/source, atom/target) + SIGNAL_HANDLER + on_select_use(target) + return COMSIG_MOB_CANCEL_CLICKON + +/// Called on the MODsuit's process +/obj/item/mod/module/proc/on_process(delta_time) + if(active) + if(!drain_power(active_power_cost * delta_time)) + on_deactivation() + return FALSE + on_active_process(delta_time) + else + drain_power(idle_power_cost * delta_time) + return TRUE + +/// Called on the MODsuit's process if it is an active module +/obj/item/mod/module/proc/on_active_process(delta_time) + return + +/// Drains power from the suit cell +/obj/item/mod/module/proc/drain_power(amount) + if(!check_power(amount)) + return FALSE + mod.cell.charge = max(0, mod.cell.charge - amount) + return TRUE + +/obj/item/mod/module/proc/check_power(amount) + if(!mod.cell || (mod.cell.charge < amount)) + return FALSE + return TRUE + +/// Adds additional things to the MODsuit ui_data() +/obj/item/mod/module/proc/add_ui_data() + return list() + +/// Creates a list of configuring options for this module +/obj/item/mod/module/proc/get_configuration() + return list() + +/// Generates an element of the get_configuration list with a display name, type and value +/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values) + return list("display_name" = display_name, "type" = type, "value" = value, "values" = values) + +/// Receives configure edits from the TGUI and edits the vars +/obj/item/mod/module/proc/configure_edit(key, value) + return + +/// Called when the device moves to a different place on active modules +/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction) + SIGNAL_HANDLER + + if(!active) + return + if(part.loc == src) + return + if(part.loc == mod.wearer) + return + if(part == device) + on_deactivation() + +/// Called when the device gets deleted on active modules +/obj/item/mod/module/proc/on_device_deletion(datum/source) + SIGNAL_HANDLER + + if(source == device) + device = null + qdel(src) + +/// Generates an icon to be used for the suit's worn overlays +/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) + . = list() + var/used_overlay + if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) + used_overlay = overlay_state_use + else if(overlay_state_active && active) + used_overlay = overlay_state_active + else if(overlay_state_inactive) + used_overlay = overlay_state_inactive + else + return + var/mutable_appearance/module_icon = mutable_appearance('icons/mob/clothing/mod.dmi', used_overlay, layer = standing.layer + 0.1) + . += module_icon + +/// Updates the signal used by active modules to be activated +/obj/item/mod/module/proc/update_signal(value) + switch(value) + if(MIDDLE_CLICK) + mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON + if(ALT_CLICK) + mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON + RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm new file mode 100644 index 0000000000000..32261578af50c --- /dev/null +++ b/code/modules/mod/modules/modules.dm @@ -0,0 +1,1775 @@ +/obj/item/mod/module/storage + name = "MOD storage module" + desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \ + the surface of the suit, useful for storing various bits, and or bobs." + icon_state = "storage" + complexity = 3 + incompatible_modules = list(/obj/item/mod/module/storage) + var/datum/component/storage/concrete/storage + var/max_w_class = WEIGHT_CLASS_NORMAL + var/max_combined_w_class = 15 + var/max_items = 7 + +/obj/item/mod/module/storage/Initialize(mapload) + . = ..() + storage = AddComponent(/datum/component/storage/concrete) + storage.max_w_class = max_w_class + storage.max_combined_w_class = max_combined_w_class + storage.max_items = max_items + storage.allow_big_nesting = TRUE + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + +/obj/item/mod/module/storage/on_install() + var/datum/component/storage/modstorage = mod.AddComponent(/datum/component/storage, storage) + modstorage.max_w_class = max_w_class + modstorage.max_combined_w_class = max_combined_w_class + modstorage.max_items = max_items + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + +/obj/item/mod/module/storage/on_uninstall() + var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage) + storage.slaves -= modstorage + qdel(modstorage) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + +/obj/item/mod/module/storage/large_capacity + name = "MOD expanded storage module" + desc = "Reverse engineered by Nakamura Engineering from Donk Corporation designs, this system of hidden compartments \ + is entirely within the suit, distributing items and weight evenly to ensure a comfortable experience for the user; \ + whether smuggling, or simply hauling." + icon_state = "storage_large" + max_combined_w_class = 21 + max_items = 14 + +/obj/item/mod/module/storage/syndicate + name = "MOD syndicate storage module" + desc = "A storage system using nanotechnology developed by Cybersun Industries, these compartments use \ + esoteric technology to compress the physical matter of items put inside of them, \ + essentially shrinking items for much easier and more portable storage." + icon_state = "storage_syndi" + max_combined_w_class = 30 + max_items = 21 + +/obj/item/mod/module/storage/bluespace + name = "MOD bluespace storage module" + desc = "A storage system developed by Nanotrasen, these compartments employ \ + miniaturized bluespace pockets for the ultimate in storage technology; regardless of the weight of objects put inside." + icon_state = "storage_large" + max_w_class = WEIGHT_CLASS_GIGANTIC + max_combined_w_class = 60 + max_items = 21 + +/obj/item/mod/module/visor + name = "MOD visor module" + desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN*0.3 + incompatible_modules = list(/obj/item/mod/module/visor) + cooldown_time = 0.5 SECONDS + var/hud_type + var/list/visor_traits = list() + +/obj/item/mod/module/visor/on_activation() + . = ..() + if(!.) + return + if(hud_type) + var/datum/atom_hud/hud = GLOB.huds[hud_type] + hud.add_hud_to(mod.wearer) + for(var/trait in visor_traits) + ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) + mod.wearer.update_sight() + +/obj/item/mod/module/visor/on_deactivation() + . = ..() + if(!.) + return + if(hud_type) + var/datum/atom_hud/hud = GLOB.huds[hud_type] + hud.remove_hud_from(mod.wearer) + for(var/trait in visor_traits) + REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT) + mod.wearer.update_sight() + +/obj/item/mod/module/visor/medhud + name = "MOD medical visor module" + desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \ + biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \ + access data such as patient files in a convenient readout. They say these also let you see behind you." + icon_state = "medhud_visor" + hud_type = DATA_HUD_MEDICAL_ADVANCED + visor_traits = list(TRAIT_MEDICAL_HUD) + +/obj/item/mod/module/visor/diaghud + name = "MOD diagnostic visor module" + desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \ + from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \ + and integrity of such. They say these also let you see behind you." + icon_state = "diaghud_visor" + hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED + visor_traits = list(TRAIT_DIAGNOSTIC_HUD) + +/obj/item/mod/module/visor/sechud + name = "MOD security visor module" + desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \ + plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \ + and generally know who to shoot. They say these also let you see behind you." + icon_state = "sechud_visor" + hud_type = DATA_HUD_SECURITY_ADVANCED + visor_traits = list(TRAIT_SECURITY_HUD) + +/obj/item/mod/module/visor/meson + name = "MOD meson visor module" + desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \ + technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \ + through walls, regardless of lighting conditions. They say these also let you see behind you." + icon_state = "meson_visor" + visor_traits = list(TRAIT_MESON_VISION, TRAIT_MADNESS_IMMUNE) + +/obj/item/mod/module/visor/thermal + name = "MOD thermal visor module" + desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \ + the thermal radiation output of objects near the user. While it can detect the heat output of even something as \ + small as a rodent, it still produces irritating red overlay. They say these also let you see behind you." + icon_state = "thermal_visor" + visor_traits = list(TRAIT_THERMAL_VISION) + +/obj/item/mod/module/visor/night + name = "MOD night visor module" + desc = "A heads-up display installed into the visor of the suit. Typical for both civilian and military applications, \ + this allows the user to perceive their surroundings while in complete darkness, enhancing the view by tenfold; \ + yet brightening everything into a spooky green glow. They say these also let you see behind you." + icon_state = "night_visor" + visor_traits = list(TRAIT_TRUE_NIGHT_VISION) + +/obj/item/mod/module/welding + name = "MOD welding protection module" + desc = "A module installed into the visor of the suit, this projects a \ + polarized, holographic overlay in front of the user's eyes. It's rated high enough for \ + immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights." + icon_state = "welding" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/welding) + overlay_state_inactive = "module_welding" + +/obj/item/mod/module/welding/on_suit_activation() + mod.helmet.flash_protect = FLASH_PROTECTION_WELDER + +/obj/item/mod/module/welding/on_suit_deactivation() + mod.helmet.flash_protect = initial(mod.helmet.flash_protect) + +/obj/item/mod/module/t_ray + name = "MOD t-ray scan module" + desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \ + to essentially echolocate things beneath the floor, mostly cables and pipes. \ + A staple of atmospherics work, and counter-smuggling work." + icon_state = "tray" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/t_ray) + cooldown_time = 0.5 SECONDS + var/range = 2 + +/obj/item/mod/module/t_ray/on_active_process(delta_time) + t_ray_scan(mod.wearer, 8, range) + +#define HEALTH_SCAN "Health" +//#define WOUND_SCAN "Wound" +#define CHEM_SCAN "Chemical" + +/obj/item/mod/module/health_analyzer + name = "MOD health analyzer module" + desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \ + allowing the user indepth information on the vitals and injuries of others even at a distance, \ + all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \ + but it's up to you to do something with it." + icon_state = "health" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/health_analyzer) + cooldown_time = 0.5 SECONDS + var/mode = HEALTH_SCAN + var/static/list/modes = list(HEALTH_SCAN, CHEM_SCAN) + +/obj/item/mod/module/health_analyzer/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!isliving(target)) + return + switch(mode) + if(HEALTH_SCAN) + healthscan(mod.wearer, target) + //if(WOUND_SCAN) + // woundscan(mod.wearer, target) + if(CHEM_SCAN) + chemscan(mod.wearer, target) + drain_power(use_power_cost) + +/obj/item/mod/module/health_analyzer/get_configuration() + . = ..() + .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) + +/obj/item/mod/module/health_analyzer/configure_edit(key, value) + switch(key) + if("mode") + mode = value + +#undef HEALTH_SCAN +#undef CHEM_SCAN + +/obj/item/mod/module/stealth + name = "MOD prototype cloaking module" + desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \ + to bend light around the user, as well as mimetic materials to make the surface of the suit match the \ + surroundings based off sensor data. For some reason, this tech is rarely seen." + icon_state = "cloak" + module_type = MODULE_TOGGLE + complexity = 4 + active_power_cost = DEFAULT_CELL_DRAIN * 2 + use_power_cost = DEFAULT_CELL_DRAIN * 10 + incompatible_modules = list(/obj/item/mod/module/stealth) + cooldown_time = 5 SECONDS + var/bumpoff = TRUE + var/stealth_alpha = 50 + +/obj/item/mod/module/stealth/on_activation() + . = ..() + if(!.) + return + if(bumpoff) + RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth) + RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack) + RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) + RegisterSignal(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), .proc/unstealth) + animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) + drain_power(use_power_cost) + +/obj/item/mod/module/stealth/on_deactivation() + . = ..() + if(!.) + return + if(bumpoff) + UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) + UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) + animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) + +/obj/item/mod/module/stealth/proc/unstealth(datum/source) + SIGNAL_HANDLER + + to_chat(mod.wearer, "[src] gets discharged from contact!") + do_sparks(2, TRUE, src) + drain_power(use_power_cost) + on_deactivation() + +/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) + SIGNAL_HANDLER + + if(!isliving(target)) + return + unstealth(source) + +/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/projectile/projectile) + SIGNAL_HANDLER + + if(projectile.nodamage) + return + unstealth(source) + +/obj/item/mod/module/stealth/ninja + name = "MOD advanced cloaking module" + desc = "The latest in stealth technology, this module is a definite upgrade over previous versions. \ + The field has been tuned to be even more responsive and fast-acting, with enough stability to \ + continue operation of the field even if the user bumps into others. \ + The draw on the power cell has been reduced drastically, \ + making this perfect for activities like standing near sentry turrets for extended periods of time." + icon_state = "cloak_ninja" + bumpoff = FALSE + stealth_alpha = 20 + active_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CELL_DRAIN * 5 + cooldown_time = 3 SECONDS + +/obj/item/mod/module/jetpack + name = "MOD ion jetpack module" + desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \ + Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \ + charge from the suit's cell. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits." + icon_state = "jetpack" + module_type = MODULE_TOGGLE + complexity = 3 + active_power_cost = DEFAULT_CELL_DRAIN * 0.5 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/jetpack) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_jetpack" + overlay_state_active = "module_jetpack_on" + var/stabilizers = FALSE + var/full_speed = FALSE + var/datum/effect_system/trail_follow/ion/ion_trail + +/obj/item/mod/module/jetpack/Initialize(mapload) + . = ..() + ion_trail = new + ion_trail.auto_process = FALSE + ion_trail.set_up(src) + +/obj/item/mod/module/jetpack/Destroy() + QDEL_NULL(ion_trail) + return ..() + +/obj/item/mod/module/jetpack/on_activation() + . = ..() + if(!.) + return + ion_trail.start() + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/move_react) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move_react) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react) + if(full_speed) + mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) + +/obj/item/mod/module/jetpack/on_deactivation(mob/user) + . = ..() + if(!.) + return + ion_trail.stop() + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE) + if(full_speed) + mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) + +/obj/item/mod/module/jetpack/get_configuration() + . = ..() + .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers) + +/obj/item/mod/module/jetpack/configure_edit(key, value) + switch(key) + if("stabilizers") + stabilizers = text2num(value) + +/obj/item/mod/module/jetpack/proc/move_react(mob/user) + SIGNAL_HANDLER + + if(!active)//If jet dont work, it dont work + return + if(!isturf(mod.wearer.loc))//You can't use jet in nowhere or from mecha/closet + return + if(!(mod.wearer.movement_type & FLOATING) || mod.wearer.buckled)//You don't want use jet in gravity or while buckled. + return + if(mod.wearer.pulledby)//You don't must use jet if someone pull you + return + if(mod.wearer.throwing)//You don't must use jet if you thrown + return + if(user.client && length(user.client.keys_held))//You use jet when press keys. yes. + allow_thrust() + +/obj/item/mod/module/jetpack/proc/pre_move_react(mob/user) + SIGNAL_HANDLER + + ion_trail.oldposition = get_turf(src) + +/obj/item/mod/module/jetpack/proc/spacemove_react(mob/user, movement_dir) + SIGNAL_HANDLER + + if(active && (stabilizers || movement_dir)) + return COMSIG_MOVABLE_STOP_SPACEMOVE + +/obj/item/mod/module/jetpack/proc/allow_thrust() + if(!drain_power(use_power_cost)) + return + ion_trail.generate_effect() + return TRUE + +/obj/item/mod/module/magboot + name = "MOD magnetic stability module" + desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \ + excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \ + However, these basic models do not feature computerized systems to automatically toggle them on and off, \ + so numerous users report a certain stickiness to their steps." + icon_state = "magnet" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/magboot) + cooldown_time = 0.5 SECONDS + var/slowdown_active = 0.5 + +/obj/item/mod/module/magboot/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) + mod.slowdown += slowdown_active + mod.wearer.update_gravity(mod.wearer.has_gravity()) + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/magboot/on_deactivation() + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) + mod.slowdown -= slowdown_active + mod.wearer.update_gravity(mod.wearer.has_gravity()) + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/magboot/advanced + name = "MOD advanced magnetic stability module" + removable = FALSE + complexity = 0 + slowdown_active = 0 + +/obj/item/mod/module/holster + name = "MOD holster module" + desc = "Based off typical storage compartments, this system allows the suit to holster a \ + standard firearm across its surface and allow for extremely quick retrieval. \ + While some users prefer the chest, others the forearm for quick deployment, \ + some law enforcement prefer the holster to extend from the thigh." + icon_state = "holster" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/holster) + cooldown_time = 0.5 SECONDS + var/obj/item/gun/holstered + +/obj/item/mod/module/holster/on_use() + . = ..() + if(!.) + return + if(!holstered) + var/obj/item/gun/holding = mod.wearer.get_active_held_item() + if(!holding) + balloon_alert(mod.wearer, "nothing to holster!") + return + if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) + balloon_alert(mod.wearer, "it doesn't fit!") + return + if(mod.wearer.transferItemToLoc(holding, src, FALSE, FALSE)) + holstered = holding + balloon_alert(mod.wearer, "weapon holstered") + playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) + drain_power(use_power_cost) + else if(mod.wearer.put_in_active_hand(holstered, FALSE, TRUE)) + balloon_alert(mod.wearer, "weapon drawn") + holstered = null + playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) + drain_power(use_power_cost) + else + balloon_alert(mod.wearer, "holster full!") + +/obj/item/mod/module/holster/on_uninstall() + if(holstered) + holstered.forceMove(drop_location()) + holstered = null + +/obj/item/mod/module/holster/Destroy() + QDEL_NULL(holstered) + return ..() + +/obj/item/mod/module/tether + name = "MOD emergency tether module" + desc = "A custom-built grappling-hook powered by a winch capable of hauling the user. \ + While some older models of cargo-oriented grapples have capacities of a few tons, \ + these are only capable of working in zero-gravity environments, a blessing to some Engineers." + icon_state = "tether" + module_type = MODULE_ACTIVE + complexity = 3 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/tether) + cooldown_time = 1.5 SECONDS + +/obj/item/mod/module/tether/on_use() + if(mod.wearer.has_gravity(get_turf(src))) + balloon_alert(mod.wearer, "too much gravity!") + playsound(src, 'sound/weapons/gun_dry_fire.ogg', 25, TRUE) + return FALSE + return ..() + +/obj/item/mod/module/tether/on_select_use(atom/target) + . = ..() + if(!.) + return + var/obj/projectile/tether = new /obj/projectile/tether(mod.wearer.loc) + tether.preparePixelProjectile(target, mod.wearer) + tether.firer = mod.wearer + INVOKE_ASYNC(tether, /obj/projectile.proc/fire) + drain_power(use_power_cost) + +/obj/projectile/tether + name = "tether" + icon_state = "tether_projectile" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + pass_flags = PASSTABLE + damage = 0 + nodamage = TRUE + range = 10 + hitsound = 'sound/weapons/batonextend.ogg' + hitsound_wall = 'sound/weapons/batonextend.ogg' + var/line + +/obj/projectile/tether/fire(setAngle) + if(firer) + line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi') + ..() + +/obj/projectile/tether/on_hit(atom/target) + . = ..() + if(firer) + firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE) + +/obj/projectile/tether/Destroy() + QDEL_NULL(line) + return ..() + +/obj/item/mod/module/mouthhole + name = "MOD eating apparatus module" + desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \ + to allow eating and drinking while retaining protection and atmosphere. \ + However, it will do nothing to improve the taste of a goliath steak." + icon_state = "apparatus" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/mouthhole) + overlay_state_inactive = "module_apparatus" + var/former_flags = NONE + var/former_visor_flags = NONE + +/obj/item/mod/module/mouthhole/on_install() + former_flags = mod.helmet.flags_cover + former_visor_flags = mod.helmet.visor_flags_cover + mod.helmet.flags_cover &= ~HEADCOVERSMOUTH + mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH + +/obj/item/mod/module/mouthhole/on_uninstall() + if(!(former_flags & HEADCOVERSMOUTH)) + mod.helmet.flags_cover |= HEADCOVERSMOUTH + if(!(former_visor_flags & HEADCOVERSMOUTH)) + mod.helmet.visor_flags_cover |= HEADCOVERSMOUTH + +/* +/obj/item/mod/module/rad_protection + name = "MOD radiation protection module" + desc = "A module utilizing polymers and reflective shielding to protect the user against ionizing radiation; \ + a common danger in space. This comes with software to notify the wearer that they're even in a radioactive area, \ + giving a voice to an otherwise silent killer." + icon_state = "radshield" + complexity = 2 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/rad_protection) + tgui_id = "rad_counter" + var/perceived_threat_level + +/obj/item/mod/module/rad_protection/on_suit_activation() + AddComponent(/datum/component/geiger_sound) + ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) + RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation) + for(var/obj/item/part in mod.mod_parts) + ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) + +/obj/item/mod/module/rad_protection/on_suit_deactivation() + qdel(GetComponent(/datum/component/geiger_sound)) + REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) + UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION) + for(var/obj/item/part in mod.mod_parts) + REMOVE_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) + +/obj/item/mod/module/rad_protection/add_ui_data() + . = ..() + .["userradiated"] = mod.wearer ? HAS_TRAIT(mod.wearer, TRAIT_IRRADIATED) : 0 + .["usertoxins"] = mod.wearer ? mod.wearer.getToxLoss() : 0 + .["threatlevel"] = perceived_threat_level + +/obj/item/mod/module/rad_protection/proc/on_pre_potential_irradiation(datum/source, datum/radiation_pulse_information/pulse_information, insulation_to_target) + SIGNAL_HANDLER + + perceived_threat_level = get_perceived_radiation_danger(pulse_information, insulation_to_target) + addtimer(VARSET_CALLBACK(src, perceived_threat_level, null), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE) +*/ + +/obj/item/mod/module/emp_shield + name = "MOD EMP shield module" + desc = "A field inhibitor installed into the suit, protecting it against feedback such as \ + electromagnetic pulses that would otherwise damage the electronic systems of the suit or devices on the wearer. \ + However, it will take from the suit's power to do so. Luckily, your PDA already has one of these." + icon_state = "empshield" + complexity = 1 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/emp_shield) + +/obj/item/mod/module/emp_shield/on_install() + mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + +/obj/item/mod/module/emp_shield/on_uninstall() + mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + +/obj/item/mod/module/flashlight + name = "MOD flashlight module" + desc = "A simple pair of flashlights installed on the left and right sides of the helmet, \ + useful for providing light in a variety of ranges and colors. \ + Some survivalists prefer the color green for their illumination, for reasons unknown." + icon_state = "flashlight" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/flashlight) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_light" + light_system = MOVABLE_LIGHT + light_color = COLOR_WHITE + light_range = 3 + light_power = 1 + light_on = FALSE + var/base_power = DEFAULT_CELL_DRAIN * 0.1 + var/min_range = 2 + var/max_range = 5 + +/obj/item/mod/module/flashlight/on_activation() + . = ..() + if(!.) + return + set_light_flags(light_flags | LIGHT_ATTACHED) + set_light_on(active) + active_power_cost = base_power * light_range + +/obj/item/mod/module/flashlight/on_deactivation() + . = ..() + if(!.) + return + set_light_flags(light_flags & ~LIGHT_ATTACHED) + set_light_on(active) + +/obj/item/mod/module/flashlight/on_process(delta_time) + . = ..() + if(!.) + return + active_power_cost = base_power * light_range + +/obj/item/mod/module/flashlight/generate_worn_overlay(mutable_appearance/standing) + . = ..() + if(!active) + return + var/mutable_appearance/light_icon = mutable_appearance('icons/mob/clothing/mod.dmi', "module_light_on", layer = standing.layer + 0.2) + light_icon.appearance_flags = RESET_COLOR + light_icon.color = light_color + . += light_icon + +/obj/item/mod/module/flashlight/get_configuration() + . = ..() + .["light_color"] = add_ui_configuration("Light Color", "color", light_color) + .["light_range"] = add_ui_configuration("Light Range", "number", light_range) + +/obj/item/mod/module/flashlight/configure_edit(key, value) + switch(key) + if("light_color") + value = input(usr, "Pick new light color", "Flashlight Color") as color|null + if(!value) + return + if(is_color_dark(value, 50)) + balloon_alert(mod.wearer, "too dark!") + return + set_light_color(value) + mod.wearer.update_inv_back() + if("light_range") + set_light_range(clamp(value, min_range, max_range)) + +/obj/item/mod/module/reagent_scanner + name = "MOD reagent scanner module" + desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \ + containers and projecting the information in an easy-to-read format on the wearer's display. \ + It cannot detect flavors, so that's up to you." + icon_state = "scanner" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/reagent_scanner) + cooldown_time = 0.5 SECONDS + +/obj/item/mod/module/reagent_scanner/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) + +/obj/item/mod/module/reagent_scanner/on_deactivation() + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) + +/obj/item/mod/module/reagent_scanner/advanced + name = "MOD advanced reagent scanner module" + complexity = 0 + removable = FALSE + var/explosion_detection_dist = 21 + +/obj/item/mod/module/reagent_scanner/advanced/on_activation() + . = ..() + if(!.) + return + mod.wearer.research_scanner++ + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) + +/obj/item/mod/module/reagent_scanner/advanced/on_deactivation() + . = ..() + if(!.) + return + mod.wearer.research_scanner-- + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) + +/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter, + devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) + SIGNAL_HANDLER + var/turf/wearer_turf = get_turf(mod.wearer) + if(wearer_turf.z != epicenter.z) + return + if(get_dist(epicenter, wearer_turf) > explosion_detection_dist) + return + to_chat(mod.wearer, "Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]") + + +/obj/item/mod/module/dispenser + name = "MOD burger dispenser module" + desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \ + This can draw incredible amounts of power from the suit's cell to create edible organic matter in the \ + palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \ + Notably, all attempts to get it to dispense Earl Grey tea have failed." + icon_state = "dispenser" + module_type = MODULE_USABLE + complexity = 3 + use_power_cost = DEFAULT_CELL_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/dispenser) + cooldown_time = 5 SECONDS + var/dispense_type = /obj/item/food/burger/plain + var/dispense_time = 0 SECONDS + +/obj/item/mod/module/dispenser/on_use() + . = ..() + if(!.) + return + if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod)) + balloon_alert(mod.wearer, "interrupted!") + return + var/obj/item/dispensed = new dispense_type(mod.wearer.loc) + mod.wearer.put_in_hands(dispensed) + balloon_alert(mod.wearer, "[dispensed] dispensed") + playsound(src, 'sound/machines/click.ogg', 100, TRUE) + drain_power(use_power_cost) + +/obj/item/mod/module/gps + name = "MOD internal GPS module" + desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \ + down to the exact coordinates. This information is fed to a central database viewable from the device itself, \ + though using it to help people is up to you." + icon_state = "gps" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + device = /obj/item/gps/mod + incompatible_modules = list(/obj/item/mod/module/gps) + cooldown_time = 0.5 SECONDS + +/obj/item/gps/mod + name = "MOD internal GPS" + desc = "Common Nanotrasen technology that calcaulates the user's position from anywhere in space, down to their coordinates." + icon_state = "gps-b" + gpstag = "MOD0" + +/obj/item/mod/module/constructor + name = "MOD constructor module" + desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \ + advanced arm servos meant to carry crewmembers. However, it functions as an \ + extremely advanced construction hologram scanner, as well as containing the \ + latest engineering schematics combined with inbuilt memory to help the user build walls." + icon_state = "constructor" + module_type = MODULE_USABLE + complexity = 2 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.2 + use_power_cost = DEFAULT_CELL_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) + cooldown_time = 11 SECONDS + +/obj/item/mod/module/constructor/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) + +/obj/item/mod/module/constructor/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) + +/obj/item/mod/module/constructor/on_use() + . = ..() + if(!.) + return + rcd_scan(src, fade_time = 10 SECONDS) + drain_power(use_power_cost) + +/obj/item/mod/module/quick_carry + name = "MOD quick carry module" + desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \ + or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat." + icon_state = "carry" + complexity = 1 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) + +/obj/item/mod/module/quick_carry/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/advanced + name = "MOD advanced quick carry module" + removable = FALSE + complexity = 0 + +/obj/item/mod/module/quick_carry/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) + +/obj/item/mod/module/longfall + name = "MOD longfall module" + desc = "Useful for protecting both the suit and the wearer, \ + utilizing commonplace systems to convert the possible damage from a fall into kinetic charge, \ + as well as internal gyroscopes to ensure the user's safe falling. \ + Useful for mining, monorail tracks, or even skydiving!" + icon_state = "longfall" + complexity = 1 + use_power_cost = DEFAULT_CELL_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/longfall) + +/obj/item/mod/module/longfall/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, .proc/z_impact_react) + +/obj/item/mod/module/longfall/on_suit_deactivation() + UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) + +/obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) + if(!drain_power(use_power_cost*levels)) + return + new /obj/effect/temp_visual/mook_dust(fell_on) + mod.wearer.Stun(levels * 1 SECONDS) + to_chat(mod.wearer, "[src] protects you from the damage!") + return NO_Z_IMPACT_DAMAGE + +/obj/item/mod/module/thermal_regulator + name = "MOD thermal regulator module" + desc = "Advanced climate control, using an inner body glove interwoven with thousands of tiny, \ + flexible cooling lines. This circulates coolant at various user-controlled temperatures, \ + ensuring they're comfortable; even if they're some that like it hot." + icon_state = "regulator" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/thermal_regulator) + cooldown_time = 0.5 SECONDS + var/temperature_setting = BODYTEMP_NORMAL + var/min_temp = 293.15 + var/max_temp = 318.15 + +/obj/item/mod/module/thermal_regulator/get_configuration() + . = ..() + .["temperature_setting"] = add_ui_configuration("Temperature", "number", temperature_setting - T0C) + +/obj/item/mod/module/thermal_regulator/configure_edit(key, value) + switch(key) + if("temperature_setting") + temperature_setting = clamp(value + T0C, min_temp, max_temp) + +/obj/item/mod/module/thermal_regulator/on_active_process(delta_time) + mod.wearer.adjust_bodytemperature(get_temp_change_amount((temperature_setting - mod.wearer.bodytemperature), 0.08 * delta_time)) + +/obj/item/mod/module/injector + name = "MOD injector module" + desc = "A module installed into the wrist of the suit, this functions as a high-capacity syringe, \ + with a tip fine enough to locate the emergency injection ports on any suit of armor, \ + penetrating it with ease. Even yours." + icon_state = "injector" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + device = /obj/item/reagent_containers/syringe/mod + incompatible_modules = list(/obj/item/mod/module/injector) + cooldown_time = 0.5 SECONDS + +/obj/item/reagent_containers/syringe/mod + name = "MOD injector syringe" + desc = "A high-capacity syringe, with a tip fine enough to locate \ + the emergency injection ports on any suit of armor, penetrating it with ease. Even yours." + icon_state = "mod_0" + base_icon_state = "mod" + amount_per_transfer_from_this = 30 + possible_transfer_amounts = list(5, 10, 15, 20, 30) + volume = 30 + //inject_flags = INJECT_CHECK_PENETRATE_THICK + +/obj/item/mod/module/circuit + name = "MOD circuit adapter module" + desc = "A popular aftermarket module, seen in wide varieties with wide applications by those across the galaxy. \ + This is able to fit any sort of integrated circuit, hooking it into controls in the suit and displaying information \ + to the HUD. Useful for universal translation, or perhaps as a calculator." + module_type = MODULE_USABLE + complexity = 3 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/circuit) + cooldown_time = 0.5 SECONDS + var/obj/item/integrated_circuit/circuit + +/obj/item/mod/module/circuit/Initialize(mapload) + . = ..() + circuit = new() + AddComponent(/datum/component/shell, \ + list(new /obj/item/circuit_component/mod()), \ + capacity = SHELL_CAPACITY_LARGE, \ + shell_flags = SHELL_FLAG_CIRCUIT_UNREMOVABLE, \ + starting_circuit = circuit, \ + ) + +/obj/item/mod/module/circuit/on_install() + circuit.set_cell(mod.cell) + +/obj/item/mod/module/circuit/on_uninstall() + circuit.set_cell(mod.cell) + +/obj/item/mod/module/circuit/on_suit_activation() + circuit.set_on(TRUE) + +/obj/item/mod/module/circuit/on_suit_deactivation() + circuit.set_on(FALSE) + +/obj/item/mod/module/circuit/on_use() + . = ..() + if(!.) + return + circuit.interact(mod.wearer) + +/obj/item/circuit_component/mod + display_name = "MOD" + desc = "Used to send and receive signals from a MODsuit." + + var/obj/item/mod/module/attached_module + + var/datum/port/input/module_to_select + var/datum/port/input/toggle_suit + var/datum/port/input/select_module + + var/datum/port/output/wearer + var/datum/port/output/selected_module + +/obj/item/circuit_component/mod/populate_ports() + // Input Signals + module_to_select = add_input_port("Module to Select", PORT_TYPE_STRING) + toggle_suit = add_input_port("Toggle Suit", PORT_TYPE_SIGNAL) + select_module = add_input_port("Select Module", PORT_TYPE_SIGNAL) + // States + wearer = add_output_port("Wearer", PORT_TYPE_ATOM) + selected_module = add_output_port("Selected Module", PORT_TYPE_ATOM) + +/obj/item/circuit_component/mod/register_shell(atom/movable/shell) + if(istype(shell, /obj/item/mod/module)) + attached_module = shell + RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move) + +/obj/item/circuit_component/mod/unregister_shell(atom/movable/shell) + UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) + attached_module = null + +/obj/item/circuit_component/mod/input_received(datum/port/input/port) + var/obj/item/mod/module/module + for(var/obj/item/mod/module/potential_module as anything in attached_module.mod.modules) + if(potential_module.name == module_to_select.value) + module = potential_module + if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) + INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/toggle_activate, attached_module.mod.wearer) + if(module && COMPONENT_TRIGGERED_BY(select_module, port)) + INVOKE_ASYNC(module, /obj/item/mod/module.proc/on_select) + +/obj/item/circuit_component/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + if(istype(source.loc, /obj/item/mod/control)) + RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select) + RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, .proc/equip_check) + equip_check() + else if(istype(old_loc, /obj/item/mod/control)) + UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) + selected_module.set_output(null) + wearer.set_output(null) + +/obj/item/circuit_component/mod/proc/on_module_select() + SIGNAL_HANDLER + selected_module.set_output(attached_module.mod.selected_module) + +/obj/item/circuit_component/mod/proc/equip_check() + SIGNAL_HANDLER + + if(!attached_module.mod?.wearer) + return + wearer.set_output(attached_module.mod.wearer) + +/obj/item/mod/module/clamp + name = "MOD hydraulic clamp module" + desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \ + However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \ + A lot of people would say that loading cargo is a dull job, but you could not disagree more." + icon_state = "clamp" + module_type = MODULE_ACTIVE + complexity = 3 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/clamp) + cooldown_time = 0.5 SECONDS + var/max_crates = 5 + var/list/stored_crates = list() + +/obj/item/mod/module/clamp/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!mod.wearer.Adjacent(target)) + return + if(istype(target, /obj/structure/closet/crate)) + var/atom/movable/picked_crate = target + if(length(stored_crates) >= max_crates) + balloon_alert(mod.wearer, "too many crates!") + return + if(!do_after(mod.wearer, 1 SECONDS, target = target)) + balloon_alert(mod.wearer, "interrupted!") + return + stored_crates += picked_crate + picked_crate.forceMove(src) + balloon_alert(mod.wearer, "picked up [picked_crate]") + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + drain_power(use_power_cost) + else if(length(stored_crates)) + var/turf/target_turf = get_turf(target) + if(target_turf.is_blocked_turf()) + return + if(!do_after(mod.wearer, 1 SECONDS, target = target)) + balloon_alert(mod.wearer, "interrupted!") + return + if(target_turf.is_blocked_turf()) + return + var/atom/movable/dropped_crate = pop(stored_crates) + dropped_crate.forceMove(target_turf) + balloon_alert(mod.wearer, "dropped [dropped_crate]") + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + drain_power(use_power_cost) + +/obj/item/mod/module/bikehorn + name = "MOD bike horn module" + desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \ + precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound." + icon_state = "bikehorn" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/bikehorn) + cooldown_time = 1 SECONDS + +/obj/item/mod/module/bikehorn/on_use() + . = ..() + if(!.) + return + playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) + drain_power(use_power_cost) + +/obj/item/mod/module/drill + name = "MOD drill module" + desc = "An integrated drill, typically extending over the user's hand. While useful for drilling through rock, \ + your drill is surely the one that both pierces and creates the heavens." + icon_state = "drill" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/drill) + cooldown_time = 0.5 SECONDS + +/obj/item/mod/module/drill/on_activation() + . = ..() + if(!.) + return + RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, .proc/bump_mine) + +/obj/item/mod/module/drill/on_deactivation() + . = ..() + if(!.) + return + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP) + +/obj/item/mod/module/drill/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!mod.wearer.Adjacent(target)) + return + if(istype(target, /turf/closed/mineral)) + var/turf/closed/mineral/mineral_turf = target + mineral_turf.gets_drilled(mod.wearer) + drain_power(use_power_cost) + +/obj/item/mod/module/drill/proc/bump_mine(mob/living/carbon/human/bumper, atom/bumped_into, proximity) + SIGNAL_HANDLER + if(!istype(bumped_into, /turf/closed/mineral) || !drain_power(use_power_cost)) + return + var/turf/closed/mineral/mineral_turf = bumped_into + mineral_turf.gets_drilled(mod.wearer) + return COMPONENT_CANCEL_ATTACK_CHAIN + +/obj/item/mod/module/orebag + name = "MOD ore bag module" + desc = "An integrated ore storage system installed into the suit, \ + this utilizes precise electromagnets and storage compartments to automatically collect and deposit ore. \ + It's recommended by Nakamura Engineering to actually deposit that ore at local refineries." + icon_state = "ore" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/orebag) + cooldown_time = 0.5 SECONDS + var/list/ores = list() + +/obj/item/mod/module/orebag/on_equip() + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/ore_pickup) + +/obj/item/mod/module/orebag/on_unequip() + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + +/obj/item/mod/module/orebag/proc/ore_pickup(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + for(var/obj/item/stack/ore/ore in get_turf(mod.wearer)) + INVOKE_ASYNC(src, .proc/move_ore, ore) + playsound(src, "rustle", 50, TRUE) + +/obj/item/mod/module/orebag/proc/move_ore(obj/item/stack/ore) + for(var/obj/item/stack/stored_ore as anything in ores) + if(!ore.can_merge(stored_ore)) + continue + ore.merge(stored_ore) + if(QDELETED(ore)) + return + break + ore.forceMove(src) + ores += ore + +/obj/item/mod/module/orebag/on_use() + . = ..() + if(!.) + return + for(var/obj/item/ore as anything in ores) + ore.forceMove(mod.drop_location()) + ores -= ore + drain_power(use_power_cost) + +/obj/item/mod/module/microwave_beam + name = "MOD microwave beam module" + desc = "An oddly domestic device, this module is installed into the user's palm, \ + hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \ + allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." + icon_state = "microwave_beam" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/microwave_beam) + cooldown_time = 10 SECONDS + +/obj/item/mod/module/microwave_beam/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!istype(target, /obj/item)) + return + if(!isturf(target.loc)) + balloon_alert(mod.wearer, "must be on the floor!") + return + var/obj/item/microwave_target = target + var/datum/effect_system/spark_spread/spark_effect = new() + spark_effect.set_up(2, 1, mod.wearer) + spark_effect.start() + mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) + if(microwave_target.microwave_act()) + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE) + else + balloon_alert(mod.wearer, "can't be microwaved!") + var/datum/effect_system/spark_spread/spark_effect_two = new() + spark_effect_two.set_up(2, 1, microwave_target) + spark_effect_two.start() + drain_power(use_power_cost) + +/obj/item/mod/module/organ_thrower + name = "MOD organ thrower module" + desc = "A device recovered from a crashed Interdyne Pharmaceuticals vessel, \ + this module has been unearthed for better or for worse. \ + It's an arm-mounted device utilizing technology similar to modern-day part replacers, \ + capable of storing and inserting organs into open patients. \ + It's recommended by the DeForest Medical Corporation to not inform patients it has been used." + icon_state = "organ_thrower" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/organ_thrower) + cooldown_time = 0.5 SECONDS + var/max_organs = 5 + var/organ_list = list() + +/obj/item/mod/module/organ_thrower/on_select_use(atom/target) + . = ..() + if(!.) + return + var/mob/living/carbon/human/wearer_human = mod.wearer + if(istype(target, /obj/item/organ)) + if(!wearer_human.Adjacent(target)) + return + var/atom/movable/organ = target + if(length(organ_list) >= max_organs) + balloon_alert(mod.wearer, "too many organs!") + return + organ_list += organ + organ.forceMove(src) + balloon_alert(mod.wearer, "picked up [organ]") + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + drain_power(use_power_cost) + return + if(!length(organ_list)) + return + var/atom/movable/fired_organ = pop(organ_list) + var/obj/projectile/organ/projectile = new /obj/projectile/organ(mod.wearer.loc, fired_organ) + projectile.preparePixelProjectile(target, mod.wearer) + projectile.firer = mod.wearer + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + INVOKE_ASYNC(projectile, /obj/projectile.proc/fire) + drain_power(use_power_cost) + +/obj/projectile/organ + name = "organ" + damage = 0 + nodamage = TRUE + hitsound = 'sound/effects/attackblob.ogg' + hitsound_wall = 'sound/effects/attackblob.ogg' + var/obj/item/organ/organ + +/obj/projectile/organ/Initialize(mapload, obj/item/stored_organ) + . = ..() + if(!stored_organ) + return INITIALIZE_HINT_QDEL + appearance = stored_organ.appearance + stored_organ.forceMove(src) + organ = stored_organ + +/obj/projectile/organ/Destroy() + organ = null + return ..() + +/obj/projectile/organ/on_hit(atom/target) + . = ..() + if(!ishuman(target)) + organ.forceMove(drop_location()) + organ = null + return + var/mob/living/carbon/human/organ_receiver = target + var/succeed = FALSE + if(organ_receiver.surgeries.len) + for(var/datum/surgery/procedure as anything in organ_receiver.surgeries) + if(procedure.location != organ.zone) + continue + if(!istype(procedure, /datum/surgery/organ_manipulation)) + continue + var/datum/surgery_step/surgery_step = procedure.get_surgery_step() + if(!istype(surgery_step, /datum/surgery_step/manipulate_organs)) + continue + succeed = TRUE + break + if(succeed) + var/list/organs_to_boot_out = organ_receiver.getorganslot(organ.slot) + for(var/obj/item/organ/organ_evacced as anything in organs_to_boot_out) + if(organ_evacced.organ_flags & ORGAN_UNREMOVABLE) + continue + organ_evacced.Remove(target) + organ_evacced.forceMove(get_turf(target)) + organ.Insert(target) + else + organ.forceMove(drop_location()) + organ = null + +/obj/item/mod/module/pathfinder + name = "MOD pathfinder module" + desc = "This module, brought to you by Nakamura Engineering, has two components. \ + The first component is a series of thrusters and a computerized location subroutine installed into the \ + very control unit of the suit, allowing it flight at highway speeds, \ + and to be able to locate the second part of the system; \ + a pathfinding implant installed into the base of the user's spine, \ + broadcasting their location to the suit and allowing them to recall it to their back at any time. \ + Nakamura Engineering swears up and down there's airbrakes." + icon_state = "pathfinder" + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 10 + incompatible_modules = list(/obj/item/mod/module/pathfinder) + var/obj/item/implant/mod/implant + +/obj/item/mod/module/pathfinder/Initialize(mapload) + . = ..() + implant = new(src) + +/obj/item/mod/module/pathfinder/Destroy() + implant = null + return ..() + +/obj/item/mod/module/pathfinder/examine(mob/user) + . = ..() + if(implant) + . += "Use it on a human to implant them." + else + . += "The implant is missing." + +/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, params) + if(!ishuman(target) || !implant) + return + if(!do_after(user, 1.5 SECONDS, target = target)) + balloon_alert(user, "interrupted!") + return + if(!implant.implant(target, user)) + balloon_alert(user, "can't implant!") + return + if(target == user) + to_chat(user, "You implant yourself with [implant].") + else + target.visible_message("[user] implants [target].", "[user] implants you with [implant].") + playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) + icon_state = "pathfinder_empty" + implant = null + +/obj/item/mod/module/pathfinder/proc/attach(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/human_user = user + if(human_user.back && !human_user.dropItemToGround(human_user.back)) + return + if(!human_user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + human_user.update_action_buttons(TRUE) + balloon_alert(human_user, "[mod] attached") + playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) + drain_power(use_power_cost) + +/obj/item/implant/mod + name = "MOD pathfinder implant" + desc = "Lets you recall a MODsuit to you at any time." + actions_types = list(/datum/action/item_action/mod_recall) + var/obj/item/mod/module/pathfinder/module + var/image/jet_icon + +/obj/item/implant/mod/Initialize(mapload) + . = ..() + if(!istype(loc, /obj/item/mod/module/pathfinder)) + return INITIALIZE_HINT_QDEL + module = loc + jet_icon = image(icon = 'icons/obj/clothing/modsuit/mod_modules.dmi', icon_state = "mod_jet", layer = LOW_ITEM_LAYER) + +/obj/item/implant/mod/Destroy() + if(module?.mod?.ai_controller) + end_recall(successful = FALSE) + module = null + jet_icon = null + return ..() + +/obj/item/implant/mod/get_data() + var/dat = {"Implant Specifications:
+ Name: Nakamura Engineering Pathfinder Implant
+ Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
"} + return dat + +/obj/item/implant/mod/proc/recall() + if(!module?.mod) + balloon_alert(imp_in, "no connected suit!") + return FALSE + if(module.mod.open) + balloon_alert(imp_in, "suit is open!") + return FALSE + if(module.mod.ai_controller) + balloon_alert(imp_in, "already in transit!") + return FALSE + if(ismob(get_atom_on_turf(module.mod))) + balloon_alert(imp_in, "already on someone!") + return FALSE + if(module.z != z || get_dist(imp_in, module.mod) > MOD_AI_RANGE) + balloon_alert(imp_in, "too far away!") + return FALSE + var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(module.mod) + module.mod.ai_controller = mod_ai + mod_ai.current_movement_target = imp_in + mod_ai.blackboard[BB_MOD_TARGET] = imp_in + mod_ai.blackboard[BB_MOD_IMPLANT] = src + module.mod.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + //module.mod.AddElement(/datum/element/movetype_handler) + //ADD_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) + animate(module.mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) + module.mod.add_overlay(jet_icon) + RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, .proc/on_move) + balloon_alert(imp_in, "suit recalled") + return TRUE + +/obj/item/implant/mod/proc/end_recall(successful = TRUE) + if(!module?.mod) + return + QDEL_NULL(module.mod.ai_controller) + module.mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP + //REMOVE_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) + //module.mod.RemoveElement(/datum/element/movetype_handler) + module.mod.cut_overlay(jet_icon) + module.mod.transform = matrix() + UnregisterSignal(module.mod, COMSIG_MOVABLE_MOVED) + if(!successful) + balloon_alert(imp_in, "suit lost connection!") + +/obj/item/implant/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + var/matrix/mod_matrix = matrix() + mod_matrix.Turn(get_angle(source, imp_in)) + source.transform = mod_matrix + +/datum/action/item_action/mod_recall + name = "Recall MOD" + desc = "Recall a MODsuit anyplace, anytime." + check_flags = AB_CHECK_CONSCIOUS + background_icon_state = "bg_tech_blue" + icon_icon = 'icons/mob/actions/actions_mod.dmi' + button_icon_state = "recall" + COOLDOWN_DECLARE(recall_cooldown) + var/obj/item/implant/mod/implant + +/datum/action/item_action/mod_recall/New(Target) + ..() + implant = Target + +/datum/action/item_action/mod_recall/Trigger() + . = ..() + if(!.) + return + if(!COOLDOWN_FINISHED(src, recall_cooldown)) + implant.balloon_alert(implant.imp_in, "on cooldown!") + return + if(implant.recall()) + COOLDOWN_START(src, recall_cooldown, 15 SECONDS) + +/obj/item/mod/module/dna_lock + name = "MOD DNA lock module" + desc = "A module which engages with the various locks and seals tied to the suit's systems, \ + enabling it to only be worn by someone corresponding with the user's exact DNA profile; \ + however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." + icon_state = "dnalock" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 3 + incompatible_modules = list(/obj/item/mod/module/dna_lock) + cooldown_time = 0.5 SECONDS + var/dna = null + +/obj/item/mod/module/dna_lock/on_install() + RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) + RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp) + RegisterSignal(mod, COMSIG_ATOM_SHOULD_EMAG, .proc/should_emag) + RegisterSignal(mod, COMSIG_ATOM_ON_EMAG, .proc/on_emag) + +/obj/item/mod/module/dna_lock/on_uninstall() + UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) + UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) + UnregisterSignal(mod, COMSIG_ATOM_SHOULD_EMAG) + UnregisterSignal(mod, COMSIG_ATOM_ON_EMAG) + + +/obj/item/mod/module/dna_lock/on_use() + . = ..() + if(!.) + return + dna = mod.wearer.dna.unique_enzymes + balloon_alert(mod.wearer, "dna updated") + drain_power(use_power_cost) + +/obj/item/mod/module/dna_lock/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + on_emp(src, severity) + +/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity) + SIGNAL_HANDLER + + dna = null + +/obj/item/mod/module/dna_lock/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card) + ..() + + dna = null + +/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source) + SIGNAL_HANDLER + + if(!dna || (mod.wearer.has_dna() && mod.wearer.dna.unique_enzymes == dna)) + return + balloon_alert(mod.wearer, "dna locked!") + return MOD_CANCEL_ACTIVATE + +/obj/item/mod/module/armor_booster + name = "MOD armor booster module" + desc = "A retrofitted series of retractable armor plates, allowing the suit to function as essentially power armor, \ + giving the user incredible protection against conventional firearms, or everyday attacks in close-quarters. \ + However, the additional plating cannot deploy alongside parts of the suit used for vacuum sealing, \ + so this extra armor provides zero ability for extravehicular activity while deployed." + icon_state = "armor_booster" + module_type = MODULE_TOGGLE + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/armor_booster) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_armorbooster_off" + overlay_state_active = "module_armorbooster_on" + var/remove_pressure_protection = TRUE + var/added_slowdown = -0.5 + var/list/armor_values = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40) + var/list/spaceproofed = list() + +/obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + overlay_state_active = "[initial(overlay_state_active)]-[mod.skin]" + return ..() + +/obj/item/mod/module/armor_booster/on_activation() + . = ..() + if(!.) + return + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + mod.slowdown += added_slowdown + mod.wearer.update_equipment_speed_mods() + var/list/parts = mod.mod_parts + mod + for(var/obj/item/part as anything in parts) + part.armor = part.armor.modifyRating(arglist(armor_values)) + if(!remove_pressure_protection || !isclothing(part)) + continue + var/obj/item/clothing/clothing_part = part + if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE) + clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE + clothing_part.heat_protection = NONE + clothing_part.cold_protection = NONE + spaceproofed[clothing_part] = TRUE + +/obj/item/mod/module/armor_booster/on_deactivation() + . = ..() + if(!.) + return + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + mod.slowdown -= added_slowdown + mod.wearer.update_equipment_speed_mods() + var/list/parts = mod.mod_parts + mod + var/list/removed_armor = armor_values.Copy() + for(var/armor_type in removed_armor) + removed_armor[armor_type] = -removed_armor[armor_type] + for(var/obj/item/part as anything in parts) + part.armor = part.armor.modifyRating(arglist(removed_armor)) + if(!remove_pressure_protection || !isclothing(part)) + continue + var/obj/item/clothing/clothing_part = part + if(spaceproofed[clothing_part]) + clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE + clothing_part.heat_protection = initial(clothing_part.heat_protection) + clothing_part.cold_protection = initial(clothing_part.cold_protection) + spaceproofed = list() + +/obj/item/mod/module/armor_booster/elite + name = "MOD elite armor booster module" + armor_values = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 60) + added_slowdown = -0.25 + +/obj/item/mod/module/energy_shield + name = "MOD energy shield module" + desc = "A personal, protective forcefield typically seen in military applications. \ + This advanced deflector shield is essentially a scaled down version of those seen on starships, \ + and the power cost can be an easy indicator of this. However, it is capable of blocking nearly any incoming attack, \ + though with its' low amount of separate charges, the user remains mortal." + icon_state = "energy_shield" + complexity = 3 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 + use_power_cost = DEFAULT_CELL_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/energy_shield) + var/max_charges = 3 + var/recharge_start_delay = 20 SECONDS + var/charge_increment_delay = 1 SECONDS + var/charge_recovery = 1 + var/lose_multiple_charges = FALSE + var/recharge_path = null + var/shield_icon_file = 'icons/effects/effects.dmi' + var/shield_icon = "shield-red" + var/charges + +/obj/item/mod/module/energy_shield/Initialize(mapload) + . = ..() + charges = max_charges + +/obj/item/mod/module/energy_shield/on_suit_activation() + mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ + charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon) + RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, .proc/shield_reaction) + +/obj/item/mod/module/energy_shield/on_suit_deactivation() + var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) + charges = shield.current_charges + qdel(shield) + UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) + +/obj/item/mod/module/energy_shield/proc/shield_reaction(mob/living/carbon/human/owner, atom/movable/hitby, damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) + if(SEND_SIGNAL(mod, COMSIG_ITEM_HIT_REACT, owner, hitby, attack_text, 0, damage, attack_type) & COMPONENT_HIT_REACTION_BLOCK) + drain_power(use_power_cost) + return SHIELD_BLOCK + return NONE + +/obj/item/mod/module/energy_shield/wizard + name = "MOD battlemage shield module" + desc = "The caster wielding this spell gains a visible barrier around them, channeling arcane power through \ + specialized runes engraved onto the surface of the suit to generate a wall of force. \ + This shield can perfectly nullify attacks ranging from high-caliber rifles to magic missiles, \ + though can also be drained by more mundane attacks. It will not protect the caster from social ridicule." + icon_state = "battlemage_shield" + idle_power_cost = DEFAULT_CELL_DRAIN * 0 //magic + use_power_cost = DEFAULT_CELL_DRAIN * 0 //magic too + max_charges = 15 + recharge_start_delay = 0 SECONDS + charge_recovery = 8 + shield_icon_file = 'icons/obj/magic.dmi' + shield_icon = "mageshield" + recharge_path = /obj/item/wizard_armour_charge + +/obj/item/mod/module/plasma_stabilizer + name = "MOD plasma stabilizer module" + desc = "This system essentially forms an atmosphere of its' own inside the suit, \ + safely ejecting oxygen from the inside and allowing the wearer, a plasmaman, \ + to have their internal plasma circulate around them somewhat like a sauna. \ + This prevents them from self-igniting, and leads to greater comfort overall. \ + The purple glass of the visor seems to be constructed for nostalgic purposes." + icon_state = "plasma_stabilizer" + complexity = 1 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) + overlay_state_inactive = "module_plasma" + +/obj/item/mod/module/plasma_stabilizer/on_equip() + ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) + +/obj/item/mod/module/plasma_stabilizer/on_unequip() + REMOVE_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) + +/obj/item/mod/module/anti_magic + name = "MOD magic nullifier module" + desc = "A series of obsidian rods installed into critical points around the suit, \ + vibrated at a certain low frequency to enable them to resonate. \ + This creates a low-range, yet strong, magic nullification field around the user, \ + aided by a full replacement of the suit's normal coolant with holy water. \ + Spells will spall right off this field, though it'll do nothing to help others believe you about all this." + icon_state = "magic_nullifier" + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/anti_magic) + +/* +/obj/item/mod/module/anti_magic/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) + +/obj/item/mod/module/anti_magic/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) +*/ + +/obj/item/mod/module/anti_magic/wizard + name = "MOD magic neutralizer module" + desc = "The caster wielding this spell gains an invisible barrier around them, channeling arcane power through \ + specialized runes engraved onto the surface of the suit to generate anti-magic field. \ + The field will neutralize all magic that comes into contact with the user. \ + It will not protect the caster from social ridicule." + icon_state = "magic_neutralizer" + +/obj/item/mod/module/anti_magic/wizard/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) + +/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) + +/obj/item/mod/module/kinesis //TODO POST-MERGE MAKE NOT SUCK ASS, MAKE BALLER AS FUCK + name = "MOD kinesis module" + desc = "A modular plug-in to the forearm, this module was presumed lost for many years, \ + despite the suits it used to be mounted on still seeing some circulation. \ + This piece of technology allows the user to generate precise anti-gravity fields, \ + letting them move objects as small as a titanium rod to as large as industrial machinery. \ + Oddly enough, it doesn't seem to work on living creatures." + icon_state = "kinesis" +// module_type = MODULE_ACTIVE + module_type = MODULE_TOGGLE +// complexity = 3 + complexity = 0 + active_power_cost = DEFAULT_CELL_DRAIN*0.75 +// use_power_cost = DEFAULT_CELL_DRAIN*3 + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/kinesis) + cooldown_time = 0.5 SECONDS + var/has_tk = FALSE + +/obj/item/mod/module/kinesis/on_activation() + . = ..() + if(!.) + return + if(mod.wearer.dna.check_mutation(TK)) + has_tk = TRUE + else + mod.wearer.dna.add_mutation(TK) + +/obj/item/mod/module/kinesis/on_deactivation() + . = ..() + if(!.) + return + if(has_tk) + has_tk = FALSE + return + mod.wearer.dna.remove_mutation(TK) + +/obj/item/mod/module/insignia + name = "MOD insignia module" + desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \ + the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \ + they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \ + color patterns to and from the suit." + icon_state = "insignia" + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/insignia) + overlay_state_inactive = "insignia" + +/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + . = ..() + for(var/mutable_appearance/appearance as anything in .) + appearance.color = color + +/obj/item/mod/module/insignia/commander + color = "#4980a5" + +/obj/item/mod/module/insignia/security + color = "#b30d1e" + +/obj/item/mod/module/insignia/engineer + color = "#e9c80e" + +/obj/item/mod/module/insignia/medic + color = "#ebebf5" + +/obj/item/mod/module/insignia/janitor + color = "#7925c7" + +/obj/item/mod/module/insignia/clown + color = "#ff1fc7" + +/obj/item/mod/module/insignia/chaplain + color = "#f0a00c" diff --git a/code/modules/multiz/movement/mob/living_zfall.dm b/code/modules/multiz/movement/mob/living_zfall.dm index 2c29500be211d..aeb6e115f36d2 100644 --- a/code/modules/multiz/movement/mob/living_zfall.dm +++ b/code/modules/multiz/movement/mob/living_zfall.dm @@ -24,6 +24,8 @@ /// Called when a successful zimpact (landing) occurs /mob/living/proc/ZImpactDamage(turf/T, levels) + if(SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, T) & NO_Z_IMPACT_DAMAGE) + return apply_general_zimpact_damage(T, levels) /// Generic proc for most living things taking fall damage. Will attempt splitting between legs, if the mob has any. diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index b279a252b4716..b0a2b788a3b42 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -217,7 +217,7 @@ AM.forceMove(get_turf(src)) ..() -/obj/machinery/disposal/get_dumping_location(obj/item/storage/source,mob/user) +/obj/machinery/disposal/get_dumping_location() return src //How disposal handles getting a storage dump from a storage object diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index e5235ed83ce38..6a6f7b920a633 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -786,7 +786,7 @@ category = list("Cyborg Upgrade Modules") /datum/design/boris_ai_controller - name = "B.O.R.I.S. AI-Cyborg Remote Control Module" + name = "B.O.R.I.S. AI-Cyborg Remote Control" id = "borg_ai_control" build_type = MECHFAB build_path = /obj/item/borg/upgrade/ai @@ -860,6 +860,341 @@ build_path = /obj/item/assembly/flash/handheld/weak category = list("Misc") +//MODsuit stuff + +/datum/design/mod_shell + name = "MOD shell" + desc = "A 'Nakamura Engineering' designed shell for a Modular Suit." + id = "mod_shell" + build_type = MECHFAB + materials = list(/datum/material/iron = 10000, /datum/material/plasma = 5000) + construction_time = 25 SECONDS + build_path = /obj/item/mod/construction/shell + category = list("MOD Construction") + +/datum/design/mod_helmet + name = "MOD helmet" + desc = "A 'Nakamura Engineering' designed helmet for a Modular Suit." + id = "mod_helmet" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/helmet + category = list("MOD Construction") + +/datum/design/mod_chestplate + name = "MOD chestplate" + desc = "A 'Nakamura Engineering' designed chestplate for a Modular Suit." + id = "mod_chestplate" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/chestplate + category = list("MOD Construction") + +/datum/design/mod_gauntlets + name = "MOD gauntlets" + desc = "'Nakamura Engineering' designed gauntlets for a Modular Suit." + id = "mod_gauntlets" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/gauntlets + category = list("MOD Construction") + +/datum/design/mod_boots + name = "MOD boots" + desc = "'Nakamura Engineering' designed boots for a Modular Suit." + id = "mod_boots" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/boots + category = list("MOD Construction") + +/datum/design/mod_armor + name = "MOD armor" + desc = "External armor for a Modular Suit." + id = "mod_armor_standard" + build_type = MECHFAB|PROTOLATHE + materials = list(/datum/material/iron = 6000, /datum/material/glass = 3000, /datum/material/plasma = 1000) + construction_time = 15 SECONDS + build_path = /obj/item/mod/construction/armor + category = list("MOD Construction", "Equipment") + research_icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' + research_icon_state = "standard-armor" + +/datum/design/mod_armor/New() + . = ..() + var/obj/item/mod/construction/armor/armor_type = build_path + var/datum/mod_theme/theme = GLOB.mod_themes[initial(armor_type.theme)] + name = "MOD [theme.name] armor" + desc = "External armor for a Modular Suit. [theme.desc]" + +/datum/design/mod_armor/engineering + id = "mod_armor_engineering" + build_path = /obj/item/mod/construction/armor/engineering + materials = list(/datum/material/iron = 6000, /datum/material/gold = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + research_icon_state = "engineering-armor" + +/datum/design/mod_armor/atmospheric + id = "mod_armor_atmospheric" + build_path = /obj/item/mod/construction/armor/atmospheric + materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + research_icon_state = "atmospheric-armor" + +/datum/design/mod_armor/medical + id = "mod_armor_medical" + build_path = /obj/item/mod/construction/armor/medical + materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + research_icon_state = "medical-armor" + +/datum/design/mod_armor/security + id = "mod_armor_security" + build_path = /obj/item/mod/construction/armor/security + materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + research_icon_state = "security-armor" + +/datum/design/mod_armor/cosmohonk + id = "mod_armor_cosmohonk" + build_path = /obj/item/mod/construction/armor/cosmohonk + materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + research_icon_state = "cosmohonk-armor" + +/datum/design/mod_paint_kit + name = "MOD paint kit" + desc = "A paint kit for Modular Suits." + id = "mod_paint_kit" + build_type = MECHFAB + materials = list(/datum/material/iron = 1000, /datum/material/plastic = 500) + construction_time = 5 SECONDS + build_path = /obj/item/mod/paint + category = list("Misc") + +/datum/design/module + name = "MOD Module" + build_type = MECHFAB + construction_time = 1 SECONDS + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/mod/module + category = list("MOD Modules") + +/datum/design/module/New() + . = ..() + var/obj/item/mod/module/module = build_path + desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity." + +/datum/design/module/mod_storage + name = "MOD Module: Storage" + id = "mod_storage" + materials = list(/datum/material/iron = 2500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/storage + +/datum/design/module/mod_visor_medhud + name = "MOD Module: Medical Visor" + id = "mod_visor_medhud" + materials = list(/datum/material/silver = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/medhud + +/datum/design/module/mod_visor_diaghud + name = "MOD Module: Diagnostic Visor" + id = "mod_visor_diaghud" + materials = list(/datum/material/gold = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/diaghud + +/datum/design/module/mod_visor_sechud + name = "MOD Module: Security Visor" + id = "mod_visor_sechud" + materials = list(/datum/material/titanium = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/sechud + +/datum/design/module/mod_visor_meson + name = "MOD Module: Meson Visor" + id = "mod_visor_meson" + materials = list(/datum/material/uranium = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/meson + +/datum/design/module/mod_visor_welding + name = "MOD Module: Welding Protection" + id = "mod_welding" + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/welding + +/datum/design/module/mod_t_ray + name = "MOD Module: T-Ray Scanner" + id = "mod_t_ray" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/t_ray + +/datum/design/module/mod_health_analyzer + name = "MOD Module: Health Analyzer" + id = "mod_health_analyzer" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/health_analyzer + +/datum/design/module/mod_stealth + name = "MOD Module: Cloak" + id = "mod_stealth" + materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500) + build_path = /obj/item/mod/module/stealth + +/datum/design/module/mod_jetpack + name = "MOD Module: Ion Jetpack" + id = "mod_jetpack" + materials = list(/datum/material/iron = 1500, /datum/material/plasma = 1000) + build_path = /obj/item/mod/module/jetpack + +/datum/design/module/mod_magboot + name = "MOD Module: Magnetic Stabilizator" + id = "mod_magboot" + materials = list(/datum/material/iron = 1000, /datum/material/gold = 500) + build_path = /obj/item/mod/module/magboot + +/datum/design/module/mod_holster + name = "MOD Module: Holster" + id = "mod_holster" + materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/holster + +/datum/design/module/mod_tether + name = "MOD Module: Emergency Tether" + id = "mod_tether" + materials = list(/datum/material/iron = 1000, /datum/material/silver = 500) + build_path = /obj/item/mod/module/tether + +/datum/design/module/mod_mouthhole + name = "MOD Module: Eating Apparatus" + id = "mod_mouthhole" + materials = list(/datum/material/iron = 1500) + build_path = /obj/item/mod/module/mouthhole + +/* +/datum/design/module/mod_rad_protection + name = "MOD Module: Radiation Protection" + id = "mod_rad_protection" + materials = list(/datum/material/iron = 1000, /datum/material/uranium = 1000) + build_path = /obj/item/mod/module/rad_protection +*/ + +/datum/design/module/mod_emp_shield + name = "MOD Module: EMP Shield" + id = "mod_emp_shield" + materials = list(/datum/material/iron = 1000, /datum/material/plasma = 1000) + build_path = /obj/item/mod/module/emp_shield + +/datum/design/module/mod_flashlight + name = "MOD Module: Flashlight" + id = "mod_flashlight" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/flashlight + +/datum/design/module/mod_reagent_scanner + name = "MOD Module: Reagent Scanner" + id = "mod_reagent_scanner" + materials = list(/datum/material/glass = 1000) + build_path = /obj/item/mod/module/reagent_scanner + +/datum/design/module/mod_gps + name = "MOD Module: Internal GPS" + id = "mod_gps" + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/gps + +/datum/design/module/mod_constructor + name = "MOD Module: Constructor" + id = "mod_constructor" + materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) + build_path = /obj/item/mod/module/constructor + +/datum/design/module/mod_quick_carry + name = "MOD Module: Quick Carry" + id = "mod_quick_carry" + materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) + build_path = /obj/item/mod/module/quick_carry + +/datum/design/module/mod_longfall + name = "MOD Module: Longfall" + id = "mod_longfall" + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/mod/module/longfall + +/datum/design/module/mod_thermal_regulator + name = "MOD Module: Thermal Regulator" + id = "mod_thermal_regulator" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/thermal_regulator + +/datum/design/module/mod_injector + name = "MOD Module: Injector" + id = "mod_injector" + materials = list(/datum/material/iron = 1000, /datum/material/diamond = 500) + build_path = /obj/item/mod/module/injector + +/datum/design/module/mod_microwave_beam + name = "MOD Module: Microwave Beam" + id = "mod_microwave_beam" + materials = list(/datum/material/iron = 1000, /datum/material/uranium = 500) + build_path = /obj/item/mod/module/microwave_beam + +/datum/design/module/mod_bikehorn + name = "MOD Module: Bike Horn" + id = "mod_bikehorn" + materials = list(/datum/material/plastic = 500, /datum/material/iron = 500) + build_path = /obj/item/mod/module/bikehorn + +/datum/design/module/mod_clamp + name = "MOD Module: Crate Clamp" + id = "mod_clamp" + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/mod/module/clamp + +/datum/design/module/mod_drill + name = "MOD Module: Drill" + id = "mod_drill" + materials = list(/datum/material/silver = 1000, /datum/material/iron = 2000) + build_path = /obj/item/mod/module/drill + +/datum/design/module/mod_orebag + name = "MOD Module: Ore Bag" + id = "mod_orebag" + materials = list(/datum/material/iron = 1500) + build_path = /obj/item/mod/module/orebag + +/datum/design/module/mod_organ_thrower + name = "MOD Module: Organ Thrower" + id = "mod_organ_thrower" + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/organ_thrower + +/datum/design/module/mod_pathfinder + name = "MOD Module: Pathfinder" + id = "mod_pathfinder" + materials = list(/datum/material/uranium = 1000, /datum/material/iron = 1000) + build_path = /obj/item/mod/module/pathfinder + +/datum/design/module/mod_dna_lock + name = "MOD Module: DNA Lock" + id = "mod_dna_lock" + materials = list(/datum/material/diamond = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/dna_lock + +/datum/design/module/mod_circuit + name = "MOD Module: Circuit Adapter" + id = "mod_circuit" + materials = list(/datum/material/glass = 2000) + build_path = /obj/item/mod/module/circuit + +/datum/design/module/mod_plasma_stabilizer + name = "MOD Module: Plasma Stabilizer" + id = "mod_plasma" + materials = list(/datum/material/plasma = 1000, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/plasma_stabilizer + // IPC Replacement Parts /datum/design/robotic_liver diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index c09d4bc52451f..2211b6c8ecf06 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -114,6 +114,29 @@ "ripleyupgrade", ) +/datum/techweb_node/mod_basic + id = "mod" + tech_tier = 1 + starting_node = TRUE + display_name = "Basic Modular Suits" + description = "Specialized back mounted power suits with various different modules." + design_ids = list( + "mod_armor_standard", + "mod_boots", + "mod_chestplate", + "mod_gauntlets", + "mod_helmet", + "mod_paint_kit", + "mod_shell", + "mod_storage", + "mod_welding", + "mod_mouthhole", + "mod_flashlight", + "mod_longfall", + "mod_thermal_regulator", + "mod_plasma", + ) + /datum/techweb_node/mech_tools id = "mech_tools" tech_tier = 1 @@ -1823,6 +1846,102 @@ research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 +//MODsuit tech + +/datum/techweb_node/mod_advanced + id = "mod_advanced" + tech_tier = 5 + display_name = "Advanced Modular Suits" + description = "More advanced modules, to improve modular suits." + prereq_ids = list("robotics") + design_ids = list( + "mod_visor_diaghud", + "mod_stealth", + "mod_holster", + "mod_gps", + "mod_reagent_scanner", + "mod_clamp", + "mod_drill", + "mod_orebag", + "mod_pathfinder", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_engineering + id = "mod_engineering" + tech_tier = 2 + display_name = "Engineering Modular Suits" + description = "Engineering suits, for powered engineers." + prereq_ids = list("mod_advanced", "engineering") + design_ids = list( + "mod_armor_engineering", + "mod_visor_meson", + "mod_t_ray", + "mod_magboot", + "mod_tether", + "mod_constructor", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_advanced_engineering + id = "mod_advanced_engineering" + tech_tier = 5 + display_name = "Advanced Engineering Modular Suits" + description = "Advanced Engineering suits, for advanced powered engineers." + prereq_ids = list("mod_engineering", "adv_engi") + design_ids = list( + "mod_armor_atmospheric", + "mod_jetpack", + "mod_rad_protection", + "mod_emp_shield", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + +/datum/techweb_node/mod_medical + id = "mod_medical" + tech_tier = 3 + display_name = "Medical Modular Suits" + description = "Medical suits for quick rescue purposes." + prereq_ids = list("mod_advanced", "biotech") + design_ids = list( + "mod_armor_medical", + "mod_visor_medhud", + "mod_health_analyzer", + "mod_quick_carry", + "mod_injector", + "mod_organ_thrower", + "mod_dna_lock", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_security + id = "mod_security" + tech_tier = 3 + display_name = "Security Modular Suits" + description = "Security suits for space crime handling." + prereq_ids = list("mod_advanced", "sec_basic") + design_ids = list( + "mod_armor_security", + "mod_visor_sechud", + "mod_stealth", + "mod_holster", + "mod_pathfinder", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_entertainment + id = "mod_entertainment" + tech_tier = 2 + display_name = "Entertainment Modular Suits" + description = "Powered suits for protection against low-humor environments." + prereq_ids = list("mod_advanced", "clown") + design_ids = list( + "mod_armor_cosmohonk", + "mod_bikehorn", + "mod_microwave_beam", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + ////////////////////////mech technology//////////////////////// /datum/techweb_node/adv_mecha id = "adv_mecha" diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index fea81998002e5..02cc872c1ca69 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -9,11 +9,15 @@ default_raw_text = "*Damage Report*

Alpha Station - Destroyed

Beta Station - Catastrophic Damage. Medical, destroyed. Atmospherics, partially destroyed. Engine Core, destroyed.

Charlie Station - Intact. Loss of oxygen to eastern side of main corridor.

Delta Station - Intact. WARNING: Unknown force occupying Delta Station. Intent unknown. Species unknown. Numbers unknown.

Recommendation - Reestablish station powernet via solar array. Reestablish station atmospherics system to restore air." /obj/item/paper/fluff/ruins/oldstation/protosuit - name = "B01-RIG Hardsuit Report" - default_raw_text = "*Prototype Hardsuit*

The B01-RIG Hardsuit is a prototype powered exoskeleton. Based off of a recovered pre-void war era united Earth government powered military \ - exosuit, the RIG Hardsuit is a breakthrough in Hardsuit technology, and is the first post-void war era Hardsuit that can be safely used by an operator.

The B01 however suffers \ - a myriad of constraints. It is slow and bulky to move around, it lacks any significant armor plating against direct attacks and its internal heads up display is unfinished, \ - resulting in the user being unable to see long distances.

The B01 is unlikely to see any form of mass production, but will serve as a base for future Hardsuit developments." + name = "B01-MOD modular suit Report" + default_raw_text = "*Prototype MODsuit*

This is a prototype powered exoskeleton, a design not seen in hundreds of years, \ + the first post-void war era modular suit to ever be safely utilized by an operator. \ + This ancient clunker is still functional, though it's missing several modern-day luxuries from \ + updated Nakamura Engineering designs. Primarily, the suit's myoelectric suit layer is entirely non-existant, \ + and the servos do very little to help distribute the weight evenly across the wearer's body, \ + making it slow and bulky to move in. Additionally, the armor plating never finished production aside from the shoulders, \ + forearms, and helmet; making it useless against direct attacks. The internal heads-up display is rendered entirely in \ + monochromatic cyan, leaving the user unable to see long distances. However, the way the helmet retracts is pretty cool." /obj/item/paper/fluff/ruins/oldstation/protohealth name = "Health Analyser Report" @@ -51,3 +55,116 @@ /obj/item/paper/fluff/ruins/oldstation/generator_manual name = "S.U.P.E.R.P.A.C.M.A.N.-type portable generator manual" default_raw_text = "You can barely make out a faded sentence...

Wrench down the generator on top of a wire node connected to either a SMES input terminal or the power grid." + +/obj/machinery/mod_installer + name = "modular outerwear device installator" + desc = "An ancient machine that mounts a MOD unit onto the occupant." + icon = 'icons/obj/machines/mod_installer.dmi' + icon_state = "mod_installer" + base_icon_state = "mod_installer" + layer = ABOVE_WINDOW_LAYER + use_power = IDLE_POWER_USE + anchored = TRUE + density = TRUE + //obj_flags = NO_BUILD // Becomes undense when the door is open + idle_power_usage = 50 + active_power_usage = 300 + + var/busy = FALSE + var/busy_icon_state + + var/obj/item/mod/control/mod_unit = /obj/item/mod/control/pre_equipped/prototype + + COOLDOWN_DECLARE(message_cooldown) + +/obj/machinery/mod_installer/Initialize(mapload) + . = ..() + occupant_typecache = typecacheof(/mob/living/carbon/human) + if(ispath(mod_unit)) + mod_unit = new mod_unit() + +/obj/machinery/mod_installer/Destroy() + QDEL_NULL(mod_unit) + return ..() + +/obj/machinery/mod_installer/proc/set_busy(status, working_icon) + busy = status + busy_icon_state = working_icon + update_appearance() + +/obj/machinery/mod_installer/proc/play_install_sound() + playsound(src, 'sound/items/rped.ogg', 30, FALSE) + +/obj/machinery/mod_installer/update_icon_state() + icon_state = busy ? busy_icon_state : "[base_icon_state][state_open ? "_open" : null]" + return ..() + +/obj/machinery/mod_installer/update_overlays() + var/list/overlays = ..() + if(machine_stat & (NOPOWER|BROKEN)) + return overlays + overlays += busy ? "red" : "green" + return overlays + +/obj/machinery/mod_installer/proc/start_process() + if(machine_stat & (NOPOWER|BROKEN)) + return + if(!occupant || !mod_unit || busy) + return + set_busy(TRUE, "[initial(icon_state)]_raising") + addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS) + addtimer(CALLBACK(src, .proc/play_install_sound), 2.5 SECONDS) + addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"), 5 SECONDS) + addtimer(CALLBACK(src, .proc/complete_process), 7.5 SECONDS) + +/obj/machinery/mod_installer/proc/complete_process() + set_busy(FALSE) + var/mob/living/carbon/human/human_occupant = occupant + if(!istype(human_occupant)) + return + if(!human_occupant.dropItemToGround(human_occupant.back)) + return + if(!human_occupant.equip_to_slot_if_possible(mod_unit, mod_unit.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + human_occupant.update_action_buttons(TRUE) + playsound(src, 'sound/machines/ping.ogg', 30, FALSE) + if(!human_occupant.dropItemToGround(human_occupant.wear_suit) || !human_occupant.dropItemToGround(human_occupant.head)) + open_machine() + return + mod_unit.quick_activation() + open_machine() + +/obj/machinery/mod_installer/open_machine() + if(state_open) + return FALSE + ..() + return TRUE + +/obj/machinery/mod_installer/close_machine(mob/living/carbon/user) + if(!state_open) + return FALSE + ..() + addtimer(CALLBACK(src, .proc/start_process), 1 SECONDS) + return TRUE + +/obj/machinery/mod_installer/relaymove(mob/living/user, direction) + var/message + if(busy) + message = "it won't budge!" + else if(user.stat != CONSCIOUS) + message = "you don't have the energy!" + if(!isnull(message)) + if (COOLDOWN_FINISHED(src, message_cooldown)) + COOLDOWN_START(src, message_cooldown, 5 SECONDS) + balloon_alert(user, message) + return + open_machine() + +/obj/machinery/mod_installer/interact(mob/user) + if(state_open) + close_machine(null, user) + return + else if(busy) + balloon_alert(user, "it's locked!") + return + open_machine() diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/assassination.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/assassination.dm index a4d0296d83e79..81e093ded5971 100644 --- a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/assassination.dm +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/assassination.dm @@ -58,7 +58,7 @@ created_human.flavor_text = "You are a Syndicate operative employed by Cybersun Industries, currently scavenging for valuable resources in the wrecks of Nanotrasen Derelicts. \ However, upon being dropped off for your shift, the shuttle that flew you onboard was shot down by Nanotrasen's forces. You know it's only a matter of time before they find you..." created_human.equipOutfit(/datum/outfit/vip_target/vip_operative) - suit_type = /obj/item/clothing/suit/space/hardsuit/cybersun //On par with the explorer suit, nothing too wacky. + //suit_type = /obj/item/clothing/suit/space/hardsuit/cybersun //On par with the explorer suit, nothing too wacky. mask_type = /obj/item/clothing/mask/gas/syndicate if("funnyman") created_human.flavor_text = "Slip, slip, slip! Your PDA's brought a lot of laughs to this crew, but now that they're - and it's - gone, the Head Of Security's threats are \ diff --git a/code/modules/spells/spell.dm b/code/modules/spells/spell.dm index 2fde72224504b..549fb0ca47428 100644 --- a/code/modules/spells/spell.dm +++ b/code/modules/spells/spell.dm @@ -117,7 +117,6 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used var/clothes_req = TRUE //see if it requires clothes - var/cult_req = FALSE //SPECIAL SNOWFLAKE clothes required for cult only spells var/human_req = FALSE //spell can only be cast by humans var/nonabstract_req = FALSE //spell can only be cast by mobs that are physical entities var/stat_allowed = FALSE //see if it requires being conscious/alive, need to set to 1 for ghostpells @@ -212,24 +211,24 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th var/mob/living/carbon/human/H = user + var/static/list/casting_clothes = typecacheof(list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/head/wizard)) + if((invocation_type == "whisper" || invocation_type == "shout") && !H.can_speak_vocal()) to_chat(user, "You can't get the words out!") return FALSE if(clothes_req) //clothes check - if(!is_type_in_typecache(H.wear_suit, casting_clothes)) + var/passes_req = FALSE + if(istype(H.back, /obj/item/mod/control)) + var/obj/item/mod/control/mod = H.back + if(istype(mod.theme, /datum/mod_theme/enchanted)) + passes_req = TRUE + if(!passes_req && !is_type_in_typecache(H.wear_suit, casting_clothes)) to_chat(H, "I don't feel strong enough without my robe.") return FALSE - if(!is_type_in_typecache(H.head, casting_clothes)) + if(!passes_req && !is_type_in_typecache(H.head, casting_clothes)) to_chat(H, "I don't feel strong enough without my hat.") return FALSE - if(cult_req) //CULT_REQ CLOTHES CHECK - if(!istype(H.wear_suit, /obj/item/clothing/suit/magusred) && !istype(H.wear_suit, /obj/item/clothing/suit/hooded/cultrobes)) - to_chat(H, "I don't feel strong enough without my armor.") - return FALSE - if(!istype(H.head, /obj/item/clothing/head/wizard/magus) && !istype(H.head, /obj/item/clothing/head/hooded/cult_hoodie)) - to_chat(H, "I don't feel strong enough without my helmet.") - return FALSE else if(clothes_req || human_req) to_chat(user, "This spell can only be cast by humans!") @@ -290,9 +289,7 @@ GLOBAL_LIST_INIT(spells, typesof(/obj/effect/proc_holder/spell)) //needed for th casting_clothes_base = typecacheof(list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/suit/space/hardsuit/wizard, /obj/item/clothing/head/wizard, - /obj/item/clothing/head/helmet/space/hardsuit/wizard, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, - /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard)) + /obj/item/clothing/head/helmet/space/hardsuit/wizard)) casting_clothes = casting_clothes_base diff --git a/code/modules/spells/spell_types/rightandwrong.dm b/code/modules/spells/spell_types/rightandwrong.dm index 7e5371b6d878a..42962afd08659 100644 --- a/code/modules/spells/spell_types/rightandwrong.dm +++ b/code/modules/spells/spell_types/rightandwrong.dm @@ -71,7 +71,6 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/scrying, /obj/item/voodoo, /obj/item/warpwhistle, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/immortality_talisman, /obj/item/melee/ghost_sword)) @@ -88,7 +87,6 @@ GLOBAL_LIST_INIT(summoned_special_magic, list( GLOBAL_LIST_INIT(summoned_magic_objectives, list( /obj/item/antag_spawner/contract, /obj/item/blood_contract, - /obj/item/clothing/suit/space/hardsuit/shielded/wizard, /obj/item/gun/magic, /obj/item/immortality_talisman, /obj/item/melee/ghost_sword, diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index eca93f0723ede..5c79d977cb021 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -175,6 +175,12 @@ allow_thrust(THRUST_REQUIREMENT_SPACEMOVE) +/obj/item/organ/cyberimp/chest/thrusters/proc/spacemove_react(mob/user, movement_dir) + SIGNAL_HANDLER + + if(on && movement_dir) + return COMSIG_MOVABLE_STOP_SPACEMOVE + /obj/item/organ/cyberimp/chest/thrusters/proc/allow_thrust(num, use_fuel = TRUE) if(!on || !owner) return 0 diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 89679c50c9ae9..e8f07de361fbe 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -113,6 +113,7 @@ #include "merge_type.dm" #include "metabolizing.dm" #include "missing_icons.dm" +#include "modsuit.dm" #include "ntnetwork_tests.dm" #include "preference_species.dm" #include "projectiles.dm" diff --git a/code/modules/unit_tests/modsuit.dm b/code/modules/unit_tests/modsuit.dm new file mode 100644 index 0000000000000..3795a55eab752 --- /dev/null +++ b/code/modules/unit_tests/modsuit.dm @@ -0,0 +1,25 @@ +/// Checks all pre-equipped MODsuit paths to see if they have something set wrong. +/datum/unit_test/modsuit_checks + +/datum/unit_test/modsuit_checks/Run() + var/list/paths = typesof(/obj/item/mod/control/pre_equipped) + + for(var/modpath in paths) + var/obj/item/mod/control/mod = new modpath() + TEST_ASSERT(mod.theme, "[modpath] spawned without a theme.") + TEST_ASSERT(mod.helmet, "[modpath] spawned without a helmet.") + TEST_ASSERT(mod.chestplate, "[modpath] spawned without a chestplate.") + TEST_ASSERT(mod.gauntlets, "[modpath] spawned without gauntlets.") + TEST_ASSERT(mod.boots, "[modpath] spawned without boots.") + var/list/modules = list() + var/complexity_max = mod.complexity_max + var/complexity = 0 + for(var/obj/item/mod/module/module as anything in mod.initial_modules) + module = new module() + complexity += module.complexity + TEST_ASSERT(complexity <= complexity_max, "[modpath] starting modules reach above max complexity.") + TEST_ASSERT(!is_type_in_list(module, mod.theme.module_blacklist), "[modpath] starting modules are in [mod.theme.type] blacklist.") + for(var/obj/item/mod/module/module_to_check as anything in modules) + TEST_ASSERT(!is_type_in_list(module, module_to_check.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]") + TEST_ASSERT(!is_type_in_list(module_to_check, module.incompatible_modules), "[modpath] initial module [module.type] is incompatible with initial module [module_to_check.type]") + modules += module diff --git a/code/modules/unit_tests/outfit_sanity.dm b/code/modules/unit_tests/outfit_sanity.dm new file mode 100644 index 0000000000000..1877d946c83b3 --- /dev/null +++ b/code/modules/unit_tests/outfit_sanity.dm @@ -0,0 +1,51 @@ +#define CHECK_OUTFIT_SLOT(outfit_key, slot_name) if (outfit.##outfit_key) { \ + H.equip_to_slot_or_del(new outfit.##outfit_key(H), ##slot_name, TRUE); \ + /* We don't check the result of equip_to_slot_or_del because it returns false for random jumpsuits, as they delete themselves on init */ \ + var/obj/item/outfit_item = H.get_item_by_slot(##slot_name); \ + if (!outfit_item) { \ + Fail("[outfit.name]'s [#outfit_key] is invalid! Could not equip a [outfit.##outfit_key] into that slot."); \ + } \ + outfit_item.on_outfit_equip(H, FALSE, ##slot_name); \ +} + +/datum/unit_test/outfit_sanity/Run() + var/mob/living/carbon/human/H = allocate(/mob/living/carbon/human) + + for (var/outfit_type in subtypesof(/datum/outfit)) + // Only make one human and keep undressing it because it's much faster + for (var/obj/item/I in H.get_equipped_items(include_pockets = TRUE)) + qdel(I) + + var/datum/outfit/outfit = new outfit_type + outfit.pre_equip(H, TRUE) + + CHECK_OUTFIT_SLOT(uniform, ITEM_SLOT_ICLOTHING) + CHECK_OUTFIT_SLOT(suit, ITEM_SLOT_OCLOTHING) + CHECK_OUTFIT_SLOT(belt, ITEM_SLOT_BELT) + CHECK_OUTFIT_SLOT(gloves, ITEM_SLOT_GLOVES) + CHECK_OUTFIT_SLOT(shoes, ITEM_SLOT_FEET) + CHECK_OUTFIT_SLOT(head, ITEM_SLOT_HEAD) + CHECK_OUTFIT_SLOT(mask, ITEM_SLOT_MASK) + CHECK_OUTFIT_SLOT(neck, ITEM_SLOT_NECK) + CHECK_OUTFIT_SLOT(ears, ITEM_SLOT_EARS) + CHECK_OUTFIT_SLOT(glasses, ITEM_SLOT_EYES) + CHECK_OUTFIT_SLOT(back, ITEM_SLOT_BACK) + CHECK_OUTFIT_SLOT(id, ITEM_SLOT_ID) + CHECK_OUTFIT_SLOT(l_pocket, ITEM_SLOT_LPOCKET) + CHECK_OUTFIT_SLOT(r_pocket, ITEM_SLOT_RPOCKET) + CHECK_OUTFIT_SLOT(suit_store, ITEM_SLOT_SUITSTORE) + if (outfit.backpack_contents || outfit.box) + var/list/backpack_contents = outfit.backpack_contents?.Copy() + if (outfit.box) + if (!backpack_contents) + backpack_contents = list() + backpack_contents.Insert(1, outfit.box) + backpack_contents[outfit.box] = 1 + + for (var/path in backpack_contents) + var/number = backpack_contents[path] || 1 + for (var/_ in 1 to number) + if (!H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE)) + Fail("[outfit.name]'s backpack_contents are invalid! Couldn't add [path] to backpack.") + +#undef CHECK_OUTFIT_SLOT diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index a2690fdc500e9..4c28ac47b9d9a 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1612,17 +1612,14 @@ GLOBAL_LIST_INIT(illegal_tech_blacklist, typecacheof(list( item = /obj/item/storage/box/syndie_kit/space cost = 3 -/datum/uplink_item/suits/hardsuit - name = "Syndicate Hardsuit" - desc = "The feared suit of a Syndicate nuclear agent. Features slightly better armoring, a built in jetpack \ - that runs off standard atmospheric tanks and an advanced team location system. Toggling the suit in and out of \ - combat mode will allow you all the mobility of a loose fitting uniform without sacrificing armoring. \ - Additionally the suit is collapsible, making it small enough to fit within a backpack. \ - Nanotrasen crew who spot these suits are known to panic." - item = /obj/item/clothing/suit/space/hardsuit/syndi +/datum/uplink_item/suits/modsuit + name = "Syndicate MODsuit" + desc = "The feared MODsuit of a Syndicate agent. Features armoring and a set of inbuilt modules." + item = /obj/item/mod/control/pre_equipped/traitor cost = 7 - purchasable_from = ~UPLINK_NUKE_OPS //you can't buy it in nuke, because the elite hardsuit costs the same while being better + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //you can't buy it in nuke, because the elite modsuit costs the same while being better +/* /datum/uplink_item/suits/hardsuit/spawn_item(spawn_path, mob/user, datum/component/uplink/U) var/obj/item/clothing/suit/space/hardsuit/suit = ..() var/datum/component/tracking_beacon/beacon = suit.GetComponent(/datum/component/tracking_beacon) @@ -1635,22 +1632,28 @@ GLOBAL_LIST_INIT(illegal_tech_blacklist, typecacheof(list( if(beacon) beacon.set_frequency(nukie.nuke_team.team_frequency) return suit +*/ -/datum/uplink_item/suits/hardsuit/elite - name = "Elite Syndicate Hardsuit" - desc = "An upgraded, elite version of the Syndicate hardsuit. It features fireproofing, and also \ - provides the user with superior armor and mobility compared to the standard Syndicate hardsuit." - item = /obj/item/clothing/suit/space/hardsuit/syndi/elite - cost = 8 +/datum/uplink_item/suits/modsuit/elite + name = "Elite Syndicate MODsuit" + desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \ + provides the user with superior armor and mobility compared to the standard Syndicate MODsuit." + item = /obj/item/mod/control/pre_equipped/elite purchasable_from = (UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) -/datum/uplink_item/suits/hardsuit/shielded - name = "Shielded Syndicate Hardsuit" - desc = "An upgraded version of the standard Syndicate hardsuit. It features a built-in energy shielding system. \ - The shields can handle up to three impacts within a short duration and will rapidly recharge while not under fire." - item = /obj/item/clothing/suit/space/hardsuit/shielded/syndi - cost = 30 - purchasable_from = (UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) +/datum/uplink_item/suits/energy_shield + name = "MODsuit Energy Shield Module" + desc = "An energy shield module for a MODsuit. The shields can handle up to three impacts \ + within a short duration and will rapidly recharge while not under fire." + item = /obj/item/mod/module/energy_shield + cost = 15 + purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS + +/datum/uplink_item/device_tools/thermal + name = "Thermal Imaging Glasses" + desc = "A visor for a MODsuit. Lets you see living beings through walls." + item = /obj/item/mod/module/visor/thermal + cost = 4 // Devices and Tools /datum/uplink_item/device_tools diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index 1188f137cfba7..092c9fbc8d340 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -849,7 +849,7 @@ mecha_flags &= ~SILICON_PILOT AI.forceMove(card) card.AI = AI - AI.controlled_mech = null + AI.controlled_equipment = null AI.remote_control = null to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") @@ -888,7 +888,7 @@ mecha_flags |= SILICON_PILOT moved_inside(AI) AI.cancel_camera() - AI.controlled_mech = src + AI.controlled_equipment = src AI.remote_control = src to_chat(AI, AI.can_dominate_mechs ? "Takeover of [name] complete! You are now loaded onto the onboard computer. Do not attempt to leave the station sector!" :\ "You have been uploaded to a mech's onboard computer.") @@ -1091,7 +1091,7 @@ AI.linked_core = null return to_chat(AI, "Returning to core...") - AI.controlled_mech = null + AI.controlled_equipment = null AI.remote_control = null mob_container = AI newloc = get_turf(AI.linked_core) diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index 530c34a5a378a..28456b43e0815 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -35,7 +35,7 @@ AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. AI.forceMove(src) //Put the dead AI inside the wreckage for recovery add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon - AI.controlled_mech = null + AI.controlled_equipment = null AI.remote_control = null /obj/structure/mecha_wreckage/examine(mob/user) diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7f030ad53d420a6f5d4a0287f919e9d925983c2e GIT binary patch literal 4229 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 D_Fe&` literal 0 HcmV?d00001 diff --git a/icons/mob/clothing/mod.dmi b/icons/mob/clothing/mod.dmi new file mode 100644 index 0000000000000000000000000000000000000000..684e1e797d30c87f5a38b1ba1734e298a134f5cd GIT binary patch literal 133664 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�X9FF3fsv3oUQss>=EilW)AYQ9VmFM4UTp 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%0DdvpyFi^Rl$?zAUbhCgC4@KCF2hmU+bp&Y{ z1)>t-;EO#&@!l1vwEMJ35Ri8}KQZVH$sqcBV$0eqLQaS}NOpbl4E{ZKQJGJK{q7nd z7XjQS0GS@h4EPE1n^Z`a92AX8c1e>6I2=R2o|8Rq<$0cv(MZGnw(}e9|HZ6&jB==b zV{9(-A-PD&i%}$lQMW5;(pc{Ew(|n*bR%m&tOyjXrckW;>_y+A7m?2ze!UA4_xOGy zKw=mDbPCLx*|06H-QgDQhAiH@&!2#-bN4%$lvKn^66{X9wtU52mqfb?;4T2huKjW( z!}D>Ntlho#b&64*%fk4fNPx}gZdZ1fk$2Xzdga}#*YfX_ zvPK=7^q6;6fZzC8FEOJAGNjD$75pu9&=%-d1|!|R9zEE}VCVMi9co(gkwZ{p6lHRZw9#C;iyxI0$Lq!{`282u{B%j z`?-;}F0m+`s5-Zr_<0&A@SmOheJuXDGs#;^0nLVORMxO6ct^+$Nx>8Tk0p#X!A1YQ zL-mnNlSl=p-8JsLzIH*ieS2qu5?JGnHL8!n8!NA+&go7wDG?%8?A{&Pqea$5wNZZ= zhT&gFnn%PDbewFB2Z)MNKYqgNJ`?Y5{W=B$kRHg5eGO7_R!~KNmrN0HAlG5N_#5p( zu?q)HWbO&h2|Pd8QOW*9)gi29fAu6Uz#Vi(?51|;uhdThwQbi1P{tj)b~w+y-614g zmJjbOwt_%dO9B1cnFzaYVDRfpuu{Wi59IbY#`-(zb+0>jsAhMl#hye7$%*?`k+cuf}Zj z*D6;X2YcPpZ0!B7>_8wcq$4o5Z(6|b`XTla)y5~o1F;-{`_!I)$#16#va!oP&d1Gv@^)s*O+Vm)oAmIH2~I~ASg9vKVL~{K zgpao6fqvCP2!5y^?WE!Y@jw7AJ0C~KV|Ft_^E4q!;29vrm~nH^l_Uf(rOlPAu{xk=l4~YmJs#vorR%=fi471hD9X3+<9748U3)Pqwe_8uJc(k=b4r zkRG+|g!n8WNhA=pQTM!=ma8WgtD6CVn7@UHVv>C!@t%AkNV(G-<*9tp7C7r}&EqiY z1ioW@Un{i?Bxm?UnX*C=f8eF~0uoYfD{#zS3t0l-2H^dx5^~`Hc2=zTW?6boOP4ZB ztg4VJiLz>LBY{Or`Y;YkHQ63n-Ds)X8X(xXlYVKjqFtUa9&7GD+q#P1f$96g-x4^3 zjse3W2=b&s-hgp4oE-$s7V_uAArSC8;FJU$eW}vzdiBj9?^1OEmjePIkdRIbduwO_ zJ79S)IB@-SO%i!+gtr5IB*$hwm>t>tE`aa@r7wPmRoe`6ssmA<3`IixgZZPM^(jCr3NAHNwg&Yqk^GIRq?D zARB?Npd=f@M$qVavZ;}9&T`^9*OE4=+d-FO z{LG0AW5MP&@LX|^k%J-SOpPok{Ti1M^YG26CHyBhkUDP%*0%KXIj1k(2sxO{3jR~Y zl>F0(Tg{Y>7pn!nPl?)c5(l0A@zprsRs-Yu9mN|4B4`6`Xh6dJ-snsUz1Qa}#hp}W z2}byP5-;t-?b|~X0)%Cy?9v#eSz+6)66BCnM43yXnf#>ZGz_~%NDc7SaBuyQ@#W07 zNZUuvDyPKf(;}x zr*%};Da|28Adorqi}eSfZ$Z2!a?0t>RZy7#mQF=()6Baw9|H2&jj~KKB}#Z11(F`t z#UOxQ1fcjgjL}dBmRS3l*vOg5l}KJl7dJDno7uKVD*t}OShq&Zn zgs+()DbzzPs+x&bpAGc`L&!W3KU>2IryeSCCLY!0rn4k1Jzlh=r0^3ZjTNAW# zYK@Hz0*@23>)y)k^rlid&0qqY`_jw}tX?(8FvH5}8|+cP^_@q8Bv@7y5BKae2@}u< z9F8X|Nc)YtI5rPrJuzi#-F~x91F|t~fvb zt}GLr11ngl9z^F@L4SopbRJ3N-_ zgxYGs%NE<2a7LyNJyNzs99<1QOHZk(xaDk#?=v%b9R|hQRi@{j+f!`P0_P2x+K+(1 z6O#(SS1SWWWb9YW59bo{pdO3K-I9!PPvS;z%3`l4m>4?;3yx2NWi&FN^?D`c-Qa+B znjEP?fi_FZ9nr%d86qt!n9Hjx0}p<$_V;DKLUjgovcjZQw>S#O~P{8*pebRoYFtIINP%Xw_m`pU+c!s z!P$M@o2@4ZEV9^5#R#riRhC92i~&cW@MND}?7wq@k^+@@|AuL#GhcOPYTmUYuoEDb z@OsksQqw3iN8B5@B7v0X{Kjmpo?UFblodk@Qw(dN*15TV76fvAA`#j55&{mpkaEPl zFSOH>KsRV*hj%e(ORe;zPYhj#(*B06)2?-Go9|Ul90V5I4QkGP0oqt(%<4Wtl+ah9 z?^qS*_RP*Qj2|r5($JXRwF`ylDV&f%B+sT}VofQc4Bu3Yl!U2H?7K?YZ6b;P;|A1z zkaDC3S;+-;qj+OvF7itWK}~7YvmV9zCEGrENcWdj%O+njhye?yZ-U+9TB-)9?la6z zpSHFgB9t?_?|(VphkiPu^=jdCO;<=-yfYj$micIt!qmg_)K{o>OfhrN)43EjbzLmP z@KQvccEAx%&@TJNl&&?6(A-=z47Cd?7Q4wGp3{@ZFszB^=oHk(((kcDWokY|yz3kq z8A%+J(ja;UXzK}}?V~l}Abe%wwM*ySD`+TrS)v08P#|DCfhBF`;65s5yTF|MlqkXU z4seB=84~FHqR#}kp3wYrN)m{FJn%gqukg!m_#9B`ac2HCAX^xum%d$i&R!Bv=f0~f!>Rf-b>gEkayu;Z2 zld90F)cSM;82cOb_hXD4|G%)@iSoaSNQWB>#DhWh8Idz6KjkE*pC!q_)pn-b9rEl5 zuQ$A_Y#TZ1hL)nF3wJTNtY{n%(j~w#(R8t(Is+2_dxY0zG9_D(x)uHDn1LyA^c90&;DwJ#U>M`)91HP3Ob%g+E~mG?UuoLVz1< zp6Aqb1M!#(;iLU8wYGPob9^{`lUl9TqD&p^6|4m%VT&n)=R?pC( z{U=oYt_u0(qPN#8k8$c~Le|VE=`Kj1Y$3~n2YJ)4Ob*ThlX!!JdL11`5fn59_kv{-42N4zp$Q?XFiU=M5?CSw( z3G_e`<+6sa_k@*1D0=3T$j^SPCz<|a;(C9;c@Dx&*cv47 zxAm#h{XkEFhUOQ>HqamVV5_R(R3*HJ@`v+~#<H^@j-SQ)U-0tr{Rr3zbNe%Y_Y9p^wR%S%4Y+>syCMGgn}0p%AT9;zR)-34x(3nFdplW47FfszLs z+(B1|)2c1MU}IeoA9wI){1JX-2>-cEhnMKv|79YKbpOo28T<&!5Dbn)=GUM{si8I^dA*V?Bm0%h#%K4Q;T!9i#sV@~GXwH{avx zFggCQBNZ+5anX$ygSTNjN9|v8Z*1f zRoTfGjpR}%#VUrDBjY1}&oEqKf1Up_{6izs4Fb91Mx#@p9Mq3O=Uxp0IF#*=Mx+pn zuWkPB0rM62BW5azxDWiv>iBSmuEq8qdiQN`$0BN=NZ5bwJa5CZ4MfnHL8;YJpTCAk zF>d@&A@2Ff;iK$EJx?}<+b0TARk+ZO@8o_}Sr2W-390w~WlcX@8fTo4LmrJNrMRDx z&&NKk&w5vnb5^4A3ZT!s!|d!!OyF9)g3S=6xs(c=d?Sui$8P1xfoD~k&;lJhq@?@$ z;4#T>!_)X{f4ggaKaX=Q+)`zF>se8;@|!B#1Cz+rw^&RnQl?_3Ra9B%#{ru5VPLx8 zXj0>uLJ~dnG6Nooi%S>YKKOWR&iDdk-NaYUat#@6*XM6Y(^r0FfF7c>lE|`ohI2nf z>E8b=PDDHk$iS}jgT&$Y8?HuNw_L{zT3l7$Z4eZfjf6WbuK^2uw%@}i>(8=HBWh11<*vo2#@geW&*KAgsk4rc zu3hTVB7=Zl5NXSm+V_MztekfxJH8aWkY!7C6!x({o!L+p@iydZ30BTs5Fr^w6wW_gw%ei5 zF!F_8lXYb$9~uD45<2ul4>FQ zvfV-Dqxo1=)gQ$jomSRP`-P9;+uvI<8is?9G>#3ZTpGBUX_4}R{I8$hYzeqlH}ftg zQE}NM^DSL2E-#N^{$NVa%>S>x&a8B(TD>F2clU(y?--Jy0ABiRjH?Mf!+&ggD_}MVvVhG8ptfyn@ zx5PBj5ZVN(wg};(KNG^R6$|=swN6rSx93IFPKz8(#&l0*_x|1&7Y_;)*;oec@XcF? zfN9`Vz?G1%HtQTbkB%;9aIX7QS#Nk&Us$FSR8~6^1K)cXLrx!`68f-lbZb0fXw{ZZ zB-rZG4wwmta@^Fip4teM8QSabP>fUS82`m)uGre!jYT%QeWVH^m(i! zno;cvN_iwpl36Ll)$YFYoq2S|UD~pF(DpBaKBx~x%Il=QYxn!q)!jc9mQiJWjf$w{ zAy# z90~h1wz0S%H9_PfiKX2;dbmI16+p1mg<7r} z$hd8wVzC>82NQ@x##)B7x}Wa$F@hG)d(!0|Gl?D2saX|{t}*J2utPfH*k6~LH{ZIg zz+Hn|TN_^-t=UmAIdiR+p??c;zD)$C_au#cnQWw!FG_QC`L@*n4YJ*>5Sy02OR_%h zt(t=Y4PFxjIud5hN#Ih zBpi#A>!xq!Pc)#YNH(y;6uz3BP2#@FWs1|6r7TCFUym@V`Jct`{E3@#FfONOCl|~A0vhNO#-(Rgr+)P4WSQ2Gn$2+1L*=g*+R1M<*p5>T?_2v-OZ$a zFSaRaVW(?P^L(e75E)s1Paq+`FyI@UZd3Z17kE2#vP1L?ULLMfLo^XQ9qKx#wd<}n zr%GnA@{pkh-N{`$`8*R-{MJTxr3AfPNd#6X0BZb#5X9Ojf#Nfq$4c&hkoO6qG-p3n z!DjlfH`oeU2Fj|~7+VAJq4X1CN3tm|FBKak+#A7{HMYFD&*o?3fA;=;`TPlW zNyHcIKCMO9HSX51!cww(h&ForrW)M3fG;Z<#H7P;RU zx*H;!6I5a!&yr}g#TLub4&%27-?qN>;PM^D1~R&NMVxj!nc4Db&W>m4CyD$xzseYmWqInOq!n#$~Kt#diA7?d%bl6vPuaN`Ch|NO&_N1;!X-gf=@Zt4xmlG4WhxPIT1zplb!62?hl$jWFA#oHU>aQ zb7#rO{+umN8d{s^Y+Yd>)m|pkiyB%Xb$Ml~>DG3qX99K8umtve7LJ?B^JX>GNseE1 ztkEj3LZ47GMeOnP|5zxbUVEOQL)N5Yy-1cTUneAAx>LXMqPvm8JjYr#lPXYkxZ#b# zne2}*7(4dHsvm*?|EAWuoSkc@)&2NlgH$V(Q)&#RI}?5OJns6#LnA-0E!kUHzT~ zV7i+yLymlkA-@yH(4`z5KYCe8BA9Nq9C}uvs&FeE(Z#aAa8V=UOvsE~-=^z`+f$Rc zjp)m_3iS5GMJ?Y|M+n}_G$klRNfE9va7xv)%H*?WVJ9WjrRv=^{3iHsoV;N4!jnVp zWKsdsKQdN*sw(}loMO>^QnLaA{ZzO#QLv6;lAk>y zzUUs@|FksLwH+?P$S`jU}6##QYm>W6me7UCtUZ; zsyntgkCoz^6kG1ao5jbU*kR6l*MX$AZ(`F~p}Oq9O6ry7vF5Yq{>@MRGX{zn*H@|- zW2TCGbXE3L8%0V5j62B!#iHBV@vFM`3*&Z9DzqFeO0|75JAhSPUmaIexW?VNBt=w> z60*yQfD1R`jN2G~z;VXC_Xw*MG_#AwgQUx6XsvO+8HXMlV9!_u$5o%`^>5V$)tx(H z4e&qCF&+TkN!QW$Tf7Tr5$2)DQ;k}XuHh$EyVM;=3Hen=b?-;GAakbE*WxeB#%u2? zaDx6;e|-voAS=UWAj6g~a87MH0{pJ2lzUY);lRGXhjcYwZaF#D@cKDApvK}z55tZn zK+0~1Cj?$^*%a!F&|!N0ny$h9o*x zeep$3kV)?hOtld$1d(XLiI}1f{37;ht*EbV)kihn{n;OSa5V6#VD#V0P|io;*FgP} z%E%sYYP-js%6W-$o_{;)`y*eAFzxJjSOWE37_Q2)5m(oa5qxoYe$8B<&(w8dD~XiNTL5Nr#t#4&nOZp{<)bZ!Lo}o=g{tJ#GBV8H>164b?vjH_{g>bzD=b{PECY*{Ih5| zIf-TJFYcee^nJoREBOI(>Ea=Lb7IQGIVPNGe^qGCJd@$y=Y_?^+e5eA4}c{*0!D;@Ukx9zU-V5bTwmwvZU{#>Xc^ya0?1b7 z(%HKLPih$LjtNyZq7(YE3K|T4Lw8l5AY?CAI;hHk%TX&18;yoe7FV! z?pgY?d-D5(^7YF}PMebkbk)2!4ZIF$YzMM9XFN0|+5CUA)ezmRIeK`UM6F^#KTr#Qdm{jh*wHLEl84Xxno$n%!Z+uz!1 z{Kbi404HAk4=2W7gAsrkq<%XLubh)=In`+^PF#Zyck%l?y4SfAZ0Q(ySN5>Iy+9Z} z`)j?os<-$1aC**kZF7Evf7HZOpv@Wcld~XyM}ofkvf7=#+4yay#rl0|X{U|pdok6? zfbdvCe?`HO zGK!Rq?8I1mzponf$6YCQ@BF@2zpXfkGL*27NFU) zTOt=fk-_bC6A~%h-O)lFi$_BEyUxU?odvGMkYM~S`)3KFTIT?5zh^iYF$5>R8GNt^ zjqY){TJhq+2P~#?IntzZ*&tC|{DA|pR-jj5rA<%4t!GYcm5--eu|CClw7ZEj zDU1S$0LHn@DuEKuty}u|n#iAB{cIl4N6`I-9RpVOeQ^=L}2MMZGH>N^GX@1Qs5 zAaX#MOwJnZ<5TZ27Q>D%5hO^02SSjq)Omq;I)8&e~kZxWqh#qbTOe5L=yMnNbFYzUy zKq@2e!wZQYKA;A_Zc=8bO~YN1#h{X_(z?!)WSvCDti-|#UgDCjLjKdNhUjXLz>TCDR5M7x_?bH0k; z>M&p8=xA;hS&!%+ft~syMTNOGs4H;yDzH)RQk8%0uQ9)S2N%^hFoqd8JI*UeUe!^b zVR+e>t00x5nquEewS{86Ub-<6#r$BCsH*H1dEE`u%ow=JSx~-E9TG`vc3XqejEZY<2kCRk zx?}DFB$#1(5he0S5e9rxMzKRRhaUG4Zly;9Vq%^Z$doRZa}gNujJqqX)L;C5?}?Ic z?3DlG26Snp?@3MOgLQ0p))#gcSxVY6&HhR+>K9B?$ttL@y3bD+FGv(A9f!rrFojDc zcA@u?S3>Sw<*^pl#|sGsl=pid^_>UK=`-xTxs_h4jY#z(L|216kQBW|D{p*@HRSRi zVvEZR^NTg9sV(DLsU8LeC_L`S^@P>nGD9O^01Mes>uOzsV}9A1hSxe$0Hm5`hOH-TBm8xIuW<1<)DAxV9>i`(fEyi4q5uBFIAfyYMz zka?A-PYYnT%vlkoD3?HQ*2=11Kdh9$<>tQcj?V5qKZu4qMvbCey-sUmr)hyjrqclm zt!u*Va)Y_mNGJI<#ry3Cw;e=i!3@4xz2aeQH3fsWUmcP7lmn;nEvTNB2!TM)-YY7` z&hR;(G3SjT)+l`1MiFgbi@k#;3dS%2;I%HJHQjw3+}IIkYI1BsS2Mmw6reWp=E(Kh zsJ)pzCeb9zB#>-N59{vVuHRAUH`ROok9q-^T6`f>vGq++L}2bnd!WSA?#z6ZK8NaAkDXb>BjrRz@s_u z?5BQzEeUv^0KRkGM4i`PaJPD1EReK_o1E-3c|;fXT}<(Qq?qOUR>RQ^K|_KTsQHY1 zb8s|9HgKw!nmHS7-d{qsAt$Rjf(Rawicd>>Sy}1P7K91i$09I`%o?VqcZ|y{u8g6+ z`l3C!B_v3ruF7A2m<6iqWJ+o~wtQAUPNfZgjZvEfs;3E$b2xC`7}M2?EY3EC2X)>w zzXxTIe4^fEupJHfCpeKZK(eFji^ynMB{)t2Fo^-)3=370J`1G>vdS{s<{LhI*?lb( z0p84FT;1y!Gi!?RskuOFio?y@KkAR>0LAmu_)b`wz5O{EZ~dVMwle{)PY1R+n~poK zwhH0eF+Q)OvF7y9VxBQjO)wMPxI>pnvnsN!;F;8fNDuC=HhCVfBzufb-Pd;D~THAO|Bidl$w1DRVeg2$0n~QcRi>#*`H)|LT`kA?)mn>yv?bad1i)+}`cl`u!lTrEyPc4)WCcZ?};T zV-#rj8M58;Ekbshw-n@JrF)x3hGVp`9Ha$?8;L&W^!}9^bQW ziD8sOBvvMqDv{;H@TkP=AX^k`J`s>EaWGKt&iIB+eo}A)zrt)D2zP0saczN<9`&Ws z4Ub2RlU!JPelHSsIw4|XUxz2bVBpqo+No8RJit3M_;0iIx#G2N*)_58K4yKMfCV`06@#V>;c{Nxv+Z1&)5jdIALC1FAEYv{!SbMJY5kGcz+^{!u^fdajGM z)A<<;ReZ$Wun>+Y2R*c>-gaDpe8hv!d??;R!hu}ZTB129m)hBDsF`C6Me6SI_DzYBnj%I9__B|6a~d$6y> zTxKIl926`0ro*y>Acf+GqJwS+#}kHYXeh#iGB*2b#7B6td(%fLoX@u6AC9tQHt3hE z{h(!EWmiMc-q{A(KOBJuxBDhSd{1JvYu6tjA3>15n{nFh=!}MLAPDhiNYiM7^TUrLn-ds0kt_e;~I!KyU5wfx( zz63laiMZ!6UXi`fN*!8=;`{UJs0FxSbAye`%@-NwPP{}^PT7NniRxkkt{exvcOMs? zmyf)o)fOk>$QWpyU=(Vvm@>#GBzBIO!j$d7CPjf*pHF8wNx`X=*<*YFRmP9{?^3O6 zFEHC}+#=z1_o?4>qKvHNVf!|5U;e4tRaLN*&{MAs#%f02WtyAbXvE0P4KfpS$l>G6 zAmRLvmy|Xr47k>;BQTIZb8}FOJ~8^UKVPd^=Gx2kacj0L_g$Onj$UKyC$%9WS0QdJ z$|IA)m2yy{S0V+0C)=;h&%(jr&l!+~8tiVk4TKuBz!kh`#D+Wxm=9bDaXv&`>o@rA zf?r!x$s0*W2T3mxyif3#P?%_b{QmUuS7-ca^L=6(hTKZY`5Kv)B=7t%8D_hJjJ{-& zwYoj8>GNL5JxP(_%Ny#BgJKEhV!q z+-VktA?)NWlF=VGh1ppg-x`B)1`Fh^m>IXxO)*oa!Xv)~{IgwjE}KjL07c?bd2dIw zW+9`*Iz8lDxyK5h*!|>B3fx3%rXrA#ABvBPpzl3bArPgt1+`w5$FY=mJi*>*SP{rP z4^*JD0|Pd}JeJ{3j6zAG26UDD$3k+@Wcd~lm-L=$e7aaVACl?T&Y zw(rKZXj!Jp0%5^ifw---9%DAX>zzFe0uR%vG%fvy@?nS+`T>rV3^Q|0f8qo~_XodQkPbtZw_H?xHt5GyVf6B*>Do(PkW3p~SXpC^F7b{cd zOkI;2Thh8X@yrB3!@^Q`=J!U-Xdm6Lj|%t4I7Ae5f{ORYo*aD+$OEL@YN}T)5n%o5 zV~umLFBu?O&xs>fs3C^XKR>*xiNPOiGMz7&F@IXp&MK=mf{7(TwzFQieq(IpndO&P zn3vUcFI%*p6ydu5Pi+V%xhtz9BxvU$m#EbznlD7}X_#Yn9y=y}D7dD`FL*U_TV_*X zHxirlyG+^GtYjZ^Pt8euPNVs}ff%bJ?JW@nDy9by9;Pc1hD7w;yLd+S0!diDoy;HO zb&0Nsm?U~*?sfKv)B~u@^#RxDWSuU9k|IUOFZ&z^>oijWYy#I?3)U9OKw~ojmmstk z;>;zVxW4}PiN*u>_fI29Jux;UMHb$d-1d#wi<_|Zsnuw{W{LbwqR%mKw~kBgq<%q^iJ&mjC=bZ#a<_(|23x z^xd1Agl8Wi2opuZ5~M#octgHLk_>&*Dy@MmE`nZw!BpjpWNq!B?w<5AVP}1CEtG;u z8z7@py$edvU1xqvP1_!H#MHj*PzzLe_60t<#u6RXxezKSrdKT{L`5Cl{=MF}5KV-1 zdQWa%g}wQ^Q{|?!fb(sm+l?dj^y7_sgN(kZM&Ma|Wyt|jl~?Si4}{#!9>I!J{x?Lm zKYsk63i`fF8kMNw8Y4sT3C#VXr&!Y6NbUF<_x4r0*|(2-ztQvzs<16uoA%{|iP_!y zZbiHz{_)309A_3zenY4nXZ320oz8{g8du^tu(&~&?%I{;y*5|)+b2=2^eKer`Z3Lpk>n4IqD&*YOJ03B6#B0sKAS%0ME7jh^-QSVugF7i7qUc4&m$dZ3bXTma zOF)nUx14(k-wT8W^37W6KsgvbKB)FuA-M9&=(>cJWKuK+E4Lffe0hhOI=W^b2_2g} z|J(E3=(#KD?68ijKBaLR-RpZcF?M6i2T2HeU#pe)m;)Etgdr@zhkwRI-rY=m7M)f1an?dM zkU^Mp-BjaRT25x@duCdaL_agj%e1fFokz0Hw+YahqF>E!D{x6(qmPMsxJUt-Z1Y=z z%j_7hn8)5y^Z>{FyDr+9W#3Gp` z{5KPB&0E}gb9#%FC)nU^C)yu0r+1{Ijd}u!8$F~FjUc3s9-$kOXNP@ z__^J}bTInT05<~Z*E;(0s~w%Vq?PSmIms%p1!m^KhNZqzV2_l%dtI@LPbTtl!IM|W z%nGWGcGUc6oU4Q|4ssuA=>L2~Z2+he;K>YMJ zpCKXd|A3Nr(2qugzw25izdTw;URXQQlLWg-=WNNE=@zog|BljtxQ!p%F;AG;tweNa z<&=x@wR90dfMp40uRHR3?6scza!WSLAg(#^J7?bUFOM1~yN(v6#WH9v`ig`A=?2vC zCoiBc)+j@48*8VNfaOy;3+R6L$$;T3+&KExhlBCBW`)kO%gkmz`Gun&$|;jE{#F-r zI8I_+KMuRdu{lNBJc{iB?rAk}Ps2W?`cc`mN#=h3PL%Q|;E|3u6D2JB$A%4?Un(Sut3-PB1}7rG z;s^8aYrxc`_Iaarlj%F96v9t^Mc5v;lfu+ko!LpPnNlam{7;(bcGiJj+|*%&`$Yz| zXfKWu*c16YATkR!p17Olkz#CI_HC%2fz)dK5d;ck3a5B)0lF^ip@u<{IxR)}(&4!G zC-n$xyG!NMGFU4I+Oo9wCAW5k(D^|Y`QL+1VI3uN^+S^1h8Vzff@T4YosgwGQb8v% z2Lz|2SccYY%6~r#pvm7$?6>4#o=-J4%4w~ z{J{}J>;XeMvIhVb{d&Tz*H-2*l{MTh5qOp~cS@AgLGEK^anF`tKp-)hlE#Z-3hF)E z`u@yr7Ptao8_&Y9W=saC8Z@v{2hXLA{GZ2r)h=5pkByxEYuyf#oz6(VErh~LuZfC! z3}*2UdbALP6BzVFmg?1O&jP0d6oyeGTjR(Q?(5$dyT2gnzioDf+1j_IMm}+Gs5*r2O6u;-mFb4kXE`s?)U!`E1cHQPi z=T|ym5*@bA-*_xWksIho1_vVLM6ceS1xs_iW(cxOuf!Uw_~Zzs>@7g7+#td${R^W# z6Ra+r@#D|k#$#f1LaNr-Cxg^tJ+J5QRk4L(ROgEkdIi9X0xkvN=?f7d<619mNs6}e zpS`qI{8&wrFJfQ8_gO&B`j6Bo>%46!1w5X5q-^wk_a1+Rmtj&VQK|2#oKI1G+vr;8 z0U-*Lx#ceew%E;aiTsei{Bw=H^+mv_$S_a8P)e@ccHd<+GK6a`+<>;H|4X5OFd?E$ z>iN$Ucy>#Hz}eIX99sDGOA7A%+<$TbZm&#fwYik>KLWu?9WX9~+jn zY1(Ht<{Dege@~y$5a|R5e-JL7jQ19BmA0#}2un)YSEt+wCRK{{`cY=`80g@mfc+ai~0+t-cXdboxn;bm+lMuC- zn}6TLk65lqw}n}Ly+FpG%M4Rb53stN^pIUOJ)FD%fdGSCOB;g#3V}<8kahXWGFsNg z=5mG5z4rhb0JrCJP0bjPRkj_zP58nfD)y`nLR9rSr|)%)%hQ#0!R$*hA|7>dzeWSA z)?VKKCrxOr=|Am|^l$U>lFrm`tF5f>*00c|Cw>(B+QC?=z&4Ja6G#@*rH5Yek?M`e zF|xTS-49Y(1hR1B?jRpQt3meNNI)*<|3y6}+2NwtKp{GavT@#wS0eLHzz@4Z@qPmH z!9$}Twwod~gPnz$|9q?xZ<_9_|8^U){i_Uqp||}B;T8l8qXlVhxs-C8`0tD_hY0!Q zs%0LZgTM^jSf!JFD9O@n{Jh-DFw9^FH0-}9z%-c1({`+(Ju{CvpB%$!i68{*HN4aV ztYJFH*dhMKu~h%9f2*l4{7}od&11Kx&?67a+v*ReGH_kXYxpfJL-wLQv9BSw;j^#6tlBP0MuEV zSL#up6B#g8w1d{}5a%_`9N3=gPP=sTlMF|d-dh0Kj$Mm$-zLsr(T~Bw?#D{4owC4D zeR`NC^7GT@+m|6=M_)&biQu&Ph{^H*L06rq8_&jbn`F{bj;59O10$8l7Gu9Rz zX;(n%`0mF~+hB>Q5AcKPp7V2=C>C*&akQRwDX@D7P-ucA%ft!Jt(&(g&R2PTy7ypc zG(^bdF!8$SQy`DPJMaF0^cZj{gI-9N*Pit&8lWgNvHbSszfGOi!;4S)1d}c!6+8ig z!;Ep$_ti)WAymt$&$Y{Vml2&ADEbyRw2XZWdqU7HRw?`gcWpYp7XA;YTdY**^F6+~ zA0AJ01io#iu!z(IpwHLMqpz~tGrx`<)lF;>QL2PN*NW}xfL^n~nzxOffVt#5?S}gU zo2SjnA4u()M?GVwE8I@H+b=ZhVP~Zp@=~DJl}1X1+6SNjDbrs!|6sy-t=|PwObiT- zzG}%2X8G#>i3z!y{s5-6Yq6LF=tntBw`&MdZDN9A{7JqBM@2v<`{{069}dN z5V>vAa@~4I^|Re5qKyg4*Ys?$EbGUg4VLJ8Ry9^GdCuMW|GKW4LK-PfEAoa$^sazl zRkHIApXn$1;;dIoIY!Q!tA!etFM%)Ndpen5f}HjI`h3`cdB>=}s9Dfl^?5ZH+{bBV z>%QxDhS;Q@i2O=m`+)qnK3$TW$YQvIA`s>z+8O$~8t}o3@p|ym**69$Pl9(pDMuDZ z-_UJbeOt3gC>{s+xs@UV5!DKIPusRf@Fd@$s%rSzQ$ZSm0Bj32D1 z%9~Ll2wQy~JJ6;e`w5jf%Y;an!JMC146S?u`Q#o`5^)5ubqgJT3F34C@S-rfl$K*Bfa#C(xgg@6}nJDl|{cQRof zUcVc|4qY_hf5-C?$!!rgGt9N)Hn`kPyVI-sUwaZrq$EFl>lZ+-4Nj@3Et$#(^u8!$ zP5+I9L?l3YAgZh?(WG&P^X&WEFH*ZY5I`Z;0F?0mu_bL;FhZ=-4*$uKI32(!eWo| z-~=;W`j;;@G76dIc;>DKBYQ!d+r|_f+##G%P;d=q9Hj&jFPa*zMS}<&0D%wn11w(e z%RnGbPP6bt*4V7B8pG;K2(_m8ea+=NPLSxH&ST?!LOJD8$7Dl^H zVm;kW?tVM86Dy9JOVCrse2$ zQ7_PFP+W)Ter5^WOo`&GzN6?<0OXCwQ1M5Gz2JGNv8L5H2UPgI>Wre}HFx)MxB#^V z3-EM6rWO~5pO8-K=vx>(-DHU*INy9ysTpUrJ4c7uHSen1{-vw$*iO=i8cLy-)O%uC zScbl@n(s@CVs@Zbug|~UKGDYY^eWS9kR=C*nwpz0hMa5@13SONLPf|}abUt^Vst-fH?hol@(%a=mu)p5)fs}n ztSp~;_z!vw^!?Zq6<1EttdjA2@I6sfQ||tsnUW(xFo$OkepR3Dn;1$`8e=~dc_S*s zn~cHDm5s%kG6>wh6Og_b;fK=t{(uiB>-M65H=&9Ej;SK-mf~9KdD{-i7>Fo(6*YDE z9)EthLof$Y-k!?Gn**PMg4d|P*y;ZVlqJ=GL!P6WNzlSc#=s*?y(5pU6xe&<7D`C| zx_onvS@uzfe?XV0euOO;=F3O<^QQ^bvD8E<{1zar8b&1pVURL$y(3T8QiZZ={3;B5 zHbA@ch(3?BaATz*dNnmnC3@+a{rozIK+|+y_~j~;`%|eyf^QKl#mL`Vm`2A}U5~>r zJgw@D2nBA018C*K2Vh_BlQe_09XkRu)9Y9gAAI0a%HhXQ61aq}S?b|?E_ zrV~O@C^0m=_H#5y)my6c{IeLJ&gy5@B5YJu@@2f8<{&Xj9}5B);WZ>NW27s4wuU@T z;vjN8xF2Xhz>kE`YjkHgdl$K>9|*=4ZAF86nF8Rdow+%4P2!Qy##{If1A zEdRFwam|KbJ!Q?O#0{oQ0BLeh27p!Ir?V9&SFrnU? z7j8Y627XIN;9VvNc5&xY-YxAvBSBU=3ESPeIBo*iH7y|C>>Hu~7w--?DhwMnzX$%& z*J`jD4JVAI<|i4*uB2r}x}!8T|LunfOD06IU1&r&9$15VKRB)vwbEIYp}C;+vZ zmJnc1W&Jeo{2xqfR0^be91CqgUNWT>a^1m|KY?o%Hab%OTo3r%B&x>i?L&i-^eDLP z?qa795e0A^sB>hEGQai8yxZz=&^aIQh499&%C!1{Lcm^K9ylh~_N(13e-1xU%AY6*m$EwJ-kK3le|wVNe|)>uJ*u(=5yjkV&?u^ARPmPf zFx=*wLsjurPLR=4VQBJp;YXPejJ9Z}P}EncySH;~2YfSqCo0#mCpd(Im=MyTi?MPJ z`KAg4J}|~)ftwEy>So<~3=3_RG-btovxpk>pH9Y#a=UX=M7_D_cW5qyNoRw$!6;QA z25e|$4Nq+ouUonNn*KD|6%O4L3l|Tkh_39Bst{v}4F>My9)+Io7~5`9LRau-CxL0bH0sxdF4_xDfzq zjn%@IwMZ7bkJFzrieu?vlKj&U<#1?-#XDV_o73UmZC=T$er=@(0taHX)wGK3J;s*W0$@dRp+gPr_pt3&qK zAtfd^;BY>~H;jQ7`0K@lI4!xWr1-z_P!5hCyh*_l(iKEk&wD#MwZ4UPJEG4*bGiow>IZuc=Mt12)$G zA-DFrV}Keks57Wpi!933^sCM!=DCsw|EyST`!UD)!lK^wkwB^pt; zMQ?3uQW!-A8T$5AhmcmI1~O`i{6HEWj8f2yY<#b{xR@9c@)`VT&Z2~1;>goo0bRK? zx(L~Dz^0G=u<)E+!lk27dU|TUv;8mD)Ozn;7SRLCL& zhM$d6JzSO|41A<-cL&Or$45j#L&kvD{)(DF^3EA{=P3i=nL1E@!pcz`E5at>^37Z< zt``kC*8$}#jAuhK=2U1&TlPaZl_*L5v^|(q+8};%!BLo02Vez0R$Xt_`zLjPjvUA% zx;QYOx`D{I-&8=vsU1wIHCf0Wkt{O4Z2rBtSkBW^9D>|P0U#wr%B?ra!)4`{#(|l@ z5{AoZoJ7lw{xubkkZE{hI^??Hp~2nXtx|BoOuf$4t_1Hq8JGvEfv~iZjps`>EVpWfx!(ci5h{1kE>gZ$vVxBPt zU#~tQ&hvHH`mrRBV`xIM__}F#yy{0G%Sjuy@rjlmkO=YLCzR7OFzBZeQ!8A=Ubttn z)t)2VWOY&3X(xZmO`-n$axYVLMYjHUy5$)vTtj0F>%6eby=gfiLGf>e+&5hs=R9ZE zMUWvw+`Qy=!*{*kGzs$XF|o5t2Js%~yz3CjBJpRA(SBfr^ZIMrK8VtH&xgu3;M22t zvzItEGdlOEb`=GH&6>^hn!5TkA9 z`+(u=2NREFIBibR0-|qLazBJS?_gaQx@IAM;FHL;2W1G94NE$h%1g&EGK&ZP6*91Q zBe26;8=K%K+7=~y)v7x$`GB#aa)ul;GT7{PE5T7cvAVXbDqOozZK*jAf+o~#8i0R)+1JuY%XHRe(lBa&iFV(U&b}X zL1Ffa-$O$qB1}$!1Zgp@>*w&gVTAE?x+f$b+W_#-y;I9*VPBquL~J?qcK71wX=xb_ z@+-u1UwxI6_b$k{kfR=f(0s!mD)C@XysqvxMiPD};U?HsBC8LY{GUfdbjF zt+)5Ku5vNeg8@)iz3(Mi`FrmD+GFfT?fKWkHDvzGew%p*#y{{4XfiqG8vvBhlsi0D zRW*3fSa4soJy3Je-h1RFnW!AW$py`1maUvt6@~dyL+)80Fd>eXd!Wp?p6D3g6FVLW zPZFKAVr8+W*rH+B!@q+<$_T7*zNWzED%=?iHvc2@-~rd%TKcC?robd0rudMMfZ-Ez z5~tN~yd)6Pn&&J+b8RQ6?Wtqi{EJ!^fe_*ugSD*4+tSi59Td$XsyP)E!!cu?rsR@o z`iQIJPB9+bbr?*YpBcXewkrusoH62Fr3Jq+9Au<4U#$aY+PSb9v^QRl(=&pXE)@Uq zy1imVBQf8OZ2XmN@%$^?N8R!OZGb(HpE8o4BEdbz(qE?}5T3w4lAa6s?pxpBU-nU` zN=azTH+CFJvknDz_D(pO%Y29m9^kL)T=2B>StbquE%dIlNr52-H8^P&f|>reqD& zW04&l9sN>Ku^8n-&@F(gvirq<4|P0NS68yOzHKwO8%#CGBNXN?5UT;OPb>vEv&EPie&M2^59IOGuYptG?cb%?BX>i==?58=v@0Jm; zd0t*qwh3_itHHXE5J8#_VH)R~nO!%9Cr0@FZ}aiBCkrjLjds}Uh0VtauPdqJg%sX%gFBP>Qaie1?<;pWd<&f+c|c2>lb z1S8q^x>O!+7^^T$bFcYG&e2KlF58$!@NWbnnDp)NODDa8VfKcst*%GKHO9)UY`Bx} zUn$iIFRr>OC5+@Lmx{sTH=R+B_p4y?Ag|bS0y+m?6L~0#)&d^H&8%Cb5BYt5J z-ShKHV|3rE#e!$$W)8p|VVjRD!$Zo!6ABA422KG%TZV8ajlWFe5)}$Ir?Njb=U_c6 zlLc(>{CU#f@oVZ+u(k(&@9W5130!ZzK3zGPl>p8PStJ$Jnyz(Fv=GPSYMLbfzi z>s`5PfG7c>j3;?`5MOycZ;yN0HVmKaL$-jIb*|XZE<@9|FMU94IJ`EAI@8CPVbF?) zk59`|CM3GgMt0S@^T(5MClP}ZObWe(F1GMj>UuHj=(7~tIoHgmvDajDpK9a0$mH?x zA3SH)Z@}WPCSi#3d_+Tgn|<^5`Ly4)e%3XLoe4oDoZ!zt2jwLjp-b(LmG4`aX(oeh zIEfDq`Fcg|>ZY&gcxT^FB0tzrXBe!jJ?KJCK<|@&YZ++vl#YqR8MN_qb@&TJ*uAx=yThJPm5F_I+nG3-zptjue<}k3bhTzd zeG0?!E*B(^-YdirJc|McFa)mF-U#%+4ysvss;;hs?6tv#jAasWu?-o04PV9wj!BVX_ab9mF|ab&H@a zkoD6Pw=+GAH{fcbteL6yp30Tw@sZM7nQ7dnmJmCz5Bn%g=EYsiJ~0-$0G-IG>y#FI zuPQc%6I8q~rn7Aztl)$52z3Bf;^~4`7R*I zF!LT4e_ds{-Mhv_rkI zcDKo%rkrGyAp-L1;KbG)BuW4}A(&y)K@Fx=!H3$-++CK_;ob=h8JfqI!A}rgJhW*-qrQ? z$5*!zoF8yvLi5BiY%tY&(rEf>2av8~nDuE+Q;tkGopPK2+DkA8cCkI0iV z%j}VQAqXzGLJ9DfTH_hZXrno8j~ziDx?&X|vIk7a6JP?4jJkHB^*L~e20kxHiU;HO zk%7k7Lk?klDQBVZ!Zclg0M?A%LAKOC*Dj|pLIxm)EstA=ezeg&uiryGob#UR>#w<0 zYiv$&4-E~Ko-+1)6`4C&CQmvcg=CncBz&aAJ+J*wPjTN03aUn6=6-uEU))F(c->z9 zrEqz_SW?v*^&Jp#|L0Q9PIaOQaW|~LKcY;=aQ9hszQduFOd`F^l}+7{6pf^ZEcy8q zJpaA@qF-^Ip!0&GXzHakXHGsOEAy12IPE>~PHW0Nf?XIyrK)2FlFXcAsAaBT#Q@q- zvpyHPXlXZ+^}k}Nc|fCsPC*8t(d+B$!=qhc#gT<}o=G1Aw06#2(gs-UzkQhGr>+rr zQ===b-$#=O;`UR?@nbXuB5CZ1uy%V`A`bEu`O2M31gk&|Gblwm%evxVA+T0vjAZJ` zH$g{bK@v)pj@;r&qMcG)=9`_l#h`-VKkP~@>;TpZ@_lO5?R$7)p-4HtH`)YVjeXd& z#Cn|t-~Wld%Yz;P=}b`t+71{p;F_~lezNIQvD4^7)uJVRZn`P>Tu0*K>ZHg=4Ond} zYLe)BYi!`9EN<1lS;Cv(e<$s94p~jk!TbMxZmyRJA*)XOYx+=LlU|F45Y5(y=$Tw5 zYyBqzdvb<;#Im7BB^VEx9NMENpZFFZof4kpb*oRiQvy7k2KDm5WAMDdj*3ahe{unA zZ(UqR4QZaWXNe6bBqH0yC;15QV*} z7w6;2DAot@ZbRhJQ{dn^Y8Fw~6BX3PuDE{k_2emQ+H!ArMNlRXZ$f1-cdW%(J5U$;r6;&C%{AvVizSC zf*GBNceLu6$gSos#eKqf^{2Lf;d5YNJNcDRJuBwM;8#i5(wSYI1V2nAZ)@xY;6Iga z^tw@Qa)Cs0kKz?Wfo%G8Bk-|~keLD#z{=36fn15x(5U=KOC& zfD!3iv=r{J-xaOXr+{!0`1G~_ujNARfHGV@IxQlWxCdzZ+|ti#9cA-|b8U}m*5*w) z7*+V$orT{Cfks!VGhf&<)8jtyfnPap(EauJ5MLh}B3W#WI?8y=)r1tVq~eb+>x6R7 zpveSJ&~)lGuMU4H(RRw}6)UQ%Sm&#pp#tt+%i;t^-`ohjjL_pA--+RR7UBDpyFV?r zdH%xD#PoFS)1QJoe-M_V>8G1mYrC;X2hpWrqriFHV6&(4bkm*&sSph%?3!i10k-61 z70Sr$+%lM^P|nB;Ei$lvTo846c{1X~i#KIj*z)qBCt@fV*12$ZD7}xOM<5~DAc&L9 zQp2Bdw6LPkM;s=0`j>QNl$&~lF+aw&RpeeS{vh|R!*g)@6lu%E(G^1l&Y3>x^M=;7 zEb#?nknNcs+Tl{4h8bU$ZLY`KV)PK*!yoVohCbth7qEgy2{8P-sMFQ-u_64EyQx^=zVM%uxeoxnWTYGBdGWbt1(-_nsCj#_sFE*N?&rT}HWF zO~?<~iT>+>J{*Z|*G)Pu*I`lhnyz=AP1Mwx0{wl?K}6X1V8%?B4vM>0DF$lG$I37Q zt?Te@MXI-p;`KfRH#~3|h~EUcY8N0?sIgbJ>jHYd2jwF_SAPz~y2|wkhPS5s_`$HR zD>=$9-P|h5jAXGdvquMg$|-;;78Jn=1!6iaGCSqz_(aSYH2s(r!Xua>i@+@EUx3_N z@Kx0g;ZKP<;d`K-#qtpQ`RM^;Pi?e%WuXuA&)ETK**_G>=E=?+jHwjmhXPDk1wwvH zyo4C+c?w9<`*hQRYT=oLV%!TKW5nGKl;d{*w zh3o=1`5(JDp%*J5(?U0KL$wZfXcg5v1`zhGqrTqUIHH;4XnKMuHEnNFHI|UD3^Mf-pp{u2 z)ZpdIFC$`C0vB{-3<~$d)#VSe@0>a;`Jl(6QEl7^oDi-N%@+dd&HbIHckc-G;G$B3 zZq6dVMNzG@7vN#Ilb^A)mL)e1-pb)IOq5|^Pw#-5ulGJD(KCzR$!gq=Uz|FrNH1|4 zlkL<*-1-HYuYL4FrG}Q8+5e!=7AWYf07X%MtMM0c=uV0&s+L`nf_R!qO$)R_*_Jkb zbP4r*y2kZpQ=@&oXKC$vGbN($TP0&=J>|x|hD#ZUF+1L-XLC{;B4+vd1Z7lf`TKP* zVoMSeT}!)sgl8J?E`F|KUeWCXhdntGpqj7_xUJ^yBLIk)LWpzluTipu4G4AyWR;ob2Iv$FAZH-mfQz$9JiLkqH)NTu=shl_d>4&eww zUqFAmp(2XF51>7VX+9(ImXr5ycB4G9LMNa~aq7OT9%9u>cWs%4B`LPxo{q3p${PG? zOUbOY?*L0-L4jc;^`#&RbwY*ti1ihX_k?ZXd?0gbyahq`-DC8?CK5YKGtBmO@)#nXJ zO36!Lrz3sMu4ZiDeMP7eXrn+VpVByLm-6Gu{9JT;P3h^)xkNdLB#eBYBCzq?-wJrGPr^3(-%LziivH5+&)KCN&`I) zExdf~LR6@NZL}KMJkfjHhl~gEeA^#6J}YNuC_S`$*sb2SWL3x!O8=Vp8lOIm!pdmO zd5&9Ggq&hjYTiq1px9f-^~#0fpTspDPD-Ojd7*JCW$BfpS@C)U1**9zrgdsuER90G zZ0Q%TkvOxbhlHhimE^tR6cik$v-UiCtoZO@Y}tBBVMfNqMz7>*JP~z!5gXHq#^T?o z6jry)#8&?W|J$NNLln&t+kvF$H=|0q#YL@)S~$`2}0(AUdFW;l&t4~ix;i0 zjss?w9US=snp_Wt3iheKqNhNKu!2Jd6)|EV}&-7LmVgE=E61EA=_+Sjw%DZj*E-kMrjl` zIvG=7aHln5sit4~%jV#wA9hG<8*g|O+~`}i!bZz)sreY`d-%n%OG(MzDXUJFw~*hk z&Ku`_YQ2sk~XkDvQByl>OWB=PceQ@W7M5Ob|rC21cn znvfxn%v7zwbPY2_-U*m;AXtS~Oobpv7 z;T8>%S8J*<3vWZKKHYeRLx_4Yz;KJKpBtBrmyj`dD1J98`3u%~==-VLp}s}sjo}@v z(a{h$%SY6~utvJ{-`u>KROIer>#0`~8#QS}ZV>|>IJxYSPoMRy zDmwFaUj1Zmr>B&5d-A}g6uy4)Exp;}Bt=ah6)W>_i}BdqrB(kl^T^O=fW<6jEr0#P zUE;VCq^nb$FSGV<0meNzKR(}WGobzp8{ES>A#W4C8j<}eOI`4Dz=?hW{vFKj_ivit z65eGgqNRoTDNe!SO^9`z-D3vN=+jG>$;~% zTw(uC#@eI9SNc&0&O%-82N*7Bcg-QI3Qg=T;x+xEjCxMa^~-$sU#jsJX@VBFoSrj> z%gDc~N+Cst!uHd`^Hp)GP#j^tlalDCs`Gg8zp+1wtLgbsD3rp%f=pDIPu)7F4?{-^ z%bz<^_e}ABj&_!UDj_p&+emGLJ`Rk`Y7%(D`#bp21-{Gmr}ZprA1hm?o;m2@9N^_D z6WaIL2h>yiz-E7#zH#faIpKw!!k!bLci9_OF?wLwgJE!7I^j>o(>=VO!j!=S44jYzwdZo5W6N^_II1oKpiQXP!Qk58C zmq{%h{&4Ch?0Y>qre zJEx@B0WrAw`dr@+D(bxb9PIIm*D=+vqkIwn9=M;3Phxa(6yx1+7`o%UVd4Y!zwv(G zzip0ziHVgQ@OrQ3gPm$d7&^yk;6eOCATiuevLmcxC zj`3^$X`=W*_{`eqkj6*_D`6h?C(nE)Gj@wtD7q01_j`VyB1^wt%)({A?0+B(2$IFt z0u$l8!CDLm5?wg_YkALfCNW<88sexc9fH@-hZSe-_!I@;Hyyp&DbX z6=jubV8#14UkmpShi=hY;*4}wn@5V-TY@+blvS^e&f=iZ_iB%O^cRqMmr~IADs|Hr}v| z*ZW$MOj>*bnxJZR&oo^)Iq$o*gvG(<-+4GxFRJ^waJn!T{&tGGTOGxwkqqsJ7mfi*)MkjX`yIIaZmZbtO4m?LSHM7j6nS(wED=--IQ;TqgDD)Hi>7G&*h#8?Xmo`bFS9wIg!#y6GSWh}>rXd>ElK0*$VLL~Q~eQ{{n9*JfGHLQ=c)9PxyM`$L%)?dT&kH2i6kultr z$zP^}$SNAKLz)ZHG?U;A@Q~bqf79D5SC?Ac&edn6E1q|co@oN|);-7b<1X6z(kjMJ zN90OEyGYfdMQ5sR)vSgp6->9uCX~KjgS#UPHxztewHSMo;B23PiY9&}VA>mV6g-jJHPu$$&P z=D01r3MKPN$IySO?Lk#NS1yz6*)tmt?}%Ot^(=k(XVUvB(s%t`Yix*ZapPseAI}+n z*ZlT0xyb0jn-aDOnD-zF{SH=O+684gX6O)f?390kRtBdv_C(?=N-Z% z0@)u(NugSo$$B?2wL)va@2NWy^sIf4`lR;(}9sBPSScuAeyoNTM4m{1|H~LkhRL430Ff@oD zdJ9&KrpfAIHJ&i1lMnKL+>x8Ye~AKzO>%Q&uC$!3>xD)97I4Ix&+s)>iTh?0Ytabt zFC@*m%)gGXihy>S;e6&h9}~u~`%hzZJ7zFx!`&`ZNb`rEtfKg1DuHZgQpil462r+x zXyzSXohGD~`GFFVJLx!KJo3&|>A0llwQ{R8pFMbu%R@!|st1&A9{rl&tkwwhXJj2d zN)dZw4R5Ge^uAVCAp=24-!Dyq*UC^Djl(=}3fGz^mbI4v?K1y4r+oNZ8752gbdDC{ zrzID(&JJ-zw{w4>l3paLLBI={Ps0|4A>J6Xi81m;RllmpzU@^PGp`qS@@2j=>hVjx z$cICw=Tz@5!M36eXjwii$*nSQKYa2^FnKlhL1xQ0JB#<_lAvaBm8e>5;|{{SXgaKJhr0-}JJp!D!y)(XgbQ zxTtx|UAp2RmvW5)YbDV|nZdNLN1dIK&2jX5AC_dG4*o%^M1#wbY>D3;fm^-(pW^~6 zReK#{NM}uDU$#@`DVg87qEr}>MesM&!$3Ahk zmV^`jE~qs?5@1#suP0nNLOL#@H2cL%NG7wXJY$vTzez)d|2lR zg-WZc>JqQ*Kt#jw`1H^3emjLL(FMJ)`KDizLax2>dSvV<#2~LVEkhVt&Ppp7mqNsa zp&Xm|4(^lB?{-`BJ!d1S)<0r*!r!+bOth%4zevJYDR|*RyFBMSj=-O8kW9QoW2|-^ zuSw5oJU^clD*~(kn!_r!=5{^;I-awOl5J>>`rvB~@vCdp5?wiL{z+8R(D}g|xvS!M zXT15e^DXYSxD%}vN0{i`Li}bWcL_Q_|3e3jSNi*t8Fq+vv2TCEH2x9V;1;#o!YKl< zU3Mv$Z1We@6CnU1Tq1;uzD<1yQDxJMxcyPWv70koVDp>&HMK+gC%(VR*=cin@40er zglbw?kxHEqL6qWy*8_}qUV0bpiOBVm?@&t2Z8rL_vBXZw!6?PR)=0yz`IV_Pr-NUh z|Kok>&TvHF9pOhuiTJho9Z|sfFW93kaRZC^U)k8%H%oVV5ClQeI9kvvqX1<9Rcxk& zZ8425VT0_?$B-gja$agacTvlm^lv$u%-g_NOc;ATLZw)7E+c*Wz)5Gr!??$L&^h@q zFm;ZiK6yIdHWTSae4zV6rOk&C_V&YZ+N6>bgwtB-4&ircyf$3Atw~*O^q9I1YavikP{8hL(n_(#fZk^qxj>aX8#an|thJ7VXPl-UECv3D( z>jsDN3qSEgM{O@V_;R-QrJQ>4wT6?Q#xl}-bAB|3Q_c}KThjME^})y-KWYtmfN?w) zPt<1(_BELIw!_sSyvCZ$0q@Lu;fMeOjVw|8+=@9zrmi5^kJ`R}La4i?_L)d_X$+g| z*&hQY2uQ;gTBsyFG}P%mFVI2ihvMH1|CsJ^6!O<~eE$~2&(|SS3Q2TDHNN0xf!$s0Qha`pdk(8Zu@q5ty^7uwYVJ6B)0BW4 z%gDXrXrkN!LH5NEmP5)s05*| z`o#z~)UMpgzK`{S2-gehqlqlvU^ckp(frle$yRPs3lp4AyFTtVh9HZn%?{R;`iqqnUYI4y`JdvN}1RRibUz*9!&BdS;sp5$z zBPa}B8C!Xv9k8W)dpT<`lH;#Ifg1du|edK>dqeyYx8Gmr3l}rG)miyTP19qF?PfA9I9JbPz>(&kch8 zH;sKpxoP`g=tsf32B&*`?6sQ?dT~5-xt?;@r(Zg_w$2zt7WbbJlBIy{iM>c!&9_btkzOh zE_AM)MZ*5`^e8J|%^Az&49=f>o4BgwF!DXRleoSI^2&gwxcrk_;uq$fFZMys9H@jP ze2r`Sw|?jPl$j|1Q`*?d1umW)%6d0qeQWI?ExUWZY(KM#+tco1gZ4*6c(m2hh)kEr z6AuY?kQ(_mb`f^)WD+Q=6iME;B>2bXG#8aVp*X&|F0+H`;X9kqm;MB7^vk^md{UpY3?tO)Z6t_=NF^BwQAFNo%|YK{lV&=>3; z9;=1=im*}+D+;0ei>y-NAIsSzcEEUDz2QFfCYTp|FOFgNe7;-UJ(rve-$Cje?4UD{ zR$!0}b-^}-Zq#*N?8Zm`Ig-bz)wwqbjD$0hXeD?fsgu(d+QEZ%C!q=4*uB}`EI}2!nH8^^617eDsK>xa3qSq&7u@Yl=fnN3-zKr)i(us2S$x~&q{W84rkp9&odYeXIr_&y-;9~>cnn7L#+~Gs z0~{++*x8F|S)G*mRNr27rDEeqntywpp#pGx>KD4O zQ_w3!VeJezNi2~Doio0ER-Uw2M?YmWY^jUCUUz)Aa(>Mq? z9kbxYz)|41KlajFB!|2jaokjOoOtP*gQ6>N7LAWQmxS-M59Eb73|Ajfl{g@(Dej;q z*u@w#`A8{!itjJUk&#u}?lH_x(5n(3;vaZ~Z~yx7X!B!EnHnlMn1R7&S!L(kB23Gh zQw;x~4+6~%7QVC_d8=I8!I$MH`b&g$h3A3GODAM6-0D3Cp3di;{<#F;udFZJpsKMs zcHiH`5+h`Wzz7^ic6VyPyWgNn)H_~Ao_Z;SpUH7(|B$K(pY@kLb74(aPyVz@+dX3) za>`&p7U_;#;NkVAx37`fd|W^}WeDe<=7+F{SgBSYO;_G6S_!vDHLeeloG}8ZRyZ$3 ztlWEVTV%-OWYm1AlIO{MHT}@qUq&!nqy;=TjERSBj~z=mZwy?ST@1tI8Rd+uBQkUG z{KGPd2yPkvCd-6pokyc=)C1^Zn=c`(Yd9((8#Y6;2@6DkZ42dg(+y(7cGs~c-IxE9 z3-HhPb8rNTzab|SEl|g5Xj@dp`E0*1sxJSLCpA0F0O~c!S*8DJ<7TREy~<{Hyt{}Q z6%!Nd>bhz|>?iLP7nii_IuYh@0a)&;K%N6l>Fn%$ecV(*V!g+Z?0I>>w2ARK5!JJA^eSS&pryMtb?{{Xrdthmn2kdnYgr%j&!UDa6cU);m8*vvh*- zHK9!d*g#s-$?RK^RXa#S`B#8gKvf4Ruxh~tD)DC=u?J>YX@16=FWN5ny?e(|Go>aC zGf?4gxbJCbwO^xu5PaF0+)PGCOPj~Q7t~b`27}|`!DXZQv#Xv6;)1Vw0l$ln(hDJe zR_&Vldo1+uX5)4#n9P1BzP9ojKv%oxlr@~bsNF4p4CY|}>msD^WRAe(>Hg(_bE^oP z-k}S*;^tUw{NcG2@%O^@{4}2hKu7;Ajo$v}jZ|?V^Nu%7y5l@v3Jl!=u+2gNxKQd! zfB^jH# zJu!j70!sm?v)ia~8Y}T_l)l0MGZ5I5P20In= zng<a*TE5T4 zV}aN%sy`s%1AK)4C3ToCgM`KzT;8D&{puR?uw21mj`22klDdB$18=$D6kh< zJVzieHYNi?ZCX zuY>o>rer>=P-C?G7dbj+hy#%<-OU&Du+vK7Z3ZcMBH8`$FpevGDEi3bWl(b?Pj}ds zMg_TtPLmMeKF}s_T7C*?QW8p0Xp+uYO64o>wxjc*<6AhDxOV9ZXjZC*TU;lOO@t3B z-Jzpr9B&JbgHS8G!ryDch46(6E;zEwVUD9lw7*uIW=l@4)TK5(!@HZWmV?dvOiOQ8 zNUr+{nEv-Wy!+M1N2ZUn-MY^wWm2IZQ41Q`au zqkCa6fn>l<+Gl!mKhV>^`AIMQ%@PQV0VymGp1s{dYAfLMTMps}Wn4DvV=0~i59JBX z-o<nB|1KiQn}g{wn+&$xkm2{p--O0Mm+nv2alEmK+ijD*yp z7&r$2ZbN|Y&J9g!B)gfHJS^8@!vSum@sR&}#YgzZ9NC{R(x32Li>^RHyip6mM58+l z3nR13&i1-5Q2wyjoV%k1zS zq6)nk0ih<)p9DR@d8i+6c|Nb=CDxOU?o<~U{}d--6?nMoaDn%-cgvNOd%=Qu0`Ahm zb(9liDfP?QceN02{IAEFaJ5LT^zF^Uu0DdsQ_4j0`hY$`t3^U&Er5#oj-}9R#YEd;p(+QrW=z?y{vWcw z0xYU0>~{eb2|*;4Qcyu@k&+ZaR75~JB&9@3q+>y(OANXcr9-51>F(}Tx|d!SmfbrC z{eSnn&ppqh>#lpw&Y3gw&ijj*!Q6eCBliTCN7s(AbEHh&!_l(==d6(dLcorIM%Ee%*IwPNsrjN2{W{?Fb(3?tSImUP z0*29@0Nt&Cn?BbEkldJo$G1ksB4CU^g6)Pczt zD3Jhr%4qk4yEyKuy~sG9W8i#SQw%0kT~mg$tFCcri>_I1Ez~PM^JGsF26_NzB!?;P zq>LnJ3R|WFi!YlM(z8HUK&Z-Te>yW?KaI^S?BetFSOr6zO@fG>W}n1qIoU#9Lj4J}W560j z+Gg+#MgEYQJUIhU9jN&yD=aU+f+>yNKJriNj%r4mx+wcueJTfg=VL)+T|jjIx6Ld~ z!Ys41*UwuA=CoizQTGF`l(ST;hYk13S~=2(i=<)84)X9I;Vb}66tr*^XCT5H9J*1& zaVC9?sGoYzJB7L90CZ>AiI0K}?x&5@X5%EiPUeVgC%#9l0FUZ^ev z-nj{qGJ-e{f-cyZY4+5TIC)-EKg-IlN=_DYpfYa^t_^X+U{S8#D_*CxyOqcd-AhQr z*YzR7Z36PutG5*!N-uG;Y64+|hh#Ej7{U|Z#^z8;yj&Kt@9%kYng*CMa_#{BnKVRV z?SAsMF?K>!ykY&2O*0j)(Jb;2CpYY`IHYtX zC5+Wzm<&iLhh3GhYC$%j55v#6i`3;_ zfG{kOONe58R8?@O9wJyZkzpapmA+rsbaiUTR+hXUYGA*l2pvsh3?xc-1nJXnS>F$p zLBDR+odN;<(Iyo?Yj)fA{7S~`E{J*EA=u7sY)O3xmbh|BWg%tI_wQs_hSKf?k-*9e zr)erOZA(K-zz412?13vlpnV0q?Yvpvmvasp{dGK` zQ$Q}ZQV2fnM{rEM)f6{>Y{-u{=Yv$2Z5-zYH>{RsP^|-ovZwqRxf+h zr(Qkb-8ukHMyj_%aQjV#%%8o$1E_ZY40mA zm957_$?-9iunvoNf6Mou=qg80bG&XkaYF6R)}Q>oHjDlmcsb_SYpUv%GH>r90&uRg zjbU?F`(cay0x^G^A70Mm5~-AxOg+a1*V%5tv}$O2UhLvA7~eFa17;h;T+F-A8cu3FZ*~n)S5W}Aq!vxnC`hs0E4DB zZ+6ah7V*gG!R&k&Ehr<;O5yY$uct^#(80DAW<4eI%k3(ZG#@E#M8?PKeosFr%SHKa z^}xY10O{TB&=+cIp&*grc#?S2Y>_;-(E+#m=Oansmmm0WcN5#~o+JOPdiS&=* zFdq&JX-jv;`8B+$A_-O!UpD$su&uZ7&z8&YaruJMiNk946Fa~u7G+(4TEa5BfoCV* z-4n_55C9}G9`yJ6lV2W@{gTP(cyF!R9CC06>cJ3$F?%jtW_R<~2lDsx9v9@Lnq>O4 z&j&HyB`lEmlJ{Mbl81W;0NQ#({T#=OtG@Q-i>xZ6tZ!2E;_xmhUQdtT!r2UBok_Y>|N*17Z zFLo6{!w-`9VFH^`57uj&ziqvC`)?>N`Y-%8Z0poZ4K5XKrEGvsFx5hnt_c$>_8=Og zQtjlpYK6t|oiT{~V3%oj0lbe3@kbP;RW)>cL4OA9&R&WD zi#W2MO-@g4+hSRRNCo8A;HLI3%gl-y@&+g|r2iQ_2~NlJTogo*F0~kMc{vuYC3%J= zXoRy)-)UJ|Qt$Hq*zTXw{;3ECqZLOlBT<%A5vR+{t7-$PDv^FHhM* zz|YeQW-NV3>^aGK#HrhcQC8YO?G}I#KT6EThkr8(rqgEk&oz(@J~PISHMdpG@y{>V zfw+E7HSsb)rwcZ55@KXUOI=NowwIywALM2LjqQ1T0J3o|PuZ#`b3v4mX$sw^y9a3f7*A7{>-A3{tLneP2~)%W20L?v&|z zo%@iDC7SUP*iKS7zAwubwSMYd`OT`YPFL#-!;g%Kq2 z#>Yf&ZXbUaf7N9fc13W)LToHxf9>lVJ6_C$Od`(Jt@#=F_=*o2rx1QQ9P(La#gp6x zU*>isaE*xS$SyC zGn{>So%AjU;Sxf8NQ>b3@n5?M`*E2d07df|Qh-xDk7WIKLXxCT))Eh6rO4J=q8jfF zqyE*jL1RE`3CE1YoM5v!7^j*M61{ujtP9}}wR)ba{wn-VdV!H;G@U1B5J54j6e{kA zu`|32Y%96f?B1RXReJ(7Mh|}4i)eANF~ie5p)KJe(M%lYi#USod~SrPy`EGLK{YLO z#ylvdf_cB~WJpnK=$asI1EBykch3Xy%C&rwBLle_j~mB(@>-i!dBQ>3GM!IZP3skC zeBZ_Se}73b2GP*|MDpRpr-=E#rAUsU-JDA^AS1beXz_=3$pqoTNp1)*R1$ z8o}fjd)YTzsXP0^&QfUzvV_aiVy@o-SSpMvx>E{QNU>bz&^qS($)Z@zuRMKa;>CCUb6o<{`_B%oWc1e&l@$3xYUH zgBrbHSJ~%Uj{>@W{78X8tT1Piz^z$3ZN!WPJ_!sOAQY>yux?EUm;#nmsLlgvJ>%N^ z(aX45s+gKX@_R~4^ru~)S{)Y!YuH9I;Yi#!5E`O@GQ%-N%Jb)W&}l*n@(?hqCKLoB zd!T-d0srhX~aeuA{q?=whBQ&-Nek+uP)k~Lt)}}*_(ZSsH9gbpX z=_HG~GWaUrAi1GA$j}i*i8=2IJ0ibI8@N$SZwO3)A2gCMp>#CtStQ~9CTJCobKx&b5CyFImStlcN6~hBCcBv|I_^NEt^y- zZsyeRXZKnGSTmq2$!0)+h)0>QFBgHULbpd4LV^lu$e0Zf2I3tgb2|=OZbg~^S6CID zXrKE_uDHT;}E;et4`41VdAT zCQ)kn8*T@Ig*@5(_*xSlJk%;_m>~m&@V}@H((*vSa|*5zZc+Gv`UdX-aI_yJ{=-%q zw7^&E`c&Q%9)^CcK_x?uo9qZ2$1WIF6R83p2bnxBd^@iTf$*Sk!c|~Hq5FDQ50dMl ze30(La2AX~t*>4U@ziH!WkC%AiE1yppKH=AS@t8(Q=2&wQ%l{hK_Gc zr`AmHG*vS)buy|~cWR#x&GjMZJ`tH5So4f@7HnH~c7QdY{Y_z+gBpNXo4x8pMlHrn8CrCK|fyI!s+_WIBX>+0b@Q35JpCanYE4cK?e<*#6a=Xsi^ zV&233pN;~*Y&S1~B(`=%{Jc}CVCFsdODja~zi~O#pXmrRXQb{|;aAUqlYFz&I8-gf z{p^k?fb(^}EZp1_m&S+x4`$2dU7z^0r^bOi%5Gos0Okz0isbuxf4IEzui3GSP;lakpaaxb_L!I?|lb2IOk$cQ%VD2ee z8`FMHl6;zUDVWGw>?zR;H3e@Vo7vC1fPA(la<3K2QZLajaYgckkb{Jh0XSB0haeI2 z3ZcH;E*}7X8R%vY8>k%%l~yS=rqbX9=!#xogyWccq2`{uh#aHWghtc+#gzYHz2v)o0{J&WEURpG zf@5*Evl#=u1)>qisQGPnb#M6nu}T=77)eUl_zeWqvmDz68uL0gzg_%2^CBJH3ed-M zP4Y*WL&wQoL*~9(36aSsP53iJx+O|y#qi&@0LS#IFd1Hm`K951m8v%kJ1J~8Gxasq z*Y;QO+sINd1r7EaOm~T&q1xHU7yf8MsdIB(x`rxd&hAKAhk#$ad&W2XU$W-_WJcB? zY(D@{%WEqsN`Q%Rq@e7jSlHP4u~X}jztnMK_JZin%_PY0irMXm{x!Q z>5EvEGQy>C;qTM>K%~qDfHkhh6SrP2iIlCbLogH&M1R06GXhw`6XAH>_a6!npm-fz z&TK%)-t)5C7XSnyOlF2Tu-{@GrKJ2WcJ-j4Sk3kA0tP%YS%p6qFF?}smfyxY^ewTtaNCypEtU!mfLxlr_CsKdior87GTw@N5INKPpVSoCHEkU<8bg)zti%wQK4S7)re5(MRzr^B| zR7>FW^A96)giz1k@Q84aB$9Hu6Bbv1X)3H@dziElh71>Nd_0{eV)+JNy|3}( z{0;nRHgxrDcW;r#ZS;RxG94AiK$U-F3NUrcs!*@#L1LVD%*!}=eGl+2_ibXI8(xrA zgoYG^5*&8t+)3s%C??@nPnXJeJlJ~nAuE;$r)*3ja*GuXCbnXQ)R`rN!8dM8MvuMv zPwL5c7V%BS&PhRB6^uV`;CO7zVeaa|oB$nL6E}06xCaNjsZ2)7T}4IoAx}Dl)If0# zbSTUvNT1EHw~^Pjb~Ud=#%QfKWeTJbxT4@-9Cmf?&xy|-7l8`?%_5or_<`M60Ju6r z%OOG!Aa8}dUpS(@-U;?3f_c|Xf0)txMr#CtvGh86`0lQB|4X7(axa<-vG@a^eFnEl zY|!~^9(S|aBkg>EY&&2v8PpvJp&&5JbMG=|PjKW)B+<+}xrYx&%`<|$Z003xu~DPf zJ30r|+j{Iqq=B>WClI7w-yRPdcQn5pt_Q%Mj3WLXht#4-I_DWs98jLmQ7)#FBTh%& zk+3}*k}h6C&q0?D-UCm-*p@Y_*)DlR4oAaIv)nM+ zE-*n5i6>q@diojA4PYZ^lf_Ve0BS#Ltq+O#p7Sw&P|(nD*0GuV zYIm1VJy2}WPHCH$-VI@RCjfJYRe8`yyQr|D^ z$R4tJk!=OMk%D?UuH9zOg15~7yRcCLITBc7lVK;a@{a=0< zzSDkKvK(iY_pF+*`Yan}uK+}T~-_wpc=g-r<6dp`$Hg2g%^d$g*+JITO~o$J33#djif9~UnXz<5kfo;3!=@c14N&od zdGbg54|l*6-eIRI*@YS~_0i-O$fo|tRv%Cm++Qf@UIbwtu&_tfJ)vjbBs6p5EbFml zeDT1kwMdc;yAF6DXz-Aa0i=L-t*02oQ&w%p8@Usi;m4lO?q18D0w$RoYRuuv={Z`` z7StzKpIy7yd|Sij;t8M0734PmE{S1}<4-^PZO0u{JeBm=@g-@Chn{KBBQLj2Yh5T) zRJz!%!^zQT&Y8fscr~Gfh1?fRXfn_weXE zz|RBb9BhcH>v2Xo?^azyaFGN4eKPEviD9<`t<8`U&Vdzh@;1LLiD8nP8I#Ifp)Wul zxGQo#iT|m%3%;&4p2lqZtSJRn!1^L5BInY&I5()0h7H?03(S{6WkU+0klz>Jg28#1 zQ^Qq=O4`>4mnN!8W1})mKFKa3O0+w`{ym~3d+90JzWLc|W*Wf@k_;n1VzngqDO9RA;EZL`L7xCLESdpN_9QkF#6 z*X>+bdWxrP2oG*by`R6p}a%C=@C|)FK}0) zW{_!oPJDN5NqP*Q4_dOtYNcBg-e|4>%;r#<;gUJ)U<0>#Ucsl5>I(T6XiwYk&ds`q zw}lDl?2dGV8mGwLhyzX7xJWta@_*4vAJS}GR_Q^&v^05OUWCR5%T2$gx7OVAUq%-# zh1g~tU1l*&uM^cd)9P|hHe>E(6TNRYI+32;#E@M2qG zCNPtAhtys?vDF~>`!z7p$uLmFH#+Oyri3>5y3lK3Gd)0{WQNH@*&jHf3KY+#0zy|X zhndO_gk{ysr)fMmoy{fk*<{Vi|EI{TPj

!PjimNy-oguz>e6{2`%&{LJ%aOVgBpcYfcCH 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 Nfv2mV%Q~loCIA`_u4(`P literal 0 HcmV?d00001 diff --git a/icons/obj/clothing/modsuit/mod_construction.dmi b/icons/obj/clothing/modsuit/mod_construction.dmi new file mode 100644 index 0000000000000000000000000000000000000000..37818382b4289c9b27ffeea6df2ce6f5aed1ff99 GIT binary patch literal 4600 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 Y&ih?Glat-;>?;9aVqlJ})W045KafqqZ~y=R literal 0 HcmV?d00001 diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f838dbd4aeb30b20be49903f20f36e741f22500f GIT binary patch literal 41257 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 cXXlih(bVQq$b?DKKN^7QV@<` { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + act('configure', { + "key": name, + "value": value, + "ref": module_ref, + })} /> + ); +}; + +const ConfigureBoolEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + act('configure', { + "key": name, + "value": !value, + "ref": module_ref, + })} + /> + ); +}; + +const ConfigureColorEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + <> + + + + + + ); +}; + +const displayText = param => { + switch (param) { + case 1: + return "Use"; + case 2: + return "Toggle"; + case 3: + return "Select"; + } +}; + +const ParametersSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + malfunctioning, + locked, + open, + selected_module, + complexity, + complexity_max, + wearer_name, + wearer_job, + AI, + } = data; + const status = malfunctioning + ? 'Malfunctioning' : active + ? 'Active' : 'Inactive'; + return ( +

+ + act('activate')} /> + } > + {status} + + act('lock')} /> + } > + {locked ? 'Locked' : 'Unlocked'} + + + {open ? 'Open' : 'Closed'} + + + {selected_module || "None"} + + + {complexity} ({complexity_max}) + + + {wearer_name}, {wearer_job} + + + {AI || 'None'} + + +
+ ); +}; + +const HardwareSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + control, + helmet, + chestplate, + gauntlets, + boots, + cell, + charge, + } = data; + return ( +
+ + + + {control} + + + {helmet || "None"} + + + {chestplate || "None"} + + + {gauntlets || "None"} + + + {boots || "None"} + + + + + {cell && ( + + + {cell} + + + + + + ) || ( + No Cell Detected + )} + +
+ ); +}; + +const InfoSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + modules, + } = data; + const info_modules = modules.filter(module => !!module.id); + + return ( +
+ + {info_modules.length !== 0 && info_modules.map(module => { + const Module = ID2MODULE[module.id]; + return ( + + {!active && } + + + ); + }) || ( + No Info Modules Detected + )} + +
+ ); +}; + +const ModuleSection = (props, context) => { + const { act, data } = useBackend(context); + const { + complexity_max, + modules, + } = data; + const [configureState, setConfigureState] + = useLocalState(context, "module_configuration", null); + return ( +
+ + {modules.length !== 0 && modules.map(module => { + return ( + + +
+ {configureState === module.ref && ( + setConfigureState(null)} />)} + + + +
+ + {module.description} + +
+
+
+ ); + }) || ( + + No Modules Detected + + )} +
+
+ ); +}; + +export const MODsuit = (props, context) => { + const { act, data } = useBackend(context); + const { + ui_theme, + interface_break, + } = data; + return ( + + + {!!interface_break && ( + + ) || ( + + + + + + + + + + + + + + + )} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx new file mode 100644 index 0000000000000..f3e7f31945af1 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx @@ -0,0 +1,8 @@ +import { Feature, FeatureDropdownInput } from "../base"; + +export const mod_select: Feature = { + name: "MOD active module key", + category: "GAMEPLAY", + description: "The key you need to use an active MODsuit module.", + component: FeatureDropdownInput, +}; From 8f27e7128906df6bcd0d17b45b0bd5cd2069c5c4 Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 11 Aug 2024 01:17:47 -0400 Subject: [PATCH 013/162] 515 --- code/datums/components/shielded.dm | 4 +- code/modules/mod/mod_control.dm | 8 +-- code/modules/mod/modules/_module.dm | 10 ++-- code/modules/mod/modules/modules.dm | 52 +++++++++---------- .../ruins/spaceruin_code/oldstation.dm | 10 ++-- 5 files changed, 42 insertions(+), 42 deletions(-) diff --git a/code/datums/components/shielded.dm b/code/datums/components/shielded.dm index 449e6654405cf..ede8b37b9d123 100644 --- a/code/datums/components/shielded.dm +++ b/code/datums/components/shielded.dm @@ -123,8 +123,8 @@ /datum/component/shielded/proc/set_wearer(mob/user) wearer = user - RegisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/on_update_overlays) - RegisterSignal(wearer, COMSIG_PARENT_QDELETING, .proc/lost_wearer) + RegisterSignal(wearer, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays)) + RegisterSignal(wearer, COMSIG_PARENT_QDELETING, PROC_REF(lost_wearer)) if(current_charges) wearer.update_appearance(UPDATE_ICON) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index ccc5d42a1b7d8..98f1794b1bd19 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -127,7 +127,7 @@ for(var/obj/item/mod/module/module as anything in initial_modules) module = new module(src) install(module) - RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) movedelay = CONFIG_GET(number/movedelay/run_delay) /obj/item/mod/control/Destroy() @@ -376,8 +376,8 @@ /obj/item/mod/control/proc/set_wearer(mob/user) wearer = user - RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit) - RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) + RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) + RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(on_borg_charge)) update_cell_alert() for(var/obj/item/mod/module/module as anything in modules) module.on_equip() @@ -549,7 +549,7 @@ if(mod_parts.Find(part)) conceal(wearer, part) if(active) - INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE) + INVOKE_ASYNC(src, PROC_REF(toggle_activate), wearer, TRUE) return /obj/item/mod/control/proc/on_borg_charge(datum/source, amount) diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index c57e4f877759b..3a6d58c18dd60 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -43,8 +43,8 @@ if(ispath(device)) device = new device(src) ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT) - RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion) - RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + RegisterSignal(device, COMSIG_PARENT_PREQDELETED, PROC_REF(on_device_deletion)) + RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) /obj/item/mod/module/Destroy() mod?.uninstall(src) @@ -110,7 +110,7 @@ if(device) if(mod.wearer.put_in_hands(device)) balloon_alert(mod.wearer, "[device] extended") - RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit) + RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) else balloon_alert(mod.wearer, "can't extend [device]!") return @@ -146,7 +146,7 @@ if(!check_power(use_power_cost)) return FALSE COOLDOWN_START(src, cooldown_timer, cooldown_time) - addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) + addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_inv_back)), cooldown_time) mod.wearer.update_inv_back() return TRUE @@ -249,4 +249,4 @@ mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON if(ALT_CLICK) mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON - RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) + RegisterSignal(mod.wearer, mod.selected_module.used_signal, TYPE_PROC_REF(/obj/item/mod/module, on_special_click)) diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm index 32261578af50c..0365c65c2413a 100644 --- a/code/modules/mod/modules/modules.dm +++ b/code/modules/mod/modules/modules.dm @@ -241,10 +241,10 @@ if(!.) return if(bumpoff) - RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth) - RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack) - RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) - RegisterSignal(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), .proc/unstealth) + RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) + RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) + RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) + RegisterSignals(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), PROC_REF(unstealth)) animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) drain_power(use_power_cost) @@ -326,9 +326,9 @@ if(!.) return ion_trail.start() - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/move_react) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move_react) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react)) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) if(full_speed) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) @@ -499,7 +499,7 @@ var/obj/projectile/tether = new /obj/projectile/tether(mod.wearer.loc) tether.preparePixelProjectile(target, mod.wearer) tether.firer = mod.wearer - INVOKE_ASYNC(tether, /obj/projectile.proc/fire) + INVOKE_ASYNC(tether, TYPE_PROC_REF(/obj/projectile, fire)) drain_power(use_power_cost) /obj/projectile/tether @@ -568,7 +568,7 @@ /obj/item/mod/module/rad_protection/on_suit_activation() AddComponent(/datum/component/geiger_sound) ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) - RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation) + RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(on_pre_potential_irradiation)) for(var/obj/item/part in mod.mod_parts) ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) @@ -713,7 +713,7 @@ if(!.) return mod.wearer.research_scanner++ - RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion)) /obj/item/mod/module/reagent_scanner/advanced/on_deactivation() . = ..() @@ -847,7 +847,7 @@ incompatible_modules = list(/obj/item/mod/module/longfall) /obj/item/mod/module/longfall/on_suit_activation() - RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, .proc/z_impact_react) + RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) /obj/item/mod/module/longfall/on_suit_deactivation() UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) @@ -976,7 +976,7 @@ /obj/item/circuit_component/mod/register_shell(atom/movable/shell) if(istype(shell, /obj/item/mod/module)) attached_module = shell - RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move) + RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) /obj/item/circuit_component/mod/unregister_shell(atom/movable/shell) UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) @@ -988,15 +988,15 @@ if(potential_module.name == module_to_select.value) module = potential_module if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) - INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/toggle_activate, attached_module.mod.wearer) + INVOKE_ASYNC(attached_module.mod, TYPE_PROC_REF(/obj/item/mod/control, toggle_activate), attached_module.mod.wearer) if(module && COMPONENT_TRIGGERED_BY(select_module, port)) - INVOKE_ASYNC(module, /obj/item/mod/module.proc/on_select) + INVOKE_ASYNC(module, TYPE_PROC_REF(/obj/item/mod/module, on_select)) /obj/item/circuit_component/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) SIGNAL_HANDLER if(istype(source.loc, /obj/item/mod/control)) - RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select) - RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, .proc/equip_check) + RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, PROC_REF(on_module_select)) + RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, PROC_REF(equip_check)) equip_check() else if(istype(old_loc, /obj/item/mod/control)) UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) @@ -1095,7 +1095,7 @@ . = ..() if(!.) return - RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, .proc/bump_mine) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine)) /obj/item/mod/module/drill/on_deactivation() . = ..() @@ -1136,7 +1136,7 @@ var/list/ores = list() /obj/item/mod/module/orebag/on_equip() - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/ore_pickup) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(ore_pickup)) /obj/item/mod/module/orebag/on_unequip() UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) @@ -1145,7 +1145,7 @@ SIGNAL_HANDLER for(var/obj/item/stack/ore/ore in get_turf(mod.wearer)) - INVOKE_ASYNC(src, .proc/move_ore, ore) + INVOKE_ASYNC(src, PROC_REF(move_ore), ore) playsound(src, "rustle", 50, TRUE) /obj/item/mod/module/orebag/proc/move_ore(obj/item/stack/ore) @@ -1244,7 +1244,7 @@ projectile.preparePixelProjectile(target, mod.wearer) projectile.firer = mod.wearer playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - INVOKE_ASYNC(projectile, /obj/projectile.proc/fire) + INVOKE_ASYNC(projectile, TYPE_PROC_REF(/obj/projectile, fire)) drain_power(use_power_cost) /obj/projectile/organ @@ -1411,7 +1411,7 @@ //ADD_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) animate(module.mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) module.mod.add_overlay(jet_icon) - RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, .proc/on_move) + RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) balloon_alert(imp_in, "suit recalled") return TRUE @@ -1473,10 +1473,10 @@ var/dna = null /obj/item/mod/module/dna_lock/on_install() - RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) - RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp) - RegisterSignal(mod, COMSIG_ATOM_SHOULD_EMAG, .proc/should_emag) - RegisterSignal(mod, COMSIG_ATOM_ON_EMAG, .proc/on_emag) + RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_mod_activation)) + RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp)) + RegisterSignal(mod, COMSIG_ATOM_SHOULD_EMAG, PROC_REF(should_emag)) + RegisterSignal(mod, COMSIG_ATOM_ON_EMAG, PROC_REF(on_emag)) /obj/item/mod/module/dna_lock/on_uninstall() UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) @@ -1615,7 +1615,7 @@ /obj/item/mod/module/energy_shield/on_suit_activation() mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon) - RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, .proc/shield_reaction) + RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, PROC_REF(shield_reaction)) /obj/item/mod/module/energy_shield/on_suit_deactivation() var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index 02cc872c1ca69..9880401fa1fd6 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -112,10 +112,10 @@ if(!occupant || !mod_unit || busy) return set_busy(TRUE, "[initial(icon_state)]_raising") - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS) - addtimer(CALLBACK(src, .proc/play_install_sound), 2.5 SECONDS) - addtimer(CALLBACK(src, .proc/set_busy, TRUE, "[initial(icon_state)]_falling"), 5 SECONDS) - addtimer(CALLBACK(src, .proc/complete_process), 7.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_active"), 2.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(play_install_sound)), 2.5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(set_busy), TRUE, "[initial(icon_state)]_falling"), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(complete_process)), 7.5 SECONDS) /obj/machinery/mod_installer/proc/complete_process() set_busy(FALSE) @@ -144,7 +144,7 @@ if(!state_open) return FALSE ..() - addtimer(CALLBACK(src, .proc/start_process), 1 SECONDS) + addtimer(CALLBACK(src, PROC_REF(start_process)), 1 SECONDS) return TRUE /obj/machinery/mod_installer/relaymove(mob/living/user, direction) From cba6e1820c5b28e205151ff815a95341924a58de Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 11 Aug 2024 01:25:20 -0400 Subject: [PATCH 014/162] fixes modsuit icons --- code/modules/mod/mod_activation.dm | 6 +- code/modules/mod/mod_clothes.dm | 12 +- code/modules/mod/mod_control.dm | 7 +- icons/obj/clothing/modsuit/mod_clothing.dmi | Bin 73070 -> 66854 bytes tgui/packages/tgui/interfaces/MODsuit.js | 413 +++++++----------- .../features/game_preferences/mod_select.tsx | 8 +- 6 files changed, 174 insertions(+), 272 deletions(-) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index dc5621058c26b..363fa45a506c4 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -154,29 +154,27 @@ ///Seals or unseals the given part /obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal) if(seal) + part.icon_state = "[skin]-[part.base_icon_state]-sealed" part.clothing_flags |= part.visor_flags part.flags_inv |= part.visor_flags_inv part.flags_cover |= part.visor_flags_cover part.heat_protection = initial(part.heat_protection) part.cold_protection = initial(part.cold_protection) else + part.icon_state = "[skin]-[part.base_icon_state]" part.flags_cover &= ~part.visor_flags_cover part.flags_inv &= ~part.visor_flags_inv part.clothing_flags &= ~part.visor_flags part.heat_protection = NONE part.cold_protection = NONE if(part == boots) - boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]" wearer.update_inv_shoes() if(part == gauntlets) - gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]" wearer.update_inv_gloves() if(part == chestplate) - chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]" wearer.update_inv_wear_suit() wearer.update_inv_w_uniform() if(part == helmet) - helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]" if(seal) helmet.alternate_worn_layer = null else diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index e8007f34905b6..a220973844f3c 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -2,7 +2,8 @@ name = "MOD helmet" desc = "A helmet for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - icon_state = "helmet" + icon_state = "standard-helmet" + base_icon_state = "helmet" worn_icon = 'icons/mob/clothing/mod.dmi' armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = HEAD @@ -33,7 +34,8 @@ name = "MOD chestplate" desc = "A chestplate for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - icon_state = "chestplate" + icon_state = "standard-chestplate" + base_icon_state = "chestplate" worn_icon = 'icons/mob/clothing/mod.dmi' blood_overlay_type = "armor" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) @@ -60,7 +62,8 @@ name = "MOD gauntlets" desc = "A pair of gauntlets for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - icon_state = "gauntlets" + icon_state = "standard-gauntlets" + base_icon_state = "gauntlets" worn_icon = 'icons/mob/clothing/mod.dmi' armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = HANDS|ARMS @@ -93,7 +96,8 @@ name = "MOD boots" desc = "A pair of boots for a MODsuit." icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - icon_state = "boots" + icon_state = "standard-boots" + base_icon_state = "boots" worn_icon = 'icons/mob/clothing/mod.dmi' armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = FEET|LEGS diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 98f1794b1bd19..6a6a2b3047980 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -9,8 +9,9 @@ /obj/item/mod/control name = "MOD control unit" desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments." - icon_state = "control" + icon_state = "standard-control" item_state = "mod_control" + base_icon_state = "control" w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS @@ -374,6 +375,10 @@ continue . += module_icons +/obj/item/mod/control/update_icon_state() + icon_state = "[skin]-[base_icon_state][active ? "-sealed" : ""]" + return ..() + /obj/item/mod/control/proc/set_wearer(mob/user) wearer = user RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi index 76f35ae46ad0488fccc78c95035dc79a5a8e0143..6ab49417aa52fc2f8b2787ed8d79224c81df9d90 100644 GIT binary patch literal 66854 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%0A7g>Zjd5iA9_0+Y3~$SR=gU7Mr0EyqFpT1bvPO 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 Ay#N3J literal 73070 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 Nfv2mV%Q~loCIA`_u4(`P diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index ebaa3d0ff3979..2228ae519e7f0 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -12,11 +12,14 @@ const ConfigureNumberEntry = (props, context) => { maxValue={50} stepPixelSize={5} width="39px" - onChange={(e, value) => act('configure', { - "key": name, - "value": value, - "ref": module_ref, - })} /> + onChange={(e, value) => + act('configure', { + 'key': name, + 'value': value, + 'ref': module_ref, + }) + } + /> ); }; @@ -26,11 +29,13 @@ const ConfigureBoolEntry = (props, context) => { return ( act('configure', { - "key": name, - "value": !value, - "ref": module_ref, - })} + onClick={() => + act('configure', { + 'key': name, + 'value': !value, + 'ref': module_ref, + }) + } /> ); }; @@ -42,13 +47,14 @@ const ConfigureColorEntry = (props, context) => { <> @@ -186,72 +182,46 @@ const ConfigureScreen = (props, context) => { ); }; -const displayText = param => { +const displayText = (param) => { switch (param) { case 1: - return "Use"; + return 'Use'; case 2: - return "Toggle"; + return 'Toggle'; case 3: - return "Select"; + return 'Select'; } }; const ParametersSection = (props, context) => { const { act, data } = useBackend(context); - const { - active, - malfunctioning, - locked, - open, - selected_module, - complexity, - complexity_max, - wearer_name, - wearer_job, - AI, - } = data; - const status = malfunctioning - ? 'Malfunctioning' : active - ? 'Active' : 'Inactive'; + const { active, malfunctioning, locked, open, selected_module, complexity, complexity_max, wearer_name, wearer_job, AI } = + data; + const status = malfunctioning ? 'Malfunctioning' : active ? 'Active' : 'Inactive'; return (
act('activate')} /> - } > + buttons={
); @@ -259,43 +229,22 @@ const ParametersSection = (props, context) => { const HardwareSection = (props, context) => { const { act, data } = useBackend(context); - const { - active, - control, - helmet, - chestplate, - gauntlets, - boots, - cell, - charge, - } = data; + const { active, control, helmet, chestplate, gauntlets, boots, cell, charge } = data; return (
- - {control} - - - {helmet || "None"} - - - {chestplate || "None"} - - - {gauntlets || "None"} - - - {boots || "None"} - + {control} + {helmet || 'None'} + {chestplate || 'None'} + {gauntlets || 'None'} + {boots || 'None'} - {cell && ( + {(cell && ( - - {cell} - + {cell} { good: [0.6, Infinity], average: [0.3, 0.6], bad: [-Infinity, 0.3], - }} /> + }} + /> - ) || ( - No Cell Detected + )) || ( + + No Cell Detected + )}
@@ -317,26 +269,22 @@ const HardwareSection = (props, context) => { const InfoSection = (props, context) => { const { act, data } = useBackend(context); - const { - active, - modules, - } = data; - const info_modules = modules.filter(module => !!module.id); + const { active, modules } = data; + const info_modules = modules.filter((module) => !!module.id); return (
- {info_modules.length !== 0 && info_modules.map(module => { - const Module = ID2MODULE[module.id]; - return ( - - {!active && } - - - ); - }) || ( - No Info Modules Detected - )} + {(info_modules.length !== 0 && + info_modules.map((module) => { + const Module = ID2MODULE[module.id]; + return ( + + {!active && } + + + ); + })) || No Info Modules Detected}
); @@ -344,124 +292,81 @@ const InfoSection = (props, context) => { const ModuleSection = (props, context) => { const { act, data } = useBackend(context); - const { - complexity_max, - modules, - } = data; - const [configureState, setConfigureState] - = useLocalState(context, "module_configuration", null); + const { complexity_max, modules } = data; + const [configureState, setConfigureState] = useLocalState(context, 'module_configuration', null); return (
- {modules.length !== 0 && modules.map(module => { - return ( - - -
- {configureState === module.ref && ( - setConfigureState(null)} />)} - - - -
- - {module.description} - -
-
-
- ); - }) || ( + {(modules.length !== 0 && + modules.map((module) => { + return ( + + +
+ {configureState === module.ref && ( + setConfigureState(null)} + /> + )} + + + +
+ {module.description} +
+
+
+ ); + })) || ( No Modules Detected @@ -473,21 +378,11 @@ const ModuleSection = (props, context) => { export const MODsuit = (props, context) => { const { act, data } = useBackend(context); - const { - ui_theme, - interface_break, - } = data; + const { ui_theme, interface_break } = data; return ( - + - {!!interface_break && ( - - ) || ( + {(!!interface_break && ) || ( diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx index f3e7f31945af1..844b286e92374 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/game_preferences/mod_select.tsx @@ -1,8 +1,8 @@ -import { Feature, FeatureDropdownInput } from "../base"; +import { Feature, FeatureDropdownInput } from '../base'; export const mod_select: Feature = { - name: "MOD active module key", - category: "GAMEPLAY", - description: "The key you need to use an active MODsuit module.", + name: 'MOD active module key', + category: 'GAMEPLAY', + description: 'The key you need to use an active MODsuit module.', component: FeatureDropdownInput, }; From 8da52616d8f15e5f5c7cb594c70ac13e31c3306a Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 11 Aug 2024 01:27:22 -0400 Subject: [PATCH 015/162] wound to bleed --- code/modules/mod/mod_control.dm | 2 +- code/modules/mod/mod_theme.dm | 42 ++++++++++++++++----------------- 2 files changed, 22 insertions(+), 22 deletions(-) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 6a6a2b3047980..d15bad150aaf1 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -16,7 +16,7 @@ slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS slowdown = 2 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, BLEED = 10) actions_types = list(/datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, /datum/action/item_action/mod/module, /datum/action/item_action/mod/panel) resistance_flags = NONE max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index c7d975224687e..9a9829577a62b 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -14,7 +14,7 @@ /// Default skin of the MOD. var/default_skin = "standard" /// Armor shared across the MOD pieces. - var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, BLEED = 10) /// Resistance flags shared across the MOD pieces. var/resistance_flags = NONE /// Max heat protection shared across the MOD pieces. @@ -92,7 +92,7 @@ name = "engineering" desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." default_skin = "engineering" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, BLEED = 10) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -128,7 +128,7 @@ name = "atmospheric" desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit." default_skin = "atmospheric" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, BLEED = 10) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT slowdown_inactive = 1.5 @@ -164,7 +164,7 @@ name = "advanced" desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish." default_skin = "advanced" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, BLEED = 10) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -201,7 +201,7 @@ name = "mining" desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain." default_skin = "mining" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, BLEED = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT cell_drain = DEFAULT_CELL_DRAIN * 2 @@ -236,7 +236,7 @@ name = "medical" desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." default_skin = "medical" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, BLEED = 10) cell_drain = DEFAULT_CELL_DRAIN * 1.5 slowdown_inactive = 1 slowdown_active = 0.5 @@ -293,7 +293,7 @@ name = "rescue" desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments." default_skin = "rescue" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, BLEED = 10) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT cell_drain = DEFAULT_CELL_DRAIN * 1.5 @@ -330,7 +330,7 @@ name = "research" desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive." default_skin = "research" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, BLEED = 15) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 @@ -366,7 +366,7 @@ name = "security" desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity." default_skin = "security" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, BLEED = 20) siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 slowdown_inactive = 1 @@ -402,7 +402,7 @@ name = "safeguard" desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model." default_skin = "safeguard" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, BLEED = 25) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -438,7 +438,7 @@ name = "magnate" desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed." default_skin = "magnate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, BLEED = 20) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -475,7 +475,7 @@ name = "cosmohonk" desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost." default_skin = "cosmohonk" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, BLEED = 5) cell_drain = DEFAULT_CELL_DRAIN * 0.25 slowdown_inactive = 1.75 slowdown_active = 1.25 @@ -509,7 +509,7 @@ name = "syndicate" desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." default_skin = "syndicate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, BLEED = 25) max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 1 @@ -546,7 +546,7 @@ name = "elite" desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values." default_skin = "elite" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, BLEED = 25) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -584,7 +584,7 @@ name = "enchanted" desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." default_skin = "enchanted" - armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, BLEED = 30) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -622,7 +622,7 @@ name = "prototype" desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient." default_skin = "prototype" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, BLEED = 5) resistance_flags = FIRE_PROOF complexity_max = DEFAULT_MAX_COMPLEXITY + 10 slowdown_inactive = 2.5 @@ -658,7 +658,7 @@ name = "responsory" desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." default_skin = "responsory" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15) + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, BLEED = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -716,7 +716,7 @@ name = "apocryphal" desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." default_skin = "apocryphal" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, BLEED = 25) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -751,7 +751,7 @@ name = "corporate" desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers." default_skin = "corporate" - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, BLEED = 15) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -787,7 +787,7 @@ name = "debug" desc = "Strangely nostalgic." default_skin = "debug" - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, BLEED = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = 50 @@ -824,7 +824,7 @@ name = "administrative" desc = "A suit made of adminium. Who comes up with these stupid mineral names?" default_skin = "debug" - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, BLEED = 100) resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT complexity_max = 1000 From 0cb457456fe450e4e9cd7b7f809b6259e1b5fdce Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 11 Aug 2024 01:51:35 -0400 Subject: [PATCH 016/162] reorganize icons --- code/modules/clothing/gloves/_gloves.dm | 1 - code/modules/mod/mod_clothes.dm | 8 ++++---- code/modules/mod/mod_construction.dm | 1 + code/modules/mod/mod_control.dm | 3 +-- code/modules/mod/modules/_module.dm | 5 ++++- code/modules/mod/modules/modules.dm | 2 +- code/modules/research/techweb/all_nodes.dm | 4 ++-- icons/mob/clothing/mod.dmi | Bin 133664 -> 0 bytes icons/mob/clothing/modsuit/mod_clothing.dmi | Bin 0 -> 110307 bytes icons/mob/clothing/modsuit/mod_modules.dmi | Bin 0 -> 13210 bytes .../obj/clothing/modsuit/mod_construction.dmi | Bin 4600 -> 5423 bytes icons/obj/syringe.dmi | Bin 11636 -> 11210 bytes 12 files changed, 13 insertions(+), 11 deletions(-) delete mode 100644 icons/mob/clothing/mod.dmi create mode 100644 icons/mob/clothing/modsuit/mod_clothing.dmi create mode 100644 icons/mob/clothing/modsuit/mod_modules.dmi diff --git a/code/modules/clothing/gloves/_gloves.dm b/code/modules/clothing/gloves/_gloves.dm index 7c601c0c419f4..056f31627b718 100644 --- a/code/modules/clothing/gloves/_gloves.dm +++ b/code/modules/clothing/gloves/_gloves.dm @@ -5,7 +5,6 @@ icon = 'icons/obj/clothing/gloves.dmi' icon_state = "white" item_state = "wgloves" - worn_icon_state = "wgloves" siemens_coefficient = 0.5 body_parts_covered = HANDS slot_flags = ITEM_SLOT_GLOVES diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index a220973844f3c..e012ca7e3f004 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "standard-helmet" base_icon_state = "helmet" - worn_icon = 'icons/mob/clothing/mod.dmi' + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = HEAD heat_protection = HEAD @@ -36,7 +36,7 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "standard-chestplate" base_icon_state = "chestplate" - worn_icon = 'icons/mob/clothing/mod.dmi' + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' blood_overlay_type = "armor" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = CHEST|GROIN @@ -64,7 +64,7 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "standard-gauntlets" base_icon_state = "gauntlets" - worn_icon = 'icons/mob/clothing/mod.dmi' + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = HANDS|ARMS heat_protection = HANDS|ARMS @@ -98,7 +98,7 @@ icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' icon_state = "standard-boots" base_icon_state = "boots" - worn_icon = 'icons/mob/clothing/mod.dmi' + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25) body_parts_covered = FEET|LEGS heat_protection = FEET|LEGS diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 47fb2d0c824d1..d5930ec8b2fd4 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -1,5 +1,6 @@ /obj/item/mod/construction desc = "A part used in MOD construction." + icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' item_state = "rack_parts" /obj/item/mod/construction/helmet diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index d15bad150aaf1..97f17983467c9 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -3,8 +3,7 @@ name = "Base MOD" desc = "You should not see this, yell at a coder!" icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' - icon_state = "standard-control" - worn_icon = 'icons/mob/clothing/mod.dmi' + worn_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' /obj/item/mod/control name = "MOD control unit" diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 3a6d58c18dd60..de9f41892b9fb 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -1,5 +1,6 @@ /obj/item/mod/module name = "MOD module" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' icon_state = "module" /// If it can be removed var/removable = TRUE @@ -27,6 +28,8 @@ var/overlay_state_active /// Overlay given to the user when the module is used, lasts until cooldown finishes var/overlay_state_use + /// Icon file for the overlay. + var/overlay_icon_file = 'icons/mob/clothing/modsuit/mod_modules.dmi' /// What modules are we incompatible with? var/list/incompatible_modules = list() /// Cooldown after use @@ -239,7 +242,7 @@ used_overlay = overlay_state_inactive else return - var/mutable_appearance/module_icon = mutable_appearance('icons/mob/clothing/mod.dmi', used_overlay, layer = standing.layer + 0.1) + var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = standing.layer + 0.1) . += module_icon /// Updates the signal used by active modules to be activated diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm index 0365c65c2413a..61ad926e8021e 100644 --- a/code/modules/mod/modules/modules.dm +++ b/code/modules/mod/modules/modules.dm @@ -654,7 +654,7 @@ . = ..() if(!active) return - var/mutable_appearance/light_icon = mutable_appearance('icons/mob/clothing/mod.dmi', "module_light_on", layer = standing.layer + 0.2) + var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on", layer = standing.layer + 0.2) light_icon.appearance_flags = RESET_COLOR light_icon.color = light_color . += light_icon diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 2211b6c8ecf06..e3766f3cc837d 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1892,7 +1892,7 @@ design_ids = list( "mod_armor_atmospheric", "mod_jetpack", - "mod_rad_protection", + //"mod_rad_protection", "mod_emp_shield", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) @@ -2384,7 +2384,7 @@ ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 1000, TECHWEB_POINT_TYPE_NANITES = 1000) export_price = 5000 - + /datum/techweb_node/nanite_cc id = "nanite_cc" tech_tier = 5 diff --git a/icons/mob/clothing/mod.dmi b/icons/mob/clothing/mod.dmi deleted file mode 100644 index 684e1e797d30c87f5a38b1ba1734e298a134f5cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 133664 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�X9FF3fsv3oUQss>=EilW)AYQ9VmFM4UTp zQ`@d^a)xd_wzdpF$JSNQIgYOlGmp(h{VY$ZDz}%P^Od+o%y;Y7leV@t>q7&7X5W7} zZ%gwn6w6gxbfR1od=JK3L{3Z$uX5*QqtRVDdml@1A1bAfZ{OqlsFt6#xb*} z<*f{`!ej#lG%z?w1i84lJOt1)1@tN?=oIujSC4o7%rG;&OS<;p`DL5<& zb*|rOivxq8Z4ZiIpo)|2qp!l>U6q&LaP_2S7dmdSDE##88x?@)$f3QJK{kM)*=#G} zK2A2CgaY*04@?BqH3JykyrD|~92cT%Kb^KjTGT}j3m;rDU(cQQ@9Xb>H$1Ej>NhBo zNmeWGBN3!u?m`AoAP6cP2?rldgb8w1qYPO)FEzUDDx_ZXo}j~eaxf5s9Z z>c6q+B1+5$01)>|gQSpjQN+{?2@b~J0k5?MqoPY4@^0E?A__yiYF)J|kHKm-O_ z0IXWmmAK0!#Z5*nJ$@wQsT{6L6LTH7k&y6kr%*N~rU2kPGxp>|_AomAS$qJKOgkcF z&oP1~vHd5*mNj&nxMjc2_pz6&s24ihG>U}Mk4UFK1)B;=rSbmAR1;d`)_}L)fFIWR zUbl!PX7m?7qA$7jwT1a(gHgb*$?sD}8~Q5)mkT_!&)%P4v1gLGe(;m;+Ap60|Hi}$ z-?@RyD{W8yOi<&w+UQ}TmHn`uAJ(SQ#}zDhO~|KTt=|lT@q>Y9<0Kz|q(*Onl$Dd> z(jR6EV#tQVh6n=0$o70MH5f0ji8lP*H4!%>ig$5wpTe2PUnXS`fmiZ5nz0YO4R-xP>w+_|TR2=cJNGy12?c9NEB&tG;tr_f1Dh2_m(;K+jx#I3CQmGEBe(gws#d^H?F7?aKRU5sz>kSepZ{;2M;ZHFeI^?~bF3W;Z3~2oJ5N1SpMS!iAatoRuKSUnuZRB! z0<3`4(w73wZNs+E-=?i3iS6X4jXk?a z{|imBE6%TWw&7@-fklB`1%-YYPPJi@%Z5U9Xf{L}%LLyhis+++U~M(CtXU}PdE|az z+b)T!FtX4d{86lcUSXJiO8}~=T~ea#WjBNq0BZqsnADF&4LDh-3;z?eFqsG&3xX}# zfs*MOu#xh~A^8Czn3?r~ztq&qPz8|M&f5!JTL%Zr5m*lk`D0)N>Z~j*ui_n2K3|Z; z3l0aBQs2BN%xp5$$8;aa49LUoDAOvU&lJNSJN$9v%e<^f`urb+G>d(O6m2{4VJ#3j z^7`?+0pvr2tq+_g(mPdmq0|dC;Y+9(!g*|NX_v~K(r!X`AJkwmh1OA?B`bvlk%#`z z31MU5Ybf=tkQIj1$)|?vOO$GJQ^f+|+(#3wHALHoS-z3?fYpT`9Zwaz2L0&q%aWK? z>1=%T?Y&mC3}H|L+WL9^C5#=CPak}~qITo;HvN#FU=Fp^`O+#(vQ?nymOQJ}J8%0x z3iSG+SMzfe1lQMvS=khP)YoX70quCat)u7J>xW!x~&J;}?ND zqwQP-WZ?0d$9=s}1^J0E&++r#_8~3CLR<7vRn*dJ!-)?zTb_ArcYM_w^@%%g^neOK zW*fN1>AytjQDAiRsu)OFCyVUWU z8Z(ifXMyMZ>Apn`$zld=`tMS=ux}_!;GM8HYV;ZMyHI9kuQ;$h-F_gJo3{KM-e3&)>8!Dl7hZp{wKiFpbeFk(%-L{>Hb~FNlW8IPJ5oS(&wZ6r;A=ru z(o!&ZbEIFTH^~;C`!taQFn0Db@i2L}oJkWCMHko&jD299$E5a*91A*hgxw_8p^B^? z_6Zj{8S`ZFtiz~AduEP1eqYGuZCXZ5JpmT*R;#qgI?7#*bEK&78Au4JXsWDtYqmv> z-QfR{yN(dot{Of9K!!VK-ZLW;8|fy2+k9*DGD{LD(80RJSaG zNsVetAx4SHt0~wMcV0Gqkv}@E{VND75%9wZ?dN8XL#){Y8t99xKtpVy;gx04Sw}!YsA9f_?e}(T>MT=;p6V-ZXO-7*izPH z2MD3AWbQEhE%`{pb5l(S*DBdZP6$XxQCxaK4jfe@wcq7yp)!r5xY}M>(rHv-Kryz) zin`gU5Ldhj!m0mrnRh6q#1M4FM$Btl6_b7)=nHCDlU{n4J(bD-!V^RLDi&z+TCcqT z{kEq-b+xA+N$AyUV|M=D+a;${Gl=}h>6RO5r_+ix>7Bbkki59V^Xj0S+G*oZDX2&I z#8_0(9U^kW;(LRo8cvOYrv zHb)$oDNyX9A`h>ki)`qF9CF+$qRZ zA5OVfo;O(Z!*)CRgJw$RfC6?5Z158@dmVJ__1mrE-$yGm>*D_D?M( z6!$4>K@eG)O**jLe|yU}G_7i?^K7EZ{&JhDFNZ~HE4M`*+Am*CEy%WVZ<1VbZyDUA zv881OY-SdYO=c_{gVDZ4@H#|+st}1~6D=bJ5;Pf~jzePO)p7UkCI8|fm^8;`?Fd+y zmzQ+xdt&mm_hRl{!8Gs!+kKREc)tCEi~>R=qoRV|5jgaAV6v{(;-9ojw6}uQz5|bQ zgTNpklQB)5k_!HeJ>}ItXPA59Sbl@7${f5xSFfzeJOas4jG8zIxj-KreE*mO8gr$R z{m1xGeMg_^(lVHB%{Z|#4Qy>ebAT_$>f_6SM_IOhB*(Q9wQ+Ym#+52+DJ0sP7EZf> zA4$hA$++p{@q<{v{&SlK&ec}3)#eAUdoHRSa)Eb1l#RJKH3;lzeCN00K!&3tV%y=x zs%YP_{)0Kxs4ox?@bY$6_$E8{0(x5zx1;7!|M&mh-OVeLMWyP$@WN1SmKI^++7aGj ztQPjja9c|zXa>Rjm>~w`b_{Yt>(K|@QzPjMwm7GhZAb)s!(wmiq!57Qf;62#S($gnUY6cZqXS_GeMY)*AHX z9Y^_dF1zkU?{xr3tOn}zrERY-*xHuUqeekHHcINb>4gT3J@2$izhIYh=t}wxLIsd3 z=fH;x#B5WKnMs5SkK#)G0#i@SF1lk}k%>``F*K{{*Cua6StH@K1u_nMoOT!h{pzft~Pm zvS1TU{gIA%u)M1WVC ziw$SQQR z6*ox0EGd_$qsTfCebptr-8$EPdnxMymwa*&}Ur~rfkOw3vbGeGDCo>>_CActZ(G~ zZ@BsCxpKmd^(|K)wQ-cCTSgQKD>2Mh0W87#Fwyf^jw?t@GP2sw)iv5wCvL&Yi3!}g zx@7A9nS&9QmH?xl*H6uIc4wD%a7S{t6bHycS$>}KHhWJ&EDo@3iKGTL3g;Y+v^4KY zX%=dZ=WDJhoRc1#UdAMsfsTv!cj)8&|E{yw&Dzq(ss>pPa&oxXa;Ve}0j}72tm(e| z{`0l7rX)fb?_;@iuah5^)n&BIeWAl90*qW_nWKKcle^6x6GRBfU9wn)zXU9(1WE@k z-`MPW1TDrEcu}R8dzqC9ZF^jIYwQ8ZGwi|2-*;J5)-Ms&NN%VS-bfQS6%!Qj5i6*L zns=;e^%6y8(~X%+5T6Fg8pvsW|ghBe(u2z2PLI{_qs7r^#4Xw z2#)txN!G>wtVzNJrV%d1DpYqnO$B_5lw86gKSE6PV|MTcLyJi z0ZNuB#u3YiD~+dSlCL?Sj(SYV_Ob-SBSOe?HUOAe%Xge@{)i@)e0(wR->q7o1XIYt zKtG@s9$S7aQo@B#25wmwCO}!9@E|=c#Js>#hkAebESbEd8IWjd&jS?IG5+KE~;wH%)}S3^sFx1%xa0fSWAK6 z5_1eAJX4ZYWm~Opkb-|NtoVPL3{bj72{#JB z+XCiRt^6xb@yO~8^8;jqYU-Y=52P){r9k9g7El*ddfWTtb=Jj8>pF=YbaEk}hxC8U zZ=P-UNB;RH-W5U2r1!ws{isV#Y^A{_^X(6p6;7+QkY8#_sn3~Y1dzgL$v52sEiVM0 z#~`=)!MG5ln_mfP_?dcvg41A%EX_=C(Jnub_m46=zXv%zu9D8LjqIaai~%r5Th|yz z?&&|vm^PiV8AjC|%labPGem>!JV0mJj4Dn|ia0 z_l9TRirt?2&>*J55NR^B`?~eocV=2tTXVl^DMPYNZQdfeaul_g#WXkX2X)W(-XITw z@CMY7eqsdu^Yy!LMA~%3h`;zcRyff+|B)nu+Cqq}iy3G$$SpCypt~PX@zG zHYcZz)}L%LoX0~lP^Uxw{|bEz9>MG6OGDr3uDqEgu1&Kh9_1(Mxb{7L>v14JrJRWa zw>Mt1-F-358s2jxivjgDB&Tvacc5&v8YM#aWs(}VbDW|av3%X(X65~bwQJYscc-qr zAa!pzOtOjMyHAU7Bl~Z)I}dtmna3Ul-ouo>8N{rZx2$JU$~J2aBHwb2M!WNmcwP+C zuSVLOdCPa_GVceWxmSsBYhSYmPy;uT$Uj}+f(mo0UzORcb;E&d z-vS{|4|#=vbI2=c~Th@!u_8t5IIaumLwpB)`iopZ!X%};j3QT67|K}bIb}6j*LNjGukIoJ+YcXvASd8{N$ue zl@OuZthC3_DBaJnct)zRli2%2bY;E#h2%rw9g}ls?zXQD@_hU7xr}+M`79OEj6F4J zqyW~{JQgQ?l;LgaDjNey}(#Se4qU4Z)z*qo?-8d!>j%p@XC1jz8CmmO!2 z=@dj^mY?~c&s_&A4<+T9A;!LQ3sW^afO7y!j`obn_6^wFKP5cS^Q1vEMZD;h%)7Qw z^TeZ_z&1Ia1JynlBAZO3p%E3-PD09>OL>&6{Nqhw{tpXcq{_czx5kHLpR(dynBUNK37%}_8;TRl+o>Kcv&4R%X-n}k zXLby-#W($+%-Ki<%xd`y3i@z1u<)pw$V#M#-06&&dQbMG7Ug~E|I?Wqv zWt0cWt|Nc?E+JU7^y(kk2hHEVF#3GoQ20sjD?j1!b?Y%PP;`IG_KhZiJ_34XhxW1W z+pJag@mu&~y6RI9@OBJ^ixP31GDWkMeKWSw)lPXXVBs|QLNoBq;P|vC_Wats?x0u$ z5}KX>&IJ+k!yJ2Y%i~jy{01Bun0lNfMh`Cz@SbDO0NZqql>XgHgA-sy$*~o*(xVn>?CU-LAHVcyz8G*T%xXsKw}Sk zaL-{h`h~R6pgRZ>jQfqwKB6{!)mLRB1IL0*21Bd*ew(Tp{JgiUb)5I?_~AH}kaXGT z&I3E$wW_AjJg2T2c1Z#-@ldfpEm}K9epg1Xg%ZopRW^nPo{=PmAhlNmUkYy&Ja z;UUl~6aF?-3P6YVxi7uv?mgX* zh1P{+8>bHe9P}Vq(GfTGMD^MuGtr`r8`=lnZNjHsXPvuCUmkDgy4L1?#fhZaySd;} z*`9LP+laE@;RoNXMj@)|!)qZIT&e&qRXE>&oa`U=-i}$ksD|l027kFY@)lB>un%eWMb{5gC0G8v7ecz zqBc2tgOgJ_gi{Vg=$liB$TFE7HIvg!^yhre{Ea(9?V)MZ1xQ)5M`c-woUf6Dc$=39 z1|C^Lq-lK5@nd|Gdat~^!8>8^MC(C{#n_=8iZut+Q(Sm*A$#MjG$g-&akNK9mlwRjJCCL4Zmug5W+#Av{UK{tZtkKPc7GfTx%x^KK#Yfx}5zoixW0#TITEBr?MD!wxO}Lw+wm8u_BX zOm3tw?)R;Rq@->w-(r>AC=_X=%rs<@-3A~?d%;8`26K8&oB8vitT5QY7HS{^u3$ya ziYxMSuKT^T2NlS-+%9_Zf;bM+ zug^DXbin)05=TDvdH49EgztM7J}MsK2Ry7#9_`<{xbd}-jVR&uld256&TgD!Yimu> zWn%yZ0L0sWXC*GNIv=27p7O!SWotkv0p4M0*}@nA3;xM)n@0=>#aA!Wt!QIh&zmm5 zlBj#8l@53k3e7~SzrA6;s|Ln(Zh6yHJCmL45K7NUc>1*q)b+W@;Z@&jgoOwC#ESAq zSS^6T3T)QD$r_7nejD%c#|Y)a>baAp0b;bms>bIB0g>}^P_))}t(7%Ok4Q5+g+KjK zRu-QaC5b-+TLiyga_7e>qe*SGxi|W=QDskY5OgX^x8EGY_c|MSR{GPO-fdi`rfN+4=4Gn4-PXbueOi9?g ze_T_bwtEIl9p!0mIk-+WaOqkS06J+rYkA<{EyaVt*8GQV^tUf#sK7#8dgM9}Xs{Z1aO2A6=DK34&kL~SoElv1n z+u%T|+zJ-a4i1`S)FQs*y3rF|^~MhiF~(zfx@L;YGeK^wI-7r)CpH^oWCy>C{8~R= zuJ8oA&HNR-p|5uI5Tr<}YizlbUBMjZ?mBg$9&i3|h$rOgX?aT#@~%ZoB*G>Drzrpq zf*GD0lfTQC8v%MyJ4SwS8x-*dlYxsc_&7fpiQzcpb}frG1ww3-_f7KV0onPE_S5=>l>^P=lE&A`|183?7G7 zfQ8kBDWU4n`_P8yBH%1V6)#juR}JY|Vl?y|$#yrB1&ZIHeOlf`WFb7(hwVuu;y!_Z zUpjHtW}lwH?~F5X&sXp2(~+?;-RWBcm$SFCqTFQl4U0_#K$bFGX<*~|#3fB9VmYS@ z363~8cEs;Gg7bq>s$KtzX-*Ve@dyRK;*gQK;BV@9bG^pAr?t~yUM!;BO=SG1Eolg- z%KDH*WS5wUY)t`-$TzwwnzJ=&sNXC5BaTCefR87*{|`Svs2|=ETxal{sanU_Xiyvs z(R1B8kOB|0U+-Ok-(^fVpi~o8&uOxKt^$fYxUNa_!AoA|ejx_F^|gsQ9k3L}#iQSA zG8sAA8a{!~6x_GTjqxW!1b|k$#jIu;PZXb>cqh77C0Y~!5*D1%pwbISSM4&bQ3sF3 z3piu}Nexo3um1=kIsi|dL9PHzf5l5v8AN^rryTa4pjtFio|g!G2W3N6N!wms1;fMw z0i+l0=elr4>6Z9%l5h$B%P(FEr#Z3(KNdKfqTkykC82YAyB74YaOIO}fGmXz1NfNivVLg(F%*^mjx4bp+ z3MjY@05k%CgAz+Yz%iy?T|z#7Op;zgT4qJ9xUAEH=Y=<8#vbv--n#Z{%S*(FEAzJu zqKb{CAB8ue?b`)qo_d#UY?((R91BQH)ig=IWgxS?>xw+O4!p1rUII3zxh*c$eV2oH zck^52|MV0`92Edgkbn~)H(;I_CYg2yk2k4GUZZ_j{&Q3S`uY!1Ok4e-+wpF(@Iw71 zS~73nv&kL$p`hD6wuzSiR$dw5VCKQuJlIDPT@rDGY7LEupDQzle|Q}W+&(&i(+?2v zmqi`PEr}57!Jy0a--c2_y=Ba$B+zWy5^C~&r9IQ zfGOw-r=XOrUmg1mgJDVV31s*xHwU42_h2d=9Af}f0bmwjssOa;_WnFM{5~|K96``u z&;UmoW{~)~wkv(JVKZu=oml>C89C^?hreWlu-ea=*BCR-&#zl~(lI!r28J^QZP;mK zi*p?Qae3(1OfdQ#W=QRqFklq*;BF~1O1NU zIJfgt#ELU2-;3~eY>lW+3GHiyYp)FHz$r91z40^8U~c07&LpUbN&#NE#50Z$sA}5M zNZ&JEvPR1ouj5T2ev2=ANOV^UIIA1ZM)<5t;w5AIX%Ew25|mTu+xRf$<xgX2o&WMr8yr6H!ERNu+LDj|w=%x5xm|b7i(g*4hfO1fN6zM>*h>5r9A@ z1J#;Crr zwi3WtM71#laDYL-R1)s?1p`AOM1WEArnKMg(mdIu{wLHFlfB*+la(6v7HN;T{~azL zSx*#2aN0!owIqloahwX1<8Y&By2M+7{@| zK3(gJHAMlMq9P3V6eDRr1_HLrEaNFbh_g~a@H(85-v4^CQ$5Ju~YTLavGNAw1=g9RY4QQ+Vb zlMdAYzADTeT^&6^J$hM2@oYuF!R}`E?eC>?M#r9J^0G@pOPdsM+sfpnCN-tos@|31 zHTMuk`laaA4de)cw@CaK=vpD9@zs}?fMXzV(3do6Ki)C7eWdSl300ki=wUru|2^ST zLXGi-bF5e64mj7=+OOPqtG^Qtwx6Jp=V?wfEtzT94i2U)l{#KI>K2&v>HGWtfAe}_%yRF! z=RW6I-p~7a&Sf{VKn0V|Sbb!hv6?%5L@nmsgIbOcQ!Uc&*%jSZI@nSg$pYH1y# z!KtvvyE(3%4+qjU`d6hM%7p{`=nl5gert{qDDlXBUxqHu{%1nZELLTsz(2H8f06L! z2h8HKJF?rAT=*rc6#K9`eNY}UZVVWPDS*Ke*r{Sfwwa7)j$<1+uB&y~;J!t%jXp-E z$&N?&f-V!jCGwZmko3j=w?*H+8KZ&>OIaP^qXyOnoRjVTi%_6hm#whJPzA)^w)!6C z9GqU%Ud}5tJ((s$z||#Vv*kp?d)z5JBQPWJk!7(%7$~*FM~@eLPh*l%h#Okw@B7}5 zvK4zARbRFbBIs`$={qMKxN&X?eFLnVsfg>FFh{)|`Un)pO3p-qZbWR%USrU83a00c z(C&Kf5@5&D;wdum2Hf&pv9+#rP!jRjE85u2*Z-0tE8r{2@^`O*L7e|xeW>@GrY)q}V|zaNRyt*&c$2}g00aq)<5N+N!;vc1 z0!(eMbA{%ON)iBJ2{Zdm87i7d>)XN;^P67_imHGjp^{32f-!NZc0$0YOu=CI4WV&N zEKvx^Lj3`i)eyRJPeNe+UIH1DGB~8!4VeuJ!G^b)tf}k&UI@$vBMa6&M1fs^o;{ehL1?O;)M9M7 z0R^9_SZ?IHOvPK8AQ>z4L&?;!(vSH>U_}e#?Ajff`UNzeBGT=)La&P?3Ib8ty}rl81J7GuwRqfw+fW0_@CXIDdKs-L8_onMRr8W>Z}}s!@9XTnPtb4ZoH>PyER%`GB7fj$ZafiXoRBNw;a7ggFWyT$xJlp4J{I~q`ECJ&Yah&LjWlfwk` zoF!`y9JP?z7{*(L{UxI@I(yE>ZpGfQLV5uu*HRl29qRHY%mY>mM@DA4#f=n!zOGo? z?&*=MT0i#_jM%yk!F0)Ue{B#}^VQAhHd?xK4OS^yf|Zmlz^!?d+faYra5KWj+}$m! zJ+cR%orYif=2Zi}c$)nlEg*xlKOl7m4SF)ibrt&+BJf6M*+_DShW{{oLQt1xE)AH( z$DPFK&(`l~*%!-HEqm~vN|+7T*S(-GfvNae&a11b&Baw<;Dur^y6Z7~p|ZffxQ3PBC;A zzOoIQ$V@LQdsuE^1trb&_bEYUHm0X;;NyQ7(%&t)x&KHd%TGB@!U_=mDJIpOh5;KZ z3&MpMHX$u5O#Ae8X@IY6fq=r?%E}B_k=;{2A$@Z9H81e{uDehtf#6DFkJH)C84kR( zG!AfUhSuhaSqpVLFBCGa11~LW4}8__yP#9kzW@egD22uwn}FjpNO~fvH{K#~P(dNM zH*IU^jgW2T9#h~O3?;}Eg$Spez5{v1_g}2OVXRflk_gcKP6{fRVQH3_)gb8rxv zJ)YQ{h#T)S@Q_7&$+7~hshwzJg@@=du>zGB?>JwyC;A!zJr^;7LNi0vm*C~VW@hqO zU;?v89L%wlj&=|7!UXn6mpfLk0ZvRBEtFOUz_@dDKMuok)B^f&w~u@z?Y~}sCY-FeTWY;9o)L+fJBc)mxcBX ziS0)AU*y`79%$Qx(XZZy5F-HDAz81B`+~$z^Luj1H4h$&MzAc@M(w&3?3V9*ASW}C z`IDm**gWLCbKn6BUx6yl+65m86KSXJfQ~hCgFY>7iV2um_G?ZaY4n)CxM@v1N!2tj zK$X*I6G1uvN=Q~XwtW#7#GiwnkGgoK*=5`N9)Ndrwocw z{y|FU;!r@B1&;%aVpxwrV?KziNVv+e2~ z->skbOAT(#QjOd0-5&97Pwz&6Ic$T!tSy8{0NW^&eeqX#`GKy$1tYKSl!ec9CqTdo zs6s~GOFtm!NNhE${;XKq*Di9R*_=~lz(w2vMjFOMN2JQPBUW=_3-8hRXX(x^`mjJ2 z8T2M2B^FXRk?ENYi@#(!rtG7K zw6ZuiIczsOA9z9ef0HZ`0f<*o)N6Q(U>5cb_xk(8H98&W6o3iybtm8|$dpxeQ-AqQ z_mQ62_sJ`QJbq5DSOfaCgVO~W7B!$ufl$fl<9L)gCYmuPq_Ti(-)HX)I2uA6NWUS==xSya$q~B(;zBFxhwSQ>(%Pad=$@nl$kr!v zO82kiACe~M@ez5_`vd3%fIzeT4^&dCPVszYpIEy-Twr9fEQsasva51FT5GUJU8`na z&u54Aq&n2=IlzU}>F!SvQ^Ge?4;D|_q<|wjujFJc+$<+2=UVNd-!1$6dbeV9)UN%? zcZaMZ5tu_d=-+ycn{87&`KECr~3XJ`DH%a*XB&qF!P?cWBQb}gzjVBUiEU_Zp zHUmc~0+qF*Md_spJ&)E42CByfl}9j&mNelR@nq2=r>fsKCUQKDm;SzT)P{ZSl)REe zwphPg*;6pGjh*4tUv#XM9$5^VU+i9NyHbs_ENvPqwlyQ>RvCISv`-vwtl|7)PYARp zvq4FBKQgE1!9@vS^<&4qsxI6i$xqyPC@!CZNJgo^WwMiZQQ9}AQ|FQtb~{x%CzM0_ z?3r&4r7N#F4_gTpF1RZ>KJ|D?LkM_3nNg&Ea9yD^Et^E9uas%CiiF!<4YQv4Wo*(o zSAD&Il>12^u;=XOXTKWpf>9y+&4Kc?kBS0x!vy8 zMJERY5bM~=X*u4BTIs6T$TnGZ(<=FO@tX36)?J{aWow#O%ELW#rPVD%AqTQpsUzGD z)cGjr!WHIL+cqO6=Or9xF1AK+yx;mpymepGN{&#f6xQ4oZ`?~m79ry(P{#dSnpuP4byzQA@oy@hh-R&PTJ z!eRLdLFxfHzsoWkPZ8qw*7ob6U@cwUvfsZa{iGc1qYcT6b!}tVCC~Pajt0jrP{{2? zC;+(EvioyLdb&yGi$CgFJ%xM{3E0WHN!k;^Ijamw4j2s0*RLkarF(l~`h=TZF=p-Z z-crRF>Dyl6&If!G#UbD7Tk7?8o_Kk&5=y2<3rA&(7q5>W8G+9VJ}~Bcevw^k!=Lij z1*_xL<*HCzT|7e6)Yc{k$|rmW@;PA06$RQ;C1hcs853wI^!dT)<~!>GYd&Mb%wy1r z=Cwamt{*$$1q;H2xR!N~&bhk`t2mi3l-Z31fRRu;m^+z7U6PiP8v5(?dq86dmlmcl zz=UXi9UjVRsfA<^{bb(9jM#z4gQ>H9E#@SB72M*pkF!+8vpI@N%FDlg|9%!!;l5Hf zx~%L#m{kZ_qU*O`>-r=E*hgnGL3^ZL7aiC+`41(PsxyCwR87=7%u8orG6HhSPZL73 zw4~pIH!kX)E(9Wmf4ew@i7snTKh~&85!*jA$9!KXk6uGx``z!Nvmf@51mOTzu^8)s z_>%@ijMk=RX8qICfz##6jSk=GzU>P{_f1b{_P7hH&$(ri{1nIv3Jcr)+kpCc5Wy+{ z8vZSxyMm?me>5juL{xdqw(TRghkBw*aH#UQ3M2NQ+$p%YY6YoeO!vAQ_Nf@gq{s7@ zI3LJya)C8LTW4gw#Gh1CbDyo?$3rlC;7)zVCLilK)trMl))Y~Acz6UhkLcBzMm6zY zg(KSe8?$grv9df=SzA5^3UeZI#kKcP!A{Q_;3w71dm8F=fOA*DLL% zKiyp1(oEgbu)oL6YneUe!X4z*S%u;sFME~hk9?flN!nL5PsMNZI<>xHBP%=cK}cE% zj=m)h7v*$u|Clko+o$notuas#B{g z0ZmS|gQ-FsH;*5c&J+VVlueyriK0@&_m_Q5OKaQ;+sgP_m^XYWqgttBc)?EH^Bw@F z^8W5gg(5eWQ>6YfvzV85GH-2kU#x(Uu}&blf;dTz2GATD zw9pGVk8@vu`;}d%*d_Dv39D>Z$8V-&=#BpJQpq2~mw2S4UfSXE+|@@Rji3W=S$t0V z8!IzA24Y9%^yR50B(7&Y2TcUc5A>p5TEBr*;YXlV?EM7C#|Ivz7tEpcu*p-R@xXVV zQyQO`a6Bwo+r}Y#v2h&T^4_N$>DgIHSpWY1Wg5yFM-7v3mLs6nLY)uakexd}3xg?! zGm^#6PEoMPB@*Mm9>X%oMP!fuAf!J<6Jr;MG=BIa)#{*jeftZ3@4&sacBuZrWb|Wr zKQiV`oaZHNe7nSrFvg;yA{cB99!K)V4u60B=*HuxRa8%&xIGCgu=1LgaN)KSJu4&A z=Ct3CR`K)nlP9eXg3}sBi0R`DnuZSM!)fMm89DRJ*49|RV6)o@czJa^vFE@Rob|qa zDk-n^em%ngRre%9fmI3LIx$vvUtwZ0R@UCm;$&`z5mx-ov?4bUNo9;z8TI|ul zCX~tC>J)1VN`5@*jzG1J=$3i=%iFjf^Y5%yiZ^Nc}Lt0*Cc;`=*UGQT9&+Qnwmxm$rPz~Q%a`xW}vWhBXi4>t6_fX;5A zv;EXpVC_1^B+=@;xrzKC(%lmNPg!k&R&jC6hHLox=9l117os(RW`)^#oiDxJiN2nn zQAr}{%9wpzYgc*fEN%r~4F`rR7AO^Y6zZd7^8*#k1BGU{atFQ7td5yC(%P`e44o^Q z`JNPaZNG8p58&TS ze*Yp}v<6~DO6;!Tu}aO*Vam>E52PNS+=%WU9et(S)!M3gCtn#TnfQ^Fjd;(4NJaAa zoH#lY!vfSk?y4BvTlFGn;ImCUmRQ(5tR5KoG5k&4)YWyvqm~d3Uak0pg)HQyVXCmO zJo}BcPpPT4HgR|@?}%Lfk(H&=H#8>oo`)Zih$bwzbM5H~C-2uxh3=HIw+~Sk_i(;qvjF!BN01yfSY37Kt zGHY&e#L@ z47Aahr#JicaVYqjmpsc*ED#}gvw!GA>uXVBIQ$H-&Y*9I@scJ)PJbH`@2{h;eF|cx zkQ9n1bv>%NzPC6(pA%p&Lf_NT@v)9F`3u6b81u?ze|BI&)>3%^&8vOVf6u>R)@&vS zd0irCfcf?CXdRQ1V~YarR*=+^U${?Sv&>|u)XXW-)JncX?|Alz1G;?Zyir7`LV>5CiJX6hTVw1I9yH{%w13&%r5I2RDD*ta??Q^^eOO81kz$x>rEMGxgiI%)?y4R z2ITyix3j*~dz zL^gnU0AITPr1>L+1~7~PUWphywR&B+*atWiIAx=qbbs9KtZ@vbGZVb6%_G0jZLZN1q&vT<6JzYQfYT}0|eDt02B(W#-d+6&(witeEw|f)K zLoVNHC4347B=YlFRTz!V1@1ZF95v&k7>qcy&|<3pS_1(QcGdmNde6sTuPA#k=XK14 zef(+I#S7vx$1p$eeAME|^OcKb;5qDpGTV3Qh!NFyGrQ+GvrC_;8O0f#`rYgOz4Teb z%C$%IW73yCEcbF_wi7P5{a;*y%Q;d)jDhmUb1EU&b3?6&=E9(Qqb}RFVV~Uv@`0dL zj)DMR37|d@}60c8&g3ZRu^4e(~wG zxJ^0a;Vy?zo*YJ0_3KC@f)aLr+X2#~ynNutKqqHP4$p<>@u*ufjkJsvY+AgA;?ypMBoNN2>1scPUxGZMZndd{kFSRVccyR-jdj6-&d0 z??}0W`yxzeRgrkUfAPD}yWEivACg*d4u;KN7sx>^uFURxN4Y(^aEx7;-(nA&Bkvbs&VIPx!{inoST-UA^tkA%LqR5;>05kX$_1eWZiun3C&~&QmrTXD)p@9a!jm`U~aCow=AH#@6^J^xe zg9cR$FqG9g5|+*Ae@<^O?(T+!6W=M|I>G$#czv6-cHkB9>lEoS6n3l#lEUQrRVT#U zbe=wadd~;C?x&`vY~cFj0IUHbRHwr?0ry5J?@_dXkogLjAWFJemU|a{toMN3t}ti2 ztDe*9#DoG-G{8#e*FN1LlVkk`+^cb&YiT|TZ9VQ+H5m4pb_z*mt!jmddu#OAw>%J% zFE?FwPgFL+4SmI~Zevm6(*awc9iHdb-tlF<{UO=m)elBS5_wmp_Nf(GXzB$-Q}+HM zjFP?0GMs-Dof$TI0Gf4D@BJ-v{m@RF9%wQty)3W(+gh1LU*HbW!=vDaY)|aLOM>eA zYuvyUOtt6pFv=43YyP4^{e~nvz*}m~3tSnyrQ(|r2(kg8HO!7|dLRoPU{~+k<{%<$ z?*L|!oF&5irUD((%*y>(S<-Um+o*Ika!BnIees*nWjDVAH(n@|0?J+K zQt%~g^mlQ%sGl-&o({AT*BY--AA31?dQy6HqB|-Rh~1MX-@w~fr7hub_DpY3#Dx>@X&6~eD?O%SH zj9+hlWoPH)IR#p>J3<|!k?pKNFFkxQ80OBv0qgbgbNT~wv- zaTwDD7w*is8q!Ikq=R^iBNq{sKms#@1(D_J$Hft`QK_6aJ5XEF4~iNmy01t(zSMF6 zJD5BIf^ay)H#u1F%@DMT4xIbs;YxOFSj*k#S!O2Inx?qGM=QP>2ymo6PbTZyqK4g> zhJIQOnYNWOf9FpOU)doUSrJ>^&mY z?sXDX#3RfJE(fT;3sLGA(w{31#s5t$Rf^Y|@FiAh4QcS?=b-z%3$vOwMw)E7@#9$+ zM5IhJ-c7J?TebCX32ZRe?cKe0JSO+??NrGK)<=?J4Tt@W9NDSYB5GxiYlH;HE>Kn3 z_H%E4N<1_OsH-q{Gm!2Z^7T2$6?QS6&UKTEnE2uX{-Lfgp{JM>ek>rCB5@Dt6=)SqGzaD=T{X9on&M+wCXZ?f-h zXJ@k}8;a{T_B~i~+tRVw7uQ8a_a5$8wn%|?u>z4`)XUBkk$o$l#RgN?!fYLoYWq?L zoe>M)JAE!aux(8c&0BI&VeKg`|5o;g8vNPMb{aq0scQB88xoKGB1Ex-wz|FMN9pY{2Q$!!9Ax{G;IUO3# z{~5ftxxVNoyXQ13ReF^0zT=($#!RVHZ=&n%^09ct$XiaLIa|3EjO4j0;;C|IQ-#y7 z(?G(&AJ-9!bNkGR$H8n5KGDOkgu18hd3jxuzJ0sPK5~LZEk=~f*KK^xUb4FB<$ayriD)khTS7PQkw*~H z`w1ASlE;)hTdv(B@Fxc>eRsPN#?Ipn^5K=l>xdvT-d@&i}W>to_ zITGuH^xbp^svKtuI_sHhmpT=b!!i>X9mX|K#qk$%ugRfK-CICc8vl}JY5K+@gOR&l zxDkAjG3CM3mEAcWEo>>`GXwg9LsH#bSbP^iXFn5Dn94#Aebok?KDa8x|7g@VGi#gH z>cMnkR;SZOxn^~IZV*#?V7It@t=61BA&P&UbO2`{zZ|g#J3Q!3eF3rwF3=WNjaO`m zEDRieRbxNJ)@j5?pLri1ZxEGqy+uHT6XrYPuPi?i-q$Cbiu`nxU_b*Nk2eBknyM`r4{@wkttX?j2d4l|QRJQU+vfkadNq5?mu0o%zkQ(LSLX zAz1u5Eu{%&nYO>GRy`$8`Rav<8V0pvtS+XK6u47c!_)oFyU`dWt)GXTE7AD8GUrh?> zJ^Re0)%?3P4)jlBREGQt=s{d?C0VMn)pcBJQScsfK36MvCylP|pQhfaGOzXpZ|J*) zC3Rol#THa&k^?uUV*N9d28Iej*j5O!Zi*AQCL%mXrSDa!_Db0*zjhSq&uJtx!IaR6 zh({zEcb_B}K?E;eP9;+SCvqskn^<7=m3yu*_C&kj0$bLenbI{Pw*~$38qO1_l~(e5 zhmX)4md%5$W`uxiCng@)MD+c8CjrRY2no3ID84O>$!f&Bg*mG_C<8T)GrdvtBN|<@ zBhnq5%X3KjbAv8HB;nuL$!R0R`~mKqHY4ipcpLTw>@-lzOVI#~_3zoX)>h2UUy5q~ za@_sfx0T_kc86BOmjjKN*0x`5bDrOJ;1C^!42OTy8V?A&=wjkL?uhz@r|fB1C5ARVT`IYN8Ouv$lWDNT+*IW1^scMmq}X0wyQ- z3{rbnd0RPw4K|^mFivCut`S*U8dp^OMJwEu`?FEXJoe^ot8`Xac~eDMVUqe*S9KL&lMMlH3Siv zoV+{?X1^lEz@g_qc#r|}Q*+wF^i(@U9v-A5=lVy8J`;Rr>&kx@{Z+ybqfqpsegxg`>IoQ zmUb-^z`<(HmDj9u>3-H5EC4X=YOLk2$w*y}tc-&i1Idn+!;aHRkdVodJPlo2Pv~QX z(ciMKC5JHy8GQSJaFvgny|i{D$fo}TRzI;}ND5Q-T6Qz=MU~IG4aXX-1wXQVO=dV% z({PP$A|bW#anKS+7%^%3^cSz*H3*`{_l%zdmF3y6!QYcG>gAQ4!1)B0r%JB_tOWL+ zgUGTKU2%qT`LgWp`|vS^CRxBo5*NZe-zLq$l6*OQB*As`LH6j!_}kvwL4~_c&@Dc? z55nZ{LZgRo|I=g!`^rmUqar3Szty<2G2`PJ$RL)tyFwSPhj1jXI15)2GDvxNEl)#N z1H7b%_MW4kw8jS;tleg_j@>iwRWR=}zp_<*sL#By^2A#UexQ0Av#%H}B5f9hv6c5b zUcz{(60)YodyZxvg7kS$er; zzbA7B#7OCG9U%kzHxWlwFz!03b07*r1_##%sfN#@^Hcbwd_h_u7%6#w?uX~$FoZT- zxZocj|MjPC1edh5)>Fyfzl%Plr}t;)<;jAC&1E(x5>VzuFg3N~Mp@Dx>H5@47C$e+ z4*1?bFSJmbUS@$$Mr)uEGXZo%@evkM!FXbMu_D%>lpOYoYyE}U!BYmAE<7};CV3pA zwZqAado6g|S+`gOH>Ua(6}|hxeg*85{+Ji<%|`BWVryQWso$a?DQ4O>6-ZckN041R+Z1(FxNt#C>;E`^T1=I1M7~@fEa4H_iGs9gHSigeKaW9@ylTcks8JW;>*{bGllRWDLD_LI8 zS>;; zyB6DhLpC6QTfR)t80UI-oq}}BSFl6`mK{I@XcEkCWKa3wqu+)A4|^VJPqxi5`Cm|9 zjO(wAZBbIa;RlbbbpLy47tNKYRrVFR#NjjVV@r+ZE-Tvu+qK{w69yjc<3r_x_k3<$ z4Sf=*O*Jzw}kv5?Sljz{2I2;JK{BLMkHFq$WowndJ1A!HVyH2YaW(?H6;!UJ%a zvaKr5YL!YQrV_sM;_ol*#eD&)`J)7rD|R>0&lWWeKot35W%{+(WGVnzgMr97mpmx% zXxZZ3OBbd^Nc)-b`T0xIg#E(1oo+qB4mbO0t?9fsIWKp54*rp%e1PlwdlVLm)-ie5 z)fIUMXAifpH|?%1_3B9nEA#LHT>4`7*zao}#v~$oN|B~WH9%?U29%b;oRShd3-@+; z*k1AF9kNX@_4W11?(hisl|#%PPoz0JK+~9AgbgqJ9B$ z(wtfIHs0w=Et9prz;1tUS>#=^mMQHsW*;+}=@#(S%NmGYXnYyl0Se!0*01;MvVOPs z%eyA_mBJM>+v^Wh1c~xrr&aLRUsPtLKKWIs@8a@mEE@KFBCx7>2{GYb?^)7TxGRU( z_*2$h$H7MO!8QH~{}a#Sw|NmTJp_%oM9=rIL;+yb7*)3%1`TB*);^nh087~tjqlVY z%sHa@IvZ=`LEk_HJr0sGf^KrELK<>*1An>os_(=) z8qst3XqcMO$-%1AZ>JS~P%Egqx}0y^gDNh=c@cDAY0rXmZrj+5bvO>1;E@lWS()6I zz>osV2+TO!L3O5f=yk$qo6w8E4@u-bW5IN$Occhfr}rhbKKOE$J(BYsZc-h%9=uuN;LdJqko2(B@uC}RF(%MJcX=)r09qjz@u9)R z0`GI`=)?bTTHRsY5;Gana27k=3vezZVkvgS;7vRU*E6|~yL84@WZnz|nZIJjWYXBj zD-Okez50Nh&>>iS20+xCPY9j2BE)>tH!a!v?vlPgi+4?;+kD2RHnvM~a&qPaL;O@@ z#WI6oz9cnM-;Mh@7EPPD$&v75#=LGCNKZvM-Hev7)K_(FXkt$;?bK;#OtslAkUGPk zhA7e6+Q_~Ci}Y{GpA zn}tVLl59ZYcDOjOrwC%pq!sZO%hWM1S;h5$XfM-ip?P)S#)JS#qIv3TBa>mY^zx`# z*T~j}Eu1T@K6-C9fwq`-81>?dwRqzvdAl7d7{h*8gOSz36-=GTGb8cO(rXUfxq09U z97}&#W52x?z}yzr**O^6aB0F%xc}B<@@t1DA6xnWhwiVE@xqk&<1k=jF98npotYrvXArx;lQVtpy(Ct~21wffHTPmt`K>n@i z`|f4nZ4rV&$WTq+3S|SsBH&xddn0*njq9-7vZkWWJEEPXl#Ki4f;P!2V9kNlFw2#d zR0EU#y(UbCEn|YxpXTFIkz|2~-}9t+c$f{k^P@zL6qJZR4y|HJ**aemELIEWZdk!L zuM$DmOZ$No&z+IuBN5C5w-Y9M7Q&2ws~VBslQx|w9bF_4sIalVCB_}+7ZzN6fwVDGdVYBS>VpGD`>E33F%6EG=y3Q) z13#DXKm)#v=Iso8s%?1UMY0tgFn$RWDZ0Oip|3G+0`i zmCg)nK4u19)#Q1ThM-kqs}uv%U|EO2gPJN2*(^odkUIMJ!a7OpWb4YduLE}U-9vCJ zgFS?(5kZ>3^~mRpd+#Rhr9%ykw^g{_M)gZf zjiyL$I*{~BNhMEQNi-1~-^HgDCbHPykLg{#Ak(6*((YU6WUotOwEyMCd5Wb@kg1bAx$PP!2&T}jr1X_w697GifoWD&J%$Sx zz7lTa2boQDBZY$LEL%p(IRWL#a|$qiq{_-@OgC6z*?FbOo%XHUwi8#j95j`EyrHNv z#ESVqTy%e244LW=rnO)mBEtcqE)=yzAaihFyssD(yrzEO)&X7!s2~|&8i2$4>JMlH zzzetQzbr}xJH%6-$BNE`)vOfaPBv?nTZh^WgNHMeWf;oH0@!FFSdE<^-jlE97%R#0 zy_QEWfC-`bCGY*kOh_yNOMWbxctJ}kk?IRKhh>X7AwY;I$Eba>yBQLxe>k#}Wss6D z2K+d}onxCEEIg}`#&Hy8#P-a%^_RopUc2u?&zo2}7DH)<-!=pzX$G!4bwUe9d!lZc z#ol1!==WJCZ9Ais%GY&+%zk!@(PuTjG&)VW+(T;JnD>d#e*^za7jO1SWqFm(2M=5v zSpCiO&mIm)7k5RY^=}kZBTrpBi2U2Y!0h;A>uo1qTH=wtw^0`{fO{?lzxWg=!TS=V zv>@Ph2CW~UplMFM%`PC5kIdNEy%Gc>^N4A-Fbc>NCu|F7R zdL~k{t(4aWo7}=*kgEtB$Hy1PDRV`;gQ(u@ymx&Pqa#AHVAM zgIT|Ty>06?j&=dS84s)tGCCnNTu5T#ly)Qonnh$Y?qISG+%bY0l# zzq2=6?gyxNig|-{Pu^|@s2W=tuv4rGj`7DrgWZ4`MmHd0+ zC-8E4*4ji#MpN`o$3g@tIO{v(6GR+*|KOS+$#!HJjFW<3dL;!|C+(UyVI|+LB-4Oa z+rYzn9G2$>ML`k9n43g!_~)Lqa&~Z(7vKK?C8PVG$tnm8KMM1*3`?FP>8?k6Dsp|y zuOTci(EPUK?CRA{m)nV;fMva>90T!dX(dU;t<#i#<$4$7CdFIxrOnSd<+)u=1NNc1 z0$4qDvk<(bo_z@vqF&r~SoqCnCF)(G)Ng*0Re_eLR{0)`)Q_Q3T1~o~pqjxM=A;E* zy8)AdX79B_OGJeO^}_LWTAUgitkS1n!s?!{BTvt1m>$W@hGNZc%IP_!gMIRb*#BCe zaBU?il7G<>clZenbS7Nx!$=2R+{3+9Dh9L;o2Vtidg6*@8ZH>9=7B?w_?1nle%TTT z?#Tlm*X9MQt?~%SfQD}iY+a%l?#+d^u7-`=L~(81MAqkeUT2>mq~GT8_WF_f%G1|_pdo?YU?@-5DL9lJ76i)_4-MgnA)R%F3L-FN?#R(dW*8?n!b0E;4 zTy*}4>3o&c;Y}+mMmT4i&mO*NB&cX+mK(#>S0I$6nd#%r0C*r+Kq^%wRxjV|EPV>t z+OFtfN)!#tq=jB}?U~yQs#m87sm#g4XF*5u!9(1I7IaPa#UAk!T* zP1E@uQMw)Y0)BUUMtB%Xl47jK(gHcsd}T13EzWE7Rnl!`l)h66RNBdw4pp6PY{C*)@Gk#32-Px|30+Rs;JpN@u$4F zY*arFFw4K|0lVz9D2Fp@*rPVnRsTNbCg5I|G_?%|9S$`>UrBn3VO%E+7vFv-UN zS+BBpK6|7HQK|om#2Vhi+Y+}==s)j8BA{322kKa|7fS*SI6yvb-}L}3XSNS#{zk03_X(@VqiM>^2CkeJ>s6C*P#l{WR5gr+(LHQP-l|E}pb zBNK`ESK@(8Mqa>sG2bgrWO0B1C22GO2rNKqXXV!3x)sySGiK{AQ2X_i9DCR6aK5S- zGA&7Olv>rmwOcG>XwPx0T{*B`nzlE>Hr!lPjm%yk&NCcTjft0N$Nms_?pF!%D_4ep z33NboK6PEquYjUe`SJypS487i@-YGibxg27$BHE^?kLn8uk%cbel0&-EO3>7GUca* zrm#w+_xeT;fqJ)IkB(GWJ#u&#s^{<&PesYh=YaA$BWas2wwoY1fz;chm^>82JtdHh zMQ-z5fMwsCq=4BUdmBkqXp{Jzz>FF`sq3!KAV9P^{EY0-A2H~B6?(8La8%@m=;4OB z+o2pU_Yt&x)LSyJjcwEfFfKD%)pn`OHiXb17SiL^dWF}n_zHrH10#v+uzpzb9V0Tm zxweg^fLx0}ryIPM$N>w#h9si#=3aH2Fg(d?qZ%As7VNlvrfFhB%wxw_v|{2~(S-3E zFin7lILq57H^@`i>lY92AD{G#kLO%o1TK1{FmGk&Lr+yqNVmhT(ifnj2g95!TA1N| z>tvi~X#rmNbt>Rt84zTEAg%pmw1tGb3+!0UzD=jEa|qIJ$)#ZL7xM+;3v`x%N3VFL z)DZ0I30e(>Edtb0b^F(E#u>FtqPvyIDuqsC&De5O@T=P1oo`^ z`!NNj(Dt|9tY8||;vkqg4Q(YaIrC<(>Icr0?vluP^W$PZ{vzN6K-LFb^Po27vyL36 zLdlbowjYF%vTwyB7A;nU?%tE65;+AVC{yQtc;zFiFX_j)sL;j1$qKi^!^W`VrP%H_tmv~l!NMNhm59Q_r|Bbi30Vu?n z_;?1`y=RCdiZ9u_yo_t4rs1@eTjQ7HhtK_tkKY(e_LHEg@A;fd0+Y{EgAm5k|oHxMIKA7)8esIccvMzlxg; z8nIY>Sba)$?{#%>K`*)S^f|e+Z2$B5Tp_R>V0gT(=rJ`vh5$#b2e`cu#`5?GtNcOg zRVcE61HTd^1^{`H`*p?I01sI-1h#6h;y)))e`$gn^sl^sA;W)jjK3`JD*OR6R*nStcK9p9kh91j$oogd4)x zi|+s3N3Jwj+euFD#4jZYSE_F}ONbDBt-Vr(%_z-;%ftd?;N81jbrfi4!*Xy?X&6Em ze}wllqwQKJ`|l82Lf|4V|MGs5aO=vgbHy8<-CoJg8D;@qHb7Sh|GxU$UwF0x)vrC-qoeb+%{AQ02@5 zMoIFW%vKD}@c5~fTeFCrej}$96?9{$O|fGgg5Od(@x7kIA=87yrGnqH1>Ixm<`xzv z4NcOr?WHEm+vQ*+R9W3F_e49a!L?~HJxjD@mYf?G=6A%2qAFl1Me=Cc_-rFK%&0yysppsT{_R@`lBSt5sLaU#qiJy$WsL7wo``} z_+M)J+E=+j3K-+g0|WJCq=3;5Y7m;;1J89e{VTV9Ii-BHK&3<7PsT1V(cVza19;3;yPv&SDFCR-=0dt}Cuvq-Nks-f zq~E_@9EUE(dDu<{MBzLj@)vOyHFZKk3}rwBcKKrD^ph>a=;~v3+=>h1m7;upO3(AK z&8ZF0583fanT{?xJ-t?5R46nOIQLT09aiAt76Bq~*B=6K zxYhNw8Q&amu!t*@_yq@_)euL6-Q%@jGr->z{ulVnq4BO1k)u0jYF6bVHE;(Ow#lJ8Dj4m)ooV9I(nJV_W3vlqp;fj9HOw=)~`|?cK;!a5gSWKk)8X zFooc*HDEg~LF2>rDlDYs>T4^pW#!`y|8hRFg z0)GB3pZNd5fY7}qPJ|-=70A)4p%ZWo9gM2=; zwd5k3{9v+;&KrTz{K2g4n+;6`q&K6=(c~_zBfu$NwoN;&10?x)@lkp+r5)KuNI5#< zhNvYBwpWLxkV}+9v|mPsB#3b>5MFb-uKj(zBw*9>9R8;PpqWgjPz;re?_B*qOnnJF zl;0QkAhd{7cA8SiI+n6Cil`LXcO!e*l9F|XRCXe}P$XpE$ueZ$v+t&iecu_z%zH<_ z|NFkr=VRuX@yzqwd+xbs`QCHRC6Y2Pj<*BF-T8@!Zrx)fTm0K>xoX{WyXBAng3`Y? zZuw8sLA=tuo`F4QD(LYwJ z`C1Gr3W$uivuOByq=zotB!n`NOA-wyQ`$Dsm#F@5$P-0 zn5-uuae-;!bahWRvWa7@2T4-ps7pcAG%v@XMYdQlFa8>9$q662Yncbfnam=}^0u6~ z^*{!KJn_MU25EN*68do+{h90)#=F?Lx=8uBV!d`$6T3R1Vb)H#qC8q;Md!M5bHi0E z;HJWgH}*WF?pstFt)I8Z>7iP6WqeHWpwPMVz{auic;88$3;j6Np7j=8}$Rv)GK6^}YodqAdxvS#F* z!MZ6|>CN9dgs$HPgsyL0z7pFoRiLVhy>D@>{!!ScK%j9dUw*t%#3yuU~S=5v1SQZPuHA+~-1^${wfw~q6BN7r%c0CX)HjYuTOWtw zJZp@U01Rf0`E71cRHi^?FXl3o`-w=`1B6=>)S7IR>Z!|PVv8_6Wi3!_13mjG=jw-# zh2nnRQ2AW(jmI;*%&LP)AK(u6jAklcPN$LwTpyWrYBvIT(ZTa~U#v%CM|OF%40CU5 zhLf!e5IbT##Z|w^NOzz+Yw4Q7(of2>AO2MtuyN;c>p0M2}N{$ZEZL%b!Fh%uU2} zJ7(Ci<&AP83UMvw%b})5P=Hqog3-q(?3lTeuXTi=GBe%;t#eK}%gK2i2zl~_IB)kN zky93F_UNR^!ZZbM6Kgz31M-h&`p-m>s}(ce0g^@V@ zJtwOqhYf!7HMpU#VX?K(gkvJvv?E(6XN-bO2V7W>Y=%}r$%`rDmVp zqi<4EBnxK64S>uQ0$f~NQ;s0>4_9&EHvTeJ&}c7H4B6;}Zz^KHu5Pl(S8Jy0<@_^7 z|Kc?@gp{d)AAs8=9QI}-xw4}H7$+?17&n;(JKSRl#nIK`-^?c~mo$Z*#Kahw!Ml0ra0{lW@BPWsczP=<+u2m4^mC*9^=;x}WUqP*? zZq~49<%8@5pGqDwchdEkM3G$(2?_kIE!4j~q=7rm4)pO^$m&Z(u%xd&$e)8eQNIzz zfM`qxUI1xQb?3DO!4^^~D+*e7j)zIf_h4HyoM#m}+m$U^4s7Tc46a{-63@lX|peLVSvj$0nU~edp7D?sp>@Wf;@AQ-k zPBRE7qS{fJu-mh8{_r3bE?YzQf1Q6B^F8W6`u4w(x!x%`2g=p?89Uxrt-r?Ifp&yU zhszUFM@SVjR10Pi#7>|6ZOkN#!pU~rB>he*ssVf_5m85G0K^TjNc;i<1r)ca18VhO zYM{_`Y>dtq(8XtDKL8L&O0J!jNkh#6C+aaTdB7-7(rklm_ZBQ!r=(>CzkKeA^&DnY z%u|Lq8QS$fzxNv-$Wx3>luUHs%zK9U1Pt@v;y@-88m*-x-hOw=0MV@CH`S6vnhy1c={=*9``Em?j7oJ1(}1gczxdf7&#T;$k_5JmDN7AMfcT6q!a>FJ zk~;`Iy=aP?@pCrPPr%v4+8C}3_FG~_TI=w?Te5-myP4W-8F`0;lA)cA!&Fth;jZT` z;IbEGyToq{sY;v6_RB=6(0?^#1{g>kmG3uQ|0}$q3gI$GnwDiV=3a)D&L(bokog95W!KnxI159U~uls5LE8y}U%Gev7FDc+ny)A_5?Wl;uz??h)W^Ywn1 zPd0x3e6z)Xt>k_9wgcje8&Uq5Nbvr8u@O1w`$ zRBquvlZK5Rd8$bIdn|YgxjpNCJI~hNps?)&2@^ogIg>5aXNg@tt{We{ZSZifI$c)s z^@pFBdeSI>*52guoQh;6f=i+hmat|c=;aQY{_9TOPeQ=Q7(?c#q;M5bZpIbzy!j8x zyFQyyq~q`G#IEFIU!KsB)MQ`SE@ghg*oR3Y(|Ryke=@Yb|0s4&_I$}}$=)Jw{^;#& zB~R=RXQZ^%4_2t~IxZg7f`{+VXqH~xoA{)f-Za!Aa-C@Yg_o)_?`$U^nO+G+Kj_MN zoYU`jXD+c%FOOf%dxlky6TUNsqPPV5`#N>%110>@Fy0l(Ni_H<_Z(2$VP)mb-i2ICSBDls2lsCwgAR^=a$Lobche#c8J zB*J?5PnIvqhi^|g`eXq9Z<$8G?oB~W@BB(P#5>vDU?h5E4b(_*Kl+?`>$7y=LZZdS zTGjgD3el`1Tvwm_QQVg=9w51GBDLB`bGq1J6{NPP(4kqZc$U-WQ5~opZPU@C@0b~4 zbd8g_yJ12k0jjQQmp$r-6cnRAs%69^9_KaTJ^c-iO+~qk0_6xckSEmJzd*mS1Q{OQ zv3!ZzjiSS!d&gW_MbUwtE^>~=;=ns2(Bw=}83$^;T)9AM^XL#!iyBRlUH-Z{-+wcy zS7^IesOj>N4=5}qutG?Iv(UF^eJFM~_`Bji5QhnaF23OV1LToj$W0|uba*lLIJR31urK%`V5C(BIhsqE6#G_@%w8uhY?>lOG@^KnlBqCJsRQ2C;Tms6BncCx3>OMxH1S%8*=e>7`THq zmFcnK{viTNB7)-yDLyp5X)=JqD_C!>ViBG(FI9}^FXIt_87GT zLe$aO^pGQov`9(M80mvp+;}Wt^=rEUHfba+79UO|XG0Og$`j2cy$Qr3Z|d#*>s!Rw zRT)4G&Mgab?#C29F+teYxI|xsTq%u@1Jyg%y*oR9?z9pXVIQlOt!_1jH`ehF8+i!d z9Bd{wKJXH}P2h)7WT>%TM6B2Op{XEBrfZ?^R6)|g)|7>aSPm^6TI($eQ9ktb=F<}J z&WJWBqRD?h_;h|l%5_!p_wq$hZg9$2(fpZBpX4$s1BaTmdhMQYAP<){2~P#jGCX)h}tMFUYxF zh!ooY@OtCwq91WF){_D$ zW&N)@*vp)Iz3Bq$|6&0+x1vURlz|`)^Plf&C|7Ql_9lYYY5!synd4d@mRT9$yY-7| zn3TgmuWo(LlMnz-k9cq0LB!2kO??tI_rtw>LSfbRoTm`L)@h}v`9;tB_5I;|6}^)bEc&MU3oo7cX}g2br+|a;l%c#P}SYv@Nm5> zL_W-IFp^Nm&V?V7Um8|!X7Wr~2&~W7*i3TPHSTMcH}+_KHXib-V&|jDqj*Y~9&lCd z0bs*jSgxk?ILT0dY-`@(;M;Tsd0Yxn5Hq0GU1h%WwlDdK&$V#jies zDPrGW?^}20!Q%zyMUjvw@X6=5NZi8ehx@?r1~Zi=j3zocF>Nr#eBGb8k&VY(re9mN zz7PR*(Up|~>Z%zd*Sj`icRW1io7KBX*23w7+;GzNk}F)%mpq!iXD_s%|NX|H!jJ;~ zQxMkmxVq9zOmxm#vP6UX%@)i^4;R}s%H1;-`n3y08J|xH9Se}gCnIvo#VM>kIU=V>jx|F0{p&bCW&%*cahq+Ur(*LFDPP@$zIh7SB85 z{nPy4v5QN~1|`;|PI}>SeOiX<(PQGKl4BlHr!1b>r#)ffpuc~X+mD$ih=rv!-G>Zo zg+@I>%6Ph3M?NS@kt<)f$<48}j>O3w;qHj`I3=GW9J*$J8titvhO!^6am3-J(l)T| zo7KlqH1f1M;jakfx4J3bb6sR*beC1AriccC!$|N7Mmphl6(O8QHOw`m9v8muOFOuK zYSxc>{=@0Fr9$lc*>m3 zD!)XUvU4HaD8-q5O$UJ|gX~8(J=;&=;~1A^?IdpW6?Q2_{rsNnP5Z;?NZh9tdE@IF zzr)%agXP|AT0QbA?s%INw~I_Mm;XkuK0a)D&vnmjFOVm?MS?%uc+qY3{rtwtCG{nW ztx_VgyvS{9f(`i!n(RIOpnC6@OBs{gw^oa8w24Z1tWMsm#&(owj1B3m)qfHv(X30a z8pI|Pdkzrl`TgG8$@pz+?9j1#{p`zoay|Of^C|1UMs3U=ZT84tYK3F0+#}{t-AgKJ zW@3($#LEeJxw^XckG1=4E#HcxNrS3SJu31)(dI&GoN*K{iS5LGZ9A(it1fv$CtsVqAx$eV|S?fBN zolvaVJ4uo(r4x&52)rmSdfs9dQ)5|}yV->+7emUr&Lc|8#|<}K#}}|HC`Z|jzl4bc zd>m5Eyqv?f)Jtk=_B@>80&j@%VGGotY{pT5G}@}fgXLZ|%h7*B18*(SWceP#}o zsd9y-lemsd!sCf+!+to_487g9dOR%mUyxdz28_f^ zN@NEZnFjDzbR4Ukmh&VJ;0{>QRQr6eaf^1JAouJD^1vvPL55*EaWon= zC=w80&dVndU|=8c2E~2&vT2v~BkM5O)lWQ>@nq1VE^KpegEa+sAI)_co2zGJ=s54E zk0>ccdCSWUW<03>+rcnw=i2q*K`G092WrDlhNt-W1b#Pr-h}-7xiGK%h{?N;EU>wQ zw$Eoih1{hHhJ#Os8*6Itp^PGTLB_dnXhhkYM=f<#fggxn`~Tg66eKeJaERuMc7RhdS(L#4qCS+A zVt%d^b(C~;w&5ZqtEaHM6`-l^JY7d<9`A3}WmRykq>JHkpw zovRP}sQ9soO;y%)W6NPp6~h`iULkupLVc<$=ppIQNceQOAu*TQLjKA!L5y3i=oYei z#I;fV)^`r)(0eI=4{vDvzvf5%tvKP$lOKLKDK&O+kHqZwr#5)>DqdB4h4iY49rr%2 z`^`QwNewIvrKseSP3bRgfh!#jcNTBHOb$-&2dXBmB|I%V`<%_A&);5A$X?a-GT6Wc z3ws~FIjxhb4uN;{X>3Swu3hDK8dqlJP8A_ zRk}Sca~ndsx8L7==bZy*b~z-w*5~fb7M=@$7)|{$p}Unz zOn5%Kxt`-~=sCATdC-gS5NTQ*$R{prVh>s(DGMyPe`jPImY@U-E--io^#?+a)0uic z*FxS5$>-*rzrLH#fkSyOHH{^es@s95r^%z`cg?%P@Wb}&+E;7@zM1fyRC0?y*=mS2 zqUseHWI+ryE$8TOmyf=3uASd`b$59D;(GU3M(JX3OuflZ$gn9&j`fN+yE_wW7?B1Y zK7CH;iQ%cpcsO;#`tts)iT>LUD$thFVFcZqMe;|8l1B#gw%_p9T7;UZr6}GKx0=BO z4iXxY+F3`c9%tLh?PYz~im{BCPj;v3XA*4qy4Ok{=RZbgewb?Iwia(=ZwJ2eI}Lhu z&ULl%eTUE;BBlxy)NFVFJlrn^jJdV9x$!iIETy?)Ib4Ey=>=Z>4x+Sm#G z{g;NW|Mmj4WcKaavEerow^Gik);}+M^E~Th6Um3(C)|47V>beGwZN7|_{j=AwJ9dp zMh)SUr-JnR`P0yU*eG{!aL}-frBD__8am%OiiPK+?;$>UF(z@fw(-buS`V^c%YIt~6F&~`afV4a7I6{f5utP2 zgSP$cdf7B$Lf~zARhvPPYE%>wU8AB+SKGCT@Sc&7{H-6Z2gQX7Zd#euthJAN(5Gfw z#mXPV5S~0fG^Qdnmo+BDTil+5dv2p_R{ImGUe$lBcdb6sX-uiLW$C2AB&;SSBqbtZ z)n!7ro@HE9y|_B%HePYf9dKohoNJ>M;re?soZQE=xY)fBhLiwNzyC~whXH_jq>`i# ze(fVapdU|$zi~uEU7&a&`8Vd*Opg{#PWyXCKSB}r``4dca+UrgWa7hSz4vVgI>r+= z_ngFNXr+emZYfy$xU^w29_npQfhSnI$)?A-HyEblFcq8ohHo}?o<$R@%a{tSyK;Fa zhkAvD_=`LOHMrXbYM&A=rTuWi6I@pdla8)Z^eAkT9g9>>4i=r0FezfbqW(4VAhe~Y z*T$=hU!V{AiPQ264$_{HqKvV7X(^8~%uk<0L&Ix5i_w3V-|B`P-XGuidY`>aH z={&e22yh8~@9&1wGYH5XoyrQ0LPZ~+5D<6x?J?j@DbpPBi}X#uSQMgS?xN0Ozxx@{ zAAUOg^agy$Xac*9ImV4*U&IO(q$47EnOA&Tw1UhE8e;SpV^A`OO=_YPptAg5tLGSD zVxWc&K7y0t0*fue^LY2rzmR#OG+*b}x>NZp@pp}}qq>Fn$?o3sGAlSJUYVw}^-kl+ zbt+M5iUC}D`G>V<24i+lx?G2lsZXMiL5`Pr`wN^NZv;MD)c7gaC{E(geV2*D_^h&0 z;2-YaQQ}KW&pCj6E_Hu@FXD|4Ed*2h*9hXHfP0>!x3i{N|IQ%7jfe1KdQng!zo4~@ z$;vgTotU3O0l{PIEcmwJxn8diXW{Q-e}pnn6GlUEG3U-rG8){tb*+OH{;w=?^oRM*B}u!z+JMVmCz0$LZDzF*W7)a zp2Ii%IIk%x)4Us=hffuB4!pSy!eY~tx-iv@Ku9k^6VdLueQq{r5dB1;)pZ8~`^BE! z`8LN7qOS8qH|+P44&r9>;}dT%07EFd0@=|T4zavokC$iIyFP?#O;DL&=-oqn+UU8ov7MPu;e4Songku`Y!_ky4xa6T-V$eSi>$DmL+sk8 z6n1|ve$HrGgte)%+(&^o>264B$yP(QeDG3p>+ts3;GH*0NVh?o%`8{GK*8%W!a&09 zZMdD~s3LeMj8`~cf60VMrIQUU77FqE6Urt*u5U3aFWY=jY@-gjz=E%3wfXJv+AD2$ zdH9~34R+JzmJ2HLb966YXo4H&s@3S{z*_rd`fpP@1zTfR^|jy zK(enr4}C>p^%!1n2d_ETBezXMn!uSgM4pjdz1RIdaQv_Kk^~JGK=1pr{q4=yS#T-3 zwbHrP1ME%{@3iG}LjwBzTeKE3v$J0_Qzw!%cXGuxU+X#btD-k^!I%0bUJ(ZuvENl0 zu_=zY4+Q6auHaqYf}n#2T!vAtFVHq_)7{xCX9IcGs?UO9+E6d|YAB0?e7sLswQYET zD>vevM_B8_%Um#-s3DpC8`UoAVf+OBl(fwQDUb2o?@R72X0`T9xw zA*VCAJ4@tx-JVE4x8s}F&g2c42Qs`=745iT6HStPcDs|$bP8BQEoT4&aeMvsgsUdv zQKYx*w+!^@wLl(E(@GN;W1MahleRZoK9QtYGj{$e&>F;#pDN@DZjpTl)^q&@kehOp z9ry_#)(*35UG?A0+P8ptcpP?cxVsE?iNMGzs+QWf67~1=JnZM?CpNa33iGmDj0=Zv zzcx3~;$aO>5zCt|4067-WhrnJOcFo^d0Cev@c1SX2D=Xpc)IpRyvrHp^d$9CtuWB6 z5(uZ5n0$@qDwMG9jVevEJ|bIP8D{n2*YdP(8qL3b6=F8Iub0udqr|Y%O(Zqq_Bfqw z3!4O)UY-`q^9i70?n1I1P$G|%;@1aNkQ5L%+B%+oH4;4!BR?102f%oQ;(HcCfm&hkcYPIqk|Mty$EgM+T3d87ingYfxPFUu@Sq(bn})xhef z*}}xEyD?wFxQGG}4Z}X_3i0!;*UT)eWiBS2f*efwpQPW?C`P##@_Ks4{&4_J+shmhgL24?1c+KMAgDt0PKi zfV>j8QbiOQ4-!(=JS{Sh$vYMvGLahJR64rT^_gh7+7i)*iybuue4y~Q_z3j#cwbSe zCk|Vs$^n6kX25+=rFI}=;4?lrm}9AO@uxq*p)$l zD{ohm1a*D)`D&Pi!@PJe%~#G2Xykp>o5kkCnUnWCtL8Gb3Iq^=2Ew}WVV>* z&kTIp>jFb6|cKI8e3bJH$74 zCL?VPRcggV9vs6Pp0bKl|E?6=@gw;6^(IXg%$i#ij{WgtAX-T!qv_K#NwS74Vpd!f zt1`72YbB+d{8LoZ>#3fXl!zr^MVekYXyOj~V9RRlui-w;J$-FaSTBdR*oMJ{5TT zzsG1x4EulFqR)q|I4YLy$^e>;f~tE^3W%}f-%}oYx6|_ShDa^|lbWQj9<|z4jY{6! zm1CE`?=DGN2CS#NAa~kRZ?cft|2r@45G2sD+TM&_zMQPU&_RdrItNh9?vZymXjCZ4 z`V{>E&?{MNV;;-REOCk~;C%<3Jr^l{^q~m~d}GaA8;lxws8VMO=RMyf77h&i`mZxQ zz{WHmczL6W{fALFFs^o8N3M+?r>q>zxs8G>$aVn>J_wlt37Wy%Gx1i$VaE*uo&iA9 zbad(+aH`{Oy?&?}W9IGgLp|}<>$5>jQGWnbST;{emM&5e9w9@crIzH;XqI|272QUO zmJ*q~h(?Kh|E0K2)E-zV5^c#8_a*FTr|1Iw0e~9L&5aMjBG$?ci?E5~`cnK=0!{=`=uu?lZE$%rg#7C8V@2$H13M|0GgHjuDVlm zK+%}&yFK4LPwydNi$luZdrvu*!j|Ii+IBsh{~e+a7nt36Z;>#=Ic(t?++zBh^DR4Dyj$UFK#J`nnQ7Kw`G(yyq)7yh20?{sfzy{>HhCxPO_jKDh}OOH&Tap#$60+eM(`*7US1WvE?C6$6eNf4_CR? z5mt6y&-}b<<|mjm^z`iPyzbjGvEO|H{FW|wHq90FEP@CzM^sx^d(`#xuMgQN!-S_g%v+ljxn#f4@^(XuDYo;r4udo05J9RBQ`*Ywg zybY-;(M=ap&?P;6Xse0wTa||Wy2Z}k^>Z>Fn+h9`@yjLWqMN(BI)LSI7O)%W01`d1 zcNG1Bk|g6;MJwNEf%^$H#_oZi~i zp;vaf72Gt$*{`1VSWz-bsy&vI(vM@~C~;RFyremf-#Ij*BC6TY;t6w^wFP4@aO;b- zWRPvAPswW+UT$wWkdmsb{zDueO&v|b$dss3HEEu3F|R17zqyY9HDUHsGh{3~{z&K= zvmCVWg=GGDHD|Vt!s`>IbrV-e?Q%4g-*(a>Sg{!YAf+Pr(Vf79mt&pH7GE-4WnUYF z8|RUak6rVd1P>*5$n~f)U-eH7>W>$*ELh)+8teP;qC(<1POExPKlGny0kFw0IgrV_ z%B=3KQL~xR*wNKdZk5(s_|RYcd-kgZqd|u#16m|X%;Trx3#QnszlYAE;i9K?q#$dH zw2P_;-KbbP_lb2UXdWo zKAh}pvs5DnJ~*BtT6K`t`tHHsrh~g;L*73~U=GcxcN4n1jr1P za6;R<(T!sBn6Q5TA~|BD4X@}K?CK+^&)Mxltn1F5YJwh%Sj0gm3RIz(&+ZNB=;%b* z%{mpy&H)-8AHI$$ZDGb7cBpdIal0RHmiDDqD?JdwdT0ld4oiYxgdf0PsiwU!gcZklT9-cGZn%4TJMbN3az@57C2YB^Fj~VCV5%+kU6}Q+|U?#Ng8*Ntc=;9};y(T7h zEsi~}Bq7xY{$Sbz7aPgTnN{FoRva%eV z?s1Yi;d;?+V$>*UPNtuiIx9&`Npj1{B*zg~-nD44?&gI=&)|Fqpm+*DhbZ~>Tal>P zYzP=a(8_dN>^yZJjOe=7byq3A2~aA}u|{S|9w)c_l3@YbeAG0U`-YCCz>uCuyZV&W zL@)7m&SUIc9uy0{=)ks^JBADI`3F@1Sz*1ltu!v44CH-@eLLJr9%%HNtM3Sxn;%n` zbM9mmY)LNiC5_8RniWuhNxRjL>ciR2zH*eI=Zfw0@-iC=J@hUbm`^|xl!(Gpz{THO zJHx<_}R5LF5LFqI#@iv&s5o>(AP`>=H_vNHr278xVKhAssGwk%e9wIXoHE=5Dk*i(K z{w5=jaW*HS%9!%uHauhY+|B2Lsu&O4h8U{Uc zoL%sjl=KQS7F#0AYD7J|nOOB7wWdd(zV@9m}?F1UmbBnWy(Iv&+PFw4O zu#merpC=$UNKn>wwcFI|IBIpB+bOfmB;0TF#>?#4n!r2X#LmvTdnM z;q!ujJoX`@aWCiR_-2uKsUFY6%`yH+DeGR4f*qowxeyTdHZK)fuh_+J3)e9cK%1(X z!=;a}9J}-L|0n@8tutUQI<*jlgqbeoDIO1Xg`L-f=gWDl$whE}eBWV~o=K^IGF?39 zl9KsnUxF?$J~1{Q79448AUGAVK8MfdlV?tO(=ga$x4DHb>;4&Un)WQVQ zz8RX|``KQ6C`I-4oCLYn>{xR@De?8D12e{fzIk_%uOe6#Fxf9Kw>4*Dk+LTfHRaJS zJRPhb7_v(&v5!qc?I23l_lXXBCLmIoD7sp!%Y8JN>)| z?F!QC%!UouH(Ni%LpxDkqaRV64~4MnEYZa-yxNQ;9JGmYn1swRsNm+aT%q38OyCEi}}qH z@%Bm1!4KfU@e-KFZ?no$B?t5=SHtu82n#_ZlzkHRvRQHV)rzGBK_#XQnC&wW{V_oG z@6t&nwS|p{o?E0gR2-NG)4~?lrXE<GN+h8T6d z88xs!G|+1{^aQ1K-1WT|%=kRRnvH7c=XsMVWylQo??7TjbTL;_1NnF>OeO$I#LYiHqgY}oO zo3K!&s3Xn!OcuAcsVlx^y2ichgV={MrU_3nU~mm7VX<`)a+=9gMmqLai_R2nYKw~` zcxyJl#f3Ynl+C7yUivS@JoP5v?XuKrb_L64D!~4LdUco$m>84CW-Abp{1P4exaT{g zaJ?PRT{$x#$qtA0s@I!T9bW5enC87IMs8;zAi^UO`FD0rZ}~ITP=#k-R`>=tFYS8X zN&I5p3Ag%RKDljxzNas<1XibV|Gh}94n{(^Xg>6F`(;}@oh$vF%<9%PaW?NVgWB*m zHUwTV=S#LH9Ss8Z+!C}o9o{_4tvZF~TRPHiM3aQ6P4v^YBfZ6=uANu@1wd8o@lcz^eZjQ^M%WBcyvmbl@~I4n4{yPaii_0 ztvKF~sBKMwIfS=;yKEXCWDr0<5E2*y`9ng2CJc^Bs32hVi~^DaAef@ZnWP1$i=JQ! zjRbnBdSNR%PQxt2a{!)Fu8P8_HGH$L%=mI6Qw_qY#yhPWQ zlLfjm;J!GI;0$M!B?NajrVmKemZ7`{~Q=xPt#pEzM1ina>1Ie4voE8Ob)I~&M7s?U`WDx1#%0L84UGb;g*{C9I<`w)2F z{-_AEgsIpC-m@dOArg#oJ7qVmyV1tk^5+DCx14INui|hvo21eWIpPy$T1|zRv_N>m zx<>tfPk23Dw4tc`!1mGtz$(YULT5MtQBL22`Z#Z#QHq&5l|W}^`jkGehT!3y^-E;Bh=1_MSJ1GW~bl7HUtp4A^)=G;!U;ialL?u}k4{KZL9cku5i*|o@ z6_r9YbLEtxt|-5zktMmkRy+VII_K{Rz(580d<43?EcC%A4rsvVM(nFOh|j8nuqph4 zly@6&wpPa2#ZLeW1y|stiIU2PfTOp-tCqEEmd~d@o&sx=lHVL-aJnrFrXuVqoBpEm zti6*T?$9KU9IPCG^Jm43HjR=oP>{AwJ1#AGcU8Y~e*WZlhe8Vl!#r zmLJ~JG+K#&*m?i3Z@mcLrhh76P?=wZ_z#$xpg5t|^vlY#8^1zZgspHb3&e>(p8l5z zdm?IUae?Cq!6&R3$r0DevpeD}P`w91P~Zswf5Ky>UcM4Ua%YWGTLTv+EWP7OFE@Vm z@#l%&;B06L8IW@@@^=k29&9?G;~#(~!8T*~1?9gzCjgwRgfUg38VtE7i zyhOpsPInF=ZWbf2k%Y1kc&Y+QsTE5mBqT&mQjsL&!>0f-NT{l~@w|?O#ua#$L5I1C z(LL`z-c@uotwkb$$qwjXWNprT4hsD0Z-Sc45TDz2jyip`@lUU-hR^&A1vXokjq+Rsz{Mq8(9ezRtB;Or#}krEOL9r@8Kz>TQF6J?Ermnu zLg#xbnX_~arA?9tdfvx#Z~c;nyYMZJs^T+h=Qwq}6efvx=HO!6V6_AwyRtZnm8lx)wFj39DqdXNE8V~LdpNwV zk1Ga!;GVf6z53z3lt&0?^y>=*~aRY3F_kYDIq$Wz6-w+g?m~xO-|h^ zzcbCEo}$%DH3xUu?jZ?|s4dG+J#As?f2a!bYv>d#tv>`^dO|BB-%Cw|Xd(e3J9Yp_ zXZR%_Y8!5>_}z@4@?Dx(XsU0$T!$Dj33yFy(DyrefAk)Q%i)FKi7?+@vuta zbtmZiA>ECU-Al-`{+?-Ssh?P0^l=ZeIk&LlJ3=n&bkM~U@5INUNVEN>AW+FK$b4ee zl2~7&&%%3y7i7i-xNl>@snY}e?0Sg>^;t3{ zwWpu%IOg;;w^#^XDoYh4(f8RO*Bp6`O6sW1%C5qOzot3zuFSr*$dx!FTZ2xp0w`tq zVcd4hNk>Clt(rnP7R7L{?@=eHs0&EK2)MA2`r503&c=66AbAAsah`HHj8g)J+2X7d z+ei42WB^2CT`2vh+^38>VE91X{x)0KK6vSwa|74Y)iJz(9UySLZN%|;L?*f+CJ(2F zdm9xXI-Y)BU79f;_hYY7rsjoug3l2ZvW0d3ZbbdUWD4?aoy=;*Q$yPCw`HHTLGWeY zZ8#)ya6ihxxCEc$dD^up>piL}JVIYecF_E6^5c5qceBxAfozjWB(v|EG5WHC-=bI6 zCOr$De{ry-cGbt@o6W;k_L=yJKlYl%U=pFRs6jETsL09chDLif=I7`&9*su^@|4>_ zd(*$Qq*}XSp&oFAw3uNvLhAN%T2l z&%NeM?M*1#d_x;$lHm}KzQAw(*%g33by(h}7&GdLs(qze%=Ce8(Q?VrTN`qUCX@>s z$*s*|(;plTSCuf-@)E6j^(FH)ua5%YuoIyZnJGc7-KBIJUM^Ku=#WUmqhs(ujVuJT zJh4!9lh>30+`L=S)VD0n2|WcBp#a-`m;_|91g+`2Pcj4Nf2*$rR2Qdjh5zL111bEU z9&HJIS>hdDOeVe(G^5v8s>oe5PyrBQ>3%?q)(@t(S)>j%?ZnVd&UFbG5dD#v7`rW* zF@S^ulxUn*_TyfKF{MYMCHD_L(GH!w;aR?d-GobR=!bzb7@_z`;!_()o3lmT!q86W z?!0Ew=1-r2$}(*SCi;lznQ*guX~;5bDuCTPB8jgcBzb%4?+Yi*a5lB59=)`lk7r6s zX^j=o8b+es;gsy)u90*!<1c zTHx@R3HR}2t0mu^X>4t1pU#zc)rXHdwh_ctSwWg8XEY}e0E1kY)-1ntd zb;KA!JhP}AQ7MXDbi2XZp4>5RDAe0YiR#-C_hW^+53@y}6>pFF?|0sA9d3DFv>*O? zDD!PKiy1q`u+!uUko>p8Gj0{Fw-a2!vmLv%7fx_XwpK?_F!Y@uI&XG}W_ewUd-Pu)E#XohJkI<wAhFiAz}dY=-9oQe^u_s=6QfxKXi z;T)`d=sVr2F~Zl@e5ec{{#vG_C4(o;%mCjr4=uDP?R_3AF1zSP660X%?)J3%k!z?X zEnSeiHr?k-S5*mENk&_Z07p= z;8}N{J+Rc-aR1|xc8kQP!Y?MCeGh0@wz>M0vs;7Mfx`(qB(Z#h8@lMv_xad(_}tM- z5DYwZL<3LXtY5eVACqS;gOnhTrGanvdSKma_mw{|R5mu*Bc! z)Zk6zAP^4=lphmZ&hAbJd+uMEEsRC?hw14e??HoWNet1UbK$i>%@WJimpkrYH90oh z?7n9Vx<8Lk7RV4ct69Ag0JM`h0N5NSjDUVl7j2T!CJu{4fj)YIVMuR+UPThD#KQ*p z!^|VN{DHEzzDM8y3$4245htc$Kwn&^0BNmcuubcb=F6YD-gTqzj|TLVGH#_l030)Ovlbmuff`~ymK#n@$u~Az35vk167Pz;#DJh8ZdE)Kt&8zS z$>XlvWUBjEPhkuhvv1_fyGrsA zmMr`o#{F+zktxUAAJQdZF^dVrrvT#r*NT-JN5_!5u*&xp4u8a`_RNbrzO%SM6vELB zWv#v6Mm~n5DvFwm5qm|i5&tuq0eNmVfa<$kO0J&N7fMHCon3_8A2q#_#6Eb@&_q3u z@>Ua|NV9XZ%gc``9CFK2s!5+KgH<6kx^p^ZfDHQ1H{h-_sEUKlD|&ZakJViXI-gxh z1$V&8Fn}Z;#?eTEA0B#ZUKVD&uH6(fFV5)Md5?E6(I+0uYBA0$0fSqkGH*!5n5zOD zj}|x9jc*BZ0yXqRJ^`Z^H8OSKq;C(|Kz6>eHh4G-_0Swy{$^Q!{H5D$4QDZgz4EkV zr;3BRKN0Ww+Gwug3Jw$euj4+_4N{&4vHk!!Cpk6rR#c2Ww)(&z9t+xf3Go4ZS4tlT zc;XuS+WQV22n1jjj-x&!z$=>TLF}RE|r*C9Q7S+EM z)p$SEIuP29-36SgAx1m13^?^|Jv*1G&)fR2YtC4~`bgJI%a+@8HWgkYU_0d={7I@a zy@vH4(iXY@4i-=s?u18ga?9*jvYq=sY`q6mQ(N;s96&@tKm-J&3L?^^7wJk7=}3_# zQK}#v=_Q~dAYGB(L;>l9j+CfW=^(uY2t~S~h5*Tb$9wPZUEf;YSuO+Nap2 ztjC;9h{CRql|${#PmOqVzsoxi#{wthU&n$7lJ9()Dfk!unZ9#bRS4;Y0oW%>_BX@@ z3ha}?(}9k4V^0qWS+LOqtE=kM1wxF)7hlwkby_mJ(nWFyUTtNYbMVt zKO!=Nl!7T>S z5@2_I4?^RJl#V$p>=Yn_)OUTYVEfLa;L$3SO&}83%)b6ss1vwB8af;Y{>2h;1$5;K zf8cBc{y+XuI@6IFae3vGY|4yC81KELI5?KJe`@d_5RI_%U`W2yu=5?}&nku6uY%+- z5F5S^bp`A=t0%?5GIQhatm+v&RlZLa~x`j}gD z0lY)<1Q%9xstM)c$0z#zO+N<{X9YU*=8}vn>|hV`)mrFOvME{MB&+Mv1&8-&_Yb`% zCF(E$YBf;gYa8K@8Hge*%6rebgD@YcDf-HwRdQN>OQ^H9Lk;K-{wRJBcN-pm=msLf ziGKfXW1X8~lfzDRWQBw)oEwOwBW|IO1%&CqxA^a+?j#ls&Vd#mfD_XUxvqK{u#>^C zs=2J7tsoQRle0H%1TBsUl$erPBKplZOxAHPf)Bkb)Xok#Dco#3H@24xBwnP3|0{sc zE`S+-|LaXgf5sR2Cm@stTy;Qm^O?Wo?6hFE{uy5V6BEQo2*%i)j}D}&u36tA3ejZF zGOWE=p7DZvoaNc`7)MR%nc^2DR)j3sY)7E4wG}p_&4EA{o=Qm?TRSuS!!Xe3Yq9C_ z)=Ip2(+es~%KwI)O-)aM$-B=oQ^b~$N;csk`o5Q3-|x!%wq0KhnoBESz-kUKo`hTx zY89*$&>BVT;Q0VPCh7%uw3=*++-?+`E3bsy9KS7M+mX7y!B!>@U`|?fG2p+MwF3x= zH;!ia!K!0YwtT?|wQ2jR`(a@YZGc`JU=*4Z!l+pV-n~__O-pFI5XqpDIlpnHTo@1( zA{DIaA;-@orVDl+_dY!CteBSnBh_Jt3kRuWn%}LDWw!_}zP8v3B%=3+$IjfRRV0Y6 zM}-u}v8n+)1s1DSlj`+Ip#dh7ujiEZE%jEG-GKkTUu$NX`0lj3M)T4!p5v_A+U4W0 zsqbzL8lM4&eU6F5o&1Bhuj!XC7&--A&wLtxFE;gs9##k?jMU8O&FLVSj(~iTlD0 z-?yFYNUfx6U&*ZY&nf#~?*LrU$;8vm3dyC*qIxnZBWRD5=;R>&Ir)G>I56=4H4Vj zH|05*I=P%B;=7)P#wkG+0SoWWQ2cqm{KCa$}NIHe+lJ;oWy zm0GiiS3qP!0os=$Il6o7*wL(9H}D9=gRIXceFAc@sHH7$KO$0-jR%ncar%qzx~=$d`bI;ND~e_yju3In zsEcA4$efmG)~jRH01;ci*cPFXQB4|vJ%{410eHF1+tZ1ck~U)8+X1nb9kt?a#HLhY z|8d=-1S5@Y0YO9nr}oKiuIphr;J~uatTR#@O5sD5$aVmu`~!KF9%!NLpX5L!E<=sb z_sgKTL-kV-4hOPg_&S;s9vy%@KI_xJ!x)ojNqiILd;f&Yw?t9u3U35N&wmE_j46(@ z_r|{gUlllk_miRuCgOn|Tr+HrzSHoDL4NlB2e~@OU8_G!v8mtQ-H=iv^0PNthX1k- z($6Fxu9;OyH2a)FpqawbLb2*xJmqG8D7aA^Y$!f>5i?}E5AVdnH{asU_*FW zAMh`LZ%1_mzX-|6mdn>Dv33167}TI9_SAZUNlEE*k>pg=TPI_2oMP|8r_7px^gF?f z#W96lzGh)YDfqkK1X#{o!|PS@(*V-1s#}j!+)l{{fsF1Z{3= zCWm}~-bMEg52m|TLUJ8i+=XbW&{;h#=uS6ONt~GTT{-$Cuy>jJb^uI+Nogt#>oaDeihg|~@pj7pwTD7`cEaewf`h#MFSPln{*ul}Hg z*@TjR&)uwa|3HuKBY>MqR2^{6sLqlqP;&6CYPw#Ai@b+6}8*OlR85 z)(|SODJ>ZVD@}uY*I(&SI^lamH$(QW&n;HTbHKjv`E9)i$Y;UUAMlzDOWJOG_Oj{= zt@UJj`zu}RDM&~>JSp?+Nvti~PRyb9+o!8KvYB_R)9jdmxm5K#u9sE8O~kFRvZ0QO zef2pu1|FBaOo7=LJ%Rw<&~a_R_w7Yvt#(cCK-ugE!WS?9mkZ$2WP-V#>vY+bubP~I zKBHav@<@yV7C)1(zpTl^jxt6g$&>ylDxDrXkaj?FXm~8mUXlPgp7eeB>ToO zv>we!_=w1~&FVF!h8^@ya~Ok*T#}@a9&j_%_~&wrm!CYcOU#ebVmlT4C#tXS(G~fm zqt(vl-s_B0+xyHmYWaaTJj*44+gx+5cVZQ_{LInu+95MAl+M*Ky(Ly!emibZ!P&G* z_RwBZy@;^gwK_e@<5?qa+X%qDLY$N&>(n#S6~)>Y&$wvv7?=!tHknOHt>t1IOU%7* zTw@OjW@$px-3D&h_b1^kDvw5Y6g?l`r9z5qOBH(rT#n>%zflX9|Fngt`PZuiG@JZq z4E!|H+bLC)ro&1P@IQb}_yItQ28GfUSm(@->!i0Dpa+}x_dK3}c>Ua4<+pMjxFqlB z<*EDsxr{0*lgdf#4LsU|$pH`0_Nsn&X5Qbt^_Z9&?P|i9N<{nYc^DE|GJtJ(`ZRWz z+eB%9lhZnV^A@OEZH^#N&6YbRp`rhp%Y zvG4ufQLAV@1Xtij1E>lXYHI?9gjq-P6fC4M4)$W^tk%h(GmXXcQW-z;ZCz>-%5Z%# z*mbv=IRl30{k&~OZ&oWVC=u-bZpWeAKY;-NKN7ZE#QIgX(M{KTqHV@BL7h|W`QzVr zP|6lX94!LyYqxRvp^Jmg6UfikuDjLC0~?^WrzTsFoH|u63$6y2NZ0Wi zuz@>Z(6NMrbpEC>-dPoDy9!xgN?41nBbpGYyDSTl9{5SLLXzGzn)bG);)){6c6)5- zNi>>>W4>4aD)Jd%cKqcyD!CA>J2H%0DdvpyFi^Rl$?zAUbhCgC4@KCF2hmU+bp&Y{ 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

!PjimNy-oguz>e6{2`%&{LJ%aOVgBpcYfcCH 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

lm1(M;97H150=P<* zYs>duspc}-;frOjiK4p8ULPqx=Hhh>crM#0zY(o$98#aCP10CHQq&EO^?xx)kSQ!?D?LS z5PkS#1jS}PS(5JAc}x$)-qs zpGtS|r%~2}M6*f6nu0`%h5JSp`8!g%RVCUGV@i>wM5HlH1$37dL*ig+e)(aSFc!Re zV;X;3QE>miUzhFF>7|MP$W>2$?M68};&Pw%;rAL?2zlqj(%J`{Tz*kkC)nj91H zpRY7Z-mL66h?h^23R`#{FL4U^6ck!AB5*+?s3rZejUQJVX2fKZ<6x<)|AQ(Z=}${^ z0KfEP6JQw#^*aV*_NQEcp$_oRy3qvIcc4YX0n9{i))53XDLa zW?v^@@BbK0B(WdWl6uc(h%$4Y*AtDUg z&6U;8x3{rC0j!{c2d}FJtRKHA?FwjI^1a?4ax8dIwH{SVQ<&4No0@))#rt#tWzSdo z2_e;BV^vH$)}M618v|mpq;R&UdL)j{_g>#f$Nxaf*$P@+(jm){IvKRoOzkQ1T*yT5WX_`#ZmSxS5EWKj6( z>DsY|`<Q23-^IrU^Y zgY$Q`i0SB@R(;>0twizrd&Zcptq#wKl_azZC66*j@6HT5T8OCa7$y;#&qlupU7>V85|2ssR39#xbR>-ry;hDw$ zpktK%M;LNgm?HgJmWP7XfMCA%VrOEYrj_NxZ2p_LB}ky+kbsf>p$S_YJyI}9j5XPb zPRykp4k<|#i-R=;3skTfoE{3D+)`0yeZJ|>Xg1}HivSLOYD`sbDl!g!)>F;sWfD*} z2p#x$6mY{Yr4=Ttj{aR}f=4IORlF_oy?+b$AvrajnJoX2RqF8Ba{dG}&WG_1nQVoZ z0AKuptg2|B57H7)X$@SNEOJ#x4i!d#e?iEC(H%2wy@jUK2Rkk+O$+LWhYLuz@@Bjw zs(QY?VnNsMk-D|cqztzwIFZu}DKf8W&Pm<2Tf_fv@=u$d%6t}wP6QAa6UO&bMz38punV>>MV{Y=- zPo*Qq>;r#Yt8Y8p$vpA0rGyKQlNr6T8JcRBbf+*=H!WRrRx0zdrQGEVX5ZW!j9=+( zxgSrsP;*4GJPqr1`m#kAtu9*lz*i7>iy+y!bKQAFg6j3%*|G?Aqd0xv!t;gvKSp2z~8P zE%D=BLgI6E`#EETU+t)$@lgs2TA%n5V@P>jYjL%(czyGxN;H>+4;f7%9MUDHg%y~h zo+DelYO!a}5SMt&z`5*}wc5w{>?$A?eN0 zAFXdT;%JVJ*q~4xWAYH}HVRffEyY|t=Owv!(I}+gKi~H+y-w8mWKVXG3SRCfj`sS_ z)RiAf@~w33@ji5M@>45qL+Si=%^TzBEcV#aoKP2g|7_ig9_x?4kPzWmp_ot9Q-~72Cn6XcdA=q*7l6I0$G)o>P%a0}{RPOV|9v$!* zR{bjT4wjr7+gY26fX(LFW8csc1D`U;dE!+xjVJ!D3zVrEmvWzsP4)2ii%(}vM}wSY zp$>Xw&qciS#Rnf-OH4~ODusBhvITR9+?6XkOi$G;6J`K?Mao7c`<|%+ zBbLKnjTQo2f6pBxixNqR3c*msO1mh#5Jb>fD0{;Gx*$ngj^q*Z=*I(5L`v+91FDV1 z3LJS)FKs&3v&|O!M*=^Q^Or~9a@=aA8q0yuN2Zh}KwRj04g>q^k_10#ls01!ttN-^ zY{ZIYHwX-nzuoPq-^~oOyQ9A&9S?1F;#bXAmjSG9tf>xp1w zbgLBinXpL8ET8TJ!MnwO3|B~oVsWZ_7|9Ywh9jkN#fJ~6MWc@&WOr#Eyd`j#xsc|` zlr84{h#sL^OTYy)^t{#f%btC~CX-V9Tr(>ED;f|(M^8A><)8GifZdo4jY}_H&mgX` z5z;lN2SbWq4w}g*qRM*)?a=F@H1D+CDeaewt0K6eiu9V&89@lh_HJ;)f8>T1HnDe6 z&nF0lIO)Y8d*-2iO`lw*azXndFqI+3Y6f)D%Fy%OSFX}4qql`+Zkks|9fF2$o)?YH zCnSC5(>h{wx8!c7=0ia-y|%9gPps~r?_fq!P3y}(av59mwjDn?vYc?f_OS>}@4=g$ zxI;PA%1p$3YF9zWm2ia-l$p8L;7PeEqunVH#6veUV&itXoJ*2#Fv>V~ZV;QSY%T-HW(LiW&nv#n&Z=2Nao$^ zT__LV_bhxSJ9q~Tes-IUfi*7ryScaBgas|3DBjjn3ieWByC6Dq8W&k+hL_Y}Xo}#sQJq$jU|g zGHc_f`T$?+3W*<7d0`YwuZ# z#wH4CS1nkt7$s0;IHdE@=(){ys$U@&#U9ALC&6T6lcvvq`sIxzRrG|Q?ksE7?h(RP zkAK>2!~)52`9uBsUHyN|JdK&iDQseEr7sOM@<3+6GleTprfTME)E3BqCcVc4uV9o~ z!e)C}D!$z^-cehs2eS__X1~mtOo077Hd)2*Vk`l7Upds-Zl=3QPU@pMZyM(V3hY7p zcPIReoC{rvd^rIGoSKQ?v>ZL%W9)0ek1Mzd=f zW3%cpimHPcBI#hcBfK`wyGTC^lAiTs zk74Ss%rItLPYwmBYy6o?zaJ|-zuC9mO+WW1E#N2XS= zg5>?keKq3lUxE`4D@>;n)(?r=JM0u;iwf0qI(OvEbS*OSrLeK*y!%DDM-l4@;wubL z=!ZTEn%IZ>wc$O>S$b^&deJcX&Kpe6Qz*9dvKC~LMD4pFmH?uZq)|?cAZtb1z-DCI z0`xYZR3;rc9CjV74hzYQGZ^FnD+0~RrwZ>-LNZnj{>q@97`)9~1?+2|l4*ub*=_w6K;kGD9*f`+rjmjqgru#eXywtsL06hDA^HeLx z#lTTpRqds*Ec!h>SdBZzBX&*ZqSxZR+dg?{h3Oa^iWOnFAS+Kil&?e_=b27PFM75Z zBg}Hu4)4aXp)klOmqWgWt;dRknXsehYpt1VEV~%C=xAocjQR%6&o&L2KgK2)+D}eD zDy&GFqm%;jO0Ei;YzKZLJ6`dshs?;}XFc}J^~B`)iXU0WRc+}K(|RZ4_;=rM_$dPL zko5zpP`#8-y^kyuzFdk-L)iMIn#!|&BuO@nG5vfPQ2zQew1Ie>d$;w5$s=xM*6^_J zF_+3Wm#)|7aA&k`byHv)wY<%quGlK@JR{w)6KgG;9=FpWqu z3fmC;FU)j{2}E+?Tg;0RRJ(>eWE$X9f~aE~Do%Eem_Lz>Ld2QViC`fc;Fy|$w^(W( z%Ez&}7|TA2Qk0NrF3DG8njLvHv#5+(>< zvPnb$FY@3;cCOQ$Ul!gE?Qy4QjvOlnUS%B3+5RYO^1x z@NFh309!jS+y%9zrcdKo?@Xq=60x*Ws7D!LL|0{=MdTKTokZHP$JhL8rg?05jWxM7 z*W{$NY6x}6xkt|F{!x~*N%BUUu%|^_&KnUJcM6I>1Y>$-F2_0cCtL~|TrOXRMdHx`$lxr7R1)L4`+QO1QjV`ROaGA8`Z0_gc6|Ij5- z@ozTmyk^JwW)Rt$&GrJC!0g-)e9mEZ&t8}Q!5}B^W3Vp9geUGWxdML4E5|^NowN&8 zB!Sy9kv|fcWtp33{6`P#)HbsmDIR>sYc;DKBl2-OTkF(HlcZ=NJusZYuN;(Wd(>Ti z(4$q{J0XdG{yNNs_XZ{hM_gXIN0!E5yy>ZYCo4gRssjeM{0mtj_`%4P#+HwFr-(k? zS$plFWF0(IK9kRL9Z!98m1=v@yW!8bQCe^FQa$n0)SV(P3^6%d`tPv*v$w~`_$B3- zh++GU5e4t*uG8M+MoC{EAM|sk#aqksm-^`aD|9QB7UCYLKU;K;Z?}LAyAdT>h29fB z;Z}Ql;edDQhwR4XUlhOf-?P7J6lnO!nKX&o=UO2JJnDu~$)wy=hANeGnxM+?XC;$X z(W6DW_>;rVroo$`#?$kkU-g8Wg)U5Ij%qQeVKQJFl)t_*2-3XXw)7)H(kPyh9xR5p z7@2racpMXnAE@)UlVvT2`MfWLvbAT+Cvl*!GkYrh%favLT=-MKXL&V>!fFsJ28@Ao z6F38bgiZ!uw9bOvWG=4D5{XixRiUwdtC8-{c}d>FJ%p%9b`r@U0EeP ztHQKIcfaqKUGlJja&Z5ctx4u9;Nx@>b)j0_4ky0{zq~cd4-3LMtUtT4=|G7zTB~0V&|Tx*qx`u~Pzo(%aI*S9s_B?vT`LGc3_`EYd@|ZRiqi{Z zs_MI8#}EB8uP~<-vy``b!4FVM2WN0EC@zidiWe4V^t#~X*d)d7D1rQR`0%<3ubJpW z_9&7@mU&`Kq6|CKSd(b1bNa9V^fSWA5IJ%VlxQ+YNo~g<_fG$t5i63O zOMc(~r-#vOx8U9M-Sug17_DbXi!r0OdHn`+NSg2)Fnq()9{Y+L9Cd;2lgg}{ZRp-W zlPIxBDyP@4tqb%Hr1B$bTh?SGDqzZM@%vywU18WpE{sm>d^+`(6j_NVVekh~e|&08 zb9O3^CD#ttrlOW?h<_PHd#0J`yzcGM4Pa-|)Dqnp2P($ThRy=Eg2wBXNO^&Eb z$LgDoHL8FVfi8nL`~^T~Gtr|H%oxtT)89Ac@0uH!j|pm2-2q@&$*kDOCCPGukez3& z+g>*h_A{iY_fGYMRq6qUrXYV)ST^R?bK19_o0h`Y^5%o1C-Uo}XCdxDFK|&SlcB2L zB-H%z@bEuA5;hKgK{RpK8sZt$TZ+<+g$VI^y~_5Da9rx8OOnRWae>RSW)78g7o)W2 z)V(gLg{-!t16^qaKfTF_i_EaXy?Lg}vWK^yuAe6akruPG4vl;wE&z=i&z$0S($ZPy zah=hRg>OkW;Sz!y)?@hma&Z)%K&&Hi5J7vjw)S%`p`kkH>pG?<6wbQs2xsz!*dAOs zX7Pl#Pw<~1M7__4x~58^OzU%|2YO?~1Ks+i{ndj&i63nvY03(G8e?~|nV7K?E-O?a zly^;&`V~p_u$*}3gT2z=f;V}RC@Li0ubvbxBWu8!766|8gc$09}{?z=(l->UQEpG`^pL+s5>_VHgJcje*HVX*p zyN&ahdsYN=_2EjwR@#%f0zN%}`Gc-vlobT&=*cE8q7GhM?!`ILx~orLY{@Vgy1_tdD2B`Y|1J$RQ74$}iTB(G0t zE^papNoYoD*w$Q;xNHu-6dmbal)dqqjSC8m#(Bx+e|qR(yj)g-xm!8lFBl7a9^E%X z>FbvM0{SlYeFm7#iPVJ}eh|=!8%U0e%Pz@Jso=jM#_34yS+g?3smr0); zJ_gSZu|-9++0CL-OGnwIX`dFqOAQd{jiHse`D7%B;O1P=Pfl~*YqKi+=e}k0clvo} z;^`N@^|1|6#~Cv}@VgXp!#19~ckItI`~3U^@r}8z>Cln9Pzj4&003|wrMYgnI!r_uYOGTj>Kf&MB;7tKvmAD@&xd zbVT4%S7vqsViK+M1Ce=c#F6shNqg|vdX#w6d{o0%Wb+mWP`lA%qz`=IRAtZG`iR)! z5^YDH!We+gr^P2x#2U%KxH&oyr|sL<=3P)gucX@Ci;WWqi9PC038JmxkTO!yUb_YK z*eiZ_KHOnytMM$^bjwMxbroM=iFsYMM0P!h2pVo4Id*i{)JBI1)NkV?;UQ7t`gzO1 zbihOu*eclb9uRSX*cAmiI!y%=_8eUIRh%TZvPW^vZ01ZlBHP@O)l6r5oG7S}UoVJP z0Xp#_uix$7HD%z5(-j?3D;)20yLX|0+X6B}4)wZID6Xts8o@)@?Aqa%_O%wnTS79E zLXH!n!DIbE?2F6E;rl@7ihKdK?>NqR-alp`v|*zU&p2)^c!=eT?o%V^vghhZL|57A z=!4K4F_HbSa%bc6+)@?MSkJy%J-I!&f`|e}5kE6*LZ2goNE;k9D~K zBjnN%h&P8W7ZX5O)F|~bRsL|S&7aZ&AWED@11`bW!D~Gdyahzn{CZ#7_4~dQbX@r$ z>)!kr)o(ev0rQ_Nn-dhb%8L2(x8S42T05S9bd28P>N#w!L+dV$j@ZLhFUJSj@W)AO zUf>G3)hP8W`18m(K`ISoy-T9(IwD{6Zk%8<>g=K7DWA*bS)U($oiV9{H1+2a@ri?P zVZ0|yL&vMb`!6@yxj-~Ro}scSGM92`mAaOxI=A|=h~R6m>Z6MZuAd}Zmdw**l3y+s z^+{PuxH|ax8s^?W?}Ih!4^-1A5_eitI_jHr3$3V)LZ5S}n9y>ZHJykGk_`E_y$Mq+ zE>S{%*6o=}o(qA#l5*HN$(c*yaX*Ivi64rVR=#7z{$%sY`A1yth|$}N1n*p$&w0uA zid+wx?wgF6@QwU)PvxG@^!hdY{W(3q9-z1he+!A40;6#&r8nf#-Uk9IeK-$c)+;W|HuK*!u2xs{TLzgRGR5QOPP&W>Qqfy%`~8v}_6)S!HJ3dn=VF zlo=l@in20qh+83KlRd6%+4J7(j`Mq8_4$6kzu)6`{wUmY&-;DOd5`C7J)c*N)@`!@ zsf*BfbzB1sDnfP|Ze-f0`t#Pg^!6T)-p@?Ux&rtc z6TH%}AHI(k&^hRdXbAM2{R9iDM8-40saiENmD@1)xf%Lf*$KZPuO~tu>&I+7`aj;% zFUo%t{3G`GQpOy|o88E@uYk|lz3}m|@BTwG9bF=-9#f$sRnMR`oyN5N0Uhe|Ipp$j z{F;~tt(Ix2S4h5nL=XX_8EOouJrz81iih#s!DleO>2SQ%0-ca z^A|e3fp10df(3L^b=uUKp)r)D3cc^3kIlnq(U^{a6PCQed9w*;?9QIJC*eQ~$*9K) zOT(zXm>dbH{&!t5!G4xpa8yu-&3NZ_66tw^*+k}S;r5!b@T_L-6h$c!?=S;gs*_@# zVe&6a_cXPw`m|E?QO3)tu>vszyRLg5-&ooqbAk$4$>t=%qhIFkHBz#56n=47^}gI^ z5LObz8GRs-T-utZndA&VJ?s7cVUke?qAd0zFZY= z6~^5R$nk+UpyEI20{_cL4kaD>*RPV(2oHI;Us)avX>OlsPn)L^-X#xO)YmLOa!Xb) zwGO$>C(3zlW$e`mmeg?(a0`&8b|O6Vi=Qm|hV{fxHP1}9g{WHa*nr8yRqS3fd(W8% zS&#E<4|a|t#{6N}p`Q*xuXBjjAR4dw4|=o5)Zz-%5n{<2#y~TuZkRgT|HDk6b^TcNTDbtZjIO*t>^`k z7D_EJ2@omm^b?xJ@RLgXE%5npofUSbb-5~e%j}1GwTW#XOfagtIF20MqRMl_`v+@C z(E^Zzt>VW-x6>1E#5B}S%;vnRw=8e*lV!+JdYP?sFJ}O-bp5nbyZ>#WD}H7}L1OO3 zH@)N5Cv+p!>k+E z8qwK|9U{6Z$@>R3DjqDhr3DjczEY?DsTe6+WIP!%$?GwVv+-52^$E5dRTi=KcRYJk zAfl5s>iFePUcs@Sh~-@b>p~JeofagyWQmkB^mQuKMGQU}wng#PMr~A+QFS5@FVTb$ zu=Q@F>LK6fL3Cq&EC}I4_gG9)Ha-8D3og=nSocA}JywnLxJF|C>R^)584$}OSkFyP zuBvmv@~c;MpCRd%x1~+F?}+z|?Hpf>szT)#VLW-PE^;9vk-on^n5xs&_`|_x)6Z%Q z*E;rA0P>2`T+d2;uy;lksG0jY<&ibe=TF$H!J5Ut?pfp>N@-Xr3WL#`cM#>G zI)g`H;YAfMT9p-}Uk`TaIMw5sZVcVZ3GUP)YHA-_{kki$U_mHmMs106n^a!m2QL8U z$x@aJJi$^>Y|&*c!O%#MdI!bU%EJgR^>ve{aRBlOr|0gbWtX=B8Q^s!S_oEMvkp8Ygul|G)OC_hH?Uz@~ zLZ-?_WD0R(%9dV&DxdM+n_PJhuL+1<3RWcZ`iqdpwu(b+_q?RCW>XYRR~v#?(#W)9 zA_mVBlZm_*0Hb7*X?L&S{Rnx9g!!FI}hOU1v zIq+9isD7qE%h0p39TN{nX)MiLc;4Sg=g77UE;{>l4RPn^JxOcZQ&(ud*PheErRTs5 zp1T6ARb7@irMGe7tNr6qnM&+5ZjPnRqFrB%m-lesi~F_e@OExRn0PU+?MH3}bIgs4 z+JfQ_oTf2OCl}|-&N7KKx7LU==)Fk@=BYtc&cxw9U0Wlr&cGsp$0Bd=2lQtf2nA@Qz(krZwPA40tE4IbaCd% zrTfe^EbJXgP6FtF&b3U_Y(t~}+u*q&bneXAd3En`;S?x+s5>GKl zVRg@BeXWyk}EA2RB-YfqP*Ido;PZR>JMS( zli9|Ph=x)cn^Exyn)lw+a*t!;X}zN78r3U)2`sH_#hr6#j#V+^6 zKX5sQ1zcUATc`Gw@6ux~$QW0fMV=@uVx~R&D~b7`ruZda3O4w`^Q@n*zIUKr6B< z#DB(OgzCTP2wX`?{$*2Vsq??N<{wG5$WN&g|DnrdU;@AHf`-ydY%GW5f$HXVgZkx(2KPmhDt?$Rkd2tSI{Qu9`7!K}S zt=KN2Q}6Qui-Wi75=EcubG(s7ctXP-F&RJCk%3k}w|STI79gfMPn#RF9=T{4+>>8i z=A9e7-SN#yt|=R>9#lc@qqbGAc6g2?6nvIbNozzm%xhFGwM-IHLzh(|X}7H>(Qi3$ zzeK7??2GL3g-yJ;9Uj9F|?6Omth7y?Moc+dp`@R9j-l6GeBsS^6)eZAR(HEM05tyMy<8 zs|p-dBgOcEvciGD80}p@!Xr>euQ8<7l#9APL$D6RiOmL-ZnFE+%t-yv$2{Gp@6Xa= zSYR0*{iV;d4?U>1(bS0`(cuY7nkxKbn5HmThQ`)qK4XjJPdK~=<^+ZG<7x7AJpEN> zg}IOQu=8p;|2U$|tD97@e#DQK&vEQKS+=mhgUSSw(B&BP?4HJ}9k7VJrXSt7uLKR! zF^69vs0LRi-=Cq3soLHhqSTn)C7ai$$n7n;U$>vp-LE)4aOyh7Lh$h}K6b?(zgs>8 z{96*;@4I7=%#;nPv?1L52{^6g<}!{t9BQx-WGFk;Ox{c5HI}IRc@VaMtq;lt45Mk0 z>TPgYH5@(f)pCQ*Sy?@uP@e2s_lOL4LebW0F1t$~yEHI-aL6gcSIdObeT7 z3`WoHH~0c%2R~kY;H=Aj{teJ2QLNZ{czyUu)v&-dC~$4ddW6SGVLo&uv3lwTiZupuv&Gn2^js*6A~Bd!1mZx3hUR2w$^kU;(Ug5 z+Dlp<+tLaA9tJcG0ksO|5=MzfuVV)o(7zf72**yY)>Z<72O7H^D1h|epAjGAGxhYN zSsgce58W_gT>Zl)0zuLyB~a=A&n%(@2tKJx+`koqxD?jarR1w!&x_vk4EejV%j--f zaBA%w=}MJ73=$HM{zf!6Pc8=_JuWY9d(4^S*&X#bB21K!NcdAR1;|Kr0e!h1m)TzR zyJe#brfaqQNIFkR{sZlqw$P;l8&4l{+(KQkWhvKAPy}4P^?WORjVu+BK505z^=7`z zO_cCsULjT$X=)qbj=lLyjnF%+V(rY34%{OswslEAc^~}Y-s%`Q5>OZ>pf>(o=wk9hQFijZxeERX#O%t%h`kDaQvU4i zv~un(LG-Ve^6PNtU@|k^v7tr(UKkK21J({*brniK+`B4v%`M!AK|W8ctx5=FbD7hK z%2P4y+(nglTO7}ch`ZDI1Ly|QAF)(p9{v>bnS2P4X_xdD_NI0CMHFAAMYNw+@23+b zP4CniN_$Pd)Qyj5qfyB~TGL4?N}+~0t{l{g@GJx*CbH-jo9+Ew9wy~~3CjOvCXHFw1ue& zU#o-RnSxMZMQIS_E#b$^LckuLcOnbq_U@X{t*_X$@{#{Nm2+Ng0G-`4T!urJ$s+sL zJFHLW45_T@yL}o3lTYSdWqUzy?juBowwNvDWHK7<`=DwpI%BEHY4jrM-HrcglXKtA zuEU|~K(^p@^@idTu=D}|OZD|T3~WNiAHQiYA)o#kveZlq>%Z0kD16}++di~@1l#6m zbT4`I?E7F^r|^YOGq}Jf$^KsnkK`Y$F(=A0=!KTz==5#+E35hq_A68_R%=G(koi`F zxkR!aH=P;cZ}1O-kc1NqSzUWlE$W{x4Hjz4l7SYYq8^8dVmyX)c7^(%kS<0S-Y4>jBb!FY)AC=AA>> zhd#IzDnVN}WF$sKIGhvPGF-EE9AGSxaOz{WG$3*s5&t+0lnF{4fpp z`SxAG08KwYsRf4f8{@BUN1nP3*=NYTE)z1z@f;P(Agb6sgC^4`S`$~}psa7EI-rWs zEW`aV?&EkjO1}N@sp`oK{p)$&;^AXHtDc0snWLehHoGSks6|8|U92`KjNTDy1eZU? zyAQgyB9vsn>qQG|)u@<^4LLZj)RXTdV!peA@9pRs0=t}4usodbaN1TGREinUGTsBf z*N4&#sodGphu0>rhg$SKvUMQ0KgNLoPpXr6>JqXjXrs#3&JW`tSAQ~1+vdOI)_kpW zk__ps`mgQkzY47UGaY265188WKMzds&B7)-5fppNRi@G``9LRX| zK8)s!E&UHy=m{zZfj84_E{Z?7f#Q4H|Lcscg2KAuLPhnGzsp7z_ok{y3+-}{Y}{wZ zl%wCm$JISixD={d#64TKqM#UrDaz&6&y@5oRirQ_`*!o$)vB9oytZ9^o9otdppGp$ z|02oApZ#$gPF>+7JXatExIMtCHSqC(l#6DYQ&CFPL4C-X&im|2=BTIRcLkiu`8kAw z;J8%qYx9oJneL-iYw${v(@e34!bvFBsBE*gjaCHB4VWKD9Lx$ z(zY_LuY2Be{!W269qak;c+ z9wuj7FQ*kubBe5*biKazQ+aGUVoI{TKoA|YdXWS)Tq#6CsaR`q+GwCgwQxu(omn7> z`{C6x5&=kNx-b;Pe}2pj*#nUV)E@Qu_f_}opfh04QSF@)v*VjC?$fJ6o(>|g(!r0G z#j4GH({&1y2d?d{x+=};tnS7G-X1lrN?+GiNAl?#76}T$xFlL z-uD~PpXibyWksi7%5pIrRfpdTkTXW3bZBq{m3CxDgcAsMK3?)l+s+G`Nkan{vdRy` zo4Wtp(>gvG>AV>WKVTwPyjGggZbl#R={aSA<>fN~Vh-n(B9H6epL1jLY-Ch(mGQu{ z`Z8Oeo_(0Ur5Zd2OC0^JeNyy|ALgGGlc(g?HN|#vUy;qas21j;Exz({cq96T)1_1r z`euiT};0 za}Z8#gJkG=`Tj@m^2fnu2F46f_=RT7HkVmXYwD&&2dKZ_#VRb6!IZ^Ak%03TrGB#R z?O~Yo$MhFx8#kvF&n^h{8#C+P*mF)Md=`+%SI9F^=I%^+RNdiNkr0Gw{_4Vvsj>>2 z@egj0Mas~EcUYq9rt`=Va*$c18>eMzc{fZK$d-fOl~DQyTf0*VGJtG#*T>DnYiSg8 z#0psuN*DQf_C&@EE^DzT$m#L9>vr{_z-)7NyE6~{=#Ohkd&aZPTLZ5tN0$uL}r>|%=6xy0~< zg1xa*4GyO4Js?=prFguu`Ym9wg`O?OiYiu~a1*$azkYm8qIyH`9@|;?SPD9g&h>QU z0`2my57`usI#Dp&!I7igs)X@r8B7AAkWa4&}wv$LuEp|D4kToW9wC zjUZ`or#;B$0;t0z3GdfwNq;u-;MJDaPc7Ck5|1l~7o7+850u7ymsDZM5s8PMB?^n> zm+uPuW0&~OePFs4`iCLH^$6w-3eKi;HbYQlx}_3k56qN^mX9r|k+bx(H@IcjZ$#$F zU4Ls6EVeT{oUPB18NZ|q3{}L;JQc*y+_M`wI|8>E#e})&jdn1fW=GQhw@BruPr*zKx zPp#YQET`rD<^~w8mT~=|*_Ij@$ZCRuu|!7X|08Py`uX1qFz_QXrdy7|dHC1U*mpHm z!6Z`0?NL8_h3dl=WS7n@dP%Q?-(Hdu&^~krmbH6?+16kCCcP-f9C}48UQIHnYOoC~ z3~ozp;J)?yYYmV?GjIlF;Vwgp3p;!rpp6NW7|0<-io9H!RJBDYjAv#G5~<_>Re47> zp6%_k{3`5Se~mEE6X?4l70WgeVe7cQTqu86@X*Ph>ZBISruI7CZ#(^_kJ#CGC{{px zAwZU)ap7$gu=Rv5@2XrVEZN6!?1rH64FaG?t<}II&N^xQ2Nhy~^h|W?=zuq|YKb_+o8GAK05fj+}(%Bw`E6{U3-`X!7IX_#DAHhKM z`b7G18>s7Cg5IBcBvnd`mi$7jEA|vd3Op+1<_E#PG$uTqis8?p*KG_kof*DovoT!U z0_##)2WR>~iH$c{!_9N`{;|QDDD4CDyLf*$vQI@U4PlS09-sc=RMl5%t&00zSv#ULVZ<@rZenjJ zQ%xD34BxV^(>iO08pBMk4kgF?=880x>)dF@* z>7~`to7N%~McXH?U1~&oPvI;XxqQ@qhI;rF-Iiu;D4i=|21ZWeuL^L(L-3^nIiU>Q;0?YPY>KwPk^?bk z7Ce0SYOu)0y24+_toGU&ZJHEFgvpv8Die}}0pT&ofidoM+6Ack=1+cPv~2E3g?}Gd zf`uy{k?|4BKJ%0i8#62aDV++c?!fX`=Bqb-yFEc9tv=f5o8U3coYFOW z5`)ZHb{@aN+W7m}&l}5QGpTyx_ZC=Wc9A6S(XM*N@vY1BjpU4Q->vfG86PcKD;s_RtoIwgf!MhHbC+ z-^?NYv-ay`lRbaqIM557Jj`g;>E6dDU0JeVsVI-=dH*t-?N&{{JxK!X(0$B~B^Her zXUT~9_g%c~zmf^+zv>sUFwfL_pLNi)q1y=~F%1EzEyb^23-HI%awoC%IjISS+*c4Y~2jM1n$kA9dWU;gG3#UZ4Ag=c!M*p%JZ!|U=F<@D;-S9YSXblgV}{jvd*FoTV;mwuvfXZYdW_A| zD`rYdk3npn){UCnj0pdi{N(oo{g`)gM=vEt^O2uuKj_TVt>QWIWRh0VP-$p*AjmO# z{%LsUfeDbRrZVJo{;$Lekf>3y@?`dJ;lCQA^2%3?&5~0huOGX_Iu!RlN#&+fKU!mG zqzS8Fc@#;U+3?=>2aDFJ1J8%{F&vf=@xxa-;aRKjsiWSfS3f2a8J~-gD-Odu?B?kQ zKDHxi9=blWTwyol zKBRW=mw%Sos(Z6-Fk*e-dxvjXPesR-BY3WqcGrQcri!Zx=WhGff&@L#4le%8fM|N^ zp0;)7LI56q;HK1;T?xB}KAc+S(){D!F*fSQ3kZ41lX^5z<^fNdu1#%?25 z`!-*1^j3rLNQ6So&rElvMXuMqiV=4f$x0vA79ayy)L6xAP-=i{fFb^NyIl(5DIee~ zrr@?he#pRObwArp8Ywd&i%V}7?`VMsl|H(HyU8tHrF8JJm63nrsR=yOTAD50z?oJ_ zFvdRKJ5^TjyaPTTOpXf!JZ)atK=-2Su{n_FXg`00W>4{2SWxE%II-Wt$#{X{G~#)T z!5KJHOgC?7qEBo#T&Z2xHUcctzUtKTxxF;7`9&UvMotC1=G16H<#1V>_i>Wst{d%2 z{|v_dwVjkf&7Iem1hPJIk~XkF&v;DQznP2cqDVvk!$E9XDg(%0(4b^aR5=Fjx0b^LuKHE|DFN$cSV} z)w_NRdYkxEeivBer|^|0?##)~w&C8JlH*2Md;BEozf>0d!Bgon+(1Jp@}RfHd!uEY z+K_CVTE*vG&MOBaSSH$%5zW@8Xr<`}AA>E6{@RsB7$u-hqgjimWP(CLpL7$ zJF`GdHC=|J$g|f}sQ5<37@zbL+mtQ4wKJ30ao|jHOUUi_Q;m4M7|Y*%l+Ith0}K8L ziDcf2DW6LHD2LnZFQ1-o>SzzddJ?@=>;@NQ1qA*o?14R_7)ihWw?6!8BR)>AF7fM? z*bqF|5VOp?kv2P?Os3HPw<~s*SsZs^tCB$iwWD*P4M$ehr~a3N0OGIMY&jD1jX+Vd9xO^!UT={Z-GUVHMGW0y70+EiFnns=r69sY`?K&?8wsZzPRt`rDF(D^}te~ zO{{kqnWL_(E%O0A(zej>#RAh>PU5Wv67#L)7B72P4h2d5O=*Ih_W(zg1j@>PQF7_i zgpq8T>hf^O2#PFfVzW==3e>gwQg_Km_s}YJ%{9Sl?Fe?jQB|7<`O{q~c*IC5%Bk(2 z2^P+UgkfC0Rumu+*fZW>=iVG2tQsgQDgiZRH?^xb2i^n&l77r00j%6R95cI0#={?i zQ6Q~Vo&#imn@CXlHzlE_cjC4Z(7??v#$VT#ZT0Rph3m2@{s=A1OXOfjZXNoMFiJ4! zuurKqYw)Eo?hHrhwL5wsZY4nz1Qfam$^0>(F!k+y@_)fBGAW5U{j23dyqX5dXePcr zjr4XRW@6*1$K}Wjpd@()Y-R7r!vgaOw&Wo#qbjBEDTi)zMk;8_5#F~uejk5zb&Gwx zmd9z>_(wR|%M(_*NH8+3eW%5hSuX$a;!yPWA2{ET7ov!A`OtEDhV(4$&y&TpfpA8# zJRiGgZOzuy8tFKWlu36M7>PWU)(l}drv6B`-zyL3B`-e`mJEAq&vOO3IP_{Ze(BbvrNAZY?U|NxA%4@#yjHle$3F+qI z9#J|ik~fcPe=eb9|2S+69Kn7+Nk{nnBMkIRzO~~NO7#+5fUbBCdsZ8u9{Jb&dpm9Y z<=U?0j}wtgZ3s$+)!o7M{g0h0*$AQy#hy{ETR?eGQWtSFfIRM>c5KwHD@*DJ!6P)1 z;ZJyp{$A_q3K?`}-#zVE4_QC#YIxU_ZY8fhdQ%W}*fENz^U37euVmCCvrC$L9+bP1 z+2zN9!*zZNP2KEMP$##X!h+h+swq~^yM5LHCIizbR?+K$LDPBZ!X_we%tH1{Djjcy z1XhbL&1I)?3UH0gE8;aqg?%~-n%2c#(eFA4srAF-<1>%xF~R>$1- z=p}JaAc}vtm=O*% zhHgI8&KtKx&CW*13nXv@l8nC^P<)SJ$xp4~<)m8in)?X&J@%sVo%-q4-sbO!xQ}}u zOy<6Lch>I_|C%5MNYhN-$i| zgScr+k1ot^8P{vB#&g><<0!@Z8xx`u?kkw`VE$d*!@t?OXB?=5mm7tLVVhv5laI_M zt9fs4_a-O!Q0X37hwHk>E*%r{88g|j6HWln!B4~9beH+>C)!jA3ts1?*Q|D5Yob}W z=9|-A3)%+1A7*%o4LMTX^8SjNCN1Nm?Ls)=UPD@9Kzl|!BZ;ZM>IXW>`PKe^JgVZSQ(ZR(neW*fRFs89k59i&P}Y($y? z{Smr~V&96V@acuXx-jwUwnpDxSVZaY{MpM6?vh_S#Ij_I?M(~?d@uspm-IwtjzhjG zFfFK*jUk7B9dUmXmc2}uRdJMXF(tq@kn3rSNuIR>cb>F5&0Kxxax0Cu);(M<$PraIRYYExO>VMCYN$tEHn)2oa$saOzyS~Q05Ws#Z%U=523ez z;m$qd{vF=v&HZ_*s>HMJTJ+3mf7#2uWm+f${T(C*(bXb=a7llpm8in1O+ZKS%G0iC z>I2p0nkSsL-V=3M6I#OJ-zu+Y4z^1dv}W%&NN-`?r^@$q<7DVx^^`sX)-X3vtNFiM3&gA^p?Ml}m z1Z<`u>-lXQ{G-ZboyVW{&g`w;d;cX+JZGRhs4K#SVBg9MaDiBX)Xod1_ak_xA9*YM zzmdkBxtiBTxGv0ECx(}LX1RYawmdF?QfmZ!5a3KGXV=d4eTCU9*X){2o&y1Sok1h= zty)w21zPOXBTvNlYVs<<{rWi|&88ZG?j-3_=m2jAR{}vD@z39$j1D3#cwE`;0ulBh z-}-WV3NZU0vq1-uva(0r81~Scfp&<&uHVwa?6rJo->${=OKz~H^Mf!FI9rp5Xjh%> z<-!!#8)O%RMFmqLWu3&eLxoEJW}~+7r*j`Beumq~Xy*$l-(daNk)YoDLdMP)%3iJz zIft@!&%Ydp&kz+-c;oJCmdZ}sIU%w(! z^;&Qg;M!cf4=}_l`${HlP`>NL&fy2SdpXwlkoLto`x zpa$QJ%A@1r!|Ux7-C54RvHOn5yd|!eJrBg!mcBLqrZpCW4lFU!g;oGTA1N#j&a*ya zKaJ~>Pj4Ni*J4b9T1=k^x?e*BTfe>J$)!$xc2GSl|N4SLZ@HVk^6eqwMxfR(AYw6y zG`04%Jc0IUXB94W9f*&7LfQbDuCYLG^p9H(1f4|KkR5W@o)1nO29=xRTSOS^FST;T zbQ5l9e|(bv@QJ!>*Cw;abBt4wz_ztK2%ZxLPVYMINkn(K*p!^hyJ_320y z@#1DpNjoWE_x4htCOK#~Q>(%wV-_ zEqTO#<{etIUD`2vovryW#wtTZx8AFQpYk=l+%{=s*soHkrcE%WP|M?j1NyX=&)T=0?7aHDnn6)M_yVU;Ujx8Wk-S5>8W_=3_m51JUWQ<3JBc(4! z!~SH4@w$BvOK*J(y(*1DTMnE384ZJAG3a=0t4Fl$SQ2h+Pn(kZXz|fe+E+)>ZK4-=Y zh-_1fFWYGmA~v7#W9+!jxgUL^JX+Rz*S?+*0d>hLVeB|*)VF3C2{vUGv>qw(1kAvd zl713)Cf=ew#Nx0&*&R*@rsgjPA15diqtGA`#oN3c9w}37N3jWK+aM@31=ZGz9G&na znneH0z#8bqpl&U*m{2f@=>;g<=oI>xcbh9vE0G{noF^$-R8TT7lnZjH;7pIz3H0&F z7a!62I+L|5jB}cp?aASZ1{Rn0U)hH5b8sc&-`mc2GG#cnq8n)|WHm=xHf<&GN1Dx{ z$+mL~_@2xesz%?~u=1q9-kM*aVu(r|+Jwal{rdN2FA1&>S}93hRtW4@jfRSbf-|j)YBY9itCYXl5Y>hr|QhN>{ z1MQ{JNwj#O^?W5SAk)*(PA;wPqzJA2X55Z4A-*H_G^|J z+88CBDN5htG!!?=so5RWOtc-Euw?kM^AZtK?Xkoh9!^#O6hO%ox$ zhGpCOQ>a_oYtBq01%D6>L6Ti6u705fG^6H9t?K3M-Sd-Ntx_>nDquNmy2?ioMY=2f|%+^mYW-*x` z4k5e={u#A+?_*mgeYf3IFw>bc`_!KT#_#P%c0%a{zp=D<-|?6IPrjU^HYqce`#rfY zXMFFg=(TKeZ5lK08)ytsXsM>pwb5f6z)5RDpIt9xk_8hH*+E3}(!Jxi{4F1ws=nLh$0 znQm9~;dhyyI)koSv-mi3P-fSDIheg-)pL8WJ1RvZ?h3YyWh$U4{51;2Wde!AQ_VP* z&iI)NBJC_cx{?`@ovT%W!;XQrQ#gEc6?Dx3Oh>zQuJr0MD+ax;w9v=F6EjAS5**Q9 zm(kMttE@$fRs?g`;H`U-8~QH-*V9ms@|Ei=X?cgT3RQAnfV?q6XzQ1c0~a=1 z-gV%L@Cl=BQ0H?N%W+drU@0%+r_M5IyM3|Fy(|usn*-h8K*{#;KO?PFWj7MSc#xD% zczpWx`!{uPPajAHu+t40x)xkC@ky)wOHSDyJ**%+J$y3=M_h1_P5B{N6pwy8Fn5#J zYrr(u7+u$bey*Vq$nu1LU*6u$He^x%rhweRUkZ;}EIh8(?TOwHF%w_I&+_JdUdK01 zm{n=bAeI}J+z~~1Da-|9V5a*tD<{XkJc77B674@&ijW{Y9^KzPj`vz`?deWfc(H7# zx_s!iy&;c`^V|Uj-{2G_sbxHD7upg_f21$@gGPo!P@F&vSYE za(wpOe||N+3y|Aa%JF7G=|da71`CYQQ@9*Js@^a%^D@DVlsyYlVFSZ~X^?J7yH_%I z0Li=UJiKuadjkp&Ipw*1#;0Cb#ltGrE{xyis8Q-?E6T|>=*~OF=y=Ea7DV$Ba0eQh z>^!U8C#26fvqX395vxL6U})SeLfezRfAw-;rn$@o{gwmBa#Ajz2~=Eo98zRr1Dgsb zc)?I9w<>RS?vbwyP-88^lXO9n8kpIaK_x7t4HH@x`bM7mZQs+a`mQpU2-epd8-1gP zZNL^lo=O89hU6rwMPJ?B%?*j|8X~vNZXTVl@q3Zxp}SDc+U*`j-8P~PDZumx1dfzT ziFYraT-hZ2W3c>G<=!~Eu=vE#E2mB`PdN_ka?g|K)yvySWxGCyF=B9pTh9;gB6;E{ zSHX>eLslvTdPGz@p($E-b5+joTuqtycMXhr-yv@Sy&DYQwt?>--Wf39+-oi?>Ryx6 zO?}<()T4(%-cuN?8o>EYj4syBW(yX;L_p)v?gEA_ z6sP*AIM|}k%7GRXSpB!-*Ud{160R&yCe=BPxNbdlSY+5|FQAw28fgyY#6@u{y0+5v z2|%>^f4+M#f&O&BflSVXc8RHcFn*fz@M+-i4NrrTvS*a;qu`@c3gGb{^cvsFl$j$N z)=(=QRt{uB9oH#u3J{J$#p7_9E$p1!@$wG>fbt_4xiOV4Vm0J9eZygKra7Z3>pdzX zWmMA-1x=jh(5yUacAn6uMW})mJe=QpmdV{|xaDspT)KDW#bC*JLvnXfo!sc}%qEMQ z`FkUawq8>bROpz_*&W>G&w6Ds^3U#)VOlb0-Y9xbi(^={S0vT#;ZaavR#`@L5kNTb ze8FQ{4Ud=+UN^)X#%w;_K75S_`3Q}OWPyze%1~?71=j8y1FU~759Bj)NIG-rJcE@`@n(+dFmKf z8K0g3nsP>&Xqsj)`})NHeNky>cIyaUtxesp2fne4zgY--p~;;tO?~1V5Mrqtd#?Fb zc8Y%iZ6Q9{Gx8+)t0QKAz0h{iNX$HeJh6l0YUwzR7*devy;R*BGO;M>5%Eh#szg&$ z5aW}4-JvKgP7c-)wEX#Q2RHw{mvZ=-qwPN$AAK^}Ey}W-xs_5-gMMJyp3&UGwsZJ4AUQWryPie~-`lTSuR`(Sp%*Mm)YF&@tNx@qk)ux2%i4mgRKF z&oO+WrWQT8Er%9DLvRP;Hz{c`Z1{fVGWgs}PJ|#N7^A64btw3Vg9U z_V%D@Ge71D%FSP8X4EyN74ag3_Z1;qfwnObog6g1xNhM3?c^Tss zu6^q2aM#D#ZuMD$LZ_4I%?_liC?h}9gAG0i^{psO$0uq)3wL^;LzxO^8%$? z6v+#;uC&t6wlc+A)oWx`>)6I48YBfzns0SL@ZBswLYAC5)jy-)$Yp~g$+s_j8qJ=j zibT;{JoYqRmAM6v`58JGc1oT4>H2Ocf6xQ;-;c>zgvLS~bij)`mJt7D*;{*@CQ@e?UUSK!(Dvg(j-_uf=^CVbuxY-Ue+*E|9m9s zLFKmAW9~)v0k@~F&fl?{n{Y^wl{~z6OBt?CVa^#q*FMR=YW-V}=2~)WO&@|-36Ouj1XEtueT+!pIHpO zr8`-4>A^5O>9GnJ$ldv;du8Q5qB1Z*1SGJsgl1Y2;p4_n=qmb`Nu9$pL zs%XS8)A#Yd60S>)3^#em@XyK{KwOGMP^syC=CrBiQTd|U#USw6?dsJs_D@@`FF&)+ zmJ2@5;f|I+Q3sZDu!%08XzxeSgkI}R;GEiI;1{2xHof`YAnmDFd{!HlJxA7TL|@#g zpktdbsd?>p8@yKg#$PyhuD(F98DRD8T5FmrN24DZ(KnAF+25jJ?ZYM79v006F(;5RY^A{d1YJ_$r?=iMJ`^$rj|X&`8T%1q$t>2D|Tw zxs=`abH2s1L~}HgPD)LT@0wBLFcUP$1@>6T_-gN-Jwh14(@YYM!L@t99d-Qv(@-Kq zaj+#Nv1r_JQ>PMf2=r8i{sA~JQ^e-9dKmhSE3}@-9^zTo%Fa`E2odX@ouC^l^rM-+ z;$^LL_V6w|+h;V(b^sr*8WC?rCjWZBS9~IQ<8*uQ#!JoJ$RoI>e z`+KPUOG^Nu_#Hz1j{WgZP@ykM@$jSwCR}cg_(r*|KSE(XDZ-2~H7@FcD8Pd|P3q+k zPyR37g`NStD{xEp58ho73pw^bcy|zOT;w{H+1UWl+0M6l=LQf*t67b5%#q-yvT;ix zyMJ~i`L-%@Aj{T3|LB$l{c!fCKkbpOY%c4N9~~p@mg*>zB8&HO^p8AtJ}TC%6{I;? z-Ja?pUt30RlCUF%aFCa79tgRvz8J>^j~IBwb&6Uop~}QBi16Xz(Lr7%)D5^wFG(EL zOVyb|_yvQP06dfoP~}_3=D3EuY0jW=xdahR8g?{jc+~0h7=UMn!_|eV*(X0G&k3(CL9!6ywzwyIE%?vwiP=JeuvdrN-Y;p@MEj-M z1dUD?h(@6HdAo|-_bg>ZTC^}?SVsJI*UnXaUJ#))s1e9=eYvzzELP*Vo)GFTUccup zB8@h`&!Yt1zYtmNV!nDl+c;-GPbH)cwkI@rL?VA4(Zm^54dCk=kCCbh!Bt+}q|u$m z$+U)j*8iuuH;sq#?cc|*NhlH(3E3(sYf_YLP^cs-ONbF=U&@|srVo`Ulp=`{3E4u7 zB}R*V8QJ%deIH|+8MFP)(dWMJ@6-RY|2*?@&0PC=zK`R59LG5oE4x!OtZUru;4d|| zZ|V!ODYpz8%>BFoz8kUw=;$38fx%fNXt3kW6vw9Un7Q2ayef z{BFDB#sRwy?o}h8b6BJ++cwnxx>H(cv7P>L2-NGJN16SA)v*;_ZMdr~48FlZ)z^D; z%Mc}3z%lGN+u&cg3Gl__9tn6mcnR_utz58D$Jxmwrj;_P`5p6+G_Gep_ARTzU3#>G z&*~L(TD4x}eqC1%TXgXh&qB>&dyhRm(k#p($n(QEg|bX) zh`oQEgBhlEWSKn1|`o17>I73tqR8iAAeS21We7_^qjtJ|?o7mL7bs1Dier zUq>!%+`vC=hod$xz;?-Js*#an2d;^vyLOpjDClsWz|uwCSj9HA6+-uP=3~@kbY>{O z>-j6cDSi5RM-4oeKN$r}4A9P)GR~I&p1{~MdJObDOt{lDomc3@{3jKq*Q#+m!**%b zEB!k#VGSHTXt?deydb7>gV)k>1=7DDe8o3J{n52790l<-%FBHPJ7Jq#Zo?p0l4edC zA0t^Ke)aPWoIOZ2hF$_J8$4)p*i22I{+lw64F@Tc=ynx6bi2pY7LjB@Q(~w@u@UZVs&W zM_&RRw+tADqiS^nDW6@>Y~tkb->MjVN3y+S9@$TL#@-XC|M=OV7735tpQ1$T3n;}K z92_UZ`WG%ArQp^|JI8ae9=q?V)i_f!w~lnX`B{RZLKAeN409BGDqJr5adfCvweHzW zF9d7Oi^F}zONRitQzqo3nAZ*sk{e;)S2K)nU(gDh)w1W{L!}l2k7FNWF**-c-u9zI zLX!Zbc4ZzMaU4|yL=`%CYObycHS7pIIzkv4;#SJ_3S4!YuZ9qsmJsgUG)5rp*(zCa2(88kssA@WBo|> z3)Qo=XNBLpDYx<|eha$O!yP<(z;X3%*3|3^-CTZoR{y(0V|~~u{HnZ9&;xo!kG(+< zq#ztoxJ8bee|3uIdGH!-Eu4DobAPQZap^(N6JzGav%6R!o^m91DyX2B5E{G??;Xsz zsni^`r);um`~(9}LMYDe*^~Te^^YMsyZ);Rd8s*fC6h*_tT{RKG-Jip>4abrykhz6 z#^|b-NKsberwx@bO(b`(SY2!qGTOysY!VK=NQWX4?8B|A`Gl)yp9rUURgASZD=Jjs z<|dQO0nK3gUXg$)r7qNF40-ZOu!?oI$e)e^&S^O}>%R_sX zcJ=srjzQ4Tt%i8VGE>-Cy!4C4jW$J=yQ%pCo6ATIm~NX~-26KeINr}mX_s9zU_X@7 zT-H3xdmK-4bkxl!o3E@4yvoy<$jX6MHe02d9CD39_1A3*IVa*qnU+vfe1YHa?2M0lC@GC!+zj^e2WT^Q3 zV`HxqR&$SgMzgxlc5P&^=J=+Dv&iU{vi6y^+EgF+!u@k?cIDRD_x0v!5jJxmTqjlHFCCm&e*Ioxw~$t-B9a|Yo8EE zt_ICij1|ElkD8L4Y=bx3s; zxMLqWW~Yp*gL7z2?y-aWt3AOE%N2rnl@_E0v3RimCS$)w&di{Dueq%uBwv<*>Rk)S z$0Frnr7DxvoUifB=)yqbES1MJg5pAvAA&Wxu9Et$QoJTBX(|z|$dbjvBwLxGMrK5}_fx<}}c8@m}{tE9MJl{VSvFs3YS}L~cmA-L{`! z8Kt7-jVcM_GJ|B&p$o7R?(p5&B#Tv%Nzg{z0Gh=Ey$Ulg+HLXSG=^` z^xm$gYJX7qVdNF|K1STn&tl3ULv0B=s zktQgFT?8X)*fuPYh=lL`k19@L8d{iG%EYsBS2WAc!X&n57tCPJpU1oMj{U^muzk9PDMgXPqzWa zX-ate1tz6foiZrZ10z4HBC!hL;ulI6cp~Uhss_Gtv;55W&BgXt7vsyXzGP23BpvsX z+3s-}9bs+?J28FI9UA1^KI87!rM!l%bPL)GWZifcfqR5^F8)i@p^&WD3$YKDwqMG> zU=Lg!=xfCjE^R%FvE-!#P`-{}{sqPH0}wnc&+V^bIX`Q8N1Q0~r2qOS0lURZ*Ql0} z87Jgx#PBC#mNA5-nGZ2P&dj;>zD(Pn3puc#5Tz%z|C{N5DJK{Dc%%gotkMYMvCyUeTPdR)BkSy*eLCT@`tu77jgts?>=r#;FZzlA9;dVDf7d2>5mepV+%RO4SS$$i_zq-Gl8 z23ams;q{`&A{N}_zqkjgH1ma}TTV1M8@w!{tH^~+38-$Oh@Q<-@t-klqfCY~ojLwZ zaKx_k9O*d*_S@=I<i0vt5XUWzmuh_5$mPCW_Fs$eYZYY77cgWRxktR;f&ls75Ybd)i3bE4# zQR9on6Aig^2H?2mKhCC?-C}rEZir>ooct^go(5gk)8Lzfr*fKo9j;f@jTF%OD(6I$ zT~pVs@2f?G6O2?wzXmaXDvMp=sFm3n@mw(sHYRSY70)kb3axVA`QU`QB`1I~-9w4> z>x;SpeWCTqKyM_OWsCDqL<&AngV`W%3JE&=pA`&zz@EZc@Azzj0Bp00lrz64twrl# z4cXz$EPd%Ux(fG#eq}?8s#UK&Jf8f_iQYMom;F{5J?s(5U@>!?l}j?mz`16m#nwX;i<2Q-B5K7?bu_uY>$zu=6w?}N|njw z8CdijtQE{LUYQ z&-2WuE@g*1aR!ZUn1$XNYZ;a7S$osx*L5yZAAlf_wz6)wur2e)vxg{sOY&Ikr$NrS ze{StD_bp-I=emOVSHGcp^+8$E^5r`=!TLFwcgB(N(=72~1Y@#PKlPQ%0=X{L|%*3ju##NT9^JeDXPx%5YbM(iFq) z)P@Eh1&{JKz#rorcRm(IS%<(AqTr0@+21Dm=9%kz-UH%T0Q-{W_VD&> zrk&MRW~P79YV0QKIWYV!eP>P;C7D(2%F*$<%{mu4v-wEJ<2+k-BxtsE+)Jbz8%`my zbVjm}HWXBs@Otp{f#6Xi0_-knp!4mwgqBYe)ZkHai55*Wa`ic(MCjbXhOM7lN7iqg zLe3>_RAFf?g9$TkcPuCt-+xB!yNAOHe5_&8-llCdsc-GEL9U44AIPfaHD3#mtsMCJHcM@pH0UT_1uM{A*IdIviaTS z;7H1LIC}=w^sMDNriBFjaa;~&6I)zY_s2S7`w34Y@gsyMkzR}B2kP`DMaa2+Nyo>F zON*+DTN30MsB_UTz6I0H^LQx8pfljqR(wSjdDY+fMFc;QVrU#kGyQ|_&x`9&*6GTV_#kxs18@2YwRZ3Kjy&0C zr8Ch}*xr+N_u82SeTGC>KSF@OUuI|t^euo z`eB;QR4`qfZ#upXxYn;9``Jd!58X<1Suti>9+~wUw~;x~ERB;| z*cOqV@ka_kgaXUX@ai}mbB>nf)$$g}3_l@IXWt6l_@3YU6!CBx@f1C4{#ZXn%^a5} z(^k{@%vmPtir3yF*Fyx%&3s+X)No14yqXT>i;B8YSsFj9yNRquBK^5i&seRbZ_~&U z@f;Rq*k&IboX~qKbYnh$scXOY$$~nI!*yp|!$-tVhxJ0OgU3Eh^c_%~gkIAUWtl2J zFDu`lmoKn<+3x7N;pqRW4n8?{VcvGov1Pp-yF#;Vz}f3534D5&1AVkl{J(p;yLH!w zO`Pbo!-X&1c>aQd!Rmx;8P8VFlS4$eHmF#LODPc=kb4RyDwfo$&_4beqASOB!#24T z$FT9@vVXVq(YocqQDXk3gY(DAt@MgasKz}(?%1*3c%Ipl+f4uLuNVozCFC6gkD+}d zgWn& zIv<+}s|m93PDI|_a^LY-e|}MT^lIu^YSsxA?rdqQ*I!<}x zdh~8|VZYUW`;r}tU19PR6A@jnUyF+02f%D%N*aImkXDA~uB)CR^&LYzz5Nehgj0|# zs*6=Is}Y?<`rNrgr%IF!Pk14#rJY02bsF@iPAYn^*?uok z(GaGP^=3MczZv<`3_@?0NB2-y=7|@-NTdiNDP*@0)||0aSy;uW%%+IblYaNy{?!N{ zJg{9kLn&ZSDT@<|rNqSPNXI7;Ry#hDg~`G|qe&8ucp3$UV^p58uAta+kBe>(9QYxY zJ~MXnBCC`Fbon#UqLH3G@8k3$(3)DhQeEWUq_l5}&&Lg1m`~0?S0o4oW z8L+ucvCho#8KeAB(#jo&S3`%wJBk|=D|!BcKdo&*oA&AMSVbG@{gC}cJN&)Y&x$In zh%YplM^qgM8OZ1Oqr`PeWd%uoR37@*g|PH^8>hMoZ@iI~^&BlN=#n6(JjxRJR#i1I zv+zU|6>F_VPSL2B!qnHGHI9eC?B>o^@)#&o9nIk5E8b-n&TM^z)lh3Y3I9GG&%7}s zt{uExu%fQ2kVnYl;Umve8hp1X^{U2x%6q?^>W8}VgkyK~cFAf5{!@nmDv`l)q=)W7 zyF8wnyv?1?;dSPZvTiDj&iTmly<~2-{AJa_sVC8Pbc|Y`Q+1oW9}?J5g|WC6@P}KQ zj<<9xnSFGR9m?2&B9)A>LnXdnQhLOn(uwU7;e<7<3LB{s+)WQI8|X7d9q5LP-ZJBq zQ|Db1w}AB$_V4@H_z||EpQ|-L8aTm2dX~hzRY1-dg2$41K}A-L(_9^Yl6ewxKjVY` z2si(>DBdFQ$iH0uDr~mQqb!$PhwdWSl^(Eeh7ew6MG!1+Jmg7lSjZr}|DcAmTUreY#-AwG^BHMJGo_^}O{0c0yn6ZC5{zuiKJm497a9i9UK{k&YYNulI_U8o}tFUBfRc^FDJLKrqVc% zAq!GrBzj7W#%?qen#YcBS2NyX}V_ z`lBjaB}=f8qI@J_;n=e12PrS6r;%Z6zN<|uqvF8>BbyY95uad>6gMoZ@r{2jr2Of$ z?`#KfowUC{?>XO{bA9Wm8=L(Bhv^IXWSQr;(7^JMjWu&W`I(nB(V=Umbqts98*--f z5EA!BjL>Q_{wd9vC6AO!ITF8T>0WxiaGbf6ynWmXE+|Ut1Tx_1)$-D5?pDfyfV{j? z##0~B!*0+ruf2!%DCt+*$g6nq?9or0RddL`uKuV@hk$?@CqYuHGOqmWDD$m#=t>o~ z%MAG|O$$?qM$ZiU6uOV~TDi#wtTlLDiIHm0-DP6RaGUyAMVk?drUiUDQu{>2b5<;L z{kL;C)6pr^8?0@`ITz~?t6A15M+fqymq_c)vL-kCsaffx+lT)aH-SkAW-p zQF_uo87O4NdO~(i$0dUXE00pwl7-BAt+sY-K3`Z32vQ?&Bnk~^t1Z;o^nu~z1AWC! z-Hbu$6j^?5xID|R{xE*!TJqZMBLd1y8@gs>L7O9!Oqw!VlmHC`g=*klUcyf(VCnLh z;nwgbhtX<$y!E~x8B)M{OTv!CNnRKpuJFml5JCyT844HXCsP=aH=w{QT-7VLKjAct z2ZL2eRo-hsx#u)R?mIf%nxvfDV&5ASsuwVEq44hBDF zTE24+CooGdXGvLrWn^%&iSFm5Di~~K<#i+8O%oLgY|$^71q`wMIW*~@mtMdEM7Y9H zo%5)MV+>6lo*AArOwDJEmb3NxV(Cj>i9EG8vG@fciJXQ7=2m`_9o{jt-l;y@1Xi1_m|@b1_X;1w3I?(?oqU0- zc)vINaGgb}+Z2NIG=>0Y^cOkEw#6||-u$#4c)@df3>gSJYRNXrtx%o@WbLZzJXf$A zUDn?6(2E*mKmf@PXNLSVpqXqmGVD>(rn0nXUMj%dw9AY{y5QT#i3(wzy?b2tNy?296M*p)HWSuiBAEW`KZ()5P3-< ze*_`V0vFT$Z*DhXvj@=Rh~yxP%s3$lhq9&nNX8mE9yG2(M+F1~D_fAWJFW&$Vr?MT zCp1o32)Oqh-*g$LENYcBl<^?CH~NOn&To<*EPv+|UwrVCUsN3Way8#5%wq-HWq@e+ zP>Fz#kw~^hnyB?12zk*mVQq^N_-DVU@?Y{RoDf4lHQfN$o;vQ_^4n`4NM{YH zA;TR$BR)9IM1IH?N%xz<$eQl^I7)k3xf!$uFpoJbdzQv2578%@oQ5+65nU$x^y?Do zyu&}~4V7*imB3I!`|5-UEG=e{i?KrhaS85Srm@I+=N{+^!7)euCr11&+GC|yvCkZs9`y`G)AgeD$5P=&(BC%z&`eg z{#2!|Fq$isYGEK6XjV5!t8!}hbsJ8?CBFhA*9OVXuvh_0^TvS1;MJ^`Uk4O9JQelN zma`1KZ8(D^ti_LbU`FbxFsRzz5cSGZA~e>|^XJQUO|`as?Bx30&8M$DI3g3ElbiJD z1}XZ3hTn=$|H!5Db@N$RPpQ zsGL(hS3&o#D#-di8_J4yAa*@HiwA|=>O%Y9rEBmDz1@ z-JF)+OrL;zTlil0oXj&SHyxv6H5S@w1P^aFpWhVB!l3(ObET}T z;FU8i`*Sn~PJhvlwwJX0{$dIN=@w_y`f% zaxAW=UW1~H>ZHVKvYkj_b`ae*^0oHJ9${K4qlDYwS*Q(Ely;lBvrD}S%o!m}TR5?j zCwK&`YpEUlMd*;4r@B$YeM4|L=60Z-?Zeym=iG8^dL`v*h|YAFkK(rL&b}^cSV&!} z38k77){IB5U}AyOWcgpUpRc|0eRB{oK6&g!GA#W-S}Kx3$yP>P6oI+1**#NYYaFyg zEL@Z;s@bJU{pox#a-(W?UH-t<)>*bJ(41|Dnwyc&$(DKt+aQ@EOa`Zyraa>>Edcr2 zH{`ZR8?@$+G8>XEd`8TKt_P{rhzBeWS9mtYNw$<8y&IBIjqDYzDWGJa)G& z^retfzT#-oQd$!48a3uKbwNR)&VtfA&MHHbyj*AK{96FguE6A{!5P^UC6_wm0co4t!lhr*tU-X^v)kf~q7jujD@t~?oWnmJGd~~H%;UR5dMc;O4>YGrQs%>XHDAbj{2##XI!4{U z6dEB*iC=hXONEM6*vrzjtLjNZca+4ps27$8W>V!pLSLqZ-71aX-{!noCr9VO(qDYP zfcY>BFudG!v=2h=3^RAHWvPY8mz%&*P7^w3&weOWG?>F=ACc~V>#EBWA?;pqNe8h9 zzsOfW0Q?AO^bLO#L>F!{$IL7O{F&!xuFgC6k;CxTSD&$%3b~q%?banq7>FAb-aSYk zT6P?}6ghCJ)bSg?l8CgdWA?(bg5VrumuLx-%2}aT*h=VT`Xd`@vQN6Byx`GqkZ{L+ z6x{rF>@IZH1k%OCsI9(rCEja)pA|o}4&8pT*G9dYOsl=el^n$> z${)Ti%Ch8`fLGuI#nJZ1BW4@lqr^n$NkwlK3ecUuWnzcsJzUCEULpr0dUdvm1?|K$ z{a5i$;kZNWsDg1pKf2OT$8%y6@*$w!|J}k!IApKYJwMgEjoPa2{c4_@i&>zGLGHhdRg(LPhknfPun}l5Zv^xFkTQj7W5Ca!he*-9VX*oL zg&p?&jtkkKVw?dnz5o;3p$QbRk|{xg(e|2kVj;50MrubFLkb@H)E zIUp*JMbIuYMZw*#-lkc=f>p3`Pk4DSGN3jrxB@Lk79o{J!wCu%i!!9n(&$(C-I@@_ za_>9(oip6WruXn=1X_!(|CwA^!cZfrJ*u8OgPgt0r;I>@0BQ=-aJh<^j;-=d);)-F zwLw_G-DYTlHtt0#Ifqx@*IX^N#(Vn6Ymr&<73o*ZX|1- zng>$u^(>OZZczj#Oync8kyKvIE0VHqFl&$EpwF+#;;P!^-))+EqmlIeLA(;yL0N8Q z!Hd-5X}G^+BNu#*EC;)g@%OT1Uk*OIB?&){sw>Q9Vx(9V!4PR_zm0{yQCcdK-C)7<5Z@(A7_KKNE z0zc8Xb)|%(y&&YF?28qB@fApN0d46Tw6=zZzg;|d_`#Q73@5?wL8GCK34^+jFN;+h~MKlHt3A=}V*R5R+;ybP3~H1@yZ^ zJZTS|H`|suY0dO4rz$X=lQd6T2JZ{~ldD?krg;9VMag~F6z>GHh^8&kCbxqo=CH=` zE%uza;5!2h>)x5U^hCS`>mk;*?hr})AU-tGRzVt^ym`q19Wh0pONP@mCZ|&$s?)kp zz6oOnX;9SGf46R5H8@;7An0EB2E2NmGLhDL4^cW>K~4)-@Q&4F1e1DxVrGdxxQN|Z z$MgiT9rhSY@D`wr-v{b?vP)n)j@WEm9xW8Gq}o#GDGFDnZa~7NILkNc1?N6D2zJgh zYZe=UCC!p768Fv|S?N<28gm7f_CGh6JT+s#r5L+$t^C@ot30~^I8hVt?h3A`JRgao+6^kCrEvWqb zr~QOl*Z@c^(Jr}!m2BJZI$_|FxkEd*6c|dY+E||ZUpeb1?=$F1*T$~kptF*Rh)i+y zg^OQ0#P#oPJT$NJmWA?5+SQgfhrGO;`SOuf^v$8Ftkj^-ee9_8@tKiNak{q^DL9N# zK3L+*`FPo}1{K>g4E^U1#o-GLEpBQLo!_a6e>P@`N=>vZOB9WsAN}2>$9JH3WxS!l z47&2KVd*=UHiINgzV_}+&Jd?4JS;>n+yr6F4e8YvW*J$==Hhpsg$g(NH@?dLDt$u6 zwC!hUs!)!v!q}YIhE2Snl4}w!n?eF}IrB?jK^{KKbQtA;11@3_hm!k1+`hQ5zJ>+E zZF3OK7acJy+n(@f+lXXoh*3tdO4RAL5oA!BOL9y7r`{k2?w6uC#vj#)-CEfO$Cp@0>c` zp;A(tkl3xx){xM6$%`XHufZ5BxvGg@zSTVVx^&Np%{_e942M2z%lY}-!sU32Z>gJi zycixOzX&qSHuJkh3vJ3wsN-t!wTUSQ^GG?POAZT&!|_XO+!a!Y$l)$_* zZMTe~7p84`oaTI7>hw;zc4zNZ4J^du1MAW*;Y3=Z+O{)06bv_ju_UlaM17j07wHGL zV!4pAqbcW@h}X9wYp|N_a4QZm$08WxbOL`9L&I8|JDE161E!#^e|96}OAVkvE33s0 zPpBm@aD>=f6!_BDuFpj=>dWOQxs()CZI}*cR7XDzJ$T2x+$dtd)3nQ)=UR4j2&&{@^xJ$ ze8`#+CXhH@1N5SW2&|NB-j{!FBD2So?suwqy6_xvhW&k;z!V|QkMhZEIMf&Rd~$4t*RcxD z?rjwl>o&36_7H@!{k^aBLkuj&uhmnwEXQ(Cm*K*V>SdW$fQ3oTt2_0L8?|tfBfq#Z znYp^=NzyB<__@PRJvT*~pfkR(+E_SnX?YHQ zie60v-I~&T|0peL+i}gH9=@SG)U!AD$P>brjA#0SDF9f*R}R0l5j{a4>~Bwe3cGt z{L2cJv(h?)_d9eDh2#gmbn}Svsp;f!Tm%R_VVOR*HD}OSBM{F}moV(i=e`&$-!u?f ze?ceVhjVWoaOvkC6e=FiJ;&#|;$gb;x1Z}+{(!Xp(&-OTd{G{V1*;d1Ke8bS*P&m} zq<231_dx$`%H4pCsk_y{DM5vyBqL8=_|h2?Lc~2Tgid!t?6!hBibdMWR-CjVfm?wt z$%zG_SZYG3Av1OTt*MBC4rfqXhYHa&;gXOwtpLm$K`bfGVyMg|47)gY6 zSr9t5u606%O`pwUC?HdaOB){;{4AL=pWI`4?n9IWAWN0q-Jjh^TE*{SPXj3c|NTv# zm9s6nC8$nzi8jWwvyhOy6y6E*JTsX!z*FG9PuaZ)(*gS z-DEgWyTo3kMqH=|&DImLvO7LH*}b0PKO*8Ay+lpd!6Zl|#U(>Sea(*qv}l_V?J!nl znEZixcH(kYflx~1r*Xlov{Lvgx)3ykgT{aBJG?U6D3jJ>2CRnczuF+E2@?)p zIcJgL4igmxTXp!5Yvfq)oO~_ zh%QpE^at)!VIurpDq$r*Za-H6#|SxlaW{y*f3B_&>a26Rqc?4+UP2hBjV53e!)QB#ciTW7J71=-Y(GEZM(RyO@Fs0n_h_>El}ncnH|N~ zca1Tm%CtF%IzyeFK%Z+I@%_o0OR|I=u|e%aI(8^jg|>{W%|r*C!s9QkNxR|KAs=-%ES~o`o3}iBvvLg%{W!hB;`dMcq(kfwb#P0MT?j7y z@F2Vq89ak++0oI{_bsavi?7YpdmVl{F|;TBpIHJzfg%%z}V$-xauNi6|85knDAuzV~m_y_O9PCMg4$39oZ`qo{*^82uZDg&HNa=VI*P-h`PT=dQvsx%r4 zN?i2d4&9%C!^i5`6JQ5q0lkQ)_1S>yB>9mLO?g&=5K1_N4h*m`y=;+tK>#)Xkfy<< zZGk_Ny}F6T`!Yi|V>K0OL!8@;E42tV- za?hCSRJG+3OJAB*tlQ(6^w>We6ltk?+C}iFe1)qo4{@Zu3;keu$X=xLN$LX!qI}s% zeIz1RQ%?aF^{{OcOJBv`hc$}tq}cOlbY?xMQ=>GGJJzjGkKKiLAIQq}S2Gi%h6 z{ck2fT@1RXa6~}#!jfuN&%{%iC&fGSoRDlqXC0D3VL|;u>Q(zkt(xEl74PY02T!Y?@2wovi3L`9~&IuLh~ZFpAbDvxbB z2h5&pMDwX||J)S)Jj2_@$oQgb=EXP{9fO|6eQkUPy8(PVRVq_&nEKqO9?oDR$(j_A z$ozppps*Q?9(8kG$-j4QPU@UhScXnuBT3w9$6Yr1`aucvLy;9bPgHZZmOns5?hjs_ zL`V~&9SE?CtoS7!0aR!3=-YzLjHareOAGzMkR>f>69&ePs3NBE)}U}jfv-q#)$ZFb ziEf%@&K)TV3Lquw#>3ijqCh0=X9(-f?k(LD>7tqb!awun2YnbC%i>K9&x&sO-=)Gt?K|TflPk zJMicT^WLz3n&>Lt1lEXf9YgC+d6f&h3hDkP(&1sqgOSfFXg^rUVUfvV9wiio143Lz z-`^d}$vn3S`<5{3%tveaejz;Ok^Amf_PL^cp5JnYKzVfeb``w-P%HXQLDGpLr!+Dc z*)s@9Ffjr)+`kD~$fXVP3QV^13RrW+=}Uy_&z3WcO_BX>+;MpqP`VAIp+AMSas73I z$c<;GHlwL{ovKMJFqmu|^1fcX{_3L%G7_LQOkJ#ytfx8RBhZ(DAJX3Ie!wG1>M|ozFpcVL|HG*3odCvdWZU6T@Px7RG?}bqBT?U@XV_&WBKh+kwtAf8?1uI~^ zI_}jd;&ya&eE~VkVz<9B8hWm6$3D#VvZxZpkTPPr0LYCbOJCFY0JkB9XV8$!B!E{Bb(*D7)84%e zT2BbFZqRE!)+Q+L|G)mD8}%D4WKG0km$y!eevPJeDM0y=ET&Mq!q*boMrG$k4Tllb z4KHVt9N1h!v|z=DH#N&&)C-o0c3)@7F4CUxO0^EpuSSvs8}H)1unLL(+v#Z9!P~IU zL;=)N2V>OF39Z;}b^P;$qf@w?#c571z~U7b|Nevw^c+7K-qaT_7MA0}G5BFnZ#!US z3B>RIdmx>y|KRrqBThruGUgS(w!jYT07xym#FB42i>#(UK-=!=cp6Mb9Pwo^r!H@cjv2VKms zc>Rl5|GioxsXIQwyfWBaM9OEB4#|T;pdrCg$UQgKSLE}U4nrMY24d}@LBYR|)t^Iw z-~s&ihOyY~w1{n#^?I9P{{Q?Bzw@(cg%;CTTFC0ga1fBeMO>{k*jFr-{$1@(TuD{ z!vUPT>|M3=BGGTSbRn!sdmY?|Q)IT{MfyHj<{U%Onn8c7H-jhqCxb=10$h#` zDISJF%&>;g{dSP>a+l+Y0oD-?? zB#O^9JmTjcSkG--cElE;11ea1JK~cl)K-CFGzY#!?lHv@#P1jc(DE4wc qn=28aY5(j2^xcbXOP+}WQ+(V^9IT{cqXQmI=(66miv_xN|NK8wiiIp6)WQr4Jr%{9k(-|@~l$73@SeZifg zI{^R?G`Mu}Dgf|+UwHt5?cm39Q11o+K;}cP-?($p+27I6-S>_=(gy&7AcYpjrZmKE zZ5hJRd#4Iz7qS9_6JJh0@x%-Wz5qHvG=j$;{@ zb3chalK=GK^NpYPn`u09dW!*UM^(IH8wv{e; z{CP`=huo)#uE35EV))PH)$7HIMoY)_q3zzGjURfihudCWGR$~re|2^C7Nb>p(!%YV z&^et}axUE-7vaHLh;uGi%n5ko>r@zjLQv(v7e&0C(bt=9gM~y^YV>TZawnvpRwfkQc$x1GCprt$UXWQyEi@*YS1EK?HQ z8g?SUMkj@Rc;#&8A(GR}pX=`Y#Lq94{SOVMXv`x+9N%vk5~0;`w(S}f1or4IZtyh|zBS|;J#?9c zoa`Z(&d3`pMViwcyKrE1QY&eUI-X|5uu*1g&JX%`xIeN!6qB5iBDNaWJMOL{39Iki5BxMycm5g?Wv?9Yvq6?7 z-nF_>Aa0blG&bMV)O1*Wvn|hq;DBSKlhh(L9+KyKkWTBXbt}zrNqQMe)=qYjHKa(d z{U?EDgOy5Gj>mk}CMC+=e;|XXr!~i_ye#&X&a~7@(4MXw?e?;kFmYd}&j$6l(>9sf zoM3PNM~-gp=Xt*pNZpSP9M1kqdu}ejWG%e(MIVsemu?9>xw^~S5r{R(2fkVK_-G#1 zusHy}nMof+(mk_CZMO*cg3S)*5J~U&B5A%qe?>yx^lu-%A|MIgizNi`VhboE_J96@ zb5XkUH}GPX*A9$VDV6W%0jCF;iUBX!^L*g->_XH>|4jKn374Y7>ufz8+Eh}?MVyY- zFe~Ki;)7Y&Up5FJ4+74u+4ViZ)W@swNILnv9@zHH&Mzh&PgX`86?^W?>PMl6%>6To z=|OF6bph7jLk`2Y3jm1y$sMnc7*~7QUa*O=!jYJMJHUq5-_;y;9c7i+3UfX7V9gN$ z0J06~yxRdpMm`Vr(okN3JKH^B7XWxzqJT%91@4x^%LP`yrXn90-vhS7vVOhRBe4CS zFS73_`1Os*uMR~io#{yMh5~o=|GZ%)EBq`tk2!|_bZyl#5IWeGYkOpFB$yyrmzX02 znj-$V#2}Zh78N=W%31E_QuS(_Ai?hbyI?1>e8Vh$=;b@>d&feloth^R}KPS;X8wtDn0k~{puzn2#9S$x(flH z`y)W}Je%pjdQUI*OONM&jv(XGWJxDpjk9E(_3l?VKj8XH_9A#eNd4u_J!?$^m0by1 z!pfv)VVKMmd6TqCgXN);l6G9~5!}YZ7a=R(9_{FwuVuG;1+ep?C~JkgTrQdxtwBpT z?;p3p8N&N`Ad(Ostd9ynNnh93kphlOLJ$(CRM%J7g3NQGSZ#~5E#<4oo9w$HzX5wh z1Fl{xrAmY*rMJsN9CnA04Dl+zyIA8xjj*j?<+4_6r;spgzM zHhhDP>ZffD9W%ODL_@C59CWtZMP?wWwcU>WH2JGhPfqu%3^y&3%R=C6S`-5?>*VJ| zYOOUVh_k8^?k_eZ+`sLzP6{q87r^hh{mkm;WbhnASEEdW&9FlL=COC;&_^j4&!xI} zVYlE|&H?<-si$8F9iFwidB%?%`E2JWk8m1AkEvY*E>&g{0~eNX3~R6%Z?9N1=T^*b zP$_U$|B9IZbC$ty|L=qApQahtA>((Igmo8j>2~Gyul<;smFykg9_&gii~eK0zHXMi zvV7uT=d0ox^f(WBM5AZ(*XXAII%E#?X)RXlqU-^R}#qS z$3cVde9RZQnS!a=9^98vvl37XhKp>%MF<#^pZIrgjMMn3p`PsY;cVm#jQ}etUCz_w zYw&#TEPk>tjUo&*UiSyMVdq!NG6mKiMPU7#qEP#k9POMn)$Pi5kU`nEZSc+oUcEBBxKmjDZjF)x-Wh)>`WOEwSA%+42 zl?-$?6*kX4$PHni^NZF~S3qjy2b%Trp}a3dBx7L7gcDKCFw$6rm;6%xg)tg0P(f7W z;rVAI|80(Y3o|a5#)Pc=^vSuL6uaiq_|Z{DufU>E&7WfXDJojCS8ErBt|=KpDRid9 zV(Oj;X|IOedg_+gzVS-jQvMd(KQHivYbxr>jLW2vqE5N5e{A1?onj(@tvcTBHeRpO zR_xq*jUNjO4@r5jD_xRr$_z=$I?NpVn35Do!=&Jr(OQc^XacLJD>joeD#zIrJ&zD# zDg;^>Wok{pqfZC2sNxR8QDh}SayzEHjY_kg_U*>JD7%SRZ z>(9+BQGnwqfbYy<%Ot2o?I}k3?b=p@5?YTdF=18fzWU zdicKoIVws-hzG!q8#vD8B@IwcMd^<{@Ikk&w)a@RzP3@W(%!9xw=*RS)C9Mh8qwXH z*N45!jjQQC1&2NR@o_}$CJ|hhx_)^3vr$Tk3Wo<|fjqHA5y_kyR!wEuq6nkgNHMXl zNLpYZM>>j~MF}-DHXfLMI5hqhhj!9z3W|#0dm9wR2ayZ|2aam7S2(yiR~|TX`_n!B zVeiY`7biJ5S;ENtrZ^fu{JN3IH>b*ug~cII;Ec>#$K||2@wVTu{mrx}q~Zuh^}9gh zd2m`+^Sz(!0nTnbBM1y9HxAIGj{I?f+q+^*)NR(0P-mt{^oNW$y!BSDcGu5}DAq2I ze4g{NimGi^g_wEi?$Fq?%=!a&CN;bNyMg0TgC5j z5AS^bmf0@o?<238b0ss{a{>Rl#^72^?zEJ)whtP+zS8B?N;35Ug@kx@_piaK-{1BNFin%!$o<|HA?&0M_pUjoc`_XlhbH2>i5sum#*zu>bO4k{41jrQs3w|dsvm{iTsaHAZu`6 z;kv61*Jw5j0Mr^zX#Gd{`Y+V(q@F72hzZd6Vayo4OKa~u7;r{$q`Y!{>(Q?3oClwS zj8`x-`IkKwzXjy#N%e-V8Ifb0w4kgFVjG08PVR>JZUw;2bvR|x>h!JTq}#*tNxipv zuMjU1VO80yA!O8g;M?D2YHzk>$UBU9w+(m(o{mhtojJQ6L&~ZQM)%<*|H_&VzU;@Y zcz)gwgjev??+1#&zp?pTN&5G^dGb1-vDkg>?LlbJm=}Dlgi=*fWD(vIiCXyN@HnjZ zOGjhvDmyJ0!192Wu`a7_lSM9cO0K(h8ts!UfcSWO+nezUki#y0F#ui#bw6r`rTfmw ziGu&!^*;ct{M_16GOVD}7PVS*9K?%=MlJ;LXB>m8Q=&dN7+Ek8jxWIhpmFjz!15k- z$)={yunvF(iRBqrhw%JI0^lEt4Aih6eZO~ud8SU#JKT;=Lwd@&H=P3?zpsfX3Ol@o zT#k8IR@Y(8VQ*zNK0T;j%EWhu9537k0UmT$Otail6gh1ykU4DvmyqKAUdv0+I@e?e zv8g%9-R~rV7t9&nY`=58bk8WU_m&>QV_wZ+^pnFo>8(&N zZO#=l()3F{qEtMMD+Mc7*Wfk=j_3e%2Zt#5Aw9vqdaX);Pz1=(J?do62+yj5|7 zN;=-hZ0Szus*xd@kM3W++|J6~GbIu6 z{fqD^9URII3@XG2FGoQg;F0#dCxwxcpigHLRBBe{OFK6YLhwX(1fn0*&UUQjUn`^= z!Ti`7%-%l|T4g}Xou}yJ25uBe0>NzQy0ZS4%tOW2FfjPcZs@YjYwEabm`}HZOKj36 z2qy=ovp3iL?D`_WKmQzM{&iERCKpl+Zk(uVHupW6UYCl zNdFm-e+S`Fu;t%%?)3rSCP(Eh4!(cJb8Bfh&nb1K^Zb*}xo#2*oQ-TE4M#Xtve>L9 z3`O6dRZVpjJLcz-mpS7`SD(6n~4!=gi^QuKq&;5WsBr zW00YRrFwgyx|dGUftx7=0X#+R#cw=-WY}XKtcq0Vtr$2-mV3wZ$K3+iNj_k1&o(T3 zYqMOf7KBCt>=QLy7+cF@76E{)0ti6i+hVVdL9nO5mq-)pnF8mJ7CstYzY3a2tiNxlG?vh zJ7gQsGRCx0B^|@gL^`aUrQp0SDEu7y4Ow;R2By4IHTagm`rU`p)WW9?Y{XX4r8^Z`S2?)}Z5+A5| z_p#NRF4;DLEtrmYrK__Pn?=cJ3t!g=qw^+HU@yWElZ)vmfrteote4|~?$-~zFIsH_ zs-vIEm=U=wD~dYn1}y zp+~s=4S8y_m3IMFkr6?YPfO_C4_Kk{@aO}azOqFiwohLW|E#B9sk`*|LX4pA~(w&`rRAvKfmO^t$vz{w7{o-0iW9ZqpyPmM~19+Gmgt# zywVVO&wUKCk+vza3X%7ReuceRTr=Gdin3z}E7tQjhON)kkNrm2VcZ+CO%mN=(>%?r zFl3Ld#F?S zxHM6>#bIs})XTs2bwMxqy}DP)g!n0Y`aU}kiGsNo!5g2M;!ol|%|r+Jg! z&2VnDIFv|;GJ=t5J-L=M>yu9<3WFYZu5N_)HD#9$A2yu3Fv33@K7Zj|ZT}=82Z(KK zNB0%O#U(Z_?>UzK@>)+xqc9Ml-?<_ECR!BR$=u907WkJ(HBAyIF+f=D-txej$Yq=L zu(;sn%mZcfwkQbp)~TO5z#`d@dJ1q_SLV1k9gPXzk_XNo1oqiv@M7tw0I6-jCiMwJ z04TzAg6xHP0E%4AUp$0$T2n&&&xpByY|qKY1E;+je&lT)7=GoR7-hs#pG*Na&a#73 z3#K>hF*Z26t)^C&mG?6p#FyK&I2Wo2ZbI-ty|+rr9Huho2nVmY+VNCRmtlcKzQUw3 zkPaz*EZ04NQ?8Ep<(O{9iKqRqIyQ}sM)+*KKa3tmR*yr)qn$_Z<>ZmEK9oEL+}#!j zpPL$1dVDIkF0CSCBQ5|MJGb>+Tql*pA?m-+_W<`!aiIS+*kP#{mCiqD3SI*E-ki+Q z+n#<$=7X3#u9~o}BO_+l9#kwFP{@D5g4ui_IlP`Ul8A%92**~gstb`fu{o8(&d_f` zEY|>GtTF7U!N!U>5SEVp+EV>nuw3_v`qE8=tPB>!1O>(!iaaA^%ndhH2~Ls&MC4S} zWy8`gzsfe|3E`B6sij-lsoe*(+Nu5Gg_f`{Mj@wf{9=!SW;$Q~D1TUcc-|)9pH3c$ z1Y{7kXknJ9DjD zX)}5A8@K7^-%*L7g4?tyh~i6F3mb!P2L@3~PjQxe-Xw@YdeAGgj`J7D{I52DQenN} zh%djmPKSLT3rq-$(Eq=qo5tDY3~s1jXdDXq7sBP1cBm=a{0OI zA?Wr6lXvL(#VHyoF%8-mSj#YQ^Yp6g7c=C-sJ4zOIR(0*)Ah2{JTDWrn$c@dTcoQ1 z%~aX&jpdU%n6R$Q$BNm_&T%^YKkY*5yasnpE~%fvtE)NC1hcseU{CfJS%TG%P?d8; zR_}(SZ<=}Fm}`Nez)z}N@kjUV9=lH9+GkC^89Fk+F?&p29h#FT!@kd|-)?c#cYFfP zQt&*2(;wp1DER2CN;fF)0V%LXxOa2JpS3y4|C-EeM#I&$FReA8uf_ zr)R2Vv^mJ)K_}*|RtjgYSjS*^fO~)R6#H%|T~=*n)}o>K9nS3Y@4_E#B5J|F#*>0r z+@0M2n}E6q-v6)d*niLTe*?PbrH!E+Wf^^Ud#cC3h?6SDZRbxNoY;BA%NbUiOqw{lK+@F<9-dFz$iEyM^Bi+#>r>qR2e{d?EbRfyEZmJCGrgbY{TCqKD0n&tW`yC@26pDKbt0w{#N?%+p!f-&>|bNQu>R)we5a z9Nrxs)T3?qds@+J`i2wJa^3I!1xZUFZk`vw{&Wu6`{vTn@>J@YF#X32OB^TO6BBd8 zd@;4cyYzw{E}(8KxThLy=zUMOW@mjh1`x23hDf3{by}Q}oAVA%i_u+b>q`Yd*{8Do zLbkmZ&PQG9+1=CMlY2D!Frac<0`RDXoPHX}v9Pg(c$N5V&BN>LD|fz`)u}FMh8IYECK@;jV7%BLeOJVR`(B+I&}EV`jv2!7P7%RsvR_b7iEO^ z!fid0ZjHeV*_6@$yL3Z#2Vy(BHmY?HnqeKGM_hfyglBpY7w=nk_?IHOnTdPON0xwrQ zym2p>M@RW*gXcBbTTo614|XeTG>z4x^82v%6y6Vt^<@sPO?5@%!n_u9oJn&_TERy9vpe(xA0Pt1Rj7{MURx<5@uTyUp`nX z`x@}IR$KQKNMmPhqy^EZn^>#O5M>)FNQ#&)XM-_f_ja-qEX9VU&p%-uTo{5 z_}rxuq_^`Ry(u>tVotX-LL>6IB0t?pGlT8iTi|MA}!xsRANb$z&f?q?z zx9(U}9=9eQ`iCQa37T|}4*s^R{QFYtKVXVS|L?sv2LnIw0b$2uzy#^Bu((m$y29n( zy`NV$((eD6#*`jZaEUhZYG@RZQ1VM`{K%`Lwcm|ONk;QlC4qV0hpQ+q#E~47Yp%`U zjSdw49!_UdR@=Odw2}r(a?~phC4OjyuWvB3r#GyT-P5DNU3ovai<(wnr8>FZV&R7J z&W>|&Te-EPrC(qqZFL(Vb|L*Wko^>v|mH2qT~v>;gMYa%I-`Nca82rGiq zhbq!mt;>|bsQfjhf95WGNbKG^6=3t#@=gQ`HSJJ+$nw`TjWOFV$UD9u3F*w|3D!|J zfPMZxRfQ9;P8JdhIqC*FwsOi(KURVrHc><8FO2;X$%Fi*5*!mcM3(SAZAy7|jW#Kk zc1P17k>*(&Oi~xdKl^yqIsmn!D0w=8gDDdFuykL&J-}I2Ezx7pgzOJp`lZpq^$VDq zH-5wJzN+>OCcPyf$*x+$**z=h_6sjmr*BX`HNw7yjBAXPc_ezmKg;R_2F1OM$7=U4 zeKfXk^naHyx2&@&MgJufxY`Gk3*YX>e|U&GA}$XimQjS1cyby%1tti99QyL#-GcZR zT!@r*Id(i%Bi}M&P{eRaGuIS%vtxEStJ+tO_#p|kY83<#8AlX;uG&^vcF1Euvc#p) zwf!xc?80_L*Y+Ww_2yJEVqRe=@cm$FKcThNp+$ExIqRKOx$-rMGU%GV>nz{EqQpXW zc-wtUSi@kD%;n?*;f&@BY8&kLVrb_nWE5S^SD3Mg*;0N~rOjMsWW&QZ3Wn)Qdx`3O zD$=1#7}QGGwFv20DhpaNesM3(SXK(V-ic&C=+(_iR9+nMdiQ1n+sxxc$Iv@Qck-mrzNVP6Af^Mj6= zbU3H{;Js=d-@Z;CIaREsMXf!f1z8{GaBbgYeaSgAA|Y)IJ>H5tshGHi_R5*E225^Ex1X*0grTFqDqGGYZu*ej&hRh*E2z0C@TLZm8Ll{0ES>34;jjN@A8wgFD9Gsf6%u$sa&-Ck9-s()J3OF~@Uk{u4}1gLi4zzw_J z<20qJKS%j}6`b4uJgYeG0rbF=nPeFAybNZCPon2`T^m6$r~dbA@2z_2!=E@P&B2xS z@`3J}^(N0IbHRz$s7okiE`1J^l*bE}Y-BO^I`6 z^=e{*Xx}8O2Y|(y^Ir1oxgvA1tm#_dP%-NAk_J7sybbN|LH4O`FP0c=icUxYM;5SU zfv4eCI5=my^DByjWT#N#STOPsWIR88^u}38P4O%<*%aVSU>%+9rv)=+f39a6rTP_n zN@zPwYtF&-fa1dlBPOe$FHK~nQm4)it<=DHePI4f{umVN@M#9& zyPs-1T=31Dv+Kub5u(bSA2U}v(?;80{JuBeer(|5-pqd#S;>O^iN+L6Gp>P$zq-76 z+G+0-phK^m2Hg{qR!|v*-NdQ7x z%L8t?sc_eg&oEHF>2jMxqan<+1_-=*!USoOq#0@?8n+gT7nWelx$lGe)@ZD_x;eT8*muc~6X<7aV?^Nc8-U*wT>K+(C z-3g6qXIB?2zDRG2e-Ah4@wJPOZc5S%rM281 zaN;^SPg=b1_i0vnW!ig+gUOv%%lD@pMlqa=GS@VBu;()(FVpR7Jv?~aO(|AtjemE% z2~YiDyN;NUXtGpEAhtld_NIbE=(#?@fxe(ACozocwYiPCitHT~K0sgZaXJt?$+FxJ z*me?BIB7be$;dEAVm=R|gF)8;oK!h}#qsfUVQUl0D5Vn@GU&No@Cmxx@7{}e-$Fsj zUtw1aCI^qW6P8RDc1eMO&AmE)$+0{6-X8AuduKPo<=|P14JjsgWBGQ^A)EeZhhyfg zjTxP{wqOYk%Zoss{Q_7DcI`Rwc+`n@&+~SKnCVCr3HOswh0t<2hhH5KeoR8l#L?W! z@qf3X=)Wo+{>KxBnJm1TS(C>KC2MVb-d@Q3Mu|QaGvdaMsn`mjz#m+MjDKF7%mf3; zLzXiZH{EK~No`A-4BPWiNZdO4CpXBJQ01z6iIWCZHCdA=yLdzYshx~Y7FCBcowdF? z77!U#M+lqVm45+IqhQs0ls0W?l+2m8tMXdjk|7nDi}OrmT$(MJR777fmw){$2XBZQxnzpppJC5m!y81pxT0BZQYNbDZk_GQ8 zt{WXX>^MVKe$B}zrBAYuDml+6gzk{n{nesmXyC0opUXLPJu>0@L5?%}?D|=}prm~w z@c`#UJn+Gi(;13mHhd9!+A$a~994%|{QA=6vt8i3R8EkceHb-0jJH1d-2J!drLSYB zvZz&%=9X1{d6`5X2Gw#DYZpZ1^%>EJ#<)V@Wj??A3v5Jw$YP)O6qEg2Ne!h+f2w5dzk)f z(CW9BCy*kl(9l-laP6|LM)>wvqi$GA9P;Yk;1^W_@7m98hIhKl&)Y1NT$+{3>i?`? z>zz4V=Sk|Pw`h%tkraHTkM7?fEDHgf^@<5Z~vlWSmZB2P{tw z;R_w0w>RhPMT=B8CLAhMEF81N+02?15fRqCn(lyRqI2fNv4!x~MTDw=(IR=@s=h)?-HBb}Sf>A#kxp?BV>-^^mviP2o=d@tuHa4F^pl!Eit+6FGzf2B>}yjz0w?Ev;-x$y}2K fN9_NQqga@X;pxmB>|)T}0AQeNa2#pF#ix$Nq5hjg!N^flod97&McVb41CincviQjRrMi9hEFpwd~_;D>{>C z;$ny74<9o&LOa;oii(O_Sw%&B`Qwz(XQ3h-azXx_h3n~K@)%{LnVCsML_|$ZO+rHc z9dqR%E9rm$kF;Y)Ck+fTonZ>p89>@ee z?Pa{3l40_cHlf;gj`W`9zmst>oQo$t^Wt5x z%sVSRsGW@{TH^7;MisdM+Np?iEWNsMX3)|_N=7;MuXVW1Yui}07jEslsUDI}c* zu7^kVam$vWWP+e)hv&Vm0bTa|8H$&1N(O2&FFZv!)DNIL&_-e<22CL;3JvxGcVaY$ z(7uM%>^DG=D1@pCJ?_Mrt!@r9urq#NbAW*PQKB-hg73beU{}UnMV5_rxU!>qwxtBpHI1mW#n4N5G0>d^ zS0_DIpNkcnd6l*LiI-?ecRzLW9)4LnUiv4%_2bBxl%R)wjK7e^0*mTwC^GOa9~2+A6*z%z4SK?BwYx zaR-XzbzWsnnxl%ubS|pXcvS$DPKGw}i54y`eq~dCd`uNqgf{Z%biO8__r5b0EfPx* zs|HR_iahF88+gUeSQ8PR=PSf3#YZImI@`wOTU#A0LcVE_H1EwBcEmG74AmkA7CmGk zUzMPJ=Fq|{`JCi`TR z&B-%@w8f$RM3~6|l0E0@VaRH{ytu@S5-c*Z=c10#X_!WjH%6v#SKWjhuKItP7na3Gw`V40CB-Pz~pf0pZi1b+b zlA2ccx#^Q@%|=m2d&{6lESi8GJ9W&Rk$<-NtsMTBBlzWnribQghUSnrObPcqvsK<9 zXu3?ihq0ziPDi0L=ZbG=nITj+7?B+FY(DFA-?*^P=GrIs z=Wg9Nb<4Vv-uKX(BBwfY7!@3Skze}8Z#C+JEzs4En+9vm&zQFxHTMjLLWBi) zBv|!{%&=+R*B60f#xiRlE^qM_#CJNqMaO7JC%>W~%D4HV7lRpN{;y~~oO=)bBB155 z7Us@FVhrK4D=0&00Cgv0i}ifRWZ%5TDOeEfWxT7_fKRQ+4kLG4is`O3$5}w0u(l18 z*Mi>Qm3EUvG#Jg#DssZ4+MnzvxS!=0Qt}}J!43CgbLTfm|F{{sQa`LTAH_?MUU(O& z+M6swAY8|BT1JMAu|D5t)yGwc^pR_q<}V%V+ZJuc&fetey%+FbWS>CTyDn<34)Y7$ zkM_&#vN4LWy>IfkmZ*rPAPxtJ9;6gYn;`s1X_`buo9xiYX%ZYMq#JW)g38C)><*UZ zgtc_i9d_I288DPTzksK>i!UDr#bJL8#c@qa9ermoaxV(*x!`zfC*c`w)zIP1Al{<3 zGz-CUZt`9D#Np)r%>$|Sj!8CUhqG}N-gBpnc*&X!qf7-jVzq$K_n3~F0zKRsohU10 z_&;S-*@S43m*0rfyMF&|M1T@Adx-E?RTbhkB2IjwCeV#twx^whAVWn0#Tn1C&dh># zMyhwE0h(kR$pNDOK#F=WOmuEZOQSR1+^Y`lQD2!#dlptb(9WFL@e<{o5$qNVJ4k7& zTIugH>Fc}K7unUxVA(sUi#H88Ii(OHBd1X<#iH5;vgoDFMk5?Zo74^BVg;^{9XFff zJgQcudC9$WivL3eX+mu$&2j@TRHTdB^RbSfSZSd-ZRW?(TsB2G_IwOUclVDrag`x5>5F`_{~aJt4pO@G%ouvtj=2~WB- zsGcPT4q-TC0GZY8=y&t9ql~i!(I#o9RFhJxGz^xDwlO_x%%@=|uqh^i7I+5fpYyO=vZOi9k*TA&Q(86988P26zKrXTA_%Ciu~L%zlhc|}cPMaV z06$+jA|UO-8Gx5&zQ#B|B?U6S7*-RXflSp%irp};1ccMg{D5C

OlfX2g;q3|9qe zWlcJjA*ttnxeX3NDOXX__yn+5go20 z&}vC>t_x9kPW({xPo5IRaLncC7i%GsHc+7o5yWqQWjD}MzZjT&5ao1t&Xxb&z1ae8 zE{xL$teqD5p|^5^J+!2;KvGvmA%wfuJ}oC1}PJ+-u}iho*M5Btk4>5*lK+%U*j!yp#8 z5C)L$#}ZGNBq@y}0)DA*K6?hNYa5&9j~(T zB*wT*qH`Hq>0`ewHYxf>t=WZa2 zj6d>szk!;sOFKVu?48u;u}t|BOytKOQ&}2)WznEg)u-h77PQM3@@vwOsu>SdmIC=; zZ9gu@hx^{0Ev$cG@x^1H>pVaE-|sU_>zHjFSSe&5DEl6(w35xufb zEWWG)|2u{DnwVydl~2M(_{*(s|%#T%uNks6q4{cX#K zI6l%aFu+wA{p~0>phiZiBF!A@Th~4FW)h1Q>C3uqRE6w!cLV?P8fFVMGFE=#L&w(# zC(X{|?}b8cMGPh)wOT%2r`FaaQ2f7RvHn`^r~K9=ervGXUD1&6PXR5=<~BQR6}$A3Xe!W$eXd7iQ&#+@MD zJM85*K+R6ij;s$CD9aGQYCwM&HqvKjXJ0V|AX#X=#?l@@^`V=7+|Lgp?Z4bQ7DwHr zlQTUU9`xUgFhHrc;G_xTOqru#b*`GJ*W19;z5YK)i;1y@5kZTeAD%juHBE-N?s{6N z1J9DNBm`!(&G!nYEMpKU4(W~z<~Rcc?H;b@dDzhH=kgp(#u7yUH@qPrHB)G61#2t$ zt1mE-==|_zLDRo!vNM4Jxa^vYY~{kG%*y-2NV8pz*r~0Bp>h|3`}80$MxkiT*qe*= z+O3JLuL3;B{jp9I0jyeZOy0}Dvpu8B088hD$2%x->EsG{Rd{B&w^khTk_|2x;eYQ5 zgEWW_n8yU(?e#apQ`jC16lMc#ivT9~#4h7qh;IAFT%rg7mepLFeXv`?|({`jZH$6s4d|9j6#ZB zf07)D!w;7W$2@@7Lv@L)z+BiN-Qb;L+UTzwvavX6;7c+C=q7r=F%0`%X7dC;Wa1Kz|<@;K6(mQ1N=pYs+XmpAlqt1LwpI2D#y%%Uo`C6(dql zF4+86&t8U}l2IB6CrLcF=>^#5S9LEZ7cC*BTf*R9im&3QIaXeJIFKTP(PV)Yd2+ zUM&EA^VKy)lXsTC*z9gBkk{kLkeSTRIfpKNj~%dx>A%3!)=i{1>+KtjXEanP3=Y znB^0W zA+lp&pNa2>Xn(gddwKbkZ56*6p2fJa^>ZxCZ=h@5%W=jz78r)|w`%_$?h+bX zA!xug&~n+p_EB^5187IrUjElLBAPw`yRemif$YubPjAVlXi=_hy0Um=25yhX)Z>XR zHbFcX_Lk9a?@dc48)6$!!B9a}^B|VMmLam zAgDATOJsBOFa{(a!;lY?DtsYN>F=ZTTyRPK=>%%5pWqRQpWsMjSG#sd^ilQkE_=#y z=!YFcb+}3N1{xVlbdUBC98pQ(i_tgsLwuLjvl^axT6~C_K|f@ywqFF=$(Vd{Yme*z zGRFRc;M2YQrvA+SwL*GOy9)}2Rgf{KmD(f!G=PuPZD{+JUFODFmq zf*$8~k$QOr>I=o}pYZ#Wy=RMMj4auY>HPm67QFVj6D7eD*5|+K-YR}|4OL3If2`S< zQQ0wmO`0{cFnCc`n$X`hehoFbxicuqanTJU?3N!jF}JKGa8+WYb6=>@+T6Cot2P^N t?*}Dw=I`!zX?2?)WB);0DrpaLA*Wi|JyFnY|8ovFXKrow_Oxfr{{Vz#CDQ-^ delta 4460 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 E1EQSq7XSbN literal 11636 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 Date: Sun, 11 Aug 2024 02:20:24 -0400 Subject: [PATCH 017/162] plating and circuit fix --- code/datums/components/shell.dm | 5 +- code/modules/mod/mod_construction.dm | 40 +++++++------- .../designs/mechfabricator_designs.dm | 54 +++++++++---------- code/modules/research/techweb/all_nodes.dm | 12 ++--- .../wiremod/shell/brain_computer_interface.dm | 5 +- 5 files changed, 61 insertions(+), 55 deletions(-) diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index e233d07ac4eec..6aa88811111bf 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -16,7 +16,7 @@ var/locked = FALSE -/datum/component/shell/Initialize(unremovable_circuit_components, capacity, shell_flags) +/datum/component/shell/Initialize(unremovable_circuit_components, capacity, shell_flags, starting_circuit) . = ..() if(!ismovable(parent)) return COMPONENT_INCOMPATIBLE @@ -25,6 +25,9 @@ src.capacity = capacity || src.capacity set_unremovable_circuit_components(unremovable_circuit_components) + if(starting_circuit) + attach_circuit(starting_circuit) + /datum/component/shell/RegisterWithParent() RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examine)) RegisterSignal(parent, COMSIG_ATOM_ATTACK_GHOST, PROC_REF(on_attack_ghost)) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index d5930ec8b2fd4..77351a0b075b1 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -30,7 +30,7 @@ /obj/item/mod/construction/broken_core name = "broken MOD core" - icon_state = "mod-core-broken" + icon_state = "mod-core" desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though." /obj/item/mod/construction/broken_core/examine(mob/user) @@ -44,35 +44,35 @@ new /obj/item/mod/construction/core(drop_location()) qdel(src) -/obj/item/mod/construction/armor - name = "MOD armor plates" - desc = "Armor plates used to finish a MOD." - icon_state = "standard-armor" +/obj/item/mod/construction/plating + name = "MOD external plating" + desc = "External plating used to finish a MOD control unit." + icon_state = "standard-plating" var/datum/mod_theme/theme = /datum/mod_theme -/obj/item/mod/construction/armor/Initialize(mapload) +/obj/item/mod/construction/plating/Initialize(mapload) . = ..() var/datum/mod_theme/used_theme = GLOB.mod_themes[theme] - name = "MOD [used_theme.name] armor plates" + name = "MOD [used_theme.name] external plating" desc = "[desc] [used_theme.desc]" - icon_state = "[used_theme.default_skin]-armor" + icon_state = "[used_theme.default_skin]-plating" + +/obj/item/mod/construction/plating/civilian + theme = /datum/mod_theme/civilian -/obj/item/mod/construction/armor/engineering +/obj/item/mod/construction/plating/engineering theme = /datum/mod_theme/engineering -/obj/item/mod/construction/armor/atmospheric +/obj/item/mod/construction/plating/atmospheric theme = /datum/mod_theme/atmospheric -/obj/item/mod/construction/armor/mining - theme = /datum/mod_theme/mining - -/obj/item/mod/construction/armor/medical +/obj/item/mod/construction/plating/medical theme = /datum/mod_theme/medical -/obj/item/mod/construction/armor/security +/obj/item/mod/construction/plating/security theme = /datum/mod_theme/security -/obj/item/mod/construction/armor/cosmohonk +/obj/item/mod/construction/plating/cosmohonk theme = /datum/mod_theme/cosmohonk /obj/item/mod/paint @@ -123,7 +123,7 @@ if(WRENCHED_ASSEMBLY_STEP) display_text = "The assembly seems loose..." if(SCREWED_ASSEMBLY_STEP) - display_text = "All it's missing is external armor..." + display_text = "All it's missing is external plating..." . += "[display_text]" /obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params) @@ -228,13 +228,13 @@ balloon_alert(user, "assembly unsecured") step = BOOTS_STEP if(SCREWED_ASSEMBLY_STEP) - if(istype(part, /obj/item/mod/construction/armor)) //Construct - var/obj/item/mod/construction/armor/external_armor = part + if(istype(part, /obj/item/mod/construction/plating)) //Construct + var/obj/item/mod/construction/plating/external_plating = part if(!user.transferItemToLoc(part, src)) return playsound(src, 'sound/machines/click.ogg', 30, TRUE) balloon_alert(user, "suit finished") - var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme) + var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_plating.theme) qdel(src) user.put_in_hands(modsuit) else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 6a6f7b920a633..63c61a4062aa4 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -912,56 +912,56 @@ build_path = /obj/item/mod/construction/boots category = list("MOD Construction") -/datum/design/mod_armor - name = "MOD armor" - desc = "External armor for a Modular Suit." - id = "mod_armor_standard" +/datum/design/mod_plating + name = "MOD external plating" + desc = "External plating for a MODsuit." + id = "mod_plating_standard" build_type = MECHFAB|PROTOLATHE materials = list(/datum/material/iron = 6000, /datum/material/glass = 3000, /datum/material/plasma = 1000) construction_time = 15 SECONDS - build_path = /obj/item/mod/construction/armor + build_path = /obj/item/mod/construction/plating category = list("MOD Construction", "Equipment") research_icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' - research_icon_state = "standard-armor" + research_icon_state = "standard-plating" -/datum/design/mod_armor/New() +/datum/design/mod_plating/New() . = ..() - var/obj/item/mod/construction/armor/armor_type = build_path + var/obj/item/mod/construction/plating/armor_type = build_path var/datum/mod_theme/theme = GLOB.mod_themes[initial(armor_type.theme)] - name = "MOD [theme.name] armor" - desc = "External armor for a Modular Suit. [theme.desc]" + name = "MOD [theme.name] plating" + desc = "External plating for a MODsuit. [theme.desc]" -/datum/design/mod_armor/engineering - id = "mod_armor_engineering" - build_path = /obj/item/mod/construction/armor/engineering +/datum/design/mod_plating/engineering + id = "mod_plating_engineering" + build_path = /obj/item/mod/construction/plating/engineering materials = list(/datum/material/iron = 6000, /datum/material/gold = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - research_icon_state = "engineering-armor" + research_icon_state = "engineering-plating" -/datum/design/mod_armor/atmospheric - id = "mod_armor_atmospheric" - build_path = /obj/item/mod/construction/armor/atmospheric +/datum/design/mod_plating/atmospheric + id = "mod_plating_atmospheric" + build_path = /obj/item/mod/construction/plating/atmospheric materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING - research_icon_state = "atmospheric-armor" + research_icon_state = "atmospheric-plating" -/datum/design/mod_armor/medical - id = "mod_armor_medical" - build_path = /obj/item/mod/construction/armor/medical +/datum/design/mod_plating/medical + id = "mod_plating_medical" + build_path = /obj/item/mod/construction/plating/medical materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_MEDICAL research_icon_state = "medical-armor" -/datum/design/mod_armor/security - id = "mod_armor_security" - build_path = /obj/item/mod/construction/armor/security +/datum/design/mod_plating/security + id = "mod_plating_security" + build_path = /obj/item/mod/construction/plating/security materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_SECURITY research_icon_state = "security-armor" -/datum/design/mod_armor/cosmohonk - id = "mod_armor_cosmohonk" - build_path = /obj/item/mod/construction/armor/cosmohonk +/datum/design/mod_plating/cosmohonk + id = "mod_plating_cosmohonk" + build_path = /obj/item/mod/construction/plating/cosmohonk materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_SERVICE research_icon_state = "cosmohonk-armor" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index e3766f3cc837d..0a6d8768b3cfa 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -121,7 +121,7 @@ display_name = "Basic Modular Suits" description = "Specialized back mounted power suits with various different modules." design_ids = list( - "mod_armor_standard", + "mod_plating_standard", "mod_boots", "mod_chestplate", "mod_gauntlets", @@ -1874,7 +1874,7 @@ description = "Engineering suits, for powered engineers." prereq_ids = list("mod_advanced", "engineering") design_ids = list( - "mod_armor_engineering", + "mod_plating_engineering", "mod_visor_meson", "mod_t_ray", "mod_magboot", @@ -1890,7 +1890,7 @@ description = "Advanced Engineering suits, for advanced powered engineers." prereq_ids = list("mod_engineering", "adv_engi") design_ids = list( - "mod_armor_atmospheric", + "mod_plating_atmospheric", "mod_jetpack", //"mod_rad_protection", "mod_emp_shield", @@ -1904,7 +1904,7 @@ description = "Medical suits for quick rescue purposes." prereq_ids = list("mod_advanced", "biotech") design_ids = list( - "mod_armor_medical", + "mod_plating_medical", "mod_visor_medhud", "mod_health_analyzer", "mod_quick_carry", @@ -1921,7 +1921,7 @@ description = "Security suits for space crime handling." prereq_ids = list("mod_advanced", "sec_basic") design_ids = list( - "mod_armor_security", + "mod_plating_security", "mod_visor_sechud", "mod_stealth", "mod_holster", @@ -1936,7 +1936,7 @@ description = "Powered suits for protection against low-humor environments." prereq_ids = list("mod_advanced", "clown") design_ids = list( - "mod_armor_cosmohonk", + "mod_plating_cosmohonk", "mod_bikehorn", "mod_microwave_beam", ) diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 65bc8a9ffcbf6..bae62b183f5e9 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -11,9 +11,12 @@ /obj/item/organ/cyberimp/bci/Initialize() . = ..() + var/obj/item/integrated_circuit/circuit = new(src) + circuit.add_component(new /obj/item/circuit_component/bci_action(null, "One")) + AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/bci_core, - ), SHELL_CAPACITY_SMALL) + ), SHELL_CAPACITY_SMALL, starting_circuit = circuit) /obj/item/organ/cyberimp/bci/Insert(mob/living/carbon/reciever, special, drop_if_replaced) . = ..() From a3c957fa67296dc98e4f0cc11645e9d16468e4f7 Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 11 Aug 2024 02:27:45 -0400 Subject: [PATCH 018/162] oops --- code/modules/mod/mod_construction.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 77351a0b075b1..3039f9fa5d13f 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -57,9 +57,6 @@ desc = "[desc] [used_theme.desc]" icon_state = "[used_theme.default_skin]-plating" -/obj/item/mod/construction/plating/civilian - theme = /datum/mod_theme/civilian - /obj/item/mod/construction/plating/engineering theme = /datum/mod_theme/engineering From dafadba6083a18a25792d6b1971416f78ad7a216 Mon Sep 17 00:00:00 2001 From: RKz Date: Sun, 11 Aug 2024 02:34:33 -0400 Subject: [PATCH 019/162] plating cleanup & map --- _maps/RandomZLevels/spacebattle.dmm | 10 +++++----- .../modules/research/designs/mechfabricator_designs.dm | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index 09a8d1c437889..646135300fa5a 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -801,7 +801,7 @@ /turf/open/floor/iron, /area/awaymission/spacebattle/cruiser) "dX" = ( -/obj/effect/mob_spawn/human/engineer/rig{ +/obj/effect/mob_spawn/human/engineer/mod{ id_job = "Gunner"; mob_name = "Andrew Thorn"; name = "Andrew Thorn" @@ -947,7 +947,7 @@ /turf/open/floor/mineral/plastitanium/red, /area/awaymission/spacebattle/syndicate1) "eH" = ( -/obj/effect/mob_spawn/human/engineer/rig{ +/obj/effect/mob_spawn/human/engineer/mod{ id_job = "Gunner"; mob_name = "Peter West"; name = "Peter West" @@ -1008,7 +1008,7 @@ /turf/open/floor/iron, /area/awaymission/spacebattle/cruiser) "fa" = ( -/obj/effect/mob_spawn/human/engineer/rig{ +/obj/effect/mob_spawn/human/engineer/mod{ id_job = "Gunner"; mob_name = "Eric Abnett"; name = "Eric Abnett" @@ -1458,7 +1458,7 @@ /turf/open/floor/wood, /area/awaymission/spacebattle/cruiser) "gO" = ( -/obj/effect/mob_spawn/human/engineer/rig{ +/obj/effect/mob_spawn/human/engineer/mod{ id_job = "Gunner"; name = "Jeremy Tailor" }, @@ -1542,7 +1542,7 @@ /turf/open/floor/wood, /area/awaymission/spacebattle/cruiser) "hh" = ( -/obj/effect/mob_spawn/human/engineer/rig{ +/obj/effect/mob_spawn/human/engineer/mod{ id_job = "Gunner"; mob_name = "Dan Hedricks"; name = "Dan Hedricks" diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 63c61a4062aa4..5beff87f02c76 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -950,21 +950,21 @@ build_path = /obj/item/mod/construction/plating/medical materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_MEDICAL - research_icon_state = "medical-armor" + research_icon_state = "medical-plating" /datum/design/mod_plating/security id = "mod_plating_security" build_path = /obj/item/mod/construction/plating/security materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_SECURITY - research_icon_state = "security-armor" + research_icon_state = "security-plating" /datum/design/mod_plating/cosmohonk id = "mod_plating_cosmohonk" build_path = /obj/item/mod/construction/plating/cosmohonk materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) departmental_flags = DEPARTMENTAL_FLAG_SERVICE - research_icon_state = "cosmohonk-armor" + research_icon_state = "cosmohonk-plating" /datum/design/mod_paint_kit name = "MOD paint kit" From 5483a89934f55b97c46747494fffff04d125030b Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Sat, 17 Aug 2024 13:30:00 -0400 Subject: [PATCH 020/162] patch 1 --- .../signals_obj/signals_item/signals_item.dm | 4 + code/__DEFINES/exosuit_fab.dm | 15 ++++ code/game/objects/items/devices/aicard.dm | 3 +- code/modules/mob/inventory.dm | 5 ++ code/modules/mob/living/carbon/human/life.dm | 8 +- code/modules/mod/mod_actions.dm | 43 ++++++---- code/modules/mod/mod_ai.dm | 60 ++++++++++++- code/modules/mod/mod_clothes.dm | 17 +++- code/modules/mod/mod_control.dm | 86 ++++++++++++++++--- code/modules/mod/mod_types.dm | 4 + code/modules/mod/modules/modules.dm | 9 +- code/modules/projectiles/projectile.dm | 5 +- .../designs/mechfabricator_designs.dm | 24 ++++++ code/modules/research/techweb/all_nodes.dm | 2 - .../ruins/spaceruin_code/oldstation.dm | 8 +- 15 files changed, 249 insertions(+), 44 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm index 555630211a3a4..3ba8820af69c7 100644 --- a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm +++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm @@ -5,6 +5,10 @@ // /obj/item signals ///from base of obj/item/equipped(): (/mob/equipper, slot) #define COMSIG_ITEM_EQUIPPED "item_equip" +///called on [/obj/item] before unequip from base of [mob/proc/doUnEquip]: (force, atom/newloc, no_move, invdrop, silent) +#define COMSIG_ITEM_PRE_UNEQUIP "item_pre_unequip" + ///only the pre unequip can be cancelled + #define COMPONENT_ITEM_BLOCK_UNEQUIP (1<<0) ///from base of obj/item/on_grind(): ()) #define COMSIG_ITEM_ON_GRIND "on_grind" ///from base of obj/item/on_juice(): () diff --git a/code/__DEFINES/exosuit_fab.dm b/code/__DEFINES/exosuit_fab.dm index 0e33e17e81756..63a22c354aa95 100644 --- a/code/__DEFINES/exosuit_fab.dm +++ b/code/__DEFINES/exosuit_fab.dm @@ -28,3 +28,18 @@ #define EXOSUIT_MODULE_COMBAT EXOSUIT_MODULE_GYGAX | EXOSUIT_MODULE_HONK | EXOSUIT_MODULE_DURAND | EXOSUIT_MODULE_PHAZON /// Module is compatible with "Medical" Exosuit modelsm - Odysseus #define EXOSUIT_MODULE_MEDICAL EXOSUIT_MODULE_ODYSSEUS + +/// Module is standard in use +#define MODULE_GENERAL "General" +/// Module is preferred for engineering uses +#define MODULE_ENGINEERING "Engineering" +/// Module is preferred for medical uses +#define MODULE_MEDICAL "Medical" +/// Module is preferred for science uses +#define MODULE_SCIENCE "Science" +/// Module is preferred for security uses +#define MODULE_SECURITY "Security" +/// Module is preferred for supply uses +#define MODULE_SUPPLY "Supply" +/// Module is preferred for service uses +#define MODULE_SERVICE "Service" diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index c8d50fe29b23d..f804e78ebac11 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -34,13 +34,14 @@ target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) if(!AI) log_combat(user, our_ai, "uploaded", src, "to [target].", important = FALSE) + update_appearance() return TRUE else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) if(AI) log_combat(user, AI, "carded", src, important = FALSE) + update_appearance() return TRUE - update_appearance() //Whatever happened, update the card's state (icon, name) to match. return ..() /obj/item/aicard/update_icon_state() diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 7851d62ac9e6a..3ca983e6d9e7f 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -318,12 +318,17 @@ /mob/proc/doUnEquip(obj/item/I, force, newloc, no_move, invdrop = TRUE, was_thrown = FALSE, silent = FALSE) //Force overrides TRAIT_NODROP for things like wizarditis and admin undress. //Use no_move if the item is just gonna be immediately moved afterward //Invdrop is used to prevent stuff in pockets dropping. only set to false if it's going to immediately be replaced + + //PROTECTED_PROC(TRUE) //What part of "dont call this proc" dont you people not fucking understand if(!I) //If there's nothing to drop, the drop is automatically successfull. If(unEquip) should generally be used to check for TRAIT_NODROP. return TRUE if(HAS_TRAIT(I, TRAIT_NODROP) && !force) return FALSE + if((SEND_SIGNAL(I, COMSIG_ITEM_PRE_UNEQUIP, force, newloc, no_move, invdrop, silent) & COMPONENT_ITEM_BLOCK_UNEQUIP) && !force) + return FALSE + var/hand_index = get_held_index_of_item(I) if(hand_index) held_items[hand_index] = null diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 71bb4a23a6177..ce04e0076d4ff 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -161,11 +161,11 @@ /mob/living/carbon/human/proc/get_thermal_protection() var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures if(wear_suit) - if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT) - thermal_protection += (wear_suit.max_heat_protection_temperature*0.7) + if((wear_suit.heat_protection & CHEST) && (wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT)) + thermal_protection += (wear_suit.max_heat_protection_temperature * 0.7) if(head) - if(head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT) - thermal_protection += (head.max_heat_protection_temperature*THERMAL_PROTECTION_HEAD) + if((head.heat_protection & HEAD) && (head.max_heat_protection_temperature >= FIRE_HELM_MAX_TEMP_PROTECT)) + thermal_protection += (head.max_heat_protection_temperature * THERMAL_PROTECTION_HEAD) thermal_protection = round(thermal_protection) return thermal_protection diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index 2c27879e798a7..70d753561eb51 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -2,29 +2,30 @@ background_icon_state = "bg_tech_blue" icon_icon = 'icons/mob/actions/actions_mod.dmi' check_flags = AB_CHECK_CONSCIOUS + /// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently. + var/ai_action = FALSE + /// The MODsuit linked to this action var/obj/item/mod/control/mod /datum/action/item_action/mod/New(Target) ..() mod = Target + if(ai_action) + background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND -/datum/action/item_action/mod/Grant(mob/M) - if(owner) - Share(M) +/datum/action/item_action/mod/Grant(mob/user) + if(ai_action && user != mod.ai) return - ..() + else if(!ai_action && user == mod.ai) + return + return ..() -/datum/action/item_action/mod/Remove(mob/M) - var/mob_to_grant - for(var/datum/weakref/reference as anything in sharers) - var/mob/freeloader = reference.resolve() - if(!freeloader) - continue - mob_to_grant = freeloader - break - ..() - if(mob_to_grant) - Grant(mob_to_grant) +/datum/action/item_action/mod/Remove(mob/user) + if(ai_action && user != mod.ai) + return + else if(!ai_action && user == mod.ai) + return + return ..() /datum/action/item_action/mod/deploy name = "Deploy MODsuit" @@ -37,6 +38,9 @@ mod.choose_deploy(usr) return TRUE +/datum/action/item_action/mod/deploy/ai + ai_action = TRUE + /datum/action/item_action/mod/activate name = "Activate MODsuit" desc = "Activate/Deactivate the MODsuit." @@ -48,6 +52,9 @@ mod.toggle_activate(usr) return TRUE +/datum/action/item_action/mod/activate/ai + ai_action = TRUE + /datum/action/item_action/mod/module name = "Toggle Module" desc = "Toggle a MODsuit module." @@ -59,6 +66,9 @@ mod.quick_module(usr) return TRUE +/datum/action/item_action/mod/module/ai + ai_action = TRUE + /datum/action/item_action/mod/panel name = "MODsuit Panel" desc = "Open the MODsuit's panel." @@ -69,3 +79,6 @@ return FALSE mod.ui_interact(usr) return TRUE + +/datum/action/item_action/mod/panel/ai + ai_action = TRUE diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index 851aa6dc3bc4c..a88f0f80116b1 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -22,10 +22,7 @@ intAI.forceMove(card) card.AI = intAI for(var/datum/action/action as anything in actions) - if(action.owner == intAI) - action.Remove(intAI) - else - action.Unshare(intAI) + action.Remove(intAI) intAI.controlled_equipment = null intAI.remote_control = null balloon_alert(intAI, "transferred to a card") @@ -67,6 +64,7 @@ #define WEARER_DELAY 1 #define LONE_DELAY 5 #define CELL_PER_STEP DEFAULT_CELL_DRAIN * 2.5 +#define AI_FALL_TIME 1 SECONDS /obj/item/mod/control/relaymove(mob/user, direction) if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) @@ -75,6 +73,9 @@ COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) cell.charge = max(0, cell.charge - CELL_PER_STEP) + if(wearer) + ADD_TRAIT(wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) + addtimer(CALLBACK(src, .proc/ai_fall), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) if(ismovable(wearer?.loc)) return wearer.loc.relaymove(wearer, direction) if(wearer && !wearer.Process_Spacemove(direction)) @@ -86,3 +87,54 @@ #undef WEARER_DELAY #undef LONE_DELAY #undef CELL_PER_STEP + +/obj/item/mod/control/proc/ai_fall() + if(!wearer) + return + REMOVE_TRAIT(wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) + +/obj/item/mod/ai_minicard + name = "AI mini-card" + desc = "A small card designed to eject dead AIs. You could use an intellicard to recover it." + icon = 'icons/obj/aicards.dmi' + icon_state = "minicard" + var/datum/weakref/stored_ai + +/obj/item/mod/ai_minicard/Initialize(mapload, mob/living/silicon/ai/ai) + . = ..() + if(!ai) + return + ai.apply_damage(150, BURN) + INVOKE_ASYNC(ai, /mob/living/silicon/ai.proc/death) + ai.forceMove(src) + stored_ai = WEAKREF(ai) + icon_state = "minicard-filled" + +/obj/item/mod/ai_minicard/Destroy() + QDEL_NULL(stored_ai) + return ..() + +/obj/item/mod/ai_minicard/examine(mob/user) + . = ..() + . += "You see [stored_ai.resolve() || "no AI"] stored inside." + +/obj/item/mod/ai_minicard/transfer_ai(interaction, mob/user, mob/living/silicon/ai/intAI, obj/item/aicard/card) + . = ..() + if(!.) + return + if(interaction != AI_TRANS_TO_CARD) + return + var/mob/living/silicon/ai/ai = stored_ai.resolve() + if(!ai) + balloon_alert(user, "no AI!") + return + balloon_alert(user, "transferring to card...") + if(!do_after(user, 5 SECONDS, target = src) || !ai) + balloon_alert(user, "interrupted!") + return + icon_state = "minicard" + ai.forceMove(card) + card.AI = ai + ai.notify_ghost_cloning("You have been recovered from the wreckage!", source = card) + balloon_alert(user, "AI transferred to card") + stored_ai = null diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index e012ca7e3f004..af13ec712cef0 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -30,6 +30,9 @@ QDEL_NULL(mod) return ..() +/obj/item/clothing/head/helmet/space/mod/obj_destruction(damage_flag) + return mod.obj_destruction(damage_flag) + /obj/item/clothing/suit/armor/mod name = "MOD chestplate" desc = "A chestplate for a MODsuit." @@ -58,6 +61,9 @@ QDEL_NULL(mod) return ..() +/obj/item/clothing/suit/armor/mod/obj_destruction(damage_flag) + return mod.obj_destruction(damage_flag) + /obj/item/clothing/gloves/mod name = "MOD gauntlets" desc = "A pair of gauntlets for a MODsuit." @@ -83,8 +89,12 @@ QDEL_NULL(mod) return ..() -/// Replaces these gloves on the wearer with the overslot ones +/obj/item/clothing/gloves/mod/obj_destruction(damage_flag) + overslot.forceMove(drop_location()) + overslot = null + return mod.obj_destruction(damage_flag) +/// Replaces these gloves on the wearer with the overslot ones /obj/item/clothing/gloves/mod/proc/show_overslot() if(!overslot) return @@ -118,6 +128,11 @@ QDEL_NULL(mod) return ..() +/obj/item/clothing/shoes/mod/obj_destruction(damage_flag) + overslot.forceMove(drop_location()) + overslot = null + return mod.obj_destruction(damage_flag) + /// Replaces these shoes on the wearer with the overslot ones /obj/item/clothing/shoes/mod/proc/show_overslot() if(!overslot) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 97f17983467c9..936cb9f1caf07 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -16,7 +16,16 @@ strip_delay = 10 SECONDS slowdown = 2 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, BLEED = 10) - actions_types = list(/datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, /datum/action/item_action/mod/module, /datum/action/item_action/mod/panel) + actions_types = list( + /datum/action/item_action/mod/deploy, + /datum/action/item_action/mod/activate, + /datum/action/item_action/mod/panel, + /datum/action/item_action/mod/module, + /datum/action/item_action/mod/deploy/ai, + /datum/action/item_action/mod/activate/ai, + /datum/action/item_action/mod/panel/ai, + /datum/action/item_action/mod/module/ai, + ) resistance_flags = NONE max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT @@ -165,6 +174,41 @@ QDEL_NULL(cell) return ..() +/obj/item/mod/control/obj_destruction(damage_flag) + for(var/obj/item/mod/module/module as anything in modules) + for(var/obj/item/item in module) + item.forceMove(drop_location()) + if(ai) + ai.controlled_equipment = null + ai.remote_control = null + for(var/datum/action/action as anything in actions) + if(action.owner == ai) + action.Remove(ai) + new /obj/item/mod/ai_minicard(drop_location(), ai) + return ..() + +/obj/item/mod/control/examine(mob/user) + . = ..() + if(active) + . += "Cell power: [cell ? "[round(cell.percent(), 1)]%" : "No cell"]." + . += "Selected module: [selected_module || "None"]." + if(!open && !active) + . += "You could put it on your back to turn it on." + . += "You could open the cover with a screwdriver." + else if(open) + . += "You could close the cover with a screwdriver." + . += "You could use modules on it to install them." + . += "You could remove modules with a crowbar." + . += "You could update the access with an ID." + if(cell) + . += "You could remove the cell with an empty hand." + else + . += "You could use a cell on it to install one." + if(ai) + . += "You could remove [ai] with an intellicard" + else + . += "You could install an AI with an intellicard." + /obj/item/mod/control/process(delta_time) if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) seconds_electrified-- @@ -248,13 +292,13 @@ balloon_alert(user, "deactivate suit first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE - balloon_alert(user, "[open ? "closing" : "opening"] panel...") + balloon_alert(user, "[open ? "closing" : "opening"] cover...") screwdriver.play_tool_sound(src, 100) if(screwdriver.use_tool(src, user, 1 SECONDS)) if(active || activating) balloon_alert(user, "deactivate suit first!") screwdriver.play_tool_sound(src, 100) - balloon_alert(user, "panel [open ? "closed" : "opened"]") + balloon_alert(user, "cover [open ? "closed" : "opened"]") open = !open else balloon_alert(user, "interrupted!") @@ -263,7 +307,7 @@ /obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar) . = ..() if(!open) - balloon_alert(user, "open the panel first!") + balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE if(!allowed(user)) @@ -290,14 +334,14 @@ /obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) if(istype(attacking_item, /obj/item/mod/module)) if(!open) - balloon_alert(user, "open the panel first!") + balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE install(attacking_item, user) return TRUE else if(istype(attacking_item, /obj/item/stock_parts/cell)) if(!open) - balloon_alert(user, "open the panel first!") + balloon_alert(user, "open the cover first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE if(cell) @@ -343,13 +387,15 @@ /obj/item/mod/control/emp_act(severity) . = ..() + if(!active || !wearer) + return to_chat(wearer, "[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!") - if(!active || !wearer || . & EMP_PROTECT_CONTENTS) + if(. & EMP_PROTECT_CONTENTS) return - selected_module = null + selected_module.on_deactivation() wearer.apply_damage(10 / severity, BURN) to_chat(wearer, "You feel [src] heat up from the EMP, burning you slightly.") - if (wearer.stat < UNCONSCIOUS && prob(10)) + if(wearer.stat < UNCONSCIOUS && prob(10)) wearer.emote("scream") /obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) @@ -382,6 +428,7 @@ wearer = user RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(on_borg_charge)) + RegisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP, .proc/on_unequip) update_cell_alert() for(var/obj/item/mod/module/module as anything in modules) module.on_equip() @@ -390,9 +437,17 @@ for(var/obj/item/mod/module/module as anything in modules) module.on_unequip() UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)) + UnregisterSignal(src, ) wearer.clear_alert("mod_charge") wearer = null +/obj/item/mod/control/proc/on_unequip() + SIGNAL_HANDLER + + for(var/obj/item/part in mod_parts) + if(part.loc != src) + return COMPONENT_ITEM_BLOCK_UNEQUIP + /obj/item/mod/control/proc/update_flags() var/list/used_skin = theme.skins[skin] for(var/obj/item/clothing/part as anything in mod_parts) @@ -425,17 +480,21 @@ continue display_names[module.name] = REF(module) var/image/module_image = image(icon = module.icon, icon_state = module.icon_state) + if(module == selected_module) + module_image.underlays += image(icon = 'icons/mob/radial.dmi', icon_state = "module_selected") + else if(module.active) + module_image.underlays += image(icon = 'icons/mob/radial.dmi', icon_state = "module_active") items += list(module.name = module_image) if(!length(items)) return - var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE) + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) if(!pick) return var/module_reference = display_names[pick] - var/obj/item/mod/module/selected_module = locate(module_reference) in modules - if(!istype(selected_module) || user.incapacitated()) + var/obj/item/mod/module/picked_module = locate(module_reference) in modules + if(!istype(picked_module) || user.incapacitated()) return - selected_module.on_select() + picked_module.on_select() /obj/item/mod/control/proc/paint(mob/user, obj/item/paint) if(length(theme.skins) <= 1) @@ -562,3 +621,4 @@ if(!cell) return cell.give(amount) + update_cell_alert() diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index f12897f7926d4..276098916c348 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -55,6 +55,10 @@ cell = /obj/item/stock_parts/cell/hyper initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder) +/obj/item/mod/control/pre_equipped/cosmohonk + theme = /datum/mod_theme/cosmohonk + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/bikehorn) + /obj/item/mod/control/pre_equipped/traitor theme = /datum/mod_theme/syndicate cell = /obj/item/stock_parts/cell/super diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm index 61ad926e8021e..8869266863691 100644 --- a/code/modules/mod/modules/modules.dm +++ b/code/modules/mod/modules/modules.dm @@ -512,6 +512,8 @@ range = 10 hitsound = 'sound/weapons/batonextend.ogg' hitsound_wall = 'sound/weapons/batonextend.ogg' + suppressed = SUPPRESSED_VERY + hit_threshhold = LATTICE_LAYER var/line /obj/projectile/tether/fire(setAngle) @@ -761,6 +763,11 @@ playsound(src, 'sound/machines/click.ogg', 100, TRUE) drain_power(use_power_cost) +/obj/item/mod/module/clamp/on_uninstall() + for(var/atom/movable/crate as anything in stored_crates) + crate.forceMove(drop_location()) + stored_crates -= crate + /obj/item/mod/module/gps name = "MOD internal GPS module" desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \ @@ -1164,7 +1171,7 @@ if(!.) return for(var/obj/item/ore as anything in ores) - ore.forceMove(mod.drop_location()) + ore.forceMove(drop_location()) ores -= ore drain_power(use_power_cost) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 42b7bc6dfc2b9..11a41807dbb36 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -66,6 +66,9 @@ /// number of times we've pierced something. Incremented BEFORE bullet_act and on_hit proc! var/pierces = 0 + /// If objects are below this layer, we pass through them + var/hit_threshhold = PROJECTILE_HIT_THRESHOLD_LAYER + var/speed = 0.8 //Amount of deciseconds it takes for projectile to travel var/Angle = 0 var/original_angle = 0 //Angle at firing @@ -487,7 +490,7 @@ if(!isliving(target)) if(isturf(target)) // non dense turfs return FALSE - if(target.layer < PROJECTILE_HIT_THRESHOLD_LAYER) + if(target.layer < hit_threshhold) return FALSE else if(!direct_target) // non dense objects do not get hit unless specifically clicked return FALSE diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 5beff87f02c76..67a75b4ba17ae 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -983,6 +983,7 @@ materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) build_path = /obj/item/mod/module category = list("MOD Modules") + var/department_type = MODULE_GENERAL /datum/design/module/New() . = ..() @@ -1000,24 +1001,28 @@ id = "mod_visor_medhud" materials = list(/datum/material/silver = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/visor/medhud + department_type = MODULE_MEDICAL /datum/design/module/mod_visor_diaghud name = "MOD Module: Diagnostic Visor" id = "mod_visor_diaghud" materials = list(/datum/material/gold = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/visor/diaghud + department_type = MODULE_SCIENCE /datum/design/module/mod_visor_sechud name = "MOD Module: Security Visor" id = "mod_visor_sechud" materials = list(/datum/material/titanium = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/visor/sechud + department_type = MODULE_SECURITY /datum/design/module/mod_visor_meson name = "MOD Module: Meson Visor" id = "mod_visor_meson" materials = list(/datum/material/uranium = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/visor/meson + department_type = MODULE_SUPPLY /datum/design/module/mod_visor_welding name = "MOD Module: Welding Protection" @@ -1030,18 +1035,21 @@ id = "mod_t_ray" materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/t_ray + department_type = MODULE_ENGINEERING /datum/design/module/mod_health_analyzer name = "MOD Module: Health Analyzer" id = "mod_health_analyzer" materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/health_analyzer + department_type = MODULE_MEDICAL /datum/design/module/mod_stealth name = "MOD Module: Cloak" id = "mod_stealth" materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500) build_path = /obj/item/mod/module/stealth + department_type = MODULE_SECURITY /datum/design/module/mod_jetpack name = "MOD Module: Ion Jetpack" @@ -1054,18 +1062,21 @@ id = "mod_magboot" materials = list(/datum/material/iron = 1000, /datum/material/gold = 500) build_path = /obj/item/mod/module/magboot + department_type = MODULE_ENGINEERING /datum/design/module/mod_holster name = "MOD Module: Holster" id = "mod_holster" materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) build_path = /obj/item/mod/module/holster + department_type = MODULE_SECURITY /datum/design/module/mod_tether name = "MOD Module: Emergency Tether" id = "mod_tether" materials = list(/datum/material/iron = 1000, /datum/material/silver = 500) build_path = /obj/item/mod/module/tether + department_type = MODULE_ENGINEERING /datum/design/module/mod_mouthhole name = "MOD Module: Eating Apparatus" @@ -1079,6 +1090,7 @@ id = "mod_rad_protection" materials = list(/datum/material/iron = 1000, /datum/material/uranium = 1000) build_path = /obj/item/mod/module/rad_protection + department_type = MODULE_ENGINEERING */ /datum/design/module/mod_emp_shield @@ -1098,24 +1110,28 @@ id = "mod_reagent_scanner" materials = list(/datum/material/glass = 1000) build_path = /obj/item/mod/module/reagent_scanner + department_type = MODULE_MEDICAL /datum/design/module/mod_gps name = "MOD Module: Internal GPS" id = "mod_gps" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/mod/module/gps + department_type = MODULE_SUPPLY /datum/design/module/mod_constructor name = "MOD Module: Constructor" id = "mod_constructor" materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) build_path = /obj/item/mod/module/constructor + department_type = MODULE_ENGINEERING /datum/design/module/mod_quick_carry name = "MOD Module: Quick Carry" id = "mod_quick_carry" materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) build_path = /obj/item/mod/module/quick_carry + department_type = MODULE_MEDICAL /datum/design/module/mod_longfall name = "MOD Module: Longfall" @@ -1134,42 +1150,49 @@ id = "mod_injector" materials = list(/datum/material/iron = 1000, /datum/material/diamond = 500) build_path = /obj/item/mod/module/injector + department_type = MODULE_MEDICAL /datum/design/module/mod_microwave_beam name = "MOD Module: Microwave Beam" id = "mod_microwave_beam" materials = list(/datum/material/iron = 1000, /datum/material/uranium = 500) build_path = /obj/item/mod/module/microwave_beam + department_type = MODULE_SERVICE /datum/design/module/mod_bikehorn name = "MOD Module: Bike Horn" id = "mod_bikehorn" materials = list(/datum/material/plastic = 500, /datum/material/iron = 500) build_path = /obj/item/mod/module/bikehorn + department_type = MODULE_SERVICE /datum/design/module/mod_clamp name = "MOD Module: Crate Clamp" id = "mod_clamp" materials = list(/datum/material/iron = 2000) build_path = /obj/item/mod/module/clamp + department_type = MODULE_SUPPLY /datum/design/module/mod_drill name = "MOD Module: Drill" id = "mod_drill" materials = list(/datum/material/silver = 1000, /datum/material/iron = 2000) build_path = /obj/item/mod/module/drill + department_type = MODULE_SUPPLY /datum/design/module/mod_orebag name = "MOD Module: Ore Bag" id = "mod_orebag" materials = list(/datum/material/iron = 1500) build_path = /obj/item/mod/module/orebag + department_type = MODULE_SUPPLY /datum/design/module/mod_organ_thrower name = "MOD Module: Organ Thrower" id = "mod_organ_thrower" materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) build_path = /obj/item/mod/module/organ_thrower + department_type = MODULE_MEDICAL /datum/design/module/mod_pathfinder name = "MOD Module: Pathfinder" @@ -1188,6 +1211,7 @@ id = "mod_circuit" materials = list(/datum/material/glass = 2000) build_path = /obj/item/mod/module/circuit + department_type = MODULE_SCIENCE /datum/design/module/mod_plasma_stabilizer name = "MOD Module: Plasma Stabilizer" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 0a6d8768b3cfa..c434f767a4435 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1856,8 +1856,6 @@ prereq_ids = list("robotics") design_ids = list( "mod_visor_diaghud", - "mod_stealth", - "mod_holster", "mod_gps", "mod_reagent_scanner", "mod_clamp", diff --git a/code/modules/ruins/spaceruin_code/oldstation.dm b/code/modules/ruins/spaceruin_code/oldstation.dm index 9880401fa1fd6..e6812ddb85c7d 100644 --- a/code/modules/ruins/spaceruin_code/oldstation.dm +++ b/code/modules/ruins/spaceruin_code/oldstation.dm @@ -103,7 +103,7 @@ var/list/overlays = ..() if(machine_stat & (NOPOWER|BROKEN)) return overlays - overlays += busy ? "red" : "green" + overlays += (busy || !mod_unit) ? "red" : "green" return overlays /obj/machinery/mod_installer/proc/start_process() @@ -129,9 +129,13 @@ human_occupant.update_action_buttons(TRUE) playsound(src, 'sound/machines/ping.ogg', 30, FALSE) if(!human_occupant.dropItemToGround(human_occupant.wear_suit) || !human_occupant.dropItemToGround(human_occupant.head)) - open_machine() + finish_completion() return mod_unit.quick_activation() + finish_completion() + +/obj/machinery/mod_installer/proc/finish_completion() + mod_unit = null open_machine() /obj/machinery/mod_installer/open_machine() From c1fe2eb61ecbcf6b657f7c15769f33d91cc707b3 Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Sat, 17 Aug 2024 13:41:51 -0400 Subject: [PATCH 021/162] 515 and icons --- code/modules/mod/mod_ai.dm | 4 ++-- code/modules/mod/mod_control.dm | 2 +- icons/obj/aicards.dmi | Bin 11082 -> 11787 bytes 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index a88f0f80116b1..dc8b1ef97e4b3 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -75,7 +75,7 @@ cell.charge = max(0, cell.charge - CELL_PER_STEP) if(wearer) ADD_TRAIT(wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) - addtimer(CALLBACK(src, .proc/ai_fall), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) + addtimer(CALLBACK(src, PROC_REF(ai_fall)), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) if(ismovable(wearer?.loc)) return wearer.loc.relaymove(wearer, direction) if(wearer && !wearer.Process_Spacemove(direction)) @@ -105,7 +105,7 @@ if(!ai) return ai.apply_damage(150, BURN) - INVOKE_ASYNC(ai, /mob/living/silicon/ai.proc/death) + INVOKE_ASYNC(ai, TYPE_PROC_REF(/mob/living/silicon/ai, death)) ai.forceMove(src) stored_ai = WEAKREF(ai) icon_state = "minicard-filled" diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 936cb9f1caf07..502bac7ec88b9 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -428,7 +428,7 @@ wearer = user RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, PROC_REF(on_borg_charge)) - RegisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP, .proc/on_unequip) + RegisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_unequip)) update_cell_alert() for(var/obj/item/mod/module/module as anything in modules) module.on_equip() diff --git a/icons/obj/aicards.dmi b/icons/obj/aicards.dmi index 78e050a24c2046e0a1277e05ab1495f817562164..54bebf9d9aa463c5cdfee2963c08257c2bf9e9fe 100644 GIT binary patch literal 11787 zcmch7cT`hN*Y63SAP9(9Q4Bt)C`C{Zqy_{jA|PFAu+U48DkVixQ4v9DDkbz@l_DSs zi0z^G79bRX5C{=SCY)ZI?n!g{M>y5+z~zia6hHQvelvSkbffx&$S((4aZNl%7`@+ zj{NF9T72WgwzjcuYKbf)zh|FFxI~>^{+CG>5*aE8p^3>hyNyr666Ci zwKkq^-#U4$Nx$^_Gr8iBgm$cpJDDxi zd0so+_XU07^+)MP@uYQpTXVY)lJNxxcpV+l0x(A4_DVY$=xABoPobm=#@c^H&V|w7 z`iXmw?8&aX$#ZI-;VCcn*CT&}-9T zdiAqwIe*=iYaHK0p7Hw?2cG-3>)UQSzNYtDiUYi-*eP7EHH#IL@Ja+k=y*q4nEWb( z-a(r)uOhG*4R5K;hWRC88I#pYr_s&=z^|AKrNN*^jAA&!hXcm}0F(E^a3N}d-TUFO z?Lw$k$}2-dZX~T+56TLl`A4U5m7b#=9!%)LQujvj!X0z`lI9W^l#V_D4hAVJMuRa= zQc~dH`EvEgzCGQ}d~=UBC76N=EA-!eB-ecC0zl@MnYxS^yOv{|EPOxRMGLw!JMkrI zEUxjvM$X}+Cx=xIQvY()?V7(dmuPMyJHM)GI3go$P&hU4a2XR9#6mY_(YDMr(pu> zo^`>>+nJMz^sDO~IXNufj2ISsxJ=ciTV*xlJnMG7e&!*?qJM z{9XL7A5DI9S(KztOYz<#vicITipgt+k@=}+8_KBdo5(P6%w%U(IH%4BaZEh@E6Sm^ z?M}w3_<&70EOc*n&%#B2(Y3s?7}gN+*&0C-j@-S4$8BBbDGPs!5&%bkXSdv5l$|3C zqjZ5iboy!QrgcPd%DVg&C>LU(@L>7cIA_rH|BI*bF5BfJg)Yws%;I!YOQ7k{-cBs~!6I-OfM)!H{K}cC~ z@uM@dd(JJIz@f|vyfDQ?jf3ZeZy%3)XH!W~5n=?saKj?rt`Z*>NH>yd0Y9?>c8O(N z1!L#@nlkv=N=rIp)JwzsF_OGeDARbtYFt0=TbLYZcc6LHWD$QEPC|fm`KMS84gm9# ziyHtY&Rqr#*Q5yo!Zxn}05qEWg3oCW|ILsmz-P77>|4Hj3W8hxL~3+)43w0GEk!lQ zJk0-X$7a(fbso!>nbo$gUSkEhdT>MjY3s*CAY4;_Sx^l8>)P(`AB$sgi)@DO-~f^) z-xm`Il&D27eF~IHQ1LdNc<^r5?_o$)MxY4?_f(Rjy@(^Ja%8ojOt~hdCDZ^*wAqh< z{25J|A5`bQ5&T0aa`DSrLr$kgbyb0~+&}vyP!hfxSd(JWPa59SanEW@GKs-qxT%IO zv#JlXW||gy%?7|@Gr4wXjqkQ+)kSc};q*(t-ufiq*d0-EXqS$GFN|lzJ<=ql?qC@+ za!1aL(a*g>lIp-!RcR!0T~WgQ1p&RDjZ4=4q4u{d0`2(pi4qpID|^UT)a!kHmN zJ9}bgqB%9jxIIvjmL*a}t02C_k?TG_5cD>Jqn$igIuF2JTfmliG|$q`CfM1HCb`Dj z=3GlfZfiP+kbs^wj1W>QrK?cyL$A`hRzMZYCFH3yvb%q+zH7Z3wMVX67CHbG2-1O* zQ%Ts(8`X>vlr_U~7&?!^Zg;$vLyvr~wm`YO+{JpzDXDf}_f4n6ve!>-yIv^dX<>ZhegY_IP>OtnTBx05VXhPg#q9?brp z72I$o-t#70&t?SmFR0*Ta!V30)$oTW$2Ny5;RP*<>6F14ag9jU{JfsZM6b^YN!b@i zM7@mQuqlk+YR$_bg}X1W6=Uyni8V_j%iBYgQlS+-8~!px;KG)A)9CnOi>2Agz_+!f zgFEJezFcSFtm>KI>W;2F&g>mT+~+;x&C<d{1@(Y)WEkGZUamhoFD<~)1on2*mn&8ipCN>K zmJ+b%$yV@D2~=Ttsq+h-MxB7G@U>>OlSdbmcOe&J+?-%*VRz9!D5`JWC3{OL#7m&3 zM=&?#c^1Z(Y%mw8x7%g>IOIz=jVC?Kd0y}7iSUzAJercJTN|&fqB*4XG(ngfqQHCee zXK!{X9gj^5eV*%FeP$pAE&k^IeoK`Nzw`)Is#W3&!z3|c0j(s`-S}(H)@36sdu5mZ z%lej8G{Z#jsx$Hke|GWjDcK{?fW~I@L5aKV1xHw}+VJCDzu>-C>aK~fFQpT^lra;B z7H?5KL!FRPL0?nSA1iCFelZVVcdDIq_7pgqV?+U@q^+a`K$`rSRfa zNqVLlMfpenj4ajB0onU}C7uq-UK)ZUdyT7M_Z#i9u!iR74l60fvbpA8rIEtX+3um5 zf3U%PFa{~%D}~55m{x!D2Pz5Oh>e_I0MK>xiwOh*XzKk(@Z0sD};=l`Df`+K3UeH;Q*3R*#T-CKI6$7@nrtCrAlGkD9|F(gN2@{#bv_YGm|h3&~o zQV!=sQh6_fP&{%|6yi0!nf-&^;JvKSZhTk^}?Mew-o^3 z#<3y+Cq~13AkGBFs#IAh{y_E-PsJHKhXFvokzFch?2qjUW?504&z#*?be!S*g|MY| zznY8A6x`8@m`KW7-1m|E9V$jW&Z_nUdNxh4%BIL)#qLcjCfIT4&(oKN^GeM3$ho>Kcqjb%81whumBO+L9Bn4)P2ET&L&kUc{*>=7a zDyyrcg0PMMZWs)q4pn4Lr}2!q*JSRv&m|h61=9BJk|Do2a(5HFPJYc1Q-mRA*6)ITi#Q&7N(v`>BKX zGtB*w4v0QCOipfJHjBl&Rg03pnfQh(F>B8WR37ubxBsSG8Q1=wTxFlmn2A#%FH38N z&$Y5?1&_(FIdth7Rr-+HLty~3mg#*QkScO_&q}Ic>q6W6rG60SQr%&Ud9sok z2MKz1uEqsp%jefT z4&FF&7GH27P)9G|>-1Iibm>-x@c>mGMat(C$iye?hm7=syyBl@(!+wzl~_U|Qr&5W z$z9Z!_qF_Mqb zstvK2HtX9N@XaPb^MSxxq!a#XwcI)k;{vzEg=(ab$l~5EL@3upA%_R+f$Q^-)lb@YYt8AN{14h^q*cT~ z7Mn!r4BVbJgX_Xf8(iqgCm=fNPS^-#IVipTWO>Nf$gK^VPRJd61$+oP~0>dws zb_)jVXcR)0rRSI;T!h~ITeXBFQQ>fB`bc^VYJ|bB3=BUA*C-2BN=#fGj30dK>=_ou zS1q9VAN7kAoQVry_qrNeK-D~L%eQ*-*11CrvIxU|9A?|oBnqYKq$v4&6^y{R7x111 zHk}B}oN3hw*wH#Pl43JdM@h>E;w`eUD1VcO#69vCGrtLNN0 zcyqeL^a!NR2aO|8M^;fKZMKur`VfTMRCAkKHzHCUNv+3rT1r#XF(lwi2^oy zTc-A^nsby+f2MnP{|(T#VtfOyO&^M8JfGmu!Q|5n8rFvbqAAy#o- zt7lzO=h)Xa`SK|L-3uH%0g8#M)pO&oNv>l+CZjw5lqV9}MaPfafE5Ah;|dWJ<@-d+ zAe~sud?!7E2@%K?iC)q+7sq%=sI}EGh^yX1fq33b;wj8tF!sYj8XjKtEjB+X*4*4}Mqv)m@AzrCPKJ`Bnvq-JQfZ1ZmzH z*Jc*=Z@SeQ^#nC~hX|xweeE5>?QJjivRSB4iwG{EiVV`xl>wTizTWr+2DX~hXa2aR z%=?wb^FJheO0Qa(dsq1)w;ZPH*jZF7Vj#=J4mQ}^+uOx$590-pc)EiI?-gHf7=x5o zKr9EZP?!$P|1TYW6&?2}_U4`GuRluZaZB2&4F^O(FTZY$Kglgd8%v8B%MA-eWWfos z>_R=mP1U5t*7l2b48LEio1e&IH*GuM=8mq3B@~LxkRN6br6w1=ZbnN}%5)Rgm~1A~ z1HBk@h+<-gzsFr}_|*zX4j@_%#3H+;mn6$-47N2*gPjvtBIk<+m2;Zh%JH72&eOe5 zDeuS6jNm-z*U3)n@f?-|)b>hZd_SHurAFJUi6QQR1+ke&L@t4zar6Y7i z;|h-^VZ7$Omw&+U8nw(jI*7w1z>9BDHYc||mvZHhIL3A)nyj=4*au^5@h5Bo8g~?9 z3FE0OMi4Cz(ySt5y}7f+%R>u{t`j_Ssu%FoHNNv+gA8{Mr9c7Ae8s*R3bG0{YM`HN z5rw*Bqo--=k&yRHnd9keI*-^jD{&wrk#*&eXl&8iT&TckC4PjbOVI^z8F=6#{>z2# z>8?~r?BQwbhdlMrTL+1L{>b0C(zB3-VPcXN*WH&uo3TD2ZH6b^meqQjON``yQbhR> z(qS#&QXPvfD>4jO2(;NH<}#j=RQ*hO*I#e^w{3PgUFn;=d#irH#JnCv?(&aCp|wVB zCvR2>{7|gQZM^;u0yK}AxdM!lu4hAnoaH!3sNB(cw<+Bx?xs=z+22>-$KEUNi??$r z$XB0Yoq^mrcA!QSaGeCV2>F^UaGi?)@l~hj?zoUX@gjeqO667uWJp_e+&0N>cduMx z8Am~2Z2|7e*{C8-uEUTnw}S1Fps|z53tnb2K-7syV}ZuD>C`7dhT_2Cj|0JDkeJ=f zg=o|x>AxC77rZ}Hp?Lnaniy1RUS3{?D5=se4>Agog1cN=~|U{UPL+7^#I+e^&B#ebeWO zBRL(lb#|gR{nA1M=LG0wVdIukhuX}z9SKFbDKK~eLc{iK&=srWVvPBP9S)S{aLro1 zun*)%GqZjmJd8X-H6Y6izz}ErnvaDf+Nf5o&dZ#bP(4tV`!ybu?}{y^X;(!H9MvCU7|4om*1tYDzmxhvxa4bF{n+&DsL9@v1jSo ztNEU3i|)1ZI>a=PQ)wzSes%cz&DXl%^ZXN6MPs`+BInn%RMVFdoFm2Ei7hLN)uK-7 z6lq#SUk2+I?wiKY5+-MS{!^~)TYef9mO0w9oYbK=CkVZ~FT1Y!6)nc)h2W|LJm5hc zdlj8i9lpdQr{QZYShMf>{6fhbtnLEhFH23WUD9m2V7y4mTXLXcw+MZ$=}b@KjLGqs zAWfD21+Rs{-i|Ba#rq!9Nw@%xcU(1~PfXd6U&FUrpN1czQ>(XE3<8@AKJ*cYtR$gL z1fT+m{Dp zxd&d|cDkw&C)8Mj&#B9cSHQE2nx21(t!7%54mG_F z+@0ItadJ|MX!bg8!!H&VdZXa)X^BEKYBMl!xN?~s_BGIT99a|UW8XZsmvMAnNuA?q zns2ZFa&5oXNxF)p46NuClz;$GCw2XMBN;H}riS2$6{()`Tl4zQm`5Z++`H z+!t6Y+;5X7%iDtc)fgOMp_h@e#1+4ejiA8yYTr6 zbEWgP7LG}l+&4U-?@7S!v~wQn!Zw4>rbAu9IVJR6No$_=i`oIa#UeI+_^+0Wl^0mF zCDq6Xfiom893wj2YpgDCl97zS)n=}4Hh*rqUD!AC-NdxsaR?fZAMf2tkRuWL5g<<} z2~;cynz@?DoT%f>4?L)!$j~BpvE|@*pzq&t1ZcgEYjY>aioRHSl)b9VT>Q}gg#TDy zw9@zyX+w$Zkc^GIxy(G{H`zGk-={q$*{sJ_OR-l$GclY4JYLNxV~Xhx!2qegf4ziF z(V!JF)?!eHf3|nbjkKPS$(3Au^oYJNSd{Ejca9YM(<6S)am+#5n{si(mQj`xbmywX zn<{pU>u7$wHY@U_f!+=&2tM56@Wi0n^Jf^r0KT-MLxdxVWTFgq-n`~O?`bsBpuAXh zTM5p(cfm44I2PZD7%#?M-m1moT%VZnx#aWNh2OBfgq+{PqHGF2?3IYk0hurUHE0`q z?iR?VZkMvIsVkHOB2Vn*1}?q*Fr)XFc}A3frCX?xMYIzMP%}}tR5|Ldn{Iu4Tcawt zXA(oDjq*y+7Cs}X6V zcCO)#BlY{bOyF4motXM(p8qtw{@;14c#GqjQixAlP*%_&x104lKOiC^;vm0|ZB&`M zHrUw1O*$YFDnhFECh+>tbyzZ8r1vDo*adsXF5UceS^w~P`+ScEqy~SN9x+ElGw&4` zeT_Cr)05eRg@i;geo?H8c4=!jVHG|t%(YqaVTXLY^}uWzC@Rs@b)ajDnDAtL&VH=q zJcAfqvDHIJdlc#`6J z!9quBnZT!NrJL(J-UzL5=hHjCtv%%SBu7g=_J-e%YaqXqS`rv23wfV6b5fZ>s_)|_ zS=`nGdNu;szaDUENk*H9q@*9i#;1mNNA}UN+ePWiW2;I@yQ4d|!sXLraE3^XaqbdN zV@hzsN`GlX$WWn|%T08o_e8<2E_jO0qrZ0mCI+?y4-7uGy z7_=Wra{#|qGEfww0}ti#7N`#lU48u_!fiowkE%c!I)Koa{UPxN@LJcj0$T=>efQ)V;cwg=5J?;?P|`q z5yMy8o4V{`b=M;wN01|H@B9S!&ul-U(HRM<3OmZe zcDpLFjes)~RO%Ph=zWdCyHYf(KWebuN#9j4W08)QM0Pjz;iusZ+^c%ib6G;X3xj3W zN@D@$U1BpHFa7~oZ~A(+TW-~Wv1>HxNDTv)HfgmT14Y|=pG_PdfEtaiEgS5r+Sae@3{kdNBxm4AHJxnx*tIj8p4Ye{a=)aCmocSXhHUXd&cxnwAv`9S`$C%7bU7NEcS;y-ofAlS&C~v8VS-pfB7OuoA&4 zb4%IZ+hX<^GS>?Y=HT(yA~d1MB*yty-?o=LI}0lG&YZ1swJUgV*aqDk4}QPjRpA(H z-dz%+^qBu5wJ1w3W_POAyI!HX2)O^0zNnRG(I&T%$nj;0dMKvee8*WVx9#{4| zbrTWgmW@zdiP;}b^VVUD41Oo(qB4sxT<$mi4bzhpJ~5Z-t;YPm>-CG)jF#bORnAr- z&>h?f{<|wy;pc0E?Txv)!qM#Mhi<-ZZAa*91VquE={#;zV)wfAjXP(c(Be1&r>QT` z3VqLxAqx(U5neEiJg%<0>#|Jkq3C1=zq){}aef1GR=FunKl`+PGxLkYlAy@gJ1Fhv zDO=Cay0mU6ol$y3DJVSlTD+2vy|PQ(ZjF$YpS~em8!JJNuV^)_cBl?7xkYBiY^NRF zenr}74RSw$EO^~~_e=mJ4&=>aR?eC`7WYCf8UeLyeT;UhB!|knJ z|KM6guW>x|^EBfyZRN@KJ=7bhyvvIg3R-cxfuffAeS0IKHL9D^0-y}2q=qwu9 zANhIa^P~0M5&&Os2hTBBFjtLk$+WB~?)Y}xlTzL!@8jFHjQulF>^`LR-@d~ni@5EwR zBit9!d_rI%o@xwzFEO&Iw7_K>1k|n67T(_}aZyFOA#7E+#S*ABWvpwdV}WTSfm@vy z@d|svs8Dd8AjL#m97E91C`ey}?+R1i9k#%Yp0m!s$DJmNP-`$83!UXG&^`5M zEu`!Fl>vuMKRvb)l3cBI$z^tHrRBDB@7{)$l)Cu^?)VX{?W@0{r$=7Z=(l6+uo-A?M%)= zc!MgwKxJAP+#!EA7F-c711)~I@|=Bj2`s4Bmu2S{8Vf5gzPWv3{J?oaDY}#ryv)>| zd+o**+nS)Lx)s&id=a$cb9rj^6~#4iByGJ@C7E;y{LO)+v+yJDHhsUo9|u3|h5B!E zSIX7c5&MuK8*MLcn)a)w=0xeu0dOmljE%)jOMi9bMoJ~p!7a*(8`O`Ny&keL`P{j| zL1KhTUXScJJpkFun%#3LVDa?iO2*-&qUN&EeSZ+5Ubcj1^&;#oVcV-!^+-RqJh=8< zczX89ZhU%DOvs(9Z)$STTTL@x-SB_fTu(R(&3ez{x9es+d~jeJHa*Ft_STLZY;(G` zzi+`%WIu~HbWsX8)+&hSOZl)vdZ;l<5`W&7&f~AAUWK_)gaeDc2?P!!> z{2>?n{BJnR=L)A1 zWc*GUX2?$_#O@%*u_mx0=l=qBPIphIXS9tVb=~uayk9Dz)Wg05AeDtNI+9%;-m77|5M75Nx|UA2<`KLCW0JItXJNatpnss0b1^bvN{- z+;p!RSd%letXkH_GuNP5ps}jr1t5(I;V6fplEE^8Ag&wJT!HUCE=63|?Zqi*6O15V zMSXRF)Un_5RO}#n>*XF3Sy^pV?-%GF=82)%l#j6fj59 zs}8q$jQs;v)dE()_#-dR>(8l;{8J38a1dz=1XFkYb{qFa&Vp5u|8fKW!@8?Kr>w@` zcLBQjL(iVNlMfRI{tpFPJzWM9Ri1-qP;+i3CMIOW=@kbkAZD~*6`0>TB;nzNcJO-*nO}K;oR^tkd{&jP&mr*)=bZNdUyHF5_ zRip%p-^^Y`vQ-T~Z@EJWx8eAOspnrmN4P%P96i`+pP@q4^GOV?&s;%C6?v@CMW|8 zwsdY7Fr>wf{g4lOt-<%>Ichm9PJ@qUXF0K)Z!URSO;L7pb0?2v++;Ovbc_|E9(If+ zY5v*n0CvR>OY1tS4Wr9SPlo7RbEUdEIk7O`r7*@(wzyeu_ghHRzg zcTT568V^1b#Y`}wZ>HwQZ~}m}!cRa92~v#--W?kE-z(l0`mWkOtEw+0-k_oZ23L)B JO0PIQ{9h+IY_k9W literal 11082 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 Date: Sat, 17 Aug 2024 14:21:30 -0400 Subject: [PATCH 022/162] speed potions --- beestation.dme | 10 +- .../signals/signals_mob/signals_silicon.dm | 4 + .../dcs/signals/signals_obj/signals_mod.dm | 4 + code/datums/components/storage/storage.dm | 6 +- code/game/objects/items.dm | 4 + code/modules/mod/mod_activation.dm | 6 +- code/modules/mod/mod_ai.dm | 16 +- code/modules/mod/mod_control.dm | 33 +- code/modules/mod/modules/modules.dm | 1782 ----------------- code/modules/mod/modules/modules_antag.dm | 212 ++ .../mod/modules/modules_engineering.dm | 209 ++ code/modules/mod/modules/modules_general.dm | 654 ++++++ code/modules/mod/modules/modules_medical.dm | 203 ++ code/modules/mod/modules/modules_science.dm | 162 ++ code/modules/mod/modules/modules_security.dm | 125 ++ code/modules/mod/modules/modules_service.dm | 58 + code/modules/mod/modules/modules_supply.dm | 169 ++ code/modules/mod/modules/modules_visor.dm | 99 + code/modules/paperwork/handlabeler.dm | 3 + .../designs/mechfabricator_designs.dm | 3 +- .../research/xenobiology/xenobiology.dm | 13 +- 21 files changed, 1973 insertions(+), 1802 deletions(-) delete mode 100644 code/modules/mod/modules/modules.dm create mode 100644 code/modules/mod/modules/modules_antag.dm create mode 100644 code/modules/mod/modules/modules_engineering.dm create mode 100644 code/modules/mod/modules/modules_general.dm create mode 100644 code/modules/mod/modules/modules_medical.dm create mode 100644 code/modules/mod/modules/modules_science.dm create mode 100644 code/modules/mod/modules/modules_security.dm create mode 100644 code/modules/mod/modules/modules_service.dm create mode 100644 code/modules/mod/modules/modules_supply.dm create mode 100644 code/modules/mod/modules/modules_visor.dm diff --git a/beestation.dme b/beestation.dme index 25878455122f9..a7edf72202025 100644 --- a/beestation.dme +++ b/beestation.dme @@ -3312,7 +3312,15 @@ #include "code\modules\mod\mod_types.dm" #include "code\modules\mod\mod_ui.dm" #include "code\modules\mod\modules\_module.dm" -#include "code\modules\mod\modules\modules.dm" +#include "code\modules\mod\modules\modules_antag.dm" +#include "code\modules\mod\modules\modules_engineering.dm" +#include "code\modules\mod\modules\modules_general.dm" +#include "code\modules\mod\modules\modules_medical.dm" +#include "code\modules\mod\modules\modules_science.dm" +#include "code\modules\mod\modules\modules_security.dm" +#include "code\modules\mod\modules\modules_service.dm" +#include "code\modules\mod\modules\modules_supply.dm" +#include "code\modules\mod\modules\modules_visor.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\_modular_computer_shared.dm" #include "code\modules\modular_computers\computers\item\computer.dm" diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_silicon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_silicon.dm index f43fce7993f28..3255a2d8187e1 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_silicon.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_silicon.dm @@ -7,3 +7,7 @@ ///from base of /obj/item/mmi/set_brainmob(): (mob/living/brain/new_brainmob) #define COMSIG_MMI_SET_BRAINMOB "mmi_set_brainmob" + +/// from base of /obj/item/slimepotion/speed/afterattack(): (obj/target, /obj/src, mob/user) +#define COMSIG_SPEED_POTION_APPLIED "speed_potion" + #define SPEED_POTION_SUCCESSFUL (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm index 4c8ec4d6dedf9..73031b3035f8c 100644 --- a/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_obj/signals_mod.dm @@ -5,3 +5,7 @@ #define COMSIG_MOD_ACTIVATE "mod_activate" /// Cancels the suit's activation #define MOD_CANCEL_ACTIVATE (1 << 0) +/// Called when a MOD is having modules removed from crowbar_act(mob/user, obj/crowbar) +#define COMSIG_MOD_MODULE_REMOVAL "mod_module_removal" + /// Cancels the removal of modules + #define MOD_CANCEL_REMOVAL (1 << 0) diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index de226861f9839..a58b47a3195dc 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -523,10 +523,8 @@ /datum/component/storage/proc/attackby(datum/source, obj/item/I, mob/M, params) SIGNAL_HANDLER - if(istype(I, /obj/item/hand_labeler)) - var/obj/item/hand_labeler/labeler = I - if(labeler.mode) - return FALSE + if(!I.attackby_storage_insert(src, parent, M)) + return FALSE . = TRUE //no afterattack if(iscyborg(M)) return diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 239e1ed6aca4f..393a42906086f 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1402,6 +1402,10 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) /obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) return +/// Whether or not this item can be put into a storage item through attackby +/obj/item/proc/attackby_storage_insert(datum/component/storage, atom/storage_holder, mob/user) + return TRUE + /** * * Overridden to generate icons for monkey clothing */ diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 363fa45a506c4..e60b73ae7d8f5 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -51,7 +51,7 @@ ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) if(!user) return TRUE - wearer.visible_message("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss.", + wearer.visible_message("[wearer]'s [piece.name] deploy[piece.p_s()] with a mechanical hiss.", "[piece] deploy[piece.p_s()] with a mechanical hiss.", "You hear a mechanical hiss.") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) @@ -59,7 +59,7 @@ else if(piece.loc != src) if(!user) return FALSE - balloon_alert(user, "[piece] already deployed!") + balloon_alert(user, "[piece.name] already deployed!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) else if(!user) @@ -79,7 +79,7 @@ boots.show_overslot() if(!user) return - wearer.visible_message("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss.", + wearer.visible_message("[wearer.name]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss.", "[piece] retract[piece.p_s()] back into [src] with a mechanical hiss.", "You hear a mechanical hiss.") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index dc8b1ef97e4b3..edd266fd7a133 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -70,16 +70,18 @@ if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) return FALSE var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? sqrt(2) : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) - COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) - playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) + if(wearer && !wearer.Process_Spacemove(direction)) + return FALSE + else if(!wearer && (!has_gravity() || !isturf(loc))) + return FALSE + COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown_active) cell.charge = max(0, cell.charge - CELL_PER_STEP) - if(wearer) - ADD_TRAIT(wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) - addtimer(CALLBACK(src, PROC_REF(ai_fall)), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) + playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) if(ismovable(wearer?.loc)) return wearer.loc.relaymove(wearer, direction) - if(wearer && !wearer.Process_Spacemove(direction)) - return FALSE + else if(wearer) + ADD_TRAIT(wearer, TRAIT_FORCED_STANDING, MOD_TRAIT) + addtimer(CALLBACK(src, .proc/ai_fall), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) var/atom/movable/mover = wearer || src return step(mover, direction) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 502bac7ec88b9..1d9f5a05c0208 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -14,7 +14,7 @@ w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS - slowdown = 2 + slowdown = 1.25 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, BLEED = 10) actions_types = list( /datum/action/item_action/mod/deploy, @@ -59,9 +59,9 @@ /// Power usage of the MOD. var/cell_drain = DEFAULT_CELL_DRAIN /// Slowdown of the MOD when not active. - var/slowdown_inactive = 2 + var/slowdown_inactive = 1.25 /// Slowdown of the MOD when active. - var/slowdown_active = 1 + var/slowdown_active = 0.75 /// MOD cell. var/obj/item/stock_parts/cell/cell /// MOD helmet. @@ -137,6 +137,7 @@ module = new module(src) install(module) RegisterSignal(src, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) + RegisterSignal(src, COMSIG_SPEED_POTION_APPLIED, .proc/on_potion) movedelay = CONFIG_GET(number/movedelay/run_delay) /obj/item/mod/control/Destroy() @@ -200,6 +201,7 @@ . += "You could use modules on it to install them." . += "You could remove modules with a crowbar." . += "You could update the access with an ID." + . += "You could access the wire panel with a wire configuring tool." if(cell) . += "You could remove the cell with an empty hand." else @@ -292,6 +294,9 @@ balloon_alert(user, "deactivate suit first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE + if(SEND_SIGNAL(src, COMSIG_MOD_MODULE_REMOVAL, user) & MOD_CANCEL_REMOVAL) + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE balloon_alert(user, "[open ? "closing" : "opening"] cover...") screwdriver.play_tool_sound(src, 100) if(screwdriver.use_tool(src, user, 1 SECONDS)) @@ -407,6 +412,8 @@ if(active && !toggle_activate(stripper, force_deactivate = TRUE)) return for(var/obj/item/part in mod_parts) + if(part.loc == src) + continue conceal(null, part) return ..() @@ -622,3 +629,23 @@ return cell.give(amount) update_cell_alert() + +/obj/item/mod/control/proc/on_potion(atom/movable/source, obj/item/slimepotion/speed/speed_potion, mob/living/user) + SIGNAL_HANDLER + + if(slowdown_inactive <= 0) + to_chat(user, "[src] has already been coated with red, that's as fast as it'll go!") + return + if(wearer) + to_chat(user, "It's too dangerous to smear [speed_potion] on [src] while it's on someone!") + return + to_chat(user, "You slather the red gunk over [src], making it faster.") + var/list/all_parts = mod_parts.Copy() + src + for(var/obj/item/part as anything in all_parts) + part.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) + part.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) + slowdown_inactive = 0 + slowdown_active = 0 + slowdown = 0 + qdel(speed_potion) + return SPEED_POTION_SUCCESSFUL diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm deleted file mode 100644 index 8869266863691..0000000000000 --- a/code/modules/mod/modules/modules.dm +++ /dev/null @@ -1,1782 +0,0 @@ -/obj/item/mod/module/storage - name = "MOD storage module" - desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \ - the surface of the suit, useful for storing various bits, and or bobs." - icon_state = "storage" - complexity = 3 - incompatible_modules = list(/obj/item/mod/module/storage) - var/datum/component/storage/concrete/storage - var/max_w_class = WEIGHT_CLASS_NORMAL - var/max_combined_w_class = 15 - var/max_items = 7 - -/obj/item/mod/module/storage/Initialize(mapload) - . = ..() - storage = AddComponent(/datum/component/storage/concrete) - storage.max_w_class = max_w_class - storage.max_combined_w_class = max_combined_w_class - storage.max_items = max_items - storage.allow_big_nesting = TRUE - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) - -/obj/item/mod/module/storage/on_install() - var/datum/component/storage/modstorage = mod.AddComponent(/datum/component/storage, storage) - modstorage.max_w_class = max_w_class - modstorage.max_combined_w_class = max_combined_w_class - modstorage.max_items = max_items - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) - -/obj/item/mod/module/storage/on_uninstall() - var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage) - storage.slaves -= modstorage - qdel(modstorage) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) - -/obj/item/mod/module/storage/large_capacity - name = "MOD expanded storage module" - desc = "Reverse engineered by Nakamura Engineering from Donk Corporation designs, this system of hidden compartments \ - is entirely within the suit, distributing items and weight evenly to ensure a comfortable experience for the user; \ - whether smuggling, or simply hauling." - icon_state = "storage_large" - max_combined_w_class = 21 - max_items = 14 - -/obj/item/mod/module/storage/syndicate - name = "MOD syndicate storage module" - desc = "A storage system using nanotechnology developed by Cybersun Industries, these compartments use \ - esoteric technology to compress the physical matter of items put inside of them, \ - essentially shrinking items for much easier and more portable storage." - icon_state = "storage_syndi" - max_combined_w_class = 30 - max_items = 21 - -/obj/item/mod/module/storage/bluespace - name = "MOD bluespace storage module" - desc = "A storage system developed by Nanotrasen, these compartments employ \ - miniaturized bluespace pockets for the ultimate in storage technology; regardless of the weight of objects put inside." - icon_state = "storage_large" - max_w_class = WEIGHT_CLASS_GIGANTIC - max_combined_w_class = 60 - max_items = 21 - -/obj/item/mod/module/visor - name = "MOD visor module" - desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." - module_type = MODULE_TOGGLE - complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN*0.3 - incompatible_modules = list(/obj/item/mod/module/visor) - cooldown_time = 0.5 SECONDS - var/hud_type - var/list/visor_traits = list() - -/obj/item/mod/module/visor/on_activation() - . = ..() - if(!.) - return - if(hud_type) - var/datum/atom_hud/hud = GLOB.huds[hud_type] - hud.add_hud_to(mod.wearer) - for(var/trait in visor_traits) - ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) - mod.wearer.update_sight() - -/obj/item/mod/module/visor/on_deactivation() - . = ..() - if(!.) - return - if(hud_type) - var/datum/atom_hud/hud = GLOB.huds[hud_type] - hud.remove_hud_from(mod.wearer) - for(var/trait in visor_traits) - REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT) - mod.wearer.update_sight() - -/obj/item/mod/module/visor/medhud - name = "MOD medical visor module" - desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \ - biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \ - access data such as patient files in a convenient readout. They say these also let you see behind you." - icon_state = "medhud_visor" - hud_type = DATA_HUD_MEDICAL_ADVANCED - visor_traits = list(TRAIT_MEDICAL_HUD) - -/obj/item/mod/module/visor/diaghud - name = "MOD diagnostic visor module" - desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \ - from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \ - and integrity of such. They say these also let you see behind you." - icon_state = "diaghud_visor" - hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED - visor_traits = list(TRAIT_DIAGNOSTIC_HUD) - -/obj/item/mod/module/visor/sechud - name = "MOD security visor module" - desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \ - plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \ - and generally know who to shoot. They say these also let you see behind you." - icon_state = "sechud_visor" - hud_type = DATA_HUD_SECURITY_ADVANCED - visor_traits = list(TRAIT_SECURITY_HUD) - -/obj/item/mod/module/visor/meson - name = "MOD meson visor module" - desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \ - technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \ - through walls, regardless of lighting conditions. They say these also let you see behind you." - icon_state = "meson_visor" - visor_traits = list(TRAIT_MESON_VISION, TRAIT_MADNESS_IMMUNE) - -/obj/item/mod/module/visor/thermal - name = "MOD thermal visor module" - desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \ - the thermal radiation output of objects near the user. While it can detect the heat output of even something as \ - small as a rodent, it still produces irritating red overlay. They say these also let you see behind you." - icon_state = "thermal_visor" - visor_traits = list(TRAIT_THERMAL_VISION) - -/obj/item/mod/module/visor/night - name = "MOD night visor module" - desc = "A heads-up display installed into the visor of the suit. Typical for both civilian and military applications, \ - this allows the user to perceive their surroundings while in complete darkness, enhancing the view by tenfold; \ - yet brightening everything into a spooky green glow. They say these also let you see behind you." - icon_state = "night_visor" - visor_traits = list(TRAIT_TRUE_NIGHT_VISION) - -/obj/item/mod/module/welding - name = "MOD welding protection module" - desc = "A module installed into the visor of the suit, this projects a \ - polarized, holographic overlay in front of the user's eyes. It's rated high enough for \ - immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights." - icon_state = "welding" - complexity = 1 - incompatible_modules = list(/obj/item/mod/module/welding) - overlay_state_inactive = "module_welding" - -/obj/item/mod/module/welding/on_suit_activation() - mod.helmet.flash_protect = FLASH_PROTECTION_WELDER - -/obj/item/mod/module/welding/on_suit_deactivation() - mod.helmet.flash_protect = initial(mod.helmet.flash_protect) - -/obj/item/mod/module/t_ray - name = "MOD t-ray scan module" - desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \ - to essentially echolocate things beneath the floor, mostly cables and pipes. \ - A staple of atmospherics work, and counter-smuggling work." - icon_state = "tray" - module_type = MODULE_TOGGLE - complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN * 0.2 - incompatible_modules = list(/obj/item/mod/module/t_ray) - cooldown_time = 0.5 SECONDS - var/range = 2 - -/obj/item/mod/module/t_ray/on_active_process(delta_time) - t_ray_scan(mod.wearer, 8, range) - -#define HEALTH_SCAN "Health" -//#define WOUND_SCAN "Wound" -#define CHEM_SCAN "Chemical" - -/obj/item/mod/module/health_analyzer - name = "MOD health analyzer module" - desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \ - allowing the user indepth information on the vitals and injuries of others even at a distance, \ - all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \ - but it's up to you to do something with it." - icon_state = "health" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/health_analyzer) - cooldown_time = 0.5 SECONDS - var/mode = HEALTH_SCAN - var/static/list/modes = list(HEALTH_SCAN, CHEM_SCAN) - -/obj/item/mod/module/health_analyzer/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!isliving(target)) - return - switch(mode) - if(HEALTH_SCAN) - healthscan(mod.wearer, target) - //if(WOUND_SCAN) - // woundscan(mod.wearer, target) - if(CHEM_SCAN) - chemscan(mod.wearer, target) - drain_power(use_power_cost) - -/obj/item/mod/module/health_analyzer/get_configuration() - . = ..() - .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) - -/obj/item/mod/module/health_analyzer/configure_edit(key, value) - switch(key) - if("mode") - mode = value - -#undef HEALTH_SCAN -#undef CHEM_SCAN - -/obj/item/mod/module/stealth - name = "MOD prototype cloaking module" - desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \ - to bend light around the user, as well as mimetic materials to make the surface of the suit match the \ - surroundings based off sensor data. For some reason, this tech is rarely seen." - icon_state = "cloak" - module_type = MODULE_TOGGLE - complexity = 4 - active_power_cost = DEFAULT_CELL_DRAIN * 2 - use_power_cost = DEFAULT_CELL_DRAIN * 10 - incompatible_modules = list(/obj/item/mod/module/stealth) - cooldown_time = 5 SECONDS - var/bumpoff = TRUE - var/stealth_alpha = 50 - -/obj/item/mod/module/stealth/on_activation() - . = ..() - if(!.) - return - if(bumpoff) - RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, PROC_REF(unstealth)) - RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, PROC_REF(on_unarmed_attack)) - RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, PROC_REF(on_bullet_act)) - RegisterSignals(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), PROC_REF(unstealth)) - animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) - drain_power(use_power_cost) - -/obj/item/mod/module/stealth/on_deactivation() - . = ..() - if(!.) - return - if(bumpoff) - UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) - UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) - animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) - -/obj/item/mod/module/stealth/proc/unstealth(datum/source) - SIGNAL_HANDLER - - to_chat(mod.wearer, "[src] gets discharged from contact!") - do_sparks(2, TRUE, src) - drain_power(use_power_cost) - on_deactivation() - -/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) - SIGNAL_HANDLER - - if(!isliving(target)) - return - unstealth(source) - -/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/projectile/projectile) - SIGNAL_HANDLER - - if(projectile.nodamage) - return - unstealth(source) - -/obj/item/mod/module/stealth/ninja - name = "MOD advanced cloaking module" - desc = "The latest in stealth technology, this module is a definite upgrade over previous versions. \ - The field has been tuned to be even more responsive and fast-acting, with enough stability to \ - continue operation of the field even if the user bumps into others. \ - The draw on the power cell has been reduced drastically, \ - making this perfect for activities like standing near sentry turrets for extended periods of time." - icon_state = "cloak_ninja" - bumpoff = FALSE - stealth_alpha = 20 - active_power_cost = DEFAULT_CELL_DRAIN - use_power_cost = DEFAULT_CELL_DRAIN * 5 - cooldown_time = 3 SECONDS - -/obj/item/mod/module/jetpack - name = "MOD ion jetpack module" - desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \ - Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \ - charge from the suit's cell. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits." - icon_state = "jetpack" - module_type = MODULE_TOGGLE - complexity = 3 - active_power_cost = DEFAULT_CELL_DRAIN * 0.5 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/jetpack) - cooldown_time = 0.5 SECONDS - overlay_state_inactive = "module_jetpack" - overlay_state_active = "module_jetpack_on" - var/stabilizers = FALSE - var/full_speed = FALSE - var/datum/effect_system/trail_follow/ion/ion_trail - -/obj/item/mod/module/jetpack/Initialize(mapload) - . = ..() - ion_trail = new - ion_trail.auto_process = FALSE - ion_trail.set_up(src) - -/obj/item/mod/module/jetpack/Destroy() - QDEL_NULL(ion_trail) - return ..() - -/obj/item/mod/module/jetpack/on_activation() - . = ..() - if(!.) - return - ion_trail.start() - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(move_react)) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, PROC_REF(pre_move_react)) - RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, PROC_REF(spacemove_react)) - if(full_speed) - mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) - -/obj/item/mod/module/jetpack/on_deactivation(mob/user) - . = ..() - if(!.) - return - ion_trail.stop() - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE) - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE) - if(full_speed) - mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) - -/obj/item/mod/module/jetpack/get_configuration() - . = ..() - .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers) - -/obj/item/mod/module/jetpack/configure_edit(key, value) - switch(key) - if("stabilizers") - stabilizers = text2num(value) - -/obj/item/mod/module/jetpack/proc/move_react(mob/user) - SIGNAL_HANDLER - - if(!active)//If jet dont work, it dont work - return - if(!isturf(mod.wearer.loc))//You can't use jet in nowhere or from mecha/closet - return - if(!(mod.wearer.movement_type & FLOATING) || mod.wearer.buckled)//You don't want use jet in gravity or while buckled. - return - if(mod.wearer.pulledby)//You don't must use jet if someone pull you - return - if(mod.wearer.throwing)//You don't must use jet if you thrown - return - if(user.client && length(user.client.keys_held))//You use jet when press keys. yes. - allow_thrust() - -/obj/item/mod/module/jetpack/proc/pre_move_react(mob/user) - SIGNAL_HANDLER - - ion_trail.oldposition = get_turf(src) - -/obj/item/mod/module/jetpack/proc/spacemove_react(mob/user, movement_dir) - SIGNAL_HANDLER - - if(active && (stabilizers || movement_dir)) - return COMSIG_MOVABLE_STOP_SPACEMOVE - -/obj/item/mod/module/jetpack/proc/allow_thrust() - if(!drain_power(use_power_cost)) - return - ion_trail.generate_effect() - return TRUE - -/obj/item/mod/module/magboot - name = "MOD magnetic stability module" - desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \ - excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \ - However, these basic models do not feature computerized systems to automatically toggle them on and off, \ - so numerous users report a certain stickiness to their steps." - icon_state = "magnet" - module_type = MODULE_TOGGLE - complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/magboot) - cooldown_time = 0.5 SECONDS - var/slowdown_active = 0.5 - -/obj/item/mod/module/magboot/on_activation() - . = ..() - if(!.) - return - ADD_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) - mod.slowdown += slowdown_active - mod.wearer.update_gravity(mod.wearer.has_gravity()) - mod.wearer.update_equipment_speed_mods() - -/obj/item/mod/module/magboot/on_deactivation() - . = ..() - if(!.) - return - REMOVE_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) - mod.slowdown -= slowdown_active - mod.wearer.update_gravity(mod.wearer.has_gravity()) - mod.wearer.update_equipment_speed_mods() - -/obj/item/mod/module/magboot/advanced - name = "MOD advanced magnetic stability module" - removable = FALSE - complexity = 0 - slowdown_active = 0 - -/obj/item/mod/module/holster - name = "MOD holster module" - desc = "Based off typical storage compartments, this system allows the suit to holster a \ - standard firearm across its surface and allow for extremely quick retrieval. \ - While some users prefer the chest, others the forearm for quick deployment, \ - some law enforcement prefer the holster to extend from the thigh." - icon_state = "holster" - module_type = MODULE_USABLE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/holster) - cooldown_time = 0.5 SECONDS - var/obj/item/gun/holstered - -/obj/item/mod/module/holster/on_use() - . = ..() - if(!.) - return - if(!holstered) - var/obj/item/gun/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "nothing to holster!") - return - if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, FALSE, FALSE)) - holstered = holding - balloon_alert(mod.wearer, "weapon holstered") - playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) - drain_power(use_power_cost) - else if(mod.wearer.put_in_active_hand(holstered, FALSE, TRUE)) - balloon_alert(mod.wearer, "weapon drawn") - holstered = null - playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) - drain_power(use_power_cost) - else - balloon_alert(mod.wearer, "holster full!") - -/obj/item/mod/module/holster/on_uninstall() - if(holstered) - holstered.forceMove(drop_location()) - holstered = null - -/obj/item/mod/module/holster/Destroy() - QDEL_NULL(holstered) - return ..() - -/obj/item/mod/module/tether - name = "MOD emergency tether module" - desc = "A custom-built grappling-hook powered by a winch capable of hauling the user. \ - While some older models of cargo-oriented grapples have capacities of a few tons, \ - these are only capable of working in zero-gravity environments, a blessing to some Engineers." - icon_state = "tether" - module_type = MODULE_ACTIVE - complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/tether) - cooldown_time = 1.5 SECONDS - -/obj/item/mod/module/tether/on_use() - if(mod.wearer.has_gravity(get_turf(src))) - balloon_alert(mod.wearer, "too much gravity!") - playsound(src, 'sound/weapons/gun_dry_fire.ogg', 25, TRUE) - return FALSE - return ..() - -/obj/item/mod/module/tether/on_select_use(atom/target) - . = ..() - if(!.) - return - var/obj/projectile/tether = new /obj/projectile/tether(mod.wearer.loc) - tether.preparePixelProjectile(target, mod.wearer) - tether.firer = mod.wearer - INVOKE_ASYNC(tether, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) - -/obj/projectile/tether - name = "tether" - icon_state = "tether_projectile" - icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' - pass_flags = PASSTABLE - damage = 0 - nodamage = TRUE - range = 10 - hitsound = 'sound/weapons/batonextend.ogg' - hitsound_wall = 'sound/weapons/batonextend.ogg' - suppressed = SUPPRESSED_VERY - hit_threshhold = LATTICE_LAYER - var/line - -/obj/projectile/tether/fire(setAngle) - if(firer) - line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi') - ..() - -/obj/projectile/tether/on_hit(atom/target) - . = ..() - if(firer) - firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE) - -/obj/projectile/tether/Destroy() - QDEL_NULL(line) - return ..() - -/obj/item/mod/module/mouthhole - name = "MOD eating apparatus module" - desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \ - to allow eating and drinking while retaining protection and atmosphere. \ - However, it will do nothing to improve the taste of a goliath steak." - icon_state = "apparatus" - complexity = 1 - incompatible_modules = list(/obj/item/mod/module/mouthhole) - overlay_state_inactive = "module_apparatus" - var/former_flags = NONE - var/former_visor_flags = NONE - -/obj/item/mod/module/mouthhole/on_install() - former_flags = mod.helmet.flags_cover - former_visor_flags = mod.helmet.visor_flags_cover - mod.helmet.flags_cover &= ~HEADCOVERSMOUTH - mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH - -/obj/item/mod/module/mouthhole/on_uninstall() - if(!(former_flags & HEADCOVERSMOUTH)) - mod.helmet.flags_cover |= HEADCOVERSMOUTH - if(!(former_visor_flags & HEADCOVERSMOUTH)) - mod.helmet.visor_flags_cover |= HEADCOVERSMOUTH - -/* -/obj/item/mod/module/rad_protection - name = "MOD radiation protection module" - desc = "A module utilizing polymers and reflective shielding to protect the user against ionizing radiation; \ - a common danger in space. This comes with software to notify the wearer that they're even in a radioactive area, \ - giving a voice to an otherwise silent killer." - icon_state = "radshield" - complexity = 2 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/rad_protection) - tgui_id = "rad_counter" - var/perceived_threat_level - -/obj/item/mod/module/rad_protection/on_suit_activation() - AddComponent(/datum/component/geiger_sound) - ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) - RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, PROC_REF(on_pre_potential_irradiation)) - for(var/obj/item/part in mod.mod_parts) - ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) - -/obj/item/mod/module/rad_protection/on_suit_deactivation() - qdel(GetComponent(/datum/component/geiger_sound)) - REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) - UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION) - for(var/obj/item/part in mod.mod_parts) - REMOVE_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) - -/obj/item/mod/module/rad_protection/add_ui_data() - . = ..() - .["userradiated"] = mod.wearer ? HAS_TRAIT(mod.wearer, TRAIT_IRRADIATED) : 0 - .["usertoxins"] = mod.wearer ? mod.wearer.getToxLoss() : 0 - .["threatlevel"] = perceived_threat_level - -/obj/item/mod/module/rad_protection/proc/on_pre_potential_irradiation(datum/source, datum/radiation_pulse_information/pulse_information, insulation_to_target) - SIGNAL_HANDLER - - perceived_threat_level = get_perceived_radiation_danger(pulse_information, insulation_to_target) - addtimer(VARSET_CALLBACK(src, perceived_threat_level, null), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE) -*/ - -/obj/item/mod/module/emp_shield - name = "MOD EMP shield module" - desc = "A field inhibitor installed into the suit, protecting it against feedback such as \ - electromagnetic pulses that would otherwise damage the electronic systems of the suit or devices on the wearer. \ - However, it will take from the suit's power to do so. Luckily, your PDA already has one of these." - icon_state = "empshield" - complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/emp_shield) - -/obj/item/mod/module/emp_shield/on_install() - mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) - -/obj/item/mod/module/emp_shield/on_uninstall() - mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) - -/obj/item/mod/module/flashlight - name = "MOD flashlight module" - desc = "A simple pair of flashlights installed on the left and right sides of the helmet, \ - useful for providing light in a variety of ranges and colors. \ - Some survivalists prefer the color green for their illumination, for reasons unknown." - icon_state = "flashlight" - module_type = MODULE_TOGGLE - complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/flashlight) - cooldown_time = 0.5 SECONDS - overlay_state_inactive = "module_light" - light_system = MOVABLE_LIGHT - light_color = COLOR_WHITE - light_range = 3 - light_power = 1 - light_on = FALSE - var/base_power = DEFAULT_CELL_DRAIN * 0.1 - var/min_range = 2 - var/max_range = 5 - -/obj/item/mod/module/flashlight/on_activation() - . = ..() - if(!.) - return - set_light_flags(light_flags | LIGHT_ATTACHED) - set_light_on(active) - active_power_cost = base_power * light_range - -/obj/item/mod/module/flashlight/on_deactivation() - . = ..() - if(!.) - return - set_light_flags(light_flags & ~LIGHT_ATTACHED) - set_light_on(active) - -/obj/item/mod/module/flashlight/on_process(delta_time) - . = ..() - if(!.) - return - active_power_cost = base_power * light_range - -/obj/item/mod/module/flashlight/generate_worn_overlay(mutable_appearance/standing) - . = ..() - if(!active) - return - var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on", layer = standing.layer + 0.2) - light_icon.appearance_flags = RESET_COLOR - light_icon.color = light_color - . += light_icon - -/obj/item/mod/module/flashlight/get_configuration() - . = ..() - .["light_color"] = add_ui_configuration("Light Color", "color", light_color) - .["light_range"] = add_ui_configuration("Light Range", "number", light_range) - -/obj/item/mod/module/flashlight/configure_edit(key, value) - switch(key) - if("light_color") - value = input(usr, "Pick new light color", "Flashlight Color") as color|null - if(!value) - return - if(is_color_dark(value, 50)) - balloon_alert(mod.wearer, "too dark!") - return - set_light_color(value) - mod.wearer.update_inv_back() - if("light_range") - set_light_range(clamp(value, min_range, max_range)) - -/obj/item/mod/module/reagent_scanner - name = "MOD reagent scanner module" - desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \ - containers and projecting the information in an easy-to-read format on the wearer's display. \ - It cannot detect flavors, so that's up to you." - icon_state = "scanner" - module_type = MODULE_TOGGLE - complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.2 - incompatible_modules = list(/obj/item/mod/module/reagent_scanner) - cooldown_time = 0.5 SECONDS - -/obj/item/mod/module/reagent_scanner/on_activation() - . = ..() - if(!.) - return - ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) - -/obj/item/mod/module/reagent_scanner/on_deactivation() - . = ..() - if(!.) - return - REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) - -/obj/item/mod/module/reagent_scanner/advanced - name = "MOD advanced reagent scanner module" - complexity = 0 - removable = FALSE - var/explosion_detection_dist = 21 - -/obj/item/mod/module/reagent_scanner/advanced/on_activation() - . = ..() - if(!.) - return - mod.wearer.research_scanner++ - RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion)) - -/obj/item/mod/module/reagent_scanner/advanced/on_deactivation() - . = ..() - if(!.) - return - mod.wearer.research_scanner-- - RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) - -/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter, - devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) - SIGNAL_HANDLER - var/turf/wearer_turf = get_turf(mod.wearer) - if(wearer_turf.z != epicenter.z) - return - if(get_dist(epicenter, wearer_turf) > explosion_detection_dist) - return - to_chat(mod.wearer, "Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]") - - -/obj/item/mod/module/dispenser - name = "MOD burger dispenser module" - desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \ - This can draw incredible amounts of power from the suit's cell to create edible organic matter in the \ - palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \ - Notably, all attempts to get it to dispense Earl Grey tea have failed." - icon_state = "dispenser" - module_type = MODULE_USABLE - complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN * 2 - incompatible_modules = list(/obj/item/mod/module/dispenser) - cooldown_time = 5 SECONDS - var/dispense_type = /obj/item/food/burger/plain - var/dispense_time = 0 SECONDS - -/obj/item/mod/module/dispenser/on_use() - . = ..() - if(!.) - return - if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod)) - balloon_alert(mod.wearer, "interrupted!") - return - var/obj/item/dispensed = new dispense_type(mod.wearer.loc) - mod.wearer.put_in_hands(dispensed) - balloon_alert(mod.wearer, "[dispensed] dispensed") - playsound(src, 'sound/machines/click.ogg', 100, TRUE) - drain_power(use_power_cost) - -/obj/item/mod/module/clamp/on_uninstall() - for(var/atom/movable/crate as anything in stored_crates) - crate.forceMove(drop_location()) - stored_crates -= crate - -/obj/item/mod/module/gps - name = "MOD internal GPS module" - desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \ - down to the exact coordinates. This information is fed to a central database viewable from the device itself, \ - though using it to help people is up to you." - icon_state = "gps" - module_type = MODULE_ACTIVE - complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 - device = /obj/item/gps/mod - incompatible_modules = list(/obj/item/mod/module/gps) - cooldown_time = 0.5 SECONDS - -/obj/item/gps/mod - name = "MOD internal GPS" - desc = "Common Nanotrasen technology that calcaulates the user's position from anywhere in space, down to their coordinates." - icon_state = "gps-b" - gpstag = "MOD0" - -/obj/item/mod/module/constructor - name = "MOD constructor module" - desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \ - advanced arm servos meant to carry crewmembers. However, it functions as an \ - extremely advanced construction hologram scanner, as well as containing the \ - latest engineering schematics combined with inbuilt memory to help the user build walls." - icon_state = "constructor" - module_type = MODULE_USABLE - complexity = 2 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.2 - use_power_cost = DEFAULT_CELL_DRAIN * 2 - incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) - cooldown_time = 11 SECONDS - -/obj/item/mod/module/constructor/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) - -/obj/item/mod/module/constructor/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) - -/obj/item/mod/module/constructor/on_use() - . = ..() - if(!.) - return - rcd_scan(src, fade_time = 10 SECONDS) - drain_power(use_power_cost) - -/obj/item/mod/module/quick_carry - name = "MOD quick carry module" - desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \ - or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat." - icon_state = "carry" - complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) - -/obj/item/mod/module/quick_carry/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) - -/obj/item/mod/module/quick_carry/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) - -/obj/item/mod/module/quick_carry/advanced - name = "MOD advanced quick carry module" - removable = FALSE - complexity = 0 - -/obj/item/mod/module/quick_carry/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) - -/obj/item/mod/module/quick_carry/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) - -/obj/item/mod/module/longfall - name = "MOD longfall module" - desc = "Useful for protecting both the suit and the wearer, \ - utilizing commonplace systems to convert the possible damage from a fall into kinetic charge, \ - as well as internal gyroscopes to ensure the user's safe falling. \ - Useful for mining, monorail tracks, or even skydiving!" - icon_state = "longfall" - complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN * 5 - incompatible_modules = list(/obj/item/mod/module/longfall) - -/obj/item/mod/module/longfall/on_suit_activation() - RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) - -/obj/item/mod/module/longfall/on_suit_deactivation() - UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) - -/obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) - if(!drain_power(use_power_cost*levels)) - return - new /obj/effect/temp_visual/mook_dust(fell_on) - mod.wearer.Stun(levels * 1 SECONDS) - to_chat(mod.wearer, "[src] protects you from the damage!") - return NO_Z_IMPACT_DAMAGE - -/obj/item/mod/module/thermal_regulator - name = "MOD thermal regulator module" - desc = "Advanced climate control, using an inner body glove interwoven with thousands of tiny, \ - flexible cooling lines. This circulates coolant at various user-controlled temperatures, \ - ensuring they're comfortable; even if they're some that like it hot." - icon_state = "regulator" - module_type = MODULE_TOGGLE - complexity = 2 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/thermal_regulator) - cooldown_time = 0.5 SECONDS - var/temperature_setting = BODYTEMP_NORMAL - var/min_temp = 293.15 - var/max_temp = 318.15 - -/obj/item/mod/module/thermal_regulator/get_configuration() - . = ..() - .["temperature_setting"] = add_ui_configuration("Temperature", "number", temperature_setting - T0C) - -/obj/item/mod/module/thermal_regulator/configure_edit(key, value) - switch(key) - if("temperature_setting") - temperature_setting = clamp(value + T0C, min_temp, max_temp) - -/obj/item/mod/module/thermal_regulator/on_active_process(delta_time) - mod.wearer.adjust_bodytemperature(get_temp_change_amount((temperature_setting - mod.wearer.bodytemperature), 0.08 * delta_time)) - -/obj/item/mod/module/injector - name = "MOD injector module" - desc = "A module installed into the wrist of the suit, this functions as a high-capacity syringe, \ - with a tip fine enough to locate the emergency injection ports on any suit of armor, \ - penetrating it with ease. Even yours." - icon_state = "injector" - module_type = MODULE_ACTIVE - complexity = 1 - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 - device = /obj/item/reagent_containers/syringe/mod - incompatible_modules = list(/obj/item/mod/module/injector) - cooldown_time = 0.5 SECONDS - -/obj/item/reagent_containers/syringe/mod - name = "MOD injector syringe" - desc = "A high-capacity syringe, with a tip fine enough to locate \ - the emergency injection ports on any suit of armor, penetrating it with ease. Even yours." - icon_state = "mod_0" - base_icon_state = "mod" - amount_per_transfer_from_this = 30 - possible_transfer_amounts = list(5, 10, 15, 20, 30) - volume = 30 - //inject_flags = INJECT_CHECK_PENETRATE_THICK - -/obj/item/mod/module/circuit - name = "MOD circuit adapter module" - desc = "A popular aftermarket module, seen in wide varieties with wide applications by those across the galaxy. \ - This is able to fit any sort of integrated circuit, hooking it into controls in the suit and displaying information \ - to the HUD. Useful for universal translation, or perhaps as a calculator." - module_type = MODULE_USABLE - complexity = 3 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/circuit) - cooldown_time = 0.5 SECONDS - var/obj/item/integrated_circuit/circuit - -/obj/item/mod/module/circuit/Initialize(mapload) - . = ..() - circuit = new() - AddComponent(/datum/component/shell, \ - list(new /obj/item/circuit_component/mod()), \ - capacity = SHELL_CAPACITY_LARGE, \ - shell_flags = SHELL_FLAG_CIRCUIT_UNREMOVABLE, \ - starting_circuit = circuit, \ - ) - -/obj/item/mod/module/circuit/on_install() - circuit.set_cell(mod.cell) - -/obj/item/mod/module/circuit/on_uninstall() - circuit.set_cell(mod.cell) - -/obj/item/mod/module/circuit/on_suit_activation() - circuit.set_on(TRUE) - -/obj/item/mod/module/circuit/on_suit_deactivation() - circuit.set_on(FALSE) - -/obj/item/mod/module/circuit/on_use() - . = ..() - if(!.) - return - circuit.interact(mod.wearer) - -/obj/item/circuit_component/mod - display_name = "MOD" - desc = "Used to send and receive signals from a MODsuit." - - var/obj/item/mod/module/attached_module - - var/datum/port/input/module_to_select - var/datum/port/input/toggle_suit - var/datum/port/input/select_module - - var/datum/port/output/wearer - var/datum/port/output/selected_module - -/obj/item/circuit_component/mod/populate_ports() - // Input Signals - module_to_select = add_input_port("Module to Select", PORT_TYPE_STRING) - toggle_suit = add_input_port("Toggle Suit", PORT_TYPE_SIGNAL) - select_module = add_input_port("Select Module", PORT_TYPE_SIGNAL) - // States - wearer = add_output_port("Wearer", PORT_TYPE_ATOM) - selected_module = add_output_port("Selected Module", PORT_TYPE_ATOM) - -/obj/item/circuit_component/mod/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/mod/module)) - attached_module = shell - RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - -/obj/item/circuit_component/mod/unregister_shell(atom/movable/shell) - UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) - attached_module = null - -/obj/item/circuit_component/mod/input_received(datum/port/input/port) - var/obj/item/mod/module/module - for(var/obj/item/mod/module/potential_module as anything in attached_module.mod.modules) - if(potential_module.name == module_to_select.value) - module = potential_module - if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) - INVOKE_ASYNC(attached_module.mod, TYPE_PROC_REF(/obj/item/mod/control, toggle_activate), attached_module.mod.wearer) - if(module && COMPONENT_TRIGGERED_BY(select_module, port)) - INVOKE_ASYNC(module, TYPE_PROC_REF(/obj/item/mod/module, on_select)) - -/obj/item/circuit_component/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER - if(istype(source.loc, /obj/item/mod/control)) - RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, PROC_REF(on_module_select)) - RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, PROC_REF(equip_check)) - equip_check() - else if(istype(old_loc, /obj/item/mod/control)) - UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) - selected_module.set_output(null) - wearer.set_output(null) - -/obj/item/circuit_component/mod/proc/on_module_select() - SIGNAL_HANDLER - selected_module.set_output(attached_module.mod.selected_module) - -/obj/item/circuit_component/mod/proc/equip_check() - SIGNAL_HANDLER - - if(!attached_module.mod?.wearer) - return - wearer.set_output(attached_module.mod.wearer) - -/obj/item/mod/module/clamp - name = "MOD hydraulic clamp module" - desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \ - However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \ - A lot of people would say that loading cargo is a dull job, but you could not disagree more." - icon_state = "clamp" - module_type = MODULE_ACTIVE - complexity = 3 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/clamp) - cooldown_time = 0.5 SECONDS - var/max_crates = 5 - var/list/stored_crates = list() - -/obj/item/mod/module/clamp/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!mod.wearer.Adjacent(target)) - return - if(istype(target, /obj/structure/closet/crate)) - var/atom/movable/picked_crate = target - if(length(stored_crates) >= max_crates) - balloon_alert(mod.wearer, "too many crates!") - return - if(!do_after(mod.wearer, 1 SECONDS, target = target)) - balloon_alert(mod.wearer, "interrupted!") - return - stored_crates += picked_crate - picked_crate.forceMove(src) - balloon_alert(mod.wearer, "picked up [picked_crate]") - playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - drain_power(use_power_cost) - else if(length(stored_crates)) - var/turf/target_turf = get_turf(target) - if(target_turf.is_blocked_turf()) - return - if(!do_after(mod.wearer, 1 SECONDS, target = target)) - balloon_alert(mod.wearer, "interrupted!") - return - if(target_turf.is_blocked_turf()) - return - var/atom/movable/dropped_crate = pop(stored_crates) - dropped_crate.forceMove(target_turf) - balloon_alert(mod.wearer, "dropped [dropped_crate]") - playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - drain_power(use_power_cost) - -/obj/item/mod/module/bikehorn - name = "MOD bike horn module" - desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \ - precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound." - icon_state = "bikehorn" - module_type = MODULE_USABLE - complexity = 1 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/bikehorn) - cooldown_time = 1 SECONDS - -/obj/item/mod/module/bikehorn/on_use() - . = ..() - if(!.) - return - playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) - drain_power(use_power_cost) - -/obj/item/mod/module/drill - name = "MOD drill module" - desc = "An integrated drill, typically extending over the user's hand. While useful for drilling through rock, \ - your drill is surely the one that both pierces and creates the heavens." - icon_state = "drill" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/drill) - cooldown_time = 0.5 SECONDS - -/obj/item/mod/module/drill/on_activation() - . = ..() - if(!.) - return - RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine)) - -/obj/item/mod/module/drill/on_deactivation() - . = ..() - if(!.) - return - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP) - -/obj/item/mod/module/drill/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!mod.wearer.Adjacent(target)) - return - if(istype(target, /turf/closed/mineral)) - var/turf/closed/mineral/mineral_turf = target - mineral_turf.gets_drilled(mod.wearer) - drain_power(use_power_cost) - -/obj/item/mod/module/drill/proc/bump_mine(mob/living/carbon/human/bumper, atom/bumped_into, proximity) - SIGNAL_HANDLER - if(!istype(bumped_into, /turf/closed/mineral) || !drain_power(use_power_cost)) - return - var/turf/closed/mineral/mineral_turf = bumped_into - mineral_turf.gets_drilled(mod.wearer) - return COMPONENT_CANCEL_ATTACK_CHAIN - -/obj/item/mod/module/orebag - name = "MOD ore bag module" - desc = "An integrated ore storage system installed into the suit, \ - this utilizes precise electromagnets and storage compartments to automatically collect and deposit ore. \ - It's recommended by Nakamura Engineering to actually deposit that ore at local refineries." - icon_state = "ore" - module_type = MODULE_USABLE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 0.2 - incompatible_modules = list(/obj/item/mod/module/orebag) - cooldown_time = 0.5 SECONDS - var/list/ores = list() - -/obj/item/mod/module/orebag/on_equip() - RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(ore_pickup)) - -/obj/item/mod/module/orebag/on_unequip() - UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) - -/obj/item/mod/module/orebag/proc/ore_pickup(atom/movable/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER - - for(var/obj/item/stack/ore/ore in get_turf(mod.wearer)) - INVOKE_ASYNC(src, PROC_REF(move_ore), ore) - playsound(src, "rustle", 50, TRUE) - -/obj/item/mod/module/orebag/proc/move_ore(obj/item/stack/ore) - for(var/obj/item/stack/stored_ore as anything in ores) - if(!ore.can_merge(stored_ore)) - continue - ore.merge(stored_ore) - if(QDELETED(ore)) - return - break - ore.forceMove(src) - ores += ore - -/obj/item/mod/module/orebag/on_use() - . = ..() - if(!.) - return - for(var/obj/item/ore as anything in ores) - ore.forceMove(drop_location()) - ores -= ore - drain_power(use_power_cost) - -/obj/item/mod/module/microwave_beam - name = "MOD microwave beam module" - desc = "An oddly domestic device, this module is installed into the user's palm, \ - hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \ - allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." - icon_state = "microwave_beam" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 5 - incompatible_modules = list(/obj/item/mod/module/microwave_beam) - cooldown_time = 10 SECONDS - -/obj/item/mod/module/microwave_beam/on_select_use(atom/target) - . = ..() - if(!.) - return - if(!istype(target, /obj/item)) - return - if(!isturf(target.loc)) - balloon_alert(mod.wearer, "must be on the floor!") - return - var/obj/item/microwave_target = target - var/datum/effect_system/spark_spread/spark_effect = new() - spark_effect.set_up(2, 1, mod.wearer) - spark_effect.start() - mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) - if(microwave_target.microwave_act()) - playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE) - else - balloon_alert(mod.wearer, "can't be microwaved!") - var/datum/effect_system/spark_spread/spark_effect_two = new() - spark_effect_two.set_up(2, 1, microwave_target) - spark_effect_two.start() - drain_power(use_power_cost) - -/obj/item/mod/module/organ_thrower - name = "MOD organ thrower module" - desc = "A device recovered from a crashed Interdyne Pharmaceuticals vessel, \ - this module has been unearthed for better or for worse. \ - It's an arm-mounted device utilizing technology similar to modern-day part replacers, \ - capable of storing and inserting organs into open patients. \ - It's recommended by the DeForest Medical Corporation to not inform patients it has been used." - icon_state = "organ_thrower" - module_type = MODULE_ACTIVE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN - incompatible_modules = list(/obj/item/mod/module/organ_thrower) - cooldown_time = 0.5 SECONDS - var/max_organs = 5 - var/organ_list = list() - -/obj/item/mod/module/organ_thrower/on_select_use(atom/target) - . = ..() - if(!.) - return - var/mob/living/carbon/human/wearer_human = mod.wearer - if(istype(target, /obj/item/organ)) - if(!wearer_human.Adjacent(target)) - return - var/atom/movable/organ = target - if(length(organ_list) >= max_organs) - balloon_alert(mod.wearer, "too many organs!") - return - organ_list += organ - organ.forceMove(src) - balloon_alert(mod.wearer, "picked up [organ]") - playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - drain_power(use_power_cost) - return - if(!length(organ_list)) - return - var/atom/movable/fired_organ = pop(organ_list) - var/obj/projectile/organ/projectile = new /obj/projectile/organ(mod.wearer.loc, fired_organ) - projectile.preparePixelProjectile(target, mod.wearer) - projectile.firer = mod.wearer - playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) - INVOKE_ASYNC(projectile, TYPE_PROC_REF(/obj/projectile, fire)) - drain_power(use_power_cost) - -/obj/projectile/organ - name = "organ" - damage = 0 - nodamage = TRUE - hitsound = 'sound/effects/attackblob.ogg' - hitsound_wall = 'sound/effects/attackblob.ogg' - var/obj/item/organ/organ - -/obj/projectile/organ/Initialize(mapload, obj/item/stored_organ) - . = ..() - if(!stored_organ) - return INITIALIZE_HINT_QDEL - appearance = stored_organ.appearance - stored_organ.forceMove(src) - organ = stored_organ - -/obj/projectile/organ/Destroy() - organ = null - return ..() - -/obj/projectile/organ/on_hit(atom/target) - . = ..() - if(!ishuman(target)) - organ.forceMove(drop_location()) - organ = null - return - var/mob/living/carbon/human/organ_receiver = target - var/succeed = FALSE - if(organ_receiver.surgeries.len) - for(var/datum/surgery/procedure as anything in organ_receiver.surgeries) - if(procedure.location != organ.zone) - continue - if(!istype(procedure, /datum/surgery/organ_manipulation)) - continue - var/datum/surgery_step/surgery_step = procedure.get_surgery_step() - if(!istype(surgery_step, /datum/surgery_step/manipulate_organs)) - continue - succeed = TRUE - break - if(succeed) - var/list/organs_to_boot_out = organ_receiver.getorganslot(organ.slot) - for(var/obj/item/organ/organ_evacced as anything in organs_to_boot_out) - if(organ_evacced.organ_flags & ORGAN_UNREMOVABLE) - continue - organ_evacced.Remove(target) - organ_evacced.forceMove(get_turf(target)) - organ.Insert(target) - else - organ.forceMove(drop_location()) - organ = null - -/obj/item/mod/module/pathfinder - name = "MOD pathfinder module" - desc = "This module, brought to you by Nakamura Engineering, has two components. \ - The first component is a series of thrusters and a computerized location subroutine installed into the \ - very control unit of the suit, allowing it flight at highway speeds, \ - and to be able to locate the second part of the system; \ - a pathfinding implant installed into the base of the user's spine, \ - broadcasting their location to the suit and allowing them to recall it to their back at any time. \ - Nakamura Engineering swears up and down there's airbrakes." - icon_state = "pathfinder" - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 10 - incompatible_modules = list(/obj/item/mod/module/pathfinder) - var/obj/item/implant/mod/implant - -/obj/item/mod/module/pathfinder/Initialize(mapload) - . = ..() - implant = new(src) - -/obj/item/mod/module/pathfinder/Destroy() - implant = null - return ..() - -/obj/item/mod/module/pathfinder/examine(mob/user) - . = ..() - if(implant) - . += "Use it on a human to implant them." - else - . += "The implant is missing." - -/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, params) - if(!ishuman(target) || !implant) - return - if(!do_after(user, 1.5 SECONDS, target = target)) - balloon_alert(user, "interrupted!") - return - if(!implant.implant(target, user)) - balloon_alert(user, "can't implant!") - return - if(target == user) - to_chat(user, "You implant yourself with [implant].") - else - target.visible_message("[user] implants [target].", "[user] implants you with [implant].") - playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) - icon_state = "pathfinder_empty" - implant = null - -/obj/item/mod/module/pathfinder/proc/attach(mob/living/user) - if(!ishuman(user)) - return - var/mob/living/carbon/human/human_user = user - if(human_user.back && !human_user.dropItemToGround(human_user.back)) - return - if(!human_user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - return - human_user.update_action_buttons(TRUE) - balloon_alert(human_user, "[mod] attached") - playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) - drain_power(use_power_cost) - -/obj/item/implant/mod - name = "MOD pathfinder implant" - desc = "Lets you recall a MODsuit to you at any time." - actions_types = list(/datum/action/item_action/mod_recall) - var/obj/item/mod/module/pathfinder/module - var/image/jet_icon - -/obj/item/implant/mod/Initialize(mapload) - . = ..() - if(!istype(loc, /obj/item/mod/module/pathfinder)) - return INITIALIZE_HINT_QDEL - module = loc - jet_icon = image(icon = 'icons/obj/clothing/modsuit/mod_modules.dmi', icon_state = "mod_jet", layer = LOW_ITEM_LAYER) - -/obj/item/implant/mod/Destroy() - if(module?.mod?.ai_controller) - end_recall(successful = FALSE) - module = null - jet_icon = null - return ..() - -/obj/item/implant/mod/get_data() - var/dat = {"Implant Specifications:
- Name: Nakamura Engineering Pathfinder Implant
- Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
"} - return dat - -/obj/item/implant/mod/proc/recall() - if(!module?.mod) - balloon_alert(imp_in, "no connected suit!") - return FALSE - if(module.mod.open) - balloon_alert(imp_in, "suit is open!") - return FALSE - if(module.mod.ai_controller) - balloon_alert(imp_in, "already in transit!") - return FALSE - if(ismob(get_atom_on_turf(module.mod))) - balloon_alert(imp_in, "already on someone!") - return FALSE - if(module.z != z || get_dist(imp_in, module.mod) > MOD_AI_RANGE) - balloon_alert(imp_in, "too far away!") - return FALSE - var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(module.mod) - module.mod.ai_controller = mod_ai - mod_ai.current_movement_target = imp_in - mod_ai.blackboard[BB_MOD_TARGET] = imp_in - mod_ai.blackboard[BB_MOD_IMPLANT] = src - module.mod.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP - //module.mod.AddElement(/datum/element/movetype_handler) - //ADD_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) - animate(module.mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) - module.mod.add_overlay(jet_icon) - RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - balloon_alert(imp_in, "suit recalled") - return TRUE - -/obj/item/implant/mod/proc/end_recall(successful = TRUE) - if(!module?.mod) - return - QDEL_NULL(module.mod.ai_controller) - module.mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP - //REMOVE_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) - //module.mod.RemoveElement(/datum/element/movetype_handler) - module.mod.cut_overlay(jet_icon) - module.mod.transform = matrix() - UnregisterSignal(module.mod, COMSIG_MOVABLE_MOVED) - if(!successful) - balloon_alert(imp_in, "suit lost connection!") - -/obj/item/implant/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER - - var/matrix/mod_matrix = matrix() - mod_matrix.Turn(get_angle(source, imp_in)) - source.transform = mod_matrix - -/datum/action/item_action/mod_recall - name = "Recall MOD" - desc = "Recall a MODsuit anyplace, anytime." - check_flags = AB_CHECK_CONSCIOUS - background_icon_state = "bg_tech_blue" - icon_icon = 'icons/mob/actions/actions_mod.dmi' - button_icon_state = "recall" - COOLDOWN_DECLARE(recall_cooldown) - var/obj/item/implant/mod/implant - -/datum/action/item_action/mod_recall/New(Target) - ..() - implant = Target - -/datum/action/item_action/mod_recall/Trigger() - . = ..() - if(!.) - return - if(!COOLDOWN_FINISHED(src, recall_cooldown)) - implant.balloon_alert(implant.imp_in, "on cooldown!") - return - if(implant.recall()) - COOLDOWN_START(src, recall_cooldown, 15 SECONDS) - -/obj/item/mod/module/dna_lock - name = "MOD DNA lock module" - desc = "A module which engages with the various locks and seals tied to the suit's systems, \ - enabling it to only be worn by someone corresponding with the user's exact DNA profile; \ - however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." - icon_state = "dnalock" - module_type = MODULE_USABLE - complexity = 2 - use_power_cost = DEFAULT_CELL_DRAIN * 3 - incompatible_modules = list(/obj/item/mod/module/dna_lock) - cooldown_time = 0.5 SECONDS - var/dna = null - -/obj/item/mod/module/dna_lock/on_install() - RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_mod_activation)) - RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp)) - RegisterSignal(mod, COMSIG_ATOM_SHOULD_EMAG, PROC_REF(should_emag)) - RegisterSignal(mod, COMSIG_ATOM_ON_EMAG, PROC_REF(on_emag)) - -/obj/item/mod/module/dna_lock/on_uninstall() - UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) - UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) - UnregisterSignal(mod, COMSIG_ATOM_SHOULD_EMAG) - UnregisterSignal(mod, COMSIG_ATOM_ON_EMAG) - - -/obj/item/mod/module/dna_lock/on_use() - . = ..() - if(!.) - return - dna = mod.wearer.dna.unique_enzymes - balloon_alert(mod.wearer, "dna updated") - drain_power(use_power_cost) - -/obj/item/mod/module/dna_lock/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - on_emp(src, severity) - -/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity) - SIGNAL_HANDLER - - dna = null - -/obj/item/mod/module/dna_lock/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card) - ..() - - dna = null - -/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source) - SIGNAL_HANDLER - - if(!dna || (mod.wearer.has_dna() && mod.wearer.dna.unique_enzymes == dna)) - return - balloon_alert(mod.wearer, "dna locked!") - return MOD_CANCEL_ACTIVATE - -/obj/item/mod/module/armor_booster - name = "MOD armor booster module" - desc = "A retrofitted series of retractable armor plates, allowing the suit to function as essentially power armor, \ - giving the user incredible protection against conventional firearms, or everyday attacks in close-quarters. \ - However, the additional plating cannot deploy alongside parts of the suit used for vacuum sealing, \ - so this extra armor provides zero ability for extravehicular activity while deployed." - icon_state = "armor_booster" - module_type = MODULE_TOGGLE - active_power_cost = DEFAULT_CELL_DRAIN * 0.3 - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/armor_booster) - cooldown_time = 0.5 SECONDS - overlay_state_inactive = "module_armorbooster_off" - overlay_state_active = "module_armorbooster_on" - var/remove_pressure_protection = TRUE - var/added_slowdown = -0.5 - var/list/armor_values = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40) - var/list/spaceproofed = list() - -/obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing) - overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" - overlay_state_active = "[initial(overlay_state_active)]-[mod.skin]" - return ..() - -/obj/item/mod/module/armor_booster/on_activation() - . = ..() - if(!.) - return - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - mod.slowdown += added_slowdown - mod.wearer.update_equipment_speed_mods() - var/list/parts = mod.mod_parts + mod - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(armor_values)) - if(!remove_pressure_protection || !isclothing(part)) - continue - var/obj/item/clothing/clothing_part = part - if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE) - clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE - clothing_part.heat_protection = NONE - clothing_part.cold_protection = NONE - spaceproofed[clothing_part] = TRUE - -/obj/item/mod/module/armor_booster/on_deactivation() - . = ..() - if(!.) - return - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - mod.slowdown -= added_slowdown - mod.wearer.update_equipment_speed_mods() - var/list/parts = mod.mod_parts + mod - var/list/removed_armor = armor_values.Copy() - for(var/armor_type in removed_armor) - removed_armor[armor_type] = -removed_armor[armor_type] - for(var/obj/item/part as anything in parts) - part.armor = part.armor.modifyRating(arglist(removed_armor)) - if(!remove_pressure_protection || !isclothing(part)) - continue - var/obj/item/clothing/clothing_part = part - if(spaceproofed[clothing_part]) - clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE - clothing_part.heat_protection = initial(clothing_part.heat_protection) - clothing_part.cold_protection = initial(clothing_part.cold_protection) - spaceproofed = list() - -/obj/item/mod/module/armor_booster/elite - name = "MOD elite armor booster module" - armor_values = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 60) - added_slowdown = -0.25 - -/obj/item/mod/module/energy_shield - name = "MOD energy shield module" - desc = "A personal, protective forcefield typically seen in military applications. \ - This advanced deflector shield is essentially a scaled down version of those seen on starships, \ - and the power cost can be an easy indicator of this. However, it is capable of blocking nearly any incoming attack, \ - though with its' low amount of separate charges, the user remains mortal." - icon_state = "energy_shield" - complexity = 3 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 - use_power_cost = DEFAULT_CELL_DRAIN * 2 - incompatible_modules = list(/obj/item/mod/module/energy_shield) - var/max_charges = 3 - var/recharge_start_delay = 20 SECONDS - var/charge_increment_delay = 1 SECONDS - var/charge_recovery = 1 - var/lose_multiple_charges = FALSE - var/recharge_path = null - var/shield_icon_file = 'icons/effects/effects.dmi' - var/shield_icon = "shield-red" - var/charges - -/obj/item/mod/module/energy_shield/Initialize(mapload) - . = ..() - charges = max_charges - -/obj/item/mod/module/energy_shield/on_suit_activation() - mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ - charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon) - RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, PROC_REF(shield_reaction)) - -/obj/item/mod/module/energy_shield/on_suit_deactivation() - var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) - charges = shield.current_charges - qdel(shield) - UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) - -/obj/item/mod/module/energy_shield/proc/shield_reaction(mob/living/carbon/human/owner, atom/movable/hitby, damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) - if(SEND_SIGNAL(mod, COMSIG_ITEM_HIT_REACT, owner, hitby, attack_text, 0, damage, attack_type) & COMPONENT_HIT_REACTION_BLOCK) - drain_power(use_power_cost) - return SHIELD_BLOCK - return NONE - -/obj/item/mod/module/energy_shield/wizard - name = "MOD battlemage shield module" - desc = "The caster wielding this spell gains a visible barrier around them, channeling arcane power through \ - specialized runes engraved onto the surface of the suit to generate a wall of force. \ - This shield can perfectly nullify attacks ranging from high-caliber rifles to magic missiles, \ - though can also be drained by more mundane attacks. It will not protect the caster from social ridicule." - icon_state = "battlemage_shield" - idle_power_cost = DEFAULT_CELL_DRAIN * 0 //magic - use_power_cost = DEFAULT_CELL_DRAIN * 0 //magic too - max_charges = 15 - recharge_start_delay = 0 SECONDS - charge_recovery = 8 - shield_icon_file = 'icons/obj/magic.dmi' - shield_icon = "mageshield" - recharge_path = /obj/item/wizard_armour_charge - -/obj/item/mod/module/plasma_stabilizer - name = "MOD plasma stabilizer module" - desc = "This system essentially forms an atmosphere of its' own inside the suit, \ - safely ejecting oxygen from the inside and allowing the wearer, a plasmaman, \ - to have their internal plasma circulate around them somewhat like a sauna. \ - This prevents them from self-igniting, and leads to greater comfort overall. \ - The purple glass of the visor seems to be constructed for nostalgic purposes." - icon_state = "plasma_stabilizer" - complexity = 1 - idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 - incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) - overlay_state_inactive = "module_plasma" - -/obj/item/mod/module/plasma_stabilizer/on_equip() - ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) - -/obj/item/mod/module/plasma_stabilizer/on_unequip() - REMOVE_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) - -/obj/item/mod/module/anti_magic - name = "MOD magic nullifier module" - desc = "A series of obsidian rods installed into critical points around the suit, \ - vibrated at a certain low frequency to enable them to resonate. \ - This creates a low-range, yet strong, magic nullification field around the user, \ - aided by a full replacement of the suit's normal coolant with holy water. \ - Spells will spall right off this field, though it'll do nothing to help others believe you about all this." - icon_state = "magic_nullifier" - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/anti_magic) - -/* -/obj/item/mod/module/anti_magic/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) - ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) - -/obj/item/mod/module/anti_magic/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) - REMOVE_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) -*/ - -/obj/item/mod/module/anti_magic/wizard - name = "MOD magic neutralizer module" - desc = "The caster wielding this spell gains an invisible barrier around them, channeling arcane power through \ - specialized runes engraved onto the surface of the suit to generate anti-magic field. \ - The field will neutralize all magic that comes into contact with the user. \ - It will not protect the caster from social ridicule." - icon_state = "magic_neutralizer" - -/obj/item/mod/module/anti_magic/wizard/on_suit_activation() - ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) - -/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() - REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) - -/obj/item/mod/module/kinesis //TODO POST-MERGE MAKE NOT SUCK ASS, MAKE BALLER AS FUCK - name = "MOD kinesis module" - desc = "A modular plug-in to the forearm, this module was presumed lost for many years, \ - despite the suits it used to be mounted on still seeing some circulation. \ - This piece of technology allows the user to generate precise anti-gravity fields, \ - letting them move objects as small as a titanium rod to as large as industrial machinery. \ - Oddly enough, it doesn't seem to work on living creatures." - icon_state = "kinesis" -// module_type = MODULE_ACTIVE - module_type = MODULE_TOGGLE -// complexity = 3 - complexity = 0 - active_power_cost = DEFAULT_CELL_DRAIN*0.75 -// use_power_cost = DEFAULT_CELL_DRAIN*3 - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/kinesis) - cooldown_time = 0.5 SECONDS - var/has_tk = FALSE - -/obj/item/mod/module/kinesis/on_activation() - . = ..() - if(!.) - return - if(mod.wearer.dna.check_mutation(TK)) - has_tk = TRUE - else - mod.wearer.dna.add_mutation(TK) - -/obj/item/mod/module/kinesis/on_deactivation() - . = ..() - if(!.) - return - if(has_tk) - has_tk = FALSE - return - mod.wearer.dna.remove_mutation(TK) - -/obj/item/mod/module/insignia - name = "MOD insignia module" - desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \ - the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \ - they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \ - color patterns to and from the suit." - icon_state = "insignia" - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/insignia) - overlay_state_inactive = "insignia" - -/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing) - overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" - . = ..() - for(var/mutable_appearance/appearance as anything in .) - appearance.color = color - -/obj/item/mod/module/insignia/commander - color = "#4980a5" - -/obj/item/mod/module/insignia/security - color = "#b30d1e" - -/obj/item/mod/module/insignia/engineer - color = "#e9c80e" - -/obj/item/mod/module/insignia/medic - color = "#ebebf5" - -/obj/item/mod/module/insignia/janitor - color = "#7925c7" - -/obj/item/mod/module/insignia/clown - color = "#ff1fc7" - -/obj/item/mod/module/insignia/chaplain - color = "#f0a00c" diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm new file mode 100644 index 0000000000000..67e771b44327d --- /dev/null +++ b/code/modules/mod/modules/modules_antag.dm @@ -0,0 +1,212 @@ +//Antag modules for MODsuits + +//Armor Booster + +/obj/item/mod/module/armor_booster + name = "MOD armor booster module" + desc = "A retrofitted series of retractable armor plates, allowing the suit to function as essentially power armor, \ + giving the user incredible protection against conventional firearms, or everyday attacks in close-quarters. \ + However, the additional plating cannot deploy alongside parts of the suit used for vacuum sealing, \ + so this extra armor provides zero ability for extravehicular activity while deployed." + icon_state = "armor_booster" + module_type = MODULE_TOGGLE + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/armor_booster) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_armorbooster_off" + overlay_state_active = "module_armorbooster_on" + var/remove_pressure_protection = TRUE + var/added_slowdown = -0.5 + var/list/armor_values = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40) + var/list/spaceproofed = list() + +/obj/item/mod/module/armor_booster/generate_worn_overlay(mutable_appearance/standing) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + overlay_state_active = "[initial(overlay_state_active)]-[mod.skin]" + return ..() + +/obj/item/mod/module/armor_booster/on_activation() + . = ..() + if(!.) + return + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + mod.slowdown += added_slowdown + mod.wearer.update_equipment_speed_mods() + var/list/parts = mod.mod_parts + mod + for(var/obj/item/part as anything in parts) + part.armor = part.armor.modifyRating(arglist(armor_values)) + if(!remove_pressure_protection || !isclothing(part)) + continue + var/obj/item/clothing/clothing_part = part + if(clothing_part.clothing_flags & STOPSPRESSUREDAMAGE) + clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE + clothing_part.heat_protection = NONE + clothing_part.cold_protection = NONE + spaceproofed[clothing_part] = TRUE + +/obj/item/mod/module/armor_booster/on_deactivation() + . = ..() + if(!.) + return + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + mod.slowdown -= added_slowdown + mod.wearer.update_equipment_speed_mods() + var/list/parts = mod.mod_parts + mod + var/list/removed_armor = armor_values.Copy() + for(var/armor_type in removed_armor) + removed_armor[armor_type] = -removed_armor[armor_type] + for(var/obj/item/part as anything in parts) + part.armor = part.armor.modifyRating(arglist(removed_armor)) + if(!remove_pressure_protection || !isclothing(part)) + continue + var/obj/item/clothing/clothing_part = part + if(spaceproofed[clothing_part]) + clothing_part.clothing_flags |= STOPSPRESSUREDAMAGE + clothing_part.heat_protection = initial(clothing_part.heat_protection) + clothing_part.cold_protection = initial(clothing_part.cold_protection) + spaceproofed = list() + +/obj/item/mod/module/armor_booster/elite + name = "MOD elite armor booster module" + armor_values = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 60) + added_slowdown = -0.25 + +//Energy Shield + +/obj/item/mod/module/energy_shield + name = "MOD energy shield module" + desc = "A personal, protective forcefield typically seen in military applications. \ + This advanced deflector shield is essentially a scaled down version of those seen on starships, \ + and the power cost can be an easy indicator of this. However, it is capable of blocking nearly any incoming attack, \ + though with its' low amount of separate charges, the user remains mortal." + icon_state = "energy_shield" + complexity = 3 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 + use_power_cost = DEFAULT_CELL_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/energy_shield) + var/max_charges = 3 + var/recharge_start_delay = 20 SECONDS + var/charge_increment_delay = 1 SECONDS + var/charge_recovery = 1 + var/lose_multiple_charges = FALSE + var/recharge_path = null + var/shield_icon_file = 'icons/effects/effects.dmi' + var/shield_icon = "shield-red" + var/charges + +/obj/item/mod/module/energy_shield/Initialize(mapload) + . = ..() + charges = max_charges + +/obj/item/mod/module/energy_shield/on_suit_activation() + mod.AddComponent(/datum/component/shielded, max_charges = max_charges, recharge_start_delay = recharge_start_delay, charge_increment_delay = charge_increment_delay, \ + charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon) + RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, .proc/shield_reaction) + +/obj/item/mod/module/energy_shield/on_suit_deactivation() + var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) + charges = shield.current_charges + qdel(shield) + UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) + +/obj/item/mod/module/energy_shield/proc/shield_reaction(mob/living/carbon/human/owner, atom/movable/hitby, damage = 0, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) + if(SEND_SIGNAL(mod, COMSIG_ITEM_HIT_REACT, owner, hitby, attack_text, 0, damage, attack_type) & COMPONENT_HIT_REACTION_BLOCK) + drain_power(use_power_cost) + return SHIELD_BLOCK + return NONE + +/obj/item/mod/module/energy_shield/wizard + name = "MOD battlemage shield module" + desc = "The caster wielding this spell gains a visible barrier around them, channeling arcane power through \ + specialized runes engraved onto the surface of the suit to generate a wall of force. \ + This shield can perfectly nullify attacks ranging from high-caliber rifles to magic missiles, \ + though can also be drained by more mundane attacks. It will not protect the caster from social ridicule." + icon_state = "battlemage_shield" + idle_power_cost = DEFAULT_CELL_DRAIN * 0 //magic + use_power_cost = DEFAULT_CELL_DRAIN * 0 //magic too + max_charges = 15 + recharge_start_delay = 0 SECONDS + charge_recovery = 8 + shield_icon_file = 'icons/obj/magic.dmi' + shield_icon = "mageshield" + recharge_path = /obj/item/wizard_armour_charge + +//Magic Nullifier + +/obj/item/mod/module/anti_magic + name = "MOD magic nullifier module" + desc = "A series of obsidian rods installed into critical points around the suit, \ + vibrated at a certain low frequency to enable them to resonate. \ + This creates a low-range, yet strong, magic nullification field around the user, \ + aided by a full replacement of the suit's normal coolant with holy water. \ + Spells will spall right off this field, though it'll do nothing to help others believe you about all this." + icon_state = "magic_nullifier" + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/anti_magic) + +/obj/item/mod/module/anti_magic/on_suit_activation() + mod.wearer.AddComponent(/datum/component/anti_magic, MOD_TRAIT, _magic = TRUE, _holy = FALSE) + mod.wearer.AddComponent(/datum/component/anti_magic, MOD_TRAIT, _magic = FALSE, _holy = TRUE) + +/obj/item/mod/module/anti_magic/on_suit_deactivation() + for (var/datum/component/anti_magic/anti_magic in mod.wearer.GetComponents(/datum/component/anti_magic)) + if (anti_magic.source == MOD_TRAIT) + qdel(anti_magic) + for (var/datum/component/anti_magic/anti_magic in mod.wearer.GetComponents(/datum/component/anti_magic)) + if (anti_magic.source == MOD_TRAIT) + qdel(anti_magic) + +/obj/item/mod/module/anti_magic/wizard + name = "MOD magic neutralizer module" + desc = "The caster wielding this spell gains an invisible barrier around them, channeling arcane power through \ + specialized runes engraved onto the surface of the suit to generate anti-magic field. \ + The field will neutralize all magic that comes into contact with the user. \ + It will not protect the caster from social ridicule." + icon_state = "magic_neutralizer" + +/obj/item/mod/module/anti_magic/wizard/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) + +/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) + +//Insignia + +/obj/item/mod/module/insignia + name = "MOD insignia module" + desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \ + the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \ + they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \ + color patterns to and from the suit." + icon_state = "insignia" + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/insignia) + overlay_state_inactive = "insignia" + +/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + . = ..() + for(var/mutable_appearance/appearance as anything in .) + appearance.color = color + +/obj/item/mod/module/insignia/commander + color = "#4980a5" + +/obj/item/mod/module/insignia/security + color = "#b30d1e" + +/obj/item/mod/module/insignia/engineer + color = "#e9c80e" + +/obj/item/mod/module/insignia/medic + color = "#ebebf5" + +/obj/item/mod/module/insignia/janitor + color = "#7925c7" + +/obj/item/mod/module/insignia/clown + color = "#ff1fc7" + +/obj/item/mod/module/insignia/chaplain + color = "#f0a00c" diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm new file mode 100644 index 0000000000000..56e0e73186b9d --- /dev/null +++ b/code/modules/mod/modules/modules_engineering.dm @@ -0,0 +1,209 @@ +//Engineering modules for MODsuits + +//Welding Protection + +/obj/item/mod/module/welding + name = "MOD welding protection module" + desc = "A module installed into the visor of the suit, this projects a \ + polarized, holographic overlay in front of the user's eyes. It's rated high enough for \ + immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights." + icon_state = "welding" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/welding) + overlay_state_inactive = "module_welding" + +/obj/item/mod/module/welding/on_suit_activation() + mod.helmet.flash_protect = FLASH_PROTECTION_WELDER + +/obj/item/mod/module/welding/on_suit_deactivation() + mod.helmet.flash_protect = initial(mod.helmet.flash_protect) + +//T-Ray Scan + +/obj/item/mod/module/t_ray + name = "MOD t-ray scan module" + desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \ + to essentially echolocate things beneath the floor, mostly cables and pipes. \ + A staple of atmospherics work, and counter-smuggling work." + icon_state = "tray" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/t_ray) + cooldown_time = 0.5 SECONDS + var/range = 2 + +/obj/item/mod/module/t_ray/on_active_process(delta_time) + t_ray_scan(mod.wearer, 8, range) + +//Magnetic Stability + +/obj/item/mod/module/magboot + name = "MOD magnetic stability module" + desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \ + excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \ + However, these basic models do not feature computerized systems to automatically toggle them on and off, \ + so numerous users report a certain stickiness to their steps." + icon_state = "magnet" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/magboot) + cooldown_time = 0.5 SECONDS + var/slowdown_active = 0.5 + +/obj/item/mod/module/magboot/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) + mod.slowdown += slowdown_active + mod.wearer.update_gravity(mod.wearer.has_gravity()) + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/magboot/on_deactivation() + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) + mod.slowdown -= slowdown_active + mod.wearer.update_gravity(mod.wearer.has_gravity()) + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/magboot/advanced + name = "MOD advanced magnetic stability module" + removable = FALSE + complexity = 0 + slowdown_active = 0 + +//Emergency Tether + +/obj/item/mod/module/tether + name = "MOD emergency tether module" + desc = "A custom-built grappling-hook powered by a winch capable of hauling the user. \ + While some older models of cargo-oriented grapples have capacities of a few tons, \ + these are only capable of working in zero-gravity environments, a blessing to some Engineers." + icon_state = "tether" + module_type = MODULE_ACTIVE + complexity = 3 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/tether) + cooldown_time = 1.5 SECONDS + +/obj/item/mod/module/tether/on_use() + if(mod.wearer.has_gravity(get_turf(src))) + balloon_alert(mod.wearer, "too much gravity!") + playsound(src, 'sound/weapons/gun_dry_fire.ogg', 25, TRUE) + return FALSE + return ..() + +/obj/item/mod/module/tether/on_select_use(atom/target) + . = ..() + if(!.) + return + var/obj/projectile/tether = new /obj/projectile/tether(mod.wearer.loc) + tether.preparePixelProjectile(target, mod.wearer) + tether.firer = mod.wearer + INVOKE_ASYNC(tether, /obj/projectile.proc/fire) + drain_power(use_power_cost) + +/obj/projectile/tether + name = "tether" + icon_state = "tether_projectile" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' + pass_flags = PASSTABLE + damage = 0 + nodamage = TRUE + range = 10 + hitsound = 'sound/weapons/batonextend.ogg' + hitsound_wall = 'sound/weapons/batonextend.ogg' + suppressed = SUPPRESSED_VERY + hit_threshhold = LATTICE_LAYER + var/line + +/obj/projectile/tether/fire(setAngle) + if(firer) + line = firer.Beam(src, "line", 'icons/obj/clothing/modsuit/mod_modules.dmi') + ..() + +/obj/projectile/tether/on_hit(atom/target) + . = ..() + if(firer) + firer.throw_at(target, 10, 1, firer, FALSE, FALSE, null, MOVE_FORCE_NORMAL, TRUE) + +/obj/projectile/tether/Destroy() + QDEL_NULL(line) + return ..() + +/* +//Radiation Protection + +/obj/item/mod/module/rad_protection + name = "MOD radiation protection module" + desc = "A module utilizing polymers and reflective shielding to protect the user against ionizing radiation; \ + a common danger in space. This comes with software to notify the wearer that they're even in a radioactive area, \ + giving a voice to an otherwise silent killer." + icon_state = "radshield" + complexity = 2 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/rad_protection) + tgui_id = "rad_counter" + var/perceived_threat_level + +/obj/item/mod/module/rad_protection/on_suit_activation() + AddComponent(/datum/component/geiger_sound) + ADD_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) + RegisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION, .proc/on_pre_potential_irradiation) + for(var/obj/item/part in mod.mod_parts) + ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) + +/obj/item/mod/module/rad_protection/on_suit_deactivation() + qdel(GetComponent(/datum/component/geiger_sound)) + REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) + UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION) + for(var/obj/item/part in mod.mod_parts) + REMOVE_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) + +/obj/item/mod/module/rad_protection/add_ui_data() + . = ..() + .["userradiated"] = mod.wearer ? HAS_TRAIT(mod.wearer, TRAIT_IRRADIATED) : 0 + .["usertoxins"] = mod.wearer ? mod.wearer.getToxLoss() : 0 + .["threatlevel"] = perceived_threat_level + +/obj/item/mod/module/rad_protection/proc/on_pre_potential_irradiation(datum/source, datum/radiation_pulse_information/pulse_information, insulation_to_target) + SIGNAL_HANDLER + + perceived_threat_level = get_perceived_radiation_danger(pulse_information, insulation_to_target) + addtimer(VARSET_CALLBACK(src, perceived_threat_level, null), TIME_WITHOUT_RADIATION_BEFORE_RESET, TIMER_UNIQUE | TIMER_OVERRIDE) +*/ + +//Constructor + +/obj/item/mod/module/constructor + name = "MOD constructor module" + desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \ + advanced arm servos meant to carry crewmembers. However, it functions as an \ + extremely advanced construction hologram scanner, as well as containing the \ + latest engineering schematics combined with inbuilt memory to help the user build walls." + icon_state = "constructor" + module_type = MODULE_USABLE + complexity = 2 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.2 + use_power_cost = DEFAULT_CELL_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) + cooldown_time = 11 SECONDS + +/obj/item/mod/module/constructor/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) + +/obj/item/mod/module/constructor/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) + +/obj/item/mod/module/constructor/on_use() + . = ..() + if(!.) + return + rcd_scan(src, fade_time = 10 SECONDS) + drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm new file mode 100644 index 0000000000000..2021b6823985c --- /dev/null +++ b/code/modules/mod/modules/modules_general.dm @@ -0,0 +1,654 @@ +//General modules for MODsuits + +//Storage + +/obj/item/mod/module/storage + name = "MOD storage module" + desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \ + the surface of the suit, useful for storing various bits, and or bobs." + icon_state = "storage" + complexity = 3 + incompatible_modules = list(/obj/item/mod/module/storage) + var/datum/component/storage/concrete/storage + var/max_w_class = WEIGHT_CLASS_NORMAL + var/max_combined_w_class = 15 + var/max_items = 7 + +/obj/item/mod/module/storage/Initialize(mapload) + . = ..() + storage = AddComponent(/datum/component/storage/concrete) + storage.max_w_class = max_w_class + storage.max_combined_w_class = max_combined_w_class + storage.max_items = max_items + storage.allow_big_nesting = TRUE + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + +/obj/item/mod/module/storage/on_install() + var/datum/component/storage/modstorage = mod.AddComponent(/datum/component/storage, storage) + modstorage.max_w_class = max_w_class + modstorage.max_combined_w_class = max_combined_w_class + modstorage.max_items = max_items + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) + +/obj/item/mod/module/storage/on_uninstall() + var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage) + storage.slaves -= modstorage + qdel(modstorage) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) + +/obj/item/mod/module/storage/large_capacity + name = "MOD expanded storage module" + desc = "Reverse engineered by Nakamura Engineering from Donk Corporation designs, this system of hidden compartments \ + is entirely within the suit, distributing items and weight evenly to ensure a comfortable experience for the user; \ + whether smuggling, or simply hauling." + icon_state = "storage_large" + max_combined_w_class = 21 + max_items = 14 + +/obj/item/mod/module/storage/syndicate + name = "MOD syndicate storage module" + desc = "A storage system using nanotechnology developed by Cybersun Industries, these compartments use \ + esoteric technology to compress the physical matter of items put inside of them, \ + essentially shrinking items for much easier and more portable storage." + icon_state = "storage_syndi" + max_combined_w_class = 30 + max_items = 21 + +/obj/item/mod/module/storage/bluespace + name = "MOD bluespace storage module" + desc = "A storage system developed by Nanotrasen, these compartments employ \ + miniaturized bluespace pockets for the ultimate in storage technology; regardless of the weight of objects put inside." + icon_state = "storage_large" + max_w_class = WEIGHT_CLASS_GIGANTIC + max_combined_w_class = 60 + max_items = 21 + + +//Ion Jetpack + +/obj/item/mod/module/jetpack + name = "MOD ion jetpack module" + desc = "A series of electric thrusters installed across the suit, this is a module highly anticipated by trainee Engineers. \ + Rather than using gasses for combustion thrust, these jets are capable of accelerating ions using \ + charge from the suit's cell. Some say this isn't Nakamura Engineering's first foray into jet-enabled suits." + icon_state = "jetpack" + module_type = MODULE_TOGGLE + complexity = 3 + active_power_cost = DEFAULT_CELL_DRAIN * 0.5 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/jetpack) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_jetpack" + overlay_state_active = "module_jetpack_on" + var/stabilizers = FALSE + var/full_speed = FALSE + var/datum/effect_system/trail_follow/ion/ion_trail + +/obj/item/mod/module/jetpack/Initialize(mapload) + . = ..() + ion_trail = new + ion_trail.auto_process = FALSE + ion_trail.set_up(src) + +/obj/item/mod/module/jetpack/Destroy() + QDEL_NULL(ion_trail) + return ..() + +/obj/item/mod/module/jetpack/on_activation() + . = ..() + if(!.) + return + ion_trail.start() + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/move_react) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE, .proc/pre_move_react) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react) + if(full_speed) + mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) + +/obj/item/mod/module/jetpack/on_deactivation(mob/user) + . = ..() + if(!.) + return + ion_trail.stop() + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_PRE_MOVE) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_SPACEMOVE) + if(full_speed) + mod.wearer.remove_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) + +/obj/item/mod/module/jetpack/get_configuration() + . = ..() + .["stabilizers"] = add_ui_configuration("Stabilizers", "bool", stabilizers) + +/obj/item/mod/module/jetpack/configure_edit(key, value) + switch(key) + if("stabilizers") + stabilizers = text2num(value) + +/obj/item/mod/module/jetpack/proc/move_react(mob/user) + SIGNAL_HANDLER + + if(!active)//If jet dont work, it dont work + return + if(!isturf(mod.wearer.loc))//You can't use jet in nowhere or from mecha/closet + return + if(!(mod.wearer.movement_type & FLOATING) || mod.wearer.buckled)//You don't want use jet in gravity or while buckled. + return + if(mod.wearer.pulledby)//You don't must use jet if someone pull you + return + if(mod.wearer.throwing)//You don't must use jet if you thrown + return + if(user.client && length(user.client.keys_held))//You use jet when press keys. yes. + allow_thrust() + +/obj/item/mod/module/jetpack/proc/pre_move_react(mob/user) + SIGNAL_HANDLER + + ion_trail.oldposition = get_turf(src) + +/obj/item/mod/module/jetpack/proc/spacemove_react(mob/user, movement_dir) + SIGNAL_HANDLER + + if(active && (stabilizers || movement_dir)) + return COMSIG_MOVABLE_STOP_SPACEMOVE + +/obj/item/mod/module/jetpack/proc/allow_thrust() + if(!drain_power(use_power_cost)) + return + ion_trail.generate_effect() + return TRUE + +//Eating Apparatus + +/obj/item/mod/module/mouthhole + name = "MOD eating apparatus module" + desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \ + to allow eating and drinking while retaining protection and atmosphere. \ + However, it will do nothing to improve the taste of a goliath steak." + icon_state = "apparatus" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/mouthhole) + overlay_state_inactive = "module_apparatus" + var/former_flags = NONE + var/former_visor_flags = NONE + +/obj/item/mod/module/mouthhole/on_install() + former_flags = mod.helmet.flags_cover + former_visor_flags = mod.helmet.visor_flags_cover + mod.helmet.flags_cover &= ~HEADCOVERSMOUTH + mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH + +/obj/item/mod/module/mouthhole/on_uninstall() + if(!(former_flags & HEADCOVERSMOUTH)) + mod.helmet.flags_cover |= HEADCOVERSMOUTH + if(!(former_visor_flags & HEADCOVERSMOUTH)) + mod.helmet.visor_flags_cover |= HEADCOVERSMOUTH + +//EMP Shield + +/obj/item/mod/module/emp_shield + name = "MOD EMP shield module" + desc = "A field inhibitor installed into the suit, protecting it against feedback such as \ + electromagnetic pulses that would otherwise damage the electronic systems of the suit or devices on the wearer. \ + However, it will take from the suit's power to do so. Luckily, your PDA already has one of these." + icon_state = "empshield" + complexity = 1 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/emp_shield) + +/obj/item/mod/module/emp_shield/on_install() + mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + +/obj/item/mod/module/emp_shield/on_uninstall() + mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + +//Flashlight + +/obj/item/mod/module/flashlight + name = "MOD flashlight module" + desc = "A simple pair of flashlights installed on the left and right sides of the helmet, \ + useful for providing light in a variety of ranges and colors. \ + Some survivalists prefer the color green for their illumination, for reasons unknown." + icon_state = "flashlight" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/flashlight) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_light" + light_system = MOVABLE_LIGHT_DIRECTIONAL + light_color = COLOR_WHITE + light_range = 3 + light_power = 1 + light_on = FALSE + var/base_power = DEFAULT_CELL_DRAIN * 0.1 + var/min_range = 2 + var/max_range = 5 + +/obj/item/mod/module/flashlight/on_activation() + . = ..() + if(!.) + return + set_light_flags(light_flags | LIGHT_ATTACHED) + set_light_on(active) + active_power_cost = base_power * light_range + +/obj/item/mod/module/flashlight/on_deactivation() + . = ..() + if(!.) + return + set_light_flags(light_flags & ~LIGHT_ATTACHED) + set_light_on(active) + +/obj/item/mod/module/flashlight/on_process(delta_time) + . = ..() + if(!.) + return + active_power_cost = base_power * light_range + +/obj/item/mod/module/flashlight/generate_worn_overlay(mutable_appearance/standing) + . = ..() + if(!active) + return + var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on", layer = standing.layer + 0.2) + light_icon.appearance_flags = RESET_COLOR + light_icon.color = light_color + . += light_icon + +/obj/item/mod/module/flashlight/get_configuration() + . = ..() + .["light_color"] = add_ui_configuration("Light Color", "color", light_color) + .["light_range"] = add_ui_configuration("Light Range", "number", light_range) + +/obj/item/mod/module/flashlight/configure_edit(key, value) + switch(key) + if("light_color") + value = input(usr, "Pick new light color", "Flashlight Color") as color|null + if(!value) + return + if(is_color_dark(value, 50)) + balloon_alert(mod.wearer, "too dark!") + return + set_light_color(value) + mod.wearer.update_inv_back() + if("light_range") + set_light_range(clamp(value, min_range, max_range)) + +//Dispenser + +/obj/item/mod/module/dispenser + name = "MOD burger dispenser module" + desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \ + This can draw incredible amounts of power from the suit's cell to create edible organic matter in the \ + palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \ + Notably, all attempts to get it to dispense Earl Grey tea have failed." + icon_state = "dispenser" + module_type = MODULE_USABLE + complexity = 3 + use_power_cost = DEFAULT_CELL_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/dispenser) + cooldown_time = 5 SECONDS + var/dispense_type = /obj/item/food/burger/plain + var/dispense_time = 0 SECONDS + +/obj/item/mod/module/dispenser/on_use() + . = ..() + if(!.) + return + if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod)) + balloon_alert(mod.wearer, "interrupted!") + return + var/obj/item/dispensed = new dispense_type(mod.wearer.loc) + mod.wearer.put_in_hands(dispensed) + balloon_alert(mod.wearer, "[dispensed] dispensed") + playsound(src, 'sound/machines/click.ogg', 100, TRUE) + drain_power(use_power_cost) + +//Longfall + +/obj/item/mod/module/longfall + name = "MOD longfall module" + desc = "Useful for protecting both the suit and the wearer, \ + utilizing commonplace systems to convert the possible damage from a fall into kinetic charge, \ + as well as internal gyroscopes to ensure the user's safe falling. \ + Useful for mining, monorail tracks, or even skydiving!" + icon_state = "longfall" + complexity = 1 + use_power_cost = DEFAULT_CELL_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/longfall) + +/obj/item/mod/module/longfall/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, .proc/z_impact_react) + +/obj/item/mod/module/longfall/on_suit_deactivation() + UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) + +/obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) + if(!drain_power(use_power_cost*levels)) + return + new /obj/effect/temp_visual/mook_dust(fell_on) + mod.wearer.Stun(levels * 1 SECONDS) + to_chat(mod.wearer, "[src] protects you from the damage!") + return NO_Z_IMPACT_DAMAGE + +//Thermal Regulator + +/obj/item/mod/module/thermal_regulator + name = "MOD thermal regulator module" + desc = "Advanced climate control, using an inner body glove interwoven with thousands of tiny, \ + flexible cooling lines. This circulates coolant at various user-controlled temperatures, \ + ensuring they're comfortable; even if they're some that like it hot." + icon_state = "regulator" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/thermal_regulator) + cooldown_time = 0.5 SECONDS + var/temperature_setting = BODYTEMP_NORMAL + var/min_temp = 293.15 + var/max_temp = 318.15 + +/obj/item/mod/module/thermal_regulator/get_configuration() + . = ..() + .["temperature_setting"] = add_ui_configuration("Temperature", "number", temperature_setting - T0C) + +/obj/item/mod/module/thermal_regulator/configure_edit(key, value) + switch(key) + if("temperature_setting") + temperature_setting = clamp(value + T0C, min_temp, max_temp) + +/obj/item/mod/module/thermal_regulator/on_active_process(delta_time) + mod.wearer.adjust_bodytemperature(get_temp_change_amount((temperature_setting - mod.wearer.bodytemperature), 0.08 * delta_time)) + +//Pathfinder + +/obj/item/mod/module/pathfinder + name = "MOD pathfinder module" + desc = "This module, brought to you by Nakamura Engineering, has two components. \ + The first component is a series of thrusters and a computerized location subroutine installed into the \ + very control unit of the suit, allowing it flight at highway speeds, \ + and to be able to locate the second part of the system; \ + a pathfinding implant installed into the base of the user's spine, \ + broadcasting their location to the suit and allowing them to recall it to their back at any time. \ + Nakamura Engineering swears up and down there's airbrakes." + icon_state = "pathfinder" + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 10 + incompatible_modules = list(/obj/item/mod/module/pathfinder) + var/obj/item/implant/mod/implant + +/obj/item/mod/module/pathfinder/Initialize(mapload) + . = ..() + implant = new(src) + +/obj/item/mod/module/pathfinder/Destroy() + implant = null + return ..() + +/obj/item/mod/module/pathfinder/examine(mob/user) + . = ..() + if(implant) + . += "Use it on a human to implant them." + else + . += "The implant is missing." + +/obj/item/mod/module/pathfinder/attack(mob/living/target, mob/living/user, params) + if(!ishuman(target) || !implant) + return + if(!do_after(user, 1.5 SECONDS, target = target)) + balloon_alert(user, "interrupted!") + return + if(!implant.implant(target, user)) + balloon_alert(user, "can't implant!") + return + if(target == user) + to_chat(user, "You implant yourself with [implant].") + else + target.visible_message("[user] implants [target].", "[user] implants you with [implant].") + playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) + icon_state = "pathfinder_empty" + implant = null + +/obj/item/mod/module/pathfinder/proc/attach(mob/living/user) + if(!ishuman(user)) + return + var/mob/living/carbon/human/human_user = user + if(human_user.back && !human_user.dropItemToGround(human_user.back)) + return + if(!human_user.equip_to_slot_if_possible(mod, mod.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + human_user.update_action_buttons(TRUE) + balloon_alert(human_user, "[mod] attached") + playsound(mod, 'sound/machines/ping.ogg', 50, TRUE) + drain_power(use_power_cost) + +/obj/item/implant/mod + name = "MOD pathfinder implant" + desc = "Lets you recall a MODsuit to you at any time." + actions_types = list(/datum/action/item_action/mod_recall) + var/obj/item/mod/module/pathfinder/module + var/image/jet_icon + +/obj/item/implant/mod/Initialize(mapload) + . = ..() + if(!istype(loc, /obj/item/mod/module/pathfinder)) + return INITIALIZE_HINT_QDEL + module = loc + jet_icon = image(icon = 'icons/obj/clothing/modsuit/mod_modules.dmi', icon_state = "mod_jet", layer = LOW_ITEM_LAYER) + +/obj/item/implant/mod/Destroy() + if(module?.mod?.ai_controller) + end_recall(successful = FALSE) + module = null + jet_icon = null + return ..() + +/obj/item/implant/mod/get_data() + var/dat = {"Implant Specifications:
+ Name: Nakamura Engineering Pathfinder Implant
+ Implant Details: Allows for the recall of a Modular Outerwear Device by the implant owner at any time.
"} + return dat + +/obj/item/implant/mod/proc/recall() + if(!module?.mod) + balloon_alert(imp_in, "no connected suit!") + return FALSE + if(module.mod.open) + balloon_alert(imp_in, "suit is open!") + return FALSE + if(module.mod.ai_controller) + balloon_alert(imp_in, "already in transit!") + return FALSE + if(ismob(get_atom_on_turf(module.mod))) + balloon_alert(imp_in, "already on someone!") + return FALSE + if(module.z != z || get_dist(imp_in, module.mod) > MOD_AI_RANGE) + balloon_alert(imp_in, "too far away!") + return FALSE + var/datum/ai_controller/mod_ai = new /datum/ai_controller/mod(module.mod) + module.mod.ai_controller = mod_ai + mod_ai.current_movement_target = imp_in + mod_ai.blackboard[BB_MOD_TARGET] = imp_in + mod_ai.blackboard[BB_MOD_IMPLANT] = src + module.mod.interaction_flags_item &= ~INTERACT_ITEM_ATTACK_HAND_PICKUP + //module.mod.AddElement(/datum/element/movetype_handler) + //ADD_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) + animate(module.mod, 0.2 SECONDS, pixel_x = base_pixel_y, pixel_y = base_pixel_y) + module.mod.add_overlay(jet_icon) + RegisterSignal(module.mod, COMSIG_MOVABLE_MOVED, .proc/on_move) + balloon_alert(imp_in, "suit recalled") + return TRUE + +/obj/item/implant/mod/proc/end_recall(successful = TRUE) + if(!module?.mod) + return + QDEL_NULL(module.mod.ai_controller) + module.mod.interaction_flags_item |= INTERACT_ITEM_ATTACK_HAND_PICKUP + //REMOVE_TRAIT(module.mod, TRAIT_MOVE_FLYING, MOD_TRAIT) + //module.mod.RemoveElement(/datum/element/movetype_handler) + module.mod.cut_overlay(jet_icon) + module.mod.transform = matrix() + UnregisterSignal(module.mod, COMSIG_MOVABLE_MOVED) + if(!successful) + balloon_alert(imp_in, "suit lost connection!") + +/obj/item/implant/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + var/matrix/mod_matrix = matrix() + mod_matrix.Turn(get_angle(source, imp_in)) + source.transform = mod_matrix + +/datum/action/item_action/mod_recall + name = "Recall MOD" + desc = "Recall a MODsuit anyplace, anytime." + check_flags = AB_CHECK_CONSCIOUS + background_icon_state = "bg_tech_blue" + icon_icon = 'icons/mob/actions/actions_mod.dmi' + button_icon_state = "recall" + COOLDOWN_DECLARE(recall_cooldown) + var/obj/item/implant/mod/implant + +/datum/action/item_action/mod_recall/New(Target) + ..() + implant = Target + +/datum/action/item_action/mod_recall/Trigger() + . = ..() + if(!.) + return + if(!COOLDOWN_FINISHED(src, recall_cooldown)) + implant.balloon_alert(implant.imp_in, "on cooldown!") + return + if(implant.recall()) + COOLDOWN_START(src, recall_cooldown, 15 SECONDS) + +//DNA Lock + +/obj/item/mod/module/dna_lock + name = "MOD DNA lock module" + desc = "A module which engages with the various locks and seals tied to the suit's systems, \ + enabling it to only be worn by someone corresponding with the user's exact DNA profile; \ + however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." + icon_state = "dnalock" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 3 + incompatible_modules = list(/obj/item/mod/module/dna_lock) + cooldown_time = 0.5 SECONDS + var/dna = null + +/obj/item/mod/module/dna_lock/on_install() + RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) + RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, .proc/on_mod_removal) + RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp) + //RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, .proc/on_emag) + +/obj/item/mod/module/dna_lock/on_uninstall() + UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) + UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) + UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) + //UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT) + +/obj/item/mod/module/dna_lock/on_use() + . = ..() + if(!.) + return + dna = mod.wearer.dna.unique_enzymes + balloon_alert(mod.wearer, "dna updated") + drain_power(use_power_cost) + +/obj/item/mod/module/dna_lock/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + on_emp(src, severity) + +/obj/item/mod/module/dna_lock/proc/dna_check() + if(!dna || (mod.wearer.has_dna() && mod.wearer.dna.unique_enzymes == dna)) + return TRUE + balloon_alert(mod.wearer, "dna locked!") + return FALSE + +/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity) + SIGNAL_HANDLER + + dna = null + +/obj/item/mod/module/dna_lock/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card) + ..() + SIGNAL_HANDLER + + dna = null + +/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source) + SIGNAL_HANDLER + + if(!dna_check()) + return MOD_CANCEL_ACTIVATE + +/obj/item/mod/module/dna_lock/proc/on_mod_removal(datum/source) + SIGNAL_HANDLER + + if(!dna_check()) + return MOD_CANCEL_REMOVAL + +//Plasma Stabilizer + +/obj/item/mod/module/plasma_stabilizer + name = "MOD plasma stabilizer module" + desc = "This system essentially forms an atmosphere of its' own inside the suit, \ + safely ejecting oxygen from the inside and allowing the wearer, a plasmaman, \ + to have their internal plasma circulate around them somewhat like a sauna. \ + This prevents them from self-igniting, and leads to greater comfort overall. \ + The purple glass of the visor seems to be constructed for nostalgic purposes." + icon_state = "plasma_stabilizer" + complexity = 1 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/plasma_stabilizer) + overlay_state_inactive = "module_plasma" + +/obj/item/mod/module/plasma_stabilizer/on_equip() + ADD_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) + +/obj/item/mod/module/plasma_stabilizer/on_unequip() + REMOVE_TRAIT(mod.wearer, TRAIT_NOSELFIGNITION, MOD_TRAIT) + +//Kinesis + +/obj/item/mod/module/kinesis //TODO POST-MERGE MAKE NOT SUCK ASS, MAKE BALLER AS FUCK + name = "MOD kinesis module" + desc = "A modular plug-in to the forearm, this module was presumed lost for many years, \ + despite the suits it used to be mounted on still seeing some circulation. \ + This piece of technology allows the user to generate precise anti-gravity fields, \ + letting them move objects as small as a titanium rod to as large as industrial machinery. \ + Oddly enough, it doesn't seem to work on living creatures." + icon_state = "kinesis" +// module_type = MODULE_ACTIVE + module_type = MODULE_TOGGLE +// complexity = 3 + complexity = 0 + active_power_cost = DEFAULT_CELL_DRAIN*0.75 +// use_power_cost = DEFAULT_CELL_DRAIN*3 + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/kinesis) + cooldown_time = 0.5 SECONDS + var/has_tk = FALSE + +/obj/item/mod/module/kinesis/on_activation() + . = ..() + if(!.) + return + if(mod.wearer.dna.check_mutation(TK)) + has_tk = TRUE + else + mod.wearer.dna.add_mutation(TK) + +/obj/item/mod/module/kinesis/on_deactivation() + . = ..() + if(!.) + return + if(has_tk) + has_tk = FALSE + return + mod.wearer.dna.remove_mutation(TK) diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm new file mode 100644 index 0000000000000..df31f4cdac584 --- /dev/null +++ b/code/modules/mod/modules/modules_medical.dm @@ -0,0 +1,203 @@ +//Medical modules for MODsuits + +//Health Analyzer + +#define HEALTH_SCAN "Health" +//#define WOUND_SCAN "Wound" +#define CHEM_SCAN "Chemical" + +/obj/item/mod/module/health_analyzer + name = "MOD health analyzer module" + desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \ + allowing the user indepth information on the vitals and injuries of others even at a distance, \ + all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \ + but it's up to you to do something with it." + icon_state = "health" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/health_analyzer) + cooldown_time = 0.5 SECONDS + var/mode = HEALTH_SCAN + var/static/list/modes = list(HEALTH_SCAN, /*WOUND_SCAN,*/ CHEM_SCAN) + +/obj/item/mod/module/health_analyzer/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!isliving(target)) + return + switch(mode) + if(HEALTH_SCAN) + healthscan(mod.wearer, target) + //if(WOUND_SCAN) + // woundscan(mod.wearer, target) + if(CHEM_SCAN) + chemscan(mod.wearer, target) + drain_power(use_power_cost) + +/obj/item/mod/module/health_analyzer/get_configuration() + . = ..() + .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) + +/obj/item/mod/module/health_analyzer/configure_edit(key, value) + switch(key) + if("mode") + mode = value + +#undef HEALTH_SCAN +//#undef WOUND_SCAN +#undef CHEM_SCAN + +//Quick Carry + +/obj/item/mod/module/quick_carry + name = "MOD quick carry module" + desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \ + or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat." + icon_state = "carry" + complexity = 1 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) + +/obj/item/mod/module/quick_carry/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/advanced + name = "MOD advanced quick carry module" + removable = FALSE + complexity = 0 + +/obj/item/mod/module/quick_carry/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) + +//Injector + +/obj/item/mod/module/injector + name = "MOD injector module" + desc = "A module installed into the wrist of the suit, this functions as a high-capacity syringe, \ + with a tip fine enough to locate the emergency injection ports on any suit of armor, \ + penetrating it with ease. Even yours." + icon_state = "injector" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + device = /obj/item/reagent_containers/syringe/mod + incompatible_modules = list(/obj/item/mod/module/injector) + cooldown_time = 0.5 SECONDS + +/obj/item/reagent_containers/syringe/mod + name = "MOD injector syringe" + desc = "A high-capacity syringe, with a tip fine enough to locate \ + the emergency injection ports on any suit of armor, penetrating it with ease. Even yours." + icon_state = "mod_0" + base_icon_state = "mod" + amount_per_transfer_from_this = 30 + possible_transfer_amounts = list(5, 10, 15, 20, 30) + volume = 30 + //inject_flags = INJECT_CHECK_PENETRATE_THICK + +//Organ Thrower + +/obj/item/mod/module/organ_thrower + name = "MOD organ thrower module" + desc = "A device recovered from a crashed Interdyne Pharmaceuticals vessel, \ + this module has been unearthed for better or for worse. \ + It's an arm-mounted device utilizing technology similar to modern-day part replacers, \ + capable of storing and inserting organs into open patients. \ + It's recommended by the DeForest Medical Corporation to not inform patients it has been used." + icon_state = "organ_thrower" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/organ_thrower) + cooldown_time = 0.5 SECONDS + var/max_organs = 5 + var/organ_list = list() + +/obj/item/mod/module/organ_thrower/on_select_use(atom/target) + . = ..() + if(!.) + return + var/mob/living/carbon/human/wearer_human = mod.wearer + if(istype(target, /obj/item/organ)) + if(!wearer_human.Adjacent(target)) + return + var/atom/movable/organ = target + if(length(organ_list) >= max_organs) + balloon_alert(mod.wearer, "too many organs!") + return + organ_list += organ + organ.forceMove(src) + balloon_alert(mod.wearer, "picked up [organ]") + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + drain_power(use_power_cost) + return + if(!length(organ_list)) + return + var/atom/movable/fired_organ = pop(organ_list) + var/obj/projectile/organ/projectile = new /obj/projectile/organ(mod.wearer.loc, fired_organ) + projectile.preparePixelProjectile(target, mod.wearer) + projectile.firer = mod.wearer + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + INVOKE_ASYNC(projectile, /obj/projectile.proc/fire) + drain_power(use_power_cost) + +/obj/projectile/organ + name = "organ" + damage = 0 + nodamage = TRUE + hitsound = 'sound/effects/attackblob.ogg' + hitsound_wall = 'sound/effects/attackblob.ogg' + var/obj/item/organ/organ + +/obj/projectile/organ/Initialize(mapload, obj/item/stored_organ) + . = ..() + if(!stored_organ) + return INITIALIZE_HINT_QDEL + appearance = stored_organ.appearance + stored_organ.forceMove(src) + organ = stored_organ + +/obj/projectile/organ/Destroy() + organ = null + return ..() + +/obj/projectile/organ/on_hit(atom/target) + . = ..() + if(!ishuman(target)) + organ.forceMove(drop_location()) + organ = null + return + var/mob/living/carbon/human/organ_receiver = target + var/succeed = FALSE + if(organ_receiver.surgeries.len) + for(var/datum/surgery/procedure as anything in organ_receiver.surgeries) + if(procedure.location != organ.zone) + continue + if(!istype(procedure, /datum/surgery/organ_manipulation)) + continue + var/datum/surgery_step/surgery_step = procedure.get_surgery_step() + if(!istype(surgery_step, /datum/surgery_step/manipulate_organs)) + continue + succeed = TRUE + break + if(succeed) + var/list/organs_to_boot_out = organ_receiver.getorganslot(organ.slot) + for(var/obj/item/organ/organ_evacced as anything in organs_to_boot_out) + if(organ_evacced.organ_flags & ORGAN_UNREMOVABLE) + continue + organ_evacced.Remove(target) + organ_evacced.forceMove(get_turf(target)) + organ.Insert(target) + else + organ.forceMove(drop_location()) + organ = null diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm new file mode 100644 index 0000000000000..9ad0f038b36f7 --- /dev/null +++ b/code/modules/mod/modules/modules_science.dm @@ -0,0 +1,162 @@ +//Science modules for MODsuits + +//Reagent Scanner + +/obj/item/mod/module/reagent_scanner + name = "MOD reagent scanner module" + desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \ + containers and projecting the information in an easy-to-read format on the wearer's display. \ + It cannot detect flavors, so that's up to you." + icon_state = "scanner" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/reagent_scanner) + cooldown_time = 0.5 SECONDS + +/obj/item/mod/module/reagent_scanner/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) + +/obj/item/mod/module/reagent_scanner/on_deactivation() + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) + +/obj/item/mod/module/reagent_scanner/advanced + name = "MOD advanced reagent scanner module" + complexity = 0 + removable = FALSE + var/explosion_detection_dist = 21 + +/obj/item/mod/module/reagent_scanner/advanced/on_activation() + . = ..() + if(!.) + return + mod.wearer.research_scanner++ + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) + +/obj/item/mod/module/reagent_scanner/advanced/on_deactivation() + . = ..() + if(!.) + return + mod.wearer.research_scanner-- + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) + +/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter, + devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) + SIGNAL_HANDLER + var/turf/wearer_turf = get_turf(mod.wearer) + if(wearer_turf.z != epicenter.z) + return + if(get_dist(epicenter, wearer_turf) > explosion_detection_dist) + return + to_chat(mod.wearer, "Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]") + +//Circuit Adapter + +/obj/item/mod/module/circuit + name = "MOD circuit adapter module" + desc = "A popular aftermarket module, seen in wide varieties with wide applications by those across the galaxy. \ + This is able to fit any sort of integrated circuit, hooking it into controls in the suit and displaying information \ + to the HUD. Useful for universal translation, or perhaps as a calculator." + module_type = MODULE_USABLE + complexity = 3 + idle_power_cost = DEFAULT_CELL_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/circuit) + cooldown_time = 0.5 SECONDS + var/obj/item/integrated_circuit/circuit + +/obj/item/mod/module/circuit/Initialize(mapload) + . = ..() + circuit = new() + AddComponent(/datum/component/shell, \ + list(new /obj/item/circuit_component/mod()), \ + capacity = SHELL_CAPACITY_LARGE, \ + shell_flags = SHELL_FLAG_CIRCUIT_UNREMOVABLE, \ + starting_circuit = circuit, \ + ) + +/obj/item/mod/module/circuit/on_install() + circuit.set_cell(mod.cell) + +/obj/item/mod/module/circuit/on_uninstall() + circuit.set_cell(mod.cell) + +/obj/item/mod/module/circuit/on_suit_activation() + circuit.set_on(TRUE) + +/obj/item/mod/module/circuit/on_suit_deactivation() + circuit.set_on(FALSE) + +/obj/item/mod/module/circuit/on_use() + . = ..() + if(!.) + return + circuit.interact(mod.wearer) + +/obj/item/circuit_component/mod + display_name = "MOD" + desc = "Used to send and receive signals from a MODsuit." + + var/obj/item/mod/module/attached_module + + var/datum/port/input/module_to_select + var/datum/port/input/toggle_suit + var/datum/port/input/select_module + + var/datum/port/output/wearer + var/datum/port/output/selected_module + +/obj/item/circuit_component/mod/populate_ports() + // Input Signals + module_to_select = add_input_port("Module to Select", PORT_TYPE_STRING) + toggle_suit = add_input_port("Toggle Suit", PORT_TYPE_SIGNAL) + select_module = add_input_port("Select Module", PORT_TYPE_SIGNAL) + // States + wearer = add_output_port("Wearer", PORT_TYPE_ATOM) + selected_module = add_output_port("Selected Module", PORT_TYPE_ATOM) + +/obj/item/circuit_component/mod/register_shell(atom/movable/shell) + if(istype(shell, /obj/item/mod/module)) + attached_module = shell + RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move) + +/obj/item/circuit_component/mod/unregister_shell(atom/movable/shell) + UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) + attached_module = null + +/obj/item/circuit_component/mod/input_received(datum/port/input/port) + var/obj/item/mod/module/module + for(var/obj/item/mod/module/potential_module as anything in attached_module.mod.modules) + if(potential_module.name == module_to_select.value) + module = potential_module + if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) + INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/toggle_activate, attached_module.mod.wearer) + if(module && COMPONENT_TRIGGERED_BY(select_module, port)) + INVOKE_ASYNC(module, /obj/item/mod/module.proc/on_select) + +/obj/item/circuit_component/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + if(istype(source.loc, /obj/item/mod/control)) + RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select) + RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, .proc/equip_check) + equip_check() + else if(istype(old_loc, /obj/item/mod/control)) + UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) + selected_module.set_output(null) + wearer.set_output(null) + +/obj/item/circuit_component/mod/proc/on_module_select() + SIGNAL_HANDLER + selected_module.set_output(attached_module.mod.selected_module) + +/obj/item/circuit_component/mod/proc/equip_check() + SIGNAL_HANDLER + + if(!attached_module.mod?.wearer) + return + wearer.set_output(attached_module.mod.wearer) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm new file mode 100644 index 0000000000000..d0d7ce5f8d7d9 --- /dev/null +++ b/code/modules/mod/modules/modules_security.dm @@ -0,0 +1,125 @@ +//Security modules for MODsuits + +//Cloaking + +/obj/item/mod/module/stealth + name = "MOD prototype cloaking module" + desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \ + to bend light around the user, as well as mimetic materials to make the surface of the suit match the \ + surroundings based off sensor data. For some reason, this tech is rarely seen." + icon_state = "cloak" + module_type = MODULE_TOGGLE + complexity = 4 + active_power_cost = DEFAULT_CELL_DRAIN * 2 + use_power_cost = DEFAULT_CELL_DRAIN * 10 + incompatible_modules = list(/obj/item/mod/module/stealth) + cooldown_time = 5 SECONDS + var/bumpoff = TRUE + var/stealth_alpha = 50 + +/obj/item/mod/module/stealth/on_activation() + . = ..() + if(!.) + return + if(bumpoff) + RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth) + RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack) + RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) + RegisterSignal(mod.wearer, list(COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_ATTACK_PAW, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED), .proc/unstealth) + animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) + drain_power(use_power_cost) + +/obj/item/mod/module/stealth/on_deactivation() + . = ..() + if(!.) + return + if(bumpoff) + UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) + UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HITBY, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW, COMSIG_CARBON_CUFF_ATTEMPTED)) + animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) + +/obj/item/mod/module/stealth/proc/unstealth(datum/source) + SIGNAL_HANDLER + + to_chat(mod.wearer, "[src] gets discharged from contact!") + do_sparks(2, TRUE, src) + drain_power(use_power_cost) + on_deactivation() + +/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) + SIGNAL_HANDLER + + if(!isliving(target)) + return + unstealth(source) + +/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/projectile/projectile) + SIGNAL_HANDLER + + if(projectile.nodamage) + return + unstealth(source) + +/obj/item/mod/module/stealth/ninja + name = "MOD advanced cloaking module" + desc = "The latest in stealth technology, this module is a definite upgrade over previous versions. \ + The field has been tuned to be even more responsive and fast-acting, with enough stability to \ + continue operation of the field even if the user bumps into others. \ + The draw on the power cell has been reduced drastically, \ + making this perfect for activities like standing near sentry turrets for extended periods of time." + icon_state = "cloak_ninja" + bumpoff = FALSE + stealth_alpha = 20 + active_power_cost = DEFAULT_CELL_DRAIN + use_power_cost = DEFAULT_CELL_DRAIN * 5 + cooldown_time = 3 SECONDS + +//Holster + +/obj/item/mod/module/holster + name = "MOD holster module" + desc = "Based off typical storage compartments, this system allows the suit to holster a \ + standard firearm across its surface and allow for extremely quick retrieval. \ + While some users prefer the chest, others the forearm for quick deployment, \ + some law enforcement prefer the holster to extend from the thigh." + icon_state = "holster" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/holster) + cooldown_time = 0.5 SECONDS + var/obj/item/gun/holstered + +/obj/item/mod/module/holster/on_use() + . = ..() + if(!.) + return + if(!holstered) + var/obj/item/gun/holding = mod.wearer.get_active_held_item() + if(!holding) + balloon_alert(mod.wearer, "nothing to holster!") + return + if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) + balloon_alert(mod.wearer, "it doesn't fit!") + return + if(mod.wearer.transferItemToLoc(holding, src, FALSE, FALSE)) + holstered = holding + balloon_alert(mod.wearer, "weapon holstered") + playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) + drain_power(use_power_cost) + else if(mod.wearer.put_in_active_hand(holstered, FALSE, TRUE)) + balloon_alert(mod.wearer, "weapon drawn") + holstered = null + playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) + drain_power(use_power_cost) + else + balloon_alert(mod.wearer, "holster full!") + +/obj/item/mod/module/holster/on_uninstall() + if(holstered) + holstered.forceMove(drop_location()) + holstered = null + +/obj/item/mod/module/holster/Destroy() + QDEL_NULL(holstered) + return ..() diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm new file mode 100644 index 0000000000000..6712837aa0728 --- /dev/null +++ b/code/modules/mod/modules/modules_service.dm @@ -0,0 +1,58 @@ +//Service modules for MODsuits + +//Bike Horn + +/obj/item/mod/module/bikehorn + name = "MOD bike horn module" + desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \ + precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound." + icon_state = "bikehorn" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/bikehorn) + cooldown_time = 1 SECONDS + +/obj/item/mod/module/bikehorn/on_use() + . = ..() + if(!.) + return + playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) + drain_power(use_power_cost) + +//Microwave Beam + +/obj/item/mod/module/microwave_beam + name = "MOD microwave beam module" + desc = "An oddly domestic device, this module is installed into the user's palm, \ + hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \ + allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." + icon_state = "microwave_beam" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/microwave_beam) + cooldown_time = 10 SECONDS + +/obj/item/mod/module/microwave_beam/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!istype(target, /obj/item)) + return + if(!isturf(target.loc)) + balloon_alert(mod.wearer, "must be on the floor!") + return + var/obj/item/microwave_target = target + var/datum/effect_system/spark_spread/spark_effect = new() + spark_effect.set_up(2, 1, mod.wearer) + spark_effect.start() + mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) + if(microwave_target.microwave_act()) + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE) + else + balloon_alert(mod.wearer, "can't be microwaved!") + var/datum/effect_system/spark_spread/spark_effect_two = new() + spark_effect_two.set_up(2, 1, microwave_target) + spark_effect_two.start() + drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm new file mode 100644 index 0000000000000..5b6096b9d7956 --- /dev/null +++ b/code/modules/mod/modules/modules_supply.dm @@ -0,0 +1,169 @@ +//Supply modules for MODsuits + +//Internal GPS + +/obj/item/mod/module/gps + name = "MOD internal GPS module" + desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \ + down to the exact coordinates. This information is fed to a central database viewable from the device itself, \ + though using it to help people is up to you." + icon_state = "gps" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CELL_DRAIN * 0.3 + device = /obj/item/gps/mod + incompatible_modules = list(/obj/item/mod/module/gps) + cooldown_time = 0.5 SECONDS + +/obj/item/gps/mod + name = "MOD internal GPS" + desc = "Common Nanotrasen technology that calcaulates the user's position from anywhere in space, down to their coordinates." + icon_state = "gps-b" + gpstag = "MOD0" + +//Hydraulic Clamp + +/obj/item/mod/module/clamp + name = "MOD hydraulic clamp module" + desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \ + However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \ + A lot of people would say that loading cargo is a dull job, but you could not disagree more." + icon_state = "clamp" + module_type = MODULE_ACTIVE + complexity = 3 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/clamp) + cooldown_time = 0.5 SECONDS + var/max_crates = 5 + var/list/stored_crates = list() + +/obj/item/mod/module/clamp/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!mod.wearer.Adjacent(target)) + return + if(istype(target, /obj/structure/closet/crate)) + var/atom/movable/picked_crate = target + if(length(stored_crates) >= max_crates) + balloon_alert(mod.wearer, "too many crates!") + return + if(!do_after(mod.wearer, 1 SECONDS, target = target)) + balloon_alert(mod.wearer, "interrupted!") + return + stored_crates += picked_crate + picked_crate.forceMove(src) + balloon_alert(mod.wearer, "picked up [picked_crate]") + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + drain_power(use_power_cost) + else if(length(stored_crates)) + var/turf/target_turf = get_turf(target) + if(target_turf.is_blocked_turf()) + return + if(!do_after(mod.wearer, 1 SECONDS, target = target)) + balloon_alert(mod.wearer, "interrupted!") + return + if(target_turf.is_blocked_turf()) + return + var/atom/movable/dropped_crate = pop(stored_crates) + dropped_crate.forceMove(target_turf) + balloon_alert(mod.wearer, "dropped [dropped_crate]") + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + drain_power(use_power_cost) + +/obj/item/mod/module/clamp/on_uninstall() + for(var/atom/movable/crate as anything in stored_crates) + crate.forceMove(drop_location()) + stored_crates -= crate + +//Drill + +/obj/item/mod/module/drill + name = "MOD drill module" + desc = "An integrated drill, typically extending over the user's hand. While useful for drilling through rock, \ + your drill is surely the one that both pierces and creates the heavens." + icon_state = "drill" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN + incompatible_modules = list(/obj/item/mod/module/drill) + cooldown_time = 0.5 SECONDS + +/obj/item/mod/module/drill/on_activation() + . = ..() + if(!.) + return + RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, .proc/bump_mine) + +/obj/item/mod/module/drill/on_deactivation() + . = ..() + if(!.) + return + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP) + +/obj/item/mod/module/drill/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!mod.wearer.Adjacent(target)) + return + if(istype(target, /turf/closed/mineral)) + var/turf/closed/mineral/mineral_turf = target + mineral_turf.gets_drilled(mod.wearer) + drain_power(use_power_cost) + +/obj/item/mod/module/drill/proc/bump_mine(mob/living/carbon/human/bumper, atom/bumped_into, proximity) + SIGNAL_HANDLER + if(!istype(bumped_into, /turf/closed/mineral) || !drain_power(use_power_cost)) + return + var/turf/closed/mineral/mineral_turf = bumped_into + mineral_turf.gets_drilled(mod.wearer) + return COMPONENT_CANCEL_ATTACK_CHAIN + +//Ore Bag + +/obj/item/mod/module/orebag + name = "MOD ore bag module" + desc = "An integrated ore storage system installed into the suit, \ + this utilizes precise electromagnets and storage compartments to automatically collect and deposit ore. \ + It's recommended by Nakamura Engineering to actually deposit that ore at local refineries." + icon_state = "ore" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CELL_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/orebag) + cooldown_time = 0.5 SECONDS + var/list/ores = list() + +/obj/item/mod/module/orebag/on_equip() + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/ore_pickup) + +/obj/item/mod/module/orebag/on_unequip() + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + +/obj/item/mod/module/orebag/proc/ore_pickup(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + + for(var/obj/item/stack/ore/ore in get_turf(mod.wearer)) + INVOKE_ASYNC(src, .proc/move_ore, ore) + playsound(src, "rustle", 50, TRUE) + +/obj/item/mod/module/orebag/proc/move_ore(obj/item/stack/ore) + for(var/obj/item/stack/stored_ore as anything in ores) + if(!ore.can_merge(stored_ore)) + continue + ore.merge(stored_ore) + if(QDELETED(ore)) + return + break + ore.forceMove(src) + ores += ore + +/obj/item/mod/module/orebag/on_use() + . = ..() + if(!.) + return + for(var/obj/item/ore as anything in ores) + ore.forceMove(drop_location()) + ores -= ore + drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm new file mode 100644 index 0000000000000..563a140ea60d8 --- /dev/null +++ b/code/modules/mod/modules/modules_visor.dm @@ -0,0 +1,99 @@ +//Visor modules for MODsuits + +//Base Visor + +/obj/item/mod/module/visor + name = "MOD visor module" + desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CELL_DRAIN*0.3 + incompatible_modules = list(/obj/item/mod/module/visor) + cooldown_time = 0.5 SECONDS + var/hud_type + var/list/visor_traits = list() + +/obj/item/mod/module/visor/on_activation() + . = ..() + if(!.) + return + if(hud_type) + var/datum/atom_hud/hud = GLOB.huds[hud_type] + hud.add_hud_to(mod.wearer) + for(var/trait in visor_traits) + ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) + mod.wearer.update_sight() + +/obj/item/mod/module/visor/on_deactivation() + . = ..() + if(!.) + return + if(hud_type) + var/datum/atom_hud/hud = GLOB.huds[hud_type] + hud.remove_hud_from(mod.wearer) + for(var/trait in visor_traits) + REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT) + mod.wearer.update_sight() + +//Medical Visor + +/obj/item/mod/module/visor/medhud + name = "MOD medical visor module" + desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \ + biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \ + access data such as patient files in a convenient readout. They say these also let you see behind you." + icon_state = "medhud_visor" + hud_type = DATA_HUD_MEDICAL_ADVANCED + visor_traits = list(TRAIT_MEDICAL_HUD) + +//Diagnostic Visor + +/obj/item/mod/module/visor/diaghud + name = "MOD diagnostic visor module" + desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \ + from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \ + and integrity of such. They say these also let you see behind you." + icon_state = "diaghud_visor" + hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED + visor_traits = list(TRAIT_DIAGNOSTIC_HUD) + +//Security Visor + +/obj/item/mod/module/visor/sechud + name = "MOD security visor module" + desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \ + plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \ + and generally know who to shoot. They say these also let you see behind you." + icon_state = "sechud_visor" + hud_type = DATA_HUD_SECURITY_ADVANCED + visor_traits = list(TRAIT_SECURITY_HUD) + +//Meson Visor + +/obj/item/mod/module/visor/meson + name = "MOD meson visor module" + desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \ + technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \ + through walls, regardless of lighting conditions. They say these also let you see behind you." + icon_state = "meson_visor" + visor_traits = list(TRAIT_MESON_VISION, TRAIT_MADNESS_IMMUNE) + +//Thermal Visor + +/obj/item/mod/module/visor/thermal + name = "MOD thermal visor module" + desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \ + the thermal radiation output of objects near the user. While it can detect the heat output of even something as \ + small as a rodent, it still produces irritating red overlay. They say these also let you see behind you." + icon_state = "thermal_visor" + visor_traits = list(TRAIT_THERMAL_VISION) + +//Night Visor + +/obj/item/mod/module/visor/night + name = "MOD night visor module" + desc = "A heads-up display installed into the visor of the suit. Typical for both civilian and military applications, \ + this allows the user to perceive their surroundings while in complete darkness, enhancing the view by tenfold; \ + yet brightening everything into a spooky green glow. They say these also let you see behind you." + icon_state = "night_visor" + visor_traits = list(TRAIT_TRUE_NIGHT_VISION) diff --git a/code/modules/paperwork/handlabeler.dm b/code/modules/paperwork/handlabeler.dm index f0dd2c4295287..6ee1b9831f6f4 100644 --- a/code/modules/paperwork/handlabeler.dm +++ b/code/modules/paperwork/handlabeler.dm @@ -90,6 +90,9 @@ qdel(I) labels_left = initial(labels_left) //Yes, it's capped at its initial value +/obj/item/hand_labeler/attackby_storage_insert(datum/component/storage, atom/storage_holder, mob/user) + return !mode + /obj/item/hand_labeler/borg name = "cyborg-hand labeler" diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 67a75b4ba17ae..7b754ce3f7e1c 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1029,6 +1029,7 @@ id = "mod_welding" materials = list(/datum/material/iron = 500, /datum/material/glass = 500) build_path = /obj/item/mod/module/welding + department_type = MODULE_ENGINEERING /datum/design/module/mod_t_ray name = "MOD Module: T-Ray Scanner" @@ -1110,7 +1111,7 @@ id = "mod_reagent_scanner" materials = list(/datum/material/glass = 1000) build_path = /obj/item/mod/module/reagent_scanner - department_type = MODULE_MEDICAL + department_type = MODULE_SCIENCE /datum/design/module/mod_gps name = "MOD Module: Internal GPS" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 27e2a8d97735c..e2187621a4936 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -912,8 +912,12 @@ icon = 'icons/obj/chemical.dmi' icon_state = "potyellow" -/obj/item/slimepotion/speed/pre_attack(obj/thingy, mob/user) +/obj/item/slimepotion/speed/pre_attack(obj/thingy, mob/user, proximity) . = ..() + if(!proximity) + return + if(SEND_SIGNAL(thingy, COMSIG_SPEED_POTION_APPLIED, src, user) & SPEED_POTION_SUCCESSFUL) + return if(isitem(thingy)) var/obj/item/item = thingy if(item.anchored) @@ -947,6 +951,13 @@ qdel(src) return FALSE +/obj/item/slimepotion/speed/attackby_storage_insert(datum/component/storage, atom/storage_holder, mob/user) + . = ..() + if(!isitem(storage_holder)) + return + var/obj/item/storage_item = storage_holder + return storage_item.slowdown <= 0 + /obj/item/slimepotion/fireproof name = "slime chill potion" desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." From 0a8e722f1322878b184aeae6ca133c472e35eaf3 Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:22:13 -0400 Subject: [PATCH 023/162] emp fix --- code/modules/mod/mod_control.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 1d9f5a05c0208..9258013aeba72 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -397,7 +397,7 @@ to_chat(wearer, "[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!") if(. & EMP_PROTECT_CONTENTS) return - selected_module.on_deactivation() + selected_module?.on_deactivation() wearer.apply_damage(10 / severity, BURN) to_chat(wearer, "You feel [src] heat up from the EMP, burning you slightly.") if(wearer.stat < UNCONSCIOUS && prob(10)) From 7023f169d23b02eb7dad0385dbd6400a1c403aeb Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Sat, 17 Aug 2024 14:31:11 -0400 Subject: [PATCH 024/162] pin modules --- code/modules/mod/mod_actions.dm | 58 +++++++++++++++++++----- code/modules/mod/mod_activation.dm | 1 + code/modules/mod/mod_control.dm | 7 ++- code/modules/mod/mod_ui.dm | 9 +++- code/modules/mod/modules/_module.dm | 13 ++++++ tgui/packages/tgui/interfaces/MODsuit.js | 10 +++- 6 files changed, 80 insertions(+), 18 deletions(-) diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index 70d753561eb51..f356a675771bb 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -27,16 +27,24 @@ return return ..() +/datum/action/item_action/mod/Trigger() + if(!IsAvailable()) + return FALSE + if(mod.malfunctioning && prob(75)) + mod.balloon_alert(usr, "button malfunctions!") + return FALSE + return TRUE + /datum/action/item_action/mod/deploy name = "Deploy MODsuit" desc = "Deploy/Conceal a part of the MODsuit." button_icon_state = "deploy" /datum/action/item_action/mod/deploy/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.choose_deploy(usr) - return TRUE /datum/action/item_action/mod/deploy/ai ai_action = TRUE @@ -47,10 +55,10 @@ button_icon_state = "activate" /datum/action/item_action/mod/activate/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.toggle_activate(usr) - return TRUE /datum/action/item_action/mod/activate/ai ai_action = TRUE @@ -61,10 +69,10 @@ button_icon_state = "module" /datum/action/item_action/mod/module/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.quick_module(usr) - return TRUE /datum/action/item_action/mod/module/ai ai_action = TRUE @@ -75,10 +83,36 @@ button_icon_state = "panel" /datum/action/item_action/mod/panel/Trigger() - if(!IsAvailable()) - return FALSE + . = ..() + if(!.) + return mod.ui_interact(usr) - return TRUE /datum/action/item_action/mod/panel/ai ai_action = TRUE + +/datum/action/item_action/mod/pinned_module + desc = "Activate the module." + var/obj/item/mod/module/module + var/mob/pinner + +/datum/action/item_action/mod/pinned_module/New(Target, obj/item/mod/module/linked_module, mob/user) + if(user == mod.ai) + ai_action = TRUE + ..() + module = linked_module + name = "Activate [capitalize(linked_module.name)]" + icon_icon = linked_module.icon + button_icon_state = linked_module.icon_state + pinner = user + +/datum/action/item_action/mod/pinned_module/Grant(mob/user) + if(user != pinner) + return + return ..() + +/datum/action/item_action/mod/pinned_module/Trigger() + . = ..() + if(!.) + return + module.on_select() diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index e60b73ae7d8f5..9e61acd59b5d5 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -181,6 +181,7 @@ helmet.alternate_worn_layer = helmet.alternate_layer wearer.update_inv_head() wearer.update_inv_wear_mask() + wearer.update_inv_glasses() wearer.update_hair() /// Finishes the suit's activation, starts processing diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 9258013aeba72..93c3743c448e7 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -244,17 +244,16 @@ return TRUE /obj/item/mod/control/allow_attack_hand_drop(mob/user) - var/mob/living/carbon/carbon_user = user - if(!istype(carbon_user) || src != carbon_user.back) + if(user != wearer) return ..() for(var/obj/item/part in mod_parts) if(part.loc != src) - balloon_alert(carbon_user, "retract parts first!") + balloon_alert(user, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) return FALSE /obj/item/mod/control/MouseDrop(atom/over_object) - if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand)) + if(usr != wearer || !istype(over_object, /atom/movable/screen/inventory/hand)) return ..() for(var/obj/item/part in mod_parts) if(part.loc != src) diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 1e719e93ebe9c..3eec2daabba4a 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -4,7 +4,7 @@ ui = new(user, src, "MODsuit", name) ui.open() -/obj/item/mod/control/ui_data() +/obj/item/mod/control/ui_data(mob/user) var/data = list() data["interface_break"] = interface_break data["malfunctioning"] = malfunctioning @@ -25,6 +25,7 @@ description = module.desc, module_type = module.module_type, active = module.active, + pinned = module.pinned_to[user], idle_power = module.idle_power_cost, active_power = module.active_power_cost, use_power = module.use_power_cost, @@ -77,4 +78,10 @@ if(!module) return module.configure_edit(params["key"], params["value"]) + if("pin") + var/obj/item/mod/module/module = locate(params["ref"]) in modules + if(!module) + return + module.pin(usr) + return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index de9f41892b9fb..e15e3bed60dd0 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -36,6 +36,8 @@ var/cooldown_time = 0 /// The mouse button needed to use this module var/used_signal + /// List of mobs we are pinned to, linked with their action buttons + var/list/pinned_to = list() /// Timer for the cooldown COOLDOWN_DECLARE(cooldown_timer) @@ -253,3 +255,14 @@ if(ALT_CLICK) mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON RegisterSignal(mod.wearer, mod.selected_module.used_signal, TYPE_PROC_REF(/obj/item/mod/module, on_special_click)) + +/// Pins the module to the user's action buttons +/obj/item/mod/module/proc/pin(mob/user) + var/datum/action/item_action/mod/pinned_module/action = pinned_to[user] + if(action) + qdel(action) + pinned_to[user] = null + else + action = new(mod, src, user) + action.Grant(user) + pinned_to[user] = action diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 2228ae519e7f0..95f9d4ac35dcd 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -352,12 +352,20 @@ const ModuleSection = (props, context) => { />

+
+
+ + +
+ +
+
+ + + + ); +}; From 6c64b165c77a7c878d6e6ad9df01833c66b04801 Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 16:19:39 -0400 Subject: [PATCH 053/162] https://github.com/tgstation/tgstation/pull/65733 --- code/__DEFINES/mod.dm | 4 ++++ code/modules/mod/mod_control.dm | 10 ++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 1ffc12d601fe5..26d6c99fa13ed 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -30,5 +30,9 @@ #define UNSEALED_COVER "unsealed_cover" #define SEALED_COVER "sealed_cover" +//Defines used to override MOD clothing's icon and worn icon files in the skin. +#define MOD_ICON_OVERRIDE "mod_icon_override" +#define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override" + /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index cb39a6863840f..90a9204cf6490 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -101,7 +101,6 @@ slowdown_inactive = theme.slowdown_inactive slowdown_active = theme.slowdown_active complexity_max = theme.complexity_max - skin = new_skin || theme.default_skin ui_theme = theme.ui_theme charge_drain = theme.charge_drain initial_modules += theme.inbuilt_modules @@ -133,10 +132,8 @@ piece.cold_protection = NONE piece.max_heat_protection_temperature = theme.max_heat_protection_temperature piece.min_cold_protection_temperature = theme.min_cold_protection_temperature - piece.permeability_coefficient = theme.permeability_coefficient piece.siemens_coefficient = theme.siemens_coefficient - piece.icon_state = "[skin]-[initial(piece.icon_state)]" - update_flags() + set_mod_skin(new_skin || theme.default_skin) update_speed() for(var/obj/item/mod/module/module as anything in initial_modules) module = new module(src) @@ -624,7 +621,12 @@ /obj/item/mod/control/proc/set_mod_skin(new_skin) skin = new_skin var/list/skin_updating = mod_parts.Copy() + src + var/list/selected_skin = theme.skins[new_skin] for(var/obj/item/piece as anything in skin_updating) + if(selected_skin[MOD_ICON_OVERRIDE]) + piece.icon = selected_skin[MOD_ICON_OVERRIDE] + if(selected_skin[MOD_WORN_ICON_OVERRIDE]) + piece.worn_icon = selected_skin[MOD_WORN_ICON_OVERRIDE] piece.icon_state = "[skin]-[initial(piece.icon_state)]" update_flags() wearer?.regenerate_icons() From 07c92922e828cf84043ca5500836176ede7b4c5f Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 16:25:59 -0400 Subject: [PATCH 054/162] https://github.com/tgstation/tgstation/pull/66087 --- code/modules/mod/modules/_module.dm | 5 ++++- code/modules/mod/modules/modules_antag.dm | 1 + code/modules/mod/modules/modules_supply.dm | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index be5e95ed18121..bb6a70fee1a58 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -31,6 +31,8 @@ var/overlay_state_use /// Icon file for the overlay. var/overlay_icon_file = 'icons/mob/clothing/modsuit/mod_modules.dmi' + /// Does the overlay use the control unit's colors? + var/use_mod_colors = FALSE /// What modules are we incompatible with? var/list/incompatible_modules = list() /// Cooldown after use @@ -274,7 +276,8 @@ else return var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay, layer = standing.layer + 0.1) - module_icon.appearance_flags |= RESET_COLOR + if(!use_mod_colors) + module_icon.appearance_flags |= RESET_COLOR . += module_icon /// Updates the signal used by active modules to be activated diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index b337fbe3cb805..b34d36963d7f8 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -15,6 +15,7 @@ cooldown_time = 0.5 SECONDS overlay_state_inactive = "module_armorbooster_off" overlay_state_active = "module_armorbooster_on" + use_mod_colors = TRUE /// Whether or not this module removes pressure protection. var/remove_pressure_protection = TRUE /// Slowdown added to the suit. diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 323114f8cbe3f..604338ef1abdf 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -94,6 +94,7 @@ overlay_state_active = "module_clamp_loader" load_time = 1 SECONDS max_crates = 5 + use_mod_colors = TRUE ///Drill - Lets you dig through rock and basalt. /obj/item/mod/module/drill @@ -204,6 +205,7 @@ cooldown_time = 4 SECONDS overlay_state_inactive = "module_hydraulic" overlay_state_active = "module_hydraulic_active" + use_mod_colors = TRUE /// Time it takes to launch var/launch_time = 2 SECONDS /// User overlay @@ -291,6 +293,7 @@ incompatible_modules = list(/obj/item/mod/module/magnet) cooldown_time = 1.5 SECONDS overlay_state_active = "module_magnet" + use_mod_colors = TRUE /obj/item/mod/module/magnet/on_select_use(atom/target) . = ..() @@ -344,6 +347,7 @@ removable = FALSE incompatible_modules = list(/obj/item/mod/module/ash_accretion) overlay_state_inactive = "module_ash" + use_mod_colors = TRUE /// How many tiles we can travel to max out the armor. var/max_traveled_tiles = 10 /// How many tiles we traveled through. From 7dfd292a3754610c0904fde381d9d121c0ff7884 Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 16:26:44 -0400 Subject: [PATCH 055/162] https://github.com/tgstation/tgstation/pull/65753 --- code/modules/mod/mod_paint.dm | 6 +++--- tgui/packages/tgui/interfaces/MODpaint.js | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/mod/mod_paint.dm b/code/modules/mod/mod_paint.dm index 98ce4b1a3cc15..f4776986757ec 100644 --- a/code/modules/mod/mod_paint.dm +++ b/code/modules/mod/mod_paint.dm @@ -39,16 +39,16 @@ var/obj/item/mod/control/mod = attacked_atom if(mod.active || mod.activating) balloon_alert(user, "suit is active!") - return TRUE + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN if(editing_mod) - return TRUE + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN editing_mod = mod proxy_view = new() proxy_view.appearance = editing_mod.appearance proxy_view.color = null proxy_view.register_to_client(user.client) ui_interact(user) - return TRUE + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN */ /obj/item/mod/paint/ui_interact(mob/user, datum/tgui/ui) diff --git a/tgui/packages/tgui/interfaces/MODpaint.js b/tgui/packages/tgui/interfaces/MODpaint.js index 0efe9d45d2c06..2854ebc27b7f0 100644 --- a/tgui/packages/tgui/interfaces/MODpaint.js +++ b/tgui/packages/tgui/interfaces/MODpaint.js @@ -84,14 +84,14 @@ export const MODpaint = (props, context) => { width={600} height={365}> - + {[0, 1, 2].map((row) => ( - @@ -168,7 +160,7 @@ const HealthAnalyzer = (props, context) => { good: [-Infinity, 0.2], average: [0.2, 0.5], bad: [0.5, Infinity], - }} > + }}> @@ -181,7 +173,7 @@ const HealthAnalyzer = (props, context) => { good: [-Infinity, 0.2], average: [0.2, 0.5], bad: [0.5, Infinity], - }} > + }}> @@ -194,7 +186,7 @@ const HealthAnalyzer = (props, context) => { good: [-Infinity, 0.2], average: [0.2, 0.5], bad: [0.5, Infinity], - }} > + }}> @@ -441,7 +433,7 @@ const ModuleSection = (props, context) => { disabled={module.configuration_data.length === 0} /> - - - - - ); -}; - -const displayText = (param) => { - switch (param) { - case 1: - return 'Use'; - case 2: - return 'Toggle'; - case 3: - return 'Select'; - } -}; - -const ParametersSection = (props, context) => { - const { act, data } = useBackend(context); - const { active, malfunctioning, locked, open, selected_module, complexity, complexity_max, wearer_name, wearer_job, AI } = - data; - const status = malfunctioning ? 'Malfunctioning' : active ? 'Active' : 'Inactive'; - return ( -
- - act('activate')} />}> - {status} - - act('lock')} /> - }> - {locked ? 'Locked' : 'Unlocked'} - - {open ? 'Open' : 'Closed'} - {selected_module || 'None'} - - {complexity} ({complexity_max}) - - - {wearer_name}, {wearer_job} - - {AI || 'None'} - -
- ); -}; - -const HardwareSection = (props, context) => { - const { act, data } = useBackend(context); - const { active, control, helmet, chestplate, gauntlets, boots, core, charge } = data; - return ( -
- - - {control} - {helmet || 'None'} - {chestplate || 'None'} - {gauntlets || 'None'} - {boots || 'None'} - - - - {(core && ( - - {core} - - - - - )) || ( - - No Core Detected - - )} - -
- ); -}; - -const InfoSection = (props, context) => { - const { act, data } = useBackend(context); - const { active, modules } = data; - const info_modules = modules.filter((module) => !!module.id); - - return ( -
- - {(info_modules.length !== 0 && - info_modules.map((module) => { - const Module = ID2MODULE[module.id]; - return ( - - {!active && } - - - ); - })) || No Info Modules Detected} - -
- ); -}; - -const ModuleSection = (props, context) => { - const { act, data } = useBackend(context); - const { complexity_max, modules } = data; - const [configureState, setConfigureState] = useLocalState(context, 'module_configuration', null); - return ( -
- - {(modules.length !== 0 && - modules.map((module) => { - return ( - - -
- {configureState === module.ref && ( - setConfigureState(null)} - /> - )} - - - -
- {module.description} -
-
-
- ); - })) || ( - - No Modules Detected - - )} -
-
- ); -}; - -export const MODsuit = (props, context) => { - const { act, data } = useBackend(context); - const { ui_theme, interface_break } = data; - return ( - - - {(!!interface_break && ) || ( - - - - - - - - - - - - - - - )} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/MODsuit.tsx b/tgui/packages/tgui/interfaces/MODsuit.tsx new file mode 100644 index 0000000000000..c8167e74bfe72 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MODsuit.tsx @@ -0,0 +1,721 @@ +import { BooleanLike } from 'common/react'; +import { formatSiUnit } from '../format'; +import { useBackend, useLocalState } from '../backend'; +import { Button, ColorBox, LabeledList, ProgressBar, Section, Collapsible, Box, Icon, Stack, Table, Dimmer, NumberInput, AnimatedNumber, Dropdown, NoticeBox } from '../components'; +import { Window } from '../layouts'; + +type MODsuitData = { + // Static + ui_theme: string; + control: string; + complexity_max: number; + helmet: string; + chestplate: string; + gauntlets: string; + boots: string; + // Dynamic + suit_status: SuitStatus; + user_status: UserStatus; + module_custom_status: ModuleCustomStatus; + module_info: Module[]; +}; + +type SuitStatus = { + core_name: string; + cell_charge_current: number; + cell_charge_max: number; + active: BooleanLike; + open: BooleanLike; + seconds_electrified: number; + malfunctioning: BooleanLike; + locked: BooleanLike; + interface_break: BooleanLike; + complexity: number; + selected_module: string; + ai_name: string; +}; + +type UserStatus = { + user_name: string; + user_assignment: string; +}; + +type ModuleCustomStatus = { + health: number; + health_max: number; + loss_brute: number; + loss_fire: number; + loss_tox: number; + loss_oxy: number; + is_user_irradiated: BooleanLike; + background_radiation_level: number; + display_time: BooleanLike; + shift_time: string; + shift_id: string; + body_temperature: number; + nutrition: number; + dna_unique_identity: string; + dna_unique_enzymes: string; + viruses: VirusData[]; +}; + +type VirusData = { + name: string; + type: string; + stage: number; + maxstage: number; + cure: string; +}; + +type Module = { + module_name: string; + description: string; + module_type: number; + module_active: BooleanLike; + pinned: BooleanLike; + idle_power: number; + active_power: number; + use_power: number; + module_complexity: number; + cooldown_time: number; + cooldown: number; + id: string; + ref: string; + configuration_data: ModuleConfig[]; +}; + +type ModuleConfig = { + display_name: string; + type: string; + value: number; + values: []; +}; + +export const MODsuit = (props, context) => { + const { act, data } = useBackend(context); + const { ui_theme } = data; + const { interface_break } = data.suit_status; + return ( + + + + + + ); +}; + +export const MODsuitContent = (props, context) => { + const { act, data } = useBackend(context); + const { interface_break } = data.suit_status; + return ( + + {interface_break ? ( + + ) : ( + + + + + + + + + + + + + + + + + + + )} + + ); +}; + +const ConfigureNumberEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + + act('configure', { + 'key': name, + 'value': value, + 'ref': module_ref, + }) + } + /> + ); +}; + +const ConfigureBoolEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + + act('configure', { + 'key': name, + 'value': !value, + 'ref': module_ref, + }) + } + /> + ); +}; + +const ConfigureColorEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + <> +
- {[0, 1, 2].map((col, key) => ( + {[0, 1, 2].map((col) => ( + key={col}> Date: Thu, 29 Aug 2024 17:02:39 -0400 Subject: [PATCH 056/162] https://github.com/tgstation/tgstation/pull/61138 https://github.com/tgstation/tgstation/pull/62907 --- .../signals/signals_datum/signals_circuit.dm | 4 ++ code/datums/components/shell.dm | 52 ++++++++++++++++--- code/modules/wiremod/core/component.dm | 8 +-- code/modules/wiremod/shell/airlock.dm | 2 +- 4 files changed, 54 insertions(+), 12 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_datum/signals_circuit.dm b/code/__DEFINES/dcs/signals/signals_datum/signals_circuit.dm index 2b46732b9ec1a..f0b73b791e420 100644 --- a/code/__DEFINES/dcs/signals/signals_datum/signals_circuit.dm +++ b/code/__DEFINES/dcs/signals/signals_datum/signals_circuit.dm @@ -57,6 +57,10 @@ /// Called when the integrated circuit's is locked. #define COMSIG_CIRCUIT_SET_LOCKED "circuit_set_locked" +/// Called before power is used in an integrated circuit (power_to_use) +#define COMSIG_CIRCUIT_PRE_POWER_USAGE "circuit_pre_power_usage" + #define COMPONENT_OVERRIDE_POWER_USAGE (1<<0) + /// Called when somebody passes through a scanner gate and it triggers #define COMSIG_SCANGATE_PASS_TRIGGER "scangate_pass_trigger" diff --git a/code/datums/components/shell.dm b/code/datums/components/shell.dm index 6aa88811111bf..423b347206b47 100644 --- a/code/datums/components/shell.dm +++ b/code/datums/components/shell.dm @@ -14,8 +14,19 @@ /// A list of components that cannot be removed var/list/obj/item/circuit_component/unremovable_circuit_components + /// Whether the shell is locked or not var/locked = FALSE + // The variables below are used only for anchored shells + /// The amount of power used in the last minute + var/power_used_in_minute = 0 + + /// The cooldown time to reset the power_used_in_minute to 0 + COOLDOWN_DECLARE(power_used_cooldown) + + /// The maximum power that the shell can use in a minute before entering overheating and destroying itself. + var/max_power_use_in_minute = 20000 + /datum/component/shell/Initialize(unremovable_circuit_components, capacity, shell_flags, starting_circuit) . = ..() if(!ismovable(parent)) @@ -38,7 +49,7 @@ RegisterSignal(parent, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(on_screwdriver_act)) RegisterSignal(parent, COMSIG_OBJ_DECONSTRUCT, PROC_REF(on_object_deconstruct)) if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) - RegisterSignal(parent, COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, PROC_REF(on_unfasten)) + RegisterSignal(parent, COMSIG_MOVABLE_SET_ANCHORED, PROC_REF(on_set_anchored)) RegisterSignal(parent, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, PROC_REF(on_atom_usb_cable_try_attach)) RegisterSignal(parent, COMSIG_MOVABLE_CIRCUIT_LOADED, PROC_REF(on_load)) @@ -81,7 +92,7 @@ COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), COMSIG_ATOM_TOOL_ACT(TOOL_MULTITOOL), COMSIG_OBJ_DECONSTRUCT, - COMSIG_OBJ_DEFAULT_UNFASTEN_WRENCH, + COMSIG_MOVABLE_SET_ANCHORED, COMSIG_PARENT_EXAMINE, COMSIG_ATOM_ATTACK_GHOST, COMSIG_ATOM_USB_CABLE_TRY_ATTACH, @@ -107,7 +118,7 @@ if(attached_circuit) INVOKE_ASYNC(attached_circuit, TYPE_PROC_REF(/datum, ui_interact), ghost) -/datum/component/shell/proc/on_examine(datum/source, mob/user, list/examine_text) +/datum/component/shell/proc/on_examine(atom/movable/source, mob/user, list/examine_text) SIGNAL_HANDLER if(!attached_circuit) examine_text += "There is no integrated circuit attached." @@ -121,15 +132,21 @@ if (shell_flags & SHELL_FLAG_USB_PORT) examine_text += "There is a USB port on the front." + if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) + examine_text += "The shell does not require a battery to function and will draw from the area's APC whenever possible." + if(!source.anchored) + examine_text += "The integrated circuit is non-functional whilst the shell is unanchored." + /** - * Called when the shell is wrenched. + * Called when the shell is anchored. * * Only applies if the shell has SHELL_FLAG_REQUIRE_ANCHOR. * Disables the integrated circuit if unanchored, otherwise enable the circuit. */ -/datum/component/shell/proc/on_unfasten(atom/source, anchored) +/datum/component/shell/proc/on_set_anchored(atom/movable/source, previous_value) SIGNAL_HANDLER - attached_circuit?.set_on(anchored) + attached_circuit?.on = source.anchored + /** * Called when an item hits the parent. This is the method to add the circuitboard to the component. */ @@ -242,6 +259,24 @@ source.balloon_alert(user, "it's at maximum capacity!") return COMPONENT_CANCEL_ADD_COMPONENT +/datum/component/shell/proc/override_power_usage(datum/source, power_to_use) + SIGNAL_HANDLER + if(COOLDOWN_FINISHED(src, power_used_cooldown)) + power_used_in_minute = 0 + + var/area/location = get_area(parent) + if(!location.powered(AREA_USAGE_EQUIP)) + return + + if(power_used_in_minute > max_power_use_in_minute) + explosion(parent, light_impact_range = 1) + remove_circuit() + return + location.use_power(power_to_use, AREA_USAGE_EQUIP) + power_used_in_minute += power_to_use + COOLDOWN_START(src, power_used_cooldown, 1 MINUTES) + return COMPONENT_OVERRIDE_POWER_USAGE + /** * Attaches a circuit to the parent. Doesn't do any checks to see for any existing circuits so that should be done beforehand. */ @@ -253,8 +288,8 @@ attached_circuit = circuitboard if(!(shell_flags & SHELL_FLAG_CIRCUIT_UNREMOVABLE)) RegisterSignal(circuitboard, COMSIG_MOVABLE_MOVED, PROC_REF(on_circuit_moved)) - //if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) - // RegisterSignal(circuitboard, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROEC_REF(override_power_usage)) + if(shell_flags & SHELL_FLAG_REQUIRE_ANCHOR) + RegisterSignal(circuitboard, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROC_REF(override_power_usage)) RegisterSignal(circuitboard, COMSIG_PARENT_QDELETING, PROC_REF(on_circuit_delete)) for(var/obj/item/circuit_component/to_add as anything in unremovable_circuit_components) to_add.forceMove(attached_circuit) @@ -284,6 +319,7 @@ COMSIG_MOVABLE_MOVED, COMSIG_PARENT_QDELETING, COMSIG_CIRCUIT_ADD_COMPONENT_MANUALLY, + COMSIG_CIRCUIT_PRE_POWER_USAGE, )) if(attached_circuit.loc == parent) var/atom/parent_atom = parent diff --git a/code/modules/wiremod/core/component.dm b/code/modules/wiremod/core/component.dm index 722c18c60cbe5..cade6d22991cb 100644 --- a/code/modules/wiremod/core/component.dm +++ b/code/modules/wiremod/core/component.dm @@ -246,9 +246,11 @@ if(!parent?.on) return FALSE - var/obj/item/stock_parts/cell/cell = parent.get_cell() - if(!cell?.use(power_usage_per_input)) - return FALSE + var/flags = SEND_SIGNAL(parent, COMSIG_CIRCUIT_PRE_POWER_USAGE, power_usage_per_input) + if(!(flags & COMPONENT_OVERRIDE_POWER_USAGE)) + var/obj/item/stock_parts/cell/cell = parent.get_cell() + if(!cell?.use(power_usage_per_input)) + return FALSE if((circuit_flags & CIRCUIT_FLAG_INPUT_SIGNAL) && !COMPONENT_TRIGGERED_BY(trigger_input, port)) return FALSE diff --git a/code/modules/wiremod/shell/airlock.dm b/code/modules/wiremod/shell/airlock.dm index 89d58ec5992a0..6d3f4c9fdaeac 100644 --- a/code/modules/wiremod/shell/airlock.dm +++ b/code/modules/wiremod/shell/airlock.dm @@ -18,7 +18,7 @@ /datum/component/shell, \ unremovable_circuit_components = list(new /obj/item/circuit_component/airlock, new /obj/item/circuit_component/airlock_access_event), \ capacity = SHELL_CAPACITY_LARGE, \ - shell_flags = SHELL_FLAG_ALLOW_FAILURE_ACTION \ + shell_flags = SHELL_FLAG_ALLOW_FAILURE_ACTION|SHELL_FLAG_REQUIRE_ANCHOR \ ) /obj/machinery/door/airlock/shell/check_access(obj/item/I) From 7c21a43c2ff20188f9053d2ad0ab21671a9a6864 Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 17:06:54 -0400 Subject: [PATCH 057/162] https://github.com/tgstation/tgstation/pull/63755 --- beestation.dme | 2 + code/__HELPERS/atoms.dm | 11 ++ code/modules/mod/modules/modules_science.dm | 105 ------------ .../designs/mechfabricator_designs.dm | 7 - .../research/designs/wiremod_designs.dm | 11 +- code/modules/research/techweb/all_nodes.dm | 2 + .../components/abstract/equipment_action.dm | 65 ++++++++ .../wiremod/shell/brain_computer_interface.dm | 98 ++--------- code/modules/wiremod/shell/module.dm | 156 ++++++++++++++++++ 9 files changed, 264 insertions(+), 193 deletions(-) create mode 100644 code/modules/wiremod/components/abstract/equipment_action.dm create mode 100644 code/modules/wiremod/shell/module.dm diff --git a/beestation.dme b/beestation.dme index 2270381e94c11..0747225ccaf37 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4210,6 +4210,7 @@ #include "code\modules\vending\youtool.dm" #include "code\modules\wiremod\components\abstract\arbitrary_input_amount.dm" #include "code\modules\wiremod\components\abstract\compare.dm" +#include "code\modules\wiremod\components\abstract\equipment_action.dm" #include "code\modules\wiremod\components\abstract\indexer.dm" #include "code\modules\wiremod\components\abstract\module.dm" #include "code\modules\wiremod\components\action\light.dm" @@ -4297,6 +4298,7 @@ #include "code\modules\wiremod\shell\compact_remote.dm" #include "code\modules\wiremod\shell\controller.dm" #include "code\modules\wiremod\shell\drone.dm" +#include "code\modules\wiremod\shell\module.dm" #include "code\modules\wiremod\shell\moneybot.dm" #include "code\modules\wiremod\shell\scanner.dm" #include "code\modules\wiremod\shell\scanner_gate.dm" diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index bbb95ec8224ac..4c01a81ba4f7c 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -20,6 +20,17 @@ assembled += A return assembled +///identical to get_all_contents but returns a list of atoms of the type passed in the argument. +/atom/proc/GetAllContentsType(type) + var/list/processing_list = list(src) + . = list() + while(length(processing_list)) + var/atom/checked_atom = processing_list[1] + processing_list.Cut(1, 2) + processing_list += checked_atom.contents + if(istype(checked_atom, type)) + . += checked_atom + /// Gets all contents of contents and returns them all in a list, ignoring a chosen typecache. //Update GetAllContentsIgnoring to get_all_contents_ignoring so it easier to read in /atom/proc/GetAllContentsIgnoring(list/ignore_typecache) diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index 753b8de34ff9f..e071d738f1c5e 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -55,111 +55,6 @@ return to_chat(mod.wearer, "Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]") -//Circuit Adapter - -/obj/item/mod/module/circuit - name = "MOD circuit adapter module" - desc = "A popular aftermarket module, seen in wide varieties with wide applications by those across the galaxy. \ - This is able to fit any sort of integrated circuit, hooking it into controls in the suit and displaying information \ - to the HUD. Useful for universal translation, or perhaps as a calculator." - module_type = MODULE_USABLE - complexity = 3 - idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/circuit) - cooldown_time = 0.5 SECONDS - var/obj/item/integrated_circuit/circuit - -/obj/item/mod/module/circuit/Initialize(mapload) - . = ..() - circuit = new() - AddComponent(/datum/component/shell, \ - list(new /obj/item/circuit_component/mod()), \ - capacity = SHELL_CAPACITY_LARGE, \ - shell_flags = SHELL_FLAG_CIRCUIT_UNREMOVABLE, \ - starting_circuit = circuit, \ - ) - -/obj/item/mod/module/circuit/on_install() - circuit.set_cell(mod.get_cell()) - -/obj/item/mod/module/circuit/on_uninstall() - circuit.set_cell(mod.get_cell()) - -/obj/item/mod/module/circuit/on_suit_activation() - circuit.set_on(TRUE) - -/obj/item/mod/module/circuit/on_suit_deactivation() - circuit.set_on(FALSE) - -/obj/item/mod/module/circuit/on_use() - . = ..() - if(!.) - return - circuit.interact(mod.wearer) - -/obj/item/circuit_component/mod - display_name = "MOD" - desc = "Used to send and receive signals from a MODsuit." - - var/obj/item/mod/module/attached_module - - var/datum/port/input/module_to_select - var/datum/port/input/toggle_suit - var/datum/port/input/select_module - - var/datum/port/output/wearer - var/datum/port/output/selected_module - -/obj/item/circuit_component/mod/populate_ports() - // Input Signals - module_to_select = add_input_port("Module to Select", PORT_TYPE_STRING) - toggle_suit = add_input_port("Toggle Suit", PORT_TYPE_SIGNAL) - select_module = add_input_port("Select Module", PORT_TYPE_SIGNAL) - // States - wearer = add_output_port("Wearer", PORT_TYPE_ATOM) - selected_module = add_output_port("Selected Module", PORT_TYPE_ATOM) - -/obj/item/circuit_component/mod/register_shell(atom/movable/shell) - if(istype(shell, /obj/item/mod/module)) - attached_module = shell - RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) - -/obj/item/circuit_component/mod/unregister_shell(atom/movable/shell) - UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) - attached_module = null - -/obj/item/circuit_component/mod/input_received(datum/port/input/port) - var/obj/item/mod/module/module - for(var/obj/item/mod/module/potential_module as anything in attached_module.mod.modules) - if(potential_module.name == module_to_select.value) - module = potential_module - if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) - INVOKE_ASYNC(attached_module.mod, TYPE_PROC_REF(/obj/item/mod/control, toggle_activate), attached_module.mod.wearer) - if(module && COMPONENT_TRIGGERED_BY(select_module, port)) - INVOKE_ASYNC(module, TYPE_PROC_REF(/obj/item/mod/module, on_select)) - -/obj/item/circuit_component/mod/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) - SIGNAL_HANDLER - if(istype(source.loc, /obj/item/mod/control)) - RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, PROC_REF(on_module_select)) - RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, PROC_REF(equip_check)) - equip_check() - else if(istype(old_loc, /obj/item/mod/control)) - UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) - selected_module.set_output(null) - wearer.set_output(null) - -/obj/item/circuit_component/mod/proc/on_module_select() - SIGNAL_HANDLER - selected_module.set_output(attached_module.mod.selected_module) - -/obj/item/circuit_component/mod/proc/equip_check() - SIGNAL_HANDLER - - if(!attached_module.mod?.wearer) - return - wearer.set_output(attached_module.mod.wearer) - ///Anti-Gravity - Makes the user weightless. /obj/item/mod/module/anomaly_locked/antigrav name = "MOD anti-gravity module" diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 4e3f78265209d..8536ab7aed48e 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1222,13 +1222,6 @@ materials = list(/datum/material/diamond = 500, /datum/material/glass = 1000) build_path = /obj/item/mod/module/dna_lock -/datum/design/module/mod_circuit - name = "MOD Module: Circuit Adapter" - id = "mod_circuit" - materials = list(/datum/material/glass = 2000) - build_path = /obj/item/mod/module/circuit - department_type = MODULE_SCIENCE - /datum/design/module/mod_plasma_stabilizer name = "MOD Module: Plasma Stabilizer" id = "mod_plasma" diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index abcf2ef825bb1..675b89f0286d0 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -394,7 +394,7 @@ /datum/design/component/bci/bci_action name = "BCI Action Component" id = "comp_bci_action" - build_path = /obj/item/circuit_component/bci_action + build_path = /obj/item/circuit_component/equipment_action/bci /datum/design/component/bci/object_overlay name = "Object Overlay Component" @@ -547,3 +547,12 @@ build_path = /obj/item/circuitboard/machine/bci_implanter build_type = IMPRINTER | COMPONENT_PRINTER category = list(WIREMOD_CIRCUITRY, WIREMOD_CORE) + +/datum/design/mod_module_shell + name = "MOD Module Shell" + desc = "A module shell that allows a circuit to be inserted into, and interface with, a MODsuit." + id = "module_shell" + materials = list(/datum/material/glass = 2000) + build_path = /obj/item/mod/module/circuit + build_type = MECHFAB | COMPONENT_PRINTER + category = list("MOD Modules", WIREMOD_SHELLS) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index f4da0c7e65fe2..089886a6c3c68 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -808,8 +808,10 @@ design_ids = list( "assembly_shell", "bot_shell", + "comp_mod_action", "controller_shell", "door_shell", + "module_shell", "money_bot_shell", "scanner_gate_shell", "scanner_shell", diff --git a/code/modules/wiremod/components/abstract/equipment_action.dm b/code/modules/wiremod/components/abstract/equipment_action.dm new file mode 100644 index 0000000000000..17f931ae5e308 --- /dev/null +++ b/code/modules/wiremod/components/abstract/equipment_action.dm @@ -0,0 +1,65 @@ +/obj/item/circuit_component/equipment_action + display_name = "Abstract Equipment Action" + desc = "You shouldn't be seeing this." + + /// The icon of the button + var/datum/port/input/option/icon_options + + /// The name to use for the button + var/datum/port/input/button_name + + /// Called when the user presses the button + var/datum/port/output/signal + +/obj/item/circuit_component/equipment_action/Initialize(mapload, default_icon) + . = ..() + + if (!isnull(default_icon)) + icon_options.set_input(default_icon) + + button_name = add_input_port("Name", PORT_TYPE_STRING) + + signal = add_output_port("Signal", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/equipment_action/populate_options() + var/static/action_options = list( + "Blank", + + "One", + "Two", + "Three", + "Four", + "Five", + + "Blood", + "Bomb", + "Brain", + "Brain Damage", + "Cross", + "Electricity", + "Exclamation", + "Heart", + "Id", + "Info", + "Injection", + "Magnetism", + "Minus", + "Network", + "Plus", + "Power", + "Question", + "Radioactive", + "Reaction", + "Repair", + "Say", + "Scan", + "Shield", + "Skull", + "Sleep", + "Wireless", + ) + + icon_options = add_option_port("Icon", action_options) + +/obj/item/circuit_component/equipment_action/proc/update_action() + return diff --git a/code/modules/wiremod/shell/brain_computer_interface.dm b/code/modules/wiremod/shell/brain_computer_interface.dm index 3da12f3ca5f5f..36ca4461bfbb4 100644 --- a/code/modules/wiremod/shell/brain_computer_interface.dm +++ b/code/modules/wiremod/shell/brain_computer_interface.dm @@ -12,7 +12,7 @@ . = ..() var/obj/item/integrated_circuit/circuit = new(src) - circuit.add_component(new /obj/item/circuit_component/bci_action(null, "One")) + circuit.add_component(new /obj/item/circuit_component/equipment_action/bci(null, "One")) AddComponent(/datum/component/shell, list( new /obj/item/circuit_component/bci_core, @@ -35,101 +35,39 @@ else return ..() -/obj/item/circuit_component/bci_action +/obj/item/circuit_component/equipment_action/bci display_name = "BCI Action" desc = "Represents an action the user can take when implanted with the brain-computer interface." required_shells = list(/obj/item/organ/cyberimp/bci) - /// The icon of the button - var/datum/port/input/option/icon_options - - /// The name to use for the button - var/datum/port/input/button_name - - /// Called when the user presses the button - var/datum/port/output/signal - /// A reference to the action button itself var/datum/action/innate/bci_action/bci_action -/obj/item/circuit_component/bci_action/Initialize(mapload, default_icon) - . = ..() - - if (!isnull(default_icon)) - icon_options.set_input(default_icon) - - -/obj/item/circuit_component/bci_action/populate_ports() - button_name = add_input_port("Name", PORT_TYPE_STRING) - - signal = add_output_port("Signal", PORT_TYPE_SIGNAL) - -/obj/item/circuit_component/bci_action/Destroy() +/obj/item/circuit_component/equipment_action/bci/Destroy() QDEL_NULL(bci_action) return ..() -/obj/item/circuit_component/bci_action/populate_options() - var/static/list/action_options = list( - "Blank", - - "One Green", - "Two Green", - "Three Green", - "Four Green", - "Five Green", - "Plus Green", - "Minus Green", - "Power Green", - - "One Red", - "Two Red", - "Three Red", - "Four Red", - "Five Red", - "Plus Red", - "Minus Red", - "Power Red", - - "One Yellow", - "Two Yellow", - "Three Yellow", - "Four Yellow", - "Five Yellow", - "Plus Yellow", - "Minus Yellow", - "Power Yellow", - - "One Blue", - "Two Blue", - "Three Blue", - "Four Blue", - "Five Blue", - "Plus Blue", - "Minus Blue", - "Power Blue", - ) - - icon_options = add_option_port("Icon", action_options) - -/obj/item/circuit_component/bci_action/register_shell(atom/movable/shell) +/obj/item/circuit_component/equipment_action/bci/register_shell(atom/movable/shell) + . = ..() var/obj/item/organ/cyberimp/bci/bci = shell + if(istype(bci)) + bci_action = new(src) + update_action() - bci_action = new(src) - update_action() - - bci.actions += list(bci_action) + bci.actions += list(bci_action) -/obj/item/circuit_component/bci_action/unregister_shell(atom/movable/shell) +/obj/item/circuit_component/equipment_action/bci/unregister_shell(atom/movable/shell) var/obj/item/organ/cyberimp/bci/bci = shell + if(istype(bci)) + bci.actions -= bci_action + QDEL_NULL(bci_action) + return ..() - bci.actions -= bci_action - QDEL_NULL(bci_action) - -/obj/item/circuit_component/bci_action/input_received(datum/port/input/port) +/obj/item/circuit_component/equipment_action/bci/input_received(datum/port/input/port) if (!isnull(bci_action)) update_action() -/obj/item/circuit_component/bci_action/proc/update_action() +/obj/item/circuit_component/equipment_action/bci/update_action() bci_action.name = button_name.value bci_action.button_icon_state = "[replacetextEx(lowertext(icon_options.value), " ", "_")]" @@ -139,9 +77,9 @@ check_flags = AB_CHECK_CONSCIOUS button_icon_state = "bci_power" - var/obj/item/circuit_component/bci_action/circuit_component + var/obj/item/circuit_component/equipment_action/bci/circuit_component -/datum/action/innate/bci_action/New(obj/item/circuit_component/bci_action/circuit_component) +/datum/action/innate/bci_action/New(obj/item/circuit_component/equipment_action/bci/circuit_component) ..() src.circuit_component = circuit_component diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm new file mode 100644 index 0000000000000..53daca8b52ae3 --- /dev/null +++ b/code/modules/wiremod/shell/module.dm @@ -0,0 +1,156 @@ +/obj/item/mod/module/circuit + name = "MOD circuit adapter module" + desc = "A module shell that allows a circuit to be inserted into, and interface with, a MODsuit." + module_type = MODULE_USABLE + complexity = 3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/circuit) + cooldown_time = 0.5 SECONDS + + /// A reference to the shell component, used to access the shell and its attached circuit + var/datum/component/shell/shell + +/obj/item/mod/module/circuit/Initialize(mapload) + . = ..() + shell = AddComponent(/datum/component/shell, \ + list(new /obj/item/circuit_component/mod_adapter_core()), \ + capacity = SHELL_CAPACITY_LARGE, \ + ) + +/obj/item/mod/module/circuit/proc/override_power_usage(datum/source, amount) + SIGNAL_HANDLER + if(drain_power(amount)) + . = COMPONENT_OVERRIDE_POWER_USAGE + +/obj/item/mod/module/circuit/on_install() + RegisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, .proc/override_power_usage) + +/obj/item/mod/module/circuit/on_uninstall() + UnregisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE) + +/obj/item/mod/module/circuit/on_use() + . = ..() + if(!.) + return + if(!shell.attached_circuit) + return + var/list/action_components = shell.attached_circuit.GetAllContentsType(/obj/item/circuit_component/equipment_action/mod) + if(!action_components.len) + shell.attached_circuit.interact(mod.wearer) + return + var/list/repeat_name_counts = list("Access Circuit" = 1) + var/list/display_names = list() + var/list/radial_options = list() + for(var/obj/item/circuit_component/equipment_action/mod/action_component in action_components) + var/action_name = action_component.button_name.value + if(!repeat_name_counts[action_name]) + repeat_name_counts[action_name] = 0 + repeat_name_counts[action_name]++ + if(repeat_name_counts[action_name] > 1) + action_name += " ([repeat_name_counts[action_name]])" + display_names[action_name] = REF(action_component) + var/option_icon_state = "bci_[replacetextEx(lowertext(action_component.icon_options.value), " ", "_")]" + radial_options += list("[action_name]" = image('icons/mob/actions/actions_items.dmi', option_icon_state)) + radial_options += list("Access Circuit" = image(shell.attached_circuit)) + var/selected_option = show_radial_menu(mod.wearer, src, radial_options, custom_check = FALSE, require_near = TRUE) + if(!selected_option) + return + if(!mod || !mod.wearer || !mod.active || mod.activating) + return + if(selected_option == "Access Circuit") + shell.attached_circuit?.interact(mod.wearer) + else + var/component_reference = display_names[selected_option] + var/obj/item/circuit_component/equipment_action/mod/selected_component = locate(component_reference) in shell.attached_circuit.contents + if(!istype(selected_component)) + return + selected_component.signal.set_output(COMPONENT_SIGNAL) + + +/obj/item/circuit_component/mod_adapter_core + display_name = "MOD circuit adapter core" + desc = "Provides a reference to the MODsuit's occupant and allows the circuit to toggle the MODsuit." + + /// The MODsuit module this circuit is associated with + var/obj/item/mod/module/attached_module + + /// The name of the module to select + var/datum/port/input/module_to_select + + /// The signal to toggle the suit + var/datum/port/input/toggle_suit + + /// The signal to select a module + var/datum/port/input/select_module + + /// A reference to the wearer of the MODsuit + var/datum/port/output/wearer + + /// The name of the last selected module + var/datum/port/output/selected_module + + /// The signal that is triggered when a module is selected + var/datum/port/output/on_module_selected + +/obj/item/circuit_component/mod_adapter_core/populate_ports() + // Input Signals + module_to_select = add_input_port("Module to Select", PORT_TYPE_STRING) + toggle_suit = add_input_port("Toggle Suit", PORT_TYPE_SIGNAL) + select_module = add_input_port("Select Module", PORT_TYPE_SIGNAL) + // States + wearer = add_output_port("Wearer", PORT_TYPE_ATOM) + selected_module = add_output_port("Selected Module", PORT_TYPE_STRING) + // Output Signals + on_module_selected = add_output_port("On Module Selected", PORT_TYPE_SIGNAL) + +/obj/item/circuit_component/mod_adapter_core/register_shell(atom/movable/shell) + . = ..() + if(istype(shell, /obj/item/mod/module)) + attached_module = shell + RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move) + +/obj/item/circuit_component/mod_adapter_core/unregister_shell(atom/movable/shell) + UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) + attached_module = null + return ..() + +/obj/item/circuit_component/mod_adapter_core/input_received(datum/port/input/port) + if(!attached_module?.mod) + return + var/obj/item/mod/module/module + for(var/obj/item/mod/module/potential_module as anything in attached_module.mod.modules) + if(potential_module.name == module_to_select.value) + module = potential_module + if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) + INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/toggle_activate, attached_module.mod.wearer) + if(attached_module.mod.active && module && COMPONENT_TRIGGERED_BY(select_module, port)) + INVOKE_ASYNC(module, /obj/item/mod/module.proc/on_select) + +/obj/item/circuit_component/mod_adapter_core/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) + SIGNAL_HANDLER + if(istype(source.loc, /obj/item/mod/control)) + RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select) + RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, .proc/equip_check) + equip_check() + else if(istype(old_loc, /obj/item/mod/control)) + UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) + selected_module.set_output(null) + wearer.set_output(null) + +/obj/item/circuit_component/mod_adapter_core/proc/on_module_select(datum/source, obj/item/mod/module/module) + SIGNAL_HANDLER + selected_module.set_output(module.name) + on_module_selected.set_output(COMPONENT_SIGNAL) + + +/obj/item/circuit_component/mod_adapter_core/proc/equip_check() + SIGNAL_HANDLER + + if(!attached_module.mod?.wearer) + return + wearer.set_output(attached_module.mod.wearer) + +/obj/item/circuit_component/equipment_action/mod + display_name = "MOD action" + desc = "Represents an action the user can take when wearing the MODsuit." + required_shells = list(/obj/item/mod/module/circuit) From 332df49839f2c7e52f6a240d6e6028cd8766a07a Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 17:08:50 -0400 Subject: [PATCH 058/162] https://github.com/tgstation/tgstation/pull/66170 --- .../dcs/signals/signals_mob/signals_mob.dm | 1 - .../signals_obj/signals_item/signals_item.dm | 4 + .../effects/effect_system/effects_smoke.dm | 8 + code/modules/mob/inventory.dm | 1 + code/modules/mod/adding_new_mod.md | 4 +- code/modules/mod/mod_control.dm | 22 ++- code/modules/mod/mod_theme.dm | 6 + code/modules/mod/mod_types.dm | 29 ++-- code/modules/mod/modules/_module.dm | 8 +- code/modules/mod/modules/module_kinesis.dm | 7 +- code/modules/mod/modules/modules_antag.dm | 17 ++- .../mod/modules/modules_engineering.dm | 10 +- code/modules/mod/modules/modules_general.dm | 33 ++--- code/modules/mod/modules/modules_maint.dm | 15 +- code/modules/mod/modules/modules_medical.dm | 4 +- code/modules/mod/modules/modules_science.dm | 8 +- code/modules/mod/modules/modules_security.dm | 137 ++++++++++++------ code/modules/mod/modules/modules_service.dm | 4 +- code/modules/mod/modules/modules_supply.dm | 35 +++-- code/modules/mod/modules/modules_timeline.dm | 35 ++--- code/modules/mod/modules/modules_visor.dm | 2 +- .../designs/mechfabricator_designs.dm | 10 +- code/modules/research/techweb/all_nodes.dm | 2 +- code/modules/wiremod/shell/module.dm | 6 +- 24 files changed, 252 insertions(+), 156 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm index 34ac00a867905..ab93efd3715f0 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob.dm @@ -38,7 +38,6 @@ #define COMSIG_MOB_HUD_CREATED "mob_hud_created" //! from base of mob/create_mob_hud(): () #define COMSIG_MOB_ATTACK_HAND_TURF "mob_attack_hand_turf" //! from base of turf/attack_hand #define COMSIG_MOB_HAND_ATTACKED "mob_hand_attacked" //! from base of -#define COMSIG_MOB_EQUIPPED_ITEM "mob_equipped_item" //! from base of /item/equipped(): (/mob/user, /obj/item, slot) #define COMSIG_MOB_DROPPED_ITEM "mob_dropped_item" //! from base of /item/dropped(): (/mob/user, /obj/item, loc) #define COMSIG_MOB_APPLY_DAMGE "mob_apply_damage" //! from base of /mob/living/proc/apply_damage(): (damage, damagetype, def_zone) #define COMSIG_MOB_THROW "mob_throw" //! from base of /mob/throw_item(): (atom/target) diff --git a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm index 3ba8820af69c7..fa92890458e12 100644 --- a/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm +++ b/code/__DEFINES/dcs/signals/signals_obj/signals_item/signals_item.dm @@ -5,6 +5,10 @@ // /obj/item signals ///from base of obj/item/equipped(): (/mob/equipper, slot) #define COMSIG_ITEM_EQUIPPED "item_equip" +/// A mob has just equipped an item. Called on [/mob] from base of [/obj/item/equipped()]: (/obj/item/equipped_item, slot) +#define COMSIG_MOB_EQUIPPED_ITEM "mob_equipped_item" +/// A mob has just unequipped an item. +#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item" ///called on [/obj/item] before unequip from base of [mob/proc/doUnEquip]: (force, atom/newloc, no_move, invdrop, silent) #define COMSIG_ITEM_PRE_UNEQUIP "item_pre_unequip" ///only the pre unequip can be cancelled diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 62922d034df1b..60239e398f6aa 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -343,3 +343,11 @@ smoke.effect_type = smoke_type smoke.set_up(range, location) smoke.start() + +/obj/effect/particle_effect/smoke/chem/quick + lifetime = 2 //under lifetime 1, this kills itself the first time it processes, not working. i hate smoke code + opaque = FALSE + alpha = 100 + +/datum/effect_system/smoke_spread/chem/quick + effect_type = /obj/effect/particle_effect/smoke/chem/quick diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 3ca983e6d9e7f..41cd2e1eaf0f1 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -344,6 +344,7 @@ else I.forceMove(newloc) I.dropped(src, was_thrown, silent) + SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent) return TRUE //Outdated but still in use apparently. This should at least be a human proc. diff --git a/code/modules/mod/adding_new_mod.md b/code/modules/mod/adding_new_mod.md index 3532379c8df00..38e1e90d8eb8c 100644 --- a/code/modules/mod/adding_new_mod.md +++ b/code/modules/mod/adding_new_mod.md @@ -29,7 +29,7 @@ For people that want to see additional stuff, we add an extended description wit ``` Next we want to set the statistics, you can view them all in the theme file, so let's just grab our relevant ones, armor, charge and capacity and set them to what we establilished. \ -Currently crew MODsuits should be unarmored in combat relevant stats. +Currently crew MODsuits should be lightly armored in combat relevant stats. ```dm /datum/mod_theme/psychological @@ -40,7 +40,7 @@ Currently crew MODsuits should be unarmored in combat relevant stats. for operating at lower power levels, keeping people sane. As consequence, the capacity \ of the suit has decreased, not being able to fit many modules at all." default_skin = "psychological" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, BLEED = 5) + armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 100, FIRE = 10, ACID = 75, BLEED = 5) complexity_max = DEFAULT_MAX_COMPLEXITY - 7 charge_drain = DEFAULT_CHARGE_DRAIN * 0.5 ``` diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 90a9204cf6490..b6b3b1928d7f9 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -113,7 +113,7 @@ mod_parts += helmet chestplate = new /obj/item/clothing/suit/mod(src) chestplate.mod = src - chestplate.allowed = theme.allowed_suit_storage.Copy() + chestplate.allowed = typecacheof(theme.allowed_suit_storage) mod_parts += chestplate gauntlets = new /obj/item/clothing/gloves/mod(src) gauntlets.mod = src @@ -146,8 +146,7 @@ if(active) STOP_PROCESSING(SSobj, src) for(var/obj/item/mod/module/module as anything in modules) - module.mod = null - modules -= module + uninstall(module, deleting = TRUE) var/atom/deleting_atom if(!QDELETED(helmet)) deleting_atom = helmet @@ -180,8 +179,7 @@ /obj/item/mod/control/obj_destruction(damage_flag) for(var/obj/item/mod/module/module as anything in modules) - for(var/obj/item/item in module) - item.forceMove(drop_location()) + uninstall(module) if(ai) ai.controlled_equipment = null ai.remote_control = null @@ -517,15 +515,14 @@ var/check_range = TRUE return electrocute_mob(user, get_charge_source(), src, 0.7, check_range) -/obj/item/mod/control/proc/install(module, mob/user) - var/obj/item/mod/module/new_module = module +/obj/item/mod/control/proc/install(obj/item/mod/module/new_module, mob/user) for(var/obj/item/mod/module/old_module as anything in modules) if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules)) if(user) balloon_alert(user, "[new_module] incompatible with [old_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return - if(is_type_in_list(module, theme.module_blacklist)) + if(is_type_in_list(new_module, theme.module_blacklist)) if(user) balloon_alert(user, "[src] doesn't accept [new_module]!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) @@ -555,16 +552,15 @@ balloon_alert(user, "[new_module] added") playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) -/obj/item/mod/control/proc/uninstall(module) - var/obj/item/mod/module/old_module = module +/obj/item/mod/control/proc/uninstall(obj/item/mod/module/old_module, deleting = FALSE) modules -= old_module complexity -= old_module.complexity if(active) - old_module.on_suit_deactivation() + old_module.on_suit_deactivation(deleting = deleting) if(old_module.active) - old_module.on_deactivation(display_message = TRUE) + old_module.on_deactivation(display_message = !deleting, deleting = deleting) + old_module.on_uninstall(deleting = deleting) QDEL_LIST(old_module.pinned_to) - old_module.on_uninstall() old_module.mod = null /obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index e4a04238ad60b..4f2bf91957dad 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -940,6 +940,12 @@ slowdown_active = 0.25 ui_theme = "wizard" inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) + allowed_suit_storage = list( + /obj/item/tank/internals, + /obj/item/teleportation_scroll, + //obj/item/highfrequencyblade/wizard, + /obj/item/gun/magic, + ) skins = list( "enchanted" = list( HELMET_LAYER = null, diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 456d9661f7540..5ba08083923f8 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -108,9 +108,9 @@ applied_cell = /obj/item/stock_parts/cell/high/plus initial_modules = list( /obj/item/mod/module/storage, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - //obj/item/mod/module/mister/security, + //obj/item/mod/module/pepper_shoulders, ) /obj/item/mod/control/pre_equipped/safeguard @@ -118,10 +118,10 @@ applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/large_capacity, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, - /obj/item/mod/module/holster, - //obj/item/mod/module/mister/security, + //obj/item/mod/module/pepper_shoulders, ) /obj/item/mod/control/pre_equipped/magnate @@ -130,8 +130,8 @@ initial_modules = list( /obj/item/mod/module/storage/large_capacity, //obj/item/mod/module/hat_stabilizer, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, - /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder, ) @@ -139,6 +139,7 @@ theme = /datum/mod_theme/cosmohonk initial_modules = list( /obj/item/mod/module/storage, + /obj/item/mod/module/waddle, /obj/item/mod/module/bikehorn, ) @@ -147,11 +148,11 @@ applied_cell = /obj/item/stock_parts/cell/super initial_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock, - /obj/item/mod/module/holster, ) /obj/item/mod/control/pre_equipped/nuclear @@ -159,10 +160,9 @@ applied_cell = /obj/item/stock_parts/cell/hyper initial_modules = list( /obj/item/mod/module/storage/syndicate, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - /obj/item/mod/module/injector, ) /obj/item/mod/control/pre_equipped/elite @@ -171,20 +171,19 @@ initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, - /obj/item/mod/module/injector, ) /obj/item/mod/control/pre_equipped/elite/flamethrower initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/thermal_regulator, /obj/item/mod/module/jetpack/advanced, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, /obj/item/mod/module/flamethrower, ) @@ -215,8 +214,8 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, ) /// The insignia type, insignias show what sort of member of the ERT you're dealing with. var/insignia_type = /obj/item/mod/module/insignia @@ -263,8 +262,8 @@ /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/flashlight, - /obj/item/mod/module/holster, ) /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander @@ -290,8 +289,8 @@ /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, + /obj/item/mod/module/magnetic_harness, /obj/item/mod/module/jetpack, - /obj/item/mod/module/holster, ) /obj/item/mod/control/pre_equipped/corporate @@ -300,7 +299,7 @@ initial_modules = list( /obj/item/mod/module/storage/bluespace, //obj/item/mod/module/hat_stabilizer, - /obj/item/mod/module/holster, + /obj/item/mod/module/magnetic_harness, ) /obj/item/mod/control/pre_equipped/chrono diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index bb6a70fee1a58..1b67a71e21f2d 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -73,7 +73,7 @@ return /// Called from MODsuit's uninstall() proc, so when the module is uninstalled. -/obj/item/mod/module/proc/on_uninstall() +/obj/item/mod/module/proc/on_uninstall(deleting = FALSE) return /// Called when the MODsuit is activated @@ -81,7 +81,7 @@ return /// Called when the MODsuit is deactivated -/obj/item/mod/module/proc/on_suit_deactivation() +/obj/item/mod/module/proc/on_suit_deactivation(deleting = FALSE) return /// Called when the MODsuit is equipped @@ -145,7 +145,7 @@ return TRUE /// Called when the module is deactivated -/obj/item/mod/module/proc/on_deactivation(display_message = TRUE) +/obj/item/mod/module/proc/on_deactivation(display_message = TRUE, deleting = FALSE) active = FALSE if(module_type == MODULE_ACTIVE) mod.selected_module = null @@ -176,7 +176,7 @@ if(SEND_SIGNAL(src, COMSIG_MODULE_TRIGGERED) & MOD_ABORT_USE) return FALSE COOLDOWN_START(src, cooldown_timer, cooldown_time) - addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_inv_back)), cooldown_time) + addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/mob, update_inv_back)), cooldown_time + 1) //need to run it a bit after the cooldown starts to avoid conflicts mod.wearer.update_inv_back() return TRUE diff --git a/code/modules/mod/modules/module_kinesis.dm b/code/modules/mod/modules/module_kinesis.dm index 2e2aa6e301ede..11c1eb7477e7d 100644 --- a/code/modules/mod/modules/module_kinesis.dm +++ b/code/modules/mod/modules/module_kinesis.dm @@ -66,11 +66,11 @@ kinesis_catcher.RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, TYPE_PROC_REF(/atom/movable/screen/fullscreen/kinesis, on_move)) soundloop.start() -/obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE) +/obj/item/mod/module/anomaly_locked/kinesis/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return - clear_grab() + clear_grab(playsound = !deleting) /obj/item/mod/module/anomaly_locked/kinesis/process(delta_time) if(!mod.wearer.client || mod.wearer.incapacitated(ignore_grab = TRUE)) @@ -97,6 +97,7 @@ if(grabbed_atom.Move(next_turf)) if(isitem(grabbed_atom) && (mod.wearer in next_turf)) var/obj/item/grabbed_item = grabbed_atom + clear_grab() grabbed_item.pickup(mod.wearer) mod.wearer.put_in_hands(grabbed_item) return @@ -219,6 +220,8 @@ COOLDOWN_DECLARE(coordinate_cooldown) /atom/movable/screen/fullscreen/kinesis/proc/on_move(atom/source, atom/oldloc, dir, forced) + SIGNAL_HANDLER + if(given_turf) var/x_offset = source.loc.x - oldloc.x var/y_offset = source.loc.y - oldloc.y diff --git a/code/modules/mod/modules/modules_antag.dm b/code/modules/mod/modules/modules_antag.dm index b34d36963d7f8..d8a1f1f87aaeb 100644 --- a/code/modules/mod/modules/modules_antag.dm +++ b/code/modules/mod/modules/modules_antag.dm @@ -28,7 +28,9 @@ /obj/item/mod/module/armor_booster/on_suit_activation() mod.helmet.flash_protect = FLASH_PROTECTION_WELDER -/obj/item/mod/module/armor_booster/on_suit_deactivation() +/obj/item/mod/module/armor_booster/on_suit_deactivation(deleting = FALSE) + if(deleting) + return mod.helmet.flash_protect = initial(mod.helmet.flash_protect) /obj/item/mod/module/armor_booster/on_activation() @@ -48,11 +50,12 @@ clothing_part.clothing_flags &= ~STOPSPRESSUREDAMAGE spaceproofed[clothing_part] = TRUE -/obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE) +/obj/item/mod/module/armor_booster/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return - playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + if(!deleting) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) mod.slowdown -= added_slowdown mod.wearer.update_equipment_speed_mods() var/list/parts = mod.mod_parts + mod @@ -113,7 +116,7 @@ charge_recovery = charge_recovery, lose_multiple_charges = lose_multiple_charges, recharge_path = recharge_path, starting_charges = charges, shield_icon_file = shield_icon_file, shield_icon = shield_icon) RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, PROC_REF(shield_reaction)) -/obj/item/mod/module/energy_shield/on_suit_deactivation() +/obj/item/mod/module/energy_shield/on_suit_deactivation(deleting = FALSE) var/datum/component/shielded/shield = mod.GetComponent(/datum/component/shielded) charges = shield.current_charges qdel(shield) @@ -157,7 +160,7 @@ mod.wearer.AddComponent(/datum/component/anti_magic, MOD_TRAIT, _magic = TRUE, _holy = FALSE) mod.wearer.AddComponent(/datum/component/anti_magic, MOD_TRAIT, _magic = FALSE, _holy = TRUE) -/obj/item/mod/module/anti_magic/on_suit_deactivation() +/obj/item/mod/module/anti_magic/on_suit_deactivation(deleting = FALSE) for (var/datum/component/anti_magic/anti_magic in mod.wearer.GetComponents(/datum/component/anti_magic)) if (anti_magic.source == MOD_TRAIT) qdel(anti_magic) @@ -176,7 +179,7 @@ /obj/item/mod/module/anti_magic/wizard/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) -/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() +/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) ///Insignia - Gives you a skin specific stripe. @@ -233,7 +236,7 @@ /obj/item/mod/module/noslip/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) -/obj/item/mod/module/noslip/on_suit_deactivation() +/obj/item/mod/module/noslip/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) ///Flamethrower - Launches fire across the area. diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index f0ca37a33c3b6..2511eb99afa3e 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -14,7 +14,9 @@ /obj/item/mod/module/welding/on_suit_activation() mod.helmet.flash_protect = FLASH_PROTECTION_WELDER -/obj/item/mod/module/welding/on_suit_deactivation() +/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE) + if(deleting) + return mod.helmet.flash_protect = initial(mod.helmet.flash_protect) ///T-Ray Scan - Scans the terrain for undertile objects. @@ -61,7 +63,7 @@ mod.wearer.update_gravity(mod.wearer.has_gravity()) mod.wearer.update_equipment_speed_mods() -/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE) +/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -157,7 +159,7 @@ for(var/obj/item/part in mod.mod_parts) ADD_TRAIT(part, TRAIT_RADIATION_PROTECTED_CLOTHING, MOD_TRAIT) -/obj/item/mod/module/rad_protection/on_suit_deactivation() +/obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) qdel(GetComponent(/datum/component/geiger_sound)) REMOVE_TRAIT(mod.wearer, TRAIT_BYPASS_EARLY_IRRADIATED_CHECK, MOD_TRAIT) UnregisterSignal(mod.wearer, COMSIG_IN_RANGE_OF_IRRADIATION) @@ -196,7 +198,7 @@ /obj/item/mod/module/constructor/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) -/obj/item/mod/module/constructor/on_suit_deactivation() +/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) /obj/item/mod/module/constructor/on_use() diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index 845613e035cca..1402e25062b97 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -34,13 +34,14 @@ SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, FALSE) RegisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_chestplate_unequip)) -/obj/item/mod/module/storage/on_uninstall() +/obj/item/mod/module/storage/on_uninstall(deleting = FALSE) var/datum/component/storage/modstorage = mod.GetComponent(/datum/component/storage) storage.slaves -= modstorage qdel(modstorage) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) - SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) UnregisterSignal(mod.chestplate, COMSIG_ITEM_PRE_UNEQUIP) + if(!deleting) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_QUICK_EMPTY, drop_location()) + SEND_SIGNAL(src, COMSIG_TRY_STORAGE_SET_LOCKSTATE, TRUE) /obj/item/mod/module/storage/proc/on_chestplate_unequip(obj/item/source, force, atom/newloc, no_move, invdrop, silent) if(QDELETED(source) || newloc == mod.wearer || !mod.wearer.s_store) @@ -119,7 +120,7 @@ if(full_speed) mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) -/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE) +/obj/item/mod/module/jetpack/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -199,16 +200,14 @@ /obj/item/mod/module/mouthhole/on_install() former_flags = mod.helmet.flags_cover former_visor_flags = mod.helmet.visor_flags_cover - if(former_flags & HEADCOVERSMOUTH) - mod.helmet.flags_cover &= ~HEADCOVERSMOUTH - if(former_visor_flags & HEADCOVERSMOUTH) - mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH + mod.helmet.flags_cover &= ~HEADCOVERSMOUTH + mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH -/obj/item/mod/module/mouthhole/on_uninstall() - if(former_flags & HEADCOVERSMOUTH) - mod.helmet.flags_cover |= HEADCOVERSMOUTH - if(former_visor_flags & HEADCOVERSMOUTH) - mod.helmet.visor_flags_cover |= HEADCOVERSMOUTH +/obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) + if(deleting) + return + mod.helmet.flags_cover |= former_flags + mod.helmet.visor_flags_cover |= former_visor_flags ///EMP Shield - Protects the suit from EMPs. /obj/item/mod/module/emp_shield @@ -224,7 +223,7 @@ /obj/item/mod/module/emp_shield/on_install() mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) -/obj/item/mod/module/emp_shield/on_uninstall() +/obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE) mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) ///Flashlight - Gives the suit a customizable flashlight. @@ -260,7 +259,7 @@ set_light_on(active) active_power_cost = base_power * light_range -/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE) +/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -347,7 +346,7 @@ /obj/item/mod/module/longfall/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, PROC_REF(z_impact_react)) -/obj/item/mod/module/longfall/on_suit_deactivation() +/obj/item/mod/module/longfall/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) /obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) @@ -410,7 +409,7 @@ RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, PROC_REF(on_emp)) //RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, PROC_REF(on_emag)) -/obj/item/mod/module/dna_lock/on_uninstall() +/obj/item/mod/module/dna_lock/on_uninstall(deleting = FALSE) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm index ef181c245a858..92d571a7de826 100644 --- a/code/modules/mod/modules/modules_maint.dm +++ b/code/modules/mod/modules/modules_maint.dm @@ -14,13 +14,13 @@ /obj/item/mod/module/springlock/on_install() mod.activation_step_time *= 0.5 -/obj/item/mod/module/springlock/on_uninstall() +/obj/item/mod/module/springlock/on_uninstall(deleting = FALSE) mod.activation_step_time *= 2 /* /obj/item/mod/module/springlock/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS, PROC_REF(on_wearer_exposed)) -/obj/item/mod/module/springlock/on_suit_deactivation() +/obj/item/mod/module/springlock/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_ATOM_EXPOSE_REAGENTS) */ @@ -105,13 +105,15 @@ if(selection) SEND_SOUND(mod.wearer, sound(selection.song_path, volume = 50, channel = CHANNEL_JUKEBOX)) -/obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE) +/obj/item/mod/module/visor/rave/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return QDEL_NULL(rave_screen) if(selection) mod.wearer.stop_sound_channel(CHANNEL_JUKEBOX) + if(deleting) + return SEND_SOUND(mod.wearer, sound('sound/machines/terminal_off.ogg', volume = 50, channel = CHANNEL_JUKEBOX)) /obj/item/mod/module/visor/rave/generate_worn_overlay(mutable_appearance/standing) @@ -284,14 +286,15 @@ //ADD_TRAIT(mod.wearer, TRAIT_SILENT_FOOTSTEPS, MOD_TRAIT) check_upstairs() //todo at some point flip your screen around -/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE) - if(you_fucked_up) +/obj/item/mod/module/atrocinator/on_deactivation(display_message = TRUE, deleting = FALSE) + if(you_fucked_up && !deleting) to_chat(mod.wearer, "It's too late.") return FALSE . = ..() if(!.) return - playsound(src, 'sound/effects/curseattack.ogg', 50) + if(deleting) + playsound(src, 'sound/effects/curseattack.ogg', 50) qdel(mod.wearer.RemoveElement(/datum/element/forced_gravity, NEGATIVE_GRAVITY)) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) step_count = 0 diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm index 94740cd865d11..6869b5ab8eb4b 100644 --- a/code/modules/mod/modules/modules_medical.dm +++ b/code/modules/mod/modules/modules_medical.dm @@ -73,7 +73,7 @@ /obj/item/mod/module/quick_carry/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) -/obj/item/mod/module/quick_carry/on_suit_deactivation() +/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_CARRY, MOD_TRAIT) /obj/item/mod/module/quick_carry/advanced @@ -85,7 +85,7 @@ ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) ADD_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) -/obj/item/mod/module/quick_carry/on_suit_deactivation() +/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) REMOVE_TRAIT(mod.wearer, TRAIT_FASTMED, MOD_TRAIT) diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm index e071d738f1c5e..6e1ffa413f5a1 100644 --- a/code/modules/mod/modules/modules_science.dm +++ b/code/modules/mod/modules/modules_science.dm @@ -19,7 +19,7 @@ return ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) -/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE) +/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -38,7 +38,7 @@ mod.wearer.research_scanner++ RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, PROC_REF(sense_explosion)) -/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE) +/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -77,12 +77,14 @@ mod.wearer.update_gravity(mod.wearer.has_gravity()) playsound(src, 'sound/effects/gravhit.ogg', 50) -/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE) +/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return mod.wearer.RemoveElement(/datum/element/forced_gravity, 0) mod.wearer.update_gravity(mod.wearer.has_gravity()) + if(deleting) + return if(mod.wearer.has_gravity()) new /obj/effect/temp_visual/mook_dust(get_turf(src)) playsound(src, 'sound/effects/gravhit.ogg', 50) diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 7d52aedf7a4aa..392c9adb2b804 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -30,7 +30,7 @@ animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) drain_power(use_power_cost) -/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE) +/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -45,7 +45,7 @@ to_chat(mod.wearer, "[src] gets discharged from contact!") do_sparks(2, TRUE, src) drain_power(use_power_cost) - on_deactivation(display_message = TRUE) + on_deactivation(display_message = TRUE, deleting = FALSE) /obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) SIGNAL_HANDLER @@ -75,51 +75,98 @@ use_power_cost = DEFAULT_CHARGE_DRAIN * 5 cooldown_time = 3 SECONDS -///Holster - Instantly holsters any not huge gun. -/obj/item/mod/module/holster - desc = "Based off typical storage compartments, this system allows the suit to holster a \ - standard firearm across its surface and allow for extremely quick retrieval. \ - While some users prefer the chest, others the forearm for quick deployment, \ - some law enforcement prefer the holster to extend from the thigh." - icon_state = "holster" - module_type = MODULE_USABLE +///Magnetic Harness - Automatically puts guns in your suit storage when you drop them. +/obj/item/mod/module/magnetic_harness + name = "MOD magnetic harness module" + desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer." + icon_state = "mag_harness" complexity = 2 - use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 - incompatible_modules = list(/obj/item/mod/module/holster) - cooldown_time = 0.5 SECONDS - /// Gun we have holstered. - var/obj/item/gun/holstered + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/magnetic_harness) + /// Time before we activate the magnet. + var/magnet_delay = 0.8 SECONDS + /// The typecache of all guns we allow. + var/static/list/guns_typecache + /// The guns already allowed by the modsuit chestplate. + var/list/already_allowed_guns = list() + +/obj/item/mod/module/magnetic_harness/Initialize(mapload) + . = ..() + if(!guns_typecache) + guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe)) + +/obj/item/mod/module/magnetic_harness/on_install() + already_allowed_guns = guns_typecache & mod.chestplate.allowed + mod.chestplate.allowed |= guns_typecache + +/obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE) + if(deleting) + return + mod.chestplate.allowed -= (guns_typecache - already_allowed_guns) + +/obj/item/mod/module/magnetic_harness/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, .proc/check_dropped_item) + +/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM) + +/obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location) + SIGNAL_HANDLER + + if(!is_type_in_typecache(dropped_item, guns_typecache)) + return + if(new_location != get_turf(src)) + return + addtimer(CALLBACK(src, .proc/pick_up_item, dropped_item), magnet_delay) + +/obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item) + if(!isturf(item.loc) || !item.Adjacent(mod.wearer)) + return + if(!mod.wearer.equip_to_slot_if_possible(item, ITEM_SLOT_SUITSTORE, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE) + balloon_alert(mod.wearer, "[item] reattached") + drain_power(use_power_cost) + +/* +///Pepper Shoulders - When hit, reacts with a spray of pepper spray around the user. +/obj/item/mod/module/pepper_shoulders + name = "MOD pepper shoulders module" + desc = "A module that attaches two pepper sprayers on shoulders of a MODsuit, reacting to touch with a spray around the user." + icon_state = "pepper_shoulder" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/pepper_shoulders) + cooldown_time = 5 SECONDS + overlay_state_inactive = "module_pepper" + overlay_state_use = "module_pepper_used" + +/obj/item/mod/module/pepper_shoulders/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, .proc/on_check_shields) -/obj/item/mod/module/holster/on_use() +/obj/item/mod/module/pepper_shoulders/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) + +/obj/item/mod/module/pepper_shoulders/on_use() . = ..() if(!.) return - if(!holstered) - var/obj/item/gun/holding = mod.wearer.get_active_held_item() - if(!holding) - balloon_alert(mod.wearer, "nothing to holster!") - return - if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) - balloon_alert(mod.wearer, "it doesn't fit!") - return - if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) - holstered = holding - balloon_alert(mod.wearer, "weapon holstered") - playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) - drain_power(use_power_cost) - else if(mod.wearer.put_in_active_hand(holstered, forced = FALSE, ignore_animation = TRUE)) - balloon_alert(mod.wearer, "weapon drawn") - holstered = null - playsound(src, 'sound/weapons/empty.ogg', 100, TRUE) - drain_power(use_power_cost) - else - balloon_alert(mod.wearer, "holster full!") - -/obj/item/mod/module/holster/on_uninstall() - if(holstered) - holstered.forceMove(drop_location()) - holstered = null - -/obj/item/mod/module/holster/Destroy() - QDEL_NULL(holstered) - return ..() + playsound(src, 'sound/effects/spray.ogg', 30, TRUE, -6) + var/datum/reagents/capsaicin_holder = new(10) + capsaicin_holder.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 10) + var/datum/effect_system/smoke_spread/chem/quick/smoke = new + smoke.set_up(capsaicin_holder, 1, get_turf(src)) + smoke.start() + +/obj/item/mod/module/pepper_shoulders/proc/on_check_shields() + SIGNAL_HANDLER + + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + return + if(!check_power(use_power_cost)) + return + mod.wearer.visible_message(span_warning("[src] reacts to the attack with a smoke of pepper spray!"), span_notice("Your [src] releases a cloud of pepper spray!")) + on_use() + +*/ diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index b152200c936f4..0f036c35bcd39 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -73,7 +73,9 @@ if(is_clown_job(mod.wearer.mind?.assigned_role)) SEND_SIGNAL(mod.wearer, COMSIG_ADD_MOOD_EVENT, "clownshoes", /datum/mood_event/clownshoes) -/obj/item/mod/module/waddle/on_suit_deactivation() +/obj/item/mod/module/waddle/on_suit_deactivation(deleting = FALSE) + if(!deleting) + qdel(mod.boots.GetComponent(/datum/component/squeak)) qdel(mod.boots.GetComponent(/datum/component/squeak)) mod.wearer.RemoveElement(/datum/component/waddling) if(is_clown_job(mod.wearer.mind?.assigned_role)) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 604338ef1abdf..7939ccc4b64ea 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -52,17 +52,19 @@ return if(istype(target, /obj/structure/closet/crate) || istype(target, /obj/structure/big_delivery)) var/atom/movable/picked_crate = target - if(length(stored_crates) >= max_crates) - balloon_alert(mod.wearer, "too many crates!") + if(!check_crate_pickup(picked_crate)) return playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) if(!do_after(mod.wearer, load_time, target = target)) balloon_alert(mod.wearer, "interrupted!") return + if(!check_crate_pickup(picked_crate)) + return stored_crates += picked_crate picked_crate.forceMove(src) balloon_alert(mod.wearer, "picked up [picked_crate]") drain_power(use_power_cost) + mod.wearer.update_inv_back() else if(length(stored_crates)) var/turf/target_turf = get_turf(target) if(target_turf.is_blocked_turf()) @@ -77,14 +79,28 @@ dropped_crate.forceMove(target_turf) balloon_alert(mod.wearer, "dropped [dropped_crate]") drain_power(use_power_cost) + mod.wearer.update_inv_back() else balloon_alert(mod.wearer, "invalid target!") -/obj/item/mod/module/clamp/on_suit_deactivation() +/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE) + if(deleting) + return for(var/atom/movable/crate as anything in stored_crates) crate.forceMove(drop_location()) stored_crates -= crate +/obj/item/mod/module/clamp/proc/check_crate_pickup(atom/movable/target) + if(length(stored_crates) >= max_crates) + balloon_alert(mod.wearer, "too many crates!") + return FALSE + for(var/mob/living/mob in target.GetAllContents()) + if(mob.mob_size < MOB_SIZE_HUMAN) + continue + balloon_alert(mod.wearer, "crate too heavy!") + return FALSE + return TRUE + /obj/item/mod/module/clamp/loader name = "MOD loader hydraulic clamp module" icon_state = "clamp_loader" @@ -115,7 +131,7 @@ return RegisterSignal(mod.wearer, COMSIG_MOVABLE_BUMP, PROC_REF(bump_mine)) -/obj/item/mod/module/drill/on_deactivation(display_message = TRUE) +/obj/item/mod/module/drill/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -263,7 +279,7 @@ /obj/item/mod/module/disposal_connector/on_suit_activation() RegisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING, PROC_REF(disposal_handling)) -/obj/item/mod/module/disposal_connector/on_suit_deactivation() +/obj/item/mod/module/disposal_connector/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOVABLE_DISPOSING) /obj/item/mod/module/disposal_connector/get_configuration() @@ -317,7 +333,7 @@ locker.throw_at(mod.wearer, range = 7, speed = 3, force = MOVE_FORCE_WEAK, \ callback = CALLBACK(src, PROC_REF(check_locker), locker)) -/obj/item/mod/module/magnet/on_deactivation(display_message = TRUE) +/obj/item/mod/module/magnet/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return @@ -388,7 +404,7 @@ mod.wearer.weather_immunities += "snow" RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) -/obj/item/mod/module/ash_accretion/on_suit_deactivation() +/obj/item/mod/module/ash_accretion/on_suit_deactivation(deleting = FALSE) mod.wearer.weather_immunities -= "ash" mod.wearer.weather_immunities -= "snow" UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) @@ -484,11 +500,12 @@ mod.wearer.add_movespeed_modifier(/datum/movespeed_modifier/sphere) RegisterSignal(mod.wearer, COMSIG_MOB_STATCHANGE, PROC_REF(on_statchange)) -/obj/item/mod/module/sphere_transform/on_deactivation(display_message = TRUE) +/obj/item/mod/module/sphere_transform/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return - playsound(src, 'sound/items/modsuit/ballout.ogg', 100) + if(!deleting) + playsound(src, 'sound/items/modsuit/ballout.ogg', 100) mod.wearer.base_pixel_y = 0 animate(mod.wearer, animate_time, pixel_y = mod.wearer.base_pixel_y) addtimer(CALLBACK(mod.wearer, TYPE_PROC_REF(/atom, remove_filter), list("mod_ball", "mod_blur", "mod_outline")), animate_time) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 85c778fb41582..8cfd01adb4a60 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -23,7 +23,7 @@ RegisterSignal(mod, COMSIG_MOD_ACTIVATE, PROC_REF(on_mod_activation)) RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, PROC_REF(on_mod_removal)) -/obj/item/mod/module/eradication_lock/on_uninstall() +/obj/item/mod/module/eradication_lock/on_uninstall(deleting = FALSE) UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) @@ -186,7 +186,7 @@ /obj/item/mod/module/timeline_jumper/proc/on_activate_block(datum/source, user) SIGNAL_HANDLER //has to be a to_chat because you're phased out. - to_chat(user, "Deactivating your suit while inbetween timelines would be a very bad idea.") + to_chat(user, "Deactivating your suit while inbetween timelines would be a very bad idea.") return MOD_CANCEL_ACTIVATE ///special subtype for phased mobs. @@ -219,16 +219,17 @@ if(field) field_disconnect(field) //fire projectile - var/obj/projectile/energy/chrono_beam/projectile = new /obj/projectile/energy/chrono_beam(get_turf(src)) + var/obj/projectile/energy/chrono_beam/chrono_beam = new /obj/projectile/energy/chrono_beam(get_turf(src)) + chrono_beam.tem_weakref = WEAKREF(src) + chrono_beam.preparePixelProjectile(target, mod.wearer) + chrono_beam.firer = mod.wearer playsound(src, 'sound/items/modsuit/time_anchor_set.ogg', 50, TRUE) - projectile.tem_weakref = WEAKREF(src) - projectile.firer = mod.wearer - projectile.fired_from = src - projectile.fire(get_angle(mod.wearer, target), target) + INVOKE_ASYNC(chrono_beam, /obj/projectile.proc/fire) -/obj/item/mod/module/tem/on_uninstall() - if(field) - field_disconnect(field) +/obj/item/mod/module/tem/on_uninstall(deleting = FALSE) + if(!field) + return + field_disconnect(field) /** * ### field_connect @@ -242,14 +243,14 @@ /obj/item/mod/module/tem/proc/field_connect(obj/structure/chrono_field/field) if(field.tem) if(field.captured) - to_chat(mod.wearer, "FAIL: [field.captured] already has an existing connection.") + balloon_alert(mod.wearer, "already has connection!") field_disconnect(field) return startpos = get_turf(mod.wearer) src.field = field field.tem = src if(field.captured) - to_chat(mod.wearer, "Connection established with target: [field.captured]") + balloon_alert(mod.wearer, "connection estabilished") /** * ### field_disconnect @@ -264,7 +265,7 @@ if(field.tem == src) field.tem = null if(field.captured) - to_chat(mod.wearer, "Disconnected from target: [field.captured]") + balloon_alert(mod.wearer, "connection lost!") field = null startpos = null @@ -314,7 +315,7 @@ ///linked module. while this exists, the field will progress towards eradication. while it isn't, the field progresses away until it disappears. see attached for a special case var/obj/item/mod/module/tem/tem ///time in seconds before someone is eradicated, assuming progress isn't interrupted - var/timetokill = 30 + var/timetokill = 3 SECONDS ///the eradication appearance var/mutable_appearance/mob_underlay ///the actual frame the animation is at in eradication, only changing when the progress towards eradication progresses enough to move to the next frame. @@ -369,15 +370,15 @@ freed_movable.forceMove(drop_location()) qdel(src) else if(timetokill <= 0) - to_chat(captured, "As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...") - var/mob/dead/observer/ghost = captured.ghostize(1) + to_chat(captured, "As the last essence of your being is erased from time, you are taken back to your most enjoyable memory. You feel happy...") + var/mob/dead/observer/ghost = captured.ghostize(can_reenter_corpse = TRUE) if(captured.mind) if(ghost) ghost.mind = null qdel(captured) qdel(src) else - captured.Unconscious(80) + captured.Unconscious(8 SECONDS) if(captured.loc != src) captured.forceMove(src) update_appearance() diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm index fdec585fe50e0..9f8593897c827 100644 --- a/code/modules/mod/modules/modules_visor.dm +++ b/code/modules/mod/modules/modules_visor.dm @@ -25,7 +25,7 @@ ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) mod.wearer.update_sight() -/obj/item/mod/module/visor/on_deactivation(display_message = TRUE) +/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE) . = ..() if(!.) return diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index 8536ab7aed48e..b0a716e0d7515 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1073,11 +1073,11 @@ build_path = /obj/item/mod/module/magboot department_type = MODULE_ENGINEERING -/datum/design/module/mod_holster - name = "MOD Module: Holster" - id = "mod_holster" - materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) - build_path = /obj/item/mod/module/holster +/datum/design/module/mod_mag_harness + name = "MOD Module: Magnetic Harness" + id = "mod_mag_harness" + materials = list(/datum/material/iron = 1500, /datum/material/silver = 500) + build_path = /obj/item/mod/module/magnetic_harness department_type = MODULE_SECURITY /datum/design/module/mod_tether diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 089886a6c3c68..72304637087b2 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -1925,7 +1925,7 @@ "mod_plating_security", "mod_visor_sechud", "mod_stealth", - "mod_holster", + "mod_mag_harness", "mod_pathfinder", ) research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index 53daca8b52ae3..c9d13e2000254 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -23,9 +23,13 @@ . = COMPONENT_OVERRIDE_POWER_USAGE /obj/item/mod/module/circuit/on_install() + if(!shell?.attached_circuit) + return RegisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, .proc/override_power_usage) -/obj/item/mod/module/circuit/on_uninstall() +/obj/item/mod/module/circuit/on_uninstall(deleting = FALSE) + if(!shell?.attached_circuit) + return UnregisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE) /obj/item/mod/module/circuit/on_use() From 37b15cc320055bcf1d3af82f84c8d6599ca63273 Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 17:18:29 -0400 Subject: [PATCH 059/162] https://github.com/tgstation/tgstation/pull/66190 --- code/modules/mod/mod_control.dm | 4 ++-- code/modules/mod/mod_paint.dm | 2 +- code/modules/mod/mod_types.dm | 12 +++++++++--- code/modules/mod/mod_ui.dm | 2 +- code/modules/mod/modules/modules_security.dm | 6 +++--- code/modules/mod/modules/modules_timeline.dm | 2 +- code/modules/wiremod/shell/module.dm | 12 ++++++------ tgui/packages/tgui/interfaces/MODsuit.js | 2 +- 8 files changed, 24 insertions(+), 18 deletions(-) diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index b6b3b1928d7f9..eee55ddd3ec4f 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -201,7 +201,7 @@ . += "You could close the cover with a screwdriver." . += "You could use modules on it to install them." . += "You could remove modules with a crowbar." - . += "You could update the access with an ID." + . += "You could update the access lock with an ID." . += "You could access the wire panel with a wire tool." if(core) . += "You could remove [core] with a wrench." @@ -389,7 +389,7 @@ /obj/item/mod/control/on_emag(mob/user) ..() locked = !locked - balloon_alert(user, "[locked ? "locked" : "unlocked"]") + balloon_alert(user, "suit access [locked ? "locked" : "unlocked"]") /obj/item/mod/control/emp_act(severity) . = ..() diff --git a/code/modules/mod/mod_paint.dm b/code/modules/mod/mod_paint.dm index f4776986757ec..1e936e8c594c5 100644 --- a/code/modules/mod/mod_paint.dm +++ b/code/modules/mod/mod_paint.dm @@ -146,7 +146,7 @@ var/list/skins = list() for(var/mod_skin in mod.theme.skins) skins[mod_skin] = image(icon = mod.icon, icon_state = "[mod_skin]-control") - var/pick = show_radial_menu(user, mod, skins, custom_check = CALLBACK(src, .proc/check_menu, mod, user), require_near = TRUE) + var/pick = show_radial_menu(user, mod, skins, custom_check = CALLBACK(src, PROC_REF(check_menu), mod, user), require_near = TRUE) if(!pick) balloon_alert(user, "no skin picked!") return diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index 5ba08083923f8..c82391466d4a0 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -158,6 +158,7 @@ /obj/item/mod/control/pre_equipped/nuclear theme = /datum/mod_theme/syndicate applied_cell = /obj/item/stock_parts/cell/hyper + req_access = list(ACCESS_SYNDICATE) initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/magnetic_harness, @@ -168,6 +169,7 @@ /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite applied_cell = /obj/item/stock_parts/cell/bluespace + req_access = list(ACCESS_SYNDICATE) initial_modules = list( /obj/item/mod/module/storage/syndicate, /obj/item/mod/module/emp_shield, @@ -198,6 +200,7 @@ /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype + req_access = list(ACCESS_AWAY_GENERAL) applied_cell = /obj/item/stock_parts/cell/high/plus initial_modules = list( /obj/item/mod/module/storage, @@ -210,6 +213,7 @@ /obj/item/mod/control/pre_equipped/responsory theme = /datum/mod_theme/responsory applied_cell = /obj/item/stock_parts/cell/hyper + req_access = list(ACCESS_CENT_GENERAL) initial_modules = list( /obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, @@ -285,6 +289,7 @@ /obj/item/mod/control/pre_equipped/apocryphal theme = /datum/mod_theme/apocryphal applied_cell = /obj/item/stock_parts/cell/bluespace + req_access = list(ACCESS_CENT_SPECOPS) initial_modules = list( /obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, @@ -296,6 +301,7 @@ /obj/item/mod/control/pre_equipped/corporate theme = /datum/mod_theme/corporate applied_core = /obj/item/mod/core/infinite + req_access = list(ACCESS_CENT_SPECOPS) initial_modules = list( /obj/item/mod/module/storage/bluespace, //obj/item/mod/module/hat_stabilizer, @@ -343,10 +349,10 @@ /obj/item/mod/control/pre_equipped/syndicate_empty theme = /datum/mod_theme/syndicate +/obj/item/mod/control/pre_equipped/syndicate_empty/honkerative + applied_skin = "honkerative" + /obj/item/mod/control/pre_equipped/syndicate_empty/elite theme = /datum/mod_theme/elite INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty) - -/obj/item/mod/control/pre_equipped/syndicate_empty/honkerative - applied_skin = "honkerative" diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 326ae54d4c283..b37a79dc77554 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -55,7 +55,7 @@ . = ..() if(.) return - if(!allowed(usr) && locked) + if(locked && !allowed(usr)) balloon_alert(usr, "insufficient access!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm index 392c9adb2b804..d6314f27f8cd0 100644 --- a/code/modules/mod/modules/modules_security.dm +++ b/code/modules/mod/modules/modules_security.dm @@ -105,7 +105,7 @@ mod.chestplate.allowed -= (guns_typecache - already_allowed_guns) /obj/item/mod/module/magnetic_harness/on_suit_activation() - RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, .proc/check_dropped_item) + RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, PROC_REF(check_dropped_item)) /obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM) @@ -117,7 +117,7 @@ return if(new_location != get_turf(src)) return - addtimer(CALLBACK(src, .proc/pick_up_item, dropped_item), magnet_delay) + addtimer(CALLBACK(src, PROC_REF(pick_up_item), dropped_item), magnet_delay) /obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item) if(!isturf(item.loc) || !item.Adjacent(mod.wearer)) @@ -143,7 +143,7 @@ overlay_state_use = "module_pepper_used" /obj/item/mod/module/pepper_shoulders/on_suit_activation() - RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, .proc/on_check_shields) + RegisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS, PROC_REF(on_check_shields)) /obj/item/mod/module/pepper_shoulders/on_suit_deactivation(deleting = FALSE) UnregisterSignal(mod.wearer, COMSIG_HUMAN_CHECK_SHIELDS) diff --git a/code/modules/mod/modules/modules_timeline.dm b/code/modules/mod/modules/modules_timeline.dm index 8cfd01adb4a60..3c749e71161fd 100644 --- a/code/modules/mod/modules/modules_timeline.dm +++ b/code/modules/mod/modules/modules_timeline.dm @@ -224,7 +224,7 @@ chrono_beam.preparePixelProjectile(target, mod.wearer) chrono_beam.firer = mod.wearer playsound(src, 'sound/items/modsuit/time_anchor_set.ogg', 50, TRUE) - INVOKE_ASYNC(chrono_beam, /obj/projectile.proc/fire) + INVOKE_ASYNC(chrono_beam, TYPE_PROC_REF(/obj/projectile, fire)) /obj/item/mod/module/tem/on_uninstall(deleting = FALSE) if(!field) diff --git a/code/modules/wiremod/shell/module.dm b/code/modules/wiremod/shell/module.dm index c9d13e2000254..b8b1a58cbb15d 100644 --- a/code/modules/wiremod/shell/module.dm +++ b/code/modules/wiremod/shell/module.dm @@ -25,7 +25,7 @@ /obj/item/mod/module/circuit/on_install() if(!shell?.attached_circuit) return - RegisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, .proc/override_power_usage) + RegisterSignal(shell?.attached_circuit, COMSIG_CIRCUIT_PRE_POWER_USAGE, PROC_REF(override_power_usage)) /obj/item/mod/module/circuit/on_uninstall(deleting = FALSE) if(!shell?.attached_circuit) @@ -111,7 +111,7 @@ . = ..() if(istype(shell, /obj/item/mod/module)) attached_module = shell - RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, .proc/on_move) + RegisterSignal(attached_module, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) /obj/item/circuit_component/mod_adapter_core/unregister_shell(atom/movable/shell) UnregisterSignal(attached_module, COMSIG_MOVABLE_MOVED) @@ -126,15 +126,15 @@ if(potential_module.name == module_to_select.value) module = potential_module if(COMPONENT_TRIGGERED_BY(toggle_suit, port)) - INVOKE_ASYNC(attached_module.mod, /obj/item/mod/control.proc/toggle_activate, attached_module.mod.wearer) + INVOKE_ASYNC(attached_module.mod, TYPE_PROC_REF(/obj/item/mod/control, toggle_activate), attached_module.mod.wearer) if(attached_module.mod.active && module && COMPONENT_TRIGGERED_BY(select_module, port)) - INVOKE_ASYNC(module, /obj/item/mod/module.proc/on_select) + INVOKE_ASYNC(module, TYPE_PROC_REF(/obj/item/mod/module, on_select)) /obj/item/circuit_component/mod_adapter_core/proc/on_move(atom/movable/source, atom/old_loc, dir, forced) SIGNAL_HANDLER if(istype(source.loc, /obj/item/mod/control)) - RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, .proc/on_module_select) - RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, .proc/equip_check) + RegisterSignal(source.loc, COMSIG_MOD_MODULE_SELECTED, PROC_REF(on_module_select)) + RegisterSignal(source.loc, COMSIG_ITEM_EQUIPPED, PROC_REF(equip_check)) equip_check() else if(istype(old_loc, /obj/item/mod/control)) UnregisterSignal(old_loc, list(COMSIG_MOD_MODULE_SELECTED, COMSIG_ITEM_EQUIPPED)) diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 5b5e338b4ea3e..1e6a10a99e73e 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -289,7 +289,7 @@ const ParametersSection = (props, context) => { {status} act('lock')} /> }> From d717f9692f90e9e60c2353d9e65cedea70259db5 Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 17:21:59 -0400 Subject: [PATCH 060/162] https://github.com/tgstation/tgstation/pull/66196 --- code/__HELPERS/atoms.dm | 14 +++++++++++++ .../crossbreeding/_status_effects.dm | 20 ++++++++++++++++++- .../xenobiology/crossbreeding/stabilized.dm | 15 ++++++++++++++ 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/code/__HELPERS/atoms.dm b/code/__HELPERS/atoms.dm index 4c01a81ba4f7c..10b0f3399afc3 100644 --- a/code/__HELPERS/atoms.dm +++ b/code/__HELPERS/atoms.dm @@ -322,6 +322,20 @@ B --><-- A /proc/pass(...) return +///Returns a list of the parents of all storage components that contain the target item +/proc/get_storage_locs(obj/item/target) + . = list() + if(!istype(target) || !(target.item_flags & IN_STORAGE)) + return + var/datum/component/storage/concrete/storage_datum = target.loc.GetComponent(/datum/component/storage/concrete) + if(!storage_datum) + return + . += storage_datum.parent + for(var/datum/component/storage/slave as anything in storage_datum.slaves) + if(!isatom(slave.parent)) + continue + . += slave.parent + /proc/get_final_z(atom/A) var/turf/T = get_turf(A) return T ? T.z : A.z diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index d348f5b29ed57..48b885f7a6aa5 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -447,11 +447,29 @@ var/obj/item/slimecross/stabilized/linked_extract var/colour = "null" +/datum/status_effect/stabilized/proc/location_check() + if(linked_extract.loc == owner) + return TRUE + if(linked_extract.loc.loc == owner) + return TRUE + for(var/atom/storage_loc as anything in get_storage_locs(linked_extract)) + if(storage_loc == owner) + return TRUE + if(storage_loc.loc == owner) + return TRUE + for(var/atom/storage_loc_storage_loc as anything in get_storage_locs(storage_loc)) + if(storage_loc_storage_loc == owner) + return TRUE + for(var/atom/loc_storage_loc as anything in get_storage_locs(linked_extract.loc)) + if(loc_storage_loc == owner) + return TRUE + return FALSE + /datum/status_effect/stabilized/tick() if(!linked_extract || !linked_extract.loc) //Sanity checking qdel(src) return - if(linked_extract.loc != owner && linked_extract.loc.loc != owner) + if(linked_extract && !location_check()) linked_extract.linked_effect = null if(!QDELETED(linked_extract)) linked_extract.owner = null diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm index aef50b1ff90d0..423b78414c568 100644 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ b/code/modules/research/xenobiology/crossbreeding/stabilized.dm @@ -29,6 +29,21 @@ Stabilized extracts: humanfound = loc if(ishuman(loc.loc)) //Check if in backpack. humanfound = (loc.loc) + for(var/atom/storage_loc as anything in get_storage_locs(src)) + if(ishuman(storage_loc)) + humanfound = storage_loc + break + if(ishuman(storage_loc.loc)) + humanfound = storage_loc.loc + break + for(var/atom/storage_loc_storage_loc as anything in get_storage_locs(storage_loc)) + if(ishuman(storage_loc_storage_loc)) + humanfound = storage_loc_storage_loc + break + for(var/atom/loc_storage_loc as anything in get_storage_locs(loc)) + if(ishuman(loc_storage_loc)) + humanfound = loc_storage_loc + break if(!humanfound) return var/mob/living/carbon/human/H = humanfound From f056f3555dc8d15f3bbe79edf6aefa104e4a1826 Mon Sep 17 00:00:00 2001 From: RKz Date: Thu, 29 Aug 2024 17:39:58 -0400 Subject: [PATCH 061/162] https://github.com/tgstation/tgstation/pull/66208 --- code/modules/mod/mod_activation.dm | 17 ++++++++-------- code/modules/mod/mod_control.dm | 31 +++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 18 deletions(-) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index e0489c9b17935..1efc050686f94 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -145,23 +145,23 @@ module.on_deactivation(display_message = FALSE) activating = TRUE to_chat(wearer, "MODsuit [active ? "shutting down" : "starting up"].") - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) to_chat(wearer, "[boots] [active ? "relax their grip on your legs" : "seal around your feet"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(boots, seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) to_chat(wearer, "[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(gauntlets, seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) to_chat(wearer, "[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(chestplate,seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) to_chat(wearer, "[helmet] hisses [active ? "open" : "closed"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(helmet, seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS)) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) to_chat(wearer, "Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].") if(ai) to_chat(ai, "SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"") @@ -223,10 +223,6 @@ update_icon_state() wearer.update_inv_back() -/obj/item/mod/control/update_icon_state() - icon_state = "[skin]-control[active ? "-sealed" : ""]" - return ..() - /// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. /obj/item/mod/control/proc/quick_activation() var/seal = TRUE @@ -239,4 +235,7 @@ seal_part(part, seal = TRUE) finish_activation(on = TRUE) +/obj/item/mod/control/proc/has_wearer() + return wearer + #undef MOD_ACTIVATION_STEP_FLAGS diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index eee55ddd3ec4f..eba85231a4791 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -248,6 +248,24 @@ if(slot == ITEM_SLOT_BACK) return TRUE + +/obj/item/mod/control/Moved(atom/old_loc, movement_dir, forced = FALSE, list/old_locs) + . = ..() + if(!wearer || old_loc != wearer || loc == wearer) + return + if(active || activating) + for(var/obj/item/mod/module/module as anything in modules) + if(!module.active) + continue + module.on_deactivation(display_message = FALSE) + for(var/obj/item/part as anything in mod_parts) + seal_part(part, seal = FALSE) + for(var/obj/item/part as anything in mod_parts) + conceal(null, part) + if(active) + finish_activation(on = FALSE) + unset_wearer() + /obj/item/mod/control/allow_attack_hand_drop(mob/user) if(user != wearer) return ..() @@ -430,11 +448,14 @@ icon_state = "[skin]-[base_icon_state][active ? "-sealed" : ""]" return ..() +/obj/item/mod/control/update_icon_state() + icon_state = "[skin]-control[active ? "-sealed" : ""]" + return ..() + /obj/item/mod/control/proc/set_wearer(mob/user) wearer = user SEND_SIGNAL(src, COMSIG_MOD_WEARER_SET, wearer) RegisterSignal(wearer, COMSIG_ATOM_EXITED, PROC_REF(on_exit)) - RegisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP, PROC_REF(on_unequip)) update_charge_alert() for(var/obj/item/mod/module/module as anything in modules) module.on_equip() @@ -443,18 +464,10 @@ for(var/obj/item/mod/module/module as anything in modules) module.on_unequip() UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)) - UnregisterSignal(src, COMSIG_ITEM_PRE_UNEQUIP) wearer.clear_alert("mod_charge") SEND_SIGNAL(src, COMSIG_MOD_WEARER_UNSET, wearer) wearer = null -/obj/item/mod/control/proc/on_unequip() - SIGNAL_HANDLER - - for(var/obj/item/part as anything in mod_parts) - if(part.loc != src) - return COMPONENT_ITEM_BLOCK_UNEQUIP - /obj/item/mod/control/proc/update_flags() var/list/used_skin = theme.skins[skin] for(var/obj/item/clothing/part as anything in mod_parts) From 7f609c12c3153bc84d10fd5bfd10292055a9664c Mon Sep 17 00:00:00 2001 From: Tsar-Salat <62388554+Tsar-Salat@users.noreply.github.com> Date: Fri, 30 Aug 2024 09:46:46 -0400 Subject: [PATCH 062/162] techweb --- code/modules/mod/mod_activation.dm | 10 +++++----- .../research/designs/wiremod_designs.dm | 5 +++++ code/modules/research/techweb/all_nodes.dm | 2 +- icons/obj/clothing/modsuit/mod_modules.dmi | Bin 41257 -> 55978 bytes 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index 1efc050686f94..f487b2e41dfa2 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -145,23 +145,23 @@ module.on_deactivation(display_message = FALSE) activating = TRUE to_chat(wearer, "MODsuit [active ? "shutting down" : "starting up"].") - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, "[boots] [active ? "relax their grip on your legs" : "seal around your feet"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(boots, seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, "[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(gauntlets, seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, "[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(chestplate,seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, "[helmet] hisses [active ? "open" : "closed"].") playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(helmet, seal = !active) - if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, .proc/has_wearer))) + if(do_after(wearer, activation_step_time, wearer, MOD_ACTIVATION_STEP_FLAGS, extra_checks = CALLBACK(src, PROC_REF(has_wearer)))) to_chat(wearer, "Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].") if(ai) to_chat(ai, "SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"") diff --git a/code/modules/research/designs/wiremod_designs.dm b/code/modules/research/designs/wiremod_designs.dm index 675b89f0286d0..d55a5c67a11a8 100644 --- a/code/modules/research/designs/wiremod_designs.dm +++ b/code/modules/research/designs/wiremod_designs.dm @@ -396,6 +396,11 @@ id = "comp_bci_action" build_path = /obj/item/circuit_component/equipment_action/bci +/datum/design/component/mod_action + name = "MOD Action Component" + id = "comp_mod_action" + build_path = /obj/item/circuit_component/equipment_action/mod + /datum/design/component/bci/object_overlay name = "Object Overlay Component" id = "comp_object_overlay" diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 72304637087b2..bedd34ac00f6b 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -125,7 +125,7 @@ "mod_chestplate", "mod_gauntlets", "mod_helmet", - "mod_paint_kit", + //"mod_paint_kit", "mod_shell", "mod_plating_standard", "mod_storage", diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi index f838dbd4aeb30b20be49903f20f36e741f22500f..eb4b0c536ce3cb976cc5cff0d92b3b8f6272e766 100644 GIT binary patch literal 55978 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 QuJ0gK#n&$@ Date: Fri, 30 Aug 2024 09:50:28 -0400 Subject: [PATCH 063/162] prettier --- tgui/packages/tgui/interfaces/MODpaint.js | 108 +++++++--------------- tgui/packages/tgui/interfaces/MODsuit.js | 22 ++--- 2 files changed, 39 insertions(+), 91 deletions(-) diff --git a/tgui/packages/tgui/interfaces/MODpaint.js b/tgui/packages/tgui/interfaces/MODpaint.js index 2854ebc27b7f0..522cc7481f213 100644 --- a/tgui/packages/tgui/interfaces/MODpaint.js +++ b/tgui/packages/tgui/interfaces/MODpaint.js @@ -3,99 +3,51 @@ import { Box, Stack, Section, ByondUi, Slider, Flex, Button } from '../component import { Window } from '../layouts'; import { capitalize } from 'common/string'; -const colorToMatrix = param => { +const colorToMatrix = (param) => { switch (param) { case 'red': - return [ - 1, 0, 0, 0, - 0.25, 0.5, 0, 0, - 0.25, 0, 0.5, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - ]; + return [1, 0, 0, 0, 0.25, 0.5, 0, 0, 0.25, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0]; case 'yellow': - return [ - 0.5, 0.5, 0, 0, - 0.5, 0.5, 0, 0, - 0.25, 0.25, 0.5, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - ]; + return [0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0.25, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0]; case 'green': - return [ - 0.5, 0.25, 0, 0, - 0, 1, 0, 0, - 0, 0.25, 0.5, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - ]; + return [0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0]; case 'teal': - return [ - 0.25, 0.25, 0.25, 0, - 0, 0.5, 0.5, 0, - 0, 0.5, 0.5, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - ]; + return [0.25, 0.25, 0.25, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0]; case 'blue': - return [ - 0.25, 0, 0.25, 0, - 0, 0.5, 0.25, 0, - 0, 0, 1, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - ]; + return [0.25, 0, 0.25, 0, 0, 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0]; case 'purple': - return [ - 0.5, 0, 0.5, 0, - 0.25, 0.5, 0.25, 0, - 0.5, 0, 0.5, 0, - 0, 0, 0, 1, - 0, 0, 0, 0, - ]; + return [0.5, 0, 0.5, 0, 0.25, 0.5, 0.25, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0]; } }; -const displayText = param => { +const displayText = (param) => { switch (param) { case 'r': - return "Red"; + return 'Red'; case 'g': - return "Green"; + return 'Green'; case 'b': - return "Blue"; + return 'Blue'; } }; export const MODpaint = (props, context) => { const { act, data } = useBackend(context); const { mapRef, currentColor } = data; - const [ - [rr, rg, rb, ra], - [gr, gg, gb, ga], - [br, bg, bb, ba], - [ar, ag, ab, aa], - [cr, cg, cb, ca], - ] = currentColor; + const [[rr, rg, rb, ra], [gr, gg, gb, ga], [br, bg, bb, ba], [ar, ag, ab, aa], [cr, cg, cb, ca]] = currentColor; const presets = ['red', 'yellow', 'green', 'teal', 'blue', 'purple']; const prefixes = ['r', 'g', 'b']; return ( - + - + {[0, 1, 2].map((row) => ( -

+
{[0, 1, 2].map((col) => ( - + - + {`${displayText(prefixes[col])}:`} @@ -103,17 +55,18 @@ export const MODpaint = (props, context) => { `${value}%`} + format={(value) => `${value}%`} onDrag={(e, value) => { let retColor = currentColor; - retColor[row*4+col] = value/100; - act("transition_color", { color: retColor }); - }} /> + retColor[row * 4 + col] = value / 100; + act('transition_color', { color: retColor }); + }} + /> ))} @@ -123,7 +76,7 @@ export const MODpaint = (props, context) => {
- {presets.map(preset => ( + {presets.map((preset) => (
@@ -143,7 +96,8 @@ export const MODpaint = (props, context) => { icon="question" color="average" tooltipPosition="top" - tooltip="This is a color matrix. Think of it as editing the image in 3 layers, red, green, and blue, rather than editing the final image like with RGB." /> + tooltip="This is a color matrix. Think of it as editing the image in 3 layers, red, green, and blue, rather than editing the final image like with RGB." + />
@@ -161,7 +116,8 @@ export const MODpaint = (props, context) => { params={{ id: mapRef, type: 'map', - }} /> + }} + />
diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 1e6a10a99e73e..4ff52ce5961cf 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -124,15 +124,7 @@ const RadCounter = (props, context) => { }; const HealthAnalyzer = (props, context) => { - const { - active, - userhealth, - usermaxhealth, - userbrute, - userburn, - usertoxin, - useroxy, - } = props; + const { active, userhealth, usermaxhealth, userbrute, userburn, usertoxin, useroxy } = props; return ( <>
@@ -142,7 +134,7 @@ const HealthAnalyzer = (props, context) => { good: [0.5, Infinity], average: [0.2, 0.5], bad: [-Infinity, 0.2], - }} > + }}>
@@ -155,7 +147,7 @@ const HealthAnalyzer = (props, context) => { good: [-Infinity, 0.2], average: [0.2, 0.5], bad: [0.5, Infinity], - }} > + }}>