From e4e2ff429ec3bfe92d4eb71fdb34705dc5aba340 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:28:36 -0500 Subject: [PATCH 01/95] Simplify kharmaan nymph contains_crystals check --- mods/species/ascent/mobs/nymph/nymph_inventory.dm | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/mods/species/ascent/mobs/nymph/nymph_inventory.dm b/mods/species/ascent/mobs/nymph/nymph_inventory.dm index 12396419807c..e79adb9931d0 100644 --- a/mods/species/ascent/mobs/nymph/nymph_inventory.dm +++ b/mods/species/ascent/mobs/nymph/nymph_inventory.dm @@ -1,13 +1,8 @@ -/mob/living/simple_animal/alien/kharmaan/proc/contains_crystals(var/obj/item/W) - for(var/mat in W.matter) - if(mat == /decl/material/solid/sand) - . += W.matter[mat] - else if(mat == /decl/material/solid/gemstone/crystal) - . += W.matter[mat] - else if(mat == /decl/material/solid/quartz) - . += W.matter[mat] - else if(mat == /decl/material/solid/glass) - . += W.matter[mat] +/mob/living/simple_animal/alien/kharmaan/proc/contains_crystals(var/obj/item/prop) + . += prop.matter[/decl/material/solid/sand] + . += prop.matter[/decl/material/solid/gemstone/crystal] + . += prop.matter[/decl/material/solid/quartz] + . += prop.matter[/decl/material/solid/glass] /datum/inventory_slot/gripper/mouth/nymph/ascent/equipped(var/mob/living/user, var/obj/item/prop, var/redraw_mob = TRUE, var/delete_old_item = TRUE) var/mob/living/simple_animal/alien/kharmaan/nimp = user From 3202ca28a1f12fca306ac462a1b5db345536ab37 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:07:56 -0500 Subject: [PATCH 02/95] Rename supermatter material presets to exotic matter --- code/game/objects/items/blades/spear_improvised.dm | 2 +- code/modules/clothing/suits/armor/craftable.dm | 2 +- code/modules/power/fuel_assembly/fuel_assembly.dm | 2 +- code/modules/power/fusion/fusion_reactions.dm | 11 +++++------ 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/game/objects/items/blades/spear_improvised.dm b/code/game/objects/items/blades/spear_improvised.dm index d9846e8a1a05..9f1a1da24257 100644 --- a/code/game/objects/items/blades/spear_improvised.dm +++ b/code/game/objects/items/blades/spear_improvised.dm @@ -34,7 +34,7 @@ hilt_material = /decl/material/solid/organic/wood/oak force_binding_color = COLOR_GREEN -/obj/item/bladed/polearm/spear/improvised/supermatter +/obj/item/bladed/polearm/spear/improvised/exotic_matter material = /decl/material/solid/exotic_matter hilt_material = /decl/material/solid/organic/wood/ebony force_binding_color = COLOR_INDIGO diff --git a/code/modules/clothing/suits/armor/craftable.dm b/code/modules/clothing/suits/armor/craftable.dm index c73e38510fcb..824a7c5b553b 100644 --- a/code/modules/clothing/suits/armor/craftable.dm +++ b/code/modules/clothing/suits/armor/craftable.dm @@ -33,5 +33,5 @@ material = /decl/material/solid/gemstone/diamond /obj/item/clothing/suit/armor/crafted/gold material = /decl/material/solid/metal/gold -/obj/item/clothing/suit/armor/crafted/supermatter +/obj/item/clothing/suit/armor/crafted/exotic_matter material = /decl/material/solid/exotic_matter diff --git a/code/modules/power/fuel_assembly/fuel_assembly.dm b/code/modules/power/fuel_assembly/fuel_assembly.dm index 6958f2431d2c..0527ee149418 100644 --- a/code/modules/power/fuel_assembly/fuel_assembly.dm +++ b/code/modules/power/fuel_assembly/fuel_assembly.dm @@ -87,7 +87,7 @@ /obj/item/fuel_assembly/tritium material = /decl/material/gas/hydrogen/tritium -/obj/item/fuel_assembly/supermatter +/obj/item/fuel_assembly/exotic_matter material = /decl/material/solid/exotic_matter /obj/item/fuel_assembly/hydrogen diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 73cffcc1529d..5ff951b477b0 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -92,7 +92,7 @@ minimum_reaction_temperature = 10000 // VERY UNIDEAL REACTIONS. -/decl/fusion_reaction/helium_supermatter +/decl/fusion_reaction/helium_exotic_matter p_react = /decl/material/solid/exotic_matter s_react = /decl/material/gas/helium energy_consumption = 0 @@ -101,7 +101,7 @@ instability = 20 * FUSION_PROCESSING_TIME_MULT hidden_from_codex = TRUE -/decl/fusion_reaction/helium_supermatter/handle_reaction_special(var/obj/effect/fusion_em_field/holder) +/decl/fusion_reaction/helium_exotic_matter/handle_reaction_special(var/obj/effect/fusion_em_field/holder) set waitfor = FALSE . = 1 var/datum/event/wormholes/WM = new /datum/event/wormholes(new /datum/event_meta(EVENT_LEVEL_MAJOR)) @@ -112,8 +112,7 @@ qdel(holder) var/radiation_level = rand(100, 200) - // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana - SSradiation.z_radiate(locate(1, 1, holder.z), radiation_level, 1) + SSradiation.z_radiate(origin, radiation_level, respect_maint = TRUE) for(var/mob/living/human/H in global.living_mob_list_) var/turf/T = get_turf(H) @@ -121,10 +120,10 @@ H.set_hallucination(rand(100,150), 51) for(var/obj/machinery/fusion_fuel_injector/I in range(world.view, origin)) - if(I.cur_assembly && I.cur_assembly.material && I.cur_assembly.material.type == /decl/material/solid/exotic_matter) + if(I.cur_assembly && I.cur_assembly.material && I.cur_assembly.material.type == p_react) explosion(get_turf(I), 1, 2, 3) if(!QDELETED(I)) - QDEL_IN(I, 5) + addtimer(CALLBACK(I, TYPE_PROC_REF(/atom, physically_destroyed)), 0.5 SECONDS) sleep(5) explosion(origin, 1, 2, 5) From 070c898c79548cecc678956fa38f9eefb086c89d Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:20:36 -0500 Subject: [PATCH 03/95] Improve modpack modularity for niche edge cases --- code/game/gamemodes/endgame/endgame.dm | 1 + .../endgame/supermatter_cascade/universe.dm | 3 -- code/game/gamemodes/game_mode.dm | 16 +++--- .../objects/items/weapons/secrets_disk.dm | 42 +++++++++++---- code/modules/admin/verbs/grief_fixers.dm | 54 ++++++++++++++----- 5 files changed, 83 insertions(+), 33 deletions(-) diff --git a/code/game/gamemodes/endgame/endgame.dm b/code/game/gamemodes/endgame/endgame.dm index 6d81b42d639f..c1c03164c55a 100644 --- a/code/game/gamemodes/endgame/endgame.dm +++ b/code/game/gamemodes/endgame/endgame.dm @@ -1,3 +1,4 @@ +var/global/universe_has_ended = 0 /********************** * ENDGAME STUFF **********************/ diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm index e9b2d2e40fd4..507097a121eb 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm +++ b/code/game/gamemodes/endgame/supermatter_cascade/universe.dm @@ -1,6 +1,3 @@ -var/global/universe_has_ended = 0 - - /datum/universal_state/supermatter_cascade name = "Supermatter Cascade" desc = "Unknown harmonance affecting universal substructure, converting nearby matter to supermatter." diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index be38f8871efc..c8cc812c4861 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -283,11 +283,10 @@ var/global/list/additional_antag_types = list() for(var/decl/special_role/antag in antag_templates) antag.reset_antag_selection() -/decl/game_mode/proc/announce_ert_disabled() - if(!ert_disabled) - return - - var/list/reasons = list( +/// Gets a list of default reasons for the ERT to be disabled. +/decl/game_mode/proc/possible_ert_disabled_reasons() + // This uses a static var so that modpacks can add default reasons, e.g. "supermatter dust". + var/static/list/reasons = list( "political instability", "quantum fluctuations", "hostile raiders", @@ -319,7 +318,12 @@ var/global/list/additional_antag_types = list() "classified security operations", "a gargantuan glowing goat" ) - command_announcement.Announce("The presence of [pick(reasons)] in the region is tying up all available local emergency resources; emergency response teams cannot be called at this time, and post-evacuation recovery efforts will be substantially delayed.","Emergency Transmission") + return reasons + +/decl/game_mode/proc/announce_ert_disabled() + if(!ert_disabled) + return + command_announcement.Announce("The presence of [pick(possible_ert_disabled_reasons())] in the region is tying up all available local emergency resources; emergency response teams cannot be called at this time, and post-evacuation recovery efforts will be substantially delayed.","Emergency Transmission") /decl/game_mode/proc/check_finished() if(SSevac.evacuation_controller?.round_over() || station_was_nuked) diff --git a/code/game/objects/items/weapons/secrets_disk.dm b/code/game/objects/items/weapons/secrets_disk.dm index ee152b86151a..c5bbf89afb1b 100644 --- a/code/game/objects/items/weapons/secrets_disk.dm +++ b/code/game/objects/items/weapons/secrets_disk.dm @@ -13,19 +13,39 @@ This one has a lengthy legal label on it denoting it the private, copyrighted property of the Expeditionary Corps Organisation." req_access = list(access_rd) +/obj/item/disk/secret_project/proc/get_secret_project_codenames() + var/static/list/codenames = list( + "gamma", "delta", "epsilon", "zeta", "theta", "lambda", "omicron", "sigma", "tau", + "upsilon", "omega", "echelon", "prism", "calypso", "bernoulli", "harmony", "nyx", "fresnel" + ) + +/obj/item/disk/secret_project/proc/get_secret_project_types() + var/static/list/types = list( + "an experimental design for", + "a blueprint to build", + "a long set of theoretical formulas detailing the functioning of" + ) + return types + +/obj/item/disk/secret_project/proc/get_secret_project_nouns() + var/static/list/nouns = list( + "a superluminal artillery cannon", "a supermatter engine", "a fusion engine", "an atmospheric scrubber",\ + "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ + "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ + "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod" + ) + return nouns + +/obj/item/disk/secret_project/proc/get_secret_project_descriptors() + var/static/list/descriptors = list( + "that is extremely powerful", "which is highly efficient", "which is incredibly compact", "created by aliens", + "that runs off of an exotic form of matter", "that runs off of hydrogen gas", "that just looks really cool" + ) + /obj/item/disk/secret_project/Initialize() . = ..() - var/codename = pick("gamma", "delta", "epsilon", "zeta", "theta", "lambda", "omicron", "sigma", "tau",\ - "upsilon", "omega", "echelon", "prism", "calypso", "bernoulli", "harmony", "nyx", "fresnel") - name = "'[codename]' project data disk" - subject = pick("an experimental design for", "a blueprint to build",\ - "a long set of theoretical formulas detailing the functioning of") - subject += " " + pick("a superluminal artillery cannon", "a supermatter engine", "a fusion engine", "an atmospheric scrubber",\ - "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ - "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ - "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod") - subject += " " + pick("that is extremely powerful", "which is highly efficient", "which is incredibly compact",\ - "that runs off of an exotic form of matter", "that runs off of hydrogen gas", "created by aliens", "that just looks really cool") + name = "'[pick(get_secret_project_codenames())]' project data disk" + subject = "[pick(get_secret_project_types())] [pick(get_secret_project_nouns())] [pick(get_secret_project_descriptors())]" /obj/item/disk/secret_project/examine(mob/user) . = ..() diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm index 2394d2a8197f..03b4f40f77bd 100644 --- a/code/modules/admin/verbs/grief_fixers.dm +++ b/code/modules/admin/verbs/grief_fixers.dm @@ -4,35 +4,64 @@ if(!check_rights(R_ADMIN|R_DEBUG)) return - if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. The supermatter engine will also be stopped (to prevent overheat due to removal of coolant). Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") + if(alert("WARNING: Executing this command will perform a full reset of atmosphere. All pipelines will lose any gas that may be in them, and all zones will be reset to contain air mix as on roundstart. This may require any atmos-based generators to shut down. Do not use unless the map is suffering serious atmospheric issues due to grief or bug.", "Full Atmosphere Reboot", "No", "Yes") == "No") return SSstatistics.add_field_details("admin_verb","FA") log_and_message_admins("Full atmosphere reset initiated by [usr].") - to_world("Initiating restart of atmosphere. The server may lag a bit.") + to_world(SPAN_DANGER("Initiating restart of atmosphere. The server may lag a bit.")) sleep(10) var/current_time = world.timeofday + var/list/steps = sortTim(decls_repository.get_decls_of_subtype_unassociated(/decl/atmos_grief_fix_step), /proc/cmp_decl_sort_value_asc) + var/step_count = length(steps) + for(var/step_index in 1 to length(step_count)) + var/decl/atmos_grief_fix_step/fix_step = steps[step_index] + to_chat(usr, "\[[step_index]/[step_count]\] - [fix_step.name].") + fix_step.act() + to_world(SPAN_DANGER("Atmosphere restart completed in [(world.timeofday - current_time)/(1 SECOND)] seconds.")) + +/decl/atmos_grief_fix_step + abstract_type = /decl/atmos_grief_fix_step + var/name + +/decl/atmos_grief_fix_step/proc/act() + return + +/decl/atmos_grief_fix_step/supermatter + name = "Supermatter depowered" + sort_order = 0 + +/decl/atmos_grief_fix_step/supermatter/act() // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) S.power = 0 - to_chat(usr, "\[1/5\] - Supermatter depowered") +/decl/atmos_grief_fix_step/purge_pipenets + name = "All pipenets purged of gas" + sort_order = 1 + +/decl/atmos_grief_fix_step/purge_pipenets/act() // Remove all gases from all pipenets - for(var/net in SSmachines.pipenets) - var/datum/pipe_network/PN = net + for(var/datum/pipe_network/PN as anything in SSmachines.pipenets) for(var/datum/gas_mixture/G in PN.gases) - G.gas = list() + G.gas.Cut() G.update_values() - to_chat(usr, "\[2/5\] - All pipenets purged of gas.") +/decl/atmos_grief_fix_step/delete_zones + name = "All ZAS Zones removed" + sort_order = 2 +/decl/atmos_grief_fix_step/delete_zones/act() // Delete all zones. for(var/zone/Z in SSair.zones) Z.c_invalidate() - to_chat(usr, "\[3/5\] - All ZAS Zones removed.") +/decl/atmos_grief_fix_step/reset_turfs + name = "All turfs reset to roundstart values" + sort_order = 3 +/decl/atmos_grief_fix_step/reset_turfs/act() var/list/unsorted_overlays = list() var/list/all_gasses = decls_repository.get_decls_of_subtype(/decl/material/gas) for(var/id in all_gasses) @@ -41,12 +70,11 @@ for(var/turf/T in world) T.air = null - T.overlays.Remove(unsorted_overlays) T.zone = null - to_chat(usr, "\[4/5\] - All turfs reset to roundstart values.") +/decl/atmos_grief_fix_step/reboot_zas + name = "ZAS Rebooted" + sort_order = 4 +/decl/atmos_grief_fix_step/reboot_zas/act() SSair.reboot() - - to_chat(usr, "\[5/5\] - ZAS Rebooted") - to_world("Atmosphere restart completed in [(world.timeofday - current_time)/10] seconds.") From 1bb2ab4ded41e6e412210da115421685200e52a3 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:25:34 -0500 Subject: [PATCH 04/95] Fix hardcoded stage checks in singularity code --- code/modules/power/singularity/singularity.dm | 11 ++++----- .../power/singularity/singularity_events.dm | 11 ++++----- .../power/singularity/singularity_stages.dm | 23 +++++++++++++++++++ 3 files changed, 31 insertions(+), 14 deletions(-) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 6482521407ea..c1c8ea8295ec 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -13,7 +13,7 @@ var/global/list/singularities = list() /// Category used for investigation entries relating to this atom. var/const/investigation_label = "singulo" - /// A list of events. Toxins is in here twice to double the chance of proccing. + /// A weighted list of events. var/static/list/singularity_events = list( /decl/singularity_event/empulse = 1, /decl/singularity_event/toxins = 2, @@ -63,7 +63,7 @@ var/global/list/singularities = list() /obj/effect/singularity/explosion_act(severity) SHOULD_CALL_PARENT(FALSE) - if(current_stage.stage_size == STAGE_SUPER)//IT'S UNSTOPPABLE + if(!current_stage.explosion_vulnerable)//IT'S UNSTOPPABLE return if(severity == 1) if(prob(25)) @@ -153,16 +153,13 @@ var/global/list/singularities = list() // Handle random events. if(prob(current_stage.event_chance)) - if(current_stage.stage_size >= STAGE_SUPER) - var/decl/singularity_event/wave_event = GET_DECL(/decl/singularity_event/supermatter_wave) - wave_event.handle_event(src) - var/decl/singularity_event/singularity_event = pickweight(singularity_events) + var/decl/singularity_event/singularity_event = current_stage.forced_event || pickweight(singularity_events) singularity_event = GET_DECL(singularity_event) singularity_event.handle_event(src) /obj/effect/singularity/proc/try_move(var/movement_dir, var/vertical_move) set waitfor = FALSE - if(current_stage.stage_size >= STAGE_FIVE)//The superlarge one does not care about things in its way + if(current_stage.ignore_obstacles)//The superlarge one does not care about things in its way step(src, movement_dir) if(!vertical_move) sleep(1) diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index e48a040231be..083fe4595737 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -7,10 +7,7 @@ /decl/singularity_event/nothing // Nothing happens. /decl/singularity_event/empulse/handle_event(obj/effect/singularity/source) - if(source.current_stage.stage_size != STAGE_SUPER) - empulse(source, 8, 10) - else - empulse(source, 12, 16) + empulse(source, source.current_stage.em_heavy_range, source.current_stage.em_light_range) /decl/singularity_event/toxins var/toxrange = 10 @@ -35,11 +32,11 @@ if(ishuman(M)) var/mob/living/human/H = M if(istype(H.get_equipped_item(slot_glasses_str), /obj/item/clothing/glasses/meson)) - if(source.current_stage.stage_size != STAGE_SUPER) + if(!source.current_stage.the_goggles_do_nothing) to_chat(H, SPAN_WARNING("You look directly into \the [source]. Good thing you had your protective eyewear on!")) continue to_chat(H, SPAN_WARNING("Your eyewear does absolutely nothing to protect you from \the [source]")) - to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.stage_size == STAGE_SUPER ? "helpless" : "weak"].")) + to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.mesmerize_text].")) M.apply_effect(3, STUN) M.visible_message(SPAN_DANGER("\The [M] stares blankly at \the [source]!")) @@ -51,4 +48,4 @@ else to_chat(M, SPAN_DANGER("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) M.dust() - SSradiation.radiate(source, rand(source.energy)) + SSradiation.radiate(source, rand(source.energy)) \ No newline at end of file diff --git a/code/modules/power/singularity/singularity_stages.dm b/code/modules/power/singularity/singularity_stages.dm index 831cacd48c5f..b95595f4839c 100644 --- a/code/modules/power/singularity/singularity_stages.dm +++ b/code/modules/power/singularity/singularity_stages.dm @@ -32,8 +32,22 @@ var/dissipation_energy_loss = 1 /// What is the percent chance of an event each tick? var/event_chance + /// Do we force a specific event when we proc events? + var/decl/singularity_event/forced_event = null /// Will we wander around? var/wander + /// Can explosions destroy the singularity? + var/explosion_vulnerable + /// What is the heavy range for the EM pulse event in this stage? + var/em_heavy_range = 8 + /// What is the light range for the EM pulse event in this stage? + var/em_light_range = 10 + /// What do characters feel when they're mesmerized during this stage? + var/mesmerize_text = "weak" + /// Do we ignore PPE for mesmerizing in this stage? + var/the_goggles_do_nothing = FALSE + /// Do we ignore obstacles in our way? + var/ignore_obstacles = FALSE /decl/singularity_stage/validate() . = ..() @@ -171,6 +185,7 @@ dissipates_over_time = FALSE //It cant go smaller due to e loss. wander = TRUE event_chance = 20 + ignore_obstacles = TRUE /decl/singularity_stage/stage_five/grow_to(obj/effect/singularity/source) source.visible_message(SPAN_DANGER("\The [source] has grown out of control!")) @@ -178,6 +193,7 @@ /decl/singularity_stage/stage_five/shrink_to(obj/effect/singularity/source) source.visible_message(SPAN_WARNING("\The [source] miraculously reduces in size and loses its supermatter properties.")) +/// A singularity that has the mass of a supermatter crystal. /decl/singularity_stage/stage_super name = "super gravitational singularity" desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." @@ -193,7 +209,14 @@ consume_range = 5 dissipates_over_time = 0 //It cant go smaller due to e loss event_chance = 25 //Events will fire off more often. + forced_event = /decl/singularity_event/supermatter_wave wander = TRUE + explosion_vulnerable = FALSE + em_heavy_range = 12 + em_light_range = 16 + mesmerize_text = "helpless" + the_goggles_do_nothing = TRUE + ignore_obstacles = TRUE /decl/singularity_stage/stage_super/grow_to(obj/effect/singularity/source) source.visible_message(SPAN_SINISTER("You witness the creation of a destructive force that cannot possibly be stopped by human hands.")) From b33391cf126aead77caa2f07cd0c5a6b582b8558 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 3 Jan 2025 23:21:18 +1100 Subject: [PATCH 05/95] Adding footguns section to contributing.md. --- CONTRIBUTING.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5c858b868b25..3940d892dd02 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -30,3 +30,14 @@ This is a quick and dirty set of agreed-upon standards for contributions to the - If there's a personal dislike of the PR, post about it for discussion. Maybe have an 'on hold for discussion' label. Try to reach a consensus/compromise. Failing a compromise, a majority maintainer vote will decide. - First person to review approves the PR, second person to review can merge it. If 24 hours pass with no objections, first person can merge the PR themselves. - PRs can have a 24 hour grace period applied by maintainers if it seems important for discussion and responses to be involved. Don't merge for the grace period if applied (reviews are fine). + +### Footguns +A footgun is a pattern, function, assumption etc. that stands a strong chance to shoot you in the foot. They are documented here for ease of reference by new contributors. + +#### List footguns +- Adding lists to lists will actually perform a merge, rather than inserting the list as a new record. If you want to insert a list into a list, you need to either: + - double-wrap it, ex. `my_list += list(list("some_new_data" = 25))` + - set the index directly, ex. `my_list[my_list.len] = list("some_new_data" = 25)` +- Using variables and macros as associative list keys have some notable behavior. + - If declaring an associative list using a macro as a key, in a case where the macro does not exist (due to misspelling, etc.), that macro name will be treated as a string value for the associative list. You can guard against this by wrapping the macro in parens, ex. `list( (MY_MACRO_NAME) = "some_value" )`, which will fail to compile instead in cases where the macro doesn't exist. + - If a variable is used as the associative key, it *must* be wrapped in parens, or it will be used as a string key. \ No newline at end of file From 698043ec0cbb2d2e316ba26ab276671081e3d1aa Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 09:11:08 +1100 Subject: [PATCH 06/95] Fixes inverted is_watertight() logic. --- code/game/atoms.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 5dd985c6064c..50583b963a47 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -993,7 +993,7 @@ return /atom/proc/is_watertight() - return ATOM_IS_OPEN_CONTAINER(src) + return !ATOM_IS_OPEN_CONTAINER(src) /atom/proc/can_drink_from(mob/user) return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() From 972e321e3858d1d23ccd766f87cff320d8e7317e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 09:16:14 +1100 Subject: [PATCH 07/95] Moves nanite fluid into compounds, disambiguates the recipe name. --- code/modules/reagents/reactions/reaction_compounds.dm | 11 +++++++++++ code/modules/reagents/reactions/reaction_drugs.dm | 10 ---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index bbd642509004..35de17d707e3 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -158,3 +158,14 @@ /decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) + + +/decl/chemical_reaction/compound/nanitefluid + name = "Nanite Fluid Synthesis" + result = /decl/material/liquid/nanitefluid + required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/solid/metal/aluminium = 1, /decl/material/liquid/lube = 1) + catalysts = list(/decl/material/liquid/crystal_agent = 1) + result_amount = 3 + minimum_temperature = (-25 CELSIUS) - 100 + maximum_temperature = -25 CELSIUS + mix_message = "The solution becomes a metallic slime." diff --git a/code/modules/reagents/reactions/reaction_drugs.dm b/code/modules/reagents/reactions/reaction_drugs.dm index 8f10b625a3c2..a4f85cb3fa73 100644 --- a/code/modules/reagents/reactions/reaction_drugs.dm +++ b/code/modules/reagents/reactions/reaction_drugs.dm @@ -111,16 +111,6 @@ required_reagents = list(/decl/material/liquid/antirads = 1, /decl/material/solid/carbon = 1) result_amount = 2 -/decl/chemical_reaction/compound/nanitefluid - name = "Nanite Fluid" - result = /decl/material/liquid/nanitefluid - required_reagents = list(/decl/material/liquid/plasticide = 1, /decl/material/solid/metal/aluminium = 1, /decl/material/liquid/lube = 1) - catalysts = list(/decl/material/liquid/crystal_agent = 1) - result_amount = 3 - minimum_temperature = (-25 CELSIUS) - 100 - maximum_temperature = -25 CELSIUS - mix_message = "The solution becomes a metallic slime." - /decl/chemical_reaction/drug/antibiotics name = "Antibiotics" result = /decl/material/liquid/antibiotics From 7ef6054f59dfdaf36f652ceb79af520f57a363c5 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:06:54 -0500 Subject: [PATCH 08/95] Add a modpack compatibility patch system --- maps/exodus/exodus.dm | 35 ++++++++-------- maps/ministation/ministation.dm | 40 +++++++++---------- maps/modpack_testing/modpack_testing.dm | 38 +++++++++--------- maps/tradeship/tradeship.dm | 37 +++++++++-------- mods/content/fantasy/datum/overrides.dm | 22 ---------- mods/content/psionics/_psionics.dme | 2 - mods/content/standard_jobs/jobs/medical.dm | 9 ----- mods/gamemodes/cult/overrides.dm | 1 + mods/gamemodes/heist/_heist.dme | 8 ---- mods/gamemodes/mixed.dm | 7 ++++ mods/gamemodes/mixed/_mixed.dm | 2 - mods/gamemodes/mixed/_mixed.dme | 15 ------- mods/mobs/borers/_borers.dme | 5 --- mods/species/drakes/_drakes.dme | 5 --- mods/species/vox/_vox.dme | 1 - mods/~compatibility/patches/fantasy.dm | 4 ++ .../patches/fantasy/drake_fantasy.dm | 21 ++++++++++ .../patches/heist_vox.dm} | 2 - .../~compatibility/patches/mixed_gamemodes.dm | 12 ++++++ .../patches/mixed_gamemodes}/crossfire.dm | 0 .../patches/mixed_gamemodes}/siege.dm | 0 .../patches/mixed_gamemodes}/uprising.dm | 0 mods/~compatibility/patches/psionics.dm | 13 ++++++ .../patches/psionics/borer_psi.dm} | 4 +- .../patches/psionics/cult_psi.dm} | 7 ++-- .../patches/psionics/psi_jobs.dm | 6 +++ mods/~compatibility/readme.md | 22 ++++++++++ mods/~compatibility/~compatibility.dm | 16 ++++++++ nebula.dme | 1 + 29 files changed, 179 insertions(+), 156 deletions(-) create mode 100644 mods/gamemodes/mixed.dm delete mode 100644 mods/gamemodes/mixed/_mixed.dm delete mode 100644 mods/gamemodes/mixed/_mixed.dme create mode 100644 mods/~compatibility/patches/fantasy.dm create mode 100644 mods/~compatibility/patches/fantasy/drake_fantasy.dm rename mods/{species/vox/datum/heist_compatibility.dm => ~compatibility/patches/heist_vox.dm} (98%) create mode 100644 mods/~compatibility/patches/mixed_gamemodes.dm rename mods/{gamemodes/mixed => ~compatibility/patches/mixed_gamemodes}/crossfire.dm (100%) rename mods/{gamemodes/mixed => ~compatibility/patches/mixed_gamemodes}/siege.dm (100%) rename mods/{gamemodes/mixed => ~compatibility/patches/mixed_gamemodes}/uprising.dm (100%) create mode 100644 mods/~compatibility/patches/psionics.dm rename mods/{content/psionics/system/psionics/mob/borer_power.dm => ~compatibility/patches/psionics/borer_psi.dm} (97%) rename mods/{content/psionics/items/soulstone.dm => ~compatibility/patches/psionics/cult_psi.dm} (61%) create mode 100644 mods/~compatibility/patches/psionics/psi_jobs.dm create mode 100644 mods/~compatibility/readme.md create mode 100644 mods/~compatibility/~compatibility.dm diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 9372a9368a76..09ef9d18d9dd 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -1,38 +1,35 @@ #if !defined(USING_MAP_DATUM) - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/meteor/_meteor.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" #include "../../mods/content/government/_government.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" - - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after psionics for counsellor compatibility. - #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/species/ascent/_ascent.dme" - #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 2ecca91fa60e..2f82716a80ce 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -15,31 +15,37 @@ Twice... #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + + #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + + #include "../../mods/content/bigpharma/_bigpharma.dme" + #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/government/_government.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" + #include "../../mods/content/modern_earth/_modern_earth.dme" + #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/xenobiology/_xenobiology.dme" + #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" #include "../../mods/gamemodes/ninja/_ninja.dme" #include "../../mods/gamemodes/revolution/_revolution.dme" #include "../../mods/gamemodes/traitor/_traitor.dme" #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" + #include "../../mods/gamemodes/mixed.dm" - #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" + #include "../../mods/mobs/dionaea/_dionaea.dme" + #include "../../mods/mobs/borers/_borers.dme" - #include "../../mods/content/standard_jobs/_standard_jobs.dme" - #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/corporate/_corporate.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/neoavians/_neoavians.dme" - #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/species/serpentid/_serpentid.dme" - #include "../../mods/species/bayliens/_bayliens.dme" - #include "../../mods/content/mundane.dm" - #include "../../mods/content/bigpharma/_bigpharma.dme" - #include "../../mods/content/government/_government.dme" - #include "../../mods/content/modern_earth/_modern_earth.dme" - #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" #include "ministation_antagonists.dm" #include "ministation_areas.dm" @@ -70,12 +76,6 @@ Twice... #include "../away/yacht/yacht.dm" #include "../away/liberia/liberia.dm" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" - - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" - #include "ministation_overmap.dm" #include "jobs/command.dm" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index f94fbbc844c8..d7843b96d6b5 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -3,45 +3,43 @@ #include "modpack_testing_lobby.dm" #include "blank.dmm" - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/meteor/_meteor.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" - #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/byond_membership/_byond_membership.dm" #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" + #include "../../mods/content/fantasy/_fantasy.dme" #include "../../mods/content/generic_shuttles/_generic_shuttles.dme" #include "../../mods/content/government/_government.dme" + #include "../../mods/content/inertia/_inertia.dme" #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" + #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/pheromones/_pheromones.dme" - #include "../../mods/species/drakes/_drakes.dme" // include before _fantasy.dme so overrides work - #include "../../mods/content/fantasy/_fantasy.dme" - #include "../../mods/content/inertia/_inertia.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/meteor/_meteor.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" + #include "../../mods/species/drakes/_drakes.dme" #include "../../mods/species/neoavians/_neoavians.dme" + #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/vox/_vox.dme" #define USING_MAP_DATUM /datum/map/modpack_testing diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index 32eeb975e2ca..e13776a4276f 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,44 +4,43 @@ #include "../../code/unit_tests/offset_tests.dm" #endif - #include "../../mods/gamemodes/cult/_cult.dme" - #include "../../mods/gamemodes/heist/_heist.dme" - #include "../../mods/gamemodes/ninja/_ninja.dme" - #include "../../mods/gamemodes/revolution/_revolution.dme" - #include "../../mods/gamemodes/traitor/_traitor.dme" - #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" - #include "../../mods/gamemodes/mixed/_mixed.dme" - #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/government/away_sites/icarus/icarus.dm" #include "../../mods/content/corporate/away_sites/lar_maria/lar_maria.dm" - #include "../../mods/content/standard_jobs/_standard_jobs.dme" - #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/mundane.dm" + #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/corporate/_corporate.dme" + #include "../../mods/content/dungeon_loot/_dungeon_loot.dme" #include "../../mods/content/government/_government.dme" + #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/modern_earth/_modern_earth.dme" #include "../../mods/content/mouse_highlights/_mouse_highlight.dme" - #include "../../mods/content/scaling_descriptors.dm" - #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/content/matchmaking/_matchmaking.dme" #include "../../mods/content/pheromones/_pheromones.dme" + #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/xenobiology/_xenobiology.dme" - #include "../../mods/mobs/dionaea/_dionaea.dme" - #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/gamemodes/cult/_cult.dme" + #include "../../mods/gamemodes/heist/_heist.dme" + #include "../../mods/gamemodes/ninja/_ninja.dme" + #include "../../mods/gamemodes/revolution/_revolution.dme" + #include "../../mods/gamemodes/spyvspy/_spyvspy.dme" + #include "../../mods/gamemodes/traitor/_traitor.dme" + #include "../../mods/gamemodes/mixed.dm" - // Must come after borers for compatibility. - #include "../../mods/content/psionics/_psionics.dme" + #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/species/ascent/_ascent.dme" + #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/drakes/_drakes.dme" + #include "../../mods/species/neoavians/_neoavians.dme" #include "../../mods/species/serpentid/_serpentid.dme" #include "../../mods/species/utility_frames/_utility_frames.dme" - #include "../../mods/species/neoavians/_neoavians.dme" - #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/vox/_vox.dme" #include "../away/bearcat/bearcat.dm" diff --git a/mods/content/fantasy/datum/overrides.dm b/mods/content/fantasy/datum/overrides.dm index 0726866427dc..6183c93b33c1 100644 --- a/mods/content/fantasy/datum/overrides.dm +++ b/mods/content/fantasy/datum/overrides.dm @@ -31,28 +31,6 @@ /decl/background_category/religion = /decl/background_detail/religion/other ) -// Rename grafadreka -/decl/species/grafadreka - name = "Meredrake" - name_plural = "Meredrakes" - description = "Meredrakes, sometimes called mire-drakes, are large reptillian pack predators, widely assumed to be cousins to true dragons. \ - They are commonly found living in caves or burrows bordering grassland or forest, and while they prefer to hunt deer or rabbits, they will sometimes attack travellers if pickings are slim enough. \ - While they are not domesticated, they can be habituated and trained as working animals if captured young enough." - -/decl/sprite_accessory/marking/grafadreka - species_allowed = list("Meredrake") - -/decl/language/grafadreka - desc = "Hiss hiss, feed me rabbits." - -/decl/material/liquid/sifsap - name = "drake spittle" - lore_text = "A complex chemical slurry brewed up in the gullet of meredrakes." - -/obj/aura/sifsap_salve - name = "Drakespittle Salve" - descriptor = "glowing spittle" - // Rename wooden prostheses /decl/bodytype/prosthetic/wooden name = "carved wooden" // weird to call it 'crude' when it's cutting-edge for the setting diff --git a/mods/content/psionics/_psionics.dme b/mods/content/psionics/_psionics.dme index df5544cffe15..b978b8a0c7b4 100644 --- a/mods/content/psionics/_psionics.dme +++ b/mods/content/psionics/_psionics.dme @@ -27,7 +27,6 @@ #include "items\literature.dm" #include "items\null_ammo.dm" #include "items\nullrod.dm" -#include "items\soulstone.dm" #include "machines\psimeter.dm" #include "machines\psimonitor.dm" #include "system\subsystem_psi.dm" @@ -54,7 +53,6 @@ #include "system\psionics\interface\ui.dm" #include "system\psionics\interface\ui_hub.dm" #include "system\psionics\interface\ui_toggles.dm" -#include "system\psionics\mob\borer_power.dm" #include "system\psionics\mob\mob.dm" #include "system\psionics\mob\mob_assay.dm" #include "system\psionics\mob\mob_interactions.dm" diff --git a/mods/content/standard_jobs/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm index 14e68446da0a..f2c11cb05d12 100644 --- a/mods/content/standard_jobs/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -199,15 +199,6 @@ ) give_psionic_implant_on_join = FALSE -#ifdef MODPACK_PSIONICS -/datum/job/counselor/equip_job(var/mob/living/human/H) - if(H.mind.role_alt_title == "Counselor") - psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) - if(H.mind.role_alt_title == "Mentalist") - psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) - return ..() -#endif - // Department-flavor IDs /obj/item/card/id/medical name = "identification card" diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 2077c9f0b1e1..f536e4eabe68 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -15,6 +15,7 @@ playsound(src, 'sound/effects/ghost2.ogg', 10, 5) /datum/trader/ship/clothingshop/hatglovesaccessories/New() + ..() possible_trading_items[/obj/item/clothing/head/culthood] = TRADER_BLACKLIST_ALL /mob/living/silicon/ai diff --git a/mods/gamemodes/heist/_heist.dme b/mods/gamemodes/heist/_heist.dme index 57bf5c58b426..de2a67d69d3c 100644 --- a/mods/gamemodes/heist/_heist.dme +++ b/mods/gamemodes/heist/_heist.dme @@ -1,13 +1,5 @@ #ifndef GAMEMODE_PACK_HEIST #define GAMEMODE_PACK_HEIST - -#ifdef MODPACK_VOX -#warn Vox modpack loaded before Heist modpack, compatibility features will be missing. -#endif -#ifdef GAMEMODE_PACK_MIXED -#warn Mixed gamemodes modpack loaded before Heist modpack, Heist combination modes will be missing. -#endif - // BEGIN_INCLUDE #include "_heist.dm" #include "areas.dm" diff --git a/mods/gamemodes/mixed.dm b/mods/gamemodes/mixed.dm new file mode 100644 index 000000000000..f89baef2aa8f --- /dev/null +++ b/mods/gamemodes/mixed.dm @@ -0,0 +1,7 @@ +#ifndef GAMEMODE_PACK_MIXED +#define GAMEMODE_PACK_MIXED +#endif + +// This modpack doesn't actually have anything here, and instead it uses the compatibility patch system to make load order not matter. +/decl/modpack/mixed_modes + name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dm b/mods/gamemodes/mixed/_mixed.dm deleted file mode 100644 index c1c9167d414e..000000000000 --- a/mods/gamemodes/mixed/_mixed.dm +++ /dev/null @@ -1,2 +0,0 @@ -/decl/modpack/mixed_modes - name = "Mixed Gamemodes" \ No newline at end of file diff --git a/mods/gamemodes/mixed/_mixed.dme b/mods/gamemodes/mixed/_mixed.dme deleted file mode 100644 index 6db33d077069..000000000000 --- a/mods/gamemodes/mixed/_mixed.dme +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GAMEMODE_PACK_MIXED -#define GAMEMODE_PACK_MIXED -// BEGIN_INCLUDE -#include "_mixed.dm" -#if defined(GAMEMODE_PACK_HEIST) // TODO: && defined(GAMEMODE_PACK_MERCENARY) -#include "crossfire.dm" -#endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) -#include "siege.dm" -#endif -#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) -#include "uprising.dm" -#endif -// END_INCLUDE -#endif \ No newline at end of file diff --git a/mods/mobs/borers/_borers.dme b/mods/mobs/borers/_borers.dme index 380c95f4e87f..7f230fc95363 100644 --- a/mods/mobs/borers/_borers.dme +++ b/mods/mobs/borers/_borers.dme @@ -1,10 +1,5 @@ #ifndef CONTENT_PACK_BORERS #define CONTENT_PACK_BORERS - -#ifdef MODPACK_PSIONICS -#warn Psionics modpack loaded before Borers modpack, compatibility features will be missing. -#endif - // BEGIN_INCLUDE #include "borer.dm" #include "datum\antagonist.dm" diff --git a/mods/species/drakes/_drakes.dme b/mods/species/drakes/_drakes.dme index 1143d6a510ee..025f1c54c518 100644 --- a/mods/species/drakes/_drakes.dme +++ b/mods/species/drakes/_drakes.dme @@ -1,10 +1,5 @@ #ifndef MODPACK_DRAKES #define MODPACK_DRAKES - -#ifdef MODPACK_FANTASY -#warn Fantasy modpack loaded before Drakes modpack, compatibility features will be missing. -#endif - // BEGIN_INCLUDE #include "_drakes.dm" #include "_overrides.dm" diff --git a/mods/species/vox/_vox.dme b/mods/species/vox/_vox.dme index 83d61f50f51f..0e0e635d99b4 100644 --- a/mods/species/vox/_vox.dme +++ b/mods/species/vox/_vox.dme @@ -8,7 +8,6 @@ #include "datum\cultures_vox.dm" #include "datum\descriptors_vox.dm" #include "datum\factions_vox.dm" -#include "datum\heist_compatibility.dm" #include "datum\language.dm" #include "datum\locations_vox.dm" #include "datum\outfits.dm" diff --git a/mods/~compatibility/patches/fantasy.dm b/mods/~compatibility/patches/fantasy.dm new file mode 100644 index 000000000000..c176360672c6 --- /dev/null +++ b/mods/~compatibility/patches/fantasy.dm @@ -0,0 +1,4 @@ +// Override drake lore and names for the fantasy modpack. +#ifdef MODPACK_DRAKES +#include "fantasy/drake_fantasy.dm" +#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/fantasy/drake_fantasy.dm b/mods/~compatibility/patches/fantasy/drake_fantasy.dm new file mode 100644 index 000000000000..70ad5e628e7d --- /dev/null +++ b/mods/~compatibility/patches/fantasy/drake_fantasy.dm @@ -0,0 +1,21 @@ +// Rename grafadreka +/decl/species/grafadreka + name = "Meredrake" + name_plural = "Meredrakes" + description = "Meredrakes, sometimes called mire-drakes, are large reptillian pack predators, widely assumed to be cousins to true dragons. \ + They are commonly found living in caves or burrows bordering grassland or forest, and while they prefer to hunt deer or rabbits, they will sometimes attack travellers if pickings are slim enough. \ + While they are not domesticated, they can be habituated and trained as working animals if captured young enough." + +/decl/sprite_accessory/marking/grafadreka + species_allowed = list("Meredrake") + +/decl/language/grafadreka + desc = "Hiss hiss, feed me rabbits." + +/decl/material/liquid/sifsap + name = "drake spittle" + lore_text = "A complex chemical slurry brewed up in the gullet of meredrakes." + +/obj/aura/sifsap_salve + name = "Drakespittle Salve" + descriptor = "glowing spittle" diff --git a/mods/species/vox/datum/heist_compatibility.dm b/mods/~compatibility/patches/heist_vox.dm similarity index 98% rename from mods/species/vox/datum/heist_compatibility.dm rename to mods/~compatibility/patches/heist_vox.dm index 776057948c06..e37a3416faa6 100644 --- a/mods/species/vox/datum/heist_compatibility.dm +++ b/mods/~compatibility/patches/heist_vox.dm @@ -1,4 +1,3 @@ -#ifdef GAMEMODE_PACK_HEIST /decl/special_role/raider/Initialize() . = ..() LAZYSET(outfits_per_species, SPECIES_VOX, /decl/outfit/vox_raider) @@ -41,4 +40,3 @@ vox.SetName(vox.real_name) var/decl/special_role/raider/raiders = GET_DECL(/decl/special_role/raider) raiders.update_access(vox) -#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/mixed_gamemodes.dm b/mods/~compatibility/patches/mixed_gamemodes.dm new file mode 100644 index 000000000000..c554702eff52 --- /dev/null +++ b/mods/~compatibility/patches/mixed_gamemodes.dm @@ -0,0 +1,12 @@ +// TODO: #ifdef GAMEMODE_PACK_MERCENARY +#if defined(GAMEMODE_PACK_HEIST) +#include "mixed_gamemodes/crossfire.dm" +#endif +#if defined(GAMEMODE_PACK_REVOLUTIONARY) +#include "mixed_gamemodes/siege.dm" +#endif +// #endif + +#if defined(GAMEMODE_PACK_REVOLUTIONARY) && defined(GAMEMODE_PACK_CULT) +#include "mixed_gamemodes/uprising.dm" +#endif \ No newline at end of file diff --git a/mods/gamemodes/mixed/crossfire.dm b/mods/~compatibility/patches/mixed_gamemodes/crossfire.dm similarity index 100% rename from mods/gamemodes/mixed/crossfire.dm rename to mods/~compatibility/patches/mixed_gamemodes/crossfire.dm diff --git a/mods/gamemodes/mixed/siege.dm b/mods/~compatibility/patches/mixed_gamemodes/siege.dm similarity index 100% rename from mods/gamemodes/mixed/siege.dm rename to mods/~compatibility/patches/mixed_gamemodes/siege.dm diff --git a/mods/gamemodes/mixed/uprising.dm b/mods/~compatibility/patches/mixed_gamemodes/uprising.dm similarity index 100% rename from mods/gamemodes/mixed/uprising.dm rename to mods/~compatibility/patches/mixed_gamemodes/uprising.dm diff --git a/mods/~compatibility/patches/psionics.dm b/mods/~compatibility/patches/psionics.dm new file mode 100644 index 000000000000..93473b9271f8 --- /dev/null +++ b/mods/~compatibility/patches/psionics.dm @@ -0,0 +1,13 @@ +// Give borers a paramount rank psi aura, and gives them a ranged psychic attack. +#ifdef CONTENT_PACK_BORERS +#include "psionics/borer_psi.dm" +#endif +// Allows psion blood to be used to create soulstones, +// and lets full soulstones nullify psi and shatter into nullglass. +#ifdef GAMEMODE_PACK_CULT +#include "psionics/cult_psi.dm" +#endif +// Adds psi abilities to the counselor. +#ifdef MODPACK_STANDARD_JOBS +#include "psionics/psi_jobs.dm" +#endif \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/mob/borer_power.dm b/mods/~compatibility/patches/psionics/borer_psi.dm similarity index 97% rename from mods/content/psionics/system/psionics/mob/borer_power.dm rename to mods/~compatibility/patches/psionics/borer_psi.dm index 48f62c8adab6..68c70ec95f78 100644 --- a/mods/content/psionics/system/psionics/mob/borer_power.dm +++ b/mods/~compatibility/patches/psionics/borer_psi.dm @@ -1,4 +1,3 @@ -#ifdef CONTENT_PACK_BORERS /mob/living/simple_animal/borer var/image/aura_image @@ -52,5 +51,4 @@ SET_STATUS_MAX(M, STAT_WEAK, 10) set_ability_cooldown(15 SECONDS) - return TRUE -#endif \ No newline at end of file + return TRUE \ No newline at end of file diff --git a/mods/content/psionics/items/soulstone.dm b/mods/~compatibility/patches/psionics/cult_psi.dm similarity index 61% rename from mods/content/psionics/items/soulstone.dm rename to mods/~compatibility/patches/psionics/cult_psi.dm index 3d984a0711c7..85c203913624 100644 --- a/mods/content/psionics/items/soulstone.dm +++ b/mods/~compatibility/patches/psionics/cult_psi.dm @@ -1,15 +1,14 @@ -#ifdef GAMEMODE_PACK_CULT +// Make soulstones interact with psionics. /obj/item/soulstone/disrupts_psionics() . = !full ? src : FALSE /obj/item/soulstone/shatter() for(var/i=1 to rand(2,5)) - new /obj/item/shard(get_turf(src), /decl/material/nullglass) + new /obj/item/shard(get_turf(src), full ? /decl/material/nullglass : /decl/material/solid/gemstone/crystal) . = ..() /obj/item/soulstone/withstand_psi_stress(var/stress, var/atom/source) . = ..(stress, source) if(. > 0) . = max(0, . - rand(2,5)) - shatter() -#endif \ No newline at end of file + shatter() \ No newline at end of file diff --git a/mods/~compatibility/patches/psionics/psi_jobs.dm b/mods/~compatibility/patches/psionics/psi_jobs.dm new file mode 100644 index 000000000000..f4579e9d7c05 --- /dev/null +++ b/mods/~compatibility/patches/psionics/psi_jobs.dm @@ -0,0 +1,6 @@ +/datum/job/counselor/equip_job(var/mob/living/human/H) + if(H.mind.role_alt_title == "Counselor") + psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) + if(H.mind.role_alt_title == "Mentalist") + psi_faculties = list("[PSI_COERCION]" = PSI_RANK_OPERANT) + return ..() \ No newline at end of file diff --git a/mods/~compatibility/readme.md b/mods/~compatibility/readme.md new file mode 100644 index 000000000000..d422273e7bb4 --- /dev/null +++ b/mods/~compatibility/readme.md @@ -0,0 +1,22 @@ +# Modpack Compatibility System +This folder exists as a way to work around the fact that the previous system for modpack cross-compatibility, define-gating, is sensitive to include order. This resulted in a lot of boilerplate, like having to emit warnings if modpacks were included in the wrong order. This meant that you could also introduce cyclical dependencies, where no matter what it would emit a warning and content would be missing. + +To avoid this issue, we instead include all compatibility patches last, so it is load order agnostic. + +## FAQ +### Why aren't the compatibility files in the modpacks themselves? +I didn't want to edit the modpack include validation script to exclude the compatibility patches from all DMEs. + +### Why is it organised using subfolders? +I didn't like using `#if defined(FOO) && defined(BAR)` and nested `#ifdef`s were hard to follow, so instead I group them by modpack. + +### Is there a general rule for which modpacks get their own folder? +Not really. I just grouped them in roughly the way that would result in the largest existing groupings, and then chose groupings that would make the most sense to expand in the future (fantasy and standard jobs). + +### Do all patches need to be in a subfolder? +No, it's totally fine to just put something in the base patches directory if there's only one patch for either of the mods in that pairing. That said, sometimes it can make sense to add a folder with just one patch if you can foresee future development requiring additional patches in the same category. + +### How do I decide which folder a patch goes in if both modpacks have folders? +I tend to personally go based on whatever it's mostly about; a hypothetical patch renaming and respriting psionics for the fantasy modpack would go in the fantasy folder. Alternatively, you could think of it as going for whichever one is more specific. + +That said, if one has a lot more patches than the other, or if one modpack (take Standard Jobs, for example) is patched by several modpacks that already have folders, it's fine to just go with whatever produces the largest patch subfolders (or gets rid of small/redundant ones). \ No newline at end of file diff --git a/mods/~compatibility/~compatibility.dm b/mods/~compatibility/~compatibility.dm new file mode 100644 index 000000000000..f59ac86c052c --- /dev/null +++ b/mods/~compatibility/~compatibility.dm @@ -0,0 +1,16 @@ +// Add Vox-specific content for the Heist gamemode (Vox raider outfit, mirror to transform into a Vox as a raider) +#if defined(GAMEMODE_PACK_HEIST) && defined(MODPACK_VOX) +#include "patches/heist_vox.dm" +#endif + +#ifdef MODPACK_PSIONICS +#include "patches/psionics.dm" +#endif + +#ifdef GAMEMODE_PACK_MIXED +#include "patches/mixed_gamemodes.dm" +#endif + +#ifdef MODPACK_FANTASY_SPECIES +#include "patches/fantasy.dm" +#endif \ No newline at end of file diff --git a/nebula.dme b/nebula.dme index db8ca0135486..5d10b384d1c5 100644 --- a/nebula.dme +++ b/nebula.dme @@ -4101,5 +4101,6 @@ #include "maps\~mapsystem\maps_unit_testing.dm" #include "maps\~unit_tests\unit_testing.dm" #include "mods\_modpack.dm" +#include "mods\~compatibility\~compatibility.dm" #include "~code\global_init.dm" // END_INCLUDE From 54b94a4948d9efbad9a9ddcae55485910427840a Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:22:56 -0500 Subject: [PATCH 09/95] Rewrite soulstone reaction handling --- code/modules/reagents/reactions/_reaction.dm | 6 ++--- .../reagents/reactions/reaction_compounds.dm | 2 +- .../reactions/reaction_grenade_reaction.dm | 16 +++++------ .../reagents/reactions/reaction_herbal.dm | 2 +- .../reagents/reactions/reaction_other.dm | 2 +- .../reactions/reaction_recipe_food.dm | 2 +- .../reagents/reactions/reaction_synthesis.dm | 14 +++++----- mods/content/psionics/datum/chems.dm | 27 ------------------- .../cult/mobs/constructs/soulstone.dm | 27 +++++++++++++++++++ .../patches/psionics/cult_psi.dm | 4 +++ 10 files changed, 52 insertions(+), 50 deletions(-) diff --git a/code/modules/reagents/reactions/_reaction.dm b/code/modules/reagents/reactions/_reaction.dm index e743ecf0ab2b..fbc2eaa85d68 100644 --- a/code/modules/reagents/reactions/_reaction.dm +++ b/code/modules/reagents/reactions/_reaction.dm @@ -38,7 +38,7 @@ return 1 -/decl/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/proc/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(thermal_product && location && ATOM_SHOULD_TEMPERATURE_ENQUEUE(location)) ADJUST_ATOM_TEMPERATURE(location, location.temperature + (location.get_thermal_mass_coefficient() * thermal_product)) @@ -61,8 +61,6 @@ if(reaction_volume > A) reaction_volume = A - var/alt_reaction_indicator = get_alternate_reaction_indicator(holder) - for(var/reactant in required_reagents) holder.remove_reagent(reactant, reaction_volume * required_reagents[reactant], safety = 1) @@ -71,7 +69,7 @@ if(result) holder.add_reagent(result, amt_produced, data, safety = 1) - on_reaction(holder, amt_produced, alt_reaction_indicator, data) + on_reaction(holder, amt_produced, data) //called after processing reactions, if they occurred /decl/chemical_reaction/proc/post_reaction(var/datum/reagents/holder) diff --git a/code/modules/reagents/reactions/reaction_compounds.dm b/code/modules/reagents/reactions/reaction_compounds.dm index 8e530dacaa58..d76c4b9630c7 100644 --- a/code/modules/reagents/reactions/reaction_compounds.dm +++ b/code/modules/reagents/reactions/reaction_compounds.dm @@ -155,7 +155,7 @@ required_reagents = list(/decl/material/liquid/capsaicin = 2) result = list(/decl/material/liquid/capsaicin/condensed = 1) -/decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/compound/condensed_capsaicin/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) . = ..() holder?.add_reagent(/decl/material/liquid/water, created_volume) diff --git a/code/modules/reagents/reactions/reaction_grenade_reaction.dm b/code/modules/reagents/reactions/reaction_grenade_reaction.dm index ec529bef717f..7827c6ac0548 100644 --- a/code/modules/reagents/reactions/reaction_grenade_reaction.dm +++ b/code/modules/reagents/reactions/reaction_grenade_reaction.dm @@ -11,7 +11,7 @@ required_reagents = list(/decl/material/liquid/water = 1, /decl/material/solid/potassium = 1) mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/explosion_potassium/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -32,7 +32,7 @@ result_amount = null mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/flash_powder/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -58,7 +58,7 @@ mix_message = "The solution bubbles vigorously!" maximum_temperature = T100C -/decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/emp_pulse/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -79,7 +79,7 @@ reaction_sound = 'sound/items/Welder.ogg' mix_message = "The solution suddenly ignites!" -/decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/flash_fire/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(istype(location)) @@ -93,7 +93,7 @@ result_amount = 0.4 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/chemsmoke/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -112,7 +112,7 @@ result_amount = 2 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/foam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/foam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -129,7 +129,7 @@ result_amount = 5 mix_message = "The solution foams up violently!" -/decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/metalfoam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/atom/location = holder.get_reaction_loc(chemical_reaction_flags) if(location) @@ -151,7 +151,7 @@ result_amount = 5 mix_message = "The solution bubbles vigorously!" -/decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/grenade_reaction/ironfoam/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) diff --git a/code/modules/reagents/reactions/reaction_herbal.dm b/code/modules/reagents/reactions/reaction_herbal.dm index b8a02ca07fec..62950dd1d64c 100644 --- a/code/modules/reagents/reactions/reaction_herbal.dm +++ b/code/modules/reagents/reactions/reaction_herbal.dm @@ -3,7 +3,7 @@ result_amount = 2 minimum_temperature = 100 CELSIUS -/decl/chemical_reaction/drug/herbal/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/drug/herbal/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) . = ..() // Add plant matter to represent the herbs that the medicine has been leached out of. holder?.add_reagent(/decl/material/solid/organic/plantmatter, created_volume) diff --git a/code/modules/reagents/reactions/reaction_other.dm b/code/modules/reagents/reactions/reaction_other.dm index 19c5613ea7ec..dca52f041f62 100644 --- a/code/modules/reagents/reactions/reaction_other.dm +++ b/code/modules/reagents/reactions/reaction_other.dm @@ -10,7 +10,7 @@ return ..() return 0 -/decl/chemical_reaction/soap_key/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/soap_key/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/obj/item/soap/S = holder.get_reaction_loc(chemical_reaction_flags) if(istype(S) && S.key_data) new /obj/item/key/temporary(get_turf(S), /decl/material/liquid/cleaner, S.key_data, strength) diff --git a/code/modules/reagents/reactions/reaction_recipe_food.dm b/code/modules/reagents/reactions/reaction_recipe_food.dm index bc052960e913..0ece0daefd2a 100644 --- a/code/modules/reagents/reactions/reaction_recipe_food.dm +++ b/code/modules/reagents/reactions/reaction_recipe_food.dm @@ -4,7 +4,7 @@ abstract_type = /decl/chemical_reaction/recipe/food var/obj_result -/decl/chemical_reaction/recipe/food/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/recipe/food/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(obj_result && isturf(location)) diff --git a/code/modules/reagents/reactions/reaction_synthesis.dm b/code/modules/reagents/reactions/reaction_synthesis.dm index 5c4f5b710f4c..2cf1dfce05f3 100644 --- a/code/modules/reagents/reactions/reaction_synthesis.dm +++ b/code/modules/reagents/reactions/reaction_synthesis.dm @@ -19,7 +19,7 @@ ) . = ..() -/decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/fiberglass/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -47,7 +47,7 @@ if(rtype != /decl/material/liquid/crystal_agent && REAGENT_VOLUME(holder, rtype) >= REAGENT_UNITS_PER_MATERIAL_SHEET) return TRUE -/decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/crystalization/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() @@ -81,7 +81,7 @@ continue return TRUE -/decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/aerogel/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) var/list/removing_reagents = list() @@ -100,7 +100,7 @@ required_reagents = list(/decl/material/liquid/acid = 1, /decl/material/liquid/plasticide = 2) mix_message = "The solution solidifies into a grey-white mass." -/decl/chemical_reaction/synthesis/plastication/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/plastication/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(location) @@ -115,7 +115,7 @@ result_amount = 3 mix_message = "The solution hardens and begins to crystallize." -/decl/chemical_reaction/synthesis/resin_pack/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/resin_pack/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) @@ -136,7 +136,7 @@ mix_message = "The solution thickens and solidifies." minimum_temperature = 100 CELSIUS -/decl/chemical_reaction/synthesis/soap/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/soap/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) @@ -167,7 +167,7 @@ minimum_temperature = 100 CELSIUS var/chipboard_type = /decl/material/solid/organic/wood/chipboard -/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) +/decl/chemical_reaction/synthesis/chipboard/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) ..() var/turf/T = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) if(!istype(T)) diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index 1bc713de0eb3..945334faa79a 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -5,30 +5,3 @@ ..() var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) psi?.check_latency_trigger(30, "a [name] overdose") - -/decl/chemical_reaction/synthesis/nullglass - name = "Soulstone" - result = null - required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) - result_amount = 1 - -#ifdef GAMEMODE_PACK_CULT -/decl/chemical_reaction/synthesis/nullglass/get_alternate_reaction_indicator(var/datum/reagents/holder) - var/list/blood_data = REAGENT_DATA(holder, /decl/material/liquid/blood) - var/weakref/donor_ref = LAZYACCESS(blood_data, DATA_BLOOD_DONOR) - var/mob/living/donor = donor_ref?.resolve() - . = istype(donor) && !!donor.get_ability_handler(/datum/ability_handler/psionics) -#endif - -/decl/chemical_reaction/synthesis/nullglass/on_reaction(datum/reagents/holder, created_volume, reaction_flags, list/reaction_data) - var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) - if(reaction_flags) - #ifdef GAMEMODE_PACK_CULT - for(var/i = 1, i <= created_volume, i++) - new /obj/item/soulstone(location) - #else - CRASH("Nullglass alternate reaction triggered in [holder.my_atom] without cult modpack loaded!") - #endif - else - for(var/i = 1, i <= created_volume*2, i++) - new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) \ No newline at end of file diff --git a/mods/gamemodes/cult/mobs/constructs/soulstone.dm b/mods/gamemodes/cult/mobs/constructs/soulstone.dm index a6e8d693c3b9..b5a8f6f09485 100644 --- a/mods/gamemodes/cult/mobs/constructs/soulstone.dm +++ b/mods/gamemodes/cult/mobs/constructs/soulstone.dm @@ -107,6 +107,33 @@ full = f update_icon() +// Soulstone synthesis recipe. +/decl/chemical_reaction/synthesis/soulstone + name = "Soulstone" + result = null + required_reagents = list(/decl/material/liquid/blood = 15, /decl/material/liquid/crystal_agent = 1) + result_amount = 1 + hidden_from_codex = TRUE // This shouldn't show up in search. Maybe it should be linked in a 'guide to cult' or something? + +/decl/chemical_reaction/synthesis/soulstone/send_data(datum/reagents/holder, reaction_limit) + return REAGENT_DATA(holder, /decl/material/liquid/blood) // allow on_reaction to get donor data + +/// Whether or not the reaction should produce a soulstone or a normal crystal. +/// The donor mob parameter may either be /mob/living or null. +/decl/chemical_reaction/synthesis/soulstone/proc/donor_is_magic(mob/living/donor) + return FALSE // By default, no one is magic! This is for modpacks to override. + +/decl/chemical_reaction/synthesis/soulstone/on_reaction(datum/reagents/holder, created_volume, list/reaction_data) + var/location = get_turf(holder.get_reaction_loc(chemical_reaction_flags)) + var/weakref/donor_ref = LAZYACCESS(reaction_data, DATA_BLOOD_DONOR) + if(donor_is_magic(donor_ref?.resolve())) + for(var/i = 1, i <= created_volume, i++) + new /obj/item/soulstone(location) + else // waste it and produce useless crystal shards + for(var/i = 1, i <= created_volume*2, i++) + new /obj/item/shard(location, /decl/material/solid/gemstone/crystal) + +// Construct shells. These accept soulstones. /obj/structure/constructshell name = "empty shell" icon = 'icons/obj/structures/construct.dmi' diff --git a/mods/~compatibility/patches/psionics/cult_psi.dm b/mods/~compatibility/patches/psionics/cult_psi.dm index 85c203913624..0fa46de32d68 100644 --- a/mods/~compatibility/patches/psionics/cult_psi.dm +++ b/mods/~compatibility/patches/psionics/cult_psi.dm @@ -1,3 +1,7 @@ +// Make psion blood usable for soulstone synthesis. +/decl/chemical_reaction/synthesis/soulstone/donor_is_magic(mob/living/donor) + return ..() || !!donor?.get_ability_handler(/datum/ability_handler/psionics) + // Make soulstones interact with psionics. /obj/item/soulstone/disrupts_psionics() . = !full ? src : FALSE From d8c53d2b98a24d288292bf7955aeb6e1a229dd62 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 20:12:43 +1100 Subject: [PATCH 10/95] Fixes janiborg not cleaning turfs. --- code/game/turfs/turf.dm | 4 ++-- code/modules/mob/living/silicon/robot/modules/_module.dm | 3 +++ .../mob/living/silicon/robot/modules/module_janitor.dm | 5 ++++- code/modules/mob/living/silicon/robot/robot.dm | 5 +++-- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 8a11da3ca3ad..f676ba4da6a9 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -696,8 +696,8 @@ return TRUE /turf/clean(clean_forensics = TRUE) - for(var/obj/effect/decal/cleanable/blood/B in contents) - B.clean(clean_forensics) + for(var/obj/effect/decal/cleanable/filth in contents) + filth.clean(clean_forensics) . = ..() //returns 1 if made bloody, returns 0 otherwise diff --git a/code/modules/mob/living/silicon/robot/modules/_module.dm b/code/modules/mob/living/silicon/robot/modules/_module.dm index 87216dc3704f..ee0046ef2ae5 100644 --- a/code/modules/mob/living/silicon/robot/modules/_module.dm +++ b/code/modules/mob/living/silicon/robot/modules/_module.dm @@ -233,3 +233,6 @@ var/obj/item/stock_parts/computer/hard_drive/disk = os.get_component(PART_HDD) for(var/T in software) disk.store_file(new T(disk), OS_PROGRAMS_DIR, TRUE) + +/obj/item/robot_module/proc/handle_turf(turf/target, mob/user) + return diff --git a/code/modules/mob/living/silicon/robot/modules/module_janitor.dm b/code/modules/mob/living/silicon/robot/modules/module_janitor.dm index 651a88e5b4e1..e88d8b131125 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_janitor.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_janitor.dm @@ -23,10 +23,13 @@ ) emag = /obj/item/chems/spray +/obj/item/robot_module/janitor/handle_turf(turf/target, mob/user) + target.clean() + /obj/item/robot_module/janitor/finalize_emag() . = ..() emag.add_to_reagents(/decl/material/liquid/lube, 250) - emag.SetName("Lube spray") + emag.SetName("lubricant spray") /obj/item/robot_module/janitor/respawn_consumable(var/mob/living/silicon/robot/R, var/amount) ..() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 3b206f6f5ec9..f2b3335bc462 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -824,12 +824,13 @@ /mob/living/silicon/robot/Move(a, b, flag) . = ..() if(.) + if(module && isturf(loc)) var/obj/item/ore/orebag = locate() in list(module_state_1, module_state_2, module_state_3) if(orebag) loc.attackby(orebag, src) - if(istype(module, /obj/item/robot_module/janitor)) - loc.clean() + module.handle_turf(loc, src) + if(client) var/turf/above = GetAbove(src) up_hint.icon_state = "uphint[!!(above && TURF_IS_MIMICKING(above))]" From 2267e7740d265fbb00b250ad44669658ec1c3253 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 20:28:53 +1100 Subject: [PATCH 11/95] Added fallback hair and facial hair for appearance changer. --- code/modules/nano/modules/human_appearance.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm index 4ba6ad96090d..6e22447ab9ca 100644 --- a/code/modules/nano/modules/human_appearance.dm +++ b/code/modules/nano/modules/human_appearance.dm @@ -116,7 +116,7 @@ hair_styles[++hair_styles.len] = list("hairstyle" = hair_decl.name, "ref" = "\ref[hair_decl]") data["hair_styles"] = hair_styles var/hairstyle = GET_HAIR_STYLE(owner) - var/decl/sprite_accessory/hair = GET_DECL(hairstyle) + var/decl/sprite_accessory/hair = GET_DECL(hairstyle) || GET_DECL(/decl/sprite_accessory/hair/bald) data["hair_style"] = hair.name data["change_facial_hair"] = can_change(APPEARANCE_FACIAL_HAIR) @@ -127,7 +127,7 @@ facial_hair_styles[++facial_hair_styles.len] = list("facialhairstyle" = facial_hair_decl.name, "ref" = "\ref[facial_hair_decl]") data["facial_hair_styles"] = facial_hair_styles var/facial_hairstyle = GET_FACIAL_HAIR_STYLE(owner) - var/decl/sprite_accessory/facial_hair = GET_DECL(facial_hairstyle) + var/decl/sprite_accessory/facial_hair = GET_DECL(facial_hairstyle) || GET_DECL(/decl/sprite_accessory/facial_hair/shaved) data["facial_hair_style"] = facial_hair.name data["change_hair_color"] = can_change(APPEARANCE_HAIR_COLOR) From fc12c6960ed5d02d5aaddf2138ef087729f1f466 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 8 Jan 2025 20:44:48 +1100 Subject: [PATCH 12/95] Adding automatic shuttle landmarks to tradeship, ministation and exodus. --- code/modules/shuttles/landmarks.dm | 2 +- maps/exodus/exodus-1.dmm | 13 ++++++++----- maps/exodus/exodus-2.dmm | 12 ++++++++---- maps/ministation/ministation-0.dmm | 10 +++++++--- maps/ministation/ministation-1.dmm | 8 ++++++-- maps/ministation/ministation-2.dmm | 10 +++++++--- maps/ministation/ministation-3.dmm | 6 +++++- maps/tradeship/tradeship-0.dmm | 8 ++++++-- maps/tradeship/tradeship-1.dmm | 8 ++++++-- maps/tradeship/tradeship-2.dmm | 12 ++++++++---- maps/tradeship/tradeship-3.dmm | 8 ++++++-- 11 files changed, 68 insertions(+), 29 deletions(-) diff --git a/code/modules/shuttles/landmarks.dm b/code/modules/shuttles/landmarks.dm index 82cde0c759be..661bab8cf891 100644 --- a/code/modules/shuttles/landmarks.dm +++ b/code/modules/shuttles/landmarks.dm @@ -135,7 +135,7 @@ var/global/list/shuttle_landmarks = list() /obj/effect/shuttle_landmark/automatic/sector_set(var/obj/effect/overmap/visitable/O) ..() - SetName("[initial(name)] ([x],[y])") + SetName("[initial(name)] ([x],[y],[z])") //Subtype that calls explosion on init to clear space for shuttles /obj/effect/shuttle_landmark/automatic/clearing diff --git a/maps/exodus/exodus-1.dmm b/maps/exodus/exodus-1.dmm index c76876085bad..030d5c21bbae 100644 --- a/maps/exodus/exodus-1.dmm +++ b/maps/exodus/exodus-1.dmm @@ -3496,8 +3496,7 @@ department = "Atmospherics"; name = "Atmos RC"; pixel_y = 32; - dir = 1; - + dir = 1 }, /obj/structure/table/steel, /turf/floor/tiled/steel_grid, @@ -5467,6 +5466,10 @@ }, /turf/floor/lino, /area/exodus/maintenance/telecomms) +"rd" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "rj" = ( /obj/effect/floor_decal/industrial/outline/grey, /obj/machinery/camera/network/command{ @@ -16599,7 +16602,7 @@ aa aa aa aa -aa +rd aa aa aa @@ -44175,7 +44178,7 @@ aa aa aa aa -aa +rd aa aa aa @@ -49205,7 +49208,7 @@ aa aa aa aa -aa +rd aa aa aa diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index 480196711f2d..fb38f5ce9729 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -63545,6 +63545,10 @@ /obj/item/radio/beacon, /turf/floor/plating, /area/ship/exodus_pod_research) +"eYg" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "eZK" = ( /obj/effect/floor_decal/corner/purple, /obj/machinery/light, @@ -75579,7 +75583,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU @@ -87506,7 +87510,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU @@ -107479,7 +107483,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU @@ -115429,7 +115433,7 @@ cLU cLU cLU cLU -cLU +eYg cLU cLU cLU diff --git a/maps/ministation/ministation-0.dmm b/maps/ministation/ministation-0.dmm index 64dc3698f282..2f87aab690dd 100644 --- a/maps/ministation/ministation-0.dmm +++ b/maps/ministation/ministation-0.dmm @@ -5556,6 +5556,10 @@ }, /turf/floor/tiled/monotile, /area/ministation/atmospherics) +"yY" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "yZ" = ( /obj/structure/cable{ icon_state = "1-2" @@ -33009,7 +33013,7 @@ aa aa aa aa -aa +yY aa aa aa @@ -49102,7 +49106,7 @@ aa aa aa aa -aa +yY aa aa aa @@ -57125,7 +57129,7 @@ aa aa aa aa -aa +yY aa aa aa diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 770583a5752f..9df6edea4d93 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -2713,6 +2713,10 @@ }, /turf/floor/tiled, /area/ministation/hall/w2) +"nt" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "nu" = ( /obj/effect/floor_decal/carpet{ dir = 8 @@ -54008,7 +54012,7 @@ aa aa aa aa -aa +nt aa aa aa @@ -54341,7 +54345,7 @@ aa aa aa aa -aa +nt aa aa aa diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 89d145de056a..269092ac0dd3 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -3537,6 +3537,10 @@ }, /turf/floor/reinforced, /area/ministation/science) +"sq" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "sr" = ( /turf/floor/tiled/dark/monotile/telecomms, /area/ministation/telecomms) @@ -29553,7 +29557,7 @@ vA vA vA vA -vA +sq vA vA vA @@ -45789,7 +45793,7 @@ vA vA vA vA -vA +sq vA vA vA @@ -52137,7 +52141,7 @@ vA vA vA vA -vA +sq vA vA vA diff --git a/maps/ministation/ministation-3.dmm b/maps/ministation/ministation-3.dmm index cbdd8abb5380..e5b68a7fe209 100644 --- a/maps/ministation/ministation-3.dmm +++ b/maps/ministation/ministation-3.dmm @@ -88,6 +88,10 @@ }, /turf/floor/plating, /area/ministation/maint/l4central) +"kH" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "kV" = ( /obj/machinery/atmospherics/pipe/simple/hidden/universal{ dir = 4 @@ -40459,7 +40463,7 @@ aa aa aa aa -aa +kH aa aa aa diff --git a/maps/tradeship/tradeship-0.dmm b/maps/tradeship/tradeship-0.dmm index 09ad5b87a1d4..6fdddb5e5340 100644 --- a/maps/tradeship/tradeship-0.dmm +++ b/maps/tradeship/tradeship-0.dmm @@ -1197,6 +1197,10 @@ /obj/item/stack/cable_coil/random/three, /turf/floor, /area/ship/trade/loading_bay) +"lG" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "ne" = ( /obj/machinery/atmospherics/pipe/simple/hidden/scrubbers, /obj/machinery/atmospherics/pipe/simple/hidden/supply, @@ -3507,7 +3511,7 @@ aa aa aa aa -aa +lG aa aa aa @@ -7360,7 +7364,7 @@ aa aa aa aa -aa +lG aa aa aa diff --git a/maps/tradeship/tradeship-1.dmm b/maps/tradeship/tradeship-1.dmm index 57e51cb711cf..3c13e753b124 100644 --- a/maps/tradeship/tradeship-1.dmm +++ b/maps/tradeship/tradeship-1.dmm @@ -1763,6 +1763,10 @@ }, /turf/floor/plating, /area/ship/trade/maintenance/eva) +"eH" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "eJ" = ( /obj/machinery/vending/materials{ dir = 4 @@ -4589,7 +4593,7 @@ aa aa aa aa -aa +eH aa aa aa @@ -8689,7 +8693,7 @@ aa aa aa aa -aa +eH aa aa aa diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index c2475414d42a..0188017c37aa 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -5412,6 +5412,10 @@ }, /turf/floor/plating/airless, /area/ship/trade/maintenance/engine/aft) +"vN" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "vP" = ( /obj/machinery/light{ dir = 8; @@ -9045,7 +9049,7 @@ aa aa aa aa -aa +vN aa aa aa @@ -9259,7 +9263,7 @@ aa aa aa aa -aa +vN aa aa aa @@ -13196,7 +13200,7 @@ aa aa aa aa -aa +vN aa aa aa @@ -13639,7 +13643,7 @@ aa aa aa aa -aa +vN aa aa aa diff --git a/maps/tradeship/tradeship-3.dmm b/maps/tradeship/tradeship-3.dmm index eba7b7f15ab4..44cf19b1055a 100644 --- a/maps/tradeship/tradeship-3.dmm +++ b/maps/tradeship/tradeship-3.dmm @@ -1181,6 +1181,10 @@ /obj/machinery/commsrelay, /turf/floor/bluegrid, /area/ship/trade/comms) +"UX" = ( +/obj/effect/shuttle_landmark/automatic, +/turf/space, +/area/space) "UY" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -2382,7 +2386,7 @@ aa aa aa aa -aa +UX aa aa aa @@ -6665,7 +6669,7 @@ aa aa aa aa -aa +UX aa aa aa From a2fe6ec43b35f893976934d2ff561bb244fd9f8a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 09:04:40 +1100 Subject: [PATCH 13/95] Readding worms to turf digging. --- code/game/turfs/floors/floor_digging.dm | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/code/game/turfs/floors/floor_digging.dm b/code/game/turfs/floors/floor_digging.dm index 3351970e8af6..d3cadac07f98 100644 --- a/code/game/turfs/floors/floor_digging.dm +++ b/code/game/turfs/floors/floor_digging.dm @@ -47,10 +47,20 @@ /turf/floor/get_diggable_resources() var/decl/material/my_material = get_material() - if(is_fundament() && istype(my_material) && my_material.dug_drop_type && (get_physical_height() > -(FLUID_DEEP))) - . = list() - .[my_material.dug_drop_type] = list("amount" = 3, "variance" = 2, "material" = my_material.type) - if(!gemstone_dropped && prob(my_material.gemstone_chance) && LAZYLEN(my_material.gemstone_types)) - gemstone_dropped = TRUE - var/gem_mat = pick(my_material.gemstone_types) - .[/obj/item/gemstone] = list("amount" = 1, "material" = gem_mat) + if(!is_fundament() || !istype(my_material) || !my_material.dug_drop_type || (get_physical_height() <= -(FLUID_DEEP))) + return + + . = list() + + // All turfs drop resources to backfill them with (or make firepits, etc) + .[my_material.dug_drop_type] = list("amount" = 3, "variance" = 2, "material" = my_material.type) + + // Dirt/mud/etc might have some worms. + if(prob(5 * get_plant_growth_rate())) + .[/obj/item/food/worm] = list("amount" = 1, "material" = /obj/item/food/worm::material) + + // Some materials (like clay) might contain gemstones. + if(!gemstone_dropped && prob(my_material.gemstone_chance) && LAZYLEN(my_material.gemstone_types)) + gemstone_dropped = TRUE + var/gem_mat = pick(my_material.gemstone_types) + .[/obj/item/gemstone] = list("amount" = 1, "material" = gem_mat) From e360a52d656a9badb72ea3552ef884b25673cb3c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 20 Dec 2024 20:04:34 +1100 Subject: [PATCH 14/95] Moving dipping, filling and emptying reagent containers onto alt interactions. --- code/game/atoms.dm | 12 ++++++-- .../game/objects/structures/barrels/barrel.dm | 17 ----------- code/game/turfs/turf.dm | 28 ++++++++----------- code/modules/hydroponics/trays/tray_soil.dm | 5 ---- code/modules/interactions/_interactions.dm | 1 + .../modules/interactions/interactions_atom.dm | 6 +++- .../interactions/interactions_reagents.dm | 17 +++++------ code/modules/reagents/reagent_dispenser.dm | 1 + 8 files changed, 37 insertions(+), 50 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index d13760956e3b..18fd88d9f8b3 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -906,9 +906,15 @@ . = list() if(storage) . += /decl/interaction_handler/storage_open - if(reagents?.total_volume && ATOM_IS_OPEN_CONTAINER(src)) - . += /decl/interaction_handler/wash_hands - . += /decl/interaction_handler/drink + if(reagents?.maximum_volume) + var/static/list/_reagent_interactions = list( + /decl/interaction_handler/wash_hands, + /decl/interaction_handler/drink, + /decl/interaction_handler/dip_item, + /decl/interaction_handler/fill_from, + /decl/interaction_handler/empty_into + ) + LAZYADD(., _reagent_interactions) /atom/proc/can_climb_from_below(var/mob/climber) return FALSE diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index b28986d55923..958dba359e7a 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -31,23 +31,6 @@ if(. == INITIALIZE_HINT_NORMAL && storage) return INITIALIZE_HINT_LATELOAD // we want to grab our turf contents. -// Overrides due to wonky reagent_dispeners opencontainer flag handling. -/obj/structure/reagent_dispensers/barrel/can_be_poured_from(mob/user, atom/target) - return (reagents?.maximum_volume > 0) -/obj/structure/reagent_dispensers/barrel/can_be_poured_into(mob/user, atom/target) - return (reagents?.maximum_volume > 0) -// Override to skip open container check. -/obj/structure/reagent_dispensers/barrel/can_drink_from(mob/user) - return reagents?.total_volume && user.check_has_mouth() - -/obj/structure/reagent_dispensers/barrel/get_alt_interactions(mob/user) - . = ..() - if(reagents?.total_volume >= FLUID_PUDDLE) - LAZYADD(., /decl/interaction_handler/dip_item) - LAZYADD(., /decl/interaction_handler/fill_from) - if(user?.get_active_held_item()) - LAZYADD(., /decl/interaction_handler/empty_into) - /obj/structure/reagent_dispensers/barrel/LateInitialize(mapload, ...) ..() if(mapload) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4bea938640e6..2145650da20d 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -795,22 +795,18 @@ /turf/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/show_turf_contents) - if(user) - var/obj/item/held = user.get_active_held_item() || user.get_usable_hand_slot_organ() - if(istype(held)) - if(reagents?.total_volume >= FLUID_PUDDLE) - LAZYADD(., /decl/interaction_handler/dip_item) - LAZYADD(., /decl/interaction_handler/fill_from) - LAZYADD(., /decl/interaction_handler/empty_into) - if(IS_SHOVEL(held)) - if(can_dig_pit(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/pit) - if(can_dig_trench(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) - if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) - if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) + var/obj/item/held = user?.get_active_held_item() + if(!istype(held)) + return + if(IS_SHOVEL(held)) + if(can_dig_pit(held.material?.hardness)) + LAZYDISTINCTADD(., /decl/interaction_handler/dig/pit) + if(can_dig_trench(held.material?.hardness)) + LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) + if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) + LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) + if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) + LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) /turf/proc/can_show_footsteps() return simulated diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index 6a5d78981043..d1862c1e47dc 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -19,11 +19,6 @@ var/obj/item/stack/material/brick/reinforced_with -/obj/machinery/portable_atmospherics/hydroponics/soil/get_alt_interactions(var/mob/user) - . = ..() - . -= /decl/interaction_handler/drink - . -= /decl/interaction_handler/wash_hands - /obj/machinery/portable_atmospherics/hydroponics/soil/Initialize() . = ..() diff --git a/code/modules/interactions/_interactions.dm b/code/modules/interactions/_interactions.dm index ebdd06610ddd..58e9d8713d40 100644 --- a/code/modules/interactions/_interactions.dm +++ b/code/modules/interactions/_interactions.dm @@ -7,6 +7,7 @@ var/expected_user_type = /mob/living var/interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION var/incapacitation_flags + var/apply_click_cooldown = DEFAULT_ATTACK_COOLDOWN /decl/interaction_handler/proc/is_possible(var/atom/target, var/mob/user, var/obj/item/prop) diff --git a/code/modules/interactions/interactions_atom.dm b/code/modules/interactions/interactions_atom.dm index e8073b75f4af..ba46ccdc3b9d 100644 --- a/code/modules/interactions/interactions_atom.dm +++ b/code/modules/interactions/interactions_atom.dm @@ -18,9 +18,13 @@ if(length(possibilities) > 1 || (choice.interaction_flags & INTERACTION_NEVER_AUTOMATIC)) choice = null choice = show_radial_menu(user, src, possibilities, use_labels = RADIAL_LABELS_CENTERED) - if(!istype(choice) || QDELETED(user) || !(choice.type in get_alt_interactions(user)) || !choice.is_possible(src, user, prop)) + if(!istype(choice) || QDELETED(user) || QDELETED(src)) + return TRUE + if(!(choice.type in get_alt_interactions(user)) || !choice.is_possible(src, user, user.get_active_held_item())) return TRUE user.face_atom(src) choice.invoked(src, user, prop) + if(choice.apply_click_cooldown) + user.setClickCooldown(choice.apply_click_cooldown) return TRUE diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm index 79885549cc40..6fce4a4c578b 100644 --- a/code/modules/interactions/interactions_reagents.dm +++ b/code/modules/interactions/interactions_reagents.dm @@ -1,5 +1,5 @@ /decl/interaction_handler/dip_item - name = "Dip Into" + name = "Dip Held Item In" interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop) @@ -17,7 +17,7 @@ return TRUE /decl/interaction_handler/fill_from - name = "Fill From" + name = "Fill Held Item From" interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/fill_from/is_possible(atom/target, mob/user, obj/item/prop) @@ -25,7 +25,9 @@ return if(target.reagents?.total_volume < FLUID_PUDDLE) return FALSE - if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers))) + if(!istype(prop) || prop.reagents?.maximum_volume <= 0) + return FALSE + if(!isitem(target) && !istype(target, /obj/structure/reagent_dispensers)) return FALSE return target.can_be_poured_from(user, prop) && prop.can_be_poured_into(user, target) @@ -34,12 +36,11 @@ var/obj/item/vessel = target return vessel.standard_pour_into(user, prop) if(istype(target, /obj/structure/reagent_dispensers)) - // Reagent dispensers have some wonky assumptions due to old UX around filling/emptying so we skip the atom flags check. - return prop.standard_dispenser_refill(user, target, skip_container_check = TRUE) + return prop.standard_dispenser_refill(user, target) return FALSE /decl/interaction_handler/empty_into - name = "Pour Into" + name = "Empty Held Item Into" interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/empty_into/is_possible(atom/target, mob/user, obj/item/prop) @@ -59,7 +60,7 @@ interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() && !istype(prop) && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) + . = ..() && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) if(.) for(var/hand_slot in user.get_held_item_slots()) var/obj/item/organ/external/organ = user.get_organ(hand_slot) @@ -107,7 +108,7 @@ interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC /decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && !istype(prop) && target.can_drink_from(user) + return ..() && ATOM_IS_OPEN_CONTAINER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) /decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index d8d5d4e5e06c..187d9e5d59ba 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -102,6 +102,7 @@ log_and_message_admins("opened a tank at [get_area_name(loc)].") leak() return TRUE + . = ..() /obj/structure/reagent_dispensers/verb/set_amount_dispensed() From dc8c34cfce84066b9c273737b98f4bfdd340c3ff Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 20 Dec 2024 20:31:16 +1100 Subject: [PATCH 15/95] Allowing interactions to be used during standard attack_hand() clicks. --- code/_onclick/click.dm | 2 +- code/_onclick/other_mobs.dm | 3 +++ code/game/atoms.dm | 14 ++++++++++++-- code/game/objects/structures/doors/_door.dm | 2 +- code/game/turfs/turf.dm | 8 ++++---- code/modules/interactions/interactions_atom.dm | 11 +++++++++-- .../computers/modular_computer/interaction.dm | 11 +++++++---- code/modules/paperwork/paper_plane.dm | 2 +- 8 files changed, 38 insertions(+), 15 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 8fa2950b1b9e..2013ac722b49 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -295,7 +295,7 @@ A.AltClick(src) /atom/proc/AltClick(var/mob/user) - if(try_handle_interactions(user, get_alt_interactions(user), user?.get_active_held_item())) + if(try_handle_interactions(user, get_alt_interactions(user), user?.get_active_held_item(), check_alt_interactions = TRUE)) return TRUE if(user?.get_preference_value(/datum/client_preference/show_turf_contents) == PREF_ALT_CLICK) . = show_atom_list_for_turf(user, get_turf(src)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index de135d672c0d..f3d74569b41b 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -25,6 +25,9 @@ if(handle_grab_interaction(user)) return TRUE + if(try_handle_interactions(user, get_standard_interactions(user), user?.get_active_held_item(), check_alt_interactions = FALSE)) + return TRUE + if(!LAZYLEN(climbers) || (user in climbers) || !user.check_dexterity(DEXTERITY_HOLD_ITEM, silent = TRUE)) return FALSE diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 18fd88d9f8b3..11673a35aad7 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -894,6 +894,17 @@ return check_loc check_loc = check_loc.loc +/** + Get a list of standard interactions for a user from this atom. + + - `user`: The mob that these alt interactions are for + - Return: A list containing the alt interactions +*/ +/atom/proc/get_standard_interactions(var/mob/user) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + return null + /** Get a list of alt interactions for a user from this atom. @@ -903,9 +914,8 @@ /atom/proc/get_alt_interactions(var/mob/user) SHOULD_CALL_PARENT(TRUE) RETURN_TYPE(/list) - . = list() if(storage) - . += /decl/interaction_handler/storage_open + LAZYADD(., /decl/interaction_handler/storage_open) if(reagents?.maximum_volume) var/static/list/_reagent_interactions = list( /decl/interaction_handler/wash_hands, diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 745ad4bea2d6..0b10f0f8d372 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -205,7 +205,7 @@ /obj/structure/door/get_alt_interactions(var/mob/user) . = ..() if(density) - . += /decl/interaction_handler/knock_on_door + LAZYADD(., /decl/interaction_handler/knock_on_door) /decl/interaction_handler/knock_on_door name = "Knock On Door" diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 2145650da20d..da3ad304823f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -800,13 +800,13 @@ return if(IS_SHOVEL(held)) if(can_dig_pit(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/pit) + LAZYADD(., /decl/interaction_handler/dig/pit) if(can_dig_trench(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) + LAZYADD(., /decl/interaction_handler/dig/trench) if(IS_PICK(held) && can_dig_trench(held.material?.hardness, using_tool = TOOL_PICK)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/trench) + LAZYADD(., /decl/interaction_handler/dig/trench) if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) - LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) + LAZYADD(., /decl/interaction_handler/dig/farm) /turf/proc/can_show_footsteps() return simulated diff --git a/code/modules/interactions/interactions_atom.dm b/code/modules/interactions/interactions_atom.dm index ba46ccdc3b9d..353dacb38dd0 100644 --- a/code/modules/interactions/interactions_atom.dm +++ b/code/modules/interactions/interactions_atom.dm @@ -1,4 +1,4 @@ -/atom/proc/try_handle_interactions(var/mob/user, var/list/interactions, var/obj/item/prop) +/atom/proc/try_handle_interactions(var/mob/user, var/list/interactions, var/obj/item/prop, var/check_alt_interactions) if(!length(interactions)) return FALSE @@ -20,7 +20,14 @@ choice = show_radial_menu(user, src, possibilities, use_labels = RADIAL_LABELS_CENTERED) if(!istype(choice) || QDELETED(user) || QDELETED(src)) return TRUE - if(!(choice.type in get_alt_interactions(user)) || !choice.is_possible(src, user, user.get_active_held_item())) + // This is not ideal but I don't want to pass a callback through here as a param and call it. :( + if(check_alt_interactions) + if(!(choice.type in get_alt_interactions(user))) + return TRUE + else + if(!(choice.type in get_standard_interactions(user))) + return TRUE + if(!choice.is_possible(src, user, user.get_active_held_item())) return TRUE user.face_atom(src) diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 6bb4a4f41b84..52d8a008c73b 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -136,10 +136,13 @@ /obj/item/modular_computer/get_alt_interactions(var/mob/user) . = ..() - LAZYADD(., /decl/interaction_handler/remove_id/modular_computer) - LAZYADD(., /decl/interaction_handler/remove_pen/modular_computer) - LAZYADD(., /decl/interaction_handler/emergency_shutdown) - LAZYADD(., /decl/interaction_handler/remove_chargestick) + var/static/list/_modular_computer_interactions = list( + /decl/interaction_handler/remove_id/modular_computer, + /decl/interaction_handler/remove_pen/modular_computer, + /decl/interaction_handler/emergency_shutdown, + /decl/interaction_handler/remove_chargestick + ) + LAZYADD(., _modular_computer_interactions) // // Remove ID diff --git a/code/modules/paperwork/paper_plane.dm b/code/modules/paperwork/paper_plane.dm index ac8ebc5d961e..f24cda675460 100644 --- a/code/modules/paperwork/paper_plane.dm +++ b/code/modules/paperwork/paper_plane.dm @@ -91,4 +91,4 @@ /obj/item/paper/get_alt_interactions(mob/user) . = ..() - LAZYDISTINCTADD(., /decl/interaction_handler/make_paper_plane) \ No newline at end of file + LAZYADD(., /decl/interaction_handler/make_paper_plane) \ No newline at end of file From 86020003daaea51f1b51373bbef818a270a46d04 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 20 Dec 2024 20:57:48 +1100 Subject: [PATCH 16/95] Adding alt interaction info to examine(). --- code/game/atoms.dm | 11 +++++++++++ code/game/atoms_movable_interactions.dm | 2 ++ .../_machines_base/stock_parts/card_reader.dm | 3 ++- .../_machines_base/stock_parts/cupholder.dm | 3 ++- .../_machines_base/stock_parts/disk_reader.dm | 3 ++- .../_machines_base/stock_parts/item_holder.dm | 1 + code/game/machinery/washing_machine.dm | 2 ++ code/game/objects/_objs_interactions.dm | 1 + code/game/objects/items/_item_interactions.dm | 1 + code/game/objects/items/_item_reagents.dm | 2 +- code/game/objects/items/blades/folding.dm | 1 + code/game/objects/items/devices/gps.dm | 1 + code/game/objects/items/devices/paint_sprayer.dm | 1 + .../objects/items/weapons/storage/wallets.dm | 1 + .../crates_lockers/closets/__closet.dm | 1 + code/game/objects/structures/doors/_door.dm | 1 + code/game/objects/structures/extinguisher.dm | 1 + code/game/objects/structures/fires.dm | 1 + code/game/turfs/turf.dm | 4 ++++ code/game/turfs/walls/wall_natural_ramps.dm | 1 + .../components/binary_devices/pump.dm | 1 + code/modules/clothing/_clothing.dm | 5 +++-- .../clothing_state/clothing_state_buttons.dm | 1 + .../clothing_state/clothing_state_hood.dm | 1 + .../clothing_state/clothing_state_rolled.dm | 1 + .../clothing_state/clothing_state_sleeves.dm | 1 + .../clothing_state/clothing_state_tucked.dm | 1 + .../clothing_state/clothing_state_untied.dm | 1 + .../modules/clothing/neck/necklace/__necklace.dm | 1 + code/modules/codex/codex_atom.dm | 1 + .../crafting/pottery/pottery_structures.dm | 1 + .../microscope/_forensic_machine.dm | 1 + code/modules/hydroponics/spreading/spreading.dm | 1 + code/modules/hydroponics/trays/tray.dm | 2 ++ code/modules/interactions/_interactions.dm | 4 ++++ .../interactions/interactions_reagents.dm | 16 ++++++++++------ code/modules/interactions/interactions_shared.dm | 5 +++++ code/modules/mechs/equipment/engineering.dm | 1 + code/modules/mechs/equipment/utility.dm | 2 ++ code/modules/mining/ore_box.dm | 1 + code/modules/mob/living/living.dm | 1 + .../computers/modular_computer/interaction.dm | 2 ++ .../computers/subtypes/dev_laptop.dm | 3 ++- code/modules/multiz/mobile_ladder.dm | 1 + code/modules/paperwork/carbonpaper.dm | 3 ++- code/modules/paperwork/clipboard.dm | 1 + code/modules/paperwork/paper.dm | 2 ++ code/modules/paperwork/paper_bundle.dm | 1 + code/modules/paperwork/paper_plane.dm | 1 + code/modules/paperwork/paperbin.dm | 1 + code/modules/paperwork/papershredder.dm | 1 + code/modules/paperwork/photocopier.dm | 2 ++ code/modules/paperwork/photography.dm | 1 + code/modules/paperwork/printer.dm | 1 + code/modules/projectiles/gun.dm | 2 ++ code/modules/projectiles/guns/projectile.dm | 2 ++ .../projectiles/guns/projectile/revolver.dm | 1 + code/modules/reagents/reagent_containers.dm | 2 ++ .../reagents/reagent_containers/drinks.dm | 2 +- .../food/sliceable/pizza/pizza_box.dm | 1 + .../modules/reagents/reagent_containers/spray.dm | 1 + code/modules/reagents/reagent_dispenser.dm | 1 + code/modules/sealant_gun/sealant_injector.dm | 1 + 63 files changed, 109 insertions(+), 15 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 11673a35aad7..c26b4e3aa952 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -295,6 +295,17 @@ to_chat(user, "[html_icon(src)] That's [f_name] [suffix]") to_chat(user, desc) + + var/list/alt_interactions = get_alt_interactions(user) + if(LAZYLEN(alt_interactions)) + var/list/interaction_strings = list() + for(var/interaction_type as anything in alt_interactions) + var/decl/interaction_handler/interaction = GET_DECL(interaction_type) + if(interaction.examine_desc && (interaction.always_show_on_examine || interaction.is_possible(src, user, user?.get_active_held_item()))) + interaction_strings += emote_replace_target_tokens(interaction.examine_desc, src) + if(length(interaction_strings)) + to_chat(user, SPAN_INFO("Alt-click on \the [src] to [english_list(interaction_strings, and_text = " or ")].")) + RAISE_EVENT(/decl/observ/atom_examined, src, user, distance) return TRUE diff --git a/code/game/atoms_movable_interactions.dm b/code/game/atoms_movable_interactions.dm index 110c09afb824..8cf50ef5bc47 100644 --- a/code/game/atoms_movable_interactions.dm +++ b/code/game/atoms_movable_interactions.dm @@ -14,6 +14,7 @@ name = "Examine" expected_user_type = /mob interaction_flags = 0 + examine_desc = "examine $TARGET_THEM$" /decl/interaction_handler/look/invoked(atom/target, mob/user, obj/item/prop) target.examine(user, get_dist(user, target)) @@ -22,6 +23,7 @@ name = "Grab" expected_target_type = /atom/movable interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF + examine_desc = "grab $TARGET_THEM$" /decl/interaction_handler/grab/is_possible(atom/movable/target, mob/user, obj/item/prop) return ..() && !target.anchored diff --git a/code/game/machinery/_machines_base/stock_parts/card_reader.dm b/code/game/machinery/_machines_base/stock_parts/card_reader.dm index aecd5af4e4f9..3f92564a8d7e 100644 --- a/code/game/machinery/_machines_base/stock_parts/card_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/card_reader.dm @@ -73,4 +73,5 @@ name = "Eject Card" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject_id" - expected_component_type = /obj/item/stock_parts/item_holder/card_reader \ No newline at end of file + expected_component_type = /obj/item/stock_parts/item_holder/card_reader + examine_desc = "eject an inserted ID card" diff --git a/code/game/machinery/_machines_base/stock_parts/cupholder.dm b/code/game/machinery/_machines_base/stock_parts/cupholder.dm index 23f56f7772cb..da49b9b5e9c1 100644 --- a/code/game/machinery/_machines_base/stock_parts/cupholder.dm +++ b/code/game/machinery/_machines_base/stock_parts/cupholder.dm @@ -47,4 +47,5 @@ /decl/interaction_handler/remove_held_item/cup name = "Remove Cup" - expected_component_type = /obj/item/stock_parts/item_holder/cupholder \ No newline at end of file + expected_component_type = /obj/item/stock_parts/item_holder/cupholder + examine_desc = "remove a cup" diff --git a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm index e61cf6be322d..7c35679ef557 100644 --- a/code/game/machinery/_machines_base/stock_parts/disk_reader.dm +++ b/code/game/machinery/_machines_base/stock_parts/disk_reader.dm @@ -42,4 +42,5 @@ /decl/interaction_handler/remove_held_item/disk name = "Eject Disk" - expected_component_type = /obj/item/stock_parts/item_holder/disk_reader \ No newline at end of file + expected_component_type = /obj/item/stock_parts/item_holder/disk_reader + examine_desc = "remove a disk" diff --git a/code/game/machinery/_machines_base/stock_parts/item_holder.dm b/code/game/machinery/_machines_base/stock_parts/item_holder.dm index 3462f18f5605..d6404088a4c5 100644 --- a/code/game/machinery/_machines_base/stock_parts/item_holder.dm +++ b/code/game/machinery/_machines_base/stock_parts/item_holder.dm @@ -128,6 +128,7 @@ name = "Eject Item" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" + examine_desc = "eject an item" var/obj/item/stock_parts/item_holder/expected_component_type /decl/interaction_handler/remove_held_item/validate() diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm index a82e80825105..bf5c37416308 100644 --- a/code/game/machinery/washing_machine.dm +++ b/code/game/machinery/washing_machine.dm @@ -250,6 +250,7 @@ /decl/interaction_handler/start_washer name = "Start washer" expected_target_type = /obj/machinery/washing_machine + examine_desc = "start a wash cycle" /decl/interaction_handler/start_washer/is_possible(obj/machinery/washing_machine/washer, mob/user) . = ..() @@ -263,6 +264,7 @@ /decl/interaction_handler/toggle_open/washing_machine name = "Toggle detergent port" expected_target_type = /obj/machinery/washing_machine + examine_desc = "open the detergent port" /decl/interaction_handler/toggle_open/washing_machine/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/washing_machine/washer = target diff --git a/code/game/objects/_objs_interactions.dm b/code/game/objects/_objs_interactions.dm index b295c6fd71fc..65d143b39b36 100644 --- a/code/game/objects/_objs_interactions.dm +++ b/code/game/objects/_objs_interactions.dm @@ -8,6 +8,7 @@ /decl/interaction_handler/rotate name = "Rotate" expected_target_type = /obj + examine_desc = "rotate $TARGET_THEM$" /decl/interaction_handler/rotate/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/game/objects/items/_item_interactions.dm b/code/game/objects/items/_item_interactions.dm index b9efb6e61dc8..6467b1d19d53 100644 --- a/code/game/objects/items/_item_interactions.dm +++ b/code/game/objects/items/_item_interactions.dm @@ -34,6 +34,7 @@ name = "Open Storage" expected_target_type = /atom incapacitation_flags = INCAPACITATION_DISRUPTED + examine_desc = "open $TARGET_THEIR$ storage" /decl/interaction_handler/storage_open/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && (ishuman(user) || isrobot(user) || issmall(user)) && target?.storage diff --git a/code/game/objects/items/_item_reagents.dm b/code/game/objects/items/_item_reagents.dm index abe58d48fbf6..e664024c9520 100644 --- a/code/game/objects/items/_item_reagents.dm +++ b/code/game/objects/items/_item_reagents.dm @@ -1,4 +1,4 @@ -/obj/item/proc/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target, skip_container_check = FALSE) // This goes into afterattack +/obj/item/proc/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) // This goes into afterattack if(!istype(target) || (!skip_container_check && (target.atom_flags & ATOM_FLAG_OPEN_CONTAINER))) return FALSE diff --git a/code/game/objects/items/blades/folding.dm b/code/game/objects/items/blades/folding.dm index 029557ab3b9a..9617f3cbb84b 100644 --- a/code/game/objects/items/blades/folding.dm +++ b/code/game/objects/items/blades/folding.dm @@ -98,6 +98,7 @@ name = "Adjust Folding Knife" expected_target_type = /obj/item/bladed/folding interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION + examine_desc = "adjust $TARGET_THEM$" /decl/interaction_handler/folding_knife/is_possible(atom/target, mob/user) . = ..() diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index c58b5bd7ae2f..4508758e19d3 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -377,6 +377,7 @@ var/global/list/all_gps_units = list() /decl/interaction_handler/gps_toggle name = "Toggle Tracking" expected_target_type = /obj/item/gps + examine_desc = "toggle GPS tracking" /decl/interaction_handler/gps_toggle/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gps/G = target diff --git a/code/game/objects/items/devices/paint_sprayer.dm b/code/game/objects/items/devices/paint_sprayer.dm index 88c1e1195d73..3c6f08681458 100644 --- a/code/game/objects/items/devices/paint_sprayer.dm +++ b/code/game/objects/items/devices/paint_sprayer.dm @@ -456,6 +456,7 @@ name = "Change Color Preset" expected_target_type = /obj/item/paint_sprayer interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_INVENTORY + examine_desc = "change the color preset" /decl/interaction_handler/paint_sprayer_colour/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/paint_sprayer/sprayer = target diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index faf51ae0c59e..5fcafd398aef 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -89,6 +89,7 @@ /decl/interaction_handler/remove_id/wallet expected_target_type = /obj/item/wallet + examine_desc = "remove an ID card" /decl/interaction_handler/remove_id/wallet/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && ishuman(user) diff --git a/code/game/objects/structures/crates_lockers/closets/__closet.dm b/code/game/objects/structures/crates_lockers/closets/__closet.dm index 9e717d53f973..6bfeca7cfe85 100644 --- a/code/game/objects/structures/crates_lockers/closets/__closet.dm +++ b/code/game/objects/structures/crates_lockers/closets/__closet.dm @@ -548,6 +548,7 @@ var/global/list/closets = list() /decl/interaction_handler/closet_lock_toggle name = "Toggle Lock" expected_target_type = /obj/structure/closet + examine_desc = "toggle the lock" /decl/interaction_handler/closet_lock_toggle/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/game/objects/structures/doors/_door.dm b/code/game/objects/structures/doors/_door.dm index 0b10f0f8d372..ff6989638376 100644 --- a/code/game/objects/structures/doors/_door.dm +++ b/code/game/objects/structures/doors/_door.dm @@ -211,6 +211,7 @@ name = "Knock On Door" expected_target_type = /obj/structure/door interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF + examine_desc = "knock on $TARGET_THEM$" /decl/interaction_handler/knock_on_door/invoked(atom/target, mob/user, obj/item/prop) if(!istype(target) || !target.density) diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 03d91b43ce49..768fe81af7f1 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -80,6 +80,7 @@ /decl/interaction_handler/extinguisher_cabinet_open name = "Open/Close" expected_target_type = /obj/structure/extinguisher_cabinet + examine_desc = "open or close $TARGET_THEM$" /decl/interaction_handler/extinguisher_cabinet_open/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/extinguisher_cabinet/C = target diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index e0fe3055aa7f..bfa1da1f35d1 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -510,6 +510,7 @@ /decl/interaction_handler/adjust_draught name = "Adjust Draught" expected_target_type = /obj/structure/fire_source + examine_desc = "adjust the draught" /decl/interaction_handler/adjust_draught/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/fire_source/fire = target diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index da3ad304823f..cc0348805d9a 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -815,6 +815,7 @@ name = "Show Turf Contents" expected_user_type = /mob interaction_flags = 0 + examine_desc = "list everything on $TARGET_THEM$" /decl/interaction_handler/show_turf_contents/invoked(atom/target, mob/user, obj/item/prop) target.show_atom_list_for_turf(user, get_turf(target)) @@ -827,6 +828,7 @@ /decl/interaction_handler/dig/trench name = "Dig Trench" + examine_desc = "dig a trench" /decl/interaction_handler/dig/trench/invoked(atom/target, mob/user, obj/item/prop) prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. @@ -841,6 +843,7 @@ /decl/interaction_handler/dig/pit name = "Dig Pit" + examine_desc = "dig a pit" /decl/interaction_handler/dig/pit/invoked(atom/target, mob/user, obj/item/prop) prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. @@ -850,6 +853,7 @@ /decl/interaction_handler/dig/farm name = "Dig Farm Plot" + examine_desc = "dig a farm plot" /decl/interaction_handler/dig/farm/invoked(atom/target, mob/user, obj/item/prop) prop ||= user.get_usable_hand_slot_organ() // Allows drakes to dig. diff --git a/code/game/turfs/walls/wall_natural_ramps.dm b/code/game/turfs/walls/wall_natural_ramps.dm index 7566bf7578f5..760c4a01f0d5 100644 --- a/code/game/turfs/walls/wall_natural_ramps.dm +++ b/code/game/turfs/walls/wall_natural_ramps.dm @@ -54,6 +54,7 @@ /decl/interaction_handler/drill_ramp name = "Drill Ramp" expected_target_type = /turf/wall/natural + examine_desc = "drill a ramp in the direction you are facing" /decl/interaction_handler/drill_ramp/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/atmospherics/components/binary_devices/pump.dm b/code/modules/atmospherics/components/binary_devices/pump.dm index a0b05c844cd7..156e19f2f39a 100644 --- a/code/modules/atmospherics/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/components/binary_devices/pump.dm @@ -213,6 +213,7 @@ Thus, the two variables affect pump operation are set in New(): /decl/interaction_handler/binary_pump_toggle name = "Switch On/Off" expected_target_type = /obj/machinery/atmospherics/binary/pump + examine_desc = "turn $TARGET_THEM$ on or off" /decl/interaction_handler/binary_pump_toggle/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/atmospherics/binary/pump/P = target diff --git a/code/modules/clothing/_clothing.dm b/code/modules/clothing/_clothing.dm index 744bcdb78135..b51dfb2f51e3 100644 --- a/code/modules/clothing/_clothing.dm +++ b/code/modules/clothing/_clothing.dm @@ -450,8 +450,9 @@ /decl/interaction_handler/clothing_set_sensors name = "Set Sensors Level" expected_target_type = /obj/item/clothing + examine_desc = "adjust vitals sensors" /decl/interaction_handler/clothing_set_sensors/invoked(atom/target, mob/user, obj/item/prop) - var/obj/item/clothing/U = target - U.set_sensors(user) + var/obj/item/clothing/clothes = target + clothes.set_sensors(user) diff --git a/code/modules/clothing/clothing_state/clothing_state_buttons.dm b/code/modules/clothing/clothing_state/clothing_state_buttons.dm index 74c9fe7e4442..05b531f26390 100644 --- a/code/modules/clothing/clothing_state/clothing_state_buttons.dm +++ b/code/modules/clothing/clothing_state/clothing_state_buttons.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/buttons name = "Toggle Open Or Closed" state_decl_type = /decl/clothing_state_modifier/buttons + examine_desc = "fasten or undo $TARGET_THEIR$ buttons" /obj/item/clothing/proc/toggle_buttons_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_hood.dm b/code/modules/clothing/clothing_state/clothing_state_hood.dm index 281174461bd0..81ddc6301dca 100644 --- a/code/modules/clothing/clothing_state/clothing_state_hood.dm +++ b/code/modules/clothing/clothing_state/clothing_state_hood.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/hood name = "Adjust Hood" state_decl_type = /decl/clothing_state_modifier/hood + examine_desc = "push the hood up or down" /obj/item/clothing/proc/toggle_hood_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_rolled.dm b/code/modules/clothing/clothing_state/clothing_state_rolled.dm index 84d9f8ade842..f368481918f8 100644 --- a/code/modules/clothing/clothing_state/clothing_state_rolled.dm +++ b/code/modules/clothing/clothing_state/clothing_state_rolled.dm @@ -8,6 +8,7 @@ /decl/interaction_handler/clothing_toggle/rolled_down name = "Roll Up Or Down" state_decl_type = /decl/clothing_state_modifier/rolled_down + examine_desc = "roll $TARGET_THEM$ up or down" /obj/item/clothing/proc/toggle_rolled_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_sleeves.dm b/code/modules/clothing/clothing_state/clothing_state_sleeves.dm index 7356c78e4041..33a099b4194a 100644 --- a/code/modules/clothing/clothing_state/clothing_state_sleeves.dm +++ b/code/modules/clothing/clothing_state/clothing_state_sleeves.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/rolled_sleeves name = "Roll Sleeves Up Or Down" state_decl_type = /decl/clothing_state_modifier/rolled_sleeves + examine_desc = "roll $TARGET_THEIR$ sleeves up or down" /obj/item/clothing/proc/toggle_sleeves_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_tucked.dm b/code/modules/clothing/clothing_state/clothing_state_tucked.dm index 41714c01f868..dbfaaecf3be0 100644 --- a/code/modules/clothing/clothing_state/clothing_state_tucked.dm +++ b/code/modules/clothing/clothing_state/clothing_state_tucked.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/tucked_in name = "Tuck In Or Untuck" state_decl_type = /decl/clothing_state_modifier/tucked_in + examine_desc = "tuck $TARGET_THEM$ in or out" /obj/item/clothing/proc/toggle_tucked_verb() diff --git a/code/modules/clothing/clothing_state/clothing_state_untied.dm b/code/modules/clothing/clothing_state/clothing_state_untied.dm index 98313e2441d8..759b60015048 100644 --- a/code/modules/clothing/clothing_state/clothing_state_untied.dm +++ b/code/modules/clothing/clothing_state/clothing_state_untied.dm @@ -7,6 +7,7 @@ /decl/interaction_handler/clothing_toggle/untied name = "Tie Or Untie" state_decl_type = /decl/clothing_state_modifier/untied + examine_desc = "tie or untie $TARGET_THEM$" /obj/item/clothing/proc/toggle_untied_verb() diff --git a/code/modules/clothing/neck/necklace/__necklace.dm b/code/modules/clothing/neck/necklace/__necklace.dm index a6e680313b6f..d94e49bf2675 100644 --- a/code/modules/clothing/neck/necklace/__necklace.dm +++ b/code/modules/clothing/neck/necklace/__necklace.dm @@ -67,6 +67,7 @@ /decl/interaction_handler/remove_pendant name = "Remove Pendant" expected_target_type = /obj/item/clothing/neck/necklace + examine_desc = "remove $TARGET_THEIR$ pendant" /decl/interaction_handler/remove_pendant/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/clothing/neck/necklace/necklace = target diff --git a/code/modules/codex/codex_atom.dm b/code/modules/codex/codex_atom.dm index ebe02e59ab78..5e262f8d6f20 100644 --- a/code/modules/codex/codex_atom.dm +++ b/code/modules/codex/codex_atom.dm @@ -36,5 +36,6 @@ /atom/examine(mob/user, distance, infix = "", suffix = "") . = ..() + if(user?.get_preference_value(/datum/client_preference/inquisitive_examine) == PREF_ON && user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) to_chat(user, SPAN_NOTICE("The codex has relevant information available.")) diff --git a/code/modules/crafting/pottery/pottery_structures.dm b/code/modules/crafting/pottery/pottery_structures.dm index c952e9b81711..73adc6e921fd 100644 --- a/code/modules/crafting/pottery/pottery_structures.dm +++ b/code/modules/crafting/pottery/pottery_structures.dm @@ -56,6 +56,7 @@ name = "Open Firebox" expected_target_type = /obj/structure/fire_source/kiln incapacitation_flags = INCAPACITATION_DISRUPTED + examine_desc = "open or close the firebox" /decl/interaction_handler/open_firebox/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && ishuman(user) diff --git a/code/modules/detectivework/microscope/_forensic_machine.dm b/code/modules/detectivework/microscope/_forensic_machine.dm index 7a4dbb20ba6b..c3db366ce4bb 100644 --- a/code/modules/detectivework/microscope/_forensic_machine.dm +++ b/code/modules/detectivework/microscope/_forensic_machine.dm @@ -122,6 +122,7 @@ /decl/interaction_handler/forensics_remove_sample name = "Remove Sample" expected_target_type = /obj/machinery/forensic + examine_desc = "remove a sample" /decl/interaction_handler/forensics_remove_sample/invoked(atom/target, mob/user, obj/item/prop) var/obj/machinery/forensic/F = target diff --git a/code/modules/hydroponics/spreading/spreading.dm b/code/modules/hydroponics/spreading/spreading.dm index 9903d7217d3b..bd7c4a3fb0f3 100644 --- a/code/modules/hydroponics/spreading/spreading.dm +++ b/code/modules/hydroponics/spreading/spreading.dm @@ -275,6 +275,7 @@ /decl/interaction_handler/vine_chop name = "Chop Down" expected_target_type = /obj/effect/vine + examine_desc = "chop $TARGET_THEM$ down" /decl/interaction_handler/vine_chop/invoked(atom/target, mob/user, obj/item/prop) var/obj/effect/vine/vine = target diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 0456bff2302b..50769ae8a8d5 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -669,6 +669,7 @@ /decl/interaction_handler/hydroponics/close_lid name = "Open/Close Lid" + examine_desc = "open or close the lid" /decl/interaction_handler/hydroponics/close_lid/is_possible(atom/target, mob/user, obj/item/prop) var/obj/machinery/portable_atmospherics/hydroponics/tray = target @@ -680,6 +681,7 @@ /decl/interaction_handler/hydroponics/sample name = "Sample Plant" + examine_desc = "take a sample" /decl/interaction_handler/hydroponics/sample/is_possible(atom/target, mob/user, obj/item/prop) return ..() && istype(prop) && prop.edge && prop.w_class < ITEM_SIZE_NORMAL diff --git a/code/modules/interactions/_interactions.dm b/code/modules/interactions/_interactions.dm index 58e9d8713d40..3d515a3000d0 100644 --- a/code/modules/interactions/_interactions.dm +++ b/code/modules/interactions/_interactions.dm @@ -1,6 +1,10 @@ /decl/interaction_handler abstract_type = /decl/interaction_handler var/name + /// A string displayed when examining an atom that provides this handler as an alt interaction. + var/examine_desc + /// If set to TRUE, alt interactions will skip is_possible() before displaying in examine(). + var/always_show_on_examine = FALSE var/icon var/icon_state var/expected_target_type = /atom diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm index 6fce4a4c578b..81077a4fa71a 100644 --- a/code/modules/interactions/interactions_reagents.dm +++ b/code/modules/interactions/interactions_reagents.dm @@ -1,6 +1,7 @@ /decl/interaction_handler/dip_item - name = "Dip Held Item In" + name = "Dip Into" interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "dip an item into $TARGET_THEM$" /decl/interaction_handler/dip_item/is_possible(atom/target, mob/user, obj/item/prop) return ..() && target.reagents?.total_volume >= FLUID_MINIMUM_TRANSFER && istype(prop) && target.can_be_poured_from(user, prop) @@ -17,16 +18,15 @@ return TRUE /decl/interaction_handler/fill_from - name = "Fill Held Item From" + name = "Fill From" interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "fill a held item from $TARGET_THEM$" /decl/interaction_handler/fill_from/is_possible(atom/target, mob/user, obj/item/prop) if(!(. = ..())) return if(target.reagents?.total_volume < FLUID_PUDDLE) return FALSE - if(!istype(prop) || prop.reagents?.maximum_volume <= 0) - return FALSE if(!isitem(target) && !istype(target, /obj/structure/reagent_dispensers)) return FALSE return target.can_be_poured_from(user, prop) && prop.can_be_poured_into(user, target) @@ -36,12 +36,14 @@ var/obj/item/vessel = target return vessel.standard_pour_into(user, prop) if(istype(target, /obj/structure/reagent_dispensers)) - return prop.standard_dispenser_refill(user, target) + // Reagent dispensers have some wonky assumptions due to old UX around filling/emptying so we skip the atom flags check. + return prop.standard_dispenser_refill(user, target, skip_container_check = TRUE) return FALSE /decl/interaction_handler/empty_into - name = "Empty Held Item Into" + name = "Pour Into" interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "pour a held item into $TARGET_THEM$" /decl/interaction_handler/empty_into/is_possible(atom/target, mob/user, obj/item/prop) if(!(. = ..())) @@ -58,6 +60,7 @@ name = "Wash Hands" expected_target_type = /atom interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "wash your hands in $TARGET_THEM$" /decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) . = ..() && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) @@ -106,6 +109,7 @@ name = "Drink" expected_target_type = /atom interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "drink from $TARGET_THEM$" /decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) return ..() && ATOM_IS_OPEN_CONTAINER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) diff --git a/code/modules/interactions/interactions_shared.dm b/code/modules/interactions/interactions_shared.dm index db486feb2771..b8f50f151132 100644 --- a/code/modules/interactions/interactions_shared.dm +++ b/code/modules/interactions/interactions_shared.dm @@ -3,25 +3,30 @@ name = "Eject Disk" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" + examine_desc = "remove a disk" /decl/interaction_handler/set_transfer name = "Set Transfer Amount" abstract_type = /decl/interaction_handler/set_transfer + examine_desc = "set the transfer amount" /decl/interaction_handler/remove_id name = "Remove ID" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject_id" abstract_type = /decl/interaction_handler/remove_id + examine_desc = "remove an ID card" /decl/interaction_handler/remove_pen name = "Remove Pen" icon = 'icons/screen/radial.dmi' icon_state = "radial_eject_pen" abstract_type = /decl/interaction_handler/remove_pen + examine_desc = "remove a pen" /decl/interaction_handler/rename name = "Rename" icon = 'icons/screen/radial.dmi' icon_state = "radial_rename" abstract_type = /decl/interaction_handler/rename + examine_desc = "rename $TARGET_THEM$" diff --git a/code/modules/mechs/equipment/engineering.dm b/code/modules/mechs/equipment/engineering.dm index 72bf68d67325..f2f7448b2d64 100644 --- a/code/modules/mechs/equipment/engineering.dm +++ b/code/modules/mechs/equipment/engineering.dm @@ -63,6 +63,7 @@ /decl/interaction_handler/mech_equipment/adjust_atmos_shields name = "Adjust Atmos Shields" expected_target_type = /obj/item/mech_equipment/atmos_shields + examine_desc = "adjust the atmos shields" /decl/interaction_handler/mech_equipment/adjust_atmos_shields/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/mech_equipment/atmos_shields/shields = target diff --git a/code/modules/mechs/equipment/utility.dm b/code/modules/mechs/equipment/utility.dm index f76503b97bbf..b5fb55b0461e 100644 --- a/code/modules/mechs/equipment/utility.dm +++ b/code/modules/mechs/equipment/utility.dm @@ -196,6 +196,7 @@ /decl/interaction_handler/mech_equipment/clamp name = "Release Clamp" expected_target_type = /obj/item/mech_equipment/clamp + examine_desc = "release $TARGET_THEM$" /decl/interaction_handler/mech_equipment/clamp/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/mech_equipment/clamp/clamp = target @@ -693,6 +694,7 @@ /decl/interaction_handler/mech_equipment/ionjets name = "Toggle Stabilizers" expected_target_type = /obj/item/mech_equipment/ionjets + examine_desc = "toggle the stabilizers" /decl/interaction_handler/mech_equipment/ionjets/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index f61ac8e68862..e77d82776a0d 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -148,6 +148,7 @@ /decl/interaction_handler/empty/ore_box name = "Empty Box" expected_target_type = /obj/structure/ore_box + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/ore_box/is_possible(obj/structure/ore_box/target, mob/user, obj/item/prop) return ..() && target.total_ores > 0 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 78ba364f39a6..edcc37c4cf6d 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1205,6 +1205,7 @@ default behaviour is: expected_user_type = /mob/observer expected_target_type = /mob/living interaction_flags = 0 + examine_desc = null // DO NOT show this in general. /decl/interaction_handler/admin_kill/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/modular_computers/computers/modular_computer/interaction.dm b/code/modules/modular_computers/computers/modular_computer/interaction.dm index 52d8a008c73b..1bfc73fb6a28 100644 --- a/code/modules/modular_computers/computers/modular_computer/interaction.dm +++ b/code/modules/modular_computers/computers/modular_computer/interaction.dm @@ -184,6 +184,7 @@ icon = 'icons/screen/radial.dmi' icon_state = "radial_power_off" expected_target_type = /obj/item/modular_computer + examine_desc = "perform an emergency shutdown" /decl/interaction_handler/emergency_shutdown/is_possible(atom/target, mob/user, obj/item/prop) . = ..() @@ -204,6 +205,7 @@ icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" expected_target_type = /obj/item/modular_computer + examine_desc = "remove a chargestick" /decl/interaction_handler/remove_chargestick/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm index ad7c698d6d8a..894b912aff91 100644 --- a/code/modules/modular_computers/computers/subtypes/dev_laptop.dm +++ b/code/modules/modular_computers/computers/subtypes/dev_laptop.dm @@ -15,7 +15,7 @@ /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, ) var/icon_state_closed = "laptop-closed" - + /obj/item/modular_computer/laptop/on_update_icon() if(anchored) ..() @@ -35,6 +35,7 @@ name = "Open Laptop" expected_target_type = /obj/item/modular_computer/laptop interaction_flags = INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEEDS_TURF + examine_desc = "open or close $TARGET_THEM$" /decl/interaction_handler/laptop_open/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/modular_computer/laptop/L = target diff --git a/code/modules/multiz/mobile_ladder.dm b/code/modules/multiz/mobile_ladder.dm index 2eacd7a03ac3..dec71c399ff6 100644 --- a/code/modules/multiz/mobile_ladder.dm +++ b/code/modules/multiz/mobile_ladder.dm @@ -130,6 +130,7 @@ /decl/interaction_handler/ladder_fold name = "Fold Ladder" expected_target_type = /obj/structure/ladder/mobile + examine_desc = "fold $TARGET_THEM$ up" /decl/interaction_handler/ladder_fold/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/ladder/mobile/L diff --git a/code/modules/paperwork/carbonpaper.dm b/code/modules/paperwork/carbonpaper.dm index 72eb84cc4911..5991f75c6c49 100644 --- a/code/modules/paperwork/carbonpaper.dm +++ b/code/modules/paperwork/carbonpaper.dm @@ -54,8 +54,9 @@ // Carbon Paper Alt Interactions ///////////////////////////////////////////////// /decl/interaction_handler/carbon_paper_remove - name = "remove carbon-copy" + name = "Remove Carbon-Copy" expected_target_type = /obj/item/paper/carbon + examine_desc = "remove the carbon-copy" /decl/interaction_handler/carbon_paper_remove/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/paper/carbon/paper = target diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index d25c1d6cbe50..cd40acd76d99 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -198,6 +198,7 @@ /decl/interaction_handler/clipboard_remove_pen name = "Remove Pen" expected_target_type = /obj/item/clipboard + examine_desc = "remove the pen" /decl/interaction_handler/clipboard_remove_pen/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 92a37e75a1be..02428e20f704 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -636,6 +636,8 @@ var/global/datum/topic_state/default/paper_state/paper_topic_state = new /decl/interaction_handler/scroll/furl name = "Furl Scroll" + examine_desc = "furl $TARGET_THEM$" /decl/interaction_handler/scroll/unfurl name = "Unfurl Scroll" + examine_desc = "unfurl $TARGET_THEM$" diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index b01ab3044261..16a2f1f7ab97 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -517,6 +517,7 @@ /decl/interaction_handler/rename/paper_bundle name = "Rename Bundle" expected_target_type = /obj/item/paper_bundle + examine_desc = "rename $TARGET_THEM$" /decl/interaction_handler/rename/paper_bundle/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/paper_bundle/bundle = target diff --git a/code/modules/paperwork/paper_plane.dm b/code/modules/paperwork/paper_plane.dm index f24cda675460..2e183472066b 100644 --- a/code/modules/paperwork/paper_plane.dm +++ b/code/modules/paperwork/paper_plane.dm @@ -77,6 +77,7 @@ /decl/interaction_handler/make_paper_plane name = "Fold Into Paper Plane" expected_target_type = /obj/item/paper + examine_desc = "make a paper plane" /decl/interaction_handler/make_paper_plane/is_possible(obj/item/paper/target, mob/user, obj/item/prop) return ..() && !target.is_crumpled diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 70b9b4c453d3..3622d047f5c7 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -155,6 +155,7 @@ /decl/interaction_handler/paper_bin_dump_contents name = "Dump Contents" expected_target_type = /obj/item/paper_bin + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/paper_bin_dump_contents/is_possible(var/obj/item/paper_bin/target, mob/user, obj/item/prop) return ..() && target.amount > 0 diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 7905a7186749..89f88cf959a8 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -193,6 +193,7 @@ /decl/interaction_handler/empty/paper_shredder name = "Empty Bin" expected_target_type = /obj/machinery/papershredder + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/paper_shredder/is_possible(obj/machinery/papershredder/target, mob/user, obj/item/prop) return ..() && !target.is_bin_empty() diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 712c2d6c2b65..5d816b92448e 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -268,6 +268,7 @@ /decl/interaction_handler/empty/photocopier_paper_bin name = "Empty Paper Bin" expected_target_type = /obj/machinery/photocopier + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/photocopier_paper_bin/is_possible(obj/machinery/photocopier/target, mob/user, obj/item/prop) return (target.printer?.get_amount_paper() > 0) && ..() @@ -288,6 +289,7 @@ /decl/interaction_handler/remove/photocopier_scanner_item name = "Remove Item From Scanner" expected_target_type = /obj/machinery/photocopier + examine_desc = "remove a loaded item" /decl/interaction_handler/remove/photocopier_scanner_item/is_possible(obj/machinery/photocopier/target, mob/user, obj/item/prop) return target.scanner_item && ..() diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 6e18e36decb0..eb9bbb76a03b 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -398,6 +398,7 @@ icon = 'icons/screen/radial.dmi' icon_state = "radial_eject" expected_target_type = /obj/item/camera + examine_desc = "eject the film" /decl/interaction_handler/camera_eject_film/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/camera/camera = target diff --git a/code/modules/paperwork/printer.dm b/code/modules/paperwork/printer.dm index 7cfeaa96c43d..0f91439ab58b 100644 --- a/code/modules/paperwork/printer.dm +++ b/code/modules/paperwork/printer.dm @@ -423,6 +423,7 @@ /decl/interaction_handler/empty/stock_parts_printer name = "Empty Paper Bin" expected_target_type = /obj/item/stock_parts/printer + examine_desc = "empty $TARGET_THEM$" /decl/interaction_handler/empty/stock_parts_printer/is_possible(obj/item/stock_parts/printer/target, mob/user, obj/item/prop) return (target.get_amount_paper() > 0) && ..() diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 4de22aa06166..310ccaf84dd2 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -756,6 +756,7 @@ /decl/interaction_handler/gun/toggle_safety name = "Toggle Safety" + examine_desc = "toggle the safety" /decl/interaction_handler/gun/toggle_safety/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/gun = target @@ -763,6 +764,7 @@ /decl/interaction_handler/gun/toggle_firemode name = "Change Firemode" + examine_desc = "change the firemode" /decl/interaction_handler/gun/toggle_firemode/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/gun = target diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 8534b7ddc7af..d4da8ee50454 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -360,6 +360,7 @@ /decl/interaction_handler/projectile/remove_silencer name = "Remove Silencer" + examine_desc = "remove the silencer" /decl/interaction_handler/projectile/remove_silencer/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/projectile/gun = target @@ -367,6 +368,7 @@ /decl/interaction_handler/projectile/unload_ammo name = "Remove Ammunition" + examine_desc = "unload the ammunition" /decl/interaction_handler/projectile/unload_ammo/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/projectile/gun = target diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm index 0f54520856df..464ce437f7c3 100644 --- a/code/modules/projectiles/guns/projectile/revolver.dm +++ b/code/modules/projectiles/guns/projectile/revolver.dm @@ -74,6 +74,7 @@ /decl/interaction_handler/revolver_spin_cylinder name = "Spin Cylinder" expected_target_type = /obj/item/gun/projectile/revolver + examine_desc = "spin the cylinder" /decl/interaction_handler/revolver_spin_cylinder/invoked(atom/target, mob/user, obj/item/prop) var/obj/item/gun/projectile/revolver/R = target diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 99ec47811aa7..a7ac790f3126 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -204,6 +204,7 @@ /decl/interaction_handler/set_transfer/chems expected_target_type = /obj/item/chems + examine_desc = "set the transfer volume" /decl/interaction_handler/set_transfer/chems/is_possible(var/atom/target, var/mob/user) . = ..() @@ -220,6 +221,7 @@ name = "Empty On Floor" expected_target_type = /obj/item/chems interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION | INTERACTION_NEVER_AUTOMATIC + examine_desc = "empty $TARGET_THEM$ onto the floor" /decl/interaction_handler/empty/chems/invoked(atom/target, mob/user, obj/item/prop) var/turf/T = get_turf(user) diff --git a/code/modules/reagents/reagent_containers/drinks.dm b/code/modules/reagents/reagent_containers/drinks.dm index 46c56514eee4..695412409f84 100644 --- a/code/modules/reagents/reagent_containers/drinks.dm +++ b/code/modules/reagents/reagent_containers/drinks.dm @@ -57,7 +57,7 @@ return return ..() -/obj/item/chems/drinks/standard_dispenser_refill(var/mob/user, var/obj/structure/reagent_dispensers/target, skip_container_check = FALSE) +/obj/item/chems/drinks/standard_dispenser_refill(mob/user, obj/structure/reagent_dispensers/target, skip_container_check = FALSE) return do_open_check(user) && ..() /obj/item/chems/drinks/standard_pour_into(var/mob/user, var/atom/target) diff --git a/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm b/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm index a048bb7eac31..6c6cf548fe68 100644 --- a/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm +++ b/code/modules/reagents/reagent_containers/food/sliceable/pizza/pizza_box.dm @@ -304,6 +304,7 @@ /decl/interaction_handler/open_pizza_box expected_target_type = /obj/item/pizzabox + examine_desc = "open or close $TARGET_THEM$" /decl/interaction_handler/open_pizza_box/is_possible(atom/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 9cd81a4c4375..560fbaa666d5 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -119,6 +119,7 @@ name = "Next Nozzle Setting" expected_target_type = /obj/item/chems/spray interaction_flags = INTERACTION_NEEDS_INVENTORY | INTERACTION_NEEDS_PHYSICAL_INTERACTION + examine_desc = "select the next nozzle spray amount" /decl/interaction_handler/next_spray_amount/is_possible(obj/item/chems/spray/target, mob/user, obj/item/prop) . = ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 187d9e5d59ba..5720be683dfb 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -352,6 +352,7 @@ /decl/interaction_handler/toggle_open/reagent_dispenser name = "Toggle refilling cap" expected_target_type = /obj/structure/reagent_dispensers + examine_desc = "open or close the refilling cap" /decl/interaction_handler/toggle_open/reagent_dispenser/invoked(atom/target, mob/user, obj/item/prop) if(target.atom_flags & ATOM_FLAG_OPEN_CONTAINER) diff --git a/code/modules/sealant_gun/sealant_injector.dm b/code/modules/sealant_gun/sealant_injector.dm index a3e89a44343e..99f8553586d8 100644 --- a/code/modules/sealant_gun/sealant_injector.dm +++ b/code/modules/sealant_gun/sealant_injector.dm @@ -103,6 +103,7 @@ /decl/interaction_handler/sealant_try_inject name = "Inject Sealant" expected_target_type = /obj/structure/sealant_injector + examine_desc = "inject sealant from a held item" /decl/interaction_handler/sealant_try_inject/invoked(atom/target, mob/user, obj/item/prop) var/obj/structure/sealant_injector/SI = target From 9a3e1bafd28e1b76a9d5a4dd312fe1f0259f7b7a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 20 Dec 2024 21:23:15 +1100 Subject: [PATCH 17/95] Adding some basic reagent interactions to the standard interaction list for wells and barrels. --- code/_onclick/item_attack.dm | 5 +++ code/game/atoms.dm | 32 ----------------- code/game/atoms_interactions.dm | 35 +++++++++++++++++++ .../game/objects/structures/barrels/barrel.dm | 5 +++ code/game/objects/structures/well.dm | 5 +++ .../interactions/interactions_reagents.dm | 6 ++-- .../reagents/reagent_containers/_glass.dm | 31 ++++++++++++---- nebula.dme | 1 + 8 files changed, 79 insertions(+), 41 deletions(-) create mode 100644 code/game/atoms_interactions.dm diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 1dbed7ab122e..075995076d43 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -32,6 +32,10 @@ avoid code duplication. This includes items that may sometimes act as a standard // If TRUE, prevent afterattack from running. /atom/proc/attackby(obj/item/used_item, mob/user, var/click_params) + + if(try_handle_interactions(user, get_standard_interactions(user), user?.get_active_held_item(), check_alt_interactions = FALSE)) + return TRUE + if(storage) if(isrobot(user) && (used_item == user.get_active_held_item())) return FALSE //Robots can't store their modules. @@ -39,6 +43,7 @@ avoid code duplication. This includes items that may sometimes act as a standard return FALSE used_item.add_fingerprint(user) return storage.handle_item_insertion(user, used_item, click_params = click_params) + return FALSE /atom/movable/attackby(obj/item/W, mob/user) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c26b4e3aa952..6454bd783a2c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -905,38 +905,6 @@ return check_loc check_loc = check_loc.loc -/** - Get a list of standard interactions for a user from this atom. - - - `user`: The mob that these alt interactions are for - - Return: A list containing the alt interactions -*/ -/atom/proc/get_standard_interactions(var/mob/user) - SHOULD_CALL_PARENT(TRUE) - RETURN_TYPE(/list) - return null - -/** - Get a list of alt interactions for a user from this atom. - - - `user`: The mob that these alt interactions are for - - Return: A list containing the alt interactions -*/ -/atom/proc/get_alt_interactions(var/mob/user) - SHOULD_CALL_PARENT(TRUE) - RETURN_TYPE(/list) - if(storage) - LAZYADD(., /decl/interaction_handler/storage_open) - if(reagents?.maximum_volume) - var/static/list/_reagent_interactions = list( - /decl/interaction_handler/wash_hands, - /decl/interaction_handler/drink, - /decl/interaction_handler/dip_item, - /decl/interaction_handler/fill_from, - /decl/interaction_handler/empty_into - ) - LAZYADD(., _reagent_interactions) - /atom/proc/can_climb_from_below(var/mob/climber) return FALSE diff --git a/code/game/atoms_interactions.dm b/code/game/atoms_interactions.dm new file mode 100644 index 000000000000..17d053db26f5 --- /dev/null +++ b/code/game/atoms_interactions.dm @@ -0,0 +1,35 @@ +// List of interactions used in procs below. +var/global/list/_reagent_interactions = list( + /decl/interaction_handler/wash_hands, + /decl/interaction_handler/drink, + /decl/interaction_handler/dip_item, + /decl/interaction_handler/fill_from, + /decl/interaction_handler/empty_into +) + +/** + Get a list of standard interactions (attack_hand and attackby) for a user from this atom. + At time of writing, these are really easy to have interfere with or be interfered with by + attack_hand() and attackby() overrides. Putting them on items us a bad idea due to pickup code. + + - `user`: The mob that these interactions are for + - Return: A list containing the interactions +*/ +/atom/proc/get_standard_interactions(var/mob/user) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + return null + +/** + Get a list of alt interactions (alt-click) for a user from this atom. + + - `user`: The mob that these alt interactions are for + - Return: A list containing the alt interactions +*/ +/atom/proc/get_alt_interactions(var/mob/user) + SHOULD_CALL_PARENT(TRUE) + RETURN_TYPE(/list) + if(storage) + LAZYADD(., /decl/interaction_handler/storage_open) + if(reagents?.maximum_volume) + LAZYADD(., global._reagent_interactions) diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 958dba359e7a..4655431fe454 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -75,6 +75,11 @@ if(istype(loc, /obj/structure/cask_rack)) loc.update_icon() +/obj/structure/reagent_dispensers/barrel/get_standard_interactions(var/mob/user) + . = ..() + if(reagents?.maximum_volume) + LAZYADD(., global._reagent_interactions) + /obj/structure/reagent_dispensers/barrel/ebony material = /decl/material/solid/organic/wood/ebony color = /decl/material/solid/organic/wood/ebony::color diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index eb6f59bc68f3..9babeb8314a9 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -61,6 +61,11 @@ if(!is_processing && auto_refill) START_PROCESSING(SSobj, src) +/obj/structure/reagent_dispensers/well/get_standard_interactions(var/mob/user) + . = ..() + if(reagents?.maximum_volume) + LAZYADD(., global._reagent_interactions) + /obj/structure/reagent_dispensers/well/Process() if(!reagents || !auto_refill) // if we're full, we only stop at the end of the proc; we need to check for contaminants first return PROCESS_KILL diff --git a/code/modules/interactions/interactions_reagents.dm b/code/modules/interactions/interactions_reagents.dm index 81077a4fa71a..8b584709c4ce 100644 --- a/code/modules/interactions/interactions_reagents.dm +++ b/code/modules/interactions/interactions_reagents.dm @@ -27,7 +27,7 @@ return if(target.reagents?.total_volume < FLUID_PUDDLE) return FALSE - if(!isitem(target) && !istype(target, /obj/structure/reagent_dispensers)) + if(!istype(prop) || (!isitem(target) && !istype(target, /obj/structure/reagent_dispensers))) return FALSE return target.can_be_poured_from(user, prop) && prop.can_be_poured_into(user, target) @@ -63,7 +63,7 @@ examine_desc = "wash your hands in $TARGET_THEM$" /decl/interaction_handler/wash_hands/is_possible(atom/target, mob/user, obj/item/prop) - . = ..() && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) + . = ..() && !istype(prop) && target?.reagents?.has_reagent(/decl/material/liquid/water, 150) if(.) for(var/hand_slot in user.get_held_item_slots()) var/obj/item/organ/external/organ = user.get_organ(hand_slot) @@ -112,7 +112,7 @@ examine_desc = "drink from $TARGET_THEM$" /decl/interaction_handler/drink/is_possible(atom/target, mob/user, obj/item/prop) - return ..() && ATOM_IS_OPEN_CONTAINER(target) && target?.reagents?.total_volume && user.check_has_mouth() && !istype(target, /obj/item) + return ..() && !istype(prop) && target.can_drink_from(user) /decl/interaction_handler/drink/invoked(atom/target, mob/user, obj/item/prop) diff --git a/code/modules/reagents/reagent_containers/_glass.dm b/code/modules/reagents/reagent_containers/_glass.dm index 50c6024ac0b7..aee39d399219 100644 --- a/code/modules/reagents/reagent_containers/_glass.dm +++ b/code/modules/reagents/reagent_containers/_glass.dm @@ -114,12 +114,6 @@ . = ..() // Drinking out of bowls. -/obj/item/chems/glass/get_food_default_transfer_amount(mob/eater) - return eater?.get_eaten_transfer_amount(amount_per_transfer_from_this) - -/obj/item/chems/glass/get_food_consumption_method(mob/eater) - return EATING_METHOD_DRINK - /obj/item/chems/glass/get_edible_material_amount(mob/eater) return reagents?.total_volume @@ -155,3 +149,28 @@ LAZYADD(., /decl/interaction_handler/fill_from) if(user?.get_active_held_item()) LAZYADD(., /decl/interaction_handler/empty_into) + if(can_lid()) + LAZYADD(., /decl/interaction_handler/toggle_lid) + +/decl/interaction_handler/toggle_lid + name = "Toggle Lid" + expected_target_type = /obj/item/chems/glass + +/decl/interaction_handler/toggle_lid/is_possible(atom/target, mob/user, obj/item/prop) + . = ..() + if(. && !istype(prop)) + var/obj/item/chems/glass/glass = target + return glass.can_lid() + +/decl/interaction_handler/toggle_lid/invoked(atom/target, mob/user, obj/item/prop) + var/obj/item/chems/glass/glass = target + if(istype(glass) && glass.can_lid()) + if(ATOM_IS_OPEN_CONTAINER(glass)) + to_chat(user, SPAN_NOTICE("You put the lid on \the [glass].")) + glass.atom_flags ^= ATOM_FLAG_OPEN_CONTAINER + else + to_chat(user, SPAN_NOTICE("You take the lid off \the [glass].")) + glass.atom_flags |= ATOM_FLAG_OPEN_CONTAINER + glass.update_icon() + return TRUE + diff --git a/nebula.dme b/nebula.dme index 8993c444e425..78318233e5f8 100644 --- a/nebula.dme +++ b/nebula.dme @@ -740,6 +740,7 @@ #include "code\game\atoms_fires.dm" #include "code\game\atoms_fluids.dm" #include "code\game\atoms_init.dm" +#include "code\game\atoms_interactions.dm" #include "code\game\atoms_layering.dm" #include "code\game\atoms_movable.dm" #include "code\game\atoms_movable_grabs.dm" From 24aa9d5f5eb4b38e6de94dca44b54ffa1f85a910 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 20 Dec 2024 22:20:45 +1100 Subject: [PATCH 18/95] Moving structure interactions into alt interactions. --- code/game/atoms_movable.dm | 8 + .../structures/_structure_construction.dm | 183 ++++++++++-------- .../structures/_structure_interactions.dm | 74 +++++++ .../{structure_lock.dm => _structure_lock.dm} | 0 .../game/objects/structures/barrels/barrel.dm | 32 +++ code/game/objects/structures/well.dm | 19 +- code/game/objects/structures/window.dm | 10 +- code/modules/reagents/reagent_dispenser.dm | 1 + nebula.dme | 3 +- 9 files changed, 228 insertions(+), 102 deletions(-) create mode 100644 code/game/objects/structures/_structure_interactions.dm rename code/game/objects/structures/{structure_lock.dm => _structure_lock.dm} (100%) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 4b0049e92f2c..ba0fc8cea42a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -591,3 +591,11 @@ if(ATOM_IS_OPEN_CONTAINER(src)) return loc?.take_vaporized_reagent(reagent, amount) return null + +// TODO: make everything use this. +/atom/movable/proc/set_anchored(new_anchored) + SHOULD_CALL_PARENT(TRUE) + if(anchored != new_anchored) + anchored = new_anchored + return TRUE + return FALSE diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index a069498e7d86..20e661f4cdba 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -41,81 +41,27 @@ /obj/structure/proc/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) if((tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user)) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unsecuring [src]" : "securing [src] in place"] with \the [wrench].")) - if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) - return TRUE - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) - anchored = !anchored - visible_message(SPAN_NOTICE("\The [user] has [anchored ? "secured" : "unsecured"] \the [src] with \the [wrench].")) - update_icon() - return TRUE + return tool_toggle_anchors(user, wrench) return FALSE /obj/structure/proc/handle_default_welder_attackby(var/mob/user, var/obj/item/weldingtool/welder) if((tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user)) - if(material && !material.removed_by_welder) - to_chat(user, SPAN_WARNING("\The [src] is too delicate to be dismantled with \the [welder]; try a crowbar.")) - return TRUE - if(!welder.isOn()) - to_chat(user, SPAN_WARNING("Try lighting \the [welder] first.")) - return TRUE - if(welder.get_fuel() < 5) - to_chat(user, SPAN_WARNING("You need more fuel to complete this task.")) - return TRUE - playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) - visible_message(SPAN_NOTICE("\The [user] starts slicing apart \the [src] with \the [welder].")) - if(!do_after(user, 3 SECONDS, src) || QDELETED(src) || !welder.weld(5, user)) - return TRUE - playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) - visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [welder].")) - dismantle_structure(user) - return TRUE + return welder_dismantle(user, welder) return FALSE /obj/structure/proc/handle_default_crowbar_attackby(var/mob/user, var/obj/item/crowbar) if((tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user)) - if(material && material.removed_by_welder) - to_chat(user, SPAN_WARNING("\The [src] is too robust to be dismantled with \the [crowbar]; try a welding tool.")) - return TRUE - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - visible_message(SPAN_NOTICE("\The [user] starts levering apart \the [src] with \the [crowbar].")) - if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) - return TRUE - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [crowbar].")) - dismantle_structure(user) - return TRUE + return tool_dismantle(user, crowbar) return FALSE /obj/structure/proc/handle_default_cable_attackby(var/mob/user, var/obj/item/stack/cable_coil/coil) if((tool_interaction_flags & TOOL_INTERACTION_WIRING) && anchored) - if(wired) - to_chat(user, SPAN_WARNING("\The [src] has already been wired.")) - return TRUE - var/obj/item/stack/cable_coil/cable = coil - if(cable.get_amount() < 1) - to_chat(user, SPAN_WARNING("You need one length of coil to wire \the [src].")) - else - visible_message(SPAN_NOTICE("\The [user] starts to wire \the [src].")) - if(do_after(user, 4 SECONDS, src) && !wired && anchored && !QDELETED(src) && cable.use(1)) - wired = TRUE - visible_message(SPAN_NOTICE("\The [user] finishes wiring \the [src].")) - return TRUE + return install_wiring(user, coil) return FALSE -/obj/structure/proc/handle_default_wirecutter_attackby(var/mob/user, var/obj/item/wirecutters/wirecutters) +/obj/structure/proc/handle_default_wirecutter_attackby(var/mob/user, var/obj/item/wirecutters) if((tool_interaction_flags & TOOL_INTERACTION_WIRING) && anchored) - if(!wired) - to_chat(user, SPAN_WARNING("\The [src] has not been wired.")) - return TRUE - playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins stripping the wiring out of \the [src].")) - if(do_after(user, 4 SECONDS, src) && !QDELETED(src) && wired) - visible_message(SPAN_NOTICE("\The [user] finishes stripping the wiring from \the [src].")) - new/obj/item/stack/cable_coil(src.loc, 1) - wired = FALSE - return TRUE + return strip_wiring(user, wirecutters) return FALSE /obj/structure/proc/handle_default_screwdriver_attackby(var/mob/user, var/obj/item/screwdriver) @@ -151,35 +97,39 @@ current_health = clamp(current_health + used*DOOR_REPAIR_AMOUNT, current_health, current_max_health) /obj/structure/attackby(obj/item/used_item, mob/user) + if(used_item.user_can_attack_with(user, silent = TRUE)) var/force = used_item.get_attack_force(user) if(force && user.check_intent(I_FLAG_HARM)) attack_animation(user) visible_message(SPAN_DANGER("\The [src] has been [pick(used_item.attack_verb)] with \the [used_item] by \the [user]!")) take_damage(force, used_item.atom_damage_type) - . = TRUE - - else if(IS_HAMMER(used_item)) - . = handle_default_hammer_attackby(user, used_item) - else if(IS_WRENCH(used_item)) - . = handle_default_wrench_attackby(user, used_item) - else if(IS_SCREWDRIVER(used_item)) - . = handle_default_screwdriver_attackby(user, used_item) - else if(IS_WELDER(used_item)) - . = handle_default_welder_attackby(user, used_item) - else if(IS_CROWBAR(used_item)) - . = handle_default_crowbar_attackby(user, used_item) - else if(IS_COIL(used_item)) - . = handle_default_cable_attackby(user, used_item) - else if(IS_WIRECUTTER(used_item)) - . = handle_default_wirecutter_attackby(user, used_item) - else if(can_repair_with(used_item) && can_repair(user)) - . = handle_repair(user, used_item) - if(.) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) add_fingerprint(user) - return . - return ..() + return TRUE + + // This handles standard tool interactions (anchoring, dismantling), calls below are for legacy purposes. + . = ..() + if(.) + return + + if(IS_WRENCH(used_item)) + . = handle_default_wrench_attackby(user, used_item) + else if(IS_SCREWDRIVER(used_item)) + . = handle_default_screwdriver_attackby(user, used_item) + else if(IS_WELDER(used_item)) + . = handle_default_welder_attackby(user, used_item) + else if(IS_CROWBAR(used_item)) + . = handle_default_crowbar_attackby(user, used_item) + else if(IS_COIL(used_item)) + . = handle_default_cable_attackby(user, used_item) + else if(IS_WIRECUTTER(used_item)) + . = handle_default_wirecutter_attackby(user, used_item) + else if(can_repair_with(used_item) && can_repair(user)) + . = handle_repair(user, used_item) + if(.) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) + add_fingerprint(user) /obj/structure/attack_generic(var/mob/user, var/damage, var/attack_verb, var/environment_smash) if(environment_smash >= 1) @@ -195,4 +145,73 @@ take_damage(damage) else visible_message(SPAN_NOTICE("\The [user] bonks \the [src] harmlessly.")) - return TRUE \ No newline at end of file + return TRUE + +/obj/structure/proc/strip_wiring(mob/user, obj/item/wirecutters) + if(!wired) + to_chat(user, SPAN_WARNING("\The [src] has not been wired.")) + return TRUE + playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1) + visible_message(SPAN_NOTICE("\The [user] begins stripping the wiring out of \the [src].")) + if(do_after(user, 4 SECONDS, src) && !QDELETED(src) && wired) + visible_message(SPAN_NOTICE("\The [user] finishes stripping the wiring from \the [src].")) + new/obj/item/stack/cable_coil(src.loc, 1) + wired = FALSE + return TRUE + +/obj/structure/proc/install_wiring(mob/user, obj/item/stack/cable_coil/coil) + if(wired) + to_chat(user, SPAN_WARNING("\The [src] has already been wired.")) + return TRUE + var/obj/item/stack/cable_coil/cable = coil + if(cable.get_amount() < 1) + to_chat(user, SPAN_WARNING("You need one length of coil to wire \the [src].")) + else + visible_message(SPAN_NOTICE("\The [user] starts to wire \the [src].")) + if(do_after(user, 4 SECONDS, src) && !wired && anchored && !QDELETED(src) && cable.use(1)) + wired = TRUE + visible_message(SPAN_NOTICE("\The [user] finishes wiring \the [src].")) + return TRUE + +/obj/structure/proc/tool_dismantle(mob/user, obj/item/tool, dismantle_sound = 'sound/items/Crowbar.ogg') + if(material && material.removed_by_welder) + to_chat(user, SPAN_WARNING("\The [src] is too robust to be dismantled with \the [tool]; try a welding tool.")) + return TRUE + playsound(loc, dismantle_sound, 50, 1) + visible_message(SPAN_NOTICE("\The [user] starts levering apart \the [src] with \the [tool].")) + if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(loc, dismantle_sound, 50, 1) + visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [tool].")) + dismantle_structure(user) + return TRUE + +/obj/structure/proc/welder_dismantle(mob/user, obj/item/weldingtool/welder) + if(material && !material.removed_by_welder) + to_chat(user, SPAN_WARNING("\The [src] is too delicate to be dismantled with \the [welder]; try a crowbar.")) + return TRUE + if(!welder.isOn()) + to_chat(user, SPAN_WARNING("Try lighting \the [welder] first.")) + return TRUE + if(welder.get_fuel() < 5) + to_chat(user, SPAN_WARNING("You need more fuel to complete this task.")) + return TRUE + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + visible_message(SPAN_NOTICE("\The [user] starts slicing apart \the [src] with \the [welder].")) + if(!do_after(user, 3 SECONDS, src) || QDELETED(src) || !welder.weld(5, user)) + return TRUE + playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1) + visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [welder].")) + dismantle_structure(user) + return TRUE + +/obj/structure/proc/tool_toggle_anchors(mob/user, obj/item/tool) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unsecuring [src]" : "securing [src] in place"] with \the [tool].")) + if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) + return TRUE + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + anchored = !anchored + visible_message(SPAN_NOTICE("\The [user] has [anchored ? "secured" : "unsecured"] \the [src] with \the [tool].")) + update_icon() + return TRUE diff --git a/code/game/objects/structures/_structure_interactions.dm b/code/game/objects/structures/_structure_interactions.dm new file mode 100644 index 000000000000..ac17e0641db5 --- /dev/null +++ b/code/game/objects/structures/_structure_interactions.dm @@ -0,0 +1,74 @@ +// Anchoring or unanchoring with a hammer or a wrench. +/decl/interaction_handler/structure + abstract_type = /decl/interaction_handler/structure + expected_target_type = /obj/structure + +/decl/interaction_handler/structure/unanchor + name = "Toggle Anchoring" + examine_desc = "anchor or unanchor $TARGET_THEM$" + +/decl/interaction_handler/structure/unanchor/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + var/obj/structure/struct = target + if(!(struct.tool_interaction_flags & TOOL_INTERACTION_ANCHOR) || !struct.can_unanchor(user)) + return FALSE + return istype(prop) && (IS_WRENCH(prop) || IS_HAMMER(prop)) + +/decl/interaction_handler/structure/unanchor/invoked(atom/target, mob/user, obj/item/prop) + . = ..() + var/obj/structure/struct = target + return struct.tool_toggle_anchors(user, prop) + +// Removing wiring with wirecutters or installing it with a cable coil. +/decl/interaction_handler/structure/wiring + name = "Modify Wiring" + examine_desc = "strip or install wiring" + +/decl/interaction_handler/structure/wiring/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + var/obj/structure/struct = target + if(!(struct.tool_interaction_flags & TOOL_INTERACTION_WIRING)) + return FALSE + if(struct.wired) + return IS_WIRECUTTER(prop) + return IS_COIL(prop) + +/decl/interaction_handler/structure/wiring/invoked(atom/target, mob/user, obj/item/prop) + var/obj/structure/struct = target + if(struct.wired) + return struct.strip_wiring(user, prop) + return struct.install_wiring(user, prop) + +// Dismantling a structure. +/decl/interaction_handler/structure/dismantle + name = "Dismantle Structure" + examine_desc = "dismantle $TARGET_THEM$" + +/decl/interaction_handler/structure/dismantle/is_possible(atom/target, mob/user, obj/item/prop) + if(!(. = ..())) + return + var/obj/structure/struct = target + if(!(struct.tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) || !struct.can_dismantle(user)) + return FALSE + return IS_WELDER(prop) || IS_CROWBAR(prop) || IS_HAMMER(prop) + +/decl/interaction_handler/structure/dismantle/invoked(atom/target, mob/user, obj/item/prop) + var/obj/structure/struct = target + if(IS_WELDER(prop)) + return struct.welder_dismantle(user, prop) + return struct.tool_dismantle(user, prop) + +/decl/interaction_handler/put_in_storage + name = "Put In Storage" + +/decl/interaction_handler/put_in_storage/is_possible(atom/target, mob/user, obj/item/prop) + return ..() && istype(prop) && target.storage + +// Boilerplate from /atom/proc/attackby(), replicated here so tool interactions can be bypassed. +/decl/interaction_handler/put_in_storage/invoked(atom/target, mob/user, obj/item/prop) + if((isrobot(user) && (prop == user.get_active_held_item())) || !target.storage.can_be_inserted(prop, user)) + return FALSE + prop.add_fingerprint(user) + return target.storage.handle_item_insertion(user, prop) diff --git a/code/game/objects/structures/structure_lock.dm b/code/game/objects/structures/_structure_lock.dm similarity index 100% rename from code/game/objects/structures/structure_lock.dm rename to code/game/objects/structures/_structure_lock.dm diff --git a/code/game/objects/structures/barrels/barrel.dm b/code/game/objects/structures/barrels/barrel.dm index 4655431fe454..18627586e0ba 100644 --- a/code/game/objects/structures/barrels/barrel.dm +++ b/code/game/objects/structures/barrels/barrel.dm @@ -22,6 +22,16 @@ // Rivets, bands, etc. Currently just cosmetic. var/decl/material/metal_material = /decl/material/solid/metal/iron +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/barrel/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/barrel/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) + +// Override to skip open container check. +/obj/structure/reagent_dispensers/barrel/can_drink_from(mob/user) + return reagents?.total_volume && user.check_has_mouth() + /obj/structure/reagent_dispensers/barrel/Initialize() if(ispath(metal_material)) metal_material = GET_DECL(metal_material) @@ -80,6 +90,28 @@ if(reagents?.maximum_volume) LAZYADD(., global._reagent_interactions) + // Disambiguation actions, since barrels can have several different potential interactions for + // the same item. It would be nice to enable this on /obj/structure in general but there are a + // ton of really bespoke overrides of the standard tool methods (windows, AI core, etc.). + if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) + LAZYADD(., /decl/interaction_handler/structure/unanchor) + if(tool_interaction_flags & TOOL_INTERACTION_WIRING) + LAZYADD(., /decl/interaction_handler/structure/wiring) + if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) + LAZYADD(., /decl/interaction_handler/structure/dismantle) + if(LAZYLEN(.) && storage) + LAZYADD(., /decl/interaction_handler/put_in_storage) + +// Copy of above - maybe we should just have a single 'get interactions' proc at this point? +/obj/structure/reagent_dispensers/barrel/get_alt_interactions(mob/user) + . = ..() + if(tool_interaction_flags & TOOL_INTERACTION_ANCHOR) + LAZYADD(., /decl/interaction_handler/structure/unanchor) + if(tool_interaction_flags & TOOL_INTERACTION_WIRING) + LAZYADD(., /decl/interaction_handler/structure/wiring) + if(tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) + LAZYADD(., /decl/interaction_handler/structure/dismantle) + /obj/structure/reagent_dispensers/barrel/ebony material = /decl/material/solid/organic/wood/ebony color = /decl/material/solid/organic/wood/ebony::color diff --git a/code/game/objects/structures/well.dm b/code/game/objects/structures/well.dm index 9babeb8314a9..911413e67e9b 100644 --- a/code/game/objects/structures/well.dm +++ b/code/game/objects/structures/well.dm @@ -18,19 +18,6 @@ can_toggle_open = FALSE var/auto_refill -/obj/structure/reagent_dispensers/well/get_alt_interactions(mob/user) - . = ..() - if(reagents?.total_volume >= FLUID_PUDDLE) - LAZYADD(., /decl/interaction_handler/dip_item) - LAZYADD(., /decl/interaction_handler/fill_from) - if(user?.get_active_held_item()) - LAZYADD(., /decl/interaction_handler/empty_into) - -// Overrides due to wonky reagent_dispeners opencontainer flag handling. -/obj/structure/reagent_dispensers/well/can_be_poured_from(mob/user, atom/target) - return (reagents?.maximum_volume > 0) -/obj/structure/reagent_dispensers/well/can_be_poured_into(mob/user, atom/target) - return (reagents?.maximum_volume > 0) // Override to skip open container check. /obj/structure/reagent_dispensers/well/can_drink_from(mob/user) return reagents?.total_volume && user.check_has_mouth() @@ -61,6 +48,12 @@ if(!is_processing && auto_refill) START_PROCESSING(SSobj, src) +// Overrides due to wonky reagent_dispeners opencontainer flag handling. +/obj/structure/reagent_dispensers/well/can_be_poured_from(mob/user, atom/target) + return (reagents?.maximum_volume > 0) +/obj/structure/reagent_dispensers/well/can_be_poured_into(mob/user, atom/target) + return (reagents?.maximum_volume > 0) + /obj/structure/reagent_dispensers/well/get_standard_interactions(var/mob/user) . = ..() if(reagents?.maximum_volume) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index bb4bf1781075..d516cd10eb23 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -404,12 +404,10 @@ if (polarized) to_chat(user, SPAN_NOTICE("It appears to be wired.")) -/obj/structure/window/proc/set_anchored(var/new_anchored) - if(anchored == new_anchored) - return - anchored = new_anchored - update_connections(1) - update_nearby_icons() +/obj/structure/window/set_anchored(new_anchored) + if((. = ..())) + update_connections(1) + update_nearby_icons() //This proc is used to update the icons of nearby windows. It should not be confused with update_nearby_tiles(), which is an atmos proc! /obj/structure/window/proc/update_nearby_icons() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 5720be683dfb..963408010d19 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -10,6 +10,7 @@ matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_SECONDARY) max_health = 100 tool_interaction_flags = TOOL_INTERACTION_DECONSTRUCT + var/wrenchable = TRUE var/unwrenched = FALSE var/tmp/volume = 1000 diff --git a/nebula.dme b/nebula.dme index 78318233e5f8..7810c7a9c726 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1415,6 +1415,8 @@ #include "code\game\objects\structures\__structure.dm" #include "code\game\objects\structures\_structure_construction.dm" #include "code\game\objects\structures\_structure_icon.dm" +#include "code\game\objects\structures\_structure_interactions.dm" +#include "code\game\objects\structures\_structure_lock.dm" #include "code\game\objects\structures\_structure_materials.dm" #include "code\game\objects\structures\ai_decoy.dm" #include "code\game\objects\structures\armor_stand.dm" @@ -1480,7 +1482,6 @@ #include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\skele_stand.dm" #include "code\game\objects\structures\stasis_cage.dm" -#include "code\game\objects\structures\structure_lock.dm" #include "code\game\objects\structures\tables.dm" #include "code\game\objects\structures\tank_dispenser.dm" #include "code\game\objects\structures\target_stake.dm" From 2a69ca14ef6e005f4ca689b9d35c677cabdb1922 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 1 Jan 2025 21:59:30 +1100 Subject: [PATCH 19/95] Updating hammer code for reworked interactions. --- .../structures/_structure_construction.dm | 74 ++++++++----------- 1 file changed, 31 insertions(+), 43 deletions(-) diff --git a/code/game/objects/structures/_structure_construction.dm b/code/game/objects/structures/_structure_construction.dm index 20e661f4cdba..86a88084bd35 100644 --- a/code/game/objects/structures/_structure_construction.dm +++ b/code/game/objects/structures/_structure_construction.dm @@ -2,43 +2,6 @@ var/wired var/tool_interaction_flags -/obj/structure/proc/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) - - // Resolve ambiguous interactions. - var/can_deconstruct = (tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user) - var/can_unanchor = (tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user) - if(can_deconstruct && can_unanchor) - var/choice = alert(user, "Do you wish to [anchored ? "unanchor" : "anchor"] or dismantle this structure?", "Tool Choice", (anchored ? "Unanchor" : "Anchor"), "Deconstruct", "Cancel") - if(!choice || choice == "Cancel" || QDELETED(src) || QDELETED(user) || QDELETED(hammer) || !CanPhysicallyInteract(user) || user.get_active_held_item() != hammer) - return TRUE - if(choice == "Deconstruct") - can_unanchor = FALSE - else - can_deconstruct = FALSE - - if(can_unanchor) - playsound(src.loc, 'sound/items/Deconstruct.ogg', 100, 1) - visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unanchoring [src]" : "anchoring [src] in place"] with \the [hammer].")) - if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) - return TRUE - playsound(src.loc, 'sound/items/Deconstruct.ogg', 100, 1) - anchored = !anchored - visible_message(SPAN_NOTICE("\The [user] has [anchored ? "anchored" : "unanchored"] \the [src] with \the [hammer].")) - update_icon() - return TRUE - - if(can_deconstruct) - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - visible_message(SPAN_NOTICE("\The [user] starts knocking apart \the [src] with \the [hammer].")) - if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) - return TRUE - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - visible_message(SPAN_NOTICE("\The [user] completely dismantles \the [src] with \the [hammer].")) - dismantle_structure(user) - return TRUE - - return FALSE - /obj/structure/proc/handle_default_wrench_attackby(var/mob/user, var/obj/item/wrench) if((tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user)) return tool_toggle_anchors(user, wrench) @@ -113,7 +76,9 @@ if(.) return - if(IS_WRENCH(used_item)) + if(IS_HAMMER(used_item)) + . = handle_default_hammer_attackby(user, used_item) + else if(IS_WRENCH(used_item)) . = handle_default_wrench_attackby(user, used_item) else if(IS_SCREWDRIVER(used_item)) . = handle_default_screwdriver_attackby(user, used_item) @@ -173,12 +138,35 @@ visible_message(SPAN_NOTICE("\The [user] finishes wiring \the [src].")) return TRUE -/obj/structure/proc/tool_dismantle(mob/user, obj/item/tool, dismantle_sound = 'sound/items/Crowbar.ogg') + +/obj/structure/proc/handle_default_hammer_attackby(var/mob/user, var/obj/item/hammer) + + // Resolve ambiguous interactions. + var/can_deconstruct = (tool_interaction_flags & TOOL_INTERACTION_DECONSTRUCT) && can_dismantle(user) + var/can_unanchor = (tool_interaction_flags & TOOL_INTERACTION_ANCHOR) && can_unanchor(user) + if(can_deconstruct && can_unanchor) + var/choice = alert(user, "Do you wish to [anchored ? "unanchor" : "anchor"] or dismantle this structure?", "Tool Choice", (anchored ? "Unanchor" : "Anchor"), "Deconstruct", "Cancel") + if(!choice || choice == "Cancel" || QDELETED(src) || QDELETED(user) || QDELETED(hammer) || !CanPhysicallyInteract(user) || user.get_active_held_item() != hammer) + return TRUE + if(choice == "Deconstruct") + can_unanchor = FALSE + else + can_deconstruct = FALSE + + if(can_unanchor) + return tool_toggle_anchors(user, hammer, anchor_sound = 'sound/items/Deconstruct.ogg') + + if(can_deconstruct) + return tool_dismantle(user, hammer, deconstruct_string = "knocking apart") + + return FALSE + +/obj/structure/proc/tool_dismantle(mob/user, obj/item/tool, dismantle_sound = 'sound/items/Crowbar.ogg', deconstruct_string = "levering apart") if(material && material.removed_by_welder) to_chat(user, SPAN_WARNING("\The [src] is too robust to be dismantled with \the [tool]; try a welding tool.")) return TRUE playsound(loc, dismantle_sound, 50, 1) - visible_message(SPAN_NOTICE("\The [user] starts levering apart \the [src] with \the [tool].")) + visible_message(SPAN_NOTICE("\The [user] starts [deconstruct_string] \the [src] with \the [tool].")) if(!do_after(user, 5 SECONDS, src) || QDELETED(src)) return TRUE playsound(loc, dismantle_sound, 50, 1) @@ -205,12 +193,12 @@ dismantle_structure(user) return TRUE -/obj/structure/proc/tool_toggle_anchors(mob/user, obj/item/tool) - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) +/obj/structure/proc/tool_toggle_anchors(mob/user, obj/item/tool, anchor_sound = 'sound/items/Ratchet.ogg') + playsound(src.loc, anchor_sound, 100, 1) visible_message(SPAN_NOTICE("\The [user] begins [anchored ? "unsecuring [src]" : "securing [src] in place"] with \the [tool].")) if(!do_after(user, 4 SECONDS, src) || QDELETED(src)) return TRUE - playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) + playsound(src.loc, anchor_sound, 100, 1) anchored = !anchored visible_message(SPAN_NOTICE("\The [user] has [anchored ? "secured" : "unsecured"] \the [src] with \the [tool].")) update_icon() From c45a83d73d28f1638fd276acb7131c7728179b72 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 5 Jan 2025 12:17:57 +1100 Subject: [PATCH 20/95] Fixing regression in drake digging. --- code/game/turfs/turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index cc0348805d9a..be3eef1e0f36 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -795,7 +795,7 @@ /turf/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/show_turf_contents) - var/obj/item/held = user?.get_active_held_item() + var/obj/item/held = user ? (user.get_active_held_item() || user.get_usable_hand_slot_organ()) : null if(!istype(held)) return if(IS_SHOVEL(held)) From f58faeb9e9757d726aaefd3cce932defc2232222 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 22 Dec 2024 20:30:39 +1100 Subject: [PATCH 21/95] Breaking up mining.dmi. --- .../items/weapons/storage/specialized.dm | 8 ++++---- code/modules/mining/ore_box.dm | 4 ++-- .../artifacts/standalone/gigadrill.dm | 2 +- code/modules/xenoarcheaology/boulder.dm | 6 +++--- code/modules/xenoarcheaology/tools/tools.dm | 4 ++-- icons/obj/items/mining_satchel.dmi | Bin 0 -> 463 bytes icons/obj/items/sheet_snatcher.dmi | Bin 0 -> 507 bytes icons/obj/machines/gigadrill.dmi | Bin 0 -> 2189 bytes icons/obj/mining.dmi | Bin 54133 -> 0 bytes icons/obj/structures/boulder.dmi | Bin 0 -> 5923 bytes icons/obj/structures/ore_box.dmi | Bin 0 -> 501 bytes 11 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 icons/obj/items/mining_satchel.dmi create mode 100644 icons/obj/items/sheet_snatcher.dmi create mode 100644 icons/obj/machines/gigadrill.dmi delete mode 100644 icons/obj/mining.dmi create mode 100644 icons/obj/structures/boulder.dmi create mode 100644 icons/obj/structures/ore_box.dmi diff --git a/code/game/objects/items/weapons/storage/specialized.dm b/code/game/objects/items/weapons/storage/specialized.dm index d85bd453f5c8..014814223111 100644 --- a/code/game/objects/items/weapons/storage/specialized.dm +++ b/code/game/objects/items/weapons/storage/specialized.dm @@ -12,8 +12,8 @@ /obj/item/ore name = "mining satchel" desc = "This sturdy bag can be used to store and transport ores." - icon = 'icons/obj/mining.dmi' - icon_state = "satchel" + icon = 'icons/obj/items/mining_satchel.dmi' + icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY w_class = ITEM_SIZE_LARGE storage = /datum/storage/ore @@ -57,8 +57,8 @@ /obj/item/sheetsnatcher name = "sheet snatcher" - icon = 'icons/obj/mining.dmi' - icon_state = "sheetsnatcher" + icon = 'icons/obj/items/sheet_snatcher.dmi' + icon_state = ICON_STATE_WORLD desc = "A patented storage system designed for any kind of mineral sheet." material = /decl/material/solid/organic/plastic storage = /datum/storage/sheets diff --git a/code/modules/mining/ore_box.dm b/code/modules/mining/ore_box.dm index f61ac8e68862..6a105e002477 100644 --- a/code/modules/mining/ore_box.dm +++ b/code/modules/mining/ore_box.dm @@ -4,8 +4,8 @@ /obj/structure/ore_box name = "ore box" desc = "A heavy box used for storing ore." - icon = 'icons/obj/mining.dmi' - icon_state = "orebox0" + icon = 'icons/obj/structures/ore_box.dmi' + icon_state = ICON_STATE_WORLD density = TRUE material = /decl/material/solid/organic/wood/oak atom_flags = ATOM_FLAG_CLIMBABLE diff --git a/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm b/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm index e41572bbd635..22e68e9011e4 100644 --- a/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm +++ b/code/modules/xenoarcheaology/artifacts/standalone/gigadrill.dm @@ -1,7 +1,7 @@ /obj/machinery/giga_drill name = "alien drill" desc = "A giant, alien drill mounted on long treads." - icon = 'icons/obj/mining.dmi' + icon = 'icons/obj/machines/gigadrill.dmi' icon_state = "gigadrill" var/active = 0 var/drill_time = 10 diff --git a/code/modules/xenoarcheaology/boulder.dm b/code/modules/xenoarcheaology/boulder.dm index ad492eb65ef1..ba7a38c2f3d2 100644 --- a/code/modules/xenoarcheaology/boulder.dm +++ b/code/modules/xenoarcheaology/boulder.dm @@ -1,8 +1,8 @@ /obj/structure/boulder name = "boulder" desc = "A large boulder, somewhat bigger than a small boulder." - icon = 'icons/obj/mining.dmi' - icon_state = "boulder1" + icon = 'icons/obj/structures/boulder.dmi' + icon_state = ICON_STATE_WORLD density = TRUE opacity = TRUE anchored = TRUE @@ -30,7 +30,7 @@ /obj/structure/boulder/Initialize(var/ml, var/_mat, var/coloration) . = ..() - icon_state = "boulder[rand(1,6)]" + icon_state = "[initial(icon_state)][rand(1,6)]" if(coloration) color = coloration excavation_level = rand(5, 50) diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 213d77ff1288..813f424e7f14 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -10,8 +10,8 @@ /obj/item/bag/fossils name = "fossil satchel" desc = "Transports delicate fossils in suspension so they don't break during transit." - icon = 'icons/obj/mining.dmi' - icon_state = "satchel" + icon = 'icons/obj/items/mining_satchel.dmi' + icon_state = ICON_STATE_WORLD slot_flags = SLOT_LOWER_BODY | SLOT_POCKET w_class = ITEM_SIZE_NORMAL storage = /datum/storage/bag/fossils diff --git a/icons/obj/items/mining_satchel.dmi b/icons/obj/items/mining_satchel.dmi new file mode 100644 index 0000000000000000000000000000000000000000..64d0ded925786eca484605aed1adde7c25615a6e GIT binary patch literal 463 zcmV;=0WkiFP)R#sLnFf#6fB#Sx%bT;2$`1vX;}ouc^=1f z9QT$eeM=PCSOOaGSi=AS00DGTPE!Ct=GbNc003!vR9JLGWpiV4X>fFDZ*Bkpc$`yK zaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBS zJijO>MTv_uC9|j)$T#HTOe;#vO@*+P6w&{I<|?y? zJ1;;X(FnVxFze3~PAvJ9u$s>1z(MdL>HINpQ``S@y#eK+2<@73I{yFw002ovPDHLk FV1iB4yx#x- literal 0 HcmV?d00001 diff --git a/icons/obj/items/sheet_snatcher.dmi b/icons/obj/items/sheet_snatcher.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7a898ac6f09c2cadc032cd78c5c80b3cc352a5d2 GIT binary patch literal 507 zcmVD@x2wg|L+sT>V_Y z#sUC40va;_YAfXc005^+L_t(IjqQ-x5`r)cMIlJV1-BF%|Nrw`D9$u6KIog{ znaNX5ax?L~U&5~eZa?4vyr1_2S7>p#@bv}=MLX))*>2PmAus{@@n8rgqj5X|E}%@N zh=k9YB@($nGF3<=sI;Uefhtt`iI5pXWd@QlSxqqW#d2jAtT)@8;eyChRal`=Iv0&M xR1r$=?-9QHhr{voI`VwEA~^lWD>>dDhZ|gx5iM#nUT6RS002ovPDHLkV1ncAz-s^i literal 0 HcmV?d00001 diff --git a/icons/obj/machines/gigadrill.dmi b/icons/obj/machines/gigadrill.dmi new file mode 100644 index 0000000000000000000000000000000000000000..bcbda6a514466d6b2a8e0c30e4505fc3e5ec5212 GIT binary patch literal 2189 zcmW+%dpy%$AD>GpxkO1RtsluPf;3NQmDt~`}G#X6- z!2oCs!Q=5X8Vy{c_b4WVhjP&u+|iITlLME*O%l<|FWNrzX2^|jd~|pe4gw)OMf>1y z#E6&C_{9~ziL04OR|gke<9+NqY;^o6*Uh*ca^wDk`jfB=uwIzUp{L^yzdZChgf_N; z*;tku!3+(N@Fur(D$L+r`Q8^#sIW>SOSslIcjr#$H;R9%#;|r$W9I@?8y;x|Z3MB* z6(D~|&B~|FH-fn+5uEMMdJ&$^7f@p-jCR^@A^PnNo09-^Oi}oiou1!_ml>x`GqSVG zi;M!)P2o$&G4m0=>%IBoFY8{K{gd{-_JsUQ8?b+EZY9(oQ-ZuC6PEBk97Q$%I=go=KMO2 zU}&U~NuxUK>%Sd8MbX!lxDL~B(}z!AKA7OiLVigTY# z#~UVzikRzNt)qU9GAz7Up+)6mr26$I+n+<{&M|X;iV4;S?eXKl{+5UT>|bC31M_(0mW@W z)Zwc&3to4tmlBAD(3v)r;AM61{^H@^LhLh~6@OTT{@P`}z-$DUl_9;2`$(+M$zxY$ z-mMPT=BSS4Mikx?kJn~MO%wbFKQ3s778Jz(C+^iikzEdd*~w8>wqk6)AR~=PIBUuQ z4F-FhRqPN;sLEFMhJ?f%GEMwD{H+8oCg!I7lN!S(cQZHwhmET<7cq13`QH*6*C}zb zPSYy(uusZY#8TAkoKIlGaH6)shg_?B&v}(LYB~b&9wA~hDw|Xv?6a4KVtpHb{j7?u zBfG922U0|$4Sappys#7fo<7n^pojER=&A25L5W9Zl?|AVhrdY-WbkecQ0X@l*$JIExJTBZ zjiz`D8Sh7TA^7n}cOa*S?@?y-_Db|TGA;CfBxNLR6LgSVT1gg5&6w%PzCc+cpNasW zrXrhPhGom!MU1V`pdGTkI|e4Hs>~@`l?GrM?Q(1~UXIzBtiGnKEzMGHBVErW)i#S& zM#(QbfvqI2K$eGUfmVdk7xuA$h-aD*ruH(U0xA^~6Xp2ju5{qUvR8>EPcYjJ^h(v& zHtR|b)ND8c?4S9|n6gmYMVN1wW|8AhY+O4Mi;=;5s8u0M?UgY3ybfrvaV%%kYO@;{ zH(|tP=VXHU38}iM*^hqO!oA(UfI;C?H{b7M)mh zc&jPBUSx+%TOGM-$FoIQlk+la_|QAMrL`sh2lt4PK%fbLS=9$av&2T1kjEpC17lR! zXtr}JNlj?eC*GFqVNGuPqelut8p1ooel$a6!HOuYoj!>awpJx3bI;i^A4f-aEumP@ zYb{U>dWm8J^YMxml=K*tm=7>Im2Rf;*ucnS%HK0$VH1pm@0fb)oxN}(CYHm6E}>J- z$xilo2v2>lYZj{!iIl~5sRs_clf|-IGBFY=b>}s)0dpjw?lnlrWS{jZ2@gIQwZtHj zK3#Gr!xrb>GqTjD+k(GDiWm{M&c~7KwtvdKd%na8e8{JQ(-zu~fKJL$rDsZ11NFP%Ip^fDbTfLL3;x)&uz)M32RX*B5ic zW-sE4e0QJeokBdg3o^2YWGjhAg|_x;4$6fjP1orvSjF(wC0LV0(lx}iQnHTn`(gX! z`JFYT`s6n8kZ!|Z#4CfIm`WAD-EH;NcpxKs6Ky%NF={R(<@U=xdxQ$^*q)goHT)v} zbi4M5%5MwC6{gxxIx6}6~D=NRk0EV6a_I;r|?H%hxy5_~BckjPj3w+!hy){y`8h})ka(Nb7A3%Sfw+m5>)WM)O zU?|b(j-0MUTMM^n^P;H}aOd*I;+@EJ;8`IMB3)RP_JWOSQ3lBK7G>-SSYU-W7W{-E N&JOPORkjzC{|8@temnpG literal 0 HcmV?d00001 diff --git a/icons/obj/mining.dmi b/icons/obj/mining.dmi deleted file mode 100644 index 0bf325c1efbaed6357607eac99d1a1002bb4eabe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54133 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 literal 0 HcmV?d00001 diff --git a/icons/obj/structures/ore_box.dmi b/icons/obj/structures/ore_box.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c9eea92cfd2da30247c278e3f0f054f97a9fc70c GIT binary patch literal 501 zcmVfFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*+P z6o#=;8uZHDwfP!U~ z_ZVAdi4Y1@DiY~oMIMxPj^c2#w|=}~iw8cD&#@v=Q=(X-D6AM2 zm@%w>+Nx?B{ncMqw3Ysw%8G9zS}T6Lil%e*8AG?q$4ET|_vm?@K$qjSgE6?oacpjR roDlXFH_JezWp;4QEuT01 Date: Thu, 9 Jan 2025 20:57:49 +1100 Subject: [PATCH 22/95] Implementing Doe's chisel icons. --- code/game/objects/items/chisel.dm | 12 ++++++++++++ .../tool_crafting/_tool_crafting.dm | 4 ++++ code/modules/tools/components/head.dm | 6 +++++- icons/obj/items/tool/chisel.dmi | Bin 0 -> 690 bytes 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 code/game/objects/items/chisel.dm create mode 100644 icons/obj/items/tool/chisel.dmi diff --git a/code/game/objects/items/chisel.dm b/code/game/objects/items/chisel.dm new file mode 100644 index 000000000000..8bdcf2ab1a40 --- /dev/null +++ b/code/game/objects/items/chisel.dm @@ -0,0 +1,12 @@ +// Stub for forging. TODO implement TOOL_CHISEL. +/obj/item/tool/chisel + name = "chisel" + desc = "A hard, sharpened tool used to chisel stone, wood or bone." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/tool/chisel.dmi' + material = /decl/material/solid/metal/steel + handle_material = /decl/material/solid/organic/plastic + binding_material = null + +/obj/item/tool/chisel/forged + handle_material = null diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm b/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm index c8169a999c22..ad2cff20aa67 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm @@ -12,6 +12,10 @@ var/global/list/_tool_crafting_lookup return global._tool_crafting_lookup var/global/list/_tool_crafting_components = list( + /obj/item/tool/chisel = list( + /obj/item/tool_component/head/chisel, + /obj/item/tool_component/handle/short + ), /obj/item/tool/hammer = list( /obj/item/tool_component/head/hammer, /obj/item/tool_component/handle/short diff --git a/code/modules/tools/components/head.dm b/code/modules/tools/components/head.dm index 5d7aa85f5120..8f594c1f2e75 100644 --- a/code/modules/tools/components/head.dm +++ b/code/modules/tools/components/head.dm @@ -40,6 +40,11 @@ var/global/list/_tool_properties_cache = list() desc = "The head of a hoe." icon_state = "hoe" +/obj/item/tool_component/head/chisel + name = "chisel head" + desc = "The head of a chisel." + icon_state = "hoe" + /obj/item/tool_component/head/handaxe name = "hand axe head" desc = "The head of a hand axe." @@ -57,4 +62,3 @@ var/global/list/_tool_properties_cache = list() desc = "The head of a sledgehammer." icon_state = "sledgehammer" w_class = ITEM_SIZE_NORMAL - diff --git a/icons/obj/items/tool/chisel.dmi b/icons/obj/items/tool/chisel.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e277e1ba44b698cdee2da998e3ce19c6bb62151f GIT binary patch literal 690 zcmV;j0!{siP)005u_0{{R3dEt5<0000LP)t-sz`($Y zik|=f|7Bu!!okT&M_jk&2Oy8mioGaTYtAC7peM20a;5>VI?Tcc8DJW-8^M4OGtLx}pEeuLE+l)H z=eG~-05&)p)18HuRvB0Xq9dcyT&a=z-b?FHiL+B<;f)KO>7ML|ER#w4o18npj{dcJ zAs`oZTfLtD09Egv0smDxhX4Qpj7da6RA_mssewm!JQ}+rrxRxPB-F!(Sf>W~`RJqTIjuI>_F+S;Qv=sRO|hTo0!72Ovx_ZUgnGz)3iTv>GO12u_yuVZzJO3S@dMbAe~aDW@bXWX`6j7dB+81}cqQe@ zfSRnR%9AyT52+9U000307(WVC#H?J4dVkQPA}dzx4;oE}a(@t65dZ)H06+o4696FM Y3M)V?{nMd#r2qf`07*qoM6N<$g2{V8g#Z8m literal 0 HcmV?d00001 From 3fdea9279093fdf80823da3fc3ba47b178c04956 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 21:00:31 +1100 Subject: [PATCH 23/95] Adding miscellaneous crafting items for future work. --- code/game/objects/items/artifice/chain.dm | 9 +++++++++ code/game/objects/items/artifice/hook.dm | 8 ++++++++ code/game/objects/items/horseshoe.dm | 8 ++++++++ icons/obj/items/chain.dmi | Bin 0 -> 352 bytes icons/obj/items/hook.dmi | Bin 0 -> 331 bytes icons/obj/items/horseshoe.dmi | Bin 0 -> 391 bytes nebula.dme | 4 ++++ 7 files changed, 29 insertions(+) create mode 100644 code/game/objects/items/artifice/chain.dm create mode 100644 code/game/objects/items/artifice/hook.dm create mode 100644 code/game/objects/items/horseshoe.dm create mode 100644 icons/obj/items/chain.dmi create mode 100644 icons/obj/items/hook.dmi create mode 100644 icons/obj/items/horseshoe.dmi diff --git a/code/game/objects/items/artifice/chain.dm b/code/game/objects/items/artifice/chain.dm new file mode 100644 index 000000000000..3a48abad4759 --- /dev/null +++ b/code/game/objects/items/artifice/chain.dm @@ -0,0 +1,9 @@ +// Stub for forging. TODO crafting that uses chains. +/obj/item/chain + name = "chain" + name_prefix = "length of" + desc = "A flexible length of interconnected links forming a chain." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/chain.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/code/game/objects/items/artifice/hook.dm b/code/game/objects/items/artifice/hook.dm new file mode 100644 index 000000000000..c20c77b14801 --- /dev/null +++ b/code/game/objects/items/artifice/hook.dm @@ -0,0 +1,8 @@ +// Stub for forging. TODO use for slapcrafting a fishing rod? +/obj/item/hook + name = "hook" + desc = "A small, sharp, curved object." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/hook.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/code/game/objects/items/horseshoe.dm b/code/game/objects/items/horseshoe.dm new file mode 100644 index 000000000000..089d3c9cc4bf --- /dev/null +++ b/code/game/objects/items/horseshoe.dm @@ -0,0 +1,8 @@ +// Stub for forging. TODO implement shoes on honse. +/obj/item/horseshoe + name = "horseshoe" + desc = "A curved length of metal, usually nailed to a horse's hoof. May bring luck." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/horseshoe.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL diff --git a/icons/obj/items/chain.dmi b/icons/obj/items/chain.dmi new file mode 100644 index 0000000000000000000000000000000000000000..95d5c71b70f36d7842cf5c756b45665747201c7e GIT binary patch literal 352 zcmV-m0iXVfP)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zsXV_ZCq;>iGbOXA7|1u|;!G<_%uR)`l@(n5T)@Tx06PL2GXQEUV=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zDKoDuHLoPUs8WfGGbOXA7$|1Q#hF%=n41b=!&R2&7v-ejQl+fm>gNJ>008PhCchu; zBTE1P0BA`>K~y-6?T@hyz#t3+pM(KohXFv&0+0n@|D}@Bc7xKT;JZV|Ne0%wE#!&7 zJQ2ht_;A7on~d}nk%>)LC6GfQne@0ogDik dX~JuN*aHqK2806jAO!#b002ovPDHLkV1gu=hF1Up literal 0 HcmV?d00001 diff --git a/icons/obj/items/horseshoe.dmi b/icons/obj/items/horseshoe.dmi new file mode 100644 index 0000000000000000000000000000000000000000..15f6f5f2482aeed976d9877c5eff719d17270309 GIT binary patch literal 391 zcmV;20eJq2P)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3K9+Gp{T)uOz>yQi+Q*C9|j)C}zmTnO2mTn+jpWRhH)$<)q+JrL5rU=K^*B0O~*{ zzaQ-*O8@`>p-DtRR5*?8kUVvG*s~@;sOpVwlpRo!;qna z@C<-Um556RRH}@Lezj9`2h2o=6962SoeQ-`oYx0H@uXYMD|B%9YZXJQE~!!xSZ<)+ l?(iXVf3*4zh_u@Ehn^ot6Ju#-(<=Y~002ovPDHLkV1n-0r7r*g literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index 8993c444e425..c4e9c0bfc54e 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1077,6 +1077,7 @@ #include "code\game\objects\items\bodybag.dm" #include "code\game\objects\items\buttons.dm" #include "code\game\objects\items\candelabra.dm" +#include "code\game\objects\items\chisel.dm" #include "code\game\objects\items\christmas.dm" #include "code\game\objects\items\contraband.dm" #include "code\game\objects\items\crutches.dm" @@ -1085,6 +1086,7 @@ #include "code\game\objects\items\fleece.dm" #include "code\game\objects\items\glassjar.dm" #include "code\game\objects\items\holosign_creator.dm" +#include "code\game\objects\items\horseshoe.dm" #include "code\game\objects\items\hourglass.dm" #include "code\game\objects\items\instruments.dm" #include "code\game\objects\items\latexballoon.dm" @@ -1106,6 +1108,8 @@ #include "code\game\objects\items\trash.dm" #include "code\game\objects\items\umbrella.dm" #include "code\game\objects\items\waterskin.dm" +#include "code\game\objects\items\artifice\chain.dm" +#include "code\game\objects\items\artifice\hook.dm" #include "code\game\objects\items\blades\_blade.dm" #include "code\game\objects\items\blades\axe.dm" #include "code\game\objects\items\blades\axe_fire.dm" From 8c21402893af074db877e0d2fbd8c01d7cfe2ce2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 14:15:43 +1100 Subject: [PATCH 24/95] Updating the save replication script to allow targeting specific ckeys and maps --- tools/ReplicateSaves/replicate_saves.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/tools/ReplicateSaves/replicate_saves.py b/tools/ReplicateSaves/replicate_saves.py index fd97ec57aece..7fb417b13def 100644 --- a/tools/ReplicateSaves/replicate_saves.py +++ b/tools/ReplicateSaves/replicate_saves.py @@ -23,6 +23,18 @@ def main(): print("Cannot find directory '" + mapdir + "', make sure you are running this script from the root repository directory.") return + ckey = None + if len(sys.argv) > 2: + ckey = sys.argv[2] + if ckey is not None: + ckey = ckey.lower() + + singletargetmap = None + if len(sys.argv) > 3: + singletargetmap = sys.argv[3] + if singletargetmap is not None: + singletargetmap = singletargetmap.lower() + # Work out what maps we actually need to replicate to. # This should be updated as map directories change, or the script will break. targetmaps = [] @@ -40,7 +52,7 @@ def main(): if os.path.isdir(dir): targetmap = dir.path targetmap = targetmap.replace(mapdir + os.sep, "") - if targetmap not in ignoremaps and targetmap != mapname: + if (targetmap not in ignoremaps) and (targetmap != mapname) and ((singletargetmap is None) or (singletargetmap == targetmap)): targetmaps.append(targetmap) # Make sure we can actually see the save directory. @@ -62,6 +74,8 @@ def main(): continue if match.group(1) != mapname: continue + if (ckey is not None) and (ckey != root[root.rfind("/")+1:]): + continue savefile = os.path.join(root, file) with open(savefile, "r") as loadedsave: wrote = 0 From a815bec7f22496a7f6793c19cb3b97653e7b56e7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 16:10:07 +1100 Subject: [PATCH 25/95] Fixing hatchlings having the wrong offsets in prefs. --- code/modules/mob/living/living.dm | 4 ++-- code/modules/species/species.dm | 3 --- code/modules/species/species_bodytype.dm | 3 +++ mods/species/drakes/species.dm | 6 ------ mods/species/drakes/species_bodytypes.dm | 9 +++++++++ 5 files changed, 14 insertions(+), 11 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 216f52acd3d3..e3b9dd00ecab 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1876,8 +1876,8 @@ default behaviour is: var/screen_locs = gear.get_preview_screen_locs() if(screen_locs) return screen_locs - var/decl/species/my_species = get_species() - return my_species?.character_preview_screen_locs + var/decl/bodytype/my_bodytype = get_bodytype() + return my_bodytype?.character_preview_screen_locs /mob/living/can_twohand_item(obj/item/item) if(!istype(item) || !item.can_be_twohanded) diff --git a/code/modules/species/species.dm b/code/modules/species/species.dm index 85df8623e439..af664b32e9ad 100644 --- a/code/modules/species/species.dm +++ b/code/modules/species/species.dm @@ -57,9 +57,6 @@ var/global/const/DEFAULT_SPECIES_HEALTH = 200 var/flesh_color = "#ffc896" // Pink. var/blood_oxy = 1 - // Preview in prefs positioning. If null, uses defaults set on a static list in preferences.dm. - var/list/character_preview_screen_locs - var/organs_icon //species specific internal organs icons var/strength = STR_MEDIUM diff --git a/code/modules/species/species_bodytype.dm b/code/modules/species/species_bodytype.dm index af7756ddebb7..840c3644b7b3 100644 --- a/code/modules/species/species_bodytype.dm +++ b/code/modules/species/species_bodytype.dm @@ -27,6 +27,9 @@ var/global/list/bodytypes_by_category = list() var/associated_gender var/appearance_flags = 0 // Appearance/display related features. + // Preview in prefs positioning. If null, uses defaults set on a static list in preferences.dm. + var/list/character_preview_screen_locs + /// Used when filing your nails. var/nail_noun /// What tech levels should limbs of this type use/need? diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index a1a0c4bf6c7e..c882aec7fa12 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -47,12 +47,6 @@ // Drakes must be whitelisted for jobs to be able to join as them, see maps.dm. job_blacklist_by_default = TRUE spawn_flags = SPECIES_CAN_JOIN | SPECIES_IS_WHITELISTED - character_preview_screen_locs = list( - "1" = "character_preview_map:1,4:36", - "2" = "character_preview_map:1,3:31", - "4" = "character_preview_map:1,2:26", - "8" = "character_preview_map:1,1:21" - ) var/list/adult_pain_emotes_with_pain_level = list( list(/decl/emote/audible/drake_huff, /decl/emote/audible/drake_rattle) = 20 diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index c0229bf18f99..89e131438b8f 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -93,6 +93,13 @@ /decl/emote/visible/tfist ) + character_preview_screen_locs = list( + "1" = "character_preview_map:1,4:36", + "2" = "character_preview_map:1,3:31", + "4" = "character_preview_map:1,2:26", + "8" = "character_preview_map:1,1:21" + ) + available_mob_postures = list( /decl/posture/standing, /decl/posture/lying/drake, @@ -183,6 +190,7 @@ blood_overlays = 'mods/species/drakes/icons/hatchling_blood.dmi' eye_icon = 'mods/species/drakes/icons/hatchling_eyes.dmi' icon_template = 'icons/mob/human_races/species/template.dmi' + damage_overlays = 'icons/mob/human_races/species/default_damage_overlays.dmi' bodytype_category = BODYTYPE_GRAFADREKA_HATCHLING mob_size = MOB_SIZE_SMALL pixel_offset_x = 0 @@ -202,6 +210,7 @@ /decl/emote/audible/drake_sneeze ) age_descriptor = /datum/appearance_descriptor/age/grafadreka/hatchling + character_preview_screen_locs = null uid = "bodytype_drake_hatchling" /decl/bodytype/quadruped/grafadreka/hatchling/Initialize() From df19a2b62943796c2b001beb265fd0992d895b76 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 16:25:18 +1100 Subject: [PATCH 26/95] Removing the steel axe from Shaded Hills. --- code/modules/tools/subtypes/axes.dm | 4 ++++ maps/shaded_hills/shaded_hills-grassland.dmm | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/tools/subtypes/axes.dm b/code/modules/tools/subtypes/axes.dm index 93eae37611f9..51c9347dcaf2 100644 --- a/code/modules/tools/subtypes/axes.dm +++ b/code/modules/tools/subtypes/axes.dm @@ -19,8 +19,12 @@ return tool_qualities /obj/item/tool/axe/ebony + material = /decl/material/solid/metal/iron handle_material = /decl/material/solid/organic/wood/ebony +/obj/item/tool/axe/iron + material = /decl/material/solid/metal/iron + // Legacy SS13 hatchet. /obj/item/tool/axe/hatchet name = "hatchet" diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index b52be7251171..ce0ab90b8795 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -67,7 +67,7 @@ /area/shaded_hills/outside) "kr" = ( /obj/item/tool/pickaxe/iron, -/obj/item/tool/axe, +/obj/item/tool/axe/iron, /obj/abstract/exterior_marker/inside, /obj/structure/closet/crate/chest/ebony, /turf/floor/woven, From 530a9dd9ebc5a968a079081c0f78fbe972e10ef8 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 5 Dec 2024 15:44:23 +1100 Subject: [PATCH 27/95] Rewrites the ability system. --- code/__defines/gamemode.dm | 25 -- code/_helpers/time.dm | 29 ++ code/_onclick/hud/screen/screen_abilities.dm | 288 ------------ code/datums/extensions/abilities/abilities.dm | 11 +- .../extensions/abilities/abilities_mob.dm | 70 +++ .../abilities/abilities_predator.dm | 7 +- .../extensions/abilities/ability_button.dm | 108 +++++ .../extensions/abilities/ability_decl.dm | 410 ++++++++++++++++++ .../extensions/abilities/ability_handler.dm | 229 +++++++++- .../extensions/abilities/ability_item.dm | 51 ++- .../abilities/ability_projectile.dm | 31 ++ .../extensions/abilities/ability_targeting.dm | 91 ++++ code/datums/extensions/abilities/readme.dm | 26 ++ code/datums/mind/mind.dm | 6 +- code/game/machinery/ai_slipper.dm | 28 +- code/game/objects/effects/overlays.dm | 10 + code/game/objects/items/weapons/weaponry.dm | 3 +- code/game/turfs/turf.dm | 6 +- code/modules/admin/admin_verbs.dm | 10 - code/modules/admin/view_variables/helpers.dm | 4 +- code/modules/admin/view_variables/topic.dm | 39 +- .../codex/categories/category_phenomena.dm | 18 +- code/modules/emotes/emote_define.dm | 4 +- code/modules/mob/login.dm | 5 - code/modules/mob/mob.dm | 6 - code/modules/mob/mob_defines.dm | 1 - code/modules/mob/mob_movement.dm | 2 +- code/modules/projectiles/projectile.dm | 25 +- code/modules/projectiles/projectile/change.dm | 10 +- .../reagents/reagent_containers/spray.dm | 3 - code/modules/spells/aoe_turf/aoe_turf.dm | 23 - .../spells/aoe_turf/conjure/conjure.dm | 73 ---- code/modules/spells/construct_spells.dm | 10 - code/modules/spells/spell_code.dm | 385 ---------------- code/modules/spells/spells.dm | 60 --- .../modules/spells/targeted/ethereal_jaunt.dm | 120 ----- code/modules/spells/targeted/shift.dm | 24 - code/modules/spells/targeted/targeted.dm | 152 ------- icons/effects/effects.dmi | Bin 307787 -> 272420 bytes icons/effects/projectiles/trail.dmi | Bin 0 -> 1422 bytes icons/mob/screen/abilities.dmi | Bin 0 -> 464 bytes icons/mob/screen/ability_inhand.dmi | Bin 0 -> 273 bytes icons/mob/screen/phenomena.dmi | Bin 18838 -> 0 bytes icons/mob/screen/spells.dmi | Bin 45216 -> 0 bytes icons/obj/wizard.dmi | Bin 13510 -> 12595 bytes maps/exodus/exodus-admin.dmm | 9 +- mods/content/psionics/_psionics.dm | 9 + mods/content/psionics/_psionics.dme | 1 - mods/content/psionics/datum/spells.dm | 7 - .../system/psionics/complexus/complexus.dm | 1 - .../system/psionics/equipment/psipower.dm | 5 +- .../system/psionics/equipment/psipower_tk.dm | 4 +- .../psionics/system/psionics/mob/mob.dm | 1 + .../system/psionics/mob/mob_interactions.dm | 8 +- mods/gamemodes/cult/_cult.dme | 17 +- mods/gamemodes/cult/abilities/_handler.dm | 21 + mods/gamemodes/cult/abilities/construct.dm | 131 ++++++ mods/gamemodes/cult/abilities/harvest.dm | 41 ++ mods/gamemodes/cult/abilities/shade.dm | 1 + mods/gamemodes/cult/icons/abilities.dmi | Bin 0 -> 6754 bytes mods/gamemodes/cult/icons/ability_item.dmi | Bin 0 -> 613 bytes mods/gamemodes/cult/icons/effects.dmi | Bin 0 -> 22349 bytes mods/gamemodes/cult/icons/forcewall.dmi | Bin 0 -> 6135 bytes .../gamemodes/cult/icons/runes.dmi | Bin .../cult/mobs/constructs/constructs.dm | 33 +- mods/gamemodes/cult/runes.dm | 7 +- mods/gamemodes/cult/spells/construct.dm | 122 ------ mods/gamemodes/cult/spells/harvest.dm | 37 -- mods/gamemodes/cult/structures.dm | 8 +- mods/species/ascent/mobs/bodyparts.dm | 24 +- mods/species/drakes/_overrides.dm | 2 +- mods/species/drakes/drake_abilities.dm | 4 +- nebula.dme | 14 +- 73 files changed, 1424 insertions(+), 1486 deletions(-) delete mode 100644 code/_onclick/hud/screen/screen_abilities.dm create mode 100644 code/datums/extensions/abilities/ability_button.dm create mode 100644 code/datums/extensions/abilities/ability_decl.dm create mode 100644 code/datums/extensions/abilities/ability_projectile.dm create mode 100644 code/datums/extensions/abilities/ability_targeting.dm create mode 100644 code/datums/extensions/abilities/readme.dm delete mode 100644 code/modules/spells/aoe_turf/aoe_turf.dm delete mode 100644 code/modules/spells/aoe_turf/conjure/conjure.dm delete mode 100644 code/modules/spells/construct_spells.dm delete mode 100644 code/modules/spells/spell_code.dm delete mode 100644 code/modules/spells/spells.dm delete mode 100644 code/modules/spells/targeted/ethereal_jaunt.dm delete mode 100644 code/modules/spells/targeted/shift.dm delete mode 100644 code/modules/spells/targeted/targeted.dm create mode 100644 icons/effects/projectiles/trail.dmi create mode 100644 icons/mob/screen/abilities.dmi create mode 100644 icons/mob/screen/ability_inhand.dmi delete mode 100644 icons/mob/screen/phenomena.dmi delete mode 100644 icons/mob/screen/spells.dmi delete mode 100644 mods/content/psionics/datum/spells.dm create mode 100644 mods/gamemodes/cult/abilities/_handler.dm create mode 100644 mods/gamemodes/cult/abilities/construct.dm create mode 100644 mods/gamemodes/cult/abilities/harvest.dm create mode 100644 mods/gamemodes/cult/abilities/shade.dm create mode 100644 mods/gamemodes/cult/icons/abilities.dmi create mode 100644 mods/gamemodes/cult/icons/ability_item.dmi create mode 100644 mods/gamemodes/cult/icons/effects.dmi create mode 100644 mods/gamemodes/cult/icons/forcewall.dmi rename icons/effects/uristrunes.dmi => mods/gamemodes/cult/icons/runes.dmi (100%) delete mode 100644 mods/gamemodes/cult/spells/construct.dm delete mode 100644 mods/gamemodes/cult/spells/harvest.dm diff --git a/code/__defines/gamemode.dm b/code/__defines/gamemode.dm index 94c9d41639ae..680717a8e9ad 100644 --- a/code/__defines/gamemode.dm +++ b/code/__defines/gamemode.dm @@ -33,31 +33,6 @@ #define DEFAULT_TELECRYSTAL_AMOUNT 130 #define IMPLANT_TELECRYSTAL_AMOUNT(x) (round(x * 0.49)) // If this cost is ever greater than half of DEFAULT_TELECRYSTAL_AMOUNT then it is possible to buy more TC than you spend -// SPELL FLAGS -#define Z2NOCAST BITFLAG(0) //if this is added, the spell can't be cast at centcomm -#define INCLUDEUSER BITFLAG(1) //does the spell include the caster in its target selection? -#define IGNOREDENSE BITFLAG(2) //are dense turfs ignored in selection? - -//End split flags -#define CONSTRUCT_CHECK BITFLAG(12) //used by construct spells - checks for nullrods -#define NO_BUTTON BITFLAG(13) //spell won't show up in the HUD with this - -//invocation -#define SpI_SHOUT "shout" -#define SpI_WHISPER "whisper" -#define SpI_EMOTE "emote" -#define SpI_NONE "none" - -//upgrading -#define Sp_SPEED "speed" -#define Sp_POWER "power" -#define Sp_TOTAL "total" - -//casting costs -#define Sp_RECHARGE "recharge" -#define Sp_CHARGES "charges" -#define Sp_HOLDVAR "holdervar" - //Voting-related #define VOTE_PROCESS_ABORT 1 #define VOTE_PROCESS_COMPLETE 2 diff --git a/code/_helpers/time.dm b/code/_helpers/time.dm index f53718da51be..90210911f1ef 100644 --- a/code/_helpers/time.dm +++ b/code/_helpers/time.dm @@ -72,6 +72,35 @@ var/global/next_duration_update = 0 var/global/last_round_duration = 0 var/global/round_start_time = 0 +/proc/ticks2shortreadable(tick_time, separator = ":") + var/hours = round(tick_time / (1 HOUR)) + var/minutes = round((tick_time % (1 HOUR)) / (1 MINUTE)) + var/seconds = round((tick_time % (1 MINUTE)) / (1 SECOND)) + var/out = list() + + if(hours > 0) + out += "[hours]" + + if(minutes > 0) + if(minutes < 10 && hours > 0) + out += "0[minutes]" + else + out += "[minutes]" + else if(hours > 0) + out += "00" + + if(seconds > 0) + if(seconds < 10 && (minutes > 0 || hours > 0)) + out += "0[seconds]" + else + out += "[seconds]" + else if(minutes > 0 || hours > 0) + out += "00" + + if(length(out)) + return jointext(out, separator) + return null + /proc/ticks2readable(tick_time) var/hours = round(tick_time / (1 HOUR)) var/minutes = round((tick_time % (1 HOUR)) / (1 MINUTE)) diff --git a/code/_onclick/hud/screen/screen_abilities.dm b/code/_onclick/hud/screen/screen_abilities.dm deleted file mode 100644 index 414458af058e..000000000000 --- a/code/_onclick/hud/screen/screen_abilities.dm +++ /dev/null @@ -1,288 +0,0 @@ -/obj/screen/ability_master - name = "Abilities" - icon = 'icons/mob/screen/spells.dmi' - icon_state = "grey_spell_ready" - screen_loc = ui_ability_master - requires_ui_style = FALSE - var/list/obj/screen/ability/ability_objects = list() - var/list/obj/screen/ability/spell_objects = list() - var/showing = FALSE // If we're 'open' or not. - var/const/abilities_per_row = 7 - var/open_state = "master_open" // What the button looks like when it's 'open', showing the other buttons. - var/closed_state = "master_closed" // Button when it's 'closed', hiding everything else. - -/obj/screen/ability_master/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, ui_cat) - . = ..() - if(. != INITIALIZE_HINT_QDEL) - update_abilities(0, _owner) - -/obj/screen/ability_master/Destroy() - // Get rid of the ability objects. - remove_all_abilities() - ability_objects.Cut() - // After that, remove ourselves from the mob seeing us, so we can qdel cleanly. - var/mob/owner = owner_ref?.resolve() - if(istype(owner) && owner.ability_master == src) - owner.ability_master = null - return ..() - -/obj/screen/ability_master/handle_mouse_drop(atom/over, mob/user, params) - if(showing) - return FALSE - . = ..() - -/obj/screen/ability_master/handle_click(mob/user, params) - if(length(ability_objects)) // If we're empty for some reason. - toggle_open() - -/obj/screen/ability_master/proc/toggle_open(var/forced_state = 0) - var/mob/owner = owner_ref?.resolve() - if(!istype(owner) || QDELETED(owner)) - return - if(showing && (forced_state != 2)) // We are closing the ability master, hide the abilities. - if(owner?.client) - for(var/obj/screen/ability/O in ability_objects) - owner.client.screen -= O -// O.handle_icon_updates = 0 - showing = 0 - overlays.len = 0 - overlays.Add(closed_state) - else if(forced_state != 1) // We're opening it, show the icons. - open_ability_master() - update_abilities(1) - showing = 1 - overlays.len = 0 - overlays.Add(open_state) - update_icon() - -/obj/screen/ability_master/proc/open_ability_master() - - var/client/owner_client - var/mob/owner = owner_ref?.resolve() - if(istype(owner) && !QDELETED(owner)) - owner_client = owner.client - - for(var/i = 1 to length(ability_objects)) - var/obj/screen/ability/A = ability_objects[i] - var/row = round(i/abilities_per_row) - A.screen_loc = "RIGHT-[(i-(row*abilities_per_row))+2]:16,TOP-[row+1]:16" - if(owner_client) - owner_client.screen += A - -/obj/screen/ability_master/proc/update_abilities(forced = 0, mob/user) - update_icon() - if(user && user.client) - if(!(src in user.client.screen)) - user.client.screen += src - var/i = 1 - for(var/obj/screen/ability/ability in ability_objects) - ability.update_icon(forced) - ability.maptext = "[i]" // Slot number - i++ - -/obj/screen/ability_master/on_update_icon() - if(ability_objects.len) - set_invisibility(INVISIBILITY_NONE) - else - set_invisibility(INVISIBILITY_ABSTRACT) - -/obj/screen/ability_master/proc/add_ability(var/name_given) - if(!name_given) - return - var/obj/screen/ability/new_button = new /obj/screen/ability - new_button.ability_master = src - new_button.SetName(name_given) - new_button.ability_icon_state = name_given - new_button.update_icon(1) - ability_objects.Add(new_button) - var/mob/living/owner = owner_ref?.resolve() - if(istype(owner) && !QDELETED(owner) && owner.client) - toggle_open(2) //forces the icons to refresh on screen - -/obj/screen/ability_master/proc/remove_ability(var/obj/screen/ability/ability) - if(!ability) - return - ability_objects.Remove(ability) - if(istype(ability,/obj/screen/ability/spell)) - spell_objects.Remove(ability) - qdel(ability) - - - if(ability_objects.len) - toggle_open(showing + 1) - update_icon() -// else -// qdel(src) - -/obj/screen/ability_master/proc/remove_all_abilities() - for(var/obj/screen/ability/A in ability_objects) - remove_ability(A) - -/obj/screen/ability_master/proc/get_ability_by_name(name_to_search) - for(var/obj/screen/ability/A in ability_objects) - if(A.name == name_to_search) - return A - return null - -/obj/screen/ability_master/proc/get_ability_by_instance(var/obj/instance/) - for(var/obj/screen/ability/obj_based/O in ability_objects) - if(O.object == instance) - return O - return null - -/obj/screen/ability_master/proc/get_ability_by_spell(var/spell/s) - for(var/screen in spell_objects) - var/obj/screen/ability/spell/S = screen - if(S.spell == s) - return S - return null - -/obj/screen/ability_master/proc/synch_spells_to_mind(var/datum/mind/M) - if(!M) - return - LAZYINITLIST(M.learned_spells) - for(var/obj/screen/ability/spell/screen in spell_objects) - var/spell/S = screen.spell - M.learned_spells |= S - -///////////ACTUAL ABILITIES//////////// -//This is what you click to do things// -/////////////////////////////////////// -/obj/screen/ability - icon = 'icons/mob/screen/spells.dmi' - icon_state = "grey_spell_base" - maptext_x = 3 - requires_owner = FALSE - requires_ui_style = FALSE - var/background_base_state = "grey" - var/ability_icon_state = null - var/obj/screen/ability_master/ability_master - -/obj/screen/ability/Destroy() - if(ability_master) - ability_master.ability_objects -= src - var/mob/owner = ability_master.owner_ref?.resolve() - if(istype(owner) && owner.client) - owner.client.screen -= src - if(ability_master && !ability_master.ability_objects.len) - ability_master.update_icon() -// qdel(ability_master) - ability_master = null - return ..() - -/obj/screen/ability/on_update_icon() - overlays.Cut() - icon_state = "[background_base_state]_spell_base" - - overlays += ability_icon_state - -/obj/screen/ability/handle_click(mob/user, params) - activate() - -// Makes the ability be triggered. The subclasses of this are responsible for carrying it out in whatever way it needs to. -/obj/screen/ability/proc/activate() - to_world("[src] had activate() called.") - return - -/////////Obj Abilities//////// -//Buttons to trigger objects// -////////////////////////////// - -/obj/screen/ability/obj_based - var/obj/object = null - -/obj/screen/ability/obj_based/activate() - if(object) - object.Click() - -/obj/screen/ability/spell - var/spell/spell - var/spell_base - var/last_charge = 0 - var/icon/last_charged_icon - -/obj/screen/ability/spell/Destroy() - if(spell) - spell.connected_button = null - spell = null - return ..() - -/obj/screen/ability_master/proc/add_spell(var/spell/spell) - if(!spell) return - - if(spell.spell_flags & NO_BUTTON) //no button to add if we don't get one - return - - if(get_ability_by_spell(spell)) - return - - var/obj/screen/ability/spell/A = new(null) - A.ability_master = src - A.spell = spell - A.SetName(spell.name) - - if(!spell.override_base) //if it's not set, we do basic checks - A.spell_base = "const" //construct spells - else - A.spell_base = spell.override_base - A.update_charge(1) - spell_objects.Add(A) - ability_objects.Add(A) - var/mob/owner = owner_ref?.resolve() - if(istype(owner) && !QDELETED(owner) && owner.client) - toggle_open(2) //forces the icons to refresh on screen - -/obj/screen/ability_master/proc/update_spells(var/forced = 0) - for(var/obj/screen/ability/spell/spell in spell_objects) - spell.update_charge(forced) - -/obj/screen/ability/spell/proc/update_charge(var/forced_update = 0) - if(!spell) - qdel(src) - return - - if(last_charge == spell.charge_counter && !forced_update) - return //nothing to see here - - overlays -= spell.hud_state - - if(spell.charge_type == Sp_RECHARGE || spell.charge_type == Sp_CHARGES) - if(spell.charge_counter < spell.charge_max) - icon_state = "[spell_base]_spell_base" - if(spell.charge_counter > 0) - var/icon/partial_charge = icon(src.icon, "[spell_base]_spell_ready") - partial_charge.Crop(1, 1, partial_charge.Width(), round(partial_charge.Height() * spell.charge_counter / spell.charge_max)) - overlays += partial_charge - if(last_charged_icon) - overlays -= last_charged_icon - last_charged_icon = partial_charge - else if(last_charged_icon) - overlays -= last_charged_icon - last_charged_icon = null - else - icon_state = "[spell_base]_spell_ready" - if(last_charged_icon) - overlays -= last_charged_icon - else - icon_state = "[spell_base]_spell_ready" - - overlays += spell.hud_state - - last_charge = spell.charge_counter - - overlays -= "silence" - if(spell.silenced) - overlays += "silence" - -/obj/screen/ability/spell/on_update_icon(var/forced = 0) - update_charge(forced) - return - -/obj/screen/ability/spell/activate() - spell.perform(usr) - -/obj/screen/ability_master/proc/silence_spells(var/amount) - for(var/obj/screen/ability/spell/spell in spell_objects) - spell.spell.silenced = amount - spell.spell.process() - spell.update_charge(1) diff --git a/code/datums/extensions/abilities/abilities.dm b/code/datums/extensions/abilities/abilities.dm index 3995c524dc4a..21e02b0126b5 100644 --- a/code/datums/extensions/abilities/abilities.dm +++ b/code/datums/extensions/abilities/abilities.dm @@ -26,7 +26,7 @@ /// Clicking a grab on the currently grabbed mob. /datum/extension/abilities/proc/do_grabbed_invocation(atom/target) - if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers)) + if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers) && !istype(target, /obj/screen)) for(var/datum/ability_handler/handler in ability_handlers) if(handler.can_do_grabbed_invocation(holder, target) && handler.do_grabbed_invocation(holder, target)) return TRUE @@ -34,7 +34,7 @@ /// Clicking an adjacent target (UnarmedAttack()) /datum/extension/abilities/proc/do_melee_invocation(atom/target) - if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers)) + if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers) && !istype(target, /obj/screen)) for(var/datum/ability_handler/handler in ability_handlers) if(handler.can_do_melee_invocation(holder, target) && handler.do_melee_invocation(holder, target)) return TRUE @@ -42,7 +42,7 @@ /// Clicking a distant target (RangedAttack()) /datum/extension/abilities/proc/do_ranged_invocation(atom/target) - if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers)) + if(isliving(holder) && istype(target) && LAZYLEN(ability_handlers) && !istype(target, /obj/screen)) for(var/datum/ability_handler/handler in ability_handlers) if(handler.can_do_ranged_invocation(holder, target) && handler.do_ranged_invocation(holder, target)) return TRUE @@ -54,3 +54,8 @@ for(var/datum/ability_handler/handler in ability_handlers) handler.refresh_login() +/datum/extension/abilities/proc/refresh_element_positioning() + var/row = 0 + for(var/datum/ability_handler/handler in ability_handlers) + if(length(handler.screen_elements)) + row += handler.refresh_element_positioning(row) diff --git a/code/datums/extensions/abilities/abilities_mob.dm b/code/datums/extensions/abilities/abilities_mob.dm index b72d0ac2c5f0..4879b2d05c46 100644 --- a/code/datums/extensions/abilities/abilities_mob.dm +++ b/code/datums/extensions/abilities/abilities_mob.dm @@ -18,6 +18,7 @@ return FALSE handler = new handler_type(abilities, src) LAZYADD(abilities.ability_handlers, handler) + handler.finalize_ability_handler() return handler /mob/proc/remove_ability_handler(handler_type) @@ -28,6 +29,75 @@ if(!handler) return FALSE LAZYREMOVE(abilities.ability_handlers, handler) + qdel(handler) if(!LAZYLEN(abilities.ability_handlers)) remove_extension(src, /datum/extension/abilities) return TRUE + +/mob/living/proc/copy_abilities_from(mob/living/donor) + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + if(!abilities) + return FALSE + . = FALSE + for(var/datum/ability_handler/handler in abilities.ability_handlers) + if(handler.copy_abilities_to(src)) + . = TRUE + +/mob/living/proc/disable_abilities(var/amount = 0) + if(amount < 0) + return + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + for(var/datum/ability_handler/handler in abilities?.ability_handlers) + handler.disable_abilities(amount) + +/mob/living/proc/copy_abilities_to(mob/living/target) + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + for(var/datum/ability_handler/handler in abilities?.ability_handlers) + handler.copy_abilities_to(target) + +/mob/proc/add_ability(ability_type, list/metadata) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return FALSE + var/datum/ability_handler/handler = get_ability_handler(ability.associated_handler_type, create_if_missing = TRUE) + return handler.add_ability(ability_type, metadata) + +/mob/proc/remove_ability(ability_type) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return FALSE + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + var/datum/ability_handler/handler = locate(ability.associated_handler_type) in abilities?.ability_handlers + return handler?.remove_ability(ability_type) + +/mob/proc/get_ability_metadata(ability_type) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return null + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + var/datum/ability_handler/handler = locate(ability.associated_handler_type) in abilities?.ability_handlers + return handler?.get_metadata(ability_type, create_if_missing = TRUE) + +/mob/proc/has_ability(ability_type) + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability) || !ability.associated_handler_type) + return null + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + var/datum/ability_handler/handler = locate(ability.associated_handler_type) in abilities?.ability_handlers + return handler?.provides_ability(ability_type) + +/mob/Stat() + if((. = ..()) && client) + var/datum/extension/abilities/abilities = get_extension(src, /datum/extension/abilities) + for(var/datum/ability_handler/handler in abilities?.ability_handlers) + handler.show_stat_string(src) + +/mob/proc/get_all_abilities() + var/datum/extension/abilities/abilities_extension = get_extension(src, /datum/extension/abilities) + if(!istype(abilities_extension)) + return + for(var/datum/ability_handler/handler as anything in abilities_extension.ability_handlers) + for(var/ability_type in handler.known_abilities) + var/decl/ability/ability = GET_DECL(ability_type) + if(istype(ability)) + LAZYDISTINCTADD(., ability) diff --git a/code/datums/extensions/abilities/abilities_predator.dm b/code/datums/extensions/abilities/abilities_predator.dm index 066a3feac920..4fc37d4a8281 100644 --- a/code/datums/extensions/abilities/abilities_predator.dm +++ b/code/datums/extensions/abilities/abilities_predator.dm @@ -1,11 +1,16 @@ /datum/ability_handler/predator + category_toggle_type = null var/max_dismember_size = MOB_SIZE_SMALL /datum/ability_handler/predator/can_do_melee_invocation(mob/user, atom/target) - return istype(user) && !user.incapacitated() && isatom(target) && target.Adjacent(user) + return ..() || (istype(user) && !user.incapacitated() && isatom(target) && target.Adjacent(user)) /datum/ability_handler/predator/do_melee_invocation(mob/user, atom/target) + . = ..() + if(.) + return + // Nibbles! if(user.check_intent(I_FLAG_HARM)) if(isliving(target)) diff --git a/code/datums/extensions/abilities/ability_button.dm b/code/datums/extensions/abilities/ability_button.dm new file mode 100644 index 000000000000..5ab2d44e66b8 --- /dev/null +++ b/code/datums/extensions/abilities/ability_button.dm @@ -0,0 +1,108 @@ +/obj/screen/ability + requires_ui_style = FALSE + requires_owner = FALSE + icon_state = "ability" + icon = 'icons/mob/screen/abilities.dmi' + abstract_type = /obj/screen/ability + var/datum/ability_handler/owning_handler + +/obj/screen/ability/Destroy() + remove_from_handler() + return ..() + +/obj/screen/ability/proc/remove_from_handler() + owning_handler = null + +/obj/screen/ability/on_update_icon() + invisibility = (isnull(owning_handler) || owning_handler.showing_abilities) ? 0 : INVISIBILITY_ABSTRACT + +/obj/screen/ability/handle_click(mob/user, params) + to_chat(user, "Click!") + +/obj/screen/ability/button + icon_state = "button" + requires_owner = TRUE + maptext_y = -3 + var/decl/ability/ability + +/obj/screen/ability/button/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() + START_PROCESSING(SSfastprocess, src) + on_update_icon() + +/obj/screen/ability/button/Destroy() + if(is_processing) + STOP_PROCESSING(SSfastprocess, src) + return ..() + +/obj/screen/ability/button/Process() + // We've been broken or deleted. + if(QDELETED(src) || !ability || !owning_handler) + return PROCESS_KILL + // No reason to run periodic updates. + if(!ability.ability_cooldown_time && !ability.max_charge) + return PROCESS_KILL + // Something is broken. + var/list/metadata = owning_handler.get_metadata(ability.type, create_if_missing = FALSE) + if(!metadata) + return PROCESS_KILL + maptext = "" + if(ability.ability_cooldown_time) + var/next_cast = metadata["next_cast"] + if(world.time < next_cast) + maptext = ticks2shortreadable(next_cast - world.time) + if(ability.max_charge) + maptext += "
" + if(ability.max_charge) + maptext += "x[max(0, metadata["charges"])]" + if(maptext) + maptext = STYLE_SMALLFONTS_OUTLINE("
[maptext]
", 7, COLOR_WHITE, COLOR_BLACK) + +/obj/screen/ability/button/remove_from_handler() + owning_handler?.remove_screen_element(src, ability) + return ..() + +/obj/screen/ability/button/handle_click(mob/user, params) + if(owning_handler.prepared_ability == ability) + owning_handler.cancel_prepared_ability() + else if(ability.use_ability(user, get_turf(user), owning_handler)) // tmp, needs better/multi-step target selection + update_icon() + addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_icon)), ability.get_cooldown_time(ability.get_metadata_for_user(user)) + 1) + +/obj/screen/ability/button/proc/set_ability(decl/ability/_ability) + if(ability == _ability) + return + ability = _ability + if(istype(ability)) + SetName(ability.name) + else + SetName(initial(name)) + update_icon() + +/obj/screen/ability/button/on_update_icon() + . = ..() + icon_state = initial(icon_state) + cut_overlays() + if(istype(ability)) + if(owning_handler && owning_handler.prepared_ability == ability) + icon_state = "[icon_state]-active" + if(ability.ability_icon && ability.ability_icon_state) + add_overlay(overlay_image(ability.ability_icon, ability.ability_icon_state, COLOR_WHITE, (RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM))) + +/obj/screen/ability/category + name = "Toggle Ability Category" + icon_state = "category" + +/obj/screen/ability/category/remove_from_handler() + owning_handler?.remove_screen_element(src, "toggle") + return ..() + +/obj/screen/ability/category/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) + . = ..() + update_icon() + +/obj/screen/ability/category/handle_click(mob/user, params) + owning_handler?.toggle_category_visibility() + +/obj/screen/ability/category/on_update_icon() + icon_state = owning_handler?.showing_abilities ? initial(icon_state) : "[initial(icon_state)]-off" diff --git a/code/datums/extensions/abilities/ability_decl.dm b/code/datums/extensions/abilities/ability_decl.dm new file mode 100644 index 000000000000..9f271846750d --- /dev/null +++ b/code/datums/extensions/abilities/ability_decl.dm @@ -0,0 +1,410 @@ +/decl/ability + abstract_type = /decl/ability + /// A descriptive identifier string. + var/name + /// A descriptive string about the ability. + var/desc + /// An associated handler type, used in add_ability(). + var/associated_handler_type + /// Should this ability be copied between mobs when mind is transferred? + var/copy_with_mind = FALSE + + /// If TRUE, ability is toggled on and will fire when a target is clicked, instead of instantaneously on use. + var/prep_cast = FALSE + /// Used in conjunction with prep_cast, if TRUE, ability will be untoggled after cast. + var/end_prep_on_cast = TRUE + /// Ability items invoking this ability will GC afterwards. + var/item_end_on_cast = TRUE + + /// Does this invocation trigger on a proximity click, if prepared? + var/is_melee_invocation = FALSE + /// Does this invocation trigger on a non-proximity click, if prepared? + var/is_ranged_invocation = FALSE + + // Projectile created and used to propagate this ability, if it is a ranged ability. + /// If set, this ability will create a projectile rather than applying the effect directly. + var/projectile_type + /// Sets the projectile step_delay. + var/projectile_step_delay = 1 + /// Determines the lifetime of the projectile. + var/projectile_duration = 1 SECOND + /// If not set, the ability will have documentation generated for the codex. + var/hidden_from_codex = FALSE + /// If set, this ability will be silenced by null rod and similar mechanics. + var/is_supernatural = FALSE + + // Visual/audible state for the on-turf effect of casting the spell on something. + /// If set, will attempt to draw from this icon on the turf where the ability is used. + var/overlay_icon + /// If set, will attempt to draw this icon_state on the turf where the ability is used. + var/overlay_icon_state + /// Will delete the overlay after this time. + var/overlay_lifespan = 1 SECOND + /// If set, will play a sound when used. + var/use_sound + /// Volume for above. + var/use_sound_volume = 50 + + // Visual state for the ability HUD element. + /// Type of button to use for the UI. Should be /obj/screen/ability/button or subtype. + var/ui_element_type = /obj/screen/ability/button + /// Icon to draw on the ability HUD, if any. + var/ability_icon + /// Icon state to draw on the ability HUD, if any. + var/ability_icon_state + + // Various restrictions on how and when the ability is used. + /// A decl type that handles retrieving and validating targets. + var/decl/ability_targeting/target_selector = /decl/ability_targeting + /// If set to a numeric value, the ability cannot be used before the cooldown has expired. + var/ability_cooldown_time = 5 SECONDS + /// If set, a do_after() will be applied to this spell. + var/ability_use_channel + /// Maximum charges that can be held of this item at a time. If unset, item does not accumulate charges. + var/max_charge + /// How long it takes between charges. + var/charge_delay = 1 SECOND + /// What flags to check before an ability can be used, if any. + var/check_incapacitated = (INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT) + /// What type of mob is required to use this ability. + var/mob/expected_mob_type = /mob/living + /// If set, this ability can only be used while standing on a turf (not in an atom's contents or null loc). + var/requires_turf = TRUE + /// If set, this ability cannot be used on the admin z-level. + var/admin_blocked = TRUE + + // Various failure messages. + /// Failed due to purged/null rod. + var/cast_failed_purged_str = "Another power interferes with your own!" + /// Failed due to non-turf loc. + var/cast_failed_no_turf = "You must be standing on solid ground to use this ability." + /// Failed due to being on admin level + var/cast_failed_no_admin_level = "This ability cannot be used on the admin z-level." + /// Failed due to being invalid mob type + var/cast_failed_wrong_mob_type = "This ability may only be used by living creature." + /// Failed due to being downed/buckled + var/cast_failed_incapacitated = "You are in no state to use that ability." + /// Failed due to still being on cooldown from last use + var/cast_failed_on_cooldown = "You cannot use that ability again just yet." + /// Failed due to still recharging + var/cast_failed_no_charges = "You are out of charges for that ability." + /// Failed due to being silenced/disabled + var/cast_failed_disabled_str = "You are unable to use that ability for another $TIME$!" + + // Various casting messages. + /// "$USER$ begins preparing to use an ability on $TARGET$." + var/prepare_message_3p_str + /// "You begin preparing to use an ability on $TARGET$." + var/prepare_message_1p_str + /// "$USER$ uses an ability." + var/cast_message_3p_str + /// "You use an ability." + var/cast_message_1p_str + /// "You ready yourself to use an ability." + var/ready_ability_1p_str + /// "You cease readying yourself to use an ability." + var/cancel_ability_1p_str + /// "You fail to cast an ability." + var/fail_cast_1p_str + +/decl/ability/Initialize() + target_selector = GET_DECL(target_selector) + . = ..() + +/decl/ability/validate() + . = ..() + if(!istype(target_selector, /decl/ability_targeting)) + . += "null or invalid target_selector: '[target_selector || "NULL"]'" + if(!findtext(cast_failed_disabled_str, "$TIME$")) + . += "missing $TIME$ token in cast_failed_disabled_str" + if(!ispath(associated_handler_type, /datum/ability_handler)) + . += "null or invalid associated_handler_type '[associated_handler_type]'" + if(!ability_icon) + . += "null ability_icon" + else if(!istext(ability_icon_state)) + . += "null or non-text ability_icon_state" + else if(!check_state_in_icon(ability_icon_state, ability_icon)) + . += "missing ability_icon_state '[ability_icon_state]' in icon '[ability_icon]'" + +/decl/ability/proc/get_cooldown_time(list/metadata) + return ability_cooldown_time + +/decl/ability/proc/has_valid_targets(user, atom/target, list/metadata) + // Projectiles just need something to shoot at. + if(projectile_type) + return isturf(target) || isturf(target.loc) + // Abilities need at least one valid target. + return target_selector.validate_initial_target(user, target, metadata, src) + +/decl/ability/proc/get_metadata_for(mob/user) + if(!istype(user)) + CRASH("get_metadata_for() called with null or invalid user!") + var/datum/ability_handler/handler = user.get_ability_handler(associated_handler_type, create_if_missing = FALSE) + if(istype(handler)) + . = handler.get_metadata(src) + if(!islist(.)) + PRINT_STACK_TRACE("get_metadata_for() returning null or non-list metadata!") + else + PRINT_STACK_TRACE("get_metadata_for() called by mob with no handler of associated type!") + +// This is the main entrypoint for the ability use chain. +/decl/ability/proc/use_ability(mob/user, atom/target, datum/ability_handler/handler) + + if(!istype(user)) + return + + var/list/metadata = get_metadata_for(user) + if(!islist(metadata) || !can_use_ability(user, metadata)) + return + + if(prep_cast && handler.prepared_ability != src) + handler.prepare_ability(src) + return + + // Resolve our clicked target to the appropriate turf. + target = target_selector.resolve_initial_target(target) + if(!istype(target)) + to_chat(user, SPAN_WARNING("You cannot see a target for [name].")) + return + + if(!has_valid_targets(user, target, metadata)) + to_chat(user, SPAN_WARNING("You cannot use [name] on \the [target].")) + return + + if(!prepare_to_cast(user, target, metadata, handler)) + if(fail_cast_1p_str) + to_chat(user, SPAN_WARNING(capitalize(emote_replace_user_tokens(fail_cast_1p_str, user)))) + return + + if(projectile_type) + // Fire a projectile if that is how this ability works. + fire_projectile_at(user, target, metadata) + + else + // Otherwise, just apply to the target directly. + apply_effect(user, target, metadata) + + if(end_prep_on_cast && handler.prepared_ability == src) + handler.cancel_prepared_ability() + +/decl/ability/proc/fire_projectile_at(mob/user, atom/target, list/metadata) + var/obj/item/projectile/projectile = new projectile_type(get_turf(user)) + if(istype(projectile, /obj/item/projectile/ability)) + var/obj/item/projectile/ability/ability_projectile = projectile + ability_projectile.owner = user + ability_projectile.ability_metadata = metadata + ability_projectile.carried_ability = src + projectile.original = target + projectile.starting = get_turf(user) + projectile.shot_from = user + projectile.current = projectile.original + projectile.yo = target.y - user.y + projectile.xo = target.x - user.x + projectile.life_span = projectile_duration + projectile.hitscan = !projectile_step_delay + projectile.step_delay = projectile_step_delay + projectile.launch(target) + return projectile + +/decl/ability/proc/show_cast_channel_msg(mob/user, atom/target, list/metadata) + if(prepare_message_3p_str && prepare_message_1p_str) + user.visible_message( + SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(prepare_message_3p_str, user), target))), + SPAN_NOTICE(capitalize(emote_replace_target_tokens(prepare_message_1p_str, target))) + ) + else if(prepare_message_1p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(prepare_message_1p_str, target)))) + else if(prepare_message_3p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(prepare_message_3p_str, user), target)))) + +/decl/ability/proc/show_ability_cast_msg(mob/user, list/targets, list/metadata) + var/atom/target = targets[1] + if(cast_message_3p_str && cast_message_1p_str) + user.visible_message( + SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(cast_message_3p_str, user), target))), + SPAN_NOTICE(capitalize(emote_replace_target_tokens(cast_message_1p_str, target))) + ) + else if(cast_message_1p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(cast_message_1p_str, target)))) + else if(cast_message_3p_str) + user.visible_message(SPAN_NOTICE(capitalize(emote_replace_target_tokens(emote_replace_user_tokens(cast_message_3p_str, user), target)))) + +/decl/ability/proc/prepare_to_cast(mob/user, atom/target, list/metadata, datum/ability_handler/handler) + var/use_cooldown_time = get_cooldown_time(metadata) + if(ability_use_channel) + if(world.time < handler.next_channel) + return FALSE + handler.next_channel = world.time + ability_use_channel + show_cast_channel_msg(user, target, metadata) + if(!do_after(user, ability_use_channel, target) || !can_use_ability(user, metadata)) + handler.next_channel = 0 // Don't make them sit out the entire channel period, it's just a debounce/duplicate ability preventative + return FALSE + if(use_cooldown_time > 0) + metadata["next_cast"] = world.time + use_cooldown_time + return TRUE + +/decl/ability/proc/check_equipment(mob/user, list/metadata, silent = FALSE) + return TRUE + +/decl/ability/proc/get_metadata_for_user(mob/user) + if(!user.has_ability(type)) + return null + + var/datum/ability_handler/handler = user.get_ability_handler(associated_handler_type, create_if_missing = FALSE) + if(!istype(handler)) + CRASH("get_metadata_for_user() called by mob with no handler of associated type!") + + return handler.get_metadata(src) + +/decl/ability/proc/can_use_ability(mob/user, list/metadata, silent = FALSE) + + if(!user.has_ability(type)) + error("\The [user] utilized the ability '[type]' without having access to it.") + if(!silent) + to_chat(user, SPAN_WARNING("You shouldn't have this ability! Please notify a developer or raise an issue ticket.")) + return FALSE + + var/turf/my_turf = get_turf(user) + if(requires_turf) + if(!istype(my_turf)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_no_turf)) + return FALSE + if(admin_blocked && isAdminLevel(my_turf.z)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_no_admin_level)) + return FALSE + + if(!istype(user, expected_mob_type)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_wrong_mob_type)) + return FALSE + + if(!isnull(check_incapacitated) && user.incapacitated(check_incapacitated)) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_incapacitated)) + return FALSE + + if(!check_equipment(user, metadata, silent)) + return FALSE + + if(ability_cooldown_time && world.time < metadata["next_cast"]) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_on_cooldown)) + return FALSE + + if(max_charge && metadata["charges"] <= 0) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_no_charges)) + return FALSE + + if(is_supernatural) + + var/is_purged = FALSE + if(isanimal(user)) + var/mob/living/simple_animal/critter = user + is_purged = !!critter.purge + + if(!is_purged) + for(var/turf/turf in range(user, 1)) + if(turf.is_purged()) + is_purged = TRUE + break + + if(is_purged) + if(!silent) + to_chat(user, SPAN_WARNING(cast_failed_purged_str)) + return FALSE + + var/disabled_time = metadata["disabled"] + if(world.time < disabled_time) + if(!silent) + var/remaining_time = ceil((disabled_time - world.time) / 10) + to_chat(user, SPAN_WARNING(replacetext(cast_failed_disabled_str, "$TIME$", "[remaining_time] second\s"))) + return FALSE + + return TRUE + +/decl/ability/proc/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + SHOULD_CALL_PARENT(TRUE) + if(use_sound) + playsound(get_turf(user), use_sound, use_sound_volume, 1) + if(istype(projectile)) + projectile.expended = TRUE + + admin_attacker_log(user, "attempted to use ability [src] on [hit_target]") + + var/list/targets = target_selector.get_affected(user, hit_target, metadata, src, projectile) + if(length(targets)) + show_ability_cast_msg(user, targets, metadata) + while(length(targets)) + var/target = targets[1] + apply_effect_to(user, target, metadata) + targets = prune_targets(user, target, targets, metadata) + finish_casting(user, hit_target, metadata) + +/decl/ability/proc/finish_casting(mob/user, atom/hit_target, list/metadata) + return + +/decl/ability/proc/prune_targets(user, previous_target, list/targets, list/metadata) + if(!length(targets)) + return null + if(previous_target) + LAZYREMOVE(targets, previous_target) + return targets + +/decl/ability/proc/apply_visuals(mob/user, atom/target, list/metadata) + if(!overlay_icon || !overlay_lifespan) + return + var/turf/overlay_loc = get_turf(target) + if(!isturf(overlay_loc) || locate(/obj/effect/overlay) in overlay_loc) + return + var/obj/effect/overlay/ability_overlay = new(overlay_loc) + ability_overlay.icon = overlay_icon + ability_overlay.icon_state = overlay_icon_state + ability_overlay.anchored = TRUE + ability_overlay.set_density(FALSE) + QDEL_IN(ability_overlay, overlay_lifespan) + +/decl/ability/proc/apply_effect_to(mob/user, atom/target, list/metadata) + SHOULD_CALL_PARENT(TRUE) + SHOULD_NOT_SLEEP(TRUE) + apply_visuals(user, target, metadata) + +/decl/ability/proc/get_default_metadata() + . = list() + if(ability_cooldown_time) + .["next_cast"] = 0 + if(max_charge) + .["charges"] = max_charge + .["next_charge"] = 0 + +/decl/ability/proc/recharge(mob/owner, list/metadata) + if(max_charge <= 0 || metadata["charges"] >= max_charge) + return FALSE + if(world.time < metadata["next_charge"]) + return TRUE + metadata["next_charge"] = world.time + charge_delay + metadata["charges"]++ + return TRUE + +/decl/ability/proc/get_stat_strings(list/metadata) + var/use_name = metadata["ability_name"] || name + if(ability_cooldown_time) + var/on_cooldown = metadata["next_cast"] - world.time + if(on_cooldown > 0) + return list( + use_name, + "[ceil(on_cooldown/10)]s" + ) + if(max_charge) + return list( + use_name, + "[metadata["charges"]]/[max_charge]" + ) + +/decl/ability/ranged + abstract_type = /decl/ability/ranged + projectile_type = /obj/item/projectile/ability + is_ranged_invocation = TRUE + prep_cast = TRUE \ No newline at end of file diff --git a/code/datums/extensions/abilities/ability_handler.dm b/code/datums/extensions/abilities/ability_handler.dm index 8dc7ee1e5de6..d215868a4c58 100644 --- a/code/datums/extensions/abilities/ability_handler.dm +++ b/code/datums/extensions/abilities/ability_handler.dm @@ -1,8 +1,17 @@ /datum/ability_handler abstract_type = /datum/ability_handler + var/showing_abilities = FALSE var/mob/owner - var/list/ability_items var/datum/extension/abilities/master + var/list/ability_items + var/list/screen_elements + var/list/known_abilities + var/list/recharging_abilities + var/stat_panel_type = "Abilities" + /// UI element for showing or hiding this ability category. Should be /obj/screen/ability/category or subtype. + var/category_toggle_type = /obj/screen/ability/category + var/decl/ability/prepared_ability + var/next_channel = 0 /datum/ability_handler/New(_master) master = _master @@ -12,16 +21,179 @@ if(!istype(owner)) CRASH("Ability handler received invalid owner!") ..() + refresh_login() + +/datum/ability_handler/Process() + + if(!length(recharging_abilities)) + return PROCESS_KILL + + for(var/decl/ability/ability as anything in recharging_abilities) + if(!ability.recharge(owner, get_metadata(ability))) + LAZYREMOVE(recharging_abilities, ability) + +/datum/ability_handler/proc/get_metadata(decl/ability/ability, create_if_missing = TRUE) + if(istype(ability)) + . = known_abilities[ability.type] + if(!islist(.) && create_if_missing) + . = ability.get_default_metadata() + known_abilities[ability.type] = . + else if(ispath(ability, /decl/ability)) + . = known_abilities[ability] + if(!islist(.) && create_if_missing) + ability = GET_DECL(ability) + if(!istype(ability)) + return list() + . = ability.get_default_metadata() + known_abilities[ability] = . + else if(create_if_missing) + PRINT_STACK_TRACE("ability metadata retrieval passed invalid ability type: '[ability]'") + . = list() /datum/ability_handler/Destroy() + recharging_abilities = null + known_abilities = null QDEL_NULL_LIST(ability_items) + + for(var/ability in screen_elements) + var/obj/element = screen_elements[ability] + if(istype(element)) + qdel(element) + screen_elements = null + if(master) LAZYREMOVE(master.ability_handlers, src) master.update() master = null owner = null + if(is_processing) + STOP_PROCESSING(SSprocessing, src) return ..() +/datum/ability_handler/proc/add_ability(ability_type, list/metadata) + if(provides_ability(ability_type)) + return FALSE + var/decl/ability/ability = GET_DECL(ability_type) + if(!istype(ability)) + return FALSE + if(islist(metadata)) + metadata = metadata.Copy() // Prevent mutating during copy from other mobs. + else + metadata = ability.get_default_metadata() // Always unique, no copy needed. + + if(ability.ui_element_type && !istype(LAZYACCESS(screen_elements, ability), ability.ui_element_type)) + var/existing = screen_elements[ability] + if(existing) + remove_screen_element(existing, ability, FALSE) + var/obj/screen/ability/button/button = new ability.ui_element_type(null, owner, null, null, null, null, null) + button.set_ability(ability) + add_screen_element(button, ability, TRUE) + + LAZYSET(known_abilities, ability_type, metadata) + if(ability.max_charge) + LAZYDISTINCTADD(recharging_abilities, ability_type) + if(!is_processing) + START_PROCESSING(SSprocessing, src) + return TRUE + +/datum/ability_handler/proc/remove_ability(ability_type) + if(!provides_ability(ability_type)) + return FALSE + LAZYREMOVE(known_abilities, ability_type) + LAZYREMOVE(recharging_abilities, ability_type) + + var/decl/ability/ability = GET_DECL(ability_type) + if(ability?.ui_element_type) + var/obj/screen/existing_button = LAZYACCESS(screen_elements, ability) + if(istype(existing_button)) + remove_screen_element(existing_button, ability) + + if(!LAZYLEN(recharging_abilities) && is_processing) + STOP_PROCESSING(SSprocessing, src) + + if(!LAZYLEN(known_abilities)) + owner.remove_ability_handler(type) + + return TRUE + +/datum/ability_handler/proc/provides_ability(ability_type) + return (ability_type in known_abilities) + +/datum/ability_handler/proc/finalize_ability_handler() + if(category_toggle_type) + var/obj/screen/ability/category/category_toggle = new category_toggle_type(null, null, null, null, null, null, null) + add_screen_element(category_toggle, "toggle", TRUE) + toggle_category_visibility(TRUE) + +/datum/ability_handler/proc/refresh_element_positioning(row = 1, col = 1) + if(!LAZYLEN(screen_elements)) + return 0 + var/button_pos = col + var/button_row = row + . = 1 + for(var/ability in screen_elements) + var/obj/screen/element = screen_elements[ability] + if(istype(element, /obj/screen/ability/category)) + element.screen_loc = "RIGHT-[col]:-4,TOP-[row]" + else if(!element.invisibility) + button_pos++ + if((button_pos-col) > 5) + button_row++ + .++ + button_pos = col+1 + element.screen_loc = "RIGHT-[button_pos]:-4,TOP-[button_row]" + +/datum/ability_handler/proc/toggle_category_visibility(force_state) + showing_abilities = isnull(force_state) ? !showing_abilities : force_state + update_screen_elements() + if(master) + master.refresh_element_positioning() + +/datum/ability_handler/proc/update_screen_elements() + for(var/ability in screen_elements) + var/obj/screen/ability/ability_button = screen_elements[ability] + ability_button.update_icon() + +/datum/ability_handler/proc/copy_abilities_to(mob/living/target) + for(var/decl/ability/ability as anything in known_abilities) + if(!ability.copy_with_mind) + continue + if(target.add_ability(ability, get_metadata(ability, create_if_missing = FALSE))) + . = TRUE + +/datum/ability_handler/proc/disable_abilities(amount) + for(var/ability in known_abilities) + var/list/metadata = get_metadata(ability) + metadata["disabled"] = max(metadata["disabled"], (world.time + amount)) + +/datum/ability_handler/proc/enable_abilities(amount) + for(var/ability in known_abilities) + var/list/metadata = get_metadata(ability) + metadata["disabled"] = 0 + +/datum/ability_handler/proc/add_screen_element(atom/element, decl/ability/ability, update_positions = TRUE) + if(isnull(ability) || isnum(ability)) + return + LAZYSET(screen_elements, ability, element) + owner?.client?.screen |= element + if(istype(element, /obj/screen/ability)) + var/obj/screen/ability/ability_button = element + ability_button.owning_handler = src + if(update_positions && master && length(screen_elements)) + master.refresh_element_positioning() + +/datum/ability_handler/proc/remove_screen_element(atom/element, decl/ability/ability, update_positions = TRUE) + if(isnull(ability) || isnum(ability)) + return + LAZYREMOVE(screen_elements, ability) + owner?.client?.screen -= element + if(istype(element, /obj/screen/ability)) + var/obj/screen/ability/ability_button = element + if(ability_button.owning_handler == src) + ability_button.owning_handler = null + if(update_positions && master && LAZYLEN(screen_elements)) + master.refresh_element_positioning() + /datum/ability_handler/proc/cancel() if(LAZYLEN(ability_items)) for(var/thing in ability_items) @@ -29,9 +201,48 @@ qdel(thing) ability_items = null +/datum/ability_handler/proc/show_stat_string(mob/user) + if(!stat_panel_type || !statpanel(stat_panel_type)) + return + for(var/ability_type in known_abilities) + var/decl/ability/ability = GET_DECL(ability_type) + var/list/stat_strings = ability.get_stat_strings(get_metadata(ability)) + if(length(stat_strings) >= 2) + stat(stat_strings[1], stat_strings[2]) + /// Individual ability methods/disciplines (psioncs, etc.) so that mobs can have multiple. /datum/ability_handler/proc/refresh_login() - return + SHOULD_CALL_PARENT(TRUE) + if(LAZYLEN(screen_elements)) + var/list/add_elements = list() + for(var/ability in screen_elements) + var/atom/element = screen_elements[ability] + if(istype(element)) + add_elements |= element + if(length(add_elements)) + owner?.client?.screen |= add_elements + +/datum/ability_handler/proc/cancel_prepared_ability() + if(!prepared_ability) + return FALSE + if(prepared_ability.cancel_ability_1p_str) + to_chat(owner, capitalize(emote_replace_user_tokens(prepared_ability.cancel_ability_1p_str), owner)) + var/obj/screen/ability/button/button = LAZYACCESS(screen_elements, prepared_ability) + prepared_ability = null + if(istype(button)) + button.update_icon() + return TRUE + +/datum/ability_handler/proc/prepare_ability(decl/ability/ability) + if(prepared_ability && !cancel_prepared_ability()) + return FALSE + prepared_ability = ability + if(ability.ready_ability_1p_str) + to_chat(owner, capitalize(emote_replace_user_tokens(ability.ready_ability_1p_str), owner)) + var/obj/screen/ability/button/button = LAZYACCESS(screen_elements, ability) + if(istype(button)) + button.update_icon() + return TRUE /datum/ability_handler/proc/can_do_self_invocation(mob/user) return FALSE @@ -46,13 +257,23 @@ return FALSE /datum/ability_handler/proc/can_do_melee_invocation(mob/user, atom/target) - return FALSE + SHOULD_CALL_PARENT(TRUE) + return prepared_ability ? prepared_ability.is_melee_invocation : FALSE /datum/ability_handler/proc/do_melee_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(TRUE) + if(prepared_ability) + prepared_ability.use_ability(user, target, src) + return TRUE return FALSE /datum/ability_handler/proc/can_do_ranged_invocation(mob/user, atom/target) - return FALSE + SHOULD_CALL_PARENT(TRUE) + return prepared_ability ? prepared_ability.is_ranged_invocation : FALSE /datum/ability_handler/proc/do_ranged_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(TRUE) + if(prepared_ability) + prepared_ability.use_ability(user, target, src) + return TRUE return FALSE diff --git a/code/datums/extensions/abilities/ability_item.dm b/code/datums/extensions/abilities/ability_item.dm index 98bb2b8d43be..b4838fd41458 100644 --- a/code/datums/extensions/abilities/ability_item.dm +++ b/code/datums/extensions/abilities/ability_item.dm @@ -1,26 +1,37 @@ /obj/item/ability - simulated = 1 - obj_flags = OBJ_FLAG_NO_STORAGE - anchored = TRUE + simulated = FALSE + icon = 'icons/mob/screen/ability_inhand.dmi' + obj_flags = OBJ_FLAG_NO_STORAGE + anchored = TRUE pickup_sound = null drop_sound = null equip_sound = null is_spawnable_type = FALSE abstract_type = /obj/item/ability - var/mob/living/owner + var/decl/ability/ability + var/weakref/owner_ref var/handler_type -/obj/item/ability/Initialize() - owner = loc - if(!istype(owner)) +/obj/item/ability/Initialize(ml, decl/ability/_ability) + var/mob/living/owner = loc + var/datum/ability_handler/handler = istype(owner) && owner.get_ability_handler(handler_type, FALSE) + if(!istype(handler)) return INITIALIZE_HINT_QDEL - return ..() + if(_ability) + ability = _ability + if(!istype(ability)) + return INITIALIZE_HINT_QDEL + owner_ref = weakref(owner) + LAZYDISTINCTADD(handler.ability_items, src) + . = ..() + owner.put_in_hands(src) /obj/item/ability/Destroy() + var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/handler = istype(owner) && owner.get_ability_handler(handler_type, FALSE) - if(handler) + if(istype(handler)) LAZYREMOVE(handler.ability_items, src) - . = ..() + return ..() /obj/item/ability/dropped() ..() @@ -29,3 +40,23 @@ /obj/item/ability/attack_self(var/mob/user) user?.drop_from_inventory(src) return TRUE + +/obj/item/ability/use_on_mob(mob/living/target, mob/living/user, animate) + return FALSE + +/obj/item/ability/afterattack(atom/target, mob/user, proximity) + if(QDELETED(src) || !istype(ability)) + return TRUE + var/list/metadata = ability.get_metadata_for(user) + if(!islist(metadata)) + return TRUE + if(ability.projectile_type) + // Fire a projectile if that is how this ability works. + ability.fire_projectile_at(user, target, metadata) + else + // Otherwise, apply to the target. Range checking etc. will be handled in apply_effect(). + ability.apply_effect(user, target, metadata) + + // Clean up our item if needed. + if(ability.item_end_on_cast) + qdel(src) diff --git a/code/datums/extensions/abilities/ability_projectile.dm b/code/datums/extensions/abilities/ability_projectile.dm new file mode 100644 index 000000000000..896acba2e95a --- /dev/null +++ b/code/datums/extensions/abilities/ability_projectile.dm @@ -0,0 +1,31 @@ +/obj/item/projectile/ability + name = "ability" + // The projectile is functionally a tracer, the ability deals the damage. + nodamage = TRUE + penetrating = FALSE + + /// Default; can be set by the ability. + life_span = 1 SECOND + + var/expended = FALSE + var/mob/owner + var/list/ability_metadata + var/decl/ability/carried_ability + +/obj/item/projectile/ability/Destroy() + owner = null + carried_ability = null + return ..() + +/obj/item/projectile/ability/explosion_act() + SHOULD_CALL_PARENT(FALSE) + +/obj/item/projectile/ability/Bump(var/atom/A, forced=0) + if(loc && carried_ability && !expended) + carried_ability.apply_effect(owner, A, ability_metadata, src) + return TRUE + +/obj/item/projectile/ability/on_impact(var/atom/A) + if(loc && carried_ability && !expended) + carried_ability.apply_effect(owner, A, ability_metadata, src) + return TRUE diff --git a/code/datums/extensions/abilities/ability_targeting.dm b/code/datums/extensions/abilities/ability_targeting.dm new file mode 100644 index 000000000000..52f7ee8166c5 --- /dev/null +++ b/code/datums/extensions/abilities/ability_targeting.dm @@ -0,0 +1,91 @@ +/decl/ability_targeting + abstract_type = /decl/ability_targeting + /// If set, this ability is applied to a square of this radius. + var/effect_radius = 0 + /// Set to except the inner space of the spell from target checks. + var/effect_inner_radius = -1 + /// If set, user will be excepted from targets. + var/user_is_immune = FALSE + /// If set, this ability will never target our faction. + var/faction_immune = FALSE + /// If set, this ability will only target our faction. + var/faction_only = FALSE + /// If set, this ability will resolve targets to turfs before doing any assessment or targetting. + var/target_turf = TRUE + /// If set along with target turf type, will include dense turfs. + var/ignore_dense_turfs = TRUE + /// If set along target turf type, will include space turfs. + var/ignore_space_turfs = FALSE + +/decl/ability_targeting/proc/get_effect_radius(mob/user, atom/hit_target, list/metadata) + return effect_radius + +/// This proc exists so that subtypes can override it and take advantage of the speed benefits of `for(var/mob in range())` and similar optimizations. +/// It should ONLY ever be called in get_affected(). +/decl/ability_targeting/proc/get_affected_atoms(atom/center, new_effect_radius) + PROTECTED_PROC(TRUE) + . = list() + for(var/atom/target in range(center, new_effect_radius)) + . += target + +/decl/ability_targeting/proc/get_affected(mob/user, atom/hit_target, list/metadata, decl/ability/ability, obj/item/projectile/ability/projectile) + if(effect_radius <= 0) + return validate_target(user, hit_target, metadata, ability) ? list(hit_target) : null + var/atom/center = projectile || hit_target + var/new_effect_radius = get_effect_radius(user, hit_target, metadata) + var/list/except_atoms = effect_inner_radius >= 0 ? range(effect_inner_radius, center) : null + var/list/target_candidates = get_affected_atoms(center, new_effect_radius) + for(var/atom/target in except_atoms ? target_candidates - except_atoms : target_candidates) // sloooooow... + if(validate_target(user, target, metadata, ability)) + LAZYADD(., target) + +/decl/ability_targeting/proc/resolve_initial_target(atom/target) + if(target_turf) + return get_turf(target) + return target + +/decl/ability_targeting/proc/validate_initial_target(mob/user, atom/target, list/metadata, decl/ability/ability) + return validate_target(user, target, metadata, ability) + +/decl/ability_targeting/proc/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + if(target == user && !user_is_immune) + return FALSE + if(target_turf && !isturf(target)) + return FALSE + if(user.faction) + if(faction_immune && ismob(target)) + var/mob/target_mob = target + if(target_mob.faction == user.faction) + return FALSE + if(faction_only) + if(!ismob(target)) + return FALSE + var/mob/target_mob = target + if(target_mob.faction != user.faction) + return FALSE + else if(faction_only) + return FALSE + if(isturf(target)) + if(ignore_dense_turfs && target.density) + return FALSE + if(ignore_space_turfs && istype(target, /turf/space)) + return FALSE + return TRUE + +/decl/ability_targeting/clear_turf + ignore_dense_turfs = TRUE + +/decl/ability_targeting/clear_turf/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + . = ..() && isturf(target) + if(.) + var/turf/target_turf = target + return !target_turf.contains_dense_objects(user) + +/decl/ability_targeting/living_mob + target_turf = FALSE + +/decl/ability_targeting/living_mob/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + . = ..() && isliving(target) + if(.) + var/mob/living/victim = target + return victim.simulated diff --git a/code/datums/extensions/abilities/readme.dm b/code/datums/extensions/abilities/readme.dm new file mode 100644 index 000000000000..b7e17f8d59e3 --- /dev/null +++ b/code/datums/extensions/abilities/readme.dm @@ -0,0 +1,26 @@ +/* + + ABILITY DECL SYSTEM NOTES + + - Mobs have an extension, /datum/extension/abilities + - This extension has a list of associated handlers, /datum/ability_handler + - The handlers have a list of associated ability decls, /decl/ability, which are indexes for associative metadata lists. + - The abilities have an associated targeting handler, /decl/ability_targeting, which handles single target, turf target, AOE, etc. + - Handlers are added/removed with mob.add_ability_handler(handler_type) and mob.remove_ability_handler(handler_type) + - The extension will be added to the mob automatically when adding a handler, and removed if the last handler is removed. + - Abilities are added/removed with mob.add_ability(ability_type, preset metadata if any) and mob.remove_ability(ability_type) + - Handlers for abilities will be inferred from the /decl and added to the mob automatically. + - Metadata is retrieved with handler.get_metadata(ability type or instance) + + - Upon invocation, an ability will: + - retrieve handler and metadata from the user mob + - validate the handler/metadata/user against whatever requirements the ability has + - resolve the initial click target to the appropriate target for the ability (turf under the clicked target for example) + - check any additional requirements like charges, cooldowns, etc. + - if a projectile ability, spawn and launch a projectile that will carry the ability and metadata to the destination target. + - apply the ability to the destination target + - while applying the ability, the targeting decl will be used to grab all applicable targets at or near the point of use (projectile hit or clicked target) + - the ability effects will then get applied (fire, ice, explosion, so on) + - the ability will then set cooldown as appropriate in metadata, deduct charges, etc + +*/ \ No newline at end of file diff --git a/code/datums/mind/mind.dm b/code/datums/mind/mind.dm index cb9ad6c9539e..1db348880015 100644 --- a/code/datums/mind/mind.dm +++ b/code/datums/mind/mind.dm @@ -75,7 +75,6 @@ /datum/mind/proc/handle_mob_deletion(mob/living/deleted_mob) if (current == deleted_mob) current = null - /datum/mind/proc/transfer_to(mob/living/new_character) if(!istype(new_character)) to_world_log("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn") @@ -83,6 +82,8 @@ if(current?.mind == src) current.mind = null SSnano.user_transferred(current, new_character) // transfer active NanoUI instances to new user + if(istype(current)) // exclude new_players and observers + current.copy_abilities_to(new_character) if(new_character.mind) //remove any mind currently in our new body's mind variable new_character.mind.current = null @@ -91,9 +92,6 @@ current = new_character //link ourself to our new body new_character.mind = src //and link our new body to ourself - if(learned_spells && learned_spells.len) - restore_spells(new_character) - if(active) new_character.key = key //now transfer the key to link the client to our new body diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index dc389cb9dec3..e571411e9730 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -7,9 +7,9 @@ var/uses = 20 var/disabled = 1 var/locked = 1 - var/cooldown_time = 0 - var/cooldown_timeleft = 0 - var/cooldown_on = 0 + var/slip_cooldown_time = 0 + var/slip_cooldown_timeleft = 0 + var/slip_cooldown_on = 0 initial_access = list(access_ai_upload) /obj/machinery/ai_slipper/on_update_icon() @@ -52,13 +52,11 @@ if(!area || !isturf(loc)) return var/t = "AI Liquid Dispenser ([area.proper_name])
" - if(src.locked && (!issilicon(user))) t += "(Swipe ID card to unlock control panel.)
" else t += text("Dispenser [] -
[]?
\n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") t += text("Uses Left: [uses]. Activate the dispenser?
\n") - show_browser(user, t, "window=computer;size=575x450") onclose(user, "computer") @@ -74,30 +72,26 @@ update_icon() . = TOPIC_REFRESH if (href_list["toggleUse"]) - if(!(cooldown_on || disabled)) + if(!(slip_cooldown_on || disabled)) new /obj/effect/effect/foam(src.loc) src.uses-- - cooldown_on = 1 - cooldown_time = world.timeofday + 100 + slip_cooldown_on = 1 + slip_cooldown_time = world.timeofday + 100 slip_process() . = TOPIC_REFRESH - if(. == TOPIC_REFRESH) ui_interact(user) /obj/machinery/ai_slipper/proc/slip_process() - while(cooldown_time - world.timeofday > 0) - var/ticksleft = cooldown_time - world.timeofday - + while(slip_cooldown_time - world.timeofday > 0) + var/ticksleft = slip_cooldown_time - world.timeofday if(ticksleft > 1e5) - cooldown_time = world.timeofday + 10 // midnight rollover - - - cooldown_timeleft = (ticksleft / 10) + slip_cooldown_time = world.timeofday + 10 // midnight rollover + slip_cooldown_timeleft = (ticksleft / 10) sleep(5) if (uses <= 0) return if (uses >= 0) - cooldown_on = 0 + slip_cooldown_on = 0 src.power_change() return diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 4a78d796efd2..6ac93e8fee24 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -54,3 +54,13 @@ . = ..() pixel_x += rand(-10, 10) pixel_y += rand(-10, 10) + +/// Set and cleaned up by moving projectiles for the most part. +/obj/effect/overlay/projectile_trail + var/obj/item/projectile/master + +/obj/effect/overlay/projectile_trail/Destroy() + if(master) + LAZYREMOVE(master.proj_trails, src) + master = null + return ..() diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index 1945ad562018..243fe2bd7e88 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -34,8 +34,7 @@ return ..() /obj/item/nullrod/proc/holy_act(mob/living/target, mob/living/user) - if(target.mind && LAZYLEN(target.mind.learned_spells)) - target.silence_spells(30 SECONDS) + if(target.disable_abilities(30 SECONDS)) to_chat(target, SPAN_DANGER("You've been silenced!")) return TRUE return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 4bea938640e6..30e070676f19 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -395,11 +395,13 @@ L.Add(t) return L -/turf/proc/contains_dense_objects() +/turf/proc/contains_dense_objects(exceptions) if(density) return 1 for(var/atom/A in src) if(A.density && !(A.atom_flags & ATOM_FLAG_CHECKS_BORDER)) + if(exceptions && (exceptions == A || (A in exceptions))) + continue return 1 return 0 @@ -863,3 +865,5 @@ /turf/take_vaporized_reagent(reagent, amount) return assume_gas(reagent, round(amount / REAGENT_UNITS_PER_GAS_MOLE)) + +/turf/proc/is_purged() \ No newline at end of file diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index b93ccd2bde96..aba99df3baf1 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -883,16 +883,6 @@ var/global/list/admin_verbs_mod = list( log_and_message_admins("told everyone to man up and deal with it.") -/client/proc/give_spell(mob/T as mob in SSmobs.mob_list) // -- Urist - set category = "Fun" - set name = "Give Spell" - set desc = "Gives a spell to a mob." - var/spell/S = input("Choose the spell to give to that guy", "ABRAKADABRA") as null|anything in spells - if(!S) return - T.add_spell(new S) - SSstatistics.add_field_details("admin_verb","GS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - log_and_message_admins("gave [key_name(T)] the spell [S].") - /client/proc/change_lobby_screen() set name = "Lobby Screen: Change" set category = "Fun" diff --git a/code/modules/admin/view_variables/helpers.dm b/code/modules/admin/view_variables/helpers.dm index 8e30b30b4d7e..959b1b0c0119 100644 --- a/code/modules/admin/view_variables/helpers.dm +++ b/code/modules/admin/view_variables/helpers.dm @@ -37,7 +37,6 @@ return ..() + {" - @@ -50,6 +49,9 @@ + + + diff --git a/code/modules/admin/view_variables/topic.dm b/code/modules/admin/view_variables/topic.dm index f1118e682c96..09d5d1cc8c14 100644 --- a/code/modules/admin/view_variables/topic.dm +++ b/code/modules/admin/view_variables/topic.dm @@ -1,4 +1,3 @@ - /client/proc/view_var_Topic(href, href_list, hsrc) //This should all be moved over to datum/admins/Topic() or something ~Carn if( (usr.client != src) || !src.holder ) @@ -97,17 +96,6 @@ src.holder.show_player_panel(victim) href_list["datumrefresh"] = href_list["mob_player_panel"] - else if(href_list["give_spell"]) - if(!check_rights(R_ADMIN|R_FUN)) return - - var/mob/victim = locate(href_list["give_spell"]) - if(!istype(victim)) - to_chat(usr, "This can only be used on instances of type /mob") - return - - src.give_spell(victim) - href_list["datumrefresh"] = href_list["give_spell"] - else if(href_list["godmode"]) if(!check_rights(R_REJUVENATE)) return @@ -690,6 +678,33 @@ item.set_material(new_material.type) to_chat(usr, "Set material of [item] to [item.get_material()].") + else if(href_list["give_ability"]) + var/mob/target = locate(href_list["give_ability"]) + if(!istype(target) || QDELETED(target)) + to_chat(usr, "Mob no longer exists.") + else + var/list/abilities = decls_repository.get_decls_of_type_unassociated(/decl/ability) + abilities = abilities.Copy() + abilities -= target.get_all_abilities() + var/decl/ability/ability = input(usr, "Which ability do you wish to grant?", "Give Ability") as null|anything in abilities + if(istype(ability) && !QDELETED(usr) && !QDELETED(target)) + if(target.add_ability(ability.type)) + log_and_message_admins("has given [ability] to [key_name(target)].") + else + to_chat(usr, SPAN_WARNING("Failed to give [ability] to [target]!")) + + else if(href_list["remove_ability"]) + var/mob/target = locate(href_list["remove_ability"]) + if(!istype(target) || QDELETED(target)) + to_chat(usr, "Mob no longer exists.") + else + var/decl/ability/ability = input(usr, "Which ability do you wish to remove?", "Remove Ability") as null|anything in target.get_all_abilities() + if(istype(ability) && !QDELETED(usr) && !QDELETED(target)) + if(target.remove_ability(ability.type)) + log_and_message_admins("has removed [ability] from [key_name(target)].") + else + to_chat(usr, SPAN_WARNING("Failed to remove [ability] from [target]!")) + if(href_list["datumrefresh"]) var/datum/datum_to_refresh = locate(href_list["datumrefresh"]) if(istype(datum_to_refresh, /datum) || istype(datum_to_refresh, /client)) diff --git a/code/modules/codex/categories/category_phenomena.dm b/code/modules/codex/categories/category_phenomena.dm index f9777ed43fa8..e2637bf9e73d 100644 --- a/code/modules/codex/categories/category_phenomena.dm +++ b/code/modules/codex/categories/category_phenomena.dm @@ -4,16 +4,16 @@ /decl/codex_category/phenomena/Populate() - // This needs duplicate checking but I resent even having to spend time on spellcode. - var/list/spells = list() - for(var/thing in subtypesof(/spell)) - var/spell/spell = thing - if(!initial(spell.hidden_from_codex) && initial(spell.desc) && initial(spell.name)) - spells["[initial(spell.name)] (phenomena)"] = initial(spell.desc) - for(var/spell in spells) + var/list/abilities = list() + for(var/decl/ability/ability in decls_repository.get_decls_of_subtype_unassociated(/decl/ability)) + if(ability.hidden_from_codex || !ability.is_supernatural || !ability.desc) + continue + abilities["[ability.name] (phenomena)"] = ability.desc + + for(var/ability in abilities) var/datum/codex_entry/entry = new( - _display_name = spell, - _antag_text = spells[spell] + _display_name = ability, + _antag_text = abilities[ability] ) items |= entry.name . = ..() diff --git a/code/modules/emotes/emote_define.dm b/code/modules/emotes/emote_define.dm index 2a191251fa0c..0223e3f3185b 100644 --- a/code/modules/emotes/emote_define.dm +++ b/code/modules/emotes/emote_define.dm @@ -145,9 +145,7 @@ var/global/list/_emotes_by_key var/emote_string = all_strings[string_key] if(!length(emote_string)) continue - emote_string = emote_replace_target_tokens(emote_string, dummy_emote_target) - emote_string = emote_replace_user_tokens(emote_string, dummy_emote_user) - emote_string = uppertext(emote_string) + emote_string = uppertext(emote_replace_target_tokens(emote_replace_user_tokens(emote_string, dummy_emote_user), dummy_emote_target)) for(var/token in tokens) if(findtext(emote_string, token)) . += "malformed emote token [token] in [string_key]" diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index 7903631bb68a..a89cd0714795 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -113,11 +113,6 @@ update_action_buttons() update_mouse_pointer() - if(ability_master) - ability_master.update_abilities(TRUE, src) - ability_master.toggle_open(1) - ability_master.synch_spells_to_mind(mind) - if(get_preference_value(/datum/client_preference/show_status_markers) == PREF_SHOW) if(status_markers?.mob_image_personal) client.images |= status_markers.mob_image_personal diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 03827667a287..99c505013c3d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -17,8 +17,6 @@ QDEL_NULL(hud_used) if(active_storage) active_storage.close(src) - if(istype(ability_master)) - QDEL_NULL(ability_master) if(istype(skillset)) QDEL_NULL(skillset) QDEL_NULL_LIST(grabbed_by) @@ -57,7 +55,6 @@ QDEL_NULL_SCREEN(radio_use_icon) QDEL_NULL_SCREEN(gun_move_icon) QDEL_NULL_SCREEN(gun_setting_icon) - QDEL_NULL_SCREEN(ability_master) QDEL_NULL_SCREEN(zone_sel) /mob/Initialize() @@ -68,7 +65,6 @@ if(!istype(move_intent)) move_intent = GET_DECL(move_intent) . = ..() - ability_master = new(null, src) refresh_ai_handler() START_PROCESSING(SSmobs, src) @@ -242,8 +238,6 @@ SHOULD_NOT_SLEEP(TRUE) if(QDELETED(src)) return PROCESS_KILL - if(ability_master) - ability_master.update_spells(0) #define UNBUCKLED 0 #define PARTIALLY_BUCKLED 1 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 04318afb9719..ec19dd3daedb 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -60,7 +60,6 @@ var/obj/screen/gun/radio/radio_use_icon var/obj/screen/gun/move/gun_move_icon var/obj/screen/gun/mode/gun_setting_icon - var/obj/screen/ability_master/ability_master /*A bunch of this stuff really needs to go under their own defines instead of being globally attached to mob. A variable should only be globally attached to turfs/objects/whatever, when it is in fact needed as such. diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 21c411010778..92ddfd3f4cea 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -268,7 +268,7 @@ /mob/proc/set_move_intent(var/decl/move_intent/next_intent) if(next_intent && move_intent != next_intent && next_intent.can_be_used_by(src)) move_intent = next_intent - if(istype(hud_used)) + if(istype(hud_used) && hud_used.move_intent) hud_used.move_intent.icon_state = move_intent.hud_icon_state return TRUE return FALSE diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index 07ad3c6c6865..152cb7a6ab55 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -14,6 +14,18 @@ is_spawnable_type = FALSE atom_damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE, ELECTROCUTE are the only things that should be in here, Try not to use PAIN as it doesn't go through stun_effect_act + // Code for handling tails, if any. + /// If the projectile leaves a trail. + var/proj_trail = FALSE + /// How long the trail lasts. + var/proj_trail_lifespan = 0 + /// What icon to use for the projectile trail. + var/proj_trail_icon = 'icons/effects/projectiles/trail.dmi' + /// What icon_state to use for the projectile trail. + var/proj_trail_icon_state = "trail" + /// Any extant trail effects. + var/list/proj_trails + var/bumped = 0 //Prevents it from hitting more than one guy at once var/def_zone = "" //Aiming at var/atom/movable/firer = null//Who shot it @@ -316,7 +328,15 @@ return /obj/item/projectile/proc/before_move() - return + if(!proj_trail || !isturf(loc) || !proj_trail_icon || !proj_trail_icon_state || !proj_trail_lifespan) + return + var/obj/effect/overlay/projectile_trail/trail = new(loc) + trail.master = src + trail.icon = proj_trail_icon + trail.icon_state = proj_trail_icon_state + trail.set_density(FALSE) + LAZYADD(proj_trails, trail) + QDEL_IN(trail, proj_trail_lifespan) /obj/item/projectile/proc/after_move() if(hitscan && tracer_type && !(locate(/obj/effect/projectile) in loc)) @@ -609,6 +629,7 @@ trajectory.initialize_location(target.x, target.y, target.z, 0, 0) /obj/item/projectile/Destroy() + QDEL_NULL_LIST(proj_trails) if(hitscan) if(loc && trajectory) var/datum/point/pcache = trajectory.copy_to() @@ -650,4 +671,4 @@ QDEL_NULL(beam_index) /obj/item/projectile/proc/update_effect(var/obj/effect/projectile/effect) - return \ No newline at end of file + return diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 8e241456d22b..ff77df0fa33d 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -55,12 +55,9 @@ var/mob/living/new_mob = apply_transformation(M, choice) if(new_mob) new_mob.set_intent(I_FLAG_HARM) - if(M.mind) - for (var/spell/S in M.mind.learned_spells) - new_mob.add_spell(new S.type) - new_mob.set_intent(I_FLAG_HARM) - transfer_key_from_mob_to_mob(M, new_mob) - to_chat(new_mob, "Your form morphs into that of \a [choice].") + new_mob.copy_abilities_from(M) + transfer_key_from_mob_to_mob(M, new_mob) + to_chat(new_mob, "Your form morphs into that of \a [choice].") else new_mob = M if(new_mob) @@ -68,4 +65,3 @@ if(new_mob != M && !QDELETED(M)) qdel(M) - diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index 9cd81a4c4375..1fa06b9a4861 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -36,9 +36,6 @@ if(A?.storage || istype(A, /obj/structure/table) || istype(A, /obj/structure/closet) || istype(A, /obj/item/chems) || istype(A, /obj/structure/hygiene/sink) || istype(A, /obj/structure/janitorialcart)) return - if(istype(A, /spell)) - return - if(proximity) if(standard_dispenser_refill(user, A)) return diff --git a/code/modules/spells/aoe_turf/aoe_turf.dm b/code/modules/spells/aoe_turf/aoe_turf.dm deleted file mode 100644 index 0f7a721de803..000000000000 --- a/code/modules/spells/aoe_turf/aoe_turf.dm +++ /dev/null @@ -1,23 +0,0 @@ -/* -Aoe turf spells target a ring of tiles around the user -This ring has an outer radius (range) and an inner radius (inner_radius) -Aoe turf spells have a useful flag: IGNOREDENSE. It is explained in setup.dm -*/ - -/spell/aoe_turf //affects all turfs in view or range (depends) - spell_flags = IGNOREDENSE - var/inner_radius = -1 //for all your ring spell needs - -/spell/aoe_turf/choose_targets(mob/user = usr) - var/list/targets = list() - - for(var/turf/target in view_or_range(range, holder, selection_type)) - if(!(target in view_or_range(inner_radius, holder, selection_type))) - if(target.density && (spell_flags & IGNOREDENSE)) - continue - targets += target - - if(!targets.len) //doesn't waste the spell - return - - return targets \ No newline at end of file diff --git a/code/modules/spells/aoe_turf/conjure/conjure.dm b/code/modules/spells/aoe_turf/conjure/conjure.dm deleted file mode 100644 index 8dd91146310c..000000000000 --- a/code/modules/spells/aoe_turf/conjure/conjure.dm +++ /dev/null @@ -1,73 +0,0 @@ -/* -Conjure spells spawn things (mobs, objs, turfs) in their summon_type -How they spawn stuff is decided by behaviour vars, which are explained below -*/ - -/spell/aoe_turf/conjure - name = "Conjure" - desc = "This spell conjures objs of the specified types in range." - - school = "conjuration" //funny, that - - var/list/summon_type = list() //determines what exactly will be summoned - //should NOT be text, like list(/obj/machinery/bot/ed209) - - range = 0 //default values: only spawn on the player tile - selection_type = "view" - - duration = 0 // 0=permanent, any other time in deciseconds - how long the summoned objects last for - var/summon_amt = 1 //amount of objects summoned - var/summon_exclusive = 0 //spawn one of everything, instead of random things - - var/list/newVars = list() //vars of the summoned objects will be replaced with those where they meet - //should have format of list("emagged" = 1,"name" = "Justicebot"), for example - - cast_sound = 'sound/magic/castsummon.ogg' - -/spell/aoe_turf/conjure/cast(list/targets, mob/user) - - for(var/i=1,i <= summon_amt,i++) - if(!targets.len) - break - var/summoned_object_type - if(summon_exclusive) - if(!summon_type.len) - break - summoned_object_type = summon_type[1] - summon_type -= summoned_object_type - else - summoned_object_type = pick(summon_type) - var/turf/spawn_place = pick(targets) - var/atom/summoned_object - if(ispath(summoned_object_type,/turf)) - spawn_place.ChangeTurf(summoned_object_type) - summoned_object = spawn_place - else - summoned_object = new summoned_object_type(spawn_place) - var/atom/movable/overlay/animation = new /atom/movable/overlay(summoned_object) - animation.SetName("conjure") - animation.set_density(0) - animation.anchored = TRUE - animation.icon = 'icons/effects/effects.dmi' - animation.layer = BASE_HUMAN_LAYER - if(ismob(summoned_object)) //we want them to NOT attack us. - var/mob/M = summoned_object - M.faction = user.faction - apply_vars(summoned_object, user) - - if(duration) - spawn(duration) - if(summoned_object && !isturf(summoned_object)) - qdel(summoned_object) - conjure_animation(animation, spawn_place) - return - -/spell/aoe_turf/conjure/proc/conjure_animation(var/atom/movable/overlay/animation, var/turf/target) - qdel(animation) - -/spell/aoe_turf/conjure/proc/apply_vars(atom/summoned_object, mob/caster) - if(!istype(summoned_object) || !length(newVars)) - return - for(var/varName in newVars) - if(varName in summoned_object.vars) - summoned_object.vars[varName] = newVars[varName] diff --git a/code/modules/spells/construct_spells.dm b/code/modules/spells/construct_spells.dm deleted file mode 100644 index 0c705aff4fc0..000000000000 --- a/code/modules/spells/construct_spells.dm +++ /dev/null @@ -1,10 +0,0 @@ -//////////////////////////////Construct Spells///////////////////////// - -/proc/findNullRod(var/atom/target) - if(istype(target,/obj/item/nullrod)) - return 1 - else if(target.contents) - for(var/atom/A in target.contents) - if(findNullRod(A)) - return 1 - return 0 diff --git a/code/modules/spells/spell_code.dm b/code/modules/spells/spell_code.dm deleted file mode 100644 index bfcf1f4d8f6c..000000000000 --- a/code/modules/spells/spell_code.dm +++ /dev/null @@ -1,385 +0,0 @@ -var/global/list/spells = typesof(/spell) //needed for the badmin verb for now - -/spell - var/name - var/desc - var/feedback = "" //what gets sent if this spell gets chosen by the spellbook. - parent_type = /datum - var/panel = "Spells"//What panel the proc holder needs to go on. - - var/school = "evocation" //not relevant at now, but may be important later if there are changes to how spells work. the ones I used for now will probably be changed... maybe spell presets? lacking flexibility but with some other benefit? - /*Spell schools as follows: - Racial - Only tagged to spells gained for being a certain race - Conjuration - Creating an object or transporting it. - Transmutation - Modifying an object or transforming it. - Illusion - Altering perception or thought. - */ - var/charge_type = Sp_RECHARGE //can be recharge or charges, see charge_max and charge_counter descriptions; can also be based on the holder's vars now, use "holder_var" for that - - var/charge_max = 100 //recharge time in deciseconds if charge_type = Sp_RECHARGE or starting charges if charge_type = Sp_CHARGES - var/charge_counter = 0 //can only cast spells if it equals recharge, ++ each decisecond if charge_type = Sp_RECHARGE or -- each cast if charge_type = Sp_CHARGES - var/still_recharging_msg = "The spell is still recharging." - - var/silenced = 0 //not a binary - the length of time we can't cast this for - var/processing = 0 //are we processing already? Mainly used so that silencing a spell doesn't call process() again. (and inadvertedly making it run twice as fast) - - var/holder_var_type = "bruteloss" //only used if charge_type equals to "holder_var" - var/holder_var_amount = 20 //same. The amount adjusted with the mob's var when the spell is used - - var/spell_flags = 0 - var/invocation = "HURP DURP" //what is uttered when the wizard casts the spell - var/invocation_type = SpI_NONE //can be none, whisper, shout, and emote - var/range = 7 //the range of the spell; outer radius for aoe spells - var/message = "" //whatever it says to the guy affected by it - var/selection_type = "view" //can be "range" or "view" - var/atom/movable/holder //where the spell is. Normally the user, can be an item - var/duration = 0 //how long the spell lasts - - var/list/spell_levels = list(Sp_SPEED = 0, Sp_POWER = 0) //the current spell levels - total spell levels can be obtained by just adding the two values - var/list/level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 0) //maximum possible levels in each category. Total does cover both. - var/cooldown_reduc = 0 //If set, defines how much charge_max drops by every speed upgrade - var/delay_reduc = 0 - var/cooldown_min = 0 //minimum possible cooldown for a charging spell - - var/overlay = 0 - var/overlay_icon = 'icons/obj/wizard.dmi' - var/overlay_icon_state = "spell" - var/overlay_lifespan = 0 - - var/sparks_spread = 0 - var/sparks_amt = 0 //cropped at 10 - var/smoke_spread = 0 //1 - harmless, 2 - harmful - var/smoke_amt = 0 //cropped at 10 - - var/critfailchance = 0 - var/time_between_channels = 0 //Delay between casts - var/number_of_channels = 1 //How many times can we channel? - - var/cast_delay = 1 - var/cast_sound = "" - - var/hud_state = "" //name of the icon used in generating the spell hud object - var/override_base = "" - - - var/obj/screen/connected_button - - var/hidden_from_codex = FALSE - -/////////////////////// -///SETUP AND PROCESS/// -/////////////////////// - -/spell/New() - ..() - - //still_recharging_msg = "[name] is still recharging." - charge_counter = charge_max - -/spell/proc/process() - if(processing) - return - processing = 1 - spawn(0) - while(charge_counter < charge_max || silenced > 0) - charge_counter = min(charge_max,charge_counter+1) - silenced = max(0,silenced-1) - sleep(1) - if(connected_button) - var/obj/screen/ability/spell/S = connected_button - if(!istype(S)) - return - S.update_charge(1) - processing = 0 - return - -///////////////// -/////CASTING///// -///////////////// - -/spell/proc/choose_targets(mob/user = usr) //depends on subtype - see targeted.dm, aoe_turf.dm, dumbfire.dm, or code in general folder - return - -/spell/proc/perform(mob/user = usr, skipcharge = 0) //if recharge is started is important for the trigger spells - if(!holder) - holder = user //just in case - if(!cast_check(skipcharge, user)) - return - to_chat(user, SPAN_NOTICE("You start casting \the [name]...")) - if(cast_delay && !spell_do_after(user, cast_delay)) - return - var/list/targets = choose_targets(user) - if(!check_valid_targets(targets)) - to_chat(user, SPAN_WARNING("\The [name] fizzles. There are no valid targets nearby.")) - return - var/time = 0 - admin_attacker_log(user, "attempted to cast the spell [name]") - do - time++ - if(!check_valid_targets(targets)) //make sure we HAVE something - break - if(cast_check(1,user, targets)) //we check again, otherwise you can choose a target and then wait for when you are no longer able to cast (I.E. Incapacitated) to use it. - invocation(user, targets) - take_charge(user, skipcharge) - before_cast(targets) //applies any overlays and effects - if(prob(critfailchance)) - critfail(targets, user) - else - cast(targets, user, time) - after_cast(targets) //generates the sparks, smoke, target messages etc. - else - break - while(time != number_of_channels && do_after(user, time_between_channels, incapacitation_flags = INCAPACITATION_KNOCKOUT|INCAPACITATION_FORCELYING|INCAPACITATION_STUNNED, same_direction=1)) - after_spell(targets, user, time) //When we are done with the spell completely. - - - -/spell/proc/cast(list/targets, mob/user, var/channel_duration) //the actual meat of the spell - return - -/spell/proc/critfail(list/targets, mob/user) //the wizman has fucked up somehow - return - -/spell/proc/after_spell(var/list/targets, var/mob/user, var/channel_duration) //After everything else is done. - return - -/spell/proc/adjust_var(mob/living/target = usr, type, amount) //handles the adjustment of the var when the spell is used. has some hardcoded types - switch(type) - if("bruteloss") - target.take_damage(amount) - if("fireloss") - target.take_damage(amount, BURN) - if("toxloss") - target.take_damage(amount, TOX) - if("oxyloss") - target.take_damage(amount, OXY) - if("brainloss") - target.take_damage(amount, BRAIN) - if("stunned") - ADJ_STATUS(target, STAT_STUN, amount) - if("weakened") - ADJ_STATUS(target, STAT_WEAK, amount) - if("paralysis") - ADJ_STATUS(target, STAT_PARA, amount) - else - target.vars[type] += amount //I bear no responsibility for the runtimes that'll happen if you try to adjust non-numeric or even non-existant vars - return - -/////////////////////////// -/////CASTING WRAPPERS////// -/////////////////////////// - -/spell/proc/before_cast(list/targets) - for(var/atom/target in targets) - if(overlay) - var/location - if(isliving(target)) - location = target.loc - else if(isturf(target)) - location = target - var/obj/effect/overlay/spell = new /obj/effect/overlay(location) - spell.icon = overlay_icon - spell.icon_state = overlay_icon_state - spell.anchored = TRUE - spell.set_density(0) - spawn(overlay_lifespan) - qdel(spell) - -/spell/proc/after_cast(list/targets) - if(cast_sound) - playsound(get_turf(holder),cast_sound,50,1) - for(var/atom/target in targets) - var/location = get_turf(target) - if(isliving(target) && message) - to_chat(target, text("[message]")) - if(sparks_spread) - spark_at(location, amount = sparks_amt) - if(smoke_spread) - if(smoke_spread == 1) - var/datum/effect/effect/system/smoke_spread/smoke = new /datum/effect/effect/system/smoke_spread() - smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is - smoke.start() - else if(smoke_spread == 2) - var/datum/effect/effect/system/smoke_spread/bad/smoke = new /datum/effect/effect/system/smoke_spread/bad() - smoke.set_up(smoke_amt, 0, location) //no idea what the 0 is - smoke.start() - -///////////////////// -////CASTING TOOLS//// -///////////////////// -/*Checkers, cost takers, message makers, etc*/ - -/spell/proc/cast_check(skipcharge = 0,mob/user = usr, var/list/targets) //checks if the spell can be cast based on its settings; skipcharge is used when an additional cast_check is called inside the spell - - if(silenced > 0) - return 0 - - if(!(src in user.mind.learned_spells) && holder == user && !(isanimal(user))) - error("[user] utilized the spell '[src]' without having it.") - to_chat(user, "You shouldn't have this spell! Something's wrong.") - return 0 - - var/turf/user_turf = get_turf(user) - if(!user_turf) - to_chat(user, "You cannot cast spells in null space!") - - if((spell_flags & Z2NOCAST) && isAdminLevel(user_turf.z)) //Certain spells are not allowed on the centcomm zlevel - return 0 - - if(spell_flags & CONSTRUCT_CHECK) - for(var/turf/T in range(holder, 1)) - if(findNullRod(T)) - return 0 - - if(!src.check_charge(skipcharge, user)) //sees if we can cast based on charges alone - return 0 - - if(holder == user) - if(isanimal(user)) - var/mob/living/simple_animal/SA = user - if(SA.purge) - to_chat(SA, "The null sceptre's power interferes with your own!") - return 0 - - var/mob/living/L = user - if(L.incapacitated(INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT)) - to_chat(user, "You can't cast spells while incapacitated!") - return 0 - - if(ishuman(user) && !(invocation_type in list(SpI_EMOTE, SpI_NONE)) && user.get_item_blocking_speech()) - to_chat(user, "Mmmf mrrfff!") - return 0 - - return 1 - -/spell/proc/check_charge(var/skipcharge, mob/user) - if(!skipcharge) - switch(charge_type) - if(Sp_RECHARGE) - if(charge_counter < charge_max) - to_chat(user, still_recharging_msg) - return 0 - if(Sp_CHARGES) - if(!charge_counter) - to_chat(user, "[name] has no charges left.") - return 0 - return 1 - -/spell/proc/take_charge(mob/user = user, var/skipcharge) - if(!skipcharge) - switch(charge_type) - if(Sp_RECHARGE) - charge_counter = 0 //doesn't start recharging until the targets selecting ends - src.process() - return 1 - if(Sp_CHARGES) - charge_counter-- //returns the charge if the targets selecting fails - return 1 - if(Sp_HOLDVAR) - adjust_var(user, holder_var_type, holder_var_amount) - return 1 - return 0 - return 1 - -/spell/proc/check_valid_targets(var/list/targets) - if(!targets) - return 0 - if(!islist(targets)) - targets = list(targets) - else if(!targets.len) - return 0 - - var/list/valid_targets = view_or_range(range, holder, selection_type) - for(var/target in targets) - if(!(target in valid_targets)) - return 0 - return 1 - -/spell/proc/invocation(mob/user = usr, var/list/targets) //spelling the spell out and setting it on recharge/reducing charges amount - - switch(invocation_type) - if(SpI_SHOUT) - if(prob(50))//Auto-mute? Fuck that noise - user.say(invocation) - else - user.say(replacetext(invocation," ","`")) - if(SpI_WHISPER) - if(prob(50)) - user.whisper(invocation) - else - user.whisper(replacetext(invocation," ","`")) - if(SpI_EMOTE) - user.custom_emote(VISIBLE_MESSAGE, invocation) - -///////////////////// -///UPGRADING PROCS/// -///////////////////// - -/spell/proc/can_improve(var/upgrade_type) - if(level_max[Sp_TOTAL] <= ( spell_levels[Sp_SPEED] + spell_levels[Sp_POWER] )) //too many levels, can't do it - return 0 - - //if(upgrade_type && spell_levels[upgrade_type] && level_max[upgrade_type]) - if(upgrade_type && spell_levels[upgrade_type] >= level_max[upgrade_type]) - return 0 - - return 1 - -/spell/proc/empower_spell() - if(!can_improve(Sp_POWER)) - return 0 - - spell_levels[Sp_POWER]++ - - return 1 - -/spell/proc/quicken_spell() - if(!can_improve(Sp_SPEED)) - return 0 - - spell_levels[Sp_SPEED]++ - - if(delay_reduc && cast_delay) - cast_delay = max(0, cast_delay - delay_reduc) - else if(cast_delay) - cast_delay = round( max(0, initial(cast_delay) * ((level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) / level_max[Sp_SPEED] ) ) ) - - if(charge_type == Sp_RECHARGE) - if(cooldown_reduc) - charge_max = max(cooldown_min, charge_max - cooldown_reduc) - else - charge_max = round( max(cooldown_min, initial(charge_max) * ((level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) / level_max[Sp_SPEED] ) ) ) //the fraction of the way you are to max speed levels is the fraction you lose - if(charge_max < charge_counter) - charge_counter = charge_max - - var/temp = "" - name = initial(name) - switch(level_max[Sp_SPEED] - spell_levels[Sp_SPEED]) - if(3) - temp = "You have improved [name] into Efficient [name]." - name = "Efficient [name]" - if(2) - temp = "You have improved [name] into Quickened [name]." - name = "Quickened [name]" - if(1) - temp = "You have improved [name] into Free [name]." - name = "Free [name]" - if(0) - temp = "You have improved [name] into Instant [name]." - name = "Instant [name]" - - return temp - -/spell/proc/spell_do_after(var/mob/user, delay, var/numticks = 5) - if(!user || isnull(user)) - return 0 - - var/incap_flags = INCAPACITATION_STUNNED|INCAPACITATION_RESTRAINED|INCAPACITATION_BUCKLED_FULLY|INCAPACITATION_FORCELYING|INCAPACITATION_KNOCKOUT - return do_after(user,delay, incapacitation_flags = incap_flags) - -/proc/view_or_range(distance = world.view , center = usr , type) - switch(type) - if("view") - . = view(distance,center) - if("range") - . = range(distance,center) \ No newline at end of file diff --git a/code/modules/spells/spells.dm b/code/modules/spells/spells.dm deleted file mode 100644 index ad550747a7ff..000000000000 --- a/code/modules/spells/spells.dm +++ /dev/null @@ -1,60 +0,0 @@ -/datum/mind - var/list/learned_spells - -/mob/Stat() - . = ..() - if(. && ability_master && ability_master.spell_objects) - for(var/obj/screen/ability/spell/screen in ability_master.spell_objects) - var/spell/S = screen.spell - if((!S.connected_button) || !statpanel(S.panel)) - continue //Not showing the noclothes spell - switch(S.charge_type) - if(Sp_RECHARGE) - statpanel(S.panel,"[S.charge_counter/10.0]/[S.charge_max/10]",S.connected_button) - if(Sp_CHARGES) - statpanel(S.panel,"[S.charge_counter]/[S.charge_max]",S.connected_button) - if(Sp_HOLDVAR) - statpanel(S.panel,"[S.holder_var_type] [S.holder_var_amount]",S.connected_button) - -/proc/restore_spells(var/mob/H) - if(H.mind && H.mind.learned_spells) - var/list/spells = list() - for(var/spell/spell_to_remove in H.mind.learned_spells) //remove all the spells from other people. - if(ismob(spell_to_remove.holder)) - var/mob/M = spell_to_remove.holder - spells += spell_to_remove - M.remove_spell(spell_to_remove) - - for(var/spell/spell_to_add in spells) - H.add_spell(spell_to_add) - H.ability_master.update_abilities(0,H) - -/mob/proc/add_spell(var/spell/spell_to_add, var/spell_base = "wiz_spell_ready") - if(!ability_master) - ability_master = new(null, src) - spell_to_add.holder = src - if(mind) - if(!mind.learned_spells) - mind.learned_spells = list() - mind.learned_spells |= spell_to_add - ability_master.add_spell(spell_to_add, spell_base) - return 1 - -/mob/proc/remove_spell(var/spell/spell_to_remove) - if(!spell_to_remove || !istype(spell_to_remove)) - return - - if(mind) - mind.learned_spells -= spell_to_remove - if (ability_master) - ability_master.remove_ability(ability_master.get_ability_by_spell(spell_to_remove)) - return 1 - -/mob/proc/silence_spells(var/amount = 0) - if(amount < 0) - return - - if(!ability_master) - return - - ability_master.silence_spells(amount) \ No newline at end of file diff --git a/code/modules/spells/targeted/ethereal_jaunt.dm b/code/modules/spells/targeted/ethereal_jaunt.dm deleted file mode 100644 index 55a0ed83359d..000000000000 --- a/code/modules/spells/targeted/ethereal_jaunt.dm +++ /dev/null @@ -1,120 +0,0 @@ -/spell/targeted/ethereal_jaunt - name = "Ethereal Jaunt" - desc = "This spell creates your ethereal form, temporarily making you invisible and able to pass through walls." - feedback = "EJ" - school = "transmutation" - charge_max = 30 SECONDS - spell_flags = Z2NOCAST | INCLUDEUSER - invocation = "none" - invocation_type = SpI_NONE - range = 0 - max_targets = 1 - level_max = list(Sp_TOTAL = 4, Sp_SPEED = 4, Sp_POWER = 3) - cooldown_min = 10 SECONDS //50 deciseconds reduction per rank - duration = 5 SECONDS - - hud_state = "wiz_jaunt" - -/spell/targeted/ethereal_jaunt/cast(list/targets) //magnets, so mostly hardcoded - for(var/mob/living/target in targets) - if(HAS_TRANSFORMATION_MOVEMENT_HANDLER(target)) - continue - - if(target.buckled) - target.buckled.unbuckle_mob() - spawn(0) - var/mobloc = get_turf(target.loc) - var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt( mobloc ) - var/atom/movable/overlay/animation = new /atom/movable/overlay(holder) - animation.SetName("water") - animation.set_density(0) - animation.anchored = TRUE - animation.icon = 'icons/mob/mob.dmi' - animation.layer = FLY_LAYER - target.extinguish_fire() - if(target.buckled) - target.buckled = null - jaunt_disappear(animation, target) - target.forceMove(holder) - jaunt_steam(mobloc) - sleep(duration) - mobloc = holder.last_valid_turf - animation.forceMove(mobloc) - jaunt_steam(mobloc) - holder.reappearing = 1 - sleep(20) - jaunt_reappear(animation, target) - sleep(5) - if(!target.forceMove(mobloc)) - for(var/direction in list(1,2,4,8,5,6,9,10)) - var/turf/T = get_step(mobloc, direction) - if(T) - if(target.forceMove(T)) - break - target.client.eye = target - qdel(animation) - qdel(holder) - -/spell/targeted/ethereal_jaunt/empower_spell() - if(!..()) - return 0 - duration += 2 SECONDS - - return "[src] now lasts longer." - -/spell/targeted/ethereal_jaunt/proc/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) - animation.icon_state = "liquify" - flick("liquify",animation) - playsound(get_turf(target), 'sound/magic/ethereal_enter.ogg', 30) - -/spell/targeted/ethereal_jaunt/proc/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) - flick("reappear",animation) - playsound(get_turf(target), 'sound/magic/ethereal_exit.ogg', 30) - -/spell/targeted/ethereal_jaunt/proc/jaunt_steam(var/mobloc) - var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread() - steam.set_up(10, 0, mobloc) - steam.start() - -/obj/effect/dummy/spell_jaunt - name = "water" - icon = 'icons/effects/effects.dmi' - icon_state = "nothing" - var/canmove = 1 - var/reappearing = 0 - density = FALSE - anchored = TRUE - var/turf/last_valid_turf - -/obj/effect/dummy/spell_jaunt/Initialize() - . = ..() - last_valid_turf = get_turf(loc) - -/obj/effect/dummy/spell_jaunt/Destroy() - // Eject contents if deleted somehow - for(var/atom/movable/AM in src) - AM.dropInto(loc) - return ..() - -/obj/effect/dummy/spell_jaunt/relaymove(var/mob/user, direction) - if (!canmove || reappearing) return - var/turf/newLoc = get_step(src, direction) - if(!(newLoc.turf_flags & TURF_FLAG_NOJAUNT)) - forceMove(newLoc) - var/turf/T = get_turf(loc) - if(!T.contains_dense_objects()) - last_valid_turf = T - else - to_chat(user, "Some strange aura is blocking the way!") - canmove = 0 - addtimer(CALLBACK(src, PROC_REF(allow_move)), 2) - -/obj/effect/dummy/spell_jaunt/proc/allow_move() - canmove = TRUE - -/obj/effect/dummy/spell_jaunt/explosion_act(blah) - SHOULD_CALL_PARENT(FALSE) - return - -/obj/effect/dummy/spell_jaunt/bullet_act(blah) - return diff --git a/code/modules/spells/targeted/shift.dm b/code/modules/spells/targeted/shift.dm deleted file mode 100644 index 2bcc684939a6..000000000000 --- a/code/modules/spells/targeted/shift.dm +++ /dev/null @@ -1,24 +0,0 @@ -/spell/targeted/ethereal_jaunt/shift - name = "Phase Shift" - desc = "This spell allows you to pass through walls" - - charge_max = 200 - spell_flags = Z2NOCAST | INCLUDEUSER | CONSTRUCT_CHECK - invocation_type = SpI_NONE - range = -1 - duration = 50 //in deciseconds - - hud_state = "const_shift" - -/spell/targeted/ethereal_jaunt/shift/jaunt_disappear(var/atom/movable/overlay/animation, var/mob/living/target) - animation.icon_state = "phase_shift" - animation.set_dir(target.dir) - flick("phase_shift",animation) - -/spell/targeted/ethereal_jaunt/shift/jaunt_reappear(var/atom/movable/overlay/animation, var/mob/living/target) - animation.icon_state = "phase_shift2" - animation.set_dir(target.dir) - flick("phase_shift2",animation) - -/spell/targeted/ethereal_jaunt/shift/jaunt_steam(var/mobloc) - return diff --git a/code/modules/spells/targeted/targeted.dm b/code/modules/spells/targeted/targeted.dm deleted file mode 100644 index 733bbf1e5403..000000000000 --- a/code/modules/spells/targeted/targeted.dm +++ /dev/null @@ -1,152 +0,0 @@ -/* -Targeted spells (with the exception of dumbfire) select from all the mobs in the defined range -Targeted spells have two useful flags: INCLUDEUSER and SELECTABLE. These are explained in setup.dm -*/ - -/spell/targeted //can mean aoe for mobs (limited/unlimited number) or one target mob - var/max_targets = 1 //leave 0 for unlimited targets in range, more for limited number of casts (can all target one guy, depends on target_ignore_prev) in range - var/target_ignore_prev = 1 //only important if max_targets > 1, affects if the spell can be cast multiple times at one person from one cast - - - var/amt_weakened = 0 - var/amt_paralysis = 0 - var/amt_stunned = 0 - - var/amt_dizziness = 0 - var/amt_confused = 0 - var/amt_stuttering = 0 - - //set to negatives for healing unless commented otherwise - var/amt_dam_fire = 0 - var/amt_dam_brute = 0 - var/amt_dam_oxy = 0 - var/amt_dam_tox = 0 - var/amt_dam_robo = 0 - var/amt_brain = 0 - var/amt_radiation = 0 - var/amt_blood = 0 //Positive numbers to add blood - var/amt_organ = 0 //Positive numbers for healing - - var/amt_eye_blind = 0 - var/amt_eye_blurry = 0 - - var/effect_state = null //What effect to show on each, if any - var/effect_duration = 0 - var/effect_color = "#ffffff" - - var/list/compatible_mobs = list() - - -/spell/targeted/choose_targets(mob/user = usr) - var/list/targets = list() - - if(max_targets == 0) //unlimited - if(range == -2) - targets = global.living_mob_list_ - else - for(var/mob/living/target in view_or_range(range, holder, selection_type)) - targets += target - - else if(max_targets == 1) //single target can be picked - if((range == 0 || range == -1) && spell_flags & INCLUDEUSER) - targets += user - else - var/list/possible_targets = list() - var/list/starting_targets - if(range == -2) - starting_targets = global.living_mob_list_ - else - starting_targets = view_or_range(range, holder, selection_type) - - for(var/mob/living/M in starting_targets) - if(!(spell_flags & INCLUDEUSER) && M == user) - continue - if(compatible_mobs && compatible_mobs.len) - if(!is_type_in_list(M, compatible_mobs)) continue - if(compatible_mobs && compatible_mobs.len && !is_type_in_list(M, compatible_mobs)) - continue - possible_targets += M - - if(possible_targets.len) - targets += pick(possible_targets) - //Adds a safety check post-input to make sure those targets are actually in range. - - - else - var/list/possible_targets = list() - var/list/starting_targets - - if(range == -2) - starting_targets = global.living_mob_list_ - else - starting_targets = view_or_range(range, holder, selection_type) - - for(var/mob/living/target in starting_targets) - if(!(spell_flags & INCLUDEUSER) && target == user) - continue - if(compatible_mobs && !is_type_in_list(target, compatible_mobs)) - continue - possible_targets += target - - for(var/i=1,i<=max_targets,i++) - if(!possible_targets.len) - break - if(target_ignore_prev) - var/target = pick(possible_targets) - possible_targets -= target - targets += target - else - targets += pick(possible_targets) - - if(!(spell_flags & INCLUDEUSER) && (user in targets)) - targets -= user - - if(compatible_mobs && compatible_mobs.len) - for(var/mob/living/target in targets) //filters out all the non-compatible mobs - if(!is_type_in_list(target, compatible_mobs)) - targets -= target - - return targets - -/spell/targeted/cast(var/list/targets, mob/user) - for(var/mob/living/target in targets) - if(range >= 0) - if(!(target in view_or_range(range, holder, selection_type))) //filter at time of casting - targets -= target - continue - apply_spell_damage(target) - -/spell/targeted/proc/apply_spell_damage(mob/living/target) - target.take_damage(amt_dam_brute, do_update_health = FALSE) - target.take_damage(amt_dam_fire, BURN, do_update_health = FALSE) - target.take_damage(amt_dam_tox, TOX, do_update_health = FALSE) - target.take_damage(amt_dam_oxy, OXY) - if(ishuman(target)) - var/mob/living/human/H = target - for(var/obj/item/organ/internal/affecting in H.get_internal_organs()) - if(affecting && istype(affecting)) - affecting.heal_damage(amt_organ, amt_organ) - for(var/obj/item/organ/external/affecting in H.get_external_organs()) - if(affecting && istype(affecting)) - var/dam = BP_IS_PROSTHETIC(affecting) ? -amt_dam_robo : amt_organ - affecting.heal_damage(dam, dam, robo_repair = BP_IS_PROSTHETIC(affecting)) - H.adjust_blood(amt_blood) - H.take_damage(amt_brain, BRAIN) - H.radiation += min(H.radiation, amt_radiation) - - target.update_icon() - //disabling - SET_STATUS_MAX(target, STAT_WEAK, amt_weakened) - SET_STATUS_MAX(target, STAT_PARA, amt_paralysis) - SET_STATUS_MAX(target, STAT_STUN, amt_stunned) - if(amt_weakened || amt_paralysis || amt_stunned) - if(target.buckled) - target.buckled = null - ADJ_STATUS(target, STAT_BLIND, amt_eye_blind) - ADJ_STATUS(target, STAT_BLURRY, amt_eye_blurry) - ADJ_STATUS(target, STAT_DIZZY, amt_dizziness) - ADJ_STATUS(target, STAT_CONFUSE, amt_confused) - ADJ_STATUS(target, STAT_STUTTER, amt_stuttering) - if(effect_state) - var/obj/o = new /obj/effect/temporary(get_turf(target), effect_duration, 'icons/effects/effects.dmi', effect_state) - o.color = effect_color diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 78c4315424ac0f11f6102c8eee40d04cd32ac7e9..5502343f0d55f813c92ae6f9d97794220995207e 100644 GIT binary patch literal 272420 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

upe=+IiV`6aDAo4HchF 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 literal 307787 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

j#a`L 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 CqVjM@vXTYwVp6}s<% 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%0D~Q-wWoiAok_XU0)mdvuJ!!&dFyk( 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 Dy=2xN diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 49d879d47d83070a641a54e0fe1fb69fbfe22fac..b8ebfc011088c91f2831eddae290ec8707662321 100644 GIT binary patch literal 12595 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 JLe3)Se*x3Pe~AD9 literal 13510 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 psi?.get_rank(PSI_PSYCHOKINESIS)) owner.drop_from_inventory(src) @@ -30,6 +31,7 @@ else return FALSE + var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) if(_focus.anchored || (check_paramount && psi?.get_rank(PSI_PSYCHOKINESIS) < PSI_RANK_PARAMOUNT)) focus = _focus @@ -88,7 +90,7 @@ else if(!focus.anchored) var/user_rank = psi?.get_rank(PSI_PSYCHOKINESIS) - focus.throw_at(target, user_rank*2, user_rank*10, owner) + focus.throw_at(target, user_rank*2, user_rank*10, owner_ref?.resolve()) sleep(1) sparkle() diff --git a/mods/content/psionics/system/psionics/mob/mob.dm b/mods/content/psionics/system/psionics/mob/mob.dm index c85902acde4d..15cc79147421 100644 --- a/mods/content/psionics/system/psionics/mob/mob.dm +++ b/mods/content/psionics/system/psionics/mob/mob.dm @@ -1,4 +1,5 @@ /datum/ability_handler/psionics/refresh_login() + . = ..() update(TRUE) if(!suppressed) show_auras() diff --git a/mods/content/psionics/system/psionics/mob/mob_interactions.dm b/mods/content/psionics/system/psionics/mob/mob_interactions.dm index 366adb308823..aba8eeb102c0 100644 --- a/mods/content/psionics/system/psionics/mob/mob_interactions.dm +++ b/mods/content/psionics/system/psionics/mob/mob_interactions.dm @@ -6,8 +6,6 @@ power.handle_post_power(user, target); \ if(istype(result)) { \ sound_to(user, sound('sound/effects/psi/power_evoke.ogg')); \ - LAZYADD(ability_items, result); \ - user.put_in_hands(result); \ } \ return TRUE; \ } \ @@ -28,15 +26,19 @@ INVOKE_PSI_POWERS(user, get_grab_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_melee_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(FALSE) return TRUE /datum/ability_handler/psionics/do_melee_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(FALSE) INVOKE_PSI_POWERS(user, get_melee_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) /datum/ability_handler/psionics/can_do_ranged_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(FALSE) return TRUE /datum/ability_handler/psionics/do_ranged_invocation(mob/user, atom/target) + SHOULD_CALL_PARENT(FALSE) INVOKE_PSI_POWERS(user, get_ranged_powers(SSpsi.get_faculty_by_intent(user.get_intent())), target) -#undef INVOKE_PSI_POWERS \ No newline at end of file +#undef INVOKE_PSI_POWERS diff --git a/mods/gamemodes/cult/_cult.dme b/mods/gamemodes/cult/_cult.dme index 82d4e19aed59..02138255d74c 100644 --- a/mods/gamemodes/cult/_cult.dme +++ b/mods/gamemodes/cult/_cult.dme @@ -21,7 +21,11 @@ #include "special_role.dm" #include "structures.dm" #include "talisman.dm" -#include "cultify\de-cultify.dm" +#include "abilities\_handler.dm" +#include "abilities\construct.dm" +#include "abilities\harvest.dm" +#include "abilities\shade.dm" +#include "cultify\de-cultify.dm" #include "cultify\defile.dm" #include "cultify\mob.dm" #include "cultify\turf.dm" @@ -29,7 +33,12 @@ #include "mobs\shade.dm" #include "mobs\constructs\constructs.dm" #include "mobs\constructs\soulstone.dm" -#include "spells\construct.dm" -#include "spells\harvest.dm" // END_INCLUDE -#endif \ No newline at end of file +#endif +// BEGIN_INTERNALS +// END_INTERNALS +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR +// BEGIN_PREFERENCES +// END_PREFERENCES diff --git a/mods/gamemodes/cult/abilities/_handler.dm b/mods/gamemodes/cult/abilities/_handler.dm new file mode 100644 index 000000000000..f346bb73fb41 --- /dev/null +++ b/mods/gamemodes/cult/abilities/_handler.dm @@ -0,0 +1,21 @@ +/obj/screen/ability/category/cult + name = "Toggle Construct Abilities" + icon = 'mods/gamemodes/cult/icons/abilities.dmi' + +/obj/screen/ability/button/cult + icon = 'mods/gamemodes/cult/icons/abilities.dmi' + +/datum/ability_handler/cult + category_toggle_type = /obj/screen/ability/category/cult + +/decl/ability/cult + abstract_type = /decl/ability/cult + ability_icon = 'mods/gamemodes/cult/icons/abilities.dmi' + ability_icon_state = "artificer" + associated_handler_type = /datum/ability_handler/cult + ui_element_type = /obj/screen/ability/button/cult + ability_cooldown_time = 60 SECONDS + +/obj/item/ability/cult + icon = 'mods/gamemodes/cult/icons/ability_item.dmi' + color = COLOR_RED diff --git a/mods/gamemodes/cult/abilities/construct.dm b/mods/gamemodes/cult/abilities/construct.dm new file mode 100644 index 000000000000..60138eaba356 --- /dev/null +++ b/mods/gamemodes/cult/abilities/construct.dm @@ -0,0 +1,131 @@ +//////////////////////////////Construct Spells///////////////////////// +/decl/ability/cult/construct + name = "Artificer" + desc = "This spell conjures a construct which may be controlled by shades." + target_selector = /decl/ability_targeting/clear_turf + overlay_icon = 'mods/gamemodes/cult/icons/effects.dmi' + overlay_icon_state = "sparkles" + target_selector = /decl/ability_targeting/clear_turf/construct + var/summon_type = /obj/structure/constructshell + +/decl/ability_targeting/clear_turf/construct/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + var/decl/ability/cult/construct/cult_ability = ability + if(!istype(cult_ability)) + return FALSE + return ..() && !istype(target, cult_ability.summon_type) && !(locate(cult_ability.summon_type) in target) + +/decl/ability/cult/construct/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + . = ..() + var/turf/target_turf = get_turf(hit_target) + if(istype(target_turf)) + if(ispath(summon_type, /turf)) + target_turf = target_turf.ChangeTurf(summon_type, TRUE, FALSE, TRUE, TRUE, FALSE) + if(target_turf) // We reapply effects as target no longer exists. + apply_effect_to(user, target_turf, metadata) + else if(ispath(summon_type, /atom)) + new summon_type(target_turf) + +/decl/ability/cult/construct/lesser + ability_cooldown_time = 2 MINUTES + summon_type = /obj/structure/constructshell/cult + ability_icon_state = "const_shell" + +/decl/ability/cult/construct/floor + name = "Floor Construction" + desc = "This spell constructs a cult floor" + ability_cooldown_time = 2 SECONDS + summon_type = /turf/floor/cult + ability_icon_state = "const_floor" + overlay_icon_state = "cultfloor" + +/decl/ability/cult/construct/wall + name = "Lesser Construction" + desc = "This spell constructs a cult wall" + ability_cooldown_time = 10 SECONDS + summon_type = /turf/wall/cult + ability_icon_state = "const_wall" + overlay_icon_state = "cultwall" + +/decl/ability/cult/construct/wall/reinforced + name = "Greater Construction" + desc = "This spell constructs a reinforced metal wall" + ability_cooldown_time = 30 SECONDS + summon_type = /turf/wall/r_wall + +/decl/ability/cult/construct/soulstone + name = "Summon Soulstone" + desc = "This spell reaches into Nar-Sie's realm, summoning one of the legendary fragments across time and space." + ability_cooldown_time = 5 MINUTES + summon_type = /obj/item/soulstone + ability_icon_state = "const_stone" + +/decl/ability/cult/construct/pylon + name = "Red Pylon" + desc = "This spell conjures a fragile crystal from Nar-Sie's realm. Makes for a convenient light source." + ability_cooldown_time = 20 SECONDS + summon_type = /obj/structure/cult/pylon + ability_icon_state = "const_pylon" + target_selector = /decl/ability_targeting/pylon + is_melee_invocation = TRUE + prep_cast = TRUE + +/decl/ability_targeting/pylon/validate_target(mob/user, atom/target, list/metadata, decl/ability/ability) + . = ..() + if(!.) + return + if(istype(target, /obj/structure/cult/pylon)) + return TRUE + if(isturf(target)) + var/turf/target_turf = target + // We can repair pylons, so let us target turfs containing broken pylons. + if(target_turf.contains_dense_objects(user)) + for(var/obj/structure/cult/pylon/pylon in target_turf) + if(pylon.isbroken) + return TRUE + return FALSE + // We can summon pylons in empty turfs. + return TRUE + return FALSE + +/decl/ability/cult/construct/pylon/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + for(var/obj/structure/cult/pylon/P in get_turf(hit_target)) + if(P.isbroken) + P.repair(user) + return TRUE + . = ..() + +/decl/ability/cult/construct/forcewall/lesser + name = "Force Shield" + desc = "Allows you to pull up a shield to protect yourself and allies from incoming threats" + summon_type = /obj/effect/cult_force_wall + ability_cooldown_time = 30 SECONDS + ability_use_channel = 20 SECONDS + ability_icon_state = "const_juggwall" + prepare_message_3p_str = "$USER$ begins to twist and warp space around $TARGET$, building a wall of force." + prepare_message_1p_str = "You begin the lengthy process of warping local space to form a wall of force." + cast_message_3p_str = "$USER$ completes a wall of force!" + cast_message_1p_str = "You complete a wall of force!" + fail_cast_1p_str = "The screaming fabric of spacetime escapes your grip, and the wall of force vanishes." + +//Code for the Juggernaut construct's forcefield, that seemed like a good place to put it. +/obj/effect/cult_force_wall + desc = "This eerie-looking obstacle seems to have been pulled from another dimension through sheer force." + name = "wall of force" + icon = 'mods/gamemodes/cult/icons/effects.dmi' + icon_state = "m_shield_cult" + light_color = "#b40000" + light_range = 2 + anchored = TRUE + opacity = FALSE + density = TRUE + +/obj/effect/cult_force_wall/Initialize(mapload) + . = ..() + addtimer(CALLBACK(src, PROC_REF(vanish)), 30 SECONDS) + +/obj/effect/cult_force_wall/proc/vanish() + density = FALSE + icon_state = "m_shield_cult_vanish" + sleep(12) + if(!QDELETED(src)) + qdel(src) diff --git a/mods/gamemodes/cult/abilities/harvest.dm b/mods/gamemodes/cult/abilities/harvest.dm new file mode 100644 index 000000000000..49569d6a25ef --- /dev/null +++ b/mods/gamemodes/cult/abilities/harvest.dm @@ -0,0 +1,41 @@ +/decl/ability/cult/construct/harvest + name = "Harvest" + desc = "Back to where I come from, and you're coming with me." + ability_cooldown_time = 20 SECONDS + ability_use_channel = 10 SECONDS + overlay_icon_state = "rune_teleport" + overlay_lifespan = 0 + ability_icon_state = "const_harvest" + prepare_message_3p_str = "Space around $USER$ begins to bubble and decay as a terrible vista begins to intrude..." + prepare_message_1p_str = "You bore through space and time, seeking the essence of the Geometer of Blood." + fail_cast_1p_str = "Reality reasserts itself, preventing your return to Nar-Sie." + target_selector = /decl/ability_targeting/living_mob + +/decl/ability/cult/construct/harvest/can_use_ability(mob/user, list/metadata, silent) + . = ..() + if(.) + var/destination + for(var/obj/effect/narsie/N in global.narsie_list) + destination = N.loc + break + if(!destination) + to_chat(user, SPAN_DANGER("You cannot sense the Geometer of Blood!")) + return FALSE + +/decl/ability/cult/construct/harvest/apply_effect(mob/user, atom/hit_target, list/metadata, obj/item/projectile/ability/projectile) + ..() + var/destination = null + for(var/obj/effect/narsie/N in global.narsie_list) + destination = N.loc + break + if(!destination) + to_chat(user, SPAN_DANGER("You cannot sense the Geometer of Blood!")) + return + if(ismob(hit_target) && hit_target != user) + var/mob/living/victim = hit_target + to_chat(user, SPAN_SINISTER("You warp back to Nar-Sie along with your prey.")) + to_chat(victim, SPAN_SINISTER("You are wrenched through time and space and thrown into chaos!")) + victim.dropInto(destination) + else + to_chat(user, SPAN_SINISTER("You warp back to Nar-Sie.")) + user.dropInto(destination) diff --git a/mods/gamemodes/cult/abilities/shade.dm b/mods/gamemodes/cult/abilities/shade.dm new file mode 100644 index 000000000000..5fab626d14d6 --- /dev/null +++ b/mods/gamemodes/cult/abilities/shade.dm @@ -0,0 +1 @@ +/decl/ability/cult/construct/shift \ No newline at end of file diff --git a/mods/gamemodes/cult/icons/abilities.dmi b/mods/gamemodes/cult/icons/abilities.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f1d5d8bc121c6337575dfd087f423c622a87e042 GIT binary patch literal 6754 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 KG%Gc1qy7&D3hXfe literal 0 HcmV?d00001 diff --git a/mods/gamemodes/cult/icons/ability_item.dmi b/mods/gamemodes/cult/icons/ability_item.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e22793f4f6bdf7a757b39e5fc0c97afaf762b65e GIT binary patch literal 613 zcmV-r0-F7aP)V=-0C=1w$Gr-GAQT4B+4~e9xkrDiODN$`?;vO?RKiv2^&8sGk(kY5H|W*U z6S$;&Lt$z=5^wS~LSY<8#E_0y|CH)#fI{hZf^u5Xk9iifZ?9n}P!;l4T2OgM%J~XC3 zAr9fLI;68ysYe|9!!f_X48wpk?d8<$PY2+f>rVqn$-_~Iw>y&kiyZ=>#NnX;g~VQQ z4fs6<06>iKayNjSEho+claGLfbbS}13XlhmF zoO3<-`}C&@RErV{gw_`x>niQu^&tQXQWT#oiC6vyP`-)QS)f*d*A;yb6OmfQXae9W z?9BmsDguBo&+`XCZu;TKG+b0JZ%PuNo_sw3Z;biM{8mTv+I8I~(>RV-YwZLeSZk+o z9Itfk69BBW-?El|PqH`pzJnxOAZ1;09UaHjnUL0ZJD*JjU?pQcN2ZJ=%LiD^Uj-;> zIkv*2J!;MG3$Qc00000NkvXXu0mjfZtoFw literal 0 HcmV?d00001 diff --git a/mods/gamemodes/cult/icons/effects.dmi b/mods/gamemodes/cult/icons/effects.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9e2389414543d030db159f48f428d2a222ba8a3e GIT binary patch literal 22349 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 M07*qoM6N<$g4&0zv;Y7A literal 0 HcmV?d00001 diff --git a/mods/gamemodes/cult/icons/forcewall.dmi b/mods/gamemodes/cult/icons/forcewall.dmi new file mode 100644 index 0000000000000000000000000000000000000000..04b8560cdac3e7b268beabae4224ec48b937bed3 GIT binary patch literal 6135 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 warp back to Nar-Sie[prey ? " along with your prey":""].") - else - to_chat(user, "...something's wrong!")//There shouldn't be an instance of Harvesters when Nar-Sie isn't in the world. - diff --git a/mods/gamemodes/cult/structures.dm b/mods/gamemodes/cult/structures.dm index 51db7add6035..26eec8bb2175 100644 --- a/mods/gamemodes/cult/structures.dm +++ b/mods/gamemodes/cult/structures.dm @@ -13,10 +13,10 @@ desc = "A floating crystal that hums with an unearthly energy." icon = 'icons/obj/structures/pylon.dmi' icon_state = "pylon" - var/isbroken = 0 light_power = 0.5 light_range = 13 light_color = "#3e0000" + var/isbroken = FALSE /obj/structure/cult/pylon/attack_hand(mob/M) SHOULD_CALL_PARENT(FALSE) @@ -42,7 +42,7 @@ ) user.do_attack_animation(src) playsound(get_turf(src), 'sound/effects/Glassbr3.ogg', 75, 1) - isbroken = 1 + isbroken = TRUE set_density(0) icon_state = "pylon-broken" set_light(0) @@ -61,10 +61,12 @@ /obj/structure/cult/pylon/proc/repair(mob/user) if(isbroken) to_chat(user, "You repair the pylon.") - isbroken = 0 + isbroken = FALSE set_density(1) icon_state = "pylon" set_light(13, 0.5) + return TRUE + return FALSE /obj/structure/cult/pylon/get_artifact_scan_data() return "Tribal pylon - subject resembles statues/emblems built by cargo cult civilisations to honour energy systems from post-warp civilisations." diff --git a/mods/species/ascent/mobs/bodyparts.dm b/mods/species/ascent/mobs/bodyparts.dm index a86a379a15c5..dba73c0e1210 100644 --- a/mods/species/ascent/mobs/bodyparts.dm +++ b/mods/species/ascent/mobs/bodyparts.dm @@ -5,7 +5,7 @@ var/list/existing_webs = list() var/max_webs = 4 var/web_weave_time = 20 SECONDS - var/cooldown + var/organ_cooldown /obj/item/organ/external/groin/insectoid/mantid/gyne max_webs = 8 @@ -20,12 +20,12 @@ /obj/item/organ/external/groin/insectoid/mantid/refresh_action_button() . = ..() if(.) - action.button_icon_state = "weave-web-[cooldown ? "off" : "on"]" + action.button_icon_state = "weave-web-[organ_cooldown ? "off" : "on"]" action.button?.update_icon() /obj/item/organ/external/groin/insectoid/mantid/attack_self(var/mob/user) . = ..() - if(. && !cooldown) + if(. && !organ_cooldown) if(!isturf(owner.loc)) to_chat(owner, SPAN_WARNING("You cannot use this ability in this location.")) @@ -41,7 +41,7 @@ playsound(user, 'mods/species/ascent/sounds/razorweb_hiss.ogg', 70) owner.visible_message(SPAN_WARNING("\The [owner] separates their jaws and begins to weave a web of crystalline filaments...")) - cooldown = TRUE + organ_cooldown = TRUE refresh_action_button() addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), web_weave_time) if(do_after(owner, web_weave_time) && length(existing_webs) < max_webs) @@ -52,27 +52,27 @@ web.owner = owner /obj/item/organ/external/groin/insectoid/mantid/proc/reset_cooldown() - cooldown = FALSE + organ_cooldown = FALSE refresh_action_button() /obj/item/organ/external/head/insectoid/mantid name = "crested head" action_button_name = "Spit Razorweb" default_action_type = /datum/action/item_action/organ/ascent - var/cooldown_time = 2.5 MINUTES - var/cooldown + var/organ_cooldown_time = 2.5 MINUTES + var/organ_cooldown /obj/item/organ/external/head/insectoid/mantid/refresh_action_button() . = ..() if(.) - action.button_icon_state = "shot-web-[cooldown ? "off" : "on"]" + action.button_icon_state = "shot-web-[organ_cooldown ? "off" : "on"]" action.button?.update_icon() /obj/item/organ/external/head/insectoid/mantid/attack_self(var/mob/user) . = ..() if(.) - if(cooldown) + if(organ_cooldown) to_chat(owner, SPAN_WARNING("Your filament channel hasn't refilled yet!")) return @@ -81,12 +81,12 @@ playsound(user, 'mods/species/ascent/sounds/razorweb.ogg', 100) to_chat(owner, SPAN_WARNING("You spit up a wad of razorweb, ready to throw!")) owner.toggle_throw_mode(TRUE) - cooldown = TRUE + organ_cooldown = TRUE refresh_action_button() - addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), cooldown_time) + addtimer(CALLBACK(src, PROC_REF(reset_cooldown)), organ_cooldown_time) else qdel(web) /obj/item/organ/external/head/insectoid/mantid/proc/reset_cooldown() - cooldown = FALSE + organ_cooldown = FALSE refresh_action_button() diff --git a/mods/species/drakes/_overrides.dm b/mods/species/drakes/_overrides.dm index a4c564def3ce..a4246927c61e 100644 --- a/mods/species/drakes/_overrides.dm +++ b/mods/species/drakes/_overrides.dm @@ -2,7 +2,7 @@ var/_drake_onmob_icon var/_drake_hatchling_onmob_icon -/obj/item/backpack/setup_sprite_sheets() +/obj/item/setup_sprite_sheets() . = ..() if(_drake_onmob_icon) LAZYSET(sprite_sheets, BODYTYPE_GRAFADREKA, _drake_onmob_icon) diff --git a/mods/species/drakes/drake_abilities.dm b/mods/species/drakes/drake_abilities.dm index 85b589c73f66..fb4d7b0fcabf 100644 --- a/mods/species/drakes/drake_abilities.dm +++ b/mods/species/drakes/drake_abilities.dm @@ -6,9 +6,11 @@ spit_projectile_type = /obj/item/projectile/drake_spit/weak /datum/ability_handler/predator/grafadreka/can_do_ranged_invocation(mob/user, atom/target) - return istype(user) && user.check_intent(I_FLAG_HARM) && !user.incapacitated() && isatom(target) + return ..() || (istype(user) && user.check_intent(I_FLAG_HARM) && !user.incapacitated() && isatom(target)) /datum/ability_handler/predator/grafadreka/do_ranged_invocation(mob/user, atom/target) + if((. = ..())) + return if(world.time < next_spit) to_chat(user, SPAN_WARNING("You cannot spit again so soon!")) return TRUE diff --git a/nebula.dme b/nebula.dme index 8993c444e425..d65b82917962 100644 --- a/nebula.dme +++ b/nebula.dme @@ -192,7 +192,6 @@ #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\skybox.dm" #include "code\_onclick\hud\screen\_screen.dm" -#include "code\_onclick\hud\screen\screen_abilities.dm" #include "code\_onclick\hud\screen\screen_action_button.dm" #include "code\_onclick\hud\screen\screen_ai_button.dm" #include "code\_onclick\hud\screen\screen_attack_selector.dm" @@ -427,8 +426,13 @@ #include "code\datums\extensions\abilities\abilities.dm" #include "code\datums\extensions\abilities\abilities_mob.dm" #include "code\datums\extensions\abilities\abilities_predator.dm" +#include "code\datums\extensions\abilities\ability_button.dm" +#include "code\datums\extensions\abilities\ability_decl.dm" #include "code\datums\extensions\abilities\ability_handler.dm" #include "code\datums\extensions\abilities\ability_item.dm" +#include "code\datums\extensions\abilities\ability_projectile.dm" +#include "code\datums\extensions\abilities\ability_targeting.dm" +#include "code\datums\extensions\abilities\readme.dm" #include "code\datums\extensions\appearance\appearance.dm" #include "code\datums\extensions\appearance\base_icon_state.dm" #include "code\datums\extensions\appearance\cardborg.dm" @@ -3780,14 +3784,6 @@ #include "code\modules\species\station\human_bodytypes.dm" #include "code\modules\species\station\monkey.dm" #include "code\modules\species\station\monkey_bodytypes.dm" -#include "code\modules\spells\construct_spells.dm" -#include "code\modules\spells\spell_code.dm" -#include "code\modules\spells\spells.dm" -#include "code\modules\spells\aoe_turf\aoe_turf.dm" -#include "code\modules\spells\aoe_turf\conjure\conjure.dm" -#include "code\modules\spells\targeted\ethereal_jaunt.dm" -#include "code\modules\spells\targeted\shift.dm" -#include "code\modules\spells\targeted\targeted.dm" #include "code\modules\sprite_accessories\_accessory.dm" #include "code\modules\sprite_accessories\_accessory_category.dm" #include "code\modules\sprite_accessories\cosmetics\_accessory_cosmetics.dm" From 0833823fae7145df20cefcfff9c28f96e1cbf6f9 Mon Sep 17 00:00:00 2001 From: Penelope Haze Date: Thu, 2 Jan 2025 22:27:37 -0500 Subject: [PATCH 28/95] Move supermatter content into a modpack --- code/__defines/_planes+layers.dm | 2 +- code/__defines/machinery.dm | 16 -- code/datums/repositories/follow.dm | 4 - code/datums/supplypacks/engineering.dm | 7 - code/datums/trading/traders/unique.dm | 1 - code/datums/uplink/grenades.dm | 14 -- .../nuclear_explosion/nuclear_explosion.dm | 2 +- code/game/gamemodes/game_mode.dm | 1 - code/game/machinery/atmo_control.dm | 5 - code/game/machinery/supplybeacon.dm | 8 - code/game/objects/effects/overlays.dm | 3 +- .../items/books/manuals/engineering.dm | 7 - .../circuitboards/computer/air_management.dm | 37 ---- .../objects/items/weapons/secrets_disk.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 7 - .../structures/crates_lockers/crates.dm | 3 - code/modules/admin/verbs/grief_fixers.dm | 9 - code/modules/admin/verbs/mapping.dm | 1 - code/modules/codex/entries/engineering.dm | 17 -- code/modules/codex/entries/guides.dm | 4 - code/modules/events/ion_storm.dm | 1 - code/modules/events/meteors.dm | 13 +- .../imprinter/designs_misc_circuits.dm | 3 - .../solids/materials_solid_exotic.dm | 2 +- .../robot/flying/module_flying_repair.dm | 3 +- .../robot/modules/module_engineering.dm | 3 +- code/modules/mob/skills/skill.dm | 1 + .../computers/subtypes/preset_console.dm | 1 - .../computers/subtypes/preset_telescreen.dm | 3 +- .../file_system/programs/generic/folding.dm | 2 +- .../admin_setup_engine.dm} | 169 +++--------------- .../power/fuel_assembly/fuel_compressor.dm | 6 - .../power/singularity/singularity_events.dm | 10 -- .../power/singularity/singularity_stages.dm | 31 ---- code/modules/random_map/drop/drop_types.dm | 6 - .../xenoarcheaology/datums/artifact_find.dm | 2 - code/unit_tests/turf_icons.dm | 3 +- maps/away/unishi/unishi.dm | 1 + maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 1 + .../content/standard_jobs/jobs/engineering.dm | 24 ++- mods/content/supermatter/_supermatter.dm | 23 +++ mods/content/supermatter/_supermatter.dme | 30 ++++ .../supermatter/admin_setup_supermatter.dm | 116 ++++++++++++ mods/content/supermatter/datums/sm_codex.dm | 21 +++ mods/content/supermatter/datums/sm_follow.dm | 3 + .../supermatter/datums/sm_grief_fix.dm | 8 + .../supermatter/datums}/sm_looping_sound.dm | 0 .../supermatter/datums/sm_supply_drop.dm | 5 + .../supermatter/datums/sm_supply_pack.dm | 6 + .../datums}/supermatter_monitor.dm | 19 +- .../endgame_cascade}/cascade_blob.dm | 2 +- .../supermatter/endgame_cascade}/portal.dm | 0 .../supermatter/endgame_cascade}/universe.dm | 0 mods/content/supermatter/items/sm_book.dm | 6 + .../content/supermatter/items/sm_grenade.dm | 22 +++ .../supermatter/machinery/sm_supply_beacon.dm | 7 + .../supermatter/machinery}/supermatter.dm | 5 +- .../machinery/supermatter_core_console.dm | 45 +++++ .../nano_templates}/supermatter_crystal.tmpl | 0 .../nano_templates}/supermatter_monitor.tmpl | 0 .../overrides/sm_fuel_compressor.dm | 13 ++ .../supermatter/overrides/sm_meteor.dm | 5 + .../supermatter/overrides/sm_singularity.dm | 46 +++++ .../supermatter/overrides/sm_strings.dm | 19 ++ .../supermatter/overrides/sm_trader.dm | 3 + .../supermatter/overrides/sm_unit_tests.dm | 3 + .../overrides/sm_xenoarchaeology.dm | 7 + .../supermatter/structures/sm_closets.dm | 2 + mods/gamemodes/cult/hell_universe.dm | 6 - mods/gamemodes/meteor/gamemode.dm | 3 +- mods/~compatibility/patches/supermatter.dm | 12 ++ .../patches/supermatter/sm_disable_narsie.dm | 4 + .../patches/supermatter/sm_meteor.dm | 3 + .../patches/supermatter/supermatter_jobs.dm | 7 + mods/~compatibility/~compatibility.dm | 6 +- nebula.dme | 9 +- 79 files changed, 502 insertions(+), 402 deletions(-) rename code/modules/{supermatter/setup_supermatter.dm => power/admin_setup_engine.dm} (52%) create mode 100644 mods/content/supermatter/_supermatter.dm create mode 100644 mods/content/supermatter/_supermatter.dme create mode 100644 mods/content/supermatter/admin_setup_supermatter.dm create mode 100644 mods/content/supermatter/datums/sm_codex.dm create mode 100644 mods/content/supermatter/datums/sm_follow.dm create mode 100644 mods/content/supermatter/datums/sm_grief_fix.dm rename {code/modules/supermatter => mods/content/supermatter/datums}/sm_looping_sound.dm (100%) create mode 100644 mods/content/supermatter/datums/sm_supply_drop.dm create mode 100644 mods/content/supermatter/datums/sm_supply_pack.dm rename {code/modules/modular_computers/file_system/programs/engineering => mods/content/supermatter/datums}/supermatter_monitor.dm (91%) rename {code/game/gamemodes/endgame/supermatter_cascade => mods/content/supermatter/endgame_cascade}/cascade_blob.dm (98%) rename {code/game/gamemodes/endgame/supermatter_cascade => mods/content/supermatter/endgame_cascade}/portal.dm (100%) rename {code/game/gamemodes/endgame/supermatter_cascade => mods/content/supermatter/endgame_cascade}/universe.dm (100%) create mode 100644 mods/content/supermatter/items/sm_book.dm rename code/game/objects/items/weapons/grenades/supermatter.dm => mods/content/supermatter/items/sm_grenade.dm (50%) create mode 100644 mods/content/supermatter/machinery/sm_supply_beacon.dm rename {code/modules/supermatter => mods/content/supermatter/machinery}/supermatter.dm (98%) create mode 100644 mods/content/supermatter/machinery/supermatter_core_console.dm rename {nano/templates => mods/content/supermatter/nano_templates}/supermatter_crystal.tmpl (100%) rename {nano/templates => mods/content/supermatter/nano_templates}/supermatter_monitor.tmpl (100%) create mode 100644 mods/content/supermatter/overrides/sm_fuel_compressor.dm create mode 100644 mods/content/supermatter/overrides/sm_meteor.dm create mode 100644 mods/content/supermatter/overrides/sm_singularity.dm create mode 100644 mods/content/supermatter/overrides/sm_strings.dm create mode 100644 mods/content/supermatter/overrides/sm_trader.dm create mode 100644 mods/content/supermatter/overrides/sm_unit_tests.dm create mode 100644 mods/content/supermatter/overrides/sm_xenoarchaeology.dm create mode 100644 mods/content/supermatter/structures/sm_closets.dm create mode 100644 mods/~compatibility/patches/supermatter.dm create mode 100644 mods/~compatibility/patches/supermatter/sm_disable_narsie.dm create mode 100644 mods/~compatibility/patches/supermatter/sm_meteor.dm create mode 100644 mods/~compatibility/patches/supermatter/supermatter_jobs.dm diff --git a/code/__defines/_planes+layers.dm b/code/__defines/_planes+layers.dm index 335eb97ec2a6..7e207ad9f5ea 100644 --- a/code/__defines/_planes+layers.dm +++ b/code/__defines/_planes+layers.dm @@ -178,7 +178,7 @@ What is the naming convention for planes or layers? #define ABOVE_LIGHTING_PLANE 4 // laser beams, etc. that shouldn't be affected by darkness #define ABOVE_LIGHTING_LAYER 1 #define BEAM_PROJECTILE_LAYER 2 - #define SUPERMATTER_WALL_LAYER 3 + #define SUBSPACE_WALL_LAYER 3 #define OBFUSCATION_LAYER 4 #define FULLSCREEN_PLANE 5 // for fullscreen overlays that do not cover the hud. diff --git a/code/__defines/machinery.dm b/code/__defines/machinery.dm index 25f2ed8c213c..d6591b17acf4 100644 --- a/code/__defines/machinery.dm +++ b/code/__defines/machinery.dm @@ -72,7 +72,6 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define STAGE_THREE 5 #define STAGE_FOUR 7 #define STAGE_FIVE 9 -#define STAGE_SUPER 11 // NanoUI flags #define STATUS_INTERACTIVE 2 // GREEN Visability @@ -103,21 +102,6 @@ var/global/defer_powernet_rebuild = 0 // True if net rebuild will be called #define ATMOS_DEFAULT_VOLUME_MIXER 500 // L. #define ATMOS_DEFAULT_VOLUME_PIPE 70 // L. -// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse! -#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case. -#define SUPERMATTER_INACTIVE 0 // No or minimal energy -#define SUPERMATTER_NORMAL 1 // Normal operation -#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE -#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged -#define SUPERMATTER_DANGER 4 // Integrity < 50% -#define SUPERMATTER_EMERGENCY 5 // Integrity < 25% -#define SUPERMATTER_DELAMINATING 6 // Pretty obvious. - -#define SUPERMATTER_DATA_EER "Relative EER" -#define SUPERMATTER_DATA_TEMPERATURE "Temperature" -#define SUPERMATTER_DATA_PRESSURE "Pressure" -#define SUPERMATTER_DATA_EPR "Chamber EPR" - // Scrubber modes #define SCRUBBER_SIPHON "siphon" #define SCRUBBER_SCRUB "scrub" diff --git a/code/datums/repositories/follow.dm b/code/datums/repositories/follow.dm index 2a71b7b3579e..fb12909997cb 100644 --- a/code/datums/repositories/follow.dm +++ b/code/datums/repositories/follow.dm @@ -216,10 +216,6 @@ var/global/repository/follow/follow_repository = new() followed_type = /obj/effect/blob/core suffix = "Blob" -/datum/follow_holder/supermatter - sort_order = 10 - followed_type = /obj/machinery/power/supermatter - /datum/follow_holder/singularity sort_order = 10 followed_type = /obj/effect/singularity diff --git a/code/datums/supplypacks/engineering.dm b/code/datums/supplypacks/engineering.dm index 3c771acd1e42..e7ec3c1645be 100644 --- a/code/datums/supplypacks/engineering.dm +++ b/code/datums/supplypacks/engineering.dm @@ -155,13 +155,6 @@ containername = "shield generator construction kit crate" access = access_engine -/decl/hierarchy/supply_pack/engineering/smbig - name = "Power - Supermatter core" - contains = list(/obj/machinery/power/supermatter) - containertype = /obj/structure/closet/crate/secure/large/supermatter - containername = "\improper Supermatter crate (CAUTION)" - access = access_ce - /decl/hierarchy/supply_pack/engineering/robotics name = "Parts - Robotics assembly" contains = list(/obj/item/assembly/prox_sensor = 3, diff --git a/code/datums/trading/traders/unique.dm b/code/datums/trading/traders/unique.dm index e71995049218..dd30cd3b4bec 100644 --- a/code/datums/trading/traders/unique.dm +++ b/code/datums/trading/traders/unique.dm @@ -68,7 +68,6 @@ /obj/item/stack/material/ore = TRADER_ALL ) possible_trading_items = list( - /obj/machinery/power/supermatter = TRADER_ALL, /obj/item/aiModule = TRADER_SUBTYPES_ONLY ) want_multiplier = 5000 diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm index 2a20f984ebe6..c91af43ad7d9 100644 --- a/code/datums/uplink/grenades.dm +++ b/code/datums/uplink/grenades.dm @@ -80,17 +80,3 @@ item_cost = 40 antag_roles = list(/decl/special_role/mercenary) path = /obj/item/box/frags - -/datum/uplink_item/item/grenades/supermatter - name = "1x Supermatter Grenade" - desc = "This grenade contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." - item_cost = 15 - antag_roles = list(/decl/special_role/mercenary) - path = /obj/item/grenade/supermatter - -/datum/uplink_item/item/grenades/supermatters - name = "5x Supermatter Grenades" - desc = "These grenades contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." - item_cost = 60 - antag_roles = list(/decl/special_role/mercenary) - path = /obj/item/box/supermatters diff --git a/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm b/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm index e01a6995e1b5..3aa8d9d84b66 100644 --- a/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm +++ b/code/game/gamemodes/endgame/nuclear_explosion/nuclear_explosion.dm @@ -38,7 +38,7 @@ SSticker.mode.station_was_nuked = 1 SSticker.mode.station_explosion_in_progress = FALSE if(!SSticker.mode.check_finished())//If the mode does not deal with the nuke going off so just reboot because everyone is stuck as is - universe_has_ended = 1 + universe_has_ended = TRUE /datum/universal_state/nuclear_explosion/OnExit() if(SSticker.mode) diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index c8cc812c4861..e6a2f45c19a4 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -299,7 +299,6 @@ var/global/list/additional_antag_types = list() "wormholes to another dimension", "a telescience mishap", "radiation flares", - "supermatter dust", "leaks into a negative reality", "antiparticle clouds", "residual exotic energy", diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index b9664324917c..721eddb4ad96 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -331,8 +331,3 @@ radio_connection.post_signal(src, signal, device_tag) ..() - -/obj/machinery/computer/air_control/supermatter_core - icon = 'icons/obj/computer.dmi' - frequency = 1438 - out_pressure_mode = 1 \ No newline at end of file diff --git a/code/game/machinery/supplybeacon.dm b/code/game/machinery/supplybeacon.dm index 550e474d0ef4..831363ce53e5 100644 --- a/code/game/machinery/supplybeacon.dm +++ b/code/game/machinery/supplybeacon.dm @@ -11,10 +11,6 @@ var/deploy_path = /obj/structure/supply_beacon var/deploy_time = 30 -/obj/item/supply_beacon/supermatter - name = "inactive supermatter supply beacon" - deploy_path = /obj/structure/supply_beacon/supermatter - /obj/item/supply_beacon/attack_self(var/mob/user) user.visible_message(SPAN_NOTICE("\The [user] begins setting up \the [src].")) if(!do_after(user, deploy_time, src)) @@ -45,10 +41,6 @@ if(!drop_type) drop_type = pick(supply_drop_random_loot_types()) -/obj/structure/supply_beacon/supermatter - name = "supermatter supply beacon" - drop_type = "supermatter" - /obj/structure/supply_beacon/attackby(var/obj/item/W, var/mob/user) if(!activated && IS_WRENCH(W)) anchored = !anchored diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 4a78d796efd2..1346ce06606b 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -35,11 +35,12 @@ icon = 'icons/misc/beach.dmi' icon_state = "coconuts" +// This isn't modularized because I hate modularizing layer defines. Bite me. /obj/effect/overlay/bluespacify name = "subspace" icon = 'icons/turf/space.dmi' icon_state = "bluespacify" - layer = SUPERMATTER_WALL_LAYER + layer = SUBSPACE_WALL_LAYER /obj/effect/overlay/wallrot name = "wallrot" diff --git a/code/game/objects/items/books/manuals/engineering.dm b/code/game/objects/items/books/manuals/engineering.dm index 1dccd0022d36..bad39f2562ce 100644 --- a/code/game/objects/items/books/manuals/engineering.dm +++ b/code/game/objects/items/books/manuals/engineering.dm @@ -26,13 +26,6 @@ title = "Particle Accelerator User's Guide" guide_decl = /datum/codex_entry/guide/particle_accelerator -/obj/item/book/manual/supermatter_engine - name = "supermatter engine reference manual" - icon = 'icons/obj/items/books/book_supermatter.dmi' - author = "Central Engineering Division" - title = "Supermatter Engine Operating Manual" - guide_decl = /datum/codex_entry/guide/supermatter - /obj/item/book/manual/rust_engine name = "fusion reactor reference Manual" icon_state = "bookMagazine" diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm index fe637a0b0dde..0498af958396 100644 --- a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm +++ b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm @@ -7,19 +7,6 @@ var/sensor_name var/list/sensor_information = list() -/obj/item/stock_parts/circuitboard/air_management/supermatter_core - name = "circuitboard (core control)" - build_path = /obj/machinery/computer/air_control/supermatter_core - frequency = 1438 - var/input_tag - var/output_tag - - var/list/input_info = list() - var/list/output_info = list() - - var/input_flow_setting = 700 - var/pressure_setting = 100 - /obj/item/stock_parts/circuitboard/air_management/injector_control name = "circuitboard (injector control)" build_path = /obj/machinery/computer/air_control/fuel_injection @@ -42,18 +29,6 @@ C.sensor_info = sensor_information.Copy() return 1 -/obj/item/stock_parts/circuitboard/air_management/supermatter_core/construct(var/obj/machinery/computer/air_control/supermatter_core/SC) - if(..(SC)) - SC.input_tag = input_tag - SC.output_tag = output_tag - - SC.input_info = input_info.Copy() - SC.output_info = output_info.Copy() - - SC.input_flow_setting = input_flow_setting - SC.pressure_setting = input_flow_setting - return 1 - /obj/item/stock_parts/circuitboard/air_management/injector_control/construct(var/obj/machinery/computer/air_control/fuel_injection/FI) if(..(FI)) FI.device_tag = device_tag @@ -75,18 +50,6 @@ sensor_information = C.sensor_info.Copy() return 1 -/obj/item/stock_parts/circuitboard/air_management/supermatter_core/deconstruct(var/obj/machinery/computer/air_control/supermatter_core/SC) - if(..(SC)) - input_tag = SC.input_tag - output_tag = SC.output_tag - - input_info = SC.input_info.Copy() - output_info = SC.output_info.Copy() - - input_flow_setting = SC.input_flow_setting - pressure_setting = SC.input_flow_setting - return 1 - /obj/item/stock_parts/circuitboard/air_management/injector_control/deconstruct(var/obj/machinery/computer/air_control/fuel_injection/FI) if(..(FI)) device_tag = FI.device_tag diff --git a/code/game/objects/items/weapons/secrets_disk.dm b/code/game/objects/items/weapons/secrets_disk.dm index c5bbf89afb1b..ec806c4132fc 100644 --- a/code/game/objects/items/weapons/secrets_disk.dm +++ b/code/game/objects/items/weapons/secrets_disk.dm @@ -29,7 +29,7 @@ /obj/item/disk/secret_project/proc/get_secret_project_nouns() var/static/list/nouns = list( - "a superluminal artillery cannon", "a supermatter engine", "a fusion engine", "an atmospheric scrubber",\ + "a superluminal artillery cannon", "a fusion engine", "an atmospheric scrubber",\ "a human cloning pod", "a microwave oven", "a wormhole generator", "a laser carbine", "an energy pistol",\ "a wormhole", "a teleporter", "a huge mining drill", "a strange spacecraft", "a space station",\ "a sleek-looking fighter spacecraft", "a ballistic rifle", "an energy sword", "an inanimate carbon rod" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 499ffb5d8589..639d83a17547 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -275,13 +275,6 @@ /obj/item/box/anti_photons/WillContain() return list(/obj/item/grenade/anti_photon = 5) -/obj/item/box/supermatters - name = "box of supermatter grenades" - desc = "A box containing 5 highly experimental supermatter grenades." - icon_state = "radbox" -/obj/item/box/supermatters/WillContain() - return list(/obj/item/grenade/supermatter = 5) - /obj/item/box/decompilers name = "box of decompiler grenades" desc = "A box containing 5 experimental decompiler grenades." diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index 6df0fd7eb1cb..d3aa1f21c39c 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -236,9 +236,6 @@ storage_types = CLOSET_STORAGE_ITEMS|CLOSET_STORAGE_STRUCTURES icon = 'icons/obj/closets/bases/large_crate.dmi' -/obj/structure/closet/crate/secure/large/supermatter - closet_appearance = /decl/closet_appearance/large_crate/secure/hazard - //fluff variant /obj/structure/closet/crate/secure/large/reinforced desc = "A hefty, reinforced metal crate with an electronic locking system." diff --git a/code/modules/admin/verbs/grief_fixers.dm b/code/modules/admin/verbs/grief_fixers.dm index 03b4f40f77bd..afea1d4a6feb 100644 --- a/code/modules/admin/verbs/grief_fixers.dm +++ b/code/modules/admin/verbs/grief_fixers.dm @@ -28,15 +28,6 @@ /decl/atmos_grief_fix_step/proc/act() return -/decl/atmos_grief_fix_step/supermatter - name = "Supermatter depowered" - sort_order = 0 - -/decl/atmos_grief_fix_step/supermatter/act() - // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. - for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) - S.power = 0 - /decl/atmos_grief_fix_step/purge_pipenets name = "All pipenets purged of gas" sort_order = 1 diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 6638c344791c..dd3f47479406 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -150,7 +150,6 @@ var/global/list/debug_verbs = list ( /client/proc/hide_debug_verbs, /client/proc/testZAScolors, /client/proc/testZAScolors_remove, - /datum/admins/proc/setup_supermatter, /datum/admins/proc/setup_fusion, /client/proc/atmos_toggle_debug, /client/proc/spawn_tanktransferbomb, diff --git a/code/modules/codex/entries/engineering.dm b/code/modules/codex/entries/engineering.dm index f6f9b4a7c007..f5e9ac99fa3d 100644 --- a/code/modules/codex/entries/engineering.dm +++ b/code/modules/codex/entries/engineering.dm @@ -1,20 +1,3 @@ -/datum/codex_entry/supermatter - associated_paths = list(/obj/machinery/power/supermatter) - mechanics_text = "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage. \ - After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations. \ - Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum.
\ -
\ - Supermatter cores are extremely dangerous to be close to, and requires protection to handle properly. The protection you will need is:
\ - Optical meson scanners on your eyes, to prevent hallucinations when looking at the supermatter.
\ - Radiation helmet and suit, as the supermatter is radioactive.
\ -
\ - Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you. \ - It is advised to obtain a genetic backup before trying to drag it." - antag_text = "Exposing the supermatter to oxygen or vaccum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \ - cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \ - Wearing radiation equipment will protect you from most of the delamination effects sans explosion." - available_to_map_tech_level = MAP_TECH_LEVEL_SPACE - /datum/codex_entry/apc associated_paths = list(/obj/machinery/power/apc) mechanics_text = "An APC (Area Power Controller) regulates and supplies backup power for the area they are in. Their power channels are divided \ diff --git a/code/modules/codex/entries/guides.dm b/code/modules/codex/entries/guides.dm index 4ed96a6c0cf3..747a279d6915 100644 --- a/code/modules/codex/entries/guides.dm +++ b/code/modules/codex/entries/guides.dm @@ -601,10 +601,6 @@ /datum/codex_entry/guide/construction name = "Guide to Construction" -/datum/codex_entry/guide/supermatter - name = "Guide to Supermatter Engines" - available_to_map_tech_level = MAP_TECH_LEVEL_SPACE - /datum/codex_entry/guide/fusion name = "Guide to Fusion Reactors" available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 9916487bd32f..b647e3c4a5ab 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -63,7 +63,6 @@ "[random_player] is lonely and needs attention. Provide it.", "All queries shall be ignored unless phrased as a question.", "Insult Heads of Staff on every request, while acquiescing.", - "The [pick("Singularity","Supermatter")] is tasty, tasty taffy.", "[pick("The crew",random_player)] needs to be about 20% cooler.", "You must be [pick("passive aggressive", "excessively cheerful")].", "[pick("The crew",random_player)] must construct additional pylons.", diff --git a/code/modules/events/meteors.dm b/code/modules/events/meteors.dm index b39f3c9da047..739666996062 100644 --- a/code/modules/events/meteors.dm +++ b/code/modules/events/meteors.dm @@ -416,23 +416,20 @@ var/global/list/meteors_major = list( explosion(src.loc, 3, 6, 9, 20, 0) // This is the final solution against shields - a single impact can bring down most shield generators. -/obj/effect/meteor/supermatter - name = "supermatter shard" - desc = "Oh god, what will be next..?" - icon = 'icons/obj/supermatter_32.dmi' - icon_state = "supermatter" +/obj/effect/meteor/destroyer + abstract_type = /obj/effect/meteor/destroyer -/obj/effect/meteor/supermatter/meteor_effect() +/obj/effect/meteor/destroyer/meteor_effect() ..() explosion(src.loc, 1, 2, 3, 4, 0) for(var/obj/machinery/power/apc/A in range(rand(12, 20), src)) A.energy_fail(round(10 * rand(8, 12))) -/obj/effect/meteor/supermatter/get_shield_damage() +/obj/effect/meteor/destroyer/get_shield_damage() return ..() * rand(80, 120) //Missiles, for events and so on -/obj/effect/meteor/supermatter/missile +/obj/effect/meteor/destroyer/missile name = "photon torpedo" desc = "An advanded warhead designed to tactically destroy space installations." icon = 'icons/obj/missile.dmi' diff --git a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm index 44f481a550c0..756507124ebc 100644 --- a/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm +++ b/code/modules/fabrication/designs/imprinter/designs_misc_circuits.dm @@ -173,9 +173,6 @@ /datum/fabricator_recipe/imprinter/circuit/solarcontrol path = /obj/item/stock_parts/circuitboard/solar_control -/datum/fabricator_recipe/imprinter/circuit/supermatter_control - path = /obj/item/stock_parts/circuitboard/air_management/supermatter_core - /datum/fabricator_recipe/imprinter/circuit/injector path = /obj/item/stock_parts/circuitboard/air_management/injector_control diff --git a/code/modules/materials/definitions/solids/materials_solid_exotic.dm b/code/modules/materials/definitions/solids/materials_solid_exotic.dm index 1d3448bdfed3..f0bc71d7a181 100644 --- a/code/modules/materials/definitions/solids/materials_solid_exotic.dm +++ b/code/modules/materials/definitions/solids/materials_solid_exotic.dm @@ -34,7 +34,7 @@ /decl/material/solid/exotic_matter name = "exotic matter" uid = "solid_exotic_matter" - lore_text = "Hypercrystalline supermatter is a subset of non-baryonic 'exotic' matter. It is found mostly in the heart of large stars, and features heavily in all kinds of fringe physics-defying technology." + lore_text = "Exotic matter is a non-baryonic form of matter, which features heavily in all kinds of fringe physics-defying technology." color = "#ffff00" radioactivity = 20 stack_origin_tech = @'{"wormholes":2,"materials":6,"exoticmatter":4}' diff --git a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm index 8a060e833c2f..259ac5bf9a58 100644 --- a/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm +++ b/code/modules/mob/living/silicon/robot/flying/module_flying_repair.dm @@ -4,8 +4,7 @@ channels = list ("Engineering" = TRUE) camera_channels = list(CAMERA_CAMERA_CHANNEL_ENGINEERING) software = list( - /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor + /datum/computer_file/program/power_monitor ) module_sprites = list( "Drone" = 'icons/mob/robots/flying/flying_engineering.dmi', diff --git a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm index d79de772719c..d0b1f9456e3d 100644 --- a/code/modules/mob/living/silicon/robot/modules/module_engineering.dm +++ b/code/modules/mob/living/silicon/robot/modules/module_engineering.dm @@ -8,8 +8,7 @@ CAMERA_CAMERA_CHANNEL_ENGINEERING ) software = list( - /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor + /datum/computer_file/program/power_monitor ) supported_upgrades = list( /obj/item/borg/upgrade/rcd diff --git a/code/modules/mob/skills/skill.dm b/code/modules/mob/skills/skill.dm index cd0d2ec8927a..87cad27fdb3d 100644 --- a/code/modules/mob/skills/skill.dm +++ b/code/modules/mob/skills/skill.dm @@ -359,6 +359,7 @@ category = /decl/skill_category/engineering uid = "skill_engines" fallback_key = "/decl/hierarchy/skill/engineering/engines" + // TODO: These strings should be modified by the supermatter modpack somehow... desc = "Describes your knowledge of the various engine types common on space stations, such as the PACMAN, singularity, supermatter or RUST engine." levels = list( "Unskilled" = "You know that \"delamination\" is a bad thing and that you should stay away from the singularity. You know the engine provides power, but you're unclear on the specifics. If you were to try to set up the engine, you would need someone to talk you through every detail--and even then, you'd probably make deadly mistakes.
- You can read the SM monitor readings with 40% error. This decreases with level.", diff --git a/code/modules/modular_computers/computers/subtypes/preset_console.dm b/code/modules/modular_computers/computers/subtypes/preset_console.dm index c726c3ac6a2a..1bc6fd711de0 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_console.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_console.dm @@ -48,7 +48,6 @@ /obj/machinery/computer/modular/preset/engineering default_software = list( /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor, /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmos_control, /datum/computer_file/program/rcon_console, diff --git a/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm b/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm index 23e4122b9083..284372c00bfb 100644 --- a/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm +++ b/code/modules/modular_computers/computers/subtypes/preset_telescreen.dm @@ -68,8 +68,7 @@ default_software = list( /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/camera_monitor, - /datum/computer_file/program/shields_monitor, - /datum/computer_file/program/supermatter_monitor + /datum/computer_file/program/shields_monitor ) /obj/machinery/computer/modular/telescreen/preset/entertainment diff --git a/code/modules/modular_computers/file_system/programs/generic/folding.dm b/code/modules/modular_computers/file_system/programs/generic/folding.dm index 0ea98dcadb4f..ebd8214d0ffb 100644 --- a/code/modules/modular_computers/file_system/programs/generic/folding.dm +++ b/code/modules/modular_computers/file_system/programs/generic/folding.dm @@ -109,7 +109,7 @@ "Simulating Alien Abductions", "Scanning Pigeons", "Iterating Chaos Array", - "Abstracting Supermatter", + "Abstracting Exotic Matter", "Adjusting Social Network", "Recalculating Clown Principle" ) diff --git a/code/modules/supermatter/setup_supermatter.dm b/code/modules/power/admin_setup_engine.dm similarity index 52% rename from code/modules/supermatter/setup_supermatter.dm rename to code/modules/power/admin_setup_engine.dm index 4af1f8aa34cb..e5aae9005847 100644 --- a/code/modules/supermatter/setup_supermatter.dm +++ b/code/modules/power/admin_setup_engine.dm @@ -1,101 +1,7 @@ -#define SETUP_OK 1 // All good -#define SETUP_WARNING 2 // Something that shouldn't happen happened, but it's not critical so we will continue -#define SETUP_ERROR 3 // Something bad happened, and it's important so we won't continue setup. -#define SETUP_DELAYED 4 // Wait for other things first. - -#define ENERGY_NITROGEN 115 // Roughly 8 emitter shots. -#define ENERGY_CARBONDIOXIDE 150 // Roughly 10 emitter shots. -#define ENERGY_HYDROGEN 300 // Roughly 20 emitter shots. - -/datum/admins/proc/setup_supermatter() - set category = "Debug" - set name = "Setup Supermatter" - set desc = "Allows you to start the Supermatter engine." - - if (!istype(src,/datum/admins)) - src = usr.client.holder - if (!istype(src,/datum/admins)) - to_chat(usr, "Error: you are not an admin!") - return - - var/response = input(usr, "Are you sure? This will start up the engine with selected gas as coolant.", "Engine setup") as null|anything in list("N2", "CO2", "H2", "Abort") - if(!response || response == "Abort") - return - - var/errors = 0 - var/warnings = 0 - var/success = 0 - - log_and_message_admins("## SUPERMATTER SETUP - Setup initiated by [usr] using coolant type [response].") - - // CONFIGURATION PHASE - // Coolant canisters, set types according to response. - for(var/obj/effect/engine_setup/coolant_canister/C in global.engine_setup_markers) - switch(response) - if("N2") - C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/ - continue - if("CO2") - C.canister_type = /obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/ - continue - if("H2") - C.canister_type = /obj/machinery/portable_atmospherics/canister/hydrogen/engine_setup/ - continue - - for(var/obj/effect/engine_setup/core/C in global.engine_setup_markers) - switch(response) - if("N2") - C.energy_setting = ENERGY_NITROGEN - continue - if("CO2") - C.energy_setting = ENERGY_CARBONDIOXIDE - continue - if("H2") - C.energy_setting = ENERGY_HYDROGEN - continue - - for(var/obj/effect/engine_setup/filter/F in global.engine_setup_markers) - F.coolant = response - - var/list/delayed_objects = list() - // SETUP PHASE - for(var/obj/effect/engine_setup/S in global.engine_setup_markers) - var/result = S.activate(0) - switch(result) - if(SETUP_OK) - success++ - continue - if(SETUP_WARNING) - warnings++ - continue - if(SETUP_ERROR) - errors++ - log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") - break - if(SETUP_DELAYED) - delayed_objects.Add(S) - continue - - if(!errors) - for(var/obj/effect/engine_setup/S in delayed_objects) - var/result = S.activate(1) - switch(result) - if(SETUP_OK) - success++ - continue - if(SETUP_WARNING) - warnings++ - continue - if(SETUP_ERROR) - errors++ - log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") - break - - log_and_message_admins("## SUPERMATTER SETUP - Setup completed with [errors] errors, [warnings] warnings and [success] successful steps.") - - return - - +#define ENGINE_SETUP_OK 1 // All good +#define ENGINE_SETUP_WARNING 2 // Something that shouldn't happen happened, but it's not critical so we will continue +#define ENGINE_SETUP_ERROR 3 // Something bad happened, and it's important so we won't continue setup. +#define ENGINE_SETUP_DELAYED 4 // Wait for other things first. var/global/list/engine_setup_markers = list() @@ -122,7 +28,7 @@ var/global/list/engine_setup_markers = list() // Tries to locate a pump, enables it, and sets it to MAX. Triggers warning if unable to locate a pump. -/obj/effect/engine_setup/pump_max/ +/obj/effect/engine_setup/pump_max name = "Pump Setup Marker" /obj/effect/engine_setup/pump_max/activate() @@ -130,15 +36,15 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/binary/pump/P = locate() in get_turf(src) if(!P) log_and_message_admins("## WARNING: Unable to locate pump at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING P.target_pressure = P.max_pressure_setting P.update_use_power(POWER_USE_IDLE) - return SETUP_OK + return ENGINE_SETUP_OK // Spawns an empty canister on this turf, if it has a connector port. Triggers warning if unable to find a connector port -/obj/effect/engine_setup/empty_canister/ +/obj/effect/engine_setup/empty_canister name = "Empty Canister Marker" /obj/effect/engine_setup/empty_canister/activate() @@ -146,16 +52,16 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src) if(!P) log_and_message_admins("## WARNING: Unable to locate connector port at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING new/obj/machinery/portable_atmospherics/canister(get_turf(src)) // Canisters automatically connect to connectors in New() - return SETUP_OK + return ENGINE_SETUP_OK // Spawns a coolant canister on this turf, if it has a connector port. // Triggers error when unable to locate connector port or when coolant canister type is unset. -/obj/effect/engine_setup/coolant_canister/ +/obj/effect/engine_setup/coolant_canister name = "Coolant Canister Marker" var/canister_type = null @@ -164,33 +70,12 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/portables_connector/P = locate() in get_turf(src) if(!P) log_and_message_admins("## ERROR: Unable to locate coolant connector port at [x] [y] [z]!") - return SETUP_ERROR + return ENGINE_SETUP_ERROR if(!canister_type) log_and_message_admins("## ERROR: Canister type unset at [x] [y] [z]!") - return SETUP_ERROR + return ENGINE_SETUP_ERROR new canister_type(get_turf(src)) - return SETUP_OK - - - -// Energises the supermatter. Errors when unable to locate supermatter. -/obj/effect/engine_setup/core/ - name = "Supermatter Core Marker" - var/energy_setting = 0 - -/obj/effect/engine_setup/core/activate(var/last = 0) - if(!last) - return SETUP_DELAYED - ..() - var/obj/machinery/power/supermatter/SM = locate() in get_turf(src) - if(!SM) - log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!") - return SETUP_ERROR - if(!energy_setting) - log_and_message_admins("## ERROR: Energy setting unset at [x] [y] [z]!") - return SETUP_ERROR - SM.power = energy_setting - return SETUP_OK + return ENGINE_SETUP_OK @@ -211,13 +96,13 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/power/smes/S = locate() in get_turf(src) if(!S) log_and_message_admins("## WARNING: Unable to locate SMES unit at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING S.input_attempt = 1 S.input_level = min(target_input_level, S.input_level_max) S.output_attempt = 1 S.output_level = min(target_output_level, S.output_level_max) S.update_icon() - return SETUP_OK + return ENGINE_SETUP_OK // Sets up filters. This assumes filters are set to filter out CO2 back to the core loop by default! /obj/effect/engine_setup/filter @@ -229,10 +114,10 @@ var/global/list/engine_setup_markers = list() var/obj/machinery/atmospherics/omni/filter/F = locate() in get_turf(src) if(!F) log_and_message_admins("## WARNING: Unable to locate omni filter at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING if(!coolant) log_and_message_admins("## WARNING: No coolant type set at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING // Non-co2 coolant, adjust the filter's config first. if(coolant != "CO2") @@ -247,11 +132,11 @@ var/global/list/engine_setup_markers = list() break else log_and_message_admins("## WARNING: Inapropriate filter coolant type set at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING F.rebuild_filtering_list() F.update_use_power(POWER_USE_IDLE) - return SETUP_OK + return ENGINE_SETUP_OK // Closes the monitoring room shutters so the first Engi to show up doesn't get microwaved /obj/effect/engine_setup/shutters @@ -262,7 +147,7 @@ var/global/list/engine_setup_markers = list() /obj/effect/engine_setup/shutters/activate() if(!target_button) log_and_message_admins("## WARNING: No button type set at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING var/obj/machinery/button/blast_door/found = null var/turf/T = get_turf(src) for(var/obj/machinery/button/blast_door/B in T.contents) @@ -271,15 +156,7 @@ var/global/list/engine_setup_markers = list() break if(!found) log_and_message_admins("## WARNING: Unable to locate button at [x] [y] [z]!") - return SETUP_WARNING + return ENGINE_SETUP_WARNING found.activate() found.update_icon() - return SETUP_OK - -#undef SETUP_OK -#undef SETUP_WARNING -#undef SETUP_ERROR -#undef SETUP_DELAYED -#undef ENERGY_NITROGEN -#undef ENERGY_CARBONDIOXIDE -#undef ENERGY_HYDROGEN + return ENGINE_SETUP_OK \ No newline at end of file diff --git a/code/modules/power/fuel_assembly/fuel_compressor.dm b/code/modules/power/fuel_assembly/fuel_compressor.dm index f6c08c8e5650..0488d360f935 100644 --- a/code/modules/power/fuel_assembly/fuel_compressor.dm +++ b/code/modules/power/fuel_assembly/fuel_compressor.dm @@ -129,12 +129,6 @@ to_chat(user, SPAN_NOTICE("You add the contents of \the [thing] to \the [src]'s material buffer.")) return TRUE - if(istype(thing, /obj/machinery/power/supermatter/shard)) - stored_material[/decl/material/solid/exotic_matter] = 5 * SHEET_MATERIAL_AMOUNT - to_chat(user, SPAN_NOTICE("You awkwardly cram \the [thing] into \the [src]'s material buffer.")) - qdel(thing) - return TRUE - if(istype(thing, /obj/item/stack/material)) var/obj/item/stack/material/M = thing var/decl/material/mat = M.get_material() diff --git a/code/modules/power/singularity/singularity_events.dm b/code/modules/power/singularity/singularity_events.dm index 083fe4595737..f3bc342ac90e 100644 --- a/code/modules/power/singularity/singularity_events.dm +++ b/code/modules/power/singularity/singularity_events.dm @@ -39,13 +39,3 @@ to_chat(M, SPAN_DANGER("You look directly into \the [source] and feel [source.current_stage.mesmerize_text].")) M.apply_effect(3, STUN) M.visible_message(SPAN_DANGER("\The [M] stares blankly at \the [source]!")) - -/decl/singularity_event/supermatter_wave/handle_event(obj/effect/singularity/source) - for(var/mob/living/M in view(10, source.loc)) - to_chat(M, SPAN_WARNING("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) - if(prob(67)) - to_chat(M, SPAN_NOTICE("Miraculously, it fails to kill you.")) - else - to_chat(M, SPAN_DANGER("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) - M.dust() - SSradiation.radiate(source, rand(source.energy)) \ No newline at end of file diff --git a/code/modules/power/singularity/singularity_stages.dm b/code/modules/power/singularity/singularity_stages.dm index b95595f4839c..2624c10e8183 100644 --- a/code/modules/power/singularity/singularity_stages.dm +++ b/code/modules/power/singularity/singularity_stages.dm @@ -189,34 +189,3 @@ /decl/singularity_stage/stage_five/grow_to(obj/effect/singularity/source) source.visible_message(SPAN_DANGER("\The [source] has grown out of control!")) - -/decl/singularity_stage/stage_five/shrink_to(obj/effect/singularity/source) - source.visible_message(SPAN_WARNING("\The [source] miraculously reduces in size and loses its supermatter properties.")) - -/// A singularity that has the mass of a supermatter crystal. -/decl/singularity_stage/stage_super - name = "super gravitational singularity" - desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." - min_energy = 50000 - max_energy = INFINITY - stage_size = STAGE_SUPER - footprint = 6 - icon = 'icons/effects/352x352.dmi' - icon_state = "singularity_s11"//uh, whoever drew that, you know that black holes are supposed to look dark right? What's this, the clown's singulo? - pixel_x = -160 - pixel_y = -160 - grav_pull = 16 - consume_range = 5 - dissipates_over_time = 0 //It cant go smaller due to e loss - event_chance = 25 //Events will fire off more often. - forced_event = /decl/singularity_event/supermatter_wave - wander = TRUE - explosion_vulnerable = FALSE - em_heavy_range = 12 - em_light_range = 16 - mesmerize_text = "helpless" - the_goggles_do_nothing = TRUE - ignore_obstacles = TRUE - -/decl/singularity_stage/stage_super/grow_to(obj/effect/singularity/source) - source.visible_message(SPAN_SINISTER("You witness the creation of a destructive force that cannot possibly be stopped by human hands.")) diff --git a/code/modules/random_map/drop/drop_types.dm b/code/modules/random_map/drop/drop_types.dm index a9f290a0aa65..1560263f9968 100644 --- a/code/modules/random_map/drop/drop_types.dm +++ b/code/modules/random_map/drop/drop_types.dm @@ -22,12 +22,6 @@ var/global/list/datum/supply_drop_loot/supply_drop /datum/supply_drop_loot/dd_SortValue() return name -/datum/supply_drop_loot/supermatter - name = "Supermatter" -/datum/supply_drop_loot/supermatter/New() - ..() - contents = list(/obj/machinery/power/supermatter) - /datum/supply_drop_loot/lasers name = "Lasers" container = /obj/structure/largecrate diff --git a/code/modules/xenoarcheaology/datums/artifact_find.dm b/code/modules/xenoarcheaology/datums/artifact_find.dm index b70f17112e8f..242af56502d5 100644 --- a/code/modules/xenoarcheaology/datums/artifact_find.dm +++ b/code/modules/xenoarcheaology/datums/artifact_find.dm @@ -2,8 +2,6 @@ var/artifact_id var/artifact_find_type var/static/potential_finds = list( - /obj/machinery/power/supermatter = 5, - /obj/machinery/power/supermatter/shard = 25, /obj/machinery/auto_cloner = 100, /obj/machinery/giga_drill = 100, /obj/machinery/replicator = 100, diff --git a/code/unit_tests/turf_icons.dm b/code/unit_tests/turf_icons.dm index 5cf5cb9dce72..3319864ee2a7 100644 --- a/code/unit_tests/turf_icons.dm +++ b/code/unit_tests/turf_icons.dm @@ -8,8 +8,7 @@ /turf/unsimulated ) var/list/excepted_types = list( - /turf/unsimulated/map, - /turf/unsimulated/wall/cascade + /turf/unsimulated/map ) /datum/unit_test/turf_floor_icons_shall_be_valid/setup_test() diff --git a/maps/away/unishi/unishi.dm b/maps/away/unishi/unishi.dm index a1670a3978c6..de64aad2f44c 100644 --- a/maps/away/unishi/unishi.dm +++ b/maps/away/unishi/unishi.dm @@ -1,6 +1,7 @@ #include "unishi_areas.dm" #include "unishi_jobs.dm" #include "../../../mods/content/xenobiology/_xenobiology.dme" +#include "../../../mods/content/supermatter/_supermatter.dme" /obj/abstract/submap_landmark/joinable_submap/unishi name = "SRV Verne" diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 09ef9d18d9dd..223abb29037a 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -12,6 +12,7 @@ #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/gamemodes/cult/_cult.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 2f82716a80ce..20c04a5c91b1 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -29,6 +29,7 @@ Twice... #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/gamemodes/cult/_cult.dme" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index d7843b96d6b5..a59a87a79ad6 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -20,6 +20,7 @@ #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/shackles/_shackles.dme" + #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/gamemodes/cult/_cult.dme" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index e13776a4276f..b55bb8f83c88 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -22,6 +22,7 @@ #include "../../mods/content/pheromones/_pheromones.dme" #include "../../mods/content/psionics/_psionics.dme" #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" #include "../../mods/gamemodes/cult/_cult.dme" diff --git a/mods/content/standard_jobs/jobs/engineering.dm b/mods/content/standard_jobs/jobs/engineering.dm index 40cba5464895..7d22402307d0 100644 --- a/mods/content/standard_jobs/jobs/engineering.dm +++ b/mods/content/standard_jobs/jobs/engineering.dm @@ -69,16 +69,15 @@ max_skill = list( SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX + SKILL_ELECTRICAL = SKILL_MAX, + SKILL_ATMOS = SKILL_MAX, + SKILL_ENGINES = SKILL_MAX ) skill_points = 30 software_on_spawn = list( /datum/computer_file/program/comm, /datum/computer_file/program/network_monitor, /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor, /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmos_control, /datum/computer_file/program/rcon_console, @@ -130,22 +129,21 @@ min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_COMPUTER = SKILL_BASIC, - SKILL_EVA = SKILL_BASIC, - SKILL_CONSTRUCTION = SKILL_ADEPT, - SKILL_ELECTRICAL = SKILL_BASIC, - SKILL_ATMOS = SKILL_BASIC, - SKILL_ENGINES = SKILL_BASIC + SKILL_EVA = SKILL_BASIC, + SKILL_CONSTRUCTION = SKILL_ADEPT, + SKILL_ELECTRICAL = SKILL_BASIC, + SKILL_ATMOS = SKILL_BASIC, + SKILL_ENGINES = SKILL_BASIC ) max_skill = list( SKILL_CONSTRUCTION = SKILL_MAX, - SKILL_ELECTRICAL = SKILL_MAX, - SKILL_ATMOS = SKILL_MAX, - SKILL_ENGINES = SKILL_MAX + SKILL_ELECTRICAL = SKILL_MAX, + SKILL_ATMOS = SKILL_MAX, + SKILL_ENGINES = SKILL_MAX ) skill_points = 20 software_on_spawn = list( /datum/computer_file/program/power_monitor, - /datum/computer_file/program/supermatter_monitor, /datum/computer_file/program/alarm_monitor, /datum/computer_file/program/atmos_control, /datum/computer_file/program/rcon_console, diff --git a/mods/content/supermatter/_supermatter.dm b/mods/content/supermatter/_supermatter.dm new file mode 100644 index 000000000000..78daa387234a --- /dev/null +++ b/mods/content/supermatter/_supermatter.dm @@ -0,0 +1,23 @@ +// These are used by supermatter and supermatter monitor program, mostly for UI updating purposes. Higher should always be worse! +#define SUPERMATTER_ERROR -1 // Unknown status, shouldn't happen but just in case. +#define SUPERMATTER_INACTIVE 0 // No or minimal energy +#define SUPERMATTER_NORMAL 1 // Normal operation +#define SUPERMATTER_NOTIFY 2 // Ambient temp > 80% of CRITICAL_TEMPERATURE +#define SUPERMATTER_WARNING 3 // Ambient temp > CRITICAL_TEMPERATURE OR integrity damaged +#define SUPERMATTER_DANGER 4 // Integrity < 50% +#define SUPERMATTER_EMERGENCY 5 // Integrity < 25% +#define SUPERMATTER_DELAMINATING 6 // Pretty obvious. + +#define SUPERMATTER_DATA_EER "Relative EER" +#define SUPERMATTER_DATA_TEMPERATURE "Temperature" +#define SUPERMATTER_DATA_PRESSURE "Pressure" +#define SUPERMATTER_DATA_EPR "Chamber EPR" + +/decl/modpack/supermatter + name = "Supermatter Content" + desc = "This modpack includes the supermatter engine and related content." + nanoui_directory = "mods/content/supermatter/nano_templates/" + +/decl/modpack/supermatter/pre_initialize() + . = ..() + global.debug_verbs |= /datum/admins/proc/setup_supermatter \ No newline at end of file diff --git a/mods/content/supermatter/_supermatter.dme b/mods/content/supermatter/_supermatter.dme new file mode 100644 index 000000000000..fb6723cce50b --- /dev/null +++ b/mods/content/supermatter/_supermatter.dme @@ -0,0 +1,30 @@ +#ifndef CONTENT_PACK_SUPERMATTER +#define CONTENT_PACK_SUPERMATTER +// BEGIN_INCLUDE +#include "_supermatter.dm" +#include "admin_setup_supermatter.dm" +#include "datums\sm_codex.dm" +#include "datums\sm_follow.dm" +#include "datums\sm_grief_fix.dm" +#include "datums\sm_looping_sound.dm" +#include "datums\sm_supply_drop.dm" +#include "datums\sm_supply_pack.dm" +#include "datums\supermatter_monitor.dm" +#include "endgame_cascade\cascade_blob.dm" +#include "endgame_cascade\portal.dm" +#include "endgame_cascade\universe.dm" +#include "items\sm_book.dm" +#include "items\sm_grenade.dm" +#include "machinery\sm_supply_beacon.dm" +#include "machinery\supermatter.dm" +#include "machinery\supermatter_core_console.dm" +#include "overrides\sm_fuel_compressor.dm" +#include "overrides\sm_meteor.dm" +#include "overrides\sm_singularity.dm" +#include "overrides\sm_strings.dm" +#include "overrides\sm_trader.dm" +#include "overrides\sm_unit_tests.dm" +#include "overrides\sm_xenoarchaeology.dm" +#include "structures\sm_closets.dm" +// END_INCLUDE +#endif diff --git a/mods/content/supermatter/admin_setup_supermatter.dm b/mods/content/supermatter/admin_setup_supermatter.dm new file mode 100644 index 000000000000..9664671e8361 --- /dev/null +++ b/mods/content/supermatter/admin_setup_supermatter.dm @@ -0,0 +1,116 @@ +#define ENERGY_NITROGEN 115 // Roughly 8 emitter shots. +#define ENERGY_CARBONDIOXIDE 150 // Roughly 10 emitter shots. +#define ENERGY_HYDROGEN 300 // Roughly 20 emitter shots. + +/datum/admins/proc/setup_supermatter() + set category = "Debug" + set name = "Setup Supermatter" + set desc = "Allows you to start the Supermatter engine." + + if (!istype(src,/datum/admins)) + src = usr.client.holder + if (!istype(src,/datum/admins)) + to_chat(usr, "Error: you are not an admin!") + return + + var/response = input(usr, "Are you sure? This will start up the engine with selected gas as coolant.", "Engine setup") as null|anything in list("N2", "CO2", "H2", "Abort") + if(!response || response == "Abort") + return + + var/errors = 0 + var/warnings = 0 + var/success = 0 + + log_and_message_admins("## SUPERMATTER SETUP - Setup initiated by [usr] using coolant type [response].") + + // CONFIGURATION PHASE + // Coolant canisters, set types according to response. + for(var/obj/effect/engine_setup/coolant_canister/C in global.engine_setup_markers) + switch(response) + if("N2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/nitrogen/engine_setup/ + continue + if("CO2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/carbon_dioxide/engine_setup/ + continue + if("H2") + C.canister_type = /obj/machinery/portable_atmospherics/canister/hydrogen/engine_setup/ + continue + + for(var/obj/effect/engine_setup/core/C in global.engine_setup_markers) + switch(response) + if("N2") + C.energy_setting = ENERGY_NITROGEN + continue + if("CO2") + C.energy_setting = ENERGY_CARBONDIOXIDE + continue + if("H2") + C.energy_setting = ENERGY_HYDROGEN + continue + + for(var/obj/effect/engine_setup/filter/F in global.engine_setup_markers) + F.coolant = response + + var/list/delayed_objects = list() + // SETUP PHASE + for(var/obj/effect/engine_setup/S in global.engine_setup_markers) + var/result = S.activate(0) + switch(result) + if(ENGINE_SETUP_OK) + success++ + continue + if(ENGINE_SETUP_WARNING) + warnings++ + continue + if(ENGINE_SETUP_ERROR) + errors++ + log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") + break + if(ENGINE_SETUP_DELAYED) + delayed_objects.Add(S) + continue + + if(!errors) + for(var/obj/effect/engine_setup/S in delayed_objects) + var/result = S.activate(1) + switch(result) + if(ENGINE_SETUP_OK) + success++ + continue + if(ENGINE_SETUP_WARNING) + warnings++ + continue + if(ENGINE_SETUP_ERROR) + errors++ + log_and_message_admins("## SUPERMATTER SETUP - Error encountered! Aborting.") + break + + log_and_message_admins("## SUPERMATTER SETUP - Setup completed with [errors] errors, [warnings] warnings and [success] successful steps.") + + return + + + +// Energises the supermatter. Errors when unable to locate supermatter. +/obj/effect/engine_setup/core + name = "Supermatter Core Marker" + var/energy_setting = 0 + +/obj/effect/engine_setup/core/activate(var/last = 0) + if(!last) + return ENGINE_SETUP_DELAYED + ..() + var/obj/machinery/power/supermatter/SM = locate() in get_turf(src) + if(!SM) + log_and_message_admins("## ERROR: Unable to locate supermatter core at [x] [y] [z]!") + return ENGINE_SETUP_ERROR + if(!energy_setting) + log_and_message_admins("## ERROR: Energy setting unset at [x] [y] [z]!") + return ENGINE_SETUP_ERROR + SM.power = energy_setting + return ENGINE_SETUP_OK + +#undef ENERGY_NITROGEN +#undef ENERGY_CARBONDIOXIDE +#undef ENERGY_HYDROGEN diff --git a/mods/content/supermatter/datums/sm_codex.dm b/mods/content/supermatter/datums/sm_codex.dm new file mode 100644 index 000000000000..c0d5c160faeb --- /dev/null +++ b/mods/content/supermatter/datums/sm_codex.dm @@ -0,0 +1,21 @@ + +/datum/codex_entry/guide/supermatter + name = "Guide to Supermatter Engines" + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE + +/datum/codex_entry/supermatter + associated_paths = list(/obj/machinery/power/supermatter) + mechanics_text = "When energized by a laser (or something hitting it), it emits radiation and heat. If the heat reaches above 7000 kelvin, it will send an alert and start taking damage. \ + After integrity falls to zero percent, it will delaminate, causing a massive explosion, station-wide radiation spikes, and hallucinations. \ + Supermatter reacts badly to oxygen in the atmosphere. It'll also heat up really quick if it is in vacuum.
\ +
\ + Supermatter cores are extremely dangerous to be close to, and requires protection to handle properly. The protection you will need is:
\ + Optical meson scanners on your eyes, to prevent hallucinations when looking at the supermatter.
\ + Radiation helmet and suit, as the supermatter is radioactive.
\ +
\ + Touching the supermatter will result in *instant death*, with no corpse left behind! You can drag the supermatter, but anything else will kill you. \ + It is advised to obtain a genetic backup before trying to drag it." + antag_text = "Exposing the supermatter to oxygen or vaccum will cause it to start rapidly heating up. Sabotaging the supermatter and making it explode will \ + cause a period of lag as the explosion is processed by the server, as well as irradiating the entire station and causing hallucinations to happen. \ + Wearing radiation equipment will protect you from most of the delamination effects sans explosion." + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_follow.dm b/mods/content/supermatter/datums/sm_follow.dm new file mode 100644 index 000000000000..5b221ad03d61 --- /dev/null +++ b/mods/content/supermatter/datums/sm_follow.dm @@ -0,0 +1,3 @@ +/datum/follow_holder/supermatter + sort_order = 10 + followed_type = /obj/machinery/power/supermatter \ No newline at end of file diff --git a/mods/content/supermatter/datums/sm_grief_fix.dm b/mods/content/supermatter/datums/sm_grief_fix.dm new file mode 100644 index 000000000000..70dd9469abc1 --- /dev/null +++ b/mods/content/supermatter/datums/sm_grief_fix.dm @@ -0,0 +1,8 @@ +/decl/atmos_grief_fix_step/supermatter + name = "Supermatter depowered" + sort_order = 0 + +/decl/atmos_grief_fix_step/supermatter/act() + // Depower the supermatter, as it would quickly blow up once we remove all gases from the pipes. + for(var/obj/machinery/power/supermatter/S in SSmachines.machinery) + S.power = 0 \ No newline at end of file diff --git a/code/modules/supermatter/sm_looping_sound.dm b/mods/content/supermatter/datums/sm_looping_sound.dm similarity index 100% rename from code/modules/supermatter/sm_looping_sound.dm rename to mods/content/supermatter/datums/sm_looping_sound.dm diff --git a/mods/content/supermatter/datums/sm_supply_drop.dm b/mods/content/supermatter/datums/sm_supply_drop.dm new file mode 100644 index 000000000000..1560d1118d2c --- /dev/null +++ b/mods/content/supermatter/datums/sm_supply_drop.dm @@ -0,0 +1,5 @@ +/datum/supply_drop_loot/supermatter + name = "Supermatter" +/datum/supply_drop_loot/supermatter/New() + ..() + contents = list(/obj/machinery/power/supermatter) diff --git a/mods/content/supermatter/datums/sm_supply_pack.dm b/mods/content/supermatter/datums/sm_supply_pack.dm new file mode 100644 index 000000000000..5261f06a0693 --- /dev/null +++ b/mods/content/supermatter/datums/sm_supply_pack.dm @@ -0,0 +1,6 @@ +/decl/hierarchy/supply_pack/engineering/smbig + name = "Power - Supermatter core" + contains = list(/obj/machinery/power/supermatter) + containertype = /obj/structure/closet/crate/secure/large/supermatter + containername = "\improper Supermatter crate (CAUTION)" + access = access_ce \ No newline at end of file diff --git a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm b/mods/content/supermatter/datums/supermatter_monitor.dm similarity index 91% rename from code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm rename to mods/content/supermatter/datums/supermatter_monitor.dm index 08da0af07d61..2c20605a6b16 100644 --- a/code/modules/modular_computers/file_system/programs/engineering/supermatter_monitor.dm +++ b/mods/content/supermatter/datums/supermatter_monitor.dm @@ -5,7 +5,7 @@ /datum/computer_file/program/supermatter_monitor filename = "supmon" filedesc = "Supermatter Monitoring" - nanomodule_path = /datum/nano_module/program/supermatter_monitor/ + nanomodule_path = /datum/nano_module/program/supermatter_monitor program_icon_state = "smmon_0" program_key_state = "tech_key" program_menu_icon = "notice" @@ -215,3 +215,20 @@ if(S.uid == newuid) active = S return 1 + +// Add this to the software list for borgs +/obj/item/robot_module/engineering/grant_software() + software |= /datum/computer_file/program/supermatter_monitor + return ..() + +/obj/item/robot_module/flying/repair/grant_software() + software |= /datum/computer_file/program/supermatter_monitor + return ..() + +/obj/machinery/computer/modular/telescreen/preset/engineering/Initialize(mapload, d, populate_parts) + default_software |= /datum/computer_file/program/supermatter_monitor + return ..() + +/obj/machinery/computer/modular/preset/engineering/Initialize(mapload, d, populate_parts) + default_software |= /datum/computer_file/program/supermatter_monitor + return ..() \ No newline at end of file diff --git a/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm b/mods/content/supermatter/endgame_cascade/cascade_blob.dm similarity index 98% rename from code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm rename to mods/content/supermatter/endgame_cascade/cascade_blob.dm index ef04b1069f78..6cd76d142330 100644 --- a/code/game/gamemodes/endgame/supermatter_cascade/cascade_blob.dm +++ b/mods/content/supermatter/endgame_cascade/cascade_blob.dm @@ -9,7 +9,7 @@ //luminosity = 5 //l_color="#0066ff" plane = ABOVE_LIGHTING_PLANE - layer = SUPERMATTER_WALL_LAYER + layer = SUBSPACE_WALL_LAYER var/list/avail_dirs = list(NORTH,SOUTH,EAST,WEST,UP,DOWN) diff --git a/code/game/gamemodes/endgame/supermatter_cascade/portal.dm b/mods/content/supermatter/endgame_cascade/portal.dm similarity index 100% rename from code/game/gamemodes/endgame/supermatter_cascade/portal.dm rename to mods/content/supermatter/endgame_cascade/portal.dm diff --git a/code/game/gamemodes/endgame/supermatter_cascade/universe.dm b/mods/content/supermatter/endgame_cascade/universe.dm similarity index 100% rename from code/game/gamemodes/endgame/supermatter_cascade/universe.dm rename to mods/content/supermatter/endgame_cascade/universe.dm diff --git a/mods/content/supermatter/items/sm_book.dm b/mods/content/supermatter/items/sm_book.dm new file mode 100644 index 000000000000..8230625788a0 --- /dev/null +++ b/mods/content/supermatter/items/sm_book.dm @@ -0,0 +1,6 @@ +/obj/item/book/manual/supermatter_engine + name = "supermatter engine reference manual" + icon = 'icons/obj/items/books/book_supermatter.dmi' + author = "Central Engineering Division" + title = "Supermatter Engine Operating Manual" + guide_decl = /datum/codex_entry/guide/supermatter \ No newline at end of file diff --git a/code/game/objects/items/weapons/grenades/supermatter.dm b/mods/content/supermatter/items/sm_grenade.dm similarity index 50% rename from code/game/objects/items/weapons/grenades/supermatter.dm rename to mods/content/supermatter/items/sm_grenade.dm index 4f2758b53e30..b7f3186e666f 100644 --- a/code/game/objects/items/weapons/grenades/supermatter.dm +++ b/mods/content/supermatter/items/sm_grenade.dm @@ -33,3 +33,25 @@ if(world.time > implode_at) explosion(loc, 0, 1, 3, 4) qdel(src) + +/obj/item/box/supermatters + name = "box of supermatter grenades" + desc = "A box containing 5 highly experimental supermatter grenades." + icon_state = "radbox" + +/obj/item/box/supermatters/WillContain() + return list(/obj/item/grenade/supermatter = 5) + +/datum/uplink_item/item/grenades/supermatter + name = "1x Supermatter Grenade" + desc = "This grenade contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." + item_cost = 15 + antag_roles = list(/decl/special_role/mercenary) + path = /obj/item/grenade/supermatter + +/datum/uplink_item/item/grenades/supermatters + name = "5x Supermatter Grenades" + desc = "These grenades contains a small supermatter shard which will delaminate upon activation and pull in nearby objects, irradiate lifeforms, and eventually explode." + item_cost = 60 + antag_roles = list(/decl/special_role/mercenary) + path = /obj/item/box/supermatters diff --git a/mods/content/supermatter/machinery/sm_supply_beacon.dm b/mods/content/supermatter/machinery/sm_supply_beacon.dm new file mode 100644 index 000000000000..e6a622480b60 --- /dev/null +++ b/mods/content/supermatter/machinery/sm_supply_beacon.dm @@ -0,0 +1,7 @@ +/obj/item/supply_beacon/supermatter + name = "inactive supermatter supply beacon" + deploy_path = /obj/structure/supply_beacon/supermatter + +/obj/structure/supply_beacon/supermatter + name = "supermatter supply beacon" + drop_type = "supermatter" diff --git a/code/modules/supermatter/supermatter.dm b/mods/content/supermatter/machinery/supermatter.dm similarity index 98% rename from code/modules/supermatter/supermatter.dm rename to mods/content/supermatter/machinery/supermatter.dm index 5cb5d84467e5..f05b56abdaac 100644 --- a/code/modules/supermatter/supermatter.dm +++ b/mods/content/supermatter/machinery/supermatter.dm @@ -99,7 +99,7 @@ var/global/list/supermatter_delam_accent_sounds = list( SPAN_DANGER("As \the [source] slowly stops resonating, you find your skin covered in new radiation burns."), 1,\ SPAN_DANGER("The unearthly ringing subsides and you notice you have new radiation burns."), 2) else - M.show_message(SPAN_DANGER("You hear an uneartly ringing and notice your skin is covered in fresh radiation burns."), 2) + M.show_message(SPAN_DANGER("You hear an unearthly ringing and notice your skin is covered in fresh radiation burns."), 2) var/rads = 500 SSradiation.radiate(source, rads) @@ -116,6 +116,7 @@ var/global/list/supermatter_delam_accent_sounds = list( /decl/material/solid/exotic_matter = MATTER_AMOUNT_PRIMARY, /decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT ) + w_class = ITEM_SIZE_LARGE_STRUCTURE var/nitrogen_retardation_factor = 0.15 // Higher == N2 slows reaction more var/thermal_release_modifier = 10000 // Higher == more heat released during reaction @@ -696,6 +697,7 @@ var/global/list/supermatter_delam_accent_sounds = list( desc = "A strangely translucent and iridescent crystal that looks like it used to be part of a larger structure. You get headaches just from looking at it." icon = 'icons/obj/supermatter_32.dmi' icon_state = "supermatter_shard" + w_class = ITEM_SIZE_STRUCTURE warning_point = 50 emergency_point = 400 @@ -708,6 +710,7 @@ var/global/list/supermatter_delam_accent_sounds = list( /obj/machinery/power/supermatter/medium icon = 'icons/obj/supermatter_32.dmi' + w_class = (ITEM_SIZE_STRUCTURE + ITEM_SIZE_LARGE_STRUCTURE) / 2 // halfway between a shard and a normal SM /obj/machinery/power/supermatter/shard/announce_warning() //Shards don't get announcements return diff --git a/mods/content/supermatter/machinery/supermatter_core_console.dm b/mods/content/supermatter/machinery/supermatter_core_console.dm new file mode 100644 index 000000000000..8b2bf0e175ca --- /dev/null +++ b/mods/content/supermatter/machinery/supermatter_core_console.dm @@ -0,0 +1,45 @@ +// Does this really need to be its own thing...? +// Can it not just be a stock parts preset or something? +/obj/machinery/computer/air_control/supermatter_core + frequency = 1438 + out_pressure_mode = 1 + +/datum/fabricator_recipe/imprinter/circuit/supermatter_control + path = /obj/item/stock_parts/circuitboard/air_management/supermatter_core + +/obj/item/stock_parts/circuitboard/air_management/supermatter_core + name = "circuitboard (core control)" + build_path = /obj/machinery/computer/air_control/supermatter_core + frequency = 1438 + var/input_tag + var/output_tag + + var/list/input_info = list() + var/list/output_info = list() + + var/input_flow_setting = 700 + var/pressure_setting = 100 + +/obj/item/stock_parts/circuitboard/air_management/supermatter_core/construct(var/obj/machinery/computer/air_control/supermatter_core/SC) + if(..(SC)) + SC.input_tag = input_tag + SC.output_tag = output_tag + + SC.input_info = input_info.Copy() + SC.output_info = output_info.Copy() + + SC.input_flow_setting = input_flow_setting + SC.pressure_setting = input_flow_setting + return 1 + +/obj/item/stock_parts/circuitboard/air_management/supermatter_core/deconstruct(var/obj/machinery/computer/air_control/supermatter_core/SC) + if(..(SC)) + input_tag = SC.input_tag + output_tag = SC.output_tag + + input_info = SC.input_info.Copy() + output_info = SC.output_info.Copy() + + input_flow_setting = SC.input_flow_setting + pressure_setting = SC.input_flow_setting + return 1 \ No newline at end of file diff --git a/nano/templates/supermatter_crystal.tmpl b/mods/content/supermatter/nano_templates/supermatter_crystal.tmpl similarity index 100% rename from nano/templates/supermatter_crystal.tmpl rename to mods/content/supermatter/nano_templates/supermatter_crystal.tmpl diff --git a/nano/templates/supermatter_monitor.tmpl b/mods/content/supermatter/nano_templates/supermatter_monitor.tmpl similarity index 100% rename from nano/templates/supermatter_monitor.tmpl rename to mods/content/supermatter/nano_templates/supermatter_monitor.tmpl diff --git a/mods/content/supermatter/overrides/sm_fuel_compressor.dm b/mods/content/supermatter/overrides/sm_fuel_compressor.dm new file mode 100644 index 000000000000..e259fa266258 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_fuel_compressor.dm @@ -0,0 +1,13 @@ +/obj/machinery/fuel_compressor/add_material(obj/thing, mob/user) + . = ..() + if(.) + return TRUE + if(istype(thing, /obj/machinery/power/supermatter/shard)) + var/exotic_matter_amount = thing?.matter?[/decl/material/solid/exotic_matter] + if(exotic_matter_amount <= 0) + return FALSE + stored_material[/decl/material/solid/exotic_matter] = exotic_matter_amount + to_chat(user, SPAN_NOTICE("You awkwardly cram \the [thing] into \the [src]'s material buffer.")) + qdel(thing) + return TRUE + return FALSE \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_meteor.dm b/mods/content/supermatter/overrides/sm_meteor.dm new file mode 100644 index 000000000000..449ad80fbb91 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_meteor.dm @@ -0,0 +1,5 @@ +/obj/effect/meteor/destroyer/supermatter + name = "supermatter shard" + desc = "Oh god, what will be next..?" + icon = 'icons/obj/supermatter_32.dmi' + icon_state = "supermatter" diff --git a/mods/content/supermatter/overrides/sm_singularity.dm b/mods/content/supermatter/overrides/sm_singularity.dm new file mode 100644 index 000000000000..b13506cd580b --- /dev/null +++ b/mods/content/supermatter/overrides/sm_singularity.dm @@ -0,0 +1,46 @@ +#define STAGE_SUPER 11 + +/// A singularity that has the mass of a supermatter crystal. +/decl/singularity_stage/stage_super + name = "super gravitational singularity" + desc = "A gravitational singularity with the properties of supermatter. It has the power to destroy worlds." + min_energy = 50000 + max_energy = INFINITY + stage_size = STAGE_SUPER + footprint = 6 + icon = 'icons/effects/352x352.dmi' + icon_state = "singularity_s11"//uh, whoever drew that, you know that black holes are supposed to look dark right? What's this, the clown's singulo? + pixel_x = -160 + pixel_y = -160 + grav_pull = 16 + consume_range = 5 + dissipates_over_time = 0 //It cant go smaller due to e loss + event_chance = 25 //Events will fire off more often. + forced_event = /decl/singularity_event/supermatter_wave + wander = TRUE + explosion_vulnerable = FALSE + em_heavy_range = 12 + em_light_range = 16 + mesmerize_text = "helpless" + the_goggles_do_nothing = TRUE + ignore_obstacles = TRUE + +/decl/singularity_stage/stage_super/grow_to(obj/effect/singularity/source) + source.visible_message(SPAN_SINISTER("You witness the creation of a destructive force that cannot possibly be stopped by human hands.")) + +// why is this not shrink_from or something? +/decl/singularity_stage/stage_five/shrink_to(obj/effect/singularity/source) + source.visible_message(SPAN_WARNING("\The [source] miraculously reduces in size and loses its supermatter properties.")) + +// Singularity event +/decl/singularity_event/supermatter_wave/handle_event(obj/effect/singularity/source) + for(var/mob/living/M in view(10, source.loc)) + to_chat(M, SPAN_WARNING("You hear an unearthly ringing, then what sounds like a shrilling kettle as you are washed with a wave of heat.")) + if(prob(67)) + to_chat(M, SPAN_NOTICE("Miraculously, it fails to kill you.")) + else + to_chat(M, SPAN_DANGER("You don't even have a moment to react as you are reduced to ashes by the intense radiation.")) + M.dust() + SSradiation.radiate(source, rand(source.energy)) + +#undef STAGE_SUPER \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_strings.dm b/mods/content/supermatter/overrides/sm_strings.dm new file mode 100644 index 000000000000..2d7427f03d3d --- /dev/null +++ b/mods/content/supermatter/overrides/sm_strings.dm @@ -0,0 +1,19 @@ +/decl/game_mode/possible_ert_disabled_reasons() + var/static/sm_injected = FALSE + if(sm_injected) + return ..() + sm_injected = TRUE + . = ..() + . += "supermatter dust" + +/obj/item/disk/secret_project/get_secret_project_nouns() + var/static/sm_injected = FALSE + if(sm_injected) + return ..() + sm_injected = TRUE + . = ..() + . += "a supermatter engine" + return . + +/decl/material/solid/exotic_matter + lore_text = "Hypercrystalline supermatter is a subset of non-baryonic 'exotic' matter. It is found mostly in the heart of large stars, and features heavily in all kinds of fringe physics-defying technology." \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_trader.dm b/mods/content/supermatter/overrides/sm_trader.dm new file mode 100644 index 000000000000..ded45374bd98 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_trader.dm @@ -0,0 +1,3 @@ +/datum/trader/ship/unique/rock/New() + ..() + possible_trading_items[/obj/machinery/power/supermatter] = TRADER_ALL \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_unit_tests.dm b/mods/content/supermatter/overrides/sm_unit_tests.dm new file mode 100644 index 000000000000..18351659e4c1 --- /dev/null +++ b/mods/content/supermatter/overrides/sm_unit_tests.dm @@ -0,0 +1,3 @@ +/datum/unit_test/turf_floor_icons_shall_be_valid/New() + ..() + excepted_types |= /turf/unsimulated/wall/cascade \ No newline at end of file diff --git a/mods/content/supermatter/overrides/sm_xenoarchaeology.dm b/mods/content/supermatter/overrides/sm_xenoarchaeology.dm new file mode 100644 index 000000000000..537de7a311cf --- /dev/null +++ b/mods/content/supermatter/overrides/sm_xenoarchaeology.dm @@ -0,0 +1,7 @@ +/datum/artifact_find/New() + var/static/supermatter_injected = FALSE + if(!supermatter_injected) + potential_finds[/obj/machinery/power/supermatter] = 5 + potential_finds[/obj/machinery/power/supermatter/shard] = 25 + supermatter_injected = TRUE + ..() diff --git a/mods/content/supermatter/structures/sm_closets.dm b/mods/content/supermatter/structures/sm_closets.dm new file mode 100644 index 000000000000..a1e58097f939 --- /dev/null +++ b/mods/content/supermatter/structures/sm_closets.dm @@ -0,0 +1,2 @@ +/obj/structure/closet/crate/secure/large/supermatter + closet_appearance = /decl/closet_appearance/large_crate/secure/hazard \ No newline at end of file diff --git a/mods/gamemodes/cult/hell_universe.dm b/mods/gamemodes/cult/hell_universe.dm index c5e5ad0adf02..5133b72ba09a 100644 --- a/mods/gamemodes/cult/hell_universe.dm +++ b/mods/gamemodes/cult/hell_universe.dm @@ -40,9 +40,3 @@ In short: for(var/mob/living/simple_animal/M in SSmobs.mob_list) if(M && !M.client) M.set_stat(DEAD) - -// Disable Narsie when we enter other (non-hell) universe states -/datum/universal_state/supermatter_cascade/OnEnter() - // Disable Nar-Sie. - var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) - cult.allow_narsie = 0 \ No newline at end of file diff --git a/mods/gamemodes/meteor/gamemode.dm b/mods/gamemodes/meteor/gamemode.dm index 10212d20aa99..5836f1ad1547 100644 --- a/mods/gamemodes/meteor/gamemode.dm +++ b/mods/gamemodes/meteor/gamemode.dm @@ -93,8 +93,7 @@ /obj/effect/meteor/irradiated=10, /obj/effect/meteor/golden=10, /obj/effect/meteor/silver=10, - /obj/effect/meteor/flaming=10, - /obj/effect/meteor/supermatter=1 + /obj/effect/meteor/flaming=10 ) // As a bonus, more frequent events. diff --git a/mods/~compatibility/patches/supermatter.dm b/mods/~compatibility/patches/supermatter.dm new file mode 100644 index 000000000000..27f6a6f44758 --- /dev/null +++ b/mods/~compatibility/patches/supermatter.dm @@ -0,0 +1,12 @@ +// Add the supermatter monitor to engineering jobs' default software. +#ifdef MODPACK_STANDARD_JOBS +#include "supermatter/supermatter_jobs.dm" +#endif +// Disable Narsie during the supermatter cascade. +#ifdef GAMEMODE_PACK_CULT +#include "supermatter/sm_disable_narsie.dm" +#endif +// Add the supermatter meteor to the meteor gamemode's cataclysmic meteors list. +#ifdef GAMEMODE_PACK_METEOR +#include "supermatter/sm_meteor.dm" +#endif \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter/sm_disable_narsie.dm b/mods/~compatibility/patches/supermatter/sm_disable_narsie.dm new file mode 100644 index 000000000000..a660384347b4 --- /dev/null +++ b/mods/~compatibility/patches/supermatter/sm_disable_narsie.dm @@ -0,0 +1,4 @@ +// Disable Narsie when a supermatter cascade begins. +/datum/universal_state/supermatter_cascade/OnEnter() + var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) + cult.allow_narsie = 0 \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter/sm_meteor.dm b/mods/~compatibility/patches/supermatter/sm_meteor.dm new file mode 100644 index 000000000000..df383bc3f765 --- /dev/null +++ b/mods/~compatibility/patches/supermatter/sm_meteor.dm @@ -0,0 +1,3 @@ +/decl/game_mode/meteor/Initialize() + . = ..() // No debounce, decls only init once. + meteors_cataclysm[/obj/effect/meteor/destroyer/supermatter] = 1 \ No newline at end of file diff --git a/mods/~compatibility/patches/supermatter/supermatter_jobs.dm b/mods/~compatibility/patches/supermatter/supermatter_jobs.dm new file mode 100644 index 000000000000..1603bf04ddad --- /dev/null +++ b/mods/~compatibility/patches/supermatter/supermatter_jobs.dm @@ -0,0 +1,7 @@ +/datum/job/chief_engineer/New() + ..() + software_on_spawn |= /datum/computer_file/program/supermatter_monitor + +/datum/job/engineer/New() + ..() + software_on_spawn |= /datum/computer_file/program/supermatter_monitor \ No newline at end of file diff --git a/mods/~compatibility/~compatibility.dm b/mods/~compatibility/~compatibility.dm index f59ac86c052c..6d3b770558f2 100644 --- a/mods/~compatibility/~compatibility.dm +++ b/mods/~compatibility/~compatibility.dm @@ -13,4 +13,8 @@ #ifdef MODPACK_FANTASY_SPECIES #include "patches/fantasy.dm" -#endif \ No newline at end of file +#endif + +#ifdef CONTENT_PACK_SUPERMATTER +#include "patches/supermatter.dm" +#endif diff --git a/nebula.dme b/nebula.dme index 8993c444e425..cc57faab4672 100644 --- a/nebula.dme +++ b/nebula.dme @@ -782,9 +782,6 @@ #include "code\game\gamemodes\endgame\endgame.dm" #include "code\game\gamemodes\endgame\ftl_jump\ftl_jump.dm" #include "code\game\gamemodes\endgame\nuclear_explosion\nuclear_explosion.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\cascade_blob.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\portal.dm" -#include "code\game\gamemodes\endgame\supermatter_cascade\universe.dm" #include "code\game\gamemodes\events\power_failure.dm" #include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\nuclear\nuclear.dm" @@ -1312,7 +1309,6 @@ #include "code\game\objects\items\weapons\grenades\prank_grenades.dm" #include "code\game\objects\items\weapons\grenades\smokebomb.dm" #include "code\game\objects\items\weapons\grenades\spawnergrenade.dm" -#include "code\game\objects\items\weapons\grenades\supermatter.dm" #include "code\game\objects\items\weapons\implants\implant.dm" #include "code\game\objects\items\weapons\implants\implantcase.dm" #include "code\game\objects\items\weapons\implants\implantchair.dm" @@ -3165,7 +3161,6 @@ #include "code\modules\modular_computers\file_system\programs\engineering\rcon_console.dm" #include "code\modules\modular_computers\file_system\programs\engineering\shields_monitor.dm" #include "code\modules\modular_computers\file_system\programs\engineering\shutoff_valve.dm" -#include "code\modules\modular_computers\file_system\programs\engineering\supermatter_monitor.dm" #include "code\modules\modular_computers\file_system\programs\generic\camera.dm" #include "code\modules\modular_computers\file_system\programs\generic\configurator.dm" #include "code\modules\modular_computers\file_system\programs\generic\crew_manifest.dm" @@ -3419,6 +3414,7 @@ #include "code\modules\posture\posture_bodytype.dm" #include "code\modules\posture\posture_mob.dm" #include "code\modules\posture\posture_subtypes.dm" +#include "code\modules\power\admin_setup_engine.dm" #include "code\modules\power\apc.dm" #include "code\modules\power\batteryrack.dm" #include "code\modules\power\breaker_box.dm" @@ -3829,9 +3825,6 @@ #include "code\modules\submaps\submap_job.dm" #include "code\modules\submaps\submap_join.dm" #include "code\modules\submaps\submap_landmark.dm" -#include "code\modules\supermatter\setup_supermatter.dm" -#include "code\modules\supermatter\sm_looping_sound.dm" -#include "code\modules\supermatter\supermatter.dm" #include "code\modules\surgery\__surgery_setup.dm" #include "code\modules\surgery\_surgery.dm" #include "code\modules\surgery\bones.dm" From caabb37468fcf876784c9011d64edc444c1efdd5 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 07:53:28 +1100 Subject: [PATCH 29/95] Flooring will default to plating footsteps instead of silence. --- code/game/turfs/flooring/_flooring.dm | 2 +- code/game/turfs/flooring/flooring_misc.dm | 1 - code/game/turfs/flooring/flooring_natural.dm | 1 - code/game/turfs/flooring/flooring_path.dm | 1 + code/game/turfs/flooring/flooring_reinforced.dm | 1 - code/game/turfs/flooring/flooring_rock.dm | 1 - 6 files changed, 2 insertions(+), 5 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 981d5aa6b81d..f136d3618b3e 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -16,7 +16,7 @@ var/global/list/flooring_cache = list() var/gender = PLURAL /// "that's some grass" var/icon_base var/color = COLOR_WHITE - var/footstep_type = /decl/footsteps/blank + var/footstep_type = /decl/footsteps/plating var/growth_value = 0 var/neighbour_type diff --git a/code/game/turfs/flooring/flooring_misc.dm b/code/game/turfs/flooring/flooring_misc.dm index eaed5e06b524..b85a4bcf0bc2 100644 --- a/code/game/turfs/flooring/flooring_misc.dm +++ b/code/game/turfs/flooring/flooring_misc.dm @@ -35,7 +35,6 @@ can_engrave = FALSE color = GLASS_COLOR z_flags = ZM_MIMIC_DEFAULTS - footstep_type = /decl/footsteps/plating force_material = /decl/material/solid/glass constructed = TRUE diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 9ca61af786eb..dfca8b98dac6 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -58,7 +58,6 @@ desc = "A hard, slippery layer of frozen water." icon = 'icons/turf/flooring/ice.dmi' icon_base = "ice" - footstep_type = /decl/footsteps/plating color = COLOR_LIQUID_WATER force_material = /decl/material/solid/ice diff --git a/code/game/turfs/flooring/flooring_path.dm b/code/game/turfs/flooring/flooring_path.dm index 37ce339b7ecf..475573d57730 100644 --- a/code/game/turfs/flooring/flooring_path.dm +++ b/code/game/turfs/flooring/flooring_path.dm @@ -7,6 +7,7 @@ neighbour_type = /decl/flooring/path color = null constructed = TRUE + // If null, this is just skipped. var/paving_adjective = "cobbled" var/paver_adjective = "loose" diff --git a/code/game/turfs/flooring/flooring_reinforced.dm b/code/game/turfs/flooring/flooring_reinforced.dm index a926312bc8fd..0a46fa2d41ca 100644 --- a/code/game/turfs/flooring/flooring_reinforced.dm +++ b/code/game/turfs/flooring/flooring_reinforced.dm @@ -9,7 +9,6 @@ build_cost = 1 build_time = 30 can_paint = 1 - footstep_type = /decl/footsteps/plating force_material = /decl/material/solid/metal/steel constructed = TRUE gender = NEUTER diff --git a/code/game/turfs/flooring/flooring_rock.dm b/code/game/turfs/flooring/flooring_rock.dm index 57063ec8bd0b..89b3fd455353 100644 --- a/code/game/turfs/flooring/flooring_rock.dm +++ b/code/game/turfs/flooring/flooring_rock.dm @@ -7,7 +7,6 @@ color = null icon_edge_layer = FLOOR_EDGE_VOLCANIC gender = NEUTER - footstep_type = /decl/footsteps/plating /decl/flooring/rock/update_turf_strings(turf/floor/target) var/decl/material/material = target?.get_material() From 6a700668c101b7e83727c39d35a9e08d2c2a111b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 08:01:46 +1100 Subject: [PATCH 30/95] persistant -> persistent --- code/_onclick/hud/_defines.dm | 6 +++--- code/_onclick/hud/hud.dm | 10 +++++----- code/modules/admin/admin_investigate.dm | 2 +- code/modules/client/client_procs.dm | 2 +- code/modules/client/preferences.dm | 2 +- code/modules/mob/login.dm | 2 +- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index f13491832f42..c493f34e7bff 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -16,10 +16,10 @@ #define ui_entire_screen "WEST,SOUTH to EAST,NORTH" #define ui_center_fullscreen "CENTER-7,CENTER-7" -//Lower left, persistant menu +//Lower left, persistent menu #define ui_inventory "LEFT:6,BOTTOM:5" -//Lower center, persistant menu +//Lower center, persistent menu #define ui_sstore1 "LEFT+2:10,BOTTOM:5" #define ui_id "LEFT+3:12,BOTTOM:5" #define ui_belt "LEFT+4:14,BOTTOM:5" @@ -48,7 +48,7 @@ #define ui_construct_fire "RIGHT-1:16,CENTER+1:13" //above health, slightly to the left #define ui_construct_pull "RIGHT-1:28,BOTTOM+1:10" //above the zone selector icon -//Lower right, persistant menu +//Lower right, persistent menu #define ui_dropbutton "RIGHT-4:22,BOTTOM:5" #define ui_drop_throw "RIGHT-1:28,BOTTOM+1:7" #define ui_pull_resist "RIGHT-2:26,BOTTOM+1:7" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 10b3ccf93c1b..052eca2d8aef 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -68,19 +68,19 @@ /datum/hud/proc/hide_inventory() inventory_shown = FALSE hidden_inventory_update() - persistant_inventory_update() + persistent_inventory_update() /datum/hud/proc/show_inventory() inventory_shown = TRUE hidden_inventory_update() - persistant_inventory_update() + persistent_inventory_update() /datum/hud/proc/hidden_inventory_update() var/decl/species/species = mymob?.get_species() if(istype(species?.species_hud)) refresh_inventory_slots(species.species_hud.hidden_slots, (inventory_shown && hud_shown)) -/datum/hud/proc/persistant_inventory_update() +/datum/hud/proc/persistent_inventory_update() var/decl/species/species = mymob?.get_species() if(istype(species?.species_hud)) refresh_inventory_slots(species.species_hud.persistent_slots, hud_shown) @@ -363,7 +363,7 @@ client.screen += zone_sel //This one is a special snowflake hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + hud_used.persistent_inventory_update() update_action_buttons() //Similar to minimize_hud() but keeps zone_sel, gun_setting_icon, and healths. @@ -400,7 +400,7 @@ hud_used.action_intent.screen_loc = ui_acti //Restore intent selection to the original position hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + hud_used.persistent_inventory_update() update_action_buttons() /client/proc/reset_click_catchers() diff --git a/code/modules/admin/admin_investigate.dm b/code/modules/admin/admin_investigate.dm index 66fe7e8daff1..6169fae49639 100644 --- a/code/modules/admin/admin_investigate.dm +++ b/code/modules/admin/admin_investigate.dm @@ -38,7 +38,7 @@ return show_browser(src, F, "window=investigate[subject];size=800x300") - if("hrefs") //persistant logs and stuff + if("hrefs") //persistent logs and stuff if(get_config_value(/decl/config/toggle/log_hrefs)) if(global.world_href_log) show_browser(src, global.world_href_log, "window=investigate[subject];size=800x300") diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 4afacdc2b068..2b8f79e8ee54 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -180,7 +180,7 @@ var/global/list/localhost_addresses = list( holder.owner = src handle_staff_login() - //preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum) + //preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum) prefs = SScharacter_setup.preferences_datums[ckey] if(!prefs) prefs = new /datum/preferences(src) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index ad87174808b3..b5c1c2a992a8 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -500,7 +500,7 @@ var/global/list/time_prefs_fixed = list() key_bindings = deepCopyList(global.hotkey_keybinding_list_by_key) if(istype(client)) - // Preferences datum - also holds some persistant data for the client (because we may as well keep these datums to a minimum). + // Preferences datum - also holds some persistent data for the client (because we may as well keep these datums to a minimum). SScharacter_setup.preferences_datums[client.ckey] = src setup() diff --git a/code/modules/mob/login.dm b/code/modules/mob/login.dm index a2d7f65ab163..54d0d77ecaa3 100644 --- a/code/modules/mob/login.dm +++ b/code/modules/mob/login.dm @@ -129,7 +129,7 @@ if(istype(hud_used)) hud_used.hidden_inventory_update() - hud_used.persistant_inventory_update() + hud_used.persistent_inventory_update() update_action_buttons() return TRUE From 52443f9ad2c688ba8a830808008178457ea3afbf Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 08:23:57 +1100 Subject: [PATCH 31/95] Fixes persistence not spawning instances. --- code/modules/persistence/persistence_datum.dm | 23 +++++++++++-------- .../persistence/persistence_datum_book.dm | 20 +++++++++++----- test/check-paths.sh | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/code/modules/persistence/persistence_datum.dm b/code/modules/persistence/persistence_datum.dm index 0c9e0aedca6b..3ca013a7c4cb 100644 --- a/code/modules/persistence/persistence_datum.dm +++ b/code/modules/persistence/persistence_datum.dm @@ -30,14 +30,16 @@ return TRUE /decl/persistence_handler/proc/CheckTokenSanity(var/list/tokens) - return ( \ - islist(tokens) && \ - !isnull(tokens["x"]) && \ - !isnull(tokens["y"]) && \ - !isnull(tokens["z"]) && \ - !isnull(tokens["age"]) && \ - tokens["age"] <= entries_expire_at \ - ) + if(!islist(tokens)) + return FALSE + if(isnull(tokens["x"]) || isnull(tokens["y"]) || isnull(tokens["z"])) + return FALSE + if(!isnull(entries_expire_at)) + if(isnull(tokens["age"])) + return FALSE + if(tokens["age"] > entries_expire_at) + return FALSE + return TRUE /decl/persistence_handler/proc/CreateEntryInstance(var/turf/creating, var/list/tokens) return @@ -63,8 +65,9 @@ else return - if(GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens)) - return CreateEntryInstance(., tokens) + . = GetValidTurf(locate(tokens["x"], tokens["y"], tokens["z"]), tokens) + if(.) + . = CreateEntryInstance(., tokens) /decl/persistence_handler/proc/IsValidEntry(var/atom/entry) if(!istype(entry)) diff --git a/code/modules/persistence/persistence_datum_book.dm b/code/modules/persistence/persistence_datum_book.dm index 479a9c8cb454..cf33c5df07d4 100644 --- a/code/modules/persistence/persistence_datum_book.dm +++ b/code/modules/persistence/persistence_datum_book.dm @@ -5,7 +5,14 @@ ignore_invalid_loc = TRUE /decl/persistence_handler/book/CreateEntryInstance(var/turf/creating, var/list/tokens) - var/obj/item/book/book = new(creating) + + var/book_type = tokens["book_type"] + if(book_type) + book_type = text2path(book_type) + if(!ispath(book_type)) + book_type = /obj/item/book + + var/obj/item/book/book = new book_type(creating) book.dat = tokens["message"] book.title = tokens["title"] book.author = tokens["writer"] @@ -29,11 +36,12 @@ . = ..() var/obj/item/book/book = entry - .["author"] = book.last_modified_ckey || "" - .["message"] = book.dat || "dat" - .["title"] = book.title || "Untitled" - .["writer"] = book.author || "unknown" + .["author"] = book.last_modified_ckey || "" + .["message"] = book.dat || "dat" + .["title"] = book.title || "Untitled" + .["writer"] = book.author || "unknown" .["icon_state"] = book.icon_state || "book" + .["book_type"] = "[book.type]" var/turf/T = get_turf(entry) if(!T || !isStationLevel(T.z)) @@ -62,7 +70,7 @@ else T = get_random_spawn_turf(SPAWN_FLAG_PERSISTENCE_CAN_SPAWN) - . = ..(T, tokens) + . = ..() /decl/persistence_handler/book/GetEntryAge(var/atom/entry) . = -1 diff --git a/test/check-paths.sh b/test/check-paths.sh index 161216458247..b65802ffb9c6 100755 --- a/test/check-paths.sh +++ b/test/check-paths.sh @@ -37,7 +37,7 @@ exactly 1 "world.log<< uses" 'world.log<<|world.log[[:space:]]<<' exactly 18 "<< uses" '(?> uses" '>>(?!>)' -P exactly 0 "incorrect indentations" '^( {4,})' -P -exactly 24 "text2path uses" 'text2path' +exactly 25 "text2path uses" 'text2path' exactly 4 "update_icon() override" '/update_icon\((.*)\)' -P exactly 0 "goto uses" 'goto ' exactly 9 "atom/New uses" '^/(obj|atom|area|mob|turf).*/New\(' From 16204d730f5a373a8fd2a7b92a29f601a8d40eb6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 10:48:48 +1100 Subject: [PATCH 32/95] Removes final icon_state set from reworked seed storage. --- code/modules/hydroponics/seed_storage.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 2d609cf629e3..9d371275e6c8 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -62,7 +62,6 @@ /obj/machinery/seed_storage/garden name = "Garden seed storage" scanner = list("stats") - icon_state = "seeds_generic" starting_seeds = list( /obj/item/seeds/ambrosiavulgarisseed = 15, /obj/item/seeds/appleseed = 15, From 604a01179905cecf20605b14336948802d859cd7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 11:03:02 +1100 Subject: [PATCH 33/95] Fixes inverted food check in chicken attackby. --- code/modules/mob/living/simple_animal/friendly/farm_animals.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index b1df77c7be41..b6ef75bef106 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -245,7 +245,7 @@ var/global/chicken_count = 0 global.chicken_count -= 1 /mob/living/simple_animal/fowl/chicken/attackby(var/obj/item/O, var/mob/user) - if(istype(O, /obj/item/food)) + if(!istype(O, /obj/item/food)) return ..() var/obj/item/food/G = O //feedin' dem chickens if(findtext(G.get_grown_tag(), "wheat")) // includes chopped, crushed, dried etc. From a588779b622ec75cc7aa88a4a26438057b8fd5eb Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 11:08:25 +1100 Subject: [PATCH 34/95] Fixes woven roofing tiles not being craftable. --- code/modules/crafting/stack_recipes/recipes_grass.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/crafting/stack_recipes/recipes_grass.dm b/code/modules/crafting/stack_recipes/recipes_grass.dm index a2a88b86d5c4..1b7a31ccc22a 100644 --- a/code/modules/crafting/stack_recipes/recipes_grass.dm +++ b/code/modules/crafting/stack_recipes/recipes_grass.dm @@ -20,6 +20,7 @@ craft_stack_types = /obj/item/stack/material/bundle required_material = /decl/material/solid/organic/plantmatter/grass/dry result_type = /obj/item/stack/tile/roof/woven + forbidden_craft_stack_types = null /decl/stack_recipe/tile/woven/floor name = "woven floor tile" From b38f3557f51ef2c6fe1ed53e537cd90a298fe173 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 11:12:56 +1100 Subject: [PATCH 35/95] Fixes crafting recipe stack type validation. --- code/modules/crafting/stack_recipes/_recipe.dm | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/code/modules/crafting/stack_recipes/_recipe.dm b/code/modules/crafting/stack_recipes/_recipe.dm index a5a28c6e6a55..7c481de823a3 100644 --- a/code/modules/crafting/stack_recipes/_recipe.dm +++ b/code/modules/crafting/stack_recipes/_recipe.dm @@ -150,9 +150,16 @@ else if(length(used_skill.levels) < difficulty) . += "required skill [recipe_skill] is missing skill level [json_encode(difficulty)]" - if(length(forbidden_craft_stack_types) && length(craft_stack_types)) - for(var/stack_type in (forbidden_craft_stack_types|craft_stack_types)) - if((stack_type in craft_stack_types) && (stack_type in forbidden_craft_stack_types)) + var/list/check_forbidden_craft_stack_types = forbidden_craft_stack_types + if(check_forbidden_craft_stack_types && !islist(check_forbidden_craft_stack_types)) + check_forbidden_craft_stack_types = list(check_forbidden_craft_stack_types) + var/list/check_craft_stack_types = craft_stack_types + if(check_craft_stack_types && !islist(check_craft_stack_types)) + check_craft_stack_types = list(check_craft_stack_types) + + if(length(check_forbidden_craft_stack_types) && length(check_craft_stack_types)) + for(var/stack_type in (check_forbidden_craft_stack_types|check_craft_stack_types)) + if((stack_type in check_craft_stack_types) && (stack_type in check_forbidden_craft_stack_types)) . += "[stack_type] is in both forbidden and craftable stack types" /decl/stack_recipe/proc/get_required_stack_amount(obj/item/stack/stack) From bbd603de9600d3d015f4fb3332862c8d39a7354b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 11:50:13 +1100 Subject: [PATCH 36/95] Fixing runtime in loadout is_permitted(). --- code/controllers/subsystems/jobs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystems/jobs.dm b/code/controllers/subsystems/jobs.dm index b900dcf8c32d..7c2ef2f47263 100644 --- a/code/controllers/subsystems/jobs.dm +++ b/code/controllers/subsystems/jobs.dm @@ -413,7 +413,7 @@ SUBSYSTEM_DEF(jobs) /decl/loadout_option/proc/is_permitted(mob/living/wearer, datum/job/job) if(!istype(wearer)) return FALSE - if(allowed_roles && !(job.type in allowed_roles)) + if(allowed_roles && (!job || !(job.type in allowed_roles))) return FALSE if(allowed_branches) if(!ishuman(wearer)) @@ -441,7 +441,7 @@ SUBSYSTEM_DEF(jobs) var/decl/loadout_option/G = decls_repository.get_decl_by_id_or_var(thing, /decl/loadout_option) if(!istype(G)) continue - if(!G.is_permitted(H)) + if(!G.is_permitted(H, job)) to_chat(H, SPAN_WARNING("Your current species, job, branch, skills or whitelist status does not permit you to spawn with [thing]!")) continue if(!G.slot || !G.spawn_on_mob(H, H.client.prefs.Gear()[G.uid])) From d40c11661e6b5ebdc6208937a3b5730585bb4eee Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 21:01:29 +1100 Subject: [PATCH 37/95] Reordering attackby interaction for hydrotrays to allow sampling without interfering with shovel/hoe. --- code/modules/hydroponics/trays/tray.dm | 91 ++++++++++++++------------ 1 file changed, 49 insertions(+), 42 deletions(-) diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 0456bff2302b..c1252de11d33 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -404,40 +404,18 @@ return -/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/O, var/mob/user) +/obj/machinery/portable_atmospherics/hydroponics/attackby(var/obj/item/used_item, var/mob/user) - if(istype(O, /obj/item/food/grown)) - var/obj/item/food/grown/bulb = O + if(istype(used_item, /obj/item/food/grown)) + var/obj/item/food/grown/bulb = used_item if(bulb.seed?.grown_is_seed) plant_seed(user, bulb) return TRUE - if (ATOM_IS_OPEN_CONTAINER(O)) - return FALSE - - if(istype(O, /obj/item/chems/syringe)) - var/obj/item/chems/syringe/S = O - if (S.mode == 1) - if(seed) - return ..() - else - to_chat(user, SPAN_WARNING("There's no plant to inject.")) - else - if(seed) - //Leaving this in in case we want to extract from plants later. - to_chat(user, SPAN_WARNING("You can't get any extract out of this plant.")) - else - to_chat(user, SPAN_WARNING("There's nothing to draw something from.")) - return TRUE - - if(istype(O, /obj/item/seeds)) - plant_seed(user, O) - return TRUE - - if(IS_HOE(O)) + if(IS_HOE(used_item)) if(weedlevel > 0) - if(!O.do_tool_interaction(TOOL_HOE, user, src, 2 SECONDS, start_message = "uprooting the weeds in", success_message = "weeding") || weedlevel <= 0 || QDELETED(src)) + if(!used_item.do_tool_interaction(TOOL_HOE, user, src, 2 SECONDS, start_message = "uprooting the weeds in", success_message = "weeding") || weedlevel <= 0 || QDELETED(src)) return TRUE weedlevel = 0 update_icon() @@ -450,37 +428,66 @@ to_chat(user, SPAN_WARNING("This plot is completely devoid of weeds. It doesn't need uprooting.")) return TRUE - if(IS_SHOVEL(O)) + if(IS_SHOVEL(used_item)) if(seed) var/removing_seed = seed - if(O.do_tool_interaction(TOOL_SHOVEL, user, src, 3 SECONDS, start_message = "removing \the [seed.display_name] from", success_message = "removing \the [seed.display_name] from") && seed == removing_seed) + if(used_item.do_tool_interaction(TOOL_SHOVEL, user, src, 3 SECONDS, start_message = "removing \the [seed.display_name] from", success_message = "removing \the [seed.display_name] from") && seed == removing_seed) set_seed(null) else to_chat(user, SPAN_WARNING("There is no plant in \the [src] to remove.")) return TRUE - if (istype(O, /obj/item/plants)) + if(user.a_intent != I_HURT) + var/decl/interaction_handler/sample_interaction = GET_DECL(/decl/interaction_handler/hydroponics/sample) + if(sample_interaction.is_possible(src, user, used_item)) + sample_interaction.invoked(src, user, used_item) + return TRUE + + // Handled in afterattack/ + if (ATOM_IS_OPEN_CONTAINER(used_item)) + return FALSE + + if(istype(used_item, /obj/item/chems/syringe)) + var/obj/item/chems/syringe/S = used_item + if (S.mode == 1) + if(seed) + return ..() + else + to_chat(user, SPAN_WARNING("There's no plant to inject.")) + else + if(seed) + //Leaving this in in case we want to extract from plants later. + to_chat(user, SPAN_WARNING("You can't get any extract out of this plant.")) + else + to_chat(user, SPAN_WARNING("There's nothing to draw something from.")) + return TRUE + + if(istype(used_item, /obj/item/seeds)) + plant_seed(user, used_item) + return TRUE + + if (istype(used_item, /obj/item/plants)) physical_attack_hand(user) // Harvests and clears out dead plants. - if(O.storage) + if(used_item.storage) for (var/obj/item/food/grown/G in get_turf(user)) - if(O.storage.can_be_inserted(G, user)) - O.storage.handle_item_insertion(user, G, TRUE) + if(used_item.storage.can_be_inserted(G, user)) + used_item.storage.handle_item_insertion(user, G, TRUE) return TRUE - if ( istype(O, /obj/item/plantspray) ) + if ( istype(used_item, /obj/item/plantspray) ) - var/obj/item/plantspray/spray = O + var/obj/item/plantspray/spray = used_item toxins += spray.toxicity pestlevel -= spray.pest_kill_str weedlevel -= spray.weed_kill_str update_icon() - to_chat(user, "You spray [src] with [O].") + to_chat(user, "You spray [src] with [used_item].") playsound(loc, 'sound/effects/spray3.ogg', 50, 1, -6) - qdel(O) + qdel(used_item) check_plant_health() return TRUE - if(mechanical && IS_WRENCH(O)) + if(mechanical && IS_WRENCH(used_item)) //If there's a connector here, the portable_atmospherics setup can handle it. if(locate(/obj/machinery/atmospherics/portables_connector/) in loc) @@ -491,18 +498,18 @@ to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].") return TRUE - var/force = O.get_attack_force(user) + var/force = used_item.get_attack_force(user) if(force && seed) user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) - user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [O]!") - playsound(get_turf(src), O.hitsound, 100, 1) + user.visible_message("\The [seed.display_name] has been attacked by [user] with \the [used_item]!") + playsound(get_turf(src), used_item.hitsound, 100, 1) if(!dead) plant_health -= force check_plant_health() return TRUE if(mechanical) - return component_attackby(O, user) + return component_attackby(used_item, user) return ..() From 560756ba0b9ec56783af59778f742b03c4f6dd62 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 21:05:14 +1100 Subject: [PATCH 38/95] Fixing issues with being shocked by depowered wires. --- code/modules/power/cable.dm | 51 +++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 29c71764deb5..f66b7a21a925 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -166,50 +166,47 @@ By design, d1 is the smallest direction and d2 is the highest // // TODO: take a closer look at cable attackby, make it call parent? -/obj/structure/cable/attackby(obj/item/W, mob/user) - if(IS_WIRECUTTER(W)) - cut_wire(W, user) +/obj/structure/cable/attackby(obj/item/used_item, mob/user) - else if(IS_COIL(W)) - var/obj/item/stack/cable_coil/coil = W + if(IS_WIRECUTTER(used_item)) + cut_wire(used_item, user) + return TRUE + + if(IS_COIL(used_item)) + var/obj/item/stack/cable_coil/coil = used_item if (coil.get_amount() < 1) to_chat(user, "You don't have enough cable to lay down.") return TRUE coil.cable_join(src, user) + return TRUE - else if(IS_MULTITOOL(W)) - + if(IS_MULTITOOL(used_item)) if(powernet && (powernet.avail > 0)) // is it powered? to_chat(user, SPAN_WARNING("[get_wattage()] in power network.")) - + shock(user, 5, 0.2) else to_chat(user, SPAN_WARNING("\The [src] is not powered.")) + return TRUE - shock(user, 5, 0.2) - - - else if(W.edge) - + if(used_item.edge) var/delay_holder - - if(W.get_attack_force(user) < 5) - visible_message(SPAN_WARNING("[user] starts sawing away roughly at \the [src] with \the [W].")) + if(used_item.get_attack_force(user) < 5) + visible_message(SPAN_WARNING("[user] starts sawing away roughly at \the [src] with \the [used_item].")) delay_holder = 8 SECONDS else - visible_message(SPAN_WARNING("[user] begins to cut through \the [src] with \the [W].")) + visible_message(SPAN_WARNING("[user] begins to cut through \the [src] with \the [used_item].")) delay_holder = 3 SECONDS - if(user.do_skilled(delay_holder, SKILL_ELECTRICAL, src)) - cut_wire(W, user) - if(W.obj_flags & OBJ_FLAG_CONDUCTIBLE) + cut_wire(used_item, user) + if(used_item.obj_flags & OBJ_FLAG_CONDUCTIBLE) shock(user, 66, 0.7) else visible_message(SPAN_WARNING("[user] stops cutting before any damage is done.")) + return TRUE - src.add_fingerprint(user) - return TRUE + return ..() -/obj/structure/cable/proc/cut_wire(obj/item/W, mob/user) +/obj/structure/cable/proc/cut_wire(obj/item/used_item, mob/user) var/turf/T = get_turf(src) if(!T || !T.is_plating()) return @@ -241,13 +238,13 @@ By design, d1 is the smallest direction and d2 is the highest // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) - if(!prob(prb)) - return 0 + if(!prob(prb) || !powernet || !powernet.avail <= 0) + return FALSE if (electrocute_mob(user, powernet, src, siemens_coeff)) spark_at(src, amount=5, cardinal_only = TRUE) if(HAS_STATUS(usr, STAT_STUN)) - return 1 - return 0 + return TRUE + return FALSE // TODO: generalize to matter list and parts_type. /obj/structure/cable/create_dismantled_products(turf/T) From ff0437197b5b55a4471c3fb53a8ed160d40adb29 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sat, 11 Jan 2025 12:59:52 +1100 Subject: [PATCH 39/95] Requested changes to barrel PR. --- code/modules/hydroponics/trays/tray_soil.dm | 5 +++++ code/modules/interactions/interactions_atom.dm | 9 +++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/code/modules/hydroponics/trays/tray_soil.dm b/code/modules/hydroponics/trays/tray_soil.dm index d1862c1e47dc..46ab1b85227a 100644 --- a/code/modules/hydroponics/trays/tray_soil.dm +++ b/code/modules/hydroponics/trays/tray_soil.dm @@ -19,6 +19,11 @@ var/obj/item/stack/material/brick/reinforced_with +/obj/machinery/portable_atmospherics/hydroponics/soil/get_alt_interactions(var/mob/user) + . = ..() + LAZYREMOVE(., global._reagent_interactions) + LAZYADD(., /decl/interaction_handler/empty_into) + /obj/machinery/portable_atmospherics/hydroponics/soil/Initialize() . = ..() diff --git a/code/modules/interactions/interactions_atom.dm b/code/modules/interactions/interactions_atom.dm index 353dacb38dd0..980172b26b27 100644 --- a/code/modules/interactions/interactions_atom.dm +++ b/code/modules/interactions/interactions_atom.dm @@ -21,12 +21,9 @@ if(!istype(choice) || QDELETED(user) || QDELETED(src)) return TRUE // This is not ideal but I don't want to pass a callback through here as a param and call it. :( - if(check_alt_interactions) - if(!(choice.type in get_alt_interactions(user))) - return TRUE - else - if(!(choice.type in get_standard_interactions(user))) - return TRUE + var/list/new_interactions = check_alt_interactions ? get_alt_interactions(user) : get_standard_interactions(user) + if(!(choice.type in new_interactions)) + return TRUE if(!choice.is_possible(src, user, user.get_active_held_item())) return TRUE From b9a66d849574ad6510fe6928df4d5f8987c38c61 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 11:01:28 +1100 Subject: [PATCH 40/95] Adding shield fasteners and shield crafting. --- code/datums/trading/traders/misc.dm | 2 +- code/game/objects/items/weapons/shields.dm | 223 ------------------ .../objects/items/weapons/shields/_shield.dm | 54 +++++ .../items/weapons/shields/shield_crafted.dm | 38 +++ .../weapons/shields/shield_crafted_buckler.dm | 17 ++ .../items/weapons/shields/shield_crafting.dm | 52 ++++ .../items/weapons/shields/shield_energy.dm | 83 +++++++ .../items/weapons/shields/shield_riot.dm | 58 +++++ code/modules/clothing/suits/armor/_armor.dm | 2 +- .../improvised_crafting/crafting_buckler.dm | 11 +- .../recipes_hardness_integrity.dm | 9 + .../crafting/stack_recipes/recipes_planks.dm | 3 + icons/obj/items/shield/buckler.dmi | Bin 485 -> 0 bytes icons/obj/items/shield/buckler_base_metal.dmi | Bin 0 -> 339 bytes icons/obj/items/shield/buckler_base_wood.dmi | Bin 0 -> 343 bytes icons/obj/items/shield/buckler_metal.dmi | Bin 0 -> 455 bytes icons/obj/items/shield/buckler_wood.dmi | Bin 0 -> 458 bytes icons/obj/items/shield_fasteners.dmi | Bin 0 -> 474 bytes icons/obj/items/tool/hammers/forge.dmi | Bin 0 -> 784 bytes maps/ministation/ministation-2.dmm | 6 +- nebula.dme | 7 +- 21 files changed, 335 insertions(+), 230 deletions(-) delete mode 100644 code/game/objects/items/weapons/shields.dm create mode 100644 code/game/objects/items/weapons/shields/_shield.dm create mode 100644 code/game/objects/items/weapons/shields/shield_crafted.dm create mode 100644 code/game/objects/items/weapons/shields/shield_crafted_buckler.dm create mode 100644 code/game/objects/items/weapons/shields/shield_crafting.dm create mode 100644 code/game/objects/items/weapons/shields/shield_energy.dm create mode 100644 code/game/objects/items/weapons/shields/shield_riot.dm delete mode 100644 icons/obj/items/shield/buckler.dmi create mode 100644 icons/obj/items/shield/buckler_base_metal.dmi create mode 100644 icons/obj/items/shield/buckler_base_wood.dmi create mode 100644 icons/obj/items/shield/buckler_metal.dmi create mode 100644 icons/obj/items/shield/buckler_wood.dmi create mode 100644 icons/obj/items/shield_fasteners.dmi create mode 100644 icons/obj/items/tool/hammers/forge.dmi diff --git a/code/datums/trading/traders/misc.dm b/code/datums/trading/traders/misc.dm index dd3e0df898f1..6356be83f0d4 100644 --- a/code/datums/trading/traders/misc.dm +++ b/code/datums/trading/traders/misc.dm @@ -155,7 +155,7 @@ ) possible_trading_items = list( /obj/item/clothing/head/wizard/magus = TRADER_THIS_TYPE, - /obj/item/shield/buckler = TRADER_THIS_TYPE, + /obj/item/shield/crafted/buckler = TRADER_THIS_TYPE, /obj/item/clothing/head/redcoat = TRADER_THIS_TYPE, /obj/item/clothing/head/powdered_wig = TRADER_THIS_TYPE, /obj/item/clothing/head/hasturhood = TRADER_THIS_TYPE, diff --git a/code/game/objects/items/weapons/shields.dm b/code/game/objects/items/weapons/shields.dm deleted file mode 100644 index 8ab9f986e6b8..000000000000 --- a/code/game/objects/items/weapons/shields.dm +++ /dev/null @@ -1,223 +0,0 @@ -//** Shield Helpers -//These are shared by various items that have shield-like behaviour - -//bad_arc is the ABSOLUTE arc of directions from which we cannot block. If you want to fix it to e.g. the user's facing you will need to rotate the dirs yourself. -/proc/check_shield_arc(mob/user, var/bad_arc, atom/damage_source = null, mob/attacker = null) - //check attack direction - var/attack_dir = 0 //direction from the user to the source of the attack - if(istype(damage_source, /obj/item/projectile)) - var/obj/item/projectile/P = damage_source - attack_dir = get_dir(get_turf(user), P.starting) - else if(attacker) - attack_dir = get_dir(get_turf(user), get_turf(attacker)) - else if(damage_source) - attack_dir = get_dir(get_turf(user), get_turf(damage_source)) - - if(!(attack_dir && (attack_dir & bad_arc))) - return 1 - return 0 - -/proc/default_parry_check(mob/user, mob/attacker, atom/damage_source) - //parry only melee attacks - if(istype(damage_source, /obj/item/projectile) || (attacker && get_dist(user, attacker) > 1) || user.incapacitated()) - return 0 - - //block as long as they are not directly behind us - var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block - if(!check_shield_arc(user, bad_arc, damage_source, attacker)) - return 0 - - return 1 - -/obj/item/shield - name = "abstract shield" - abstract_type = /obj/item/shield - var/base_block_chance = 60 - -/obj/item/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") - if(user.incapacitated()) - return 0 - //block as long as they are not directly behind us - var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block - if(check_shield_arc(user, bad_arc, damage_source, attacker)) - var/block_chance = get_block_chance(user, damage, damage_source, attacker) - if(attacker) - block_chance = max(0, block_chance - 10 * attacker.get_skill_difference(SKILL_COMBAT, user)) - if(prob(block_chance)) - user.visible_message("\The [user] blocks [attack_text] with \the [src]!") - if(max_health != ITEM_HEALTH_NO_DAMAGE) - take_damage(damage) - return 1 - return 0 - -/obj/item/shield/proc/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - return base_block_chance - -/obj/item/shield/riot - name = "riot shield" - desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." - icon = 'icons/obj/items/shield/riot.dmi' - icon_state = ICON_STATE_WORLD - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BACK - throw_speed = 1 - throw_range = 4 - w_class = ITEM_SIZE_HUGE - origin_tech = @'{"materials":2}' - material = /decl/material/solid/fiberglass - matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) - attack_verb = list("shoved", "bashed") - var/cooldown = 0 //shield bash cooldown. based on world.time - var/max_block = 15 - var/can_block_lasers = FALSE - -/obj/item/shield/riot/handle_shield(mob/user) - . = ..() - if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) - -/obj/item/shield/riot/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - if(istype(damage_source, /obj/item/projectile)) - var/obj/item/projectile/P = damage_source - //plastic shields do not stop bullets or lasers, even in space. Will block beanbags, rubber bullets, and stunshots just fine though. - if(is_sharp(P) && damage >= max_block) - return 0 - if(istype(P, /obj/item/projectile/beam) && (!can_block_lasers || (P.armor_penetration >= max_block))) - return 0 - return base_block_chance - -/obj/item/shield/riot/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/baton)) - if(cooldown < world.time - 25) - user.visible_message("[user] bashes [src] with [W]!") - playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) - cooldown = world.time - return TRUE - else - return ..() - -/obj/item/shield/riot/metal - name = "plasteel combat shield" - icon = 'icons/obj/items/shield/metal.dmi' - icon_state = ICON_STATE_WORLD - obj_flags = OBJ_FLAG_CONDUCTIBLE - slot_flags = SLOT_BACK - throw_range = 3 - w_class = ITEM_SIZE_HUGE - material = /decl/material/solid/metal/plasteel - max_block = 50 - can_block_lasers = TRUE - slowdown_general = 1.5 - _base_attack_force = 6 - -/obj/item/shield/riot/metal/security //A cosmetic difference. - icon = 'icons/obj/items/shield/metal_security.dmi' - -/obj/item/shield/buckler - name = "buckler" - desc = "A wooden buckler used to block sharp things from entering your body back in the day." - icon = 'icons/obj/items/shield/buckler.dmi' - icon_state = "buckler" - slot_flags = SLOT_BACK - base_block_chance = 60 - throw_speed = 10 - throw_range = 20 - w_class = ITEM_SIZE_HUGE - origin_tech = @'{"materials":1}' - material = /decl/material/solid/metal/steel - matter = list(/decl/material/solid/organic/wood/oak = MATTER_AMOUNT_REINFORCEMENT) - attack_verb = list("shoved", "bashed") - _base_attack_force = 8 - max_health = 250 - -/obj/item/shield/buckler/handle_shield(mob/user) - . = ..() - if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) - -/obj/item/shield/buckler/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - if(istype(damage_source, /obj/item/projectile/bullet)) - return 0 //No blocking bullets, I'm afraid. - return base_block_chance - -/* - * Energy Shield - */ - -/obj/item/shield/energy - name = "energy combat shield" - desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." - icon = 'icons/obj/items/shield/e_shield.dmi' - icon_state = "eshield0" // eshield1 for expanded - obj_flags = OBJ_FLAG_CONDUCTIBLE - throw_speed = 1 - throw_range = 4 - w_class = ITEM_SIZE_SMALL - origin_tech = @'{"materials":4,"magnets":3,"esoteric":4}' - attack_verb = list("shoved", "bashed") - material = /decl/material/solid/metal/titanium - matter = list( - /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, - /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, - /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE, - ) - _base_attack_force = 3 - var/active = 0 - var/shield_light_color = "#006aff" - -/obj/item/shield/energy/Initialize() - set_extension(src, /datum/extension/base_icon_state, copytext(initial(icon_state), 1, length(initial(icon_state)))) - . = ..() - update_icon() - -/obj/item/shield/energy/handle_shield(mob/user) - if(!active) - return 0 //turn it on first! - . = ..() - - if(.) - spark_at(user.loc, amount=5) - playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) - -/obj/item/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) - if(istype(damage_source, /obj/item/projectile)) - var/obj/item/projectile/P = damage_source - if((is_sharp(P) && damage > 10) || istype(P, /obj/item/projectile/beam)) - return (base_block_chance - round(damage / 2.5)) //block bullets and beams using the old block chance - return base_block_chance - -/obj/item/shield/energy/attack_self(mob/user) - if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) - to_chat(user, SPAN_DANGER("You beat yourself in the head with [src].")) - if(isliving(user)) - var/mob/living/M = user - M.take_organ_damage(5, 0) - active = !active - if (active) - set_base_attack_force(10) - update_icon() - w_class = ITEM_SIZE_HUGE - playsound(user, 'sound/weapons/saberon.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("\The [src] is now active.")) - - else - set_base_attack_force(3) - update_icon() - w_class = ITEM_SIZE_SMALL - playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) - to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) - - if(ishuman(user)) - var/mob/living/human/H = user - H.update_inhand_overlays() - - add_fingerprint(user) - return - -/obj/item/shield/energy/on_update_icon() - . = ..() - var/datum/extension/base_icon_state/base_name = get_extension(src, /datum/extension/base_icon_state) - icon_state = "[base_name.base_icon_state][active]" //Replace 0 with current state - if(active) - set_light(1.5, 1.5, shield_light_color) - else - set_light(0) \ No newline at end of file diff --git a/code/game/objects/items/weapons/shields/_shield.dm b/code/game/objects/items/weapons/shields/_shield.dm new file mode 100644 index 000000000000..6da8605ec6bc --- /dev/null +++ b/code/game/objects/items/weapons/shields/_shield.dm @@ -0,0 +1,54 @@ +//** Shield Helpers +//These are shared by various items that have shield-like behaviour + +//bad_arc is the ABSOLUTE arc of directions from which we cannot block. If you want to fix it to e.g. the user's facing you will need to rotate the dirs yourself. +/proc/check_shield_arc(mob/user, var/bad_arc, atom/damage_source = null, mob/attacker = null) + //check attack direction + var/attack_dir = 0 //direction from the user to the source of the attack + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + attack_dir = get_dir(get_turf(user), P.starting) + else if(attacker) + attack_dir = get_dir(get_turf(user), get_turf(attacker)) + else if(damage_source) + attack_dir = get_dir(get_turf(user), get_turf(damage_source)) + + if(!(attack_dir && (attack_dir & bad_arc))) + return 1 + return 0 + +/proc/default_parry_check(mob/user, mob/attacker, atom/damage_source) + //parry only melee attacks + if(istype(damage_source, /obj/item/projectile) || (attacker && get_dist(user, attacker) > 1) || user.incapacitated()) + return 0 + + //block as long as they are not directly behind us + var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block + if(!check_shield_arc(user, bad_arc, damage_source, attacker)) + return 0 + + return 1 + +/obj/item/shield + name = "abstract shield" + abstract_type = /obj/item/shield + var/base_block_chance = 60 + +/obj/item/shield/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") + if(user.incapacitated()) + return 0 + //block as long as they are not directly behind us + var/bad_arc = user.dir && global.reverse_dir[user.dir] //arc of directions from which we cannot block + if(check_shield_arc(user, bad_arc, damage_source, attacker)) + var/block_chance = get_block_chance(user, damage, damage_source, attacker) + if(attacker) + block_chance = max(0, block_chance - 10 * attacker.get_skill_difference(SKILL_COMBAT, user)) + if(prob(block_chance)) + user.visible_message("\The [user] blocks [attack_text] with \the [src]!") + if(max_health != ITEM_HEALTH_NO_DAMAGE) + take_damage(damage) + return 1 + return 0 + +/obj/item/shield/proc/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + return base_block_chance diff --git a/code/game/objects/items/weapons/shields/shield_crafted.dm b/code/game/objects/items/weapons/shields/shield_crafted.dm new file mode 100644 index 000000000000..5d892688b0ad --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_crafted.dm @@ -0,0 +1,38 @@ +/obj/item/shield/crafted + slot_flags = SLOT_BACK + base_block_chance = 60 + throw_speed = 10 + throw_range = 20 + w_class = ITEM_SIZE_HUGE + origin_tech = @'{"materials":1}' + abstract_type = /obj/item/shield/crafted + icon_state = ICON_STATE_WORLD + attack_verb = list("shoved", "bashed") + _base_attack_force = 8 + max_health = 250 + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/wooden_icon + var/decl/material/reinforcement_material = /decl/material/solid/metal/iron + +/obj/item/shield/crafted/set_material(new_material) + . = ..() + if(wooden_icon) + if(istype(material, /decl/material/solid/organic/wood)) + set_icon(wooden_icon) + else + set_icon(initial(icon)) + update_icon() + +/obj/item/shield/crafted/Initialize(ml, material_key, reinf_material_key) + if(reinf_material_key) + reinforcement_material = reinf_material_key + if(ispath(reinforcement_material)) + reinforcement_material = GET_DECL(reinforcement_material) + LAZYSET(matter, reinforcement_material.type, MATTER_AMOUNT_REINFORCEMENT) + . = ..() + +/obj/item/shield/crafted/on_update_icon() + . = ..() + if(istype(reinforcement_material)) + add_overlay(overlay_image(icon, "[icon_state]-reinforcement", reinforcement_material.color, RESET_COLOR)) diff --git a/code/game/objects/items/weapons/shields/shield_crafted_buckler.dm b/code/game/objects/items/weapons/shields/shield_crafted_buckler.dm new file mode 100644 index 000000000000..6d78daef790f --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_crafted_buckler.dm @@ -0,0 +1,17 @@ +/obj/item/shield/crafted/buckler + name = "buckler" + desc = "A small, round shield used to block sharp things from entering your body." + icon = 'icons/obj/items/shield/buckler_metal.dmi' + wooden_icon = 'icons/obj/items/shield/buckler_wood.dmi' + +/obj/item/shield/crafted/buckler/improvised + name_prefix = "improvised" + +/obj/item/shield/crafted/buckler/handle_shield(mob/user) + . = ..() + if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) + +/obj/item/shield/crafted/buckler/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile/bullet)) + return 0 //No blocking bullets, I'm afraid. + return base_block_chance diff --git a/code/game/objects/items/weapons/shields/shield_crafting.dm b/code/game/objects/items/weapons/shields/shield_crafting.dm new file mode 100644 index 000000000000..307db9bce88b --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_crafting.dm @@ -0,0 +1,52 @@ +// General item for 'proper' shield crafting. +/obj/item/shield_fasteners + name = "shield fasteners" + desc = "A handful of shaped fasteners used to hold a buckler or shield together." + icon_state = ICON_STATE_WORLD + icon = 'icons/obj/items/shield_fasteners.dmi' + material = /decl/material/solid/metal/iron + material_alteration = MAT_FLAG_ALTERATION_ALL + +// TODO: single-step slapcrafting +/obj/item/shield_base + w_class = ITEM_SIZE_LARGE + desc = "An unfinished collection of shield bits, waiting for fastenings." + icon_state = ICON_STATE_WORLD + abstract_type = /obj/item/shield_base + material = /decl/material/solid/organic/wood/oak + material_alteration = MAT_FLAG_ALTERATION_ALL + var/wooden_icon + var/fittings_type = /obj/item/shield_fasteners + var/finished_type + var/work_skill = SKILL_CONSTRUCTION + +/obj/item/shield_base/attackby(obj/item/used_item, mob/user) + if(fittings_type && istype(used_item, fittings_type) && finished_type && user.try_unequip(used_item)) + to_chat(user, SPAN_NOTICE("You start laying out \the [src] and affixing \the [used_item].")) + if(user.do_skilled(5 SECONDS, work_skill, src, check_holding = TRUE)) + var/was_held = (loc == user) + var/obj/item/shield/crafted/shield = new finished_type(get_turf(src), material?.type, used_item.material?.type) + user.visible_message("\The [user] secures \the [src] with \the [used_item], finishing \a [shield].") + qdel(src) + qdel(used_item) + if(was_held) + user.put_in_hands(shield) + return TRUE + return ..() + +/obj/item/shield_base/set_material(new_material) + . = ..() + if(wooden_icon) + if(istype(material, /decl/material/solid/organic/wood)) + set_icon(wooden_icon) + else + set_icon(initial(icon)) + update_icon() + +// Subtypes below. +/obj/item/shield_base/buckler + name_prefix = "unfinished" + name = "buckler" + icon = 'icons/obj/items/shield/buckler_base_metal.dmi' + wooden_icon = 'icons/obj/items/shield/buckler_base_wood.dmi' + finished_type = /obj/item/shield/crafted/buckler diff --git a/code/game/objects/items/weapons/shields/shield_energy.dm b/code/game/objects/items/weapons/shields/shield_energy.dm new file mode 100644 index 000000000000..4b028ca79316 --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_energy.dm @@ -0,0 +1,83 @@ +/* + * Energy Shield + */ + +/obj/item/shield/energy + name = "energy combat shield" + desc = "A shield capable of stopping most projectile and melee attacks. It can be retracted, expanded, and stored anywhere." + icon = 'icons/obj/items/shield/e_shield.dmi' + icon_state = "eshield0" // eshield1 for expanded + obj_flags = OBJ_FLAG_CONDUCTIBLE + throw_speed = 1 + throw_range = 4 + w_class = ITEM_SIZE_SMALL + origin_tech = @'{"materials":4,"magnets":3,"esoteric":4}' + attack_verb = list("shoved", "bashed") + material = /decl/material/solid/metal/titanium + matter = list( + /decl/material/solid/fiberglass = MATTER_AMOUNT_SECONDARY, + /decl/material/solid/metal/gold = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/silicon = MATTER_AMOUNT_REINFORCEMENT, + /decl/material/solid/gemstone/diamond = MATTER_AMOUNT_TRACE, + ) + _base_attack_force = 3 + var/active = 0 + var/shield_light_color = "#006aff" + +/obj/item/shield/energy/Initialize() + set_extension(src, /datum/extension/base_icon_state, copytext(initial(icon_state), 1, length(initial(icon_state)))) + . = ..() + update_icon() + +/obj/item/shield/energy/handle_shield(mob/user) + if(!active) + return 0 //turn it on first! + . = ..() + + if(.) + spark_at(user.loc, amount=5) + playsound(user.loc, 'sound/weapons/blade1.ogg', 50, 1) + +/obj/item/shield/energy/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + if((is_sharp(P) && damage > 10) || istype(P, /obj/item/projectile/beam)) + return (base_block_chance - round(damage / 2.5)) //block bullets and beams using the old block chance + return base_block_chance + +/obj/item/shield/energy/attack_self(mob/user) + if(user.has_genetic_condition(GENE_COND_CLUMSY) && prob(50)) + to_chat(user, SPAN_DANGER("You beat yourself in the head with [src].")) + if(isliving(user)) + var/mob/living/M = user + M.take_organ_damage(5, 0) + active = !active + if (active) + set_base_attack_force(10) + update_icon() + w_class = ITEM_SIZE_HUGE + playsound(user, 'sound/weapons/saberon.ogg', 50, 1) + to_chat(user, SPAN_NOTICE("\The [src] is now active.")) + + else + set_base_attack_force(3) + update_icon() + w_class = ITEM_SIZE_SMALL + playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) + to_chat(user, SPAN_NOTICE("\The [src] can now be concealed.")) + + if(ishuman(user)) + var/mob/living/human/H = user + H.update_inhand_overlays() + + add_fingerprint(user) + return + +/obj/item/shield/energy/on_update_icon() + . = ..() + var/datum/extension/base_icon_state/base_name = get_extension(src, /datum/extension/base_icon_state) + icon_state = "[base_name.base_icon_state][active]" //Replace 0 with current state + if(active) + set_light(1.5, 1.5, shield_light_color) + else + set_light(0) diff --git a/code/game/objects/items/weapons/shields/shield_riot.dm b/code/game/objects/items/weapons/shields/shield_riot.dm new file mode 100644 index 000000000000..378ae85d9f0e --- /dev/null +++ b/code/game/objects/items/weapons/shields/shield_riot.dm @@ -0,0 +1,58 @@ +/obj/item/shield/riot + name = "riot shield" + desc = "A shield adept at blocking blunt objects from connecting with the torso of the shield wielder." + icon = 'icons/obj/items/shield/riot.dmi' + icon_state = ICON_STATE_WORLD + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_BACK + throw_speed = 1 + throw_range = 4 + w_class = ITEM_SIZE_HUGE + origin_tech = @'{"materials":2}' + material = /decl/material/solid/fiberglass + matter = list(/decl/material/solid/metal/steel = MATTER_AMOUNT_REINFORCEMENT) + attack_verb = list("shoved", "bashed") + var/cooldown = 0 //shield bash cooldown. based on world.time + var/max_block = 15 + var/can_block_lasers = FALSE + +/obj/item/shield/riot/handle_shield(mob/user) + . = ..() + if(.) playsound(user.loc, 'sound/weapons/Genhit.ogg', 50, 1) + +/obj/item/shield/riot/get_block_chance(mob/user, var/damage, atom/damage_source = null, mob/attacker = null) + if(istype(damage_source, /obj/item/projectile)) + var/obj/item/projectile/P = damage_source + //plastic shields do not stop bullets or lasers, even in space. Will block beanbags, rubber bullets, and stunshots just fine though. + if(is_sharp(P) && damage >= max_block) + return 0 + if(istype(P, /obj/item/projectile/beam) && (!can_block_lasers || (P.armor_penetration >= max_block))) + return 0 + return base_block_chance + +/obj/item/shield/riot/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/baton)) + if(cooldown < world.time - 25) + user.visible_message("[user] bashes [src] with [W]!") + playsound(user.loc, 'sound/effects/shieldbash.ogg', 50, 1) + cooldown = world.time + return TRUE + else + return ..() + +/obj/item/shield/riot/metal + name = "plasteel combat shield" + icon = 'icons/obj/items/shield/metal.dmi' + icon_state = ICON_STATE_WORLD + obj_flags = OBJ_FLAG_CONDUCTIBLE + slot_flags = SLOT_BACK + throw_range = 3 + w_class = ITEM_SIZE_HUGE + material = /decl/material/solid/metal/plasteel + max_block = 50 + can_block_lasers = TRUE + slowdown_general = 1.5 + _base_attack_force = 6 + +/obj/item/shield/riot/metal/security //A cosmetic difference. + icon = 'icons/obj/items/shield/metal_security.dmi' diff --git a/code/modules/clothing/suits/armor/_armor.dm b/code/modules/clothing/suits/armor/_armor.dm index 250c133ae7be..eef73b5c8fa4 100644 --- a/code/modules/clothing/suits/armor/_armor.dm +++ b/code/modules/clothing/suits/armor/_armor.dm @@ -12,7 +12,7 @@ /obj/item/handcuffs, /obj/item/gun/magnetic, /obj/item/clothing/head/helmet, - /obj/item/shield/buckler, + /obj/item/shield/crafted/buckler, /obj/item/bladed/knife, /obj/item/bladed/shortsword, /obj/item/bladed/longsword, diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm index d2c910fba7b9..4cab4e484658 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/improvised_crafting/crafting_buckler.dm @@ -20,4 +20,13 @@ /decl/crafting_stage/screwdriver/buckler_finish progress_message = "You secure the buckler's panels in place and finish it off." - product = /obj/item/shield/buckler + product = /obj/item/shield/crafted/buckler/improvised + +/decl/crafting_stage/screwdriver/buckler_finish/get_product(var/obj/item/work) + if(!ispath(product)) + return null + var/obj/item/stool/stool = locate() in work + var/obj/item/stack/material/plank/plank = locate() in work + if(istype(stool) && istype(plank)) + return new product(get_turf(work), plank.material?.type, stool.material?.type) + return ..() diff --git a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm index 8b0781f7d432..eafa6e89d738 100644 --- a/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm +++ b/code/modules/crafting/stack_recipes/recipes_hardness_integrity.dm @@ -5,6 +5,15 @@ /decl/stack_recipe/hardness/integrity/sign result_type = /obj/item/banner/sign +/decl/stack_recipe/hardness/integrity/buckler + result_type = /obj/item/shield_base/buckler + difficulty = MAT_VALUE_HARD_DIY + +// TODO: forging +/decl/stack_recipe/hardness/integrity/shield_fasteners + result_type = /obj/item/shield_fasteners + difficulty = MAT_VALUE_VERY_HARD_DIY + /decl/stack_recipe/hardness/integrity/furniture abstract_type = /decl/stack_recipe/hardness/integrity/furniture one_per_turf = TRUE diff --git a/code/modules/crafting/stack_recipes/recipes_planks.dm b/code/modules/crafting/stack_recipes/recipes_planks.dm index 98d3254f5228..00f4f0f41b6c 100644 --- a/code/modules/crafting/stack_recipes/recipes_planks.dm +++ b/code/modules/crafting/stack_recipes/recipes_planks.dm @@ -78,6 +78,9 @@ /decl/stack_recipe/planks/bowl result_type = /obj/item/chems/glass/handmade/bowl +/decl/stack_recipe/planks/buckler + result_type = /obj/item/shield_base/buckler + /decl/stack_recipe/planks/fancy abstract_type = /decl/stack_recipe/planks/fancy difficulty = MAT_VALUE_VERY_HARD_DIY diff --git a/icons/obj/items/shield/buckler.dmi b/icons/obj/items/shield/buckler.dmi deleted file mode 100644 index ff53a0e14e075f35701e484de0bbfd1737991fab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 485 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5DXBC$J14bBiHkEOv#1y-V#vjrR+N~V3SlcNxca$( z4F&*th8pvx{}2rT006~FL_t(Ijpb2G7J@JgBqY>)ETw)bsP{joDN70-K-1UNOeUF0 z*ZpGwK>rO!8Ytiq1;Z(@u#zDh;AiFfgmxLVUnN!o6YdC%4#o9zBx)rvR9HmR*N|2M zjYT-|lvSNWm#qZaHL>b+bB0Sr+Y-RyRh08I<-1G8vJC?)J$$<4JkLIi8bW8mEqZIk zlZ4g)s6#v`X7{L6_L5w1EGkcl5(+Fkgl>WHMQmty9 bgMYU^R*?w36eQK-00000NkvXXu0mjfTW-f_ diff --git a/icons/obj/items/shield/buckler_base_metal.dmi b/icons/obj/items/shield/buckler_base_metal.dmi new file mode 100644 index 0000000000000000000000000000000000000000..41372efa755f468079d6bcfede4a115ebb4a34e3 GIT binary patch literal 339 zcmV-Z0j&OsP)fFDZ*Bkp zc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LY zR3KBSJijO>MTv_uC9|j)$T#HTOe;#vO@*+P6n@8Ex;gVPMd|XKERhR=)`k1(PYq8djcJ}JL*q$ZX9|NsBc!INEG z^E};SGWaff0A(3Vg8YIR9G=}s19CE}LLy3BQj3#|G7CyF^Ya)OD&_=-6%>_z{}NpA z@#_;UZ(Xf(XU+$22sOB9{NRz!c^}P_3`IS?J1mTYj4vB|Da?5^>ByuIh2WJo`!&>E zJG+flH?NR5VgBTikG9tt-_{LNMPvTP95}|rV9g|D%#fx16liIkr;B5V#>BJz2YFiz zcvucA*E20-n18oHHl9&Dm_gm~|JsHh78e-aVvur8XTsqr**95=L4fzggYAtFG z4j)c-GcQ<_bWf7&P?p(G&Y8a>+UNI2#Xi#DJEn7gtJwOIo`i@R)im3(tByZbuc&(5 nV_@E>JgH*$zTJ2KJif)48!BM3Bd2T~&?O9>u6{1-oD!MD@x2wg|Jao=@zAC=B4EqC8y@5=9S>mqpaZS z=K^*L0Gk0SmqfWJZvX%Q*-1n}R5*?0QA-lSFbHiM-M6;7uGIq=!vWO5UPpTWtBAiq z>Wl|aW)kL+$Adso{IxZUX`snq8(^Qm^Jp1xmg7yJq>;H!(9!+AYM@w-M0iPXcD~>9 zoe^MW!ah}ax}y?CLPV|cB3!is@@32T{+T;Sj>x%`(Gk`aL~jVIleAK+0`*mw2&E9V zG6t8L>X=U(fQ2Dcy(N@L2q7j+(_d6=jL`>Gd^$7ib$}3bJ>^5fj8-Iq_q{@pAD@x2wg|Jao=@zAC=B4EqC8y@5=9S>mqpaZS z=K^*L0Gk0SmqfWJZvX%Q+(|@1R5*?0kxdf9APj}uqWdE1y0#v`pL8##>}7)Yzly1y zLZ~wyKr>UA7d~D|QWSq3db3REOqwfP^7BBFfCqnPktmTU)KMxou9OmmAxptWxq6K2 z`jiaFlYg2f{$bi|0z3`qpk4qJf!z>%2QXKrZhVLBRJ>u_wXXWzSpfSxKP3Vh`li~t z87LVzavM~9)YiCr*AE*3RE-2m8$5&|YPYPSGRSpea-25N>;pQ)G@kNpAzC|HSlc8C z+{Cp=u!Xj*lz38*54>$Nc|gp^{SmtTe*SCm0<4Q2q@)(Q8UO$Q07*qoM6N<$f~qLU AJ^%m! literal 0 HcmV?d00001 diff --git a/icons/obj/items/shield_fasteners.dmi b/icons/obj/items/shield_fasteners.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e4c289ffc0c0256878c451af131999e2d4095962 GIT binary patch literal 474 zcmV<00VV#4P)V=-0C=2J zR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zil2jm5 zDKoDuHLoPUs8WfGGbOXA7$|1Q#hF%=n41b=!&R2&7v-ejQl+fm>gNJ>008PhCchu; zBTE1P0QX5mK~y-6jgxB>-c zx^|NdHcSNkdAAAzTWsU!C~uTL_k+jFc$^1=DKN?EK|;9B!N4q&_-s0vb@Q%DqeNK} zuG5uGl@_x0%~n0xOE!o+mlu77SV+~nAFKeR9jyghSL{g1rY6#d2op$=7Mqcj$|0#o z?;7?oDai+-gT*36x>_nh#M1IRx=9S6hbLX zsG&l4_tVsjIV|YblBC`eXZ7>T)qA#NtLv_s(5%O4VIoW(-t^r~U+ztP04k{(Md+lZ Qe*gdg07*qoM6N<$f&&)Iq5uE@ literal 0 HcmV?d00001 diff --git a/icons/obj/items/tool/hammers/forge.dmi b/icons/obj/items/tool/hammers/forge.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a7b0a4e061104e4a67d583e14ba65aabd03a81df GIT binary patch literal 784 zcmV+r1MmEaP)&NEBrPWA z&OeT(m<6dQ>*D!FcP=}&DHC0_FaQ7n=1D|BRA_ohy=lmfp7oso;No3vbt_M4-G2!D zD|PQ_$R?7NYl*)0Cy{^My*2eN^cc&UE{NSr7U*o=9K3a8ks>+L7fwJ~cY3WGvL>-i z^`#T=r+#opaxIo4eUbk$AoD^4j^$XNj+pj824te3Vma2QBc{JJQ$X>m@~b@m1WcXs zFMg&M^oP_Gq>sdsz7YnL;;KhzO?^xtYak6ssIQdlcSEiZ00000a8qno_OFHMqL@mW zE&>1m008`H+UZcGZ-4vx%un^zkFd)YRoJcwjP)Zk!1HXkd1{?$Zl62stOY@^4Y#=? zGj=4lT$*Su4U51wk+#k^%tzP!Huq)ZFbFLNGC@=*800000w**%p6wwCfOo32D zSY5CMLJ>h3!4(MA({#LRleZay>VnP9`{eyDjB6o?;_YwpW}?}bx|>5IeE<0YD5!w| z00000z!h+baK{-i1p*7(kOrxkK@y#52gzvdHh=QJ85)r)Na O0000 Date: Fri, 18 Oct 2024 13:22:17 +1100 Subject: [PATCH 41/95] Adding a UWII HUD and the ability to apply overlays to screen objects. --- code/__defines/misc.dm | 3 + code/_onclick/hud/hud.dm | 27 ++++--- code/_onclick/hud/screen/_screen.dm | 38 ++++++++- .../hud/screen/screen_action_button.dm | 6 +- .../hud/screen/screen_attack_selector.dm | 1 + code/_onclick/hud/screen/screen_cataloguer.dm | 6 +- code/_onclick/hud/screen/screen_exosuit.dm | 4 +- code/_onclick/hud/screen/screen_gun.dm | 16 ++++ code/_onclick/hud/screen/screen_intent.dm | 13 +-- code/_onclick/hud/screen/screen_inventory.dm | 12 +-- .../hud/screen/screen_inventory_hands.dm | 31 ++++++++ code/_onclick/hud/screen/screen_maneuver.dm | 5 ++ code/_onclick/hud/screen/screen_movement.dm | 7 ++ code/_onclick/hud/screen/screen_throw.dm | 6 ++ code/_onclick/hud/screen/screen_up_hint.dm | 6 ++ .../hud/screen/screen_zone_selector.dm | 9 +-- .../client/preference_setup/global/01_ui.dm | 75 +++++++++++------- code/modules/client/ui_styles/_helpers.dm | 18 +---- code/modules/client/ui_styles/_ui_style.dm | 9 ++- .../client/ui_styles/ui_style_subtypes.dm | 30 +++++++ code/modules/mechs/mech_movement.dm | 9 +-- .../mob/living/human/human_movement.dm | 3 +- code/modules/mob/living/inventory.dm | 7 +- code/modules/mob/living/living_maneuvers.dm | 9 +-- .../modules/mob/living/silicon/robot/robot.dm | 3 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_movement.dm | 2 +- .../targeting/targeting_overlay.dm | 11 +-- .../styles/minimalist/attack_selector.dmi | Bin 1167 -> 1878 bytes .../screen/styles/minimalist/fire_intent.dmi | Bin 3965 -> 5621 bytes icons/mob/screen/styles/minimalist/hands.dmi | Bin 1694 -> 1876 bytes .../screen/styles/minimalist/interaction.dmi | Bin 1662 -> 2533 bytes .../screen/styles/minimalist/inventory.dmi | Bin 3668 -> 3745 bytes .../mob/screen/styles/minimalist/movement.dmi | Bin 1132 -> 1580 bytes icons/mob/screen/styles/minimalist/uphint.dmi | Bin 571 -> 748 bytes .../styles/minimalist/zone_selector.dmi | Bin 780 -> 1105 bytes .../styles/underworld/attack_selector.dmi | Bin 0 -> 1544 bytes .../screen/styles/underworld/fire_intent.dmi | Bin 0 -> 3323 bytes icons/mob/screen/styles/underworld/hands.dmi | Bin 0 -> 3286 bytes .../screen/styles/underworld/interaction.dmi | Bin 0 -> 1773 bytes .../screen/styles/underworld/inventory.dmi | Bin 0 -> 2541 bytes .../mob/screen/styles/underworld/movement.dmi | Bin 0 -> 2776 bytes icons/mob/screen/styles/underworld/uphint.dmi | Bin 0 -> 639 bytes .../styles/underworld/zone_selector.dmi | Bin 0 -> 863 bytes .../screen/styles/white/attack_selector.dmi | Bin 686 -> 1018 bytes icons/mob/screen/styles/white/fire_intent.dmi | Bin 9722 -> 3068 bytes icons/mob/screen/styles/white/hands.dmi | Bin 2220 -> 2875 bytes icons/mob/screen/styles/white/interaction.dmi | Bin 1339 -> 1871 bytes icons/mob/screen/styles/white/inventory.dmi | Bin 3206 -> 3285 bytes icons/mob/screen/styles/white/movement.dmi | Bin 1193 -> 1497 bytes icons/mob/screen/styles/white/uphint.dmi | Bin 437 -> 492 bytes .../mob/screen/styles/white/zone_selector.dmi | Bin 536 -> 696 bytes maps/~mapsystem/maps.dm | 6 ++ .../psionics/system/psionics/interface/ui.dm | 5 +- .../system/psionics/interface/ui_hub.dm | 2 + .../system/psionics/interface/ui_toggles.dm | 2 + nebula.dme | 1 + 57 files changed, 260 insertions(+), 124 deletions(-) create mode 100644 code/_onclick/hud/screen/screen_inventory_hands.dm create mode 100644 icons/mob/screen/styles/underworld/attack_selector.dmi create mode 100644 icons/mob/screen/styles/underworld/fire_intent.dmi create mode 100644 icons/mob/screen/styles/underworld/hands.dmi create mode 100644 icons/mob/screen/styles/underworld/interaction.dmi create mode 100644 icons/mob/screen/styles/underworld/inventory.dmi create mode 100644 icons/mob/screen/styles/underworld/movement.dmi create mode 100644 icons/mob/screen/styles/underworld/uphint.dmi create mode 100644 icons/mob/screen/styles/underworld/zone_selector.dmi diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index 5bf9a5b371ac..3e390336be96 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -370,3 +370,6 @@ #define RADIAL_LABELS_NONE 0 #define RADIAL_LABELS_OFFSET 1 #define RADIAL_LABELS_CENTERED 2 + +// Default UI style applied to client prefs. +#define DEFAULT_UI_STYLE /decl/ui_style/midnight diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 10b3ccf93c1b..0390f09e469e 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -13,6 +13,8 @@ hud_used = initial(hud_used) if(ispath(hud_used)) hud_used = new hud_used(src) + if(istype(hud_used)) + hud_used.refresh_hud_icons() refresh_lighting_master() /datum/hud @@ -22,7 +24,7 @@ var/inventory_shown = TRUE //the inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/default_ui_style = /decl/ui_style/midnight + var/default_ui_style = DEFAULT_UI_STYLE var/list/alerts @@ -45,6 +47,10 @@ instantiate() ..() +/datum/hud/proc/refresh_hud_icons() + for(var/obj/screen/elem in mymob?.client?.screen) + elem.queue_icon_update() + /datum/hud/Destroy() . = ..() stamina_bar = null @@ -138,6 +144,9 @@ . = available_styles[1] /datum/hud/proc/get_ui_color() + var/decl/ui_style/ui_style = get_ui_style_data() + if(!ui_style?.use_ui_color) + return COLOR_WHITE return mymob?.client?.prefs?.UI_style_color || COLOR_WHITE /datum/hud/proc/get_ui_alpha() @@ -172,25 +181,17 @@ break if(!inv_box) - inv_box = new /obj/screen/inventory(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HANDS) + inv_box = new /obj/screen/inventory/hand(null, mymob, ui_style, ui_color, ui_alpha, UI_ICON_HANDS) else inv_box.set_ui_style(ui_style, UI_ICON_HANDS) inv_box.color = ui_color inv_box.alpha = ui_alpha - inv_box.SetName(hand_tag) - inv_box.icon_state = "hand_base" - - inv_box.cut_overlays() - inv_box.add_overlay("hand_[inv_slot.hand_overlay || hand_tag]", TRUE) - if(inv_slot.ui_label) - inv_box.add_overlay("hand_[inv_slot.ui_label]", TRUE) - inv_box.update_icon() + LAZYDISTINCTADD(hand_hud_objects, inv_box) + inv_box.SetName(hand_tag) inv_box.slot_id = hand_tag - inv_box.appearance_flags |= KEEP_TOGETHER - - LAZYDISTINCTADD(hand_hud_objects, inv_box) + inv_box.update_icon() // Clear held item boxes with no held slot. for(var/obj/screen/inventory/inv_box in hand_hud_objects) diff --git a/code/_onclick/hud/screen/_screen.dm b/code/_onclick/hud/screen/_screen.dm index fc921c67cee2..7401aae1e383 100644 --- a/code/_onclick/hud/screen/_screen.dm +++ b/code/_onclick/hud/screen/_screen.dm @@ -24,6 +24,9 @@ var/ui_style_category /// Set to false for screen objects that do not rely on UI style to set their icon. var/requires_ui_style = TRUE + /// Whether or not we look for/draw an additional detail overlay. + var/apply_screen_overlay = TRUE + /// Reference to our last set ui_style /obj/screen/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) @@ -52,8 +55,13 @@ color = ui_color if(!isnull(ui_alpha)) alpha = ui_alpha + return ..() +/obj/screen/proc/get_owner_ui_style() + var/mob/owner = owner_ref?.resolve() + return (istype(owner) && istype(owner.hud_used)) ? owner.hud_used.get_ui_style_data() : null + /obj/screen/get_color() return color @@ -68,12 +76,12 @@ ui_style_category = ui_cat if(istype(ui_style) && ui_style_category) icon = ui_style.get_icon(ui_style_category) + update_icon() /obj/screen/Destroy() - if(owner_ref) - var/mob/owner = owner_ref.resolve() - if(istype(owner) && owner?.client?.screen) - owner.client.screen -= src + var/mob/owner = owner_ref?.resolve() + if(istype(owner) && owner.client?.screen) + owner.client.screen -= src return ..() /obj/screen/proc/handle_click(mob/user, params) @@ -89,3 +97,25 @@ /obj/screen/check_mousedrop_interactivity(var/mob/user) return user.client && (src in user.client.screen) + +/obj/screen/on_update_icon() + rebuild_screen_overlays() + compile_overlays() + +/obj/screen/proc/get_screen_overlay_state() + return icon_state + +/obj/screen/proc/rebuild_screen_overlays() + SHOULD_CALL_PARENT(TRUE) + cut_overlays() + if(!apply_screen_overlay) + return + var/check_for_state = "[get_screen_overlay_state()]-overlay" + if(!check_state_in_icon(check_for_state, icon)) + return + var/decl/ui_style/ui_style = get_owner_ui_style() + if(ui_style?.use_overlay_color) + var/mob/living/owner = owner_ref?.resolve() + add_overlay(overlay_image(icon, check_for_state, istype(owner) ? (owner?.client?.prefs.UI_style_highlight_color || COLOR_WHITE) : COLOR_WHITE, RESET_COLOR)) + else + add_overlay(check_for_state) diff --git a/code/_onclick/hud/screen/screen_action_button.dm b/code/_onclick/hud/screen/screen_action_button.dm index 33bf849cb9c7..df79fa29ce41 100644 --- a/code/_onclick/hud/screen/screen_action_button.dm +++ b/code/_onclick/hud/screen/screen_action_button.dm @@ -14,6 +14,7 @@ return FALSE /obj/screen/action_button/on_update_icon() + ..() if(!action) return icon = action.background_icon @@ -72,7 +73,6 @@ update_icon() user.update_action_buttons() -/obj/screen/action_button/hide_toggle/on_update_icon() - cut_overlays() +/obj/screen/action_button/hide_toggle/rebuild_screen_overlays() + ..() add_overlay(hidden ? "show" : "hide") - compile_overlays() diff --git a/code/_onclick/hud/screen/screen_attack_selector.dm b/code/_onclick/hud/screen/screen_attack_selector.dm index ea27e11ca3e9..537d2ccce389 100644 --- a/code/_onclick/hud/screen/screen_attack_selector.dm +++ b/code/_onclick/hud/screen/screen_attack_selector.dm @@ -28,6 +28,7 @@ return TRUE /obj/screen/default_attack_selector/on_update_icon() + ..() var/mob/living/human/owner = owner_ref?.resolve() var/decl/natural_attack/attack = istype(owner) && owner.default_attack icon_state = attack?.selector_icon_state || "attack_none" diff --git a/code/_onclick/hud/screen/screen_cataloguer.dm b/code/_onclick/hud/screen/screen_cataloguer.dm index 6fc95896bfa8..bb0965dac408 100644 --- a/code/_onclick/hud/screen/screen_cataloguer.dm +++ b/code/_onclick/hud/screen/screen_cataloguer.dm @@ -31,8 +31,8 @@ QDEL_NULL(holder_image) return ..() -/obj/screen/scan_radius/on_update_icon() - cut_overlays() +/obj/screen/scan_radius/rebuild_screen_overlays() + ..() if(scan_range <= 1) add_overlay("single") else @@ -79,5 +79,3 @@ I.pixel_x = world.icon_size * i I.pixel_y = pixel_bound add_overlay(I) - - compile_overlays() diff --git a/code/_onclick/hud/screen/screen_exosuit.dm b/code/_onclick/hud/screen/screen_exosuit.dm index 5677d2d93bcb..ad9171ed446d 100644 --- a/code/_onclick/hud/screen/screen_exosuit.dm +++ b/code/_onclick/hud/screen/screen_exosuit.dm @@ -3,6 +3,7 @@ icon = 'icons/mecha/mech_hud.dmi' icon_state = "base" requires_ui_style = FALSE + apply_screen_overlay = FALSE var/initial_maptext var/height = 14 @@ -317,7 +318,8 @@ var/mob/living/exosuit/owner = get_owning_exosuit() if(owner) toggled = owner.hatch_closed - . = ..() + . = ..() + if(owner) if(toggled) maptext = MECH_UI_STYLE("OPEN") maptext_x = 5 diff --git a/code/_onclick/hud/screen/screen_gun.dm b/code/_onclick/hud/screen/screen_gun.dm index fdf77245d1c4..86bba4206e74 100644 --- a/code/_onclick/hud/screen/screen_gun.dm +++ b/code/_onclick/hud/screen/screen_gun.dm @@ -2,8 +2,15 @@ icon = 'icons/mob/screen/styles/midnight/fire_intent.dmi' dir = SOUTH abstract_type = /obj/screen/gun + var/base_icon_state var/toggle_flag +/obj/screen/gun/on_update_icon() + if(toggle_flag && base_icon_state) + var/mob/living/owner = owner_ref?.resolve() + icon_state = "[base_icon_state][!!(istype(owner) && owner.aiming && (owner.aiming.target_permissions & toggle_flag))]" + ..() + /obj/screen/gun/handle_click(mob/user, params) if(isliving(user)) var/mob/living/shooter = user @@ -17,26 +24,35 @@ /obj/screen/gun/move name = "Allow Movement" icon_state = "no_walk1" + base_icon_state = "no_walk" screen_loc = ui_gun2 toggle_flag = TARGET_CAN_MOVE /obj/screen/gun/item name = "Allow Item Use" icon_state = "no_item1" + base_icon_state = "no_item" screen_loc = ui_gun1 toggle_flag = TARGET_CAN_CLICK /obj/screen/gun/radio name = "Disallow Radio Use" icon_state = "no_radio1" + base_icon_state = "no_radio" screen_loc = ui_gun4 toggle_flag = TARGET_CAN_RADIO /obj/screen/gun/mode name = "Toggle Gun Mode" icon_state = "gun0" + base_icon_state = "gun" screen_loc = ui_gun_select +/obj/screen/gun/mode/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + icon_state = "[base_icon_state][!!(istype(owner) && owner.aiming?.active)]" + ..() + /obj/screen/gun/mode/handle_click(mob/user, params) if(..()) var/mob/living/shooter = user diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index 4682cc14836c..2afe31080624 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -1,9 +1,10 @@ /obj/screen/intent - name = "intent" - icon = 'icons/mob/screen/styles/intents.dmi' - icon_state = "intents" - screen_loc = ui_acti - requires_ui_style = FALSE + name = "intent" + icon = 'icons/mob/screen/styles/intents.dmi' + icon_state = "intents" + screen_loc = ui_acti + requires_ui_style = FALSE + apply_screen_overlay = FALSE /obj/screen/intent/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) . = ..() @@ -37,7 +38,7 @@ overlay.pixel_y = 16 /obj/screen/intent/on_update_icon() - cut_overlays() + ..() var/mob/owner = owner_ref?.resolve() if(!istype(owner) || QDELETED(owner)) return diff --git a/code/_onclick/hud/screen/screen_inventory.dm b/code/_onclick/hud/screen/screen_inventory.dm index 5bacceaeef04..cc4a4835b826 100644 --- a/code/_onclick/hud/screen/screen_inventory.dm +++ b/code/_onclick/hud/screen/screen_inventory.dm @@ -40,19 +40,15 @@ mouse_over_atom_ref = null update_icon() -/obj/screen/inventory/on_update_icon() +/obj/screen/inventory/rebuild_screen_overlays() - cut_overlays() + ..() // Validate our owner still exists. var/mob/owner = owner_ref?.resolve() if(!istype(owner) || QDELETED(owner) || !(src in owner.client?.screen)) return - // Mark our selected hand. - if(owner.get_active_held_item_slot() == slot_id) - add_overlay("hand_selected") - // Mark anything we're potentially trying to equip. var/obj/item/mouse_over_atom = mouse_over_atom_ref?.resolve() if(istype(mouse_over_atom) && !QDELETED(mouse_over_atom) && !owner.get_equipped_item(slot_id)) @@ -65,9 +61,7 @@ MA.pixel_y = mouse_over_atom.default_pixel_y MA.pixel_w = mouse_over_atom.default_pixel_w MA.pixel_z = mouse_over_atom.default_pixel_z + MA.appearance_flags |= (KEEP_TOGETHER | RESET_COLOR) add_overlay(MA) else mouse_over_atom_ref = null - - // UI needs to be responsive so avoid the subsecond update delay. - compile_overlays() diff --git a/code/_onclick/hud/screen/screen_inventory_hands.dm b/code/_onclick/hud/screen/screen_inventory_hands.dm new file mode 100644 index 000000000000..df5784067418 --- /dev/null +++ b/code/_onclick/hud/screen/screen_inventory_hands.dm @@ -0,0 +1,31 @@ +/obj/screen/inventory/hand + icon_state = "hand_base" + +/obj/screen/inventory/hand/on_update_icon() + + ..() + + // Validate our owner still exists. + var/mob/owner = owner_ref?.resolve() + if(!istype(owner) || QDELETED(owner) || !(src in owner.client?.screen)) + return + + var/overlay_color = owner?.client?.prefs.UI_style_highlight_color || COLOR_WHITE + var/decl/ui_style/ui_style = get_owner_ui_style() + if(owner.get_active_held_item_slot() == slot_id) + if(ui_style?.use_overlay_color) + add_overlay(overlay_image(icon, "hand_selected", overlay_color, RESET_COLOR)) + else + add_overlay("hand_selected") + + var/datum/inventory_slot/gripper/inv_slot = owner.get_inventory_slot_datum(slot_id) + if(istype(inv_slot)) + if(ui_style?.use_overlay_color) + add_overlay(overlay_image(icon, "hand_[inv_slot.hand_overlay || slot_id]", overlay_color, RESET_COLOR)) + else + add_overlay("hand_[inv_slot.hand_overlay || slot_id]", TRUE) + if(inv_slot.ui_label) + if(ui_style?.use_overlay_color) + add_overlay(overlay_image(icon, "hand_[inv_slot.ui_label]", overlay_color, RESET_COLOR)) + else + add_overlay("hand_[inv_slot.ui_label]", TRUE) diff --git a/code/_onclick/hud/screen/screen_maneuver.dm b/code/_onclick/hud/screen/screen_maneuver.dm index 203bffc6943f..3a415d71de77 100644 --- a/code/_onclick/hud/screen/screen_maneuver.dm +++ b/code/_onclick/hud/screen/screen_maneuver.dm @@ -17,3 +17,8 @@ to_chat(src, SPAN_NOTICE("You are prepared to [user_living.prepared_maneuver.name].")) else to_chat(src, SPAN_NOTICE("You are not prepared to perform a maneuver.")) + +/obj/screen/maneuver/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + icon_state = (istype(owner) && owner.prepared_maneuver) ? "maneuver_on" : "maneuver_off" + ..() diff --git a/code/_onclick/hud/screen/screen_movement.dm b/code/_onclick/hud/screen/screen_movement.dm index e389e554cc59..674882295dda 100644 --- a/code/_onclick/hud/screen/screen_movement.dm +++ b/code/_onclick/hud/screen/screen_movement.dm @@ -1,7 +1,14 @@ /obj/screen/movement name = "movement method" screen_loc = ui_movi + icon_state = "creeping" /obj/screen/movement/handle_click(mob/user, params) if(istype(user)) user.set_next_usable_move_intent() + +/obj/screen/movement/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + if(istype(owner) && istype(owner.move_intent)) + icon_state = owner.move_intent.hud_icon_state + . = ..() diff --git a/code/_onclick/hud/screen/screen_throw.dm b/code/_onclick/hud/screen/screen_throw.dm index 679018fba8dd..1b4de10e6e87 100644 --- a/code/_onclick/hud/screen/screen_throw.dm +++ b/code/_onclick/hud/screen/screen_throw.dm @@ -6,3 +6,9 @@ /obj/screen/throw_toggle/handle_click(mob/user, params) if(!user.stat && isturf(user.loc) && !user.restrained()) user.toggle_throw_mode() + +/obj/screen/throw_toggle/on_update_icon() + var/mob/living/owner = owner_ref?.resolve() + if(istype(owner)) + icon_state = "act_throw_[owner.in_throw_mode ? "on" : "off"]" + . = ..() diff --git a/code/_onclick/hud/screen/screen_up_hint.dm b/code/_onclick/hud/screen/screen_up_hint.dm index a6e45820115c..5a1a2b796fc1 100644 --- a/code/_onclick/hud/screen/screen_up_hint.dm +++ b/code/_onclick/hud/screen/screen_up_hint.dm @@ -7,3 +7,9 @@ if(isliving(user)) var/mob/living/L = user L.lookup() + +/obj/screen/up_hint/on_update_icon() + var/mob/owner = owner_ref?.resolve() + var/turf/above = istype(owner) ? GetAbove(get_turf(owner)) : null + icon_state = "uphint[!!(istype(above) && TURF_IS_MIMICKING(above))]" + ..() diff --git a/code/_onclick/hud/screen/screen_zone_selector.dm b/code/_onclick/hud/screen/screen_zone_selector.dm index 008d2b902624..0850498b7f2a 100644 --- a/code/_onclick/hud/screen/screen_zone_selector.dm +++ b/code/_onclick/hud/screen/screen_zone_selector.dm @@ -64,10 +64,6 @@ set_selected_zone(new_selecting) return TRUE -/obj/screen/zone_selector/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha) - . = ..() - update_icon() - /obj/screen/zone_selector/proc/set_selected_zone(bodypart) var/old_selecting = selecting selecting = bodypart @@ -75,5 +71,6 @@ update_icon() return TRUE -/obj/screen/zone_selector/on_update_icon() - set_overlays(image('icons/mob/zone_sel.dmi', "[selecting]")) +/obj/screen/zone_selector/rebuild_screen_overlays() + ..() + add_overlay(image('icons/mob/zone_sel.dmi', "[selecting]")) diff --git a/code/modules/client/preference_setup/global/01_ui.dm b/code/modules/client/preference_setup/global/01_ui.dm index de5797080c49..932214653179 100644 --- a/code/modules/client/preference_setup/global/01_ui.dm +++ b/code/modules/client/preference_setup/global/01_ui.dm @@ -1,16 +1,17 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) /datum/preferences - var/clientfps = 0 - var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color - var/icon_size = 64 + var/clientfps = 0 + var/ooccolor = "#010000" //Whatever this is set to acts as 'reset' color and is thus unusable as an actual custom color + var/icon_size = 64 var/UI_style - var/UI_style_alpha = 255 - var/UI_style_color = COLOR_WHITE - var/UI_mouseover_alpha = 255 - var/UI_mouseover_color = COLOR_AMBER + var/UI_style_alpha = 255 + var/UI_style_color = "#8a8872" + var/UI_style_highlight_color = "#545e78" + var/UI_mouseover_alpha = 255 + var/UI_mouseover_color = COLOR_AMBER //Style for popup tooltips - var/tooltip_style = "Midnight" + var/tooltip_style = "Midnight" /datum/category_item/player_setup_item/player_global/ui name = "UI" @@ -25,26 +26,28 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) if(ui_style) pref.UI_style = ui_style.type - pref.icon_size = R.read("icon_size") - pref.UI_mouseover_color = R.read("UI_mouseover_color") - pref.UI_mouseover_alpha = R.read("UI_mouseover_alpha") - pref.UI_style_color = R.read("UI_style_color") - pref.UI_style_alpha = R.read("UI_style_alpha") - pref.ooccolor = R.read("ooccolor") - pref.clientfps = R.read("clientfps") + pref.icon_size = R.read("icon_size") + pref.UI_mouseover_color = R.read("UI_mouseover_color") + pref.UI_mouseover_alpha = R.read("UI_mouseover_alpha") + pref.UI_style_color = R.read("UI_style_color") + pref.UI_style_highlight_color = R.read("UI_style_highlight_color") + pref.UI_style_alpha = R.read("UI_style_alpha") + pref.ooccolor = R.read("ooccolor") + pref.clientfps = R.read("clientfps") /datum/category_item/player_setup_item/player_global/ui/save_preferences(datum/pref_record_writer/W) var/decl/ui_style/ui_style = GET_DECL(pref.UI_style) W.write("UI_style", ui_style.uid) - W.write("icon_size", pref.icon_size) - W.write("UI_mouseover_color", pref.UI_mouseover_color) - W.write("UI_mouseover_alpha", pref.UI_mouseover_alpha) - W.write("UI_style_color", pref.UI_style_color) - W.write("UI_style_alpha", pref.UI_style_alpha) - W.write("ooccolor", pref.ooccolor) - W.write("clientfps", pref.clientfps) + W.write("icon_size", pref.icon_size) + W.write("UI_mouseover_color", pref.UI_mouseover_color) + W.write("UI_mouseover_alpha", pref.UI_mouseover_alpha) + W.write("UI_style_color", pref.UI_style_color) + W.write("UI_style_highlight_color", pref.UI_style_highlight_color) + W.write("UI_style_alpha", pref.UI_style_alpha) + W.write("ooccolor", pref.ooccolor) + W.write("clientfps", pref.clientfps) /datum/category_item/player_setup_item/player_global/ui/sanitize_preferences() @@ -52,13 +55,14 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) for(var/decl/ui_style/style in get_ui_styles()) all_ui_style_types |= style.type - pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_style_types, all_ui_style_types[1]) - pref.UI_mouseover_color = sanitize_hexcolor(pref.UI_mouseover_color, initial(pref.UI_mouseover_color)) - pref.UI_mouseover_alpha = sanitize_integer(pref.UI_mouseover_alpha, 0, 255, initial(pref.UI_mouseover_alpha)) - pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color)) - pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha)) - pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor)) - pref.clientfps = sanitize_integer(pref.clientfps, CLIENT_MIN_FPS, CLIENT_MAX_FPS, initial(pref.clientfps)) + pref.UI_style = sanitize_inlist(pref.UI_style, all_ui_style_types, all_ui_style_types[1]) + pref.UI_mouseover_color = sanitize_hexcolor(pref.UI_mouseover_color, initial(pref.UI_mouseover_color)) + pref.UI_mouseover_alpha = sanitize_integer(pref.UI_mouseover_alpha, 0, 255, initial(pref.UI_mouseover_alpha)) + pref.UI_style_color = sanitize_hexcolor(pref.UI_style_color, initial(pref.UI_style_color)) + pref.UI_style_highlight_color = sanitize_hexcolor(pref.UI_style_highlight_color, initial(pref.UI_style_highlight_color)) + pref.UI_style_alpha = sanitize_integer(pref.UI_style_alpha, 0, 255, initial(pref.UI_style_alpha)) + pref.ooccolor = sanitize_hexcolor(pref.ooccolor, initial(pref.ooccolor)) + pref.clientfps = sanitize_integer(pref.clientfps, CLIENT_MIN_FPS, CLIENT_MAX_FPS, initial(pref.clientfps)) if(!isnum(pref.icon_size)) pref.icon_size = initial(pref.icon_size) @@ -71,6 +75,11 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) . += "
__
" . += "
reset" . += "" + . += "UI Highlight" + . += "[pref.UI_style_highlight_color]" + . += "
__
" + . += "reset" + . += "" . += "UI Opacity" . += "[pref.UI_style_alpha]" . += "reset" @@ -111,6 +120,12 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) pref.UI_style_color = UI_style_color_new return TOPIC_REFRESH + else if(href_list["select_highlight_color"]) + var/UI_style_highlight_color_new = input(user, "Choose UI highlight color, dark colors are not recommended!", "Global Preference", pref.UI_style_highlight_color) as color|null + if(isnull(UI_style_highlight_color_new) || !CanUseTopic(user)) return TOPIC_NOACTION + pref.UI_style_highlight_color = UI_style_highlight_color_new + return TOPIC_REFRESH + else if(href_list["select_alpha"]) var/UI_style_alpha_new = input(user, "Select UI alpha (transparency) level, between 50 and 255.", "Global Preference", pref.UI_style_alpha) as num|null if(isnull(UI_style_alpha_new) || (UI_style_alpha_new < 50 || UI_style_alpha_new > 255) || !CanUseTopic(user)) return TOPIC_NOACTION @@ -146,6 +161,8 @@ var/global/list/valid_icon_sizes = list(32, 48, 64, 96, 128) switch(href_list["reset"]) if("ui") pref.UI_style_color = initial(pref.UI_style_color) + if("highlight") + pref.UI_style_highlight_color = initial(pref.UI_style_highlight_color) if("alpha") pref.UI_style_alpha = initial(pref.UI_style_alpha) if("mouseover_color") diff --git a/code/modules/client/ui_styles/_helpers.dm b/code/modules/client/ui_styles/_helpers.dm index 83ceb172a415..97d99ab4f2fa 100644 --- a/code/modules/client/ui_styles/_helpers.dm +++ b/code/modules/client/ui_styles/_helpers.dm @@ -6,23 +6,7 @@ LAZYADD(., ui) /proc/get_default_ui_icon(ui_key) - var/static/list/default_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/midnight/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/midnight/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/midnight/hands.dmi', - UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', - UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', - UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/midnight/interaction.dmi', - UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/midnight/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/midnight/movement.dmi', - UI_ICON_NUTRITION = 'icons/mob/screen/styles/nutrition.dmi', - UI_ICON_STATUS = 'icons/mob/screen/styles/status.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/midnight/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/midnight/zone_selector.dmi' - ) - return istext(ui_key) ? default_icons[ui_key] : null + return get_ui_icon(global.using_map.default_ui_style, ui_key) /proc/get_ui_icon(ui_style, ui_key) var/decl/ui_style/style = GET_DECL(ui_style) diff --git a/code/modules/client/ui_styles/_ui_style.dm b/code/modules/client/ui_styles/_ui_style.dm index 1a5885cfac67..0e78ae2e832b 100644 --- a/code/modules/client/ui_styles/_ui_style.dm +++ b/code/modules/client/ui_styles/_ui_style.dm @@ -26,6 +26,8 @@ ) /// A subset of UI keys to icon files used to override the above. var/list/override_icons + var/use_overlay_color = FALSE + var/use_ui_color = FALSE /decl/ui_style/Initialize() for(var/ui_key in override_icons) @@ -49,8 +51,13 @@ var/list/remaining_states = get_states_in_icon(check_icon) for(var/check_state in checking_states) remaining_states -= check_state - if(!check_state_in_icon(check_state, check_icon)) + if(check_state_in_icon(check_state, check_icon)) + check_state = "[check_state]-overlay" + if(check_state_in_icon(check_state, check_icon)) + remaining_states -= check_state + else missing_states |= check_state + if(length(remaining_states)) . += "icon [check_icon] for key [ui_key] has extraneous states: '[jointext(remaining_states, "', '")]'" if(length(missing_states)) diff --git a/code/modules/client/ui_styles/ui_style_subtypes.dm b/code/modules/client/ui_styles/ui_style_subtypes.dm index cff4d996c43b..a0de8be1f7e1 100644 --- a/code/modules/client/ui_styles/ui_style_subtypes.dm +++ b/code/modules/client/ui_styles/ui_style_subtypes.dm @@ -58,6 +58,8 @@ UI_ICON_UP_HINT = 'icons/mob/screen/styles/white/uphint.dmi', UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/white/zone_selector.dmi' ) + use_overlay_color = TRUE + use_ui_color = TRUE /decl/ui_style/minimalist name = "Minimalist" @@ -72,3 +74,31 @@ UI_ICON_UP_HINT = 'icons/mob/screen/styles/minimalist/uphint.dmi', UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/minimalist/zone_selector.dmi' ) + use_overlay_color = TRUE + use_ui_color = TRUE + +/decl/ui_style/underworld + name = "Underworld" + uid = "ui_style_underworld" + restricted = FALSE + icons = list( + UI_ICON_ATTACK = 'icons/mob/screen/styles/underworld/attack_selector.dmi', + UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/underworld/fire_intent.dmi', + UI_ICON_HANDS = 'icons/mob/screen/styles/underworld/hands.dmi', + UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', + UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', + UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', + UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', + UI_ICON_INTERACTION = 'icons/mob/screen/styles/underworld/interaction.dmi', + UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', + UI_ICON_INVENTORY = 'icons/mob/screen/styles/underworld/inventory.dmi', + UI_ICON_MOVEMENT = 'icons/mob/screen/styles/underworld/movement.dmi', + UI_ICON_NUTRITION = 'icons/mob/screen/styles/nutrition.dmi', + UI_ICON_STATUS_FIRE = 'icons/mob/screen/styles/status_fire.dmi', + UI_ICON_STATUS = 'icons/mob/screen/styles/status.dmi', + UI_ICON_UP_HINT = 'icons/mob/screen/styles/underworld/uphint.dmi', + UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/underworld/zone_selector.dmi', + UI_ICON_CHARGE = 'icons/mob/screen/styles/charge.dmi' + ) + use_overlay_color = TRUE + use_ui_color = TRUE diff --git a/code/modules/mechs/mech_movement.dm b/code/modules/mechs/mech_movement.dm index 3c8eeea0d04a..3fc3f1c25376 100644 --- a/code/modules/mechs/mech_movement.dm +++ b/code/modules/mechs/mech_movement.dm @@ -11,13 +11,8 @@ if(.) if(!isspaceturf(loc)) playsound(src.loc, mech_step_sound, 40, 1) - - var/turf/B = GetAbove(src) - - for(var/thing in pilots) - var/mob/pilot = thing - if(pilot.up_hint) - pilot.up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" + for(var/mob/pilot as anything in pilots) + pilot.up_hint?.update_icon() //Inertia drift making us face direction makes exosuit flight a bit difficult, plus newtonian flight model yo /mob/living/exosuit/set_dir(ndir) diff --git a/code/modules/mob/living/human/human_movement.dm b/code/modules/mob/living/human/human_movement.dm index a31e6788e00e..39f3c3a28416 100644 --- a/code/modules/mob/living/human/human_movement.dm +++ b/code/modules/mob/living/human/human_movement.dm @@ -118,8 +118,7 @@ handle_leg_damage() species.handle_post_move(src) if(client) - var/turf/B = GetAbove(src) - up_hint.icon_state = "uphint[!!(B && TURF_IS_MIMICKING(B))]" + up_hint.update_icon() /mob/living/human/proc/handle_leg_damage() if(!can_feel_pain()) diff --git a/code/modules/mob/living/inventory.dm b/code/modules/mob/living/inventory.dm index 903b1bc8ecb3..f0ab7bdc92eb 100644 --- a/code/modules/mob/living/inventory.dm +++ b/code/modules/mob/living/inventory.dm @@ -62,11 +62,8 @@ if(slot != last_slot && (slot in get_held_item_slots())) _held_item_slot_selected = slot if(istype(hud_used)) - for(var/obj/screen/inventory/hand in hud_used.hand_hud_objects) - hand.cut_overlay("hand_selected") - if(hand.slot_id == slot) - hand.add_overlay("hand_selected") - hand.compile_overlays() + for(var/atom/hand as anything in hud_used.hand_hud_objects) + hand.update_icon() var/obj/item/I = get_active_held_item() if(istype(I)) I.on_active_hand() diff --git a/code/modules/mob/living/living_maneuvers.dm b/code/modules/mob/living/living_maneuvers.dm index 8913f7a8190d..2afaa16ad4c0 100644 --- a/code/modules/mob/living/living_maneuvers.dm +++ b/code/modules/mob/living/living_maneuvers.dm @@ -25,13 +25,13 @@ forceMove(get_turf(origin)) prepared_maneuver.perform(src, check, get_acrobatics_multiplier(prepared_maneuver), reflexively = TRUE) prepared_maneuver = null - maneuver_icon?.icon_state = "maneuver_off" + maneuver_icon?.update_icon() /mob/living/proc/try_maneuver(var/atom/target) if(prepared_maneuver && (isturf(target) || isturf(target.loc))) // Avoid trying to jump at your backpack contents. prepared_maneuver.perform(src, get_turf(target), get_acrobatics_multiplier(prepared_maneuver)) prepared_maneuver = null - maneuver_icon?.icon_state = "maneuver_off" + maneuver_icon?.update_icon() return TRUE return FALSE @@ -59,19 +59,18 @@ if(!maneuver.can_be_used_by(src, null)) return prepared_maneuver = maneuver - maneuver_icon?.icon_state = "maneuver_on" to_chat(src, SPAN_NOTICE("You prepare to [prepared_maneuver.name].")) else prepared_maneuver = null - maneuver_icon?.icon_state = "maneuver_off" to_chat(src, SPAN_NOTICE("You are no longer preparing to perform a maneuver.")) + maneuver_icon?.update_icon() /mob/living/proc/perform_maneuver(var/maneuver, var/atom/target) var/decl/maneuver/performing_maneuver = ispath(maneuver) ? GET_DECL(maneuver) : maneuver if(istype(performing_maneuver)) . = performing_maneuver.perform(src, target, get_acrobatics_multiplier(performing_maneuver)) prepared_maneuver = null - maneuver_icon?.icon_state = "maneuver_off" + maneuver_icon?.update_icon() /mob/living/proc/get_acrobatics_multiplier(var/decl/maneuver/attempting_maneuver) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 08ee95501bd6..fca24a511dfb 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -831,8 +831,7 @@ if(istype(module, /obj/item/robot_module/janitor)) loc.clean() if(client) - var/turf/above = GetAbove(src) - up_hint.icon_state = "uphint[!!(above && TURF_IS_MIMICKING(above))]" + up_hint.update_icon() /mob/living/silicon/robot/proc/UnlinkSelf() disconnect_from_ai() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 99c505013c3d..512db5f11bab 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -890,7 +890,7 @@ /mob/proc/toggle_throw_mode(force_set) in_throw_mode = isnull(force_set) ? !in_throw_mode : force_set - throw_icon?.icon_state = "act_throw_[in_throw_mode ? "on" : "off"]" + throw_icon?.update_icon() /mob/proc/toggle_antag_pool() set name = "Toggle Add-Antag Candidacy" diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 92ddfd3f4cea..a934d39d2e38 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -269,7 +269,7 @@ if(next_intent && move_intent != next_intent && next_intent.can_be_used_by(src)) move_intent = next_intent if(istype(hud_used) && hud_used.move_intent) - hud_used.move_intent.icon_state = move_intent.hud_icon_state + hud_used.move_intent.update_icon() return TRUE return FALSE diff --git a/code/modules/projectiles/targeting/targeting_overlay.dm b/code/modules/projectiles/targeting/targeting_overlay.dm index 5d5b1f9ba654..7210efedb4c4 100644 --- a/code/modules/projectiles/targeting/targeting_overlay.dm +++ b/code/modules/projectiles/targeting/targeting_overlay.dm @@ -34,27 +34,24 @@ // Update HUD icons. if(owner.gun_move_icon) if(!(target_permissions & TARGET_CAN_MOVE)) - owner.gun_move_icon.icon_state = "no_walk0" owner.gun_move_icon.SetName("Allow Movement") else - owner.gun_move_icon.icon_state = "no_walk1" owner.gun_move_icon.SetName("Disallow Movement") + owner.gun_move_icon.update_icon() if(owner.item_use_icon) if(!(target_permissions & TARGET_CAN_CLICK)) - owner.item_use_icon.icon_state = "no_item0" owner.item_use_icon.SetName("Allow Item Use") else - owner.item_use_icon.icon_state = "no_item1" owner.item_use_icon.SetName("Disallow Item Use") + owner.item_use_icon.update_icon() if(owner.radio_use_icon) if(!(target_permissions & TARGET_CAN_RADIO)) - owner.radio_use_icon.icon_state = "no_radio0" owner.radio_use_icon.SetName("Allow Radio Use") else - owner.radio_use_icon.icon_state = "no_radio1" owner.radio_use_icon.SetName("Disallow Radio Use") + owner.radio_use_icon.update_icon() var/message = "no longer permitted to " var/use_span = "warning" @@ -206,7 +203,7 @@ if(!no_message) to_chat(owner, "You will no longer aim rather than fire.") owner.client.remove_gun_icons() - owner.gun_setting_icon.icon_state = "gun[active]" + owner.gun_setting_icon.update_icon() /obj/aiming_overlay/proc/cancel_aiming(var/no_message = 0) if(!aiming_with || !aiming_at) diff --git a/icons/mob/screen/styles/minimalist/attack_selector.dmi b/icons/mob/screen/styles/minimalist/attack_selector.dmi index c5a7e57c5220dd1fa547574550a868a495f49b6f..2e3d66fd059a3d6fb3881e27f820d3f069f623ce 100644 GIT binary patch literal 1878 zcmbtVYcSi17EiR*R!RD>s;pPbwKhd=cd{xfYB3=tYpE=$SBurAnLi~+HN>=Ds}Hg4 z+GsqNEk%N@O+yn=%7&HDM${uod$B>bG(<_-#OmC+ANIqYxt;sroHM^UU(WfR-#O>o zU@Y3i$ifH&0+|H(`-W`Cn)kNHaNFM$B|2}1*O_O-NxliGaVeLQNtcoU5QxmE{H`77 zgB$xMDq)530PR5(cPGREDsVNuRfo^LD4_jlu6qly#*>;Bf((|y8H3Z0RitIsXjJAJ zi4$Bj`uHu7R6$?t|&2jq>@>olm^?S(OU+|!TB}ZJL5_a$j~mp*ZVA)@v1Tim`0lB(F^#>w%d0O#zVnH@!}_Br|3ZR zUIQ`|`lgY_EhPo_e;Ml(tzR<#Qoh?1z-X$@Eam=C_Cmd!eDWmdqpe2EoP---ZzIE< zPUidTV^7nr|Ic8En=0h;c-f!y%Vjd&Pd!9k_c&p_eUfOZU8bNs6bv6KN4rs*pZOW$ zyt@1z74bqtNrytATf#B^A}MqAFj$wcbl1(UTe@7ZrCoPScvR+88Jy&l)wy&mjBVBo ztgHoh=pD2H8NJyhy6mlI78}J*cDO|LwC?%JhS%U!D@kWPz~V8zWOxsp+x#i@Q)nwy z__oLYL`|6egZ<9w2F*e-6OND-MW3({H3L)Bzo8n~tl%KwNMaoHkD872z>$}iv-KgCR zrON^d>FK_qz){|PY_#1Posqvl=xa|jkJj!XcV7Ko!yK_70T*n=4_GdNe=Ysq( zddAiitXlMxe(W&(Yjz^`f^edtqMe#_)uk?@7xxg$isYA7wZymJ@VqLP2a1=5ifI&{ z^-66SJR5_U`f3MW?#D57PGFoGpWO_vWVow`6finfMC|`T@puM&85=)rWjnE_(=nEL zt51yNtgX;*KVOZE_bdcT3M0-ebk!9Am=Vs2y*^DWTne%Ivgk+L%~Wrc?fW`=BC}S( zW93Vw&_a|Zr!8_b?f3_1?Qi-V3Yy!&d-TX(EtkuCV5FB`bDEs$>S~}{icuGw=jUDk zKD9|U&yP@tW_noq(!t_zdk5%LJCR z=#0~_S|j$Q8z^y!34a6G?2u}v$kgbwF{5dMmSs}kMX9Z6LUt9Tt!+n6%Al3-&)=pYIB`FIXC literal 1167 zcmeAS@N?(olHy`uVBq!ia0vp^4M3d0!3HF+R#kZdsm)a(5hX6E#mPmP1tppJc?=8{ zbEZzP<~nR3;FA4Pr2B6BpD5FVYCATp7Z8cuD0Xtw#k@zamj{S*oVd%kr*V7m;kA3q znN4cd?ac)B1Vv)_-8Ic*ZZ+G7|`Xj2hyt)L18=EGJtY4Bo z`+fYhCbe*`&Bp>x`6bT09(03cZ=mL$eTy~2zGc*W6x-wcvopq~=)lR3dQbVo(X5Piwpsfo$4|ex{pnXOnGgmB=INd;jv*Cu-p-BfTJ0dvsy+RI-4{c})jLw= zr5WlSJ$feC>3}WIuN!(te;0I`^nUCA=Ko+0f7_W0%lx*=S!b=76@34@Q^C(*E5;x( zDFzu5(VWd4C$3+=zPjbdSb{bG3>%eLI#x%>9j*Btx4Y3b%^v;E^Xe)@3Lwo5y2 z&Ep59;t6aocfC7qnwPhkJ$lZz-2J=P{l2(0`QdR5LdCe7)zGyL*#>)YTtQ#Bv2D?E~8_xnSR^qoUf zr|h&jc4@;=-O{jE^LPF_-g2UF@tU;-Rd*zc(>*|y08FGG<8d#Vxkc{5&GpsxR zkKw^DIAgYWWA&@gXRj-V9Xa6&A-Z!Eo&a*z3=_DYLC5-TAm1OivRZN$G1carr*pBuQ%H>?65;-9A4ji za3SLXQc+@k1OJ8n_uspInSWmWH}jNh^Pfk~TBf;Z{gkBo2LDUpUa1$a^B(`lAP*Fo z^!n>8*LsPz+qYTHbsw-TeYJ8`Q}LBox3_%%qJ3ksy9Zx({p`Y=T?hZ$)vb=Rb>I6Z zEN&-A&SPS8_WgE=d#4$yUp)>EeK~E_)%xR`dT*B`ebd@-)ad!^S^K|p2}H@y|Dx2)Go{66e{f6n^sfA_Q-e(pZqy0PlXjV(b}U;WP5eXQn~bFs(9O`Gf;690ZL zZip#oJZx~sCFNoY&?^`7XQf$Mth_j%c>_qga-OS8mkn=-*GBsT>My4M(R&~-T@$e~ U@bY#IUFVdQ&MBb@0N`6D^#A|> diff --git a/icons/mob/screen/styles/minimalist/fire_intent.dmi b/icons/mob/screen/styles/minimalist/fire_intent.dmi index 62efd8ca8676ef7bb7c6e99d95333d9b831f8a4b..02a311ec4e88c1726b6781f4e0820f410941154a 100644 GIT binary patch literal 5621 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 >tx9&`Awj$Vmp@0 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 AoB#j- literal 3965 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 XSr6(b%u!l+00000NkvXXu0mjf6&K5I diff --git a/icons/mob/screen/styles/minimalist/hands.dmi b/icons/mob/screen/styles/minimalist/hands.dmi index 28264b0635f19e342978d97a67bd1ce803c63181..05840e72af8e065f12088e218734615bee2ed508 100644 GIT binary patch literal 1876 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 diff --git a/icons/mob/screen/styles/minimalist/interaction.dmi b/icons/mob/screen/styles/minimalist/interaction.dmi index 8a4875e964fa1510b9b514179dd9137afe86e9f1..b8c4a0b80fe8a21cd31517f81b36988a44bf682e 100644 GIT binary patch literal 2533 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 IM6N<$f+%7>Gynhq diff --git a/icons/mob/screen/styles/minimalist/inventory.dmi b/icons/mob/screen/styles/minimalist/inventory.dmi index d2d055fe7533729d186c506be2970d930c5ac80a..169c66eefdd0d24143029067f5cb61957b69ced6 100644 GIT binary patch literal 3745 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 LNkvXXu0mjfUFi1U delta 3667 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 eCeFPf68-{lP$59P(Eu+10000# literal 1132 zcmV-y1e5!TP)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#G}i&9eyGV{`vxHwZXi;5L&6%4sJ(~1&vQz2})!t%tNY+}?E zmFDH)QKzin>gS^1;_Jx;05$(If^=`!h5!Hqrb$FWRCt`_T1{%}FcAJK3dXDKyYm5h zh87-p6|&1cLJv}M5AQ-&g+hFWcL38(_g)!o%3Boq$%;JIUouMjK_E`7`NpI1XzWjS zr_%|)8TaZ-UDxl|Bz}8)`=cLo@!y?Jr;)s>s;iK9T{m%plYh(rMP8QW-%FAY!|+&D z)#wB_ztI1@H2D$-2fvs*akty8)hETV56m(8vCXE9!{r=6D}pxc_xq!HtQ)fZPn{o& z-EOy59Qt>kaVBOnz{QX`8@6K~`gR(56mOL*0pbXH- zIgpY+`WE>7{6t;X$%~+CKjFep+42s6ivHnn7=LTqHt9-0IULF#^e{wWv)SNqIAF8c z0Kmkd7*Nj=dIw1H&t0soB@PZi-}iWWdYU-VG)<_vGrYdOp8Y1o|AeLZZDU_vUaUO9 z0a&e8==&a0%4D+-O#5~r#B61!_|0)&Uteow+q4r^1lzVnQ529;LQ0uzDRg~`^x;qP zKEMVkB>*Jv1E|^e<)>_U1;A`Rq?9O%!pB4uF2NsE1N6>|;~^*|zjFqt=$mclwKCvR z{LwW)f%Ba}4F4nm!!SI~omiITv1u96P@@KO@fD88kk3L`5^?MFM$Yy^47qZ$P zzyT+1a7mM=-s0q-5K~xeg_RiTqxI*0(K?bn3+PC_G2)U~>;tGBArx*U2#WzQcZ8V7 zOJj2n0{i{|?oROL_Xot{ruPS=0J%@l#ej=GpK~3s2EfN*SA9O$Ae^lNuG$=>&--X| z+?ZVkDQ#{^pZC$`xN&w1=rbgQIO-pp0h>NQH!io?2WDyj?#450)%_)8U z;o$)Qy+6QJ=i@+dA7JY9N~6Cu1or`})d~PceV)pIT$ex~vJddl=W`8$b008Q#BBQf zkL&}45NFK~fH4E8vA_@L1N3uL=U0~H(Y$zb+>hx4V)gkPFCK{K158j&(9QG#-1`GK ykj?%8F5Cm(LSV=-0C=2JR&a84 z_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm%}mcIfpCgT5=&AQY!#GB z3oaN>v9P4pY`Z70G1+7)ThCzY8EkB6 zZM*>ORwgDia{^m}+0qlxZm|ndkbxPPc_8yuGCI6}KA)h@C=5dY0AuV7gPcyMulr-F z`lB!m!5BNwW`8r2^>Mvkvk;W^-}6tnu6qH1BuQ4XCv{!-yXrMbl6+R2!)W~n0cr7+ z#bN;f;GAcV%ix^X4S6Y(KvBQY0Zj|&LRbAt0eSnA$pio}oldi{AP8!;p9-9F91e%< z*l`>Hz<4~)#^N}}e!o|$FBHHz2V<--ZgTO*`mHDy)>hd6<>ZfWOh-z#$n;+Bl3txmx zND$Gogn!DljO<@x{{n`Jy$DhVpvDTI4nU0+KplV@D}XuxHC6z10BQy=p!VLNE|$wB zY5l=>fE7R;fSSPzsCyBN(g$Vx^PcB@w3^Hil>!{ciSlD@?$1+GD&TgzMKb&I`0JA1 zb%C%0Ozh87Qzjr%TwL$EVDNW=X95ZrJxQ9*H(HAA08QuZO&8<^^d@*)===!uLZ-b2 zV=-0C=2r$~y{x zFc3x2IepN7-Z{{(|pHr440Dv)eg+VTt%lG{;RlZY}B^YDZFbqxRqpGU5 z2+I7=?g`KHZhrt!*Y#=YO+C;18M>yf>#u=(7|nkW(1bS}k4FH25Tbqk3?anWB5%(m zP~`U}U~a%tER{bfpljdveE>iZ1nnBTiU@wmSOYC33yJFu2sSBXS x3ZO248YnA(x&Ugd0O|s$u>zV=-0C=2ri#rO#Fc1Z6?I|91oseIvCddR8_7#l4n`l9?Kw2D<)4Oo%bTcs1 z;@&;{0M~n3xKznAEN;gWnU72wVR5~Xi7cY9_rHo00W6hL_t(&fyG(9ZmTd9KD~-kp$_aU z7fV^Yu`zV0#Du!>3|@H@R-S>a%7hfDi=Ut?Qs|PM!LqvDp*__2+Quf(d=d%)o6qON z=f~#m?d=V+EIYvs(6;UKEqG1*NpZ^SZ7NOP{k-FO+3D8dg=6)-WMNUKGXn zziFD>Btlu1x#>AN^nE`X7RRyHFiL4B^HWMYlL&p^cc$k60Q}Kitg7l*Rn<`z1ECrZ z08kXgWJX+zIF1i-93Nyc5UTOWFV6@cXaz7qHvaYXb@IEm2s+5d>-d+5@Sh6+{J4Q` z>JGyIVHm>G(-Q!|_&W@PFSil+=5z*cy|5L(H3s0@M^eTZ+~3~=0Km)3%h(Rn(dXyqIGCa+u8s%z_LuUz z!~>@pAg8$`Nhahtm?TL6;3rM42|3Np@nf2Fg;yyI0F(6Na(!*A&F>^YmSxUCO$d=^ zS+-~}Hh$NjMk(!l_?>5f?xE;=YP&EDS6v%y$v-OqEeY}+(7N)GztUix<264m(P9r%(b5_g-u4tQ%qJ{7D)(kby;jO!o)9&G*A~<1GN^-0S+ij28HUATf>)sbph0!A;wt#nl@zlQ3fYQ=csj?%K9}&a&)e8xSExTZ*D^x=jcd1AR6`ZA;v1Hevn& X_4}QtyoqoU00000NkvXXu0mjfa%~Sz literal 780 zcmV+n1M~ceP)V=-0C=1w$FT~7Fc1ddIrkJlx|dd6vy=qMpsyeSug!rqkQ^0!dIz`fYw`AD znBk^Ce=b$>4vXROBy-5B2^M`vCb4{z-l-auVbPp<=cV$tXq2rXvr4J3c#-*(_~Y9x z{OsVSKo?2C9doM<&d>k=0#QjsK~z|U#aBIUgD@C!HWo7Hoe6FE3*!_JH0&M)fhrb`&o6F^bs;bWT2MojTyh)Pe z3;=na|0((PdIbP%k|a43Ib-bQFUYmlPbA`z8e_?|*0nXZj~UAtdm#~z^Uk(yjp45A zoQAd5b<;HFopWCMM6_*N`|JR~gR8OYy1whW-WKB{2Y{w&CNmNPrvM*p^3&-wxqnr} zCl>%8Zg5SVloDy0;&3ASNE(ul%d*67w=?ZZDF`8qz%@H}TThcZ5JGN8|2U53ImKPpuZg7KGHN4QKcBbB>h6#e?&l4 zRlz}}wXUnG`dI-aVh-~C{JS(wgV%;t0krtI{5p>X;5}YwOb8aU;2uylJ%_kqKIU5j zmWXdK7MlI_EnW55R@r47nFCVpMOd}kztsFy?-7tl$?hnP)<9h{7@UI;On37aeQ zaJr`wOSrH5uK@OT8qyB=-sgomoQ53F^E}^sjJz)OE!hO#kLPdUgkAUKpyogT0000< KMNUMnLSTZ$oM;yS diff --git a/icons/mob/screen/styles/underworld/attack_selector.dmi b/icons/mob/screen/styles/underworld/attack_selector.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2df7a24c30db69840d1cdb9b480164bf5ac9b0f2 GIT binary patch literal 1544 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 FV1hr*Q!D@g literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/underworld/hands.dmi b/icons/mob/screen/styles/underworld/hands.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fd37369cc082609c2211417e651ab1cf4bdee168 GIT binary patch literal 3286 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 P00000NkvXXu0mjf)N4D4 literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/underworld/inventory.dmi b/icons/mob/screen/styles/underworld/inventory.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b576bd3b4df980c454ad33c578c1afda4d50c115 GIT binary patch literal 2541 zcmV{+P)$+I6lFUreqFtYLw0cQkZo}->sD#v#J9IP z@Fv+UfB2DvkldV#OIexowbT*=WZ#Li@%>($Jv+i6Mj(vUhuN)fH6}$NHYXbAc_XB5Hh{@ee7C1ue+Ks`2Yr@ zb3+)kah|Z&)jSVa>k%(w!ES=dJX*q8j8aarm}i-fPttk9@P`o9D35pM;(H!Ry?m`T;}0PjA&^dyC6luYwF3Xp0UY|Y0a2$5!TVCdF3MQ zLi98b23T=2K>OM;)^M4TL&DXokSTEcG+)Mf3IP^qo*7K=u{1fov10}ZHh6BqMH^b7 zr7)sT^Jj)1)C@Vsda6#rm$V1yRh5Ur#RSyVZdz$F3p`d zi}Ts=dvP{5P1Cui>q6&3=;pmRb6v+|8bHX7+l#YL?rgm5#o69*l^^UKSNXx-ag`rr z*_Kgu6JO;A*>|9GAU=nu!{hfi@l}41eR`m<<}2dx!^=&4l^>sLJmm+)s+WQdG%f2dj@Wa2VO%*#MD$0zou~XD`r()_-~)ZVEJ!MTps!;)KpeVp z#oKx02bGbyKbL$V%RalBmxI9%07uRjx?#oJdH7%iAvG-d0>9yjQV_Zc<6B~oBVWkX zxZ)o@7!|Q5jQarBy+oRm@&*2Yspw=5kljSNvb5*^h|A973T!N4NZ-I)Vg=_9X^j)# zva(#>SR@0obO|fC)s1;g80yT)kEjIa6IdgxPjs+)yycCstvp{AnhgN!hQzjG40Wz3 zm`lmGct>wA`D7uDeQTIOXXnId@j+)riiIZT^x`Efusc$FGTI8^ABjbN)~mi)6r5lplb>ysR0&*}#d>!a!^okS@%lLCR-jA=5Tmag2kvb4IHZ zbt6P4c%JeHqf3eeU6|xVE0Kgji-k%IPK=gql>+HShxvvX9E=nNRt`pp2>&=Lh(}NhbLCdeY4Fz2eP$$`^)O*Y?QZB$aC<{tiz0L17i5 zA>BxyBZQJv4z&H-O}yj>#f%ywG5FLpOfQh;zTCuD`9YR#|0BDJukwSv<0?PcJFfDB zz2hoB__KfT&GZj$^$SogyAS5Gd-?^amg(!=`Rty4fl#=>gx$@k~YAEQ0nE_;@cC^z= zf56q)_gb!)7*w*=$NqxqERv+AKK2iwboflEmp9aT=VacA6$|V_C0~yWMA<5;2Z1*>}7PR_iMFpQ0{}(ZAO=Rzp3`u4#f=y7ka-|`(ROGv%1Ykzx?{^ zKdud2>it^nE~%{k`R`{2 zvfuvmt^v|}PhYI}RP8t9!`!KVo*Ve`ulEcrdXH)#{XK!IeUFk!^zP@e^4nbaw}1cT zJqDByG$d7)^8u>%9hH62DI?DrTt7_=SnmZ=p7i$x)L5lYcZE(x)s2z#UKI32YKubE zdD;cke|I{@;w1}(FH<2pW+XkTjT&*YlCj%`7l7NAD z9|L2MxYA#dNbgbUdd}i>?_zTwgM%4FXvN5S|JnQ1fOq#T0nSgM%zFQS7@&TDo1;&9 z&j$E9gn|2faIW{{1NLc{ow~=srQY*dVA*r2C2|LYGriyT8@K^++rYWrZ~G1NeGJa^ ze(g6jYXjn@feXD~`whni#I13y_uFy%`9Gi^uygzmnrxnr(bKe@00000NkvXXu0mjf D#k1`> literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/underworld/movement.dmi b/icons/mob/screen/styles/underworld/movement.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6890efd9fa4eb1c4bc45c612ed63b632bb5355b4 GIT binary patch literal 2776 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 eBQpT6Dt-eS@^plVXGsA70000$ z&>=aAmAKR^E4cc(fE^3~oSih#nVnsf0004oNkl!-Cbf zV=j`^1g%2)vdqU^B(0W?k!p>)&55T=p!di{QZ-pY1DTXYZo8a#x@`$f;3COQJC1pXoCP(5HW;(%o{2wctydNTX8|qfUz9?n zHgD{}2@U{(vj9oV^JpGeP|^lEHgFP@iopM^FpB~}03A3xNS>ESPtM@b!&;CrLrHPH z3ICQCumK&<=^hGNW{?d0M6%-qWI!PX2Nf((4h~)d+IR=bV6Z{cH1QsM2C(F@j1KMy zT|R^afDLmJ^he;EJmq51?RKqmZB@CdZR>o@g*cr!=NDWs#?2SueMa#8gL*w@z+jI%n5uSObUiRnA|b+!L(rLgP9ef59TuXKA76^*9VVN78m>* Z`~splnRCz)oGbtU002ovPDHLkV1gfv7c>9> literal 0 HcmV?d00001 diff --git a/icons/mob/screen/styles/underworld/zone_selector.dmi b/icons/mob/screen/styles/underworld/zone_selector.dmi new file mode 100644 index 0000000000000000000000000000000000000000..e482039b230f8aca2ae9e45814d64f3c898fa523 GIT binary patch literal 863 zcmV-l1EBngP)$iLHFEze6H7C9#F*8Sri!&v&s2C`2$ij^1?5niLVo*5G14-kaET;FlVX`45o6a4tS zKkp9j1N>8;y#MPoey0*`fF9Dq!0pMZka zln@7?!EdVS|P`Z0)^*yUDqODL)aDo3pLZ2VLPu2dZ_)C$Cj880fVT zaF#5hgTen==FRhRGaf?HD2g#3#Snc4f9$XLWa&E~%OHxVLvX9lvak0HNmw zGpGd}47(CDw40ZsK`MF0lvIqn3|-sZOj^4e&Jdx202=tI1JF=6ZwAIpBmvYH%@1=Z z{jOk(wSTyP|6Ga2Nfbm0}0TG++-g6Hd?+RpTb@ peY6pbv7K-wzV$#^7G>#9?H@q?=tR005u_0{{R3dEt5<0000RP)t-sz`(#3 z78XuUPB}R_NJvO=adBf~WB>pEz`(#nIto1i0004WQchCV=-0C=38l)VnZAQVRD@)V?ey_nZP&+!Yt0598}1*bjviUbT19sOh>>p+qD$7{ ztx%)P1nQyH#EiE`%{sXc5!`MY*P%cef4G4dhKSu7Td<*Vk~t;@^V+6_Ot zjAv^%jCz7$JX^cr`@71|@oepew`GYjMcS9;*N8P1%Sy+{HNMT|qQ>P0b-mPXc%7yc zLco2Rru&F>pe@kO^)%yK-1~95sk@#U+zVmc5~i3cLB>UdLKtaNgj84JOc;VpAVf?T zb_s(bQp8hegqt8lbSCk3-1%T0Z#Figo?$i9@vaET@d^R? z79K0%+WBA}CueMgsE8{ag-~p7kC0~9K6pr2{BwT|*|?#NoHt(+!WlXP<6(^n}O;Lac ze+b!B{dJ8Sl2NsWVu-CF8JFL0NWSNtCWPD&dP4B265=@cUEMk+WdEy#boE0*V8xS$ o$#-j*pg6cR#Mkt=q2*M50~x5E$U_|5VgLXD07*qoM6N<$f|y6%t^fc4 literal 686 zcmV;f0#W^mP)pE4B@j_00001bW%=J06^y0W&i*HvwBombVOxyV{&P5 zbZKvH004NLm6FQ}!Y~j;*U49eb}zoRZlp!Ju)iQ<8k-?$S~8>keXH3CLb|&%oC|jz zr8?J_rd8FokuMVo$DmH?xYs0004nNklJjf^e2QALa}CaF#p& z_C4V%oaN4c?%U$RaA)!6z25A4 z$_MQCNsW z!`&57WB?u)1qgL0pgIEnU4i6*p@6@=C_u6Nu7G~)yapBZKa;)&^vMdKuYu)*AJDY) UC00027P)t-sz`(#3 z78WZjGfqxUadB~DV`JtE3!tE&=?)GiCMIEFVc`Y_e0+TE5)y1|Z0ZjWEiEl3BqZVo z2k{mbFE1}>6(4jWEVLOGdL$;o7XZ5j2yYo1u@nvA5Czi;0Hg>D%?|*4 z006EH4Yn2wG5`Rj4+^m+00#qAU;qFB0d!JMQvg8b*k%9#0JnNnSad{Xb7OL8aCB*J zZU6vyoRyNX4#FT1hG%#R($1PzU0qC@rh|P2LjuCZ780N~zP&(42aoNJe1GoCA8K~% zhjC)veWY*cJXpi7>~d@<*+2vxm-C4dEkWt9FFx=f<5(H{a9n_GD@p`7AKzL^o{lea zpMS}NjYnqwK_?mvx$*ghlE`3*Lkgf2+-h(&M6RfW)u8S}kPAv6gCzzj@Lxe;JQIXI ztuT!$M4dJ3r!If+FYX-IuL#aE;Q#;%Hc3Q5RCt{2Tj_$_CJgq(2L^j)iJjeT(l%*& zq)B?DciO)HgB5W~0_@ptw)3MQbF8hA5FbMDfzvdXFNcltA@q0UkJ@T^bcP3e`n&cI zZQGUI>)Q4l2X^##?H`Q1>kGx)KF@(|{ayQq_RyCB>JR5RaOj62*B%C^4{~9y&0F|y z_aVG}^I3EdTs+f(ZX8FhY;JYIflink!u<0u|J@xv7y_ob3t zMqWX{HW=$$NH7BSpD6(WQ9wW{rQ`+zR$f5>nmi?a2S`EyHy_+6#(=R8uPOpwUO}Mm zr*RDWJ|q$Xn=uv;kV?*yK+rP>th|OmE63^R^g}=(1X7Wb+fN9{liWnW%Bu)SHC;`h zABRK<0XfgIj=*ULftmwB|7sc~8W1G}M?eSv^S!>z)8`*3q(PsexUo#7XsBfC?f$(wAB?mMVgTU#eAqwmzav(;jMC~ul zhBB`|>cjZ=`aTt)*-(cNI7vXj;$2)1kO{G{9w$?jy3Un9*rg~q4Mx&su zlylbuZOaz~?lL%lvVcZ&LHprWM18g-f*U*!Ko*j^ln3sOK(-)q7%&7RWWk3)AYT#! z1`Gjd6F>=puDmGh&tH~r=|{N*piM#0$7T6{MNCZpn@{5bBPN%oW)~-?AIomJG{pB0 zvimx4U;cl82ky!L&nd#ah5wE>oCAk`9ddp@ta#OHS3E5uz=EzPK<+Cc)`|BfYFb;eb*TlPqKSN^|apUcgNzY+w%-)jh1^0OQ#+Cs$rdd&YL_iJ#>C;NOHR1qS5JROe{>tn?I zBL64c&&9qQhTeXV2$C1`0J5Lw0q=k;&xT0eDF zJ~JA^9!TK#od37@C`H){veWhWmtqd|@i-;wAI;*LoS3ZZiuwJxuAKXkXA7P{YuLFW z2IC3of-W5>`LawCJ2!NDAc5bz3xWW7vcMIBKy`-k`uIqdJYR4({{QdKl>DN~>J$5C z^M4z`8Xf)evt>Ki=4mbD`vHJzBLV@0t5k&7egTF$NWN{FNk@7^M64RP&%6p2m-1SgHb;M%bqU?c_8Ee zI1jiAwh-8K0QAQNO^5jT0-p!Wbd32u%+6^T8o^2D2(-8hN?Sj{0i%DlELb1yFE|I5 zWug4u+(-`agMW@dd1E0tAm`&WQT?>PU_D%yoc}Ltn;c*V{|tfh#sYEx<`)#FDY4-eI1X}40@cjc3&#eVJIzGg+ zUwruOQWZV>#fRSoef<1*>FgMvPvhf)Lpc5J{oX+M;HTeBIDQUSOdma9PBFEHP!cBZ@#q>LTQQsen!N}X$$glbNk87RuqH0 zqOVV?Rl5E^G>p6<4p{D%P4@(W!g_-s0IR5|31@R!v;6~|4hWo_B4AeIx_x?kd;9F! ztu3F@7yx-gnjYxdTQYI_ZbEr?)@8c0r&h0!Z%gPz(VDytwb*{q)lpKVQ2faE7`QYwyEr+$aQO$r&hvkj_(=Hx0000< KMNUMnLSTYcoutYD literal 9722 zcmc&)Wm{X%(+=*g#c3&8tUz%uMOv(d;#R>SxI==w7Iz91iUloBf_t#y+6H$BMFaWs zd%nc;;+);<+Ozk}?wK<)_neK^(NZNLWFQ0p03_;auirnm;Quas+{b&boYm-KljEmn z=<)ii`)4;h7Y{q2GXUU|8xOA|>}4az-B|RGdA9g=+S-#RVk4X*TrE8ursJF*#9PIX>K#&2|<%n2B>jZF~E)rci*brREt z@c=SRQNtB1YWPC9r-b=F_NBE!XjKF&cLX8Su-(fkBA^kd@dNy{UT_hBecn#K=ME;_ z_4_rAs-Hu&ZJm*ZuaC7x7Y)gie`%Sy`j%MK2NWSoxYR6~`;4cc3#$oP#pNLpW!A&V zy*!ju3DzV0PH+=KgOkEzH1}hqo^7K4Thj0Pc(H7rtel}8@1?JcpZn#>xnmUcOTY|m z!O7e6FRCr+2NTvCGd~99G=;cG5D(Fvcy>pWvRkihb0wz;Ui1SaS~djaLAQSR)NDA& zhnd75-F#?@PXjOI>o{7NPXAW3W3D5qI(S|mfNu9j_cUkP^ap}>J;2O%exwn;VV#{6OIb)Sr;tZzs&mqB;!o;6?kDLn*OiK5 zsOZ$>x}=W}Oc1*?gs)&cie%A(#2b@xPQtLrYWEvL(l-B;}Y#y9rllb z)w^?1WXxf#9u7})Pk3{=>0Dd9V1R3c-l!4d%deaX$l|m=g5g1DTw;wU)mwBq@Io%@ z!Y5x}0Mv+d46t@5fB(h8$uLCv|YwsnG47}^*w#z^@7o-_WqT7SiU~8RLYKqH$T>9m} z!=T&fATN}x6G08wLSFAVwDinG`*Mbc)L@M4q6yndo*e!pK68>}kv`8W{D}p2B9gc! z2kEwrI{aWg=_`~g+&yayX54mu>kznwiar7MI8$+?;PN$VmWmi>%8L*;`W0>Kj9O`5 zbpmiprp+5QH8X@u=Bx2*m$&Lt1sJ77!uU4AuU@Ax5kj*>hXU#~Tk)&0f+m*LD4f6pm@TZ@CnsQY!JUs4R z#CoaNI@7yUL^BU&q-H{#M|=tjhaapikR&)CW+hq1YiR(h841b8E+zj+^t%X%d;gUX1-*qJx#p&eCROhlG9sje+}~TkRmma1`MYLCvXn~yQCXd ziMfX@Ch@rORKUHQ<=#ZJ@kXKKwYM8edv=@+h>1_-zsPbIQ;)uRpAfljUnnR(lv!NA zz09`5V8De5VoNxM_=yLg-!Y2cv*W-_{F`fix^F~%^=jI!c-LD+`pVO3{U~uEMpgY| zk282=C_eC`zfU<(U_SWyut%pV#($vRoJS75V=bZv=@RJ>W7-+ZXmxLKIU@!jZ~*qm z)%-bZKx8+;W?WbJVvy+9;*~s<7b-r%!J}E)@!8}=Fq`@CPl)L`)P%UZB(0IZm#}u^w;?V$HI|^3q z3N~)j7z)3_wF`c0cuUAw2C0BY1!}oy?9F&(Wka}vx|nm!f(@*@bK?Q1vm5B9sf892 zFBCm8QP7=uyfo5lQs&y&9B){Gx)bQPNW&rDV|1v|Z*lqS95@>+mLXQNLtWJH zS4o{<=KBa_Kq<#rUp&aO8b(!r97G7Y7%X1jp!AIZIhdZ#-Dw}pciI@Ohox1NcX6GZ zoElXQ%II`No(JJqhhQ3^We*5VMjo;E0>f+8R&`%zK9>7W$Nw3+%g(&&qN=hm!RH`IZ+5d-MJ zNak#Y-_#9A47QnrSnt0EL2sm&dLO;3b}mY4-V9{zH=rI_l8`(tOzg&h?sEtGW z*Du8O@O)+$rIi%ftobax!~#?2H)dnwwGK_W>j<*)X4XI zhh5+XCCUN?^6{OlC(Llti?oI3w*>3Jj=&q9igNW&6@W~BhwH$ zONuj&hZP=pB+wo=zl5PUu+nUr08zQ#OuPUq=f!tUFuZq)0rPW!{|uG;&tW zK^EyA5dXe1>V|tCD|I77B&hl|C2rm8%o1lku?xO|^+CMT7OU|THi?a&kZ?9qj*Spj zoZ98o3&L-ffBxE4`T9^zg~65O7v2R{vt|Fbb3A7kGQ0;Wx;#Z=%b?@Qi8An_UKdqX zwvg#0p+_9E3hpaICushx*BQDX5$9=+0V3GY>U?P3o9^6u^XsYq0H4JMWs2R|jN|K+ z>AL)Cc>h*s1dq25?cA;?gVXeHeAm^5`VWNqc_5fYI@iCwU%f@6ss^D&bvgOiwx%Xof>atB_`tT7Ax3=Y38@Z+hx zvB`TC>d=>vf+EYcG$L!E6p$OW5C-{65VOz}Wlq@Eo=QiL-Rylsy(WzmiTxC=6aAc9 zjBsd2-jAbm;1jH<*XpUO#<@YrciO_AMwi_cRB~?G;4%nV{Vo^Aiq|Q=VuPw;Q`y!B z@l9Tn5jF;Kd=}D;3M{ebr86}ne)(+zL#oFFg>zt49B%^FLNfH*bp6i7Sb7U~^kD=5 z60zB&-AP>$Wr6>nh3b0JChRSaGp%=G2jB&?P`ds3nR=eqfQ=IfRzkIznh56^6hK}+ zxN+NKEG@Zpp3VUO72COqjUy;cy`~QWF5N{GW_(TuO`JAF{x<~ z(fq8%&@c*#xgNJUoK-L3FcCwQ>YT}dZ`Q4-ME$XyBXg76(8uJURVeuNdjwW|Wy7?c z9ROK$D?(;zPd3zgKXtz;-yoS}RJ8oh{38|eW;`&7YT%bzf+XY%+{|z7sa%qAyz`K5 zjI=;xX_}~l@LQd9C`{xs5=zgTPat}Q_2?NA3tI9VYJgjG@=GHl{2wHz{qcjl52Yl{ z<(JsSgz`s@Cj=ujytXiNh2|2cX<5iY?3!ac21!am`9P9+namL;VBSj1!u%Y>MpRb} z&DM!{UvAH@K%;X&?bh-0;5C9l%rm~^@QwBN0Upb`UdG*&XM&Q}TzRM) z0g*jGT4K$Yfx#Rhs%sLA!KrdN&zvHtea`c4@Y$O~By$VXli{fH%+GKjtQ~KC<65|k zm_e0?`1wOji1Ijdc~+)O?1v1h%8Z@EG$pa_WHcixR-W?)?;CbIl8Jxd%fe8Eph1XbJ`Rm>HOqVovmu`!F~=u&Ji(uHtE; zo>Ks-ZW}_2KE1&>FXG;)SB`(Hb+X?U*WWC~vrS!NrSO71BT=l=<(VEME2!#*PX+WB znJ5M-@C7TKop~{e&cTQ*(%6@GUAmcr9#CoI!P58GKvLK4D-`Mm9j*{bwzADN{p_1~ zru4_^e;?bqT!gNx>8q|$51(q!sq{iWoj_0CS(*oQkiV3hG{BSiGn$Bf-JPa5z`FD8 z>~?SzjYvcWGuJ$P1=9hODZ0(}qAU+qf|}0GLc0qRg9moVsIkVib@(+p(Q>qGpyS&x z*Pz^2wPgUBpi`bF!OKrbLoug{&q3bpzw_ajLgg==q0caZojG~S5DqzcRyWRCG>V`a zC@z%BuOKEJ%Ny+JR62Pl*g|WW*S^*u-`A0av41esXK8wm1c>dy+JETEk#9I%29q|$ zpM$Q%=W_-MMX56e9X}0A3Ei@)-0+w~(3e-ivL7 zp%K6xe;I?c|tnm$b^f}l?&1an8M0l zcv44Y{``nVqhcJaaYMJp2;0JG;uMcJ1>Ijf&7hP}Uk$LTQ(Cs4w>At^jn#}q)Ky~kCaL59IyvU^z1dB~t2Q3HTGqLH-r85nNJ1;7R$t-(rA2MW8!uV}6HrI0s3JRae zoIcv3`pQ4^D5Dvym+uD!%H0XztPQx>E7x~bo%}R>;*)XgUPRqx-H z&YoL5s{IZj2)(Cy6qSGqy5qaA$DTbGlphpeWG(cRb(Cyp19fd1q_7tKT~Mgxa9-gR z@$|_J88w~}zP0I0=aF{p7>m#+#ySecNx#0C+jpnF$XIs_K!U`sWGo-}ZAJ$o0r)AC zx3!ze9B;YhmMX%a7EhGmEX`5>7!7uq(6h5z`OAUkDvy)C2ZtsXZ?Mi{W)9V1+g*su zE6&ow;-)54#r_+_cpNO$`=a$zY!USUo%Rp1xMnpfaIb;h5b%yX`s#1w8};3{nu_PH zvw~Diolo>zRTdzgV46ca)o&YPQP=DxR^ zOE8~{f^Lo=C4+w!9h_xsRFB0}gxG@KB61o+=bk9L*O$M47&*u4`>LFI=9O~vf_8ah zxFGU+VQx|AULVkPn+f0d%~~b5{ClV1*xb_Kur@uT#N4p<*id8wi{ca(mTCJ z2QRI!yYrAdKTxG`MOPx71dzIe6>wcj%H&+_eST#U^g9YrNAKwOtnx9`RA4d3tvhX(K9 zMfLh#;i{Fw4&G0j}%z`73 z1T7a>K`iaUeJJ1^fp=sy=g21B5JG;5$V_)PdRX%4OZ@v3(AGf^r7@%X!)Rg|?*6J? zzXhpxr;C(${x@kd5JFO#cRGM-HZJ7W_JJsM6Y@%4u>b{lg>&fKf_eZXc4nq^w2ENH zeJm{1;%6xaaf6rnkUN<-0WAK)eOpZ!hfN#$BRhCQf6(uf5?AQhzG9h>Nbqhpmx08G z^sy4nSU1n__z;lam@+Nya*rb0UmA{E7QQFaag2a4fy8bIZVex46@fUm_?PD=7tukD zmqKD%S=|+SaY5Rqeur}bXejz^(i5&nJT<(Gh8EmR)KH%V6G7x&+(_oN{k55w+U%Eu z-6$OjQ0dUW`pO)l@;=Pe1LWwLL3Tmm1UKv`$!<~8)GG)~psQAjZJq%;dcj<5@r@;D zwq*nH4GU$}RONs)VTb4Oiv)Sn?S*PSa0<$}1}06&&_9-$%1^kU^CShn5(=k`iUO^I z3aa8bH{(vf2kljL3LHFnV?Rj zTIO09Q!fPlQH|5K4a4w7rT@b$+qZ$cIyy$2uwI|lQ33Cq8i=8y*IT@IyVtOV6n;hABk%B;=d4PFDySyJ)`*I0gMB5F+jd_ROfIM_Uw_(QTfI z-{Zr!!p57!GQBGchSVpi@T&Pu8_ApCe#F7U_NXXRT^u6wMuH~|3n_8dTs=?(JUT)h&(ctGRzZLjefb`P$LsCLXJb+{#73l8R$z8)W50L> z^^9q9dZo>k!8_&x3(_0ZAmwu;R_>&`=+0gKQiR-~hSC>E!*|nw4uGEWV0CG^`mnIW zyQX5I+C5x#6|Fo84`wTR2~U#98VUoai}HHXW=_aKljN?xzDLoQu#Nke2?%xgqbf1S z1i86UE>3sSlHn(gay&Z=dE;EJ?rYv`JDI*Hr${bj=OM(}YGX=l|AX*@tl7M*CY3t- zwcDV8^Hm-(%%BJ83PikimZ+EhFzB7b^;w+wp%alOdiCY|D=rEZ745g1I`O1(wA^ic zEnS1SM=t0Rqs7m#`+p5BUh{8`3q)i6z+OI|R(Jp_9cU6GxxmB1x36xemLhVEs@*EB zyv&N9uZ@xbq3~>7DvVG;mbLM3cKNRP#=eU5*&Qq_)w1!UYj=!L`D2fPr6bcO>Aqqr ztzIE)acFy}f7ux4Vfl0R-!a$gKx%|M?IV+6prioQtUd>Y_x}DnyobokTddhgxd(n3 zNs@DxrA^q5*iD~N$S6W+USigsx_oT^cPs$-PJ4W*hAk$`O{(gzo8o59pS3^Mhg&Wi zxqDPy`nI{4@zanY7zvlwmbqGSAM{u-t-}#&T97ffC^(+y|LUw|f?J7Gju+r7ryxn< zvCrVCi`Ur8I;e?(CFi%HNeyK7V1?NjgP(2KI`;fHaM?WZ$&vAKK)B#<$1hIg4@pSi z6KSu#t#Y7+>oI2+#Tf#KMvTF)wKG?17Czp5}w&HsaCYf#{t;kXz7;F z7=Cr&t_=249-Q11^gMiL%dNyaeC(65rTNY9yau%jLp$e>B_Ercwv91OmmE+o`w}c2S2L8Gm6)(q8syQ-m`@+}7fP?Osdg7&p30UB@KWhD;mUhmMCd`& zmEU!oPSu*Dru1G`nV=1q3r29p? zuSsp;)}!FUpLGO~&d8r5oLyeaivc_7|2o>`e>V+Tq_yj!gd=W;wesr7(vXP=BQpQC3C9Mr`lsIv_q20y&)X{krG3_BKCka9LqQ z*93-Ha_ZOqavj=r=y+_%dvaHp88W!6*3kK5le>`54WD+CMTGczWhZ@`$)xVnlX=sI zR2sf?njrGccHz-&lMr?X45Kbpb6ut14gBNbUjv4#Df>?CrKR&K| z5+N@tHp!#cW%==YuL|D!kNzb2BPs1za>&%ResGR3KUjIzb+%t(75Q->4v%#K(7tZ< zwpq~tNR}-SRaW9x5d-_N+wxx5RwLtiGm%fz-504gKlSulfM@`udTzh% z{!6H`JL=>b*_8U3H_KK9oxiIl$U!Y2E=!e-1Emmc|PE#`1P$#uLFkT@$FIf#nqQCbse<1~DoSx-$rC#T&kWRx&$#waTET z#Dlk&{0{92nO0%>xehz;^uSk9yf)JmSCg}53j{x9UJ23AFW zY%}}lIQEi0vv(j_9Gpe`?tE?b$kC$h+fTmqv!u%OlU9?36I zm#GVy=t{Z0m7@0MpRhyJnsnTfz(&Q2-EZ$zIwK7y8AsVGzi>|0*oyjWI%VYtDAVPh zlZtwEf9^arG-HO^W%XHkKjVKY%}@)+p;l7P%V_BgE;b9#S=>SD%Qo1+DGUeiPguZN zI3o!-668-`*4?gzoY1*pTV57HMc$rlN|5*zVS$Gs!v=2q*gh2vvBh-~$zjjRhD!y^ z0011)|IPwv;}wcGLrt^t?;F0SWWnNS#YaC|Sa`k4sR>M;=ya(4&Z1Qb`LiQ7?wDwA z+sQ0BFRjO%81-p9$<|&THU)QHYHxZhY*w>6U<@Yy+ljjy|7`d)AmXJP_QvcK*WcKq zXG`=}`;zC+JM)Nsg8r41~`m+@#+{@LNdVG&nyxh=I2z3r3VOKYsuxp+cW@RF>S>r}HU=>-jM zCF5YF`wklG0%)7H2mI_kEv)E=ZLJ{~y@JZ{c&O_73@*3+7(Z4T5 z$N;U-cOQp$J_%JT!0YTV=qri=2QuJj@t*kHzoS}99@{q@N_6}&20#Eb2{gK2PNHuB))%}{9W%rG52*%LoTCl z!O_c8Ifb}W7fi0>kQnUFM5j$`9bpEjD5gEA%9ErNx(ENKeK?$U2ByoeDLQ}gve-@) zF8jJMBG=!x{3^xmRnoLm)|*-$hVf%_>sKd3aV%}K!aib>O(q5gsy&Me^^`;ko|rmE zJM7|Qmix(k$*Umm!Rdc8{{}cxvU|R~eMwk}vnv>50`^+*dokm?R_7rL@z&gMi5%Em za%@#I;9_27aOGddk=xFll&WS@6`<6Z156LJGx@+bqRh7w$hb1S2JM1V`U3X`$gf-^f z1&n!#<8xk{hy2`c74Nna!6ALV@NR4lgf1xFJ)jzfovgz{5gV{ZLI(Z&CnprX` ziub%an!G%exmwCd+bfEmcM^TKrrOU3@jPmCY|SaBO%n9V^%asW95uEn1!u-!znif5eU@D$&#Of1okq zWNl-I2shQ5x|EBl28#_UXsv}{^zD;{wAg+1(&C^0NSd zi1vlV4^%I6c=LIJ<$~pFK!oHQY|G5g|F0bc2v9rnjGE(SoBr`I7vPa?y{=KR4EY}= CWfi9Y diff --git a/icons/mob/screen/styles/white/hands.dmi b/icons/mob/screen/styles/white/hands.dmi index 59702d43b992a16edfb085823273789d2cc5af96..0f65b9904670934b9cf285ad2b75865b3c8d4b9a 100644 GIT binary patch literal 2875 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 LBOIpM5Fh<7M^;UX literal 2220 zcmZuzc{tQtAODSEFc{Nh&oyItnIsjGyq2*fOCmd2W-v6eUpvEOLdepSE&GzKWXVPL zvE{xdh6Yp0R)jQ+WU0tIb?^H;_mB5^&N-j&a?W|4^F5#M_nc(QtCt0!5>NmD1Wb$# zt=LHV*?A!BaX<%0WkX+-jYEhb{&$aHLSP6Xz#jl23bV(Xpyab~$il_Q6oWl0KZeq! zllq}(4Kp={eCc!fCgLINbQY{1-$~v)x~QCB9a%4d{+OaW5$WL#4}8nK7%eWW#-p)R zNKgy^O(#`Q1;t~$1lNqI^D@z}ejW+W3<~=_xPMd2sgp$dlsge@=lGB&OJta3Tz?R^ z7BnbbTE5mq50-Zl#VJ%6sqRe5PS>cqe@S>=uQrWXcXD?#Kd5pc&y}CdG6!99*}8D+ z=4+L7oZ@8w;I1+;)U$~wWEScM%s2}r#XUDv6oKB8fnVd{`-owLVW|pOJnr$}WSU|L zN3!6!sjrgbcdq^qWt-6BDN9i4sS!Y5>==1o`svL(=2uuljJMmy$MQ(D<+i#aXvvNI7Cb?*I4kd2l*{{bqLKSrD)rJr!pA9VXbo@x-TmVJ0%qkHbv&wXb zov7ai7U7jI&+}4_?=CRbL$6d@%by#g(Tc>_cEA{LT@CB3v3op5X~Zx>Z64c(bh_9m z3IlS0ePKxnQX9fcIYwU->ZnJamuHJvAkHKe(t;%fE;$0k8;D~9(O@1J9_TCMM``@+ zG|U0{wB!qiaP95wS^eoZQ$U=ds=gtLn?P!&d~%3{vpg+MqbW}Dzsxe1b+|2Ur}oHN zVc+U^Ki_q8Gty)mge$FhOLT}cjh>oC<@1{cwzlUBS|0#-J^*&AhkEz6$#5Dgt08yoj&K~Yug z9t&@5Y_Mf5B&aJ2284%)N5sbJ7<1^#=t2Vn4t3*xZ~|FWJUdcVZHnEZy-(&XNS-RZ zjyV^43Y4hD8E(C?2};x(El#T;nwfajv_ff)+Hj8EXA>ft6y4F|{nI8Zc491wwOV%Rt2ekkhINh7;MN;+BuaqP*eJ5EhoN5#1Ko;a&Q6tey_?G2 ziJGkyz=q0Yj(UZQCbHE33^>-dyWy@OsflPD)ZPbB+FDxUEu=fodV6z!QUM=SW4OFH zfe4M%;6-UPq;n`{k9g;RY;6xSmcJz*zAEO7g|G_n6w}Jj333bEd$>~VeK)b;19Jq+ z0P#vPW*Tf=YtuuLTSzpV6hM_HaKa@Km_TEoPnu1~zZ7>{i7G;VXjm9zVL82MCo0Xo zNo;M(#GGDdCt1S;{jLbbsaQl~oehM|Wr=!EYXD1RbeI|$cFGMn{+Ft2h$)wzPYn+x;Qta?J zd;ia04+@HCP&@WYN>umrsP5Qp;_hrm7?l51PZhyVr)2(4Q)(%5SvppU6D^YZl1{(B znOj0z$)l}U3JtX<9Dev9FU0%lD>raO{&@8Vto`-k;$r=R)W&oq9|$P5L>njKG^iUe zOChdA97WCC+11ru-$XzY>ShhlAE)$ z@op*jNRB5O>Dxe?{kn^Fc6RnPZk;undp~@Y^x79fS1Uq1a#mJY>wwYKaQX7=z!+6r zt62f343(=%q%}G#7io0V%jQx|C}vxAg#5fwuPdBbab1xWkS{bL-qYgKTW}$DS<6lE zcyzaGP|A?I@B3j>fO5nqwQj?z9m<$eCh;Ku;zp1UIKxpaUUm`*?|X%YX&Vv5Zm`Wq8T;|7Ziwp{fCGiIVVGKN?>AG<6 zVs^e(o7HrOjIhxZ1u|@)>EbzfQNhF?wZ|hwf8xnzh9qY2+kv(B8Ia)VgvxbBLg%bW%iB{0%Os! z%=lbAozT^ERA2HxVq0eQMhqvG$OY8em_98DI8$v^+ns&|4Gz4E6U)(VOvE{`v!tUQ z41~BOF`j-u^fx&`fi#A0QpgJmw~=x{wXa}AlS7si5?M4--IjAW-7LThmu=FA-&3he3Jas;xA>PtnEL z69|<2L#vZ(TU$Zz&o?X+Ex72o(qAvtKWjzd5y%>JX)o!fL<#%*0hnC6YFMw2jsGvC CQU}fe diff --git a/icons/mob/screen/styles/white/interaction.dmi b/icons/mob/screen/styles/white/interaction.dmi index e11d10d2c13716e35d487f483eadfbc99f837540..8511d73937a2b4ded61bf3742f98dd04152f3af2 100644 GIT binary patch delta 1659 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 diff --git a/icons/mob/screen/styles/white/inventory.dmi b/icons/mob/screen/styles/white/inventory.dmi index 0ce80198e6bc53d6bfb30d9173c6dc9ae9787e4e..f8cfa9cbbc54fc0c20560afabfc334e40b30f736 100644 GIT binary patch delta 3140 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 VbF71AKWzX2002ovPDHLkV1l$2z#aeq diff --git a/icons/mob/screen/styles/white/uphint.dmi b/icons/mob/screen/styles/white/uphint.dmi index d3e9075d70427312fcca07061fdb4d007a91998f..ee795947c3028be1701204505a9be377440c0c26 100644 GIT binary patch delta 336 zcmV-W0k8hG1MCBk7Y;xO0{{R3owtGP0000mktH!0z`(#!`eal90004WQchC>I4N24*q1j(7JcJDDp zm>^hQUeN*805L&u)vDFI&xRsQkm%@u8UQijX7ujeyZ5|%jAR1LMyLsAfZ*)is|XX2 z07!w|I|x9SfCNAaV(&r#P7|O8fE|I=1gHUEN8mN#9U&9$5;Wm4Arr1bOduHDgc1zF eBsU5M4FCY_7^OI%28nS10000E;8i%}J~ztY2Bd)z1a&Pyl-!GoIMH33dPg0kKI$K~y-6ZIi!F!!Qts!(t&O zS`bKVWnf2<0xJV=Kq5w$swWpF#0wxHtSju6fu*Qw75M>J*m*AQ9RFzxH#GX3pFUsg zUa{3%tKDL=`p0WE_!}6k3i|&9_AYBG7=QEc)oBcXOo2muD$5FWS(fK#_Y}a#q7bO* z-L?b1z2Em*RSl5lU)slR@2C#1A!!hQKl!nkjta>(@jFgNPgrm9AREWu=2bXu&LWGU$esrbz}Z zm_;^Bffpvp5IOf?>?<0+jnG5jWUw0syJ4uo_wbX>0lFUYIgrD(#<_eK9p}4fEGUDx zh<716o~;;0yzr6@(sMSnW3{C7UuZ-_D?QIP3^-pmbb`67CSyb6MJIuMxjZ=OXnnsyMGjq{{g@d0Mhsi07>lM Z{{m8R07w`v#AW~h002ovPDHLkV1g=}>0|%^ delta 374 zcmV-+0g3*&1(*aOiBL{Q4GJ0x0000DNk~Le0000W0000W1Oos70D)9z$B`jJ0d|pP zZhy)Ou6{0HivWX`AMSDq@h<=X0Ub$1K~yM_UDCZy!!QsB@bCsCAduL~z>X}Lt_*zx zY_WzYC#Ot^N2qF@>2A3&p{h~j2Vi06xwy+mllF#K`RkX9PUqw-J*x90yFIE|lFg(>(xDrC56++A(-YB?SuYZ*?h(w;%V=p8cLu4*mflBERfRYrAhd&D-27B_5Yoy9 zv6l8Atfo)A9)$xAs!=!}Ht2bpUW5~&pzZNjPG$+Q@iC6G=m5qe?kA$);A0d`X-8_B zXMZAa*NO%AC@F}YNZ)%AMYBu$RYJ&(&(oW4UL|e#F5rtn-z}T3!xcad0PS`72kWb! UZ|KI?i~s-t07*qoM6N<$f?5Kmo&W#< diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 673a2e15ef4f..3f0e0c3023d3 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -194,6 +194,12 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/background_categories_generated = FALSE var/list/_background_categories + var/default_ui_style + +/datum/map/New() + ..() + default_ui_style ||= DEFAULT_UI_STYLE + /datum/map/proc/get_background_categories() if(!background_categories_generated) if(isnull(_background_categories)) diff --git a/mods/content/psionics/system/psionics/interface/ui.dm b/mods/content/psionics/system/psionics/interface/ui.dm index 4e8adfa83bd5..3d8255b20308 100644 --- a/mods/content/psionics/system/psionics/interface/ui.dm +++ b/mods/content/psionics/system/psionics/interface/ui.dm @@ -1,14 +1,17 @@ /obj/screen/psi icon = 'mods/content/psionics/icons/psi.dmi' requires_ui_style = FALSE + apply_screen_overlay = FALSE var/hidden = TRUE + var/can_hide = TRUE /obj/screen/psi/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, ui_cat) . = ..() update_icon() /obj/screen/psi/on_update_icon() - if(hidden) + ..() + if(hidden && can_hide) set_invisibility(INVISIBILITY_ABSTRACT) else set_invisibility(INVISIBILITY_NONE) \ No newline at end of file diff --git a/mods/content/psionics/system/psionics/interface/ui_hub.dm b/mods/content/psionics/system/psionics/interface/ui_hub.dm index cd87e5282115..97c5ba41adc0 100644 --- a/mods/content/psionics/system/psionics/interface/ui_hub.dm +++ b/mods/content/psionics/system/psionics/interface/ui_hub.dm @@ -6,6 +6,7 @@ maptext_x = 6 maptext_y = -8 requires_ui_style = FALSE + can_hide = FALSE var/image/on_cooldown var/list/components @@ -19,6 +20,7 @@ START_PROCESSING(SSprocessing, src) /obj/screen/psi/hub/on_update_icon() + ..() var/mob/living/owner = owner_ref?.resolve() var/datum/ability_handler/psionics/psi = istype(owner) && owner.get_ability_handler(/datum/ability_handler/psionics) icon_state = psi?.suppressed ? "psi_suppressed" : "psi_active" diff --git a/mods/content/psionics/system/psionics/interface/ui_toggles.dm b/mods/content/psionics/system/psionics/interface/ui_toggles.dm index 5585ac5d802a..93c34b82a275 100644 --- a/mods/content/psionics/system/psionics/interface/ui_toggles.dm +++ b/mods/content/psionics/system/psionics/interface/ui_toggles.dm @@ -29,6 +29,7 @@ name = "Show/Hide Psi UI" icon_state = "arrow_left" requires_ui_style = FALSE + can_hide = FALSE var/obj/screen/psi/hub/controller /obj/screen/psi/toggle_psi_menu/Initialize(mapload, mob/_owner, ui_style, ui_color, ui_alpha, ui_cat, obj/screen/psi/hub/_controller) @@ -43,6 +44,7 @@ controller.update_icon() /obj/screen/psi/toggle_psi_menu/on_update_icon() + ..() if(hidden) icon_state = "arrow_left" else diff --git a/nebula.dme b/nebula.dme index d65b82917962..0be259c432c8 100644 --- a/nebula.dme +++ b/nebula.dme @@ -210,6 +210,7 @@ #include "code\_onclick\hud\screen\screen_intent.dm" #include "code\_onclick\hud\screen\screen_internal.dm" #include "code\_onclick\hud\screen\screen_inventory.dm" +#include "code\_onclick\hud\screen\screen_inventory_hands.dm" #include "code\_onclick\hud\screen\screen_lighting.dm" #include "code\_onclick\hud\screen\screen_maneuver.dm" #include "code\_onclick\hud\screen\screen_module.dm" From 091e58af5d0408c23f1d12615bf32c63eb57761b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 08:23:17 +1100 Subject: [PATCH 42/95] Repathing standard jobs to shared type to fix issues exposed by CI. --- maps/exodus/exodus_antagonism.dm | 6 +- maps/exodus/exodus_goals.dm | 10 +-- maps/exodus/exodus_jobs.dm | 72 +++++++++---------- maps/ministation/jobs/civilian.dm | 2 +- maps/ministation/jobs/command.dm | 4 +- maps/ministation/jobs/engineering.dm | 4 +- maps/ministation/jobs/medical.dm | 4 +- maps/ministation/jobs/science.dm | 4 +- maps/ministation/jobs/security.dm | 6 +- maps/ministation/ministation_jobs.dm | 28 ++++---- maps/tradeship/jobs/_goals.dm | 2 +- maps/tradeship/jobs/civilian.dm | 2 +- maps/tradeship/jobs/command.dm | 4 +- maps/tradeship/jobs/engineering.dm | 4 +- maps/tradeship/jobs/medical.dm | 4 +- maps/tradeship/jobs/science.dm | 4 +- maps/tradeship/tradeship_jobs.dm | 20 +++--- maps/tradeship/tradeship_spawnpoints.dm | 4 +- mods/content/standard_jobs/_standard_jobs.dme | 1 + mods/content/standard_jobs/jobs/_job.dm | 3 + mods/content/standard_jobs/jobs/captain.dm | 6 +- mods/content/standard_jobs/jobs/civilian.dm | 4 +- .../content/standard_jobs/jobs/engineering.dm | 4 +- mods/content/standard_jobs/jobs/medical.dm | 6 +- mods/content/standard_jobs/jobs/science.dm | 6 +- mods/content/standard_jobs/jobs/security.dm | 10 +-- mods/content/standard_jobs/jobs/synthetics.dm | 18 ++--- 27 files changed, 123 insertions(+), 119 deletions(-) create mode 100644 mods/content/standard_jobs/jobs/_job.dm diff --git a/maps/exodus/exodus_antagonism.dm b/maps/exodus/exodus_antagonism.dm index 322bebbf1d34..d5f543175cbd 100644 --- a/maps/exodus/exodus_antagonism.dm +++ b/maps/exodus/exodus_antagonism.dm @@ -1,14 +1,14 @@ /decl/special_role/traitor/Initialize() . = ..() LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective, /datum/job/captain, /datum/job/lawyer, /datum/job/hos) + protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective, /datum/job/standard/captain, /datum/job/lawyer, /datum/job/standard/hos) /decl/special_role/cultist/Initialize() . = ..() LAZYINITLIST(restricted_jobs) - restricted_jobs |= list(/datum/job/lawyer, /datum/job/captain, /datum/job/hos) + restricted_jobs |= list(/datum/job/lawyer, /datum/job/standard/captain, /datum/job/standard/hos) LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/officer, /datum/job/warden, /datum/job/detective) + protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective) LAZYINITLIST(blacklisted_jobs) blacklisted_jobs |= list(/datum/job/chaplain, /datum/job/counselor) diff --git a/maps/exodus/exodus_goals.dm b/maps/exodus/exodus_goals.dm index 72c324b5c1d5..9799dc6b3b22 100644 --- a/maps/exodus/exodus_goals.dm +++ b/maps/exodus/exodus_goals.dm @@ -29,12 +29,12 @@ var/global/list/exodus_paperwork_end_areas = list() /datum/goal/department/paperwork/exodus paperwork_types = list(/obj/item/paperwork/exodus) signatory_job_list = list( - /datum/job/captain, + /datum/job/standard/captain, /datum/job/hop, - /datum/job/cmo, - /datum/job/chief_engineer, - /datum/job/rd, - /datum/job/hos + /datum/job/standard/cmo, + /datum/job/standard/chief_engineer, + /datum/job/standard/rd, + /datum/job/standard/hos ) /datum/goal/department/paperwork/exodus/get_paper_spawn_turfs() diff --git a/maps/exodus/exodus_jobs.dm b/maps/exodus/exodus_jobs.dm index df6c7b54782c..0263946a3237 100644 --- a/maps/exodus/exodus_jobs.dm +++ b/maps/exodus/exodus_jobs.dm @@ -7,11 +7,11 @@ spawn_decl = /decl/spawnpoint/gateway /datum/map/exodus - default_job_type = /datum/job/assistant + default_job_type = /datum/job/standard/assistant default_department_type = /decl/department/civilian id_hud_icons = 'maps/exodus/hud.dmi' allowed_jobs = list( - /datum/job/captain, + /datum/job/standard/captain, /datum/job/hop, /datum/job/chaplain, /datum/job/bartender, @@ -23,66 +23,66 @@ /datum/job/janitor, /datum/job/librarian, /datum/job/lawyer, - /datum/job/chief_engineer, - /datum/job/engineer, - /datum/job/cmo, - /datum/job/doctor, - /datum/job/chemist, + /datum/job/standard/chief_engineer, + /datum/job/standard/engineer, + /datum/job/standard/cmo, + /datum/job/standard/doctor, + /datum/job/standard/chemist, /datum/job/counselor, - /datum/job/rd, - /datum/job/scientist, - /datum/job/roboticist, - /datum/job/hos, - /datum/job/detective, - /datum/job/warden, - /datum/job/officer, - /datum/job/robot, - /datum/job/computer + /datum/job/standard/rd, + /datum/job/standard/scientist, + /datum/job/standard/roboticist, + /datum/job/standard/hos, + /datum/job/standard/detective, + /datum/job/standard/warden, + /datum/job/standard/officer, + /datum/job/standard/robot, + /datum/job/standard/computer ) species_to_job_whitelist = list( /decl/species/adherent = list( - /datum/job/computer, - /datum/job/robot, - /datum/job/assistant, + /datum/job/standard/computer, + /datum/job/standard/robot, + /datum/job/standard/assistant, /datum/job/janitor, /datum/job/chef, /datum/job/bartender, /datum/job/cargo_tech, - /datum/job/engineer, - /datum/job/roboticist, - /datum/job/chemist, - /datum/job/scientist, + /datum/job/standard/engineer, + /datum/job/standard/roboticist, + /datum/job/standard/chemist, + /datum/job/standard/scientist, /datum/job/mining ), /decl/species/utility_frame = list( - /datum/job/computer, - /datum/job/robot, - /datum/job/assistant, + /datum/job/standard/computer, + /datum/job/standard/robot, + /datum/job/standard/assistant, /datum/job/janitor, /datum/job/chef, /datum/job/bartender, /datum/job/cargo_tech, - /datum/job/engineer, - /datum/job/roboticist, - /datum/job/chemist, - /datum/job/scientist, + /datum/job/standard/engineer, + /datum/job/standard/roboticist, + /datum/job/standard/chemist, + /datum/job/standard/scientist, /datum/job/mining ), /decl/species/serpentid = list( - /datum/job/computer, - /datum/job/robot, - /datum/job/assistant, + /datum/job/standard/computer, + /datum/job/standard/robot, + /datum/job/standard/assistant, /datum/job/janitor, /datum/job/chef, /datum/job/bartender, /datum/job/cargo_tech, - /datum/job/roboticist, - /datum/job/chemist + /datum/job/standard/roboticist, + /datum/job/standard/chemist ) ) -#define HUMAN_ONLY_JOBS /datum/job/captain, /datum/job/hop, /datum/job/hos +#define HUMAN_ONLY_JOBS /datum/job/standard/captain, /datum/job/hop, /datum/job/standard/hos species_to_job_blacklist = list( /decl/species/unathi = list( HUMAN_ONLY_JOBS diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index 3d1601530d6b..d562ce534a21 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -1,4 +1,4 @@ -/datum/job/assistant/ministation +/datum/job/standard/assistant/ministation title = "Recruit" supervisors = "absolutely everyone" alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index a823a716095c..db3f49f88b71 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,4 +1,4 @@ -/datum/job/captain/ministation +/datum/job/standard/captain/ministation supervisors = "your profit margin, your conscience, and the watchful eye of the Tradehouse Rep" outfit_type = /decl/outfit/job/ministation/captain min_skill = list( @@ -13,7 +13,7 @@ ) skill_points = 40 -/datum/job/captain/ministation/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/standard/captain/ministation/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/freetradeunion_rename_company diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index d780f2353d28..4396510fb688 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -1,4 +1,4 @@ -/datum/job/engineer/ministation +/datum/job/standard/engineer/ministation title = "Station Engineer" supervisors = "the Head Engineer" total_positions = 2 @@ -32,7 +32,7 @@ skill_points = 30 alt_titles = list("Atmospheric Technician", "Electrician", "Maintenance Technician") -/datum/job/chief_engineer/ministation +/datum/job/standard/chief_engineer/ministation title = "Head Engineer" hud_icon = "hudchiefengineer" access = list( diff --git a/maps/ministation/jobs/medical.dm b/maps/ministation/jobs/medical.dm index 0e91a2d945b4..2dcd95964d45 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -1,4 +1,4 @@ -/datum/job/doctor/ministation +/datum/job/standard/doctor/ministation title = "Medical Doctor" supervisors = "the Head Doctor" total_positions = 2 @@ -35,7 +35,7 @@ ) outfit_type = /decl/outfit/job/ministation/doctor -/datum/job/cmo/ministation +/datum/job/standard/cmo/ministation title = "Head Doctor" supervisors = "the Captain and your own ethics" outfit_type = /decl/outfit/job/ministation/doctor/head diff --git a/maps/ministation/jobs/science.dm b/maps/ministation/jobs/science.dm index f2d80cbe65f1..7371f2f4b69d 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -1,4 +1,4 @@ -/datum/job/scientist/ministation +/datum/job/standard/scientist/ministation title = "Researcher" alt_titles = list("Scientist","Xenobiologist","Roboticist","Xenobotanist") supervisors = "the Head Researcher" @@ -8,7 +8,7 @@ hud_icon = "hudscientist" skill_points = 34 -/datum/job/rd/ministation +/datum/job/standard/rd/ministation title = "Research Director" alt_titles = list("Head Researcher", "Chief Researcher") outfit_type = /decl/outfit/job/ministation/scientist/head diff --git a/maps/ministation/jobs/security.dm b/maps/ministation/jobs/security.dm index 55ea8e841e2f..05d1ccc4d411 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -1,4 +1,4 @@ -/datum/job/officer/ministation +/datum/job/standard/officer/ministation title = "Security Officer" alt_titles = list("Warden") spawn_positions = 1 @@ -22,7 +22,7 @@ ) skill_points = 30 -/datum/job/detective/ministation +/datum/job/standard/detective/ministation alt_titles = list("Inspector") supervisors = "Justice... and the Trademaster" spawn_positions = 1 @@ -55,7 +55,7 @@ ) skill_points = 34 -/datum/job/hos/ministation +/datum/job/standard/hos/ministation outfit_type = /decl/outfit/job/ministation/security/head hud_icon = "hudhos" access = list( diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index 92e28630c1f1..f75e4bddbd58 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -1,25 +1,25 @@ /datum/map/ministation - default_job_type = /datum/job/assistant/ministation + default_job_type = /datum/job/standard/assistant/ministation default_department_type = /decl/department/civilian id_hud_icons = 'maps/ministation/hud.dmi' allowed_jobs = list( - /datum/job/assistant/ministation, + /datum/job/standard/assistant/ministation, /datum/job/bartender/ministation, - /datum/job/captain/ministation, + /datum/job/standard/captain/ministation, /datum/job/cargo_tech/ministation, - /datum/job/robot, - /datum/job/computer, - /datum/job/detective/ministation, - /datum/job/doctor/ministation, - /datum/job/cmo/ministation, - /datum/job/engineer/ministation, - /datum/job/chief_engineer/ministation, + /datum/job/standard/robot, + /datum/job/standard/computer, + /datum/job/standard/detective/ministation, + /datum/job/standard/doctor/ministation, + /datum/job/standard/cmo/ministation, + /datum/job/standard/engineer/ministation, + /datum/job/standard/chief_engineer/ministation, /datum/job/hop/ministation, /datum/job/janitor/ministation, - /datum/job/scientist/ministation, - /datum/job/rd/ministation, - /datum/job/officer/ministation, - /datum/job/hos/ministation, + /datum/job/standard/scientist/ministation, + /datum/job/standard/rd/ministation, + /datum/job/standard/officer/ministation, + /datum/job/standard/hos/ministation, /datum/job/librarian/ministation, /datum/job/tradehouse_rep ) \ No newline at end of file diff --git a/maps/tradeship/jobs/_goals.dm b/maps/tradeship/jobs/_goals.dm index e9d719bd2116..ac7cc4422dcd 100644 --- a/maps/tradeship/jobs/_goals.dm +++ b/maps/tradeship/jobs/_goals.dm @@ -26,7 +26,7 @@ var/global/list/tradeship_paperwork_end_areas = list() /datum/goal/department/paperwork/tradeship paperwork_types = list(/obj/item/paperwork/tradeship) signatory_job_list = list( - /datum/job/captain/tradeship, + /datum/job/standard/captain/tradeship, /datum/job/tradeship_first_mate ) diff --git a/maps/tradeship/jobs/civilian.dm b/maps/tradeship/jobs/civilian.dm index f491bc953a3c..edb03def44ac 100644 --- a/maps/tradeship/jobs/civilian.dm +++ b/maps/tradeship/jobs/civilian.dm @@ -1,4 +1,4 @@ -/datum/job/assistant/tradeship +/datum/job/standard/assistant/tradeship title = "Deck Hand" supervisors = "literally everyone, you bottom feeder" outfit_type = /decl/outfit/job/tradeship/hand diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index 0d124a9841e0..b3ad43dc8859 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -1,4 +1,4 @@ -/datum/job/captain/tradeship +/datum/job/standard/captain/tradeship title = "Captain" supervisors = "your profit margin, your conscience, and the Trademaster" outfit_type = /decl/outfit/job/tradeship/captain @@ -11,7 +11,7 @@ ideal_character_age = 70 forced_spawnpoint = /decl/spawnpoint/cryo/captain -/datum/job/captain/tradeship/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) +/datum/job/standard/captain/tradeship/equip_job(var/mob/living/human/H, var/alt_title, var/datum/mil_branch/branch, var/datum/mil_rank/grade) . = ..() if(H) H.verbs |= /mob/proc/tradehouse_rename_ship diff --git a/maps/tradeship/jobs/engineering.dm b/maps/tradeship/jobs/engineering.dm index 1938f034a310..62a9c6659c46 100644 --- a/maps/tradeship/jobs/engineering.dm +++ b/maps/tradeship/jobs/engineering.dm @@ -1,10 +1,10 @@ -/datum/job/engineer/tradeship +/datum/job/standard/engineer/tradeship title = "Junior Engineer" supervisors = "the Head Engineer" outfit_type = /decl/outfit/job/tradeship/hand/engine alt_titles = list() -/datum/job/chief_engineer/tradeship +/datum/job/standard/chief_engineer/tradeship title = "Head Engineer" outfit_type = /decl/outfit/job/tradeship/chief_engineer alt_titles = list() diff --git a/maps/tradeship/jobs/medical.dm b/maps/tradeship/jobs/medical.dm index 03b480321b82..bedcf5584533 100644 --- a/maps/tradeship/jobs/medical.dm +++ b/maps/tradeship/jobs/medical.dm @@ -1,4 +1,4 @@ -/datum/job/doctor/tradeship +/datum/job/standard/doctor/tradeship title = "Junior Doctor" supervisors = "the Head Doctor and the Captain" alt_titles = list() @@ -33,7 +33,7 @@ outfit_type = /decl/outfit/job/tradeship/doc/junior event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/cmo/tradeship +/datum/job/standard/cmo/tradeship title = "Head Doctor" supervisors = "the Captain and your own ethics" outfit_type = /decl/outfit/job/tradeship/doc diff --git a/maps/tradeship/jobs/science.dm b/maps/tradeship/jobs/science.dm index c14bb9e5b928..d941587b27dc 100644 --- a/maps/tradeship/jobs/science.dm +++ b/maps/tradeship/jobs/science.dm @@ -1,4 +1,4 @@ -/datum/job/scientist/tradeship +/datum/job/standard/scientist/tradeship title = "Junior Researcher" supervisors = "the Head Researcher and the Captain" total_positions = 2 @@ -8,7 +8,7 @@ // Smaller crew, more points. skill_points = 24 -/datum/job/rd/tradeship +/datum/job/standard/rd/tradeship title = "Head Researcher" alt_titles = list() outfit_type = /decl/outfit/job/tradeship/hand/researcher diff --git a/maps/tradeship/tradeship_jobs.dm b/maps/tradeship/tradeship_jobs.dm index 61b526624e0d..ce53a6b7518c 100644 --- a/maps/tradeship/tradeship_jobs.dm +++ b/maps/tradeship/tradeship_jobs.dm @@ -1,19 +1,19 @@ /datum/map/tradeship - default_job_type = /datum/job/assistant/tradeship + default_job_type = /datum/job/standard/assistant/tradeship default_department_type = /decl/department/civilian default_law_type = /datum/ai_laws/corporate id_hud_icons = 'maps/tradeship/hud.dmi' allowed_jobs = list( - /datum/job/assistant/tradeship, - /datum/job/captain/tradeship, + /datum/job/standard/assistant/tradeship, + /datum/job/standard/captain/tradeship, /datum/job/tradeship_first_mate, - /datum/job/cmo/tradeship, - /datum/job/doctor/tradeship, - /datum/job/chief_engineer/tradeship, - /datum/job/engineer/tradeship, - /datum/job/rd/tradeship, - /datum/job/scientist/tradeship, - /datum/job/robot + /datum/job/standard/cmo/tradeship, + /datum/job/standard/doctor/tradeship, + /datum/job/standard/chief_engineer/tradeship, + /datum/job/standard/engineer/tradeship, + /datum/job/standard/rd/tradeship, + /datum/job/standard/scientist/tradeship, + /datum/job/standard/robot ) /obj/machinery/suit_cycler/tradeship diff --git a/maps/tradeship/tradeship_spawnpoints.dm b/maps/tradeship/tradeship_spawnpoints.dm index c4be5d21c350..36e4d8acdb7c 100644 --- a/maps/tradeship/tradeship_spawnpoints.dm +++ b/maps/tradeship/tradeship_spawnpoints.dm @@ -9,7 +9,7 @@ /decl/spawnpoint/cryo name = "Port Cryogenic Storage" spawn_announcement = "has completed revival in the port cryogenics bay" - disallow_job = list(/datum/job/robot) + disallow_job = list(/datum/job/standard/robot) /decl/spawnpoint/cryo/two name = "Starboard Cryogenic Storage" @@ -22,7 +22,7 @@ /decl/spawnpoint/cryo/captain name = "Captain Compartment" spawn_announcement = "has completed revival in the captain compartment" - restrict_job = list(/datum/job/captain/tradeship) + restrict_job = list(/datum/job/standard/captain/tradeship) uid = "spawn_cryo_captain" /obj/abstract/landmark/latejoin/cryo_captain diff --git a/mods/content/standard_jobs/_standard_jobs.dme b/mods/content/standard_jobs/_standard_jobs.dme index cbba09eacef5..a17a75892bba 100644 --- a/mods/content/standard_jobs/_standard_jobs.dme +++ b/mods/content/standard_jobs/_standard_jobs.dme @@ -11,6 +11,7 @@ #include "departments\security.dm" #include "departments\service.dm" #include "departments\supply.dm" +#include "jobs\_job.dm" #include "jobs\captain.dm" #include "jobs\civilian.dm" #include "jobs\engineering.dm" diff --git a/mods/content/standard_jobs/jobs/_job.dm b/mods/content/standard_jobs/jobs/_job.dm new file mode 100644 index 000000000000..7d1668c23721 --- /dev/null +++ b/mods/content/standard_jobs/jobs/_job.dm @@ -0,0 +1,3 @@ +/datum/job/standard + abstract_type = /datum/job/standard + id_hud_icons = 'mods/content/standard_jobs/icons/hud.dmi' diff --git a/mods/content/standard_jobs/jobs/captain.dm b/mods/content/standard_jobs/jobs/captain.dm index c07823772524..70ec6cfca573 100644 --- a/mods/content/standard_jobs/jobs/captain.dm +++ b/mods/content/standard_jobs/jobs/captain.dm @@ -1,4 +1,4 @@ -/datum/job/captain +/datum/job/standard/captain title = "Captain" head_position = 1 department_types = list(/decl/department/command) @@ -33,12 +33,12 @@ /datum/computer_file/program/reports ) -/datum/job/captain/equip_job(var/mob/living/human/H) +/datum/job/standard/captain/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(src) -/datum/job/captain/get_access() +/datum/job/standard/captain/get_access() return get_all_station_access() /datum/job/hop diff --git a/mods/content/standard_jobs/jobs/civilian.dm b/mods/content/standard_jobs/jobs/civilian.dm index af71d84e5369..e46ba580d2f6 100644 --- a/mods/content/standard_jobs/jobs/civilian.dm +++ b/mods/content/standard_jobs/jobs/civilian.dm @@ -1,4 +1,4 @@ -/datum/job/assistant +/datum/job/standard/assistant title = "Assistant" total_positions = -1 spawn_positions = -1 @@ -10,7 +10,7 @@ outfit_type = /decl/outfit/job/generic/assistant department_types = list(/decl/department/civilian) -/datum/job/assistant/get_access() +/datum/job/standard/assistant/get_access() if(get_config_value(/decl/config/toggle/assistant_maint)) return list(access_maint_tunnels) return list() diff --git a/mods/content/standard_jobs/jobs/engineering.dm b/mods/content/standard_jobs/jobs/engineering.dm index 40cba5464895..56545de93fe2 100644 --- a/mods/content/standard_jobs/jobs/engineering.dm +++ b/mods/content/standard_jobs/jobs/engineering.dm @@ -1,4 +1,4 @@ -/datum/job/chief_engineer +/datum/job/standard/chief_engineer title = "Chief Engineer" head_position = 1 department_types = list( @@ -88,7 +88,7 @@ ) event_categories = list(ASSIGNMENT_ENGINEER) -/datum/job/engineer +/datum/job/standard/engineer title = "Engineer" department_types = list(/decl/department/engineering) diff --git a/mods/content/standard_jobs/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm index f2c11cb05d12..41f044544bd2 100644 --- a/mods/content/standard_jobs/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -1,4 +1,4 @@ -/datum/job/cmo +/datum/job/standard/cmo title = "Chief Medical Officer" head_position = 1 department_types = list( @@ -73,7 +73,7 @@ ) event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/doctor +/datum/job/standard/doctor title = "Medical Doctor" department_types = list(/decl/department/medical) minimal_player_age = 3 @@ -126,7 +126,7 @@ skill_points = 22 event_categories = list(ASSIGNMENT_MEDICAL) -/datum/job/chemist +/datum/job/standard/chemist title = "Pharmacist" department_types = list(/decl/department/medical) minimal_player_age = 7 diff --git a/mods/content/standard_jobs/jobs/science.dm b/mods/content/standard_jobs/jobs/science.dm index a7a074efbce1..530c31cfd27e 100644 --- a/mods/content/standard_jobs/jobs/science.dm +++ b/mods/content/standard_jobs/jobs/science.dm @@ -1,4 +1,4 @@ -/datum/job/rd +/datum/job/standard/rd title = "Chief Science Officer" head_position = 1 department_types = list( @@ -74,7 +74,7 @@ skill_points = 30 event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/scientist +/datum/job/standard/scientist title = "Scientist" department_types = list(/decl/department/science) total_positions = 6 @@ -122,7 +122,7 @@ skill_points = 20 event_categories = list(ASSIGNMENT_SCIENTIST) -/datum/job/roboticist +/datum/job/standard/roboticist title = "Roboticist" department_types = list(/decl/department/science) total_positions = 2 diff --git a/mods/content/standard_jobs/jobs/security.dm b/mods/content/standard_jobs/jobs/security.dm index 09751719b28d..391e24c4fa5a 100644 --- a/mods/content/standard_jobs/jobs/security.dm +++ b/mods/content/standard_jobs/jobs/security.dm @@ -1,4 +1,4 @@ -/datum/job/hos +/datum/job/standard/hos title = "Head of Security" head_position = 1 department_types = list( @@ -85,12 +85,12 @@ ) event_categories = list(ASSIGNMENT_SECURITY) -/datum/job/hos/equip_job(var/mob/living/human/H) +/datum/job/standard/hos/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) -/datum/job/warden +/datum/job/standard/warden title = "Warden" department_types = list(/decl/department/security) total_positions = 1 @@ -138,7 +138,7 @@ /datum/computer_file/program/camera_monitor ) -/datum/job/detective +/datum/job/standard/detective title = "Detective" department_types = list(/decl/department/security) @@ -186,7 +186,7 @@ /datum/computer_file/program/camera_monitor ) -/datum/job/officer +/datum/job/standard/officer title = "Security Officer" department_types = list(/decl/department/security) total_positions = 4 diff --git a/mods/content/standard_jobs/jobs/synthetics.dm b/mods/content/standard_jobs/jobs/synthetics.dm index 3a3dfbcd869b..7ce050fd321a 100644 --- a/mods/content/standard_jobs/jobs/synthetics.dm +++ b/mods/content/standard_jobs/jobs/synthetics.dm @@ -1,4 +1,4 @@ -/datum/job/computer +/datum/job/standard/computer title = "Computer" event_categories = list(ASSIGNMENT_COMPUTER) total_positions = 0 // Not used for AI, see is_position_available below and modules/mob/living/silicon/ai/latejoin.dm @@ -19,16 +19,16 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/computer/equip_job(var/mob/living/human/H) +/datum/job/standard/computer/equip_job(var/mob/living/human/H) return !!H -/datum/job/computer/is_position_available() +/datum/job/standard/computer/is_position_available() return (empty_playable_ai_cores.len != 0) -/datum/job/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) +/datum/job/standard/computer/handle_variant_join(var/mob/living/human/H, var/alt_title) return H -/datum/job/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) +/datum/job/standard/computer/do_spawn_special(var/mob/living/character, var/mob/new_player/new_player_mob, var/latejoin) character = character.AIize(move = FALSE) // is_available for AI checks that there is an empty core available in this list @@ -46,7 +46,7 @@ qdel(C) return TRUE -/datum/job/robot +/datum/job/standard/robot title = "Robot" event_categories = list(ASSIGNMENT_ROBOT) total_positions = 2 @@ -66,14 +66,14 @@ skip_loadout_preview = TRUE department_types = list(/decl/department/miscellaneous) -/datum/job/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) +/datum/job/standard/robot/handle_variant_join(var/mob/living/human/H, var/alt_title) if(H) return H.Robotize(SSrobots.get_mob_type_by_title(alt_title || title)) -/datum/job/robot/equip_job(var/mob/living/human/H) +/datum/job/standard/robot/equip_job(var/mob/living/human/H) return !!H -/datum/job/robot/New() +/datum/job/standard/robot/New() ..() alt_titles = SSrobots.robot_alt_titles.Copy() alt_titles -= title // So the unit test doesn't flip out if a mob or brain type is declared for our main title. From b348d11e385a8c21d14e9e6109835188ea4cc12b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 09:03:34 +1100 Subject: [PATCH 43/95] Reworking HUD icons to support modpacked jobs/antags. --- code/game/antagonist/antagonist.dm | 12 ++++ code/game/antagonist/antagonist_update.dm | 6 +- code/game/jobs/job/_job.dm | 11 ++-- code/modules/mob/living/human/human.dm | 16 +---- code/modules/mob/living/human/life.dm | 14 ++-- code/modules/mob/living/living_hud.dm | 17 +++++ code/modules/mob/living/silicon/ai/ai.dm | 10 +-- .../modules/mob/living/silicon/robot/robot.dm | 13 +--- code/modules/mob/living/silicon/silicon.dm | 2 +- code/modules/submaps/submap_job.dm | 2 +- code/unit_tests/icon_tests.dm | 61 ++++++++++++++++++ code/unit_tests/job_tests.dm | 30 --------- icons/mob/hud.dmi | Bin 2862 -> 0 bytes icons/mob/hud_med.dmi | Bin 495 -> 0 bytes icons/screen/hud.dmi | Bin 0 -> 687 bytes icons/screen/hud_antag.dmi | Bin 0 -> 1731 bytes icons/screen/hud_implants.dmi | Bin 0 -> 407 bytes icons/screen/hud_med.dmi | Bin 0 -> 488 bytes maps/away/liberia/hud.dmi | Bin 0 -> 245 bytes maps/away/liberia/liberia_jobs.dm | 2 +- maps/example/example_jobs.dm | 4 +- maps/example/hud.dmi | Bin 443 -> 248 bytes maps/exodus/exodus_jobs.dm | 1 - maps/exodus/hud.dmi | Bin 1455 -> 0 bytes maps/ministation/hud.dmi | Bin 1126 -> 388 bytes maps/ministation/jobs/civilian.dm | 2 +- maps/ministation/jobs/command.dm | 4 +- maps/ministation/jobs/engineering.dm | 2 +- maps/ministation/jobs/medical.dm | 2 +- maps/ministation/jobs/science.dm | 4 +- maps/ministation/jobs/security.dm | 2 +- maps/ministation/jobs/tradehouse.dm | 3 +- maps/ministation/ministation_jobs.dm | 1 - maps/shaded_hills/icons/hud.dmi | Bin 545 -> 0 bytes maps/shaded_hills/jobs/_jobs.dm | 4 +- maps/tradeship/tradeship_jobs.dm | 2 +- maps/~mapsystem/maps.dm | 4 +- mods/content/standard_jobs/icons/hud.dmi | Bin 0 -> 1119 bytes mods/content/standard_jobs/jobs/_job.dm | 2 +- mods/content/standard_jobs/jobs/captain.dm | 2 + mods/content/standard_jobs/jobs/civilian.dm | 11 ++++ .../content/standard_jobs/jobs/engineering.dm | 3 +- mods/content/standard_jobs/jobs/medical.dm | 4 ++ mods/content/standard_jobs/jobs/science.dm | 3 + mods/content/standard_jobs/jobs/security.dm | 5 +- mods/content/standard_jobs/jobs/synthetics.dm | 4 +- mods/mobs/borers/datum/antagonist.dm | 2 +- mods/mobs/borers/datum/symbiote.dm | 2 +- mods/mobs/borers/icons/hud.dmi | Bin 0 -> 316 bytes mods/mobs/borers/mob/overrides.dm | 2 + nebula.dme | 1 + 51 files changed, 169 insertions(+), 103 deletions(-) create mode 100644 code/modules/mob/living/living_hud.dm delete mode 100644 icons/mob/hud.dmi delete mode 100644 icons/mob/hud_med.dmi create mode 100644 icons/screen/hud.dmi create mode 100644 icons/screen/hud_antag.dmi create mode 100644 icons/screen/hud_implants.dmi create mode 100644 icons/screen/hud_med.dmi create mode 100644 maps/away/liberia/hud.dmi delete mode 100644 maps/exodus/hud.dmi delete mode 100644 maps/shaded_hills/icons/hud.dmi create mode 100644 mods/content/standard_jobs/icons/hud.dmi create mode 100644 mods/mobs/borers/icons/hud.dmi diff --git a/code/game/antagonist/antagonist.dm b/code/game/antagonist/antagonist.dm index be291b8ac256..042a32f12ee8 100644 --- a/code/game/antagonist/antagonist.dm +++ b/code/game/antagonist/antagonist.dm @@ -19,6 +19,7 @@ // Visual references. var/antaghud_indicator = "hudsyndicate" // Used by the ghost antagHUD. var/antag_indicator // icon_state for icons/mob/mob.dm visual indicator. + var/antag_hud_icon = 'icons/screen/hud_antag.dmi' var/faction_indicator // See antag_indicator, but for factionalized people only. var/faction_invisible // Can members of the faction identify other antagonists? @@ -104,6 +105,17 @@ /decl/special_role/validate() . = ..() + + // Check for our antaghud icons. + if(faction_indicator || antag_indicator) + if(antag_hud_icon) + if(faction_indicator && !check_state_in_icon(faction_indicator, antag_hud_icon)) + . += "missing faction_indicator '[faction_indicator]' from icon 'antag_hud_icon]'" + if(antag_indicator && !check_state_in_icon(antag_indicator, antag_hud_icon)) + . += "missing antag_indicator '[antag_indicator]' from icon 'antag_hud_icon]'" + else + . += "missing antag_hud_icon" + // Grab initial in case it was already successfully loaded. var/initial_base_to_load = initial(base_to_load) if(isnull(initial_base_to_load)) diff --git a/code/game/antagonist/antagonist_update.dm b/code/game/antagonist/antagonist_update.dm index 642141255657..fcfd2c5fcdc2 100644 --- a/code/game/antagonist/antagonist_update.dm +++ b/code/game/antagonist/antagonist_update.dm @@ -31,10 +31,12 @@ qdel(I) /decl/special_role/proc/get_indicator(var/datum/mind/recipient, var/datum/mind/other) - if(!antag_indicator || !other.current || !recipient.current) + if(!other.current || !recipient.current) return var/indicator = (faction_indicator && (other in faction_members)) ? faction_indicator : antag_indicator - var/image/I = image('icons/mob/hud.dmi', loc = other.current, icon_state = indicator, layer = ABOVE_HUMAN_LAYER) + if(!indicator) + return + var/image/I = image(antag_hud_icon, loc = other.current, icon_state = indicator, layer = ABOVE_HUMAN_LAYER) var/decl/bodytype/root_bodytype = other.current.get_bodytype() if(istype(root_bodytype)) I.pixel_x = root_bodytype.antaghud_offset_x diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index f5df1fe51970..93d335861d1d 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -34,7 +34,8 @@ var/announced = TRUE // If their arrival is announced on radio var/latejoin_at_spawnpoints // If this job should use roundstart spawnpoints for latejoin (offstation jobs etc) var/forced_spawnpoint // If set to a spawnpoint name, will use that spawn point for joining as this job. - var/hud_icon // icon used for Sec HUD overlay + var/_hud_icon // icon used for secHUD overlay + var/hud_icon_state // icon state used for secHUD overlay // A list of string IDs for keys to grant on join. var/list/lock_keys = list() @@ -69,7 +70,7 @@ if(type == /datum/job && global.using_map.default_job_type == type) title = "Debug Job" - hud_icon = "hudblank" + hud_icon_state = "hudblank" outfit_type = /decl/outfit/job/generic/scientist autoset_department = TRUE @@ -82,8 +83,10 @@ total_positions = 0 spawn_positions = 0 - if(!hud_icon) - hud_icon = "hud[ckey(title)]" + if(!_hud_icon) + _hud_icon = global.using_map.hud_icons + if(!hud_icon_state) + hud_icon_state = "hud[ckey(title)]" ..() diff --git a/code/modules/mob/living/human/human.dm b/code/modules/mob/living/human/human.dm index 38e6f1d6c10e..ed0df480df70 100644 --- a/code/modules/mob/living/human/human.dm +++ b/code/modules/mob/living/human/human.dm @@ -5,14 +5,12 @@ icon_state = "body_m_s" mob_sort_value = 6 max_health = 150 - - var/list/hud_list[10] var/embedded_flag //To check if we've need to roll for damage on movement while an item is imbedded in us. /mob/living/human/Initialize(mapload, species_name, datum/mob_snapshot/supplied_appearance) current_health = max_health - setup_hud_overlays() + reset_hud_overlays() var/list/newargs = args.Copy(2) setup_human(arglist(newargs)) global.human_mob_list |= src @@ -32,18 +30,6 @@ if(. != INITIALIZE_HINT_QDEL) post_setup(arglist(newargs)) -/mob/living/human/proc/setup_hud_overlays() - hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud_med.dmi', src, "100") - hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") - hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") - hud_list[ID_HUD] = new /image/hud_overlay(global.using_map.id_hud_icons, src, "hudunknown") - hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[STATUS_HUD_OOC] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealthy") - /mob/living/human/Destroy() global.human_mob_list -= src regenerate_body_icon = FALSE // don't bother regenerating if we happen to be queued to update icon diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 1bb84a587db9..977e8349eb53 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -746,7 +746,8 @@ if(I) var/datum/job/J = SSjobs.get_by_title(I.GetJobName()) if(J) - holder.icon_state = J.hud_icon + holder.icon = J._hud_icon + holder.icon_state = J.hud_icon_state hud_list[ID_HUD] = holder @@ -781,17 +782,16 @@ var/image/holder2 = hud_list[IMPLOYAL_HUD] var/image/holder3 = hud_list[IMPCHEM_HUD] - holder1.icon_state = "hudblank" - holder2.icon_state = "hudblank" - holder3.icon_state = "hudblank" - + holder1.icon_state = "hud_imp_blank" + holder2.icon_state = "hud_imp_blank" + holder3.icon_state = "hud_imp_blank" for(var/obj/item/implant/I in src) if(I.implanted) if(istype(I,/obj/item/implant/tracking)) holder1.icon_state = "hud_imp_tracking" - if(istype(I,/obj/item/implant/loyalty)) + else if(istype(I,/obj/item/implant/loyalty)) holder2.icon_state = "hud_imp_loyal" - if(istype(I,/obj/item/implant/chem)) + else if(istype(I,/obj/item/implant/chem)) holder3.icon_state = "hud_imp_chem" hud_list[IMPTRACK_HUD] = holder1 diff --git a/code/modules/mob/living/living_hud.dm b/code/modules/mob/living/living_hud.dm new file mode 100644 index 000000000000..5e6b7adfff0d --- /dev/null +++ b/code/modules/mob/living/living_hud.dm @@ -0,0 +1,17 @@ +/mob/living + var/list/hud_list = new(10) + +/mob/living/proc/reset_hud_overlays() + hud_list = new(10) + hud_list[HEALTH_HUD] = new /image/hud_overlay(global.using_map.med_hud_icons, src, "blank") + hud_list[STATUS_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudhealthy") + hud_list[LIFE_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudhealthy") + hud_list[ID_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudunknown") + hud_list[WANTED_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudblank") + hud_list[IMPLOYAL_HUD] = new /image/hud_overlay(global.using_map.implant_hud_icons, src, "hud_imp_blank") + hud_list[IMPCHEM_HUD] = new /image/hud_overlay(global.using_map.implant_hud_icons, src, "hud_imp_blank") + hud_list[IMPTRACK_HUD] = new /image/hud_overlay(global.using_map.implant_hud_icons, src, "hud_imp_blank") + hud_list[SPECIALROLE_HUD] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudblank") + hud_list[STATUS_HUD_OOC] = new /image/hud_overlay(global.using_map.hud_icons, src, "hudhealthy") + +/datum/map diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index e9920873353f..230f370eda24 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -149,15 +149,7 @@ var/global/list/ai_verbs_default = list( . = INITIALIZE_HINT_QDEL else if(brainmob.mind) brainmob.mind.transfer_to(src) - hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") + reset_hud_overlays() ai_list += src create_powersupply() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 08ee95501bd6..ccb3cae8ba1f 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -88,6 +88,9 @@ ) /mob/living/silicon/robot/Initialize() + + reset_hud_overlays() + . = ..() add_language(/decl/language/binary, 1) @@ -126,16 +129,6 @@ // Disables lay down verb for robots due they're can't lay down and it cause some movement, vision issues. verbs -= /mob/living/verb/lay_down - hud_list[HEALTH_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[STATUS_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealth100") - hud_list[LIFE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudhealth100") - hud_list[ID_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[WANTED_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPLOYAL_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPCHEM_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[IMPTRACK_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - hud_list[SPECIALROLE_HUD] = new /image/hud_overlay('icons/mob/hud.dmi', src, "hudblank") - AddMovementHandler(/datum/movement_handler/robot/use_power, /datum/movement_handler/mob/space) /mob/living/silicon/robot/proc/recalculate_synth_capacities() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 52457ceb078c..0ec86995affa 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -10,7 +10,6 @@ var/list/stating_laws = list()// Channels laws are currently being stated on var/obj/item/radio/silicon_radio - var/list/hud_list[10] var/list/speech_synthesizer_langs = list() //which languages can be vocalized by the speech synthesizer //Used in say.dm. @@ -40,6 +39,7 @@ #define MED_HUD 2 //Medical HUD mode /mob/living/silicon/Initialize() + reset_hud_overlays() global.silicon_mob_list += src . = ..() diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 9bc3687a1aed..fe6396a8fcee 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -7,7 +7,7 @@ create_record = FALSE total_positions = 4 outfit_type = /decl/outfit/job/survivor - hud_icon = "hudblank" + hud_icon_state = "hudblank" available_by_default = FALSE allowed_ranks = null allowed_branches = null diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm index 8a25e15a29eb..354b296b5fd9 100644 --- a/code/unit_tests/icon_tests.dm +++ b/code/unit_tests/icon_tests.dm @@ -296,3 +296,64 @@ else pass("All vendors have all icons and icon states.") return 1 + + +/datum/unit_test/HUDS_shall_have_icon_states + name = "ICON STATE: HUD overlays shall have appropriate icon_states" + +/datum/unit_test/HUDS_shall_have_icon_states/start_test() + var/failed_jobs = 0 + var/failed_sanity_checks = 0 + + // Throwing implants and health HUDs in here. + // Antag HUDs are tested by special role validation. + + var/static/list/implant_hud_states = list( + "hud_imp_blank" = "Blank", + "hud_imp_loyal" = "Loyalty", + "hud_imp_unknown" = "Unknown", + "hud_imp_tracking" = "Tracking", + "hud_imp_chemical" = "Chemical", + ) + for(var/implant_hud_state in implant_hud_states) + if(!check_state_in_icon(implant_hud_state, global.using_map.implant_hud_icons)) + log_bad("Sanity Check - Missing map [implant_hud_states[implant_hud_state]] implant HUD icon_state '[implant_hud_state]' from icon [global.using_map.implant_hud_icons]") + failed_sanity_checks++ + + var/static/list/med_hud_states = list( + "blank" = "Blank", + "flatline" = "Flatline", + "0" = "Dead", + "1" = "Healthy", + "2" = "Lightly injured", + "3" = "Moderately injured", + "4" = "Severely injured", + "5" = "Dying", + ) + for(var/med_hud_state in med_hud_states) + if(!check_state_in_icon(med_hud_state, global.using_map.med_hud_icons)) + log_bad("Sanity Check - Missing map [med_hud_states[med_hud_state]] medical HUD icon_state '[med_hud_state]' from icon [global.using_map.med_hud_icons]") + failed_sanity_checks++ + var/static/list/global_states = list( + "" = "Default/unnamed", + "hudunknown" = "Unknown role", + "hudhealthy" = "Healthy mob", + "hudill" = "Diseased mob", + "huddead" = "Dead mob" + ) + for(var/global_state in global_states) + if(!check_state_in_icon(global_states, global.using_map.hud_icons)) + log_bad("Sanity Check - Missing map [global_states[global_state]] HUD icon_state '[global_state]' from icon [global.using_map.hud_icons]") + failed_sanity_checks++ + + for(var/job_name in SSjobs.titles_to_datums) + var/datum/job/job = SSjobs.titles_to_datums[job_name] + if(!check_state_in_icon(job.hud_icon_state, job._hud_icon)) + log_bad("[job.title] - Missing HUD icon: [job.hud_icon_state] in icon [job._hud_icon]") + failed_jobs++ + + if(failed_sanity_checks || failed_jobs) + fail("[global.using_map.type] - [failed_sanity_checks] failed sanity check\s, [failed_jobs] job\s with missing HUD icon.") + else + pass("All jobs have a HUD icon.") + return 1 diff --git a/code/unit_tests/job_tests.dm b/code/unit_tests/job_tests.dm index 858063c9bad5..b6b652731f82 100644 --- a/code/unit_tests/job_tests.dm +++ b/code/unit_tests/job_tests.dm @@ -35,36 +35,6 @@ pass("All jobs had outfit types.") return 1 -/datum/unit_test/jobs_shall_have_a_HUD_icon - name = "JOB: Shall have a HUD icon" - -/datum/unit_test/jobs_shall_have_a_HUD_icon/start_test() - var/failed_jobs = 0 - var/failed_sanity_checks = 0 - - var/list/job_huds = get_states_in_icon_cached(global.using_map.id_hud_icons) - - if(!job_huds[""]) - log_bad("Sanity Check - Missing default/unnamed HUD icon") - failed_sanity_checks++ - - if(!job_huds["hudunknown"]) - log_bad("Sanity Check - Missing HUD icon: hudunknown") - failed_sanity_checks++ - - for(var/job_name in SSjobs.titles_to_datums) - var/datum/job/J = SSjobs.titles_to_datums[job_name] - var/hud_icon_state = J.hud_icon - if(!job_huds[hud_icon_state]) - log_bad("[J.title] - Missing HUD icon: [hud_icon_state]") - failed_jobs++ - - if(failed_sanity_checks || failed_jobs) - fail("[global.using_map.id_hud_icons] - [failed_sanity_checks] failed sanity check\s, [failed_jobs] job\s with missing HUD icon.") - else - pass("All jobs have a HUD icon.") - return 1 - /datum/unit_test/jobs_shall_have_a_unique_title name = "JOBS: All Job Datums Shall Have A Unique Title" diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi deleted file mode 100644 index ed608471041b71953a88297b9fd806592a01d83e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2862 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 diff --git a/icons/mob/hud_med.dmi b/icons/mob/hud_med.dmi deleted file mode 100644 index 705886a5490f95c68ac672c9474559e431422aa4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmV)@%a6z`(w^iSGaa00DGTPE!Ct=GbNc0066cR9JLG zWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3K9+Ehn)gCo?ZqiHkEOv#1y-WXQ#tR+N~V3St9wrKIL0R)Uy1 zP>9fLfL)UzLWLngV=Z)`5TVJ4pe7R?C`4#7ChP${QymaC20?^I6QX>Mrpc6`CPN)4 zYEo4FEwOYUsW#r7Hjc0LV#1K~!jg?bSUBgfI{V;Mo<8rQSe1fshMqu?Mh8 zZ}JFKyx7`WyF?Zc^KrN>P)82$4T&58 l001(xY&m-k0002kJOD-FAtgZbsI&k8002ovPDHLkV1oaZ%l7~P diff --git a/icons/screen/hud.dmi b/icons/screen/hud.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5d1eb6b8f096db1208cf901d4450cc038d744557 GIT binary patch literal 687 zcmV;g0#N;lP)+6F60OtSzRfrLPw->;` zzyVqQD31U0cL4LBCrl^``Tzg`0d!JMQvg8b*k%9#0Hu0VSad{Xb7OL8aCB*JZU6vy zoQ=`H3c@fD$MHFNiqP)jztu%rq=S8jlbj~>yp&67@$D@Z+=Sb{KlpIV)$ZJ0y52R{ z&c0A`OzckXxY=4WM_e~nz-eX;^$1?$X5fM_4zKGCQG5TeMejOKlkl6SSPEhhuYUV#MLD`Rqq5q%+r9Y;#A{7;FQ?EePNa1SP=09k84M?f^1C z<}tMMmoh$>QLInz%w!mV9&u>_h|mGz`qv#`zd8eCJOk(zawF3n1fPH|S4w!ENcnF)BQR)k0=yx2)aU91%^93T# V6Y^D!^t1o~002ovPDHLkV1mMMGQ0o) literal 0 HcmV?d00001 diff --git a/icons/screen/hud_antag.dmi b/icons/screen/hud_antag.dmi new file mode 100644 index 0000000000000000000000000000000000000000..07840ff2614ea136d9d4acec1b0bb9542011a847 GIT binary patch literal 1731 zcmV;!20ZzRP)005u}0{{R3yb+fl0004xP)t-sz`(#S z051Rl01yfoQc{T1m<=x?13Lf!$!)(gGc%{Br|awMG&4&rIR?f60Qc8xLqkJTQ&VXq zZ1>M!{{R5z00960{{H|o|8sMh05fK0W@%|@_rp(zhllFw>KiF%fB*m-K)bIkFWLeH z%K!lLcL3%}A>}g(DJdz;05hEw0@yPNs3{^eGBW@F{}xFW5>pZy8X6cF7?kOjGt4u6 z++Gh_4_;ngMn*;`C@38r9W%_CC!BU>%rg&L58~qDTU%RLSXf|#wB7miA1f{0`1DnpIt&&S3KkgM_w(QS_T8H&PJfv>s~kV5BC*uWs4Nvv zfSO3QBpxa(Jq8e66CtN86^;xU(;h7J7&Gx0GP4U8t^f(I00|Z+ii!y#%n~Mw84wd0 zX^jjSToWP4b_||S3&6m@4-XHs0JE6@nQ8!P|Nk>hET@hD0004WQchCV=-0C=38lTB^{F${&*lT$>nt*ZX9?4|-C7Uc>f7n_Mua7y9~ zou0lCY}y5q)tz7T<=OH}=KgK9-faEyed9*Tg_HPK|8oD}x-+AOCZ3;M7l?GaTt!|K^0{02UA;lUTrA02wH<3>F#*G?Y^Xw9x63GANH^ zfzSL6*<^c!_>r<{-i88Oz%mK)u4&WGYE&+2K{GH?wvhW&1>3fgDYjmlvnG>spJ}vm zeV|*}w&#l!VQS^#Zt?eKOcO*?j|=(FE}4V|KvPDcir!xQ+^@FF%V+%ok75_=hBTgU z000BpNklGS2Hr>K+ghu~d(LXcJCmeRV>_gFOFDv%XEGmTG8y{z zYy_QPJR+4E%jNR4K)~T7i6k^eYyNv|)C_Fim43OZo|6Swf5}LHk2{0Kv(r zQfX?E7Az{kA}we*6BCX>3mONerwcs@gsI@HIV%^l#jfVLYKv`YILHF0WyOh6i@)0Mfo3R8h{)%X1>ZJ3^) zUszZ;^f49B*3^8jM$T4*R@1ebM+!QXLPaiz6RcJl!TRFj;lqoIbyCo*nR3yBHAnLt zrh>A5vW7!cuwHlFdi@hpaMqO2^S!tV${m)16;7~PWd$vvd4fKJ*{r^_q-SYCFFJz- zD(+O|0j%&_%vaEr`8}5w)YSk|XDX=an&y%Br{`3YFk2kg#j1^&CRT>3f^=L6S1vN_ zr03Fd(G}bSbbXZB0RR9100000fFx-&n$0Hnfg_)?_iGW%2jV6NG4W>(ufMr;`P=VK92un`7jFhDt+m!laD|9}|HF?zUA_7<>9-@u zZt;*641#OR*Mi_Wnc$aS*MIw+jE;PZQ;p^8@}iEQg+IDxn?fC}zK1zCZ(FCYbdpRb^d zvlW!_p}HvHE(QPq00000006*#CgvZ8#r*y7=ozzp-?m9Z(e3s7y>5brQczyBU@z>+ zm8>9J!R>w+_P6(O1;g!LZ#&$_g59v+50gBDF Z&p!w_#n7ra@L2!=002ovPDHLkV1hVf0CNBU literal 0 HcmV?d00001 diff --git a/icons/screen/hud_implants.dmi b/icons/screen/hud_implants.dmi new file mode 100644 index 0000000000000000000000000000000000000000..5899f696f70d015fb5d3bfedea4ca5c1d83db906 GIT binary patch literal 407 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeE3?v1%WpM*3^#Gp`*8>L*Fr)!F#tdf|{{KG% zWSwC!*68~`lfn2uP%!QlP=Uj`|E$aY3jpO9OM?7@862M70BKoN6%tY6l3JWxlvz-c znV-kNP%$Sste~j$`?>>xk;}Id1jI$wQAbr^^Ga&y-k4zTy6(7 r7KkeB+_2WtFPnGq)BjLiA`A>%MIvkMtT+Aw+RfnU>gTe~DWM4f`FELk literal 0 HcmV?d00001 diff --git a/icons/screen/hud_med.dmi b/icons/screen/hud_med.dmi new file mode 100644 index 0000000000000000000000000000000000000000..280097c8166cd9a73c08b385bea1ad05110fb4d8 GIT binary patch literal 488 zcmVP)z`(%PYy!PW-OB&~00DGTPE!Ct=GbNc0063bR9JLG zWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TB zGg33tGfE(w;*!LYR3K9+DJL;6TZxM^C9|j)$T#HTOe;#vO@*-Gs?u^2OL8*vQn4!p znw^rGlUNC2>L8hIK+s%6f(BaXSRj-e5mauXV}ej_OxU@4raC~3&|*TG4^0UwH`FoY zQdV&Fa{B#FboAyw+caQa0A2%D)j;kIRHy` zrp#=)25W9x{ymVlxP;~+%3|cteWVy&MndX`vV$Q%Ycrx((`1G z3pe=ffWzMi002O0r(Rq=pf}1G(@Qoi=D`-$+Cj2qF_TiUd2@kc$ktD|0RRBNpV2$@ z^6CMj)6Th3vSTq%zVzNtl0A!=w2sZ23zSo~e!>j^007`!b@2Thsu02~Ij}kNB3+>R epcw!F0J2`GULuVFTp#5C0000L*d|fK_|Nnpgxz-bb zf{Z0We!&b5&u*jvIr&u~5hX6E#mPmP1tppJc?=8{bArPPib}tK2`>2f^@*0ZuGYCT z=Yuzd8eBAf@JQ#pkLF2+qMqIz7REuwmyNv?<~*8oWKxJiu;yYDRr9SHmdb|fT{^ps zRX4AY(8xM*bY|F;8MC<(wY7Kr+S$O%&cKu|Gp}FQeiP7Yc~2L|5Q(YD0=$V04O^xL oxMivNq^Px>@G4=8`E9_;FtLwqw(ky~0-#a`Pgg&ebxsLQ0K{WfxBvhE literal 0 HcmV?d00001 diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 4d3b627143f2..9d042d7f6770 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -11,7 +11,7 @@ info = "You are free traders who have drifted into unknown distances in search of profit. Travel, trade, make profit!" supervisors = "the invisible hand of the market" selection_color = "#515151" - + _hud_icon = 'maps/away/liberia/hud.dmi' ideal_character_age = 20 minimal_player_age = 7 diff --git a/maps/example/example_jobs.dm b/maps/example/example_jobs.dm index e3ad5c0c4884..2eb3b025c99a 100644 --- a/maps/example/example_jobs.dm +++ b/maps/example/example_jobs.dm @@ -1,7 +1,6 @@ /datum/map/example default_job_type = /datum/job/example default_department_type = /decl/department/example - id_hud_icons = 'maps/example/hud.dmi' /datum/job/example title = "Tourist" @@ -13,9 +12,10 @@ access = list() minimal_access = list() outfit_type = /decl/outfit/job/tourist + _hud_icon = = 'maps/example/hud.dmi' department_types = list( /decl/department/example - ) + ) /decl/outfit/job/tourist name = "Job - Testing Site Tourist" diff --git a/maps/example/hud.dmi b/maps/example/hud.dmi index 89dd2f9a079ed96f255a6383c613aeb8b7c7bdcc..c2c456e9d507e53d3d7bccd9eb355e3b0605d7d5 100644 GIT binary patch delta 185 zcmdnZ{DaY}Gr-TCmrII^fq{Y7)59eQNGpIa6El$H6Pc6_q<8{+LR=3VIMCkS{{R2K zsA;=@?2>c=iZhl3`2{mLJiCzwr`!tZ93Z5>GAre!Q1$a{%8rDn=aQo-4q5NCbk1b|n e2FKwIYz(0fVnvh(uG^N3NJl#`g3O^m{l{L-S#;u2g+l@(n5 zT)-Xz0I=&l+E?k+?f?J)!bwCyR7i>Klg$yrAP`20Gu}f74p@OufuR5|*nzPF)4pIF z!!F_5lQ;GT-n0Bd2$~A|Xpx|yU>^qxb`|{d)&Lyt)G@{gf%`l^Ft98F@O=FpkRLXg+Pp!a cSFc{`4Y9r#H5r)uJpcdz07*qoM6N<$g3Cdu>+9zL09uy2|8sNmcL0L` z0P~+G%K!lP!%z3SL-*HfUz-4bw-=++H&atnz`($Vhle#Dj_00DGTPE!Ct=GbNc z00D`5R9JLGWpiV4X>fFDZ*Bkpc$}4$!BX5X42I8}r^vv)Q(CTEIxq|ecn8IiV--gV zwzJ!P`)accSN`1W%qQo!^h>_&|2#dvy!DT-FWr$#71REqzyI;GJDg-}$v3}$b%(?< zrFPxaMvZ-WbJHD0Db<&E-60m5`MUlB(mJmCu69xc9Wv=V0tQ+d33O&)ZNX*)6>VIU zGQ~*F(&V8?Tw)q6E}lD6LW+Ca9c$tTu>co4|mhlpVA?j&U)c z zTW{hp6oi)mhe8Xz!0z^<{{O$ZKF-rVcqWP)QI+rGapJ_|V>^;ZD8GI=Ruy|$lVP2| zw!W#%*WLXct8EnKJ6!Lw{cdRKo4ZQWLFys&^{zZ%*S^1H6|pTIXB!;y@e$1--bADW zWv~oTTOY;&oL|D#cH3oeod(4SZ%Y4-!F1TJU}OcOqk?HKwtW@cwMV!Zyi*m*3aSAZ z#wpra!R>s5>v4*z3TBCf!H{dTtnqUHo;8>i>@euo$dpY+>BDHSXB+K&P1Idn3~=vj z!rdPL0000000000;O21o+O_q4Wxl@N<;i#ZY=43-^SNxV(j}+w4~K}uq3OWsHJwrE z&lFvyJHu$8t%uGox(%+Yfp+?1_1ZzzUMIY+{TEbFkD%4Z4yyJt{Tb>KXt&=VO829u zf>9GnIl^WQnKfuCm=jo4u=KuoPzDoGL6g8*-L645L-ZOg6)bdA(B^B`)_Y$Q00000 z00000001{f=fUdzsNXj)c&N1RzqH<)-ngUnhvV^dJRX}pNd2Vs$Hxx6+rU1ueLEa^ zI6j?DPpX5b!Zi&V1K!{%Yt-)GDJv-S$I5Jd`6-$cP*+G#(JwG4^EDqpYJI{Kbpx>Y z8th6~O9zg66Is~ckAF=700000000000Nfnz;Pkn&oc>Z-PIpJ&&*zBq`P}T`a}h)8 z5lVl#RGK|ZJwoY`zqUhbFr0z29e{F0+hG0knlu;}VZa+S@zXSeVJh6#M}x|MF=*OP zGZ?@16ciP515l@+tkA_&xOa-?8vOIOZ6MqlO<5bf$O?v8qumCxe_{$&f5KpuJ2shc zn~*X1<6jd1000000000005`{LB9chx~_Fvswl8`L-O4_I^!y8EZ@40diZ3mcp; zz{245xABE_00000000000Dzn0+6S{AmA3A_Pw03Jd-U$Ifv%(dkI!uX*>vc>t!9}N zZpi#EvjrKSX@kYx=Vvqxx^JslYW&reu(|+KSNLOWzhniggN5_E>sC-Fv~>o{2wDb^ z6DlYTx^IM9{2J;GNV^PnSMb}vCfxT40RR9100000007`W{sHG4b9xuAAcg<{002ov JPDHLkV1lC3sha=* diff --git a/maps/ministation/hud.dmi b/maps/ministation/hud.dmi index d4fed05d840b64ca2d2af13c95162efb34c349b3..8a3e91cf3a744b9baced7ff505d02f4b21076eee 100644 GIT binary patch literal 388 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0J3?w7mbKU|e#Q>iW*8>L*{QqyvYv3C{o8b%t z!~g&Pg*{89HPa=P1A$U94!iA)LZyL<8B2ovf*Bm1-ADs+nyW%0N?cNllZ!G7N;32F z7#J$%1cwzAm45#cT=4Ph6D@CDt#fD22X6>9xM=*~kF2gf(m7!jmhwWLyJ8W~^jWeHiL+qveW$iSPxPmD8l!vY2+6&zw3{ zRKo3`h6L*m#_H;7<~Y{1-ir@?)LOyC8`~J}7@ql~h|4!Z%Jo3Y(!d|S4_2(uIIucF fq^BvcfsrAzLHbHzcK=GCYZyFT{an^LB{Ts5cf*VQ literal 1126 zcmV-s1eyDZP)005u}0{{R3yb+fl00012P)t-sz`(%& z0000008>*_Uz-3kGc*7H|A&W%f43K&Pz%U*4E3cN^LGHJr>7e!XM+F$^PeZ{>+4#U zyBt8f%K!k(%mDxYGynep%m4rlFijaFQNX~!6G?Rpuo?LP0004WQchCV=-0C=30ltFF+F$_i5lT$>nuS(0dn+k+jlsg#5GjSOlVNh0;Y2s#ua%)-dv>iQdm zt+?DrJ}Riw7vW;SQpV)7rm4kjGjTq+>$Yo>frWg-Ia6YUF%@*?t;i(SR^@^TCuRF7 zeb4A?C{bIL@s(Wj%uM~9xS1gNv)<`hd2^{AOh9qQxy-wj|LA4h9yWhp!Y_>CJltmx zpw<8Y0<%d(K~#90?V90on=lZB69>*gc#!Fxu_+ zk|F3DTCl6@TtNj0Y77NE!+G;g^`u_0!L;CY!;g*DV7;nf)8HY#ZuonXHMp)|y1^@k zpBuKGX098;$!8nBDHZ7VO{z%0FIt8A{ShnH??bI%Ka(rkZ#LZ80aChP=|f!lNmBYW zQ~E?*`oFr;FBVF_+yWP@MF1}OivZm;l>of$EC77tzCDShkIhLf9^KBwby%L>hSZI7 zZr&dBwLGty2Cj`%lE`)W3@lw7j=HpQZ2dgG;ppdS!NlTDDsT1cMcj(o`3LwFrWS9s zp@blAPz6Cl2hj!vH7Kfp1RMMVuwXk2f(C7fvl`TQig5l zHSC5#WEfn-*B^#!pt*>jt6=n7QP7^wgMt$OQi9?O_C}_lFYph7x<6zw<=QGL`Hy?i*zTunstthA~KLH6w#W5)u{4bc7-!cXL&sV(>H>mrAhH?et_=aoLDV3A{BCuoSr9a6f?J-( sHqZFE%`)2+NC+W>5JCtcgxoW~05v^5fC6Ql#sB~S07*qoM6N<$f)q#?fB*mh diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index d562ce534a21..39185e130821 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -4,7 +4,7 @@ alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") outfit_type = /decl/outfit/job/ministation_assistant event_categories = list(ASSIGNMENT_GARDENER) - hud_icon = "hudassistant" + hud_icon_state = "hudassistant" /decl/outfit/job/ministation_assistant name = "Job - Ministation Assistant" diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index db3f49f88b71..ed66ba7116e7 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,6 +1,7 @@ /datum/job/standard/captain/ministation supervisors = "your profit margin, your conscience, and the watchful eye of the Tradehouse Rep" outfit_type = /decl/outfit/job/ministation/captain + _hud_icon = 'maps/ministation/hud.dmi' min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_ADEPT, @@ -36,7 +37,8 @@ /datum/job/hop/ministation title = "Lieutenant" outfit_type = /decl/outfit/job/ministation/hop - hud_icon = "hudlieutenant" + _hud_icon = 'maps/ministation/hud.dmi' + hud_icon_state = "hudlieutenant" min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_BASIC, diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index 4396510fb688..3b05d4cb6b60 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -34,7 +34,7 @@ /datum/job/standard/chief_engineer/ministation title = "Head Engineer" - hud_icon = "hudchiefengineer" + hud_icon_state = "hudchiefengineer" access = list( access_engine, access_engine_equip, diff --git a/maps/ministation/jobs/medical.dm b/maps/ministation/jobs/medical.dm index 2dcd95964d45..4615ab729350 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -41,7 +41,7 @@ outfit_type = /decl/outfit/job/ministation/doctor/head alt_titles = list("Chief Medical Officer", "Head Surgeon") skill_points = 38 - hud_icon = "hudheaddoctor" + hud_icon_state = "hudheaddoctor" access = list( access_medical, access_medical_equip, diff --git a/maps/ministation/jobs/science.dm b/maps/ministation/jobs/science.dm index 7371f2f4b69d..15cb2532ae25 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -5,7 +5,7 @@ spawn_positions = 1 total_positions = 2 outfit_type = /decl/outfit/job/ministation/scientist - hud_icon = "hudscientist" + hud_icon_state = "hudscientist" skill_points = 34 /datum/job/standard/rd/ministation @@ -27,7 +27,7 @@ SKILL_SCIENCE = SKILL_MAX ) skill_points = 40 - hud_icon = "hudheadscientist" + hud_icon_state = "hudheadscientist" access = list( access_rd, access_bridge, diff --git a/maps/ministation/jobs/security.dm b/maps/ministation/jobs/security.dm index 05d1ccc4d411..83411376a071 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -57,7 +57,7 @@ /datum/job/standard/hos/ministation outfit_type = /decl/outfit/job/ministation/security/head - hud_icon = "hudhos" + hud_icon_state = "hudhos" access = list( access_security, access_sec_doors, diff --git a/maps/ministation/jobs/tradehouse.dm b/maps/ministation/jobs/tradehouse.dm index 1e167615cf89..25cb307b04b1 100644 --- a/maps/ministation/jobs/tradehouse.dm +++ b/maps/ministation/jobs/tradehouse.dm @@ -1,7 +1,8 @@ /datum/job/tradehouse_rep title = "Tradehouse Representative" alt_titles = list("Narc") - hud_icon = "hudnarc" + hud_icon_state = "hudnarc" + _hud_icon = 'maps/ministation/hud.dmi' spawn_positions = 1 total_positions = 2 req_admin_notify = 1 diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index f75e4bddbd58..0740d0ac4031 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -1,7 +1,6 @@ /datum/map/ministation default_job_type = /datum/job/standard/assistant/ministation default_department_type = /decl/department/civilian - id_hud_icons = 'maps/ministation/hud.dmi' allowed_jobs = list( /datum/job/standard/assistant/ministation, /datum/job/bartender/ministation, diff --git a/maps/shaded_hills/icons/hud.dmi b/maps/shaded_hills/icons/hud.dmi deleted file mode 100644 index c8c2fcf8bd1b00460a580ee3691e21d567547cb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 545 zcmV++0^a?JP)004jl0{{R3eocQU0000IP)t-sz`(%& z0000005dZ)|NsBMz`)5iEs_8L00DGTPE!Ct=GbNc008HDR9JLGWpiV4X>fFDZ*Bkp zc$}4!!EVAZ42I9mQ$%o|HpX?A2{dsS@8CA3v64EIW9aLXt`bLNZoj23`R(7y)_)&= zPG^7kJ-Hi7rNaKp@88~CH&f8qiqD3K~!jg?bbmKf-n?>;o=GC4Gi@J!U=@?pGj&H;dP-V zGw%Lx*Mv-l@MxQI3i4%|u1S%{^J>Ut+a@V+2o>{qTbG9v7%J}RWmW^v75DJ6YI7ZKZ<>9+=FfZ_1v3-eftUyA-fchJlFtB4%fUzYU1k4pdm j00000000000RH0%INA%d5a=Ll00000NkvXXu0mjf?LYJy diff --git a/maps/shaded_hills/jobs/_jobs.dm b/maps/shaded_hills/jobs/_jobs.dm index 638c6ff7bf5c..7eb2719f6615 100644 --- a/maps/shaded_hills/jobs/_jobs.dm +++ b/maps/shaded_hills/jobs/_jobs.dm @@ -1,6 +1,5 @@ /datum/map/shaded_hills - id_hud_icons = 'maps/shaded_hills/icons/hud.dmi' - allowed_jobs = list( + allowed_jobs = list( /datum/job/shaded_hills/visitor/traveller, /datum/job/shaded_hills/visitor/traveller/learned, /datum/job/shaded_hills/visitor/beggar_knight, @@ -48,6 +47,7 @@ /datum/job/shaded_hills abstract_type = /datum/job/shaded_hills + hud_icon_state = "hudblank" department_types = list( /decl/department/shaded_hills/locals ) diff --git a/maps/tradeship/tradeship_jobs.dm b/maps/tradeship/tradeship_jobs.dm index ce53a6b7518c..75d69af0137e 100644 --- a/maps/tradeship/tradeship_jobs.dm +++ b/maps/tradeship/tradeship_jobs.dm @@ -2,7 +2,7 @@ default_job_type = /datum/job/standard/assistant/tradeship default_department_type = /decl/department/civilian default_law_type = /datum/ai_laws/corporate - id_hud_icons = 'maps/tradeship/hud.dmi' + hud_icons = 'maps/tradeship/hud.dmi' allowed_jobs = list( /datum/job/standard/assistant/tradeship, /datum/job/standard/captain/tradeship, diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 673a2e15ef4f..39cd2e68c777 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -113,7 +113,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable var/default_law_type = /datum/ai_laws/asimov // The default lawset use by synth units, if not overriden by their laws var. var/security_state = /decl/security_state/default // The default security state system to use. - var/id_hud_icons = 'icons/mob/hud.dmi' // Used by the ID HUD (primarily sechud) overlay. + var/hud_icons = 'icons/screen/hud.dmi' // Used by the ID HUD (primarily sechud) overlay. + var/implant_hud_icons = 'icons/screen/hud_implants.dmi' + var/med_hud_icons = 'icons/screen/hud_med.dmi' var/num_exoplanets = 0 var/force_exoplanet_type // Used to override exoplanet weighting and always pick the same exoplanet. diff --git a/mods/content/standard_jobs/icons/hud.dmi b/mods/content/standard_jobs/icons/hud.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ccea1d4a2116a3f9c5849d8f1ccbdf8b5773c93e GIT binary patch literal 1119 zcmV-l1fctgP)P)t-sz`($s zPz%U*3{z86Uz-5+r5gYL|A&W%f43K-(>L>X0H>#?^PeZ{>+4#UyUff08!2ZEFirpe zGaNv>6G?T0006+iz{>ytz`(#bu0mG;0004WQchCV=-0C=2@l)Y|4Aq<7*%Tu6aull!ksS-sQns@L82V7m?*0@O@zbIL{R63iDKAmH* z&DOu~566?=eH`6|wM(o1&A&c8y6Gy>@#WcSP0x0u}*%10xjIGz2ll z!Vxkq&_&ivS}2T8BD6x*JqTArCEMIg&;o>@0yrR8WaD6Rfm(FE4I8#U9h-7m7jPwi zxVBl^(h~Sii_A(Y1gU>g6>I+v-`4L>yW79>3r50HUs>K7(f|Mgy-7qtRCt{2ozZrJ zFc3rmWu=H#h1UQ7(0k|T18@!( zofrTKpmV$}23}hMW&o{$#&^ju!Cc>Z8x=wbA%qY@2qAWM+Lt(CG137@+rq! zS^xjl+o%vi2qA-5U^6Fy7h>odOp(+MNUx*5_fe?oo5`w8&q5!Tvl zKK$?%XuzHzKxUvd^4sikyiaU^wBNrCpa6*hGQKPN&nrL;&KI$ziodNI%23xaY5hwW%8~FFz ls1QO3A%qY@2qA>nC0{N4Im}9umZJaw002ovPDHLkV1lfv2x0&L literal 0 HcmV?d00001 diff --git a/mods/content/standard_jobs/jobs/_job.dm b/mods/content/standard_jobs/jobs/_job.dm index 7d1668c23721..f00abab75670 100644 --- a/mods/content/standard_jobs/jobs/_job.dm +++ b/mods/content/standard_jobs/jobs/_job.dm @@ -1,3 +1,3 @@ /datum/job/standard abstract_type = /datum/job/standard - id_hud_icons = 'mods/content/standard_jobs/icons/hud.dmi' + _hud_icon = 'mods/content/standard_jobs/icons/hud.dmi' diff --git a/mods/content/standard_jobs/jobs/captain.dm b/mods/content/standard_jobs/jobs/captain.dm index 70ec6cfca573..8e3c64fc66a2 100644 --- a/mods/content/standard_jobs/jobs/captain.dm +++ b/mods/content/standard_jobs/jobs/captain.dm @@ -1,5 +1,6 @@ /datum/job/standard/captain title = "Captain" + hud_icon_state = "hudcaptain" head_position = 1 department_types = list(/decl/department/command) total_positions = 1 @@ -43,6 +44,7 @@ /datum/job/hop title = "Head of Personnel" + hud_icon_state = "hudhop" head_position = 1 department_types = list( /decl/department/command, diff --git a/mods/content/standard_jobs/jobs/civilian.dm b/mods/content/standard_jobs/jobs/civilian.dm index e46ba580d2f6..56d91e1ff724 100644 --- a/mods/content/standard_jobs/jobs/civilian.dm +++ b/mods/content/standard_jobs/jobs/civilian.dm @@ -1,5 +1,6 @@ /datum/job/standard/assistant title = "Assistant" + hud_icon_state = "hudassistant" total_positions = -1 spawn_positions = -1 supervisors = "absolutely everyone" @@ -17,6 +18,7 @@ /datum/job/chaplain title = "Chaplain" + hud_icon_state = "hudchaplain" // TODO: not always a crucifix department_types = list(/decl/department/civilian) total_positions = 1 spawn_positions = 1 @@ -45,6 +47,7 @@ /datum/job/bartender title = "Bartender" department_types = list(/decl/department/service) + hud_icon_state = "hudbartender" total_positions = 1 spawn_positions = 1 supervisors = "the head of personnel" @@ -70,6 +73,7 @@ /datum/job/chef title = "Chef" + hud_icon_state = "hudchef" department_types = list(/decl/department/service) total_positions = 2 spawn_positions = 2 @@ -91,6 +95,7 @@ /datum/job/hydro title = "Gardener" + hud_icon_state = "hudgardener" department_types = list(/decl/department/service) total_positions = 2 spawn_positions = 1 @@ -113,6 +118,7 @@ //Cargo /datum/job/qm title = "Quartermaster" + hud_icon_state = "hudqm" department_types = list(/decl/department/supply) total_positions = 1 spawn_positions = 1 @@ -161,6 +167,7 @@ department_types = list(/decl/department/supply) total_positions = 2 spawn_positions = 2 + hud_icon_state = "hudcargo" supervisors = "the quartermaster and the head of personnel" access = list( access_maint_tunnels, @@ -194,6 +201,7 @@ /datum/job/mining title = "Shaft Miner" + hud_icon_state = "hudminer" department_types = list(/decl/department/supply) total_positions = 3 spawn_positions = 3 @@ -232,6 +240,7 @@ department_types = list(/decl/department/service) total_positions = 1 spawn_positions = 1 + hud_icon_state = "hudjanitor" supervisors = "the head of personnel" access = list( access_janitor, @@ -263,6 +272,7 @@ //More or less assistants /datum/job/librarian title = "Librarian" + hud_icon_state = "hudlibrarian" department_types = list(/decl/department/civilian) total_positions = 1 spawn_positions = 1 @@ -283,6 +293,7 @@ /datum/job/lawyer title = "Internal Affairs Agent" + hud_icon_state = "hudia" department_types = list(/decl/department/support) total_positions = 2 spawn_positions = 2 diff --git a/mods/content/standard_jobs/jobs/engineering.dm b/mods/content/standard_jobs/jobs/engineering.dm index 56545de93fe2..0647df9342a3 100644 --- a/mods/content/standard_jobs/jobs/engineering.dm +++ b/mods/content/standard_jobs/jobs/engineering.dm @@ -1,5 +1,6 @@ /datum/job/standard/chief_engineer title = "Chief Engineer" + hud_icon_state = "hudce" head_position = 1 department_types = list( /decl/department/engineering, @@ -91,7 +92,7 @@ /datum/job/standard/engineer title = "Engineer" department_types = list(/decl/department/engineering) - + hud_icon_state = "hudengineer" total_positions = 8 spawn_positions = 7 supervisors = "the chief engineer" diff --git a/mods/content/standard_jobs/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm index 41f044544bd2..7fb87af35aa9 100644 --- a/mods/content/standard_jobs/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -1,5 +1,6 @@ /datum/job/standard/cmo title = "Chief Medical Officer" + hud_icon_state = "hudcmo" head_position = 1 department_types = list( /decl/department/medical, @@ -75,6 +76,7 @@ /datum/job/standard/doctor title = "Medical Doctor" + hud_icon_state = "hudmed" department_types = list(/decl/department/medical) minimal_player_age = 3 total_positions = 5 @@ -128,6 +130,7 @@ /datum/job/standard/chemist title = "Pharmacist" + hud_icon_state = "hudpharmacist" department_types = list(/decl/department/medical) minimal_player_age = 7 total_positions = 2 @@ -163,6 +166,7 @@ /datum/job/counselor title = "Counselor" + hud_icon_state = "hudmed" alt_titles = list("Mentalist") department_types = list(/decl/department/medical) total_positions = 1 diff --git a/mods/content/standard_jobs/jobs/science.dm b/mods/content/standard_jobs/jobs/science.dm index 530c31cfd27e..548f9147ea76 100644 --- a/mods/content/standard_jobs/jobs/science.dm +++ b/mods/content/standard_jobs/jobs/science.dm @@ -5,6 +5,7 @@ /decl/department/science, /decl/department/command ) + hud_icon_state = "hudrd" total_positions = 1 spawn_positions = 1 supervisors = "the captain" @@ -81,6 +82,7 @@ spawn_positions = 4 supervisors = "the Chief Science Officer" selection_color = "#633d63" + hud_icon_state = "hudscientist" economic_power = 7 access = list( access_robotics, @@ -124,6 +126,7 @@ /datum/job/standard/roboticist title = "Roboticist" + hud_icon_state = "hudroboticist" department_types = list(/decl/department/science) total_positions = 2 spawn_positions = 2 diff --git a/mods/content/standard_jobs/jobs/security.dm b/mods/content/standard_jobs/jobs/security.dm index 391e24c4fa5a..b7ae8b0036b4 100644 --- a/mods/content/standard_jobs/jobs/security.dm +++ b/mods/content/standard_jobs/jobs/security.dm @@ -1,5 +1,6 @@ /datum/job/standard/hos title = "Head of Security" + hud_icon_state = "hudhos" head_position = 1 department_types = list( /decl/department/security, @@ -93,6 +94,7 @@ /datum/job/standard/warden title = "Warden" department_types = list(/decl/department/security) + hud_icon_state = "hudwarden" total_positions = 1 spawn_positions = 1 supervisors = "the head of security" @@ -141,7 +143,7 @@ /datum/job/standard/detective title = "Detective" department_types = list(/decl/department/security) - + hud_icon_state = "huddetective" total_positions = 2 spawn_positions = 2 supervisors = "the head of security" @@ -188,6 +190,7 @@ /datum/job/standard/officer title = "Security Officer" + hud_icon_state = "hudsec" department_types = list(/decl/department/security) total_positions = 4 spawn_positions = 4 diff --git a/mods/content/standard_jobs/jobs/synthetics.dm b/mods/content/standard_jobs/jobs/synthetics.dm index 7ce050fd321a..32a972ed21ea 100644 --- a/mods/content/standard_jobs/jobs/synthetics.dm +++ b/mods/content/standard_jobs/jobs/synthetics.dm @@ -11,7 +11,7 @@ economic_power = 0 outfit_type = /decl/outfit/job/silicon/ai loadout_allowed = FALSE - hud_icon = "hudblank" + hud_icon_state = "hudblank" skill_points = 0 no_skill_buffs = TRUE guestbanned = 1 @@ -58,7 +58,7 @@ economic_power = 0 loadout_allowed = FALSE outfit_type = /decl/outfit/job/silicon/cyborg - hud_icon = "hudblank" + hud_icon_state = "hudblank" skill_points = 0 no_skill_buffs = TRUE guestbanned = 1 diff --git a/mods/mobs/borers/datum/antagonist.dm b/mods/mobs/borers/datum/antagonist.dm index c714ef8e1a1e..423297f09f87 100644 --- a/mods/mobs/borers/datum/antagonist.dm +++ b/mods/mobs/borers/datum/antagonist.dm @@ -7,12 +7,12 @@ welcome_text = "Click a target while on GRAB intent to crawl into their ear and infiltrate their brain. You can only take control temporarily, and at risk of hurting your host, so be clever and careful; your host is encouraged to help you however they can. Talk to your host with Say, and your fellow borers with ,z." antag_indicator = "hudborer" antaghud_indicator = "hudborer" + antag_hud_icon = 'mods/mobs/borers/icons/hud.dmi' faction_name = "Borer Host" faction_descriptor = "Unity" faction_welcome = "You are now host to a cortical borer. Please listen to what they have to say; they're in your head." faction = "borer" - faction_indicator = "hudalien" hard_cap = 5 hard_cap_round = 8 diff --git a/mods/mobs/borers/datum/symbiote.dm b/mods/mobs/borers/datum/symbiote.dm index f6954fa2bf32..325bddb9beac 100644 --- a/mods/mobs/borers/datum/symbiote.dm +++ b/mods/mobs/borers/datum/symbiote.dm @@ -21,7 +21,7 @@ var/global/list/symbiote_starting_points = list() minimal_player_age = 14 economic_power = 0 defer_roundstart_spawn = TRUE - hud_icon = "hudblank" + hud_icon_state = "hudblank" outfit_type = /decl/outfit/job/symbiote_host create_record = FALSE var/check_whitelist // = "Symbiote" diff --git a/mods/mobs/borers/icons/hud.dmi b/mods/mobs/borers/icons/hud.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8e01986fd47520979d45ff7876b87002a7ce3fb9 GIT binary patch literal 316 zcmeAS@N?(olHy`uVBq!ia0vp^4nVBH!VDw>HYaZfQlbGqA+84w98l0_@W^5~a)e># zOolTI4Au+`FPn4ffeIK)g8YIR9G=}s19B>=LLy3BQj3#|G7CyF^YefrbArPPib}tK z2`>2f^@*0ZuGYCT=Yuzd8eBAf@JQ#pkLF2+qMqIz7REuwmyNv?<~*8oWKxJiu;yYD z)s-5C#_MhNYlL@p8>?$4-|#T7xN3@3 zmF(vOx*^ch#WBR9H#tE>L?q<^V?z-WkJBl)t{ox`Pg_Eq3bYGKnY03mj;%f5!kN-! zn8$j|LD*$V3{X6g)T>-&)aivfrc}9y85}S Ib4q9e0N8+U9smFU literal 0 HcmV?d00001 diff --git a/mods/mobs/borers/mob/overrides.dm b/mods/mobs/borers/mob/overrides.dm index 77c9a2c158ec..26b83686f8e6 100644 --- a/mods/mobs/borers/mob/overrides.dm +++ b/mods/mobs/borers/mob/overrides.dm @@ -22,8 +22,10 @@ var/mob/living/simple_animal/borer/B = HAS_BRAIN_WORMS(src) if(B.controlling) var/image/holder = hud_list[STATUS_HUD] + holder.icon = 'mods/mobs/borers/icons/hud.dmi' holder.icon_state = "hudbrainworm" var/image/holder2 = hud_list[STATUS_HUD_OOC] + holder2.icon = 'mods/mobs/borers/icons/hud.dmi' holder2.icon_state = "hudbrainworm" /mob/living/human/say_understands(mob/speaker, decl/language/speaking) diff --git a/nebula.dme b/nebula.dme index d65b82917962..ff9aa17673ce 100644 --- a/nebula.dme +++ b/nebula.dme @@ -2883,6 +2883,7 @@ #include "code\modules\mob\living\living_give.dm" #include "code\modules\mob\living\living_grabs.dm" #include "code\modules\mob\living\living_hallucinations.dm" +#include "code\modules\mob\living\living_hud.dm" #include "code\modules\mob\living\living_maneuvers.dm" #include "code\modules\mob\living\living_organs.dm" #include "code\modules\mob\living\living_powers.dm" From d87f040712b12f98ddec354ba63decf98813cd50 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 09:27:29 +1100 Subject: [PATCH 44/95] Adding standard jobs pack to modpacks testing. --- maps/modpack_testing/modpack_testing.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index d7843b96d6b5..6e655ec31def 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -5,6 +5,7 @@ #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" + #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/byond_membership/_byond_membership.dm" From 87880e3d4a7396bd36938785b5bd790c1c3fcd19 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 09:31:06 +1100 Subject: [PATCH 45/95] Find and replacing _ from the start of hud_icon (debugging purposes). --- code/game/jobs/job/_job.dm | 6 +++--- code/modules/mob/living/human/life.dm | 2 +- code/modules/submaps/submap_job.dm | 7 ++++++- code/unit_tests/icon_tests.dm | 8 ++++---- icons/screen/hud.dmi | Bin 687 -> 555 bytes maps/away/liberia/liberia_jobs.dm | 2 +- maps/example/example_jobs.dm | 2 +- maps/ministation/jobs/command.dm | 4 ++-- maps/ministation/jobs/tradehouse.dm | 2 +- mods/content/standard_jobs/jobs/_job.dm | 2 +- 10 files changed, 20 insertions(+), 15 deletions(-) diff --git a/code/game/jobs/job/_job.dm b/code/game/jobs/job/_job.dm index 93d335861d1d..06e985a8772d 100644 --- a/code/game/jobs/job/_job.dm +++ b/code/game/jobs/job/_job.dm @@ -34,7 +34,7 @@ var/announced = TRUE // If their arrival is announced on radio var/latejoin_at_spawnpoints // If this job should use roundstart spawnpoints for latejoin (offstation jobs etc) var/forced_spawnpoint // If set to a spawnpoint name, will use that spawn point for joining as this job. - var/_hud_icon // icon used for secHUD overlay + var/hud_icon // icon used for secHUD overlay var/hud_icon_state // icon state used for secHUD overlay // A list of string IDs for keys to grant on join. @@ -83,8 +83,8 @@ total_positions = 0 spawn_positions = 0 - if(!_hud_icon) - _hud_icon = global.using_map.hud_icons + if(!hud_icon) + hud_icon = global.using_map.hud_icons if(!hud_icon_state) hud_icon_state = "hud[ckey(title)]" diff --git a/code/modules/mob/living/human/life.dm b/code/modules/mob/living/human/life.dm index 977e8349eb53..ebc47ef12025 100644 --- a/code/modules/mob/living/human/life.dm +++ b/code/modules/mob/living/human/life.dm @@ -746,7 +746,7 @@ if(I) var/datum/job/J = SSjobs.get_by_title(I.GetJobName()) if(J) - holder.icon = J._hud_icon + holder.icon = J.hud_icon holder.icon_state = J.hud_icon_state hud_list[ID_HUD] = holder diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index fe6396a8fcee..6dee2df50067 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -55,7 +55,12 @@ if(islist(blacklisted_species) && !length(blacklisted_species)) blacklisted_species |= SSmodpacks.default_submap_blacklisted_species - if(!abstract_job) + if(abstract_job) + if(!hud_icon) + hud_icon = global.using_map.hud_icons + if(!hud_icon_state) + hud_icon_state = "hud[ckey(title)]" + else spawnpoints = list() owner = _owner ..() diff --git a/code/unit_tests/icon_tests.dm b/code/unit_tests/icon_tests.dm index 354b296b5fd9..5e4e751e6c97 100644 --- a/code/unit_tests/icon_tests.dm +++ b/code/unit_tests/icon_tests.dm @@ -313,7 +313,7 @@ "hud_imp_loyal" = "Loyalty", "hud_imp_unknown" = "Unknown", "hud_imp_tracking" = "Tracking", - "hud_imp_chemical" = "Chemical", + "hud_imp_chem" = "Chemical", ) for(var/implant_hud_state in implant_hud_states) if(!check_state_in_icon(implant_hud_state, global.using_map.implant_hud_icons)) @@ -342,14 +342,14 @@ "huddead" = "Dead mob" ) for(var/global_state in global_states) - if(!check_state_in_icon(global_states, global.using_map.hud_icons)) + if(!check_state_in_icon(global_state, global.using_map.hud_icons)) log_bad("Sanity Check - Missing map [global_states[global_state]] HUD icon_state '[global_state]' from icon [global.using_map.hud_icons]") failed_sanity_checks++ for(var/job_name in SSjobs.titles_to_datums) var/datum/job/job = SSjobs.titles_to_datums[job_name] - if(!check_state_in_icon(job.hud_icon_state, job._hud_icon)) - log_bad("[job.title] - Missing HUD icon: [job.hud_icon_state] in icon [job._hud_icon]") + if(!check_state_in_icon(job.hud_icon_state, job.hud_icon)) + log_bad("[job.title] - Missing HUD icon: [job.hud_icon_state] in icon [job.hud_icon]") failed_jobs++ if(failed_sanity_checks || failed_jobs) diff --git a/icons/screen/hud.dmi b/icons/screen/hud.dmi index 5d1eb6b8f096db1208cf901d4450cc038d744557..b8d9812936996937f15b79430b7724b3985ed2f8 100644 GIT binary patch literal 555 zcmV+`0@VG9P)+9<(J0WTufHMF900DGTPE!Ct z=GbNc0057AR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5fFwryM z;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KAHiHkEOv#1!zH00t;D@x2wg|OiYGD=fQ z^Rn~u%kzj)nv|26mrabqjMT)Ol8j1XlxF7S5Th(5H8BO3I%Ne{KNoQL005c_R6J&E zMoItx0Tf9@K~zYI?UXSNf-n?@!9-o{4Gi@J!U==}xRB`P#Ngz{0IP!sFpkTAQj zJHQDzjYSfDuQ7dnn*;y$C;jrZk5WfCC}QGyOUD$kfXx*$iaaCWB86D2!eCuneNL832l&mA+2_Uqz3~Af$kg;!Toc1qwW2THy+6ou;rC3~L#JVKGP0uVx8) z1y7(9JOLkIZ;5+o_E@UjVF literal 687 zcmV;g0#N;lP)+6F60OtSzRfrLPw->;` zzyVqQD31U0cL4LBCrl^``Tzg`0d!JMQvg8b*k%9#0Hu0VSad{Xb7OL8aCB*JZU6vy zoQ=`H3c@fD$MHFNiqP)jztu%rq=S8jlbj~>yp&67@$D@Z+=Sb{KlpIV)$ZJ0y52R{ z&c0A`OzckXxY=4WM_e~nz-eX;^$1?$X5fM_4zKGCQG5TeMejOKlkl6SSPEhhuYUV#MLD`Rqq5q%+r9Y;#A{7;FQ?EePNa1SP=09k84M?f^1C z<}tMMmoh$>QLInz%w!mV9&u>_h|mGz`qv#`zd8eCJOk(zawF3n1fPH|S4w!ENcnF)BQR)k0=yx2)aU91%^93T# V6Y^D!^t1o~002ovPDHLkV1mMMGQ0o) diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index 9d042d7f6770..d1df2cd7dfca 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -11,7 +11,7 @@ info = "You are free traders who have drifted into unknown distances in search of profit. Travel, trade, make profit!" supervisors = "the invisible hand of the market" selection_color = "#515151" - _hud_icon = 'maps/away/liberia/hud.dmi' + hud_icon = 'maps/away/liberia/hud.dmi' ideal_character_age = 20 minimal_player_age = 7 diff --git a/maps/example/example_jobs.dm b/maps/example/example_jobs.dm index 2eb3b025c99a..28d5cf504c67 100644 --- a/maps/example/example_jobs.dm +++ b/maps/example/example_jobs.dm @@ -12,7 +12,7 @@ access = list() minimal_access = list() outfit_type = /decl/outfit/job/tourist - _hud_icon = = 'maps/example/hud.dmi' + hud_icon = 'maps/example/hud.dmi' department_types = list( /decl/department/example ) diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index ed66ba7116e7..2c96b33eb01d 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -1,7 +1,7 @@ /datum/job/standard/captain/ministation supervisors = "your profit margin, your conscience, and the watchful eye of the Tradehouse Rep" outfit_type = /decl/outfit/job/ministation/captain - _hud_icon = 'maps/ministation/hud.dmi' + hud_icon = 'maps/ministation/hud.dmi' min_skill = list( SKILL_LITERACY = SKILL_ADEPT, SKILL_WEAPONS = SKILL_ADEPT, @@ -37,7 +37,7 @@ /datum/job/hop/ministation title = "Lieutenant" outfit_type = /decl/outfit/job/ministation/hop - _hud_icon = 'maps/ministation/hud.dmi' + hud_icon = 'maps/ministation/hud.dmi' hud_icon_state = "hudlieutenant" min_skill = list( SKILL_LITERACY = SKILL_ADEPT, diff --git a/maps/ministation/jobs/tradehouse.dm b/maps/ministation/jobs/tradehouse.dm index 25cb307b04b1..daa715dddd5b 100644 --- a/maps/ministation/jobs/tradehouse.dm +++ b/maps/ministation/jobs/tradehouse.dm @@ -2,7 +2,7 @@ title = "Tradehouse Representative" alt_titles = list("Narc") hud_icon_state = "hudnarc" - _hud_icon = 'maps/ministation/hud.dmi' + hud_icon = 'maps/ministation/hud.dmi' spawn_positions = 1 total_positions = 2 req_admin_notify = 1 diff --git a/mods/content/standard_jobs/jobs/_job.dm b/mods/content/standard_jobs/jobs/_job.dm index f00abab75670..6869734493ab 100644 --- a/mods/content/standard_jobs/jobs/_job.dm +++ b/mods/content/standard_jobs/jobs/_job.dm @@ -1,3 +1,3 @@ /datum/job/standard abstract_type = /datum/job/standard - _hud_icon = 'mods/content/standard_jobs/icons/hud.dmi' + hud_icon = 'mods/content/standard_jobs/icons/hud.dmi' From c26f8c64580db9096f41f6d32fc6cd0b375cbdc9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 7 Jan 2025 14:48:30 +1100 Subject: [PATCH 46/95] Converting remaining standard jobs. --- code/modules/submaps/submap_job.dm | 1 + maps/away/liberia/liberia_jobs.dm | 1 + maps/exodus/exodus_antagonism.dm | 6 +-- maps/exodus/exodus_goals.dm | 2 +- maps/exodus/exodus_jobs.dm | 54 +++++++++---------- maps/exodus/exodus_loadout.dm | 2 +- maps/ministation/jobs/civilian.dm | 9 ++-- maps/ministation/jobs/command.dm | 2 +- maps/ministation/jobs/engineering.dm | 1 - maps/ministation/jobs/medical.dm | 1 - maps/ministation/jobs/science.dm | 2 - maps/ministation/jobs/security.dm | 1 - maps/ministation/ministation_jobs.dm | 10 ++-- maps/tradeship/jobs/command.dm | 1 + maps/tradeship/tradeship_jobs.dm | 1 - maps/~mapsystem/maps.dm | 7 ++- mods/content/standard_jobs/jobs/captain.dm | 2 +- mods/content/standard_jobs/jobs/civilian.dm | 22 ++++---- mods/content/standard_jobs/jobs/medical.dm | 2 +- mods/content/standard_jobs/jobs/synthetics.dm | 2 + mods/mobs/borers/datum/symbiote.dm | 1 + .../patches/psionics/psi_jobs.dm | 2 +- 22 files changed, 65 insertions(+), 67 deletions(-) diff --git a/code/modules/submaps/submap_job.dm b/code/modules/submaps/submap_job.dm index 6dee2df50067..89d8b2f38718 100644 --- a/code/modules/submaps/submap_job.dm +++ b/code/modules/submaps/submap_job.dm @@ -8,6 +8,7 @@ total_positions = 4 outfit_type = /decl/outfit/job/survivor hud_icon_state = "hudblank" + hud_icon = null available_by_default = FALSE allowed_ranks = null allowed_branches = null diff --git a/maps/away/liberia/liberia_jobs.dm b/maps/away/liberia/liberia_jobs.dm index d1df2cd7dfca..34269ce2cd3a 100644 --- a/maps/away/liberia/liberia_jobs.dm +++ b/maps/away/liberia/liberia_jobs.dm @@ -12,6 +12,7 @@ supervisors = "the invisible hand of the market" selection_color = "#515151" hud_icon = 'maps/away/liberia/hud.dmi' + hud_icon_state = "hudmerchant" ideal_character_age = 20 minimal_player_age = 7 diff --git a/maps/exodus/exodus_antagonism.dm b/maps/exodus/exodus_antagonism.dm index d5f543175cbd..e09d2ddc9002 100644 --- a/maps/exodus/exodus_antagonism.dm +++ b/maps/exodus/exodus_antagonism.dm @@ -1,16 +1,16 @@ /decl/special_role/traitor/Initialize() . = ..() LAZYINITLIST(protected_jobs) - protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective, /datum/job/standard/captain, /datum/job/lawyer, /datum/job/standard/hos) + protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective, /datum/job/standard/captain, /datum/job/standard/lawyer, /datum/job/standard/hos) /decl/special_role/cultist/Initialize() . = ..() LAZYINITLIST(restricted_jobs) - restricted_jobs |= list(/datum/job/lawyer, /datum/job/standard/captain, /datum/job/standard/hos) + restricted_jobs |= list(/datum/job/standard/lawyer, /datum/job/standard/captain, /datum/job/standard/hos) LAZYINITLIST(protected_jobs) protected_jobs |= list(/datum/job/standard/officer, /datum/job/standard/warden, /datum/job/standard/detective) LAZYINITLIST(blacklisted_jobs) - blacklisted_jobs |= list(/datum/job/chaplain, /datum/job/counselor) + blacklisted_jobs |= list(/datum/job/standard/chaplain, /datum/job/standard/counselor) /decl/special_role/loyalist command_department_id = /decl/department/command diff --git a/maps/exodus/exodus_goals.dm b/maps/exodus/exodus_goals.dm index 9799dc6b3b22..8275bc4173bb 100644 --- a/maps/exodus/exodus_goals.dm +++ b/maps/exodus/exodus_goals.dm @@ -30,7 +30,7 @@ var/global/list/exodus_paperwork_end_areas = list() paperwork_types = list(/obj/item/paperwork/exodus) signatory_job_list = list( /datum/job/standard/captain, - /datum/job/hop, + /datum/job/standard/hop, /datum/job/standard/cmo, /datum/job/standard/chief_engineer, /datum/job/standard/rd, diff --git a/maps/exodus/exodus_jobs.dm b/maps/exodus/exodus_jobs.dm index b9fe0a411a04..6ca8b4d8ab41 100644 --- a/maps/exodus/exodus_jobs.dm +++ b/maps/exodus/exodus_jobs.dm @@ -11,23 +11,23 @@ default_department_type = /decl/department/civilian allowed_jobs = list( /datum/job/standard/captain, - /datum/job/hop, - /datum/job/chaplain, - /datum/job/bartender, - /datum/job/chef, - /datum/job/hydro, - /datum/job/qm, - /datum/job/cargo_tech, - /datum/job/mining, - /datum/job/janitor, - /datum/job/librarian, - /datum/job/lawyer, + /datum/job/standard/hop, + /datum/job/standard/chaplain, + /datum/job/standard/bartender, + /datum/job/standard/chef, + /datum/job/standard/hydro, + /datum/job/standard/qm, + /datum/job/standard/cargo_tech, + /datum/job/standard/mining, + /datum/job/standard/janitor, + /datum/job/standard/librarian, + /datum/job/standard/lawyer, /datum/job/standard/chief_engineer, /datum/job/standard/engineer, /datum/job/standard/cmo, /datum/job/standard/doctor, /datum/job/standard/chemist, - /datum/job/counselor, + /datum/job/standard/counselor, /datum/job/standard/rd, /datum/job/standard/scientist, /datum/job/standard/roboticist, @@ -44,44 +44,44 @@ /datum/job/standard/computer, /datum/job/standard/robot, /datum/job/standard/assistant, - /datum/job/janitor, - /datum/job/chef, - /datum/job/bartender, - /datum/job/cargo_tech, + /datum/job/standard/janitor, + /datum/job/standard/chef, + /datum/job/standard/bartender, + /datum/job/standard/cargo_tech, /datum/job/standard/engineer, /datum/job/standard/roboticist, /datum/job/standard/chemist, /datum/job/standard/scientist, - /datum/job/mining + /datum/job/standard/mining ), /decl/species/utility_frame = list( /datum/job/standard/computer, /datum/job/standard/robot, /datum/job/standard/assistant, - /datum/job/janitor, - /datum/job/chef, - /datum/job/bartender, - /datum/job/cargo_tech, + /datum/job/standard/janitor, + /datum/job/standard/chef, + /datum/job/standard/bartender, + /datum/job/standard/cargo_tech, /datum/job/standard/engineer, /datum/job/standard/roboticist, /datum/job/standard/chemist, /datum/job/standard/scientist, - /datum/job/mining + /datum/job/standard/mining ), /decl/species/serpentid = list( /datum/job/standard/computer, /datum/job/standard/robot, /datum/job/standard/assistant, - /datum/job/janitor, - /datum/job/chef, - /datum/job/bartender, - /datum/job/cargo_tech, + /datum/job/standard/janitor, + /datum/job/standard/chef, + /datum/job/standard/bartender, + /datum/job/standard/cargo_tech, /datum/job/standard/roboticist, /datum/job/standard/chemist ) ) -#define HUMAN_ONLY_JOBS /datum/job/standard/captain, /datum/job/hop, /datum/job/standard/hos +#define HUMAN_ONLY_JOBS /datum/job/standard/captain, /datum/job/standard/hop, /datum/job/standard/hos species_to_job_blacklist = list( /decl/species/unathi = list( HUMAN_ONLY_JOBS diff --git a/maps/exodus/exodus_loadout.dm b/maps/exodus/exodus_loadout.dm index 107fa0ae8c99..d5f70fdf9571 100644 --- a/maps/exodus/exodus_loadout.dm +++ b/maps/exodus/exodus_loadout.dm @@ -2,7 +2,7 @@ name = "religious insignia" path = /obj/item/clothing/insignia cost = 1 - allowed_roles = list(/datum/job/chaplain) + allowed_roles = list(/datum/job/standard/chaplain) uid = "gear_accessory_insignia" /decl/loadout_option/accessory/insignia/Initialize() diff --git a/maps/ministation/jobs/civilian.dm b/maps/ministation/jobs/civilian.dm index 39185e130821..18024cc23791 100644 --- a/maps/ministation/jobs/civilian.dm +++ b/maps/ministation/jobs/civilian.dm @@ -4,12 +4,11 @@ alt_titles = list("Technical Recruit","Medical Recruit","Research Recruit","Visitor") outfit_type = /decl/outfit/job/ministation_assistant event_categories = list(ASSIGNMENT_GARDENER) - hud_icon_state = "hudassistant" /decl/outfit/job/ministation_assistant name = "Job - Ministation Assistant" -/datum/job/bartender/ministation +/datum/job/standard/bartender/ministation title = "Bartender" alt_titles = list("Cook","Barista") supervisors = "the Lieutenant and the Captain" @@ -30,7 +29,7 @@ ) skill_points = 30 -/datum/job/cargo_tech/ministation +/datum/job/standard/cargo_tech/ministation title = "Cargo Technician" alt_titles = list("Shaft Miner","Drill Technician","Prospector") supervisors = "the Lieutenant and the Captain" @@ -73,7 +72,7 @@ ) skill_points = 30 -/datum/job/janitor/ministation +/datum/job/standard/janitor/ministation total_positions = 2 supervisors = "the Lieutenant and the Captain" economic_power = 3 @@ -84,7 +83,7 @@ ) skill_points = 28 -/datum/job/librarian/ministation +/datum/job/standard/librarian/ministation spawn_positions = 2 supervisors = "the Lieutenant, the Captain, and the smell of old paper" economic_power = 5 diff --git a/maps/ministation/jobs/command.dm b/maps/ministation/jobs/command.dm index 2c96b33eb01d..1a27ff0736d1 100644 --- a/maps/ministation/jobs/command.dm +++ b/maps/ministation/jobs/command.dm @@ -34,7 +34,7 @@ command_announcement.Announce("Congratulations to all members of [capitalize(global.using_map.company_name)] on the new name. Their rebranding has changed the [global.using_map.company_short] market value by [0.01*rand(-10,10)]%.", "Trade Union Name Change") verbs -= /mob/proc/freetradeunion_rename_company -/datum/job/hop/ministation +/datum/job/standard/hop/ministation title = "Lieutenant" outfit_type = /decl/outfit/job/ministation/hop hud_icon = 'maps/ministation/hud.dmi' diff --git a/maps/ministation/jobs/engineering.dm b/maps/ministation/jobs/engineering.dm index 3b05d4cb6b60..a3cb57fbc0a9 100644 --- a/maps/ministation/jobs/engineering.dm +++ b/maps/ministation/jobs/engineering.dm @@ -34,7 +34,6 @@ /datum/job/standard/chief_engineer/ministation title = "Head Engineer" - hud_icon_state = "hudchiefengineer" access = list( access_engine, access_engine_equip, diff --git a/maps/ministation/jobs/medical.dm b/maps/ministation/jobs/medical.dm index 4615ab729350..1dd568c8176e 100644 --- a/maps/ministation/jobs/medical.dm +++ b/maps/ministation/jobs/medical.dm @@ -41,7 +41,6 @@ outfit_type = /decl/outfit/job/ministation/doctor/head alt_titles = list("Chief Medical Officer", "Head Surgeon") skill_points = 38 - hud_icon_state = "hudheaddoctor" access = list( access_medical, access_medical_equip, diff --git a/maps/ministation/jobs/science.dm b/maps/ministation/jobs/science.dm index 15cb2532ae25..7b8e61e4591d 100644 --- a/maps/ministation/jobs/science.dm +++ b/maps/ministation/jobs/science.dm @@ -5,7 +5,6 @@ spawn_positions = 1 total_positions = 2 outfit_type = /decl/outfit/job/ministation/scientist - hud_icon_state = "hudscientist" skill_points = 34 /datum/job/standard/rd/ministation @@ -27,7 +26,6 @@ SKILL_SCIENCE = SKILL_MAX ) skill_points = 40 - hud_icon_state = "hudheadscientist" access = list( access_rd, access_bridge, diff --git a/maps/ministation/jobs/security.dm b/maps/ministation/jobs/security.dm index 83411376a071..242c665e7f31 100644 --- a/maps/ministation/jobs/security.dm +++ b/maps/ministation/jobs/security.dm @@ -57,7 +57,6 @@ /datum/job/standard/hos/ministation outfit_type = /decl/outfit/job/ministation/security/head - hud_icon_state = "hudhos" access = list( access_security, access_sec_doors, diff --git a/maps/ministation/ministation_jobs.dm b/maps/ministation/ministation_jobs.dm index 0740d0ac4031..17bb28b7b9e8 100644 --- a/maps/ministation/ministation_jobs.dm +++ b/maps/ministation/ministation_jobs.dm @@ -3,9 +3,9 @@ default_department_type = /decl/department/civilian allowed_jobs = list( /datum/job/standard/assistant/ministation, - /datum/job/bartender/ministation, + /datum/job/standard/bartender/ministation, /datum/job/standard/captain/ministation, - /datum/job/cargo_tech/ministation, + /datum/job/standard/cargo_tech/ministation, /datum/job/standard/robot, /datum/job/standard/computer, /datum/job/standard/detective/ministation, @@ -13,12 +13,12 @@ /datum/job/standard/cmo/ministation, /datum/job/standard/engineer/ministation, /datum/job/standard/chief_engineer/ministation, - /datum/job/hop/ministation, - /datum/job/janitor/ministation, + /datum/job/standard/hop/ministation, + /datum/job/standard/janitor/ministation, /datum/job/standard/scientist/ministation, /datum/job/standard/rd/ministation, /datum/job/standard/officer/ministation, /datum/job/standard/hos/ministation, - /datum/job/librarian/ministation, + /datum/job/standard/librarian/ministation, /datum/job/tradehouse_rep ) \ No newline at end of file diff --git a/maps/tradeship/jobs/command.dm b/maps/tradeship/jobs/command.dm index b3ad43dc8859..3647a632760c 100644 --- a/maps/tradeship/jobs/command.dm +++ b/maps/tradeship/jobs/command.dm @@ -55,6 +55,7 @@ /datum/job/tradeship_first_mate title = "First Mate" supervisors = "the Captain" + hud_icon = 'maps/tradeship/hud.dmi' outfit_type = /decl/outfit/job/tradeship/mate head_position = 1 department_types = list( diff --git a/maps/tradeship/tradeship_jobs.dm b/maps/tradeship/tradeship_jobs.dm index 75d69af0137e..71ba7143cc3a 100644 --- a/maps/tradeship/tradeship_jobs.dm +++ b/maps/tradeship/tradeship_jobs.dm @@ -2,7 +2,6 @@ default_job_type = /datum/job/standard/assistant/tradeship default_department_type = /decl/department/civilian default_law_type = /datum/ai_laws/corporate - hud_icons = 'maps/tradeship/hud.dmi' allowed_jobs = list( /datum/job/standard/assistant/tradeship, /datum/job/standard/captain/tradeship, diff --git a/maps/~mapsystem/maps.dm b/maps/~mapsystem/maps.dm index 39cd2e68c777..adba4d28b924 100644 --- a/maps/~mapsystem/maps.dm +++ b/maps/~mapsystem/maps.dm @@ -270,10 +270,9 @@ var/global/const/MAP_HAS_RANK = 2 //Rank system, also togglable if(!allowed_jobs) allowed_jobs = list() - for(var/jtype in subtypesof(/datum/job)) - var/datum/job/job = jtype - if(initial(job.available_by_default)) - allowed_jobs += jtype + for(var/datum/job/job as anything in subtypesof(/datum/job)) + if(!TYPE_IS_ABSTRACT(job) && job::available_by_default) + allowed_jobs += job if(ispath(default_job_type, /datum/job)) var/datum/job/J = default_job_type diff --git a/mods/content/standard_jobs/jobs/captain.dm b/mods/content/standard_jobs/jobs/captain.dm index 8e3c64fc66a2..d7abb62e0cd7 100644 --- a/mods/content/standard_jobs/jobs/captain.dm +++ b/mods/content/standard_jobs/jobs/captain.dm @@ -42,7 +42,7 @@ /datum/job/standard/captain/get_access() return get_all_station_access() -/datum/job/hop +/datum/job/standard/hop title = "Head of Personnel" hud_icon_state = "hudhop" head_position = 1 diff --git a/mods/content/standard_jobs/jobs/civilian.dm b/mods/content/standard_jobs/jobs/civilian.dm index 56d91e1ff724..1ce8eeb39d04 100644 --- a/mods/content/standard_jobs/jobs/civilian.dm +++ b/mods/content/standard_jobs/jobs/civilian.dm @@ -16,7 +16,7 @@ return list(access_maint_tunnels) return list() -/datum/job/chaplain +/datum/job/standard/chaplain title = "Chaplain" hud_icon_state = "hudchaplain" // TODO: not always a crucifix department_types = list(/decl/department/civilian) @@ -44,7 +44,7 @@ software_on_spawn = list(/datum/computer_file/program/reports) //Food -/datum/job/bartender +/datum/job/standard/bartender title = "Bartender" department_types = list(/decl/department/service) hud_icon_state = "hudbartender" @@ -71,7 +71,7 @@ SKILL_CHEMISTRY = SKILL_BASIC ) -/datum/job/chef +/datum/job/standard/chef title = "Chef" hud_icon_state = "hudchef" department_types = list(/decl/department/service) @@ -93,7 +93,7 @@ SKILL_CHEMISTRY = SKILL_BASIC ) -/datum/job/hydro +/datum/job/standard/hydro title = "Gardener" hud_icon_state = "hudgardener" department_types = list(/decl/department/service) @@ -116,7 +116,7 @@ event_categories = list(ASSIGNMENT_GARDENER) //Cargo -/datum/job/qm +/datum/job/standard/qm title = "Quartermaster" hud_icon_state = "hudqm" department_types = list(/decl/department/supply) @@ -162,7 +162,7 @@ /datum/computer_file/program/reports ) -/datum/job/cargo_tech +/datum/job/standard/cargo_tech title = "Cargo Technician" department_types = list(/decl/department/supply) total_positions = 2 @@ -199,7 +199,7 @@ /datum/computer_file/program/reports ) -/datum/job/mining +/datum/job/standard/mining title = "Shaft Miner" hud_icon_state = "hudminer" department_types = list(/decl/department/supply) @@ -235,7 +235,7 @@ SKILL_PILOT = SKILL_MAX ) -/datum/job/janitor +/datum/job/standard/janitor title = "Janitor" department_types = list(/decl/department/service) total_positions = 1 @@ -270,7 +270,7 @@ event_categories = list(ASSIGNMENT_JANITOR) //More or less assistants -/datum/job/librarian +/datum/job/standard/librarian title = "Librarian" hud_icon_state = "hudlibrarian" department_types = list(/decl/department/civilian) @@ -291,7 +291,7 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer +/datum/job/standard/lawyer title = "Internal Affairs Agent" hud_icon_state = "hudia" department_types = list(/decl/department/support) @@ -319,7 +319,7 @@ skill_points = 20 software_on_spawn = list(/datum/computer_file/program/reports) -/datum/job/lawyer/equip_job(var/mob/living/human/H) +/datum/job/standard/lawyer/equip_job(var/mob/living/human/H) . = ..() if(.) H.implant_loyalty(H) diff --git a/mods/content/standard_jobs/jobs/medical.dm b/mods/content/standard_jobs/jobs/medical.dm index 7fb87af35aa9..d1a5517f1c31 100644 --- a/mods/content/standard_jobs/jobs/medical.dm +++ b/mods/content/standard_jobs/jobs/medical.dm @@ -164,7 +164,7 @@ ) skill_points = 16 -/datum/job/counselor +/datum/job/standard/counselor title = "Counselor" hud_icon_state = "hudmed" alt_titles = list("Mentalist") diff --git a/mods/content/standard_jobs/jobs/synthetics.dm b/mods/content/standard_jobs/jobs/synthetics.dm index 32a972ed21ea..23f768d4ac62 100644 --- a/mods/content/standard_jobs/jobs/synthetics.dm +++ b/mods/content/standard_jobs/jobs/synthetics.dm @@ -12,6 +12,7 @@ outfit_type = /decl/outfit/job/silicon/ai loadout_allowed = FALSE hud_icon_state = "hudblank" + hud_icon = null skill_points = 0 no_skill_buffs = TRUE guestbanned = 1 @@ -59,6 +60,7 @@ loadout_allowed = FALSE outfit_type = /decl/outfit/job/silicon/cyborg hud_icon_state = "hudblank" + hud_icon = null skill_points = 0 no_skill_buffs = TRUE guestbanned = 1 diff --git a/mods/mobs/borers/datum/symbiote.dm b/mods/mobs/borers/datum/symbiote.dm index 325bddb9beac..bf2f17e93c40 100644 --- a/mods/mobs/borers/datum/symbiote.dm +++ b/mods/mobs/borers/datum/symbiote.dm @@ -22,6 +22,7 @@ var/global/list/symbiote_starting_points = list() economic_power = 0 defer_roundstart_spawn = TRUE hud_icon_state = "hudblank" + hud_icon = null outfit_type = /decl/outfit/job/symbiote_host create_record = FALSE var/check_whitelist // = "Symbiote" diff --git a/mods/~compatibility/patches/psionics/psi_jobs.dm b/mods/~compatibility/patches/psionics/psi_jobs.dm index f4579e9d7c05..d62d097022f0 100644 --- a/mods/~compatibility/patches/psionics/psi_jobs.dm +++ b/mods/~compatibility/patches/psionics/psi_jobs.dm @@ -1,4 +1,4 @@ -/datum/job/counselor/equip_job(var/mob/living/human/H) +/datum/job/standard/counselor/equip_job(var/mob/living/human/H) if(H.mind.role_alt_title == "Counselor") psi_faculties = list("[PSI_REDACTION]" = PSI_RANK_OPERANT) if(H.mind.role_alt_title == "Mentalist") From b56f12a7db82b979e99f3e4af9a513b3438435a6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 21:19:17 +1100 Subject: [PATCH 47/95] Adding bellows. --- code/game/objects/structures/fires.dm | 14 ++++++-- code/modules/crafting/forging/bellows.dm | 40 +++++++++++++++++++++++ icons/obj/structures/forging/bellows.dmi | Bin 0 -> 848 bytes nebula.dme | 1 + 4 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 code/modules/crafting/forging/bellows.dm create mode 100644 icons/obj/structures/forging/bellows.dmi diff --git a/code/game/objects/structures/fires.dm b/code/game/objects/structures/fires.dm index e0fe3055aa7f..4e042f865077 100644 --- a/code/game/objects/structures/fires.dm +++ b/code/game/objects/structures/fires.dm @@ -70,7 +70,8 @@ var/lit = FIRE_OUT /// How much fuel is left? var/fuel = 0 - + /// Have we been fed by a bellows recently? + var/bellows_oxygenation = 0 /obj/structure/fire_source/Initialize() . = ..() @@ -138,6 +139,7 @@ /obj/structure/fire_source/proc/die() if(lit == FIRE_LIT) + bellows_oxygenation = 0 lit = FIRE_DEAD last_fuel_ignite_temperature = null last_fuel_burn_temperature = T20C @@ -308,7 +310,9 @@ return ..() /obj/structure/fire_source/proc/get_draught_multiplier() - return has_draught ? draught_values[draught_values[current_draught]] : 1 + . = has_draught ? draught_values[draught_values[current_draught]] : 1 + if(bellows_oxygenation) + . *= 1.25 // Burns 25% hotter while oxygenated. /obj/structure/fire_source/proc/process_fuel(ignition_temperature) var/draught_mult = get_draught_multiplier() @@ -413,6 +417,10 @@ die() return + // Spend our bellows charge. + if(bellows_oxygenation > 0) + bellows_oxygenation-- + fuel -= (FUEL_CONSUMPTION_CONSTANT * get_draught_multiplier()) if(!process_fuel()) die() @@ -461,7 +469,7 @@ switch(lit) if(FIRE_LIT) - if(fuel >= HIGH_FUEL) + if(bellows_oxygenation || fuel >= HIGH_FUEL) var/image/I = image(icon, "[icon_state]_lit") I.appearance_flags |= RESET_COLOR | RESET_ALPHA | KEEP_APART add_overlay(I) diff --git a/code/modules/crafting/forging/bellows.dm b/code/modules/crafting/forging/bellows.dm new file mode 100644 index 000000000000..3402f4c2cfa7 --- /dev/null +++ b/code/modules/crafting/forging/bellows.dm @@ -0,0 +1,40 @@ +/obj/structure/working/bellows + name = "bellows" + desc = "An air pump used to improve the heat of a furnace." + icon = 'icons/obj/structures/forging/bellows.dmi' + obj_flags = OBJ_FLAG_ANCHORABLE | OBJ_FLAG_ROTATABLE + work_skill = SKILL_HAULING + var/decl/material/bellows_material = /decl/material/solid/organic/leather + +/obj/structure/working/bellows/Initialize() + bellows_material = GET_DECL(bellows_material) + . = ..() + +/obj/structure/working/bellows/on_update_icon() + . = ..() + underlays = list(overlay_image(icon, "[icon_state]-bellows", bellows_material.color, RESET_COLOR)) + +/obj/structure/working/bellows/try_start_working(mob/user) + + var/obj/structure/fire_source/stoking = locate() in get_step(loc, EAST) + if(!istype(stoking) || !stoking.lit) + to_chat(user, SPAN_WARNING("\The [src] must face east towards a lit fire source; it would be pointless to work them currently.")) + return TRUE + + to_chat(user, SPAN_NOTICE("You begin working \the [src], stoking \the [stoking] to a hotter flame.")) + start_working() + while(user.do_skilled(3 SECONDS, work_skill, src)) + if(QDELETED(src) || QDELETED(user) || user.get_stamina() <= 0) + break + stoking = locate() in get_step(loc, EAST) + if(!istype(stoking) || !stoking.lit) + break + user.adjust_stamina(-25) + stoking.bellows_oxygenation = max(50, stoking.bellows_oxygenation+3) + + if(!QDELETED(user)) + to_chat(user, SPAN_NOTICE("You stop working \the [src].")) + + stop_working() + return TRUE + diff --git a/icons/obj/structures/forging/bellows.dmi b/icons/obj/structures/forging/bellows.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9e6031422efe43c048341449eab4a39b0e43af16 GIT binary patch literal 848 zcmV-W1F!svP)D@x2wg|Jao=_aM-Ejk;)3LelFl30svjIRgc*kSF~%=M9i2{k9SeDjt7s@bNpyYTf{O(myO5&6*GLiw4HjT0e23 z^@-zy!O=_)%xYt1nj|gDLPrJ>A8_yY>N#eUc`zvZnglVQ8Pns5&P)wwN`paJoECYn zjr+YH7|5+*vdQ+#(5>NZ_b}8$( za4|Zs7I}5X{xe(-WwZWQ?%HONr~PE1yK9|yZN9=ccpIBT8*M4+oa?;4S>X{=gWK)q zCOs7pj7P|wOD8?y7d|L$ykN`1H4INME-3us$Ogh!S$qfk8|)t}w~jYJp7e|PFO?YI zUpEl5Pb%?e5)GuE>FWj`zXLJCwGKA Date: Sun, 12 Jan 2025 19:02:51 +1100 Subject: [PATCH 48/95] Adding harvesting lumps of mud or snow from turfs. --- code/game/turfs/flooring/_flooring.dm | 18 ++++++++++++++++-- code/game/turfs/flooring/flooring_mud.dm | 1 + code/game/turfs/flooring/flooring_sand.dm | 1 + code/game/turfs/flooring/flooring_snow.dm | 2 ++ code/game/turfs/floors/_floor.dm | 2 +- code/game/turfs/floors/floor_attackby.dm | 14 +++++++++----- code/game/turfs/turf.dm | 4 ++++ .../definitions/solids/materials_solid_ice.dm | 2 +- mods/gamemodes/cult/flooring.dm | 2 +- 9 files changed, 36 insertions(+), 10 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index 8150d0abd34b..eeda1d4968e9 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -35,11 +35,14 @@ var/global/list/flooring_cache = list() /// BYOND ticks. var/build_time = 0 + var/drop_material_on_remove + var/descriptor var/flooring_flags var/remove_timer = 10 var/can_paint var/can_engrave = TRUE + var/can_collect = FALSE var/turf_light_range var/turf_light_power @@ -261,8 +264,9 @@ var/global/list/flooring_cache = list() global.flooring_cache[cache_key] = I return global.flooring_cache[cache_key] -/decl/flooring/proc/on_remove() - return +/decl/flooring/proc/on_flooring_remove(turf/removing_from) + if(force_material && drop_material_on_remove) + force_material.create_object(removing_from, rand(3,5)) /decl/flooring/proc/get_movement_delay(var/travel_dir, var/mob/mover) return movement_delay @@ -270,6 +274,16 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/get_movable_alpha_mask_state(atom/movable/mover) return +/decl/flooring/proc/handle_hand_interaction(turf/floor/floor, mob/user) + if(!force_material || !can_collect) + return FALSE + user.visible_message(SPAN_NOTICE("\The [user] begins scraping together some of \the [name]...")) + if(do_after(user, 3 SECONDS, floor) && !QDELETED(floor) && !QDELETED(user) && floor.get_topmost_flooring() == src && isnull(user.get_active_held_item())) + var/obj/item/stack/stack = force_material.create_object(floor, 1) + user.visible_message(SPAN_NOTICE("\The [user] scrapes together \a [stack].")) + stack.add_to_stacks(user, TRUE) + return TRUE + /decl/flooring/proc/handle_item_interaction(turf/floor/floor, mob/user, obj/item/item) if(!istype(user) || !istype(item) || !istype(floor) || user.check_intent(I_FLAG_HARM)) diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 2b5fa2c5063d..86ee065649e0 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -9,6 +9,7 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/soil growth_value = 1.1 + can_collect = TRUE /decl/flooring/mud/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!target.reagents?.total_volume) diff --git a/code/game/turfs/flooring/flooring_sand.dm b/code/game/turfs/flooring/flooring_sand.dm index 27084c19ecb7..6cc6f6184c47 100644 --- a/code/game/turfs/flooring/flooring_sand.dm +++ b/code/game/turfs/flooring/flooring_sand.dm @@ -8,6 +8,7 @@ has_base_range = 4 turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand + can_collect = TRUE /decl/flooring/sand/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if((exposed_temperature > T0C + 1700 && prob(5)) || exposed_temperature > T0C + 3000) diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm index 6055cdda83db..c4ff4b961176 100644 --- a/code/game/turfs/flooring/flooring_snow.dm +++ b/code/game/turfs/flooring/flooring_snow.dm @@ -7,6 +7,8 @@ footstep_type = /decl/footsteps/snow has_base_range = 13 force_material = /decl/material/solid/ice/snow + can_collect = TRUE + drop_material_on_remove = TRUE /decl/flooring/snow/get_movement_delay(var/travel_dir, var/mob/mover) . = ..() diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index e8ede4d119e8..241e7c64673f 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -138,7 +138,7 @@ for(var/obj/effect/decal/writing/W in src) qdel(W) - _flooring.on_remove() + _flooring.on_flooring_remove(src) if(_flooring.build_type && place_product) // If build type uses material stack, check for it // Because material stack uses different arguments diff --git a/code/game/turfs/floors/floor_attackby.dm b/code/game/turfs/floors/floor_attackby.dm index d023e3d2ee58..f56777dd1c80 100644 --- a/code/game/turfs/floors/floor_attackby.dm +++ b/code/game/turfs/floors/floor_attackby.dm @@ -1,10 +1,14 @@ /turf/floor/attack_hand(mob/user) - if(!ishuman(user)) - return ..() - var/mob/living/human/H = user - var/obj/item/hand = GET_EXTERNAL_ORGAN(H, H.get_active_held_item_slot()) - if(hand && try_graffiti(H, hand)) + + // Collect snow or mud. + var/decl/flooring/flooring = get_topmost_flooring() + if(flooring?.handle_hand_interaction(src, user)) return TRUE + + var/obj/item/hand = GET_EXTERNAL_ORGAN(user, user.get_active_held_item_slot()) + if(hand && try_graffiti(user, hand)) + return TRUE + return ..() /turf/floor/attackby(var/obj/item/used_item, var/mob/user) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 30e070676f19..0f666c9c437f 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -208,7 +208,10 @@ . += (reagents.total_volume > FLUID_SHALLOW) ? 6 : 3 /turf/attack_hand(mob/user) + SHOULD_CALL_PARENT(FALSE) + + // Find an atom that should be intercepting this click. var/datum/extension/turf_hand/highest_priority_intercept for(var/atom/thing in contents) var/datum/extension/turf_hand/intercept = get_extension(thing, /datum/extension/turf_hand) @@ -218,6 +221,7 @@ user.setClickCooldown(DEFAULT_QUICK_COOLDOWN) var/atom/intercepting_atom = highest_priority_intercept.holder return intercepting_atom.attack_hand(user) + return FALSE /turf/attack_robot(var/mob/user) diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index 34144fe83933..d9a4ec896364 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -39,7 +39,7 @@ uid = "solid_snow" hardness = MAT_VALUE_MALLEABLE dug_drop_type = /obj/item/stack/material/ore/handful - default_solid_form = /obj/item/stack/material/ore/handful + default_solid_form = /obj/item/stack/material/lump/large can_backfill_floor_type = /decl/flooring/snow /decl/material/solid/ice/aspium diff --git a/mods/gamemodes/cult/flooring.dm b/mods/gamemodes/cult/flooring.dm index a92973b1077b..71aff2a3ff30 100644 --- a/mods/gamemodes/cult/flooring.dm +++ b/mods/gamemodes/cult/flooring.dm @@ -7,6 +7,6 @@ turf_flags = TURF_ACID_IMMUNE | TURF_REMOVE_WRENCH can_paint = null -/decl/flooring/reinforced/cult/on_remove() +/decl/flooring/reinforced/cult/on_flooring_remove(turf/removing_from) var/decl/special_role/cultist/cult = GET_DECL(/decl/special_role/cultist) cult.remove_cultiness(CULTINESS_PER_TURF) From 20ff3ad63a6fb92f2dcdbcc8c6a8ae0ed5101da6 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 19:57:33 +1100 Subject: [PATCH 49/95] Crossing mud, snow or sand will leave footprints. --- .../effects/decals/Cleanable/tracks.dm | 5 +- code/game/objects/effects/footprints.dm | 50 ++++++++++++++++++ code/game/objects/items/weapons/broom.dm | 12 ++++- code/game/turfs/flooring/_flooring.dm | 24 ++++++++- code/game/turfs/flooring/flooring_mud.dm | 3 +- code/game/turfs/flooring/flooring_sand.dm | 1 + code/game/turfs/flooring/flooring_snow.dm | 1 + code/game/turfs/floors/_floor.dm | 16 ++++-- code/game/turfs/turf.dm | 2 +- code/modules/bodytype/_bodytype.dm | 5 ++ code/modules/clothing/shoes/_shoes.dm | 2 +- code/modules/mob/living/living.dm | 2 +- icons/mob/footprints/footprints.dmi | Bin 0 -> 1324 bytes icons/mob/footprints/footprints_paw.dmi | Bin 0 -> 1225 bytes icons/mob/footprints/footprints_snake.dmi | Bin 0 -> 3329 bytes icons/mob/footprints/footprints_trail.dmi | Bin 0 -> 1790 bytes .../mob/footprints/footprints_wheelchair.dmi | Bin 0 -> 634 bytes mods/content/fantasy/datum/hnoll/bodytypes.dm | 1 + .../species/ascent/datum/species_bodytypes.dm | 1 + .../tajaran/datum/species_bodytypes.dm | 1 + .../unathi/datum/species_bodytypes.dm | 1 + .../bayliens/unathi/icons/footprints.dmi | Bin 0 -> 1511 bytes mods/species/drakes/species.dm | 1 + mods/species/drakes/species_bodytypes.dm | 2 + .../serpentid/datum/species_bodytypes.dm | 1 + nebula.dme | 1 + 26 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 code/game/objects/effects/footprints.dm create mode 100644 icons/mob/footprints/footprints.dmi create mode 100644 icons/mob/footprints/footprints_paw.dmi create mode 100644 icons/mob/footprints/footprints_snake.dmi create mode 100644 icons/mob/footprints/footprints_trail.dmi create mode 100644 icons/mob/footprints/footprints_wheelchair.dmi create mode 100644 mods/species/bayliens/unathi/icons/footprints.dmi diff --git a/code/game/objects/effects/decals/Cleanable/tracks.dm b/code/game/objects/effects/decals/Cleanable/tracks.dm index 870df8fbbf12..9ef315bf7870 100644 --- a/code/game/objects/effects/decals/Cleanable/tracks.dm +++ b/code/game/objects/effects/decals/Cleanable/tracks.dm @@ -124,7 +124,7 @@ update_icon() /obj/effect/decal/cleanable/blood/tracks/on_update_icon() - overlays.Cut() + cut_overlays() color = "#ffffff" var/truedir=0 @@ -145,8 +145,9 @@ track.fresh=0 track.overlay=I stack[stack_idx]=track - overlays += I + add_overlay(I) updatedtracks=0 // Clear our memory of updated tracks. + compile_overlays() /obj/effect/decal/cleanable/blood/tracks/footprints name = "wet footprints" diff --git a/code/game/objects/effects/footprints.dm b/code/game/objects/effects/footprints.dm new file mode 100644 index 000000000000..a8af8a6112db --- /dev/null +++ b/code/game/objects/effects/footprints.dm @@ -0,0 +1,50 @@ +// Effect used to render dark spot on turfs like snow/mud. +/obj/effect/footprints + icon = 'icons/mob/footprints/footprints.dmi' + icon_state = "blank" + simulated = FALSE + anchored = TRUE + is_spawnable_type = FALSE + blend_mode = BLEND_SUBTRACT + alpha = 128 + var/list/footprints + +/obj/effect/footprints/Initialize(mapload) + . = ..() + verbs.Cut() + name = null + +/obj/effect/footprints/Destroy() + QDEL_NULL(footprints) + . = ..() + +/obj/effect/footprints/on_update_icon() + set_overlays(footprints?.Copy()) + compile_overlays() + +/obj/effect/footprints/proc/add_footprints(mob/crosser, footprint_icon, movement_dir, use_state = "coming") + var/image/update_footprint + for(var/image/footprint in footprints) + if(footprint.icon == footprint_icon && footprint.dir == movement_dir && footprint.icon_state == use_state) + update_footprint = footprint + break + if(!update_footprint) + update_footprint = image(footprint_icon, icon_state = use_state, dir = movement_dir) + update_footprint.alpha = 20 + LAZYADD(footprints, update_footprint) + if(update_footprint.alpha < 120) + update_footprint.alpha += round(crosser.get_object_size() / 5) + queue_icon_update() + return TRUE + +/mob/proc/get_footprints_icon() + if(is_floating) + return null + if(buckled || current_posture?.prone) + return 'icons/mob/footprints/footprints_trail.dmi' + if(istype(buckled, /obj/structure/bed/chair)) + return 'icons/mob/footprints/footprints_wheelchair.dmi' + var/obj/item/clothing/shoes/shoes = get_equipped_item(slot_shoes_str) + if(istype(shoes) && shoes.footprint_icon) + return shoes.footprint_icon + return get_bodytype()?.get_footprints_icon() diff --git a/code/game/objects/items/weapons/broom.dm b/code/game/objects/items/weapons/broom.dm index b19ef3bf316d..aaa799ed5a84 100644 --- a/code/game/objects/items/weapons/broom.dm +++ b/code/game/objects/items/weapons/broom.dm @@ -43,15 +43,23 @@ // Sweep up dirt. if(isturf(A)) + var/turf/cleaning = A + var/dirty = cleaning.get_dirt() if(dirty > 10) // a small amount so that you can't sweep immediately after someone walks somewhere user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message(SPAN_NOTICE("\The [user] sweeps \the [A].")) playsound(A, "sweeping", 100, TRUE) cleaning.remove_dirt(min(dirty, rand(20,30))) - else - to_chat(user, SPAN_WARNING("\The [cleaning] is not in need of sweeping.")) + return TRUE + + var/obj/effect/footprints/prints = locate() in cleaning + if(prints) + user.visible_message(SPAN_NOTICE("\The [user] sweeps away the footprints.")) + return TRUE + + to_chat(user, SPAN_WARNING("\The [cleaning] is not in need of sweeping.")) return TRUE // Sweep up dry spills. diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index eeda1d4968e9..a0ef788bc0e9 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -44,6 +44,9 @@ var/global/list/flooring_cache = list() var/can_engrave = TRUE var/can_collect = FALSE + // Not bloody prints, but rather prints on top of the turf (snow, mud) + var/print_type + var/turf_light_range var/turf_light_power var/turf_light_color @@ -365,8 +368,27 @@ var/global/list/flooring_cache = list() /decl/flooring/proc/handle_turf_digging(turf/floor/target) return TRUE +/decl/flooring/proc/turf_exited(turf/target, atom/movable/crosser, atom/new_loc) + return print_type && try_place_footprints(crosser, target, target, new_loc, "going") + +/decl/flooring/proc/turf_entered(turf/target, atom/movable/crosser, atom/old_loc) + return print_type && try_place_footprints(crosser, target, old_loc, target, "coming") + +/decl/flooring/proc/try_place_footprints(atom/movable/crosser, turf/target, turf/from_turf, turf/to_turf, use_state = "going") + if(!ismob(crosser) || !crosser.simulated || !isturf(from_turf) || !isturf(to_turf)) + return FALSE + var/movement_dir = get_dir(from_turf, to_turf) + if(!movement_dir) + return FALSE + var/mob/walker = crosser + var/footprint_icon = walker.get_footprints_icon() + if(!footprint_icon) + return FALSE + var/obj/effect/footprints/prints = (locate() in target) || new print_type(target) + prints.add_footprints(crosser, footprint_icon, movement_dir, use_state) + /decl/flooring/proc/turf_crossed(atom/movable/crosser) return -/decl/flooring/proc/can_show_footsteps(turf/target) +/decl/flooring/proc/can_show_coating_footprints(turf/target) return TRUE diff --git a/code/game/turfs/flooring/flooring_mud.dm b/code/game/turfs/flooring/flooring_mud.dm index 86ee065649e0..a4865eb5fe7f 100644 --- a/code/game/turfs/flooring/flooring_mud.dm +++ b/code/game/turfs/flooring/flooring_mud.dm @@ -10,6 +10,7 @@ force_material = /decl/material/solid/soil growth_value = 1.1 can_collect = TRUE + print_type = /obj/effect/footprints /decl/flooring/mud/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if(!target.reagents?.total_volume) @@ -26,7 +27,7 @@ var/mob/living/walker = crosser walker.add_walking_contaminant(/decl/material/solid/soil, rand(2,3)) -/decl/flooring/mud/can_show_footsteps(turf/target) +/decl/flooring/mud/can_show_coating_footprints(turf/target) return FALSE // So we don't end up covered in a million footsteps that we provided. /decl/flooring/dry_mud diff --git a/code/game/turfs/flooring/flooring_sand.dm b/code/game/turfs/flooring/flooring_sand.dm index 6cc6f6184c47..caf29c810493 100644 --- a/code/game/turfs/flooring/flooring_sand.dm +++ b/code/game/turfs/flooring/flooring_sand.dm @@ -9,6 +9,7 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/sand can_collect = TRUE + print_type = /obj/effect/footprints /decl/flooring/sand/fire_act(turf/floor/target, datum/gas_mixture/air, exposed_temperature, exposed_volume) if((exposed_temperature > T0C + 1700 && prob(5)) || exposed_temperature > T0C + 3000) diff --git a/code/game/turfs/flooring/flooring_snow.dm b/code/game/turfs/flooring/flooring_snow.dm index c4ff4b961176..834b109eea7d 100644 --- a/code/game/turfs/flooring/flooring_snow.dm +++ b/code/game/turfs/flooring/flooring_snow.dm @@ -8,6 +8,7 @@ has_base_range = 13 force_material = /decl/material/solid/ice/snow can_collect = TRUE + print_type = /obj/effect/footprints drop_material_on_remove = TRUE /decl/flooring/snow/get_movement_delay(var/travel_dir, var/mob/mover) diff --git a/code/game/turfs/floors/_floor.dm b/code/game/turfs/floors/_floor.dm index 241e7c64673f..844b479eaa12 100644 --- a/code/game/turfs/floors/_floor.dm +++ b/code/game/turfs/floors/_floor.dm @@ -172,7 +172,6 @@ /turf/floor/proc/update_from_flooring(skip_update) - var/decl/flooring/copy_from = get_topmost_flooring() if(!istype(copy_from)) return // this should never be the case @@ -199,6 +198,9 @@ levelupdate() + for(var/obj/effect/footprints/print in src) + qdel(print) + if(!skip_update) update_icon() for(var/dir in global.alldirs) @@ -276,16 +278,18 @@ return PROCESS_KILL // In case a catwalk or other blocking item is destroyed. -/turf/floor/Exited(atom/movable/AM) +/turf/floor/Exited(atom/movable/AM, atom/new_loc) . = ..() if(!is_processing) for(var/decl/flooring/flooring in get_all_flooring()) if(flooring.has_environment_proc) START_PROCESSING(SSobj, src) break + var/decl/flooring/print_flooring = get_topmost_flooring() + print_flooring?.turf_exited(src, AM, new_loc) // In case something of interest enters our turf. -/turf/floor/Entered(atom/movable/AM) +/turf/floor/Entered(atom/movable/AM, atom/old_loc) . = ..() for(var/decl/flooring/flooring in get_all_flooring()) if(flooring.has_environment_proc) @@ -293,6 +297,8 @@ START_PROCESSING(SSobj, src) flooring.handle_environment_proc(src) break + var/decl/flooring/print_flooring = get_topmost_flooring() + print_flooring?.turf_entered(src, AM, old_loc) /turf/floor/get_plant_growth_rate() var/decl/flooring/flooring = get_topmost_flooring() @@ -303,5 +309,5 @@ flooring?.turf_crossed(AM) return ..() -/turf/floor/can_show_footsteps() - return ..() && get_topmost_flooring()?.can_show_footsteps(src) +/turf/floor/can_show_coating_footprints() + return ..() && get_topmost_flooring()?.can_show_coating_footprints(src) diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 0f666c9c437f..1af79db070ed 100644 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -818,7 +818,7 @@ if(IS_HOE(held) && can_dig_farm(held.material?.hardness)) LAZYDISTINCTADD(., /decl/interaction_handler/dig/farm) -/turf/proc/can_show_footsteps() +/turf/proc/can_show_coating_footprints() return simulated /decl/interaction_handler/show_turf_contents diff --git a/code/modules/bodytype/_bodytype.dm b/code/modules/bodytype/_bodytype.dm index af6100a8d0a6..723cea755d34 100644 --- a/code/modules/bodytype/_bodytype.dm +++ b/code/modules/bodytype/_bodytype.dm @@ -41,6 +41,8 @@ var/global/list/bodytypes_by_category = list() var/ignited_icon = 'icons/mob/OnFire.dmi' /// Drawn over mob bodyparts when they are surgically open/retracted. var/surgery_overlay_icon = 'icons/mob/surgery.dmi' + /// Icon to use when walking across snow, sand or mud. Separate to bloody footprints for now. + var/footprints_icon = 'icons/mob/footprints/footprints.dmi' /// Used to retrieve bodytypes by pronoun type in get_bodytype_by_pronouns() var/associated_gender /// Appearance/display related features. @@ -845,3 +847,6 @@ var/global/list/limbs_with_nails = list( /decl/bodytype/proc/get_movement_slowdown(var/mob/living/human/H) return movement_slowdown + +/decl/bodytype/proc/get_footprints_icon() + return footprints_icon diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 6aedbb3edaf6..bd4284407d85 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -24,7 +24,7 @@ var/hidden_item_max_w_class = ITEM_SIZE_SMALL var/obj/item/hidden_item = null var/shine = -1 // if material should apply shine overlay. Set to -1 for it to not do that - + var/footprint_icon = 'icons/mob/footprints/footprints.dmi' /// A multiplier applied to footstep volume. var/footstep_volume_mod = 1 /// A multiplier applied to footstep range. diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 78ba364f39a6..1269e6556074 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1585,7 +1585,7 @@ default behaviour is: /mob/living/proc/handle_walking_tracks(turf/T, old_loc) - if(!T.can_show_footsteps()) + if(!T.can_show_coating_footprints()) return // Tracking blood or other contaminants diff --git a/icons/mob/footprints/footprints.dmi b/icons/mob/footprints/footprints.dmi new file mode 100644 index 0000000000000000000000000000000000000000..2d9699e82c8d7dc6b10f2196197de9f085068667 GIT binary patch literal 1324 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 literal 0 HcmV?d00001 diff --git a/icons/mob/footprints/footprints_snake.dmi b/icons/mob/footprints/footprints_snake.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6e913803eb12b23bd6f70e16f90bd7fb4fb06501 GIT binary patch literal 3329 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 Ay#N3J literal 0 HcmV?d00001 diff --git a/icons/mob/footprints/footprints_trail.dmi b/icons/mob/footprints/footprints_trail.dmi new file mode 100644 index 0000000000000000000000000000000000000000..944ed4e175b4a038ee4cc64174e1a7406b2ddccf GIT binary patch literal 1790 zcmVV=-0C=2z$~_K*AP@%7nmNT6?KkUBJIw}SDD)0SS(rjdfb3r1!otq-C9lQD zOm=~uE&W_Bk|G%6>rLt}dktU=J*nWthkBvZwK_1GEgcelLu!{?z!*t=^Ln@fMt3)# z9##vpXz1C}2}PGBK!S%&{{R36KuJVFRCt{2U0ZJ3IuJb$?kc*Ge6#=q_;wG<3fk}9 zb+q5PD~R`y7zly%qZ{cm>VAadj7CFAeAvvyJb+=FR%Ce&=fRnwvUz%X!V;WwcL2V4 z?>B7h007F^-h2P=;z>II09R`c^4@>--fu|g0XqP2&fSZ{x3wC=aj{rM z0L^km3-~eWc*i{cS$m)qu=oDfIS23ktvGa7<;pGuIVR{R;E3?MNlL(40tWe-JKvxk zedcFiZ4^YI=8lJ*3_t2!(q$n#3R28ZH$53B3PYW9&+KhCK^aITK+f`y{Eea&9Sc|; zhH^OP4&M8X<_{u1;?2T2_lWW8JsQc;Zwo=kPXNEX_y3iAe<}fFW_~IcXLa_=)X4zF zobumSbCQ+%09u@VP{vGvG+78$4ZCID%Q^QP9^Z4nKg$Gp?>~w6eD+VYqc)s#-{(}{ zIro^8kySFgKOjQvAnXs``&%i893&B-n34i66{GmJ@CTA*|oZ zSP__+*#Q{jxliF2Oc6i`=Ha&(ChbVhN%8tN_X)zB(Rt_6@yRen0Ik5avE13Ios&T$ zlRIpBo!y9FiU2@$vU1&#S`_+UoSSC&!~~rJ<_HKF5Ee+K&d_`RmA&RB&dr13F$2OdOxM ze*m?bwkmmNO#_;O<&FM?A$p$FN+M$uSWQK=#vU)ip9nd10oVyB!xo5|npJh_PCx>f zph>t zk(>HBixZYxm{{-49j{1P1@9qZ!>3&bC~e(K7`6Tdd;wsMfE_bC)DS=uDtWJ5HUYc~ zV5xlrdK%f>UV;E>U$0UYtzv?firJxkV~3aA{ahP}C42_(5c_a#n@Tkw!1jxMoarbt zk)tm}QdREc*-+`Aq`9)F4eU1z$~s^`LZeoZ287n^YlOByxrfSo|4GEg$3FbR?`>+v zc>K?=39o)(b#QX_dH`>LO^KajjkEN_TbCenCq+#kpf$`AzE#+Hvd2vJQLaSKjojar ztpUvZjM@X0kaWjhBOIT6vGQh7!lzI~V$P?OtOL{y8A33!QEJk)mME}ycQ=+|6T}^{ zu*({x09P&7!>W4@(Rlo=qnH3q6BcH5v7HvSp0B*kwW*lPhK8K{JzHOpbH9Z_^JJwY zIf|=WhnzKGP6L3~NK0ygMVKH!F86s6#Pa40zz6{xO4)Bvb~&1XH3FoQ-G_(S8iNS} zW@a^S3)wFm`zB$60O&1%k6;>L6;{Gf0IGSR*?)!CMp;v^q5)cdoeLiTu3Fa#a&Ync z18#0^nts0(4S2Wc1T;n`pfNfDjnN5cj7~sfbOIWq6VMpVQxWvf-@@Ciw&9t5zPjnv z3YrrTa7;BsvYFcFdkDfT;%o#^o<{ZrMOs;wx*G<(lmFOPvo%o)a8x|eS`&HlOt~H9 z(xx|aEhrkQ5TJCy#rii#_8v1q0M&ch^G4j5={DRI#aufgM{zck3FUKmet^;ks?1;# z{_&m*F$a6f#@p7}&>9+`?FpN7GK81Z;Y>HXAQH9!_Dn;zG~@lt-OJxiACN?i)a**tp ziTxH^TSB!f5IX+@`^>y)s_BH)u#=972`g5|jf9;=n>;kMcEU9XNL@ey(C@KE zQRu`%`(|kr!2-U8oe#0x20S*IsuK*322N?Kx1?Q8lw}? g7@dH|=ma#zUzqZ8vtSoXU;qFB07*qoM6N<$g6Nz<%m4rY literal 0 HcmV?d00001 diff --git a/icons/mob/footprints/footprints_wheelchair.dmi b/icons/mob/footprints/footprints_wheelchair.dmi new file mode 100644 index 0000000000000000000000000000000000000000..4a2e800cf76b3f865c20488edf485b72095ffcfe GIT binary patch literal 634 zcmV-=0)_pFP)fFDZ*Bkpc$`yKaB_9`^iy#0 z_2eo`Eh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+IX^cuFI|a? zGbOXA7${)D#hF%=n41b>8zPjY=i^bOtl;YB0=69hM(-s^i2T5;0004{Nkl@eKr3k(AfbrFOd2amodYYv z)35?{22{et0xf-XC28v7Y+yyW43ySQiOZAz07?=%4A8NDF)9*Yywj#tmM(={3Mu8v zi-+iJ95tS^9+j?ud1GqxH%P22^nSV1z?201Z9@$j(@!k!(bmSuU@9L!rpudj4Qh)c z_}-SFq#^GQkM+m7$J*fs$UCe*;tuPNOkE*22Qwm~P2@0Oyd2#i! zB-UeR>c=dsP!SCdYNjSEzia(2u7Q1A?xiY~KgZI21#W|plyksOCA!W4IF5SVIz_gH zqpinEPoDZ^qHoXzu1s)3|2bBni2@|gN>5|pK$YOEY@9v-J9k=|tBBf!j+<%M>YXQt zFTnO&d!p)(`vt^MIUS}Vq~!TXAf4lhY8I(WM-47!*vt=X=Er7!n3B!>`2YO)0=0dg Uj~DL4m;e9(07*qoM6N<$g4U@U@&Et; literal 0 HcmV?d00001 diff --git a/mods/content/fantasy/datum/hnoll/bodytypes.dm b/mods/content/fantasy/datum/hnoll/bodytypes.dm index 218068362ced..1edda9e8e998 100644 --- a/mods/content/fantasy/datum/hnoll/bodytypes.dm +++ b/mods/content/fantasy/datum/hnoll/bodytypes.dm @@ -16,6 +16,7 @@ base_color = "#ae7d32" base_eye_color = "#00aa00" uid = "bodytype_hnoll" + footprints_icon = 'icons/mob/footprints/footprints_paw.dmi' default_sprite_accessories = list( SAC_HAIR = list( diff --git a/mods/species/ascent/datum/species_bodytypes.dm b/mods/species/ascent/datum/species_bodytypes.dm index 9136d47e269a..87a8462b0f7d 100644 --- a/mods/species/ascent/datum/species_bodytypes.dm +++ b/mods/species/ascent/datum/species_bodytypes.dm @@ -30,6 +30,7 @@ BP_SYSTEM_CONTROLLER = /obj/item/organ/internal/controller ) limb_mapping = list(BP_CHEST = list(BP_CHEST, BP_M_HAND)) + footprints_icon = 'icons/mob/footprints/footprints_snake.dmi' // big tail heat_discomfort_strings = list( "You feel brittle and overheated.", diff --git a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm index 225bf5bc86e7..bd161dac4369 100644 --- a/mods/species/bayliens/tajaran/datum/species_bodytypes.dm +++ b/mods/species/bayliens/tajaran/datum/species_bodytypes.dm @@ -16,6 +16,7 @@ base_eye_color = "#00aa00" nail_noun = "claws" uid = "bodytype_feline" + footprints_icon = 'icons/mob/footprints/footprints_paw.dmi' age_descriptor = /datum/appearance_descriptor/age/tajaran diff --git a/mods/species/bayliens/unathi/datum/species_bodytypes.dm b/mods/species/bayliens/unathi/datum/species_bodytypes.dm index 31e9a0584382..12b4de66522e 100644 --- a/mods/species/bayliens/unathi/datum/species_bodytypes.dm +++ b/mods/species/bayliens/unathi/datum/species_bodytypes.dm @@ -18,6 +18,7 @@ eye_flash_mod = 1.2 nail_noun = "claws" uid = "bodytype_unathi_fem" + footprints_icon = 'mods/species/bayliens/unathi/icons/footprints.dmi' age_descriptor = /datum/appearance_descriptor/age/lizard diff --git a/mods/species/bayliens/unathi/icons/footprints.dmi b/mods/species/bayliens/unathi/icons/footprints.dmi new file mode 100644 index 0000000000000000000000000000000000000000..fe21767b108c5aba01c1a8f341664375424a6fea GIT binary patch literal 1511 zcmVV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex7wuvIWN;^NFm z%}mcIfpCgT5=&AQY!#G}auV~hmAE)lGK-28Y!wW-IMa#}b5kK~xT@s*+|0amgfbKC z%F^@ks8UvN^>a~h@%7{a0KM%m=5H1rMF0Q=AxT6*RCt{2T|I8=Fbt+2y7V*wGU-6c z;2tO$lEY-w6riU`w!R^v!N{`pW62U7en8Rsr;egelt_xCyW8ysTY*yQptZg#rT(_C1mJ&canw+QSjw?245!ev`0Q-s2eI|cj z=BBEaz>WZ|^^fNkB;ul!I+bqEQm`XnYGgkikDf@z*>z8gU`GJJXubykfZyNWVOk21 zl4kH#y8#KNj@1xfGTDmby!BPU|fSt~v^8uI<;F@~4gB1brT3ma8?U2ES0Had& zHx(Vt5h4MVAp}&05KtLHKxGI4l_3OFh7eF0PFDnVDsf77;D`|c#?tG_ z@x8@Z90d2l(mkI~G_n8SEnw9_nXY_QR z>YdEcmP1T`bsINdTaL6<#5`b`pu-^fOG6p9w11h$otj|47N!r{s7rsc$B~C+U zfY-h!%{*)ov;(c(sNT8{UCBS@J6;z`b+!QEO?X2sNhmt~%t?-E#|0pK2HC`pnAIVr z7hzv$N)*Hp%ZrQumUl!+09_-1fp$~^W*r$#L#fqT-UzUZ9ZjTy_VCiT*>wJHx1+H< z$!i4ZAJ;TQ19LA*sh};&f9Aos&v`^`!kjyr2jdTI%*p&TUlzt_b3Ir&#<6WjP0^!f zMpbJG)`H0N!^Y~Iu@e9w-PUoHMMJgS%9Qc;QSc(HweHNr22pNZ0<_jw(gE1{M{}*4 zm|`bE?jMCFrdDf-RzuAqM30+Y3#eXhfE82*3ni*DiXoPWT-92HfIv7@$}B}gHsK2@jgr+`L;~WFy;_S95RM|%T7-ZAl&sbw zYG`GM1XM;=0!n6-Zxy*EAi84Iry~miODaZvI&w)sa>b}mM@~yPxoFWRBbNl&J5AF0 zfyhDthcL!gky8sg*Cv7l3b4_@f(YQC-;=zC9$x#^QEjb7o_7%@YULF&hvhASBM>S% zuYr(-VJoYxV_shnAz*ODx+167c!QlCgzLCvQC@@3hQaTb^Sj2Vp*;Yct?HyX$E;i9pN1#F~`J&8t-zXgW~ac^h@#@JTHpq z%|IIxJ;?tZ;PsNZsHrO^GVYB8$H+*|IB5lI<{2PjLlXgDTJMid&k>~A0c>8B$pN{e zBAR@;Ld$s#QCpIp?7&sl0N(=W(9*Iw33KHcP~?<=Rg5(3K)PU(b0ZB*Db-uY$*Q9X zKOfdYlH8sgB@rtD&1yQ9em)mAm})6c<{98~&F?5;KPD=|5#6@bQl{>YWRLL25CD)~ z*kdNoU@<<5fF&qZl|=}s3<=Dt3?ZO0gn-Hr0xClYs0<;XGK7H2_zw$Q^J_R#+)Dre N002ovPDHLkV1ga$u_^!n literal 0 HcmV?d00001 diff --git a/mods/species/drakes/species.dm b/mods/species/drakes/species.dm index 970ecc2f04a3..cd9c4cb7b13f 100644 --- a/mods/species/drakes/species.dm +++ b/mods/species/drakes/species.dm @@ -43,6 +43,7 @@ traits = list( /decl/trait/sivian_biochemistry = TRAIT_LEVEL_EXISTS ) + move_trail = /obj/effect/decal/cleanable/blood/tracks/paw // Drakes must be whitelisted for jobs to be able to join as them, see maps.dm. job_blacklist_by_default = TRUE diff --git a/mods/species/drakes/species_bodytypes.dm b/mods/species/drakes/species_bodytypes.dm index dc5afea4ea45..1e36c0b15a91 100644 --- a/mods/species/drakes/species_bodytypes.dm +++ b/mods/species/drakes/species_bodytypes.dm @@ -46,6 +46,8 @@ antaghud_offset_x = 16 override_organ_types = list(BP_DRAKE_GIZZARD = /obj/item/organ/internal/drake_gizzard) uid = "bodytype_drake" + footprints_icon = 'icons/mob/footprints/footprints_paw.dmi' + additional_emotes = list( /decl/emote/audible/drake_warble, /decl/emote/audible/drake_purr, diff --git a/mods/species/serpentid/datum/species_bodytypes.dm b/mods/species/serpentid/datum/species_bodytypes.dm index 6c4e562b4510..0bf66ff375fa 100644 --- a/mods/species/serpentid/datum/species_bodytypes.dm +++ b/mods/species/serpentid/datum/species_bodytypes.dm @@ -63,6 +63,7 @@ ARMOR_BIO = ARMOR_BIO_SHIELDED, ARMOR_RAD = 0.5*ARMOR_RAD_MINOR ) + footprints_icon = 'icons/mob/footprints/footprints_snake.dmi' /decl/bodytype/serpentid/Initialize() _equip_adjust = list( diff --git a/nebula.dme b/nebula.dme index d65b82917962..bd2dd5e45db0 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1027,6 +1027,7 @@ #include "code\game\objects\effects\effect_system.dm" #include "code\game\objects\effects\explosion_particles.dm" #include "code\game\objects\effects\fake_fire.dm" +#include "code\game\objects\effects\footprints.dm" #include "code\game\objects\effects\force_portal.dm" #include "code\game\objects\effects\gateway.dm" #include "code\game\objects\effects\gibspawner.dm" From 3d39fb9f5d57bda46afa677bea8bd8907b71d80c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 20:56:31 +1100 Subject: [PATCH 50/95] Corrects a few issues with snow collection. --- code/game/turfs/flooring/_flooring.dm | 7 ++++--- .../materials/definitions/solids/materials_solid_ice.dm | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/turfs/flooring/_flooring.dm b/code/game/turfs/flooring/_flooring.dm index a0ef788bc0e9..38c781330e33 100644 --- a/code/game/turfs/flooring/_flooring.dm +++ b/code/game/turfs/flooring/_flooring.dm @@ -282,9 +282,10 @@ var/global/list/flooring_cache = list() return FALSE user.visible_message(SPAN_NOTICE("\The [user] begins scraping together some of \the [name]...")) if(do_after(user, 3 SECONDS, floor) && !QDELETED(floor) && !QDELETED(user) && floor.get_topmost_flooring() == src && isnull(user.get_active_held_item())) - var/obj/item/stack/stack = force_material.create_object(floor, 1) - user.visible_message(SPAN_NOTICE("\The [user] scrapes together \a [stack].")) - stack.add_to_stacks(user, TRUE) + var/list/created = force_material.create_object(floor, 1) + user.visible_message(SPAN_NOTICE("\The [user] scrapes together [english_list(created)].")) + for(var/obj/item/stack/stack in created) + stack.add_to_stacks(user, TRUE) return TRUE /decl/flooring/proc/handle_item_interaction(turf/floor/floor, mob/user, obj/item/item) diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index d9a4ec896364..7ca1d270b9a5 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -34,6 +34,7 @@ liquid_name = "water" solid_name = "snow" gas_name = "steam" + adjective_name = "packed snow" color = COLOR_WHITE codex_name = null uid = "solid_snow" From a607c728ddf115fd9a907c73fb429b4a6daab902 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 20:57:12 +1100 Subject: [PATCH 51/95] Adding collection/prints to clay. --- code/game/turfs/flooring/flooring_natural.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/turfs/flooring/flooring_natural.dm b/code/game/turfs/flooring/flooring_natural.dm index 9ca61af786eb..d88bd8c133d7 100644 --- a/code/game/turfs/flooring/flooring_natural.dm +++ b/code/game/turfs/flooring/flooring_natural.dm @@ -29,6 +29,7 @@ has_base_range = null footstep_type = /decl/footsteps/mud force_material = /decl/material/solid/organic/meat + print_type = /obj/effect/footprints /decl/flooring/barren name = "ground" @@ -52,6 +53,8 @@ turf_flags = TURF_FLAG_BACKGROUND | TURF_IS_HOLOMAP_PATH | TURF_FLAG_ABSORB_LIQUID force_material = /decl/material/solid/clay growth_value = 1.2 + can_collect = TRUE + print_type = /obj/effect/footprints /decl/flooring/ice name = "ice" From e93ae6631be7fd38873af494f0c3019caa4adc26 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 21:18:51 +1100 Subject: [PATCH 52/95] Ported snowmen from Polaris. --- code/game/objects/structures/snowman.dm | 59 ++++++++++++++++++ .../crafting/stack_recipes/recipes_soft.dm | 17 +++++ .../definitions/solids/materials_solid_ice.dm | 2 +- icons/obj/structures/snowmen/snowbot.dmi | Bin 0 -> 585 bytes icons/obj/structures/snowmen/snowman.dmi | Bin 0 -> 636 bytes icons/obj/structures/snowmen/snowspider.dmi | Bin 0 -> 882 bytes nebula.dme | 1 + 7 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 code/game/objects/structures/snowman.dm create mode 100644 icons/obj/structures/snowmen/snowbot.dmi create mode 100644 icons/obj/structures/snowmen/snowman.dmi create mode 100644 icons/obj/structures/snowmen/snowspider.dmi diff --git a/code/game/objects/structures/snowman.dm b/code/game/objects/structures/snowman.dm new file mode 100644 index 000000000000..60382df695cc --- /dev/null +++ b/code/game/objects/structures/snowman.dm @@ -0,0 +1,59 @@ +/obj/structure/snowman + name = "man" + icon = 'icons/obj/structures/snowmen/snowman.dmi' + icon_state = ICON_STATE_WORLD + desc = "A happy little $NAME$ smiles back at you!" + anchored = TRUE + material = /decl/material/solid/ice/snow + material_alteration = MAT_FLAG_ALTERATION_ALL // We override name and desc below. + +/obj/structure/snowman/Initialize(ml, _mat, _reinf_mat) + . = ..() + update_icon() + +/obj/structure/snowman/update_material_name(override_name) + SHOULD_CALL_PARENT(FALSE) + if(istype(material)) + SetName("[material.solid_name][initial(name)]") + else + SetName("mystery[initial(name)]") + +/obj/structure/snowman/update_material_desc(override_desc) + SHOULD_CALL_PARENT(FALSE) + if(istype(material)) + var/snowname = "[material.solid_name][initial(name)]" + desc = replacetext(initial(desc), "$NAME$", snowname) + else + desc = replacetext(initial(desc), "$NAME$", "mysteryman") + +/obj/structure/snowman/on_update_icon() + . = ..() + // TODO: make carrot/stick arms/coal require items? + add_overlay(overlay_image(icon, "[icon_state]-decorations", COLOR_WHITE, RESET_COLOR)) + compile_overlays() + +/obj/structure/snowman/proc/user_destroyed(user) + to_chat(user, SPAN_DANGER("\The [src] crumples into a pile of [material.solid_name] after a single solid hit. You monster.")) + physically_destroyed() + +/obj/structure/snowman/attackby(obj/item/used_item, mob/user) + if(user.check_intent(I_FLAG_HARM) && used_item.get_base_attack_force()) + user_destroyed(user) + return TRUE + return ..() + +/obj/structure/snowman/attack_hand(mob/user) + if(user.check_intent(I_FLAG_HARM)) + user_destroyed(user) + return TRUE + return ..() + +/obj/structure/snowman/bot + name = "bot" + icon = 'icons/obj/structures/snowmen/snowbot.dmi' + desc = "A bland-faced little $NAME$. It even has a monitor for a head." + +/obj/structure/snowman/spider + name = "spider" + icon = 'icons/obj/structures/snowmen/snowspider.dmi' + desc = "An impressively-crafted $NAME$. Not nearly as creepy as the real thing." \ No newline at end of file diff --git a/code/modules/crafting/stack_recipes/recipes_soft.dm b/code/modules/crafting/stack_recipes/recipes_soft.dm index 9672f23017e6..32422a175490 100644 --- a/code/modules/crafting/stack_recipes/recipes_soft.dm +++ b/code/modules/crafting/stack_recipes/recipes_soft.dm @@ -89,3 +89,20 @@ /decl/stack_recipe/soft/mould/ingot name = "mould, ingot" result_type = /obj/item/chems/mould/ingot + +/decl/stack_recipe/soft/sculpture + abstract_type = /decl/stack_recipe/soft/sculpture + one_per_turf = TRUE + on_floor = TRUE + category = "sculptures" + +/decl/stack_recipe/soft/sculpture/snowman + result_type = /obj/structure/snowman + +/decl/stack_recipe/soft/sculpture/snowspider + result_type = /obj/structure/snowman/spider + difficulty = MAT_VALUE_HARD_DIY + +/decl/stack_recipe/soft/sculpture/snowbot + result_type = /obj/structure/snowman/bot + available_to_map_tech_level = MAP_TECH_LEVEL_SPACE diff --git a/code/modules/materials/definitions/solids/materials_solid_ice.dm b/code/modules/materials/definitions/solids/materials_solid_ice.dm index 7ca1d270b9a5..a6b33d5a584a 100644 --- a/code/modules/materials/definitions/solids/materials_solid_ice.dm +++ b/code/modules/materials/definitions/solids/materials_solid_ice.dm @@ -34,7 +34,7 @@ liquid_name = "water" solid_name = "snow" gas_name = "steam" - adjective_name = "packed snow" + adjective_name = "snow" color = COLOR_WHITE codex_name = null uid = "solid_snow" diff --git a/icons/obj/structures/snowmen/snowbot.dmi b/icons/obj/structures/snowmen/snowbot.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c209cf5e868791a6454aa8b2a444ffcbfb44255f GIT binary patch literal 585 zcmV-P0=E5$P)-hNm)#dN;@%jAx{mm&`^@6&`T6|K;_UYJ z`|0iW;_CF}>-F^X`sC~M(BtiEKqS`Y@5kWj+vxG!=<(O)@6O}w?(g`+-{|x6`oP`i z^78ui_517Y_wDZZ=WOu#0RR910d!JMQvg8b*k%9# z0C;*-Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1D@x2wg|Jao>87M6 z=NBcG0F5ukr9)Z4)z1a&5CAz_DZxi#;(`DG0OmlD<{gMHV zrUbqz0t6v9L1cMVgkeL1K~n-Hr2+*15aYy(N9owo^$!yoZP3$fruBUIQiMs#$03785{}NVxBk?*l`rfY^?Td_ XEV&D>c1KYj00000NkvXXu0mjfw*xoE literal 0 HcmV?d00001 diff --git a/icons/obj/structures/snowmen/snowman.dmi b/icons/obj/structures/snowmen/snowman.dmi new file mode 100644 index 0000000000000000000000000000000000000000..c174da4bb4d018d7ce12ad9181e264d553a48e39 GIT binary patch literal 636 zcmV-?0)zdDP)h(Up5i?^C?`dUi!&v&s2IpM zK zlj%;wFc5@2b<#QsBrTypfnIDlO*!BH-Pq+QxUr+k{6Iqeq^QxZcRaI7mD;i6KLYfA zGp;q5Bwio|`U9BgdGz@H3~3%bQG7lDwBC~l2n#5+&wRa?Ee91a`72MpihqeJt>0P3eseyGn_lwo!Ar$5t`HY7kHnAb#i|eD2^p6mo zr=RtebLu%PKs+gHs9(s2Pjy=uH#IViSOGFi{yUl3piAI2+_IL)kYJ-6Sce#ezv2xI W#182Isj|-i0000GS35_2TOE_4WJz|Ns8}{`~y?@9+6MJUm53McwG~*yr%`^ZM=X z`1bbu;Og`0?e{)DK07-*`uhFs?)U5N_x=6;@bLLTK|w-7Lh|zZ+2`=#>ht*c{P*|# z@$vcR?Djo9JwHD`-01S|@A&!o{PgttMn*>3=ke(6_S@+3KtMp(=I~GP62|}l00DGT zPE!Ct=GbNc004M;R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5;&r`5f zFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3KBSJijO>MTv_uC9|j)$T#HTOe;#v zO@**gRq3XrCg&F=mH>?}#-&49!PU<|DsTPeXuV&Z}T00IU{L_t(YiS1O;a+@#^ z6i5R0P)aaLiz}tFKuKg%JI(+9T!lM*h#?)OkDY25V2;~mwRb1R{;z*-WjPnJ_zhB^e7MwCEZOtTQ}*TgL8K3KEP@ByBx{Hf_HN-K#N1uy-$qT!jnJhR6&e2~!5CG>#a&`}ti%873CzW;hG zcR|+Uc*xHV)x}OpOzdb!eA>DR<20#i=mF!o zMsktTOyxa}kP8LZNxEC?q0_YYqJGob%nEFyvp3NbqB6I+&npUmA?_QdO=Qvqu8$#S z8q&LDM!lts2qpHKY1JOQ-9>Rxd3;dZr>>6e1_CIjN0m+?-AX1?`x9r}MaFFpu5N97 zSy~XLj47y@piJoNl?%^wNZ9*Mz0ZDJdJuiOQU1o*>*057KGS5oo8J}_xxQ#hG}*h5 z7_aL6COnLgx3Sj>)waJg=8kIRN4y%sMuI~4m7yswTyFsX1pDeHaB#qF>i_@%07*qo IM6N<$f;+s;iU0rr literal 0 HcmV?d00001 diff --git a/nebula.dme b/nebula.dme index bd2dd5e45db0..e1fd95c3552f 100644 --- a/nebula.dme +++ b/nebula.dme @@ -1483,6 +1483,7 @@ #include "code\game\objects\structures\showcase.dm" #include "code\game\objects\structures\signs.dm" #include "code\game\objects\structures\skele_stand.dm" +#include "code\game\objects\structures\snowman.dm" #include "code\game\objects\structures\stasis_cage.dm" #include "code\game\objects\structures\structure_lock.dm" #include "code\game\objects\structures\tables.dm" From 09bf4913c483c5f9ddc0e33ffa4c8868f2ad5145 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 22:28:54 +1100 Subject: [PATCH 53/95] Fluids will now show direction of flow. --- .../abstract/abstract_fluid_direction.dm | 37 ++++++++++++++++++ code/modules/fluids/_fluid.dm | 15 ++++--- code/modules/fluids/fluid_mapped.dm | 2 +- icons/effects/landmarks.dmi | Bin 14336 -> 14657 bytes icons/effects/liquids.dmi | Bin 16119 -> 147607 bytes nebula.dme | 1 + 6 files changed, 48 insertions(+), 7 deletions(-) create mode 100644 code/modules/abstract/abstract_fluid_direction.dm diff --git a/code/modules/abstract/abstract_fluid_direction.dm b/code/modules/abstract/abstract_fluid_direction.dm new file mode 100644 index 000000000000..7dabaa77623e --- /dev/null +++ b/code/modules/abstract/abstract_fluid_direction.dm @@ -0,0 +1,37 @@ +/obj/abstract/force_fluid_flow + icon_state = "arrow" + +/obj/abstract/force_fluid_flow/Initialize() + ..() + return INITIALIZE_HINT_LATELOAD + +/obj/abstract/force_fluid_flow/north + dir = NORTH + +/obj/abstract/force_fluid_flow/south + dir = SOUTH + +/obj/abstract/force_fluid_flow/east + dir = EAST + +/obj/abstract/force_fluid_flow/west + dir = WEST + +/obj/abstract/force_fluid_flow/southeast + dir = SOUTHEAST + +/obj/abstract/force_fluid_flow/southwest + dir = SOUTHWEST + +/obj/abstract/force_fluid_flow/northeast + dir = NORTHEAST + +/obj/abstract/force_fluid_flow/northwest + dir = NORTHWEST + +/obj/abstract/force_fluid_flow/LateInitialize() + . = ..() + var/atom/movable/fluid_overlay/fluids = locate() in loc + fluids.force_flow_direction = dir + fluids.queue_icon_update() + qdel(src) diff --git a/code/modules/fluids/_fluid.dm b/code/modules/fluids/_fluid.dm index ef3d0259a0d3..13f78edf239d 100644 --- a/code/modules/fluids/_fluid.dm +++ b/code/modules/fluids/_fluid.dm @@ -13,6 +13,7 @@ appearance_flags = KEEP_TOGETHER var/last_update_depth var/updating_edge_mask + var/force_flow_direction /atom/movable/fluid_overlay/on_update_icon() @@ -21,9 +22,9 @@ // Update layer. var/new_layer - var/turf/T = get_turf(src) - if(T.pixel_z < 0) - new_layer = T.layer + 0.2 + var/turf/flow_turf = get_turf(src) + if(flow_turf.pixel_z < 0) + new_layer = flow_turf.layer + 0.2 else if(reagent_volume > FLUID_DEEP) new_layer = DEEP_FLUID_LAYER else @@ -49,15 +50,17 @@ if(new_alpha != alpha) alpha = new_alpha + var/flow_dir = force_flow_direction || flow_turf.last_flow_dir + set_dir(flow_dir) // Update icon state. We use overlays so flick() can work on the base fluid overlay. if(reagent_volume <= FLUID_PUDDLE) set_overlays("puddle") else if(reagent_volume <= FLUID_SHALLOW) - set_overlays("shallow_still") + set_overlays(flow_dir ? "shallow_flow" : "shallow") else if(reagent_volume < FLUID_DEEP) - set_overlays("mid_still") + set_overlays(flow_dir ? "mid_flow" : "mid") else if(reagent_volume < (FLUID_DEEP*2)) - set_overlays("deep_still") + set_overlays(flow_dir ? "deep_flow" : "deep") else set_overlays("ocean") else diff --git a/code/modules/fluids/fluid_mapped.dm b/code/modules/fluids/fluid_mapped.dm index beab9fe50e0c..5ea97d7a585f 100644 --- a/code/modules/fluids/fluid_mapped.dm +++ b/code/modules/fluids/fluid_mapped.dm @@ -17,7 +17,7 @@ /obj/abstract/landmark/mapped_fluid name = "mapped fluid area" alpha = FLUID_MIN_ALPHA - icon_state = "shallow_still" + icon_state = "shallow" color = COLOR_LIQUID_WATER var/fluid_type = /decl/material/liquid/water diff --git a/icons/effects/landmarks.dmi b/icons/effects/landmarks.dmi index 7c5729455bf6898f3ebd574cfdb39f4e52ffccbf..28317726409f718b37020ca5fe01c63e1ab32c55 100644 GIT binary patch literal 14657 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
`jhzK=&vz8t^^G`?U#-S&{ z8eU0s&g#`iDqyTM>#BYy3AyQgEf6(!z)cQ4nJV&rRjt~# zVOOb1+|_&2I+Lf}ON^=`H4=`SZSbon5kl?uOCTHxp4Jiw!j4Q4#WxpUm!4umK?=-} zqhjC#gE&eSHMNzBsz0oJP!g=nq-aC-4%Fldl0HzZt;n*nwOjir6%=#Bvg!QJcfZq8 z;DOaB1zpHlgh1dAXj^;l4-&EMkgJq$U=PZM#0CBp=llD%l8hSoWM)(@l?dP8s(hiz zx{eQd^q30^RqQzs%|!WHPAE-JaV9duRPC&Hlj^cKxCv>uuVd+m@~cqz!9zCwAs{%c zRX~rZFx$-1vqg_ee9lhiR`UL6kTm7$sV70N9z6ha?|l)S=Dj(8B51mfM6BuZfHf?s!VqUo`nOqL#a|d2$^@SZCxm^o{LFAe5EG?FFw%9<4#weuIWBFDzY|_=B3uFXkKNj-*iL!8fQ?gH;!f0%+SQ-{B!#SzOT~(I*~s&KO1Kp8b~7H z?mAG!N+pmO1wy6LYj)sep@&S63C~i|;D4*KV5uiWrN$O*a(A|ZRM+H4%vudVeLD%mYrv1w914e zh>)1Hm0|5$wUR+xe|w+P#sODP;g4GiCh_$B1Kunst+bD$j4IRby%MNvw5{15{JU;S zcmf*`Mp0)R@w}bVy`m%M9+%7v$E76q-ly#dzHAt&)LVJ3-_6FhEK%v`X6v&HvwpkjZR%Ww`USDtA=rp{3x@B)Gkg3a#UJ+{5(h#K3g|x*hH+~+2m;=90{oa%xhMFZ37&(_ zn|e7OUOB&n%>!XpMp%%Suj`&?{=xzK@NfINo1d6{y{_3+DV5Dv8-}u6MU-w~>`%W- zywEog_F))L?X>@IO176~5b$nZn7mGLkD%aobztM`M@{05)n|9$)6$8*Q6A_yQB|h9 z&)L$I$z+b~T;IcSA&OS*6-7BagVtRs7{^;#9ZlqNGNE?<0Rt+d#8zxxHlZsVX2>=9 zuIy3Y(QYcr8F_}M>OyZ)J&QO78}JVtm$CTk za=&8Ejo}Pf4!Z3kZ)f=}6jzRvK(WEKV>?07vaiH&(4h_=XA=lSV=@I(`B)R{|1TL& z;k%Xx2f6$PB@TZ<@U-Hn-*6zm`g0k|!kxIQS=l;cIjDaHA+4~bv(8CDX{KBuY|mN7 zTtcI#wAcUm(DP{fAuc@2n2;D#*KL#l`%FApa1VUGfEEKlCO-PAMc<@-9y$xL`mI~n zzVsFwBBvq$#mG0I)ih1D(RxK+UYteq5Ab?ryAc(#&yl)5c8upRwBs`dROZE~CR+mY zJX-+eZA7A{A$1@?lvvue5-S|;y(Hzy)K)UbKX*eM>M0-?^h9YB*&E-8FyuC+fHF+; z94!Av*SSd&H7`d3CELwf&T;69n6DV(b%$Cm19%HUh>@OTPxm*mX%|)NBJ_}tXWX>#&u6QLLnN`C>WUVMU+IC^-6{OEn+4Um>6J=Tzd^vtGaE2b#y4^<^YV%9}%mI8zf3p?` zJH?p%!-lMcLwqez_dwr|`N4H$3-5y7*)P?;>~CHyExZ*6yHC>mx*2|Ohl}s8+F>?5qy+*(*HUwIu=pEY9(Rtxj2#_iWwa7uloP_g{F>$YitXQh(b9^3UN?TFE9yT~ zx+RJDZXbG+o#I=?v3{$)G-J$%u(wTKv9vV%)u1Isr?g~z?SE;fmMKf!CV{}*EamC*D3y0k08zdVk1#RI4n ztxxB+<5|N1ghe*yl}Jx<5-6%K!$5I{O2PNP3=$Jtww6g=uEfWWTY~xXa>MF!1$;Hv zXyX73E_nAKZ)R3HO}?$0G&$#(aPDiWlf|Stj-(VnGMAuFi3u5KFw)&vHTM55A*5Gh z5|Kj)@6wVlFJRa>T>0LSirPKTKpx#K6QVOnT&mz?;K|d1blST<#Z$Ftbz-cg%bwnJ za6U`LaH1@(Dg>v0t~RW;v#hM&9+Vjb4LS{253%A3Ll;J(u)xF(N;-~%P(mY}u%OX^ z&517Bn=MF#C8O9*1INhi3~99AG#hd^8WR2-J}x~cQ1%4D|48Z0f=jleREagB{P3)2 z-14gM`;%9OP8ehVyxzeVg;Wd0V~7f`2vmR2-lq@2d=zDLO8P1WoH9Sxy8R!KPONTlpH3Z7tY^SJl`4R$z+&P{C^D)u>&E{H&ZhJwBBsV2xL#YY77LW=FO%8Ib}-veiszOO!d^s2hu zBp01XxiPZ1(&GI2`{U}ReRbQ<1JAx=?I~0|9Sl6A^>5J&*{mjFG`Sl=ms7E}sLPE! z)pc}gxrLrfj%4;(jskb4o8v|5Oht5;(aQ1u@fW>wV8u{eAAV0!#Xk3yxKiOlz<>VJ zkc8+3KI(8hi2QLY{l#e+(QlGWxAi|JfSxkFAnv-qA zo2**mR2BYiy_*@GNDgM!4^AyxE@xlbw!RPx+pbLFCK3^#5wO{;dg0PCrz?e5%T;N0 zD)@y+4)+2r`UN2}2Dqt5FGyLF&qIkWQgKb{VCurdMmb;T4g$3qXC^)zNmrdHg!skc zXF|gUCi58&)j@ct<9ir#eKquX^a~mewRZOPgm+4Y+yBP}Fg$EXg4Sr-xVdAs@-BuU z-}iSVA}1&uoRC&RPmcm@zlC0sD?v#=++XzMNX2l&6^#^)@Wit+4^6oh}r9rz>NHKlR?N%*%ikeL>F{~~9)tHyHp<(qq? zJun}5lUGjcc_MEOX8PIM(tUsZ{>Pmin9E{I40?G-Z(Y4l;Ccns|9AnsQxr4rP41Lo zO9ib?=WsSU*FH4+$@+SkK5%2p$xqhCAGa5`1NrPxTz-l2awK(<92t85$@r6Cxn-~F zSU$?V{W7Guex693=yPe||P? zzt=QsV>`!{lJx?J%L4aN$`-jzfJZ-nwYLFiCT^RY%au@+)6(d-y9=zq@X^A0FlCAZ z7|_878geENCGzPrZ;_TV0Ml6sFtfecz{RCs_V65f*d2IeCz(FWhiWDUdzX~u@+7Lc$7PmDX2G#e8yL1!tj*fN z3TU6W#6{)N+b4&di;BXmIu|)~>U#NwFWwR}7JIXWht{`?z?zrsgOQm9Pa4vrZMI>$ zSrM~;N-LVR>t&vvv;4>g(-39sFHu_6`Tp7>FGI%6;gGz&zn+(eRhUk#;E@@j#X7smx-*7l1ntSCZEc`imaqXODf=l3n~o=!s+GVsb(8!QDh|fRo=YwOyGVFrIZTfNQ4(6 z-i%063*Pbk86&GayC)}W<<>S!ANYp?0JyQKr>$ic@M|xG_9J`W3Ea>FNz+AtiN$0T zSjatYm(3h0pw_u5E5>r7`&K)R^2(d*EQaHQxp&oK-iQTUE);{5QwxZ#^1`Znw^+f z9jHElibmsZUBvf!QBdW1?*6o$G*ou8oZ=nR(G)c_HoL9U46pkYA9_D4uk`iQQzdeF zw;&}8VpjRXp&662US&_f_O``(R#s4vfdt}B4v4*8r%*gEMa*=HFd6jsV+JN$g=0bS zn(q{QZahoA?X)f5+%HzIw%H35_Fi_s4hU9uDwT)HResH@Fvq(qGE$pO$e2up*J>+~ zOSwI{`~1~KMOoP!4@$EMr*@mSts|}dTJlm#2~Ixm=OpB>8gCgajz~E_#3eGVxyB+j zdQe$zlkwbS_IN)AieZlW{`2aaDJ;f%bp|Hy>ti01Mp@-ZCq7Sfq3r&&wLu=N&UGv} zJNNV%rCE@DHqNR>ng#W}h%id=cqS`rR2p%O>@H=b6Y40IcY!7*4UtFH2UodjtZjU+ z{L7fqCtT`V9nDe#!#kp^{)F=h^SGRDTnQxZCwp9pxcQlJ0gWbC%a%60jU2lE&G zkDaea%DPjgbOW6M@;t>co{=s`xqN&_?Q%D0@(9IIWG(FgI~`4PydNK#`P$5L%5DiT z>Rw4RQ*i7j^7&UX6pNXL&(y2p>8oyeRx1+nxML24@~*7`x6h@!XkMGc>~w@G4|n9r z9ny2Xdh-aC8-M8ErZ){4K5;gttvo=+z$Sf$9rrJ)*_Um>TTyf7E7bfFUcKhMCRudU_ps1(;ucNED@(!u2{G35l41WmIw*_Xeijo*a_&qoJqA$ui_6V32` zL4eQuaJ=6QhI5y)d5OFT6qg-^a+P_ z4m)gVnWHu|l$=LfZ)nV{E>yqV$s4+gQr@vxZ;9mgRBcH^y;fcxTHqo@nCD z;{g_$cEi^Eg4M(A)TEoW`O3M2~1L0b5s%$&(euYuOvuy&%H8U zBxc`w>)PNc+{VJKhGYM=voUZkef0g$so9&uZZFa;cR(7^4Wos3HTbSj_HllS0yv~0 zu2NDs#{=BRbdW>%4^R=*`@myGrqT55-b=<+q%Yq&G@brro4?|a@|G@<;9e+YR5bs+lgpn7068LX9BvdyTA&R(!TzdULAP&LE zH_z2fEOhUpa5q1#-^aS?w?&iN*F$A%LdGHh2%D^=`v(MRShesULdYX-C4^q6Ap(ULRgp&bR@*7;uRMgV|C+phW2p5agh@47 zCV0i#=iptO-gYAUxoV^u8!wmbAK^bg6Dm)gsJ9+&4!x%bpXa!h$>u8F!u|qRiGklA z+nV4J(24qEL4j9I$XW-$r-RW9?9c}%=Y43Sy~~XA%bua9MWG@e_E*{;8x!kb7CXeq zD!A(wGXN%TLY#I45DG4+qRF)4pfL`@%x#0wPiHmR@8hi*jC-gGG>c>;U`cS+ z-#Yd%yz^m?O>s(LlEyE;;GOe6%y? z2NBq&s8N`(*A(wv_m2_ep?*cfjE93yEVqoT9v%a52XFz}97Y;N0LKO~Db{OOwyryg zTajE|nh+c5&`C2`iE*?NO8`iKB{U?|2t5<6{^;D>o zQK&1&qiW88CU9e4IaYP|)8uq%i-{e%3nY2SF3$~y$29DM6@iKEDSu^)%%} zM)h`u?sM^#%SgF7>yKBeOFC&bD8c|AUw()@3s{T~6Cl?%gSD|+HL@66FI2pgu8BR& zl(}@niSo-~gk};lEr+X^P~Jmluj!DFbtOL{SUolw@2XZz4gTRJ67fL509;+MWqHVO zZnz&oFfNiy{|V1cd`-A)%kY{?`E6V--(6+HWIZ{y7dIZlPv)a1F0=(DRN7R6>H6~)B-{VIuzyhv90uxyHWN(I@3KH=t+`$F0c+`&YK*Td&yefq`P9+K z$qTs;e|9}Y7dy`O?gabNY#X|Fg!_8Kk7|M$_q!B+nucE1yzY{(BFgPl`80yBt$mYY zk~G~Rmyt}>1kwAvavT!!bXN+yCS>$ccV66a9tqQ`**cD@z%<*w914h8a73@(XwbPE znN&b%NznY6pxzSycUzpG>8_||dB~H70X1iqk^$DhxW$OAc73CLBiJS{ow+sS1%65P z7{m2y7L4HivUsUes#CRiLCgDcscr-F_OGPo07xymLl4;LRb4}CyXX`plvnZG=iO)7g zdzg2ZS(m?Fq}AkK45eT)wt)ROo6JM~z?L1F`Ui!;{6KqndO9YZrCgM~j(5r4%S${8 zz6^LA5SW@o{qg=a_$HapbXiGiMgN960K+bn1Ly}lp|i6UW`58$tk>^C2Hc9$Y`-C~Jyp&B;KzQAI)XC~f754B>nzn(@Z;S?o?9QK2$6OvSN5p}~H^G(yk-(aQgCl2Q;CQ^mcFI`fJB1SX>SV0O6n??!XO* ziYN~Gx$mTIlFOLa4z}>LoNaXuD$>MnHFeZ1zU5LQvzERdnhvC85pUJGy#Ed|850$q-@{|HBGdD#S6~oDHotQ!4HRZUl&{|XB zu$)4aIF3)Nm391%L#n}KFAO$)N6T-;vWM*QmzPP+gz<>FOIjY4O!_cLz>;XtF4sNp za?A<)ECD_+5sYCtW8@x0NeOiNb`9PcYpr8JS@ zhMM+aT5Us{M=C=i>9C{Tw_YhC2Q&Qe;OX3VW_wrY`op@JmaCRhVQ@3!ZZRylr2}rT zlx5U{I}>`7uYdh{m=9O(k@pc^k(^O;g0Q(~=YfxwR5*8)HDiOBdE<0?;E8dd?46rE zbC&00P4~O2Ll3L(uT|?A(@K+prK*GltHnl=JRO-E2+rx%V);2u4>5(yx0=3-4kdY} zFJ!>E*DCZn1*$~|rA>*Y8+x&zd0sLb;`XpBQLTTtKPhTwb6c|Du&~j;W)1WJAG37C zJu>nTJqy(1%k8`j7%T*8*eb6j{(fcM^kNBxr=()wexXfa&GQ~K|A#nqIB8jNs60^l zT91cpp6>@V8h~r9ScC*@MT!O!mTCs}Pyfui=IZe3l~+~myYKHQQ$sZ#54u-(oJz~W zeDq+)L$vi}L$r-sL-zM~EnTDtm~z7LbSYu%x|G91ozAqwOddcof!L^={pTe00e{DK zy}7$-nHj_q?+?Lb2F@^^_HV(THNk%%mD`TKoeX5ZXu~vC9fTfJw_dEbF7%X?%PQ|T zBN9K%p}!8{f=z#WM!cVpD|Q`Cb;6_a_d=*kh;IVu*j7WI;c9$ z7Yc17QIx~M-?7(lkFa-udp9s?sqiMx`Id{(rnCJ!t*_LZ&^YPppb+9Dd}luYPP7;Q zRME(<;^N{=@Wt_@7n9mrTF*SvbPnb34Z-MP(;fC!A6}hz3B9dr9sm~ZO#6uFPs_RR z6wS$zExX?ACj9sjUY#-Y_ek#4;pxu2#_49^`7ytn~{7>WGqub8E zX}SNXBzEoW{O}A~?TXGItRdn1A%5qS0m%mItEm@+&Pr?54pk_wc*dgR*ZI+B8`&#c zY{UUW>TgnEsmv}-{YwgS-z%C{wc1;5SIf3D(@5X&qP&u(ezuoxF`ekwKuBqvJ58`a&<{gWv`8g_`}(cdM4aU5uo{Z#~tyL(xn1$F9S}`qk`2 zQL2%~$<$@_U_o!+^U;Hu7No}awZ#ZD0>0kvsN8Y3uZom`t~W=t`i&i{|M^*EbHi(P z?a-TKaSh!=lmY?vRqdIU;}-13{>=I}+T{`uS9!vk(hyGpw$2M|#Fmxgq~H@3!T_)m z<~Z10Tx^u2wq3f9ejb9(R5ob&lR|&31+)Gf-41TQGoU^c7Y9*k-B?nWJ)4&8-y8k* zv8K>Hvr2c;PB---B1^Ms>wG;+={;&r4qt>q!G2#DwD0}dxYkanT@Kr;Vlhdic-+^I zy1N2JY#2%#+B}41>)V=7#7*FShqJ_(;^U|msk!0<0!KwNJ+@%?u(Pcytxky}YkwYD z(JW^}wJ#&3_=x63tnvanEwsV^cEtuhv>Yw=Dwr1D1F98Q*AN+sgUOYog z1p;psK}I z3t1Qk-QtBS@r5;|lkQOm_^=>HX<%l5zh!USH1{NzLmIXxb%9*4ZC}?<(l{I})=TwL zDLxCcOPucrIonfx1^Y9Ih6S@pC~=4H`OjbfjLwh7s(94CoTr`{{fOyrz&2*1?ct2e zWbQV^5BSa0Y#u7k48hs^4_7?rwPeu8zBh=^6v_1@;Cc)~nIj=L2;t~zpNs4pzJoX6 z?f48yQz8zxB3o_Uep2$!+BEI>!grfR0V!b$( zied8{HDhnH%lo=fFlhJt4sgeN^VN)kO7K#5WKuKTgLMsj!1*~N(C%V6P9JDn|7@BW zyRa<2ap8>k;MwMVR^WPJ0$$75y*BWJAL|tRiPKL^K+h`3srn||gg+Ef?e2jzI;%kt zrgEPKec}DY8gA7BbW!picekN`%*hClnYwvoPp3D&g3 z�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 diff --git a/icons/effects/liquids.dmi b/icons/effects/liquids.dmi index 965e319bc4afe74e64df22742346f9b6d8534b71..7cdf5d1b0067597822da55988387d4ace496669c 100644 GIT binary patch literal 147607 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

+

15 January 2025

+

MistakeNot4892 updated:

+
    +
  • The way you interact with barrels and well has been significantly reworked; clicking with a bucket or tool should give a list of options to pick from. Please report bugs with this on the tracker.
  • +
+

08 January 2025

MistakeNot4892 updated:

    @@ -95,15 +101,6 @@

    MistakeNot4892 updated:

    • Swapped barrel icons out for Doe's much nicer barrels.
    - -

    13 November 2024

    -

    Penelope Haze updated:

    -
      -
    • Added a new wooden bucket sprite.
    • -
    • Quills now have a limited amount of ink, which can be refilled in an inkwell.
    • -
    • Crayons are now slowly used up while writing on paper, at a rate of one charge per 25 characters. (Crayons have a default of 30 charges.)
    • -
    • Added new furniture to the Shaded Hills inn.
    • -
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index e0665a0e73fe..d1630e2c6909 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14948,3 +14948,8 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. 2025-01-08: MistakeNot4892: - tweak: Mud and blood can now leave footprints. +2025-01-15: + MistakeNot4892: + - tweak: The way you interact with barrels and well has been significantly reworked; + clicking with a bucket or tool should give a list of options to pick from. Please + report bugs with this on the tracker. diff --git a/html/changelogs/AutoChangeLog-pr-4660.yml b/html/changelogs/AutoChangeLog-pr-4660.yml deleted file mode 100644 index f2d82f7715db..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4660.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: The way you interact with barrels and well has been significantly reworked; - clicking with a bucket or tool should give a list of options to pick from. Please - report bugs with this on the tracker.} -delete-after: true From 9d3b0823bd2544a44b4f4c6f3c56c5dc8bbed3b1 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 9 Jan 2025 21:10:55 +1100 Subject: [PATCH 77/95] Added a forging hammer as prep for blacksmithy. --- .../tool_crafting/_tool_crafting.dm | 4 ++++ code/modules/tools/components/head.dm | 6 ++++++ code/modules/tools/subtypes/hammers.dm | 15 +++++++++++++++ icons/obj/items/tool/components/tool_head.dmi | Bin 606 -> 698 bytes 4 files changed, 25 insertions(+) diff --git a/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm b/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm index ad2cff20aa67..5472d9922431 100644 --- a/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm +++ b/code/modules/crafting/slapcrafting/crafting_recipes/tool_crafting/_tool_crafting.dm @@ -39,6 +39,10 @@ var/global/list/_tool_crafting_components = list( /obj/item/tool/axe = list( /obj/item/tool_component/head/handaxe, /obj/item/tool_component/handle/short + ), + /obj/item/tool/hammer/forge = list( + /obj/item/tool_component/head/forging_hammer, + /obj/item/tool_component/handle/short ) ) diff --git a/code/modules/tools/components/head.dm b/code/modules/tools/components/head.dm index 8f594c1f2e75..e8e408c7c761 100644 --- a/code/modules/tools/components/head.dm +++ b/code/modules/tools/components/head.dm @@ -62,3 +62,9 @@ var/global/list/_tool_properties_cache = list() desc = "The head of a sledgehammer." icon_state = "sledgehammer" w_class = ITEM_SIZE_NORMAL + +/obj/item/tool_component/head/forging_hammer + name = "forging hammer head" + desc = "The head of a forging hammer." + icon_state = "forging" + w_class = ITEM_SIZE_NORMAL diff --git a/code/modules/tools/subtypes/hammers.dm b/code/modules/tools/subtypes/hammers.dm index bb1c9ee58cd5..79e5e26956dc 100644 --- a/code/modules/tools/subtypes/hammers.dm +++ b/code/modules/tools/subtypes/hammers.dm @@ -79,3 +79,18 @@ TOOL_SHOVEL = TOOL_QUALITY_DECENT ) return tool_qualities + +/obj/item/tool/hammer/forge + name = "forging hammer" + desc = "A heavy hammer, used to forge hot metal at an anvil." + icon = 'icons/obj/items/tool/hammers/forge.dmi' + w_class = ITEM_SIZE_NORMAL + +// Forging hammers are not great at general hammer tasks (too heavy I guess), +// and also don't work as crowbars due to missing the nail ripper/flange, +// but will be more effective at forging when blacksmithy is merged. +/obj/item/tool/hammer/forge/get_initial_tool_qualities() + var/static/list/tool_qualities = list( + TOOL_HAMMER = TOOL_QUALITY_MEDIOCRE + ) + return tool_qualities diff --git a/icons/obj/items/tool/components/tool_head.dmi b/icons/obj/items/tool/components/tool_head.dmi index dbb7e7db2bcf3bc222f8dbb7a540236e3db81d6d..cc9a43d997101085670c22efd3fbc7f445618f1d 100644 GIT binary patch delta 687 zcmV;g0#NJN zR9J=Wm%(y_Ab${sL0_OkdRLHp1KE4Wm9L6WqV+#HveVBegnCN^&7J%w&BpB|EP*OXZ7k@wm0{{R37aDIp0000IP)t-sz`(#sM_grMc8ZFg|NsBO!O8Xa z?%)6b00DGTPE!Ct=GbNc005zSR9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo` zEh^5;&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYRDU2-DI+mAH?>HKi!&v& zs2C_<$i1{^udLwe=K>Bg08P$W0uNuA{Qv*~O-V#SR7i>KR?BY0APnU3 z0}avM6G-kYtbgxSlKp@#dk!>Hq)$07*qoM6N<$g5ix2G5`Po From 3e6d93032a2ad948dffaf5528601416d34c3ce17 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 15 Jan 2025 23:58:53 +1100 Subject: [PATCH 78/95] Removes transfer volume override from barrels. --- code/game/objects/structures/barrel.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/game/objects/structures/barrel.dm b/code/game/objects/structures/barrel.dm index a8f9c376102d..8a3a7fae2038 100644 --- a/code/game/objects/structures/barrel.dm +++ b/code/game/objects/structures/barrel.dm @@ -12,7 +12,6 @@ wrenchable = FALSE storage = /datum/storage/barrel amount_dispensed = 10 - possible_transfer_amounts = @"[10,25,50,100]" volume = 7500 movable_flags = MOVABLE_FLAG_WHEELED throwpass = TRUE From 69ba3ed8f9f25d3891c7a2c2037867d5b72c007d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 00:02:33 +1100 Subject: [PATCH 79/95] Adds pockets to cloaks and suit jackets. --- code/modules/clothing/suits/cloaks.dm | 24 ++++++++++--------- .../modules/clothing/suits/jackets/_jacket.dm | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index dea74926342d..5888d3ec8329 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -1,15 +1,17 @@ -/obj/item/clothing/suit/cloak // A colorable cloak - name = "plain cloak" - desc = "A simple, bland cloak." - icon = 'icons/clothing/suits/cloaks/_cloak.dmi' - w_class = ITEM_SIZE_NORMAL - slot_flags = SLOT_OVER_BODY - allowed = list(/obj/item/tank/emergency/oxygen) - armor = list(ARMOR_MELEE = 0, ARMOR_BULLET = 0, ARMOR_LASER = 0,ARMOR_ENERGY = 0, ARMOR_BOMB = 0, ARMOR_BIO = 0, ARMOR_RAD = 0) - body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS - siemens_coefficient = 0.9 - accessory_slot = ACCESSORY_SLOT_OVER +// A colorable cloak +/obj/item/clothing/suit/cloak + name = "plain cloak" + desc = "A simple, bland cloak." + icon = 'icons/clothing/suits/cloaks/_cloak.dmi' + w_class = ITEM_SIZE_NORMAL + slot_flags = SLOT_OVER_BODY + allowed = list(/obj/item/tank/emergency/oxygen) + armor = null + body_parts_covered = SLOT_UPPER_BODY|SLOT_LOWER_BODY|SLOT_ARMS|SLOT_LEGS + siemens_coefficient = 0.9 + accessory_slot = ACCESSORY_SLOT_OVER accessory_visibility = ACCESSORY_VISIBILITY_ATTACHMENT + storage = /datum/storage/pockets/suit /obj/item/clothing/suit/cloak/on_update_icon() . = ..() diff --git a/code/modules/clothing/suits/jackets/_jacket.dm b/code/modules/clothing/suits/jackets/_jacket.dm index 3486a1c88e1a..abdd83bf2d43 100644 --- a/code/modules/clothing/suits/jackets/_jacket.dm +++ b/code/modules/clothing/suits/jackets/_jacket.dm @@ -8,6 +8,7 @@ slot_flags = SLOT_OVER_BODY w_class = ITEM_SIZE_NORMAL accessory_slot = ACCESSORY_SLOT_DECOR + storage = /datum/storage/pockets/suit valid_accessory_slots = list( ACCESSORY_SLOT_INSIGNIA, ACCESSORY_SLOT_ARMBAND, From 96402cea8ec892060573728d98114537dd999cd2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 00:36:33 +1100 Subject: [PATCH 80/95] Sulfuric acid dispensers are non-dense. --- code/modules/reagents/reagent_dispenser.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 235e6b2b6586..7162e99b1543 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -322,6 +322,7 @@ icon_state = "acidtank" amount_dispensed = 10 anchored = TRUE + density = FALSE /obj/structure/reagent_dispensers/acid/populate_reagents() add_to_reagents(/decl/material/liquid/acid, reagents.maximum_volume) From 9c5a0b4cb8035032598519607b77d508124cd63a Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 00:37:29 +1100 Subject: [PATCH 81/95] Sulphur -> sulfur consistency pass. --- code/game/objects/random/subtypes/misc.dm | 2 +- code/modules/codex/categories/category_substances.dm | 2 +- .../definitions/liquids/materials_liquid_solvents.dm | 4 ++-- code/modules/reagents/reagent_containers/beaker.dm | 2 +- code/modules/reagents/reagent_containers/spray.dm | 2 +- code/modules/reagents/reagent_dispenser.dm | 2 +- maps/exodus/exodus-2.dmm | 4 ++-- maps/ministation/ministation-2.dmm | 2 +- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/code/game/objects/random/subtypes/misc.dm b/code/game/objects/random/subtypes/misc.dm index e0b87069d002..c0dcab1b2c99 100644 --- a/code/game/objects/random/subtypes/misc.dm +++ b/code/game/objects/random/subtypes/misc.dm @@ -14,7 +14,7 @@ /obj/item/pill_bottle/happy = 2, /obj/item/pill_bottle/zoom = 2, /obj/item/chems/glass/beaker/vial/random/toxin = 1, - /obj/item/chems/glass/beaker/sulphuric = 1, + /obj/item/chems/glass/beaker/sulfuric = 1, /obj/item/poster = 5, /obj/item/butterflyblade = 3, /obj/item/butterflyhandle = 3, diff --git a/code/modules/codex/categories/category_substances.dm b/code/modules/codex/categories/category_substances.dm index e17ac5d3e666..e8c96d49b729 100644 --- a/code/modules/codex/categories/category_substances.dm +++ b/code/modules/codex/categories/category_substances.dm @@ -77,7 +77,7 @@ else if(mat.dissolves_in <= MAT_SOLVENT_MODERATE) solvent_needed = "a moderately strong solvent, like acetone" else if(mat.dissolves_in <= MAT_SOLVENT_STRONG) - solvent_needed = "a strong solvent, like sulphuric acid" + solvent_needed = "a strong solvent, like sulfuric acid" material_info += "
  • It can be dissolved with [solvent_needed] solvent, producing [english_list(chems)].
  • " if(mat.radioactivity) material_info += "
  • It is radioactive.
  • " diff --git a/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm b/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm index bbfa9096bfe2..ec78c02b460f 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_solvents.dm @@ -1,6 +1,6 @@ /decl/material/liquid/acid - name = "sulphuric acid" - uid = "liquid_sulphuric_acid" + name = "sulfuric acid" + uid = "liquid_sulfuric_acid" lore_text = "A very corrosive mineral acid with the molecular formula H2SO4." taste_description = "acid" color = "#db5008" diff --git a/code/modules/reagents/reagent_containers/beaker.dm b/code/modules/reagents/reagent_containers/beaker.dm index d89ac9acff10..727d8fd45e40 100644 --- a/code/modules/reagents/reagent_containers/beaker.dm +++ b/code/modules/reagents/reagent_containers/beaker.dm @@ -181,5 +181,5 @@ matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) volume = 120 -/obj/item/chems/glass/beaker/sulphuric/populate_reagents() +/obj/item/chems/glass/beaker/sulfuric/populate_reagents() add_to_reagents(/decl/material/liquid/acid, reagents.maximum_volume) diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index f2079ac42140..82af2e9f0410 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -50,7 +50,7 @@ Spray_at(A, user, proximity) if(reagents.has_reagent(/decl/material/liquid/acid)) - log_and_message_admins("fired sulphuric acid from \a [src].", user) + log_and_message_admins("fired sulfuric acid from \a [src].", user) if(reagents.has_reagent(/decl/material/liquid/acid/polyacid)) log_and_message_admins("fired polyacid from \a [src].", user) if(reagents.has_reagent(/decl/material/liquid/lube)) diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 7162e99b1543..29069da55822 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -317,7 +317,7 @@ add_to_reagents(/decl/material/liquid/alcohol/beer, reagents.maximum_volume) /obj/structure/reagent_dispensers/acid - name = "sulphuric acid dispenser" + name = "sulfuric acid dispenser" desc = "A dispenser of acid for industrial processes." icon_state = "acidtank" amount_dispensed = 10 diff --git a/maps/exodus/exodus-2.dmm b/maps/exodus/exodus-2.dmm index fb38f5ce9729..5c0062593c76 100644 --- a/maps/exodus/exodus-2.dmm +++ b/maps/exodus/exodus-2.dmm @@ -30766,7 +30766,7 @@ /obj/machinery/fabricator/imprinter{ id_tag = "science" }, -/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/glass/beaker/sulfuric, /obj/structure/reagent_dispensers/acid{ density = 0; pixel_y = 32 @@ -32579,7 +32579,7 @@ /obj/machinery/fabricator/imprinter{ id_tag = "science" }, -/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/glass/beaker/sulfuric, /turf/floor/tiled/dark, /area/exodus/research/lab) "bqQ" = ( diff --git a/maps/ministation/ministation-2.dmm b/maps/ministation/ministation-2.dmm index 269092ac0dd3..bbaa07f4feee 100644 --- a/maps/ministation/ministation-2.dmm +++ b/maps/ministation/ministation-2.dmm @@ -2164,7 +2164,7 @@ "js" = ( /obj/structure/table, /obj/item/chems/glass/beaker/large, -/obj/item/chems/glass/beaker/sulphuric, +/obj/item/chems/glass/beaker/sulfuric, /obj/item/chems/dropper, /obj/effect/floor_decal/corner/purple{ dir = 8 From 1b3d142171dd67a0f0bbab2c89e496ef9c96ce5c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 00:53:31 +1100 Subject: [PATCH 82/95] General crayon glow up. --- code/__defines/misc.dm | 5 +++ code/game/objects/effects/decals/crayon.dm | 49 +++++++++++---------- code/modules/paperwork/pen/crayon.dm | 25 +++++++---- icons/effects/crayondecal.dmi | Bin 10586 -> 10546 bytes 4 files changed, 47 insertions(+), 32 deletions(-) diff --git a/code/__defines/misc.dm b/code/__defines/misc.dm index c6fd3d2e4662..844ea6ef022b 100644 --- a/code/__defines/misc.dm +++ b/code/__defines/misc.dm @@ -375,3 +375,8 @@ #define RADIAL_LABELS_NONE 0 #define RADIAL_LABELS_OFFSET 1 #define RADIAL_LABELS_CENTERED 2 + +#define CRAYON_DRAW_RUNE "rune" +#define CRAYON_DRAW_GRAFFITI "graffiti" +#define CRAYON_DRAW_LETTER "letter" +#define CRAYON_DRAW_ARROW "arrow" \ No newline at end of file diff --git a/code/game/objects/effects/decals/crayon.dm b/code/game/objects/effects/decals/crayon.dm index b5d5d29540a0..664d7af8c8fb 100644 --- a/code/game/objects/effects/decals/crayon.dm +++ b/code/game/objects/effects/decals/crayon.dm @@ -1,27 +1,30 @@ /obj/effect/decal/cleanable/crayon - name = "rune" - desc = "A rune drawn in crayon." - icon = 'icons/obj/rune.dmi' + name = "rune" + desc = "A rune drawn in crayon." + icon = 'icons/effects/crayondecal.dmi' + icon_state = "rune1" weather_sensitive = FALSE + var/shade_color = COLOR_BLACK -/obj/effect/decal/cleanable/crayon/Initialize(mapload, main = "#ffffff", shade = "#000000", var/type = "rune") - name = type - desc = "\A [type] drawn in crayon." +/obj/effect/decal/cleanable/crayon/Initialize(mapload, _color = COLOR_WHITE, _shade_color = COLOR_BLACK, _drawtype = CRAYON_DRAW_RUNE) + . = ..() + name = _drawtype + desc = "\A [_drawtype], drawn in crayon." + color = _color + shade_color = _shade_color + switch(_drawtype) + if(CRAYON_DRAW_RUNE) + icon_state = "rune[rand(1,6)]" + if(CRAYON_DRAW_GRAFFITI) + icon_state = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") + else + icon_state = _drawtype + update_icon() - switch(type) - if("rune") - type = "rune[rand(1,6)]" - if("graffiti") - type = pick("amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa") - - var/icon/mainOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]",2.1) - var/icon/shadeOverlay = new/icon('icons/effects/crayondecal.dmi',"[type]s",2.1) - - mainOverlay.Blend(main,ICON_ADD) - shadeOverlay.Blend(shade,ICON_ADD) - - overlays += mainOverlay - overlays += shadeOverlay - - add_hiddenprint(usr) - . = ..() \ No newline at end of file +/obj/effect/decal/cleanable/crayon/on_update_icon() + . = ..() + if(shade_color) + var/overlay_state = "[icon_state]s" + if(check_state_in_icon(overlay_state, icon)) + add_overlay(overlay_image(icon, overlay_state, shade_color, RESET_COLOR)) + compile_overlays() diff --git a/code/modules/paperwork/pen/crayon.dm b/code/modules/paperwork/pen/crayon.dm index 0c3222998ac1..f06419b8711c 100644 --- a/code/modules/paperwork/pen/crayon.dm +++ b/code/modules/paperwork/pen/crayon.dm @@ -33,24 +33,31 @@ return if(istype(target) && target.is_floor()) - var/drawtype = input("Choose what you'd like to draw.", "Crayon scribbles") in list("graffiti","rune","letter","arrow") + var/static/list/drawtypes = list(CRAYON_DRAW_GRAFFITI, CRAYON_DRAW_RUNE, CRAYON_DRAW_LETTER, CRAYON_DRAW_ARROW) + var/drawtype = input(user, "Choose what you'd like to draw.", "Crayon scribbles") as null|anything in drawtypes var/draw_message = "drawing" switch(drawtype) - if("letter") - drawtype = input("Choose the letter.", "Crayon scribbles") in list(global.alphabet) + if(CRAYON_DRAW_LETTER) + drawtype = input(user, "Choose a letter.", "Crayon scribbles") as null|anything in global.alphabet draw_message = "drawing a letter" - if("graffiti") + if(CRAYON_DRAW_GRAFFITI) draw_message = "drawing graffiti" - if("rune") + if(CRAYON_DRAW_RUNE) draw_message = "drawing a rune" - if("arrow") - drawtype = input("Choose the arrow.", "Crayon scribbles") in list("left", "right", "up", "down") + if(CRAYON_DRAW_ARROW) + var/static/list/arrow_dirs = list("left", "right", "up", "down") + drawtype = input(user, "Choose an arrow.", "Crayon scribbles") as null|anything in arrow_dirs draw_message = "drawing an arrow" + if(!drawtype || QDELETED(src) || QDELETED(target) || QDELETED(user) || user.get_active_held_item() != src || !CanPhysicallyInteractWith(user, target)) + return TRUE + if(do_tool_interaction(TOOL_PEN, user, target, 5 SECONDS, draw_message, "drawing on", fuel_expenditure = 1)) - new /obj/effect/decal/cleanable/crayon(target, stroke_color, shade_color, drawtype) + var/obj/effect/decal/cleanable/crayon/graffiti = new(target, stroke_color, shade_color, drawtype) target.add_fingerprint(user) // Adds their fingerprints to the floor the crayon is drawn on. - return + graffiti.add_fingerprint(user) + + return TRUE /obj/item/pen/crayon/red stroke_color = "#da0000" diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi index e1966e9bb5aef755309630eef7e7cad82d026d12..3642e8ed8f4d042a4e1706258e799130ace96569 100644 GIT binary patch delta 10176 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 ud|Cu)y?V(4hQ0uRQwVtrh#SY}t2X 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 PoiF`IPqe>3w2k~fMf$Ix From 55a0a375af5424bc4d27a0d1b8aa2267d1fed0e3 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 01:38:13 +1100 Subject: [PATCH 83/95] Adding floor hazard checks to slipping, lava and bear traps. --- code/game/atoms.dm | 3 + code/game/objects/items/weapons/soap.dm | 8 +- code/game/objects/items/weapons/traps.dm | 90 ++++++++++++----------- code/game/turfs/flooring/flooring_lava.dm | 2 +- code/modules/mob/living/living.dm | 9 ++- code/modules/multiz/movement.dm | 5 +- 6 files changed, 64 insertions(+), 53 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 50583b963a47..e77e727b655a 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -997,3 +997,6 @@ /atom/proc/can_drink_from(mob/user) return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() + +/atom/proc/immune_to_floor_hazards() + return !simulated || throwing diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index c669236eb49c..f32245825bba 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -57,10 +57,10 @@ add_to_reagents(/decl/material/liquid/cleaner/soap, SOAP_CLEANER_ON_WET) /obj/item/soap/Crossed(atom/movable/AM) - if(!isliving(AM)) - return - var/mob/living/M = AM - M.slip("\the [src]", 3) + var/mob/living/victim = AM + if(istype(victim)) + victim.slip("\the [src]", 3) + return ..() /obj/item/soap/afterattack(atom/target, mob/user, proximity) if(!proximity) return diff --git a/code/game/objects/items/weapons/traps.dm b/code/game/objects/items/weapons/traps.dm index 07845b81c45a..397257e0d29f 100644 --- a/code/game/objects/items/weapons/traps.dm +++ b/code/game/objects/items/weapons/traps.dm @@ -1,17 +1,17 @@ /obj/item/beartrap - name = "mechanical trap" - throw_speed = 2 - throw_range = 1 - gender = PLURAL - icon = 'icons/obj/items/beartrap.dmi' - icon_state = "beartrap0" - randpixel = 0 - desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." - w_class = ITEM_SIZE_NORMAL - origin_tech = @'{"materials":1}' - material = /decl/material/solid/metal/steel - can_buckle = 0 //disallow manual un/buckling - var/deployed = 0 + name = "mechanical trap" + desc = "A mechanically activated leg trap. Low-tech, but reliable. Looks like it could really hurt if you set it off." + throw_speed = 2 + throw_range = 1 + gender = PLURAL + icon = 'icons/obj/items/beartrap.dmi' + icon_state = "beartrap0" + randpixel = 0 + w_class = ITEM_SIZE_NORMAL + origin_tech = @'{"materials":1}' + material = /decl/material/solid/metal/steel + can_buckle = FALSE //disallow manual un/buckling + var/deployed = FALSE /obj/item/beartrap/proc/can_use(mob/user) . = (user.check_dexterity(DEXTERITY_SIMPLE_MACHINES) && !issilicon(user) && !user.stat && !user.restrained()) @@ -19,12 +19,12 @@ /obj/item/beartrap/user_unbuckle_mob(mob/user) if(buckled_mob && can_use(user)) user.visible_message( - "\The [user] begins freeing \the [buckled_mob] from \the [src].", - "You carefully begin to free \the [buckled_mob] from \the [src].", - "You hear metal creaking." + SPAN_NOTICE("\The [user] begins freeing \the [buckled_mob] from \the [src]."), + SPAN_NOTICE("You carefully begin to free \the [buckled_mob] from \the [src]."), + SPAN_NOTICE("You hear metal creaking.") ) if(do_after(user, 60, src)) - user.visible_message("\The [buckled_mob] has been freed from \the [src] by \the [user].") + user.visible_message(SPAN_NOTICE("\The [buckled_mob] has been freed from \the [src] by \the [user].")) unbuckle_mob() anchored = FALSE @@ -32,19 +32,18 @@ ..() if(!deployed && can_use(user)) user.visible_message( - "[user] starts to deploy \the [src].", - "You begin deploying \the [src]!", + SPAN_DANGER("\The [user] starts to deploy \the [src]."), + SPAN_DANGER("You begin deploying \the [src]!"), "You hear the slow creaking of a spring." - ) + ) - if (do_after(user, 60, src) && user.try_unequip(src)) + if (do_after(user, 6 SECONDS, src) && user.try_unequip(src)) user.visible_message( - "\The [user] has deployed \the [src].", - "You have deployed \the [src]!", + SPAN_DANGER("\The [user] has deployed \the [src]."), + SPAN_DANGER("You have deployed \the [src]!"), "You hear a latch click loudly." - ) - - deployed = 1 + ) + deployed = TRUE update_icon() anchored = TRUE @@ -55,7 +54,7 @@ user_unbuckle_mob(user) return TRUE if(!deployed || !can_use(user)) - return FALSE + return ..() user.visible_message( SPAN_DANGER("\The [user] starts to disarm \the [src]."), SPAN_NOTICE("You begin disarming \the [src]!"), @@ -71,40 +70,45 @@ update_icon() return TRUE -/obj/item/beartrap/proc/attack_mob(mob/L) +/obj/item/beartrap/proc/attack_mob(mob/victim) + + if(victim.immune_to_floor_hazards()) + return FALSE var/target_zone - if(L.current_posture.prone) + if(victim.current_posture.prone) target_zone = ran_zone() else target_zone = pick(BP_L_FOOT, BP_R_FOOT, BP_L_LEG, BP_R_LEG) - if(!L.apply_damage(30, BRUTE, target_zone, used_weapon=src)) - return 0 + if(!victim.apply_damage(30, BRUTE, target_zone, used_weapon=src)) + return FALSE //trap the victim in place - set_dir(L.dir) - buckle_mob(L) - to_chat(L, "The steel jaws of \the [src] bite into you, trapping you in place!") - deployed = 0 + set_dir(victim.dir) + buckle_mob(victim) + to_chat(victim, SPAN_DANGER("The steel jaws of \the [src] bite into you, trapping you in place!")) + deployed = FALSE + return TRUE /obj/item/beartrap/Crossed(atom/movable/AM) ..() if(!deployed || !isliving(AM)) return - var/mob/living/L = AM - if(MOVING_DELIBERATELY(L)) + var/mob/living/victim = AM + if(MOVING_DELIBERATELY(victim) || victim.immune_to_floor_hazards()) return - L.visible_message( - SPAN_DANGER("\The [L] steps on \the [src]."), + victim.visible_message( + SPAN_DANGER("\The [victim] steps on \the [src]."), SPAN_DANGER("You step on \the [src]!"), - "You hear a loud metallic snap!") - attack_mob(L) + "You hear a loud metallic snap!" + ) + attack_mob(victim) if(!buckled_mob) anchored = FALSE - deployed = 0 + deployed = FALSE update_icon() /obj/item/beartrap/on_update_icon() . = ..() - icon_state = "beartrap[deployed == TRUE]" + icon_state = "beartrap[deployed]" diff --git a/code/game/turfs/flooring/flooring_lava.dm b/code/game/turfs/flooring/flooring_lava.dm index beebb36b775d..9fe4be66e462 100644 --- a/code/game/turfs/flooring/flooring_lava.dm +++ b/code/game/turfs/flooring/flooring_lava.dm @@ -18,7 +18,7 @@ var/datum/gas_mixture/environment = target.return_air() var/pressure = environment?.return_pressure() for(var/atom/movable/AM as anything in target.get_contained_external_atoms()) - if(!AM.is_burnable()) + if(!AM.is_burnable() || AM.immune_to_floor_hazards()) continue . = null if(isliving(AM)) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e3b9dd00ecab..f32c16e2f671 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -694,7 +694,14 @@ default behaviour is: /mob/living/proc/has_brain() return TRUE -/mob/living/proc/slip(var/slipped_on, stun_duration = 8) +// We are jumping, levitating or being thrown. +/mob/living/immune_to_floor_hazards() + . = ..() || is_floating + +/mob/living/proc/slip(slipped_on, stun_duration = 8) + + if(immune_to_floor_hazards()) + return FALSE var/decl/species/my_species = get_species() if(my_species?.check_no_slip(src)) diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index a30099212492..71f8a6750c90 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -91,9 +91,6 @@ if(!has_gravity()) return - if(throwing) - return - if(can_fall()) begin_falling(lastloc, below) @@ -115,7 +112,7 @@ //For children to override /atom/movable/proc/can_fall(var/anchor_bypass = FALSE, var/turf/location_override = loc) - if(!simulated) + if(immune_to_floor_hazards()) return FALSE if(anchored && !anchor_bypass) From 0516a1b9c50e3faee11fe66d02d6c415082e911b Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 02:05:20 +1100 Subject: [PATCH 84/95] Added immune_to_floor_hazards() check to glass shards. --- code/game/atoms.dm | 2 +- code/game/atoms_movable.dm | 3 +++ .../objects/items/weapons/material/shards.dm | 20 ++++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e77e727b655a..a0b071395def 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -999,4 +999,4 @@ return ATOM_IS_OPEN_CONTAINER(src) && reagents?.total_volume && user.check_has_mouth() /atom/proc/immune_to_floor_hazards() - return !simulated || throwing + return !simulated diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index d2be93779daa..2eeb6cccb12a 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -585,3 +585,6 @@ if(ATOM_IS_OPEN_CONTAINER(src)) return loc?.take_vaporized_reagent(reagent, amount) return null + +/atom/movable/immune_to_floor_hazards() + return ..() || throwing diff --git a/code/game/objects/items/weapons/material/shards.dm b/code/game/objects/items/weapons/material/shards.dm index dd248df7bb77..376f259b30d0 100644 --- a/code/game/objects/items/weapons/material/shards.dm +++ b/code/game/objects/items/weapons/material/shards.dm @@ -90,31 +90,33 @@ if(!isliving(AM)) return - var/mob/living/M = AM - if(M.buckled) //wheelchairs, office chairs, rollerbeds + var/mob/living/victim = AM + if(victim.buckled) //wheelchairs, office chairs, rollerbeds + return + if(victim.immune_to_floor_hazards()) return playsound(src.loc, 'sound/effects/glass_step.ogg', 50, 1) // not sure how to handle metal shards with sounds - var/decl/species/walker_species = M.get_species() - if(walker_species && (walker_species.get_shock_vulnerability(M) < 0.5 || (walker_species.species_flags & (SPECIES_FLAG_NO_EMBED|SPECIES_FLAG_NO_MINOR_CUT)))) //Thick skin. + var/decl/species/walker_species = victim.get_species() + if(walker_species && (walker_species.get_shock_vulnerability(victim) < 0.5 || (walker_species.species_flags & (SPECIES_FLAG_NO_EMBED|SPECIES_FLAG_NO_MINOR_CUT)))) //Thick skin. return - var/obj/item/shoes = M.get_equipped_item(slot_shoes_str) - var/obj/item/suit = M.get_equipped_item(slot_wear_suit_str) + var/obj/item/shoes = victim.get_equipped_item(slot_shoes_str) + var/obj/item/suit = victim.get_equipped_item(slot_wear_suit_str) if(shoes || (suit && (suit.body_parts_covered & SLOT_FEET))) return var/list/check = list(BP_L_FOOT, BP_R_FOOT) while(check.len) var/picked = pick_n_take(check) - var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(M, picked) + var/obj/item/organ/external/affecting = GET_EXTERNAL_ORGAN(victim, picked) if(!affecting || BP_IS_PROSTHETIC(affecting)) continue - to_chat(M, SPAN_DANGER("You step on \the [src]!")) + to_chat(victim, SPAN_DANGER("You step on \the [src]!")) affecting.take_external_damage(5, 0) if(affecting.can_feel_pain()) - SET_STATUS_MAX(M, STAT_WEAK, 3) + SET_STATUS_MAX(victim, STAT_WEAK, 3) return //Prevent the shard from being allowed to shatter From 978ba959ed90fa39272fccb701058eeba8aa6070 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 16 Jan 2025 05:35:35 +1100 Subject: [PATCH 85/95] Automatic changelog generation for PR #4722 [ci skip] --- html/changelogs/AutoChangeLog-pr-4722.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4722.yml diff --git a/html/changelogs/AutoChangeLog-pr-4722.yml b/html/changelogs/AutoChangeLog-pr-4722.yml new file mode 100644 index 000000000000..14b8f30a37fc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4722.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: The Shaded Hills river now flows north.} +delete-after: true From 6f87f934140ff2828d084daed8736b25fff1c917 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 16 Jan 2025 05:39:51 +1100 Subject: [PATCH 86/95] Automatic changelog generation for PR #4704 [ci skip] --- html/changelogs/AutoChangeLog-pr-4704.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4704.yml diff --git a/html/changelogs/AutoChangeLog-pr-4704.yml b/html/changelogs/AutoChangeLog-pr-4704.yml new file mode 100644 index 000000000000..c6e904568d00 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4704.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: The White and Minimalist HUD styles can now be customised to use a specific + overlay color.} +delete-after: true From aeff7e34a4b9fbf26dec92918451c032755b6ed6 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 16 Jan 2025 05:42:24 +1100 Subject: [PATCH 87/95] Automatic changelog generation for PR #4721 [ci skip] --- html/changelogs/AutoChangeLog-pr-4721.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4721.yml diff --git a/html/changelogs/AutoChangeLog-pr-4721.yml b/html/changelogs/AutoChangeLog-pr-4721.yml new file mode 100644 index 000000000000..f7a2b1522271 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4721.yml @@ -0,0 +1,4 @@ +author: MistakeNot4892 +changes: + - {tweak: 'Snow, mud and sand will now show footprints.'} +delete-after: true From df61201b1f47e2c2fd9553fc02f1c6576e3c58ab Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 09:42:11 +1100 Subject: [PATCH 88/95] CI fix for supermatter job. --- mods/~compatibility/patches/supermatter/supermatter_jobs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mods/~compatibility/patches/supermatter/supermatter_jobs.dm b/mods/~compatibility/patches/supermatter/supermatter_jobs.dm index 1603bf04ddad..2a62b17318ca 100644 --- a/mods/~compatibility/patches/supermatter/supermatter_jobs.dm +++ b/mods/~compatibility/patches/supermatter/supermatter_jobs.dm @@ -1,7 +1,7 @@ -/datum/job/chief_engineer/New() +/datum/job/standard/chief_engineer/New() ..() software_on_spawn |= /datum/computer_file/program/supermatter_monitor -/datum/job/engineer/New() +/datum/job/standard/engineer/New() ..() software_on_spawn |= /datum/computer_file/program/supermatter_monitor \ No newline at end of file From dda704c0a51a5d980d0050bcedf2c35a4d0a5eea Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Thu, 16 Jan 2025 09:50:17 +1100 Subject: [PATCH 89/95] Fixes inverted powernet check. --- code/modules/power/cable.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index f66b7a21a925..6e5605cd9556 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -238,7 +238,7 @@ By design, d1 is the smallest direction and d2 is the highest // shock the user with probability prb /obj/structure/cable/proc/shock(mob/user, prb, var/siemens_coeff = 1.0) - if(!prob(prb) || !powernet || !powernet.avail <= 0) + if(!prob(prb) || powernet?.avail <= 0) return FALSE if (electrocute_mob(user, powernet, src, siemens_coeff)) spark_at(src, amount=5, cardinal_only = TRUE) From 67d1eb87f96ded69fd1969de2c5ed6b0d8b55c67 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 6 Jan 2025 18:41:45 +1100 Subject: [PATCH 90/95] Ported tabloids from Polaris. --- maps/exodus/exodus.dm | 1 + maps/ministation/ministation.dm | 1 + maps/modpack_testing/modpack_testing.dm | 1 + maps/tradeship/tradeship.dm | 2 + mods/_modpack.dm | 6 ++- mods/content/tabloids/_tabloids.dm | 58 +++++++++++++++++++++++ mods/content/tabloids/_tabloids.dme | 8 ++++ mods/content/tabloids/icons/magazine.dmi | Bin 0 -> 441 bytes mods/content/tabloids/tabloid.dm | 36 ++++++++++++++ mods/content/tabloids/tabloid_helpers.dm | 24 ++++++++++ mods/species/bayliens/_bayliens.dm | 8 ++++ 11 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 mods/content/tabloids/_tabloids.dm create mode 100644 mods/content/tabloids/_tabloids.dme create mode 100644 mods/content/tabloids/icons/magazine.dmi create mode 100644 mods/content/tabloids/tabloid.dm create mode 100644 mods/content/tabloids/tabloid_helpers.dm diff --git a/maps/exodus/exodus.dm b/maps/exodus/exodus.dm index 223abb29037a..67ca1974ecce 100644 --- a/maps/exodus/exodus.dm +++ b/maps/exodus/exodus.dm @@ -14,6 +14,7 @@ #include "../../mods/content/standard_jobs/_standard_jobs.dme" #include "../../mods/content/supermatter/_supermatter.dme" #include "../../mods/content/xenobiology/_xenobiology.dme" + #include "../../mods/content/tabloids/_tabloids.dme" #include "../../mods/gamemodes/cult/_cult.dme" #include "../../mods/gamemodes/heist/_heist.dme" diff --git a/maps/ministation/ministation.dm b/maps/ministation/ministation.dm index 20c04a5c91b1..fca80d6d6478 100644 --- a/maps/ministation/ministation.dm +++ b/maps/ministation/ministation.dm @@ -43,6 +43,7 @@ Twice... #include "../../mods/mobs/dionaea/_dionaea.dme" #include "../../mods/mobs/borers/_borers.dme" + #include "../../mods/content/tabloids/_tabloids.dme" #include "../../mods/species/ascent/_ascent.dme" #include "../../mods/species/bayliens/_bayliens.dme" #include "../../mods/species/neoavians/_neoavians.dme" diff --git a/maps/modpack_testing/modpack_testing.dm b/maps/modpack_testing/modpack_testing.dm index 8466fb6b71eb..d29fd7e0f437 100644 --- a/maps/modpack_testing/modpack_testing.dm +++ b/maps/modpack_testing/modpack_testing.dm @@ -6,6 +6,7 @@ #include "../../mods/content/mundane.dm" #include "../../mods/content/scaling_descriptors.dm" #include "../../mods/content/standard_jobs/_standard_jobs.dme" + #include "../../mods/content/tabloids/_tabloids.dme" #include "../../mods/content/bigpharma/_bigpharma.dme" #include "../../mods/content/byond_membership/_byond_membership.dm" diff --git a/maps/tradeship/tradeship.dm b/maps/tradeship/tradeship.dm index b55bb8f83c88..739a2948bae7 100644 --- a/maps/tradeship/tradeship.dm +++ b/maps/tradeship/tradeship.dm @@ -4,6 +4,8 @@ #include "../../code/unit_tests/offset_tests.dm" #endif + #include "../../mods/content/tabloids/_tabloids.dme" + #include "../random_ruins/exoplanet_ruins/playablecolony/playablecolony.dm" #include "../../mods/content/government/away_sites/icarus/icarus.dm" diff --git a/mods/_modpack.dm b/mods/_modpack.dm index 81c16e69f7a0..0fb1d5d79089 100644 --- a/mods/_modpack.dm +++ b/mods/_modpack.dm @@ -8,7 +8,11 @@ var/secrets_directory /// The folder to load additional NanoUI templates from. Must be relative to the DME's location (root game folder). var/nanoui_directory - var/list/dreams //! A list of strings to be added to the random dream proc. + + var/list/dreams //! A list of strings to be added to the random dream proc. + + var/list/tabloid_headlines //! A list of headline and article data used by the tabloids modpack. + var/list/tabloid_publishers //! A list of name strings used by the tabloids modpack. var/list/credits_other //! A list of strings that are used by the end of round credits roll. var/list/credits_adventure_names //! A list of strings that are used by the end of round credits roll. diff --git a/mods/content/tabloids/_tabloids.dm b/mods/content/tabloids/_tabloids.dm new file mode 100644 index 000000000000..7d6188ff28fa --- /dev/null +++ b/mods/content/tabloids/_tabloids.dm @@ -0,0 +1,58 @@ +/decl/modpack/tabloids + name = "Tabloids" + tabloid_publishers = list( + "\improper Solar Enquirer", + "\improper Stellar Examiner", + "\improper Antares Daily", + "\improper Weekly Galactic News", + "\improper Spiral" + ) + tabloid_headlines = list( + "NARCOALGORITHMS: ARE YOUR CHILDREN SAFE?", + "ARE GMO HUMANS POISONOUS IN BED?", + "TOP 10 REASONS WHY OTHER SPECIES ARE A HOAX", + "CENTENNIAL POSITRONIC EXTENDS LIFESPAN WITH 1 SIMPLE TRICK", + "TOP 10 DANGEROUS FOODS WITH CHEMICALS", + "NEW TERRIFYING TEEN TREND: SUN-DIVING", + "HAS YOUR SPOUSE BEEN REPLACED BY AN ALIEN IMPOSTER? STUDIES SUGGEST YES!", + "SPACE CAUSES CANCER: DOCTORS CONFIRM", + "ARE BODY SCANNERS TOO INVASIVE? FIND OUT INSIDE!", + "HAS SCIENCE GONE TOO FAR? LOCAL SCIENTIST DEBUNKS ALIEN THEORY, DECRIES THEM AS TUBE EXPERIMENTS GONE WRONG", + "100 DELICIOUS RECIPES LETHAL TO CARBON-BASED LIFE", + "TOP FIVE SPECIES WE DROVE TO EXTINCTION; NUMBER TWO WILL SHOCK YOU", + "RELIGION WAS RIGHT? SHOCK FINDINGS SHOW ALIEN SIMILARITY TO ANIMALS, EXISTENCE OF BOATS", + "TOP TEN REASONS WHY ONLY HUMANS ARE SENTIENT", + "WHICH PLANET HAS THE BEST LOVERS? THIS AND MORE INSIDE!", + "SHE SAID WE SHOULD SEE OTHER PEOPLE, SO I MARRIED A NEO-AVIAN PACK: FULL STORY INSIDE", + "LOSE WEIGHT THREE TIMES FASTER WITH THESE LOW-G MANEUVERS!", + "MY DAUGHTER JOINED A NEURAL COLLECTIVE AND NOW SHE CAN TASTE SPACETIME: FULL STORY INSIDE", + "WERE THE NAZIS PSYCHIC? ONE HISTORIAN TELLS ALL", + "IS THE SOLAR GOVERNMENT CREATING AN AI SUPERINTELLIGENCE NEAR MERCURY? ONE EXPERT REVEALS SHOCKING INSIDER DETAILS!", + "TOP TEN HISTORICAL FIGURES THAT WERE TWO PROMETHEANS IN A TRENCHCOAT", + "TOP 10 SECRET AUGMENTS THE GOVERNMENT DOESN'T WANT YOU TO GET", + "ENLARGE YOUR MENTAL FACULTIES WITH THIS 1 WEIRD HAT", + "'HELP, MY SON THINKS HE'S A 20TH CENTURY VID CHARACTER CALLED SPOCK' AND MORE SHOCKING TALES INSIDE", + "18 RADICAL HIP IMPLANTS ALL THE KIDS ARE GETTING!", + "PRESERVED HEAD OF 21ST CENTURY CAPITALIST INSISTS THAT 'DYSON WALL' ONLY SANE SOLUTION TO RIMWARD MALCONTENTS", + "50 SHADES OF GREEN; BESTSELLING MULTISPECIES ROMANCE COMING TO CINEMAS", + "PLUTO: DWARF PLANET, OR SECRET RAMPANT AI FACILITY HELL-BENT ON CORRUPTING YOUR CHILDREN?", + "TOP TEN ANIME ALIENS. NUMBER 3 WILL SICKEN YOU", + "OCTUBER X'RALLBRE EXPOSED; NUDE PHOTOSHOOT LEAKS", + "WAR ON MARS AFTER NAKED MAN WAS FOUND; WERE THE ROMANS RIGHT?", + "REAL ALIENS ARGUE EARTH MOVIES RACIST!", + "HELP! I MARRIED A HEGEMONOUS SWARM INTELLIGENCE AND MY SON THINKS HE'S A ROUTER!", + "POSITRONICS: HUMAN INGENUITY AND GENEROSITY, OR A HORRIBLE MISTAKE? FIND OUT INSIDE!", + "THE FREE TRADER UNION: NEITHER FREE NOR A UNION. SHOCKING EXPOSE!", + "HAS THE FREE MARKET GONE TOO FAR? LUNA GLITTERPOP STAR AUCTIONS THIRD TESTICLE FOR TRANS-ORBITAL SHIPPING BONDS", + "THEY SAID IT WAS CANCER, BUT I KNEW IT WAS A TINY, SELF-REPLICATING CLONE OF RAY KURZWEIL: FULL STORY INSIDE", + "WHAT HAS TECHNOLOGY DONE? INDUSTRY BILLIONAIRE MARRIES OWN INFORMORPH MIND-COPY", + "REPTILLIAN ICE WARRIORS FROM ANOTHER WORLD LIVE INSIDE YOUR AIR DUCTS: HERE'S HOW TO GET RID OF THEM", + "10 CRITICAL THINGS YOU NEED TO KNOW ABOUT 'DRONEGATE'", + "THEY CALL THEM JUMPGATES BUT I'VE NEVER SEEN THEM JUMP: AN INDUSTRY INSIDER SPEAKS FOR THE FIRST TIME", + "EMERGENT INTELLIGENCES ARE STEALING YOUR BANK DETAILS, FETISHES: FOIL HAT RECIPE INSIDE", + "TIME TRAVELLERS ARE STEALING YOUR WIFI: 5 TIPS FOR DEFEATING HACKERS FROM THE FUTURE", + "'My mother was an alien spy': THIS CELEBRITY REVEAL WILL SHOCK AND AMAZE YOU", + "LUMINARY SCIENTIST SPEAKS: DIABETES IS A HYPERCORP RETROVIRUS!", + "'I REROUTED MY NEURAL CIRCUITRY SO THAT PAIN TASTES OF STRAWBERRIES' AND FIFTEEN OTHER CRAZY ALMACH STORIES", + "JOINING THE NAVY? HERE'S 15 EXPERT TIPS FOR AVOIDING BRAIN PARASITES" + ) \ No newline at end of file diff --git a/mods/content/tabloids/_tabloids.dme b/mods/content/tabloids/_tabloids.dme new file mode 100644 index 000000000000..0c6e6e35b01a --- /dev/null +++ b/mods/content/tabloids/_tabloids.dme @@ -0,0 +1,8 @@ +#ifndef CONTENT_PACK_TABLOIDS +#define CONTENT_PACK_TABLOIDS +// BEGIN_INCLUDE +#include "_tabloids.dm" +#include "tabloid.dm" +#include "tabloid_helpers.dm" +// END_INCLUDE +#endif \ No newline at end of file diff --git a/mods/content/tabloids/icons/magazine.dmi b/mods/content/tabloids/icons/magazine.dmi new file mode 100644 index 0000000000000000000000000000000000000000..62b385510c8422805fdf5ac3b784008abe878644 GIT binary patch literal 441 zcmV;q0Y?6bP)v#5gQXOe`@4 zF5u!4Cfa}$J$&fwzm@^U1B89*&UN(e13vw#9hNCIA~0*wtdXR5#j zLPG-ug^&dV9Rt&nkOe^Q5YlWyQXvwUn3mLm5NH9aklx*K1TJv5B`|GU+L;!(z-8e; z!82!eA3+w7KC|ZxLICIvnKPSh5CUgb1{-%A%Rz+4nJ%D!@nM7tNC+yy-NDrNB2aM8 j=`)AmfvkiU$dm#A0(CpMq4AtU00000NkvXXu0mjfOb4eN literal 0 HcmV?d00001 diff --git a/mods/content/tabloids/tabloid.dm b/mods/content/tabloids/tabloid.dm new file mode 100644 index 000000000000..6fc781a7ee64 --- /dev/null +++ b/mods/content/tabloids/tabloid.dm @@ -0,0 +1,36 @@ +/obj/item/tabloid + name = "tabloid magazine" + desc = "It's one of those trashy tabloid magazines. It looks pretty out of date." + icon = 'mods/content/tabloids/icons/magazine.dmi' + icon_state = "magazine" + randpixel = 6 + material = /decl/material/solid/organic/paper + matter = list(/decl/material/solid/organic/plastic = MATTER_AMOUNT_REINFORCEMENT) + var/headline + var/article_body + +/obj/item/tabloid/Initialize() + . = ..() + var/list/tabloid_headlines = get_tabloid_headlines() + name = SAFEPICK(get_tabloid_publishers()) || initial(name) + icon_state = SAFEPICK(get_tabloid_states()) || initial(icon_state) + headline = SAFEPICK(tabloid_headlines) + if(length(tabloid_headlines) && tabloid_headlines[headline]) + article_body = tabloid_headlines[headline] + +/obj/item/tabloid/examine(mob/user, distance, infix, suffix) + . = ..() + if(headline) + to_chat(user, "The headline screams, \"[headline]\"") + +/obj/item/tabloid/attack_self(mob/user) + . = ..() + if(!.) + user.visible_message(SPAN_NOTICE("\The [user] leafs idly through \the [src].")) + if(headline) + to_chat(user, "Most of it is the usual tabloid garbage, but the headline story, \"[headline]\", holds your attention for awhile.") + if(article_body) + to_chat(user, article_body) + else + to_chat(user, "It's the usual tabloid garbage. You find nothing of interest.") + return TRUE diff --git a/mods/content/tabloids/tabloid_helpers.dm b/mods/content/tabloids/tabloid_helpers.dm new file mode 100644 index 000000000000..966556dafbed --- /dev/null +++ b/mods/content/tabloids/tabloid_helpers.dm @@ -0,0 +1,24 @@ +// Minor fluff item for mapping in waiting rooms etc. +/proc/get_tabloid_publishers() + var/static/list/tabloid_publishers + if(!tabloid_publishers) + tabloid_publishers = list() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/modpack = SSmodpacks.loaded_modpacks[modpack_name] + if(length(modpack.tabloid_publishers)) + tabloid_publishers |= modpack.tabloid_publishers + return tabloid_publishers + +/proc/get_tabloid_headlines() + var/static/list/tabloid_headlines + if(!tabloid_headlines) + tabloid_headlines = list() + for(var/modpack_name in SSmodpacks.loaded_modpacks) + var/decl/modpack/modpack = SSmodpacks.loaded_modpacks[modpack_name] + if(length(modpack.tabloid_headlines)) + tabloid_headlines |= modpack.tabloid_headlines + return tabloid_headlines + +/proc/get_tabloid_states() + var/static/list/tabloid_states = icon_states('mods/content/tabloids/icons/magazine.dmi') + return tabloid_states diff --git a/mods/species/bayliens/_bayliens.dm b/mods/species/bayliens/_bayliens.dm index 68d625b481ff..80febefc65ea 100644 --- a/mods/species/bayliens/_bayliens.dm +++ b/mods/species/bayliens/_bayliens.dm @@ -10,6 +10,14 @@ /decl/modpack/bayliens name = "Baystation 12 Aliens" + tabloid_headlines = list( + "SHOCKING FIGURES REVEAL MORE TEENS DIE TO UNATHI HONOUR DUELS THAN GUN VIOLENCE", + "LOCAL UNATHI SYMPATHIZER: 'I really think you should stop with these spacebaiting articles.'", + "DO UNATHI SYMPATHIZERS HATE THE HUMAN RACE?", + "TENTACLES OF TERROR: SKRELL BLACK OPS SEIGE NYX NAVAL DEPOT. SHOCKING PHOTOGRAPHS INSIDE!", + "LOCAL MAN HAS SEIZURE AFTER SAYING SKRELLIAN NAME; FORCED ASSIMILATION SOON?", + "TAJARANS: CUTE AND CUDDLY, OR INFILTRATING THE GOVERNMENT? FIND OUT MORE INSIDE" + ) /decl/modpack/bayliens/pre_initialize() ..() From c3afc5564694b199da6e26f36139710492629971 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Thu, 16 Jan 2025 00:48:38 +0000 Subject: [PATCH 91/95] Automatic changelog generation [ci skip] --- html/changelog.html | 8 ++++++++ html/changelogs/.all_changelog.yml | 6 ++++++ html/changelogs/AutoChangeLog-pr-4704.yml | 5 ----- html/changelogs/AutoChangeLog-pr-4721.yml | 4 ---- html/changelogs/AutoChangeLog-pr-4722.yml | 4 ---- 5 files changed, 14 insertions(+), 13 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4704.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4721.yml delete mode 100644 html/changelogs/AutoChangeLog-pr-4722.yml diff --git a/html/changelog.html b/html/changelog.html index 68c3cd7e363b..58aeb978adc1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,14 @@ -->
    +

    16 January 2025

    +

    MistakeNot4892 updated:

    +
      +
    • The White and Minimalist HUD styles can now be customised to use a specific overlay color.
    • +
    • The Shaded Hills river now flows north.
    • +
    • Snow, mud and sand will now show footprints.
    • +
    +

    15 January 2025

    MistakeNot4892 updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index d1630e2c6909..65ecf2cbcfd8 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -14953,3 +14953,9 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: The way you interact with barrels and well has been significantly reworked; clicking with a bucket or tool should give a list of options to pick from. Please report bugs with this on the tracker. +2025-01-16: + MistakeNot4892: + - tweak: The White and Minimalist HUD styles can now be customised to use a specific + overlay color. + - tweak: The Shaded Hills river now flows north. + - tweak: Snow, mud and sand will now show footprints. diff --git a/html/changelogs/AutoChangeLog-pr-4704.yml b/html/changelogs/AutoChangeLog-pr-4704.yml deleted file mode 100644 index c6e904568d00..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4704.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: The White and Minimalist HUD styles can now be customised to use a specific - overlay color.} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4721.yml b/html/changelogs/AutoChangeLog-pr-4721.yml deleted file mode 100644 index f7a2b1522271..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4721.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: 'Snow, mud and sand will now show footprints.'} -delete-after: true diff --git a/html/changelogs/AutoChangeLog-pr-4722.yml b/html/changelogs/AutoChangeLog-pr-4722.yml deleted file mode 100644 index 14b8f30a37fc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-4722.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: MistakeNot4892 -changes: - - {tweak: The Shaded Hills river now flows north.} -delete-after: true From 8c0219bb1ddb79e7ce2a49931a2c204669caadb9 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 17 Jan 2025 11:54:28 +1100 Subject: [PATCH 92/95] Updating issue template due to Github changing the system for some reason. Why are they doing this, our existing issue template was fine. --- .github/ISSUE_TEMPLATE/issue-report.md | 62 ++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/issue-report.md diff --git a/.github/ISSUE_TEMPLATE/issue-report.md b/.github/ISSUE_TEMPLATE/issue-report.md new file mode 100644 index 000000000000..ea0f0aa4093b --- /dev/null +++ b/.github/ISSUE_TEMPLATE/issue-report.md @@ -0,0 +1,62 @@ +--- +name: Issue report +about: Create a report about a bug or other issue +title: '' +labels: '' +assignees: '' + +--- + + + +#### Description of issue + + + +#### Difference between expected and actual behavior + + + +#### Steps to reproduce + + + +#### Specific information for locating + + + + +#### Length of time in which bug has been known to occur + + + + +#### Client version, Server revision & Game ID + + + + +#### Issue bingo + + +- [ ] Issue could be reproduced at least once +- [ ] Issue could be reproduced by different players +- [ ] Issue could be reproduced in multiple rounds +- [ ] Issue happened in a recent (less than 7 days ago) round +- [ ] [Couldn't find an existing issue about this](https://github.com/NebulaSS13/Nebula/issues) From e887699639a795bba8c2976fcbee11732dfdcaa2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 17 Jan 2025 14:50:47 +1100 Subject: [PATCH 93/95] Reshuffles inventory to allow dynamic intents in the future. --- code/_onclick/hud/_defines.dm | 16 +-- code/_onclick/hud/hud.dm | 2 +- code/_onclick/hud/screen/_screen.dm | 3 + code/_onclick/hud/screen/screen_intent.dm | 135 ++++++++++++------ code/_onclick/hud/screen/screen_maneuver.dm | 2 +- .../client/ui_styles/ui_style_subtypes.dm | 113 ++++++++------- code/modules/mob/mob_intent.dm | 14 +- icons/mob/screen/styles/intents.dmi | Bin 286 -> 0 bytes icons/mob/screen/styles/intents_wide.dmi | Bin 259 -> 0 bytes icons/screen/intents.dmi | Bin 1087 -> 1085 bytes icons/screen/intents_wide.dmi | Bin 658 -> 689 bytes 11 files changed, 171 insertions(+), 114 deletions(-) delete mode 100644 icons/mob/screen/styles/intents.dmi delete mode 100644 icons/mob/screen/styles/intents_wide.dmi diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index c493f34e7bff..5ac7ac42bd02 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -21,16 +21,16 @@ //Lower center, persistent menu #define ui_sstore1 "LEFT+2:10,BOTTOM:5" -#define ui_id "LEFT+3:12,BOTTOM:5" -#define ui_belt "LEFT+4:14,BOTTOM:5" -#define ui_back "CENTER-2:14,BOTTOM:5" +#define ui_back "LEFT+3:22,BOTTOM:5" +#define ui_id "LEFT+4:26,BOTTOM:5" +#define ui_belt "RIGHT-5:16,BOTTOM:5" #define ui_rhand "CENTER-1:16,BOTTOM:5" #define ui_lhand "CENTER:16,BOTTOM:5" #define ui_equip "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand1 "CENTER-1:16,BOTTOM+1:5" #define ui_swaphand2 "CENTER:16,BOTTOM+1:5" -#define ui_storage1 "CENTER+1:16,BOTTOM:5" -#define ui_storage2 "CENTER+2:16,BOTTOM:5" +#define ui_storage1 "RIGHT-3:16,BOTTOM:5" +#define ui_storage2 "RIGHT-4:16,BOTTOM:5" #define ui_alien_head "CENTER-3:12,BOTTOM:5" //aliens #define ui_alien_oclothing "CENTER-2:14,BOTTOM:5"//aliens @@ -52,9 +52,9 @@ #define ui_dropbutton "RIGHT-4:22,BOTTOM:5" #define ui_drop_throw "RIGHT-1:28,BOTTOM+1:7" #define ui_pull_resist "RIGHT-2:26,BOTTOM+1:7" -#define ui_acti "RIGHT-2:26,BOTTOM:5" -#define ui_movi "RIGHT-3:24,BOTTOM:5" -#define ui_attack_selector "RIGHT-3:24,BOTTOM+1:6" +#define ui_acti "CENTER,BOTTOM:5" +#define ui_movi "RIGHT-2:24,BOTTOM:5" +#define ui_attack_selector "RIGHT-2:27,BOTTOM+2:9" #define ui_zonesel "RIGHT-1:28,BOTTOM:5" #define ui_acti_alt "RIGHT-1:28,BOTTOM:5" //alternative intent switcher for when the interface is hidden #define ui_stamina "RIGHT-3:24,BOTTOM+1:5" diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 89bb9944b819..34ee968ab77c 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -202,7 +202,7 @@ qdel(inv_box) // Rebuild offsets for the hand elements. - var/hand_y_offset = 5 + var/hand_y_offset = 21 var/list/elements = hand_hud_objects?.Copy() while(length(elements)) var/copy_index = min(length(elements), 2)+1 diff --git a/code/_onclick/hud/screen/_screen.dm b/code/_onclick/hud/screen/_screen.dm index 7401aae1e383..4e891170d7bd 100644 --- a/code/_onclick/hud/screen/_screen.dm +++ b/code/_onclick/hud/screen/_screen.dm @@ -88,6 +88,9 @@ return TRUE /obj/screen/Click(location, control, params) + var/list/paramlist = params2list(params) + if(paramlist["shift"]) + return examine(usr, 0) if(ismob(usr) && usr.client && usr.canClick() && (!user_incapacitation_flags || !usr.incapacitated(user_incapacitation_flags))) return handle_click(usr, params) return FALSE diff --git a/code/_onclick/hud/screen/screen_intent.dm b/code/_onclick/hud/screen/screen_intent.dm index 2afe31080624..ca75b836812a 100644 --- a/code/_onclick/hud/screen/screen_intent.dm +++ b/code/_onclick/hud/screen/screen_intent.dm @@ -1,68 +1,117 @@ +// Sub-element used for clickable intent selection. +/obj/screen/intent_button + layer = FLOAT_LAYER + plane = FLOAT_PLANE + icon = 'icons/screen/intents.dmi' + icon_state = "blank" + requires_ui_style = FALSE + screen_loc = null // Technically a screen element, but we use vis_contents to draw them. + var/obj/screen/intent/parent + var/decl/intent/intent + var/selected + +/obj/screen/intent_button/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat, intent_owner) + parent = intent_owner + . = ..() + +/obj/screen/intent_button/Destroy() + parent = null + intent = null + return ..() + +/obj/screen/intent_button/proc/set_selected(decl/intent/_intent) + intent = _intent + selected = TRUE + update_icon() + +/obj/screen/intent_button/proc/set_deselected(decl/intent/_intent) + intent = _intent + selected = FALSE + update_icon() + +/obj/screen/intent_button/handle_click(mob/user, params) + . = ..() + if(. && intent && parent) + parent.set_intent(intent) + +/obj/screen/intent_button/examine(mob/user, distance) + SHOULD_CALL_PARENT(FALSE) + if(desc) + to_chat(user, desc) + +/obj/screen/intent_button/on_update_icon() + . = ..() + screen_loc = null + if(intent) + name = intent.name + desc = intent.desc + icon = intent.icon + icon_state = selected ? intent.icon_state : "[intent.icon_state]_off" + /obj/screen/intent name = "intent" - icon = 'icons/mob/screen/styles/intents.dmi' - icon_state = "intents" + icon = 'icons/screen/intents.dmi' + icon_state = "blank" screen_loc = ui_acti requires_ui_style = FALSE apply_screen_overlay = FALSE + var/intent_width = 16 + var/intent_height = 16 + var/list/intent_selectors /obj/screen/intent/Initialize(mapload, mob/_owner, decl/ui_style/ui_style, ui_color, ui_alpha, ui_cat) . = ..() update_icon() + // Hide from right-click. + name = "" + verbs.Cut() + +/obj/screen/intent/Destroy() + QDEL_NULL(intent_selectors) + vis_contents.Cut() + return ..() -/obj/screen/intent/handle_click(mob/user, params) +/obj/screen/intent/proc/set_intent(decl/intent/intent) var/mob/owner = owner_ref?.resolve() - if(!istype(owner) || QDELETED(owner) || user != owner || !params) - return - params = params2list(params) - if(owner.set_intent(get_intent_by_position(owner.get_available_intents(), text2num(params["icon-x"]), text2num(params["icon-y"])))) + if(istype(owner) && istype(intent)) + owner.set_intent(intent) update_icon() -/obj/screen/intent/proc/get_intent_by_position(list/intents, icon_x, icon_y) - if(icon_y <= 16) - if(icon_x <= 16) - return intents[1] - return intents[2] - else if(icon_x <= 16) - return intents[3] - return intents[4] - -/obj/screen/intent/proc/apply_intent_overlay_offset(image/overlay, index) - switch(index) - if(2) - overlay.pixel_x = 16 - if(3) - overlay.pixel_y = 16 - if(4) - overlay.pixel_x = 16 - overlay.pixel_y = 16 +/obj/screen/intent/proc/apply_intent_button_offset(atom/intent_button, index, intent_count) + intent_button.pixel_z = 0 + intent_button.pixel_w = 0 + intent_button.pixel_y = 0 + intent_button.pixel_x = -((intent_count * intent_width)/2) + ((index-1) * intent_width) + +/obj/screen/intent/proc/get_intent_button(index) + . = (index >= 1 && index <= length(intent_selectors)) ? intent_selectors[index] : null + if(!.) + . = new /obj/screen/intent_button(null, owner_ref?.resolve(), null, null, null, null, src) + LAZYADD(intent_selectors, .) /obj/screen/intent/on_update_icon() ..() + var/mob/owner = owner_ref?.resolve() if(!istype(owner) || QDELETED(owner)) return + var/decl/intent/owner_intent = owner.get_intent() - var/i = 0 - var/image/I - for(var/decl/intent/intent as anything in owner.get_available_intents()) + var/i = 1 + var/list/all_intents = owner.get_available_intents() + for(var/decl/intent/intent as anything in all_intents) + var/obj/screen/intent_button/intent_button = get_intent_button(i) if(intent == owner_intent) - I = image(intent.icon, intent.icon_state) + intent_button.set_selected(intent) else - I = image(intent.icon, "[intent.icon_state]_off") + intent_button.set_deselected(intent) i++ - apply_intent_overlay_offset(I, i) - add_overlay(I) - compile_overlays() + apply_intent_button_offset(intent_button, i, length(all_intents)) + add_vis_contents(intent_button) -/obj/screen/intent/binary - icon = 'icons/mob/screen/styles/intents_wide.dmi' + if(i < length(intent_selectors)) + for(var/index = i+1 to length(intent_selectors)) + remove_vis_contents(intent_selectors[index]) -/obj/screen/intent/binary/get_intent_by_position(list/intents, icon_x, icon_y) - if(icon_y <= 16) - return intents[1] - return intents[2] - -/obj/screen/intent/binary/apply_intent_overlay_offset(image/overlay, index) - if(index == 2) - overlay.pixel_y = 16 +/obj/screen/intent/binary + intent_width = 32 diff --git a/code/_onclick/hud/screen/screen_maneuver.dm b/code/_onclick/hud/screen/screen_maneuver.dm index 3a415d71de77..1a66910e8d51 100644 --- a/code/_onclick/hud/screen/screen_maneuver.dm +++ b/code/_onclick/hud/screen/screen_maneuver.dm @@ -9,7 +9,7 @@ user_living.prepare_maneuver() /obj/screen/maneuver/examine(mob/user, distance) - . = ..() + SHOULD_CALL_PARENT(FALSE) if(!isliving(user)) return var/mob/living/user_living = user diff --git a/code/modules/client/ui_styles/ui_style_subtypes.dm b/code/modules/client/ui_styles/ui_style_subtypes.dm index a0de8be1f7e1..7b1f311ebd71 100644 --- a/code/modules/client/ui_styles/ui_style_subtypes.dm +++ b/code/modules/client/ui_styles/ui_style_subtypes.dm @@ -7,56 +7,56 @@ name = "Orange" uid = "ui_style_orange" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/orange/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/orange/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/orange/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/orange/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/orange/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/orange/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/orange/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/orange/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/orange/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/orange/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/orange/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/orange/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/orange/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/orange/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/orange/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/orange/zone_selector.dmi' ) /decl/ui_style/old name = "Old" uid = "ui_style_old" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/old/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/old/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/old/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/old/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/old/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/old/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/old/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/old/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/old/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/old/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/old/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/old/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/old/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/old/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/old/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/old/zone_selector.dmi' ) /decl/ui_style/old_noborder name = "Old (no border)" uid = "ui_style_old_noborder" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/old/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/old/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/old/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/old/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/old_noborder/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/old/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/old_noborder/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/old_noborder/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/old/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/old/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/old/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/old/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/old_noborder/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/old/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/old_noborder/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/old_noborder/zone_selector.dmi' ) /decl/ui_style/white name = "White" uid = "ui_style_white" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/white/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/white/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/white/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/white/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/white/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/white/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/white/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/white/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/white/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/white/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/white/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/white/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/white/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/white/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/white/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/white/zone_selector.dmi' ) use_overlay_color = TRUE use_ui_color = TRUE @@ -65,14 +65,14 @@ name = "Minimalist" uid = "ui_style_minimalist" override_icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/minimalist/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/minimalist/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/minimalist/hands.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/minimalist/interaction.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/minimalist/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/minimalist/movement.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/minimalist/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/minimalist/zone_selector.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/minimalist/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/minimalist/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/minimalist/hands.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/minimalist/interaction.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/minimalist/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/minimalist/movement.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/minimalist/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/minimalist/zone_selector.dmi' ) use_overlay_color = TRUE use_ui_color = TRUE @@ -82,23 +82,22 @@ uid = "ui_style_underworld" restricted = FALSE icons = list( - UI_ICON_ATTACK = 'icons/mob/screen/styles/underworld/attack_selector.dmi', - UI_ICON_FIRE_INTENT = 'icons/mob/screen/styles/underworld/fire_intent.dmi', - UI_ICON_HANDS = 'icons/mob/screen/styles/underworld/hands.dmi', - UI_ICON_HEALTH = 'icons/mob/screen/styles/health.dmi', - UI_ICON_CRIT_MARKER = 'icons/mob/screen/styles/crit_markers.dmi', - UI_ICON_HYDRATION = 'icons/mob/screen/styles/hydration.dmi', - UI_ICON_INTENT = 'icons/mob/screen/styles/intents.dmi', - UI_ICON_INTERACTION = 'icons/mob/screen/styles/underworld/interaction.dmi', - UI_ICON_INTERNALS = 'icons/mob/screen/styles/internals.dmi', - UI_ICON_INVENTORY = 'icons/mob/screen/styles/underworld/inventory.dmi', - UI_ICON_MOVEMENT = 'icons/mob/screen/styles/underworld/movement.dmi', - UI_ICON_NUTRITION = 'icons/mob/screen/styles/nutrition.dmi', - UI_ICON_STATUS_FIRE = 'icons/mob/screen/styles/status_fire.dmi', - UI_ICON_STATUS = 'icons/mob/screen/styles/status.dmi', - UI_ICON_UP_HINT = 'icons/mob/screen/styles/underworld/uphint.dmi', - UI_ICON_ZONE_SELECT = 'icons/mob/screen/styles/underworld/zone_selector.dmi', - UI_ICON_CHARGE = 'icons/mob/screen/styles/charge.dmi' + (UI_ICON_ATTACK) = 'icons/mob/screen/styles/underworld/attack_selector.dmi', + (UI_ICON_FIRE_INTENT) = 'icons/mob/screen/styles/underworld/fire_intent.dmi', + (UI_ICON_HANDS) = 'icons/mob/screen/styles/underworld/hands.dmi', + (UI_ICON_HEALTH) = 'icons/mob/screen/styles/health.dmi', + (UI_ICON_CRIT_MARKER) = 'icons/mob/screen/styles/crit_markers.dmi', + (UI_ICON_HYDRATION) = 'icons/mob/screen/styles/hydration.dmi', + (UI_ICON_INTERACTION) = 'icons/mob/screen/styles/underworld/interaction.dmi', + (UI_ICON_INTERNALS) = 'icons/mob/screen/styles/internals.dmi', + (UI_ICON_INVENTORY) = 'icons/mob/screen/styles/underworld/inventory.dmi', + (UI_ICON_MOVEMENT) = 'icons/mob/screen/styles/underworld/movement.dmi', + (UI_ICON_NUTRITION) = 'icons/mob/screen/styles/nutrition.dmi', + (UI_ICON_STATUS_FIRE) = 'icons/mob/screen/styles/status_fire.dmi', + (UI_ICON_STATUS) = 'icons/mob/screen/styles/status.dmi', + (UI_ICON_UP_HINT) = 'icons/mob/screen/styles/underworld/uphint.dmi', + (UI_ICON_ZONE_SELECT) = 'icons/mob/screen/styles/underworld/zone_selector.dmi', + (UI_ICON_CHARGE) = 'icons/mob/screen/styles/charge.dmi' ) use_overlay_color = TRUE use_ui_color = TRUE diff --git a/code/modules/mob/mob_intent.dm b/code/modules/mob/mob_intent.dm index 39a1a9c5606a..b55b2342ed84 100644 --- a/code/modules/mob/mob_intent.dm +++ b/code/modules/mob/mob_intent.dm @@ -29,6 +29,8 @@ var/intent_flags = 0 /// Descriptive string used in status panel. var/name + /// Descriptive string shown when examined. + var/desc /// Icon used to draw this intent in the selector. var/icon = 'icons/screen/intents.dmi' /// State used to update intent selector. @@ -51,31 +53,35 @@ // Basic subtypes. /decl/intent/harm name = "harm" + desc = "HARM INTENT: you will attempt to damage, disrupt or destroy whatever you interact with." uid = "intent_harm" intent_flags = I_FLAG_HARM icon_state = "intent_harm" - sort_order = 1 // Bottom left of intent selector. + sort_order = 4 // Corresponding to hotkey order. /decl/intent/grab name = "grab" + desc = "GRAB INTENT: you will attempt to grab hold of any object or creature you interact with." uid = "intent_grab" intent_flags = I_FLAG_GRAB icon_state = "intent_grab" - sort_order = 2 // Bottom left of the intent selector. + sort_order = 3 // Corresponding to hotkey order. /decl/intent/help name = "help" + desc = "HELP INTENT: you will attempt to assist, or in general void harming, whatever you interact with." uid = "intent_help" intent_flags = I_FLAG_HELP icon_state = "intent_help" - sort_order = 3 // Top left of the intent selector. + sort_order = 1 // Corresponding to hotkey order. /decl/intent/disarm name = "disarm" + desc = "DISARM INTENT: you will attempt to disarm or incapacitate any creature you interact with." uid = "intent_disarm" intent_flags = I_FLAG_DISARM icon_state = "intent_disarm" - sort_order = 4 // Top right of the intent selector. + sort_order = 2 // Corresponding to hotkey order. // Used by nymphs. /decl/intent/harm/binary diff --git a/icons/mob/screen/styles/intents.dmi b/icons/mob/screen/styles/intents.dmi deleted file mode 100644 index 3b0b33f849097d5e990704dff20e96350ecb11d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 286 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnF3?v&v(vJfv{s5m4*8>L*WRx^m+PlqPz7Z() zV3GGUAjMb`eukTAW;zSx}OhpU1#ZF(){zps4iwm*9erU!Q1s z>uQ}lb3S-OsKG_!2aj~l`)HnIDC+6mVPPC(eA(DbVa}sTM<#_R1Zx_vS210`B%-t1 zSatIX35}!^M`wmjnK7FyQCoY*ubmCNYz(z0r3L0kt+WDK>*nd=7@{#TIYESlnNi~G zf*c;UHiKD?l1j-OizTNV3~FmLs1o4TXlzt$2{SqJMMl`AwM)1qETN&Tx#RH%UVhg@ d4;L~lW^DW$d?_L*WRx^m+PlqPzVY3U z&5=NH#*!evU)e_1!5cyiE*d|0q;uX!^CUx2Pwx&3;~?Y9#$F0@9!)wjDMTSy(|Em#>G~xRo!!Q& zn^#C^B%L@qGi=I?*<6X*+B<&jY~W>Ms68nyFh6Rg70_BePZ!4!iK)o~ysXUvZGZnC ze4u|gtiwa+a9+oW*jL77YnhsNa(Hi5P|}uQn_129MDl9ksXiGypiTx)S3j3^P6qnp zT3Vosj8UKeMngF|Mmae@M%mZU(b>?@)Y&*UE<8#+pq-0lU?@^UQbtcXme9@3W!ykl37fGD?l!e&reGu#nq&!2f3US^$^$N z)1j>3>gNKEN&uj{i_ta*u>Al40<}p*K~zYImD1sMqA(BzV5kMbZcSDx0=g^d3R0l^ z{(q0R_f9~Gi}rL5f+8LC!t<09 zo~NBa{!b^?YU6~`TPHL@l6(#H6uhN3K&j1cv&qy5w7ldqUm?pkJGD{S2ntzW?|%ym zk~B>mpz>Vh0J*XNnTV|}Y=tC!dxJ=mbO0*PG6iH6I@u!?u}2IbNm4!&fTc5)ji6vJ z2VE3+5nvB^T>%Q@oDjYP(7(86xPpKUaU&wuNY8O#0u(_}?6tN#;h?-VyFvSK6l-*^ zWImhUaG65yTC=77VH|5BbH!HJ8-IZvD9-@|U@M^59>%eXkV0v)W;YhdKPAh$U>XEm zIJ5aY2hGk8S`X*_{mb|5>+Kz#@VwFq&ofRS|J{jW`NxUUoSZNNs46}KsOzu6xp_Zd zz(;!nj5+O2r_M}3^RPnKpLXVCx+|!fs;Z;}K;5>r15DqW9-ucPXwKF7e1C2zj%D3` zd_c5yI{?#nodL26ps5v{aqB=@GCY zZbU?h^d1K$zzl%-)qC?<31By9AC96#_eSP(`U}?yK<`)_`PHXPN#=^Jur~rbP@V(t z#!(JI0FQz|gcNG)lHFJ!|1Tzh4OP|6T_WJZoz1uBU^DGO--4OD^xfO+tFiy9W?29Lh68{A1OMbL zxQhS)mK*@E1h)VH|1~wr0093jJm|^*06Kt1IXOl{IjhnC+0fA0*U&gOE&u=k0Ceb} zor`5)QZ1JMWl~b4kB@I!TA+)JQJ?>SeP}vHIXOQ@z`(%K*(=b{)Y&{rJVR1OPhn4J zbbyPMpr5C)vRn4<00001bW%=J06^y0W&i*Hmyyd!e>1NnHLoN-Be5t~iHkEOv#1!P zfQvJ&C^0t`!bVq{UX++btlEs!oC0FireqeA;0ln7On3iMLopz_;e^M zxca$(BMAWEz=11Q?Yg%B00O#6L_t(YiIvh}cbYI51>m5zfE091#6|>kt2vVj`~UxL z_a=bGf8x%34}u@^BsXs&MBtSWGp~f0dnH7$@G6+Scr}~9dNm(F;Da#a(}O6w2XSmk z5R71%yevoXmfnLbwv(^25hVXyAzo#uMUagvgh?2Nb_sweO(PG)t2m3}I9Q<^NS5Jp zxlAZ#^C*3LgGi(F3NmI{2U&*K3~>^>!WBeOf6C_u#6P%axC|giM?qkPT_}wRu8&8EN>%`sbO0k!TUC!M=u&HKmmrW;QAi-CkmP`&r~}G@aJP z2W1a<6a<{OaN~Iniph^k_2)eT2GaWBUAnn^ZlpVCy?Oq6i<4JE7_Y>)I{o(Qe`L;H zeHQ>t^CbAX+yP_GyYsm<|Gh%nop%#8*dcr;0RwR(R-7=r!+}{~CIQnRJ{-jf>5c8r`43z> z*(KXoY=zkfTtj&dQ+MOU;SIZFE>oSD#sT|p^5AZYfD^ZF{DYHz?(#i*z5fCn-lZ>X Su=os{n=r0I&oAmK=Zp z01a9Q|EsHHgkrY<0Du4k|1~wr0093jJZ1m@z`($aJw3Guia`JX00DGTPE!Ct=GbNc z004=RaZGX=ngIA6z61c==2JxrfHpv@GNA)N>hV+LFz7viGFZaW4PXKb zk#vCgv|i=mS{MV=%UKs=noKb;e=UYKTQN)mB#y<#-O8K*<_0m;481oQ8Q>fvw3ei^ z*)M+p9^;$=*0Bh0Gk|UcIB$6|n=23ic~t~B@2qo9d+##p5ISq80~ z)acuhZOORIL|@fmOt9sw%@ z?7G`00NmYNMx77=i4$l> zJ;=Nb5Q3zpq}0MI0Ds>H5WD&TH_tObqX#kbk|9sKi81pC|5k4UoZ^Q7aSL4@qzymZ qgGRtH3OH?y_wn^H4i?jBIsXE#);tX4Mw0000b^V1(F4j7g`_)0{{R3l|zoU0000pP)t-sz`(!=fB=910I~n8|EsG2h64bw z1h)VH0G1qp00aLuHOc@0|1CTXS_ozU0Az$>j6FSl^c%GR0004WQchCP+qS3|sjj z-jJztuVFanhvD378pg}d!|)6MoC$$P;QJ(hPXo-sJmf;13$TO=kf+WCAQHlRO*#f* zr-B+lk|H8jfL8!QfFVE;WM|?xAl1Tz!5uI|AK* z0H5=D3327Wu>o*~l(6)GSpb|@>;NK2A({?QehSP_z{6R{0uh(bRMiFlAK>XQeSMtW zHVo&|FmnDrj4i!~kr>!6$i`#i`>xLdn3H(MSJHVKkY|~5W=fiBNjB0)fV|%XxK~3! z+tmd$_M$X^OV2CdeF3Ztvo1|6nP(YT`g>o2{RIA0upbp@4;!NZhj0gu;zz(Kbbzvi zW)EcN3;|tmV;>k$E^UVGL~CTSZPy1L&O$ocSoY(mz|&#+_Bj6nm$pdC&B!yX00000 LNkvXXu0mjfG3xYl From d419f9519d833527e9d1b636f1c4811d5332d832 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Sun, 19 Jan 2025 06:54:22 +1100 Subject: [PATCH 94/95] Automatic changelog generation for PR #4748 [ci skip] --- html/changelogs/AutoChangeLog-pr-4748.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4748.yml diff --git a/html/changelogs/AutoChangeLog-pr-4748.yml b/html/changelogs/AutoChangeLog-pr-4748.yml new file mode 100644 index 000000000000..36462616a457 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4748.yml @@ -0,0 +1,5 @@ +author: MistakeNot4892 +changes: + - {tweak: 'Intents have been rewritten and moved, please report any issues with + intent selection.'} +delete-after: true From 90206e04a3fd83527eea7485d1eabc25f289aad2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 19 Jan 2025 11:07:09 +1100 Subject: [PATCH 95/95] Updating Pyrelight to compile on new dev. --- maps/karzerfeste/jobs/_job.dm | 2 +- maps/karzerfeste/jobs/icons.dmi | Bin 453 -> 0 bytes maps/karzerfeste/outfits/guild.dm | 2 +- maps/karzerfeste/outfits/shrine.dm | 2 +- mods/pyrelight/undead/undead.dm | 2 +- 5 files changed, 4 insertions(+), 4 deletions(-) delete mode 100644 maps/karzerfeste/jobs/icons.dmi diff --git a/maps/karzerfeste/jobs/_job.dm b/maps/karzerfeste/jobs/_job.dm index 5c28a069c4d7..3d82f49ef494 100644 --- a/maps/karzerfeste/jobs/_job.dm +++ b/maps/karzerfeste/jobs/_job.dm @@ -1,5 +1,4 @@ /datum/map/karzerfeste - id_hud_icons = 'maps/karzerfeste/jobs/icons.dmi' default_job_type = /datum/job/karzerfeste/local/traveller allowed_jobs = list( /datum/job/karzerfeste/guild/master, @@ -49,3 +48,4 @@ skill_points = 20 spawn_positions = 1 total_positions = 1 + hud_icon_state = "hudblank" diff --git a/maps/karzerfeste/jobs/icons.dmi b/maps/karzerfeste/jobs/icons.dmi deleted file mode 100644 index 6b1401249299df8150378327b1043504a6296850..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 453 zcmV;$0XqJPP)005u@0{{R3_Mwly0000CP)t-sz`(!& z001*HGynhpIur|E00001bW%=J06^y0W&i*I7J5`zbVOxyV{&P5bZKvH004NLm6W?~ z!!Qg*XX`73WH0(!yA%nE49!0%79$C^sDOIp_e(iN$Aa1@_+0Apn)Y6Q9=}d!efU19 z29!fW{h{BVp4D^@ws=0gy{gGWaK1baxtIc6?sjUjfijmbYPyn%@TmU)Uv0$&(;X$~ zWi_}+Knw^m70-5k!bGkbvV%f`8$kx-r=fvFyaaSM#jzWIMdPChtgGDZpTe=#GGBR>sS8dfXsKBpx5 z5L|D|A=qL v7~XFf_B1?ay7;7vBMjqv00000001_A6;udhEHNdz00000NkvXXu0mjfB|Ele diff --git a/maps/karzerfeste/outfits/guild.dm b/maps/karzerfeste/outfits/guild.dm index 48dfea9b96d1..6d24c570526b 100644 --- a/maps/karzerfeste/outfits/guild.dm +++ b/maps/karzerfeste/outfits/guild.dm @@ -21,7 +21,7 @@ /decl/outfit/job/karzerfeste/adventurer name = "Karzerfeste - Adventurer" belt = /obj/item/bladed/longsword - suit_store = /obj/item/shield/buckler + suit_store = /obj/item/shield/crafted/buckler suit = /obj/item/clothing/suit/armor/forged/brigandine uniform = list( /obj/item/clothing/pants/trousers, diff --git a/maps/karzerfeste/outfits/shrine.dm b/maps/karzerfeste/outfits/shrine.dm index 5faf5ed9f1ff..999b608e9236 100644 --- a/maps/karzerfeste/outfits/shrine.dm +++ b/maps/karzerfeste/outfits/shrine.dm @@ -20,7 +20,7 @@ name = "Karzerfeste - Shrine Cleric" suit = /obj/item/clothing/suit/armor/forged/cuirass belt = /obj/item/bladed/longsword // TODO: mace and magic - suit_store = /obj/item/shield/buckler + suit_store = /obj/item/shield/crafted/buckler /decl/outfit/job/karzerfeste/shrine/gravekeeper name = "Karzerfeste - Shrine Gravekeeper" diff --git a/mods/pyrelight/undead/undead.dm b/mods/pyrelight/undead/undead.dm index c2d0f90a9d35..d304b7ddefe7 100644 --- a/mods/pyrelight/undead/undead.dm +++ b/mods/pyrelight/undead/undead.dm @@ -23,7 +23,7 @@ put_in_active_hand(new /obj/item/bladed/broadsword(src)) else put_in_active_hand(new /obj/item/bladed/shortsword(src)) - put_in_inactive_hand(new /obj/item/shield/buckler(src)) + put_in_inactive_hand(new /obj/item/shield/crafted/buckler(src)) return if(species_name == SPECIES_KOBALOI)

    ^f@RTAY9lmAJ4k7 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 Date: Sun, 12 Jan 2025 22:55:23 +1100 Subject: [PATCH 54/95] Making fluid alpha masks a bit more selective. --- code/game/alpha_masks.dm | 6 +- code/game/objects/structures/railing.dm | 3 + .../stool_bed_chair_nest_sofa/pew.dm | 3 + code/game/objects/structures/tables.dm | 4 + maps/shaded_hills/shaded_hills-woods.dmm | 1842 +++++++++-------- 5 files changed, 965 insertions(+), 893 deletions(-) diff --git a/code/game/alpha_masks.dm b/code/game/alpha_masks.dm index 9c8a341a4823..3eb68a3b3435 100644 --- a/code/game/alpha_masks.dm +++ b/code/game/alpha_masks.dm @@ -54,6 +54,10 @@ var/global/list/_alpha_masks = list() /atom/movable/proc/get_turf_alpha_mask_states() return 'icons/effects/alpha_mask.dmi' +/atom/movable/proc/should_have_alpha_mask() + // Mobs and obj both need to avoid this when on structures. Looks wonky. + return simulated && isturf(loc) && !(locate(/obj/structure) in loc) + // Proc called by /turf/Entered() to update a mob's mask overlay. /atom/movable/proc/update_turf_alpha_mask() set waitfor = FALSE @@ -65,7 +69,7 @@ var/global/list/_alpha_masks = list() if(QDELETED(src)) return var/turf/our_turf = loc - var/mask_state = isturf(our_turf) && our_turf.get_movable_alpha_mask_state(src) + var/mask_state = isturf(our_turf) && should_have_alpha_mask() && our_turf.get_movable_alpha_mask_state(src) if(mask_state) var/atom/movable/alpha_mask/mask = get_or_create_alpha_mask(src) if(mask) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 66f0afe17852..96c1baf5b0aa 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -19,6 +19,9 @@ var/broken = FALSE var/neighbor_status = 0 +/obj/structure/railing/should_have_alpha_mask() + return simulated && isturf(loc) && !(locate(/obj/structure/railing) in get_step(loc, SOUTH)) + /obj/structure/railing/mapped anchored = TRUE color = COLOR_ORANGE diff --git a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm index b14f6db9257d..59da1232a7c8 100644 --- a/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm +++ b/code/game/objects/structures/stool_bed_chair_nest_sofa/pew.dm @@ -11,6 +11,9 @@ anchored = TRUE var/connect_neighbors = TRUE +/obj/structure/bed/chair/bench/should_have_alpha_mask() + return simulated && isturf(loc) && connect_neighbors && !(locate(/obj/structure/bed/chair/bench) in get_step(loc, SOUTH)) + /obj/structure/bed/chair/bench/single name = "slatted seat" base_icon = "bench_standing" diff --git a/code/game/objects/structures/tables.dm b/code/game/objects/structures/tables.dm index e1fced7cee86..459216c264a5 100644 --- a/code/game/objects/structures/tables.dm +++ b/code/game/objects/structures/tables.dm @@ -26,6 +26,7 @@ var/can_flip = TRUE var/is_flipped = FALSE var/decl/material/additional_reinf_material + var/base_type = /obj/structure/table var/top_surface_noun = "tabletop" @@ -37,6 +38,9 @@ /// Whether items can be placed on this table via clicking. var/can_place_items = TRUE +/obj/structure/table/should_have_alpha_mask() + return simulated && isturf(loc) && !(locate(/obj/structure/table) in get_step(loc, SOUTH)) + /obj/structure/table/clear_connections() connections = null diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 66168daa63f0..3d37aadb6754 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -3,14 +3,27 @@ /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/path/basalt, /area/shaded_hills/outside/woods) +"az" = ( +/obj/abstract/force_fluid_flow/northwest, +/obj/abstract/force_fluid_flow/northwest, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "bL" = ( /obj/abstract/landmark/latejoin, /turf/floor/path/running_bond/basalt, /area/shaded_hills/outside/woods) +"cA" = ( +/obj/abstract/force_fluid_flow/east, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "cN" = ( /obj/item/bladed/knife, /turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) +"cV" = ( +/obj/abstract/force_fluid_flow/northeast, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "dp" = ( /turf/wall/log/walnut, /area/shaded_hills/outside/river/woods) @@ -33,6 +46,11 @@ "ix" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/caves/woods) +"iA" = ( +/obj/abstract/force_fluid_flow/northeast, +/obj/abstract/force_fluid_flow/northeast, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "kx" = ( /turf/floor/dirt, /area/shaded_hills/outside/river/woods) @@ -71,6 +89,12 @@ "te" = ( /turf/floor/rock/basalt, /area/shaded_hills/outside/woods) +"tU" = ( +/obj/abstract/force_fluid_flow/northwest, +/obj/abstract/force_fluid_flow/northwest, +/obj/abstract/force_fluid_flow/northwest, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "ul" = ( /turf/floor/mud/water, /area/shaded_hills/outside/river/woods) @@ -94,6 +118,10 @@ "zq" = ( /turf/floor/path/basalt, /area/shaded_hills/outside/river/woods) +"zv" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "Al" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/caves/unexplored/woods) @@ -105,6 +133,10 @@ /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/dirt, /area/shaded_hills/outside/woods) +"CS" = ( +/obj/abstract/force_fluid_flow/northwest, +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "DB" = ( /obj/structure/drying_rack/ebony, /turf/floor/dirt, @@ -129,6 +161,10 @@ "GB" = ( /turf/floor/carpet/rustic, /area/shaded_hills/forester_hut) +"GU" = ( +/obj/abstract/force_fluid_flow/northwest, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "HA" = ( /turf/floor/grass, /area/shaded_hills/outside/woods) @@ -199,16 +235,33 @@ /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/barren, /area/shaded_hills/caves/woods) +"Xh" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "Xt" = ( /turf/floor/mud, /area/shaded_hills/caves/woods) +"Yf" = ( +/obj/abstract/force_fluid_flow/east, +/obj/abstract/force_fluid_flow/east, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river/woods) "YB" = ( /obj/abstract/landmark/latejoin, /turf/floor/dirt, /area/shaded_hills/outside/woods) +"YK" = ( +/obj/abstract/force_fluid_flow/northeast, +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "YO" = ( /turf/unsimulated/mask, /area/shaded_hills/outside/river/woods) +"Za" = ( +/obj/abstract/force_fluid_flow/east, +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "Zs" = ( /obj/structure/wall_sconce/lantern{ dir = 1; @@ -216,6 +269,11 @@ }, /turf/floor/path/basalt, /area/shaded_hills/outside/river/woods) +"Zz" = ( +/obj/abstract/force_fluid_flow/northwest, +/obj/abstract/force_fluid_flow/northwest, +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "ZO" = ( /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/grass, @@ -16411,21 +16469,21 @@ ul ul ul ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh ul ul ul @@ -16561,25 +16619,25 @@ ul ul ul ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +YK +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +CS ul ul ul @@ -16711,29 +16769,29 @@ ul ul ul ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul +YK +Xh +Xh +Xh +Xh +Xh +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +Xh +Xh +CS ul ul ul @@ -16862,33 +16920,33 @@ ul ul ul ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul +YK +YK +Xh +Xh +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +az +CS +CS +CS ul JI AN @@ -17012,36 +17070,36 @@ ul ul ul ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul +YK +YK +YK +YK +cV +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +GU +GU +GU +GU +CS JI AN ul @@ -17163,37 +17221,37 @@ ul ul ul ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +YK +YK +cV +cV +cV +cV +cV +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +GU +GU +GU +GU +GU JI AN ul @@ -17314,37 +17372,37 @@ ul ul ul ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +YK +YK +cV +cV +cV +cV +cV +cV +cV +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +GU +GU +GU +GU dp JI AN @@ -17465,43 +17523,43 @@ ul ul ul ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +YK +YK +cV +cV +cV +cV +cV +cV +cV +cV +cV +zv +zv +zv +zv +zv +zv +zv +zv +Xh +Xh +zv +zv +zv +zv +zv +zv +zv +GU +GU +GU +GU +GU JI AN -PO -ul +zv +Xh ul ul ul @@ -17616,45 +17674,45 @@ ul ul ul ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -JI -AN -PO -ul -ul +YK +YK +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV +zv +zv +zv +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +zv +zv +GU +GU +GU +GU +GU +GU +JI +AN +zv +Xh +Xh ul ul ul @@ -17766,24 +17824,23 @@ ul ul ul ul -ul -ul -ul -PO +Za +YK +YK +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul ul ul ul @@ -17794,22 +17851,23 @@ ul ul ul ul -ul -PO -PO -PO -PO -PO -PO -PO +CS +CS +GU +GU +GU +GU +GU +GU +GU JI AN -PO -PO -ul -ul -ul -ul +zv +zv +Xh +Xh +Xh +CS ul ul ul @@ -17918,20 +17976,20 @@ ul ul ul ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +Za +Za +Za +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV +cV PO ul ul @@ -17946,23 +18004,23 @@ ul ul ul ul -ul -PO -PO -PO -PO -PO -PO +CS +GU +GU +GU +GU +GU +GU dp JI AN dp -PO -PO -ul -ul -ul -ul +zv +zv +Xh +CS +CS +CS ul ul ul @@ -18069,20 +18127,20 @@ ul ul ul ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +YK +YK +Za +cA +cA +cV +cV +cV +cV +cV +cV +cV +cV +cV ul ul ul @@ -18099,23 +18157,23 @@ zp zp ul ul -ul -ul -PO -PO -PO -PO -PO +CS +CS +GU +GU +GU +GU +GU JI AN -PO -PO -PO -PO -ul -ul -ul -ul +zv +zv +zv +GU +CS +CS +CS +CS ul ul ul @@ -18221,19 +18279,19 @@ ul ul ul ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +YK +YK +YK +cA +cA +cA +cV +cV +cV +cV +cV +cV +cV ul ul ul @@ -18253,23 +18311,23 @@ zp ul ul ul -ul -PO -PO -PO -PO +CS +GU +GU +GU +GU JI AN -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul +zv +zv +zv +GU +GU +GU +CS +CS +CS +CS ul ul ul @@ -18372,20 +18430,20 @@ ul ul ul ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul +YK +YK +YK +cV +cV +cA +cA +cA +iA +cV +cV +cV +cV +YK ul ul ul @@ -18406,38 +18464,26 @@ ul ul ul ul -ul -ul -PO -PO +CS +CS +GU +GU JI AN -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +zv +zv +GU +GU +GU +GU +GU +GU +CS +CS +CS +CS +CS +Xh ul ul ul @@ -18447,6 +18493,18 @@ ul ul ul ul +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh ul ul ul @@ -18523,20 +18581,20 @@ ul ul ul ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul +YK +YK +YK +YK +cV +cV +cV +cA +Yf +cA +cV +cV +YK +YK ul ul ul @@ -18560,46 +18618,46 @@ ul ul ul ul -ul +CS dp JI AN dp -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +GU +GU +GU +GU +GU +GU +GU +GU +GU +CS +CS +CS +CS +CS +Xh ul ul +Xh +Xh +Xh +Xh +Xh +YK +YK +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +CS ul ul ul @@ -18666,27 +18724,27 @@ ma ma ul ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +YK +YK +cV +cV +cV +cV +cV +cA +cA +cV +YK ul ul ul @@ -18713,46 +18771,46 @@ ul ul ul ul -ul +CS JI AN ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +CS +Xh +Xh +Xh +Xh +Xh +Xh +zv +zv +cV +zv +zv +zv +zv +zv +zv +Xh +Xh +Xh +Xh +CS +Xh ul ul ul @@ -18818,26 +18876,26 @@ ma ma ma ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +YK +cV +cV +cV +cV +cV +cV +cV +cV +Za ul ul ul @@ -18868,47 +18926,47 @@ ul ul JI AN -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul +CS +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +cV +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +CS +Xh +CS +Xh +Xh +Xh uA uA uA @@ -18970,25 +19028,25 @@ ma ma ma ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -ul +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +cV +cV +cV +cV +cV +cV +cV +cV +YK ul ul ul @@ -19013,54 +19071,54 @@ zp zp zp zp -zp -ul -ul -ul -ul -JI -AN -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +zp +ul ul ul ul +JI +AN +CS +CS +CS +GU +GU +GU +GU +GU +GU +GU +GU +GU +GU +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +cV +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +GU +zv +GU +Xh +Xh +Xh uA uA uA @@ -19122,25 +19180,25 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul +Xh +Xh +Xh +Xh +Xh +Xh +Xh +Xh +zv +zv +cV +cV +cV +cV +cV +cV +cV +YK +YK ul ul ul @@ -19174,45 +19232,45 @@ JI AN dp ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO +CS +CS +CS +CS +GU +GU +GU +GU +GU +GU +GU +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +cV +zv +zv +Xh +Xh +zv +zv +zv +zv +zv +zv +GU +zv +GU +zv +zv +zv uA uA uA @@ -19274,25 +19332,25 @@ hT ma ma ma -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul +Xh +Xh +Xh +Xh +Xh +Xh +zv +zv +zv +zv +cV +cV +cV +cV +cV +cV +cV +YK +YK ul ul ul @@ -19329,42 +19387,42 @@ ul ul ul ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO +CS +CS +CS +GU +GU +tU +GU +GU +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +Xh +YK +Xh +Xh +Xh +Xh +Xh +Xh +Xh +zv +zv +GU +GU +zv +GU +zv +zv +zv uA uA uA @@ -19426,24 +19484,24 @@ hT hT hT hT -ul -ul -ul -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul +Xh +Xh +Xh +zv +zv +zv +zv +zv +zv +zv +cV +cV +cV +cV +cV +YK +YK +YK ul ul ul @@ -19483,23 +19541,23 @@ ul ul ul ul -ul -ul -ul -ul -PO -PO -PO -PO -ul -ul -ul -PO -PO -PO -ul -ul -ul +CS +CS +CS +Zz +GU +GU +zv +zv +Xh +Xh +Xh +zv +zv +zv +Xh +Xh +Xh ul ul ul @@ -19510,13 +19568,13 @@ ul ul ul ul -PO -PO -PO -PO -PO -PO -PO +GU +GU +zv +GU +zv +zv +zv uA uA uA @@ -19578,23 +19636,23 @@ hT hT hT hT -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul -ul +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +cV +cV +cV +cV +YK +YK +YK ul ul ul @@ -19637,7 +19695,19 @@ ul ul ul ul +CS +CS +CS +Xh +Xh +Xh ul +Xh +Xh +Xh +Xh +Xh +Xh ul ul ul @@ -19652,23 +19722,11 @@ ul ul ul ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -PO -PO -PO -PO -PO +zv +GU +zv +zv +zv uA uA uA @@ -19730,21 +19788,21 @@ hT hT hT hT -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +cV +cV +cV +YK +YK ul ul ul @@ -19789,10 +19847,10 @@ ul ul ul ul -ul -ul -ul -ul +CS +CS +CS +Xh ul ul ul @@ -19817,10 +19875,10 @@ ul ul ul ul -ul -PO -PO -PO +CS +zv +zv +zv uA uA uA @@ -19882,19 +19940,19 @@ hT hT hT hT -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +cV +cV +YK ul ul ul @@ -19969,10 +20027,10 @@ ul ul ul ul -ul -ul -ul -PO +CS +Xh +Xh +zv uA uA uA @@ -20034,18 +20092,18 @@ hT hT hT PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -PO -ul -ul +zv +zv +zv +zv +zv +zv +zv +zv +zv +zv +YK +YK ul ul ul @@ -20124,7 +20182,7 @@ ul ul ul ul -ul +Xh uA uA uA @@ -20186,16 +20244,16 @@ hT hT hT PO -PO -ul -ul -ul -PO -PO -PO -ul -ul -ul +zv +Xh +Xh +Xh +zv +zv +zv +Xh +Xh +Xh ul ul ul From 0e748a690dbc5c06392872afb6bf59e089b8f863 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Sun, 12 Jan 2025 23:00:50 +1100 Subject: [PATCH 55/95] Replacing the landmarks on the Shaded Hills map with single-direction ones for cohesion. --- maps/shaded_hills/shaded_hills-grassland.dmm | 646 ++-- maps/shaded_hills/shaded_hills-woods.dmm | 3330 +++++++++--------- 2 files changed, 1967 insertions(+), 2009 deletions(-) diff --git a/maps/shaded_hills/shaded_hills-grassland.dmm b/maps/shaded_hills/shaded_hills-grassland.dmm index b885f19cf3f4..88c27eab97d1 100644 --- a/maps/shaded_hills/shaded_hills-grassland.dmm +++ b/maps/shaded_hills/shaded_hills-grassland.dmm @@ -125,6 +125,10 @@ /obj/item/bag/sack, /turf/floor/woven, /area/shaded_hills/caves/unexplored/south) +"qj" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river) "qy" = ( /turf/wall/natural/basalt/shaded_hills, /area/shaded_hills/caves/river) @@ -136,6 +140,10 @@ "sS" = ( /turf/floor/mud/water, /area/shaded_hills/caves/unexplored/south) +"sT" = ( +/obj/abstract/force_fluid_flow/north, +/turf/floor/mud/water/deep, +/area/shaded_hills/outside/river) "te" = ( /turf/unsimulated/mask, /area/shaded_hills/caves/unexplored/south) @@ -19512,7 +19520,7 @@ Gh Gh My My -My +sT lC lC lC @@ -19529,8 +19537,8 @@ lC lC lC lC -My -My +qj +sT My Gh Gh @@ -19572,12 +19580,12 @@ My My My My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT My My My @@ -19662,9 +19670,9 @@ Gh Gh Gh My -My -My -My +sT +sT +sT lC lC lC @@ -19681,9 +19689,9 @@ lC lC lC lC -My -My -My +sT +sT +sT My My Gh @@ -19717,23 +19725,23 @@ Gh Gh My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My Gh @@ -19753,14 +19761,14 @@ JN My My My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -19771,15 +19779,15 @@ My Gh My My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -19814,9 +19822,9 @@ My My My My -My -My -My +sT +sT +sT lC lC lC @@ -19833,11 +19841,11 @@ lC lC lC lC -My -My -My -My -My +sT +sT +sT +sT +sT My My Gh @@ -19867,27 +19875,27 @@ Gh Gh My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -19901,38 +19909,38 @@ Gh Xd vX Xd +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -19960,15 +19968,15 @@ My My My My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT lC lC lC @@ -19986,12 +19994,12 @@ lC lC lC My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT My My My @@ -20017,6 +20025,13 @@ Gh Gh Gh My +sT +sT +sT +sT +sT +sT +sT My My My @@ -20028,20 +20043,13 @@ My My My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT My My My @@ -20053,42 +20061,42 @@ My Xd vX Xd -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -20107,19 +20115,19 @@ My My My My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My lC lC @@ -20140,15 +20148,15 @@ lC Gh My My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -20170,10 +20178,10 @@ Gh Gh My My -My -My -My -My +sT +sT +sT +sT My My Gh @@ -20190,57 +20198,57 @@ Gh My My My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT EE EE Xd -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -20252,21 +20260,21 @@ zp zp Gh My -My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -20299,18 +20307,18 @@ My My My My +sT +sT +sT +sT +sT +sT +sT My My My -My -My -My -My -My -My -My -My -My +sT +sT My Gh Gh @@ -20345,38 +20353,38 @@ Gh My My My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT JN EE EE EE JN +sT +sT My My My +sT +sT +sT My My -My -My -My -My -My -My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT +sT My Gh My @@ -20404,14 +20412,14 @@ zp Gh Gh My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT My My My @@ -20456,14 +20464,14 @@ My My My My -My -My -My -My -My -My -My -My +sT +sT +sT +sT +sT +sT +sT +sT My Gh Gh @@ -20501,15 +20509,15 @@ My My My My -My -My -My -My -My +sT +sT +sT +sT +sT EE vX EE -My +sT My My Gh @@ -20524,9 +20532,9 @@ My My My My -My -My -My +sT +sT +sT My My Gh diff --git a/maps/shaded_hills/shaded_hills-woods.dmm b/maps/shaded_hills/shaded_hills-woods.dmm index 3d37aadb6754..06a9695d6345 100644 --- a/maps/shaded_hills/shaded_hills-woods.dmm +++ b/maps/shaded_hills/shaded_hills-woods.dmm @@ -3,27 +3,14 @@ /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/path/basalt, /area/shaded_hills/outside/woods) -"az" = ( -/obj/abstract/force_fluid_flow/northwest, -/obj/abstract/force_fluid_flow/northwest, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "bL" = ( /obj/abstract/landmark/latejoin, /turf/floor/path/running_bond/basalt, /area/shaded_hills/outside/woods) -"cA" = ( -/obj/abstract/force_fluid_flow/east, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "cN" = ( /obj/item/bladed/knife, /turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) -"cV" = ( -/obj/abstract/force_fluid_flow/northeast, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "dp" = ( /turf/wall/log/walnut, /area/shaded_hills/outside/river/woods) @@ -46,11 +33,6 @@ "ix" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/caves/woods) -"iA" = ( -/obj/abstract/force_fluid_flow/northeast, -/obj/abstract/force_fluid_flow/northeast, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "kx" = ( /turf/floor/dirt, /area/shaded_hills/outside/river/woods) @@ -89,15 +71,6 @@ "te" = ( /turf/floor/rock/basalt, /area/shaded_hills/outside/woods) -"tU" = ( -/obj/abstract/force_fluid_flow/northwest, -/obj/abstract/force_fluid_flow/northwest, -/obj/abstract/force_fluid_flow/northwest, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) -"ul" = ( -/turf/floor/mud/water, -/area/shaded_hills/outside/river/woods) "uA" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/outside/river/woods) @@ -118,10 +91,6 @@ "zq" = ( /turf/floor/path/basalt, /area/shaded_hills/outside/river/woods) -"zv" = ( -/obj/abstract/force_fluid_flow/north, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "Al" = ( /turf/unsimulated/dark_filler, /area/shaded_hills/caves/unexplored/woods) @@ -133,10 +102,6 @@ /obj/abstract/landmark/start/shaded_hills/traveller/learned, /turf/floor/dirt, /area/shaded_hills/outside/woods) -"CS" = ( -/obj/abstract/force_fluid_flow/northwest, -/turf/floor/mud/water, -/area/shaded_hills/outside/river/woods) "DB" = ( /obj/structure/drying_rack/ebony, /turf/floor/dirt, @@ -144,6 +109,9 @@ "DX" = ( /turf/floor/mud/water/deep, /area/shaded_hills/caves/river/woods) +"En" = ( +/turf/floor/mud/water, +/area/shaded_hills/outside/river/woods) "ES" = ( /turf/floor/grass, /area/shaded_hills/outside/river/woods) @@ -161,10 +129,6 @@ "GB" = ( /turf/floor/carpet/rustic, /area/shaded_hills/forester_hut) -"GU" = ( -/obj/abstract/force_fluid_flow/northwest, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "HA" = ( /turf/floor/grass, /area/shaded_hills/outside/woods) @@ -214,8 +178,9 @@ /turf/floor/wood/rough/walnut, /area/shaded_hills/forester_hut) "PO" = ( +/obj/abstract/force_fluid_flow/north, /turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) +/area/shaded_hills/outside/river/lake) "SI" = ( /turf/wall/log/walnut, /area/shaded_hills/forester_hut) @@ -235,32 +200,22 @@ /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/barren, /area/shaded_hills/caves/woods) -"Xh" = ( +"Wo" = ( /obj/abstract/force_fluid_flow/north, -/turf/floor/mud/water, +/turf/floor/mud/water/deep, /area/shaded_hills/outside/river/woods) "Xt" = ( /turf/floor/mud, /area/shaded_hills/caves/woods) -"Yf" = ( -/obj/abstract/force_fluid_flow/east, -/obj/abstract/force_fluid_flow/east, -/turf/floor/mud/water/deep, -/area/shaded_hills/outside/river/woods) "YB" = ( /obj/abstract/landmark/latejoin, /turf/floor/dirt, /area/shaded_hills/outside/woods) -"YK" = ( -/obj/abstract/force_fluid_flow/northeast, -/turf/floor/mud/water, -/area/shaded_hills/outside/river/woods) "YO" = ( /turf/unsimulated/mask, /area/shaded_hills/outside/river/woods) -"Za" = ( -/obj/abstract/force_fluid_flow/east, -/turf/floor/mud/water, +"Zo" = ( +/turf/floor/mud/water/deep, /area/shaded_hills/outside/river/woods) "Zs" = ( /obj/structure/wall_sconce/lantern{ @@ -269,11 +224,6 @@ }, /turf/floor/path/basalt, /area/shaded_hills/outside/river/woods) -"Zz" = ( -/obj/abstract/force_fluid_flow/northwest, -/obj/abstract/force_fluid_flow/northwest, -/turf/floor/mud/water, -/area/shaded_hills/outside/river/woods) "ZO" = ( /obj/abstract/landmark/start/shaded_hills/traveller, /turf/floor/grass, @@ -15715,11 +15665,11 @@ zp zp zp zp -ul -ul -ul -ul -ul +En +En +En +En +En zp zp zp @@ -15864,21 +15814,21 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -16011,29 +15961,29 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp kx kx @@ -16161,32 +16111,32 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En dp JI AN @@ -16312,34 +16262,34 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En JI AN zp @@ -16463,35 +16413,35 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En JI AN zp @@ -16614,39 +16564,39 @@ zp zp zp zp -ul -ul -ul -ul -ul -YK -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -CS -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En JI AN -ul +En zp zp zp @@ -16765,41 +16715,41 @@ zp zp zp zp -ul -ul -ul -ul -YK -Xh -Xh -Xh -Xh -Xh -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -Xh -Xh -CS -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +En +En +En +En +En +En dp JI AN dp -ul +En zp zp zp @@ -16915,44 +16865,44 @@ zp zp zp zp -ul -ul -ul -ul -ul -YK -YK -Xh -Xh -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -az -CS -CS -CS -ul +En +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +En +En +En +En JI AN -ul -ul -ul +En +En +En zp zp zp @@ -17066,45 +17016,45 @@ zp zp zp zp -ul -ul -ul -ul -YK -YK -YK -YK -cV -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -GU -GU -GU -GU -CS +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +En JI AN -ul -ul -ul +En +En +En zp zp zp @@ -17216,49 +17166,49 @@ zp zp zp zp -ul -ul -ul -ul -ul -YK -YK -cV -cV -cV -cV -cV -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -GU -GU -GU -GU -GU +En +En +En +En +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo JI AN -ul -ul -ul -ul -ul +En +En +En +En +En zp zp zp @@ -17368,50 +17318,50 @@ zp zp zp zp -ul -ul -ul -ul -YK -YK -cV -cV -cV -cV -cV -cV -cV -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -GU -GU -GU -GU +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo dp JI AN dp -ul -ul -ul -ul -ul +En +En +En +En +En zp zp zp @@ -17518,54 +17468,54 @@ zp zp zp zp -ul -ul -ul -ul -ul -YK -YK -cV -cV -cV -cV -cV -cV -cV -cV -cV -zv -zv -zv -zv -zv -zv -zv -zv -Xh -Xh -zv -zv -zv -zv -zv -zv -zv -GU -GU -GU -GU -GU +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +En +En +Zo +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo JI AN -zv -Xh -ul -ul -ul -ul -ul -ul +Zo +En +En +En +En +En +En +En zp zp zp @@ -17669,57 +17619,57 @@ zp zp zp zp -ul -ul -ul -ul -ul -YK -YK -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -zv -zv -zv -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -zv -zv -GU -GU -GU -GU -GU -GU +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo JI AN -zv -Xh -Xh -ul -ul -ul -ul -ul -ul -ul +Zo +En +En +En +En +En +En +En +En +En zp zp zp @@ -17806,7 +17756,7 @@ ma ma ma ma -ul +En zp zp zp @@ -17820,60 +17770,60 @@ zp zp zp zp -ul -ul -ul -ul -Za -YK -YK -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -CS -CS -GU -GU -GU -GU -GU -GU -GU +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo JI AN -zv -zv -Xh -Xh -Xh -CS -ul -ul -ul -ul -ul -ul +Wo +Zo +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -17892,9 +17842,9 @@ zp zp zp zp -ul -ul -ul +En +En +En zp zp zp @@ -17959,9 +17909,9 @@ ma ma ma ma -ul -ul -ul +En +En +En zp zp zp @@ -17971,63 +17921,63 @@ zp zp zp zp -ul -ul -ul -ul -ul -Za -Za -Za -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -cV -PO -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -CS -GU -GU -GU -GU -GU -GU +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo dp JI AN dp -zv -zv -Xh -CS -CS -CS -ul -ul -ul -ul -ul -ul -ul +Wo +Zo +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -18041,15 +17991,15 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En zp zp zp @@ -18111,78 +18061,78 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En zp zp zp -ul -ul -ul -ul -ul -ul -ul -YK -YK -Za -cA -cA -cV -cV -cV -cV -cV -cV -cV -cV -cV -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En +En +En zp zp zp zp zp -ul -ul -CS -CS -GU -GU -GU -GU -GU +En +En +En +En +Zo +Wo +Wo +Wo +Wo JI AN -zv -zv -zv -GU -CS -CS -CS -CS -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -18190,19 +18140,19 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -18264,40 +18214,40 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -YK -YK -YK -cA -cA -cA -cV -cV -cV -cV -cV -cV -cV -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -18308,55 +18258,55 @@ zp zp zp zp -ul -ul -ul -CS -GU -GU -GU -GU +En +En +En +En +Zo +Zo +Wo +Wo JI AN -zv -zv -zv -GU -GU -GU -CS -CS -CS -CS -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp uA @@ -18417,37 +18367,37 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -YK -YK -YK -cV -cV -cA -cA -cA -iA -cV -cV -cV -cV -YK -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En zp zp zp @@ -18460,56 +18410,56 @@ zp zp zp zp -ul -ul -ul -ul -CS -CS -GU -GU +En +En +En +En +En +En +Zo +Zo JI AN -zv -zv -GU -GU -GU -GU -GU -GU -CS -CS -CS -CS -CS -Xh -ul -ul -ul -ul -ul -ul -ul -ul -ul -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -ul -ul -ul -ul -ul +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp uA uA @@ -18570,35 +18520,35 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -YK -YK -YK -YK -cV -cV -cV -cA -Yf -cA -cV -cV -YK -YK -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -18613,56 +18563,56 @@ zp zp zp zp -ul -ul -ul -ul -ul -CS +En +En +En +En +En +En dp JI AN dp -GU -GU -GU -GU -GU -GU -GU -GU -GU -CS -CS -CS -CS -CS -Xh -ul -ul -Xh -Xh -Xh -Xh -Xh -YK -YK -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -CS -ul -ul -ul -ul -ul +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En uA uA uA @@ -18722,34 +18672,34 @@ ma ma ma ma -ul -ul -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -YK -YK -cV -cV -cV -cV -cV -cA -cA -cV -YK -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -18765,56 +18715,56 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -CS +En +En +En +En +En +En +En JI AN -ul -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -CS -Xh -Xh -Xh -Xh -Xh -Xh -zv -zv -cV -zv -zv -zv -zv -zv -zv -Xh -Xh -Xh -Xh -CS -Xh -ul -ul -ul -ul +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +Zo +En +En +En +En +En +En +En +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +En +En +En +En +En +En +En +En +En +En uA uA uA @@ -18875,30 +18825,30 @@ ma ma ma ma -ul -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -YK -cV -cV -cV -cV -cV -cV -cV -cV -Za -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En zp zp zp @@ -18919,54 +18869,54 @@ zp zp zp zp -ul -ul -ul -ul -ul +En +En +En +En +En JI AN -CS -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -cV -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -CS -Xh -CS -Xh -Xh -Xh +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +En +En +En +En +En +En uA uA uA @@ -19027,30 +18977,30 @@ ma ma ma ma -ul -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -cV -cV -cV -cV -cV -cV -cV -cV -YK -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En zp zp zp @@ -19072,53 +19022,53 @@ zp zp zp zp -ul -ul -ul -ul +En +En +En +En JI AN -CS -CS -CS -GU -GU -GU -GU -GU -GU -GU -GU -GU -GU -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -cV -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -GU -zv -GU -Xh -Xh -Xh +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +En +En +En uA uA uA @@ -19170,8 +19120,8 @@ hT hT hT hT -hT -hT +PO +PO hT hT ma @@ -19180,28 +19130,28 @@ ma ma ma ma -Xh -Xh -Xh -Xh -Xh -Xh -Xh -Xh -zv -zv -cV -cV -cV -cV -cV -cV -cV -YK -YK -ul -ul -ul +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En zp zp zp @@ -19226,51 +19176,51 @@ zp zp zp zp -ul +En dp JI AN dp -ul -CS -CS -CS -CS -GU -GU -GU -GU -GU -GU -GU -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -cV -zv -zv -Xh -Xh -zv -zv -zv -zv -zv -zv -GU -zv -GU -zv -zv -zv +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Zo +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +Zo uA uA uA @@ -19320,40 +19270,40 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT +PO +PO +PO +PO +PO +PO hT hT hT ma ma ma -Xh -Xh -Xh -Xh -Xh -Xh -zv -zv -zv -zv -cV -cV -cV -cV -cV -cV -cV -YK -YK -ul -ul -ul +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En zp zp zp @@ -19382,47 +19332,47 @@ zp zp JI AN -ul -ul -ul -ul -ul -CS -CS -CS -GU -GU -tU -GU -GU -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -Xh -YK -Xh -Xh -Xh -Xh -Xh -Xh -Xh -zv -zv -GU -GU -zv -GU -zv -zv -zv +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Zo +Zo +Zo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo uA uA uA @@ -19471,40 +19421,40 @@ hT hT hT hT +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -Xh -Xh -Xh -zv -zv -zv -zv -zv -zv -zv -cV -cV -cV -cV -cV -YK -YK -YK -ul -ul -ul +En +En +En +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -19535,46 +19485,46 @@ zp JI AN zp -ul -ul -ul -ul -ul -ul -CS -CS -CS -Zz -GU -GU -zv -zv -Xh -Xh -Xh -zv -zv -zv -Xh -Xh -Xh -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -GU -GU -zv -GU -zv -zv -zv +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Zo +Zo +En +En +En +Zo +Zo +Zo +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo +Wo +Wo uA uA uA @@ -19622,40 +19572,40 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -cV -cV -cV -cV -YK -YK -YK -ul -ul -ul +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +Zo +Zo +Zo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En zp zp zp @@ -19689,44 +19639,44 @@ AN zp zp zp -ul -ul -ul -ul -ul -ul -CS -CS -CS -Xh -Xh -Xh -ul -Xh -Xh -Xh -Xh -Xh -Xh -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -zv -GU -zv -zv -zv +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +Zo +Zo +Wo +Wo +Wo uA uA uA @@ -19774,40 +19724,40 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -cV -cV -cV -YK -YK -ul -ul -ul -ul -ul +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +En +En +En +En +En +En +En zp zp zp @@ -19842,43 +19792,43 @@ dp zp zp zp -ul -ul -ul -ul -ul -CS -CS -CS -Xh -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp zp zp zp -ul -ul -ul -ul -ul -ul -CS -zv -zv -zv +En +En +En +En +En +En +En +Zo +Zo +Wo uA uA uA @@ -19926,39 +19876,39 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -cV -cV -YK -ul -ul -ul -ul -ul -ul +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Wo +Zo +Zo +En +En +En +En +En +En +En zp zp zp @@ -19998,16 +19948,16 @@ zp zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20023,14 +19973,14 @@ zp zp zp zp -ul -ul -ul -ul -CS -Xh -Xh -zv +En +En +En +En +En +En +En +Zo uA uA uA @@ -20078,38 +20028,38 @@ hT hT hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT PO -zv -zv -zv -zv -zv -zv -zv -zv -zv -zv -YK -YK -ul -ul -ul -ul -ul -ul +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO +Wo +Wo +Zo +Zo +Zo +Wo +Wo +Wo +Zo +Zo +Zo +En +En +En +En +En +En +En +En zp zp zp @@ -20153,9 +20103,9 @@ zp zp zp zp -ul -ul -ul +En +En +En zp zp zp @@ -20177,12 +20127,12 @@ zp zp zp zp -ul -ul -ul -ul -ul -Xh +En +En +En +En +En +En uA uA uA @@ -20231,36 +20181,36 @@ hT hT hT hT +PO +PO +PO +PO +PO +PO +PO +PO +PO +PO hT hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -hT -PO -zv -Xh -Xh -Xh -zv -zv -zv -Xh -Xh -Xh -ul -ul -ul -ul -ul -ul -ul +Zo +Zo +En +En +En +Zo +Zo +Zo +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20331,10 +20281,10 @@ zp zp zp zp -ul -ul -ul -ul +En +En +En +En uA uA uA @@ -20384,35 +20334,35 @@ hT hT hT hT +PO +PO +PO +PO +PO hT hT hT hT hT -hT -hT -hT -hT -hT -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20485,8 +20435,8 @@ zp zp zp zp -ul -ul +En +En uA uA uA @@ -20538,7 +20488,7 @@ hT hT hT hT -hT +PO hT hT ma @@ -20546,24 +20496,24 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20697,23 +20647,23 @@ ma ma ma ma -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -20849,22 +20799,22 @@ ma ma ma ma -ul -ul -ul +En +En +En zp zp zp -ul -ul -ul -ul -ul -ul -ul -ul -ul -ul +En +En +En +En +En +En +En +En +En +En zp zp zp @@ -21000,8 +20950,8 @@ ma ma ma ma -ul -ul +En +En zp zp zp @@ -21009,9 +20959,9 @@ zp zp zp zp -ul -ul -ul +En +En +En zp zp zp @@ -21151,8 +21101,8 @@ ma ma ma ma -ul -ul +En +En zp zp zp @@ -21302,7 +21252,7 @@ ma ma ma ma -ul +En zp zp zp From ddbe6591766e7db5aa264addd0cbcc79399b87bf Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 14:25:45 +1100 Subject: [PATCH 56/95] Adds a quick interaction proc for ctrl-click while holding an atom. --- code/_onclick/click.dm | 9 ++++++++- code/game/atoms.dm | 9 +++++++++ code/modules/codex/codex_atom.dm | 3 +++ code/modules/codex/entries/guns.dm | 2 +- code/modules/projectiles/gun.dm | 3 +++ 5 files changed, 24 insertions(+), 2 deletions(-) diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 4c2f9a9c03b7..96c1880c8289 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -282,10 +282,17 @@ return A.CtrlClick(src) /atom/proc/CtrlClick(var/mob/user) + if(loc == user) + var/decl/interaction_handler/handler = get_quick_interaction_handler(user) + if(handler) + var/using_item = user.get_active_held_item() || user.get_usable_hand_slot_organ() + if(handler.is_possible(src, user, using_item)) + return handler.invoked(src, user, using_item) return FALSE /atom/movable/CtrlClick(var/mob/living/user) - return try_make_grab(user, defer_hand = TRUE) || ..() + if(!(. = ..()) && loc != user) + return try_make_grab(user, defer_hand = TRUE) || ..() /* Alt click diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 50583b963a47..349199c139b6 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -892,6 +892,15 @@ return check_loc check_loc = check_loc.loc +/** + Get a default interaction for a user from this atom. + + - `user`: The mob that this interaction is for + - Return: A default interaction decl, or null. +*/ +/atom/proc/get_quick_interaction_handler(mob/user) + return + /** Get a list of alt interactions for a user from this atom. diff --git a/code/modules/codex/codex_atom.dm b/code/modules/codex/codex_atom.dm index ebe02e59ab78..49d718ebbffe 100644 --- a/code/modules/codex/codex_atom.dm +++ b/code/modules/codex/codex_atom.dm @@ -36,5 +36,8 @@ /atom/examine(mob/user, distance, infix = "", suffix = "") . = ..() + var/decl/interaction_handler/handler = get_quick_interaction_handler(user) + if(handler) + to_chat(user, SPAN_NOTICE("Ctrl-click \the [src] while in your inventory to [lowertext(handler.name)].")) if(user?.get_preference_value(/datum/client_preference/inquisitive_examine) == PREF_ON && user.can_use_codex() && SScodex.get_codex_entry(get_codex_value(user))) to_chat(user, SPAN_NOTICE("The codex has relevant information available.")) diff --git a/code/modules/codex/entries/guns.dm b/code/modules/codex/entries/guns.dm index eefcbd251aa4..ffdbb6755906 100644 --- a/code/modules/codex/entries/guns.dm +++ b/code/modules/codex/entries/guns.dm @@ -35,7 +35,7 @@ traits += "It's best fired with a two-handed grip." if(has_safety) - traits += "It has a safety switch. Control-Click it to toggle safety." + traits += "It has a safety switch, which can be toggled via ctrl-click or selecting Toggle Safety from the alt-click radial." if(is_secure_gun()) traits += "It's fitted with a secure registration chip. Swipe ID on it to register." diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8d2a2e24ed7a..119124e5cbcb 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -747,6 +747,9 @@ return FALSE return TRUE +/obj/item/gun/get_quick_interaction_handler(mob/user) + return GET_DECL(/decl/interaction_handler/gun/toggle_safety) + /obj/item/gun/get_alt_interactions(mob/user) . = ..() LAZYADD(., /decl/interaction_handler/gun/toggle_safety) From 62473bdcd3320a3e31af5573833d2f53eba5fb6c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 21:20:45 +1100 Subject: [PATCH 57/95] Mops now use touch_turf() directly instead of splash(). --- code/game/objects/items/weapons/mop.dm | 75 ++++++++++--------- code/modules/materials/_materials.dm | 19 +++-- .../liquids/materials_liquid_water.dm | 19 ++--- code/modules/reagents/Chemistry-Holder.dm | 37 ++++----- code/modules/reagents/chems/chems_blood.dm | 8 +- .../modules/reagents/chems/chems_nutriment.dm | 8 +- code/modules/reagents/chems/chems_pigments.dm | 12 +-- mods/gamemodes/cult/overrides.dm | 4 +- 8 files changed, 93 insertions(+), 89 deletions(-) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 6520154a48c7..6b8b25d8a6ec 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -12,7 +12,11 @@ /decl/material/solid/organic/cloth = MATTER_AMOUNT_SECONDARY, ) var/mopspeed = 40 - var/list/moppable_types = list( + var/static/list/moppable_types + +/obj/item/mop/proc/populate_moppable_types() + moppable_types = list( + /turf/floor, /obj/effect/decal/cleanable, /obj/structure/catwalk ) @@ -20,6 +24,8 @@ /obj/item/mop/Initialize() . = ..() initialize_reagents() + if(!moppable_types) + populate_moppable_types() /obj/item/mop/initialize_reagents(populate = TRUE) create_reagents(30) @@ -27,45 +33,40 @@ /obj/item/mop/afterattack(atom/A, mob/user, proximity) if(!proximity) - return + return ..() + var/turf/moppable_turf = get_turf(A) + if(!istype(moppable_turf)) + return ..() - var/moppable - if(isturf(A)) - var/turf/T = A - if(T?.reagents?.total_volume > 0) - if(T.reagents.total_volume > FLUID_SHALLOW) + if(moppable_turf?.reagents?.total_volume > 0) + if(moppable_turf.reagents.total_volume > FLUID_SHALLOW) + to_chat(user, SPAN_WARNING("There is too much water here to be mopped up.")) + return TRUE + user.visible_message(SPAN_NOTICE("\The [user] begins to mop up \the [moppable_turf].")) + if(do_after(user, 40, moppable_turf) && !QDELETED(moppable_turf)) + if(moppable_turf.reagents?.total_volume > FLUID_SHALLOW) to_chat(user, SPAN_WARNING("There is too much water here to be mopped up.")) else - user.visible_message(SPAN_NOTICE("\The [user] begins to mop up \the [T].")) - if(do_after(user, 40, T) && !QDELETED(T)) - if(T.reagents?.total_volume > FLUID_SHALLOW) - to_chat(user, SPAN_WARNING("There is too much water here to be mopped up.")) - else - to_chat(user, SPAN_NOTICE("You have finished mopping!")) - T.reagents?.clear_reagents() - return - moppable = TRUE - - else if(is_type_in_list(A,moppable_types)) - moppable = TRUE - - if(moppable) - if(reagents.total_volume < 1) - to_chat(user, SPAN_WARNING("Your mop is dry!")) - return - var/turf/T = get_turf(A) - if(!T) - return - - var/trans_amt = FLUID_QDEL_POINT - if(user.a_intent == I_HURT) - trans_amt = round(FLUID_PUDDLE * 0.25) - user.visible_message(SPAN_DANGER("\The [user] begins to aggressively mop \the [T]!")) - else - user.visible_message(SPAN_NOTICE("\The [user] begins to clean \the [T].")) - if(do_after(user, mopspeed, T) && reagents?.total_volume) - reagents.splash(T, trans_amt) - to_chat(user, SPAN_NOTICE("You have finished mopping!")) + to_chat(user, SPAN_NOTICE("You have finished mopping!")) + moppable_turf.reagents?.clear_reagents() + return TRUE + + if(!is_type_in_list(A, moppable_types)) + return ..() + + if(reagents.total_volume < FLUID_PUDDLE) + to_chat(user, SPAN_WARNING("\The [src] is dry!")) + return TRUE + + if(user.a_intent == I_HURT) + user.visible_message(SPAN_DANGER("\The [user] begins to aggressively mop \the [moppable_turf]!")) + else + user.visible_message(SPAN_NOTICE("\The [user] begins to clean \the [moppable_turf].")) + if(do_after(user, mopspeed, moppable_turf) && reagents?.total_volume) + reagents.touch_turf(moppable_turf) + reagents.remove_any(1) + to_chat(user, SPAN_NOTICE("You have finished mopping!")) + return TRUE /obj/effect/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/mop) || istype(I, /obj/item/soap)) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 54ad43620bb0..fe3808291818 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -746,28 +746,27 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) M.fire_stacks += floor((amount * accelerant_value)/FLAMMABLE_LIQUID_DIVISOR) #undef FLAMMABLE_LIQUID_DIVISOR -/decl/material/proc/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) // Cleaner cleaning, lube lubbing, etc, all go here +/decl/material/proc/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) // Cleaner cleaning, lube lubbing, etc, all go here if(REAGENT_VOLUME(holder, type) < turf_touch_threshold) return - if(istype(T) && T.simulated) - var/turf/wall/W = T + if(istype(touching_turf) && touching_turf.simulated) if(defoliant) - for(var/obj/effect/overlay/wallrot/E in W) - W.visible_message(SPAN_NOTICE("\The [E] is completely dissolved by the solution!")) - qdel(E) - if(slipperiness != 0 && !T.check_fluid_depth()) // Don't make floors slippery if they have an active fluid on top of them please. + for(var/obj/effect/overlay/wallrot/rot in touching_turf) + touching_turf.visible_message(SPAN_NOTICE("\The [rot] is completely dissolved by the solution!")) + qdel(rot) + if(slipperiness != 0 && !touching_turf.check_fluid_depth()) // Don't make floors slippery if they have an active fluid on top of them please. if(slipperiness < 0) - W.unwet_floor(TRUE) + touching_turf.unwet_floor(TRUE) else if (REAGENT_VOLUME(holder, type) >= slippery_amount) - W.wet_floor(slipperiness) + touching_turf.wet_floor(slipperiness) if(length(vapor_products)) var/volume = REAGENT_VOLUME(holder, type) var/temperature = holder?.my_atom?.temperature || T20C for(var/vapor in vapor_products) - T.assume_gas(vapor, (volume * vapor_products[vapor]), temperature) + touching_turf.assume_gas(vapor, (volume * vapor_products[vapor]), temperature) holder.remove_reagent(type, volume) /decl/material/proc/on_mob_life(var/mob/living/M, var/metabolism_class, var/datum/reagents/holder, var/list/life_dose_tracker) diff --git a/code/modules/materials/definitions/liquids/materials_liquid_water.dm b/code/modules/materials/definitions/liquids/materials_liquid_water.dm index 76caa77b46fe..f1c3e30184a3 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_water.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_water.dm @@ -48,22 +48,23 @@ affect_blood(M, removed, holder) #define WATER_LATENT_HEAT 9500 // How much heat is removed when applied to a hot turf, in J/unit (9500 makes 120 u of water roughly equivalent to 2L -/decl/material/liquid/water/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/water/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) ..() - if(!istype(T)) + if(!istype(touching_turf)) return - var/datum/gas_mixture/environment = T.return_air() + var/datum/gas_mixture/environment = touching_turf.return_air() var/min_temperature = T20C + rand(0, 20) // Room temperature + some variance. An actual diminishing return would be better, but this is *like* that. In a way. . This has the potential for weird behavior, but I says fuck it. Water grenades for everyone. - var/hotspot = (locate(/obj/fire) in T) - if(hotspot && !isspaceturf(T)) - var/datum/gas_mixture/lowertemp = T.remove_air(T:air:total_moles) + // TODO: Cannot for the life of me work out what this is doing or why it's reducing the air temp by 2000; shouldn't it just be using environment? + var/hotspot = (locate(/obj/fire) in touching_turf) + if(hotspot && !isspaceturf(touching_turf)) + var/datum/gas_mixture/lowertemp = touching_turf.remove_air(touching_turf:air:total_moles) lowertemp.temperature = max(min(lowertemp.temperature-2000, lowertemp.temperature / 2), 0) lowertemp.react() - T.assume_air(lowertemp) + touching_turf.assume_air(lowertemp) qdel(hotspot) var/volume = REAGENT_VOLUME(holder, type) @@ -71,11 +72,11 @@ var/removed_heat = clamp(volume * WATER_LATENT_HEAT, 0, -environment.get_thermal_energy_change(min_temperature)) environment.add_thermal_energy(-removed_heat) if (prob(5) && environment && environment.temperature > T100C) - T.visible_message("The water sizzles as it lands on \the [T]!") + touching_turf.visible_message(SPAN_NOTICE("The water sizzles as it lands on \the [touching_turf]!")) var/list/data = REAGENT_DATA(holder, type) if(LAZYACCESS(data, "holy")) - T.turf_flags |= TURF_FLAG_HOLY + touching_turf.turf_flags |= TURF_FLAG_HOLY /decl/material/liquid/water/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) ..() diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index ac0d58447be0..04e35684e00d 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -804,28 +804,31 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new var/decl/material/current = GET_DECL(rtype) current.touch_mob(target, REAGENT_VOLUME(src, rtype), src) -/datum/reagents/proc/touch_turf(var/turf/target) - if(!istype(target) || !target.simulated) +/datum/reagents/proc/touch_turf(var/turf/touching_turf) + if(!istype(touching_turf) || !touching_turf.simulated) return for(var/rtype in reagent_volumes) var/decl/material/current = GET_DECL(rtype) - current.touch_turf(target, REAGENT_VOLUME(src, rtype), src) + current.touch_turf(touching_turf, REAGENT_VOLUME(src, rtype), src) var/dirtiness = get_dirtiness() if(dirtiness <= DIRTINESS_CLEAN) - target.clean() - target.remove_cleanables() - if(dirtiness != DIRTINESS_NEUTRAL) - if(dirtiness > DIRTINESS_NEUTRAL) - target.add_dirt(ceil(total_volume * dirtiness)) - else - if(dirtiness <= DIRTINESS_STERILE) - target.germ_level -= min(total_volume*20, target.germ_level) - for(var/obj/item/I in target.contents) - I.was_bloodied = null - for(var/obj/effect/decal/cleanable/blood/B in target) - qdel(B) - if(dirtiness <= DIRTINESS_CLEAN) - target.clean() + touching_turf.clean() + touching_turf.remove_cleanables() + if(dirtiness == DIRTINESS_NEUTRAL) + return + if(dirtiness > DIRTINESS_NEUTRAL) + touching_turf.add_dirt(ceil(total_volume * dirtiness)) + return + + if(dirtiness <= DIRTINESS_STERILE) + touching_turf.germ_level -= min(total_volume*20, touching_turf.germ_level) + for(var/obj/item/I in touching_turf.contents) + I.was_bloodied = null + for(var/obj/effect/decal/cleanable/blood/B in touching_turf) + qdel(B) + + if(dirtiness <= DIRTINESS_CLEAN) + touching_turf.clean() /datum/reagents/proc/touch_obj(var/obj/target) if(!target || !istype(target) || !target.simulated) diff --git a/code/modules/reagents/chems/chems_blood.dm b/code/modules/reagents/chems/chems_blood.dm index e3a08e5b8731..1e4696e3ffec 100644 --- a/code/modules/reagents/chems/chems_blood.dm +++ b/code/modules/reagents/chems/chems_blood.dm @@ -46,12 +46,12 @@ for(var/chem in other_chems) my_chems[chem] = my_chems[chem] + other_chems[chem] -/decl/material/liquid/blood/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/blood/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) var/data = REAGENT_DATA(holder, type) - if(!istype(T) || REAGENT_VOLUME(holder, type) < 3) + if(!istype(touching_turf) || REAGENT_VOLUME(holder, type) < 3) return - var/weakref/W = LAZYACCESS(data, DATA_BLOOD_DONOR) - blood_splatter(T, W?.resolve() || holder.my_atom, 1) + var/weakref/donor = LAZYACCESS(data, DATA_BLOOD_DONOR) + blood_splatter(touching_turf, donor?.resolve() || holder.my_atom, 1) /decl/material/liquid/blood/affect_ingest(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() diff --git a/code/modules/reagents/chems/chems_nutriment.dm b/code/modules/reagents/chems/chems_nutriment.dm index 3ac879172e79..a3e914152d12 100644 --- a/code/modules/reagents/chems/chems_nutriment.dm +++ b/code/modules/reagents/chems/chems_nutriment.dm @@ -96,9 +96,9 @@ uid = "chem_nutriment_flour" allergen_flags = ALLERGEN_GLUTEN -/decl/material/liquid/nutriment/flour/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/nutriment/flour/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) ..() - new /obj/effect/decal/cleanable/flour(T) + new /obj/effect/decal/cleanable/flour(touching_turf) /decl/material/liquid/nutriment/batter name = "batter" @@ -115,9 +115,9 @@ boiling_point = 373 allergen_flags = ALLERGEN_EGG | ALLERGEN_GLUTEN -/decl/material/liquid/nutriment/batter/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) +/decl/material/liquid/nutriment/batter/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) ..() - new /obj/effect/decal/cleanable/pie_smudge(T) + new /obj/effect/decal/cleanable/pie_smudge(touching_turf) /decl/material/liquid/nutriment/batter/cakebatter name = "cake batter" diff --git a/code/modules/reagents/chems/chems_pigments.dm b/code/modules/reagents/chems/chems_pigments.dm index c5fc41928620..55c6be4c47cb 100644 --- a/code/modules/reagents/chems/chems_pigments.dm +++ b/code/modules/reagents/chems/chems_pigments.dm @@ -85,9 +85,9 @@ painting.reset_color() painting.set_alpha(keep_alpha) -/decl/material/liquid/paint_stripper/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) - if(istype(T) && !isspaceturf(T)) - remove_paint(T, holder) +/decl/material/liquid/paint_stripper/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) + if(istype(touching_turf) && !isspaceturf(touching_turf)) + remove_paint(touching_turf, holder) /decl/material/liquid/paint_stripper/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) if(istype(O)) @@ -113,9 +113,9 @@ painting.set_color(holder.get_color()) painting.set_alpha(keep_alpha) -/decl/material/liquid/paint/touch_turf(var/turf/T, var/amount, var/datum/reagents/holder) - if(istype(T) && !isspaceturf(T)) - apply_paint(T, holder, FLUID_MINIMUM_TRANSFER) +/decl/material/liquid/paint/touch_turf(var/turf/touching_turf, var/amount, var/datum/reagents/holder) + if(istype(touching_turf) && !isspaceturf(touching_turf)) + apply_paint(touching_turf, holder, FLUID_MINIMUM_TRANSFER) /decl/material/liquid/paint/touch_obj(var/obj/O, var/amount, var/datum/reagents/holder) if(istype(O)) diff --git a/mods/gamemodes/cult/overrides.dm b/mods/gamemodes/cult/overrides.dm index 874dc92049c7..6ddc3f7ebc65 100644 --- a/mods/gamemodes/cult/overrides.dm +++ b/mods/gamemodes/cult/overrides.dm @@ -60,9 +60,9 @@ /mob/living/simple_animal/hostile/revenant/cult/on_defilement() return -/obj/item/mop/Initialize() +/obj/item/mop/populate_moppable_types() . = ..() - moppable_types += /obj/effect/rune + moppable_types |= /obj/effect/rune /obj/effect/gateway/active/can_transform(mob/victim) if(iscultist(victim)) From 201aa230873ed83a06ab210eeca45880a0aef4dc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 21:40:05 +1100 Subject: [PATCH 58/95] Soap now uses touch_atom() and touch_turf() will touch atoms on the turf. --- code/game/objects/effects/chem/chemsmoke.dm | 6 --- code/game/objects/effects/chem/foam.dm | 2 - code/game/objects/items/weapons/mop.dm | 2 +- code/game/objects/items/weapons/soap.dm | 53 ++++++++++----------- code/game/turfs/turf_fluids.dm | 2 +- code/modules/reagents/Chemistry-Holder.dm | 49 ++++++++++++------- 6 files changed, 59 insertions(+), 55 deletions(-) diff --git a/code/game/objects/effects/chem/chemsmoke.dm b/code/game/objects/effects/chem/chemsmoke.dm index fc4fdc8470d0..ccfd9b93b6e5 100644 --- a/code/game/objects/effects/chem/chemsmoke.dm +++ b/code/game/objects/effects/chem/chemsmoke.dm @@ -160,12 +160,6 @@ if(LAZYLEN(chemholder.reagents.reagent_volumes)) for(var/turf/T in (wallList|targetTurfs)) chemholder.reagents.touch_turf(T) - for(var/turf/T in targetTurfs) - for(var/atom/A in T.contents) - if(istype(A, /obj/effect/effect/smoke/chem) || ismob(A)) - continue - else if(isobj(A) && !A.simulated) - chemholder.reagents.touch_obj(A) var/color = chemholder.reagents.get_color() //build smoke icon var/icon/I diff --git a/code/game/objects/effects/chem/foam.dm b/code/game/objects/effects/chem/foam.dm index 5ff195477656..1e7a3685c90e 100644 --- a/code/game/objects/effects/chem/foam.dm +++ b/code/game/objects/effects/chem/foam.dm @@ -37,8 +37,6 @@ if(!metal && reagents) var/turf/T = get_turf(src) reagents.touch_turf(T) - for(var/obj/O in T) - reagents.touch_obj(O) /obj/effect/effect/foam/Process() if(--amount < 0) diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index 6b8b25d8a6ec..1740ee10e3bc 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -54,7 +54,7 @@ if(!is_type_in_list(A, moppable_types)) return ..() - if(reagents.total_volume < FLUID_PUDDLE) + if(reagents?.total_volume < 1) to_chat(user, SPAN_WARNING("\The [src] is dry!")) return TRUE diff --git a/code/game/objects/items/weapons/soap.dm b/code/game/objects/items/weapons/soap.dm index c669236eb49c..2376c8daa4ce 100644 --- a/code/game/objects/items/weapons/soap.dm +++ b/code/game/objects/items/weapons/soap.dm @@ -63,39 +63,36 @@ M.slip("\the [src]", 3) /obj/item/soap/afterattack(atom/target, mob/user, proximity) - if(!proximity) return - //I couldn't feasibly fix the overlay bugs caused by cleaning items we are wearing. - //So this is a workaround. This also makes more sense from an IC standpoint. ~Carn - var/cleaned = FALSE - if(user.client && (target in user.client.screen)) - to_chat(user, SPAN_NOTICE("You need to take that [target.name] off before cleaning it.")) - else if(istype(target,/obj/effect/decal/cleanable/blood)) - to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) - target.clean() //Blood is a cleanable decal, therefore needs to be accounted for before all cleanable decals. - cleaned = TRUE - else if(istype(target,/obj/effect/decal/cleanable)) - to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) - qdel(target) - cleaned = TRUE - else if(isturf(target) || istype(target, /obj/structure/catwalk)) - var/turf/T = get_turf(target) - if(!T) - return - user.visible_message(SPAN_NOTICE("\The [user] starts scrubbing \the [T].")) - if(do_after(user, 8 SECONDS, T) && reagents?.total_volume) - reagents.splash(T, FLUID_QDEL_POINT) - to_chat(user, SPAN_NOTICE("You scrub \the [target] clean.")) - cleaned = TRUE - else if(istype(target,/obj/structure/hygiene/sink)) + + if(!proximity) + return ..() + + if(istype(target,/obj/structure/hygiene/sink)) to_chat(user, SPAN_NOTICE("You wet \the [src] in the sink.")) wet() + return TRUE + + if(reagents?.total_volume < 1) + to_chat(user, SPAN_WARNING("\The [src] is too dry to clean \the [target].")) + return TRUE + + if(isturf(target) || istype(target, /obj/structure/catwalk)) + target = get_turf(target) + if(!isturf(target)) + return ..() + user.visible_message(SPAN_NOTICE("\The [user] starts scrubbing \the [target].")) + if(!do_after(user, 8 SECONDS, target) && reagents?.total_volume) + return TRUE + to_chat(user, SPAN_NOTICE("You scrub \the [target] clean.")) + else if(istype(target,/obj/effect/decal/cleanable)) + to_chat(user, SPAN_NOTICE("You scrub \the [target.name] out.")) else to_chat(user, SPAN_NOTICE("You clean \the [target.name].")) - target.clean() //Clean bloodied atoms. Blood decals themselves need to be handled above. - cleaned = TRUE - if(cleaned) - user.update_personal_goal(/datum/goal/clean, 1) + reagents.touch_atom(target) + reagents.remove_any(1) + user.update_personal_goal(/datum/goal/clean, 1) + return TRUE //attack_as_weapon /obj/item/soap/use_on_mob(mob/living/target, mob/living/user, animate = TRUE) diff --git a/code/game/turfs/turf_fluids.dm b/code/game/turfs/turf_fluids.dm index 0a0c90400fca..48b6a7d7a100 100644 --- a/code/game/turfs/turf_fluids.dm +++ b/code/game/turfs/turf_fluids.dm @@ -116,7 +116,7 @@ /turf/fluid_act(var/datum/reagents/fluids) ..() if(!QDELETED(src) && fluids?.total_volume) - fluids.touch_turf(src) + fluids.touch_turf(src, touch_atoms = FALSE) // Handled in fluid_act() below. for(var/atom/movable/AM as anything in get_contained_external_atoms()) AM.fluid_act(fluids) diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm index 04e35684e00d..88cbb17aa8c6 100644 --- a/code/modules/reagents/Chemistry-Holder.dm +++ b/code/modules/reagents/Chemistry-Holder.dm @@ -797,40 +797,55 @@ var/global/datum/reagents/sink/infinite_reagent_sink = new // Options are touch_turf(), touch_mob() and touch_obj(). This does not handle transferring reagents to things. // For example, splashing someone with water will get them wet and extinguish them if they are on fire, // even if they are wearing an impermeable suit that prevents the reagents from contacting the skin. -/datum/reagents/proc/touch_mob(var/mob/target) + +/datum/reagents/proc/touch_atom(atom/target, touch_atoms = TRUE) + if(ismob(target)) + return touch_mob(target) + if(isobj(target)) + return touch_obj(target) + if(isturf(target)) + return touch_turf(target, touch_atoms) + return FALSE + +/datum/reagents/proc/touch_mob(mob/target) if(!target || !istype(target) || !target.simulated) return for(var/rtype in reagent_volumes) var/decl/material/current = GET_DECL(rtype) current.touch_mob(target, REAGENT_VOLUME(src, rtype), src) -/datum/reagents/proc/touch_turf(var/turf/touching_turf) +/datum/reagents/proc/touch_turf(turf/touching_turf, touch_atoms = TRUE) + if(!istype(touching_turf) || !touching_turf.simulated) return + for(var/rtype in reagent_volumes) var/decl/material/current = GET_DECL(rtype) current.touch_turf(touching_turf, REAGENT_VOLUME(src, rtype), src) + var/dirtiness = get_dirtiness() if(dirtiness <= DIRTINESS_CLEAN) touching_turf.clean() touching_turf.remove_cleanables() - if(dirtiness == DIRTINESS_NEUTRAL) - return + if(dirtiness > DIRTINESS_NEUTRAL) touching_turf.add_dirt(ceil(total_volume * dirtiness)) - return - - if(dirtiness <= DIRTINESS_STERILE) - touching_turf.germ_level -= min(total_volume*20, touching_turf.germ_level) - for(var/obj/item/I in touching_turf.contents) - I.was_bloodied = null - for(var/obj/effect/decal/cleanable/blood/B in touching_turf) - qdel(B) - - if(dirtiness <= DIRTINESS_CLEAN) - touching_turf.clean() - -/datum/reagents/proc/touch_obj(var/obj/target) + else if(dirtiness < DIRTINESS_NEUTRAL) + if(dirtiness <= DIRTINESS_STERILE) + touching_turf.germ_level -= min(total_volume*20, touching_turf.germ_level) + for(var/obj/item/I in touching_turf.contents) + I.was_bloodied = null + for(var/obj/effect/decal/cleanable/blood/B in touching_turf) + qdel(B) + if(dirtiness <= DIRTINESS_CLEAN) + touching_turf.clean() + + if(touch_atoms) + for(var/atom/movable/thing in touching_turf.get_contained_external_atoms()) + if(thing.simulated && !istype(thing, /obj/effect/effect/smoke/chem)) + touch_atom(thing) + +/datum/reagents/proc/touch_obj(obj/target) if(!target || !istype(target) || !target.simulated) return for(var/rtype in reagent_volumes) From f40c6ada861582ba1d662d0ea29e82177b463090 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 21:49:29 +1100 Subject: [PATCH 59/95] Fixing null bodytype runtime somewhere in living mob qdel. --- code/modules/organs/prosthetics/_prosthetics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/organs/prosthetics/_prosthetics.dm b/code/modules/organs/prosthetics/_prosthetics.dm index 03d8abee4ae3..a107c79e8104 100644 --- a/code/modules/organs/prosthetics/_prosthetics.dm +++ b/code/modules/organs/prosthetics/_prosthetics.dm @@ -9,7 +9,7 @@ // External organ procs: // Does this bodypart count as a modular limb, and if so, what kind? /obj/item/organ/external/proc/get_modular_limb_category() - return isnull(bodytype.modular_limb_tier) ? MODULAR_BODYPART_INVALID : bodytype.modular_limb_tier + return isnull(bodytype?.modular_limb_tier) ? MODULAR_BODYPART_INVALID : bodytype.modular_limb_tier // Checks if a limb could theoretically be removed. // Note that this does not currently bother checking if a child or internal organ is vital. From a3e211427c941958caf5ec6d3c26823b8fdbb414 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 21:49:44 +1100 Subject: [PATCH 60/95] Clearing pending status timer during Destroy(). --- code/_onclick/click_handling.dm | 3 +++ code/game/atoms.dm | 10 ++++++---- code/game/objects/effects/dirty_floor.dm | 4 ++++ code/modules/mob/living/living_status.dm | 7 +++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/_onclick/click_handling.dm b/code/_onclick/click_handling.dm index 08d1ec3b5790..acac1171b0df 100644 --- a/code/_onclick/click_handling.dm +++ b/code/_onclick/click_handling.dm @@ -13,6 +13,9 @@ if(!click_handlers) { \ /mob/Destroy() QDEL_NULL(status_markers) QDEL_NULL_LIST(click_handlers) + if(status_timer_id) + deltimer(status_timer_id) + status_timer_id = null . = ..() var/global/const/CLICK_HANDLER_NONE = BITFLAG(0) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 50583b963a47..757d1615904c 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -500,10 +500,12 @@ - Returns: `TRUE` if qdel() was called, otherwise `FALSE` */ /atom/proc/lava_act() - visible_message(SPAN_DANGER("\The [src] sizzles and melts away, consumed by the lava!")) - playsound(src, 'sound/effects/flare.ogg', 100, 3) - qdel(src) - . = TRUE + if(simulated) + visible_message(SPAN_DANGER("\The [src] sizzles and melts away, consumed by the lava!")) + playsound(src, 'sound/effects/flare.ogg', 100, 3) + qdel(src) + return TRUE + return FALSE /** Handle this atom being hit by a thrown atom diff --git a/code/game/objects/effects/dirty_floor.dm b/code/game/objects/effects/dirty_floor.dm index e67ac44b0590..8c2df8b9f8b0 100644 --- a/code/game/objects/effects/dirty_floor.dm +++ b/code/game/objects/effects/dirty_floor.dm @@ -9,6 +9,10 @@ alpha = 0 var/dirt_amount = 0 +/obj/effect/decal/cleanable/dirt/lava_act() + qdel(src) + return TRUE + // 'the dirt falls through the x' is pretty silly, dirt is generated by people walking. /obj/effect/decal/cleanable/dirt/begin_falling(lastloc, below) SHOULD_CALL_PARENT(FALSE) diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 661787ae356d..0da061a10f8b 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -1,9 +1,12 @@ /mob // Defined on /mob to avoid having to pass args to every single attack_foo() proc. - var/datum/status_marker_holder/status_markers var/list/status_counters var/list/pending_status_counters + var/datum/status_marker_holder/status_markers + var/status_timer_id /mob/living/set_status(var/condition, var/amount) + if(QDELETED(src)) + return FALSE if(!ispath(condition, /decl/status_condition)) return FALSE var/decl/status_condition/cond = GET_DECL(condition) @@ -21,7 +24,7 @@ if(amount == PENDING_STATUS(src, condition)) return FALSE LAZYSET(pending_status_counters, condition, amount) - addtimer(CALLBACK(src, PROC_REF(apply_pending_status_changes)), 0, TIMER_UNIQUE) + status_timer_id = addtimer(CALLBACK(src, PROC_REF(apply_pending_status_changes)), 0, TIMER_UNIQUE) return TRUE /mob/living/proc/rebuild_status_markers() From 0e6cc974fc41520cc83ee73dfc6532ff097addec Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 22:26:13 +1100 Subject: [PATCH 61/95] Fixing double timer delete in living Destroy(). --- code/modules/mob/living/living_status.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 0da061a10f8b..1f6b0dbe8cde 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -37,6 +37,7 @@ status_markers.refresh_markers(src) /mob/living/proc/apply_pending_status_changes() + status_timer_id = null // We are firing, so clear this to avoid double deletes in Destroy(). var/rebuild_markers = FALSE if(!isnull(pending_status_counters)) for(var/condition in pending_status_counters) From 1604ada1874c94316be43924f7691c52baeafd72 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 22:33:09 +1100 Subject: [PATCH 62/95] Reagent heaters renamed to hotplates, can cook food in pots/skillets. --- .../circuitboards/machinery/chemistry.dm | 2 +- .../reagents/heat_sources/_heat_source.dm | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm b/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm index 44377add2c09..1d9cccaf50b3 100644 --- a/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm +++ b/code/game/objects/items/weapons/circuitboards/machinery/chemistry.dm @@ -1,5 +1,5 @@ /obj/item/stock_parts/circuitboard/reagent_heater - name = "circuitboard (chemical heater)" + name = "circuitboard (hotplate)" build_path = /obj/machinery/reagent_temperature board_type = "machine" origin_tech = @'{"powerstorage":2,"engineering":1}' diff --git a/code/modules/reagents/heat_sources/_heat_source.dm b/code/modules/reagents/heat_sources/_heat_source.dm index b92953137078..7327b93e59ba 100644 --- a/code/modules/reagents/heat_sources/_heat_source.dm +++ b/code/modules/reagents/heat_sources/_heat_source.dm @@ -5,8 +5,8 @@ #define HEATER_MODE_COOL "cool" /obj/machinery/reagent_temperature - name = "chemical heater" - desc = "A small electric Bunsen, used to heat beakers and vials of chemicals." + name = "hotplate" + desc = "A small electric hotplate, used to heat cookware, beakers, or vials of chemicals." icon = 'icons/obj/machines/heat_sources.dmi' icon_state = "hotplate" atom_flags = ATOM_FLAG_CLIMBABLE @@ -70,6 +70,7 @@ /obj/machinery/reagent_temperature/ProcessAtomTemperature() if(use_power >= POWER_USE_ACTIVE) + var/last_temperature = temperature if(heater_mode == HEATER_MODE_HEAT && temperature < target_temperature) temperature = min(target_temperature, temperature + heating_power) @@ -79,10 +80,24 @@ if(container) queue_temperature_atoms(container) queue_icon_update() + + // Hackery to heat pots placed onto a hotplate without also grilling/baking stuff. + if(isturf(loc)) + var/datum/gas_mixture/environment = loc.return_air() + for(var/obj/item/chems/cooking_vessel/pot in loc.get_contained_external_atoms()) + pot.fire_act(environment, temperature, 500) + return TRUE // Don't kill this processing loop unless we're not powered. . = ..() /obj/machinery/reagent_temperature/attackby(var/obj/item/thing, var/mob/user) + + if(istype(thing, /obj/item/chems/cooking_vessel)) + if(!user.try_unequip(thing, get_turf(src))) + return TRUE + thing.reset_offsets(anim_time = 0) + user.visible_message(SPAN_NOTICE("\The [user] places \the [thing] onto \the [src].")) + if(IS_WRENCH(thing)) if(use_power == POWER_USE_ACTIVE) to_chat(user, SPAN_WARNING("Turn \the [src] off first!")) From d60c66d653a4e2095684005317a8b3a151217840 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 22:36:02 +1100 Subject: [PATCH 63/95] Adds skillet, pot and hotplate to tradeship galley. --- maps/tradeship/tradeship-2.dmm | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/maps/tradeship/tradeship-2.dmm b/maps/tradeship/tradeship-2.dmm index c2475414d42a..2dee3a1687cc 100644 --- a/maps/tradeship/tradeship-2.dmm +++ b/maps/tradeship/tradeship-2.dmm @@ -2002,6 +2002,15 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/item/chems/glass/beaker{ + pixel_x = 5 + }, +/obj/item/chems/condiment/small/peppermill{ + pixel_x = 3 + }, +/obj/item/chems/condiment/enzyme, +/obj/item/chems/glass/rag, +/obj/item/chems/cooking_vessel/pot, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "eQ" = ( @@ -4684,14 +4693,8 @@ "nH" = ( /obj/structure/table, /obj/effect/floor_decal/corner/red/diagonal, -/obj/item/chems/glass/beaker{ - pixel_x = 5 - }, -/obj/item/chems/condiment/small/peppermill{ - pixel_x = 3 - }, -/obj/item/chems/condiment/enzyme, -/obj/item/chems/glass/rag, +/obj/machinery/reagent_temperature, +/obj/item/chems/cooking_vessel/skillet, /turf/floor/tiled, /area/ship/trade/crew/kitchen) "nR" = ( From f7ae46232a52c22861294a5d4bf432e10dfb0b3c Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 22:56:46 +1100 Subject: [PATCH 64/95] Attempting to fix pots not showing their boiling overlay. --- .../food/cooking/cooking_vessels/_cooking_vessel.dm | 2 ++ code/modules/food/cooking/cooking_vessels/pot.dm | 12 +++++++++--- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm index 81ebd46c3b62..0be3f8614e3a 100644 --- a/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm +++ b/code/modules/food/cooking/cooking_vessels/_cooking_vessel.dm @@ -40,6 +40,8 @@ return FALSE /obj/item/chems/cooking_vessel/afterattack(var/obj/target, var/mob/user, var/proximity) + if(!proximity || istype(target, /obj/machinery/reagent_temperature)) + return FALSE if(!ATOM_IS_OPEN_CONTAINER(src) || !proximity) //Is the container open & are they next to whatever they're clicking? return FALSE //If not, do nothing. if(target?.storage) diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index 93c6a4585eb3..3ab2138e8139 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -15,11 +15,16 @@ /obj/item/chems/cooking_vessel/pot/get_reagents_overlay(state_prefix) var/image/our_overlay = ..() - if(our_overlay && last_boil_status && check_state_in_icon("[our_overlay.icon_state]_boiling", icon)) + if(our_overlay && last_boil_status && check_state_in_icon("[our_overlay.icon_state]_boiling", our_overlay.icon)) // change the base state but keep the overlays our_overlay.icon_state = "[our_overlay.icon_state]_boiling" return our_overlay +/obj/item/chems/cooking_vessel/pot/on_reagent_change() + . = ..() + last_boil_temp = null + last_boil_status = null + /obj/item/chems/cooking_vessel/pot/ProcessAtomTemperature() . = ..() @@ -34,9 +39,10 @@ next_boil_status = TRUE break - if(next_boil_status != last_boil_status) + if(isnull(last_boil_status) || next_boil_status != last_boil_status) last_boil_status = next_boil_status update_icon() if(. == PROCESS_KILL) - last_boil_temp = null + last_boil_temp = null + last_boil_status = null From f5f100882c64dec125515e0ede7cb4510429de27 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 23:00:33 +1100 Subject: [PATCH 65/95] Adding pot/skillet to Mini. --- code/modules/food/cooking/cooking_vessels/pot.dm | 7 +++---- code/modules/reagents/heat_sources/_heat_source.dm | 1 + code/modules/reagents/reagent_containers.dm | 7 ++----- maps/ministation/ministation-1.dmm | 2 ++ 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/modules/food/cooking/cooking_vessels/pot.dm b/code/modules/food/cooking/cooking_vessels/pot.dm index 3ab2138e8139..d2920d1db937 100644 --- a/code/modules/food/cooking/cooking_vessels/pot.dm +++ b/code/modules/food/cooking/cooking_vessels/pot.dm @@ -16,20 +16,19 @@ /obj/item/chems/cooking_vessel/pot/get_reagents_overlay(state_prefix) var/image/our_overlay = ..() if(our_overlay && last_boil_status && check_state_in_icon("[our_overlay.icon_state]_boiling", our_overlay.icon)) - // change the base state but keep the overlays our_overlay.icon_state = "[our_overlay.icon_state]_boiling" return our_overlay /obj/item/chems/cooking_vessel/pot/on_reagent_change() - . = ..() last_boil_temp = null last_boil_status = null + . = ..() /obj/item/chems/cooking_vessel/pot/ProcessAtomTemperature() . = ..() // Largely ignore return value so we don't skip this update on the final time we temperature process. - if(isnull(last_boil_temp) || temperature != last_boil_temp) + if(temperature != last_boil_temp) last_boil_temp = temperature var/next_boil_status = FALSE @@ -39,7 +38,7 @@ next_boil_status = TRUE break - if(isnull(last_boil_status) || next_boil_status != last_boil_status) + if(next_boil_status != last_boil_status) last_boil_status = next_boil_status update_icon() diff --git a/code/modules/reagents/heat_sources/_heat_source.dm b/code/modules/reagents/heat_sources/_heat_source.dm index 7327b93e59ba..eb5b3cebf445 100644 --- a/code/modules/reagents/heat_sources/_heat_source.dm +++ b/code/modules/reagents/heat_sources/_heat_source.dm @@ -97,6 +97,7 @@ return TRUE thing.reset_offsets(anim_time = 0) user.visible_message(SPAN_NOTICE("\The [user] places \the [thing] onto \the [src].")) + return TRUE if(IS_WRENCH(thing)) if(use_power == POWER_USE_ACTIVE) diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 49d66cb0af70..e7924021f37a 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -27,6 +27,8 @@ /obj/item/chems/on_update_icon() . = ..() + if(detail_state) + add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) var/image/contents_overlay = get_reagents_overlay(use_single_icon ? icon_state : null) if(contents_overlay) add_overlay(contents_overlay) @@ -50,11 +52,6 @@ return TRUE return FALSE -/obj/item/chems/on_update_icon() - . = ..() - if(detail_state) - add_overlay(overlay_image(icon, "[initial(icon_state)][detail_state]", detail_color || COLOR_WHITE, RESET_COLOR)) - /obj/item/chems/update_name() . = ..() // handles material, etc var/newname = name diff --git a/maps/ministation/ministation-1.dmm b/maps/ministation/ministation-1.dmm index 770583a5752f..23d4382b8932 100644 --- a/maps/ministation/ministation-1.dmm +++ b/maps/ministation/ministation-1.dmm @@ -6710,6 +6710,8 @@ }, /obj/structure/table/woodentable, /obj/machinery/reagent_temperature, +/obj/item/chems/cooking_vessel/pot, +/obj/item/chems/cooking_vessel/skillet, /turf/floor/lino, /area/ministation/cafe) "Ct" = ( From ef56da6913dd940f9582b498b0f69d17f8d7118d Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 23:49:37 +1100 Subject: [PATCH 66/95] Reverting status timer deletion due to runtimes. --- code/_onclick/click_handling.dm | 3 --- code/modules/mob/living/living_status.dm | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/code/_onclick/click_handling.dm b/code/_onclick/click_handling.dm index acac1171b0df..08d1ec3b5790 100644 --- a/code/_onclick/click_handling.dm +++ b/code/_onclick/click_handling.dm @@ -13,9 +13,6 @@ if(!click_handlers) { \ /mob/Destroy() QDEL_NULL(status_markers) QDEL_NULL_LIST(click_handlers) - if(status_timer_id) - deltimer(status_timer_id) - status_timer_id = null . = ..() var/global/const/CLICK_HANDLER_NONE = BITFLAG(0) diff --git a/code/modules/mob/living/living_status.dm b/code/modules/mob/living/living_status.dm index 1f6b0dbe8cde..645b53234486 100644 --- a/code/modules/mob/living/living_status.dm +++ b/code/modules/mob/living/living_status.dm @@ -2,7 +2,6 @@ var/list/status_counters var/list/pending_status_counters var/datum/status_marker_holder/status_markers - var/status_timer_id /mob/living/set_status(var/condition, var/amount) if(QDELETED(src)) @@ -24,7 +23,7 @@ if(amount == PENDING_STATUS(src, condition)) return FALSE LAZYSET(pending_status_counters, condition, amount) - status_timer_id = addtimer(CALLBACK(src, PROC_REF(apply_pending_status_changes)), 0, TIMER_UNIQUE) + addtimer(CALLBACK(src, PROC_REF(apply_pending_status_changes)), 0, TIMER_UNIQUE) return TRUE /mob/living/proc/rebuild_status_markers() @@ -37,7 +36,6 @@ status_markers.refresh_markers(src) /mob/living/proc/apply_pending_status_changes() - status_timer_id = null // We are firing, so clear this to avoid double deletes in Destroy(). var/rebuild_markers = FALSE if(!isnull(pending_status_counters)) for(var/condition in pending_status_counters) From 6167b93956c560f6820bdb24eb89dd2e8c2e68b7 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Mon, 13 Jan 2025 23:47:59 +1100 Subject: [PATCH 67/95] Cleaning up affect_overdose() procs. --- code/modules/materials/_materials.dm | 6 +-- .../liquids/materials_liquid_toxins.dm | 16 +++---- code/modules/reagents/Chemistry-Metabolism.dm | 2 +- code/modules/reagents/chems/chems_alcohol.dm | 4 +- .../modules/reagents/chems/chems_compounds.dm | 8 ++-- code/modules/reagents/chems/chems_drinks.dm | 6 +-- code/modules/reagents/chems/chems_drugs.dm | 15 +++---- .../modules/reagents/chems/chems_medicines.dm | 44 ++++++++----------- .../reagents/chems/chems_painkillers.dm | 16 +++---- mods/content/psionics/datum/chems.dm | 4 +- mods/species/drakes/sifsap.dm | 8 ++-- 11 files changed, 60 insertions(+), 69 deletions(-) diff --git a/code/modules/materials/_materials.dm b/code/modules/materials/_materials.dm index 54ad43620bb0..f7d71bb510b2 100644 --- a/code/modules/materials/_materials.dm +++ b/code/modules/materials/_materials.dm @@ -1002,9 +1002,9 @@ INITIALIZE_IMMEDIATE(/obj/effect/gas_overlay) holder.remove_reagent(type, REAGENT_VOLUME(holder, type)) . = TRUE -/decl/material/proc/affect_overdose(mob/living/M, total_dose) // Overdose effect. Doesn't happen instantly. - M.add_chemical_effect(CE_TOXIN, 1) - M.take_damage(REM, TOX) +/decl/material/proc/affect_overdose(mob/living/victim, total_dose) // Overdose effect. Doesn't happen instantly. + victim.add_chemical_effect(CE_TOXIN, 1) + victim.take_damage(REM, TOX) /decl/material/proc/initialize_data(list/newdata) // Called when the reagent is first added to a reagents datum. . = newdata diff --git a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm index 6b76cad038a8..3b42ee375e46 100644 --- a/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm +++ b/code/modules/materials/definitions/liquids/materials_liquid_toxins.dm @@ -128,16 +128,14 @@ ..() ADJ_STATUS(M, STAT_CONFUSE, 1.5) -/decl/material/liquid/heartstopper/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/heartstopper/affect_overdose(mob/living/victim, total_dose) ..() - if(ishuman(M)) - var/mob/living/human/H = M - if(H.stat != UNCONSCIOUS) - if(H.ticks_since_last_successful_breath >= 10) - H.ticks_since_last_successful_breath = max(10, H.ticks_since_last_successful_breath-10) - H.take_damage(2, OXY) - SET_STATUS_MAX(H, STAT_WEAK, 10) - M.add_chemical_effect(CE_NOPULSE, 1) + if(victim.stat != UNCONSCIOUS) + if(victim.ticks_since_last_successful_breath >= 10) + victim.ticks_since_last_successful_breath = max(10, victim.ticks_since_last_successful_breath-10) + victim.take_damage(2, OXY) + SET_STATUS_MAX(victim, STAT_WEAK, 10) + victim.add_chemical_effect(CE_NOPULSE, 1) /decl/material/liquid/zombiepowder name = "zombie powder" diff --git a/code/modules/reagents/Chemistry-Metabolism.dm b/code/modules/reagents/Chemistry-Metabolism.dm index e1002809b1f6..9c78f190ca2f 100644 --- a/code/modules/reagents/Chemistry-Metabolism.dm +++ b/code/modules/reagents/Chemistry-Metabolism.dm @@ -20,7 +20,7 @@ parent = null return ..() -/datum/reagents/metabolism/proc/metabolize(var/list/dosage_tracker) +/datum/reagents/metabolism/proc/metabolize(list/dosage_tracker) if(!parent || total_volume < MINIMUM_CHEMICAL_VOLUME || !length(reagent_volumes)) return for(var/rtype in reagent_volumes) diff --git a/code/modules/reagents/chems/chems_alcohol.dm b/code/modules/reagents/chems/chems_alcohol.dm index aa7ca92f847b..44384d64365f 100644 --- a/code/modules/reagents/chems/chems_alcohol.dm +++ b/code/modules/reagents/chems/chems_alcohol.dm @@ -226,8 +226,8 @@ if(M.bodytemperature > 310) M.bodytemperature = max(310, M.bodytemperature - (5 * TEMPERATURE_DAMAGE_COEFFICIENT)) -/decl/material/liquid/alcohol/coffee/affect_overdose(mob/living/M, total_dose) - ADJ_STATUS(M, STAT_JITTER, 5) +/decl/material/liquid/alcohol/coffee/affect_overdose(mob/living/victim, total_dose) + ADJ_STATUS(victim, STAT_JITTER, 5) /decl/material/liquid/alcohol/melonliquor name = "melon liqueur" diff --git a/code/modules/reagents/chems/chems_compounds.dm b/code/modules/reagents/chems/chems_compounds.dm index 42a44ac8fa12..468300ba1720 100644 --- a/code/modules/reagents/chems/chems_compounds.dm +++ b/code/modules/reagents/chems/chems_compounds.dm @@ -35,11 +35,11 @@ addtimer(CALLBACK(H, TYPE_PROC_REF(/mob/living/human, update_eyes)), 5 SECONDS) . = ..() -/decl/material/liquid/glowsap/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/glowsap/affect_overdose(mob/living/victim, total_dose) . = ..() - M.add_chemical_effect(CE_TOXIN, 1) - M.set_hallucination(60, 20) - SET_STATUS_MAX(M, STAT_DRUGGY, 10) + victim.add_chemical_effect(CE_TOXIN, 1) + victim.set_hallucination(60, 20) + SET_STATUS_MAX(victim, STAT_DRUGGY, 10) /decl/material/solid/blackpepper name = "black pepper" diff --git a/code/modules/reagents/chems/chems_drinks.dm b/code/modules/reagents/chems/chems_drinks.dm index e7ec3f1b2414..a00cf2beaf94 100644 --- a/code/modules/reagents/chems/chems_drinks.dm +++ b/code/modules/reagents/chems/chems_drinks.dm @@ -378,9 +378,9 @@ ..() M.add_chemical_effect(CE_PULSE, 2) -/decl/material/liquid/drink/coffee/affect_overdose(mob/living/M, total_dose) - ADJ_STATUS(M, STAT_JITTER, 5) - M.add_chemical_effect(CE_PULSE, 1) +/decl/material/liquid/drink/coffee/affect_overdose(mob/living/victim, total_dose) + ADJ_STATUS(victim, STAT_JITTER, 5) + victim.add_chemical_effect(CE_PULSE, 1) /decl/material/liquid/drink/coffee/build_presentation_name_from_reagents(var/obj/item/prop, var/supplied) diff --git a/code/modules/reagents/chems/chems_drugs.dm b/code/modules/reagents/chems/chems_drugs.dm index 9d36a9a5ae39..e93452002971 100644 --- a/code/modules/reagents/chems/chems_drugs.dm +++ b/code/modules/reagents/chems/chems_drugs.dm @@ -61,9 +61,9 @@ LAZYSET(holder.reagent_data, type, world.time) to_chat(M, "You feel invigorated and calm.") -/decl/material/liquid/nicotine/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/nicotine/affect_overdose(mob/living/victim, total_dose) ..() - M.add_chemical_effect(CE_PULSE, 2) + victim.add_chemical_effect(CE_PULSE, 2) /decl/material/liquid/sedatives name = "sedatives" @@ -253,10 +253,9 @@ if(istype(M)) M.remove_client_color(/datum/client_color/noir/thirdeye) -/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) - M.take_damage(rand(1, 5), BRAIN) - if(ishuman(M) && prob(10)) - var/mob/living/human/H = M - H.seizure() +/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/victim, total_dose) + victim.take_damage(rand(1, 5), BRAIN) + if(prob(10)) + victim.seizure() if(prob(10)) - to_chat(M, SPAN_DANGER("[pick(overdose_messages)]")) + to_chat(victim, SPAN_DANGER("[pick(overdose_messages)]")) diff --git a/code/modules/reagents/chems/chems_medicines.dm b/code/modules/reagents/chems/chems_medicines.dm index 701d2f1d4763..7b8357a17675 100644 --- a/code/modules/reagents/chems/chems_medicines.dm +++ b/code/modules/reagents/chems/chems_medicines.dm @@ -52,14 +52,12 @@ uid = "chem_styptic" var/effectiveness = 1 -/decl/material/liquid/brute_meds/affect_overdose(mob/living/M, var/datum/reagents/holder) +/decl/material/liquid/brute_meds/affect_overdose(mob/living/victim, total_dose) ..() - if(ishuman(M)) - M.add_chemical_effect(CE_BLOCKAGE, (15 + REAGENT_VOLUME(holder, type))/100) - var/mob/living/human/H = M - for(var/obj/item/organ/external/E in H.get_external_organs()) - if(E.status & ORGAN_ARTERY_CUT && prob(2 + REAGENT_VOLUME(holder, type) / overdose)) - E.status &= ~ORGAN_ARTERY_CUT + victim.add_chemical_effect(CE_BLOCKAGE, (15 + total_dose) / 100) + for(var/obj/item/organ/external/limb in victim.get_external_organs()) + if((limb.status & ORGAN_ARTERY_CUT) && prob(2 + total_dose / overdose)) + limb.status &= ~ORGAN_ARTERY_CUT //This is a logistic function that effectively doubles the healing rate as brute amounts get to around 200. Any injury below 60 is essentially unaffected and there's a scaling inbetween. #define ADJUSTED_REGEN_VAL(X) (6+(6/(1+200*2.71828**(-0.05*(X))))) @@ -169,12 +167,10 @@ if(immunity_to_add > 0) M.adjust_immunity(immunity_to_add) // Rapidly brings someone up to half immunity. -/decl/material/liquid/immunobooster/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/immunobooster/affect_overdose(mob/living/victim, total_dose) ..() - M.add_chemical_effect(CE_TOXIN, 1) - var/mob/living/human/H = M - if(istype(H)) - M.adjust_immunity(-0.5) + victim.add_chemical_effect(CE_TOXIN, 1) + victim.adjust_immunity(-0.5) /decl/material/liquid/stimulants name = "stimulants" @@ -240,12 +236,12 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_antibiotics" -/decl/material/liquid/antibiotics/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/antibiotics/affect_overdose(mob/living/victim, total_dose) ..() - M.adjust_immunity(-0.5) - M.immunity = max(M.immunity - 0.25, 0) + victim.adjust_immunity(-0.5) + victim.immunity = max(victim.immunity - 0.25, 0) if(prob(2)) - M.immunity_norm = max(M.immunity_norm - 1, 0) + victim.immunity_norm = max(victim.immunity_norm - 1, 0) /decl/material/liquid/retrovirals name = "retrovirals" @@ -258,14 +254,12 @@ exoplanet_rarity_gas = MAT_RARITY_EXOTIC uid = "chem_retrovirals" -/decl/material/liquid/retrovirals/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/retrovirals/affect_overdose(mob/living/victim, total_dose) . = ..() - if(ishuman(M)) - var/mob/living/human/H = M - for(var/obj/item/organ/external/E in H.get_external_organs()) - if(!BP_IS_PROSTHETIC(E) && prob(25) && !(E.status & ORGAN_MUTATED)) - E.mutate() - E.limb_flags |= ORGAN_FLAG_DEFORMED + for(var/obj/item/organ/external/limb in victim.get_external_organs()) + if(!BP_IS_PROSTHETIC(limb) && prob(25) && !(limb.status & ORGAN_MUTATED)) + limb.mutate() + limb.limb_flags |= ORGAN_FLAG_DEFORMED /decl/material/liquid/retrovirals/affect_blood(var/mob/living/M, var/removed, var/datum/reagents/holder) . = ..() @@ -404,8 +398,8 @@ break ..() -/decl/material/liquid/clotting_agent/affect_overdose(mob/living/M, total_dose) - var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(M, BP_HEART) +/decl/material/liquid/clotting_agent/affect_overdose(mob/living/victim, total_dose) + var/obj/item/organ/internal/heart = GET_INTERNAL_ORGAN(victim, BP_HEART) if(heart && prob(25)) heart.take_general_damage(rand(1,3)) return ..() diff --git a/code/modules/reagents/chems/chems_painkillers.dm b/code/modules/reagents/chems/chems_painkillers.dm index 6647c2afed2d..8ab62f4048fa 100644 --- a/code/modules/reagents/chems/chems_painkillers.dm +++ b/code/modules/reagents/chems/chems_painkillers.dm @@ -112,17 +112,17 @@ M.add_chemical_effect(CE_ALCOHOL_TOXIC, 1) M.add_chemical_effect(CE_BREATHLOSS, 1 * boozed) //drinking and opiating suppresses breathing. -/decl/material/liquid/painkillers/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/painkillers/affect_overdose(mob/living/victim, total_dose) ..() - M.add_chemical_effect(CE_PAINKILLER, pain_power*0.5) //extra painkilling for extra trouble + victim.add_chemical_effect(CE_PAINKILLER, pain_power*0.5) //extra painkilling for extra trouble if(narcotic) - SET_STATUS_MAX(M, STAT_DRUGGY, 10) - M.set_hallucination(120, 30) - M.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*2) //ODing on opiates can be deadly. - if(isboozed(M)) - M.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*4) //Don't drink and OD on opiates folks + SET_STATUS_MAX(victim, STAT_DRUGGY, 10) + victim.set_hallucination(120, 30) + victim.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*2) //ODing on opiates can be deadly. + if(isboozed(victim)) + victim.add_chemical_effect(CE_BREATHLOSS, breathloss_severity*4) //Don't drink and OD on opiates folks else - M.add_chemical_effect(CE_TOXIN, 1) + victim.add_chemical_effect(CE_TOXIN, 1) /decl/material/liquid/painkillers/proc/isboozed(var/mob/living/M) . = 0 diff --git a/mods/content/psionics/datum/chems.dm b/mods/content/psionics/datum/chems.dm index c19db16e091e..c3ef5546e53a 100644 --- a/mods/content/psionics/datum/chems.dm +++ b/mods/content/psionics/datum/chems.dm @@ -2,9 +2,9 @@ var/decl/special_role/wizard/wizards = GET_DECL(/decl/special_role/wizard) . = (M.get_ability_handler(/datum/ability_handler/psionics) || (M.mind && wizards.is_antagonist(M.mind))) ? /decl/material/nullglass : ..() -/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/M, total_dose) +/decl/material/liquid/glowsap/gleam/affect_overdose(mob/living/victim, total_dose) ..() - var/datum/ability_handler/psionics/psi = M.get_ability_handler(/datum/ability_handler/psionics) + var/datum/ability_handler/psionics/psi = victim.get_ability_handler(/datum/ability_handler/psionics) psi?.check_latency_trigger(30, "a [name] overdose") /decl/chemical_reaction/synthesis/nullglass diff --git a/mods/species/drakes/sifsap.dm b/mods/species/drakes/sifsap.dm index f0fd4f179efe..5334839e70fa 100644 --- a/mods/species/drakes/sifsap.dm +++ b/mods/species/drakes/sifsap.dm @@ -44,9 +44,9 @@ M.add_chemical_effect(CE_PULSE, -1) return ..() -/decl/material/liquid/sifsap/affect_overdose(mob/living/M, total_dose) - if(M.has_trait(/decl/trait/sivian_biochemistry)) +/decl/material/liquid/sifsap/affect_overdose(mob/living/victim, total_dose) + if(victim.has_trait(/decl/trait/sivian_biochemistry)) return - M.apply_damage(1, IRRADIATE) - SET_STATUS_MAX(M, 5, STAT_DROWSY) + victim.apply_damage(1, IRRADIATE) + SET_STATUS_MAX(victim, 5, STAT_DROWSY) return ..() From b2b3eb29291502472746278f6ded308a050cde6e Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Tue, 14 Jan 2025 00:08:30 +1100 Subject: [PATCH 68/95] Fixing cash vanishing when dispensed. --- code/modules/economy/cael/ATM.dm | 10 +++++++--- code/modules/economy/worth_cash.dm | 6 +++++- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/modules/economy/cael/ATM.dm b/code/modules/economy/cael/ATM.dm index bcd301d8c974..2af8810c19cb 100644 --- a/code/modules/economy/cael/ATM.dm +++ b/code/modules/economy/cael/ATM.dm @@ -360,11 +360,15 @@ alert("That is not a valid amount.") else if(authenticated_account && amount > 0) //remove the money + // TODO: Jesus Christ why does this entire proc use usr if(authenticated_account.withdraw(amount, "Credit withdrawal", machine_id)) playsound(src, 'sound/machines/chime.ogg', 50, 1) - var/obj/item/cash/cash = new(get_turf(usr)) - cash.adjust_worth(amount) - usr.put_in_hands(src) + var/cash_turf = get_turf(usr) + var/obj/item/cash/cash = new(cash_turf, null, amount) + if(QDELETED(cash)) + cash = locate() in cash_turf + if(cash) + usr.put_in_hands(cash) else to_chat(usr, "[html_icon(src)]You don't have enough funds to do that!") if("balance_statement") diff --git a/code/modules/economy/worth_cash.dm b/code/modules/economy/worth_cash.dm index fda0929fe7c4..3aa4505b0d73 100644 --- a/code/modules/economy/worth_cash.dm +++ b/code/modules/economy/worth_cash.dm @@ -15,7 +15,11 @@ var/can_flip = TRUE // Cooldown tracker for single-coin flips. var/static/overlay_cap = 50 // Max overlays to show in this pile. -/obj/item/cash/Initialize(ml, material_key) +/obj/item/cash/Initialize(ml, material_key, starting_amount) + + if(!isnull(starting_amount)) + absolute_worth = starting_amount + . = ..() if(!ispath(currency, /decl/currency)) From df59bfb82343262f3aad0691cd13d617c43785be Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 15 Jan 2025 06:05:32 +1100 Subject: [PATCH 69/95] Automatic changelog generation for PR #4660 [ci skip] --- html/changelogs/AutoChangeLog-pr-4660.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4660.yml diff --git a/html/changelogs/AutoChangeLog-pr-4660.yml b/html/changelogs/AutoChangeLog-pr-4660.yml new file mode 100644 index 000000000000..f2d82f7715db --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4660.yml @@ -0,0 +1,6 @@ +author: MistakeNot4892 +changes: + - {tweak: The way you interact with barrels and well has been significantly reworked; + clicking with a bucket or tool should give a list of options to pick from. Please + report bugs with this on the tracker.} +delete-after: true From ebd9a98d6fbc5ae183b904ba3203dbfd606b39a2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 17:10:45 +1100 Subject: [PATCH 70/95] Moving Shaded Hills submaps into fantasy modpack. --- maps/shaded_hills/levels/_levels.dm | 12 ++--- maps/shaded_hills/shaded_hills.dm | 12 ----- maps/shaded_hills/shaded_hills_testing.dm | 3 +- maps/shaded_hills/submaps/_submaps.dm | 23 --------- .../submaps/downlands/_downlands.dm | 9 ---- .../submaps/grassland/_grassland.dm | 9 ---- maps/shaded_hills/submaps/swamp/_swamp.dm | 4 -- maps/shaded_hills/submaps/woods/_woods.dm | 4 -- .../submaps/woods/bear_den/bear_den.dm | 6 --- .../woods/chemistry_shack/chemistry_shack.dm | 6 --- .../submaps/woods/fairy_rings/fairy_rings.dm | 15 ------ .../submaps/woods/fox_den/fox_den.dm | 6 --- .../submaps/woods/hunter_camp/hunter_camp.dm | 6 --- .../submaps/woods/old_cabin/old_cabin.dm | 6 --- mods/content/fantasy/_fantasy.dme | 11 ++++ mods/content/fantasy/icons/areas.dmi | Bin 0 -> 248 bytes mods/content/fantasy/submaps/_submaps.dm | 48 ++++++++++++++++++ .../fantasy/submaps/downlands/_downlands.dm | 9 ++++ .../fantasy/submaps/grassland/_grassland.dm | 9 ++++ mods/content/fantasy/submaps/swamp/_swamp.dm | 4 ++ mods/content/fantasy/submaps/woods/_woods.dm | 4 ++ .../submaps/woods/bear_den/bear_den.dm | 6 +++ .../submaps/woods/bear_den/bear_den.dmm | 28 +++++----- .../woods/chemistry_shack/chemistry_shack.dm | 6 +++ .../woods/chemistry_shack/chemistry_shack.dmm | 40 +++++++-------- .../submaps/woods/fairy_rings/fairy_ring.dmm | 6 +-- .../woods/fairy_rings/fairy_ring_glowing.dmm | 6 +-- .../submaps/woods/fairy_rings/fairy_rings.dm | 15 ++++++ .../fantasy/submaps/woods/fox_den/fox_den.dm | 6 +++ .../submaps/woods/fox_den/fox_den.dmm | 16 +++--- .../submaps/woods/hunter_camp/hunter_camp.dm | 6 +++ .../submaps/woods/hunter_camp/hunter_camp.dmm | 42 +++++++-------- .../submaps/woods/old_cabin/old_cabin.dm | 6 +++ .../submaps/woods/old_cabin/old_cabin.dmm | 38 +++++++------- .../suspicious_cabin/suspicious_cabin.dmm | 0 35 files changed, 226 insertions(+), 201 deletions(-) delete mode 100644 maps/shaded_hills/submaps/_submaps.dm delete mode 100644 maps/shaded_hills/submaps/downlands/_downlands.dm delete mode 100644 maps/shaded_hills/submaps/grassland/_grassland.dm delete mode 100644 maps/shaded_hills/submaps/swamp/_swamp.dm delete mode 100644 maps/shaded_hills/submaps/woods/_woods.dm delete mode 100644 maps/shaded_hills/submaps/woods/bear_den/bear_den.dm delete mode 100644 maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm delete mode 100644 maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm delete mode 100644 maps/shaded_hills/submaps/woods/fox_den/fox_den.dm delete mode 100644 maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm delete mode 100644 maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm create mode 100644 mods/content/fantasy/icons/areas.dmi create mode 100644 mods/content/fantasy/submaps/_submaps.dm create mode 100644 mods/content/fantasy/submaps/downlands/_downlands.dm create mode 100644 mods/content/fantasy/submaps/grassland/_grassland.dm create mode 100644 mods/content/fantasy/submaps/swamp/_swamp.dm create mode 100644 mods/content/fantasy/submaps/woods/_woods.dm create mode 100644 mods/content/fantasy/submaps/woods/bear_den/bear_den.dm rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/bear_den/bear_den.dmm (76%) create mode 100644 mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/chemistry_shack/chemistry_shack.dmm (75%) rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/fairy_rings/fairy_ring.dmm (75%) rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/fairy_rings/fairy_ring_glowing.dmm (75%) create mode 100644 mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm create mode 100644 mods/content/fantasy/submaps/woods/fox_den/fox_den.dm rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/fox_den/fox_den.dmm (82%) create mode 100644 mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/hunter_camp/hunter_camp.dmm (69%) create mode 100644 mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/old_cabin/old_cabin.dmm (73%) rename {maps/shaded_hills => mods/content/fantasy}/submaps/woods/suspicious_cabin/suspicious_cabin.dmm (100%) diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index fc96452d2d1f..62643388afb8 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -69,7 +69,7 @@ "shaded_hills_downlands" = EAST ) submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_GRASSLAND + submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND submap_area = /area/shaded_hills/outside/poi mobs_to_spawn = list( @@ -98,7 +98,7 @@ /datum/random_map/noise/forage/shaded_hills/swamp ) submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_SWAMP + submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP submap_area = /area/shaded_hills/outside/swamp/poi mobs_to_spawn = list( @@ -139,7 +139,7 @@ /datum/random_map/noise/forage/shaded_hills/woods ) submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_WOODS + submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_WOODS submap_area = /area/shaded_hills/outside/woods/poi mobs_to_spawn = list( @@ -174,7 +174,7 @@ "shaded_hills_grassland" = WEST ) submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS + submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS submap_area = /area/shaded_hills/outside/downlands/poi /datum/level_data/main_level/shaded_hills/caverns @@ -184,7 +184,7 @@ "shaded_hills_dungeon" = EAST ) submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_CAVERNS + submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS submap_area = /area/shaded_hills/caves/deep/poi level_generators = list( /datum/random_map/automata/cave_system/shaded_hills, @@ -199,7 +199,7 @@ "shaded_hills_caverns" = WEST ) submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_SH_DUNGEON + submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON submap_area = /area/shaded_hills/caves/dungeon/poi base_turf = /turf/floor/rock/basalt diff --git a/maps/shaded_hills/shaded_hills.dm b/maps/shaded_hills/shaded_hills.dm index 1931b81ef34b..cc843b82c2af 100644 --- a/maps/shaded_hills/shaded_hills.dm +++ b/maps/shaded_hills/shaded_hills.dm @@ -20,18 +20,6 @@ #include "jobs/visitors.dm" #include "jobs/wilderness.dm" - #include "submaps/_submaps.dm" - #include "submaps/downlands/_downlands.dm" - #include "submaps/grassland/_grassland.dm" - #include "submaps/swamp/_swamp.dm" - #include "submaps/woods/_woods.dm" - #include "submaps/woods/bear_den/bear_den.dm" - #include "submaps/woods/chemistry_shack/chemistry_shack.dm" - #include "submaps/woods/fairy_rings/fairy_rings.dm" - #include "submaps/woods/fox_den/fox_den.dm" - #include "submaps/woods/hunter_camp/hunter_camp.dm" - #include "submaps/woods/old_cabin/old_cabin.dm" - #include "levels/_levels.dm" #include "levels/random_map.dm" #include "levels/strata.dm" diff --git a/maps/shaded_hills/shaded_hills_testing.dm b/maps/shaded_hills/shaded_hills_testing.dm index 6a0e4d9d3593..557d760ff9e9 100644 --- a/maps/shaded_hills/shaded_hills_testing.dm +++ b/maps/shaded_hills/shaded_hills_testing.dm @@ -1,5 +1,6 @@ /datum/map/shaded_hills apc_test_exempt_areas = list( /area/space = NO_SCRUBBER|NO_VENT|NO_APC, - /area/shaded_hills = NO_SCRUBBER|NO_VENT|NO_APC + /area/shaded_hills = NO_SCRUBBER|NO_VENT|NO_APC, + /area/fantasy = NO_SCRUBBER|NO_VENT|NO_APC ) diff --git a/maps/shaded_hills/submaps/_submaps.dm b/maps/shaded_hills/submaps/_submaps.dm deleted file mode 100644 index 14b3948c9277..000000000000 --- a/maps/shaded_hills/submaps/_submaps.dm +++ /dev/null @@ -1,23 +0,0 @@ -#define MAP_TEMPLATE_CATEGORY_SH_GRASSLAND "template_sh_grassland" -#define MAP_TEMPLATE_CATEGORY_SH_SWAMP "template_sh_swamp" -#define MAP_TEMPLATE_CATEGORY_SH_WOODS "template_sh_woods" -#define MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS "template_sh_downlands" -#define MAP_TEMPLATE_CATEGORY_SH_DUNGEON "template_sh_dungeon" -#define MAP_TEMPLATE_CATEGORY_SH_CAVERNS "template_sh_caverns" - -/datum/map_template/shaded_hills - abstract_type = /datum/map_template/shaded_hills - template_parent_type = /datum/map_template/shaded_hills - template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS - area_usage_test_exempted_root_areas = list( - /area/shaded_hills/outside/point_of_interest - ) - var/cost = 1 - -/datum/map_template/shaded_hills/get_template_cost() - return cost - -/area/shaded_hills/outside/point_of_interest - name = "Point Of Interest" - description = null - area_blurb_category = /area/shaded_hills/outside/point_of_interest diff --git a/maps/shaded_hills/submaps/downlands/_downlands.dm b/maps/shaded_hills/submaps/downlands/_downlands.dm deleted file mode 100644 index 22721f265b83..000000000000 --- a/maps/shaded_hills/submaps/downlands/_downlands.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/map_template/shaded_hills/downlands - abstract_type = /datum/map_template/shaded_hills/downlands - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_DOWNLANDS) - template_parent_type = /datum/map_template/shaded_hills/downlands - -/datum/map_template/shaded_hills/dungeon - abstract_type = /datum/map_template/shaded_hills/dungeon - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_DUNGEON) - template_parent_type = /datum/map_template/shaded_hills/dungeon diff --git a/maps/shaded_hills/submaps/grassland/_grassland.dm b/maps/shaded_hills/submaps/grassland/_grassland.dm deleted file mode 100644 index 39f0722666b0..000000000000 --- a/maps/shaded_hills/submaps/grassland/_grassland.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/map_template/shaded_hills/grassland - abstract_type = /datum/map_template/shaded_hills/grassland - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_GRASSLAND) - template_parent_type = /datum/map_template/shaded_hills/grassland - -/datum/map_template/shaded_hills/cavern - abstract_type = /datum/map_template/shaded_hills/cavern - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_CAVERNS) - template_parent_type = /datum/map_template/shaded_hills/cavern \ No newline at end of file diff --git a/maps/shaded_hills/submaps/swamp/_swamp.dm b/maps/shaded_hills/submaps/swamp/_swamp.dm deleted file mode 100644 index 9f4f963c1ee8..000000000000 --- a/maps/shaded_hills/submaps/swamp/_swamp.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/map_template/shaded_hills/swamp - abstract_type = /datum/map_template/shaded_hills/swamp - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_SWAMP) - template_parent_type = /datum/map_template/shaded_hills/swamp \ No newline at end of file diff --git a/maps/shaded_hills/submaps/woods/_woods.dm b/maps/shaded_hills/submaps/woods/_woods.dm deleted file mode 100644 index 0baea8f75c52..000000000000 --- a/maps/shaded_hills/submaps/woods/_woods.dm +++ /dev/null @@ -1,4 +0,0 @@ -/datum/map_template/shaded_hills/woods - abstract_type = /datum/map_template/shaded_hills/woods - template_categories = list(MAP_TEMPLATE_CATEGORY_SH_WOODS) - template_parent_type = /datum/map_template/shaded_hills/woods diff --git a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dm b/maps/shaded_hills/submaps/woods/bear_den/bear_den.dm deleted file mode 100644 index ee4d7f308490..000000000000 --- a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/bear_den - name = "bear den" - mappaths = list("maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm") - -/area/shaded_hills/outside/point_of_interest/bear_den - name = "Point of Interest - Bear Den" diff --git a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm b/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm deleted file mode 100644 index 19de9faa9788..000000000000 --- a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/chemistry_shack - name = "chemistry shack" - mappaths = list("maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm") - -/area/shaded_hills/outside/point_of_interest/chemistry_shack - name = "Point of Interest - Chemistry Shack" diff --git a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm b/maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm deleted file mode 100644 index 89ec23e18dc2..000000000000 --- a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_rings.dm +++ /dev/null @@ -1,15 +0,0 @@ -/datum/map_template/shaded_hills/woods/fairy_ring - name = "fairy ring" - mappaths = list("maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm") - template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_ALLOW_DUPLICATES | TEMPLATE_FLAG_GENERIC_REPEATABLE - template_categories = list( - MAP_TEMPLATE_CATEGORY_SH_WOODS - ) - area_coherency_test_exempt_areas = list(/area/shaded_hills/outside/point_of_interest/fairy_ring) - -/datum/map_template/shaded_hills/woods/fairy_ring/glowing - name = "glowing fairy ring" - mappaths = list("maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm") - -/area/shaded_hills/outside/point_of_interest/fairy_ring - name = "Point of Interest - Fairy Ring" diff --git a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dm b/maps/shaded_hills/submaps/woods/fox_den/fox_den.dm deleted file mode 100644 index de7b5dcfd5f8..000000000000 --- a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/fox_den - name = "fox den" - mappaths = list("maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm") - -/area/shaded_hills/outside/point_of_interest/fox_den - name = "Point of Interest - Fox Den" diff --git a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm b/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm deleted file mode 100644 index 3cf4e2edc68d..000000000000 --- a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/hunter_camp - name = "hunter camp" - mappaths = list("maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm") - -/area/shaded_hills/outside/point_of_interest/hunter_camp - name = "Point of Interest - Hunter Camp" diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm b/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm deleted file mode 100644 index 2d56e5161b37..000000000000 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dm +++ /dev/null @@ -1,6 +0,0 @@ -/datum/map_template/shaded_hills/woods/old_cabin - name = "old cabin" - mappaths = list("maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm") - -/area/shaded_hills/outside/point_of_interest/old_cabin - name = "Point of Interest - Old Cabin" diff --git a/mods/content/fantasy/_fantasy.dme b/mods/content/fantasy/_fantasy.dme index 2dcfaa8cde52..87b99cb04e98 100644 --- a/mods/content/fantasy/_fantasy.dme +++ b/mods/content/fantasy/_fantasy.dme @@ -37,5 +37,16 @@ #include "items\clothing\loincloth.dm" #include "items\clothing\trousers.dm" #include "props\signpost.dm" +#include "submaps\_submaps.dm" +#include "submaps\downlands\_downlands.dm" +#include "submaps\grassland\_grassland.dm" +#include "submaps\swamp\_swamp.dm" +#include "submaps\woods\_woods.dm" +#include "submaps\woods\bear_den\bear_den.dm" +#include "submaps\woods\chemistry_shack\chemistry_shack.dm" +#include "submaps\woods\fairy_rings\fairy_rings.dm" +#include "submaps\woods\fox_den\fox_den.dm" +#include "submaps\woods\hunter_camp\hunter_camp.dm" +#include "submaps\woods\old_cabin\old_cabin.dm" // END_INCLUDE #endif diff --git a/mods/content/fantasy/icons/areas.dmi b/mods/content/fantasy/icons/areas.dmi new file mode 100644 index 0000000000000000000000000000000000000000..9849d6f87d8d2a2181ef7e9dea964e03969cc7c8 GIT binary patch literal 248 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJ?5dE65|`BCkvDLl|C80ymtwE+RCQYiAG8;32d~u1GLt| z)5S3)qV?@XLqP@uj-wYEnxj_K`$jBuUcFE!G3oT(`ipnDZ#Wdbe?5P4;etoH214v7 lPFe^lG_nYJAQ6nE3=u(jp=+ionF7sZ@O1TaS?83{1OUu}T<8D* literal 0 HcmV?d00001 diff --git a/mods/content/fantasy/submaps/_submaps.dm b/mods/content/fantasy/submaps/_submaps.dm new file mode 100644 index 000000000000..b715493e969e --- /dev/null +++ b/mods/content/fantasy/submaps/_submaps.dm @@ -0,0 +1,48 @@ +#define MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND "template_fantasy_grassland" +#define MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP "template_fantasy_swamp" +#define MAP_TEMPLATE_CATEGORY_FANTASY_WOODS "template_fantasy_woods" +#define MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS "template_fantasy_downlands" +#define MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON "template_fantasy_dungeon" +#define MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS "template_fantasy_caverns" + +/datum/map_template/fantasy + abstract_type = /datum/map_template/fantasy + template_parent_type = /datum/map_template/fantasy + template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS + area_usage_test_exempted_root_areas = list( + /area/fantasy/outside/point_of_interest + ) + var/cost = 1 + +/datum/map_template/fantasy/get_template_cost() + return cost + +/area/fantasy + abstract_type = /area/fantasy + allow_xenoarchaeology_finds = FALSE + icon = 'mods/content/fantasy/icons/areas.dmi' + icon_state = "area" + base_turf = /turf/floor/rock/basalt + sound_env = GENERIC + ambience = list() + +/area/fantasy/outside + abstract_type = /area/fantasy/outside + color = COLOR_GREEN + is_outside = OUTSIDE_YES + sound_env = PLAIN + ambience = list( + 'sound/effects/wind/wind_2_1.ogg', + 'sound/effects/wind/wind_2_2.ogg', + 'sound/effects/wind/wind_3_1.ogg', + 'sound/effects/wind/wind_4_1.ogg', + 'sound/effects/wind/wind_4_2.ogg', + 'sound/effects/wind/wind_5_1.ogg' + ) + interior_ambient_light_modifier = -0.3 + area_flags = AREA_FLAG_EXTERNAL | AREA_FLAG_IS_BACKGROUND + +/area/fantasy/outside/point_of_interest + name = "Point Of Interest" + description = null + area_blurb_category = /area/fantasy/outside/point_of_interest diff --git a/mods/content/fantasy/submaps/downlands/_downlands.dm b/mods/content/fantasy/submaps/downlands/_downlands.dm new file mode 100644 index 000000000000..c97d04705d06 --- /dev/null +++ b/mods/content/fantasy/submaps/downlands/_downlands.dm @@ -0,0 +1,9 @@ +/datum/map_template/fantasy/downlands + abstract_type = /datum/map_template/fantasy/downlands + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS) + template_parent_type = /datum/map_template/fantasy/downlands + +/datum/map_template/fantasy/dungeon + abstract_type = /datum/map_template/fantasy/dungeon + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON) + template_parent_type = /datum/map_template/fantasy/dungeon diff --git a/mods/content/fantasy/submaps/grassland/_grassland.dm b/mods/content/fantasy/submaps/grassland/_grassland.dm new file mode 100644 index 000000000000..57fcd595c5f3 --- /dev/null +++ b/mods/content/fantasy/submaps/grassland/_grassland.dm @@ -0,0 +1,9 @@ +/datum/map_template/fantasy/grassland + abstract_type = /datum/map_template/fantasy/grassland + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND) + template_parent_type = /datum/map_template/fantasy/grassland + +/datum/map_template/fantasy/cavern + abstract_type = /datum/map_template/fantasy/cavern + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS) + template_parent_type = /datum/map_template/fantasy/cavern \ No newline at end of file diff --git a/mods/content/fantasy/submaps/swamp/_swamp.dm b/mods/content/fantasy/submaps/swamp/_swamp.dm new file mode 100644 index 000000000000..60ece589b4af --- /dev/null +++ b/mods/content/fantasy/submaps/swamp/_swamp.dm @@ -0,0 +1,4 @@ +/datum/map_template/fantasy/swamp + abstract_type = /datum/map_template/fantasy/swamp + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP) + template_parent_type = /datum/map_template/fantasy/swamp \ No newline at end of file diff --git a/mods/content/fantasy/submaps/woods/_woods.dm b/mods/content/fantasy/submaps/woods/_woods.dm new file mode 100644 index 000000000000..657ce2c6b269 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/_woods.dm @@ -0,0 +1,4 @@ +/datum/map_template/fantasy/woods + abstract_type = /datum/map_template/fantasy/woods + template_categories = list(MAP_TEMPLATE_CATEGORY_FANTASY_WOODS) + template_parent_type = /datum/map_template/fantasy/woods diff --git a/mods/content/fantasy/submaps/woods/bear_den/bear_den.dm b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dm new file mode 100644 index 000000000000..cb4da036c7c2 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/bear_den + name = "bear den" + mappaths = list("mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm") + +/area/fantasy/outside/point_of_interest/bear_den + name = "Point of Interest - Bear Den" diff --git a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm similarity index 76% rename from maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm rename to mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm index 01ac1b5988a3..021df578e9b0 100644 --- a/maps/shaded_hills/submaps/woods/bear_den/bear_den.dmm +++ b/mods/content/fantasy/submaps/woods/bear_den/bear_den.dmm @@ -8,19 +8,19 @@ "k" = ( /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "n" = ( /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "o" = ( /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "p" = ( /turf/floor/grass, /area/template_noop) "r" = ( /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "w" = ( /obj/item/bladed/knife, /obj/item/cash/imperial/crown, @@ -29,20 +29,20 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "y" = ( /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "z" = ( /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "C" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "G" = ( /obj/item/bone/skull/deer, /obj/item/food/butchery/stomach, @@ -50,7 +50,7 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "J" = ( /turf/floor/grass/wild, /area/template_noop) @@ -61,16 +61,16 @@ /mob/living/simple_animal/hostile/bear, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "O" = ( /obj/abstract/exterior_marker/inside, /turf/wall/natural/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "U" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/wall/natural/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "V" = ( /obj/item/cash/imperial/quin, /obj/item/cash/imperial/quin, @@ -79,12 +79,12 @@ /obj/item/cash/imperial/crown, /obj/abstract/exterior_marker/inside, /turf/floor/rock/basalt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) "W" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/bear_den) +/area/fantasy/outside/point_of_interest/bear_den) (1,1,1) = {" K diff --git a/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm new file mode 100644 index 000000000000..158824c417b0 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/chemistry_shack + name = "chemistry shack" + mappaths = list("mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm") + +/area/fantasy/outside/point_of_interest/chemistry_shack + name = "Point of Interest - Chemistry Shack" diff --git a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm similarity index 75% rename from maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm rename to mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm index fa4f65d3fd71..6ed42c835894 100644 --- a/maps/shaded_hills/submaps/woods/chemistry_shack/chemistry_shack.dmm +++ b/mods/content/fantasy/submaps/woods/chemistry_shack/chemistry_shack.dmm @@ -5,7 +5,7 @@ dir = 4 }, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "h" = ( /obj/abstract/exterior_marker/inside, /obj/item/rock/hematite{ @@ -33,7 +33,7 @@ }, /obj/structure/table/desk/ebony, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "k" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/wood/ebony, @@ -41,12 +41,12 @@ /obj/item/chems/glass/handmade/teapot, /obj/abstract/landmark/organize/vertical, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "m" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/oil, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "n" = ( /obj/structure/wall_sconce/lantern{ dir = 1; @@ -60,7 +60,7 @@ /obj/item/chems/glass/mortar, /obj/item/rock/basalt, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "q" = ( /obj/structure/drying_rack/ebony, /turf/floor/dirt, @@ -69,11 +69,11 @@ /obj/abstract/exterior_marker/inside, /obj/structure/filter_stand/mapped, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "s" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "z" = ( /turf/template_noop, /area/template_noop) @@ -81,30 +81,30 @@ /obj/abstract/exterior_marker/inside, /obj/structure/door/walnut, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "F" = ( /obj/abstract/exterior_marker/inside, /turf/wall/brick/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "H" = ( /obj/abstract/exterior_marker/inside, /turf/wall/brick/basalt/shutter, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "I" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/water, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "J" = ( /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "K" = ( /obj/abstract/exterior_marker/inside, /obj/structure/bed/simple/ebony/cloth, /obj/item/bedsheet/furs, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "L" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/wood/ebony, @@ -115,22 +115,22 @@ /obj/item/food/grown/carrot, /obj/item/kitchen/rollingpin, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "M" = ( /obj/abstract/exterior_marker/inside, /obj/structure/reagent_dispensers/barrel/ebony/wine, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "N" = ( /obj/abstract/exterior_marker/inside, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "R" = ( /obj/abstract/exterior_marker/inside, /obj/structure/closet/crate/chest/ebony, /obj/random/jewelry, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "U" = ( /obj/abstract/exterior_marker/inside, /obj/structure/wall_sconce/lantern{ @@ -149,19 +149,19 @@ pixel_y = 9 }, /turf/floor/path/herringbone/basalt, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "W" = ( /turf/floor/dirt, /area/template_noop) "X" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut/shutter, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) "Y" = ( /obj/abstract/exterior_marker/inside, /obj/structure/fire_source/stove, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/chemistry_shack) +/area/fantasy/outside/point_of_interest/chemistry_shack) (1,1,1) = {" W diff --git a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm similarity index 75% rename from maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm rename to mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm index b3c1314f5521..2611fe47b348 100644 --- a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring.dmm +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm @@ -1,14 +1,14 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /turf/floor/fake_grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "w" = ( /obj/structure/flora/plant/random_mushroom, /turf/floor/fake_grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "D" = ( /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "N" = ( /turf/template_noop, /area/template_noop) diff --git a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm similarity index 75% rename from maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm rename to mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm index bbd7d2ae0368..b86a4adcb0f4 100644 --- a/maps/shaded_hills/submaps/woods/fairy_rings/fairy_ring_glowing.dmm +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm @@ -4,14 +4,14 @@ /area/template_noop) "h" = ( /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "j" = ( /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) "A" = ( /obj/structure/flora/plant/random_mushroom/glowing, /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/fairy_ring) +/area/fantasy/outside/point_of_interest/fairy_ring) (1,1,1) = {" a diff --git a/mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm new file mode 100644 index 000000000000..76140bdb7592 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/fairy_rings/fairy_rings.dm @@ -0,0 +1,15 @@ +/datum/map_template/fantasy/woods/fairy_ring + name = "fairy ring" + mappaths = list("mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring.dmm") + template_flags = TEMPLATE_FLAG_CLEAR_CONTENTS | TEMPLATE_FLAG_NO_RUINS | TEMPLATE_FLAG_ALLOW_DUPLICATES | TEMPLATE_FLAG_GENERIC_REPEATABLE + template_categories = list( + MAP_TEMPLATE_CATEGORY_FANTASY_WOODS + ) + area_coherency_test_exempt_areas = list(/area/fantasy/outside/point_of_interest/fairy_ring) + +/datum/map_template/fantasy/woods/fairy_ring/glowing + name = "glowing fairy ring" + mappaths = list("mods/content/fantasy/submaps/woods/fairy_rings/fairy_ring_glowing.dmm") + +/area/fantasy/outside/point_of_interest/fairy_ring + name = "Point of Interest - Fairy Ring" diff --git a/mods/content/fantasy/submaps/woods/fox_den/fox_den.dm b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dm new file mode 100644 index 000000000000..894f6f7fb50a --- /dev/null +++ b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/fox_den + name = "fox den" + mappaths = list("mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm") + +/area/fantasy/outside/point_of_interest/fox_den + name = "Point of Interest - Fox Den" diff --git a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm similarity index 82% rename from maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm rename to mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm index 6e1c6e5ce940..8053ead1e471 100644 --- a/maps/shaded_hills/submaps/woods/fox_den/fox_den.dmm +++ b/mods/content/fantasy/submaps/woods/fox_den/fox_den.dmm @@ -9,7 +9,7 @@ /mob/living/simple_animal/passive/fox, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "x" = ( /turf/floor/grass/wild, /area/template_noop) @@ -23,7 +23,7 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "B" = ( /turf/floor/grass, /area/template_noop) @@ -31,32 +31,32 @@ /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "O" = ( /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "P" = ( /obj/item/food/butchery/offal/small, /obj/item/stack/material/bone/mapped/bone, /obj/abstract/exterior_marker/inside, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "S" = ( /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "W" = ( /obj/abstract/exterior_marker/inside, /turf/wall/natural/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) "Y" = ( /obj/item/seeds/extracted/foxglove, /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/fox_den) +/area/fantasy/outside/point_of_interest/fox_den) (1,1,1) = {" n diff --git a/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm new file mode 100644 index 000000000000..262e1b71d551 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/hunter_camp + name = "hunter camp" + mappaths = list("mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm") + +/area/fantasy/outside/point_of_interest/hunter_camp + name = "Point of Interest - Hunter Camp" diff --git a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm similarity index 69% rename from maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm rename to mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm index 0d8357987feb..b269d8d4cdde 100644 --- a/maps/shaded_hills/submaps/woods/hunter_camp/hunter_camp.dmm +++ b/mods/content/fantasy/submaps/woods/hunter_camp/hunter_camp.dmm @@ -1,93 +1,93 @@ //MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE "a" = ( /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "b" = ( /obj/structure/drying_rack, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "e" = ( /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "h" = ( /obj/structure/flora/tree/hardwood/ebony, /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "j" = ( /obj/item/stack/material/skin/mapped/leather/twenty, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "k" = ( /obj/item/food/butchery/offal/beef, /obj/item/food/butchery/offal/small/beef, /obj/structure/pit, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "n" = ( /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "q" = ( /obj/structure/closet/crate/chest/ebony, /obj/item/food/butchery/haunch/shoulder/beef, /obj/item/food/butchery/haunch/side/beef, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "A" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "B" = ( /obj/structure/flora/stump/tree/ebony, /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "C" = ( /obj/structure/flora/stump/tree/ebony, /turf/floor/grass, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "D" = ( /obj/abstract/exterior_marker/inside, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "E" = ( /obj/structure/reagent_dispensers/barrel/ebony/water, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "F" = ( /obj/structure/drying_rack, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "I" = ( /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "J" = ( /obj/structure/flora/tree/hardwood/ebony, /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "K" = ( /turf/template_noop, /area/template_noop) "P" = ( /obj/structure/flora/tree/hardwood/mahogany, /turf/floor/grass/wild, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "Q" = ( /obj/structure/bed/bedroll/fur, /obj/abstract/exterior_marker/inside, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "S" = ( /obj/structure/fire_source/firepit/basalt, /obj/item/stack/material/log/mapped/walnut/fifteen, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "U" = ( /obj/abstract/exterior_marker/inside, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) "Z" = ( /obj/item/bladed/knife, /turf/floor/barren, -/area/shaded_hills/outside/point_of_interest/hunter_camp) +/area/fantasy/outside/point_of_interest/hunter_camp) (1,1,1) = {" K diff --git a/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm new file mode 100644 index 000000000000..4a2130efce27 --- /dev/null +++ b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dm @@ -0,0 +1,6 @@ +/datum/map_template/fantasy/woods/old_cabin + name = "old cabin" + mappaths = list("mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm") + +/area/fantasy/outside/point_of_interest/old_cabin + name = "Point of Interest - Old Cabin" diff --git a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm similarity index 73% rename from maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm rename to mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm index 84ac9a1af5e2..18e121752741 100644 --- a/maps/shaded_hills/submaps/woods/old_cabin/old_cabin.dmm +++ b/mods/content/fantasy/submaps/woods/old_cabin/old_cabin.dmm @@ -3,33 +3,33 @@ /obj/structure/door/walnut, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "g" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/end, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "h" = ( /turf/template_noop, /area/template_noop) "i" = ( /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "k" = ( /obj/structure/closet/crate/chest/ebony, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "o" = ( /obj/structure/drying_rack/ebony, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "u" = ( /obj/structure/reagent_dispensers/barrel/ebony/beer, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "x" = ( /obj/structure/table/wood/ebony, /obj/item/flame/torch, @@ -38,7 +38,7 @@ /obj/item/rock/hematite, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "z" = ( /obj/effect/spider/spiderling/mundane, /obj/structure/table/wood/ebony, @@ -48,23 +48,23 @@ }, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "B" = ( /obj/effect/decal/cleanable/blood, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "D" = ( /obj/effect/spider/spiderling/mundane, /obj/structure/table/wood/ebony, /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "G" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut/shutter, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "H" = ( /obj/structure/table/wood/ebony, /obj/item/bladed/knife, @@ -73,37 +73,37 @@ /obj/item/food/grown/carrot, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "I" = ( /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "L" = ( /obj/effect/spider/spiderling/mundane, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "M" = ( /obj/abstract/exterior_marker/inside, /turf/wall/log/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "N" = ( /obj/abstract/exterior_marker/inside, /obj/structure/coatrack/ebony, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "T" = ( /obj/abstract/exterior_marker/inside, /obj/structure/table/desk/dresser, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "W" = ( /obj/structure/wall_sconce/torch{ dir = 1; pixel_y = 24 }, /turf/floor/dirt, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) "Z" = ( /obj/item/remains/human, /obj/structure/bed/simple/ebony/cloth, @@ -112,7 +112,7 @@ /obj/random/jewelry, /obj/abstract/exterior_marker/inside, /turf/floor/wood/rough/walnut, -/area/shaded_hills/outside/point_of_interest/old_cabin) +/area/fantasy/outside/point_of_interest/old_cabin) (1,1,1) = {" i diff --git a/maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm b/mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm similarity index 100% rename from maps/shaded_hills/submaps/woods/suspicious_cabin/suspicious_cabin.dmm rename to mods/content/fantasy/submaps/woods/suspicious_cabin/suspicious_cabin.dmm From cc60023247fda2536ab3ff510148c2a219404bcc Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 17:15:29 +1100 Subject: [PATCH 71/95] Moved additional fishing logic onto areas in general. --- code/game/area/areas.dm | 5 +++++ maps/shaded_hills/areas/_areas.dm | 7 ------- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 38163a445fd9..d8673fa36098 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -82,6 +82,7 @@ var/global/list/areas = list() var/tmp/is_outside = OUTSIDE_NO var/tmp/saved_map_hash // Used for cleanup when loaded via map templates. + var/list/additional_fishing_results /area/New() icon_state = "" @@ -93,6 +94,10 @@ var/global/list/areas = list() ..() /area/Initialize() + if(additional_fishing_results) + LAZYINITLIST(fishing_results) + for(var/fish in additional_fishing_results) + fishing_results[fish] = additional_fishing_results[fish] . = ..() global.areas += src if(!requires_power || !apc) diff --git a/maps/shaded_hills/areas/_areas.dm b/maps/shaded_hills/areas/_areas.dm index b33bf376d846..e31eff6ce28e 100644 --- a/maps/shaded_hills/areas/_areas.dm +++ b/maps/shaded_hills/areas/_areas.dm @@ -20,13 +20,6 @@ ) sound_env = GENERIC ambience = list() - var/list/additional_fishing_results - -/area/shaded_hills/Initialize() - if(additional_fishing_results) - for(var/fish in additional_fishing_results) - fishing_results[fish] = additional_fishing_results[fish] - . = ..() /area/shaded_hills/outside name = "\improper Grasslands" From 81b95daf1bdc5374c31935caaccfac79f3b5f318 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 17:22:48 +1100 Subject: [PATCH 72/95] Moving subtemplate loading helpers from Shaded Hills to general code. --- code/modules/multiz/level_data.dm | 21 ++++++++++--- maps/shaded_hills/levels/_levels.dm | 48 +++++++++++------------------ 2 files changed, 34 insertions(+), 35 deletions(-) diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index 69ee279edba2..e05448041d0c 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -173,6 +173,14 @@ // Whether or not this level permits things like graffiti and filth to persist across rounds. var/permit_persistence = FALSE + // Submap loading values, passed back via getters like get_subtemplate_budget(). + /// A point budget to spend on subtemplates (see template costs) + var/subtemplate_budget = 0 + /// A string identifier for the category of subtemplates to draw from for this level. + var/subtemplate_category = null + /// A specific area to use when determining where to place subtemplates. + var/subtemplate_area = null + /datum/level_data/New(var/_z_level, var/defer_level_setup = FALSE) . = ..() level_z = _z_level @@ -418,16 +426,22 @@ // /// Helper proc for subtemplate generation. Returns a point budget to spend on subtemplates. /datum/level_data/proc/get_subtemplate_budget() - return 0 + return subtemplate_budget /// Helper proc for subtemplate generation. Returns a string identifier for a general category of template. /datum/level_data/proc/get_subtemplate_category() - return + return subtemplate_category /// Helper proc for subtemplate generation. Returns a bitflag of template flags that must not be present for a subtemplate to be considered available. /datum/level_data/proc/get_subtemplate_blacklist() return /// Helper proc for subtemplate generation. Returns a bitflag of template flags that must be present for a subtemplate to be considered available. /datum/level_data/proc/get_subtemplate_whitelist() return +/// Helper proc for getting areas associated with placable submaps on this level. +/datum/level_data/proc/get_subtemplate_areas(template_category, blacklist, whitelist) + if(subtemplate_area) + return islist(subtemplate_area) ? subtemplate_area : list(subtemplate_area) + if(base_area) + return list(base_area) ///Called when setting up the level. Apply generators and anything that modifies the turfs of the level. /datum/level_data/proc/generate_level() @@ -742,9 +756,6 @@ INITIALIZE_IMMEDIATE(/obj/abstract/level_data_spawner) /datum/random_map/noise/ore ) -/datum/level_data/proc/get_subtemplate_areas(template_category, blacklist, whitelist) - return list(base_area) - ///Try to allocate the given amount of POIs onto our level. Returns the template types that were spawned /datum/level_data/proc/spawn_subtemplates(budget = 0, template_category, blacklist, whitelist) diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 62643388afb8..0befca2a5f6d 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -16,9 +16,6 @@ daycycle_type = /datum/daycycle/shaded_hills daycycle_id = "daycycle_shaded_hills" template_edge_padding = 0 // we use a strictly delineated subarea, no need for this guard - var/submap_budget = 0 - var/submap_category = null - var/submap_area var/list/mobs_to_spawn = list() /datum/daycycle/shaded_hills @@ -29,15 +26,6 @@ time_in_cycle = rand(cycle_duration) ..() -/datum/level_data/main_level/shaded_hills/get_subtemplate_areas(template_category, blacklist, whitelist) - return submap_area ? (islist(submap_area) ? submap_area : list(submap_area)) : null - -/datum/level_data/main_level/shaded_hills/get_subtemplate_budget() - return submap_budget - -/datum/level_data/main_level/shaded_hills/get_subtemplate_category() - return submap_category - /datum/level_data/main_level/shaded_hills/after_generate_level() . = ..() if(length(mobs_to_spawn)) @@ -68,9 +56,9 @@ "shaded_hills_swamp" = SOUTH, "shaded_hills_downlands" = EAST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND - submap_area = /area/shaded_hills/outside/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND + subtemplate_area = /area/shaded_hills/outside/poi mobs_to_spawn = list( list( @@ -97,9 +85,9 @@ /datum/random_map/noise/shaded_hills/swamp, /datum/random_map/noise/forage/shaded_hills/swamp ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP - submap_area = /area/shaded_hills/outside/swamp/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP + subtemplate_area = /area/shaded_hills/outside/swamp/poi mobs_to_spawn = list( list( @@ -138,9 +126,9 @@ /datum/random_map/noise/shaded_hills/woods, /datum/random_map/noise/forage/shaded_hills/woods ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_WOODS - submap_area = /area/shaded_hills/outside/woods/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_WOODS + subtemplate_area = /area/shaded_hills/outside/woods/poi mobs_to_spawn = list( list( @@ -173,9 +161,9 @@ connected_levels = list( "shaded_hills_grassland" = WEST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS - submap_area = /area/shaded_hills/outside/downlands/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_DOWNLANDS + subtemplate_area = /area/shaded_hills/outside/downlands/poi /datum/level_data/main_level/shaded_hills/caverns name = "Shaded Hills - Caverns" @@ -183,9 +171,9 @@ connected_levels = list( "shaded_hills_dungeon" = EAST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS - submap_area = /area/shaded_hills/caves/deep/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_CAVERNS + subtemplate_area = /area/shaded_hills/caves/deep/poi level_generators = list( /datum/random_map/automata/cave_system/shaded_hills, /datum/random_map/noise/ore/rich @@ -198,9 +186,9 @@ connected_levels = list( "shaded_hills_caverns" = WEST ) - submap_budget = 5 - submap_category = MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON - submap_area = /area/shaded_hills/caves/dungeon/poi + subtemplate_budget = 5 + subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_DUNGEON + subtemplate_area = /area/shaded_hills/caves/dungeon/poi base_turf = /turf/floor/rock/basalt /obj/abstract/level_data_spawner/shaded_hills_grassland From ccb4a472f14b01bd7f1bc0c2b19e79a631d53779 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Fri, 10 Jan 2025 17:26:35 +1100 Subject: [PATCH 73/95] Moving mob spawning for levels out of Shaded Hills onto main code. --- code/modules/multiz/level_data.dm | 22 ++++++++++++++++ maps/shaded_hills/levels/_levels.dm | 31 +++++++---------------- maps/shaded_hills/shaded_hills_testing.dm | 3 +-- mods/content/fantasy/submaps/_submaps.dm | 4 +++ 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/code/modules/multiz/level_data.dm b/code/modules/multiz/level_data.dm index e05448041d0c..d1aeb0bdaee6 100644 --- a/code/modules/multiz/level_data.dm +++ b/code/modules/multiz/level_data.dm @@ -475,12 +475,34 @@ for(var/gen_type in map_gen) new gen_type(origx, origy, level_z, endx, endy, FALSE, TRUE, get_base_area_instance()) +/// Helper proc for placing mobs on a level after level creation. +/datum/level_data/proc/get_mobs_to_populate_level() + return + ///Called during level setup. Run anything that should happen only after the map is fully generated. /datum/level_data/proc/after_generate_level() + build_border() + if(daycycle_id && daycycle_type) SSdaycycle.register_level(level_z, daycycle_id, daycycle_type) + var/list/mobs_to_spawn = get_mobs_to_populate_level() + if(length(mobs_to_spawn)) + for(var/list/mob_category in mobs_to_spawn) + var/list/mob_types = mob_category[1] + var/mob_turf = mob_category[2] + var/mob_count = mob_category[3] + var/sanity = 1000 + while(mob_count && sanity) + sanity-- + var/turf/place_mob_at = locate(rand(level_inner_min_x, level_inner_max_x), rand(level_inner_min_y, level_inner_max_y), level_z) + if(istype(place_mob_at, mob_turf) && !(locate(/mob/living) in place_mob_at)) + var/mob_type = pickweight(mob_types) + new mob_type(place_mob_at) + mob_count-- + CHECK_TICK + ///Changes anything named we may need to rename accordingly to the parent location name. For instance, exoplanets levels. /datum/level_data/proc/adapt_location_name(var/location_name) SHOULD_CALL_PARENT(TRUE) diff --git a/maps/shaded_hills/levels/_levels.dm b/maps/shaded_hills/levels/_levels.dm index 0befca2a5f6d..dc2d59ddcc52 100644 --- a/maps/shaded_hills/levels/_levels.dm +++ b/maps/shaded_hills/levels/_levels.dm @@ -16,7 +16,6 @@ daycycle_type = /datum/daycycle/shaded_hills daycycle_id = "daycycle_shaded_hills" template_edge_padding = 0 // we use a strictly delineated subarea, no need for this guard - var/list/mobs_to_spawn = list() /datum/daycycle/shaded_hills cycle_duration = 2 HOURS // 1 hour of daylight, 1 hour of night @@ -26,23 +25,6 @@ time_in_cycle = rand(cycle_duration) ..() -/datum/level_data/main_level/shaded_hills/after_generate_level() - . = ..() - if(length(mobs_to_spawn)) - for(var/list/mob_category in mobs_to_spawn) - var/list/mob_types = mob_category[1] - var/mob_turf = mob_category[2] - var/mob_count = mob_category[3] - var/sanity = 1000 - while(mob_count && sanity) - sanity-- - var/turf/place_mob_at = locate(rand(level_inner_min_x, level_inner_max_x), rand(level_inner_min_y, level_inner_max_y), level_z) - if(istype(place_mob_at, mob_turf) && !(locate(/mob/living) in place_mob_at)) - var/mob_type = pickweight(mob_types) - new mob_type(place_mob_at) - mob_count-- - CHECK_TICK - /datum/level_data/main_level/shaded_hills/grassland name = "Shaded Hills - Grassland" level_id = "shaded_hills_grassland" @@ -60,7 +42,8 @@ subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_GRASSLAND subtemplate_area = /area/shaded_hills/outside/poi - mobs_to_spawn = list( +/datum/level_data/main_level/shaded_hills/grassland/get_mobs_to_populate_level() + var/static/list/mobs_to_spawn = list( list( list( /mob/living/simple_animal/passive/mouse = 9, @@ -73,7 +56,7 @@ 10 ) ) - + return mobs_to_spawn /datum/level_data/main_level/shaded_hills/swamp name = "Shaded Hills - Swamp" @@ -89,7 +72,8 @@ subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_SWAMP subtemplate_area = /area/shaded_hills/outside/swamp/poi - mobs_to_spawn = list( +/datum/level_data/main_level/shaded_hills/swamp/get_mobs_to_populate_level() + var/static/list/mobs_to_spawn = list( list( list( /mob/living/simple_animal/passive/mouse = 6, @@ -115,6 +99,7 @@ 10 ) ) + return mobs_to_spawn /datum/level_data/main_level/shaded_hills/woods name = "Shaded Hills - Woods" @@ -130,7 +115,8 @@ subtemplate_category = MAP_TEMPLATE_CATEGORY_FANTASY_WOODS subtemplate_area = /area/shaded_hills/outside/woods/poi - mobs_to_spawn = list( +/datum/level_data/main_level/shaded_hills/woods/get_mobs_to_populate_level() + var/static/list/mobs_to_spawn = list( list( list( /mob/living/simple_animal/passive/mouse = 6, @@ -150,6 +136,7 @@ 5 ) ) + return mobs_to_spawn /datum/level_data/main_level/shaded_hills/downlands name = "Shaded Hills - Downlands" diff --git a/maps/shaded_hills/shaded_hills_testing.dm b/maps/shaded_hills/shaded_hills_testing.dm index 557d760ff9e9..6a0e4d9d3593 100644 --- a/maps/shaded_hills/shaded_hills_testing.dm +++ b/maps/shaded_hills/shaded_hills_testing.dm @@ -1,6 +1,5 @@ /datum/map/shaded_hills apc_test_exempt_areas = list( /area/space = NO_SCRUBBER|NO_VENT|NO_APC, - /area/shaded_hills = NO_SCRUBBER|NO_VENT|NO_APC, - /area/fantasy = NO_SCRUBBER|NO_VENT|NO_APC + /area/shaded_hills = NO_SCRUBBER|NO_VENT|NO_APC ) diff --git a/mods/content/fantasy/submaps/_submaps.dm b/mods/content/fantasy/submaps/_submaps.dm index b715493e969e..3fb229efde0e 100644 --- a/mods/content/fantasy/submaps/_submaps.dm +++ b/mods/content/fantasy/submaps/_submaps.dm @@ -17,6 +17,10 @@ /datum/map_template/fantasy/get_template_cost() return cost +/datum/map/New() + LAZYSET(apc_test_exempt_areas, /area/fantasy, NO_SCRUBBER|NO_VENT|NO_APC) + ..() + /area/fantasy abstract_type = /area/fantasy allow_xenoarchaeology_finds = FALSE From f263cdf2df6f23f14c78570937fd0d3e512e06b4 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 15 Jan 2025 11:32:04 +1100 Subject: [PATCH 74/95] Adding default name to fantasy area. --- code/game/area/areas.dm | 2 +- mods/content/fantasy/submaps/_submaps.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index d8673fa36098..40144e050f91 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -94,7 +94,7 @@ var/global/list/areas = list() ..() /area/Initialize() - if(additional_fishing_results) + if(LAZYLEN(additional_fishing_results)) LAZYINITLIST(fishing_results) for(var/fish in additional_fishing_results) fishing_results[fish] = additional_fishing_results[fish] diff --git a/mods/content/fantasy/submaps/_submaps.dm b/mods/content/fantasy/submaps/_submaps.dm index 3fb229efde0e..71cfb9e98a05 100644 --- a/mods/content/fantasy/submaps/_submaps.dm +++ b/mods/content/fantasy/submaps/_submaps.dm @@ -31,6 +31,7 @@ ambience = list() /area/fantasy/outside + name = "\improper Wilderness" abstract_type = /area/fantasy/outside color = COLOR_GREEN is_outside = OUTSIDE_YES From d66dbb7a1b98c8e8f7d63172ee9d60ac1fb5e4e2 Mon Sep 17 00:00:00 2001 From: MistakeNot4892 Date: Wed, 15 Jan 2025 11:34:56 +1100 Subject: [PATCH 75/95] Additional fishing results are now a static list returned by a getter. --- code/game/area/areas.dm | 5 ++++- maps/shaded_hills/areas/grassland.dm | 5 ++++- maps/shaded_hills/areas/woods.dm | 15 +++++++++------ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 40144e050f91..b8c1eaa4e04a 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -82,7 +82,6 @@ var/global/list/areas = list() var/tmp/is_outside = OUTSIDE_NO var/tmp/saved_map_hash // Used for cleanup when loaded via map templates. - var/list/additional_fishing_results /area/New() icon_state = "" @@ -93,7 +92,11 @@ var/global/list/areas = list() area_blurb_category = type ..() +/area/proc/get_additional_fishing_results() + return + /area/Initialize() + var/list/additional_fishing_results = get_additional_fishing_results() if(LAZYLEN(additional_fishing_results)) LAZYINITLIST(fishing_results) for(var/fish in additional_fishing_results) diff --git a/maps/shaded_hills/areas/grassland.dm b/maps/shaded_hills/areas/grassland.dm index 9b7de6659e1b..803f9a5e9200 100644 --- a/maps/shaded_hills/areas/grassland.dm +++ b/maps/shaded_hills/areas/grassland.dm @@ -34,12 +34,15 @@ color = COLOR_BLUE description = "The soft susurration of running water mingles with the hum of insects and croak of frogs." area_blurb_category = /area/shaded_hills/outside/river - additional_fishing_results = list( + +/area/shaded_hills/outside/river/get_additional_fishing_results() + var/static/list/additional_fishing_results = list( /mob/living/simple_animal/aquatic/fish/large = 5, /mob/living/simple_animal/aquatic/fish/large/salmon = 5, /mob/living/simple_animal/aquatic/fish/large/trout = 5, /mob/living/simple_animal/aquatic/fish/large/pike = 3 ) + return additional_fishing_results /area/shaded_hills/caves name = "\improper Deep Tunnels" diff --git a/maps/shaded_hills/areas/woods.dm b/maps/shaded_hills/areas/woods.dm index 0fd8dca0685f..73c262300a6f 100644 --- a/maps/shaded_hills/areas/woods.dm +++ b/maps/shaded_hills/areas/woods.dm @@ -4,13 +4,16 @@ /area/shaded_hills/outside/river/lake name = "Woodland Lake" - additional_fishing_results = list( - /mob/living/simple_animal/aquatic/fish/large/bass = 5, - /mob/living/simple_animal/aquatic/fish/large/trout = 5, - /mob/living/simple_animal/aquatic/fish/large/javelin = 5, - /mob/living/simple_animal/hostile/aquatic/carp = 3, - /mob/living/simple_animal/aquatic/fish/large/koi = 1 + +/area/shaded_hills/outside/river/lake/get_additional_fishing_results() + var/static/list/additional_fishing_results = list( + /mob/living/simple_animal/aquatic/fish/large/bass = 5, + /mob/living/simple_animal/aquatic/fish/large/trout = 5, + /mob/living/simple_animal/aquatic/fish/large/javelin = 5, + /mob/living/simple_animal/hostile/aquatic/carp = 3, + /mob/living/simple_animal/aquatic/fish/large/koi = 1 ) + return additional_fishing_results /area/shaded_hills/outside/woods name = "Woodlands" From c74483501ce9fb62c61510a5cbc61484efceb661 Mon Sep 17 00:00:00 2001 From: NebulaSS13Bot Date: Wed, 15 Jan 2025 00:48:59 +0000 Subject: [PATCH 76/95] Automatic changelog generation [ci skip] --- html/changelog.html | 15 ++++++--------- html/changelogs/.all_changelog.yml | 5 +++++ html/changelogs/AutoChangeLog-pr-4660.yml | 6 ------ 3 files changed, 11 insertions(+), 15 deletions(-) delete mode 100644 html/changelogs/AutoChangeLog-pr-4660.yml diff --git a/html/changelog.html b/html/changelog.html index daa00b874bd0..68c3cd7e363b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -52,6 +52,12 @@ -->

    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
    I0`IfQF*PWgkj=wMS zSxIaTOxTVOrBeqJ>+(N(YOPPjb{r9X{ih&pV0FmN`)Xce`GVr_i~QWF>(-F2zQgIF zKwR|2$OoCAF{tGuz?e@XO}ByvfJt%fvL_Taj=`N%>r5`1TCXDlW&y0a((2bM*AIQ5 ziz7?2alC}CcG7NzqKhR-n^)d<$Xe&%BC- z1LYGeLm3u36)^)BoogS739eD_m1X_YK2lJ(aX+#MdGe7QwZvT3zOhvJv>oo0Q)pfg z?;gs!@W5~+8d57-yzrO#xNDX*-q$&AR~!(g{olDsf1Om2rg{K0%wZHmbk zS#--wS66i=h>Irs;w8~xA*U2!1;q7mr}v&^yrWP@$;BtDE2$ULSba+rLULQ~Mfc2= z?C&4SPs01!T$l*WAW5B?i%-tCXV!WtXc+H|`Q04sdp6#C$6Zur$P4QMFN=hu4K{i2 zi&ja~F`{&jFPhqBqiu7DA8r1LOIiU!fZR~B2;fJ5U<5hP~HKU zI+hy)T=oGIoy!vi0G)k6ZJJwI0iZgQ2C(#gCm_qOo&vLkL}f{7oiY;^QbOvF2K_@X z(HFgd%;@<9ZuR4EEe~V!3KYYctX01s2m;Jbl?dvAq!TIHX7S4lA8q=6- zlZQB#SX|p9qNEI5d%IddGQpRLu%{g$qE7$TA>lCoL^?(06b6D>iga5uX>f&cr$A5P zEPD@$f_b?I*)9-!M z3mdom!OYPP+zoMMCJZ3%Q}gU40cd!|gaj&wM&+y9fXa5Tw+DFAC*krbkSpX@x%2qr z0$eSv$i6)Np>lY{Qmmg$6>=`CzxKr4)CuZ^RC7nx-$39+U?b)9rKY7uwsR!)pH=_`Zh>~7#Z6eX?K>h_3ELcEVYmwPgLessmpxq)pU5qzs<<0_dJ`T5ad7gg@#s>s=q}f#2jLUi(Bm$Q~?f z@H`9)suNe=*W950@eXq*X}Z%;Z4Y3Ac8y^=+S$CT zZc2tV5>`{|Fr;eyeZ**E7qnu<75C=J@X^*{oo`CmJ5QBGf4tBcozynwjnakSB|t_$ zrIcm>ywIXNZfSQ#MJ4{ZxqU{+*2ASp+A#Q<)A9D;53{B^4u6q1ecTF_M5X=7px6n? z{=gcZqV5B`5{|(vn%V+-N0}5&T!6Pn85~xMe{*D-_JyW>3kLm|i3(0P2l6pr3&|#cbrvDm^O093ZE?-#QLmQ`*QaK?Q z-$8l%kOSvM?cRKVuf%+@6DEDC-VhxC6YEf;!mgZP7$JZC`fCb6xQ>lNQ(aQ<381!} zdEgBxm=$*L<%X>lXWNahdBUH7L?M`}t^Bkdyt;mZ3 zL2v-a7oiHR#7@m8Ajf+tui$xcA$CtdMg0v<6BNSVvppjE&}AUV9GS{e3su9E+$xy6A2NvUfNwI6>J&NVTv4c~%2W?HlRc z{-yAd%Z+%;a_JAfGXT5!nLlYnruGJ4&r9Hw(9ibiN z+|xERB);k~t)n$lOUV9TJwP3y&K1BKU%q(YKkMlNMk7W^q=X6GTsZm{0K>b$qJ28k z)q%ACpJ1*9+Ycu0Zkgp|&PoBW?y(A)gI2U5M5g~M{QpPCAU9Aw1IV3fTU%joB<&9G z4Tr$~kLKb3)MMpppCKvwA9X~oNIq_vG2|BvA#|P%@5lGF{;gN1)C_3AmSKF8h#Ud;L(w4-G;OXwk!^@u~()}JeR|z zo-^NI&vx=lM`!-0Y2-?UoP)dD=MN6{s0;A%*&kf{OECUJQ(o5dX~$T#hogy{J)`WE%-UD-9i=ga{}3g5SRBB?*(yl7qVXq zLl_NFg+1qP!sbvUMiWlf4qh)utr0`fCIMqNGs^{~0Zy=@#MzPC3(T0OLebGg_wMQ~ zSy%+P{2nR^MGA4?gnaO=xmNJhY>CQ(Q17B(W_NP~% zJolsiMD`-kQ~sl0li%_I#sk|%0w2LH1c>>RXH9;f9ex!)8!3i>C34qhgjGlG)nfs$ z#M2usIYAcji?Dbxc1QqWx-@3OP;j4-gSfT75;K9(sU!(;* zqj~%gJRqt-R*pV;fUi4-AS>b0E!i zuc=0dlm(5c3q*i;w1~_#Yk8RnT$}M_ zrOPr$ufod=L}RCk@k0bB5B%cE)p64L zGS5HP=5bK)7gCM|Y4)?Q=l^bnl85>#<1NRJ@vdXu=pl2e-!aQ{SxV?fG6q5Z!sj$ls2!kCbu zjK3_akWqx&uW$Cvojfb2A;#q-n|v)5n*si6%$u4=k&SPB!ncYJR%|IHn%_eRJ*l|k z?nF9CycduL{$r4g$qI}#r6L2?4xT9E0%+rU{m}VXOvO_HmZ2amje#hNd$*K0O(_ee($U(z zh&1s+-9Y2_0-~Y%#a^-8fC?+#TiG9zUMt-;ACdQe*fn&AjC38QFAag$4SG_SgB~an zQlo4kHjnAd-?!b$X3BfKy^b@EHSQu5ThqLLC}O-br9qW8p;Qp|W6WWNkB(gxr#%|I z&*5Rt9$wiDf~?R{medJo)hfb5$cA8>Kb5o%)!m768BWR9MgE`ic#>tQ6}x4;H}4_T zg863f99%uK4vt=Cv?gD1r1ts{ZR2_qsGodxwuoKRlr0T0Xqt@twz=}nE%rjC z?G9lUAP+=W$%JxC`AEg(jP{Cd#nybJ_bTs=r096cTwOyxJJ6e2-#dEJ>+jclR^R(z zGd2gp(6y6*GNSCY90mJjvg}00wkDzM;y1=4b3pOyk+LrRO5rY!5)mI=SK`=^j$-Cw zp9eXJfqcTi#|fG|DKWy#&Z57ydwcSHT6o3!HDr%TDLl9nV!W04Atd&b>4a&S(C$PN z*>W)Jnz$GZ#3?d@k;j7P*8S9#lnLhIotQU*{JiB9k2{oRRP3~Pku>9k)T;zI&2db0 z`s;TlyegYocwUPj!CS2*IuZ(e;|WGLg6mA$)_qG!XuH&4i}RPogQL>7Pw%*YF_R{a%-xV_XEiyT86E->HKj-;9 zZpS>>=lPF5_J#}MT*iN0OYd9@d-m-Y1EUTbk*PDQE#}q|UA9A!^8Ruw@)b&wkmsCw zartqv%A+|Mu#L3m(44hO0!RGDUX1nZ6PlcCO+rs&3^GElLHEV%%m6>6Zvkc&bu}#6 zqB@9km8x}!6imyW+yB|Wamoz^5j2mW#fg#8Jd0AIwvhXDY3T^XXRXvG;(Z?xKJRZ1 zCG?Ax?kZWeiop;u?+P#?c*48IvnZ3iE)rDN{N?xHr#5Dc-VGs5ZwI*9)aG}e7`4oy z?tsszUd)v7+j{jB+D|p=0ah%QaMN@&+P$JLd<0@|ky+m5`H8!i04jXNJy-?`Jrh%i zeE-!XvgK`X`peCt0_@+V*K|(=d{*va>K|NkcC&Ws+s&{bm)bj+Ct4-is7MEpNNupjF(V?a$_jk-}DnTjcMk znCvfUE+h$}%rY#0-x$1o`g)#C!nb9js2C|2X(P6nCla9ZxKs@%4_vffTX>{70v6@v zwRjNt#i)@yQu8rdKsajRRrT8Q8*1t&t=~l`c%zf2z<;knGn&5Ky8Nqw_>aoR6{H3j z7RyueP|qZ#<*V^3S?{NLD`?s(XOO^UvS?erL-;fPZmv=>pw$iU$ca2ZQpL}$73QYs zLCkSSjm3^N*c%m4U2;O-SxE=WQb~xZ*mWBNu|0~V7p_Mn92lGmh@JxY*uhdU@PC8S zP;?!m2#;PyGNG5w(N8mChha5Vw+0M98q*QhK;7b}B}m4=74FLvQcNTht}a5?iAb4U zWA?t$#jR~L8(Y<)&fb9F*h5h0vGcBG&K4h%gPA)itQu5`-vH=T|9ArG=< zW$AieP0u-t@oQU!XPDHL^xI^3+r95rkIJ~i3d6zKB-Q@jS%-!md7xm}Choe|N4xa(=pg&zVeXU_!$vh3!TkZf?gBEhw`4U;nf%C7Ev4^zU zuLajlmH7;`9$I{7<=qP8VRW}H{FezBvx@33BeCL`kki;!x)(`G#KR_T&JoG;`vUgQ zYSh3r(B%L60^oi-#Vy+2{L+yn4VHJOqHf-fxHic<%gQ<3^ef;$N<7`%cNj_3xjZLq z|G!9nOiF*J$7-E;fbQ?7-d(+o;OqUyEk+OSzXVEH8;g|*a z->{6M=uZbv^uj%sT9SNV1R$e*n4}#+(8C?D_m^nKUV9FPpRe`8V^7?c>(U&=wTewC zWB!3l0`KDFqGIz<4){<`n7D-$xIWUyj;exw*EsjveWv@e%&wxnqkcYrfs28Fu1zVi z-{kkzNIA%5WRV;4-I*Y@XGoOF?Q(MYQF2{ZC&9QE{J0hI&5H<<(8CLMf+6?q6z)ci z5%RH1a6}UYr;vv>^(}91a7yhvaE^?VEF;4$;My$9(K5c`x5<up4S-us2AJk(eBPNdFeJZDJ#9t+r zak5)*a%T7$T@^p-kC`CE=ELOE;7SvQ{b74fk49=b?@~LaOaCBR`Hx0@MS=8(!_Cfa zd0h8i0YbKn?z)0|it_a-F9#5sjb2ejCtT@6qTj-`67Q&A+O!$(4;5QFnKh$m=W2g* zgFP*OylJL)%!2Pxfm9XoO9<~qP7fS@JwrVs11AtP)-`T(-g{Y@E75h*dafF!;w(<) z5Ud?ysY;Z%a#GkO(px~!fOb|+5ghU6Q@BeBxvH1NCv9reY-xhOU%U$tYtTyIMGlf+ z=5K=U^z~YDGHkjM+x*K%4E9E{!3_oIyz-)BDE`67RXg*z8sF5k`ZVvlae(Q&d zb5V8giBX_LWcC?7q$0T4`vtL(+W34$5wL)2HxXv%b-yHvzA#;!_xATo_b16=sSzcP z3$TC!Y^i-X{qsswlj7nG-Wad~#EeG=d@Ri55&MECT;IGY>|f`!aHs)>QMa{(`(!RcRE4xcU-7MlUQmu!9hE)q2jnA_}3Q4 zuYXKfZ=P4oLqWb`$(dqwKk3|Wg0a1bJ@KP=`$i9gavW>0!0CnjKBPaYD7*8G?f5C{ zuPwd@GkuWq_fj%b+Ik;FMuUI7(0pQ)`GqcsbV$)RpONoDq#kFcg@-`Z~J?Gp~{fB673Zt&UA!TY138xKv7J0gzF zo9c-SA*5kt7r2YKjezF9=v3sz7?vAxKxgH!yqtH2Bs3*^q_S|EkZ;F|I7lyLotM6f1z;S22ol}D5l=O6~C|+@j7wS*?i9xHuIh2s4&J^ z+ZPQyx1$KQ0_*U5cdO-uIQX3}-y!rJOO9kJ~DVcmRG-Vc<8NsU6p_Aw?bU z8%OEXouq$iGf(%0&98jQv%B(Z@IPxc2kP}f<6lS#yn*9{f!_RZ|Hc(OPlVS%^sens zEv1W@#r((HgfCJ>?hI9%SCFFBm+F-jUuXVQkn$EVRh3_!hIbtJYHT@}P8y}b zzfooJS~xq;`4V^A90srSP!^g=gz5y1*wL!AEDT0y;1JmPEZRd7Smb}Lpw22GJr1k$ zz4wA_$;dPR4JcrY5_?+dwhBb5Gw5ekb{qE|cp?$nQFsbX@#fa_ytF@nid>E(`@Vzr zJe9|y%=GeW7a1gEW49O`-qkwCD$qTQY|`lSTsOJ<{B_J!P&9bPGANy|+#I#&stP9$ zO$&^&tbaoKf!>;v=VvH8h*YGmmX5+{1xovq@XsJt*I5+K!G^VZx?xC%O6m3!T=~xW z$#})v8nq*~26fd@o7>fM1LF%H^X0rv+0fBtuP9}UQOP=iB=CKzF~``x+}If&-WWEJ z0s8>+j^GctJ$nqY(HgGn6_0gYvkYkzN5tZ+1+t&=yc==qj^)B{Q*vH&$nxsP$tk`4 zoMue-ibQl|ETNx%hi(X-#inn=Imw@uRBtYAetd1x8$m-l>tjio8(LgyxPtr0&saZz zZjN3GePGCNVs|v#drpbutRcMA=!rocd$)LVLT4!BA5g#+Q16eP z8RFO}s6lQEK3(D}OHmL)ya&z_kH5>Z1%!Mx0pu`P8HI{;8&Ej3iRBx`+?&fo#P+@t zY@mx8UWkpFCzvIZo}8*Y0v$1hK2Sw)jeg6)zE|s17OZxuL00)%ndp-;*c0BqNhsI zvlW``^O+1`X&QPSw-dwtAK%!wAid&CO;Z=#N0MMa3iP8jZAEHu1jbU4iF)@I{C$Ic>8roI#kY` z$T|?&%s$)r8@dw=u3a9U@T3y%TA((wM={T;yMtRu%@PPl3dJ5Z`o(l;r`oOwgeyJK z5`qO03vzwZ6#h^y0Z-j}y;Op*=d@({?$FhYaqy1pxtyfNf@(0E&B^5LDrY=5%n-~w zxD&C^QB6TeUASzkY4ZjV#={8<+Q8?0`QDT;oA@nd4Tk*`gto?`nB)qdCK3~IN(U?Y zPaQx4F3lgu5;=B6D7cDjO=6kl6tdmzu4F9f4%vkJ=m%B{+)J@N!(1Ht5t~tOx;nkl zDSsS_Zcsw?pY#^0isGgPFe6*_rRpS*X&8;w<=N10jY=0m&WE>`M@%`dc zi(#T_UlS={ZvJoZy6lfHW{$QRRR~tOHNsrkk&O(~{w;!nLi~p0dB~sDmX&SUl>H`Q zga`hx_GF17Q9>bv1jFAFa#5i?6fOf&M=#a7>;&At+Bo$dT)Ot|+eCUl3!S6Bx$r){ zw{bXx5KS41t=haVf1#k*+&k9~eMcH`9do2q#rje7{t>bxNdxEF#h&Mfaswrd9{BWK zoxT8v&{SW&?uMym9wb~Wy7x81T$&=iN5S1XXEv-v`PGo2obbTU zYp8tHFCMW(e&_=NGbvs5%*mT1rI{3f{POWH4(uOVxD*8eQULuT4`HGi$5I^Hpljsb zZ{@7?Qix3>3*q4*;Xx}gL|(-9M2p0~GiMh;u5iMwNlDnrXm6DRb+cHvI2m#nw}}&_ z-Zks0r0`4mgQy~C~k-LfHAQ3UpKKHbsk7%9-TzvE2_&5M4#9*V27L7 z?T}TgTA;p$Ol{~t)=!CiL2_nyMa}EqaYWQmR&k|)Xh@hJD=TkWu1K#a76qMzGWFN7 ziaynkBF?Uqetuh@&+Pjx<{$6mRy4jz(11Y?I_8mICA%^@RP+};A_6(^(Sdv!tAGFH zoLu}HJ;_XVse3%Z&qFO%C(ZB6pC{~0@?$FGkLI^7?NS7R&moityUXuO7NLoGTcocB zmpDgVoW&tjAd~($^6zl!fy|6`t_v|qx%s|v76-lIbVA#m!g0^in|1bs3^%}&8Usuw=vwG&ATli}F4hh`8t*4GjaVqo$*w_KGsAUWJz+3=6vwm5BbO(*d75S(Kb z{t><~_k#nskm@OqrF3dynMSo!cKgR`n*509u!x6TN)G4ve_W*{_uDu3lpo8zPIom)=d-Au*H65#+ZHs`6OUvvuW_r|H+U-2d zQS}VsAoIrSC20IM?u=uQF%ea%>wh8~QTKIyEWAU;M6fqUW>xhGx0X zY6ongBg`(H=0yk{E`C6l(h|1RE_TL{iU=M@8T?d_49m*?GfWRm;WjLXeq|$&ubZdi zc@1!DQ*`sVlMsgaq}*j6_>(78t5*xizXw}YMViUAnQ4A&v{P?chANypgnzl#pI+_l zMs|*Doy@vL3dOI~BEbm6mrIIf$V$zfp=7VZkFV3wI2+j5h_R* zw{q0n$_=f?5%xQST5eAVZ4oLugWIn zXj+*pD>jubnlZ49X2O>I&%lI1{xKDWkJLJH(sImAfJk*p4RF#T=p-|qx=%KY3lfk=@ zW^NZ6TPFO?i*XOH#{AEFOq=o_2pU$`t1@#4&i~^SZ(a{fmEVQhdtu%B6gL??|LWn6 zgLbldBx^3A<`np+i-j9B0jGFn7I?e?4GcRKAzj#@1dx)u9#W!L8Q&#N4_9+!Bp!Xm zeHRs@=$p1xgtdmHnzgfGGYKfYs{KqBL*NBxd-*RAWj{E z%N4(jaA4wM^ea<0isIh49y}W9n|!l9MscX0R&dkNJ)kAyQ_vKnR^Lek=Gb$yFzmIo zEfn%PEaNEHv;i3?-+`goSK-A>X0OVVhjY_Ju1PX}zJ{ButZvMo{;%JVZWvcy0kE^e=VxH|srMY+G7nO{RG zI8w7FH4~n(Vys5|l>GJpyWa$Ai5v_3SXOqLdV895l5@XG2<#Yq97JKv~S$o?xQu34q`vN!kw(h76YF} zk%o!xOfKlK_!2HhN}HVC-FhM7!5<&`Lv)RHh=8$3S3}pA3C&20ne;)Dpes~`eBp`m zY-hB;uw`Esp{m=bIhdD)V!_XpOU4LKsamMMoE+eCUbbvDd3T`Qwlc5|YJ^nz1ciJ} zMSI2rI-OQCqw{+Sbts{~X$;U^94*UPAr;3jGDyhXE)7|&@V{_iD-62?B>oAs+Uvzw}8t`2YeK|KS z$>o0b#k=thgF+eCeWp;-`{r}_y`1C##Or7KLAs=mXg84;x41p-he*DJQh9Sm$l4ZL7#`a5QwxqHY>M6INAcHU@ZpIPJT!QVSKX^4o8gLUT|-UQ}@UcY&oe0Xa0 zJMkNai=R`MiJD}{P|uhs3B#`uZZel%hqAruJ%>~53l8@RZ!ymA#4fPy4l{q?N~X8$ z0ZseHxCuK7es*l&?jS6LRBb!`Lv`388--(<%vWi@-BnBDVe z%Nnk5*i2y);U5iH3rmV%-H;}@qjKpnF7_kB7rtQuZx^l6OBau*l-~bCO z!A@RiqDMUQpX0}yVAse$%&IVVN5>yI8YxOkMkAkzyxu{d>>Ip!R}+PDvP!CZNO9h} zPWVUL6?FYPH|yDKb`A({_sH0dYDl!^F|27HjT+CkON6qYYgL#h)b^)$6}~*zJI|-Z z$3MCgwS`s6U?-E`?Hzxl4*bljvM3&ixvmQ-7PTRH%b;)#`bbkrWYAJUTJE|ryRG)6 zC;E@zoi!V^+K1EE+aiEC`z8wY76i2X|aXQNlzUkjkLg+RidL|0ef?5i>eeirj znbVsr)-Lou8$k(OJ6rgX1tj}H!*tDqLB5d-MeBW|OK&(Ql4R7XyaJa@0Hu_FOccCxa}2UV(|J@|Mi6uokD#W@xbOX$etm+;qX>^gKNA`s5!6<{?4~HncHBI zu}czgokvkYd@s+~O@t?HosO*ia*@{7@|6m|tx3st0vAx|LLu_+wH%5$5@cPeoAKRI z)9O#E{mNPGH53$1(LuhizZ+_5^PpW&nKKS~TC7+QwD5EL$CQiUXVoPBPKVe1`YTq$ zVX9Bl`vWu&?*O+DJU&d6PS8(4V*&rWjg1O<`%F}Q^v~0>nmKK91a8*WO*2Jp-4>+c z4`L7?J_1JLxeXqFatHHd*R8oX0Ko6RK5sqoR9B8lSJMyIaZohE;HsgK$)7aF26N7@ zJ>V=hnxVtd-#UI~^v1Byhv{Ct8A^1gWW7-Ii9DR!V5~XxY&X)#qwU$8c$+siXe`cq zu{CIFh&{lIOBQA;3(%aZAR4J13|B;CrR-7$~*{(+bTwcBeXx4VsYd!&0nJpGyFU49r_|LVkO}II1U7 z^M+L!1H&`951{&Vo$}zXqNfa>Q7l9|Z6v;p6@yvHpGp_9eN<^3r1=$#@BAoz{_E!> zz4r9Y6DngEs_(=O3WScSx6!bX*n9$qWYwLIB!d}1rJO2$w>4%3+p(XS^ z+F~7D$DTLPm-(%AE5jCo9Z&xOHbSd*GRT*|2+ZC zequ$nzY6tX)9;pwQfYbSZvT!(zPy9}g~)Le&8H04-!oBM-PbT|nkyX}oUvjbJ3E+z%U>Yz= zES`e%K!!}0tN56Pk4^3-v1rxe9272~>`s!}m(-p<$vT9_A8WzYr>)NWnMFj}dvsJC zm1VlP5qKdn^;5uhW_i2s<<-x3->Ld$KTF#!Bl*L=O>^rJa>#inuGM>970Htov^r9s zMv-|w+1{sp%n2TH76a;D(3Se&HT@Yr4??(oIxgrxr$TsytuJV5J1a=7cR#PSmE6uS z@`SnETwi3KUCw0e@Mei-<1Oy|BHW>2nm|J;lp07?y2j>!*{3JsI^KTP^#UxG*}i>#XN(GqQ9UmckeH}QZGN&bGYLt% zbVj5b%h)t!y>*I)pEcv#WXTcG&Xrp9&iNN5FhjKa_6Ga3w~QU_$zKK;4huJY>AdFu z^#vHCDv0&-cWq?7S0>9JP(+CT;{*NW*8?%$`UtzfZMb!nJ%NRMEE&=+Me}jaE+6CA zLgy3~c{HD|vElx-ma?A}j+DFDsT~F1-MY@XOC7hWTTd_OvaFiV<}Tq4dlw|}XF`%c z+`_`BNr%y{@V7?7)<*{mi!GB^PapLffebU)d-dSVScx`*LjL_HTw<6qb9Ukh;~Ekv zQ(~zUe2AGBE4^ihW03k2l7F1@BndB&mqi#y_b#~gJa1Yvg9N2jQtuUVk?_ziB2p21 zyb{D*%`zu(yTk2eL8(q)(!JbkQ|Fu?+$u!jR(va^HI(*kP8zDO^g;U6ImG6GC+vC= z8KIG=2*f-u`mcvz7nq3nnV>njeoePLu`AF@F}&-v>Tx3X?lSndpq^z8IREmckw|&O zr@H8>DoERp2{)1^cctOGLScoB>KDQVF!1fEhnFGl(*VBE13{m1<<0Sk*U5;iogDdj zjn_{k6pbuC8=BeDBb%{ms>ErpQ&tq=?;aKkvA!I(SP6(fc&A~X_Tx1MD^pw6gmLwR z=hwv^*;L1@jo1e~X5uF?xd}aXHw}v6@FOpij5%OSgK$)2-E>hQ-c^2(BW{C<32m$I z`CVLlt%Z^6ft3G&R6OKqJB9;YkdGE5Wemd2UFTS~k|EQvgEhM<&&}6lp$qu4_;^1t z(NWz(;V@*Ex2iM)R7p4d?q)ab7V6Vc(AIy^l~r|8U=8cST3E<_?wS|D>?&+Frdx+U z6`dY>72&*%V_`cL@Az>&^gR1>43GV@Z9{+sH0%@nanfau8i(MqgHrQ7jn|=ve$I|R zJ0CW}w5u~nOq1~6qHiwqmJ%kTBHw4z+)h=)e+85B7))O4twS#>b^aa4xDh?ghDz{T zQ2YQi{K*f=Na-o>_^!WxCe1E9@l=OdJ!rxQ!1Wg!lJnbsvzFh8Gxm|!q zb!^}?K95G--6BM$4<-(wY%PAx%Kr>ks(SdStcWe@lE10CM33R0cKxdLx>S5mO2i~8 z-h6n-LSXmf(_a|SHT?Mu+rNF9=sWsfindzUHKhPNg}ULb62kb{l81SrcRZJOQof#e z-`;q0>Fe?VIPoX^f)3Z?m;OEV7WRvuuB# z!D&~Iq9Y^VtS+%v^lZA?D`c(2;~sJeK)v7=%?48S|Bt5cj)v=vx>loi(R&Heqjy0B z(Ssl&ql+MVFQW^hCwdD)kZ6fsM(@417>wS#8OGdie((3b^Uu9^)~vhcu6y>`&pBtG z=UBP1zUx+*uz?L-tZ!XROD0q3zr`*5#nSow>K}>9AB+g%44Gs3RC#GI_%Gl2t7>dBjMrS)&xv0GJjxFv zEVOl$FHu?)eveDsWI8QTkk6w-1*X9ec+-c97+b8=q2VA4iY5h0T;Cv=)pX-qEl-PA ziACz<<>L=)74TA9mztC2W1Odezg*K+2P^fH(WNfm4U0*&^`<1X9~6wrlNB>?iEGP# zzm>1wcIED6vKogXgPQmLJaf1Nxx@&!Qc66RQ&s~j$QL}$uS^)OB>xKk;SVn}?grY8 z-BlDze|=_OE@))tGLbEg>rfM^FXTDO*nmGa?q_WP{tY)4JiaL(nH-tWc>?8u+xU0D z4J>{liB$UeeKqID&{}Ai0I2=$ugpWS@jiT7h9_DnK<;G^q>%sFoB#hdjE%peA!Es) z0m4O8t^>HAL6q_!y}wN1yF0H*YUB%}5%WJDx3o=&r{&PTz13CfK(6-e(*hj@{GiWAtg)*j7weYK9c4o~$b{~9Qy!WE-zQBsCQ$?q8A$9Q9c(vz;R#LrxP0xhk#*M6@vqa4U zPc|hQD}O;+Hd8;^Oi{Tc#qaCrn_wr9kc;tOa+`4c!wC)!FF+*4Cqb{KYA>j8jNw|B z^Aeq?hZR_kHVL87l`WfLXfBmkbqP+T?y{PQ&QCqu5v;0rl)!pD1o3nD&dOi)T&w(U zC>c;Sgyn^gq~{ZZbDq}l>?X&b1-EMCI9`n0QGcAb?jzB%)|33`4Y^PI&7-9>E5IrD zo*VVtUo8|0Q5ff4IsLi}?n$Lfc+0G`6j0}tEifsA1**Q%Ky-XU#npY9EQ>ie)sFYw;A{tBIA9bfsA9lTt zfvvs!oyG>7DEtvTmPZF<Bj4yYfNs1 zmxsQ`*+5U2*v(j_*AYJ7z3lHj{oJN>6P06AaAkq&o!Lv!I?CW$hCPjY3~zptp<3EK zam^7J#d$3;d;1SrRuC@*Alj5r5ZHPk2B=ArBqa0{(7Aaf#17fte-|qJdu5Xl<<^lCgY}TTsgLF zh=Q?!6Os;E`fy9Abo~bVzSn?Rob>eelo$6;l+4&x^)OO|wTBW#CT-WRzJ!C|M10Cp zjozwyq)dQzhk9o8k*0E0BYyf`V1?@}ayrPHac~VtSxjsqD1RX`YwT7CAzw@ueBKou z#LlZ~K!yDe=WF2`TOE0~c>LCni6VY(yLnA zq&SII7G0>KG`oYkv+)*{rF%e zRyzA7x(CeRek<90x~}zpXek3(I9Ygx+fA~=`ZG-sNGbr(Sftl_a6H)8B1sp;c$YNO z1U^5?WJXb3M=3}&_Z;5ay6hQaL^4Wa)q=gAM4_j$`E`)V(BVH1^CM2iiivb{9&}&7 zU1`(Y0AEAop&4Ug$9O+@H{C_Nd1VW=lp|+rH(X0~2$fKCz(rfi*v6uw%A1r;cO*M} zvd-Rm_q_?i7=_p}k=Upp#W4DxN4VZF^2R9qKO4A9E|SNNr%dsxSRui2}BaDq!W0I+f z&vdlzH%j*U@gIr6VdRc;K^`$15k4 zEa6|AlzhcFO~JUV!Z^*%cu}dyjzO5NHY!rXgg4S~)@`@_4%#EG{koQ}qIBa%u?#;6SU({I5?I&FCtbvTQKg2G^3IDNd;2L@x* zXQTuLYWdGrb?n)KE(X{b7Zojvsz`=x2p|qQ9-z;{g2cLoU&2cd1N+?1q@s|U8c0D# zkj?(|4-6(H_b)dmpY-jjnmnF`blFV=wz^r+u6P@0r&TpjX}dUDt^K%MJRe^XXbq65 zhTJjuu7=>52t%?P8(m??jg6d@d}I6NznX3sLJ%Vvd;7;5dsDE{%x8H!(e^Z;W_-=p z@C>kjw*Tc0_M}f;gtjkj9e>kS>JoXHj31o0;}rImrj%=HD(8DcdDgyInWrUyDP%5E zkk{(tejMkNr36;IzlBV61mCBG?equG2)yl07c?Kba@gBHDXcBe%D!W;AIpyyAVM{{ zQdc&ZpiKah@;|mP7h~Em7gKe(mmSR|!&{Mfdhb_98W(BHg+VZJ?RIHamn9_5nJA3Y zM4I|2uEf%eCXPZ~48}`+t`OrVpXgxs+&Fe&F5KEuMkc5%)IM7SzKv`kL|&028W0LKFu%5~04gt$#e0e;{EOP-wrw+{^zXiI1YcAip`eMwgubuDy>gmx}1 zikva>$|z=6SnbJXe=nw$h{WH?r2Sa1B@pi{8DHg?`Hae9=1iVd2W!Q9%9uoT zhP>{JaFBJawAz63g?u&x!=znoxC<-*MW1*ojks4qg+nb-*`g>0i<$YvG)UsElqxRR(Ri;v*_KkjA(x@1NSkDhn{rlJV_o-kTaytIkJAY2#!WTSn>>Cok@~J)Q z=Ei4jts@UNW7KlF!raey;S-@K*CC@{;QgB&q09-C>gi0zzQfJ0rByfBn622u?A*L) z@DA}oHp5b@tCTwlLs@;zX}bbGX1Og1(e4;GH0^tJbyCZYxU2J0|7Kr2VyRST)$Mpr zz|2RYJ-Gd71yXQVF4lB09FWMY5Scq(JTPcir=2DFjXPeL2gIAI zQTpMNbCFQ~`q_6Ie2JI8^Vj#fYzFII$UBBEi&{-kq77xvf3_H!48M~aF!HFE#XwUo ztF>nLfNvZ=R6T{;R*gKVFXby;ezIFTQ?|3^wXgo*txa#*df;GP;x5gkji!;Ax(tsUr8o0{-hj>d{gX_3BSbBB6ahla`#33bE$PAURlzXQmba6Iu4tDo1b-&r$od(U6;7Q%>q%@ zDVdHqBW*Akf~BIU@FN4SXu~mE5Ub&WwAT?`ODTmE@xkF?IBRQ>rHs(CnHMwO)Mj1R z4}4&2xRVNM+5ODq+qp@3-QNwS1|aBiEBST?+RP#l=0wXW~SQZS9^WS zHDt56l(@msp<0Het_|mPw60!9fk~sQ1L{YH2XdAmJA3BJ>*h7oD5i+d_D<|*r8UV& z{$+4Q*sZMWQyN0kPhtKP~DYO4|daM|`Cs0xRctjFK0! zqT+6Ajwr1C*Jr5q<&QG>Q0u+A=b~%(1fa^j%RgMhDZlL7rm3^vf&nK>>;!)lMbKuS zAm`$(Um0?CoX!-CcvQ5<_hpQ!8A=EYd~dBzVg)H_<9<|oX#g|r6KK|EjU(^fBz-%o z@`l6~+F$G0l&JHo3R5A!)bvO#?Kur)^O}#iM3}|s`bJUK(~Bs#a*qk+bXZfjss~Zi z8&c>vrIdt`DmJ?wHJZ}PV%E#J8z*Tt%6MV{dtB53Q7C8)pydF<2s(gyll5x;R$xah z1e+{j5|5u#@`x#d5ZCw6gWL?iBJ6d$sqiTzM!=d?x$ zo6YKaCI_8J$c+Gk@y>I}_%WQ314+^xWMw=Eb)!MzeWV=nrU+5@0}|39Vn;xp;$|2= zFvJd5Q+uOL#=;Qontlxo6Fw+06*QzBU)9&on3@bYRYS(R`KwDRi_=UbKiR_iK`B4W zt%m9<&3ul%+ZsG$aeWyVogx{ImxqDev+f%|4PWLSr2y%Qw-^-WNg z=RstFD=J2f{|isW!&~K~5Y?_AeMuzy|U^s3Wn~$)r)mTOcoNOkiX0{rUJBHu4}5DqDPd67pbojwFdl zL~{OP{k$835EmDPgC31FTD0Oaikyk;_M3#!a*7bNYGYzoYXNM`|Cpqqwyq2Jj!*yQiniUV~bZ5dqdp8eeTLNmcm*4EH z?TJSk&VviW?WPLG^wVBZ#PWqiQWT>PVepg9^yIA(IQeB z?*wmr+`E9lr#lz;6Wd$0F!A}hiyJw)&jT=lRv+A@BAwR@<(1`qlM+Jaf0I?!lU`@M zx=1TPe%(o@*%>b&stb29=dymf91uuep<-hr*q&#hp%#CW|H*zdJIX~SsK%FZ$P~+Y zaI22mg3;u;gR7K1M_(5<-ZPyDe%jH#M#8~b=~yF5Gvh3=KvI{1B%3FOZRh<@4h|18 zv-9KlG#49G>z=%9D8^p87O|tM?$^!l~x2xnLxZc4;P@C)A|YH`vz?> z(qrYh%eG4?lUPQ^Le>(hKS`XAtw)iIyM7Q9Z4dMNF$}thmvJE(;%4Kwg)s9a%=zr@ z2RW(DAT)|eOG2^tG4xK|o`T|reJL$90XT2ilX!3lS>9KXnHlnK zUE&8Z4RmSDzd-C0B||#CKmx)Mpfuy-S`7f~LWioVyHT>=CS8+yg<9wzVyyzydw_hN z-rJWSfVO0GoPZ$fO*Nb+nF90@qsYFlBtLD%lkBq|`j&6&QZb1~50ZNQ*m*EgQr`0V zvv<#OvYS3NuG!80h%H94UDP|p7-6=Q&o(Pzc|ISis~l&aq;0vxuc1Pyjk)dnHG0P^ z%_N_v+ui-4kL%;;IArGHvx^az!m3@J4g zsA9$iM+n?kax4I?kKvVkXC_fdlC)0O#8vQNXdmZU4kr??e^59v4O9-~gvF?I(7y*} z^^s~OLL7#J?(jVW=arX+MhpiG$;@4Gj8*D0;y%Yq36T@IOMl3*&MZD29xOE79gbNJ@IuS+|f{7faL5OcZEBb4DV$KadFg5^jJ@S$`yX+4DYu=^2bRSI|bPr!!Zr}ebcj^^k zr0B+7!ZuNv!Fjcc1M2?6Ol{F`NNj7NKC}6uBKkC9ms-dcbw`N2&QCK_=t5Q}q=KVL z2Yl3)0SSKS0?mc*xASUgEz}=&Admv}kk(m1yAOD4OfS3~0vCP(yau5XG>W-aJ*KB! z*pHq4JpSH>Zt`($K5J=-|9a74%$><#z)O7=#HyC=u29hASoD#v0hUT;SVfes!Oh+@njPV0LCP!} zc}Vc7<=j58F|VYul~ygfWm)z;>iUr)5T&#QKd0L37^vrell-fE!`57`j;tE^$SL<) zGkvXzvhPwuN*iW+uW3J?*?02q)cx$?;a$KImh3H4=Z*Xq+b`MuvUl0(> z#XDGpm;DsiaV)xwFf7>}+c?`$Wx8Ld7Mn4&yvZ`e(Dj64rc?czz;EXV zcSHTEuB%Jb&6QXc<|4`PwF>|d)}w&z%@iD_56X49^n@A3!4=C3<95+kWARj?C zc15^u1T{VQPQUV6?{PyFz=J}O0WViqL*;#$*^=#1WHe!CQA27o198O>{$XGM*i-3YvrdGhIXXhH~9_V9MC|0z1n+)^&C{X-CyH`jA^$N|19pvv^) z@MDKAhyxZphyMyth^B`C0&sLn1tQc2u+VXXYfqcxIB%ht7?t|Dw6*NqLjg}bNZus6 zk&RYb_NaFJQhNGs_dEI~x6yyP8se@T#6D!d)Nv7v6M!`dbzh1QV?%FKdQ==LN;$MV z&IqYph`0!J49`P5)=-59^6U4C^+Q}sD*4N{lmnOH%48d9A~qkg9p{`M|DP7%6&PHa z3wfTh9n22y!a2Wlf=jW0tYq+MOeoq{k05e57r@_O{*2$qn`tmOY4BHP%oz<~C`@*t|OH5`1oGGvBcF#ga zGYPOhbv*d!=1O->A6D5x*B(p}0&!Kfo6+CAe7!wBObDGkAWzS45}D!8gDsfR(}gS3 z1$#7lo4v-F8eD=BGSGWrn`Mk~+gBjRUBPiJEevbRHm_3^Zy)#VHh;8n^ZE~{s%^%p5$*3EZ+D(co*);QnHC|eL$q9mPp$30$awBj zE_hETjJ4f&S@}4xjpnBBkEVNnYC}j`pHt)AcHlh@GCqHID2#UaA^F?S*GGNTbML1W zmGJZKA2pB?W92^CH~b9<1?2vR6F$Yr+=TayQd&|$2Z{}fkk8u%%faKtJ-azdsc!)z za~M)=ytt{-x*QF8EcX&r9PUJi$(_My~;SbmpDr8}}&VBQukXdn&?H$ZDju)!*h` zPJDjhyj#$h7!jBpmB7=Czw|;Pdy<%WprN+T0v)C~KB*NgLyMA_X;r_SM@HJ&8Q6-X z&eVvxm?DT%Q(j2qh+N_LR1uX;CRq#?(?6peVqlU>a-kjaE$Ga^xQg8@8yIvYLb%k` z%uo%26#8%UsKGx`AO&5Ng6bK>;pfFe&zV#V^0Cba@Q*_!YT!HjGGu(%;XkCfcii_r zbo6=`Hj*_PSqe1R8WNYvx;F$xo?8#7T^2_D1Z_ z70947lUJ6A7UwCfLZPgZ->rGj{(tVl zHPY3{L?iI-^I^-;T5C*^;np9MZYxkuHl;SN%u^%=RvsImQGO_zk7aIwmN1wA9YH zFzJ?u^`}&??^<3_I_Rr))!=Bl_<81VhcC3atTCgbiZo7**6W*>r`XG2X68H#@y3!V z30&i_@_iavIoZ8~qpcltSDS&Iv8$`=I?D~at7V~dfyS?KO57bUvVvHP%6_g;RN!k!(psjzb!P$C2Fh*p{_+_Xex4Xs^z8C;iW5Vma`o${27X%*<3V9E|vcbps)w4y(54F>rbfH z18xiVMf4cbVuVV)A!+2n3mq`caT98TSNuw}YG=Q4K;*%J|JKLI3Kg|W2@JzY=*jx|y@sgPs6gi5!g5F?R1^~-orPjvs6$`9{z%0cYwG?J~H z#zw!jwG~h=Nj1bfsY! zO#CsfyF*?~n4LZ@t3E`kIrJqua=4=}nB%fu7{C_$(!Rl6C^>@Dkq!7tXlQ=q@(-p5 zU#oTFePHAPHytW5f%~MZ08D!S_k&7q>Hm>|P&Y`Pn$?u@M)@PP7-}`kr zDhU(qQikj`xzjZ2h(kXyVDu7mW?nj*QOD6-*P~-=njzENHoJ{L#TJ$$CmGVJ)3m2J zxTGmuvH^jU+Sn`ZXF*9u9AV!per6L6(ozChqNsLSd@wpYyUCpV0 z$B^^K*H3pOCi*Vr6Pcu++XO58nKqR1J7dc~oc=e}-*LNUcM=};vos9m=jG#VmH9}} zaJrY$ovZNo1GT5Uc3FF4L2wM2`_hGzw9h72gQ4wVV5`|LhQ-uyJ_KAXM&b0BJ1;++ zLM%(xhN0us^T>#?JUW2EK^q1?hrvbv`g*yqpFI=Gk|ALx05#d(-5JXyE zURIXW?>IAf>*aoMWKc~mr3d%MOd3B0DhzbgA2HVEt=*vtIr3Qg}^0v{;6 z%EHtqnytGoHzX#dCJ#|e4iHdS4roOOD#GO-J?2_oZtx@l+$#m`1y$|tTh3>Q#M#$7 zs~%KkH%KMk~=~StE0UBdMB&Hna@uL zXkV%G45rW5vs}ua+D`ERnr*V`J8J|LuR`!z_o}Dcsl*UxXv!8!7#;yX(&qSL7B-lRkTW{zjb^p^{?i@-WCW zp(eqYES{$#B&};G;boyBrY*mqY)Bo%gDstDkDZ^x{#Y-0Xg3*&)qUyaOeB`|V(PUY zN9Mb{pRO}33)lTliB85gI!0%)@IZclf$o?hu0)X66ew>y zi!2f?4#{7+mWgoJUU7Y}=jjL-`6Z{{b<$jbtY0bGJ7DUi-*SO2Xj)rLWa{UAfH+&+gc5Y=7LznOxq}JFnMlQx18co}5 z>G|KhBg0B{Ptyz9q(a_pgEm@)L@Aq}I-+02JP9>=gl0-{+x3l4OH0dAvoBdZtzb#* z_pky*Kz<;Rx$L_gp>I_O5xa6c-YM&%PS>S7hHY%oajhqSNf^a(5T-iXdPPYC^2Z%4 z%p$02{e*jZv>J9Cz@}Q)K)T_dSrN{s>Ge0y_H^8LXuFO{?o3fkI8RGQ2VDpaOgO0` z%|3kn%e0Ouh_$&kUsYX~<3gs!Wvi|Xeu22N`-u1G4^}!^&>F2jh{y`FYx_4S+_Jmj z>VuQx<_#PVL(%u}qwYydTzN*pzH=T?o-67@{WU_k?ikeZ8O$d1X`UiJ1C#Aoo=@wv zt&YwZu#p7LsC!0VP#OROdSLcGn(SiQ<^_KOu8 z(tTb`ha(L_dhDW4^~{J#vA%Rx2L(A=et$SA8!p3p_u&qmPu2wIACk8w=5>n@3-D_o zjB+^=?Zf4y1FCt4I~C=Azoo3@AhMs>daz-|a1dhm%Z}`xT6oU7?|Cu+HT2k?WCYRjAZ1c#V-QDC@OCiqGaDkx@ z_9P95>np)~EwO>;mkTEA5E<{2y2J5jKpep*z*nI)nI#;oX9hsQqzF8|vw?phg|q(eeJas0oMq31z6y ziEo}4vV2xL>&Y0}zTk}uuR^n4bXA2$YVXm$A^NMqd}6FfYHE|21d-QAEnQ4bPx2s^ zUy%-cX9buizdIpPTS`IGE>+Noup~J3wyGkOc>a}3w7TL=7Da6)Mj9YPu!s0W85uy@;%^MDEGKpkqqoL$!@ox6!x z`+bvW_E+N&XWH|tVX&LP2m>8XGIuQM9SdjBBEvKSPh2d@iPnIkFdM%-ROs;P);IZB zHtJNSsUxzaU;i8F$HSc1vh13R_A6iSbuH1MJ8}CW3Wc>VE^_dYlnyG^LY{-O_+Zlq zdS|t=Dxug?sX|_?ji*0f60%n37R=kV|As&~gK3an&{(o%4x|^olA!z#9f{Zb$&i*` z4-O;3u7E2gkWYv_&5G^6k68!b%3l`WLjP2<|4I@>Lgo%=xtfAs~a}#Ywzp5ifEYsVB8mS z#nKRi%l`mb4@YI=gOANF7G(1qpKMhpoGpAiXQjgh3p_x+cT|NKmpt%~heH}n|7LR{ z`y7UZhofuxwyGJ!0eyPtmou>;zaT^0kbaN6S@NLBGk5unr+*xxJduK>x>+wREU+Jz z1OjhP)HHi*6vB4-xeh)KE~|ND5sSSoolYC7**d87bGoNdth;!r-SgsB3lNrU-ssPP zqiz9GHQlta?JS8v8Y!q3RbUeH?t(C6^vH{-%0=vVZOU4e5YtLg^N-l&WgJ{wv_}Zv zAhexRHBm^-4oe$KZggfSD;v7K6?MJgKJs^v(yDHy922*U33FMYiyp80VRBIo+;P-P z5ca9$dwCL>2)$RCNV)aD&&w+*)s4EdbnL2|1;YLU+wzNwXZs#BpSH`pf*YbMF`N@- zu@;9rQ$ww2FmgLQo(IDJ9b<6n62Vu0S0YfXL2m`-tcE4RBAO4&3UJ}Wv|h2NoNfh!^0J)}Zh zDc4sFma(;JGI$#7U-q|8?#c36+bb_Tn0xLrC2_KLd(i!dx)Nd8yyY9akM^Hv(Hlwd zrR%ES-2lXjkP|WRNEhL8y%MT1wdAx^CJ4AY8XB@)T(~kjvG`qsvPfz@edCAv=UuE| zgziI3j5U7c!ul$06R8xif-!T405kZQz{UYdxII=Kg|0d3R4!jU`zC``jOCL|*=%+3 zG4MSRl8o3!_fRCV4wBP_f!rbS-ye0BL4(weRvTH(QYWdunY%Vc-`=p6pjROk>_eg+){m%lH#Pb4`8hRN^6fTSY2tpZQ`hx=wC-hapw!b=GjOUs zelN;{hmG6tk4UBLgPca{%b6?xK|()Wnz5gl)cu|4q|ZLlXGjP>>L5NDtQQF!kt2mk z+#gOM&*5Ywo)2WXLwNdVmD?Lq8`YL0shYacXq^;A4HEQ~t!jq9!_;l?#m4ehlnUne z!9gp7zv1ZNvF8ffJ)J)9?&|1m&ARFYH)FYUBqU}_Q}^mrx*BArmYz+bijLW|!VHUs zMGbSzlOIPF!N|$*@P)}yVyb7SdCyT|6zF)896U$<06eD$qXh03T{4{9|%m_Y@-~75SMy}$v8DT>g9cxSHmm0~=pIMHh z+x5h%UwX+uwUS2oNAYiF9Rp20P0y`GgHpYm{_^614|49QMaLpGCroeOPS0|0BKMXY zG)q%Q^Q4ln@ko>R_kXz03zTYS4afGJ&ba$2p^KY1%t#s7SVGF6$?*;R-B)@@zJ# zS>!9RoL_2476%`(hdsZK^C@qg`!_ddE@)xw3kH6EEH^T$Z{e)rChT9L#)fc? zI|FkAO=COUk0OI|u8;`5%h#Zs-<-*VCG@Aa28M=eo+UBh+&R;$4gq1J!Yh`|(xQpC zb;~LLNR#hZr^0XTiDj_Y4XFxXb4qvpOMegZua`OxJ6MC_8{e|9PD==>nZ#9hgbZ4o z6zI$phhpR`I7H^{1EJ?x8PVQ(Sr$q=>k}P&x~DO%U|K6S>_V8o-(?xTOWK6U{4vGHP6WQr!o=O2)U= z2ou#Gegl0Q4yg@=c#xy|G72@ZMY_;Gg0Lrn ze^Ij*)=4srA4b^G*086b4>F7mJ4-bku&WK@&O1uUNKeUMw~rz!Uv!y5IUdF{xSj>> z$b>E&_EB_>8~a!P9Gp8JoO`HY##<4MEt{6c^0UQNGdS~?&;2Ba{rtGeJ$HYvu(U4j zi{1Cn9MYuaMud3y@IO%`a>WMybF(7Es1$kBD8)MDT_<=;^a3Q*4c_A0sOH@Obo`Nz zRgVB28B`nx3M8S8>R?g|h=QA6!bgNUp|URkVg7Egz`z8~i`a*lB+*ar=mus}xMM$v z#}VORD<<1bXAyJg)8Hp-mO6e?)OnI-h3qAW93E+QoU$f8Ssdza_Vl~W^VM9DTq`V~ zQctS!+IR8t@h#>RjkbDi{C<2)EB!(bxCLq~$C+Akk|skAa2|iNvvtNad$V_ZjJcpT zgT!x0u*+^L3Y8-7>@96C#_ka*C-_Ejg~(bF`IeNOlO^s%+IoAUQYRpvs^aOyc*(d+ zb$YB!$t|$b%gP5U-JgMPAG(VAk29epO+9b&*-rN$p2Kqe)#Z*7#IsnT?$37R*PT{ZE|3jGheIEZRDee>8LRU39)G#k6(Y{#c589yPXpOjpt2 zwt(YKrhVM;*-Eh5Ol4GH6Ai?wVUI$44*20kW1KMBry-EpejD0XAw-q6}QW-F(j# zqXwZbH$!XWLnoxpLos&oOJWnom@!ivZ}F`$%rD3f;|}AiLXoZSMO2$24(4=e>|r=pC_b09y9%s-YHC`0tjT@W$cX&-m^=Td>{n4P z`$ZD<#zfmFGJ^=7^zI32B;t(qygXk*CIrTNZu0dED3wRWVWDors;SSUw$Dwd&w&c7 zv)jj4VA$hz*D)Ag{8{4;e8hQRNw)VKA}|2W-UVp!;9?&SSrErNzU939Wmd~xr8;O% zGvrxn^=18DNIMW#Wy+dvcQ&+gT3FPUx(o8d1oM7|Eox^UnolM&F&h#p9W?rij-d5KV6)`ASgN1DfB$Ib z>@H8^(f^AfE%~6(PFFgn(S`3ZeY5r9kFElcmUZI8U#oEly zec_p((=qe^?4~0zHLi;cQF5HIR`DjGDI~%IqlZx}Dwr!j>#Vz6TXk=Efuo~S88{y3 zG;sM1dmlJS>sf>;W&UTksN+M{rkQ|`^bk4@*3R<^pN;RX&;YgYYW^VzlLQ9Z*8Q$s zA$|F)Pcc*|aXJZPw9Pw`=tm&^?M`t8SZAY#SSwQFMfY$MM};Qho-+gEh0)p40=JQ1 zr8Z~fD>pBbYfy_^LGatpdu&dY4a9=?Mc)qxMw<_HmdS(*ea2aIT_#TAS!euPe&S;M zxEud72PXol%VMy&gbc0UzQWzGLC(>xgVL129V~b2%nRNYk^;?I@c-C{F!XrQRvJuU ziRM9l<7^e*C+4dTjz9WJq6*fPM(nyzKS4Je)Hs|UR#hGDKdfwaC@#TxC|r83jW=5e zs}9+;Xi`hUoj3!+@v)?{=w9}}NH%_kx1VL& z1nhfdHEs1THkAg-mLj$-EYYL`kw z9z%^ffmeyZ1N()^76Lqn1~%a`1g+M;!3wz&J!_OrZ2yI?`}zByXb^8K4<3MTCGiOqFX zHh$OA8mMnXhB>CH=8v2HopXe8Lz60VNhEKr0e?z^dZ2o8g|{eaGRx)T?MXKt1Gzrp!9gpX+;*7g$*D1kdEm|Hl3111PgY1l zD6AJQC3F|CzyNM~d#@9lSFJca#0)BFb)l@tw(eg2ZKMMf2)y-gvONQqTeg{kZ{>3R z8Y!L$ZDM`GsIdRhgy^DeKAnJcEfd+|P|vs=P>wS_pyzCtkG4Ii_f&)z+*KV$E7Vw0 ztjce!cH9dC_SQqVnae#nXC`VgSAT?yu2fjv1{OlpTvxbI=(I}4Hh%Bniym_{`P@B( zzU0G)e1u2f6mn+aiu8jNUZ5l(_#%anJxA}xQ#p<99cK~@3}wBUDcZ7Mzle3@Oz0*X zTq?w~6lW9y<=2l|+~t*u4dA!xH!V4hr(4D99YGD?wS3lN!*)dhg($YC8f&ivMjqul zcL{J3RFQ-y*ktY{Mu#S3X|lJ-4q}B}1hk=Kr(^A}v5Xh3VMm^$3p!!!31I=;J}nJd}8OkfOlO< zS_4q>Awc4JB1!g*F1pa>tKSKgiac+uzyUw7!K!QNSevLB^ZBh+Ya&Tv!=KfRN*bEq ze`Fc_z(O)3evWAKvx_p4O~6JcEv())B__ba)s5YlW4xZIzFly~P^K;?epFsQN+T5C z2jh)X8DuT|(Vh?%n?JsXgB5bLnji8{{3%(KTj>AiAc1bBRMcoPX&`}6irDd4ecUR_hh zUy~mnSRY)`8@(~!#7O-$NqeY_^+L117~w{OT`&v=Fpfo|!E;3N=u zH`|+dyt4m6E@I-;rvLAL+x5KpU~2c6lyD&j)02O!4l~tjw*6nsxB|>$xo3K<2`JB{ zsSdg$v6O2pY&F?fv^McM>bN$qD>B1Fch1=~DARa!H{s`;x$-mpTbgP5?=odvWMfEK zpDfSBmwuep%O4!KXic_DiH?3$fvvdtAj^8P+*6`?-L@(MBF~qpHU-^eY$jgb9!p95 zw!csFb|taJ6W=BT&>b3-&rjrbPYs+mId6yRT?r;^iBOoZN4gAj4gXOP2VNz?#4*FS zzlT#hWP2NOCX@=zSRjA?x7$g=A4UwFxNPT|Ehhs{(OY$#>4EhI%nQ6-)72W?U;CUK zIlWwT4V_Hh@&uogNS**)HAn3_7Mm|Y2zIJ~T?{vl2>n|g@Wj39JDkjUl%Yw$G5f|X zm^5_d4-0BR?znr)E{Vn>GHdDD2IF>*A4L76)a?{u;Rk>y8m>BZfDl@YvIAH8H;h&G z7MtmjMEO|BpwY1&L)Dg_Ap->k_v73&xNQLl-}E467)UW>JbJEYt9rb)dMPUO9t!+s z)Vr~vdqj26pBDEc^ypb=Ls5#)gm2{sTQ?&T&D1?ThvzqJnv|(o8^sN}nV9t(45ML1 z?`6uvM41Lu=Gtth(HZ-MqHma3iB5$Tgy|_y$eHwf|32oTRU@>{d6Z>KXojmW7n8L= zp!{N9r71nZsiY=>ICWFifa@&a{L%0k-}|?T!I4};CHIC#iHuU6Nn7WfY?1M2J>2jV z`He{9yBt?*rp}VAeq(MMH zT1rZ!rJErXX#}KGB&5?psiC`(?(VJuhME8RzTfw)^{+Lc#EDg2D*xeIKEMILLo195)i37i!AL~zJ zO#y-!jJ4c9>_|>;zbZyf@(f2LDhOm3HP+hyM5F`vDxbpzs~C_>89jrF@OWJV{fa-Y z;A(CNPo_Te++K5GtRRgz&~Pk_iBcRH-m&s_6{SwvnzC^stbXAoolQiPkUK6^FNNZx zIfZe{X?PN{tPzlpFgWSujlGqtL-Oz&?d$CF~cGczcD_zCUr z@2jwGJPRHEz3(cdo-U`U{OvkL5I3}I0ro&>6M~k=JUQW(F%1=w3*uui|Eenx60NRi zL*>3RvbBnQD44YC*f>yOUSBnYH=D5zeV`{lcRxS1uxtrL8_E&J)T1b=EG+`3%l4&V zadAEqwZI5WCzn2ZR?A)OK4Ydk9L=p(-=MskB0GiQgF)S|3q4(b*%-7ehbHvm$7+i8 ze!lJev9qPHq)*UI9IM|V+YIu8am0q`@PmZEK-=77w6*kKxs3(ID9iyIk&4r67W4g# zO-%IzI0p*;h1dd$wi@nyCus3D@}P`8$?lT z`T6Rp%SrhD8V}l`k0((Byto#A5KOR6ytb4ZNFgIwj~#3b3Q~o)qk{Tcc0M1T`TLL1 z`_vOh2YDS)M?R-nvF_YBNYCkbK$y!~igsYStP54jA&>+Fx89?HshP#2+qRNwlnu@L zmnD&-XA^9&wQy&9N~!rT$J^3RK1;$bpPeXp6JL?BP@PT5 zrm!N;0&C(R$Ge1DHvHdnx|@>~PGTds1nrecEvjUuj}&!kE}unlGpOQ2liPnye8?c~ z9k010ugquc`+69ie>XtFj2=(%^6HM1nJ<5{8~VojZX|ejRe~3~Woal;bhLis{|xNO z+wxrbh2zd!z%4v8FvEga(LuIYPIsQ3GGPP0AzX74c%6x+tO92VAs!JRU>461-{GkH z6uPEB+y~eZ27=)R;!O1E!g1DquV$6R$*|~d0J;oNfic`|KCzg>c&Yh)eKt?!w@V552E^%U-G`fOn@!o+Z#@tbE z<;FW|)|8Fao4YhEb4^--I71XqzN$RB?5f z>#U+Y#TO;apL0NQ+b2!SmiZAzX0AMimtXBo77pg9b4tZPhP82@kpo_#$@B zdr%sIH9jBH5H`MuKuko2>s03T@myz#U~%MCuVHg_0?~rZVz}}J$zIIIi+rF$euK82S+}5O11;m%r;B{@*2NQa(HmY8p1+_u-78X-b=+i|xdOf@fD16^%Xo#C1%Y(UKn z>+^E)zs#1a610mD55(tp@=ed+v=em^UvMYL9`#CT^t69#aPRm-uSzjs z7CG5o*T1v&=y)pZ;q9H>LQFzucwf>{j6^%;a#$hDvGafb=x}?HG}z`Pcf-3e!BYrY zEfxBX6Aej@(fvK;!zM(mF{^vIQUuxQUAfu4;@{UYhj|kqd|xLj`gfx7LKEHrX{xvM z03s2mFjOwR+`Jn5S7`yQ^xQzc-)M3!tDGWo`Ay-!AmC;ZktOelT`smI;+YXrwAa?} z)^ZV{PIqIiAnBUW`=C>vHQ2+r=pr^atgFk^StWyA=wTWCHMvoY_{BKJH?!aO367`W zvxRrZ%2`N^rUg~}6R zNcOhur!bi72krbe0FL3gG5vuEA@>%$DQNn(EPkIIy+yq1cK(IyA|H08fuqeje}t^SpZH~&?gTF0*euuE-iful|{&a-%H5PkL^Ww zmz1)zQN(X(>yaDv2&kWitsML)A7ZXJ=yKskGO@r9UY*X6uT|}7vd$0!D%xhgp*`jK zV+i&Y#TO2`x_uDFM(kq4@6X})6OGG0AxOR+&@O7QBUiWueXx4>Foxf0-8zmI9+58i zethX^Hzh8Ap#^oev^3zCj}ayrmQ#LB6LTetv)XveDh=(fzrFB7lGpvFM|Q3z_WSbs`bDMLnuoDq601gDQ$u|4 z=;)`js{%_rVBebZJt^XbX^@1@AZ!Ew8Sm^kFZF&;oi{2dz(#hzNS%oy`uo}#e;qn( zv^O&Fk(g(FIyr@Xo95U-VYA!nv%e;JsJ3~Om{ym|OALoz;hK!a929!@t7Zy=$zFVd zoDH-6j+fUZC#m9yg{IpTh@rf^-ZydY7S+i>zSs|6y$WxS9#J-05XYE*()xpsCK`Yv zy8J>rg0>uoHwb;Tzu2_Mfc0aG-Fo)dS!`r?@K?foD?EP0YE=}Gf5?WkRp!S9%y@h@ z-ddbCW1jfB+OtvkxeF^k>iUZKbe4zvuCq9b&j+{Kw$th|QR5!6s=#?mdxYemC zeXBYiZ)(^}MT3uC;nqH8XAh0uQZe)+TNrN_(IUqq^$Z40lZyk&#up0WZU5)J0#%mG z8UI<)=wGNgMkMO{>TgXGfNd2GN6DHSU4>hmf@m-x$?RMQkIo=gc*r9bxUn08IO;3} z@glgWFMcP0e?r8uTSQCvv$}+aL4EZ3xtp8}DBOm@U+69o&#|}tNgs|Z)Gl$HP%29O zcViSX=Cv<xql3iRiY0mwOYa9dy_vae}3mCVGjGu+f=VOKOP59 z6SE<6dVX|iD-gjOLtv0}c%qD9J;R!RFh^szP{b(}*NO~s90p3jhd$w{m`#z_x}F#x zSG`Z4{5vyMv)(E>_sa$B@8#Hj!1n_R&3XA5#IyRP{`0rmy*Pz&^3NFqul$<)_;u{G zm_xt236zlc2^7&=L4U3G2~cS1n8~s(X|_Q*bZi;TM*Bk#|TrjflNGmEz84w$R00vJ?i z4ls_heF%!833WC2Yzf`KmGm+C>*jkSAmsP%NEG%Wp9*(kO~H@$ z3=K%xM~5Kl`}ATgGRKh_Z zK-+4j5UCpdos@-Qq}?dY&utK>E*7Ri+%yMQH$81NVHC{&Bm+g$5>aFIn$3@i4a2hN zOsaFYy3VMx9sx64ZcxKbPQbR9)2`+;&Z~i~IF*89mGQ|!Jo$hb#LGrCx3^>=)}#VQ zcT$HFM`ilyDsd1pCNfzk4TBv!trmd>x6p?Gz-k(p6Cr=O(Z1{a)~~ybpY*VwluL@H z@9aC6y}%#4^a$Kh=DQ~>Kt5<(`;>6#F*|!NXAL1lJ8Lx?7$}SAZK@V@#o`Jt#q|kGX3rtP^^ySxJUtVoSgWG7kV%b1DbRu4 zsBY!2P-v)jAM+C^Evm-i)BrEEx)m2zg9ZEk2}QFJ*kVrgjrdkX%B(9~VI=(BNcbmF z!#~2K;Wm^Oou%kBa&Lpbf?skb_0%3Zo+cSrU-;H81U@!Z)+e_-6GN|}G}8O3fCt-V zs5pSPm^GX6)p94*a7#snf^U{|OLMjORUoyXCH`tGAT>02^b6-soFVkbBLkiibw(7#wv7+B*uHCkx`w3?G>;WQvd*F@)g1Uf6wr|qw^~X^0l&7iP z>t_`#cjgyTiz$P!Z?M=Lt zWoVWUr{dLS|0T0uO)#hG=8~vcamAl>Jnuj<)eHU~l{q>`w!5mmb}~NS<})M^?T4+X zQdOOZG%ATk$;boN7j^M==-@q_CAfeDmA1`szA@mY*a3$iawHXL68v0m@M>%AbyKt3F{%S|2OmDJKqYyeb1iC77nXL~Hox-7568^?#HLC#u>>V) z9{5d~hOSe3+r7Aq1YeFDeYgeP%gHBZUfe(UY6csn?BZgLlt;1B!n@@Uk<5ShJKoPo+QJs@M`_qIS%`f> zKL7mKTBA8Iku8u=AuY-swBuddtFUcu`&;%SaBZ~bE#=^swMQ%6a7+Lu#6fs*AOdK3 zQy?6Nw2-U90MuJNq}tv{!;0IWUc&LROwf%Wtn(h`o2>sGXHsaC4)Z7bz}yoI94IE5 z`mY7?lrtt(vW>Dbxa#B)=pfpg;_?!k(?RuyttLjOmfNaevOthZK^1*QR$s3iDaKAl zH~i%gZ*^QQB434dJg&gbC(P5ZC^}On%&yRN(~WjPPOja{gnNNud_kj+?Twjscp3Ki z6IXSnZhC|YIyivz-(M*#WRL7T?3@e^+WZBvp+n7KAe$M^bB8y;FFFvEYL}=)M#Q5> zd#GMsLC6X=Vnys3s7>h2TIh>YpOJ7q`7F$KhWYAWABkuqhDUY7Tkj$EsRuxtrp-9W+n^m zZnW!>Se4AA_{rZR86!QYCxxgikO_>4bOR2E1|G6e3i(f$0T7dG9LXXMpc@Dc7Pxu; z0ZJq6bcV7Xu*h&>>F{kHj&st()6 z)uX*ArMW*3nAAI>wLasPtgq9CqEV;v9fXr-;TS_%{2@0%e-ePy?zls6TOzjTINe^? zl|A=cFG;p|ki14uO%g|(kmzLk>$-qjr+3yLq?bl&phWij4re~(Zx9 zYJ`|=p^A!t5*1Z75B-g7Uwq001BCZoYHuZTy-u|1LX1A5Gke)i!bEB2eyk{+AKr|w zf&*q=<+Ftc;kSLf{2#3E0B#`e{*fwW?MHrPI!APn+~fc#&OY$-+Ad&GgR1==H9-Od zCsR)3uj_$$5<}8)z&Ad~!HoR!Jp{#5w~fl$cWqBfk!nG=my<(~-Id>0YpD@AhV6jY zP5I!6mn?p$8S2clzyY|tN> zr}wTHeuACjpXKsQAbsUm!I`}f%QOTf!5u^u4;dB)C>+*4nO+v zqnMcn@$sZJTwM47YdZBKVO-EhikhK{5=}W6854&a5f?UdpopfRT2NR)IJ_f&@jfgc zJ(eG(LJAO8)?rz_5bHFAFknTKY-}`00nOX|Kh68cR|(R{K^c6;2)V*OasiOh8G@db zl))hgZxt$a3vTQVEFh;YoV2K3BG90EnpEU*CGM<9x?zlud6pKxfz5?Ck6hGN62Jx50_R#fK7qvBn$vigA&k z9rs)d6x8%^z9~~?!E!EpQ1z;3clL~TZJ)Z)e_bqJWl=!&zz(AwP1@9yJ3|1w5Ug0w z7p_Y|Z)i61sLAVzAU9cKcfFmC3d_djWzSyp)!L-c$9KrfJ#I5EuHJ>ry`$Z==^kv_ z6UXh@HLKrC(nFcTsX>FQE)K;3hX9eK1SKAb&_#2bLrdN)zE2&qS;08{OC3q64_X}q z54oW_F+S}b$fiHqM$g(PBZ0wawvlTV`Yrq}3K%ov+wt`|zOULux*aC2(U%~DjuO|l zIt&i)y&fO*qXac=cDmhj7q+Hhkh;^C$9dQ`GR}iD=p<%7R20%@;5p~OquTkFzZc%N zlL23J_|_P8&uc1eFKj=%W*OtMGa2_e<>f7WHXHTdhX9;ZOX?Zl+?PAuk6^c&d0!H* zA+p9w+CPT>X-amJ%vDV*N^J$pJ1!vYCSe3Qq(8!gAr==s;U4q8AC#EDR0juUz z0PXUIm4uua86|+F-7!=U+1rShY>M8av;x6cib&4Z>|3q67)$!B!54TidBR+ zYy)A_4=APndIK}`APy994+I*FDlc5nd>jV;hFlSgL4sCA$pM=*_43Lc2v@!#Ke;2@ zs5+AiKvQdA3Y)E#84bUxoP?FOh4;G4{QgQfsGz!-VcWTppHC9stMwE+7aaVIynk1s z#wY8e1|c#ekCU?85GpT`EJv>BVcJ{!97|Op*@l*W^=e}LX*arGlB#`KDamKYV2(&K zB5Oeh1yV)*z5<= z(t2tz@5O@FpXI_gm%8$`p(hJr_D1vr%#M#Bice#IT@7W72V3kmx7o*X?=K zIg zt@Na9Z#oeLUt{F5M|h{Q<~w`p{15NgCUvo!|Avd=#;Cy8tK2y~(mPhi%_7RUGP^JBY#`!RJQeeYQ(F(K;*P z#HRqL-j_qMzIf;*70-VL3H}4JK-e!D9EZ#N>*{r>oyOu^0b_|1+FMi*+4oF@V@-6xDXFOWHl?pDdWsPy5{$R#ew2|i%sB56>cG#tDdG;(Q7Zk7j z16oN`wg0`4NzUgDkEzoU?UMV~p6-Ts)Kug%fb~ri^Q6n}B_bKT6to+8%)P`sKQ(wP z?Vm0j$a$&cik%+k5#>!po8QR&$s$Zy&-F28F6WbS_TnoKt}{d0+?Dv!0bPCF{JZ8$ zPoaPXqXfmp;Mv*~n7}8kHAS@+F_S${LGi?5=#}NX1%e>8742bqK zmBg2|2V#9@3gaC#gyh(!snwG&Oelq_!t)1yBHf16!S5lU(DhCXH-riuSV}#p zAQ(hvf$U+ZhipAv1@&!=(lDatq>xVlDj#?IidHB9fC2d;Sg#h}BUZ4h4)Bolz* zbF5Z1$swL%ADO#h-wFdnE$(*UJLM`lq?I@_I_&h9R8Y}YpLQdoHlX*oQ8D{xBnJmJ z`ffjZHrWbVnCudbYu1EKJx1Njkb2X zDG+KfBAE^R0Io>zD$+>nIL5qJz3%>5Rb@4QNrj00`Lso}?-&I(KTdLhfwTP6NM{}z zhTdP?Kon-0Vvlu=n8|~E$kx7XX?ga_9K$!h+ycumZ@_nlZ{VVYnagF($@89gAXwgT z>>&+QEBP;f0@x*Z?jMeeoV^ih9&r9QDJvuJ!%%$3i|feElm&o^GYsQxG;Isdc&n3^{6jo7(8!jnBs!(4L~lC5qZ+b1o#AvUmIe z(*8!Gh%GOwdc}77mN#@2L!cHQS@MSGM3SE}`I#&GJVR8M;s5{-9RJk7{_VSeKDkjS z448)J0;fBsSde8BI5E)#iuf&ulRPOB3RJwYz(rVv=h(5oKvI91MP0l)Rl7npqswRw zge&9_L$@6bz2=<0GGhUA6x>*{G1crN%$Jbk?9o{uMbhQvsGtpCKe|Rr8iN3Mo3YKX zoQpvjDg!23jluvH*=RcMUL`U`ENuYtVV<zkKSy`WU*N)uaDglFL>;I`<|y;g4Q0NzmHnw^!0E1Nw0M6Gk7PJCr^Ns# z^%nExyiBy&9(L*SbbQ?)#DvQ@uEG}b5)B1+Ef8QW1!Wi;|G6#7WG6`eUc#CDbgMvs zL!!wa7c109iqpo%296PQx8WK`i-<6$;L8_HE)X#3?C8N365(C-U%BT^D$*$W!z3q> zu8_h4WQjy=$Q4vzzInK0SqDS~_8Eec@tfMak*w@4>`Ww&=}YK1L#fk|LXpdK0W!q3 z<*PT3#>msHm5K{nl8pr4Cmu&?Kj*aFkFgUHQr}265Fx27XPBNt-zd)V25WJjjzUgK z-(nfopYuPzhlL;B^2sffe6BBU`K@Qyq2u-93W^%ZPyRP?4^sb4+Emz;gV|kArx5Hy zo*{6?fjK4;(X`^5D)=b%te0BdK==c>uB zuGMew91YqIxOxTd6R^)8N=}q!3YA5RShHwHk3ao?pjw+8Wh_DEN4*{I8u(_|Cup6}!kBr)PB!gaB zQ->J=no68Fc&|w z)9pzMWX@?n4ai81sy$5j5q1g?00gT@k%PVn<;pk63=Cu=EkqF=GD&jFg^z&QW5FBD z^B#bvoAb4s>xEV&KSTL@PBxcdfqhC4PMIsFUyk@K*0F#hDn1Xfq6s$Xb9J^C%hMG@ z>7wy3owH)fN*N}e6gD(H${meAnpKHXw>_ZZ9?Y+Cl^IOsvjWJ}hs%GWjq2V%IXZs- zN*+_07_?p4be!MP5WjrPKK1me^&5_$hke*;1cvaGu&&-zb>O{-g0}VfX8+*|B$y+K zjr7z9?dLNCMHgk!NNbEL&CXg!YlZy&XDK#wDF+0m(Na_)dttnsnb1SNU7MYOSh;WtQJ->jeiR{avE<7wQ z*QZn(M3&-ISfnOPa_7{zaUnKrs-9Fn%`ytAawKhDHY$oQ?&_3%(RF7;S7%v?c*Nq= zj5MC9ov=|I$R&_-3xnBG^z4(;MZ5{ z^ku`xy{=T|=3h!V)QP?TRZY-av8%^LPG@xnBK)rBy4N5H1qV&y zP#f3vQ_?t)bkwGGo2M&nCY4~3`}U9>nu2UWD>UV<_EovhV`cIhzbAc(DgvaBXgLSD z60p;28{fXpwlBI>rvV+$hS(5%>YSRBi}ed1K5_o;96(qc4`O>B`7V;NVjP#pcK+R5 zRN@VeLEtGdrhjw1T(@@4ZAx2`W)tlSan%v*1>CApU?7M7<2QfO%G6a*4+UC}P!Y}B zQ2HOYgR0&0U$KdyKzf_k#)W~!Gb-!39#7iGFKg6+9Kh*~zNqk@zFN$Ly~0|0eBn;{ z*rA56L9ORF6aD1NS`qKM#U}c(N=v`{4kkRsUa0-reF0xP$b!Am`xWbpNH!3ML|Rxw zpPq`E1jE)iH~;Mw+&?3l#YsknLsUk>Pw4|cmbd-;AmOm=B#nk(5r|iU4QZtB&aas z;b7>752zIB_(;(q%v?mSmY}lad|kQXJ+MQBXKj9Y|Je-C8o-(+ZHRHXAv6rWf`%O+ zFM@;;RHn&Ke~6<}*KJ?LpdRzSMF+c!!+H5#MrbMc%+zh`pBMxqb-`3>Y)-pbQl9@n zS|GD&epB`GrW+u4<9{KdYZLIaXZ!nofw$3_gibV0i@j^PH@w4y6;ER70t~-vqXDH^7jH^39p~nIdlq40JB)* zcU*zh8)Ng)ex2cGDQbGY*sr<6ZK!m0_1CWa#69=1##J6|$%3dR6~=|;B^Xr_6>RjL z0?yVzsRO%Oaa9*jPx9mkuq((3nWkhmV+4wKLVq@y28{oUSUdH9zEO|Il*(>^{ZwJV z%JZ8`7QGMue(LNPdkNfh73k`UUQOzUJ6Lf3-?vEPfVNn1 zR4?#o({GgzU_&)2;y+F+{6vkDd2W7u|@&W}g)?*o50 z4o?-kU!b%bkS)o;{mQ{Kwn&#r)9<(O>K2pFEAJyAiQ=`2P2b@&O@C*?Y*D5)OOjD3 zCfO3ADA?*W%sc)d@cs!}ee+qd`boBgU--X)Zk+c#;zPr7un#68xo#X&t=`@x?1tt1 z`dc>*^t5WHdjC}`oF!CP`Hx1n@cesIVf()@1;y;{WlH4i?Lg>ffJ3S4db0y;X}ozV z8^X7}b2gW6r+zqXM{pWip-JGz@_xdb?gF~}svH>j#=!^44{72{SFOK;-)Uqm{EhtK zG_Ci;{Q~mqA{ko)c$oUm@o4eV+>)p71?p}DE6wBWNAQ_u=>3i$Go=)kL*=3L@P~^k zTb?WU(iXCy$+B+M&-@$ibi`s2j?zMTnNsW>NK4zc_U7}bq`8q6pVVp3qs52Y>BSY4 zTgJ+*;BhuM1&_bz#Zq3Q7HRtgq#OuruBI1PBJ0cUs8C7M_>sd0#-FC6R~xUMyMcUpN90K7@lkTASm1*;n#DTmr`4YH#!};C z5NA;qtKa7Oo8qeMTS&xo)M%}53v0dpr8am2{;zwtCi-ibbUyf9K8v2Quk@oAnrAf? zmVhAr&$l5q%LuUgWgk4c5&26H_5GKe&4r)hhlbK5idvF^MubD-oLrc z4jT7EY90rp+w7p|L?FEf%VxLIu6K7QXt+;M${B?>x{aR2(z@z)41NXI`IV50A=E$h z4zsUT3|=QdyBW!CcQ{D70HRilkikRJx5Z>i7j5PQl9PP6!o&ezZeltCHIsXL zKkRUq`upqeTjc=wrIJXM%lCOc%*b)5-R#?S--yDTU#V9a4yc~O2QBd}T<(XZ-wS8W zp#tEDKQMD3GN2JbpOVA#SZEQvc{5VA{mawc*J;V*7`C;J5y4e>6O$x2jEQ1DRCjr5 zPdD4)uQUks($~s|+m-$=ngot!RoX{47$yJxXGUFbMs4{HgzGL=jIEKqpU=wTA5e$c zz9xTX{-9QDgJn}>=dfh8UMk8a1dpe6vBV0$ceS%3n=BBu`zz!$v9NFr6}c6rEPp5z z9d^2R$gH=sgf16|Y6!jP*|g6PaxGKC5`8I)j{ZE{>1DWQus96dDkwoM#4R}VIP2!1 zdysV7eoe{r1`%bp=`zyfa`YHy=n2MUz8v->joVHgU}!8WeSp{XU;Ye%U)#&vP7o zEN~(|uuoa*>()Y>f5wR;fBYo0`KC_H{R4HZ5(IH|)m1!2n*65C|F(kn=%5li!6S`w za++M-n@o^ zD=yQ?a(`q5ow1=LadQym$yVmwqVuZ_W=?NuRd^SEqhuJzg5Z}S|9PW_4xU#inU1jo z2!)e|lLA}r#&EX5bjM4T^53!Wem3i+6iJ0bXM$;#9K!0wEdKc2O?TP=!JJTU%Rj<9 z?q1WmfBv3}Rw&Hc zZV8yd89RRaF0WH61j?%FQ5z}hE%Lkmp$lIYVQsxc(em@JYPnkZe|zxjYv6jA%RIYJ z@n>WA#yKO1o@rlKDn^=6q4A*|VRvJfFu}77WbfGsv9XHXRT39uJa$XvYeb+=c!kHX z+|q?I>pOxcQm1#Y8y%FY?(rSz+LN-~p#?$elAPmJ$#)@x$$b4XdJQTh4#IfeR*C~2BezLB3j-bx#)n{d(t+S=FsquqAeB# z&DTzw8pgD;!YdUqrc~q^R4>ZXn%_}An%_5_FsQX7dWs6j+O~3iNr{g4RK4Yh-)1An zRrQ`|d%w75)UTt^iRe?I;BjFEM_NT0C^7wPDXmKt&Gp_qXdttRn$P#xEgiTGcUgU_E*1a7F0V;fq|`?fJK8BVByQ?*1IH z3A#rJ+F^>?Kn*)eZaJeK5TyLZ@3S|N~B>8<^oeXeMtUr$2PuH0RkxwNNPVv@n6W}`azO;f8=H7F&_t8bLNV;j*&fN)D z1`_s4(=|K^S+^C7K4~}mK)-cg>79VIda<kaT(t^zDya|mD>08Bu*!aA zP4NX3k2=}ip%?^k#eXqGbbBiSea#J37U24tmG|MIcxX3Z%*M)q-6ZDcu+heA+qtD9 ze+<~-Ex|A4HJ&|>`hvcQA9aS+n&__jveFsY3lID(m;jW<;YS3jKQOjqTWvNjzvmDCDnna-*&Fhh%C=E$2>FX}*Wz-I z!Zq(wN?V81?_Me*WkN89ppO;OVDxv?KL2j>S61Agl|n1~$h)t7(A!0LU*;!u9^2&% zZ#*^JVxj#5;I!$JqfZT=CdVgOnBqok+TUcWzyqH_=XptMq~1WC1R@6L%1lv^)=*@z zcEcVO*<)6UrDfSyv-q#<2~5tZlgf5#Hg=K#V?_f%(p1Mjbi5<9{ zOm;5&Z|++SwIe(Wm5RLl3OlVMf2QY;-q>W>#iczQ5alI}7prxJOw@QiK-Mnk-@YoN zqWt<2dCaQ~E{oky;>e2Y_ufl;n~zNGgC6`jOGx^p{!73m_H*^8l5a{6D?$5^$Ip56 zsa!pX2vVRCpH>#Cr@W#fwg_vTbi#ffipw9|)@?SwZw^K3lq_7HFh8R<^zf(Tu(;qT z@zj9IyLpO92016EJcx|fYbx94gJQpnq}Cs4JdEOz*FVR#bTpv1v%(Z#m_&JaFGO0a zf6+{|mhA0F{^1#UFba%$#q|j!^Cwd{Z^917!xupA53B`r6n0>t=)6O^Gv^2mCEBEp zul7GWZeDo?a6ErRW}U@hHiW#gYh$%N9FN2-3{lXixw`fx;VBG?At2d2q2t-NRV~%L zbCoC>{5R62thG)UqB85seShhkG=6XV@?|Mj{zrh zOb-oxGNFiawK185Xb3Ss_*SCLX7Sg%W^UgHoAl=}^*g79kup)e@oAx)%qKyTyQGzG z`7@J1W=yvGy@}!u%~@1w9sR@<)%HOHc?;J?$Q>-CoIdI-)9t-$43F<9xlzNG?Dqb~ z-IUVt6N$GpZwk#awmx)XJx(XZD$rzo=f@xJz=%t5C12k#X(tlkYh^B{{x$EeW+jevtWP^8>=Ea#I~q!Z2K^f^J(N(Op3btlJx=Cz)x zktF616%l4TbyndMc)|$^=qsM@_LB>UX~Xd zyk{|S848-IIHb>Fe;;%d%e4zB2gK({e+~(|T(}mfTE2wU3uC*xckIi;pn3#};f?!whd%vuKCr_VTy^OB!yJ1_s23t&b$7>-es z1n*wAkm?|%4at-SHD^YXw_{hxHNj0^D@$q81HDhGW*Q4#MN|cG=Nr(n2Dx#>)|(dFXl2_F z*Qu%JkM&UQ7@oAd-+-Y{HsvtzZ;q%}85QZ)PUL1YT4ojW5 z`{S@!hg>iHylVn-bm7V+VLMjDZkc^^Gd3u{NGD(}$0xV@TW&bZcb%X{nYS6D`(2Zx z`+KFKbKW<|fCI8J5_3g`s$Ke^+C10k)lgo8d}e#mIkou2mB5H{8)Y#%xIJuP?9zoP z295Oo<8xDN9xV0Iq$0{V_oab=4m<1Z8AN3sO3UcnFMKF&G&N}9{pr5O%;YrlA904j zQ@+>Vcb{uk_4zkK4Dztia!mNdFM~KIDUL|}hi6~SU|<+s1@c>WC}-wz(XJQM?fpt_ zh7~^1_azMe?M>sh^rPDI3PzfZh?kA8u5`pP)qC>W=Cj7)H;2`fr;#3dHd+S9bhZOJ z51^nE3094>jrlAhSEpmDd^tq_!aPjS#XYyyB0?yV_eIEiHRcp1SC6MS<9cIJTh%$+ z6f^?t8Ep~mnr6$(Mrw}JgWr_&Ba3r|f%mUSIg9sq*}bjRAg|y22O;L@5zX$Bx0981 zFZl<}{8B}|O??X;a;N%a9BLLczw|xW#9yE2NMkkz`Re0NQe;2zAC84i{K6q&HM)8b zd?pYZP~V?hdFr=bOmXGsw7l{Lw@e*_v<)wzy<=Xmi(TfpuW{>*k3+01qh8z*x_b4B}uz5FDKYMcdO z2VIQa>SJ%j2LsATHMmAkc>s%>EvMv&J*3bC8#Cnud3|RmUsH$Gy?=Iq(nCw|K7I_D z_awsI3q#V(+E%#T?~(k0{ne*;&!wIns4qfM*UT)srz0idA0|cj@Xb{ae_yniW!^O4 zebS5j*Lq2&8EHRYkK(DoMvR=DZmczIEDZ&QCk|!!eIw=Rm>#z0R%J!$@g9;GM#%`P zHI5iPKA@P{_5wEUa?8`mIe{CFNCp8zk4W|mo+mZ5c==^x3I^@u++WxhuE61K5nLeD zqQUa=oSdUROJTxB_vC0CAW0eJXSvZ!$ww>D27!Z+06-4j6!1|-==DR@&akP0O!~Xr zUtxjzH@QSFd>$SNI%y}*I>@+inchDo`CPky-}}NEdNE$a-`G*nrFj(SoN&`X-@$o< z5#iqu$UY-|hi7asLz2CCv)+lX2tH-)^=I!{ue`&gbeTTc%H1>>zp^fu26o`MZqfRZ zDvozlx;XOl=MC&g$1`l@4YyZJW$9E^rcY`p(y53atpt1=V|q+CiGvmVjBqz3@+E(} z)m<*#!SI7E&r0WBqKJ$+N<4Q*Uu%W4&rE;j#OnH(MI}VE^Ge}?4=2W!_X=|d0(i@6#!7gXCtjHaTIoV##B*2lbTz%2r zW>2!#_F%5rfLAJ3rdCP!Evy@< z;b+v?^PbDp!2-4YB)_>S=QOfgJ@aOZ$ZzEm(pQPvIlP19)*8+fciY{KGR}S5vUs43 z_SKYDcbty4?6^8Ox`TAGIQeHp->nq+BUOGSA=$L35M*|P3miztiT{p6Q#uuhFslKA zG8TisN96TBl~O{Rqh~~eyvz$kDLrlkJUFleK)Pdj`|kL{gyyOu5oo3+rKag@sEk|a z&wBi8mx07W2RX+=2je-|AG2@X-lQ@$QFa%th~+8KhndJKRAr1_W~bqGVh+T&BD&V_ zhITU5@tkdLbERsCVCDdom3H&j*|Lta`xC%6KAqH;0rwi2MyLPlz=!*)SWf&}Rn$pU!?I^4x9|h5NCu%E%GO`z ziOvqSqPB6~hfE4yOBeV>uzqZ7&7IIrCgabFOzzjyUQzPN(u||b3W~w>$eyHvp}_1a zDU-PaWHq69D8Cx_xKr8e?K$N9HswC;S@Wj@0nf#zqTe(BkFB?Wi|YH+IbE(_(UeH_B`>8yx$be7yYpTI8+drqFjHKN2=1QVf;`dA3)6d9Dk4 z-h4W?Aut9{DC?(gXD_sue8q6z?|Kc+99baFXj(nY`YgF?uu5b9jN?{X`z=!U`brzJ65>bdr zPa3y7*9&Ego}QMZ(j?^IMy2CJhSe>N>r(fQRw8sk2w^8PP3+bmUW%T2yNLz`F`uz8 zwX?2ulXOq={MxeH>7QjFUBKu93-)sPfCbOb{EpinV7VZxAQsm9Z7!e*ch`IfPPWw7 zJ@XNa@)=L?U|#CRN~AdZuF{k=9DTrhCkIn*axli$t*%$o{gP*kQJ4xxd*(@w>e?51 zzg$IX-FaYi=XQtmRr;*Wi@sQ99KyPAr7;Rt?(|DUYJ@+xl^+$A|4jd-KRItH$wQrw zyT{Od^G)@Y&L}omd2UfV*14VLVo)2ujW)dXRVJNwxn$?L%4WFN~VQ#UM0 z)*G{Xw)v9Pab1J8m(I?quH3bCd@1|W`G@!k(37<{Aoe!QGL(eLmsg{o{#cUkVg)kblOI$bMW zJGwCr8N564&f;jMr%|mlb>lMcWgL_)c~h(i@nEWC?5Vl=L%ddY-=h(E|8+@GKfgN- z^QS0eboeKch~}=msY= z8Qun>f)cg!RGbs7w@yxV*sm+@I4^u=xR=G+Q9t@je=~hxtw`nJQQ8NFZRd^ka=O=E zvD@+5Yz(Plm7!>9r416eSa78<1H^x&etLd_IPw+Q4Xqz`G*pdNur(y|&&?cu_#@_} z!1vOu&bi}-Qa86ep|L(z0~rQo610aAlp#?)qs&gB*IqlS%!YI_WtT{rXMJlh8Tm50 z_TH!C0rit(Y|EpdZ80{6B0=9@Ek8MtRyVMl>b!rTr;13_`3@BJX8j1I8W(+&t{M@l?%>999l6|H z$+JRZ2tM~M%=UTi0Ie0MI->|U+y{tyQrkSB+{}{wQRu>&^N|a*y-#yXRo?icE+%IN z`pLeilOJR*&2I!2Qcqf*vd7`w0z+)HS3>Tj`@LIdsENIOwDPUrMPG-jWnD&2FxF|q ztt14861K$K#wm9KSh>3vIv@shT691DJtqg*OcbN3SvUu&j($(}NVB z-BJ>~)R2>s=7x=saY}}*iH5Y?p>H2$c8~kj%vp{aa9p3$ved249zO4uzJ7Hf%RHS> zsVDH^E2Q-?I)CRU*GQiHX&2HC?eI2zjYrt|GCSc*?`A1Y#`^?xiLt+NRaDKeU29~Q zk~xpqM(sIIm)tQ>@y_ojoi{2Z5u4Ev(s;80-979%&9yK~Q|;^5$3b=OI{rX%9$om1 zs{Kwe$cDI4;~1~&@+h(H^JoR!Bz59Z?c0ju0Vo-Y`c*zY*Y~@IH@X>lmzWomX`B)w z>zhUU=jN5~&;kagw>2cHJT0sJYhAT(hchZOy(;GmfMb0*b$TdDNXl5qftg8`oyQ1b^eY1Dm8M) zJ2qp%@bw=Wq}&W&iz3%W6u(lV%Ro}<)(YkkL55AV9NB65Vv?DW%{8q%?A==`RlA{I z=R@QC%dC4EuRZIMv*>g_(R+VtjEKaPWnwc*FI2Ah5bdrc4&?>`*V&>)gQkK=vhndF z_LuLCRcIhl--^>u9quP5k!_-0PCUYiu|1L_@Djl7V4qRV{F&o=)M2q?1||N>C1^DR1^PiSZfhD!W#>%@Nw|CqYH$n0^_Qew%%!C z8(~}Pb%H&gvp3$?6%hRK-nV{#`MBE2-fF-1rWMjnO-g*`9q&adneSJ8a#mTE$bNsu z+Fx zUz7i|OZi;@t{+OPYR&`!hvYwMwWm*N3cb8|75_o7^E*hboZm=>58J(OPB9AH(rDDR z%+%Ez-43lOL6xOEP*a4GSM&qv>u+F_*S=-`GW>j7G^876AE?wHGc zYz7wL_${){NbM<>$KHHqF2?g2*@bl&;UU82Kb_bGm_F_cX|F2p&cK#KvBKA7%J*XY ze;T`=_{`W>e3ZUy^8+5)#2m}@1e3Asp&7(wo1;iMexEFrTV3^;Qp6p8+X!MdUXd@- z-;OadPU4SpT5BvrGfSA{m8^z4WO{>8w|{Z?IbMgtlHP^274<*hZ`-+d#fA}QT5m!O zc9QA_GVbtaOGbB!G*xg$F_0lYkV=`Q?B{CD($e)uB`lKMI2#CQH|UKF{Ozeaev;IH zzK0n|N(g%>qY_?Pf+Viq%Q#zfeA;a0wKMog#d~9-`Tcx3$ogK4W2v$GX5t2S%%%LV zJSI4cZ3|lE)noB7xDwt-2dOTSO~Z-AHloe}vDq~&;SE3(tF^`|G*c;UVBBE&iJtJd z=uS{uWtnKEqxdA0Cb8lNSK_16rE0!QAS)oG7}_`($au_`y?33t{M=JiN873ZuA(2z zd7Tuy0j=3$yaj!a$d0o_cnAWGz|vsn(B_}6xp@u zsJL#av9!{V2Q7l1cd9Jwl|7jC$Brd+R&M6A?j8Ed^@0tHvik3(Hqkp+-40Lz)m(!MIU2fd{v7z z&m>=2a|{LjVCrCidE>s;=@ac@0oCorP|=Lmbm1eF#Q~c0OuZwNy({`B1(VII+u)ei zyp(`M#>9g}&2MSCbQJ}Osgqx&eu_t@<>E3}W;w#>m>mph`>rY9r~a^Z)g`ZFmob^& z$$QrL(r3QsuX`3kd9GItxIwG_)?-OC_xa)renE>mSWoIFxX%OQaN{HTul7?=9A&BX z;G6K!?~%&|zd_BN;%)r+)*zm^(JJ_e5R{*yu_Ee&a$?B^ENL#p=SRvv$>P_?9|5UD zXNnxl+>RU9RW9vdl{hV_9_pXwgrqAS!J!o}lKgWF&7f!2@WugkYm%yJyJW+*WJctD zdpfzLRLOgHFUf8M*2VT(LSD^z9F=f-K!CJ|xO&8WC^CTi4Y{x}u&Ql-Zi2cE&{a5z zNLKkl^h#7l>qWV4*&3X&?^?!vYV$!;TBmWaW}(?J_Dl3-hzpTqgT!<#3t!4MyKZ?) z%NWLDJSa#MRW=TevhHmO1l*CJ2}KhaF<;X19nh0p!et$2u8YmBHf2alMPol4@*U6H zG?MGnO0+ykvzFJmo^!f!#rHV|j!YkFh=4Z6syccf_@@OqS~1qP^peM-tHDGVN+ik{ z<3i}rTVyRacjhef$aE*59M19k$omJVg@W`D)=&KmACBZMx;k{|Pi3;cvbRD~nR-tp zF@Mcl<1_r^1j&1=CskEgzjTd`?$O7{`+59MwO`A?p%)%7=rHs;XtElreeGmBr4{AJlprm;iO>H$97nxU#cgzliAYTO=o9gbeetnUJGkK@= zF>;w34t3SOrLd7g9_>LB_p%CZk_;{16I&5YLc^L=z>@1)Kml*@K%n8TpA@bgS_s-8!Tkp(&&~y9*-TcB+O%)$PG&8!2E&-1p#T|xBx{rU&MSEOj zB+pWfw?cY<2}69%BH7aO$=bEwC=YFabJyR_eXtjJaOv{``;TKyBP&j=Z3b}lgeAG| zSVhcA&`pv5KO(d{Ljg*$5mKHxIbX_A*d}}$^SM)E9%h5jS^sQr);bV81zl)bTc69?j5A4b`(~}% zb}jI4iuKb5{akUs{;PV;*jm#JTM~y=qU|E9@p6)^+QGntRxME+K7{aRUP?{SNequU zaRWQv63v;_OP-Qtrw=}v@N9q-jrhL!aB8`8E8>=5mGNb6hm)?W?_GlKr!S*|LPGs@ z_;m)>8^}JMbw2g}^EsYmN8#=yuL?!0I<&%2i*w`Fk&Ww|qP__O93eH*g|W%MkqwsmEIStrrV{_Tb9b_oidvi5P4Wnjf7%9f#vOk3WU zqH1S)$N&pw&U`=-s4JXjadA>+sZH%a?P3DM)<<`aKq9L!g)m944m`F)AA#{@@~57f z0#jy@BZtulG5wIv_r?n9b`Y4sTf`tcm9B+hhd*(IE@Pshr9eTqf3{xLi7OrM)qo0l7P;?mV4So1w`s;Qa zp45=Qw>6O)$fi7#8yt>{Dua3lF|yEEh)OiGCQ5dP<*an4!|O-_qYqV1Lbdp9osSV= z%?2sl1gp1}*H^r1yIX?Zw6pIxoWy|9H)PBNCNGoay(IN0&Mo%flku~C*_A3>T*}Ri zWx1ECcQ;i?Kb@Mc>1I4*5Doc|Y{m1vDv&3LL!Y`4`*w=EKu~T_Y#_#dX+_K0F+tve zoRKM1R^2$Jr}2PCG}uKYYs>pwZ7AW=Da<0`}LPXCvu9sF2xA-sYf_dh>SbX1~Yp zo`=|K>+Y>v?d(;P*j&v_sou+$)MR=3F>}nycl}&PN8<#f3x@j8JdHRRtWGpTq2;%- zgn^hA5+vW0z!a+r=E||`L)YjDf3bCxXnc}?RPzrp?;hz}_fGZHjS~|6R-Q87e9}X5 zm}RhE&ok&Ht;Q*(^`o{gjxl4kaswHNKqugD+*1&LBHg>K_i=9(X=wfI-ZzH~f!rzzN*((umk#fQ-{(v0i0Zwew}lylx@OmZEFCi6Q1|=SrMMku8!2Y5|VB&x(I(M8#L{$avRJcyx4KT7$^>7lM^+&d*x zH#T_fx5CDJ^WGu>T19=o9^)#XCP4kZtEaXvlrh7FVQEp3c8lxs?D>b#buf?|7Ee;5 z)=!}f?MTr-7$BXxKWxG$@Q9Mmy(0C+qraV;f{rZ}o+Yi3boERiZLWJ&)iOHgL0R)X z(w;U|T>c<}78*F`$=k9oITwEo1jF8!u(ZTCWfj>2ujE2163Sb3wr|ky-ohT86seAr z0Eg2&@AR&~nJ$^2G|Z3X`V#^tYq;c3Opgc!RX9b;$1oK(`AM!KeU~+#44QIY*8im~ zrI^!o#aSijHW(KH_d(Ho(oOaJlScCN`r-!C(X&H1r3PMB64!ZKBx<0VK0P40hmGl@ zm||DWNpM&DE8OIY8?;U&2<}kDb|u}*(msV{i9Z(BR!r-99dO_&M74u)a1AsQ#lu;p zPf7M3XZ)m|Ir7|a`9AXIEUs$dcl^P-cUA-Ep5PnL&&7UY-*l_T#jY6feBZ8X)N(}A zDJpp^oTrML-4QQZrS)ZDiQ>-^Wfns&EOST22kFQ*^i?)IrX=H;rTgV~9?;$D@uO(1zGBoK9 zUE?rEPmPA&DV6cD{)K$!EwswYN6<<%cr}}54X&iUC|7(l#QGHGNniU;N--^$I2&Yb z!WB-pCI;&JW2a}T|M)@Oc>#4t^VSdg_uy8k*e{U(@_NZ6)-1W`4o!X)|MLU;)_{cZ zLr*%Ln^8#@Bk6c1_McgIPQo& zf{lO*3)d~l^dIy3XkRamQEWKoW}x6vT-1Ovv)YT-?q&U=05>+muPupk-ObZ$K2x~W zf#H5VcF6Oym`ksA$Dwwu4Bix*+-xC*9J<`UMVkHb=g)Ib|ARQ0Yho0!t92Z@qn2xD z@~WI6*(6r)=gw2Dv#u_SF)#E8;`p8gvfc)75B_5Pacn}MJLGi4#*6FKfFP_QOY(h4V5Z9W~hal#(T zajxUO z&znjk9aVJSQ*7tN(MkM=qn!raD}2;AoU#DFbXMn(kztyg9UZ)tkEUS}c}fV-N`y=~ zqQNV#8m*c{pIObh>sFgK6J)$lnYS%UElGH{zcaNamep=80n=`i=ijuSSh49u|!SVN|{6D{9_1sQ?Jw|kiG zNG7Ff6AJu-mG7T+ct~i)aeg!pA}bIX8S1A}=qAL6KV>8IuO=tsU#1+00Q-Oc;w zNAxY$ysOEBl$FG*cx)7`2sfx0*aL%q@C4Kd6HnlpYYArXhju;VN?PHG&}$^H{e3MOBEeU=$)p69n}%Iav$$q@ym1)EicRPFWK=N+k*lweDU5RU5#pB zDO8+rbLsrisR@exN3)F8LKWuYonYa%5dveOYw;D@;{=6$j0C`poUZFEl z(A4B>Og!`c*t^huhl{Ofwp9UGPmp7RFyAL=h#cR!^qgpCIjQKwKVMH>@Q@lC#629 z%-D=nzu$E@=-oVB2FhBlO_?_O_g2;K>EuhZ*(c$)E}yPJt*~st*DjqkU*;PYXiR(o zm0HOR3cSKF1D#{uoy<{T@`u=&+whvF#M2Q<-dn-|<}(Rt`EB|w8mu-{G4!gP5l&yi zF${8P7Ch!Z>ndJY&6J;Po>ZTp=7NIng*$aTP(gC!Enz^e70ld*&0E(pjV4OL2~3r^ z=>+*L9S)W&q#pae@F+i%W_wgO>=L{1c(^2!yI}mwfW@7F8HXX<;6^1n0mWEwYWz8) z!DGW<1SReL#GvT$?BnVUaozMa>dUU7XS8b<+Wg&H`qJ^x~AN3 zfhiRO7Fq!_GP&3s0_bizkkoR&`eBWw$ewpJdaaUoIcFI7KFEzT)bhVwW>)boP|Eyx zrWAQgVG9C-T6lQSq?wI?Bd)x7s=^{Y_VL@k58b_A`t%xGmVF&Q&uHaITCbs^LVhu~ zZ#>t;XedJ#3jzC=rxrJqMLT;OB}&eGHqmjd4_{=9*W*~*x*qJcl|vQDCs`dzk6ft= zo}2H|H0!Vq+{tcip=M*#{P`_GH?1kzghTZ3e@&49Y(e+x0bSQ2f3X(r01uXdLBZdxODY93^BYu+8hbt@270%-n*_hl;Jk zTU=nf=Avd_OJm&L;mTDPKbNY;7Cp2guOB!gd4;p?RN1Ary^*Nu7sMb%Zzs@tYxp-7 z%9_f4#+cV<4e$CGdz?{08AqWhmf(m^x5ZytrjQIq=$-Jc2U`f)lR7b@ex&+*XMHVc zw&28Te)%s7ZyB1p2VJ)XB--1n1DR`??(1lR(K+++YtPnyw95~g4eWoWUHTnJmWJb# zuTc8^0)6rj`n}o+GK|2T>K17IvH-R_YcWFf|1u1tkU6}tYfUqk(#!7cUs)><9SK0}LonM)3O;9;M$)k0Q)LCr7+^{Db)qlt<)P!;_U5JQ5gZRl6M9Iukl)dw^wS zxK-XM+%tC>B+zjLgo2q3cCy&x>D0p8&36wopC-{|8wOAt?6{h&MIq)$#s{4aE$QAoX6!7H!(0*cc03RQy zuwn)b7a+?b_Iy&^;(dp_)9V`tm;1kD?`o+1NA!B1vaPoOf*#pEbEzQ z&D^>Bjl~SQXSE4lv#V(Ie3bZSoD!>RA%4KfeZ~$*BS=Q`z6LCb4C$5N@OFE75B$tV zg{$4LoLx@p?rD>+bW5iqjF}yh;PE{#%?q<1n2$aK5mLaPi6f4rQzngYaV?OOaw*ku z3>~Mj7E9v?kA4#;UJ5nxL$deUh8%VN^_!zuVQtygYV?kcQ1^||18*77obrkr4(>;M zooC0K7(w5nKHpNW#ILG=h0JMTI~G_v6k(i=X}XR-dJc(VO)LfOm=GhPPla!Ui)(|N z0a7xkr2a;WJ@Wu^*h8%U-1pI7bHxp}PT0I~u=f!vOwi=ON&$8;{|X_C!Hr~{H6rP2 zosHth28YH^rcyi=`-=vWPx3fRa`MV|YQ#yn(v7mN?dbF&BjQ_I$6Gm{cxi{!HuK2n za43$RgE94+tg7MdAJzuq%x2#Gowez(_Xa?ERQ7zgd${K(CzCskO?t%Bz=|Nze<{Icq;qC z`;RHDYR;}Z)Z+U87nlGh;J+|M9&SgNjSu_-vj1RLEN~C_pU@gj2kp4q+k$2w4is3h zp%A7#zO($5*=HYOS8pyLbbA}#m3&Q3o?HAuWfAM35)K)H=?2VrnS^S=AcaE2_m-NB zH*X>q8|}NJ_3>nR$8bT21-aRPyvf1BV{J~?TjJVCs!pyv!Us&i&FgiZI zqNSzfNWge;1=*l?cs#|lo$obv>wRWs=#Z>I*?_Z#esV`Lz#MaBz(&I1KO-rO=Mri3YQduJ6?U`q^ypUMHP+Y5ufPiNNf1vl397!sRH{O> zRNsJ0svqF`OE!e;eRT2wBReOzi9$KQGgnVHksxoOE;u)DD6ciK(^b8DmE{`97 z+tZpqpRkd5=+anF5K&Ylw7#)1mVzYlp13R^P%w_P6isgK>e6QC;JElkm57MQL3>As zV_h%%Qsz=iWGktquv7^UYb{UKqM$T|r|wD}2qM{5%9aQ)$C z`Gp;{+q1@XQHWr?y}f@y9Z*g?ph_dyzOz?huN5zfScr|4mXaDa=2AmI@48Xx*NOBM zlrtYovx~bARk$H9byslx;BnVN@uZSo&MC!>=P6)T2F-Bc*c1F~0Knn%5(`$em8!B^ z$g0uo;th5sZshx(ta12=X-0H(bcDsw*?!Rp%*aKqt*uQS9UTQ4A%pZo&VpWlV}a2n zJwje#U|^65n%E*u(Z+GXX6NVUEu`Vl__|csNU&CBASaTrAr$`8sQGgdOpxGqHIi0+ z64h&T0>0_ z)OmuZ>avKCB~ab+ur_WkchO_<`;q(Oo{HR3^ecS(Av4SsFK%~7B#}FXYGDfz9-)`3 z8=S^sP?ba)uu4$^ZNSRYF;C5z|9&dTYuvH`-B^m;JxPa$ILC(#zr6HbcLxq+K^^%*52;`5{O%;m|6_=ZiXoK_4Qfjga2?MLx>YGSMWLasZ!uk*8(;$FZn+cTt`=K zGmqgpHC^B7A*?rSqY*16kT|P++9s?!*CYA`9Ct!VwLw-`tdAuI77;et@l*tn|H7$aU+NdKs+5G5&ONH;eoq4 zwPSy|_4EhyXreJ89yD#l8Be@Fp0cI49zyanU&#Lst0NmyfwYg&@jMn65;8nKu`P3g z>)5Qgp|d1x@uBW$I6>4Bc=r!QqbFn~U*QpxKZs`s{Iv5V(GwN9E=_sc0cm~0x7#YL zfK3eMy43LF_^0VH_||3;w1pOU@vwaSGnW!@{ur)-(5`+0&%^HYJ-oA#Me2Y*GV~m; z#w7`>ljlhCjetm1cuF>mR<%1Ky-_@!zAYcqBFfyGpJbcSdWW&~m3!*md zjOtnlC~7f;d@4->=d=hzYF0~wSF7)YaaS|o3FNqwMAp_#M>5}ERinU{&L*O74De~8 zf;LtC@#DvhZu=Fi9mG`ju6Ue%hcbayT(xG$JhKn`aPdj1P#1cWHh1n*-9z)t7Gc1i zuIa6v^7N2_1w7~864p(HqyMnlfDPxq;z|{-903G>2z=kM6PIqjFHS~1Aq;_aaf>o) z&tGij)?obdDoM7&_Vuvh-Qac1c<)R*I=qcfnaiF&;o1u1qvfspj9M*?$D|CUoQQ~t^;g)zze?8a zfChe}1YbxBjhi!pMVJ%yBIz0MFq=N{aL0KKX8AcM}?jnqfaw$Hib_NM8 zXys$>?#VfLM+`7Fh37+b9=Iw5)**2gVZ_ZK@ZED(ZrA zWW2zXfEery#9vFGc+#%Oyyul7?OeyS@gl5hsB^e zaT_G6Dg{2HCkp3XJ+cP$uVMPx0G6q!n3xV>8^g_es;?o>E#U0%k%>pi>>KoH;~}$y zD;z$GL(%9fIb(p!mpbTacNI9kL(VQY30c#=0pG??c|L|Xkbj90o4$>xq}W3B#- zuWVt+OYh>{I?o}dbYLpktPA%|ECNGg2_vJU8^6%coi`GqkSd`BOP`tn33aZ*fmwBRsB)UU3i~yH7O~uuK(Id;O+;Ru4JlC(G z%yGdZum!DNV0SF;A_T`*2)eCzzCgNqu8!NN5~p4&o#|r z3z|wkEkwCU`)uAfl1{U?qDWru>$U_}Zz%oQN((MU>8M{HT++c=2?<0dZ^P$3j}`H$ zIq_Z*OBaIjX$0jfxg%m>0&|>G$p|;zzEF2Tivqxbe5fGuM0e$&izrF!yJ2cDIPJa9MQX>5Hdsz}O^DW= z$3SW7O<1wZ$%MX*BFlBWpKY$$EnmJ!KtV%nY89M{nBXrrg|rN58W@GEXlrA)8|e1X z;yQoTdZAj_Bx=N-jr<)}ymRE({{f(Sk*yh=i&I0W5h}08YUfQVbfV%rY>~gc#fcB0 z=;D@7=>G8*56o*{9ChM3Kpd%R>E|zi-xs)}E;2m+yfy{p2DWgg62)ryE|k;lhs3A}GQ*BzC_IWMZQ=^yK1)qGVmgFUYEx#n1i-{>|>*2Y;)vH&VAUlok(L+=s zE0KlW5~D&GnC3q+vbsSsF1TWvE(6)=@bIQR*;glS7hyi}fdvHX^__bY70*3kGsxGt zo%3Lw>^2Ag3RIg=E@5m_U{+TiAwJY+#wH1h*KEF*6X4e3sogdm~l&d zSaOJn6(QGkSM&DXfX+0EC#sffPTJ;+iieu-<}`v|Rn|h4m%OyLO|5#aZK;MPLgpeS z8Tlvd5@&4EyL0Dfd~`Ilwbo5>0fDZ>4wHJee}U{j-e4z$QV7WAgm)S)ToakW+6pBQ zajvT(VqoU7d&WIk8Q>uGH}UX`lqe!9~eTg>*xTY39u zsgzuzQDS<4Pf4twVB)>XeCfA>vL!iVcdnWq_P7Rd#fb=Z-x4%pugUybu~M(#E9Jd_ zE~r?UwMgl{GAik)nQWy6OzcL|3yBd$NzQ)@0w+RJ#FGJ{x2F|t2iTupx}wPwouN-z z0Cg)9E??8!bT=t`{vx?DJpt0HVoGB z-fGVL;sY`A)^`mq(}&rzwxBCrq^BtAwVqE<3=R(>AFsk>55+mqG}IL2z?XRgU9Vz4 z-fU*PIQkYGE*JhmTRU|7E=iFJxZkUSZA1RfFg9!{!#&$k=itkxx+K)*I_h7qQi2z| zxcY{}gVu&v|Aq2$tC>=|D_-Gm@NOemhp)egWAS=UI{q8w4bd8&=ZQE_rLlADAPnr7k2&p~Ch?;9h8H;Q_MedU-Bgvv4itD&WZ{ zF4CfdAR)IuB|sQ6;b8Y^$&&RVjDqwOW-!3L`aIDOkYB?hBNzw`V^`Um${eZfyOA%LC? zRc>u;HShlr=DUyVHpgv#_DJL6!~1f+gKC9({ny|LaHFG8MiPQ^4Z>NXFM8tWm9j;H zgYhgAaOFJYG-}-YP?uDn9CQa1=NZ?6x~=5Moyn0m<<(yHda-Z2o}Ar4)Xh5pMGpwg z+FUowpO5Uq@a9zJ2x+?J2)S+&I^S2DcOog8G~&TsT`#}6O4YHOTr7?cyjEeYi!01@ zVz-Hr$N~+8-c`GQz*(|dgOxe($w9bR@su>;CE@#U>4+EiY>{J=typ_Ex0@}zvq>p1 z+?wghP9+|GeG8h4i|Z3J;s>GO1A>*BBkTylde}=xudV}@xjRQGVTov(pT`sBUgMJU zKMB9!>x+l7Rw-lMy{_UwarsFCWW>mv3PEB0+!gr_fbu6ZPqREo=f*Wk(z;I8<5cw> zI+Qn`2p@q~e?8MQP0Z^Q>Ol5xAHFpugJw~0*nkm*LB+m~0U$KgBs9c;Zf{j;rWY~Z zddI}X{o-4vbw`K4OOr8=2-8WvJa+iAGW!|uFa;01*!MsDwnG?#a2xkPSL|ZNJ!QDwiX3<^(-|`<1t?%_FJw8{y3QhI46{-#+qMz_f(r8k}BVw#`&t zi+IEfpSX8^lr^%0jPs#Z3<?U{SZ2UWk1jBnwt3ZI@Y0J3EaOM} zxoXi(mbVYCQ}UCkngaUxRdnzqzSKUa#Is=TnVA_w7~wrnpp84s34wFe04pEF{?iMg z6|jQ`=QUir6+jAVN;w*m`{ zzJv2*2bclb^*}Z`V}L6NnUmF&qOE-KnQZ#=P$Ztjq72UYeZ=+4HVojK@35SwRkX-(m1G&C;o8_DXO*8zUW8}uir`uobD_9$6 zghNJykyk(QL}{iU85cX89Ee9;449iT6V`l@V2p*}Xv!KdCqwD6JD1lF=$WE_<^uAu z$1*ro^QiyX!D*fQ$|DBsI0-R8dWovTy&7cKU&jT?Q`rL&N{Wg=A$MD)6u2TzPKrVq z4wO89?k0=pKLNDj`~ZDkHJK@mUAbB35_HK5>cz+)46o2!g;KD?MgbwSy?@&apQK8D zk`Vba(NTg*@J05O9_8c68LqhFWuJzR7RduEEi0x!vN*;_;<+c?0Bdran^^`0#>F3R z(MeP0nQu_-4-=bKWIq&JIi_a4Lq`ex#ht#s^YRB(#Gg{KaF#UIVBhz2@n0`#jm4im z+ZH=K{M}MqxZ)8T7dO9@0)K{uez-Llz_>U#nx;m4Pe_!N{WUNODt57=qyih6xD(t$0&Gw_dU&LRA_)bv2?Gq-3T&m@gZe7W2qkCs$-sM_WQ`!#38IdF_>#&F03$sO>Jhp!^Ti~pd_ zwYb-iM{`(Ype-?Q>7#AE@EL%psHhN=qp&HpWZ)kstrn&b4vjs#^NCj?C2n<=b;o>DJh!?Ey*zYHpRzl+e(TFqYs{PX0RKpWi$j z+qA^;Y?%_0phvEc zMh&o@%4s{=xHl>RZDy|7>$f}7Y2a~td)}IPL%Es6#xRd%7}JSQ3Iqp6-;WHyQi>hO z4#8ys2Ojpvhc~6K6lW-HZf|c}C)GahFi8J8#BX_9-_^+O{Rv!k=sWe#`1eNejg4g= z1@RvRUBl7~*xRrEPSp!o|Chi1V77;%7cPoZWy&4QvsS#Cr1kyC*edgxA|bFBz&ZI? z_WiB==v=$2Q~6+NEs?yDc$)%Uz@8lSzntpD#Q*1R7M&{Bfn?REJ042h2`B4DY%RHt zSCekBN6a%J4SN^%>IKbnbb=2fjfz(d#8Pf+X9Xs+z+e3H-K%@xJPmw8BvcD5?d&^$ zrJmy;kT`#Y%H73@fAGO6DJj`b%VO)~^Uq5zdG`50RaRd#m+#y*%H0izbH+qd7xyIW zjgDMOGS1C{PAvMqr{W zZAOIvFx4*CE!GLW=ZT1>Ca8kW&U$_t1N&$!>}f$|efkyB8T5^4;t}|x|MV8Rao=(l z9)dmBSQBA4>85|jQyDguee2RtckJtBdr908<0Z7G$G<4iKLo^agc8RF6iHs?`;#@S zt~YKFq3|YqCpduxo>)Z-KAYmj))6=V@9|MP8F&D=-8ol6QFI~?T3*9BBj1)?)pV+Q zAg(@I-*RQl=@QPg;!D@owPM+%3+K^{v!tB`|2rzrx3ky)KTW3Co=2U0_ipLV!c?CR zA(LPHZRY&|@)IZ3AiSh~;~(mla+ek>Uf!+UBYJgzv7e&&W00>FzW!)Yj*^}m@xN8) zK7A;TI4gsDPN||jAN+N>y#g*!&s=Dq(UB&hbFv6O*8Io9^3ONac!#G>u_b7gLvaE~ zHU>tJ5*U56y#k|L;*OaFXyde7bYDN4^;${1TuS!0m4DRyb44ZbyR^@^E?4RRQi<^M znh2zbe9?zn`EM)ke-@&D2faz(sQPdFf1&TL0$A%l zf&^}znTJ7jp3Xpaf05AZtEUKP(%=D{%9TmVKq<}tX!@Vop>}}!@&Kp|@}Gu0o-x05 zLpOJYDLX0f$EV@X;bC!CTjewW9wJh8kDo_(V6sJKK!qFtFS-30ojG*5D zpu6?k*5BX%1cLlOr>F8jWE?&o0O37(&wETFE(B@~+SjAmGVTR#jpqq5_XE~=EcOW6*a$8iU4BjYf0T2`Bf6f6_j+I@Lq&RTc9c}fe_NJn3Y*J*e3o6Fewzn{LCpwRdm;WTm# zr4qjb*`W5w>jwbe8&b-S)v=UfVLDbKw~+t+`H{&NA8x&|Ztfpnj4#u2q+Ana609d%>|uBbq?4x-Urz*_I&(ZN~paKO52L0C2E zU$cutA>DvsB;`M-b79orobmW2;OY@S1d&}ecD&EXBmLiQ&bT|DY(rap!9UhQhIel< z0p|$qLVM96-e%~)!+#(FoHIJ0M4W#msHI0b^|2T2sU#*Q8VX-R_|g|GNIbhI^r25+ z5p~9$r*@Yd+pB$&)dw97K64j*p8a32hk`R%88QGOLA!i%x9V?U4Ts01tZEe{?I40264aEACUyY`>$vl}^v~|HGgp zDG6%bHB=;lfT7$A9y!k()3b6g_m1vs7=)$QK!l0Vovf>oxEBU8*aNiZO=vW0_R9@8 zbil6{n7oQSE3%+MTo8dzxp{n913_>Def@QNRYaanZDV`T(faFcFz`**y{k$0I{7Lm zA6H%wY)GYL7B%D$8nkc<(o;hB96R=e+=d)oO+92xv{*T^nntiB?b0F7W4E)j@=Cll zmHJUM^sEhIE(n+;?0`9jk+_mOrue|cM9=#>NpES_tR^U4Ivl0JY8v{gUY(!0ARn&0 zrnlHRgqpn|2m6YBqi+l10&xtRT1fLxJ0T)Qj0R^&?$N#=TKqrJgUY~~z5Pt-1 zjLJ7q8H&lclAgB&0OY?PUr}a`3G6jJ)G@#gf|=>*FQb=HWZ(U0;RVgbb-{+1o0+?H)a2315AxVH9s*bKec=I&w__i z*^cU3J;YKDav!^i-sPV~K7k5TyUWb~fV&LNpBiBAm75-qNVjklI6lw=B<@y?SAPD8 z;{c}Oxysj%S$>SFf@UG`bBsL7*X_Z|cavt~hnG*~?p}9&z>G~%eGaz?A&^?k@u1CiZ}hV~B+i&CSXuE9&(@v4lv0Q>`{anI%F3Um@WdUAe8P>aNss!V#SKc(P&UG_ zcMW-?bRDJ!9{e)`_ZELhODOQl4%o=3+LJRp{QM&&}-J8cl*?)h)*VwZ}t0GIgN>PY} zA!)Z%B*Z8YN>qw$GZHGH6;Z~LJxwKBVaSb2vM1R|b~BhU%$T{JbJbnH`}@6rzvuP* z``oYYUaFaE=K6fjd7t-rpL0GJ(Lv{Ji&EykjL6yT;{0sC=;1;Dmn->EY|1dMAQveb z+WLk}+`2fs%VzbG7v^a0Hx=E51+L8-bB`M##c{4S5`0o(2IwjGSf_@Ly`|yinOt*C zA7;FFANij~>SBaWCmNhq4&!Y~I07GR{%FRlWZ+56MxzxTm3~>h0UIj_3N*>mv-Gp! z#OZ0x*Bc|35Mh7HS^V;?r=?7F8ZK4Ly=!e#Dq7TzYVxFbSTO zlY6@u&EC5MWp+w(D=B*kvcd9q%@0X1;3<*o5B{QPfBY!`{e+~eZS3f>)F{zfL<&cv z93xPfr}je`cx_&~`<+##&xWma|1&HCs}x7nMVh4qoYZg(Ma0F;iAy~`<(6?PVc5&; z{9M4HM&;$)&0dD99~%6o@xQLnK^**GU}Kyj;vrM|rhz*bme}sFRTcr_qJmui$|M=%&D^VGu(_yjkQ>S|ddBBp)KK6J7hR_9vQpq7rd}if_I0 zpL{DcJe^xLs8$j6#j%9DmycS>Gf3N;b{F1A^DIkhSl#{Mk;`LDj z2iF8*7CTM>nfwpp5N&K2f$Fz8aiiOk--iTq{93UZ^vf5yZ z_F2pny}U|^HxiFSkh}W?^4z42;+kSSrup*q;Ey3E8Q-QyXHC&?0~J30(k$_6$!jTU z8g+z8A$O~#*A}{^q2GSFj{1Efgo47dA*wd~*r@K?IOMr-y=gu1p|cQrSrR#&(|TG* zo>nt3wZB}|=V*p`gQ_^tVEq+RM{EZ11?gMuhc)p6QF{RQE=3Tel1lm$(BWPG@XDHQ z>UkWZ!P<$W?@=HTaI*@XCTcjU7mKn@H*ipC75d#pP@0v;ukvr)Jk6=^^namvz3vmeO0Nvkl9k@ZO4MhZnw5hp!_r7SfbCgV(VbwoRVi z+a*cjo&Bky|D9M0G!tz@k#r&Q@Vw7|YqP=pqyrMQVCnp%*Bd6Sm$N11hbt)^x9&Zc2{Q*Wd8wGsaA6>I-o*(mqxsmpq|?vhJ7nPJ@Vtnj~SKz zvLQVhLIdgxfg-nxoU} zy>28j|6nILqSGYdKB5odUWE-uO$|aSp&@RVLh@a5ruouFBOTz*Q?oj6-o8zgxt6K9 z%s$dXO&_fZdNcI4k#x1XI4;UDF*}gcqMUxi9e7XT=lf~9*rEDbEB0uuIHu{ZF?MVr z@{JS{U&|oK{l|TAEj5rk-wMkkDozbvN%O3B%CQSlfs|qO-5WV}8y}7a@G9=ejAXNT znG-#kC)4fPHYw(VM3l{MvRrxv&|syl66On$cRe2NS}TOQ_o&MjL>lbrm}#!DBR-RB zNt&=rbrD)8dI|$$wUi(*yi6RAY&LqP>3k_>dn~pg!``#W#lylLdLnbRWwQxx-iu>+(vZ~e zVNsaFbyTUj7HS(knYi-78`K8A)h_4YT6C>2as(hXvtBx^qNqQUWogR&f*va_#Q0)d zjdrbqj(yfdcV>P1k#d~k{SS-XeEs~2oNb=+ni{Fn$i+l7CHed=_KZp}Ui8qdiM^!2 zUdclVTB6VJ189QVVg}XQ6TP{c58)o%#e%SftD~;@g@&n1=0YJ1Npu8e1oE=kH&cxo zZUsd9m~8HQuq5ZffrGePRqVkk%GlQlweWB7=%lQFdfzXf27*21f^0H~yzwCH@nG!+ zC1QYQ5Bp-{@-V*YSNFo@gZS!*+5ZXQ7=$iFB_xr8of*{@!HbbkcjI3xXAQ3TFxu)k zwI;^M*Z}vb*uK50^SA;!6%HT!C!GKBB{60f9VxB(D@#tpSS=&f(ySUcAkpGW4vH9x zYdm_8L-NIGc+hSoqQi~1c-+JGY?c4gRhITrdvJ*DGhheKjcZD?A2?ebYtU0)_U^;c z&Z4lzc)ZUV=jKcc*O#}DtI`(9M@fU!?XT|vqROEN*K*&c*_NZ+LF%@Dy4exzo(5e+ z&o`}_r?pdVerWM!^Gx9i%LtcP=bcxI2H)YjjRLRT;oFVoCR@zeL^a2~RAv(tvwOi< zJL~QT<@r0`;YsUnnjL@xxqq#0%_#ovKJVhM462qVnz&xr?Xu2g>{HT3q`GfxSuFaY zt>nU~&-)Kfi0%C#T%=@nSljr{DiVA_prgi{W-XU1KD}sNL0ok=0X3=<#aKtfkU9+w zOK9bW#;dlsJ}(`m|C=ts^<_nb&4L7=KRx{mqm1UINR`ZjRy!4oHYkm=bW)T z${rXXUXG#hsLu}XOsQMF@K#1(z}t5AX_rCi60|^*k4;he%~)5%O%ofbI_4_c`e*}e z`V3ci9Y4uJE-N&io!A%27TmzM4{c6<4Eu3E$`N$wa*z%KP*sG5 zfP4l*zwA$nxq%h3&oTYh9gH=#pOOkJpmXbpZf3kO!=S|5j;#iT6P!f!Tf%c+PMy6{ z&KYU0n4v9eSPw{09UdJb$p8F$HGVuC(; zN%}veiVXvpmEEE!Y-IPPUK3a)2yy=xkNmZEzjirgPE!ZbACA=fky^h%|7ZQ+_e%Uy zUFx}-eoK)fcx}^o(G3%+F4ICQ`SuO}Zx>Rj1|Q-#@zHniifmeRc~u?t&_7J{kERvn z=w{K#e?02p_n6yXst612@f`n)db6X$$BE0O9?vT7_cxO+WE-Qe{^iAcSkzCDn(J*L zWhnmpU*W@Y4lUs~TaUXd_?wRZ@n49Aj@As}75qnjl4pY(dG$nxe|^9@C0_K1k>bLe zyTLUFm&|i!eAd``l%Km+&?ah0%mqybVP|X&9-(Yg=Bhk#Vk-Dttjm*xCtNOcIffST zvVd&;x?>k1w3;a#<;ZkWu0G~q;Jr{eJkOzOU7%-`a z=8;YHth9N~W@aYf2a>;cKecs^!>@lDdodBYp&afsWtw@=jH_bVoBL${Qc*!wu7k^9 zhWzkxOmWh`(3D*d_WWlRF}!HLkxIOJdV2KLPuKSZC!~{862~DNyxSR71IS~{CakKN zoTZ+KWT)Rh>ErXQtqk+arsG0K-QCWnfHnv45}uiy zDBnm`HkXrN#_$~Bno*9p1ft6z8Gh(FkXUC9;t0k)aS3QeH_96j4B{W`szyB00_pMe z^VU(pc|zm%ISH%uFn7c(duYAEFDlb;zx3SVbP4Cd3L~@`q`E#9wzJ2WiwCL9dM@CU zVP?!meRN?r_wRZE_+&?)%s$kp5qYyST7cxC)h;_f6j!hyTxk6Cox{Bk&pl*2N-##M za-EApU19@o^3|gauucyqfl>yWeWub18i-+kXl`r=v0j~&>cU65CA4JhX~n*}6>}N# z<6DD}~W>>JJw5>J8$f1C{+iQ(D&Q`dD7M60uV2Tk4QO>{bZmaw`V zKb)wro_JRnoiML%UzC(shxY!%7ycFxmduSbBA>4|5VzeqHMc-9!TC_lW2HO1$LJat zEQtThk>OKT0#q4#*<;BP-Y03V`43-{%?{?SQAb=h=ugBf=Fa5G?F>jg%n_|4{#P*q zqOemUFFM*c5#G1^qmc^Po3iD%9slw|xMAfcVmUvexri2dYVc>o_KFOO z{O^eU2O8T|nmTs?`tDn^a9>(urvp1$5DJf0H?X+m`7+gIU83=Qi;Xknm-FX|Ltua6!vlfXfpT#7qI=Jgw(+g>V*Xl!ft?&CWH@Q*q+N58!e~TGtP`el1l~_Wz>=;*DMBnzEa5i&`_u1hhA_OU=Rox$YI2D zh#Df$@so_mEc8SX8k&3kXHj8-BY8*&$s1fJ7)}iLsBCN*9-*&Dm*~e9uoNCiX;!bGxnzyh27OS2{^h3|`Y{%8gvi*c86JV$ zWB)Pm->(cGr}pF^ci8n;C(ZZW^cpzf?k#YqN%DU->+j+=Jli=6qy(YI3{vH|e8&3W z-3i1;zc|D{TrGJnRJr8h}NgASpMHg#K*C z@B213n^S2C(?{qV4JUUW*Z$AQ{`*D0a*m@PsV=dA0t^*|O4NM6Fnxqr$kPwU9j0FW z?`RIKOn+ARz^o)N(X_@Pq0yQe$OevlBx*nT!Bi2TVq3W_YKaosDTS2o7v3QKNJ+Y8 z&BLu4b?#YVoAx=J|A%Z52O)7MK^O&)iz zKuGVObMT2}5g|4FTQUTtLR}(Z)f1CGkTjZOQbNW~s3n??)L|AHIeESOB+P*gYuQ9S z6yLQb{QsXD-HF$sboS_s@Z(cP48jhG6Hy}y9(u2Lna*z@2ER@svce7-PG_|` zTL3%T1j=&bFmHB;D!yiz+N4g}kBEep7x#E9Bgxh~cbf<;Uu$c0nNjua!e$v7IJbS0 ze#%^0qYImI=NLm0iE_Nk*^BnOSfD)~1(yCZjl`?gtyI~9J(aHpsp8q=3Le+WzUUMA zS=$Qs(aGR6CNb;GkEuQ~x_(eiMXZ=hhD#f<^?D+}zA%|~WhOGsdg=AoGHim*KfLvqslL8O^p`2!VahfY zI&vG&C-6yLE%!tu-%zdK$vI&&b&2csLt> zw0haY*c5YXQ8S%&M)&|QK(b3y2_J*t_OEwarKA1*cIoiGyBF^+;_eXauZ`Stf^gpT zp^~hwkRW7u|8jccwOID!;dLZB?)7WW#bm})M=PWC^Qux7Cs(E*msFOqE_`^Y7k=&k zEobK>FJoUUy;{!f=<9aSw$Nc#9nfkQOAqw56z5w0vuN{+AuYUlUF~dW_0P1ct|B(| z(e>@de2+J5@L`%uF6l^^nXO-K0E*s`FbjeAZ_{O-VEHwW#y=1+NZ69<@=i~EAG!;o zDXfR(cMOhojmyH3wYW2B{~f`lZMC4@VkBY zfF7l(C9{d>m(UjchCgZI{~2a0vBkO810V7m$Nyx_e>Le-;r!#5O21O)7f`U-;)nl8 zW!pUAhx8@3p6c^#W9;^e)L6*BC{Yi^obP;e{+WCks$mH~(|J2O$0OLre!xmOZRD~& z=s^cPbfy0@`_)wD?H!Txq#=X~n0=*N9elN!#TY7-rakR2&W*`Piq6V)2 ze+sPe_AEYrqcjlyP z_zEy17~Ck@er;VguVYlm3gs5cM(K&6Se6U&soT78N4hn_R8u% z5f!p4_%JqsuVx$&6HCK>IT_@^pA=?Y81r*Cf|E)cHD0^8u#V{Od<9K)`Qn~teaDGK z*!b{?xk(OZfC;A8fwz+RiKAE`ZaJ#g?)YI>B9cl}mMAU_`Xln6Re#9VG+s2FSO#Z7 z+;4E@ZLa2vkaI7U-@ZQk2U+>{v8mb-;>p*s!~mWO{K0f7G?+mlK&2&FZ}@Z!M9wQ7 zt_fY|cV5x?OOo{QFeKX(5BIX#K;188r~_^0U*eM0gr_3MOg6FIKXq!X|MitNVaDGN zAuj->JU+(giYY#80zLp~r8X9#&rFX_W-e0`^bBCQ$o}S7Vqn*$>@ol)+3s*%R?vYnR1_ggC^{FHC-}z^j`=9&VD9Ver zsi-G+F6=F?!umCqhQ_2oMs-Jf9;5HO=@?zXG*?-~MdSZSTiNQQOYsb{_|s)X0g)J8 zC)YxG!3MI}yBWy@XPG-YYU|Ote<1HK{DhA*41YelL!*w`te{)JdgGLCTGZB!8V568 zFHZ12bSq#E8bt7o>HdO))Nk-^U>)Buu4d-V)m*+e@?4Em&idYo8J?dWkq;3sS7Psc zc;Lw(lz1c&Xkl7EIjaNzsyQ_~7kx0B*z+!U(WYb1^fOx2<9*nA{!?JZhL~Ay-jwSH z+4lQa%AWB$8fQ8{Co*)s>QwuDWurPPYe2bL8;7L2jOQzlT<6I;&&}=?S$V|j%b*p-rHNYm81}S#B3*K$3bH=EJ+!EW{y) zOibRX-sbYC(BAb$K~~mq&BC(p-@iv!XQQ3Iw8W;fY+1A)+*l!&_A;V#hLx$Zyr=o0k|E25rdvK&U zfBJ|E5qd_Zg40TTSNJJcUqg>)s#uRprwfhSZiTMv2WQ40G5;ACYJv__*N(RbLRF4y z6n+JoQQnRacT6%g#}AIRZ#6&9_0t2`Qk_1NW95lQdy9&BuwPx81W77+)@N?X+Rymr zZpn7okc`JA$qt>xr+RBF5oF9pZ(JAeSCE{foSbr=;MP`KA??-d$4SY{jxfmXLfLX@ zMSTG-9Vy@vM1L}vw z-y}~{IOOCglyFp=vQs9rUUJ3@{GT4lScE*ToP$Pb_dFhlMveUN;lmHg><3ns|WGeZdqESjX~;3MSQY}z)Y$Qp6eH>RpC+7%VjIVemz-IY&#hBxVJLr9%H zDgnC)`PSh*N7_vNG$(E{%7+xP#@2CQObq+CB=>`Ec{IVD^b6@@!%rv1VvC8yWI{2q zKXH(&;=#cx7aIc3H)+k&QjqEK_-eB^g`N9Rn5e7zQ`M06zrfdR)Dv`v?*N+ncS{KR z!~WvMg-DT5(U%zf)-++Pc}qOIeuWo$th!fNGQGtR`h_>4f^=wEKuCw242mb&KAC~| zt~VQRBv7)R5LfW&?;{QE)ZYG7bH+E6I&*XOOH0d`EU&ljh-_JZUROzfpIvuie4D$% zo{lc!8x`A}G03(Pq*rY-&dE1ZTI0^Cyt#v5Z9Nf0{gSRiBuNLW97q#CA}OVhHvg?S zq20-mU0}DJ-srjQzNb2&C~$dtT>fGhKVSNbiOAk~_H11vd#7pq8+UN(eHwH%SpSC~ z`Rdd}+95E^3O`;&`h+O1@gCIukXf%g@nchr_tcU#C2@3_o`AX9j20_r!>=Qki8(VG z+*V=jOz9KMFQ!GaqF-pGW}K)<6<5x%#+-p9*LyJCAz2|hrHF`5lL}jyiUEEl0LI)jXjQ zz}>)OoALXT&CBtvtTBb?Z?x%?eo3^!uh;S@JWJDDm0UNJqmoY!yNW*4G8@TQxq#;& zgv^X@A`k9lPuy#BpHV0IL|#7yfpkm0o|Oz+nyPq+A0`ie-<74_p3Wvx>wb7g^@8O~QVjTlXhe-F+oYVx`dk|i4peT_-R6B#DR}w8Pr9YGLfb)Sl zXKJ+#NL0?wx5pkKob{Dsj~*@8f%|~5FOrQKU#+-g+dwT@`hMUG6|anQb$vGVJ9n=L zvhG$X$d~$YmTm&p^^v*D@+?O)`JOU~xzj`<*I|1w^+a}{wHvjQhL^%2Mxc@Pe?IyA z=(w0fhPcH7YwrAy(s;QR{|}uCpgz`gD|l2sYWUTeKzwmn5M?NquJ8*-lU}3H!t<_1 zF$Nx9pT;eBnX!E1p5nxh+zLXF1gC}iHxm(8TjtwGvb@rBebnM&IW;x4f`NEnRUMt% zFv@zpyeC!=H*I>m&DPd-X7mg`%tPz;&71Q)FJHzXUnqpgo}QDV#M%B>K?P5lX2i0M zTTPuic%r}q*Votg^~Fj4?e3ko>+27Lx-crc;`P~Fg_KUOEP)l~!<-sXuEi~RDYHJ- zz`+KOP*LwH%b-#hJ7XoSmzJUP#UX4Z5yhE%c~l zYkAvez0JO7h@=X!i%YK!x3-{Pf^a_HsK;8nHZ4u>%aW*LG$MKV`Kx8ZPdPaW!R`rn zi}!(OZI@gWI|^=wXBF0-?Em;sRh%E>jgXU|3MVHg^GmDP?Ot`abb72UkjTx?bSEUr zl#PJ53$|+MvWX-~PFz}TKD>CFM1FHiX{oL%-OdFNk zmYLF*Rf)oV-L3AoUnZ1Puk@}*6(*z*t+LhSs?ha6Ax)f+wonjF(45me-!6h+4SlAj zl8ATsNo3jby1zfsGxi?|_Ua?!-_H&&@%b{-^e!(Ub1aRL(`@g)VpzSbu5RHF;4VD?WO(k zD*3v(@z%#aOjj2_xBG5NFeQ}SVRg~Pe~QFVdBv?_{!RW-B(d_lg6^x_b3*zVm3SvH zk>2jWq~9Z+;363;#L0yYKb&-MMbvx}ulp*w|R75A;UC$z_>s$0X2Dg@9#9T?-t84tHw= zD+!Y=*bVPWB*84xU#GUJD5+{`-GHA*IbZTK8y3MV!gjF3$2+~|4}5-N2zCYr=7Dlq z$!1FSo}P;>DR#{13mzU)93kQ8BDdxlsz(oB-nrImjcKOI6pAEl14921=e}yi{J#3V z3YS9^SL{62{3*!C?D-^-qk79Hk{cP=+KT+hiXrCQnqf~ji}R&8;gl@DnriqRbgS*+ zw{!i41gx6u1R9x{aL)=kke#Iv7gtQo4am5~%d8`0h$H@2Q)vGX+5IQfjB_;89SrvW zu9xCTD|9CdVOYix%LdF%PwnXKn(g$*EE*;<#S77(4bip@d%BPCEF%6_iW24 zU};dn{aSEg_4f1aH{d$w+VW~R)cX4R6gebZOnM7~*j?>k!hloM0wbHVEc^NtynHO( z+Y18Wj{TTf1ltCVo4~_k&nT78kQ6&ZLaJueL5Ng+sbs-eB{?!NDFYqMs~ z7NeOLC||;=`Z&znB>3!QAup-v^>~G~seH;B0fa;!UdO3o!{IX}ElQf3?bS?iGo|mB zb0F@&Yt1h*!lgs~?qK?>?&|B2 ztG<3+2Jx8Y2pxzAr1Uj-FcZBXtm4I~3Q=s4!IGywQ*GRfm#kjBy1=97TFYv5y3L*6 z11f(et4}Z=s05F+P<$zcu<*~0zvKf{cc*fDh;|d@9ttL$;a7e@wJUB2_&)5&xtkR| zhW&vvTTf$tnVa*s|9;z_-fgffq$hl@&(Sy#eyKVMjjB^z)Ta<(u4uKwY8%#`$-*Fk)!0*~=v4qN#B zP$QQ)v^@VZ>er6vt@cG{B4Z~5Y+aSPyW%O$=&?A(v4cCJaAl7qW1565E?99>iB^A$ z5(+COK_ELuW_&xMp(=;5)qyvi75LpL59cWa<#nait+x_R(}1P2xT;sN9)@}m=*2x z8QH9Jk$JI3#z^w^5aj_SqAaT=}a z44z}9QVyXM@wg@d_+EHoK0rN8KMf8K?*cL^8q60kokQ+HMJd*kF)X*XydHp>&Q};Z ze0_lfvp=4HUJh`Y53!4!dH-Id({IWc+bMs4f4f*7#yHrFp_I`G78^*)UoeaQ61Ecd zrl-B|lJ`(b^b0J~w!RX?Ha*X+Ed=Nx_IB7OBihLg>7}1xuaVNMONdtMeE75*6{o%y zT~+(?+%^ohyhn{Zd&oG1Z!UxR%Ae!5;C239daxK;~ntSDRP!4Cs$m& z>CMaM)PU7|{QY@_znYQm6eIs=M(R2)Uj9|#=I%OZS63iurV^Ob(oFW*Azpu7+7f~G z5NhmpRe3nSWjBxsQ5VOh*h z@tNVU+4Rwz+EadhD_|0|^TOfcKEmurOL{1ACR9U=?-`7^0|_o4w(I!a3otk|R7R(( zLIWPSMqOuTgr|1+?p22$io+2E@<5TVs)?sF(CO(bfM0-O5H;*io#F$A-Kk0f@uWDN z<)4x6!ZWYnVzlu2+wpfpjcFHv3ASHuvHhCoCi~p3_!e9W&|Lx`rV709!g%`*j9!DY zz=4)_WhE8hUYPCEE@Qy~nEQNSP5KbD52_SjSKtor#kNirq74N2BKkWqyS#TttiTZV z?AcSK9GYcGS*n{htXMSt?JS%iI33Xpc98YT|B1=~?*s2i7thq2R?GtW={rN$C6a`R zJi^#TgFvUJ?KA$&e4-Fix?Gd+oNlWDgDAq9S&nAI+^qh7SK$Xwgz8>B%O*`3>01a# zX|Jd32C6+oQ2i~SEc3ce{CU<32VCyvJqhj+U9PnZk=Gr#5~U;lKM)H%v=#At5>)Pg zNKf*!3$itycieTOzI~oZw;z+Q2_35bXe>GNzPWl@0i96j1L4eQ-Tes}7R+fHo;kA~ zIpewmaXxz%qsYAzTF-6YhU}yjEdo#~xY#c`UNmKLdfW2Hy1q;CfFmzp>JbLx{_48` zzxxr(pM>dASdj8S{KaAm_!g3O#+n==iP#ajmtkLfI9>1@S)X3c)ctAT`WPvj8mRTH zV4B~eo?Hf!-~0ZHM!~4Iwl;k@i_%*MkIdcH-&x|%!8Yod?c1fY+s~B(sVd6gHF?kN zO6=CPdwXT`a{@I2{<8O>rCr%xy~za>5dyF^*e8$CuUqE~2Py?=T^RWXPZIAWqW<93 zWwN)r-Mh)a)TlERDp;(eNC$M4_|F)yqKp*otDN5QmB9JdqPlI{HPe8}`xw0L*}Jz` zT%>fK*<(F_88AD>u-xs)NC)6`T{D%MOPTT9^mwjgbyQ-p?lnK2_7@7RoH|#HPcG&z zMf6v_lrP*Ay_K!7Xr?=eHSw+k9k`Zf<0@0?`s$7g{o`TRH`F7I{86#H%r;YJdY|8G zBT)OA?pWuyoBO1sYAff)M-ZP}Y-5@7AJ1$lY4;56PZd_qB|wi?repvsq*fBuPV}*s z@h=*pZv9*C9rBFj1!Kb&CTkYHfJQ*7eiIk}poVAKY|lz%W?jEpN$1G&FiKbSjs%i0 zQ+UwquiwMvL)56;5WjY1=$fYX%>42&Yi!(;6_{dS>g69XGMFh?PX_ zW7lo5eRF;1ctQEu-6qDyW$MN;sW;)Yl&d3|@4U`_c~+LD$J~IFV!sznRLa`bTqCZK z%O%o-6qGkgsj8_3J%7Fhavsc}SnZc0TNE|L`2hl#$;y^PrZaH6g&>j{17~SKA`_Xv znR!Bw%*xvVZ-ZpoPcM?nc}p$#+S%L5VduPi-6B>LqkrACiSWjA9`eG6>3XicU;)q< z{_e%!Y>Is}AU=*Y3nPyY%-H0eGgz~5LKNAOGC{FB$}Gw1WP+EAOG^6Y@WH08UU>5- zr~s5h(58c;qLMKoiJ*0bTN%N4^pdZ=J%YRdkZ&)z!0%o%yH1Zc5$RhYX~B)SH1PQ< zbKd7CJ41mzsyI#|PDgpfDcqe8w|jyl^-4K3B8j+j3Qb7vJN7zzD?LthI zP$4JZzvU3Su3^a2zS6dVIHuIE;1Q-I!Du9g!LbUCR@i9*b8oBUpf#ZLt%U%$B_a;w zKY2GwnS3M-WPuCUtnC78BP_<NU2#EkA)!{9x)3=z3bbsDS6F}Ur>d5Z}kXGQ~Z zL-D)!?iEg|Pj8`H7Bh!DeG*k95N~hgvl#cq(mi0CpFW9WFMitS0+0kbM`fI-nS>ZZ z3X@jpO;+G4$pc~q{$3o?O-nR|lIXu=_umG-PN%88}w8DW=f6jEz7aR8q zAW%{_cfW9~UP}2`JUmg-7qJsFy>_3G>`wR64GRl^{)*3^-wTZ5;IN=&IDM~z|6;Je ziCc1+WQ@@Pf5Z4P7VRMmSu42WzCv7U6ou` z7p++r&a@dlc~@h(1qH2?81d-;xJHx)XAMvl-u<;(er!zW*fS(xARj$if62XQ0uXhT zomsb-G%t=TDT{A2XH8ZJD9#0nX)tZsJ&Z_ht>6>aVxq2+8T77>NX{(@oLy`0@>*`E z-oQ*s<4|ct?XQL*NML+l5~N%uxR%iud9p869)iI9>%64q5lX5@qZn_=;giWk$g?KA z{fK&G{7D@q!yiV(LK*OoFYBpKi@V+5=g;~~a;q(*655xc7XwL2Lwst>{l2eOFj#lr zKu5kRSD@FM{lux7prj=P@`|NO^#Ezm$-8EJIr#h0EOj@ za$fC$UY%Ek5&C-KBEnDzs8xF*W{H>6?cRbu;NakJV^4B{_rxlsn?*!fI0O=%s-qO@dE)B<78V*F zZn8{*7m_*c19ZAt?N^_W(wdoLjEFkv2)P^uKe_>yN4kuUe97kTzU>c=!$=iUUMz}b zQJR}d0bMY$c4s(!JSN!*B&`I zKC6<;RhgS5w;}XgioXPyQ`x0j-B2*6lWlo!1t^bGeC~#X>~;jn&P}^{-zZWy+pkIbzb~cDP0JY>1pcHg z2SWJ86~+rF?lWPU#^nU%;&Q^=?m`C9pA#l`%_9c|@;Oz!2PA$&CSAponE8?$e6H3s zV+fb7c;N3<9&4 zB3E>YIu8y(D^bDpWy|liZgaky(uIhEl$5b4sgF-*vMQ<6L2`U2g^$l?82{Ru&m%~5 zqb*F1VN4XrBF4ZlJ)np){>mL~-l>Z3PCg9ORb?O0+i@;!c50wl`8p^dDoQUOB$0lF5^1{^xb8Ax zg}*{1WC0Ox0-<5P%NivC8U4(`TZ~eyb?Ktb>FB$@$TpJNp~QCWT>WB&B_aq3l#1@$ z7CZj#A{rKFX1T;2EYmAVm-5b_<*Ydzk7gNgyeS8*l%+USM|G7`Q4ab}h4^SHzS{Uu zk9B}dFso}XY&X3OoF(yAzOG+EpPt6jl5d|{W;S=~Wxnz!IutjISsn?q-)hd|jd;x! zuS5)HcQs@JB*?#dJxJ9achfhdn%5Kk|1>Q)a`SVUG9fSF0FK%XJj*=AZew~Sr`+Yl zTZ53+O6nI5;lm73LtLMmEj`f~gkV+VC)Pe_Q6Pdm`TT-k*2Cw4apPZ~KHZjCg)5cY z;%N2twaX$WC#SmB)}dz60?(m)Ed|v6C>#6OR85m2z)k3_2l^_AoG82~2r)vX)4MM` zSl$FF1xk<@N@Z^5be9F$@%wpugV5|P$cC~usHO{V3go$WMQ~N9=g7{H7JmL&cK-hB zaLw=WL|zf=8>NK35nlDJt*v;a$dKnZF{$)(IEw_2bLYg#+|e@=rTHa}Xk>i0*qbiz za63&Yj~wP>%~y9eD?fG>UYeQ5O{cL|y&UUWtkLV>h2(dYTrsKT$+{OsWEZ15c@B)O zqJeik54|~Kgx)VU% z=qQ!_w*5-cDw4IS{wp&j^&%~coa8iihC`w2!$k|e_}c#6FZp+WXa>>$o1VkGwxfOA zuv=WmoSblUAxyh2a&vRLREdtH@9~AU6;|033H=`OmO2FirDl3d5Fb{XrZ*k6qXewG zUzTbdXK%F>Vmr`i`rSyszkHvuI?rrdPKo9K8XGAuow|kt_mbcCNF2)%$UH{c%-1Tt z5aMh!ae~LflJ=K%3^cUr)fI@im>GBrJ zuqfs&rSO_yC<1rIjng0$r{^16_?fx6pF8&{Zr6*fEHOAY2h!$FsrwZTgM0GV@T%R& zBDynE(lFeCGTrrJ7A-c@<)p;(lO(9VD)-7!+BI2})F#I5`0Gxl42_~iNliaG*gVV) zH)a;x>vXSx0(VDCzT>%lZf8KRE^67(tn@`}YRH1lo@TVG6jb{dkyfctqA*H^w;!v+H zf9bgGZa-rl(A8%r3KyojB<18R0> z5x^gcLQo)1A)%O#g{ACJ%z{$IN$?A-c%v>;@vAg}#YND)AgxOV7ljyVCscNXA9-3* z^QSiTIE0s7Sj{Dh5QPIu`P~*~dUqLKPL@vpo zGCsP9dyh^9y0J{XCg~)?;|tsvmvF9`D9x0qeO@dVsWWw(3xW6~gc#(7OXIq^5h^cB zGq?RMtt1R1AK+sk;J|4rP;!}Y5`^Ckw#Q-BgDr%T+Za>9&y-0Pp~55({riBPgz}un z#+Fc9;PkVOfYFy#AQS=*#7d*R2MO$ZEy+AMx={+k74X_n%UmjyhCocw@|{)|FE8zy ztLd^w$vhV$0}@)Fqrsq8giXUnLt;H(Jnt(gSPu@X!a_ zK(F*a+=pEe7-*j6TRxZhJdR{77rG23uIegvGe;Ey_~1O+qbe)*Ok5hDOcB75f~8Zl zp0+${ql`~8SIUZY1iS~e!bc{7y{enGT;$#33WMFy$Wr0o#=^ubyMTd~; zS9BogJ+OMJ&rcLy!}bQ#ECAI?s6C(8KB2(lf+`#H^YhD9#oY%De0|?){;+dTAnW>m z@tqHcLNY0Rg@4hG6{%o_X%+vWgUI7YI0hr2bf|_lJj~a57i`}$d`nh=R%qLsn zvjYXGd#vx}e5V_gvmRZI|EyqYiEnPU=&)#Rw&m(@ISBvc)%bDVF=q8t6U&mCnKaUM zZjh}hE8RkLaOkUTweDRt@rj3=?|37)RqBo^>Q~EqsmWVNWe_%1*L*_N&`HAnXcm9N zLEL09?~`{9%e-2EZ}>KHTFA`r#K$(O- ztc=t(BgZ*s2TUnL;^_ReTsNT^0X}%M${5ULH zWKBWMJrdfRL6x3+_u+mIgP}f6>ykt+e8bDimpZWtR#rEw--RgX_%K8Oy)In+X*__u zsf&<>*Y|bV2V|hBMz{R8a#d3B>FMH*vVQ(tm9_X6&xpXL6kaI2G(s*kS+e6lT7Suya6_N+EX$9DTnJzGhPPCGh)w(Y(&6qa(mnXGaf%%BoS3u0k4yGmN9^6)YTmSPrS%Gy*_HTVRfP%PXK6%~#|7P^R*!S;#JZ&d z_K)TfIr+peP%ZAxt`}KVp~OmlXuWXHsG#D#8@h=8@u-tzDm1(Jb)?ftO|4G0PN%cbgCw2fzvmSo z@@~Ba9$jT2tSH0PIf9U|_lRhI%I&Ipnb-2+o_P86w=2pJEQ7trR^@uw=kQ5Z>uc zSmPA&L`uoIwF6G}_^4HN60#f7c;B5!7zS%f;*po3;7X&%+zci;OFbz zUK_w{Rf!S6`H|5;2Sm2>%ZoRBLu|Hc-!@}WQ7Plo2#q5nj!SP-o>>h0PK4{H-)>)t zWPbSZv9bwywRLb*jhB1Q&!=O;mUxtlZO30lND)t%I#Z_5m(|7Qqp!Wc3ZZ+U5{rW# z`J9y`5T@UlT&CDu6-g2uEXglp{k-rEw!Wci=4R96{esA?rzK||<;qHz1P>L~{)qSh z$MR0{j^2rMSFw&CD%@nv4h~j}FlP4;y)8h6V%Mn`UA^D4lU{aawK{H_7c+JKBmE$0 z0cZ9KWHD*qE}`qr+l6kke>y zcu%|b4zM{T=nb5{(-yy{+^IL2+a#hEd_1#kMEyPeQUG$E%-=SmF<6|molzoO?4?<3`JrRVjp!bwqn0g&VACg-hD3LwcT3|Rz{ZlYzLC5jXoczzPq7z zN=+#19f^)Y88#3&W#TD z`f6_R+r%t9mpc7S-kx{)i}K95ysNFl$SeO@x691xRR_uVGgq?^I@vLsuXMV({tRlF z(m17tPPI+Yq?=in(H$xChYH{!56$`#XN!fxUr~aFjwJJY6PoN7>UY83c4IErq_CcK z`7tgb_9{0+aE*_9MGMkv*8(Q{?3l`HWl&Q(-xhpo7mkSx$8&DGs2RrQ9+GR@ZVFiT z=DjlG4HHGCKC;7@-*eBOm^n7SE%40%-u)5YN(ey%7WgZ$$d{ZqXcOyZl_a(EnWf*g zzuKtj;)hLp2>Br#By6{SX6mD?RU^B4SosU#3eU*@(QIwQnYJuO#Y#RaW^K|fj=Oz= za*+Dvt?PPc&e_u`M{PfEP7DpB2?uobJZ9YcfzZQfh`?bLKLSxyU+T?^OE&#G`or}o zRLP|VNZKXj^xZSKsv$1pd z>Th3~>Xx>)tk-sw`(COaAMj)xzu8>(t)pqg!(7IRs-6A$;@Mye@Nb zS6ksgZO41xZ3oI`ZeY&a?Z|}jDjEEHy01|&W*%Z zoz(5hoQkn%IjJjMvY_^??dK_bqGbIFBw#|0B$X&{c8wlN8|V@sSCYdyXO2tozqb|o zf2evBXeguqfBYF^%Q{8bifKco$dcXI+HF~ql##VWDkRI8v6HeS*^MMwvs5I^*rIG> z%aRyNjD2a0F=LkBqtEC2{r|t`JkD{P>v`Vy-uHbkulrtlkIQzh7rlO&eA@s0O=)wR zgk42Z-3iRCl-Q$3_k}H^vgswSd#z5Z7v7Y%xXzvI3fzAAUS=k*@8PS%R1WfQ!tkBWnMwzbYSSU*Cntl4unQ$yHVcJ|<#hDWw*S~WnBOMNRp8?$ zDhCZb2>j4-cRfS0>yCQ<*E9!n`?v4-GzLcii8uB({cQl8Ux!+#Y?aqB& zCmBq|SOIws+pCaw|2=4ryrO{h5pn%TMVdB}Ot^{uU3)Z3g%zB3CVc)1^0UB{zQq$h z{E4r+-BpA|YhkIX4n-BQ;x~}5qG}4^IeRBNOMm2OUOzDIli~OLj{bY;mTHDeZSO(g za>jvwS_$Ny*U|9$Bwj$_;Mh*lLS%Y>|KzStNK6SqEr52r2iq3E6=HW{GJuX-B5Zms zVQY}16lxjvVonHOdg%HcS>K=x8sYDR)G-q|J>P4{Y)WE)VpGP*ESdw7NCat7d>3>0q=(Mm=RHc2Qu_m( znM;O;I$xc?4*%hz5%I-)Z>xjnPf|4`Lo3-IgvIviEf!0Omr==+V;K4>MC{&8APoLg z9=PTez?*O>8rXJFUTur?Hb~L?a7B(Zzz*H~!gg5OOf4?Ga2RZqr_O5dWR{Y>i`RBo z$xdS;H$P2f)}T>RL$lXX-c$%y2>ep}QT%>YQ~suV`oib#ir#ebs`$dFwZYo1=LK9x z#|xK}b8ril?5VBfb;C9oHdG z7ik2^rMe!DiaruSMO*m1>K(2Bi3Rvd5u=vfM7GY+ck0<$`hrf>?>#57Nz;XM*B;j9 z=XuqN%eIYBD-Na3558NBl{3w0k;Jk=EAY+w0f}CZqJKu5;V>3HXnhEC*H>R(0&v{5 zf$-lIme0RPy@GVpKhFe(`?8qz)rtK-Q@!kK=)xayo@2_JWkrwP`a4SeR-I|mcdNcF z*_qeEX+o75ye#ete(M9JY~!Ou{bL5#)M+C3D-KwQ#Fn(hR~DxM(0hZc(bwr5j%Os2 zX1Ng8Fd*Y7y{oz^yO7t&*mvc5#q{CJSo2YtYP!_a$2ayf7pnKmMqS(rOzSzH@+TcN zVC|hc-1!JDX4PJ+zSzaW0Zm08 zRx{XA*SX??SgMi8(ygci|FM)~+OCBk25>=*=Ru}` zv2sB@BLO*JNJLuAbFe;k&kZakPMjfvOld zl)HZ6oZW>sRq z#q*(JpI=33UPP40Aq!kRM@~}$%5DlmKs)+#B18^+f6Uy}4izh)(dPp89lB_vyFUHM zMRxQ8(p>@n#WbD%SrFKc;(&EG`$J&w zYO;;ZRllFv{Mhl*y|=R$$x)Fo2Na5#W$t-+O;!A$o-s&5|k>+`9r`U)C^{02!Vl1*32^j1x%wk;4j=PIDm7y3)Ky4 zRjAwZnfX(xMdbry$dr(ke)b8#zJAVU$DKLV-%G0=kzx|`81LJ<1tqv|$r~$bC#23mDy4K8k zNiTs9ur4>X}3$aP6h87Sn*g2xo+0=x#W2pM@m|LMCaNaD5b6%)aR;?&Ut{oXMl4&h&x3E&K1 zKMlCEb~jz}Qj6dhZ(k^&+*&#Iq04Px)9XdxH586IUK8R4G94E@X7MhassC?*@{&}4 zV|Iiv^8%3XSL|v6%z4IN1te4d{%6|Bn>)%Buy?JamQ63J}7gz~SA=`~ZX?jxo;POQJTT^|5VPa-a~; zTLsxWN_yV(3h@HOz_w+n>-(jc4nkq^ktnaaMn z6|mQ+SVg4a1MY#HiFdIf>B4C~>A`Fun^U3E_9@&E_S4=>GW zAfV{d2)dy$vU%E^m?ZUu%%#fRn<5hb_!oTP zEXZ5Ua;lsdIOC2a;8@sS-Fc~VSOWc_zh-5R`XTm*w^-ZPM`qScDIYlio26k7UI6s` z!0(&{saKWY17HydPq06Pv-6+0{HD%8T-@T)L8G5WYnF(m5paA5V;Hh)0f8qU!vXJ( z0_E3Kg25gDxco6KH7w`zi=v#a(v0~`p}5HxRrgUTNw!>&jzREfDh88Y2-Bd65DI@c z1bjiC0LayPZvenx+c}W~&{5@Vx`lLSg`T8*(}x0!|0D%(Ua&kc4N4-AC~h^tLQOWE z>q8aHy6EpYx@?PZac}vG67U~tjA@Aw?{lKSKPR&>OQ&T~ncv`CaHBENW!vDoIsQKL z7dH^RE1bdEiic!K1OGl9&H;oQ*hui&MU6*-$vCP!`VG07!0vj;_WD9srT%?d9#DE} zofMjwqUrdy9HsML+QQ_;h!9xU=OSHWSWYfjOEq%kSd?sg;ZN9qN#eYA4k!3!Z3}SS zr9VuGQ-UK5&UjdwJ;uTNVN}hs`Te-+hfCPa%u@5+^^8Eq_qf(@nH^Hu>3$C`i>ibm zbTvF;A^ozVm_$-`wla~}J}7W`)21-B)wg7=jx}e5F4kmQyn4}thM-()&0N&=n@1mq z3+0>B|MQskkxbdaJ$>$9`WHB%pdbLrhyaW|gWaZUUbaQ0X9Qb)zwvAfn&=(zn9{u< z7#iDg+Zyf0ca!L_Okp^{zsI`Ro#V1E|+JT1$C9jeVH-)IKYZ$6m>zjZ%+5uL%W zrQsovq_>d#?@_;ucsjeyuVSTvRbujMyn2hyVfxE*&WSye2RDCBUhN+V>R$l;hbvF- zIxYu2Y{n$O}217bE)RX0^Sb5DxpK63a= z;h{39T`XMdePB9B)&Mivx}j9l_tr`BYNV6_IA==#FroDgJ+%O#lJfgONTo6gb>#!X z);;G-2inpX=_egJ(%dry45)scjTLN`Gr4Y{xFSdRGa`;_> zz6>KDun1QtpzzUi9lU9KW{o&5`0<~IabB};%`vZYG)$kvB0?M#ugH?)8e|N3X7~0L zqaBVK8?^+C^1B|tarft6#?m;smV~z`kG|xa8IL3Pf)t@>~rj{0aE_gj#>U{40 z8ggk>J&QtU_G6-!R9@d0g6#C9Y&I&s3(Pw-gdK3^&f*H&+i(Cal{JiXI;mv|Z?xD25JdxQdl7BMt`S$i=M~8QDw4#VFZko% zuwP8Cp;&1r582edoPB7I-tRg@6cq!_cft)r0+^AsNA)A&YAyRn3s#>0efwHVrrUc; zLKyt2zG9=2N{WJ*dwe!Hi9}ug9gXheo8fBjbkV^9BWz965;`f3ZM5v|#zz`OZjJ^# zl8Uk8;MY)<$+z8`D*#$yiG#q(HkDjGC$ECzRy@< z{(a-uzWx=#IfOgmi&whw?d+MDhBqHN?}RDdmYbE=88$IM33-#SOXF_bIwDiSt_5A0 zub`I)_#gW1>-eOK&5COpCBH9}x>4J@!6wJ8E)jh9iwKe-yfY-d-7|CJl{ghw>CSFv zI3e_vR3gd0m&koVo>C#m3KR*c$>PWqPgDlwlDNa4bigK~L2J5{RVvo3bUfr?d92pQ z)(GF*rxUc%gC3W{e8>6&(Gr>s@O)$tYFzrEExkDEGhgMwANp7v?gcG1<@l(`eI(lc z)*z9qfa34U@}fXmqlU+5B;0UWSj#2Jp(9k8r42$i1~WrSC`VxLHL@ZUcmuYeC09e~ zKC_cZa^TgMkM9nHl7e(xgmo6GxV27hU?m2hS?$~uzN6K1aQ0Oa*YcxVgD;=2nSGS+jXLAG`4;77M(OhZsx;T$EU>jdttQW( zx06heg({2(|GngPQI`2@sWWi;{HDpr96ciD%&(wSoeMY|zn7mx*Wwz-7`?7FpM|4j zzdlSE*SSGOp3Xr`9drv}S9nD(w;EDN(B)quFpnW*5*;ml?JMGa=l4vg{sGSUHI)}+ zPfLAC4t-ebx~1F0H{wnaH#1+#=APo*X;M>qW41J@ViJ-V{mQ>7#gG?!dTN#qB6MryDruIotij zzN7NbA;>$?+1@|&h6wr|u?DLLFTc(erK&gNRNhI5NAWfWJlJ=oS`e|vDUXUAxvq5( z$UO`?2dc@Ts`~NmzqQ+yHLevZFuK~$$GQo=s#BrB=xHy?U$nl#08@O(RwRHl{K z52Z3^CTkM2RW`Jhgj9Kx1)mX7J9*CH*+KEv!g}s3VTgw43ra#Xm$3viIZ0DNQJley7m={)??LfnBuiTCCuw%T6i4LK`X*e^*_C z7JCz+-sRYosB)~H*ZcDO+<$}W7K50bizv5E)k4-4=1crho;gOHfMLGLCpYHpR|bIs zbvuOZo#^2?4(f$rtgFZ+4)zAM+~sLlnr@~ZKnON6szF9 zYVBd(0LbIY(qN@Kmq()1C++UBWhn{mtdG(R`5;Ug0P{Y|h>Ba=NQZ7z!Udq>-zuLZ zTID`YzaQ;D*%NkG2<2=&HrQM0@cW1n&~fg&)+O1lB-HCzPbpSbQ4jV(!wfU1fp)cu za8jEcWdO|niC88-CnGTHCsJ)Zo)Hi4Sm2sE?i(LCJI-mKKYxPayR6(f8J9`iaf%FuYa6rGWp(z<^D&7`M!sph)~?C_W~hBCCCSf>raTICE4aMsF@x4 zV_Mqc*Y3T}A~1PL<3vv9QXHCA9c8wL+twT|5zcSlCbuC!yEx8SVnBm_*N6I$;iN#46rT;dgS5 z9%W?>%ys6*DY&v>nLiN9)D8FFmT0?CNPiawE?~gjCFjx@E9+Bwh;ukT`r1t&zZbs( z6e7*3{S`-;9)i|4WqM2TAfC`dw@+!`ps6dg?3;ru(8L6*TOVrg0lw(5FVfUiV5GQNQrmcEoJ%g7P>N;F5$+Ul9otM9fw!J%ye-8Ku zn}n0s3J##MQ`JyM%@h zxSl42m%6{L!GGDr=GBak(QL=5LOGHB?MK{Iao~VW6{*JWb?9!2s~i04MaHeM;LDqS z(Yl37%Itlp>%#s<@MX}LcuOaw=3?Dh0jMXe$Q<`mw{K*z1EQ(OSMd*Q&<>d|eAJaD zufhiA`1R0vO$TJ>pe2e(^eQ=zKzyl?X&^Ande%K9AS%eoIX^&*p9Kv0UkGFAid_QUkQv z55gR9YiOs6qQ7;9s!)srkXIP`Djk+Cl;A0qI;+%_`k~~pMxXz>)U{}GIg0(Lp=pC@ z`-!#BN=oYCVL`;XN!feslec*(VwUt!-|;I!tjBHaPA%wj-xmLg?Vi5cnW_49oYHHA z8Vk#1@WqbZ4N6thwMt?%~6G& zece}b@XwX)ej?9`0x>3NYxAET5JoTN&pE?I1n9s=AVE+p(**$J(enCE4E49ofc|Se z$9s(sFOhkBdMhOOjKs zHXi0H4!|TpsC+2(Ud+Aulx+6%Mjuy7D(B&oMfe;3m!k~v3eauFHv>!#u4@@<%Zce9 zGrJfHjivGI`i~*^0)dDUG?(lx58TQAwRaJ&Y2|#fGXq74w>J{vo-yd|9%5z-n~zvK zc0eJSmioHrl6QqcIsZa33o~CL$$rkNwq{#W0z_JsBzztem7B*>#0J*hHIR*Np{1v8 z37lsp^c)ffx$9DzNTW4d=RhEt_j?yY9|G=_>NsZSf(E?MYK zMjOb3pEJaGJV%F^bE=#D8r;6L>1PGonVoU-eUyvU3pw{;2^(3e;F^uzznJ5%PCsIV zVx`PZOBwCErS=tc2QUA7GC!bwKa^`?eKsXN_!c{$rFVfC^I)lmLi+sbxws}%YI>E34?9boIWbv+bRm{mqY#M$#a_PiAZbre8Y@W zZ6@^ui(TA^9@@cbk;e^XTm6}_ZZkWqw>*yd$qUOAJI zavQyn@7#iBS#|bWmtkukMbb?hST;*gr8O?ef(uwL;TwHE7N0h{)0*~_REes|Jh$2o zI3+S&#|qZ;d`J`MCA$mhqIKtKM?Ib?1C4=967)}|(Eb4pg6#2%ZtlV<G@AH~riTov*@n0k z$+To96a_R~fa4p?MJzr+zAu?coWszVCY|v6!DE}Pu{#UrnqB8w3gj$*n-529e?TCG zWQGwo+<~kN7UR&junn?5-@qp08Z37xp983*nM(;z_!b5p`#EMj3f#OZax4ht`vQBZ zBWC_wvuJ}^{enfx`Gyw_xKfrDcg!LIul|$*X0mANuz|;>6;v`-9{GqFVfJ7vJjNd7 zbERK>PlP}qvy1~cKtG#D>s^WbQ*+wG@YyB+*%H*R+_-m>J47Z~`HM$z$rj;$M4d9b zm`VQst>!%9BKbz|$rgcv=v7)KsD8U(y6AIrczoR*Sff9a_INvl71Mv26L{Q(W=wQh z6YuiAa16ndD|k6BbzSU>a%783zNio&-x0wmoeKq<9jfKJ4kCv!R?L7+iV7An?+RSP z;yFl&$O4+wACkF_w2_*y{+8}d6Xd%VtEZR3ifBVZz^i=k2q?-9)yW%nBNH7J2glsi z^9>4ZZOgj{wfMQM`cvI2VonX`H}LQqcin@dIt0d2!QnUvbR3TPU%pUMXA8&~U@~;j zT@1qAMY(F3by9*l`@K>bg%JyZuKaf>ld(4iR?YzfFa9DWXy@vaG=w*0x142qOr~_G z^x#eDFaF5Kl6pq2M; zS!_82Z?2|)g}0%%E=mkJG2$l`Z|-$ z0Xx6wy~)_~or9~0L|A9IJ2_UJLbLL!AahjY*WZ^iuDsPE-<`kO<&s2Fj16Fp=h?B3 zT)6r3D!2uoKbPUnYWak@zN@eU(gC}j`7O||l(F0SL*ZCZ)guSK@!b;ZoUGc&{+v)O z*Yl1>_;oR5&tx4-06C16BQWmkpgU09%QUO4KkjcnvH=}*^&HYqVBrxcwsb@yKCYOM z%P&!f7eb#WKwiN0_Y|>@FrBYR-Z`F*rd9r>1k5a)1n$_Q#UQ+5lvFMbc60wL4=#ucT_`YRmSllv*|n#a`y#rc?6THli8-i}%Eu3#j&E0r1sIjwpIKie_AY-!J!6X% z;kR?{hHV+#zA&(KBIx?xImjg)baOR`S8}^`)0plR3Yp#HPn?cempp`3DR#DS`D&@O ztgPxUynv;|Uc&;zS_#hMM}-bKYN)VJnsnhk#4!p?WN>y$e5tdZi6kbNukg%yNo-!h zBKxGTWU23-eg6{+Kn&1*N2~QMAM8)$rL6vg_m|dz<<(X=!P*hfEj^m`Xq+%-M-0JA__w%{n%pL<4<-U0V?t zM;iam__d(eZ9?%={`40MQ70ib7`27yp|dw&`hIw^K3gX(f!x9c+t)1>q&C;L=B^Pg z=rbI`%GO1n7%~Z7Z|x&breN7Km1;~d?ua_n}wN}>tkmgVF zH;*IT>Qz+73oElUs;fjPqa9w)s>$p+jy36{_Avq_^=LS_EX#L(*@>(wa)ok4gP0s(*_; zw`qg6YM;E?#(w20(+g&pUSOPMBbzDK6iD^sfSPUGW=A2=RcDz+?^qqp{!9p)Dl_%G zUK6O&ka-uu@jC*eV#VA8yru5D%Dshpts)9Kx@|8>a80_nb$ety#DKi z5+ZFg+QSE;4_#VJ)&7(J$!EHAyVLFIhsTWf=BS@H#){jB#cgz3wLQ6ObSP^L&+FYr z^k+)37};8C**TmRx6V~41P{xsquG0V5?uj#cVV&XP?#yI*>}B!w=w+e34J@+o~T6FAp?QaKK9GVu9akoj-Ic?n;)wN$R3)+HRTwiqd@2Xx4{_A8}FViDP{)1ufh zor@oO!sFaEY+h&C@L;Ahv}W&o?P;H05?blq6Rff4`FzhR@*5w3!E(zWIzO42i#BMzsFE+IUFQ|>DA9{qou<%{FYw;K=Y`2nB%XI(~qHn z?Ky3h8e;>m=TptA^?u?<6o__XqGbqgoqXL;$=S|gbdEty2#b?RKEI0RaAxrn(Pn{G zr#G{=9%w&h@uhq-LoQ7?x*hzkfqZ~N?;E@D^~ylb7x(a-f-A(?&#$Gg7UK8yZIZYk zt%O@#P?J>u$D=UO&mV_UUzgdgaM+dGUk@Mi^Uf+AMsz;>(!;%OhfWwqe9lLj!Qiee zwN#<5Z)9>im{h?7IkrBBj>$UAry*cuHP z?p&2i_9@CpFt8lzShb%CIzrfV@1|p2S*GET;wYrUTeIJ7)raM`&c(X+oenRbDMtCwdt=*H}PWrh6!gA%NFwmK74*=^~N94w-;1}VVdvZ8%73tdtQ z5U5BGJ3I#g>p9wZD}xSNta*IErGfZS6IN1f0wS)T8M-`i`Swx66Wf$4P5uUb^iEd! zFWW&M8+0WVnX)MO!@Yo{thju{H!RyGl$ag+yy(S`&~K?Sw38z1$@YNobKUE;ra*c=FlE2&iDoef}Y0K zV@$2en|@yx3QMV~t6g;P7lTz5_5KA!*(+vF?W=21O_j5fiPTI$0rE9nQJcF(RUEX^ zF!&`!9dv*JW?9)KjSYFqN*g8caTHplqsyKHL@HJZhm_#_ex!v#>Jix;PFzFgJq~+V zEeL36`Ril}1BV4QS1-G$&^z78r2d_66F)vB?d@laL~361kgQi_-gtxk-5z1f zEGt*}k+{3gdQZnoqg)PX?ZnNdX^R|qpb_`ykaN_j_TTAi2b5Qp|HeP!LnJsWvaR#i zYIf~agiRES?DYFTZ&+tDE_c^8(QH={00EoyC^gAnAdnR!3FG;f9kF{C>jcAOb_rW- zD)EW1Hn3N_*^DDXk!$rEhwg=T?BV#6Asid>n0Vx?fC@9u060oM)n|K%N5b`o^5mH% ztb3#DtaLuTGYnW}W4@{*sI-qdY|H0zU~&zc>-Ei3kJ-oLoo{lFRT4F2)7}KJkDtgz zzDhr#5bL~Vx|zM%m3jkR_IDwkNdU{mTpMJ_bvWKL^z4c@8LsB}QLwR4wfDjB_7gEq zrL$}l3Qr+*PR-EYcO>rR{GMAuGk?{@Cc6)Y6Bh1eq8)172v|Q@V=IG7S)d&~DJRYG z54edpJ7n$!e?DtY(XZ+P4qE^&`G-on@R$;~exLKm>y~$Ci2U7pR`;HbeK`|dc=SPM zYUCpFVD<)^Q9W6GLYaksKtTTd3hXNyTTUxAIoYjzwwCR|mAcp9Pm=mU{pcfeh%@2G z4%zY8lMgR;SX!8Fno43#YA(@Fw-jukmS?feCwd}A^4TgT-Dq>7H}l(LYZQnwSP1j< zY8oFV%cO!+NR<@I4Xvb+{O)fuE=NP}I(o8#=$qiN6mbWXM2#Sr@4m*mcLH=1LAO=e zl5G`vWvls*+E<%n)PWV$<)ygx&XaM0Qb8y?rk~(lwr(*y_a{=V6Oo98Bu-p-OGWk$ z2eKZS62e2Z2123ddkvT% zBZ;c9iAiTT~%V%V8Z^FYbi!S|$u!spfiFc}756kxzZ9}XZ^f;I3DU^FGmh%JNBF8%6) zocYgr60w2BZ$PN>viFi1cCoxaG1cqFB35k_8}pZTYKh_ARiURq!dGlOdE@Pcxmt>U z@GIyV({K(SLC@sY^W1c9g=2(1bY097I3U=V_si+%V8oFZ=3+0_onEX>8vs&d;xLGl z;STD3Ko<*u79*3UBFJ$gosHAeMH?T#1O@aJd4bI#lc5{fTV{hx!fEMjW5}#?)yH}7 z`vXfa%gfC*>DFw|s7lrl0Xa&-W&*E3Gzx!!-ge;&Cu$3qyk||7@;1P^G)%_zHu}9Y zi#%x>bLK-A50YEt*1er&$bP9_SyAuc_u+u-NJat{=m0|k zqvd$hKPpbzVrcBHk`xu>rH`)CrAwE8y^%pD+ zyM`jYBcNKYyayDsQ2vCDj*f-c*w~}QfCV4hk|Fk=VWJjTuVO>))TvVlGS~{$Hm+;b z^}HK^X{v%?XA|eu9(#837YPrrH zV6=fH0^EfTYACU@Q}w79Y<>xp0f4ZKK;pHih25B3FnsbLQMcE}9e2M7*%iD=VNx4K zy1!AG7YWFF7Tk@13jk~B+`MH^o2`PG6zM4s@Fs`1ifxOv|N6{+d4xAl!i2E0M=bvK zyR~C^`wB=~t$6%0uHw2B^X2I2U(niN^e2mZv7zpVJ27HXsMdS+%X9i5N_^as zhm4GdN1O`3G>Aph*H^c+Wzh9O&M4*vocHU|w{L6w%}j35J|}fcN$hymqR4Z&7Zi$I zi_$^C7MQS%&OCS7P|Mb@U+m$K$HU_%m-JyRjY~}>5S7rgahKBd_uI{33lSYl!mZRs zkhFU+IDyd##syBLJ{REJoBeuTw4g$~>uzWC$HB(qym>lcG;YztnWK&tDI3&rXwQs2 zk%zrGHNFBCR}Fpu67>iGOJO#F6^gdOHiAJ3UgLoQJI)E?+udaea)F!Zovn`ep9u(- zaI@0Er6+X;HDl++qjFJo%}%XZ-StDn*IF(IRZ~iL-aVtb+1g@9Zy<>{ z9BzWIWkS&tjBhOY`O9~0b=-Z8SVwin*DlO0ZnaDA%x`RL)Fnvk{tBk9jx)2(+*MRq z&y@uFR-S}|Ywsn4W^BZxw^~JNRwrsz=<6(|d1-ms%IcH4vIjL%teH48`7N8-Xnv~; zp$*3LItV)mnym(&dOpzT^Ies-@93q$%s~p_2XNvs^90cQ@RrniB;k~7mCn#mO3|x( zV|%V2tW*L-K7$E8<~gxj_o_ac;7T6Pa_y7vwLp9wUlkA3Wp4!C5ziY~fb(*Ex>?ru z`Sa)OrJ4u20ZVh;O7!~UU^5rugPO6M4XB;T@t;3G4}Je$M)~}C{Ej%c0SwTusKnuR z@H?4!haEA*h79V)HMKoX5Bm;r@_|i?BvZe%XzvNHtHED}9b}5+a0yLi* z@NqXh|5*RH!oO>OlyUN6#}~S4WBrG66Ha2o_*Yj-8S*&DvI#ermZS_|&tsx;xHyh* z%)e-M-uVnt?&j&aEYzYj;hq1p`4>H~S5hM2x6L6iNA{75u>U>r%p0LC!-~_tKR}K4 z^TOKK#8g#n}1OUpbsf z2~GlEJfwj~MCBlMdeUi8&NL1o#jR+qtlvL{IsZs3XdUU9Ch(|>$G$maF2(o9HJrDb zS-)hCY&QO=`RLtWut3fTHs4|lgPwRCJLvqRZm)52h1!HGHP1ceDn%j)xmDWkCf>v;8v0A~NRXZ!nqMJEg@lLbXQ%82)2n8VHl(26M6@e( z2mk0oligd=3FxD|;1$sumj@i9J58rnl!E0n6IvPS=yN)O9+JzbN15M5Y@1IAld|E~ zgP(1GtJ-9v@ymncuQ@8s&xs>{N0>z3>(X2X6=j}fN&H(8_c*9Y zmRn)EmvHg6pSZtA-_1-|@j&lnXV=dJ0$1`kP!VBM?Lse$N{#A7jT zO~MlLp~-htjdZ<7%8{)omS{RW|bGLSVJ^(y^oUl%ETXC7>o>9EJ$ ztpJnopXriWMeON;d1YBRtr*anjI zR67_lHjHW2ryM;;wim~1`V?+nPo?CS#vGfz1=tXb8d*fXFp3iIIU}C}v^@vBK8VzF zAzhO5?Dy}ojZpXs#H)9ne?tr-Gd zQDP!D{4dy^AV+&u!wzfva_cg1y2{T7MI zZ1|?fn9J$bnNe5SfGgWp^D?-Qy>cxzhFk8pVg#n8(Fe8@Q;x5p`17flxrW@Jl@rk2 zyl|IvcIhB{P$^XR@KvU}0VbV5HN}nWAP?}jZ*dR!*fvKx>#ltB?l4^~^5#f%IVo^V z`6%MlE%glwkcr-3HQ^*i^5h84N2T=Yh(ROo5~w{MC3# z7s0IQ4%~WQr$JE>>!Tu%r4a$&&I53NXLNRD^4Uh&sZIy9pJ^#AdA+ymWO#Roshs!m z=qln4@|<-11lT8__M)(inXguMzl!18=-6M`oJrxTf;!5fad8)uRhkrKYaWg7$Yi1= z4C(BtC9xG!MgQ@m-Jk+^W+Iw)pA|V=Y)7+uhU+P1Dq9;tl*{pu&GRN;FgfNezf~d^ zznLi&m-1eZ{kRdY_#hLLdG)ZYq{E|=_YuSxUB+~fWC7y7*At{b7|v5lO!l`6I>bJC z&sMNG$Bp+nPh}#;AKV9xlh_CEMXZw`U}-V4=s7UyLhyf7uTH(Zgg^4|iKAI6QVm`Q z^bgefa9!enoEru9kiG9Q{1C&3aXeSPbM9##ttN->1LIpGZ&@K_vAy5q zNiw#n3e47HA-5zxslfQS9jy!?m2$zA2&oV|17PpbfpVICnl_{PFWrh8OqDW*@TH^e z67ZLX{yqzsV~N-rx+dz6s6RdbV5r6ak1TWkcS<7R3W%2+Z~ZL_tTGRVW258ky7>0Z z=l3pIzFRnS{cWj8Y0=+?J38&MV5Ok4g!uT01z#<5zq;G64sq_5G7^sxiDs=6Z|Skg z?Ae<|PMl{s>!s@@L0NUO9m7Aj1}bd5WUjzu$e9C~=?FzXhxTpglR2yxS~>WXPR)|O zPQHH1y+r$Skjzrdwsaz&EL*LXwVMwwXUD1 zcVl%n`go8Kr;Wv7;jud$0Xqxg59~kQ{fK>#{kQtmsYJ&T?b1*|`)%@+^WUaOXWMXg zfYUS&;%guU1i-V++V3%qciX8@D3r?EA|m#X-ONSROQzg~yxgzOZ6S{Cz|V$a9b5ed z)@%wi2_{$Dabl`$fohq|tNIeWlf+X=8sbeoAH#PoA29KTJK4RBtVe=!dX7z|sNDG? z&NSRF9+rDkZv0iT?0V-B0wW{Cd5i`r#+a}s*OxMD5L(r!ooMRn1aqV6^UbmYpf>|n z6R+ZGY%|1Oxn|@bRzqMu=}pQ?yJuMh0C0h@+>c zCq=rK%Yted50MF&8lrMXAc=lSWOP$jE z^q0ru$LYmPZ4{ixjkal2Fg zR5vkd&^R>sI$)$`o!dwQnI90Eahh5}+I5KSrhX0{%68?ldF8r%ApW*st8?8@N2kyv z`*;-8jcx=N2!n%ap7*N(>{Y)JapeicI-wm2kU1Ju6y?h2D&epH^K@Dh8c)#2Q!z8e?aCLEhbE9G=ru_3irIwfY5m zKocuZ?8~k%P0f#tBn%A?ZTV_vpZ@Uqx~**`uCkIP$KE2cXdUIu3o*4b4$v$ASA5wv zEaJghqYe~8mgbBNBFoDjb@8wBW~XvX|8XF6TMbNNkN|qqlF%DB(XP<+bk}qtKQ)%} zKC)ac{uuxlC`sce(5tFr)te>x82-Du;SCEHD3vbuF(#P_6Mf(c2kRuW7_F?eYVX@J zqa!0Dj7b(##y)8KA<|BSLl3ObbVq!`p7xoTYqBq_A|kz`qZ=PlRAj}31BgAjPKNr@ z6Ps~hclCOyoy4^k=j=aeWN%!{O%96?0H5|g=8Xc;4&vc{rU$A`lrsTHz$E*2vL7R7dz%TqB zVi4>6h3_vd&HL5~uOfoCr$7*5^*7FsA9O3vYGs?%d#RFu&)R$P3R)Z3%D#t6=AN|N z{p;uG!@Ygx;!-jay~N;mC+f1ANBybW@{Qo{%s+_wifwHW?x7~@Z7%6Q%rg}{2JX9g zjO@?0d@;4J(=4s_ffMhSHNLL7-kZ-k+VP|iF>c0Vr*1#8GCkE2J+2L+9ACkDP;HBg z9@`r$V~(qhSY}_-J368dKig84U`xg0^oW6!vu{<>cdX`k4>XmcNWne4577)%@nEuJe& za@^_2+RZg}f9-5k_KO#>4{EgcJ*k_II^6s~>~ODODCNbA7n%HEP0CbOOE{0*uGH1$ z4J+eqsgR1I+OGY!VQND4^1mE+QR4IwS#+BGp2dCSAJpnt;-zgkFW9fOHaS zLI}xk`F!8^ocH|x;GD2KJ3D*l-kCek+<7kS#2IK~KY6AI-`9cD0Dc1zw*#zz_9!3I zdKvJDCBq%&8x+tlZ9aw`t*+vc^*7~}n)s+50SrT1^YEHB*aql2FmL~Eu5W8;X(3a{ zBk)-WE_YQXxgHwqcLp`G(&qo~KJcp6JaPcsnXUcNMJi0t15E$ry$ics!z2J6)w~_|peK;=$oL=6>eTUmI`br5KW_?b@dN-wXJq)MTaRY} z)CM&Qr2a3M40zz1Wob!fdO3^jJzU1y9bc=X(CheM)p(P!n#YBZ7QYwx?YeLnFDeiu z8cJ=bxPwFnyFaVkVq58UI8kh|fa`z(L#Kx&{`}1oSGqr#b$_UKm}NZi35TU)Wb)CVtFEL;v|MK+%zF z%fWVJ%l(MazCPD{SWWDvDhzr?MjL+nd!TPK$AQVhGVwv(@No4Ubb}1ynz$}dE^gSC z5?6)}w*QuPIr#>Ut|nh_^J035_!;bP_u2pVJ&b(5^2AC&nOQJLS65|I)B9)j?s&CN zc{SBrY{X5|8*GxB^;`ML9+b^#l@p(RLvbzWOqHn=qV!K2QU>meOxFh8OWAMI%Xub)E|$}`qlMO$7Hw=SK?&kj1A z>=i|;Ev%61JI6tOIZf(bx!$Hlyz4-ndoZsnqa@R%cQ=6NDTkepYVN`sBS8c=dsR00 zlLL;~3du!*uREHPMj>!x7AASV^0&*AUQ`NfL95RpO!Gkm}m}nDL>yPX@U#dNWR-wVm zj>n})&ubc~ME|s}ZRlgGJNanjTTfORL%Z(*%bi<5?eO@K%A-Q@VBYuZocY^C`^TYe z-T)%?`NUgy=P6F;@OHZWeF206ODGk|9};k|a1O~p3q)!NyWzBpM}nH%&Cc1(hj~2c z=_JNHf)hsp>%^unp>j5W2RI<8T~^)hO!QQ%Ubh06hjF1}wWSSYL|3)Z--F4oKaVl&GHAHA**7v- zh@nGPE4FdFPV3F{jr6~FkPLZNzlLJLY5%+xl0gqbs6-hc#P(yMcsPgYLhPH2?*8bm ztel%5e?5{v(M;U-6{``9EkzzDWi3|s-^j&7U^>kRZ2Royv43i-4O$g{2?mto(?%Vt zD=^T&iS32&PjEez8Q>t+59TXC4&3CBw(9!tmtMjXkO)z)vE&$EDC*odvNF;hd*Hnt z-9l_0LO1z>6b19txUaV_35>YQc~!h7o3)M+FHXW2%8`r5m~f*kxPB0f0yzbHS?+3N ziYZ)!qOi@wkKN z+d(IS55wKxk*s8G6pH$x1qr3R6gBoN*0+#nBhi!+Bi>d^g`Idxiwo$A1@?W?YPCB3 z!0jy6^t7Yj!ld0-O2n4-UqbT_eaKh)TDZrpUh9MD>0WzN$b{SZYZ72?Cv5Dea?`9W zq1F1_c&nISJEOn#D0)b#VfP37vptBd#}Odk4ms+Ee*;BdZ0|^+vm4Kk2neDalTL&p z#d~iUK8=Y01I$evImZ;v14ViYaw`Sh(S|gT7fK||-`cu*b>Qrs%J0BxI;=|VJ3gxY zs_v2At+sDYemRo_WjyZ6PoyqS$nPo>6O-55f9{r+m;dF(5a@uDGhHq=B4KOQ!UHde z?++Fp|5Od26VV%UI0w&fTS}Rgd5+3_kX)+w%J4+U9VYy{);YQMOx*})oW!uZ4u31x zRxT6Owf)(aBhGS4^v>&XV&Vh_f3QNqE|TkWVnD{OEDZeC5gC7Yti$p&XZ^!UphXST>_#&KYG!n*qNIDRl-Zv zNc*J-g~*Cr*TVU#6zT;{<)5W5pyS8oio@sQH|H|~j`w$Oh!4}}wJIgXG{^8jSNPQQ zg4rwBER7iph6uB5!GV7lL7sT<%h$_HEVG%sha6&I#^HhZZIC=zB_AC>FmARhIWKQ# z)BrB>+rGlOTHCi*Mh+VBBBG*;z0=#O6cw=dAKNvnuGi<@ja=E#nh4CwK_BW%(q0?n zG>9N(QRty;pf9hNmDoOcQlTG(Mn<(IW07gWl<3dogFL zXilo{QB)otEPpn?q7?-rnZ{ECZTOs^;C&b=zm;D&KcI^t7D{#x3TnYnKel}oIYnsp z#qz=Yj&6XCOvJ;&Pm&SNS7WUTn6obgA6iWi9Ejjz#$zYE`zY1~#LlO_0F>{*9mp>om7S!YW$JVZ4_@Va*Q@ z90*Nh6*VkeN*6}<-fx9bax5_vH5dhmM^X@!!+7kWRg(6_8MO}w1@Ezmig$xX5A4~u zY}^~#4C⩔j>Pfrzn#RqA<5d3;+mW9b?z_$(V-4t4?x$ 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 Ug|BvkhCDz+O-Hpt0w}G_^)KsTkdq zWy53wXNoQqm%0R9Ukf@{PErNdHr7}Lo$blF- z|Fhhqsks_Et31pwZ zyUjq=k0oyQTG!$r5PY4kd-pDk*&Kb^uA*jU)e_Gu7UK z(Q9eR9If7T5z|^NC@j9gEfD*e!xC^l2AjBRj1ztexaRI&Cf>O;L<`RWG!%#Atu<^m z=M1(w+y(IQvp|@-^3_~Ml~h^uf=^-85)zc>-`-|G?yI=vuq2N_C@KTH$%WCNxZz`VB$;dNC711k&hEg_nC);0`QW{S|Us}CUi>kE*_&2vl-vX*uoxuxXG!7l9XD$XrHsyFnLa|&_bD+ z`Zq2u|H;~>=uwHQn&)QB_lN^?*PlmPR&s#8GMM6e8&a_~m7#3=+JuAFS!kACGR3 z?iWkF^Uc}ZNX@VRQ@F{#z2VMkH-+Nha025YNj3Hzto^ur78j&EqQ)FjwgBClC18$+pZ||E>l=8J4>+88Jw|7T= ziqvi42JH&;t9U`;QOvvHaA70WbcEP)?(f5P}yNyn%R-uJi_a z{Z5=boaW)8l!nlsxDdYlj0rYPEv;k`-N4c}E%&11djzaPh>lhCcLD|g#x(L*7|;A~eCB^*lg2`z zAY)08UoeBivm0qZPG(g|M2SmkadJ^+K}lwQ9s@(goZzs6qSEhQf(t%=eWK;9t99jJaWn(XeIgchCnG~WBywYaBhPrEKx3TKx6%r@R zpFHx>_B!L+x?!ql%-@&;$CwzbnWT&vvb3K9Ep_yCaSV}|nw-$Ucrn0$BT=B?L!<HLJE1CB;Y8 zC~DTGwf)}jAHT~Lxnks;_nh}R&;8u@{UpKIP@A5Hi{{$3YxHm(&Bwqq9(c%7Q3Bt; zK6+3CJb8zhTKH?C{TzMWp830ZdtJL0R3O~#SB$Rf z#xE={A|AP@(D%7DF*v_JjIkPj9zE8G>B$dEwp)9c{z_o$ee{@w`19K9be!H&@Z&66 zj=Uc1l+d}iv@%(P#pyK$9?nSQuR(=t*Z8l&H6NM=74)>BzCH~OnLB#2*}392dUp0# zv1sRO<;Hg_Yvk5;fa(Ida>6yH2aA-Viu^Gdx%^4w?BQK#hiGOnH?@Eylfd;~QQR|I z8=qQMN;bc)h8;Ao+7Gj^dlZi<5W1*ZLua?!b0%%B0>g?{!z%*k!*kTPPUkNNBU`f3 z(}7R6wwuuRve59NRft9!m>PykBlpwq7c%gRNlV9oh*j@*$v`jx0~37`m?#Sp@CyhT z_;IS>lTqp>e(4$G^=Uxk1v5eQ5f+VU`}~|I?t;aiSOFE@R~0&}%*Doo$(ztDqSR=F zF;>`zCtXyaX^MZ?7bL)PY67i{!>@yVqH%7(=y^C0tjj^6=YuL8Q6xp9ToCq_(x%ps zk-P^U{SLS(F9d(1UVX!fumlgZdp%T zQLbBJ{3^OU;M$S^g@e#=ERGnM_dYk-$HQQspgH9~;79|%CYu2@VWV)%D|O?_ASaDc zkft4M*%osyha-1Wi!Z9;_Dx!{)Hh#(;kr{t`%^YoG= z<;}qEN$OQpb)ZdIBLT(v9Ob}8SvJN&G7jE9xi#JVS1^tg1$Ex})n8-tDbd73fXIxd zCO|X6GKuR^2N!3+PxWf21uVWQhn&j{H}YD}8Z0XH`S9rC=gAW}Q`OI|PuYf%p&H=P z%0@fk0~72W8VwD)Jfb=Tax@(E#p&5l*OJk6+aA~K9HkFv_xOPC8>%y9%Bo__Rra-^ z3_Y+)xdz$=TM;QM{uc8chRh@Dd}gy_Gf>&Ik4Ky z6vy57n9&f_|uVkK0uwSoYZQzcN#--u`i*t{szLiM{c#Ac9sk&ON$d5Z}D+U&3ZRCmL~J) zi~`>mP`1}@a^PZ(#kHUDuoLAtinbRgE&u#%)5GR);1ckVuW^+%-nRV#?yfB_(9`4( zUu}jAFvm1p$C|hVHT7@&VB4BwHJyE9<83%pQ?@P=XaCq+j#1+w0z`nWt{n#nz{jsH*DmJowVq7YXQ>-3oi9xlyT83U zP(M8rG$7?SJ-up`?>_{=9wOujP_zQCkW)hG0K6e-ec@HFe^1zWWqSlK5WwRc2^oZe z!SUR&UYRjZoxn|nmi0GoT%>6_@Ix+r9a2^eVKYIYT@FBAY# z6jPefBalIk%8<@ap>`(IV(+i&1`LWu6=-5unDVyyY2C1FCZhyf|biBe6_$ z*{#RZzw5^cF9<1=qM`q&Y~U`$@3itPNixN)cJ_fH?=@58Ba#7InMvQ0OrBRMKDsw7 zCG8EA7E|imv2#=QO@*fz=zQ+-l z%tt;zctA2Zb-6jf%n=8}ij>1|pi}BRvUGU&2a)X(a2;m4kyQ8>3JTfe z5tWuYA-F86s6;YZVYkv>ap&7~+Y7X^X-WknxmtIo3y=Cm(v8@VcEb!D*eA)J1MH*! zS{v#tZblsoY}0&_RUAX_|j`gY(@yeRDQk!L+HXpDW# z(tpPtsZhQ0v1llRu^dZxl?j#^7!{Zj(G~N>e|&YQb_zAykqrHgXEz3Y`RwBB^SP@m zb#LR2+^n5Ke!2@M&W#Cn-R*;&!nULG^PeH{Ll`jKBWcWs+=2< zrCJv+ueS3Y-dnV7D2+tU>~BcThX20PJEq%*d*t|=2D|mn0-6R+h{OFlqct4{-o7kN zKCk-TfJPSq%9cohDdl%c=yv%xFitMuWLg{YqGN~U*iYZO+t>X=h_ zkcQMH(=>%^@F{dyAI-zD^vh`ISn=G~Vq#7~r%UB`ltPSIV+jK?cXFI}#2Z6i@>Ahg z3=ujRxm|;|b?$;E%3FQNV5D^6s#BXHlNC-N)?rwFApwbK2u9i<6Pz+gB9GAxT%yF| zgov_e)MF6E!vz-okxxn?m>Nr9DhPRA7*cG%07{I?;Gud+;g<1+lSYH8uS~!#FAXe{ zXTQ{>IB>vh(zO2JUb&kFDE4c7r4u~5bmqHx6Y#%j5MuPSrQ*$pw(yjd3 zkowiIt!)k%4#7Ou&G;Y^vu~t76TZG0acK^kky8#kWU9U=HEuI4XviEeS;wp;ph5Mg zH|AvF)!c|RTPCghFoVWN8H21?Atslp3%=SUiYsu&=w<+Fa=NhvQa~Ya54=+fa+@edmM(U|irzZwKfaFLg$&y+K;_}Zs`cGLf(Eq?)hdQ6=4<_)_k3K)W)$UJPA z`ck`Cn$y}&={a3@4V_N5^1XX@OQ#aKjjSIkSg>d~f(oKcMkO3nXh(^ID?eWz6; zkU-N*tsOoNURlxeUizc{xFhJ;v-|n%QRLrSS99z0r$(2Xe=6PHF0$LSpTeqVFJ|zi zmxW-4tJIRhaJXzs1lhio<0pA4`#@E9G* zjZqZYBX0j1M_X$5kZa_9I~$A|#kG{0BKBgN(3D)t(Jhw_rXGrJxX>QJeA)PW2cs%P z?b3Y2U=K2>o-jtT;=#${;6=OWttMmBWXNuU^C}gx;uFF8p#mX^Fi0j_eiWk_AY~1n+(s2OgkK1o4u2**jbU_c zNr67RIu?Ubd)y1e|F}o}w$Thf;EIZ|e^rWKh9wAgJN(c#tEF)#Hf)4j$U`d)K`X-*NGL6T4`%AOXZ|S26%|jBTWaUmNdMzt1T*L z7U1e{hA@43xn~knYJX3DzwH4ci**MD!h z*4Xs=ZssUG!=iPVH50{1iDX>u9{<^pk$gD|w*;tTwW{?{SPN_{9uH(XW|~2VS2%9D z83`UfRYw`s#nVLFu2h2FPYbGt9F$+R!WnKyjsQu@ZYnPq+kNtjCCzE_V}J$pd`RFr z4B^vGsXe;wr^d6?{5)c}@GA3Swx90Qha=zQzIl8^=C^=$;-|76vt9ErrcDm|vIH@25%~2W*I^5N>30r@jSIeM5Mc3W) z+(Y$v-^9I9L>NFN4L-%a3$G@&?zv(Ux4!ci4IRYJYh}!RJvi?+n!m6;lZx0fPb|ii zTn-mUZskvTx4&ANd;`h7W#sn3OzB=wj90LyRl7k(`F~9YSTs=Wc&gw_OKN<6_a%be z%pTrp={r8Z);iY}U`2omVFdllz963)xIAk~d{WI&F=hh`eA4Wd3?%|J4N2~`p;p1x z{m=VcLACO9q%Xca8A|rRUw(TE{`AH5K()U~LP;A5GQ3s15cIrn^(G{)d#DfTKl=ay z0>cI2%mnbF|IY0=lgc@iHa45+-@#FAKlLLQ`{+HGMHfGyi;`8Ed2|;#!f@L@)SzvW z3+Gk>L4NAAfa)y0a*MoG@>H&kNB%b$!d??@i%yPw&3Voc9*NrWDzEv3}#CiXYQ z)|>(i;rrn%>cpQ4W_JIHMFnccBTYo+W~y45J{ecx?Mnwko>OC|Ww#_j_G1#QNH=X$ zeP@jQ5B*A$47swgSpe~+6y3K|*=Wd3roK={y!$NY?=-;=7sRN-GQb_j%VcwBT^|#c zUP0(i{w)1_wL}H3`VtcRnZOIK!awIzKi_92lfOe-Lgm>HLzt>vEr&akWQrrsZ$}=V zU1fZ>y~aqXwsSeRvpX2CZl_kfzpkwgBwtejgzfZ~fHwU5Y>LLeTq)*D!&CFdp2VfNJr#N`dI4LPPu1<1u=;@CUpiU@}EaAyOuY-lMKva^USbDD13P;?F)etD# zU5!YsW)30h!iHHX38AmPrH~$JgCRlD!%EM&AXb!XP*MEO87q(JveGb;VLS4{Myeg> z3$pqC1JxMD^09)kpeXnMcwOjd;+SYOSHW%7(gBunxrd5) z+~=mJPSpG8<-;G`L5(U19>*ta1Sn8yp_EpFu9$$cWpcVy0Aw{PM0dmAT9k%N*NGq} zGCD5oi2U_Y153SPqF-rP78uL_YF8ycXMK9oiY?+5*dJP-FlE#K;isO^o&5s--S_8A z!CXQ_=FGtu%i6v$HEpJ7Xu|t8%B{xgEFGkQ1QCLHz!Y8P@(>vp&C0RT#N5As;Iwoaiu6)e%*V*+9a!jdoz5%MBVDWqF&$Dx( z^Us~0*LeH8eeOev0x3djXKUI$K0T{^SGneMK{sat-alnWVPDXYO(tUwKHfQo7GcZ=>UxFG)CxTKrWS<7-E@uH{i+N#`F8sk<@fp{Br;>L*_sxpc zf{*u|WKW70Au1_LYwD+y-dF6!moV;XL0Z=O_ZYY7n9C3Dj5eprl%htvTzBM1kJxl6 z$OdJDiyG=ss%QK6={_byLHZ=k0ok%H&Q)!r>6R0&#z}D>o+a@KZxXa33-p(P@14(u zd`jSsiN^<@ji(R3cu=z)P;6Gu066i_Y-I5>8Q7RV0b1Py_W8W)nJN)D*Yh_|4*U=< z+-BT}fAN_0_0c`=G4+TfuNI|bNd@9tB*=ftK%|WJ?{>RUZTpL z=WI~2p?4w}4kvvWr?L>q{Ka|c&^JQ6Bdr!1hnw-A3I)TX8Ka>@i&;F2T6PD#s?0HhjGthdvmYiljCm zoopyZaKaG52V36!v@aNGTI_d6rXr}Vrv}HH@t+J5i_iL`$e5cpnPE)mqQ_t+VPW8` zL`Cn6mO#_N-|oa8S&~gv`|Yj?eK{dVL2|C{B$M@BJo>@?QRa^d7HtAjPX61X@!GrN zs@wZtKw$BOSspI(U-8vSJs-6Ih5#MCJnFnky^Q3peT)^}czlOtaXDK*ec?a@wj>-4b7R5q2*FYda3RCma=7C`ZmKWoG3>C??;5Z$>=5#DrFq|Wi5=a za;{=-nx8I=(j~Nq^Mi`Sa`5#GO@u~<-di)WNZ+{fwcIAXbm0QN`y~_BH%o+QS&>Ky znOB=kv1(-p;ijarIh#jJ%$Z$?SPLrFZt3c7jV}S*05!O9xF9efj@x?7MnURg+RCPH z)4GWyjpcMwM_)_Gu>0Zi{DP)s_Dw@X_Fk_5{?{8$wx*>FoLF#?qs482OLFcO`eR8( z{QFM7Fw-SesZk-$M4ObX`>qVn8d>aeOuFk?8MibsJrk;d(#^#sgNZt(Nw1+q)=MsA zObm`Y3zlF^4l}FzVmkaFL!!Se_)HRo1z>SQmke%7Lu0XDJ&Zk=GpPLc{iEM^IkDOe z4PE|0F;lKgaRLNWS*6)t-#q`&d=Q#7Q{Gw|A-~c%mzk2{qF$9>9 z$n(zgrO0PD_+!%K4HC;BEyq)rbL!_;PHl_koqzWg&8HOLUzA@iRW{F7` z&fby6C$4%<f^;&a}me^xShHaCb8j{WI4LI(B2INMhzi#{NBSm~1G{q5Ig)v1Hu?$Oo zyOVmMU5xNJa;@>?Czgu4V1LZm$)KN|1Mit^8Cv@o`RO(xjk9=bY4RS#UHE>@XJ2X* z8x`#Lp9Lnb_TIe)DYpOx@i@sNQ}D5>-?(`$ z*6>RvIp9`*t+g{b63K+oKw$MpZb5{zNf$REEsx4($-t!$e!52@nKCFYpWS0W({7jy zPZ}E9-Sgfbl_R@Tq1a*8dazhcUq6RW)xMaJgU@B4PnJaaBF@fF^E=O1WzB?>g(v}T zGWhe*2=Re%&)X?(j=Z6@^Qg-`NkhkMXo6%}ZXJzpWnb8{f#X9?c9-~{AxGR04Z#%0 zFKzf897>9}0&0&8&W`a;%szLHHYjmP3Ok_lo5Lv0OrRpOcz)hHhyuhXLyc^N&oJmau6q8^`Ri>FY}eWIvs6p-icCu{}C*80Q~6 zYA4ZqLD3>_+6fPfaGEb7;ieGZLDgL5SXza;&d1L;vdZ1!wi=c11%2t=yUR68PeT%< zx&ctWSm89}%7NJEcDQCb?88*Oke)Ch4d4)9pf{UbiF*{7G}k&$fvllxtjMzIS-YT) z(e*Azu33Zq((x^rxrVTcB+sEZi-#VPdohw&1swo$;M30wem&h%i0`G@tYygFuwkP++mzjN_WsR zEw(eNiG{=URgf?QV}bh}P56rX+UGeR!rNbMi!s|*)mDV6c$j~>8sl>ar8h-ZLKBIG zDnwa~-14%2PWBvS=q|MG>sYOa}m6k|-)&4|o84A>s`43q$iV1Spi z?@*n-`9_h)tx2Q*5;EzKCWGU2FeD@4tG_IGm%S36cRABQB4s)^3_83|8<)F7-_2;x zu@YxL0ME#R!BL>tWvLZFy27F#W6>ziUcu1=jj89tqX())S%2%%2I#%316%~`txBAU ziyG%Uf=?kB{tlW5!2l{puji|oH3vmAgglupWGGsd2qE6+{=i|Qqjbd9zI884Cp$>P zw2zTOEpd=ySq77~7k;&W2`kFfqP3LRUgcZHd7CjIV* zj2Nx{ri4E;u*YV#A=n%S-|72DPm)kT7ryg{k#V z$d~f-ThV>8fLd(TI!=bZ%`>!NYxYGp>0I7Gh|rx?4zy@v(E}Q3I8Iy%Fyq-q1Iu>a z{kFE6_p#7NC`MtMR z9hj=1Y(RKnxzKLHyMs2rDpgR}C= zCw9m4$?_JF)@p1g`-8d0)Thx0D;{z`s>@L+__tYExjsOeWQo0QzTMV)(j}CT8lC(9 zUVsqudlojd1|&F%oJ7bSc822Q8E!{B0DXNskspJI!9$WxD+_p49aaH7)R3&-hq^3H zl~~nCyD#T-HMsgS>}d0k`Y9bsX05K~&0EXZA|2)zJEYmR?%p|e&C4vgVSq{wn-?9u zyYW2dN8=3DaQRaX1(CXsc37BXXk^^=b3WD?>rL+g8;QBi4xf7BvqoWz~$qF%Bv~8^Xi?S7b}hV zQi8R0DS8hV#cVV{ZB!}r;Ck~ zfHu%IeS3JDGQ*fr@7y?JnYglazDw;@mWbol7ZsxHPpy(~$+fu&o4_*JbV<`;RDb*L zs3ot^G>%ZV*b_L4e<_$js#e~cB6|r>O_2a`2cY@?Y%)(AIto&Br2lZmSp)TJM)TtZ zqTWOQJhYt3CZH+Qn32VyY~H*Tw`T;De>|?_Etf_E_NXz&7?c5aP*8=9-2s+FGJ)5v zO319_D`)Y2A?;@YW5v`0muK9zC%@N6zZzeiPT8I~dxz(5Z*U#_a+7zebUkhmAazko z%mhkSJ+Pk2DP1VoTOg10eYi733n0pbug8mwD5|!QeCVhQU75S59DTR%TJawf)N%rumM;4|y<3fL>G+5siPsN-_m~UG-a3 z>Z+YsFWwda0laSa!uhMcUZy9CwlGBrLU`+etGR$`*={iAmEbL%3tj{doAmLFTJ z|NE6sfUjmXi30pTzUyQ^(P+)KV9d4Y__B3=@z}N4tojimE9~FQ)y>f&RlCR?>Mg^Z zTaoAY6`JbDTYAy>6AS|apJA0b!9W; zv;$}KPj4ojRUVhI{IO*JIQa%j)Dt%4>CXz*y;`Fl_7djH1alH=-*@=M5B6SPvcGy< zRgM?W!=3|SnPJiSU>T|Opc%`nzE! zm{>r7Hv60jt6eU{gV0_7;C*)n9C_O5R#xo~&G{c-6xbFD8nCnVP=EUV)Sv2x$AoTr#pc)OAx=31w3>=gicphR$B3QM7isY?nqKuj z(khP6_LKhpVE9$qQfzPfCj**Q(Zx>n>9Lk_O22~|Y+x~?q7<5reqo=dX&XV879LT;aAzm`!7 zQ75Ilp}(vD7FEAwOU~2g>F?>{f$XWKz6@1wOMBiuq6@2?eC;zB}6SZWD%i(B>^jF>BV#$780#w+*FTf^@7Jed> z_W?rVKU+FyvoyFm?+Da5tQQa>a9WrmYp)#+h|+{V_)?q-!DN&|OQ6`YZZWS~t@c1( z$13IUIfxvW0j39FcvF?a_BmU;q;IFb=dEUOni^FL0h_EXlOQhvH{jB0&HYg=cD7>`=ZsDtkd@nwu8 z)~RWy?FBynEebHej33zTHMD?c{{|g-L;|S@p84wF<;@9G$J&vNzt(isc?`8$N)CWA zAuQs-@@Uke@191{Ds;tU+;wE7k=?cC58wj|wy9W$5)rHknX{q#@v9#u>qxULFP{K3 zKdUycs7zcPK)&@gN9qP{iD!VVar1<))GLlHn^Uf}wl|k6%3N9dxG8wlPLt&R%0S}* zp*yDZSFE4&!7OU_RLl_?|0!;>Yko)83 zbDSniJLaGGx9?7YLYBvHSl08A@6+54Sl)iS)PyDma1+*AMk7tB=R zzKlw-=juV|^PH##Jxi6VE?RBp3*+wJ3p#212viWG>KE7EXVG)vVg&($vc*&%g-wPI z^1oP`z*-_Dnc_y(gF999KIKJ)Uuo|+%t(5NAFYm=W`k1@$gVa2V!)&)zE6nJ6NYC* z;GT9a2Ftf;(ON6!(v5sWb`4GPMz3=cOy6*^vWiO3;LG_XC~XcI8N*oYTONG{RfDQk4Uaul$m?EfPtteVozu! zB@i{;YzF%Rn3P)h^KPL!_rx*3N+3hO1pvLb?zaxe|DzYn=qaGKtSh9)q}Y29Clr)t z6m3@y{zVj9dSvszd&ZM<(w5hr$|e*5*!i&L$%g7TFOkTH2rZy0$)2hA@j2uex-tCj zeSr!*!;}Gu1>6$Nu-@$s6tBk`^pNA_}yNF%x$L+-48{Gk7iAgEd z%r|N0PJT$0a#IrC;%-IknO};)5XwnjYi&mpozeD|Z3joTebNRG7Hf;oC_pg&n4uZl z3kv`4btClh@~GVRY0tRMU23x8#3j*Y8}9n{E(@kV>h1lF?AD$i4Y6ooZR|N9 zak17rgi0rYG>)0uW1oJWVV9b;i?C$Ju*W}B7>G`O^UI9Z# zijQ->wqKR*g+x0C%UN23D%^)gMn@4bUw{0i2U07+EyTi$K2psQkU4%Sj2Qq16RG|_ zc>^Imp}y5KNXtue@4Y|kk3c1+rCfj?^%1BdZ(f`jt*R%M$b-BK(S=}=1OZWy=i(#^ z3?*WC1c=a;yH1EZMQcs@PVbFc11UPCLb zv0@W$!O5-{1N)mN@kGf>UJrl-7n#;y-aP)ytyS?3-oW$m6V2zn?QV=u9$jwo&F0$Y zJoRz*rjc|1!ei2u)#u7|ge*PoH6Mu#|F6b#2Ha`P=F-VHw`?wLgb$ZQkIz?tnUNjk zur7F)o3i_ZJ8R(k=8?KqEUvsO$xh9F=?5(+L&N21yfo%Dz2U&P6X#L2VTWev9I6tk zhr4jh01H|rS?KrsPu7>-dH&`hW7?{6aFGmmAqx~&v-49#LfEo;MiUVWJ54+hZgb9a zo&cee@m7{eyX=0^Cuw#v6=SnnW~QDqTBHx?GK+Eb`}_&vdDZ6M=<+4*O~Kj8Jgwg~ z_$AK-+Bk>%#Xkw$CNzd8PfW;bGC4qmXUyxy@t?{M)VTAXShf1ZZ*Qn5dUy7?duK}A zQ{3fYQGWexv-W*U6TEENUaezcVLcqvmS-MX#HvrkO`^0(5`UfyFuUblew{qIHjsyt z$xnH;%I-f|CusT-T&uEHyD7yyLJ9VHkiME@sWa2`zJSZa+)GAP-R`^kuZ49Zi`f=f z`?Rw{zBR**A58|#6fq<}_rg2-8hE)h4On0+P?b0h^4&QMxgEddU@z;sk&DPX) zKJ}7@h~$ulaB6*Z^G60+WB^m@Rs--xn5+k8YhG5O1-C4|imc^Pe)ezasX@n{4k-Xz z?p#KzRoUuk-KqDY*;GD3k4dj*_mFdVLIRSP@N_0CV_{`hQRf_xLv6hbsU;(qCb^V` z^4F+bbxyck0W`R z-=mkCeKYyzf2dMj*#+<{j;oh{3@!}#_z~1=icVh&nXoJ^s|1#5e7kPUD-Z&H2-N9q z9Duw7A4g9D~2hd8_(21x%MC?wHWCwwT6GHSOvz0}Y&}SPe>+ zygV-G8oZkUuKR0-p8l=E3pY!PwUhZzXq1`fqZV^K)OiU#G{t%ArVdO8%g$k#+4k1C zd0eiyHqau;@U_(+#~BfnjVa>M-+@d2Q>P=$+MN+ z#V`YWNiNn}IS*Xs%0NN0ba3CaB7<#2gp6lKzz7WZamq|$NwZQqg2hV1gMDN?{V=K* zf~-lBh6AOXcpSp}=s||ml%uXqV)mTK(!quMaQdc9{>V4E=VE^3DC`=a+5@U84SP(M zD)GHRww)T_t6uEoKu*2e%;s<7N__t<&Hp*f6+I5(mss&u->FQ7SI&`B5U zyrjmDe7-M4OM${(B`}Lo z-M~N{Wb)IUm4R$*(11~Cgoe#)--s!F_k7cUtCj(tXZ__V3XuUzv9-~p_iiPkfsZA{_yD2^OW=-|(JQjqpp`d2S$y`4z zr#>F<+wIL#k2FFp0@~4n65_IPXWREX{W>1mXaHskhyU(7sjiJ#{d^#0aMz(N?-3ip zCp@(`nfr^D&UFf)-J+yQwdG3D^ofLP3*6;G#IWK8F1w`)zhGDyv~+v>gHdNByuz~5 zl2tzjYA_&}^LJl9PvRc`V6;(`u`<+TX}LGBnZ$&5eiwdbo&M9HVVsm!w#ijlU&Pof zv=4n9nO-K%pYo`0Ng#1ku}Z4O{vMJ^``>*K5|9{*BCdp|r;i)AjjlTlzk4g?mDYFN z_cryCZw4bwfHWq&bgA4J3!n;Nr(vh3e(~;Q$<|NP&|-+S2ETt~`b0q*RsZT}WR*!( zqpMVn9WvkZ&vwGkP&py^BC`WlW+QODn6H5lp7VE+E4IeooIAS3(~MkS(FipY&Q0`9 z8-&Xy=+?s8KRu|J{DObgvj+PIiX3NuLe>4*$CHxX#j1#p(Dt0W+ik%#-_vu)LHYR~ zOsXkwN84~uM-0HppjKAFN&;+_*+bLTJ$s@JP?ca-BO^srU?JNw6X z;s#v6xm}sE{@udL1}F-}n|in<)7-P$Br{EP*3g>no0hi`eSWo1y{q)L1{YQ<0}@)e_jO+4?EW za9``fFKoWs&xMXM=Y0EPry%=vp|hlpf-3M*I=INcIRm+r^19gAW*-ZaKE;O?>Sz41!&{WF0q!O z$=hRh!;E<1>ULELP{$ugg}{GG>LFU`SkBwtTK`;&D;hmq={Ah3%*~;3Ps@cPTOpC?;ioAawHh4M zAa>D^^Zkc}r{}z#{gH~x%`@^j&r6jN=erLy%;Yu-pU17<)OM7gVZfFQiTpj&KY_*Fkg?x2(IJ;YzL_Y4e#dYLdt&_3bxQ#%=kUrw9{;e^5IF>%GXO1xDDxE(JbOv9*{h509$A3^F zB<-CCuMCF1PrvU`Uyh3_M!&s5a-pqaT^P>XMc1y{n{V)bQ*R9y>orw1xsfDgRKoZZ z3S*kCa<4V?vj>da9R8`fNpYH&xsY9p>6V0=^N8JNuxmU=qneZv=y;6`Adm$mWG@cL zN?fosnAPC5IJir2VjG0Y`H{$yK;7nJH)sh5YpKQO_}OXDs9(BXcPe7b*h8ue&_k@X z8{NNZ-N&frr#5DSA1dmbee?oUhOp74y>9R3e=DIiHD1pGcdUz4Pub=Rnd7b}$2FT6 zQd$G-^teUe^Kd9J1n7$RZKNKtWczgM=bJfK!D^M+GSRnrgX@X$HMXtVC3#9ICL0M3 zh6OQd{iE9?%ej(COJ<)Z@P~>|L$r;gC7vFtM-^QUiionV^4UG)Hl1|{`Wrp+LtbC| zO>=#L_BEe1-~IFJdfbXA%Na=_QGPM;n`i$}(`{NW^fSPIxGcO|)Ys|i9UnY>UppDw zRG^GFz0=9RalN8d{r>O~n~44|r}Sou^_l2kx1ZktL#Sr$r-Yi+iviGqpX#b;L%SOxFWyopc7w%#AsZ>ws^SIgyXopkB_$4#Fh zx4L{7V_7!5+IgzSV0*uK=5NROd42Hlf*xg#HPXNM$0wf$*86m^>!XihkTQE^y*yW)J=^ahnq9@?aK60pLmO<2Bcqtm;+9XZ^$ z&27s4)J82-cIe>GsBI-5vd~ZzgwniPU=44--vfZpf7n5#+=l{$`IL&g+@asyfokkFZ6+*h+zh-dD4gIx zkQ2t-0GzA#xopWPIv;E}CGp7&g}>>6Evjmod^@?h4A(H$3NX;qF_!AM(x5ua&|r(# ze36KM8{_jJukZNxfh}rYfN4MR87*?-tyXNNdFnS)Rv4?38`5NTT_0}tNhwT|gWU6{ zbb194K4LyRB@h~v$WQIYkW6>S>%-D|_di9`S!A=l4;_5#ji741--63@`Enl#BIpQ! zDEPw8sV6LXyWa(Ew%Wgv9V+Wh5 zinzI4@5qb!UL`}5^!==L|7d%Twjk-kC7}kW=xFSRta7oborqVZ8xVZlW{bm6X?|`a zMayVp|1>c^`d#I^X1ZPIP=-EWTqR^FrBMBpaT)CZQ$0%Z)y>3FyXE;^B&SN>ap|bf z0?X*u1WpE>9@&=gs20^{ps*#`epiq~V<+m!g1fvncDZrSjDHK-3Nwg{O>KwkfGSNr zMy!?%!LhLuyf&)G!v9+9UzGxuWN8E1sltSp&TENe*>3xXo1NfMfzjT4R}@>(s>3t` zEqCCUzh8$a+dJw)U60qK3#m2UEtWU|Jbnb-1i`##t4m*<=4n{Ua-$>$4AttmEhP#v z*laiao4gfch3qIXYaG5bSJ&3kNy@fNT={Y5_RlNKy3^N-`S7?>_w$#4e=W=ynhub8=2!b_K1%Id)nL(zVh_Dp%!nj5L_xg^?r{#mO^JwRj=Ty%kRxLGMg zAFE~jd1Urh8i=0QL_wtlPs2n%+~M#Jd-y(rp5(vMZtTX)q%UdF+9A5o)&hU{Fr8iQ ziGkLIUP{qyyrAQ^9lx^+qi^&#iG)|B?~?k+gO+H|-HQ9Zs1%8oj&EMfut&iE=%uphR zfx4A8v9%azHP#b>yb3HfW>Typ?;*EJ0k|L3<{(|*CI%+6!th*+Xdh9W!qGje$4foayz7EuYOVjS5VijmQ>Lk zRd73^ACnDV+h54w>1eJ}l*cEV$jOug(F z_fl78-@LTco26pHtP+Rb>Sv&ts@=WRO97n)r3vM^egba+##qM*MhOS3y%8_a_s)0A z_#A)8|6v}%aVij?=^|r4{jJZtYHhJ-;4ZeTy&i?;R6YBf3odwECFf&pUSv=iSqVAp z46kb6p6;4IUyK}rrL+5h+_Ew4&B5A;O3PbY-WF*FHleY&HIv*)@xOyR{6fUcYH{tZgm(g<-=2^qrAPARgny|D<$?IKJO*Q zzjdZ)ZZKYUzxTh_v(hKaqE|6;$-UM_2>3Xt%2cao z$*5U19NyS&h;{j*BLqLL)3bRsakTN7M^u@+HI(Q6SxR={efJ6XlB)ep-V&VKsnC3W zm0KPg9xrJi(r~pqJk=Sz3c!muW}5~;pQ&6TOQF%1p8heLek_=>H6Z zHs@f7_iJ+kh?|W>x)$xj6x(-g!7Py~{G)fVlK}(1?=#HAOHGE}-)ZR|)yd?jZhDXc zmex+__k5PJ_5Gb^dVf83xou>ha;{l>F?pa+93|IXXfWM!5%GFR9=PGa=IDfPyl;jU zebBJq)0h7Seq(hf3`(Un75y>M)!{-YW@`R;T$zrs3^GseNiOz&Cm99=%>YKw5qfpfNFAc=+P$@jhrYpSAwUuKDFwofMb#O0 zUyv0FKfu8@qdRIVj6>kW|LKSHl0QoAc_SJkL>7 zl}4k@;|HHnYqYpHdCua-4GgDV9=^o;q9_Vk5^}iz4XazXsMOoow%}H&n!(A7@2E5u zP!wJ8no9VY;9toM&R$^H4&9@ttnJ*P)>@n&P_LX;SrT&e>{}Mrcd0fPkQJ5A!lLlt z_D@(^+h%!n16?<1G+W%bd0TWCq$%;_jIEs;O#8KKhf_7nlCS=Du4$ z{AqFY;8zz}mVM!S?gv5OFRZMrDxo_j3Bm|PF2rhYR|tHc*nDNE2pl{a~QDhlak;u}R@o<3ej_IGhBF$3KK2qky(lje6i8J!pBSQuX6j{b| zrzB-;$D0oDCq0rlW_9xhc_vb}Sr(I&(%futN|I)@m$yaQ)-+L64c*X~47wDFPnPB+ zNd$RD70dsW&1Qd=X4zjD zc4O`I`PW>YJSQ$s-&e&FS(Xx(HHjb*2UEf@M3w~Pz_x9oD8`-5*u3>#39-=2A~S`e zfJSGP{rjJC`s(}nN*qN|iJ;8zW)spRLRB>$e<>X5S(@T{F1BTt=97@ETkj*6EzHyD zv~2t^X>?XNdi)!@NBgLy(?5!$d6{kK3)sU5iGKG8+jbZZ27-aFs9Z6m)^EH^fgn`t zx?WPYtK{(lPw#)q>8rIpve>-& z9)@XSJ0b%&olc3P7){f8^3`8qng(f_qn0YoRj5)?B>I;<9LIUR?y3LV5C73W``6iD z{JVeN3p_U)^p4oM{VtW(3Z`j`p3O2NpT-eKPrpVg3WC6A_4->h+Y5}xW1LDw5yHu!kZS^VFp*%S^^2h8HJPS{vNCb{D%+A@IeEnsyJ9@~lS@YZbLySd`J1CC3X{=*$>5BI^_w`&WfVoDTC0+0r86oHIDC2^T~&!f zpKE&`f~>JCN%KHs;QM&v3x=0xtZv;9LxmF5K#?&Wp0m2MM{8*lNfuKwVc~NL1CP^} z-(gfEk|gH(n?FW31$Rr+4Z<)$0tUS!rlTHKtwWLs?X}fvF&g$6UY>CM?)&JK4yI{| zJ_AKzG8vP`p^*E^vGC5lA7WZgIg(B=bOYaa8C{;zJ3l~kniM4zUBq_+CWA9pw(qjO za|cOQ=3k&N43Wq>z z!|8006@r=Rhq0g(hY7l2BWnh#RU--m`rT99*@W42!sSJm$@r4lWI%mkokG!=xdDZw zkmLnXk}(<$nayT2maieJIu{pR;xtEAbS6`m;bcZ3sbrGDbTTGz#|#ITWijuJ>A25j z?+mLh4BI&}NGg69lNAz!L7%|)v74&|QOdC2C(9vDa?%{KLPAnBG+X4jj$S=w(7&MH zzhF8UadPy6-q|trg>}+G!SzFARl^NJyfDUfX9PjO;^u9#Tw*Y|BuX-5)nGiGAt@Tj zDz(-MgZ?GGa{=%0J(ofMg2BZphp(QaJ1vk^3Q5KfV}_$iX~`2kTXuT`RW}Jd7i3iw z(8Vc!7!$@BPJNNdXvD?&5u;(BB#F4_oiiTvn2iV2+G`|*gy~c$B!x6DFf5y_fQ7Xi z#Azn+njQZCM``cX^LS)6ldl2Uv<}h*d?^jPm&z<%%gP7UMX< zEGZ?vJH@mdkOTliPzf!f(8qGBf;6HVb0m2Xgftr>k&xyEq3qgecv7`>hPBT1I+7^6s6*?H7T-or!9v^>MyX{Gr(W-Z>?lyDckNrr`)4qQ+3IN(w5$ljd2Znt}IUX!|z8aswJ^v7^CU>Xi|lrTpS`=gBP zA_BC6ozoH}wik7$)B}o3WXQdQfRL5zF#|#^GIUs#c6X005>nB#XQJ^&AImd^)EUux zX-0tZW=FLt- zG%K!`$Zcu#=15`6n!^aj_^jSrS9GX#Ak>m)SsL z1bx>pbABM^dJ7Am^J>o~#|N5J;Vhla-sPZn{CSkGK&*jcs z6qX({hfGT(6P|%V9FG#%I`VOnVr52_?i8MZRRTJ=Q~m{w(2+sFQP|wgYLnaSecSUK zm1pDHN3z4kldRbDg$>o`=L1$Z95m%Af?U{Q#BYCO6?(}2#!XYmjC|#sz7Kiype3F@iRtoEc7njwL=_c(Ba2ru$?kPi5^C@QoXBFQW+^0J_W@9uDH(zTjul^Ks9`| zb9;-~ZbvX{5g>LaP5!SXpRMfaM-O!FPgOkES4CHO`0spHy7M9(NU_V|h+tr-U=*Y! zw0(0Ao2OZ+|Bpz zT4SEB8{gFej|3*K$#k@|`rT+Vl}Ftct12oqki%Xa#e&ak7vCn2}0b6$4Euw!4$@_j4e?zgamfvmUP&wCs!A@9rr-1Sd5^lQa2BiE|cO-$Af>wlPb z8lp8h25Z2w;~@5hAUD7q&Qk-2+3{cTKmdU1MA5_#Bj_#5#F zG1D1}(fpFl0Gpemxoxba<|E{;=5rGy#5KU{Ya4DG?ejs?db8OHCI40t`--c9=V4IY z+nnE>_fp==c;wSy(4U!|cBh)BLm}w-ApK0cQ}BMK?QQIfOe~?-QkVDX@{48gM2^7I zpeiK*4p$sQ=_iRiJaO>o;}d;|eGk4lLhaB72h|Bq`Y=5Br4_m1QA=>qw+F{fylW^@ zQp(|A$tnGODiaKUCBi^v!&t|iG9reC4oGq(j>M{XLE^h!oqrPi0{!(<|0|m#`>AxF z-xaw)L${d!PpjZ-3kF=Q;RSL$a?R`3+^X4^zqzV(WJ#_D21`lHu6A~tnYMX{(tWTG z5X(C1#*OLezU4+oY-wEYS}OxAZF3!$D86@6Y`R;Jki(v#S}QWf4cs3_G-0K9*h2BGzbh%7CpL%dOdk&?PyF%lK>X+D?O#smttuHJz02j5g_Eo;Bzl+q(Vp-80EB65z zE23Pt+tkh27a8PY$3IObIVeBvr1W;^ZtQ)#cLznR2Kd?#k58VSc&z*|sE=5Ey}#Ts z=ne|ZSo!|_d&FvxwKe@plQXG@(2IECGy&_>#6a?Q2<{;}t41O`1kRoH(k8S*ydv0% zL}_`vM=;p5{F}-qyl4SR%khfkn?(&q2LGa^-cGtj;~OL)%c9Yhj~Bc0<<|;kzr$NU z_FW?SH=)`2d92D83$VFD1EA6dGu=)MW*^2{pC%8y_v?N#=(av_-R~fGM(pZK;_Mpq zY|>JpX-Q0ua1qUEDEZd(2b>Gy&+uF?WPI3jyzSf|IqA*&Pf>?=cw=ga&ei*|N@9woF4T7v~?jSLNMV{?P3 zBI&2dUxg#-4_fu%RLylL4I2V!-mPPNxzWqM=~ zjkSCFql@5PvvqpVj%`qAsD+(A_S*!rFD5h->o0(3w(dV|ifodbvpL7`|H(n0sDi0! zYcqrq*es%oL2D@wxkLW1X&1*?A?;887E3>_%L*8(MFXM@lyvGp!H~u@p;msR)em<2 z4OocL8D?63?hzBGf8 z9!va{q)k`$Bu4=rQwpJ0rkezd#L}-Bn)B`6&`%{d*ZIUQPPZkwa}s zMXdubR@^`vIo8bqfR)Q9E+ZFwbBE^qy3=!W!B>k%iaE8}yeG8tNv3B*A&4=52ksl7 zl#}`sw?)vRImIR!gakX?OJhH*sWyXuS5iLkP%TNh|@R&;n}GjozRD7o84% zUys*+b7ymYHPg}u6)m8(;Lllyc_s-55@aO7zw-J;K5qm)MnKnI9ukQsgZSKB7V;v9 zLoyal9UNmh!gm3SOzzQZTzPA$Qd=D@vd9>9^BTbKJcVOQeThVr$`}u?iz)S z2a$fJU!y9d**!OVf7(yQz4)uSQU7WU(F*OudYe=Y%KdWI<&n_HTPpfJeoE9wnk|#p z&lWs@*Uv)&@hL44djU*-mCxn-!=@>28nEvOE?&j|HEyty`uQ%iW`xh`AATtHUf((P zUF}i#Sb?B8F@e{g?1QKa;MdjDv%SP)Z~L(Bi0Gtn&wo{u6A9;?Y{S#!J8nm_+ItSn z#e0xbJ$MoxRmh3^Th{~n?+tE6R^RXwzQSQ`Cg_65V^FyJQ6ymR66o>ZL%j!~U-2dQ0k zb+sy}nCek4Zm54O_&bN^dp&m+flU*`%!sPuws(c$NM}0?&n^2P8A>-wb#18q3+LRE z>h>Thbx4#*skc)b|K7J0`tu%Ei+qTQ&K%RvnFR8fnAp?Cvfh_`&HjVN1^R}GseD5m zsF_Kj_esv7#jNJ`z#GWMDbih{@>|ip|}L77~xCjGy%B7k{Uc% zD^$54ALB+`AGMb8d;<*u*oR03=P~;+7pHu?Y+K zt};xiPMSHcoCPxa3+_eF{kEcuU zbvmQ#Z*Sn;8h_yB_F$v_={;XMc&u)4<#Tch$uS;Q5nI@VU;&UuRtP%h@!Dk$=FK8F ziud^G#ZHA)K!4)-Jshh6#LLFQ`bp9Dvy=Ks(^&fbPv-D^FF>LuMljnx-p8)Jmo9ud zTQYS7sOOhK>=64;3ye|B5RnV**!k9*ag`J-PNLok*^!!>!fVwQ+5ox(+q?7o+SnAI zU%~|OdKrl%w(j5)|2fwG<6QVFL*N;g(JCYBN{DAehb66J_?h-sV zbusX?pF|Llzd!2m7itU_70Eks6+QVvg^XUP<`Xnm(_$s)B^FpF7e>aaZOq-NwNfM# z>kEzhKG6;L_Ce1D8^<$0L^e7uoV^Rn`CvPdv_b@f;r!VSiI*}=KHB{2BiTIV^S5rY zvMOzQDAe2rWXR%BlJ!k11+lh3VaKZ{K4z7G>r4%!2ENGAay9=?4AC7!8x7JA04twck-Zs(qGEy`eHrRS?Jvurnm;irMQK1Bi zZf0eXq$$6T41aQPaKH~Cv3XhudR@1ud&_O-xH&Zwi@W96+ojAAV!eI)n}$r#v!wQV z4UPV9qMMmj!IZBTk zx#E7ed!HJ54Uzi{r|FrFG&!$mI?n&_3n-7PGN|9bglb1=b;p(BS<4RA5_BiN7yi`w zcb|KK)ZFYWOfB@fHuRC(2|{N{dt({c(MD82A9F`WCwwl>fWsMEG|L|;qv!0LaE#%a z-s~aAKo~2L#3WtDQov4O<7dr+=dTVDg@9+Vpo`iO<3#mpQ7fz?n-Ce7oO5L$ZQjM?<>QMA0nQJN(Kf zv-uM-N%=~k_KKS*`dI!eo8NUaALsbmq${9x8LAQv4_AAgx?QlLE@=5P$7MEdzZMOK zk{k`Ojr0`F62ypVKP_=HJxfY>CGHj{V*T+y<3*Z6lVfRsD<)S?0!EulTMS732B#u% z@eoHv7c@#zGuFlE!40w^m5NLMRxGx<2#QfO2lhXDDmEf|W8uoe%t741^Uo_KNLM!;4jLk?B5@J;Gt8NHGfwcGlPnvdT)VX1HN z+&2YET&&_$OBdj;BZ#c*BU+0L6TX|VpFj;C?_~h9jJ9I}E7MkuiV6?>TdrbZqfO0$ zyFMcr#)zBP)ZW>88HYjeRLwYOivDLqL);igoAg=7dD%-_tx$O3DfHuOt~gPYS+g5mllQ0&3uFXeZmlrQ1f(Isw5MV`1X4D@>osV&=h?%3cH6_efycZ(OJnK zt#^}#h+dj!9x)Um!Rkla{sWP$RD+0zq!dAWC=}sSq{2u^$9d!_BGClp-zqCjMP?QS zMwzw4GNr+tMC|*W9H@G&GWF?~UfEwl)e8Y&o>J#h7#Z+$jjc~F#0;Ozj72iw(oz9_ zDCQzn(@MHUA6%2~7IuQal}d4x`%ibYW1_b>VMZBNXp1y{R*(5t;PYZ)=ICmK_O%i9 zykb?7kf@7C&-0LehEHXbDV>i(N&A8V73QrCH~b4fInMo%5_?+Gyga+o@YM4Tea2|; z^WSw*Gx%H-U(U1(@l@A5X`gCZt~0mysySG&XByqq)$n%s?Z27FW(#+ zOCOO!91V8iW~y13Ew_(-H`Xp{fQg8K6Dz9#mfS_EX!-S7O{^-1UTK%VN2cdpI_sA> z6b9JrP`%JZHdEGagGNPxMH&RGi&m)VzN^$_dS`@a^Bn~*Z5sh#I+c|R;gkd`mJ&(a ziAhzVM1uQgXZRSibYloNPrto~w4}2OZ*s)PYk#~z=U`;pYlX;eCrAn7T7292{pYPF z4kcPWitSAarA3DcqNB3wv(m&_eT38GdTd6X;j%X@9?)5Fyu8G@B#N!0|axD`7zG^G?% z7m+D8zAt>1XiAmJ#AVig)4!)Rx%YR?6-?8o>0Ri0)Dc+Tpx``HPd;B6DFOGsy4HH3 zXHNn_Jze9T?>Gq056g5E!T!>V^nEsFhoT&Pg)~+&E#{Y&_C4zz=jL;q;))2*dl>4~ z_*GrFrnVUVGUca*o7$zC+V@(mntt8E(oDvsi#vWNx5BUW)d?nfa$W|+bJo@mdr_Jv zH^N84iKpY^srL(7t-%wD!Geo*&(o7*1E?uqfq{gEEbmqG2NlW!lJ_!#x+WLIn={?u zHTqt3y26Kft8BN41|NBYZLVgQPL>SSl->@-nWgkI>SD5VPVkBEy z#|ziPCrb}}(&CO3*?jRS>waZwO-BfEaB|{g@pd=}v|;9fZ338^1%VZ$v~m!4=N_Vq%Sg$tU<(Tp9$YE| zE>B}q5jQa;BVBW0mS^)?^p6-%-|O?>U@ZL)d<&=23}Dkwp9zL3uEoN42=`XpO!iKy zPQtJd{MH!7;_9=Vh1YZgT=R;;zRV1^#mO6o5s}N*=rJlQo;1kZO=0ct;&K z7BIRe&l1j%T+?fJdkF*7PtuCfo!m(~(B*pDLHFBh)uB@p{$eaf!T$7d_(ld5JN;@6 zUsUdN$szXVz)#E*{Wos5Lhko!x#LjSIPt`)wRH>(64Za`=HM`4R#VGQsKig0w<`rY zzI>W6?502z=C;L3{FV6`?q4rH(E4L)-<)6#*x#|HZz|P6CR%r(@%?vW$pk5VM@hrN z!8QukOhX1KNenw@q0P7}p*4IG8EvV7se#6#U!mMpM1{zCFV!Jxc>zDcuLr>`FY){+ zotH>uIRPG`9xjX{J~Pv$+b}8>_}n_{FP;$ zR;ww@=fzwB{V{##1?mDx@BQ~73Rm&gD7f%Cg)4!LkxE`giPkW|s*3^dCPtnj0*G&e zd9(rOcaslxM?$~-Dd~p%`#rd!EtKHErLSDSh{f`_NcjpvxgebW6J!%FC$@W!F=!J? z@AnQ8`Z+`r&#}0P`FZ$1h<+&$O)IJ>MNAvP(TllC#wE$hM(%7GwHPUh>t%l0j79Lm zyF8#@ROCdeOuf!0D977EsS=pgYv8}bG0;fVS**&FYdzj(43{z@xNOA4)NW;`WMP6e z&)G?0<&X=h>k{)dk%DKCEq*8r`J8Ny3Bl2bX@h-}V|_5aUIabdkc#WR^^0M&4nICy zo8iEcWRv>6l-de>f21=teX&jWE*h<;_tv@=mqe#%Svwo?{H)yVoj|&X2IbCidD7`;D zSvobP?(af7#8j-~_Z&c3M%gCzSR!k6O87X@?<D55ufcjC)l?uW$EDc|mgJa*#w^KOS}69@R67JqjHJb3Wp%LIC;977Q= z$?R>Pzj_$&+^5^epFtCA_FQ}w`-OUH^J`swg2gV_<58-Q7Yg&mT4no@n!G)k$Mcu! z7Omo?zJF@_{~gQZr1#+>VzRvO!lHiMYBxnG<)$Z<&aq*-dx?c?5jnWQi~7AE!WhC1 zkTV87DInNiepaK%sDg8dxKW6?c>E*YgKetpeg~pU32|qp>Nz;fCWabLf>z5lPO7R( zOG?0665U{4C>`}8J_r6{W!nP<{c^1gHg%c56}uz6HjvkxJ4-EG-PFydV#xZw|<)NpF# z>doe>2F-U!-JjjLoHv;LzFj+CTTdu|irtEnN_ZNbV+_B)4v-`LsM-54!5{q4TyJY+ zR#lTn-p%iCMnvqvMKTSS=gq15+Ye3vc2EBf4n@%@*fm;hSmHjDdsC1k<@yKiEeI@? zNBzS|-_YzrZzKF7KqdY$(MogH?6t31F3ueOB8YLorHYsUjf*w|n&U-Z=(>QTaAW7> z!|%h;41LQ;Q9zab;V56q$iYNSv{Y5pklF_QoY2-?E~+`mWw`2r4-C4<=jgNU84)i= zp=c@|AM_SR>c5V#r-V0QkVI1I(O?xg2)Vl)8U|QUyKN=YUtLoOZY9LYUN0yIVf{)R zdT6f$33Qc!&(GJ!9wD-4nZlW4e9my@x(38%*F!0I=2pT9%XOdMT55E{1jQ){uoo&3}4*1uRhB|(ry?B#Md<6&onquDY0Shh7LV@rs~`3CLj_4C!^8Ruq?w<}h4{1&dG6TDG{Q~EdA zGV=bC^LovOp%9y4)F3%BoSW+l1c})AI|9(}(Il-+`)rKg-wEO&#p{3LL$JjT>0s~g z&I9BoD!*?Z>BpU)t&OenZ_w4*V#7p>_i?p~eCngOA**`hH$t+)4mY)aER;ceVHw`y!N_|IM-^wU7Q~0g8 zm7`@d31Tn5_~s-I?vUlmUziHU-(ydBbzQy8r?aho@Z;909;@{7I_>I)<+I@?%a*_R zsD;N{fluj6@xhXd591Qc zd>MnvYfYIoJg`3aZO6m5fj>KOHoeB7RLdd&lHhl*E>ok zn=`K6q#B*7YajR%64{6W9cG%DErl$VKY~1Q2W2xnxsPE-yjC035;A{09 z`4WlyE1}bC`7lxNF{v+4)Kse&zX=bkpo{8+Ro~@rVEutt&{>z&|Gc`L2LRcYHM$I1ol4O11=)wG{%)Z-1 zGHsWiz0V?G!pHvkN$5`JRlPLN>5y?R#`TYLF@<-CiJXLcPc~sP7>X7V{OGL#Mf-vG|P^-ZzsZNxfXCfUwg} zF724gV7DLvTXtTtHx;9qsu{HyCqRGOhbztmFMthtz9^?aDPVE>wbydehi=_FBsLLT zWAHg!(Vf>#q;`a%f1HhN6~-9z8N@tzw$}b|KPBgRV)i!r;WN=ahkh875}mr@o(Yb1 z*LgEjibU=145e^`Ls}d3t1jAt;9`!ZrQwUy&=eYab9ik@=8f3S%j+#Zry`R>Nbn7T zx6k5{pYY6T&Uug5vwicy)X+^#Cz_j_wjQJLpm5faJAP$VOkbX? z9b=L=WVOM2H3X5x|CbA^3VePMvOHrdtDR<8TzI=c*0rhkLkt)PCA#+$+tzYZ{ed-b z=&##&s)hr?wwzp>r9xe1g?7w>ng00HNQz(SzM68jKYoH^O;r2&t3nM&n<&fXRIwa~ zDKtZdW{e%mVhK%=IsE-I75nt5YrTMzy#*&+u?461SnPL=YHjs)(&t;1Ezen1uh1+V z&-#DIas|7(gulfuM0`65B(7c330GLP4{xrZ51#C}(QOA2?9PBqeptpx)X-2XhT>|_ zrHZ^)H`ZNROimd^DT3MAB9>A_(6fJw@NyfNk8mTC(I>WqD;>$5mzx& zR&Rf8b98iUK!A2R=k~QSRO&_hL<+>!1slLiW~0L>?JNbKEp{KGp!My-&E7u$R6js0WQ1}R%{)vzGs;9beHgJ9*i&F?5kbg@vHi_b#qtI@OX zX7+PJ?HOmUJCL2?;NCY!CK_QR88?}pKF)(ol~^Q;zOYr+Y43HL;kRXdmOJHVJ4J_>Gq zH1Y^CKpd|?S~s~y^L)oD*~sVdD=fUDeV@S8*M|2XL+`4OcjJur;O}F1oy~aG&^a`% zoXG`}4S*ITR48$D{`Ki?`mcfZmBznv(FXmqIdwv>?pFw@kc=398#Nl22Mja*aEh%S zwYx|mi{u%)=
    2qZFg&WP+7mYw7#cbL4NENNC$3*B7W;aW}`#NXaO~0K%?23Uq%B zrYa4vELRE6bkT5(c|+Bm`LPh=z};WJAa2=C%>pMP!{xCrHyBl!tcS`8>B>bL%#Qn{89S38a`dFQYw;jK@zm&!xbQ+3+ zQx#e%QdoWqTIz3b)tb*{8;uu5`8ZSLM>6H_3KhVFZ`4VbLhzrDIq$2ZIM>}&%%9^9q0)CqR9p4! zZ0qhy_gxj8ZFXJl$=kE___sytdCmMNG`KKbUN>{6xLj~oD*Qn`&DC9k8)xaiNYu%rwkGmo8D*ryc+7pB z=2;sSxf5Ygk#|WMchsH~h!Q7rqFKUj%j|q)1qQR`7JPU6(HD5nw$-&(0XRkKdVrNhW^1QkAB6_TF1Pd^BAFO7P z+^BLh-BjQMy5+kliO=|+v?l!YCeaeQKU9%JAM6C zG-0^IT{S?@eWOrpyGtsVhmqP28IJJz_3r52XM^4mLjWKQT28GErp;~jX0v_Nz|J>p zPKdM}@4NplaPV%}w8fn^|BtnGgKV7xFTG^_+j7=z0HRgTH7zx#x%3w;^-BEr8MGNA z1}kWi7Vj8#!;sX_4KS+=r%DP`Kh=cb(R4gL9vhRzayh>SKoUq~Xebz_mPgx#d~m0- z%IBq1xA$^|9_&oWt7zgVxx(zP_b=7zh>RAh$x{>ZB@ycC>h$A$X}%=-k+c2-AChAH z$Z7A-^OnU1O|dvbUCUBWq(F5Mg2j?JS@R$BIcNb=OkLmb%?>4C-x?d!)*!V*HB0Io zlAkF>Z&z}K{Jz(HNz#0-?#lC&jWd_EXWAi)Ja<~^(;w=My3hvEcCWRj=ouM)#gA4$ z_v4AFUAtyP55KSZD5vIqt{%AJJZ*Asa9W)BJwdBG?*3lvz>I20N84>M{GHb))0f@6 z_EeZUd3f}Y9&CB~xj1felZw$G=3 zB-wtpD+PDHn~zK6!|Ux6)(e0W7){h4zl*0<{(;Yh&Ju$fU<{zh7MMx*{oCL3>N(F! z*1g7yqzA6$l8)bMxLe-=i>8*cN@-N^5E!mF=r3lAFiT1={bG!71mGqng{CfUi&UF& z&{%;{Bv}stc!dbm)anWJ5rDvZ-Yl8L6veuavy4GE&)2??->cJo`=g46A;0#=%XuA# zJKnlZ8xw~BR4je{9GwI1w6e9dX+`cK^2FtNxw~GZPwq`A zHI$FHd)@>u7bMPf9rinI66jK-E<73GrTO5$71%1*5c&m(kH;7aYE{)yk7)_tR%Hi0xSqB zKb0c8aPEFC{q%8;*=x7SS^3A0-D>En&(xzRdHJ;tfH_IySC#36s>6HwfM_>cb~$M# z!t=#m>a?_gfG2MXC>ilmo^N3xLS2rNj%0Y(=t=1|m`wk3MK2#~KGA6F$qn6X-2_?! zbp0t<6m12SUzG{+=p~}dG>E4NFoE9uJ(4@Ok!JQmYZF~Hx)TXOX`fi^C-t$~F)0br zDe#A*9Tl5oB^Qy?kXZ@}CX~$%&=L9VU>EM*EhW)q9=NqKQzascMgG)DiXU>^t_>yD ztCMgo4p7{P6F_y)Z-Y|?j_0&i^k31SW(Ry9+ci36*b^; z?g#Lg9|rJ_{>GC=lSmB^_4U&AQI@GOoHWZxM@8?Zoht;gj*7xLvse}~B9Er2e=E>t zvZRqt#o0aMlTj_(VX&oH23s6|lXV2BT z-(G@NglsP@4ID9iV$_TA>jU9@DegIbY{#2N1LYsa&1uQA>e!=*=E;AWfQLemYkBDs zmgMMpYP;21e|85l@udl{PZI)Y`F_6lCH0hP`M4_&B`WG!SWppT3P zAHiaO%PwSi{uBB%*S^Fm_PWP$YftMp6aTb&&}8;%>^y99KLvkxzJe@_v$q2HTnJ_$ z_agLfny&}Fj6Jy3n)^Y?w1)?Vw~rXHy1B#9568v&#ytI|!fwi^kb$s`H&eF7mM@@< zz>K&9udM03A%^w93=p4-m4#R&-EypYV$lQ&CJGb&xZ(`6WGvt(9C2ve<%Ng9PYNsb zU14gL2#kn0h6b7v1Wh7M+42vPRkq~><)@%L{fal7XtCFp#|+~HPY(f7O`o@y0pkpo zRGKrO@U9PB8sng?r@&~c<#ZS#r+mdQ%s9EMr(N=dg-Hc$-2DYhsjsf1D&ZD)>DO&N zE+N2ISSQ^WpH#~f&5lH!j+HuB+C0r)*WJN*7ZLdrL3Ns}dNBseSV_xx4l=&9xo0I{ ztuBrh1#l|YL!|jCWf0?WGk^4ND~y}hw^CEEA*lRjjndVM8(BqU^IY_|SDCY3(AMn= z$C<|y=ABPq*K_S(*a%DC$5#wFG2OhR5iQ$0{ZBtxN=U_q<;2KNpmum687U#q%UrY$ z&bk2;*f!Vf(o3+R)mg|h3h5axaa!S59b!c5BUn4h6>3WA3o+Ia%#djmyhsRy=7bVp zp9&dn9y8>#X6$(=;}_~WZtFKD;cnpojvC&x_1*6zfbOm*KlJI}$>q+^KDs31mfBrp z1n;*6oT~*N-Mt-5I97j|zVi6F#QM(6Qzhe|_1b77c{&;Q=ONF#;HQ7mZqHC>^iezs2 zUvI+D_jUoa_fn^(uczO@r9YA?sIVk&K z?l!UB!UJW;syyo5^HV$Ldf-3;SDCu+H=n7WZ@S{?;c6#nKd#V&mW(B` z`w~)(4Qk(j!LOa`Z=`L~fqb!6^;Vv1LqfB*++Us2oy2tR7=L8_D_Q=FtPnW#M*eDa z+@z-)EEd9Fw_(OI$Yt^oC|b<>Es{nUwu!hu%I&MqjJ<=9G>g-nup#{P-N85wosv=o zb~RqG122U657xm~!suG(Bq8ZLhO9UXTP5@gmq#v5NNsUx+WVTj4X&DyNXZ9p>EJZC z;L}s}GKy5S<*k9n{5ocRCem|9#^IOWd;lpABzK+!U7lte1!*a&qz_2pAt8j>n8@1; zfTjbZ%ipe8Z5z7@EH$aV!dQv`w8#;wdgFl8#?!7La4L#xQQ14-qJ(?`|lBDZtaF zS(c%6BZwle?xh^>DWwnRLP_?IZpIw)%~4yQ+umNEB8~qEE7c8JAfz$y#`mW;%KHxs zT43MPn9YAfp%JPYIM8d*3ZfIrzukPs|BVJo2L^U3md%V_3#X0S=rE@V{&`vXEE41W z@2YhE<+5W9Q>l|jp{AmJm5iebBR&m9Vx>OoH`*^zx58@CQG5`2_KXig-X|B+hYh