From e3c859688848e4dc493527df4e3f8da32b8a3053 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 5 Jan 2024 15:46:45 +1100 Subject: [PATCH 001/339] Initial - 5 1 23 Stop stalking my repos --- .vscode/settings.json | 2 +- beestation.dme | 11 +- ...oartifact_materials.dm => xenoartifact.dm} | 43 ++++-- code/_globalvars/lists/maintenance_loot.dm | 2 +- code/_globalvars/xenoartifact.dm | 16 ++- .../objective_types/alien_artifact.dm | 3 +- .../components/xenoartifact.dm | 131 ++++++++++++++++++ .../xenoarchaeology/{ => old}/xenoartifact.dm | 7 + .../xenoartifact_activators.dm | 0 .../{traits => old}/xenoartifact_majors.dm | 0 .../xenoartifact_malfunctions.dm | 0 .../{traits => old}/xenoartifact_minors.dm | 0 .../{traits => old}/xenoartifact_traits.dm | 0 .../xenoarchaeology/traits/activators.dm | 20 +++ code/modules/xenoarchaeology/traits/traits.dm | 92 ++++++++++++ .../xenoarchaeology/xenoartifact_console.dm | 5 +- .../xenoarchaeology/xenoartifact_labeler.dm | 15 +- 17 files changed, 319 insertions(+), 28 deletions(-) rename code/__DEFINES/{xenoartifact_materials.dm => xenoartifact.dm} (53%) create mode 100644 code/modules/xenoarchaeology/components/xenoartifact.dm rename code/modules/xenoarchaeology/{ => old}/xenoartifact.dm (99%) rename code/modules/xenoarchaeology/{traits => old}/xenoartifact_activators.dm (100%) rename code/modules/xenoarchaeology/{traits => old}/xenoartifact_majors.dm (100%) rename code/modules/xenoarchaeology/{traits => old}/xenoartifact_malfunctions.dm (100%) rename code/modules/xenoarchaeology/{traits => old}/xenoartifact_minors.dm (100%) rename code/modules/xenoarchaeology/{traits => old}/xenoartifact_traits.dm (100%) create mode 100644 code/modules/xenoarchaeology/traits/activators.dm create mode 100644 code/modules/xenoarchaeology/traits/traits.dm diff --git a/.vscode/settings.json b/.vscode/settings.json index ab82a19fce4cf..f2907af6b897e 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -9,7 +9,7 @@ "**/.pnp.*": true }, "editor.codeActionsOnSave": { - "source.fixAll.eslint": true + "source.fixAll.eslint": "explicit" }, "files.eol": "\n", "files.insertFinalNewline": true, diff --git a/beestation.dme b/beestation.dme index 8416eaa7c3ab2..8baac20f28b98 100644 --- a/beestation.dme +++ b/beestation.dme @@ -184,7 +184,7 @@ #include "code\__DEFINES\weather.dm" #include "code\__DEFINES\wiremod.dm" #include "code\__DEFINES\wires.dm" -#include "code\__DEFINES\xenoartifact_materials.dm" +#include "code\__DEFINES\xenoartifact.dm" #include "code\__DEFINES\xenobiology.dm" #include "code\__DEFINES\zmimic.dm" #include "code\__DEFINES\dcs\flags.dm" @@ -4139,14 +4139,11 @@ #include "code\modules\wiremod\shell\scanner_gate.dm" #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" -#include "code\modules\xenoarchaeology\xenoartifact.dm" #include "code\modules\xenoarchaeology\xenoartifact_console.dm" #include "code\modules\xenoarchaeology\xenoartifact_labeler.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_activators.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_majors.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_malfunctions.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_minors.dm" -#include "code\modules\xenoarchaeology\traits\xenoartifact_traits.dm" +#include "code\modules\xenoarchaeology\components\xenoartifact.dm" +#include "code\modules\xenoarchaeology\traits\activators.dm" +#include "code\modules\xenoarchaeology\traits\traits.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" #include "code\ze_genesis_call\genesis_call.dm" diff --git a/code/__DEFINES/xenoartifact_materials.dm b/code/__DEFINES/xenoartifact.dm similarity index 53% rename from code/__DEFINES/xenoartifact_materials.dm rename to code/__DEFINES/xenoartifact.dm index fa6025d693225..95d0277573943 100644 --- a/code/__DEFINES/xenoartifact_materials.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -1,20 +1,41 @@ -//Xenoartifact defines -//Material defines. Used for characteristic generation -///Silly toys -#define XENOA_BLUESPACE "#1e7cff" -///Associated weapons -#define XENOA_PLASMA "#ff00c8" -///Broken Enigmas -#define XENOA_URANIUM "#00ff0d" -///Wildcard, may god have mercy -#define XENOA_BANANIUM "#ffd900" +//Material defines +///Safe +#define XENOA_BLUESPACE /datum/component/xenoartifact_material +///Mild +#define XENOA_PLASMA /datum/component/xenoartifact_material +///Dangerous +#define XENOA_URANIUM /datum/component/xenoartifact_material +///Wildcard +#define XENOA_BANANIUM /datum/component/xenoartifact_material ///The gods are about to do something stupid -#define XENOA_DEBUGIUM "#ff4800" +#define XENOA_DEBUGIUM /datum/component/xenoartifact_material + +//Trait priorities +#define TRAIT_PRIORITY_ACTIVATOR 1 +#define TRAIT_PRIORITY_MINOR 2 +#define TRAIT_PRIORITY_MAJOR 4 +#define TRAIT_PRIORITY_MALFUNCTION 3 + +///Signal for artifact trigger +#define XENOA_TRIGGER "xenoa_trigger" + +///generic starting cooldown timer for triggers +#define XENOA_GENERIC_COOLDOWN 8 SECONDS + +//Artifact trait strengths +#define XENOA_TRAIT_STRENGTH_NORMAL 50 +#define XENOA_TRAIT_STRENGTH_MILD 75 +#define XENOA_TRAIT_STRENGTH_STRONG 100 + +/* +old content +*/ ///trait flags #define BLUESPACE_TRAIT (1<<0) #define PLASMA_TRAIT (1<<1) #define URANIUM_TRAIT (1<<2) +#define BANANIUM_TRAIT (1<<3) //Also not materials but also related ///Process type on burn diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 8744a07c143dc..72b0682820839 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -115,6 +115,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/wirecutters = 1, /obj/item/wrench = 4, /obj/item/reagent_containers/food/drinks/bottle/homemaderum = 1, - /obj/item/xenoartifact/maint = 1, + //obj/item/xenoartifact/maint = 1, //TODO: - Racc /obj/item/paper_reader = 1, )) diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index f9cb28a73330e..0c8841f85b527 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -7,13 +7,14 @@ GLOBAL_LIST_INIT(xenoa_artifact_names, world.file2list("strings/names/artifact_s GLOBAL_LIST(xenoa_activators) GLOBAL_LIST(xenoa_minors) GLOBAL_LIST(xenoa_majors) -GLOBAL_LIST(xenoa_malfs) +GLOBAL_LIST(xenoa_malfunctions) GLOBAL_LIST(xenoa_all_traits) ///Blacklist for traits GLOBAL_LIST(xenoa_bluespace_blacklist) GLOBAL_LIST(xenoa_plasma_blacklist) GLOBAL_LIST(xenoa_uranium_blacklist) +GLOBAL_LIST(xenoa_bananium_blacklist) ///List of emotes for emote-trait GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, @@ -30,9 +31,20 @@ GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/ GLOB.xenoa_activators = compile_artifact_weights(/datum/xenoartifact_trait/activator) GLOB.xenoa_minors = compile_artifact_weights(/datum/xenoartifact_trait/minor) GLOB.xenoa_majors = compile_artifact_weights(/datum/xenoartifact_trait/major) - GLOB.xenoa_malfs = compile_artifact_weights(/datum/xenoartifact_trait/malfunction) + GLOB.xenoa_malfunctions = compile_artifact_weights(/datum/xenoartifact_trait/malfunction) GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) GLOB.xenoa_bluespace_blacklist = compile_artifact_blacklist(BLUESPACE_TRAIT) GLOB.xenoa_plasma_blacklist = compile_artifact_blacklist(PLASMA_TRAIT) GLOB.xenoa_uranium_blacklist = compile_artifact_blacklist(URANIUM_TRAIT) + GLOB.xenoa_uranium_blacklist = compile_artifact_blacklist(BANANIUM_TRAIT) + +/* +New content +*/ + +///Material weights, basically rarity +GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 5, XENOA_URANIUM = 3, XENOA_BANANIUM = 1)) + +///Trait priority list +GLOBAL_LIST_INIT(xenoartifact_trait_priorities, list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MAJOR, TRAIT_PRIORITY_MALFUNCTION)) diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm index 11a1e84507f29..d31a3a92dd7c2 100644 --- a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm @@ -2,7 +2,8 @@ name = "Artifact Recovery" var/generated = FALSE //The blackbox required to recover. - var/obj/item/xenoartifact/objective/linked_artifact + //var/obj/item/xenoartifact/objective/linked_artifact //TODO: - Racc + var/obj/item/linked_artifact min_payout = 5000 max_payout = 25000 diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm new file mode 100644 index 0000000000000..e21aceda83b32 --- /dev/null +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -0,0 +1,131 @@ +/* + Items with this component will act like alien artifatcs +*/ + +//TODO: Replace all instances of this - Racc +/obj/item/xenoartifact +/datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. + ///Buying and selling related, based on guess qaulity + var/modifier = 0.5 + ///default price gets generated if it isn't set by console. This only happens if the artifact spawns outside of that process + var/price + +/datum/component/xenoartifact_pricing/Initialize(...) + RegisterSignal(parent, XENOA_CHANGE_PRICE, PROC_REF(update_price)) + ..() + +/datum/component/xenoartifact_pricing/Destroy(force, silent) + UnregisterSignal(parent, XENOA_CHANGE_PRICE) + ..() + +///Typically used to change internally +/datum/component/xenoartifact_pricing/proc/update_price(datum/source, f_price) + price = f_price + + +/datum/component/xenoartifact + ///List of artifact-traits we have : list(PRIORITY = list(trait)) + var/list/artifact_traits = list() + ///Blacklist of components this artifact is currently incompatible with + var/list/blacklisted_traits = list() + + ///What strenght are our traits operating at? + var/trait_strength = XENOA_TRAIT_STRENGTH_STRONG + + ///What type of artifact are we? + var/datum/component/xenoartifact_material/artifact_type + + ///Cooldown logic for uses + var/use_cooldown = XENOA_GENERIC_COOLDOWN + var/use_cooldown_timer + ///Cooldown override. If this is true, we're on cooldown + var/cooldown_override = FALSE + +/datum/component/xenoartifact/New(list/raw_args, type, list/traits) + . = ..() + //Setup our typing + artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) + artifact_type = new artifact_type() + //If we're force-generating traits + if(traits) + for(var/datum/xenoartifact_trait/T as() in traits) + //List building + if(!artifact_traits[T.priority]) + artifact_traits[T.priority] = list() + //handle adding trait + T = new T(parent) + artifact_traits[T.priority] += T + blacklisted_traits += T.blacklist_traits + blacklisted_traits += T + //Otherwise, randomly generate our own traits + else + var/list/focus_traits + //Generate activators + focus_traits = GLOB.xenoa_activators & artifact_type.get_trait_list() + build_traits(focus_traits, artifact_type.trait_activators) + + //Generate minors + focus_traits = GLOB.xenoa_minors & artifact_type.get_trait_list() + build_traits(focus_traits, artifact_type.trait_minors) + + //Generate majors + focus_traits = GLOB.xenoa_majors & artifact_type.get_trait_list() + build_traits(focus_traits, artifact_type.trait_majors) + + //Generate malfunctions + focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() + build_traits(focus_traits, artifact_type.trait_malfunctions) + +///Used to trigger all our traits in order +/datum/component/xenoartifact/proc/trigger(force) + //Timer logic + if((use_cooldown_timer || cooldown_override) && !force) + return + else if(use_cooldown_timer) + reset_timer(use_cooldown_timer) + //Timer setup + addtimer(CALLBACK(src, PROC_REF(reset_timer), use_cooldown), TIMER_STOPPABLE) + //Trait triggers + for(var/i in GLOB.xenoartifact_trait_priorities) + SEND_SIGNAL(src, XENOA_TRIGGER, i) + +/datum/component/xenoartifact/proc/build_traits(list/trait_list, amount) + for(var/i in 1 to amount) + //Pick a random trait + var/datum/xenoartifact_trait/T = pick_weight(trait_list-blacklisted_traits) + //List building + if(!artifact_traits[T.priority]) + artifact_traits[T.priority] = list() + //handle trait adding + T = new T(parent) + artifact_traits[T.priority] += T + blacklisted_traits += T.blacklist_traits + blacklisted_traits += T + +//Cooldown finish logic goes here +/datum/component/xenoartifact/proc/reset_timer() + if(use_cooldown_timer) + deltimer(use_cooldown_timer) + use_cooldown_timer = null //Just incase + +/datum/component/xenoartifact/proc/get_extra_cooldowns() + var/time = 0 SECONDS + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + time += T.cooldown + return time + +///material datums +/datum/component/xenoartifact_material + var/name = "debugium" + ///What color we associate with this material + var/material_color = "#ff4800" + + ///Trait info, how many of each trait are we allowed + var/trait_activators = 1 + var/trait_minors = 3 + var/trait_majors = 1 + var/trait_malfunctions = 1 + +/datum/component/xenoartifact_material/proc/get_trait_list() + return GLOB.xenoa_all_traits diff --git a/code/modules/xenoarchaeology/xenoartifact.dm b/code/modules/xenoarchaeology/old/xenoartifact.dm similarity index 99% rename from code/modules/xenoarchaeology/xenoartifact.dm rename to code/modules/xenoarchaeology/old/xenoartifact.dm index 24e1c48e28ec8..1ed9e95bb06ff 100644 --- a/code/modules/xenoarchaeology/xenoartifact.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact.dm @@ -1,3 +1,10 @@ +/* +TODO + +Make artifacts into item components + +*/ + /obj/item/xenoartifact name = "artifact" icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_activators.dm b/code/modules/xenoarchaeology/old/xenoartifact_activators.dm similarity index 100% rename from code/modules/xenoarchaeology/traits/xenoartifact_activators.dm rename to code/modules/xenoarchaeology/old/xenoartifact_activators.dm diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_majors.dm b/code/modules/xenoarchaeology/old/xenoartifact_majors.dm similarity index 100% rename from code/modules/xenoarchaeology/traits/xenoartifact_majors.dm rename to code/modules/xenoarchaeology/old/xenoartifact_majors.dm diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm b/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm similarity index 100% rename from code/modules/xenoarchaeology/traits/xenoartifact_malfunctions.dm rename to code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm b/code/modules/xenoarchaeology/old/xenoartifact_minors.dm similarity index 100% rename from code/modules/xenoarchaeology/traits/xenoartifact_minors.dm rename to code/modules/xenoarchaeology/old/xenoartifact_minors.dm diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_traits.dm b/code/modules/xenoarchaeology/old/xenoartifact_traits.dm similarity index 100% rename from code/modules/xenoarchaeology/traits/xenoartifact_traits.dm rename to code/modules/xenoarchaeology/old/xenoartifact_traits.dm diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm new file mode 100644 index 0000000000000..b3c20cc4d5968 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -0,0 +1,20 @@ +//These traits cause the xenoartifact to trigger, activate +/datum/xenoartifact_trait/activator + ///Do we override the artifact's generic cooldown? + var/override_cooldown = FALSE + +//Throw custom cooldown logic in here +/datum/xenoartifact_trait/activator/proc/trigger_artifact() + SIGNAL_HANDLER + + parent.trigger() + return + +/* + Sturdy + This trait activates the artifact when it's used, like a generic item +*/ + +/datum/xenoartifact_trait/activator/strudy/New() + . = ..() + RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(trigger_artifact)) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm new file mode 100644 index 0000000000000..74886c3b3bf93 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -0,0 +1,92 @@ +/datum/xenoartifact_trait + ///Reference to the artifact + var/datum/component/xenoartifact/parent + + ///Acts as a descriptor for when examining - 'reinforced' 'electrified' 'hollow' + var/examine_desc + ///Used when labeler needs a name and trait is too sneaky to have a descriptor when examining. + var/label_name + ///Something briefly explaining it in inagame terms. + var/label_desc + + ///Asscoiated flags for artifact typing and such + var/flags = NONE + ///Other traits this trait wont work with. + var/list/blacklist_traits = list() + ///How rare is this trait? 100 being common, and 1 being very rare + var/rarity = 100 + + ///How much time does this trait add to the artifact cooldownm + var/cooldown = 0 SECONDS + + ///What trait priority we use + var/priority = TRAIT_PRIORITY_ACTIVATOR + + ///List of things we've effected. used to automatically reigster & unregister targets. + var/list/targets = list() + +/datum/xenoartifact_trait/minor +/datum/xenoartifact_trait/major +/datum/xenoartifact_trait/malfunction + +/datum/xenoartifact_trait/New(atom/_parent) + . = ..() + parent = _parent + RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_parent)) + //Setup trigger signals + RegisterSignal(parent, XENOA_TRIGGER, PROC_REF(trigger)) + +/datum/xenoartifact_trait/Destroy(force, ...) + . = ..() + for(var/atom/A in targets) + unregister_target(A) + +/datum/xenoartifact_trait/proc/remove_parent(datum/source) + SIGNAL_HANDLER + + parent = null + +//Cleanly register an effected target +/datum/xenoartifact_trait/proc/register_target(atom/target, do_trigger = FALSE) + if(do_trigger) + trigger(target) + targets += target + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target)) + +//Cleanly unregister an effected target +/datum/xenoartifact_trait/proc/unregister_target(datum/source, do_untrigger = TRUE) + SIGNAL_HANDLER + + if(do_untrigger) //This will only happen in the event something is unregistered before we can untrigger, which is needed for QDELs + un_trigger(source) + targets -= source + +/datum/xenoartifact_trait/proc/trigger(atom/A, _priority) + SIGNAL_HANDLER + + if(_priority != priority) + return + register_target(A) + return + +/datum/xenoartifact_trait/proc/un_trigger(atom/A) + unregister_target(A, FALSE) + return + +///Proc used to compile trait weights into a list +/proc/compile_artifact_weights(path) + if(!ispath(path)) + return + var/list/temp = subtypesof(path) + var/list/weighted = list() + for(var/datum/xenoartifact_trait/T as() in temp) + weighted += list((T) = initial(T.rarity)) + return weighted + +///Compile a blacklist of traits from a given flag/s +/proc/compile_artifact_blacklist(var/flags) + var/list/output = list() + for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) + if(!(initial(T.flags) & flags)) + output += T + return output diff --git a/code/modules/xenoarchaeology/xenoartifact_console.dm b/code/modules/xenoarchaeology/xenoartifact_console.dm index 53825571978bb..6bc46d564936e 100644 --- a/code/modules/xenoarchaeology/xenoartifact_console.dm +++ b/code/modules/xenoarchaeology/xenoartifact_console.dm @@ -207,9 +207,12 @@ for(var/datum/xenoartifact_trait/T as() in L?.trait_list) var/color = rgb(255, 0, 0) //using tertiary operator breaks it + /* + TODO: - Racc if(locate(T) in A.traits) color =rgb(0, 255, 0) - var/name = (initial(T.desc) || initial(T.label_name)) + */ + var/name = (initial(T.label_desc) || initial(T.label_name)) info += {"\n[name]"} entry.traits += list(list("name" = "[name]", "color" = "[color]")) diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/xenoartifact_labeler.dm index 88f99a7d5c91a..5895f5b753b30 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeler.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeler.dm @@ -42,7 +42,7 @@ //Majors major_traits = get_trait_list_desc(major_traits, GLOB.xenoa_majors) //Malfs - malfunction_list = get_trait_list_desc(malfunction_list, GLOB.xenoa_malfs) + malfunction_list = get_trait_list_desc(malfunction_list, GLOB.xenoa_malfunctions) /obj/item/xenoartifact_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -99,7 +99,7 @@ //Get a list of all the specified trait types names, actually /obj/item/xenoartifact_labeler/proc/get_trait_list_desc(list/traits, list/trait_type) for(var/datum/xenoartifact_trait/X as() in trait_type) - traits += (initial(X.desc) || initial(X.label_name)) + traits += (initial(X.label_desc) || initial(X.label_name)) return traits /obj/item/xenoartifact_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? @@ -155,7 +155,7 @@ //This is just a hacky way of getting the info from a datum using its desc becuase I wrote this last and it's not heartbreaking /obj/item/xenoartifact_labeler/proc/desc2datum(udesc) for(var/datum/xenoartifact_trait/X as() in GLOB.xenoa_all_traits) - if((udesc == initial(X.desc)) || (udesc == initial(X.label_name))) + if((udesc == initial(X.label_desc)) || (udesc == initial(X.label_name))) return X CRASH("The xenoartifact trait description '[udesc]' doesn't have a corresponding trait. Something fucked up.") @@ -203,7 +203,7 @@ xenoa_target.name = name if(info) var/textinfo = list2text(info) - xenoa_target.label_desc = "There's a sticker attached, it says-\n[textinfo]" + xenoa_target.desc += "There's a sticker attached, it says-\n[textinfo]" return TRUE /obj/item/xenoartifact_label/afterattack(atom/target, mob/user, proximity_flag, click_parameters) @@ -227,12 +227,15 @@ if(!xenop) return xenop.modifier = initial(xenop.modifier) + /* + TODO: - Racc for(var/t in trait_list) trait = new t if(X.get_trait(trait)) xenop.modifier += 0.15 else xenop.modifier -= 0.35 + */ /obj/item/xenoartifact_label/proc/list2text(list/listo) //list2params acting weird. Probably already a function for this. var/text = "" @@ -248,6 +251,9 @@ return /obj/item/xenoartifact_labeler/debug/create_label(new_name) + return + /* + TODO: - Racc var/obj/item/xenoartifact/A = new(get_turf(loc), XENOA_DEBUGIUM) say("Created [A] at [A.loc]") A.charge_req = 100 @@ -261,3 +267,4 @@ for(var/datum/xenoartifact_trait/t as() in A.traits) //Setup new ones t.on_init(A) A = null + */ From cf8b1a5408f55cb2a21bdec31ab55737d1170e11 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 5 Jan 2024 16:52:27 +1100 Subject: [PATCH 002/339] Make it work - 5 1 24 --- _maps/_basemap.dm | 2 +- code/__DEFINES/xenoartifact.dm | 16 ++++---- code/_globalvars/xenoartifact.dm | 23 ++++++----- .../components/xenoartifact.dm | 39 ++++++++++++++++--- .../xenoarchaeology/traits/activators.dm | 2 + code/modules/xenoarchaeology/traits/traits.dm | 12 ++++-- .../xenoarchaeology/xenoartifact_console.dm | 2 +- .../xenoarchaeology/xenoartifact_labeler.dm | 2 +- 8 files changed, 67 insertions(+), 31 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 9499d3e8cb593..bf3b820460161 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index 95d0277573943..f63a7f70172b7 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -11,10 +11,10 @@ #define XENOA_DEBUGIUM /datum/component/xenoartifact_material //Trait priorities -#define TRAIT_PRIORITY_ACTIVATOR 1 -#define TRAIT_PRIORITY_MINOR 2 -#define TRAIT_PRIORITY_MAJOR 4 -#define TRAIT_PRIORITY_MALFUNCTION 3 +#define TRAIT_PRIORITY_ACTIVATOR "activator" +#define TRAIT_PRIORITY_MINOR "minor" +#define TRAIT_PRIORITY_MAJOR "major" +#define TRAIT_PRIORITY_MALFUNCTION "malfunction" ///Signal for artifact trigger #define XENOA_TRIGGER "xenoa_trigger" @@ -27,16 +27,16 @@ #define XENOA_TRAIT_STRENGTH_MILD 75 #define XENOA_TRAIT_STRENGTH_STRONG 100 -/* -old content -*/ - ///trait flags #define BLUESPACE_TRAIT (1<<0) #define PLASMA_TRAIT (1<<1) #define URANIUM_TRAIT (1<<2) #define BANANIUM_TRAIT (1<<3) +/* +old content +*/ + //Also not materials but also related ///Process type on burn #define PROCESS_TYPE_LIT "is_lit" diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index 0c8841f85b527..61c808724e885 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -11,10 +11,10 @@ GLOBAL_LIST(xenoa_malfunctions) GLOBAL_LIST(xenoa_all_traits) ///Blacklist for traits -GLOBAL_LIST(xenoa_bluespace_blacklist) -GLOBAL_LIST(xenoa_plasma_blacklist) -GLOBAL_LIST(xenoa_uranium_blacklist) -GLOBAL_LIST(xenoa_bananium_blacklist) +GLOBAL_LIST(xenoa_bluespace_traits) +GLOBAL_LIST(xenoa_plasma_traits) +GLOBAL_LIST(xenoa_uranium_traits) +GLOBAL_LIST(xenoa_bananium_traits) ///List of emotes for emote-trait GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, @@ -24,6 +24,9 @@ GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/ ///Fill globals /proc/generate_xenoa_statics() + if(length(GLOB.xenoa_all_traits)) + return + GLOB.xenoa_seller_names -= "" GLOB.xenoa_seller_dialogue -= "" GLOB.xenoa_artifact_names -= "" @@ -34,10 +37,10 @@ GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/ GLOB.xenoa_malfunctions = compile_artifact_weights(/datum/xenoartifact_trait/malfunction) GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) - GLOB.xenoa_bluespace_blacklist = compile_artifact_blacklist(BLUESPACE_TRAIT) - GLOB.xenoa_plasma_blacklist = compile_artifact_blacklist(PLASMA_TRAIT) - GLOB.xenoa_uranium_blacklist = compile_artifact_blacklist(URANIUM_TRAIT) - GLOB.xenoa_uranium_blacklist = compile_artifact_blacklist(BANANIUM_TRAIT) + GLOB.xenoa_bluespace_traits = compile_artifact_whitelist(BLUESPACE_TRAIT) + GLOB.xenoa_plasma_traits = compile_artifact_whitelist(PLASMA_TRAIT) + GLOB.xenoa_uranium_traits = compile_artifact_whitelist(URANIUM_TRAIT) + GLOB.xenoa_uranium_traits = compile_artifact_whitelist(BANANIUM_TRAIT) /* New content @@ -46,5 +49,5 @@ New content ///Material weights, basically rarity GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 5, XENOA_URANIUM = 3, XENOA_BANANIUM = 1)) -///Trait priority list -GLOBAL_LIST_INIT(xenoartifact_trait_priorities, list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MAJOR, TRAIT_PRIORITY_MALFUNCTION)) +///Trait priority list - The order is important and it represents priotity +GLOBAL_LIST_INIT(xenoartifact_trait_priorities, list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MALFUNCTION, TRAIT_PRIORITY_MAJOR)) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index e21aceda83b32..44c158794cac6 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -4,6 +4,12 @@ //TODO: Replace all instances of this - Racc /obj/item/xenoartifact + icon_state = "skub" + +/obj/item/xenoartifact/ComponentInitialize() + . = ..() + AddComponent(/datum/component/xenoartifact) + /datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. ///Buying and selling related, based on guess qaulity var/modifier = 0.5 @@ -32,6 +38,9 @@ ///What strenght are our traits operating at? var/trait_strength = XENOA_TRAIT_STRENGTH_STRONG + ///Level of instability, associated with gaining malfunctions + var/instability = 0 + ///What type of artifact are we? var/datum/component/xenoartifact_material/artifact_type @@ -43,6 +52,8 @@ /datum/component/xenoartifact/New(list/raw_args, type, list/traits) . = ..() + generate_xenoa_statics() + //Setup our typing artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() @@ -53,7 +64,7 @@ if(!artifact_traits[T.priority]) artifact_traits[T.priority] = list() //handle adding trait - T = new T(parent) + T = new T(src) artifact_traits[T.priority] += T blacklisted_traits += T.blacklist_traits blacklisted_traits += T @@ -88,16 +99,22 @@ //Trait triggers for(var/i in GLOB.xenoartifact_trait_priorities) SEND_SIGNAL(src, XENOA_TRIGGER, i) + //Malfunctions + handle_malfunctions() /datum/component/xenoartifact/proc/build_traits(list/trait_list, amount) + if(!length(trait_list)) + CRASH("TODO: - Racc") + var/list/options = trait_list + options -= blacklisted_traits for(var/i in 1 to amount) //Pick a random trait - var/datum/xenoartifact_trait/T = pick_weight(trait_list-blacklisted_traits) + var/datum/xenoartifact_trait/T = pick_weight(options) //List building - if(!artifact_traits[T.priority]) - artifact_traits[T.priority] = list() + if(!artifact_traits[initial(T.priority)]) + artifact_traits[initial(T.priority)] = list() //handle trait adding - T = new T(parent) + T = new T(src) artifact_traits[T.priority] += T blacklisted_traits += T.blacklist_traits blacklisted_traits += T @@ -115,6 +132,13 @@ time += T.cooldown return time +/datum/component/xenoartifact/proc/handle_malfunctions() + if(!prob(instability)) + return + var/list/focus_traits + focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() + build_traits(focus_traits, artifact_type.trait_malfunctions) + ///material datums /datum/component/xenoartifact_material var/name = "debugium" @@ -125,7 +149,10 @@ var/trait_activators = 1 var/trait_minors = 3 var/trait_majors = 1 - var/trait_malfunctions = 1 + var/trait_malfunctions = 0 + + ///How much we increase artifact instability by for every use + var/instability_step = 0 /datum/component/xenoartifact_material/proc/get_trait_list() return GLOB.xenoa_all_traits diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index b3c20cc4d5968..e992e02d8037b 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -15,6 +15,8 @@ This trait activates the artifact when it's used, like a generic item */ +/datum/xenoartifact_trait/activator/strudy + /datum/xenoartifact_trait/activator/strudy/New() . = ..() RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(trigger_artifact)) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 74886c3b3bf93..ec06332e5a69d 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -10,7 +10,7 @@ var/label_desc ///Asscoiated flags for artifact typing and such - var/flags = NONE + var/flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT ///Other traits this trait wont work with. var/list/blacklist_traits = list() ///How rare is this trait? 100 being common, and 1 being very rare @@ -25,6 +25,10 @@ ///List of things we've effected. used to automatically reigster & unregister targets. var/list/targets = list() + ///Characteristics for deduction + var/weight = 0 + var/conductivity = 0 + /datum/xenoartifact_trait/minor /datum/xenoartifact_trait/major /datum/xenoartifact_trait/malfunction @@ -80,13 +84,13 @@ var/list/temp = subtypesof(path) var/list/weighted = list() for(var/datum/xenoartifact_trait/T as() in temp) - weighted += list((T) = initial(T.rarity)) + weighted += list((T) = initial(T.rarity)) //The (T) will not work if it is T return weighted ///Compile a blacklist of traits from a given flag/s -/proc/compile_artifact_blacklist(var/flags) +/proc/compile_artifact_whitelist(var/flags) var/list/output = list() for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) - if(!(initial(T.flags) & flags)) + if((initial(T.flags) & flags)) output += T return output diff --git a/code/modules/xenoarchaeology/xenoartifact_console.dm b/code/modules/xenoarchaeology/xenoartifact_console.dm index 6bc46d564936e..933e6d83ceeed 100644 --- a/code/modules/xenoarchaeology/xenoartifact_console.dm +++ b/code/modules/xenoarchaeology/xenoartifact_console.dm @@ -203,7 +203,7 @@ //append sticker traits & pass it off var/obj/item/xenoartifact_label/L = (locate(/obj/item/xenoartifact_label) in selling_item.contents) - var/obj/item/xenoartifact/A = selling_item + //var/obj/item/xenoartifact/A = selling_item //TODO: - Racc for(var/datum/xenoartifact_trait/T as() in L?.trait_list) var/color = rgb(255, 0, 0) //using tertiary operator breaks it diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/xenoartifact_labeler.dm index 5895f5b753b30..4980f67168207 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeler.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeler.dm @@ -222,7 +222,7 @@ forceMove(get_turf(target)) /obj/item/xenoartifact_label/proc/calculate_modifier(obj/item/xenoartifact/X) //Modifier based off preformance of slueth. To:Do revisit this, complexity would be nice - var/datum/xenoartifact_trait/trait + //var/datum/xenoartifact_trait/trait //TODO: - Racc var/datum/component/xenoartifact_pricing/xenop = X.GetComponent(/datum/component/xenoartifact_pricing) if(!xenop) return From c1b50d191f5e60af73dda43a7a551381c61f16ac Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 5 Jan 2024 18:42:48 +1100 Subject: [PATCH 003/339] Establish registers - 5 1 24 --- beestation.dme | 1 + .../components/xenoartifact.dm | 18 +++++++- .../xenoarchaeology/traits/activators.dm | 46 +++++++++++++++---- code/modules/xenoarchaeology/traits/majors.dm | 22 +++++++++ code/modules/xenoarchaeology/traits/traits.dm | 33 +++++++++---- 5 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 code/modules/xenoarchaeology/traits/majors.dm diff --git a/beestation.dme b/beestation.dme index 8baac20f28b98..7fc5f8ace7354 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4143,6 +4143,7 @@ #include "code\modules\xenoarchaeology\xenoartifact_labeler.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" +#include "code\modules\xenoarchaeology\traits\majors.dm" #include "code\modules\xenoarchaeology\traits\traits.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 44c158794cac6..024e810717e47 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -50,6 +50,9 @@ ///Cooldown override. If this is true, we're on cooldown var/cooldown_override = FALSE + ///List of targets we can pass to our traits + var/list/targets = list() + /datum/component/xenoartifact/New(list/raw_args, type, list/traits) . = ..() generate_xenoa_statics() @@ -95,12 +98,15 @@ else if(use_cooldown_timer) reset_timer(use_cooldown_timer) //Timer setup - addtimer(CALLBACK(src, PROC_REF(reset_timer), use_cooldown), TIMER_STOPPABLE) + use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), use_cooldown, TIMER_STOPPABLE) //Trait triggers for(var/i in GLOB.xenoartifact_trait_priorities) SEND_SIGNAL(src, XENOA_TRIGGER, i) //Malfunctions handle_malfunctions() + //Cleanup targets + for(var/atom/A in targets) + unregister_target(A) /datum/component/xenoartifact/proc/build_traits(list/trait_list, amount) if(!length(trait_list)) @@ -139,6 +145,16 @@ focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) +/datum/component/xenoartifact/proc/register_target(atom/target) + targets += target + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) + +/datum/component/xenoartifact/proc/unregister_target(datum/source) + SIGNAL_HANDLER + + targets -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + ///material datums /datum/component/xenoartifact_material var/name = "debugium" diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index e992e02d8037b..7165382fec032 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -1,22 +1,50 @@ //These traits cause the xenoartifact to trigger, activate /datum/xenoartifact_trait/activator - ///Do we override the artifact's generic cooldown? - var/override_cooldown = FALSE + register_targets = FALSE + ///Do we override the artifact's generic cooldown? + var/override_cooldown = FALSE //Throw custom cooldown logic in here /datum/xenoartifact_trait/activator/proc/trigger_artifact() - SIGNAL_HANDLER + SIGNAL_HANDLER - parent.trigger() - return + parent.trigger() + return /* - Sturdy - This trait activates the artifact when it's used, like a generic item + Sturdy + This trait activates the artifact when it's used, like a generic item */ /datum/xenoartifact_trait/activator/strudy + examine_desc = "sturdy" + label_name = "Sturdy" + label_desc = "The artifact seems to be made of a sturdy material.\nThis material seems to be triggered by physical interaction." + weight = 3 + conductivity = 0.5 /datum/xenoartifact_trait/activator/strudy/New() - . = ..() - RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(trigger_artifact)) + . = ..() + //Register all the relevant signals we trigger from + RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, PROC_REF(translation_type_b)) + RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, PROC_REF(translation_type_a)) + RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(translation_type_a)) + RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(translation_type_c)) + +/datum/xenoartifact_trait/activator/strudy/proc/translation_type_a(datum/source, atom/target) + SIGNAL_HANDLER + + parent.register_target(target) + trigger_artifact() + +/datum/xenoartifact_trait/activator/strudy/proc/translation_type_b(datum/source, atom/item, atom/target) + SIGNAL_HANDLER + + parent.register_target(target) + trigger_artifact() + +/datum/xenoartifact_trait/activator/strudy/proc/translation_type_c(datum/source, atom/target, atom/item) + SIGNAL_HANDLER + + parent.register_target(target) + trigger_artifact() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm new file mode 100644 index 0000000000000..7de4299237766 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -0,0 +1,22 @@ +/datum/xenoartifact_trait/major + +/* + Shock + Electrocutes the mob target, or charges the cell target +*/ +/datum/xenoartifact_trait/major/shock + cooldown = 2 SECONDS + +/datum/xenoartifact_trait/major/shock/trigger(atom/A, _priority) + . = ..() + if(length(targets)) + playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) + for(var/atom/A in targets) + if(iscarbon(A)) + var/mob/living/carbon/victim = A + victim.electrocute_act(parent.trait_strength*0.25, parent.parent, 1, 1) //Deal a max of 25 + unregister_target(M, FALSE) + else if(istype(A, /obj/item/stock_parts/cell)) + var/obj/item/stock_parts/cell/C = target + C.give((parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool + dump_targets() //Get rid of anything else, since we can't interact with it diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index ec06332e5a69d..c268eb293c2bd 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -16,6 +16,9 @@ ///How rare is this trait? 100 being common, and 1 being very rare var/rarity = 100 + ///Does this trait reigster targets? + var/register_targets = TRUE + ///How much time does this trait add to the artifact cooldownm var/cooldown = 0 SECONDS @@ -26,11 +29,10 @@ var/list/targets = list() ///Characteristics for deduction - var/weight = 0 - var/conductivity = 0 + var/weight = 0 //KG + var/conductivity = 0 //microsiemens per centimeter - I had to look this up /datum/xenoartifact_trait/minor -/datum/xenoartifact_trait/major /datum/xenoartifact_trait/malfunction /datum/xenoartifact_trait/New(atom/_parent) @@ -53,9 +55,9 @@ //Cleanly register an effected target /datum/xenoartifact_trait/proc/register_target(atom/target, do_trigger = FALSE) if(do_trigger) - trigger(target) + trigger(null, priority, target) targets += target - RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target)) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) //Cleanly unregister an effected target /datum/xenoartifact_trait/proc/unregister_target(datum/source, do_untrigger = TRUE) @@ -64,19 +66,34 @@ if(do_untrigger) //This will only happen in the event something is unregistered before we can untrigger, which is needed for QDELs un_trigger(source) targets -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) -/datum/xenoartifact_trait/proc/trigger(atom/A, _priority) +//A can be passed manually for debug +/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/A) SIGNAL_HANDLER - if(_priority != priority) + if(_priority != priority && _priority) + return + if(!register_targets) return - register_target(A) + //If we've been given an override + if(A) + register_target(A) + //Otherwise just use the artifact's target list + else if(length(parent.targets)) + for(var/atom/I in parent.targets) + register_target(I) return +//Most traits will handle this on their own /datum/xenoartifact_trait/proc/un_trigger(atom/A) unregister_target(A, FALSE) return +/datum/xenoartifact_trait/proc/dump_targets() + for(var/i in targets) + unregister_target(i) + ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path) if(!ispath(path)) From 51a712a655fbf8b5be44519efcc30d15af56e355 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 5 Jan 2024 23:52:04 +1100 Subject: [PATCH 004/339] Examines - 5 1 24 --- beestation.dme | 4 +- code/__DEFINES/xenoartifact.dm | 12 ++++ .../components/xenoartifact.dm | 40 +++++++++++- .../xenoarchaeology/traits/activators.dm | 1 - code/modules/xenoarchaeology/traits/majors.dm | 60 ++++++++++++++++-- code/modules/xenoarchaeology/traits/traits.dm | 41 ++++++++---- .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1090 -> 1532 bytes 7 files changed, 135 insertions(+), 23 deletions(-) diff --git a/beestation.dme b/beestation.dme index 7fc5f8ace7354..e0debaf79ea08 100644 --- a/beestation.dme +++ b/beestation.dme @@ -390,6 +390,7 @@ #include "code\controllers\subsystem\area_contents.dm" #include "code\controllers\subsystem\asset_loading.dm" #include "code\controllers\subsystem\assets.dm" +#include "code\controllers\subsystem\async_map_generator.dm" #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\autotransfer.dm" @@ -417,7 +418,6 @@ #include "code\controllers\subsystem\language.dm" #include "code\controllers\subsystem\lighting.dm" #include "code\controllers\subsystem\machines.dm" -#include "code\controllers\subsystem\async_map_generator.dm" #include "code\controllers\subsystem\mapping.dm" #include "code\controllers\subsystem\materials.dm" #include "code\controllers\subsystem\metrics.dm" @@ -1423,8 +1423,8 @@ #include "code\game\objects\items\food\pizza.dm" #include "code\game\objects\items\food\salad.dm" #include "code\game\objects\items\food\sandwichtoast.dm" -#include "code\game\objects\items\food\spaghetti.dm" #include "code\game\objects\items\food\soup.dm" +#include "code\game\objects\items\food\spaghetti.dm" #include "code\game\objects\items\grenades\_grenade.dm" #include "code\game\objects\items\grenades\antigravity.dm" #include "code\game\objects\items\grenades\chem_grenade.dm" diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index f63a7f70172b7..740ba895a3369 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -33,6 +33,18 @@ #define URANIUM_TRAIT (1<<2) #define BANANIUM_TRAIT (1<<3) +///trait cooldowns +#define XENOA_TRAIT_COOLDOWN_SAFE 3 SECONDS +#define XENOA_TRAIT_COOLDOWN_DANGEROUS 5 SECONDS +#define XENOA_TRAIT_COOLDOWN_GAMER 8 SECONDS + +//trait weights, for rarities +#define XENOA_TRAIT_WEIGHT_COMMON 100 +#define XENOA_TRAIT_WEIGHT_UNCOMMON 80 +#define XENOA_TRAIT_WEIGHT_RARE 50 +#define XENOA_TRAIT_WEIGHT_EPIC 10 +#define XENOA_TRAIT_WEIGHT_MYTHIC 1 + /* old content */ diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 024e810717e47..97aeb0ef4fcaa 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -47,12 +47,17 @@ ///Cooldown logic for uses var/use_cooldown = XENOA_GENERIC_COOLDOWN var/use_cooldown_timer + ///Extra cooldown from traits - update this with get_extra_cooldowns() when you add traits + var/trait_cooldown = 0 SECONDS ///Cooldown override. If this is true, we're on cooldown var/cooldown_override = FALSE ///List of targets we can pass to our traits var/list/targets = list() + ///Description for the material, based on the traits - Update this with get_material_desc() when you add traits + var/material_description = "" + /datum/component/xenoartifact/New(list/raw_args, type, list/traits) . = ..() generate_xenoa_statics() @@ -60,6 +65,7 @@ //Setup our typing artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() + //If we're force-generating traits if(traits) for(var/datum/xenoartifact_trait/T as() in traits) @@ -89,6 +95,12 @@ //Generate malfunctions focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) + //Cooldown + trait_cooldown = get_extra_cooldowns() + //Description + material_description = get_material_desc() + //Setup description stuff + RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) ///Used to trigger all our traits in order /datum/component/xenoartifact/proc/trigger(force) @@ -98,7 +110,7 @@ else if(use_cooldown_timer) reset_timer(use_cooldown_timer) //Timer setup - use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), use_cooldown, TIMER_STOPPABLE) + use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), use_cooldown + trait_cooldown, TIMER_STOPPABLE) //Trait triggers for(var/i in GLOB.xenoartifact_trait_priorities) SEND_SIGNAL(src, XENOA_TRIGGER, i) @@ -145,7 +157,10 @@ focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) -/datum/component/xenoartifact/proc/register_target(atom/target) +/datum/component/xenoartifact/proc/register_target(atom/target, force) + //Don't register new targets unless the cooldown is finished + if(use_cooldown_timer && !force) + return targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) @@ -155,6 +170,27 @@ targets -= source UnregisterSignal(source, COMSIG_PARENT_QDELETING) +/datum/component/xenoartifact/proc/on_examined(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + var/mob/living/carbon/M = user + if(iscarbon(user) && M.can_see_reagents() || isobserver(user)) + examine_text += "[parent] seems to be made from a [material_description]material." + //Special case for observers that shows all the traits + if(isobserver(user)) + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + if(T.label_name) + examine_text += "- [T.label_name]" + return + +/datum/component/xenoartifact/proc/get_material_desc() + var/temp = "" + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + temp = "[temp][T.examine_desc ? "[T.examine_desc] " : ""]" + return temp + ///material datums /datum/component/xenoartifact_material var/name = "debugium" diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 7165382fec032..8d604937c6c35 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -21,7 +21,6 @@ label_name = "Sturdy" label_desc = "The artifact seems to be made of a sturdy material.\nThis material seems to be triggered by physical interaction." weight = 3 - conductivity = 0.5 /datum/xenoartifact_trait/activator/strudy/New() . = ..() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 7de4299237766..1c1732389e205 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -5,18 +5,64 @@ Electrocutes the mob target, or charges the cell target */ /datum/xenoartifact_trait/major/shock - cooldown = 2 SECONDS + label_name = "Electrified" + label_desc = "The artifact seems to contain electrifying components. Triggering these components will shock the target." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + conductivity = 10 -/datum/xenoartifact_trait/major/shock/trigger(atom/A, _priority) +/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/A) . = ..() if(length(targets)) playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) - for(var/atom/A in targets) - if(iscarbon(A)) - var/mob/living/carbon/victim = A + for(var/atom/target in targets) + if(iscarbon(target)) + var/mob/living/carbon/victim = target victim.electrocute_act(parent.trait_strength*0.25, parent.parent, 1, 1) //Deal a max of 25 - unregister_target(M, FALSE) - else if(istype(A, /obj/item/stock_parts/cell)) + unregister_target(target) + else if(istype(target, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = target C.give((parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool dump_targets() //Get rid of anything else, since we can't interact with it + +/* + Hollow + Captures the target for an amount of time +*/ +/datum/xenoartifact_trait/major/hollow + examine_desc = "hollow" + label_name = "Hollow" + label_desc = "The artifact seems to contain hollow components. Triggering these components will capture the target." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = BLUESPACE_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + weight = -10 + ///Maximum time we hold people for + var/hold_time = 20 SECONDS + +/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/A) + . = ..() + for(var/atom/target in targets) + if(ismovable(target)) + var/atom/movable/M = target + var/atom/movable/AM = parent.parent + //handle being held + if(!isturf(AM.loc) && locate(AM.loc) in targets) + AM.forceMove(get_turf(AM.loc)) + M.forceMove(parent.parent) + //Buckle targets to artifact + AM.buckle_mob(M) + //Add timer to undo this + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger)), hold_time*(parent.trait_strength/100)) + else + unregister_target(target) + +/datum/xenoartifact_trait/major/hollow/un_trigger(atom/A) + if(length(targets)) + var/atom/movable/AM = parent.parent + AM.unbuckle_all_mobs() + for(var/atom/target in targets) + if(ismovable(target)) + var/atom/movable/M = target + if(M.loc == AM) + M.forceMove(get_turf(AM)) + return ..() diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index c268eb293c2bd..b42e7899343a3 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -14,7 +14,7 @@ ///Other traits this trait wont work with. var/list/blacklist_traits = list() ///How rare is this trait? 100 being common, and 1 being very rare - var/rarity = 100 + var/rarity = XENOA_TRAIT_WEIGHT_COMMON ///Does this trait reigster targets? var/register_targets = TRUE @@ -25,12 +25,12 @@ ///What trait priority we use var/priority = TRAIT_PRIORITY_ACTIVATOR - ///List of things we've effected. used to automatically reigster & unregister targets. + ///List of things we've effected. used to automatically reigster & unregister targets. Don't confuse with parent targets, which is things we want to effect var/list/targets = list() ///Characteristics for deduction var/weight = 0 //KG - var/conductivity = 0 //microsiemens per centimeter - I had to look this up + var/conductivity = 0 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable /datum/xenoartifact_trait/minor /datum/xenoartifact_trait/malfunction @@ -41,11 +41,13 @@ RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_parent)) //Setup trigger signals RegisterSignal(parent, XENOA_TRIGGER, PROC_REF(trigger)) + //Appearance + generate_trait_appearance(parent.parent) /datum/xenoartifact_trait/Destroy(force, ...) . = ..() for(var/atom/A in targets) - unregister_target(A) + unregister_target(A, TRUE) /datum/xenoartifact_trait/proc/remove_parent(datum/source) SIGNAL_HANDLER @@ -57,10 +59,10 @@ if(do_trigger) trigger(null, priority, target) targets += target - RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) + RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target_signal), TRUE) //Cleanly unregister an effected target -/datum/xenoartifact_trait/proc/unregister_target(datum/source, do_untrigger = TRUE) +/datum/xenoartifact_trait/proc/unregister_target(datum/source, do_untrigger = FALSE) SIGNAL_HANDLER if(do_untrigger) //This will only happen in the event something is unregistered before we can untrigger, which is needed for QDELs @@ -68,7 +70,11 @@ targets -= source UnregisterSignal(source, COMSIG_PARENT_QDELETING) -//A can be passed manually for debug +/datum/xenoartifact_trait/proc/unregister_target_signal(datum/source) + SIGNAL_HANDLER + + unregister_target(source, TRUE) + /datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/A) SIGNAL_HANDLER @@ -76,7 +82,7 @@ return if(!register_targets) return - //If we've been given an override + //If we've been given an override - This is pretty much for testing here, so don't sweat implementing it elsewhere if(A) register_target(A) //Otherwise just use the artifact's target list @@ -86,13 +92,26 @@ return //Most traits will handle this on their own -/datum/xenoartifact_trait/proc/un_trigger(atom/A) - unregister_target(A, FALSE) +/datum/xenoartifact_trait/proc/un_trigger(atom/A, handle_parent = FALSE) + if(A) + unregister_target(A) + //Parent targets, we shouldn't need this casually, only for niche cases + if(length(parent.targets) && handle_parent) + for(var/atom/I in parent.targets) + unregister_target(I) + //Our targets + if(length(targets)) + for(var/atom/I in targets) + unregister_target(I) return /datum/xenoartifact_trait/proc/dump_targets() for(var/i in targets) - unregister_target(i) + unregister_target(i, TRUE) + +//If we want this trait to modify the artifact's appearance +/datum/xenoartifact_trait/proc/generate_trait_appearance(atom/target) + return ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path) diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index 977c72bbcdd2d748c2225b78bbc6f9c2b7caf6f0..3170ff5805f8e7f1645172dca8e1513769e365ac 100644 GIT binary patch delta 1518 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 From 9a786e81f4160767ff68583bc18ca047346fb104 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 6 Jan 2024 22:09:08 +1100 Subject: [PATCH 005/339] Revive debug labeller - 6 1 23 I need to redo all this shitcode --- code/modules/clothing/outfits/standard.dm | 2 +- code/modules/research/designs/misc_designs.dm | 6 +- .../components/xenoartifact.dm | 40 ++-- .../xenoarchaeology/old/xenoartifact.dm | 2 +- code/modules/xenoarchaeology/traits/majors.dm | 171 ++++++++++++++++-- code/modules/xenoarchaeology/traits/traits.dm | 25 ++- .../xenoarchaeology/xenoartifact_labeler.dm | 98 +++++----- 7 files changed, 244 insertions(+), 100 deletions(-) diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index c3209f1c26888..c8a6d03d4befe 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -18,7 +18,7 @@ /obj/item/storage/part_replacer/bluespace/tier4=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1,\ - /obj/item/xenoartifact_labeler/debug=1,\ + /obj/item/xenoartifact_labeller/debug=1,\ /obj/item/debug/orb_of_power=1 ) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index df48a70c46f83..11a9732267acf 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -256,13 +256,13 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_SCIENCE -/datum/design/xenoartifact_labeler - name = "Artifact Labeler" +/datum/design/xenoartifact_labeller + name = "xenoartifact_labeller" desc = "A scientific labeler used to warn others of the dangers of an alien artifact." id = "xenoa_labeler" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000, /datum/material/gold = 3000) - build_path = /obj/item/xenoartifact_labeler + build_path = /obj/item/xenoartifact_labeller category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 97aeb0ef4fcaa..5662ffff4759c 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -6,10 +6,6 @@ /obj/item/xenoartifact icon_state = "skub" -/obj/item/xenoartifact/ComponentInitialize() - . = ..() - AddComponent(/datum/component/xenoartifact) - /datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. ///Buying and selling related, based on guess qaulity var/modifier = 0.5 @@ -54,11 +50,13 @@ ///List of targets we can pass to our traits var/list/targets = list() + ///Maximum range we can register targets from + var/target_range = 1 ///Description for the material, based on the traits - Update this with get_material_desc() when you add traits var/material_description = "" -/datum/component/xenoartifact/New(list/raw_args, type, list/traits) +/datum/component/xenoartifact/Initialize(type, list/traits) . = ..() generate_xenoa_statics() @@ -69,11 +67,11 @@ //If we're force-generating traits if(traits) for(var/datum/xenoartifact_trait/T as() in traits) + T = new T(src) //List building if(!artifact_traits[T.priority]) artifact_traits[T.priority] = list() //handle adding trait - T = new T(src) artifact_traits[T.priority] += T blacklisted_traits += T.blacklist_traits blacklisted_traits += T @@ -128,11 +126,11 @@ for(var/i in 1 to amount) //Pick a random trait var/datum/xenoartifact_trait/T = pick_weight(options) + T = new T(src) //List building - if(!artifact_traits[initial(T.priority)]) - artifact_traits[initial(T.priority)] = list() + if(!artifact_traits[T.priority]) + artifact_traits[T.priority] = list() //handle trait adding - T = new T(src) artifact_traits[T.priority] += T blacklisted_traits += T.blacklist_traits blacklisted_traits += T @@ -150,8 +148,10 @@ time += T.cooldown return time -/datum/component/xenoartifact/proc/handle_malfunctions() +/datum/component/xenoartifact/proc/handle_malfunctions(itterate = TRUE) if(!prob(instability)) + if(itterate) + instability += artifact_type.instability_step return var/list/focus_traits focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() @@ -161,6 +161,9 @@ //Don't register new targets unless the cooldown is finished if(use_cooldown_timer && !force) return + //Range check + if(get_dist(get_turf(parent), get_turf(target))> target_range) + return targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) @@ -184,11 +187,26 @@ examine_text += "- [T.label_name]" return +//Build the description for the scientific examination /datum/component/xenoartifact/proc/get_material_desc() var/temp = "" + var/list/description_category = list() + //Get descriptions from each category for(var/i in artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) - temp = "[temp][T.examine_desc ? "[T.examine_desc] " : ""]" + if(!description_category[i]) + description_category[i] = list() + if(T.examine_desc) //Avoid adding null, so later logic works + description_category[i] += initial(T.examine_desc) + //Pick one from each category to build an entire description + var/unknown_used = FALSE + for(var/i in description_category) + //Descriptor + if(length(description_category[i])) + temp = "[temp][pick(description_category[i])] " + else if(!unknown_used) + temp = "[temp]unknown " + unknown_used = TRUE return temp ///material datums diff --git a/code/modules/xenoarchaeology/old/xenoartifact.dm b/code/modules/xenoarchaeology/old/xenoartifact.dm index 1ed9e95bb06ff..2c9affb86dea1 100644 --- a/code/modules/xenoarchaeology/old/xenoartifact.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact.dm @@ -211,7 +211,7 @@ Make artifacts into item components qdel(locate(/obj/item/xenoartifact_label) in contents) //Let people label in peace - if(istype(I, /obj/item/xenoartifact_label) || istype(I, /obj/item/xenoartifact_labeler)) + if(istype(I, /obj/item/xenoartifact_label) || istype(I, /obj/item/xenoartifact_labeller)) return //abort if safety diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 1c1732389e205..0ef589a93b962 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -1,4 +1,5 @@ /datum/xenoartifact_trait/major + priority = TRAIT_PRIORITY_MAJOR /* Shock @@ -11,11 +12,15 @@ flags = PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT conductivity = 10 -/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/A) +/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) . = ..() - if(length(targets)) + if(!.) + dump_targets() + return + var/list/focus = override ? list(override) : targets + if(length(focus)) playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) - for(var/atom/target in targets) + for(var/atom/target in focus) if(iscarbon(target)) var/mob/living/carbon/victim = target victim.electrocute_act(parent.trait_strength*0.25, parent.parent, 1, 1) //Deal a max of 25 @@ -37,32 +42,162 @@ flags = BLUESPACE_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT weight = -10 ///Maximum time we hold people for - var/hold_time = 20 SECONDS + var/hold_time = 15 SECONDS -/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/A) +/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override) . = ..() - for(var/atom/target in targets) + if(!.) + dump_targets() + return + var/list/focus = override ? list(override) : targets + for(var/atom/target in focus) if(ismovable(target)) var/atom/movable/M = target + if(M.anchored) + unregister_target(target) + continue var/atom/movable/AM = parent.parent //handle being held - if(!isturf(AM.loc) && locate(AM.loc) in targets) + if(!isturf(AM.loc) && locate(AM.loc) in focus) AM.forceMove(get_turf(AM.loc)) M.forceMove(parent.parent) //Buckle targets to artifact AM.buckle_mob(M) - //Add timer to undo this - addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger)), hold_time*(parent.trait_strength/100)) + //Add timer to undo this - becuase the hold time is longer than an actual artifact cooldown, we need to do this per-mob + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), M), hold_time*(parent.trait_strength/100)) else unregister_target(target) -/datum/xenoartifact_trait/major/hollow/un_trigger(atom/A) - if(length(targets)) - var/atom/movable/AM = parent.parent - AM.unbuckle_all_mobs() - for(var/atom/target in targets) - if(ismovable(target)) - var/atom/movable/M = target - if(M.loc == AM) - M.forceMove(get_turf(AM)) +/datum/xenoartifact_trait/major/hollow/un_trigger(atom/override, handle_parent = FALSE) + var/list/focus = override ? list(override) : targets + if(!length(focus)) + return ..() + var/atom/movable/AM = parent.parent + AM.unbuckle_all_mobs() + for(var/atom/target in focus) + if(ismovable(target)) + var/atom/movable/M = target + if(M.loc == AM) + M.forceMove(get_turf(AM)) + return ..() + +/* + Temporal + Creates a timestop object at the position of the artfiact +*/ + +/datum/xenoartifact_trait/major/timestop + label_name = "Temporal" + label_desc = "Temporal: The artifact seems to contain temporal components. Triggering these components will create a temporal rift." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = URANIUM_TRAIT | BANANIUM_TRAIT + register_targets = FALSE + ///Maximum time we stop time for + var/max_time = 10 SECONDS + +/datum/xenoartifact_trait/major/timestop/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(parent.parent) + if(!T) + return + new /obj/effect/timestop(T, 2, ((parent.trait_strength/100)*max_time), parent.parent) + +/* + Barreled + The artifact shoots the target with a random projectile +*/ +/datum/xenoartifact_trait/major/projectile + examine_desc = "barreled" + label_name = "Barreled" + label_desc = "Barreled: The artifact seems to contain projectile components. Triggering these components will produce a projectile." + flags = PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + extra_target_range = 2 + ///List of projectiles we *could* shoot + var/list/possible_projectiles = list(/obj/projectile/beam/disabler, /obj/projectile/beam/laser, /obj/projectile/seedling, /obj/projectile/beam/xray, /obj/projectile/bullet) + ///The projectile type we *will* shoot + var/obj/projectile/choosen_projectile + +/datum/xenoartifact_trait/major/projectile/New(atom/_parent) + . = ..() + choosen_projectile = pick(possible_projectiles) + +/datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + dump_targets() + return + var/list/focus = override ? list(override) : targets + for(var/atom/target in focus) + var/turf/T = get_turf(target) + if(isturf(target)) + T = get_edge_target_turf(parent.parent, pick(NORTH, EAST, SOUTH, WEST)) + var/obj/projectile/P = new choosen_projectile() + P.preparePixelProjectile(T, parent.parent) + P.fire() + playsound(get_turf(parent.parent), 'sound/mecha/mech_shield_deflect.ogg', 50, TRUE) + dump_targets() + + +/* + Fuzzy + The artifact shoots the target with a random projectile +*/ +/datum/xenoartifact_trait/major/animalize ///All of this is stolen from corgium. + label_name = "Bestialized" + label_desc = "Bestialized: The artifact contains transforming components. Triggering these components transforms the target into an animal." + flags = BLUESPACE_TRAIT | BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + ///List of potential animals we could turn people into + var/list/possible_animals = list(/mob/living/simple_animal/pet/dog/corgi) + ///The animal we will turn people into + var/mob/choosen_animal + ///How long we keep them as animals + var/animal_time = 15 SECONDS + +/datum/xenoartifact_trait/major/animalize/New(atom/_parent) + . = ..() + choosen_animal = pick(possible_animals) + +/datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + dump_targets() + return + var/list/focus = override ? list(override) : targets + for(var/mob/living/target in focus) + if(istype(target, choosen_animal) || IS_DEAD_OR_INCAP(target)) + continue + transform(target) + //Add timer to undo this + addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), target), animal_time*(parent.trait_strength/100)) + +/datum/xenoartifact_trait/major/animalize/un_trigger(atom/override, handle_parent = FALSE) + var/list/focus = override ? list(override) : targets + if(!length(focus)) + return ..() + //Restore every swap holder + for(var/mob/living/target in focus) + var/obj/shapeshift_holder/H = (locate(/obj/shapeshift_holder) in target) || istype(target.loc, /obj/shapeshift_holder) ? target.loc : null + H?.restore(FALSE, FALSE) + REMOVE_TRAIT(target, TRAIT_NOBREATH, TRAIT_GENERIC) return ..() + +//Transform a valid target into our choosen animal +/datum/xenoartifact_trait/major/animalize/proc/transform(mob/living/target) + if(!istype(target)) + return + //Check for a mob swap holder, and deny the transform if we find one + var/obj/shapeshift_holder/H = locate(/obj/shapeshift_holder) in target + if(H) + playsound(get_turf(target), 'sound/machines/buzz-sigh.ogg', 50, TRUE) + return + ADD_TRAIT(target, TRAIT_NOBREATH, TRAIT_GENERIC) + //Setup the animal + var/mob/new_animal = new choosen_animal(target.loc) + //Swap holder + H = new(new_animal, src, target) + RegisterSignal(new_animal, COMSIG_MOB_DEATH, PROC_REF(un_trigger)) + return new_animal diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index b42e7899343a3..9dea4453eef23 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -27,6 +27,8 @@ ///List of things we've effected. used to automatically reigster & unregister targets. Don't confuse with parent targets, which is things we want to effect var/list/targets = list() + ///Extra target range we add to the artifact + var/extra_target_range = 0 ///Characteristics for deduction var/weight = 0 //KG @@ -43,6 +45,8 @@ RegisterSignal(parent, XENOA_TRIGGER, PROC_REF(trigger)) //Appearance generate_trait_appearance(parent.parent) + //Stats + parent.target_range += extra_target_range /datum/xenoartifact_trait/Destroy(force, ...) . = ..() @@ -66,7 +70,7 @@ SIGNAL_HANDLER if(do_untrigger) //This will only happen in the event something is unregistered before we can untrigger, which is needed for QDELs - un_trigger(source) + un_trigger(source, override = source) targets -= source UnregisterSignal(source, COMSIG_PARENT_QDELETING) @@ -75,16 +79,18 @@ unregister_target(source, TRUE) -/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/A) +/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/override) SIGNAL_HANDLER + . = TRUE if(_priority != priority && _priority) - return + return FALSE if(!register_targets) return - //If we've been given an override - This is pretty much for testing here, so don't sweat implementing it elsewhere - if(A) - register_target(A) + //If we've been given an override + if(override) + register_target(override) + return //Otherwise just use the artifact's target list else if(length(parent.targets)) for(var/atom/I in parent.targets) @@ -92,9 +98,10 @@ return //Most traits will handle this on their own -/datum/xenoartifact_trait/proc/un_trigger(atom/A, handle_parent = FALSE) - if(A) - unregister_target(A) +/datum/xenoartifact_trait/proc/un_trigger(atom/override, handle_parent = FALSE) + if(override) + unregister_target(override) + return //Parent targets, we shouldn't need this casually, only for niche cases if(length(parent.targets) && handle_parent) for(var/atom/I in parent.targets) diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/xenoartifact_labeler.dm index 4980f67168207..9c4d60e9caebc 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeler.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeler.dm @@ -1,7 +1,8 @@ -/obj/item/xenoartifact_labeler - name = "artifact labeler" +//TODO: Redo this code, or just improve it - Racc +/obj/item/xenoartifact_labeller + name = "artifact labeller" icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' - icon_state = "xenoartifact_labeler" + icon_state = "xenoartifact_labeller" desc = "A tool scientists use to label their alien bombs." throw_speed = 3 throw_range = 5 @@ -32,46 +33,43 @@ ///Cooldown for stickers COOLDOWN_DECLARE(sticker_cooldown) -/obj/item/xenoartifact_labeler/Initialize(mapload) +/obj/item/xenoartifact_labeller/Initialize(mapload) . = ..() generate_xenoa_statics() - //Append activators - activator_traits = get_trait_list_desc(activator_traits, GLOB.xenoa_activators) - //Minors - minor_traits = get_trait_list_desc(minor_traits, GLOB.xenoa_minors) - //Majors - major_traits = get_trait_list_desc(major_traits, GLOB.xenoa_majors) - //Malfs - malfunction_list = get_trait_list_desc(malfunction_list, GLOB.xenoa_malfunctions) - -/obj/item/xenoartifact_labeler/ui_interact(mob/user, datum/tgui/ui) + //generate data for trait names + activator_traits = get_trait_list_names(GLOB.xenoa_activators) + minor_traits = get_trait_list_names(GLOB.xenoa_minors) + major_traits = get_trait_list_names(GLOB.xenoa_majors) + malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) + +/obj/item/xenoartifact_labeller/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "XenoartifactLabeler") ui.open() -/obj/item/xenoartifact_labeler/ui_data(mob/user) +/obj/item/xenoartifact_labeller/ui_data(mob/user) var/list/data = list() data["selected_activator_traits"] = selected_activator_traits - data["activator_traits"] = activator_traits - data["selected_minor_traits"] = selected_minor_traits - data["minor_traits"] = minor_traits - data["selected_major_traits"] = selected_major_traits - data["major_traits"] = major_traits - data["selected_malfunction_traits"] = selected_malfunction_traits - data["malfunction_list"] = malfunction_list - data["info_list"] = info_list + return data +/obj/item/xenoartifact_labeller/ui_static_data(mob/user) + . = ..() + var/list/data = list() + data["activator_traits"] = activator_traits + data["minor_traits"] = minor_traits + data["major_traits"] = major_traits + data["malfunction_list"] = malfunction_list return data -/obj/item/xenoartifact_labeler/ui_act(action, params) +/obj/item/xenoartifact_labeller/ui_act(action, params) if(..()) return - //Switch function could work here but it'd be pointless for the 1-2 cases + if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown)) COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) create_label(sticker_name) @@ -96,18 +94,19 @@ update_icon() return TRUE -//Get a list of all the specified trait types names, actually -/obj/item/xenoartifact_labeler/proc/get_trait_list_desc(list/traits, list/trait_type) - for(var/datum/xenoartifact_trait/X as() in trait_type) - traits += (initial(X.label_desc) || initial(X.label_name)) - return traits +//Get a list of all the specified trait types names +/obj/item/xenoartifact_labeller/proc/get_trait_list_names(list/trait_type) + var/list/temp = list() + for(var/datum/xenoartifact_trait/T as() in trait_type) + temp += initial(T.label_name) + return temp -/obj/item/xenoartifact_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? +/obj/item/xenoartifact_labeller/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? if(place.Find(culprit)) return TRUE return FALSE -/obj/item/xenoartifact_labeler/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/xenoartifact_labeller/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown)) COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) @@ -116,7 +115,7 @@ to_chat(user, "The labeler is still printing.") ///reset all the options -/obj/item/xenoartifact_labeler/proc/clear_selection() +/obj/item/xenoartifact_labeller/proc/clear_selection() sticker_name = null info_list = list() sticker_traits = list() @@ -126,7 +125,7 @@ selected_malfunction_traits = list() ui_update() -/obj/item/xenoartifact_labeler/proc/create_label(new_name, mob/target, mob/user) +/obj/item/xenoartifact_labeller/proc/create_label(new_name, mob/target, mob/user) var/obj/item/xenoartifact_label/P = new(get_turf(src)) if(new_name) P.name = new_name @@ -135,7 +134,7 @@ P.info = selected_activator_traits+selected_minor_traits+selected_major_traits+selected_malfunction_traits P.attempt_attach(target, user, TRUE) -/obj/item/xenoartifact_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) +/obj/item/xenoartifact_labeller/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) var/datum/xenoartifact_trait/description_holder var/new_trait for(var/t in trait_list) @@ -153,13 +152,13 @@ sticker_traits -= new_trait //This is just a hacky way of getting the info from a datum using its desc becuase I wrote this last and it's not heartbreaking -/obj/item/xenoartifact_labeler/proc/desc2datum(udesc) +/obj/item/xenoartifact_labeller/proc/desc2datum(udesc) for(var/datum/xenoartifact_trait/X as() in GLOB.xenoa_all_traits) if((udesc == initial(X.label_desc)) || (udesc == initial(X.label_name))) return X CRASH("The xenoartifact trait description '[udesc]' doesn't have a corresponding trait. Something fucked up.") -// Not to be confused with labeler +// Not to be confused with labeller /obj/item/xenoartifact_label icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' icon_state = "sticker_star" @@ -243,28 +242,13 @@ text = "[text] [X]\n" return text -/obj/item/xenoartifact_labeler/debug +/obj/item/xenoartifact_labeller/debug name = "xenoartifact debug labeler" desc = "Use to create specific Xenoartifacts" -/obj/item/xenoartifact_labeler/debug/afterattack(atom/target, mob/user) +/obj/item/xenoartifact_labeller/debug/afterattack(atom/target, mob/user) return -/obj/item/xenoartifact_labeler/debug/create_label(new_name) - return - /* - TODO: - Racc - var/obj/item/xenoartifact/A = new(get_turf(loc), XENOA_DEBUGIUM) - say("Created [A] at [A.loc]") - A.charge_req = 100 - A.malfunction_mod = 0 - A.malfunction_chance = 0 - qdel(A.traits) - A.traits = list() - for(var/X in sticker_traits) //Add new ones - say(X) - A.traits += new X - for(var/datum/xenoartifact_trait/t as() in A.traits) //Setup new ones - t.on_init(A) - A = null - */ +/obj/item/xenoartifact_labeller/debug/create_label(new_name) + var/obj/item/xenoartifact/A = new(get_turf(loc)) + A.AddComponent(/datum/component/xenoartifact, /datum/component/xenoartifact_material, sticker_traits) From 96d540e94aa0f906fb74f0452684798060596164 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 11:56:33 +1100 Subject: [PATCH 006/339] Update activators.dm --- code/modules/xenoarchaeology/traits/activators.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 8d604937c6c35..9f0f63c3fe640 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -19,7 +19,7 @@ /datum/xenoartifact_trait/activator/strudy examine_desc = "sturdy" label_name = "Sturdy" - label_desc = "The artifact seems to be made of a sturdy material.\nThis material seems to be triggered by physical interaction." + label_desc = "The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." weight = 3 /datum/xenoartifact_trait/activator/strudy/New() From 6e2e54b03bdfb7560286fe3766258c4a78d3ab55 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 13:23:31 +1100 Subject: [PATCH 007/339] More majors - 7 1 24 --- code/__DEFINES/xenoartifact.dm | 11 +- code/_globalvars/xenoartifact.dm | 16 +-- .../old/xenoartifact_activators.dm | 14 +-- .../old/xenoartifact_majors.dm | 36 +++---- .../old/xenoartifact_malfunctions.dm | 20 ++-- .../old/xenoartifact_minors.dm | 36 +++---- .../old/xenoartifact_traits.dm | 2 +- code/modules/xenoarchaeology/traits/majors.dm | 101 +++++++++++++++++- code/modules/xenoarchaeology/traits/traits.dm | 2 +- 9 files changed, 165 insertions(+), 73 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index 740ba895a3369..3f4981609f41f 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -20,7 +20,7 @@ #define XENOA_TRIGGER "xenoa_trigger" ///generic starting cooldown timer for triggers -#define XENOA_GENERIC_COOLDOWN 8 SECONDS +#define XENOA_GENERIC_COOLDOWN 5 SECONDS //Artifact trait strengths #define XENOA_TRAIT_STRENGTH_NORMAL 50 @@ -28,12 +28,13 @@ #define XENOA_TRAIT_STRENGTH_STRONG 100 ///trait flags -#define BLUESPACE_TRAIT (1<<0) -#define PLASMA_TRAIT (1<<1) -#define URANIUM_TRAIT (1<<2) -#define BANANIUM_TRAIT (1<<3) +#define XENOA_BLUESPACE_TRAIT (1<<0) +#define XENOA_PLASMA_TRAIT (1<<1) +#define XENOA_URANIUM_TRAIT (1<<2) +#define XENOA_BANANIUM_TRAIT (1<<3) ///trait cooldowns +#define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS #define XENOA_TRAIT_COOLDOWN_SAFE 3 SECONDS #define XENOA_TRAIT_COOLDOWN_DANGEROUS 5 SECONDS #define XENOA_TRAIT_COOLDOWN_GAMER 8 SECONDS diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index 61c808724e885..d69150f2ed7ba 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -11,10 +11,10 @@ GLOBAL_LIST(xenoa_malfunctions) GLOBAL_LIST(xenoa_all_traits) ///Blacklist for traits -GLOBAL_LIST(xenoa_bluespace_traits) -GLOBAL_LIST(xenoa_plasma_traits) -GLOBAL_LIST(xenoa_uranium_traits) -GLOBAL_LIST(xenoa_bananium_traits) +GLOBAL_LIST(xenoa_XENOA_BLUESPACE_TRAITs) +GLOBAL_LIST(xenoa_XENOA_PLASMA_TRAITs) +GLOBAL_LIST(xenoa_XENOA_URANIUM_TRAITs) +GLOBAL_LIST(xenoa_XENOA_BANANIUM_TRAITs) ///List of emotes for emote-trait GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, @@ -37,10 +37,10 @@ GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/ GLOB.xenoa_malfunctions = compile_artifact_weights(/datum/xenoartifact_trait/malfunction) GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) - GLOB.xenoa_bluespace_traits = compile_artifact_whitelist(BLUESPACE_TRAIT) - GLOB.xenoa_plasma_traits = compile_artifact_whitelist(PLASMA_TRAIT) - GLOB.xenoa_uranium_traits = compile_artifact_whitelist(URANIUM_TRAIT) - GLOB.xenoa_uranium_traits = compile_artifact_whitelist(BANANIUM_TRAIT) + GLOB.xenoa_XENOA_BLUESPACE_TRAITs = compile_artifact_whitelist(XENOA_BLUESPACE_TRAIT) + GLOB.xenoa_XENOA_PLASMA_TRAITs = compile_artifact_whitelist(XENOA_PLASMA_TRAIT) + GLOB.xenoa_XENOA_URANIUM_TRAITs = compile_artifact_whitelist(XENOA_URANIUM_TRAIT) + GLOB.xenoa_XENOA_URANIUM_TRAITs = compile_artifact_whitelist(XENOA_BANANIUM_TRAIT) /* New content diff --git a/code/modules/xenoarchaeology/old/xenoartifact_activators.dm b/code/modules/xenoarchaeology/old/xenoartifact_activators.dm index 7ddfc2ac9f9aa..da436be357dc7 100644 --- a/code/modules/xenoarchaeology/old/xenoartifact_activators.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact_activators.dm @@ -7,7 +7,7 @@ label_desc = "Sturdy: The material is sturdy. The amount of force applied seems to directly correlate to the size of the reaction." charge = 25 signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT weight = 30 /datum/xenoartifact_trait/activator/impact/pass_input(datum/source, obj/item/thing, mob/user, atom/target) @@ -23,7 +23,7 @@ label_desc = "Flammable: The material is flammable, and seems to react when ignited." charge = 25 signals = list(COMSIG_PARENT_ATTACKBY) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator/burn/on_init(obj/item/xenoartifact/X) ..() @@ -47,7 +47,7 @@ charge = 25 blacklist_traits = list(/datum/xenoartifact_trait/minor/capacitive) signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator/clock/on_init(obj/item/xenoartifact/X) ..() @@ -74,7 +74,7 @@ label_desc = "Signal: The material receives radio frequencies and reacts when a matching code is delivered." charge = 25 signals = list(XENOA_SIGNAL) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator/signal/on_init(obj/item/xenoartifact/X) ..() @@ -102,7 +102,7 @@ label_desc = "Charged: The material has a natural power draw. Supplying any current to this will cause a reaction." charge = 25 signals = list(COMSIG_PARENT_ATTACKBY) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator/batteryneed/on_item(obj/item/xenoartifact/X, atom/user, atom/item) if(istype(item, /obj/item/multitool)) @@ -126,7 +126,7 @@ charge = 25 signals = list(COMSIG_ITEM_PICKUP) blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/major/distablizer) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator/weighted/pass_input(datum/source, obj/item/thing, mob/living/carbon/user, mob/living/carbon/human/target) var/obj/item/clothing/gloves/artifact_pinchers/P @@ -147,7 +147,7 @@ charge = 25 blacklist_traits = (/datum/xenoartifact_trait/minor/dense) signals = list(COMSIG_MOVABLE_IMPACT) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator/pitch/pass_input(datum/source, obj/item/thing, mob/user, atom/target) var/obj/item/xenoartifact/X = source diff --git a/code/modules/xenoarchaeology/old/xenoartifact_majors.dm b/code/modules/xenoarchaeology/old/xenoartifact_majors.dm index c0a3a3559c3fa..6d356a902b15c 100644 --- a/code/modules/xenoarchaeology/old/xenoartifact_majors.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact_majors.dm @@ -5,7 +5,7 @@ /datum/xenoartifact_trait/major/capture desc = "Hollow" label_desc = "Hollow: The shape is hollow, however the inside is deceptively large." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT var/spawn_russian = FALSE /datum/xenoartifact_trait/major/capture/on_init(obj/item/xenoartifact/X) @@ -45,7 +45,7 @@ /datum/xenoartifact_trait/major/shock desc = "Conductive" label_desc = "Conductive: The shape resembles two lighting forks. Subtle arcs seem to leaps across them." - flags = PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/major/shock/on_touch(obj/item/xenoartifact/X, mob/user) to_chat(user, "You feel a slight static after touching the [X.name].") @@ -88,7 +88,7 @@ /datum/xenoartifact_trait/major/laser desc = "Barreled" label_desc = "Barreled: The shape resembles the barrel of a gun. It's possible that it might dispense candy." - flags = PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/major/laser/activate(obj/item/xenoartifact/X, atom/target, mob/living/user) //light target on fire if we're close @@ -120,7 +120,7 @@ /datum/xenoartifact_trait/major/corginator ///All of this is stolen from corgium. desc = "Fuzzy" //Weirdchamp label_desc = "Fuzzy: The shape is hard to discern under all the hair sprouting out from the surface. You swear you've heard it bark before." - flags = BLUESPACE_TRAIT + flags = XENOA_BLUESPACE_TRAIT ///List of all affected targets, used for early qdel var/list/victims = list() ///Ref to timer - if corgi is deleted early remove this reference to the puppy @@ -186,7 +186,7 @@ /datum/xenoartifact_trait/major/emp label_name = "EMP" label_desc = "EMP: The shape of the Artifact doesn't resemble anything particularly interesting. Technology around the Artifact seems to malfunction." - flags = URANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT weight = 25 //annoying trait /datum/xenoartifact_trait/major/emp/activate(obj/item/xenoartifact/X) @@ -237,7 +237,7 @@ /datum/xenoartifact_trait/major/teleporting desc = "Displaced" label_desc = "Displaced: The shape's state is unstable, causing it to shift through planes at a localized axis. Just ask someone from science..." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/major/teleporting/activate(obj/item/xenoartifact/X, atom/target, atom/user) if(istype(target, /atom/movable)) @@ -251,7 +251,7 @@ /datum/xenoartifact_trait/major/lamp label_name = "Lamp" label_desc = "Lamp: The Artifact emits light. Nothing in its shape suggests this." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT var/light_mod /datum/xenoartifact_trait/major/lamp/on_init(obj/item/xenoartifact/X) @@ -272,7 +272,7 @@ /datum/xenoartifact_trait/major/forcefield label_name = "Wall" label_desc = "Wall: The Artifact produces a resonance that forms impenetrable walls. Here's one you'll never crawl!" - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT var/size /datum/xenoartifact_trait/major/forcefield/on_init(obj/item/xenoartifact/X) @@ -304,7 +304,7 @@ /datum/xenoartifact_trait/major/heal label_name = "Healing" label_desc = "Healing: The Artifact repeairs any damaged organic tissue the targat may contain. Widely considered the Holy Grail of Artifact traits." - flags = BLUESPACE_TRAIT + flags = XENOA_BLUESPACE_TRAIT weight = 25 var/healing_type @@ -335,7 +335,7 @@ /datum/xenoartifact_trait/major/chem desc = "Hypodermic" label_desc = "Hypodermic: The Artifact's shape is comprised of many twisting tubes and vials, it seems a liquid may be inside." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/long) var/datum/reagent/formula var/amount @@ -357,7 +357,7 @@ /datum/xenoartifact_trait/major/push label_name = "Push" label_desc = "Push: The Artifact pushes anything not bolted down. The shape doesn't suggest this." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/major/push/activate(obj/item/xenoartifact/X, atom/target) if(ismovable(target)) @@ -373,7 +373,7 @@ /datum/xenoartifact_trait/major/pull label_name = "Pull" label_desc = "Pull: The Artifact pulls anything not bolted down. The shape doesn't suggest this." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/major/pull/on_init(obj/item/xenoartifact/X) X.max_range += 1 @@ -395,7 +395,7 @@ desc = "Horned" label_name = "Horn" label_desc = "Horn: The Artifact's shape resembles a horn. These Artifacts are widely deployed by the most clever clowns." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT var/sound /datum/xenoartifact_trait/major/horn/on_init(obj/item/xenoartifact/X) @@ -414,7 +414,7 @@ /datum/xenoartifact_trait/major/gas desc = "Porous" label_desc = "Porous: The Artifact absorbs a specific nearby gas and replaces it with an undeterminable one." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT var/static/list/valid_inputs = list( /datum/gas/oxygen = 6, /datum/gas/nitrogen = 3, @@ -460,7 +460,7 @@ desc = "Destabilizing" label_desc = "Destabilizing: The Artifact collapses an improper bluespace matrix on the target, sending them to an unknown location." weight = 25 - flags = URANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/aura) var/obj/item/xenoartifact/exit @@ -505,7 +505,7 @@ /datum/xenoartifact_trait/major/smokey desc = "Dissipating" label_desc = "Dissipating: The Artifact is dissipating as if it was made of smoke." - flags = URANIUM_TRAIT | PLASMA_TRAIT | BLUESPACE_TRAIT + flags = XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BLUESPACE_TRAIT /datum/xenoartifact_trait/major/smokey/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) var/datum/effect_system/smoke_spread/E = new() @@ -518,7 +518,7 @@ /datum/xenoartifact_trait/major/marker label_name = "Marker" label_desc = "Marker: The Artifact causes the target to refract a unique color index." - flags = PLASMA_TRAIT | BLUESPACE_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_BLUESPACE_TRAIT ///The color this artifact dispenses var/color @@ -537,7 +537,7 @@ /datum/xenoartifact_trait/major/emote label_name = "Emotional" label_desc = "Emotional: The Artifact causes the target to experience, or preform, a random emotion." - flags = PLASMA_TRAIT | BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT ///Emote to preform var/datum/emote/emote diff --git a/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm b/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm index 8f13cf61e5361..ccdb8d565a7f4 100644 --- a/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm @@ -6,7 +6,7 @@ label_name = "P.B.R." label_desc = "Parallel Bearspace Retrieval: A strange malfunction causes the Artifact to open a gateway to deep bearspace." weight = 15 - flags = URANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT var/list/bears = list() //bear per bears /datum/xenoartifact_trait/malfunction/bear/activate(obj/item/xenoartifact/X) @@ -30,7 +30,7 @@ /datum/xenoartifact_trait/malfunction/badtarget label_name = "Maltargeting" label_desc = "Maltargeting: A strange malfunction that causes the Artifact to always target the original user." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT /datum/xenoartifact_trait/malfunction/badtarget/activate(obj/item/xenoartifact/X, atom/target, atom/user) var/mob/living/M @@ -49,7 +49,7 @@ /datum/xenoartifact_trait/malfunction/strip label_name = "B.A.D." label_desc = "Bluespace Axis Desync: A strange malfunction inside the Artifact causes it to shift the target's realspace position with its bluespace mass in an offset manner. This results in the target dropping all they're wearing. This is probably the plot to a very educational movie." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/malfunction/strip/activate(obj/item/xenoartifact/X, atom/target) if(isliving(target)) @@ -71,7 +71,7 @@ label_name = "C.D.E." label_desc = "Cerebral Dysfunction Emergence: A strange malfunction that causes the Artifact to force brain traumas to develop in a given target." weight = 25 - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT var/datum/brain_trauma/trauma /datum/xenoartifact_trait/malfunction/trauma/on_init(obj/item/xenoartifact/X) @@ -95,7 +95,7 @@ label_name = "Combustible" label_desc = "Combustible: A strange malfunction that causes the Artifact to violently combust." weight = 15 - flags = URANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/malfunction/heated/activate(obj/item/xenoartifact/X, atom/target, atom/user) var/turf/T = get_turf(X) @@ -133,7 +133,7 @@ /datum/xenoartifact_trait/malfunction/radioactive label_name = "Radioactive" label_desc = "Radioactive: The Artifact Emmits harmful particles when a reaction takes place." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT /datum/xenoartifact_trait/malfunction/radioactive/on_init(obj/item/xenoartifact/X) X.rad_act(25) @@ -157,7 +157,7 @@ /datum/xenoartifact_trait/malfunction/twin label_name = "Anti-Cloning" label_desc = "Anti-Cloning: The Artifact produces an arguably maleviolent clone of target." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT var/list/clones = list() /datum/xenoartifact_trait/malfunction/twin/activate(obj/item/xenoartifact/X, mob/living/target, atom/user, setup) @@ -213,7 +213,7 @@ /datum/xenoartifact_trait/malfunction/explode label_name = "Delaminating" label_desc = "Delaminating: The Artifact violently collapses, exploding." - flags = URANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/malfunction/explode/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) . = ..() @@ -231,7 +231,7 @@ /datum/xenoartifact_trait/malfunction/absorbant label_name = "Absorbing" label_desc = "Absorbing: The Artifact absorbs large volumes of nearby gasses." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT ///What gasses we've S U C K E D var/datum/gas_mixture/air_contents ///Gasses we can suck. Currently everything but, it's here if we need to blacklist in the future @@ -267,7 +267,7 @@ /datum/xenoartifact_trait/malfunction/hallucination label_name = "Hallucinogenic" label_desc = "Hallucinogenic: The Artifact causes the target to hallucinate." - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | PLASMA_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT /datum/xenoartifact_trait/malfunction/hallucination/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) if(isliving(target)) diff --git a/code/modules/xenoarchaeology/old/xenoartifact_minors.dm b/code/modules/xenoarchaeology/old/xenoartifact_minors.dm index 7872902f58439..bd3026cc86191 100644 --- a/code/modules/xenoarchaeology/old/xenoartifact_minors.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact_minors.dm @@ -5,7 +5,7 @@ /datum/xenoartifact_trait/minor/looped desc = "Looped" label_desc = "Looped: The Artifact feeds into itself and amplifies its own charge." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/looped/on_item(obj/item/xenoartifact/X, atom/user, atom/item) if(istype(item, /obj/item/multitool)) @@ -22,7 +22,7 @@ /datum/xenoartifact_trait/minor/capacitive desc = "Capacitive" label_desc = "Capacitive: The Artifact's structure allows it to hold extra charges." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT var/charges //Extra uses, not total var/saved_cooldown //This may be considered messy but it's a more practical approach that avoids making an edgecase @@ -58,7 +58,7 @@ desc = "Dense" label_desc = "Dense: The Artifact is dense and cannot be easily lifted but, the design has a slightly higher reaction rate." blacklist_traits = list(/datum/xenoartifact_trait/minor/wearable, /datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/light, /datum/xenoartifact_trait/minor/heavy, /datum/xenoartifact_trait/minor/blocking, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/minor/slippery) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/dense/on_init(obj/item/xenoartifact/X) X.density = TRUE @@ -73,7 +73,7 @@ desc = "Sharp" label_desc = "Sharp: The Artifact is shaped into a fine point. Perfect for popping balloons." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/sharp/on_touch(obj/item/xenoartifact/X, mob/user) to_chat(user, "The [X.name] feels sharp.") @@ -92,7 +92,7 @@ /datum/xenoartifact_trait/minor/cooler desc = "Frosted" label_desc = "Frosted: The Artifact has the unique property of actively cooling itself. This also seems to reduce time between uses." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/cooler/on_touch(obj/item/xenoartifact/X, mob/user) to_chat(user, "The [X.name] feels cold.") @@ -218,7 +218,7 @@ /datum/xenoartifact_trait/minor/delicate desc = "Fragile" label_desc = "Fragile: The Artifact is poorly made. Continuous use will destroy it." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/delicate/on_init(obj/item/xenoartifact/X) X.max_integrity = pick(200, 300, 500, 800, 1000) @@ -243,7 +243,7 @@ desc = "Expansive" label_desc = "Expansive: The Artifact's surface reaches towards every creature in the room. Even the empty space behind you..." blacklist_traits = list(/datum/xenoartifact_trait/major/timestop, /datum/xenoartifact_trait/minor/long) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/aura/on_init(obj/item/xenoartifact/X) X.max_range += 2 @@ -265,7 +265,7 @@ desc = "Scoped" label_desc = "Scoped: The Artifact has an almost magnifying effect to it. You could probably target someone from really far away with it." blacklist_traits = list(/datum/xenoartifact_trait/minor/aura) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/long/on_init(obj/item/xenoartifact/X) X.max_range += 18 @@ -277,7 +277,7 @@ desc = "Shaped" label_desc = "Shaped: The Artifact is small and shaped. It looks as if it'd fit on someone's finger." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT /datum/xenoartifact_trait/minor/wearable/on_init(obj/item/xenoartifact/X) X.slot_flags = ITEM_SLOT_GLOVES @@ -292,7 +292,7 @@ desc = "Shielded" label_desc = "Shielded: The Artifact's composistion lends itself well to blocking attacks. It would do you good to bring this to a rage cage." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/blocking/on_init(obj/item/xenoartifact/X) X.block_level = pick(1, 2, 3, 4) @@ -306,7 +306,7 @@ desc = "Light" label_desc = "Light: The Artifact is made from a light material. You can pitch it pretty far." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/heavy) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/light/on_init(obj/item/xenoartifact/X) X.throw_range = 8 @@ -318,7 +318,7 @@ desc = "Heavy" label_desc = "Heavy: The Artifact is made from a heavy material. You can't pitch it very far." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/light) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/heavy/on_init(obj/item/xenoartifact/X) X.throw_range = 1 @@ -329,7 +329,7 @@ /datum/xenoartifact_trait/minor/signalsend label_name = "Signaler" label_desc = "Signaler: The Artifact sends out a signal everytime it's activated." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/signalsend/on_item(obj/item/xenoartifact/X, atom/user, atom/item) if(istype(item, /obj/item/analyzer)) @@ -354,7 +354,7 @@ desc = "Anchored" label_desc = "Anchored: The Artifact buckles to the floor with the weight of a sun every time it activates. Heavier than you, somehow." blacklist_traits = list(/datum/xenoartifact_trait/minor/wearable, /datum/xenoartifact_trait/minor/haunted) - flags = BLUESPACE_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/minor/anchor/activate(obj/item/xenoartifact/X, atom/target, atom/user) if(isliving(X.loc)) @@ -383,7 +383,7 @@ desc = "Slippery" label_desc = "Slippery: The Artifact's surface is perpetually slippery. Popular amongst scientific-clown groups." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT var/datum/component/slippery/slipper /datum/xenoartifact_trait/minor/slippery/on_init(obj/item/xenoartifact/X) @@ -400,7 +400,7 @@ label_name = "Haunted" label_desc = "Haunted: The Artifact's appears to interact with bluespace spatial regression, causing the item to appear haunted." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/minor/wearable) - flags = BLUESPACE_TRAIT + flags = XENOA_BLUESPACE_TRAIT weight = 15 var/datum/component/deadchat_control/controller @@ -443,7 +443,7 @@ label_name = "Delayed" label_desc = "Delayed: The Artifact's composistion causes activations to be delayed." blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT weight = 25 /datum/xenoartifact_trait/minor/delay/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) @@ -457,7 +457,7 @@ /datum/xenoartifact_trait/minor/blink label_name = "Desynced" label_desc = "Desynced: The Artifact falls in & out of existence regularly." - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT ///Where your eyes don't go var/obj/effect/confiscate diff --git a/code/modules/xenoarchaeology/old/xenoartifact_traits.dm b/code/modules/xenoarchaeology/old/xenoartifact_traits.dm index 688d7b5fd5bbe..d4bdad2bc2c11 100644 --- a/code/modules/xenoarchaeology/old/xenoartifact_traits.dm +++ b/code/modules/xenoarchaeology/old/xenoartifact_traits.dm @@ -19,7 +19,7 @@ /datum/xenoartifact_trait/major /datum/xenoartifact_trait/malfunction - flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT /datum/xenoartifact_trait/activator ///How much an activator trait can output on a standard, modified by the artifacts charge_req and circumstances. diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 0ef589a93b962..5b0fbce09f47b 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -9,7 +9,7 @@ label_name = "Electrified" label_desc = "The artifact seems to contain electrifying components. Triggering these components will shock the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS - flags = PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT conductivity = 10 /datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) @@ -39,7 +39,7 @@ label_name = "Hollow" label_desc = "The artifact seems to contain hollow components. Triggering these components will capture the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS - flags = BLUESPACE_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT weight = -10 ///Maximum time we hold people for var/hold_time = 15 SECONDS @@ -90,7 +90,7 @@ label_name = "Temporal" label_desc = "Temporal: The artifact seems to contain temporal components. Triggering these components will create a temporal rift." cooldown = XENOA_TRAIT_COOLDOWN_GAMER - flags = URANIUM_TRAIT | BANANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT register_targets = FALSE ///Maximum time we stop time for var/max_time = 10 SECONDS @@ -112,7 +112,7 @@ examine_desc = "barreled" label_name = "Barreled" label_desc = "Barreled: The artifact seems to contain projectile components. Triggering these components will produce a projectile." - flags = PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER extra_target_range = 2 ///List of projectiles we *could* shoot @@ -148,7 +148,7 @@ /datum/xenoartifact_trait/major/animalize ///All of this is stolen from corgium. label_name = "Bestialized" label_desc = "Bestialized: The artifact contains transforming components. Triggering these components transforms the target into an animal." - flags = BLUESPACE_TRAIT | BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER ///List of potential animals we could turn people into var/list/possible_animals = list(/mob/living/simple_animal/pet/dog/corgi) @@ -201,3 +201,94 @@ H = new(new_animal, src, target) RegisterSignal(new_animal, COMSIG_MOB_DEATH, PROC_REF(un_trigger)) return new_animal + +/* + EMP + Creates an EMP effect at the position of the artfiact +*/ + +/datum/xenoartifact_trait/major/emp + label_name = "EMP" + label_desc = "EMP: The artifact seems to contain electromagnetic pulsing components. Triggering these components will create an EMP." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = FALSE + rarity = XENOA_TRAIT_WEIGHT_RARE + +/datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + INVOKE_ASYNC(src, PROC_REF(do_emp)) //empluse() calls stoplag(), which calls sleep() + +/datum/xenoartifact_trait/major/emp/proc/do_emp() + var/turf/T = get_turf(parent.parent) + if(!T) + return + playsound(T, 'sound/magic/disable_tech.ogg', 50, TRUE) + empulse(T, max(1, parent.trait_strength*0.04), max(1, parent.trait_strength*0.08, 1)) + +/* + Invisible + TODO: Consider removing this - Racc +*/ + +/datum/xenoartifact_trait/major/invisible + +/* + Displaced + Teleports the target to a random nearby turf +*/ +/datum/xenoartifact_trait/major/displaced + label_name = "Displaced" + label_desc = "The artifact seems to contain displacing components. Triggering these components will 'displace' the target." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + +/datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + dump_targets() + return + var/list/focus = override ? list(override) : targets + if(length(focus)) + playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) + for(var/atom/movable/target in focus) + if(!target.anchored) + do_teleport(target, get_turf(target), (parent.trait_strength*0.3)+1, channel = TELEPORT_CHANNEL_BLUESPACE) + unregister_target(target) + dump_targets() + +/* + Illuminating + Toggles a light on the artifact +*/ + +/datum/xenoartifact_trait/major/illuminating + label_name = "Illuminating" + label_desc = "Illuminating: The artifact seems to contain illuminating components. Triggering these components will cause the artifact to illuminate." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = FALSE + rarity = XENOA_TRAIT_WEIGHT_RARE + ///List of possible colors + var/list/possible_colors = list(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) + ///Our actual color + var/color + ///Are we currently lit? + var/lit = FALSE + +/datum/xenoartifact_trait/major/illuminating/New(atom/_parent) + . = ..() + color = pick(possible_colors) + +/datum/xenoartifact_trait/major/illuminating/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + lit = !lit + var/atom/light_source = parent.parent + if(lit) + light_source.set_light(parent.trait_strength*0.08, max(parent.trait_strength*0.05, 5), color) + else + light_source.set_light(0, 0) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 9dea4453eef23..53cb489ace121 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -10,7 +10,7 @@ var/label_desc ///Asscoiated flags for artifact typing and such - var/flags = BLUESPACE_TRAIT | PLASMA_TRAIT | URANIUM_TRAIT | BANANIUM_TRAIT + var/flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT ///Other traits this trait wont work with. var/list/blacklist_traits = list() ///How rare is this trait? 100 being common, and 1 being very rare From 8a60cafd0e05042fa9c7407659f91e56a3cc4d70 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 13:43:56 +1100 Subject: [PATCH 008/339] bookmark - 7 1 24 --- beestation.dme | 2 +- .../xenoarchaeology/components/xenoartifact.dm | 4 ++++ code/modules/xenoarchaeology/traits/majors.dm | 4 ++-- ...artifact_labeler.dm => xenoartifact_labeller.dm} | 13 ++++--------- 4 files changed, 11 insertions(+), 12 deletions(-) rename code/modules/xenoarchaeology/{xenoartifact_labeler.dm => xenoartifact_labeller.dm} (98%) diff --git a/beestation.dme b/beestation.dme index e0debaf79ea08..0ece4c9729664 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4140,7 +4140,7 @@ #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" #include "code\modules\xenoarchaeology\xenoartifact_console.dm" -#include "code\modules\xenoarchaeology\xenoartifact_labeler.dm" +#include "code\modules\xenoarchaeology\xenoartifact_labeller.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 5662ffff4759c..5a6e1da66ebbc 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -6,6 +6,10 @@ /obj/item/xenoartifact icon_state = "skub" +/obj/item/xenoartifact/with_traits/ComponentInitialize() + . = ..() + AddComponent(/datum/component/xenoartifact) + /datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. ///Buying and selling related, based on guess qaulity var/modifier = 0.5 diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 5b0fbce09f47b..0494af624110c 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -132,7 +132,7 @@ var/list/focus = override ? list(override) : targets for(var/atom/target in focus) var/turf/T = get_turf(target) - if(isturf(target)) + if(get_turf(parent.parent) == T) T = get_edge_target_turf(parent.parent, pick(NORTH, EAST, SOUTH, WEST)) var/obj/projectile/P = new choosen_projectile() P.preparePixelProjectile(T, parent.parent) @@ -289,6 +289,6 @@ lit = !lit var/atom/light_source = parent.parent if(lit) - light_source.set_light(parent.trait_strength*0.08, max(parent.trait_strength*0.05, 5), color) + light_source.set_light(parent.trait_strength*0.04, min(parent.trait_strength*0.1, 10), color) else light_source.set_light(0, 0) diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/xenoartifact_labeller.dm similarity index 98% rename from code/modules/xenoarchaeology/xenoartifact_labeler.dm rename to code/modules/xenoarchaeology/xenoartifact_labeller.dm index 9c4d60e9caebc..5b02d87b0fe7e 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeler.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeller.dm @@ -51,19 +51,14 @@ /obj/item/xenoartifact_labeller/ui_data(mob/user) var/list/data = list() data["selected_activator_traits"] = selected_activator_traits - data["selected_minor_traits"] = selected_minor_traits - data["selected_major_traits"] = selected_major_traits - data["selected_malfunction_traits"] = selected_malfunction_traits - data["info_list"] = info_list - return data - -/obj/item/xenoartifact_labeller/ui_static_data(mob/user) - . = ..() - var/list/data = list() data["activator_traits"] = activator_traits + data["selected_minor_traits"] = selected_minor_traits data["minor_traits"] = minor_traits + data["selected_major_traits"] = selected_major_traits data["major_traits"] = major_traits + data["selected_malfunction_traits"] = selected_malfunction_traits data["malfunction_list"] = malfunction_list + data["info_list"] = info_list return data /obj/item/xenoartifact_labeller/ui_act(action, params) From cc99a31ef40bec570baca64c4e60dd222d971d4e Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 13:59:22 +1100 Subject: [PATCH 009/339] bookmark - 7 1 24 --- .../xenoarchaeology/xenoartifact_labeller.dm | 2 +- ...factLabeler.js => XenoartifactLabeller.js} | 28 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) rename tgui/packages/tgui/interfaces/{XenoartifactLabeler.js => XenoartifactLabeller.js} (82%) diff --git a/code/modules/xenoarchaeology/xenoartifact_labeller.dm b/code/modules/xenoarchaeology/xenoartifact_labeller.dm index 5b02d87b0fe7e..12c906ace4ffa 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeller.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeller.dm @@ -45,7 +45,7 @@ /obj/item/xenoartifact_labeller/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "XenoartifactLabeler") + ui = new(user, src, "XenoartifactLabeller") ui.open() /obj/item/xenoartifact_labeller/ui_data(mob/user) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeller.js similarity index 82% rename from tgui/packages/tgui/interfaces/XenoartifactLabeler.js rename to tgui/packages/tgui/interfaces/XenoartifactLabeller.js index 15f153840a6aa..b6ddff67aebac 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeller.js @@ -2,18 +2,18 @@ import { useBackend } from '../backend'; import { Button, Section, Box, Flex, Input, BlockQuote } from '../components'; import { Window } from '../layouts'; -export const XenoartifactLabeler = (props, context) => { +export const XenoartifactLabeller = (props, context) => { return ( - + - + - + @@ -21,7 +21,7 @@ export const XenoartifactLabeler = (props, context) => { ); }; -const XenoartifactLabelerTraits = (props, context) => { +const XenoartifactlabellerTraits = (props, context) => { const { act, data } = useBackend(context); const { selected_activator_traits, @@ -49,7 +49,7 @@ const XenoartifactLabelerTraits = (props, context) => {
{sorted_activators.map((trait) => ( - {
{sorted_minors.map((trait) => ( - {
{sorted_majors.map((trait) => ( - {
{sorted_malfs.map((trait) => ( - { ); }; -const XenoartifactLabelerInfo = (props, context) => { +const XenoartifactlabellerInfo = (props, context) => { const { act, data } = useBackend(context); const { info_list } = data; return ( {info_list.map((info) => ( - + ))} ); }; -const XenoartifactLabelerGenerateList = (props, context) => { +const XenoartifactlabellerGenerateList = (props, context) => { const { act } = useBackend(context); const { specific_trait, check_against, trait_type } = props; return ( @@ -124,7 +124,7 @@ const XenoartifactLabelerGenerateList = (props, context) => { ); }; -const XenoartifactLabelerGenerateInfo = (props, context) => { +const XenoartifactlabellerGenerateInfo = (props, context) => { const { act } = useBackend(context); const { info } = props; return ( @@ -136,7 +136,7 @@ const XenoartifactLabelerGenerateInfo = (props, context) => { ); }; -const XenoartifactLabelerSticker = (props, context) => { +const XenoartifactlabellerSticker = (props, context) => { const { act } = useBackend(context); return ( From 536e842fcd36f29a2c003afead879a06b4cba21f Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 15:01:16 +1100 Subject: [PATCH 010/339] bruh --- beestation.dme | 2 +- code/modules/clothing/outfits/standard.dm | 2 +- code/modules/research/designs/misc_designs.dm | 2 +- code/modules/xenoarchaeology/traits/majors.dm | 4 +- ...ct_labeller.dm => xenoartifact_labeler.dm} | 49 ++++++++++--------- ...factLabeller.js => XenoartifactLabeler.js} | 28 +++++------ 6 files changed, 46 insertions(+), 41 deletions(-) rename code/modules/xenoarchaeology/{xenoartifact_labeller.dm => xenoartifact_labeler.dm} (84%) rename tgui/packages/tgui/interfaces/{XenoartifactLabeller.js => XenoartifactLabeler.js} (82%) diff --git a/beestation.dme b/beestation.dme index 0ece4c9729664..e0debaf79ea08 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4140,7 +4140,7 @@ #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" #include "code\modules\xenoarchaeology\xenoartifact_console.dm" -#include "code\modules\xenoarchaeology\xenoartifact_labeller.dm" +#include "code\modules\xenoarchaeology\xenoartifact_labeler.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index c8a6d03d4befe..c3209f1c26888 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -18,7 +18,7 @@ /obj/item/storage/part_replacer/bluespace/tier4=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1,\ - /obj/item/xenoartifact_labeller/debug=1,\ + /obj/item/xenoartifact_labeler/debug=1,\ /obj/item/debug/orb_of_power=1 ) diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 11a9732267acf..28ac73db3411e 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -262,7 +262,7 @@ id = "xenoa_labeler" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000, /datum/material/gold = 3000) - build_path = /obj/item/xenoartifact_labeller + build_path = /obj/item/xenoartifact_labeler category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 0494af624110c..e16de52f84950 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -233,7 +233,7 @@ TODO: Consider removing this - Racc */ -/datum/xenoartifact_trait/major/invisible +//datum/xenoartifact_trait/major/invisible /* Displaced @@ -241,7 +241,7 @@ */ /datum/xenoartifact_trait/major/displaced label_name = "Displaced" - label_desc = "The artifact seems to contain displacing components. Triggering these components will 'displace' the target." + label_desc = "The artifact seems to contain displacing components. Triggering these components will displace the target." cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT diff --git a/code/modules/xenoarchaeology/xenoartifact_labeller.dm b/code/modules/xenoarchaeology/xenoartifact_labeler.dm similarity index 84% rename from code/modules/xenoarchaeology/xenoartifact_labeller.dm rename to code/modules/xenoarchaeology/xenoartifact_labeler.dm index 12c906ace4ffa..f488239777e74 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeller.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeler.dm @@ -1,8 +1,8 @@ //TODO: Redo this code, or just improve it - Racc -/obj/item/xenoartifact_labeller - name = "artifact labeller" +/obj/item/xenoartifact_labeler + name = "artifact labeler" icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' - icon_state = "xenoartifact_labeller" + icon_state = "xenoartifact_labeler" desc = "A tool scientists use to label their alien bombs." throw_speed = 3 throw_range = 5 @@ -33,35 +33,40 @@ ///Cooldown for stickers COOLDOWN_DECLARE(sticker_cooldown) -/obj/item/xenoartifact_labeller/Initialize(mapload) +/obj/item/xenoartifact_labeler/Initialize(mapload) . = ..() generate_xenoa_statics() //generate data for trait names - activator_traits = get_trait_list_names(GLOB.xenoa_activators) - minor_traits = get_trait_list_names(GLOB.xenoa_minors) + //activator_traits = get_trait_list_names(GLOB.xenoa_activators) + //minor_traits = get_trait_list_names(GLOB.xenoa_minors) major_traits = get_trait_list_names(GLOB.xenoa_majors) - malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) + //malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) -/obj/item/xenoartifact_labeller/ui_interact(mob/user, datum/tgui/ui) +/obj/item/xenoartifact_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) - ui = new(user, src, "XenoartifactLabeller") + ui = new(user, src, "XenoartifactLabeler") ui.open() -/obj/item/xenoartifact_labeller/ui_data(mob/user) +/obj/item/xenoartifact_labeler/ui_data(mob/user) var/list/data = list() data["selected_activator_traits"] = selected_activator_traits data["activator_traits"] = activator_traits + data["selected_minor_traits"] = selected_minor_traits data["minor_traits"] = minor_traits + data["selected_major_traits"] = selected_major_traits data["major_traits"] = major_traits + data["selected_malfunction_traits"] = selected_malfunction_traits data["malfunction_list"] = malfunction_list + data["info_list"] = info_list + return data -/obj/item/xenoartifact_labeller/ui_act(action, params) +/obj/item/xenoartifact_labeler/ui_act(action, params) if(..()) return @@ -90,18 +95,18 @@ return TRUE //Get a list of all the specified trait types names -/obj/item/xenoartifact_labeller/proc/get_trait_list_names(list/trait_type) +/obj/item/xenoartifact_labeler/proc/get_trait_list_names(list/trait_type) var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) temp += initial(T.label_name) return temp -/obj/item/xenoartifact_labeller/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? +/obj/item/xenoartifact_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? if(place.Find(culprit)) return TRUE return FALSE -/obj/item/xenoartifact_labeller/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/xenoartifact_labeler/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown)) COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) @@ -110,7 +115,7 @@ to_chat(user, "The labeler is still printing.") ///reset all the options -/obj/item/xenoartifact_labeller/proc/clear_selection() +/obj/item/xenoartifact_labeler/proc/clear_selection() sticker_name = null info_list = list() sticker_traits = list() @@ -120,7 +125,7 @@ selected_malfunction_traits = list() ui_update() -/obj/item/xenoartifact_labeller/proc/create_label(new_name, mob/target, mob/user) +/obj/item/xenoartifact_labeler/proc/create_label(new_name, mob/target, mob/user) var/obj/item/xenoartifact_label/P = new(get_turf(src)) if(new_name) P.name = new_name @@ -129,7 +134,7 @@ P.info = selected_activator_traits+selected_minor_traits+selected_major_traits+selected_malfunction_traits P.attempt_attach(target, user, TRUE) -/obj/item/xenoartifact_labeller/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) +/obj/item/xenoartifact_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) var/datum/xenoartifact_trait/description_holder var/new_trait for(var/t in trait_list) @@ -147,13 +152,13 @@ sticker_traits -= new_trait //This is just a hacky way of getting the info from a datum using its desc becuase I wrote this last and it's not heartbreaking -/obj/item/xenoartifact_labeller/proc/desc2datum(udesc) +/obj/item/xenoartifact_labeler/proc/desc2datum(udesc) for(var/datum/xenoartifact_trait/X as() in GLOB.xenoa_all_traits) if((udesc == initial(X.label_desc)) || (udesc == initial(X.label_name))) return X CRASH("The xenoartifact trait description '[udesc]' doesn't have a corresponding trait. Something fucked up.") -// Not to be confused with labeller +// Not to be confused with labeler /obj/item/xenoartifact_label icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' icon_state = "sticker_star" @@ -237,13 +242,13 @@ text = "[text] [X]\n" return text -/obj/item/xenoartifact_labeller/debug +/obj/item/xenoartifact_labeler/debug name = "xenoartifact debug labeler" desc = "Use to create specific Xenoartifacts" -/obj/item/xenoartifact_labeller/debug/afterattack(atom/target, mob/user) +/obj/item/xenoartifact_labeler/debug/afterattack(atom/target, mob/user) return -/obj/item/xenoartifact_labeller/debug/create_label(new_name) +/obj/item/xenoartifact_labeler/debug/create_label(new_name) var/obj/item/xenoartifact/A = new(get_turf(loc)) A.AddComponent(/datum/component/xenoartifact, /datum/component/xenoartifact_material, sticker_traits) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeller.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js similarity index 82% rename from tgui/packages/tgui/interfaces/XenoartifactLabeller.js rename to tgui/packages/tgui/interfaces/XenoartifactLabeler.js index b6ddff67aebac..1f87d01f85113 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeller.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -2,18 +2,18 @@ import { useBackend } from '../backend'; import { Button, Section, Box, Flex, Input, BlockQuote } from '../components'; import { Window } from '../layouts'; -export const XenoartifactLabeller = (props, context) => { +export const XenoartifactLabeler = (props, context) => { return ( - + - + - + @@ -21,7 +21,7 @@ export const XenoartifactLabeller = (props, context) => { ); }; -const XenoartifactlabellerTraits = (props, context) => { +const XenoartifactlabelerTraits = (props, context) => { const { act, data } = useBackend(context); const { selected_activator_traits, @@ -49,7 +49,7 @@ const XenoartifactlabellerTraits = (props, context) => {
{sorted_activators.map((trait) => ( - {
{sorted_minors.map((trait) => ( - {
{sorted_majors.map((trait) => ( - {
{sorted_malfs.map((trait) => ( - { ); }; -const XenoartifactlabellerInfo = (props, context) => { +const XenoartifactlabelerInfo = (props, context) => { const { act, data } = useBackend(context); const { info_list } = data; return ( {info_list.map((info) => ( - + ))} ); }; -const XenoartifactlabellerGenerateList = (props, context) => { +const XenoartifactlabelerGenerateList = (props, context) => { const { act } = useBackend(context); const { specific_trait, check_against, trait_type } = props; return ( @@ -124,7 +124,7 @@ const XenoartifactlabellerGenerateList = (props, context) => { ); }; -const XenoartifactlabellerGenerateInfo = (props, context) => { +const XenoartifactlabelerGenerateInfo = (props, context) => { const { act } = useBackend(context); const { info } = props; return ( @@ -136,7 +136,7 @@ const XenoartifactlabellerGenerateInfo = (props, context) => { ); }; -const XenoartifactlabellerSticker = (props, context) => { +const XenoartifactlabelerSticker = (props, context) => { const { act } = useBackend(context); return ( From 35a6923b5ddc7bdef0a0de1660cc88f02c0015f8 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 15:04:48 +1100 Subject: [PATCH 011/339] Update xenoartifact_labeler.dm --- code/modules/xenoarchaeology/xenoartifact_labeler.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/xenoartifact_labeler.dm index f488239777e74..4fc5550a5c8a6 100644 --- a/code/modules/xenoarchaeology/xenoartifact_labeler.dm +++ b/code/modules/xenoarchaeology/xenoartifact_labeler.dm @@ -37,10 +37,10 @@ . = ..() generate_xenoa_statics() //generate data for trait names - //activator_traits = get_trait_list_names(GLOB.xenoa_activators) - //minor_traits = get_trait_list_names(GLOB.xenoa_minors) + activator_traits = get_trait_list_names(GLOB.xenoa_activators) + minor_traits = get_trait_list_names(GLOB.xenoa_minors) major_traits = get_trait_list_names(GLOB.xenoa_majors) - //malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) + malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) /obj/item/xenoartifact_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) From 1ab78ab2aaad95024033f0022871b3e2e09a66b6 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 19:29:02 +1100 Subject: [PATCH 012/339] Logging - 7 1 24 --- code/modules/xenoarchaeology/traits/majors.dm | 128 ++++++++++++++---- code/modules/xenoarchaeology/traits/traits.dm | 9 +- 2 files changed, 110 insertions(+), 27 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index e16de52f84950..ce6775891bfd6 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -12,12 +12,11 @@ flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT conductivity = 10 -/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) dump_targets() return - var/list/focus = override ? list(override) : targets if(length(focus)) playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) for(var/atom/target in focus) @@ -28,6 +27,8 @@ else if(istype(target, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = target C.give((parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool + var/atom/log_atom = parent.parent + log_game("[parent] in [log_atom] electrocuted [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") dump_targets() //Get rid of anything else, since we can't interact with it /* @@ -44,12 +45,11 @@ ///Maximum time we hold people for var/hold_time = 15 SECONDS -/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) dump_targets() return - var/list/focus = override ? list(override) : targets for(var/atom/target in focus) if(ismovable(target)) var/atom/movable/M = target @@ -68,8 +68,7 @@ else unregister_target(target) -/datum/xenoartifact_trait/major/hollow/un_trigger(atom/override, handle_parent = FALSE) - var/list/focus = override ? list(override) : targets +/datum/xenoartifact_trait/major/hollow/un_trigger(atom/override, handle_parent = FALSE, var/list/focus) if(!length(focus)) return ..() var/atom/movable/AM = parent.parent @@ -85,7 +84,6 @@ Temporal Creates a timestop object at the position of the artfiact */ - /datum/xenoartifact_trait/major/timestop label_name = "Temporal" label_desc = "Temporal: The artifact seems to contain temporal components. Triggering these components will create a temporal rift." @@ -95,7 +93,7 @@ ///Maximum time we stop time for var/max_time = 10 SECONDS -/datum/xenoartifact_trait/major/timestop/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/timestop/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) return @@ -124,12 +122,11 @@ . = ..() choosen_projectile = pick(possible_projectiles) -/datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) dump_targets() return - var/list/focus = override ? list(override) : targets for(var/atom/target in focus) var/turf/T = get_turf(target) if(get_turf(parent.parent) == T) @@ -142,7 +139,7 @@ /* - Fuzzy + Bestialized The artifact shoots the target with a random projectile */ /datum/xenoartifact_trait/major/animalize ///All of this is stolen from corgium. @@ -161,21 +158,21 @@ . = ..() choosen_animal = pick(possible_animals) -/datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) dump_targets() return - var/list/focus = override ? list(override) : targets for(var/mob/living/target in focus) if(istype(target, choosen_animal) || IS_DEAD_OR_INCAP(target)) continue transform(target) + var/atom/log_atom = parent.parent + log_game("[parent] in [log_atom] transformed [key_name_admin(target)] into [choosen_animal] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") //Add timer to undo this addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), target), animal_time*(parent.trait_strength/100)) -/datum/xenoartifact_trait/major/animalize/un_trigger(atom/override, handle_parent = FALSE) - var/list/focus = override ? list(override) : targets +/datum/xenoartifact_trait/major/animalize/un_trigger(atom/override, handle_parent = FALSE, var/list/focus) if(!length(focus)) return ..() //Restore every swap holder @@ -206,7 +203,6 @@ EMP Creates an EMP effect at the position of the artfiact */ - /datum/xenoartifact_trait/major/emp label_name = "EMP" label_desc = "EMP: The artifact seems to contain electromagnetic pulsing components. Triggering these components will create an EMP." @@ -215,7 +211,7 @@ register_targets = FALSE rarity = XENOA_TRAIT_WEIGHT_RARE -/datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) return @@ -226,13 +222,14 @@ if(!T) return playsound(T, 'sound/magic/disable_tech.ogg', 50, TRUE) - empulse(T, max(1, parent.trait_strength*0.04), max(1, parent.trait_strength*0.08, 1)) + empulse(T, max(1, parent.trait_strength*0.03), max(1, parent.trait_strength*0.05, 1)) + var/atom/log_atom = parent.parent + log_game("[parent] in [log_atom] made an EMP at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") /* Invisible TODO: Consider removing this - Racc */ - //datum/xenoartifact_trait/major/invisible /* @@ -245,17 +242,18 @@ cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT -/datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) dump_targets() return - var/list/focus = override ? list(override) : targets if(length(focus)) playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) for(var/atom/movable/target in focus) if(!target.anchored) do_teleport(target, get_turf(target), (parent.trait_strength*0.3)+1, channel = TELEPORT_CHANNEL_BLUESPACE) + var/atom/log_atom = parent.parent + log_game("[parent] in [log_atom] teleported [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") unregister_target(target) dump_targets() @@ -263,14 +261,12 @@ Illuminating Toggles a light on the artifact */ - /datum/xenoartifact_trait/major/illuminating label_name = "Illuminating" label_desc = "Illuminating: The artifact seems to contain illuminating components. Triggering these components will cause the artifact to illuminate." cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT register_targets = FALSE - rarity = XENOA_TRAIT_WEIGHT_RARE ///List of possible colors var/list/possible_colors = list(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) ///Our actual color @@ -282,7 +278,7 @@ . = ..() color = pick(possible_colors) -/datum/xenoartifact_trait/major/illuminating/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/major/illuminating/trigger(datum/source, _priority, atom/override, var/list/focus) . = ..() if(!.) return @@ -292,3 +288,85 @@ light_source.set_light(parent.trait_strength*0.04, min(parent.trait_strength*0.1, 10), color) else light_source.set_light(0, 0) + +/* + Obstructing + Builds forcefields around the artifact +*/ +/datum/xenoartifact_trait/major/forcefield + label_name = "Obstructing" + label_desc = "Obstructing: The artifact seems to contain obstructing components. Triggering these components will cause the artifact to build walls around itself." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = FALSE + ///What wall size are we making? + var/wall_size + ///Max time we keep walls around for + var/wall_time = 8 SECONDS + +/datum/xenoartifact_trait/major/forcefield/New(atom/_parent) + . = ..() + wall_size = pick(1, 2, 3) + +/datum/xenoartifact_trait/major/forcefield/trigger(datum/source, _priority, atom/override, var/list/focus) + . = ..() + if(!.) + return + //Don't use a switch case, we just pass through the ifs and add walls as we go + if(wall_size >= 1) + new /obj/effect/forcefield/xenoartifact_type(get_turf(parent.parent), (parent.trait_strength*wall_time)) + if(wall_size >= 2) + //If we're not making a symetrical design, pick a random orientation + var/outcome = pick(0, 1) + if(outcome || wall_size >= 3) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, NORTH), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, SOUTH), (parent.trait_strength*wall_time)) + else + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), (parent.trait_strength*wall_time)) + if(wall_size >= 3) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), (parent.trait_strength*wall_time)) + +//Special wall type for artifact. Throw any extra code or special logic in here +/obj/effect/forcefield/xenoartifact_type + desc = "An impenetrable artifact wall." + +/* + Healing + TODO: Consider re-designing this - Racc +*/ +//datum/xenoartifact_trait/major/heal + +/* + Hypodermic + Injects the target with a random, safe, chemical +*/ +/datum/xenoartifact_trait/major/chem + label_name = "Hypodermic" + label_desc = "Hypodermic: The artifact seems to contain chemical components. Triggering these components will inject the target with a chemical." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///What chemical we're injecting + var/datum/reagent/formula + ///max amount we can inject people with + var/formula_amount + +/datum/xenoartifact_trait/major/chem/New(atom/_parent) + . = ..() + formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) + formula_amount = initial(formula.overdose_threshold) + +/datum/xenoartifact_trait/major/chem/trigger(datum/source, _priority, atom/override, var/list/focus) + . = ..() + if(!.) + return + for(var/atom/target in focus) + if(target.reagents) + playsound(get_turf(target), pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, TRUE) + var/datum/reagents/R = target.reagents + R.add_reagent(formula, formula_amount*(parent.trait_strength/100)) + var/atom/log_atom = parent.parent + log_game("[parent] in [log_atom] injected [key_name_admin(target)] with [formula_amount*(parent.trait_strength/100)]u of [formula] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") + unregister_target(target) + dump_targets() diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 53cb489ace121..5c691d5e75c71 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -79,7 +79,7 @@ unregister_target(source, TRUE) -/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/override) +/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/override, var/list/focus) SIGNAL_HANDLER . = TRUE @@ -87,6 +87,8 @@ return FALSE if(!register_targets) return + //Handle focus + focus = override ? list(override) : targets //If we've been given an override if(override) register_target(override) @@ -98,7 +100,10 @@ return //Most traits will handle this on their own -/datum/xenoartifact_trait/proc/un_trigger(atom/override, handle_parent = FALSE) +/datum/xenoartifact_trait/proc/un_trigger(atom/override, handle_parent = FALSE, var/list/focus) + //Handle Focus + focus = override ? list(override) : targets + //Override if(override) unregister_target(override) return From 63eee5cba7cbb5e8c7ce1ded8f015c342a951e9d Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jan 2024 20:29:22 +1100 Subject: [PATCH 013/339] Fix focus - 7 1 24 --- code/modules/xenoarchaeology/traits/majors.dm | 73 +++++++++++++++---- code/modules/xenoarchaeology/traits/traits.dm | 20 +++-- 2 files changed, 71 insertions(+), 22 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index ce6775891bfd6..38ec4ce6f31c3 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -12,7 +12,7 @@ flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT conductivity = 10 -/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) . = ..() if(!.) dump_targets() @@ -30,6 +30,7 @@ var/atom/log_atom = parent.parent log_game("[parent] in [log_atom] electrocuted [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") dump_targets() //Get rid of anything else, since we can't interact with it + clear_focus() /* Hollow @@ -45,7 +46,7 @@ ///Maximum time we hold people for var/hold_time = 15 SECONDS -/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override) . = ..() if(!.) dump_targets() @@ -67,8 +68,10 @@ addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), M), hold_time*(parent.trait_strength/100)) else unregister_target(target) + clear_focus() -/datum/xenoartifact_trait/major/hollow/un_trigger(atom/override, handle_parent = FALSE, var/list/focus) +/datum/xenoartifact_trait/major/hollow/un_trigger(atom/override, handle_parent = FALSE) + focus = override ? list(override) : targets if(!length(focus)) return ..() var/atom/movable/AM = parent.parent @@ -93,7 +96,7 @@ ///Maximum time we stop time for var/max_time = 10 SECONDS -/datum/xenoartifact_trait/major/timestop/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/timestop/trigger(datum/source, _priority, atom/override) . = ..() if(!.) return @@ -122,7 +125,7 @@ . = ..() choosen_projectile = pick(possible_projectiles) -/datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override) . = ..() if(!.) dump_targets() @@ -136,7 +139,7 @@ P.fire() playsound(get_turf(parent.parent), 'sound/mecha/mech_shield_deflect.ogg', 50, TRUE) dump_targets() - + clear_focus() /* Bestialized @@ -158,7 +161,7 @@ . = ..() choosen_animal = pick(possible_animals) -/datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override) . = ..() if(!.) dump_targets() @@ -171,8 +174,10 @@ log_game("[parent] in [log_atom] transformed [key_name_admin(target)] into [choosen_animal] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") //Add timer to undo this addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), target), animal_time*(parent.trait_strength/100)) + clear_focus() -/datum/xenoartifact_trait/major/animalize/un_trigger(atom/override, handle_parent = FALSE, var/list/focus) +/datum/xenoartifact_trait/major/animalize/un_trigger(atom/override, handle_parent = FALSE) + focus = override ? list(override) : targets if(!length(focus)) return ..() //Restore every swap holder @@ -211,7 +216,7 @@ register_targets = FALSE rarity = XENOA_TRAIT_WEIGHT_RARE -/datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override) . = ..() if(!.) return @@ -242,7 +247,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT -/datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) . = ..() if(!.) dump_targets() @@ -256,6 +261,7 @@ log_game("[parent] in [log_atom] teleported [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") unregister_target(target) dump_targets() + clear_focus() /* Illuminating @@ -278,7 +284,7 @@ . = ..() color = pick(possible_colors) -/datum/xenoartifact_trait/major/illuminating/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/illuminating/trigger(datum/source, _priority, atom/override) . = ..() if(!.) return @@ -308,7 +314,7 @@ . = ..() wall_size = pick(1, 2, 3) -/datum/xenoartifact_trait/major/forcefield/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/forcefield/trigger(datum/source, _priority, atom/override) . = ..() if(!.) return @@ -351,13 +357,14 @@ var/datum/reagent/formula ///max amount we can inject people with var/formula_amount + var/generic_amount = 10 /datum/xenoartifact_trait/major/chem/New(atom/_parent) . = ..() formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) - formula_amount = initial(formula.overdose_threshold) + formula_amount = initial(formula.overdose_threshold) || generic_amount -/datum/xenoartifact_trait/major/chem/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/major/chem/trigger(datum/source, _priority, atom/override) . = ..() if(!.) return @@ -370,3 +377,41 @@ log_game("[parent] in [log_atom] injected [key_name_admin(target)] with [formula_amount*(parent.trait_strength/100)]u of [formula] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") unregister_target(target) dump_targets() + clear_focus() + +/* + Force + Inacts a pushing or pulling force on the target +*/ +/datum/xenoartifact_trait/major/force + label_name = "Forcing" + label_desc = "Forcing: The artifact seems to contain impulsing components. Triggering these components will impulse, either pushing or pulling, the target." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Max force we can use, aka how far we throw things + var/max_force = 7 + ///Force direction, push or pull + var/force_dir + +/datum/xenoartifact_trait/major/force/New(atom/_parent) + . = ..() + force_dir = rand(0, 1) + +/datum/xenoartifact_trait/major/force/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/movable/target in focus) + if(target.anchored) + return + var/turf/parent_turf = get_turf(parent.parent) + var/turf/T + if(force_dir) + T = get_edge_target_turf(parent_turf, get_dir(parent_turf, get_turf(target)) || pick(NORTH, EAST, SOUTH, WEST)) + else + T = parent_turf + target.throw_at(T, max_force*(parent.trait_strength/100), 4) + unregister_target(target) + dump_targets() + clear_focus() + diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 5c691d5e75c71..ad83ac2e2573f 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -27,6 +27,8 @@ ///List of things we've effected. used to automatically reigster & unregister targets. Don't confuse with parent targets, which is things we want to effect var/list/targets = list() + ///A distinct list of targets, incorporating overrides + var/list/focus = list() ///Extra target range we add to the artifact var/extra_target_range = 0 @@ -79,7 +81,7 @@ unregister_target(source, TRUE) -/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/override, var/list/focus) +/datum/xenoartifact_trait/proc/trigger(datum/source, _priority, atom/override) SIGNAL_HANDLER . = TRUE @@ -87,26 +89,22 @@ return FALSE if(!register_targets) return - //Handle focus - focus = override ? list(override) : targets //If we've been given an override if(override) register_target(override) - return //Otherwise just use the artifact's target list else if(length(parent.targets)) for(var/atom/I in parent.targets) register_target(I) + //Handle focus + focus = override ? list(override) : targets return //Most traits will handle this on their own -/datum/xenoartifact_trait/proc/un_trigger(atom/override, handle_parent = FALSE, var/list/focus) - //Handle Focus - focus = override ? list(override) : targets +/datum/xenoartifact_trait/proc/un_trigger(atom/override, handle_parent = FALSE) //Override if(override) unregister_target(override) - return //Parent targets, we shouldn't need this casually, only for niche cases if(length(parent.targets) && handle_parent) for(var/atom/I in parent.targets) @@ -115,12 +113,18 @@ if(length(targets)) for(var/atom/I in targets) unregister_target(I) + //Handle Focus + clear_focus() return /datum/xenoartifact_trait/proc/dump_targets() for(var/i in targets) unregister_target(i, TRUE) +//Call this when you're finished with the focus in the trigger() proc, un_trigger() handles itself +/datum/xenoartifact_trait/proc/clear_focus() + focus = list() + //If we want this trait to modify the artifact's appearance /datum/xenoartifact_trait/proc/generate_trait_appearance(atom/target) return From 94940c2425520a7f6cb2fea3ed62c67d18ee4366 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 8 Jan 2024 00:08:46 +1100 Subject: [PATCH 014/339] EOD - 8 1 24 --- code/__DEFINES/xenoartifact.dm | 4 +- code/_globalvars/xenoartifact.dm | 6 - .../components/xenoartifact.dm | 4 +- code/modules/xenoarchaeology/traits/majors.dm | 216 +++++++++++++++++- 4 files changed, 213 insertions(+), 17 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index 3f4981609f41f..8e7aadadd1fc5 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -28,10 +28,10 @@ #define XENOA_TRAIT_STRENGTH_STRONG 100 ///trait flags -#define XENOA_BLUESPACE_TRAIT (1<<0) +#define XENOA_BLUESPACE_TRAIT (1<<0) #define XENOA_PLASMA_TRAIT (1<<1) #define XENOA_URANIUM_TRAIT (1<<2) -#define XENOA_BANANIUM_TRAIT (1<<3) +#define XENOA_BANANIUM_TRAIT (1<<3) ///trait cooldowns #define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index d69150f2ed7ba..bced13d822176 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -16,12 +16,6 @@ GLOBAL_LIST(xenoa_XENOA_PLASMA_TRAITs) GLOBAL_LIST(xenoa_XENOA_URANIUM_TRAITs) GLOBAL_LIST(xenoa_XENOA_BANANIUM_TRAITs) -///List of emotes for emote-trait -GLOBAL_LIST_INIT(xenoa_emote, list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, - /datum/emote/living/scream, /datum/emote/living/tremble, /datum/emote/living/whimper, - /datum/emote/living/smile, /datum/emote/living/pout, /datum/emote/living/gag, - /datum/emote/living/deathgasp, /datum/emote/living/dance, /datum/emote/living/blush)) - ///Fill globals /proc/generate_xenoa_statics() if(length(GLOB.xenoa_all_traits)) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 5a6e1da66ebbc..9de2d0b755ad2 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -71,7 +71,9 @@ //If we're force-generating traits if(traits) for(var/datum/xenoartifact_trait/T as() in traits) - T = new T(src) + if(ispath(T)) //We can either pass paths, or initialized traits + T = new T(src) + //TODO: Setup a proc for traits to register a new parent - Racc //List building if(!artifact_traits[T.priority]) artifact_traits[T.priority] = list() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 38ec4ce6f31c3..563f20071103c 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -15,7 +15,6 @@ /datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) . = ..() if(!.) - dump_targets() return if(length(focus)) playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) @@ -23,7 +22,6 @@ if(iscarbon(target)) var/mob/living/carbon/victim = target victim.electrocute_act(parent.trait_strength*0.25, parent.parent, 1, 1) //Deal a max of 25 - unregister_target(target) else if(istype(target, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = target C.give((parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool @@ -49,7 +47,6 @@ /datum/xenoartifact_trait/major/hollow/trigger(datum/source, _priority, atom/override) . = ..() if(!.) - dump_targets() return for(var/atom/target in focus) if(ismovable(target)) @@ -128,7 +125,6 @@ /datum/xenoartifact_trait/major/projectile/trigger(datum/source, _priority, atom/override) . = ..() if(!.) - dump_targets() return for(var/atom/target in focus) var/turf/T = get_turf(target) @@ -164,7 +160,6 @@ /datum/xenoartifact_trait/major/animalize/trigger(datum/source, _priority, atom/override) . = ..() if(!.) - dump_targets() return for(var/mob/living/target in focus) if(istype(target, choosen_animal) || IS_DEAD_OR_INCAP(target)) @@ -250,7 +245,6 @@ /datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) . = ..() if(!.) - dump_targets() return if(length(focus)) playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) @@ -357,12 +351,12 @@ var/datum/reagent/formula ///max amount we can inject people with var/formula_amount - var/generic_amount = 10 + var/generic_amount = 11 /datum/xenoartifact_trait/major/chem/New(atom/_parent) . = ..() formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) - formula_amount = initial(formula.overdose_threshold) || generic_amount + formula_amount = (initial(formula.overdose_threshold) || generic_amount) - 1 /datum/xenoartifact_trait/major/chem/trigger(datum/source, _priority, atom/override) . = ..() @@ -415,3 +409,209 @@ dump_targets() clear_focus() + +/* + Echoing + The artifact plays a random sound +*/ +/datum/xenoartifact_trait/major/noise + label_name = "Echoing" + label_desc = "Echoing: The artifact seems to contain echoing components. Triggering these components will cause the artifact to make a noise." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = FALSE + ///List of possible noises + var/list/possible_noises = list('sound/effects/adminhelp.ogg', 'sound/effects/applause.ogg', 'sound/effects/bubbles.ogg', + 'sound/effects/empulse.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/explosion_distant.ogg', + 'sound/effects/laughtrack.ogg', 'sound/effects/magic.ogg', 'sound/effects/meteorimpact.ogg', + 'sound/effects/phasein.ogg', 'sound/effects/supermatter.ogg', 'sound/weapons/armbomb.ogg', + 'sound/weapons/blade1.ogg') + ///The noise we will make + var/noise + +/datum/xenoartifact_trait/major/noise/New(atom/_parent) + . = ..() + noise = pick(possible_noises) + +/datum/xenoartifact_trait/major/noise/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + playsound(get_turf(parent.parent), noise, 50, FALSE) + +/* + Porous + The artifact replaces one random gas with another +*/ +/datum/xenoartifact_trait/major/gas + label_name = "Porous" + label_desc = "Porous: The artifact seems to contain porous components. Triggering these components will cause the artifact to exchange one gas with another." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = FALSE + ///Possible target gasses + var/list/target_gasses = list( + /datum/gas/oxygen = 6, + /datum/gas/nitrogen = 3, + /datum/gas/plasma = 1, + /datum/gas/carbon_dioxide = 1, + /datum/gas/water_vapor = 3 + ) + ///Possible exchange gasses + var/list/exchange_gasses = list( + /datum/gas/bz = 3, + /datum/gas/hypernoblium = 1, + /datum/gas/plasma = 3, + /datum/gas/tritium = 2, + /datum/gas/nitryl = 1 + ) + ///Choosen target gas + var/datum/gas/choosen_target + ///Choosen exchange gas + var/datum/gas/choosen_exchange + ///Max amount of moles we exchange at once + var/max_moles = 10 + +/datum/xenoartifact_trait/major/gas/New(atom/_parent) + . = ..() + choosen_target = pick_weight(target_gasses) + choosen_exchange = pick_weight(exchange_gasses) + +/datum/xenoartifact_trait/major/gas/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(parent.parent) + var/datum/gas_mixture/air = T.return_air() + var/input_id = initial(choosen_target.id) + var/output_id = initial(choosen_exchange.id) + var/moles = min(air.get_moles(input_id), max_moles) + air.adjust_moles(input_id, -moles) + air.adjust_moles(output_id, moles) + +/* + Destabilizing + Send the target to the shadow realm +*/ +/datum/xenoartifact_trait/major/shadow_realm + label_name = "Destabilizing" + label_desc = "Destabilizing: The artifact seems to contain destabilizing components. Triggering these components will cause the artifact transport the target to another realm." + cooldown = XENOA_TRAIT_COOLDOWN_GAMER + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + rarity = XENOA_TRAIT_WEIGHT_EPIC + +/datum/xenoartifact_trait/major/shadow_realm/New(atom/_parent) + . = ..() + GLOB.destabliization_exits += parent.parent + +/datum/xenoartifact_trait/major/shadow_realm/Destroy(force, ...) + . = ..() + GLOB.destabliization_exits -= parent.parent + +/datum/xenoartifact_trait/major/shadow_realm/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/movable/target in focus) + if(!target.anchored) + continue + //handle being held + var/atom/movable/AM = parent.parent + if(!isturf(AM.loc) && locate(AM.loc) in focus) + AM.forceMove(get_turf(AM.loc)) + //Banish target + target.forceMove(pick(GLOB.destabilization_spawns)) + dump_targets() + clear_focus() + +/* + Dissipating + The artifact spawns a cloud of smoke +*/ +/datum/xenoartifact_trait/major/smoke + label_name = "Dissipating" + label_desc = "Dissipating: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a cloud of smoke." + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = FALSE + ///The maximum size of our smoke stack in turfs, I think + var/max_size = 6 + +/datum/xenoartifact_trait/major/smoke/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/datum/effect_system/smoke_spread/E = new() + E.set_up(max_size*(parent.trait_strength/100), get_turf(parent.parent)) + E.start() + +/* + Marking + Colors the target +*/ +/datum/xenoartifact_trait/major/color + label_name = "Marking" + label_desc = "Marking: The artifact seems to contain colorizing components. Triggering these components will color the target." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + ///Possible colors + var/list/possible_colors = list(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK, "all") + ///Choosen color + var/color + +/datum/xenoartifact_trait/major/color/New(atom/_parent) + . = ..() + color = pick(possible_colors) + +/datum/xenoartifact_trait/major/color/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + //These colors can be washed off + //TODO: make that know ;3 - Racc + if(color == "all") + target.color = pick(possible_colors) + else + target.color = color + dump_targets() //Get rid of anything else, since we can't interact with it + clear_focus() + +/* + Enthusing + Colors the target +*/ +/datum/xenoartifact_trait/major/emote + label_name = "Enthusing" + label_desc = "Enthusing: The artifact seems to contain emoting components. Triggering these components will cause the target to emote." + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + ///List of possible emotes + var/list/possible_emotes = list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, + /datum/emote/living/scream, /datum/emote/living/tremble, /datum/emote/living/whimper, + /datum/emote/living/smile, /datum/emote/living/pout, /datum/emote/living/gag, + /datum/emote/living/deathgasp, /datum/emote/living/dance, /datum/emote/living/blush) + ///Emote to preform + var/datum/emote/emote + +/datum/xenoartifact_trait/major/emote/New(atom/_parent) + . = ..() + emote = pick(possible_emotes) + emote = new emote() + +/datum/xenoartifact_trait/major/emote/Destroy(force, ...) + . = ..() + QDEL_NULL(emote) + +/datum/xenoartifact_trait/major/emote/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/carbon/target in focus) + INVOKE_ASYNC(src, PROC_REF(run_emote), target) + //TODO: Add a default hint - Racc + dump_targets() //Get rid of anything else, since we can't interact with it + clear_focus() + +/datum/xenoartifact_trait/major/emote/proc/run_emote(mob/living/carbon/target) + emote.run_emote(target) From 990d951f2be641af01ddf158e91b5c9bf2d65e6d Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 8 Jan 2024 17:57:03 +1100 Subject: [PATCH 015/339] Minors - 8 1 24 --- beestation.dme | 1 + code/modules/xenoarchaeology/traits/majors.dm | 6 +++--- code/modules/xenoarchaeology/traits/minors.dm | 21 +++++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 code/modules/xenoarchaeology/traits/minors.dm diff --git a/beestation.dme b/beestation.dme index e0debaf79ea08..073b7deab0e76 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4144,6 +4144,7 @@ #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" +#include "code\modules\xenoarchaeology\traits\minors.dm" #include "code\modules\xenoarchaeology\traits\traits.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 563f20071103c..c149874ef238e 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -2,7 +2,7 @@ priority = TRAIT_PRIORITY_MAJOR /* - Shock + Electrified Electrocutes the mob target, or charges the cell target */ /datum/xenoartifact_trait/major/shock @@ -374,7 +374,7 @@ clear_focus() /* - Force + Forcing Inacts a pushing or pulling force on the target */ /datum/xenoartifact_trait/major/force @@ -513,7 +513,7 @@ if(!.) return for(var/atom/movable/target in focus) - if(!target.anchored) + if(target.anchored) continue //handle being held var/atom/movable/AM = parent.parent diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm new file mode 100644 index 0000000000000..e3dc848a8b1d0 --- /dev/null +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -0,0 +1,21 @@ +/datum/xenoartifact_trait/minor + priority = TRAIT_PRIORITY_MINOR + register_targets = FALSE + +/* + Charged + Increases the artifact trait strength by 25% +*/ +/datum/xenoartifact_trait/minor/charged + examine_desc = "charged" + label_name = "Charged" + label_desc = "Charged: The Artifact's design seems to incorporate a feedback loop. This will cause the artifact to produce more powerful effects." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + +/datum/xenoartifact_trait/minor/charged/New(atom/_parent) + . = ..() + parent.trait_strength *= 0.25 + +/datum/xenoartifact_trait/minor/charged/Destroy(force, ...) + . = ..() + parent.trait_strength /= 0.25 From b4315d53be042ee7969af46460f65b033486558b Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 8 Jan 2024 19:23:47 +1100 Subject: [PATCH 016/339] Bulk - 8 1 24 --- .../components/xenoartifact.dm | 2 +- code/modules/xenoarchaeology/traits/majors.dm | 4 +- code/modules/xenoarchaeology/traits/minors.dm | 283 +++++++++++++++++- 3 files changed, 284 insertions(+), 5 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 9de2d0b755ad2..031262d0a5b4d 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -168,7 +168,7 @@ if(use_cooldown_timer && !force) return //Range check - if(get_dist(get_turf(parent), get_turf(target))> target_range) + if(get_dist(get_turf(parent), get_turf(target))> target_range && !force) return targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index c149874ef238e..89ddae1835d15 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -11,6 +11,8 @@ cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT conductivity = 10 + ///max damage + var/max_damage = 25 /datum/xenoartifact_trait/major/shock/trigger(datum/source, _priority, atom/override) . = ..() @@ -21,7 +23,7 @@ for(var/atom/target in focus) if(iscarbon(target)) var/mob/living/carbon/victim = target - victim.electrocute_act(parent.trait_strength*0.25, parent.parent, 1, 1) //Deal a max of 25 + victim.electrocute_act(max_damage*(parent.trait_strength/100), parent.parent, 1, 1) //Deal a max of 25 else if(istype(target, /obj/item/stock_parts/cell)) var/obj/item/stock_parts/cell/C = target C.give((parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index e3dc848a8b1d0..04150f5546c15 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -9,13 +9,290 @@ /datum/xenoartifact_trait/minor/charged examine_desc = "charged" label_name = "Charged" - label_desc = "Charged: The Artifact's design seems to incorporate a feedback loop. This will cause the artifact to produce more powerful effects." + label_desc = "Charged: The Artifact's design seems to incorporate looping elements. This will cause the artifact to produce more powerful effects." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT /datum/xenoartifact_trait/minor/charged/New(atom/_parent) . = ..() - parent.trait_strength *= 0.25 + parent.trait_strength *= 1.25 /datum/xenoartifact_trait/minor/charged/Destroy(force, ...) . = ..() - parent.trait_strength /= 0.25 + parent.trait_strength /= 1.25 + +/* + Capacitive + Gives the artifact extra uses +*/ +/datum/xenoartifact_trait/minor/capacitive + examine_desc = "capacitive" + label_name = "Capacitive" + label_desc = "Capacitive: The Artifact's design seems to incorporate a capacitive elements. This will cause the artifact to have more uses." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///How many extra charges do we get? + var/max_charges = 2 + ///How many extra charges do we have? + var/current_charge + +/datum/xenoartifact_trait/minor/capacitive/New() + . = ..() + current_charge = max_charges + +/datum/xenoartifact_trait/minor/capacitive/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + if(current_charge) + parent.reset_timer() + current_charge -= 1 + else + playsound(get_turf(parent.parent), 'sound/machines/capacitor_charge.ogg', 50, TRUE) + current_charge = max_charges + +/* + Dense + Makes the artifact behave like a structure +*/ +/datum/xenoartifact_trait/minor/dense + examine_desc = "dense" + label_name = "Dense" + label_desc = "Dense: The Artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Old value tracker + var/old_density + var/old_atom_flag + var/old_item_flag + +/datum/xenoartifact_trait/minor/dense/New(atom/_parent) + . = ..() + var/obj/item/A = parent.parent + //Density + old_density = A.density + A.density = TRUE + //Atom flag + old_atom_flag = A.interaction_flags_atom + A.interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND + //Item flag + if(isitem(A)) + old_item_flag = A.interaction_flags_item + A.interaction_flags_item = INTERACT_ATOM_ATTACK_HAND + +/datum/xenoartifact_trait/minor/dense/Destroy(force, ...) + . = ..() + var/obj/item/A = parent.parent + A.density = old_density + A.interaction_flags_atom = old_atom_flag + if(isitem(A)) + A.interaction_flags_item = old_item_flag + +/* + Sharp + Makes the artifact sharp +*/ +/datum/xenoartifact_trait/minor/sharp + examine_desc = "sharp" + label_name = "Sharp" + label_desc = "Sharp: The Artifact's design seems to incorporate sharp elements. This will cause the artifact to pbe sharper than usual." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_SAFE + ///The artifact's old sharpness + var/old_sharp + ///The artifact's old force + var/old_force + var/max_force = 10 + ///The artifact's old attack verbs + var/list/old_verbs + var/list/attack_verbs = list("cleaved", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") + +/datum/xenoartifact_trait/minor/sharp/New(atom/_parent) + . = ..() + var/obj/item/A = parent.parent + if(isitem(A)) + //Sharpness + old_sharp = A.sharpness + A.sharpness = IS_SHARP + //Force + old_force = A.force + A.force = max_force * (parent.trait_strength/100) + //Verbs + old_verbs = A.attack_verb + A.attack_verb = attack_verbs + +/datum/xenoartifact_trait/minor/sharp/Destroy(force, ...) + . = ..() + var/obj/item/A = parent.parent + if(isitem(A)) + A.sharpness = old_sharp + A.force = old_force + A.attack_verb = old_verbs + +/* + Cooling + Decreases the artifact's initial cooldown by XENOA_TRAIT_COOLDOWN_EXTRA_SAFE seconds +*/ +/datum/xenoartifact_trait/minor/cooling + examine_desc = "cooling" + label_name = "Cooling" + label_desc = "Cooling: The Artifact's design seems to incorporate cooling elements. This will cause the artifact to cooldown faster." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + +/* + Sentient + Allows ghosts to control the artifact +*/ +//datum/xenoartifact_trait/minor/sentient + +/* + Delicate + The artifact has limited uses +*/ +/datum/xenoartifact_trait/minor/delicate + examine_desc = "delicate" + label_name = "Delicate" + label_desc = "Delicate: The Artifact's design seems to delicate cooling elements. This will cause the artifact to potentially break." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Max amount of uses + var/max_uses + ///How many uses we have left + var/current_uses + +/datum/xenoartifact_trait/minor/delicate/New(atom/_parent) + . = ..() + //Generate uses + max_uses = pick(list(3, 6, 9)) + current_uses = max_uses + //TODO: Move this to the didicated appearance proc - Racc + var/atom/A = parent.parent + A.alpha *= 0.7 + +/datum/xenoartifact_trait/minor/delicate/Destroy(force, ...) + . = ..() + var/atom/A = parent.parent + A.alpha /= 0.7 + +/datum/xenoartifact_trait/minor/delicate/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + playsound(get_turf(parent.parent), 'sound/effects/glass_step.ogg', 50, TRUE) + if(current_uses) + current_uses -= 1 + if(!current_uses) + playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) + else if(prob(50)) //After we run out of uses, there is a 50% on use for it to break + parent.cooldown_override = TRUE + //TODO: Make this calcify the artifact - Racc + +/* + Aura + Adds nearby atoms to the target list +*/ +/datum/xenoartifact_trait/minor/aura + label_name = "Aura" + label_desc = "Aura: The Artifact's design seems to incorporate aura elements. This will cause the artifact to target things nearby." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + extra_target_range = 2 + ///Max amount of extra targets we can have + var/max_extra_targets = 5 + +/datum/xenoartifact_trait/minor/aura/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/movable/target in oview(parent.target_range, get_turf(parent.parent))) + if(length(parent.targets) > (max_extra_targets * (parent.trait_strength/100)) || target.anchored) + continue + parent.register_target(target) + +/* + Scoped + Increases target range +*/ +/datum/xenoartifact_trait/minor/scoped + examine_desc = "scoped" + label_name = "Scoped" + label_desc = "Scoped: The Artifact's design seems to incorporate scoped elements. This will cause the artifact to have a larger target range." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + extra_target_range = 9 + +/* + Ringed + Allows the artifact to be worn in the glove slot +*/ +/datum/xenoartifact_trait/minor/ringed + examine_desc = "ringed" + label_name = "Ringed" + label_desc = "Ringed: The Artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Old wearable state + var/old_wearable + +/datum/xenoartifact_trait/minor/ringed/New(atom/_parent) + . = ..() + var/obj/item/A = parent.parent + if(isitem(A)) + old_wearable = A.slot_flags + A.slot_flags |= ITEM_SLOT_GLOVES + +/datum/xenoartifact_trait/minor/ringed/Destroy(force, ...) + . = ..() + var/obj/item/A = parent.parent + if(isitem(A)) + A.slot_flags = old_wearable + +//TODO: Add item action to trigger the artifact - Racc + +/* + Shielded + Makes the artifact act like a shield +*/ +/datum/xenoartifact_trait/minor/shielded + examine_desc = "shielded" + label_name = "Shielded" + label_desc = "Shielded: The Artifact's design seems to incorporate shielded elements. This will allow the artifact to be used like a shield." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Old block level + var/old_block_level + var/max_block_level = 4 + ///old block power + var/old_block_power + var/max_block_power = 80 + ///Old block upgrade + var/old_block_upgrade + +/datum/xenoartifact_trait/minor/shielded/New(atom/_parent) + . = ..() + var/obj/item/A = parent.parent + if(isitem(A)) + //Level + old_block_level = A.block_level + A.block_level = ROUND_UP(max_block_level * (parent.trait_strength/100)) + //power + old_block_power = A.block_power + A.block_power = ROUND_UP(max_block_power * (parent.trait_strength/100)) + //upgrade + old_block_upgrade = A.block_upgrade_walk + A.block_upgrade_walk = 1 + +/datum/xenoartifact_trait/minor/shielded/Destroy(force, ...) + . = ..() + var/obj/item/A = parent.parent + if(isitem(A)) + A.block_level = old_block_level + A.block_power = old_block_power + A.block_upgrade_walk = old_block_upgrade + +/* + Light + Makes the artifact easy to throw +*/ +//datum/xenoartifact_trait/minor/light + +/* + Heavy + Makes the artifact hard to throw +*/ +//datum/xenoartifact_trait/minor/heavy + From fd5fc74a429351c73e6c0b6d5d5fcbb67069d264 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 8 Jan 2024 19:41:44 +1100 Subject: [PATCH 017/339] Fix priorities - 8 1 24 --- code/modules/xenoarchaeology/components/xenoartifact.dm | 6 +++++- code/modules/xenoarchaeology/traits/minors.dm | 7 +++---- code/modules/xenoarchaeology/traits/traits.dm | 3 +-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 031262d0a5b4d..c95fdaef47a29 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -68,13 +68,17 @@ artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() + //Build priotity list + for(var/i in GLOB.xenoartifact_trait_priorities) + artifact_traits[T.priority] = list() + //If we're force-generating traits if(traits) for(var/datum/xenoartifact_trait/T as() in traits) if(ispath(T)) //We can either pass paths, or initialized traits T = new T(src) //TODO: Setup a proc for traits to register a new parent - Racc - //List building + //List building, handle custom priorities, just appened to the end if(!artifact_traits[T.priority]) artifact_traits[T.priority] = list() //handle adding trait diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 04150f5546c15..49c80c6fd4d45 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -178,10 +178,9 @@ playsound(get_turf(parent.parent), 'sound/effects/glass_step.ogg', 50, TRUE) if(current_uses) current_uses -= 1 - if(!current_uses) - playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) else if(prob(50)) //After we run out of uses, there is a 50% on use for it to break parent.cooldown_override = TRUE + playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) //TODO: Make this calcify the artifact - Racc /* @@ -201,8 +200,8 @@ . = ..() if(!.) return - for(var/atom/movable/target in oview(parent.target_range, get_turf(parent.parent))) - if(length(parent.targets) > (max_extra_targets * (parent.trait_strength/100)) || target.anchored) + for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + if(length(parent.targets) > (max_extra_targets * (parent.trait_strength/100))) continue parent.register_target(target) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index ad83ac2e2573f..6335d05620883 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -52,8 +52,7 @@ /datum/xenoartifact_trait/Destroy(force, ...) . = ..() - for(var/atom/A in targets) - unregister_target(A, TRUE) + dump_targets() /datum/xenoartifact_trait/proc/remove_parent(datum/source) SIGNAL_HANDLER From 0aedd986c7c9dbcc8eb10c66d7dfb1f90d01e5f0 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 8 Jan 2024 20:03:04 +1100 Subject: [PATCH 018/339] Fix cooldowns - 8 1 24 --- code/modules/xenoarchaeology/components/xenoartifact.dm | 9 ++++++--- code/modules/xenoarchaeology/traits/minors.dm | 8 +++++++- code/modules/xenoarchaeology/traits/traits.dm | 1 + 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index c95fdaef47a29..d5ab69b5879c7 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -51,6 +51,8 @@ var/trait_cooldown = 0 SECONDS ///Cooldown override. If this is true, we're on cooldown var/cooldown_override = FALSE + ///Is cooldown disabled + var/cooldown_disabled = FALSE ///List of targets we can pass to our traits var/list/targets = list() @@ -70,7 +72,7 @@ //Build priotity list for(var/i in GLOB.xenoartifact_trait_priorities) - artifact_traits[T.priority] = list() + artifact_traits[i] = list() //If we're force-generating traits if(traits) @@ -117,8 +119,6 @@ return else if(use_cooldown_timer) reset_timer(use_cooldown_timer) - //Timer setup - use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), use_cooldown + trait_cooldown, TIMER_STOPPABLE) //Trait triggers for(var/i in GLOB.xenoartifact_trait_priorities) SEND_SIGNAL(src, XENOA_TRIGGER, i) @@ -127,6 +127,9 @@ //Cleanup targets for(var/atom/A in targets) unregister_target(A) + //Timer setup + if(!cooldown_disabled) + use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), use_cooldown + trait_cooldown, TIMER_STOPPABLE) /datum/component/xenoartifact/proc/build_traits(list/trait_list, amount) if(!length(trait_list)) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 49c80c6fd4d45..0ed1c4eccbb16 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -37,6 +37,7 @@ /datum/xenoartifact_trait/minor/capacitive/New() . = ..() current_charge = max_charges + parent.cooldown_disabled = TRUE /datum/xenoartifact_trait/minor/capacitive/trigger(datum/source, _priority, atom/override) . = ..() @@ -45,9 +46,11 @@ if(current_charge) parent.reset_timer() current_charge -= 1 + parent.cooldown_disabled = TRUE else playsound(get_turf(parent.parent), 'sound/machines/capacitor_charge.ogg', 50, TRUE) current_charge = max_charges + parent.cooldown_disabled = FALSE /* Dense @@ -194,7 +197,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS extra_target_range = 2 ///Max amount of extra targets we can have - var/max_extra_targets = 5 + var/max_extra_targets = 10 /datum/xenoartifact_trait/minor/aura/trigger(datum/source, _priority, atom/override) . = ..() @@ -203,6 +206,9 @@ for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) if(length(parent.targets) > (max_extra_targets * (parent.trait_strength/100))) continue + //Only add mobs or items + if(!ismob(target) || !isobj(target)) + continue parent.register_target(target) /* diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 6335d05620883..10ff18fe6538e 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -58,6 +58,7 @@ SIGNAL_HANDLER parent = null + dump_targets() //Cleanly register an effected target /datum/xenoartifact_trait/proc/register_target(atom/target, do_trigger = FALSE) From ae9f578d9fd9d00fbddb2b01080c7fb207c775d9 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 9 Jan 2024 00:16:34 +1100 Subject: [PATCH 019/339] Fix translation - 9 1 24 --- code/modules/xenoarchaeology/traits/activators.dm | 10 ++++++++++ code/modules/xenoarchaeology/traits/majors.dm | 2 +- code/modules/xenoarchaeology/traits/minors.dm | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 9f0f63c3fe640..fbba3949f91ce 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -29,6 +29,7 @@ RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, PROC_REF(translation_type_a)) RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(translation_type_a)) RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(translation_type_c)) + RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(translation_type_d)) /datum/xenoartifact_trait/activator/strudy/proc/translation_type_a(datum/source, atom/target) SIGNAL_HANDLER @@ -47,3 +48,12 @@ parent.register_target(target) trigger_artifact() + +/datum/xenoartifact_trait/activator/strudy/proc/translation_type_d(datum/source, atom/target) + SIGNAL_HANDLER + + var/atom/A = parent.parent + if(!A.density) + return + parent.register_target(target) + trigger_artifact() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 89ddae1835d15..dcc0b34be52f0 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -189,7 +189,7 @@ if(!istype(target)) return //Check for a mob swap holder, and deny the transform if we find one - var/obj/shapeshift_holder/H = locate(/obj/shapeshift_holder) in target + var/obj/shapeshift_holder/H = (locate(/obj/shapeshift_holder) in target) || istype(target.loc, /obj/shapeshift_holder) ? target.loc : null if(H) playsound(get_turf(target), 'sound/machines/buzz-sigh.ogg', 50, TRUE) return diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 0ed1c4eccbb16..071d50520bb4e 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -207,7 +207,7 @@ if(length(parent.targets) > (max_extra_targets * (parent.trait_strength/100))) continue //Only add mobs or items - if(!ismob(target) || !isobj(target)) + if(!ismob(target) && !isobj(target)) continue parent.register_target(target) From 6563b4653d87a0590ed0e36f795396559cd38038 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 9 Jan 2024 12:21:23 +1100 Subject: [PATCH 020/339] Bookmark - 9 1 24 --- code/modules/xenoarchaeology/traits/minors.dm | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 071d50520bb4e..5b74b613d89a0 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -301,3 +301,41 @@ */ //datum/xenoartifact_trait/minor/heavy +/* + Signaller + Sends a signal when the artifact is activated +*/ +/datum/xenoartifact_trait/minor/signaller + label_name = "Signaller" + label_desc = "Signaller: The Artifact's design seems to incorporate signalling elements. This will cause the artifact to send a signal when activated." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Signal code + var/code + ///Signal frequency + var/datum/radio_frequency/radio_connection + //Signal + var/datum/signal/signal + +/datum/xenoartifact_trait/minor/signaller/New(atom/_parent) + . = ..() + //Code + code = rand(0, 100) + //Signal + signal = new(list("code" = code)) + //Frequency + radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") + +/datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) + . = ..() + SSradio.remove_object(src, FREQ_SIGNALER) + +/datum/xenoartifact_trait/minor/signaller/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + INVOKE_ASYNC(src, PROC_REF(do_signal)) + +/datum/xenoartifact_trait/minor/signaller/proc/do_signal() + if(!radio_connection || !signal) + return + radio_connection.post_signal(src, signal) From 167698cf4266a0859d654677176105c3ec2cf52a Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 9 Jan 2024 15:51:59 +1100 Subject: [PATCH 021/339] Fix sentience - 9 1 24 --- code/modules/mob/mob.dm | 7 +- .../components/xenoartifact.dm | 2 +- code/modules/xenoarchaeology/traits/minors.dm | 230 +++++++++++++++++- 3 files changed, 234 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e139703232d04..72b621b53f3a0 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -876,14 +876,17 @@ S.action.Grant(src) ///Remove a spell from the mobs spell list -/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell) +/mob/proc/RemoveSpell(obj/effect/proc_holder/spell/spell, delete_spell = TRUE) if(!spell) return for(var/X in mob_spell_list) var/obj/effect/proc_holder/spell/S = X if(istype(S, spell)) mob_spell_list -= S - qdel(S) + if(delete_spell) + qdel(S) + else + S.action.Remove(src) ///Return any anti magic atom on this mob that matches the magic type /mob/proc/anti_magic_check(magic = TRUE, holy = FALSE, major = TRUE, self = FALSE) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index d5ab69b5879c7..0984950116e73 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -218,7 +218,7 @@ if(length(description_category[i])) temp = "[temp][pick(description_category[i])] " else if(!unknown_used) - temp = "[temp]unknown " + temp = "unknown [temp]" unknown_used = TRUE return temp diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 5b74b613d89a0..1b827fb4d0876 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -98,6 +98,7 @@ label_desc = "Sharp: The Artifact's design seems to incorporate sharp elements. This will cause the artifact to pbe sharper than usual." flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_SAFE + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///The artifact's old sharpness var/old_sharp ///The artifact's old force @@ -144,7 +145,108 @@ Sentient Allows ghosts to control the artifact */ -//datum/xenoartifact_trait/minor/sentient +/datum/xenoartifact_trait/minor/sentient + label_name = "Senitent" + label_desc = "Senitent: The Artifact's design seems to incorporate sentient elements. This will cause the artifact to have a mind of its own." + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + ///Mob who lives inside the artifact, and who we give actions to + var/mob/living/simple_animal/shade/sentience + ///Mob spawner for ghosts + var/obj/effect/mob_spawn/sentient_artifact/mob_spawner + +/datum/xenoartifact_trait/minor/sentient/New(atom/_parent) + . = ..() + if(SSticker.HasRoundStarted()) + get_canidate() + else + mob_spawner = new(parent.parent, src) + +/datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) + . = ..() + QDEL_NULL(sentience) + QDEL_NULL(mob_spawner) + +/datum/xenoartifact_trait/minor/sentient/proc/handle_ghost(datum/source, mob/M, list/examine_text) + if(isobserver(M) && !sentience?.key && (alert(M, "Are you sure you want to control of [sentience]?", "Assume control of [sentience]", "Yes", "No") == "Yes")) + sentience.key = M.ckey + +/datum/xenoartifact_trait/minor/sentient/proc/get_canidate() + var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [parent.parent]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) + if(LAZYLEN(candidates)) + var/mob/dead/observer/O = pick(candidates) + setup_sentience(O.ckey) + return + mob_spawner = new(parent.parent, src) + +/datum/xenoartifact_trait/minor/sentient/proc/setup_sentience(ckey) + //Sentience + sentience = new(parent.parent) + sentience.name = pick(GLOB.xenoa_artifact_names) + sentience.real_name = "[sentience.name] - [parent.parent]" + sentience.key = ckey + sentience.status_flags |= GODMODE + //Action + var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent.parent, parent) + sentience.AddSpell(P) + //Display traits to sentience + to_chat(sentience, "Your traits are: \n") + for(var/datum/xenoartifact_trait/T in parent.artifact_traits) + to_chat(sentience, "[T.label_name]\n") + sentience.add_memory(T.label_name) + playsound(get_turf(parent.parent), 'sound/items/haunted/ghostitemattack.ogg', 50, TRUE) + //Cleanup + QDEL_NULL(mob_spawner) + +//Spawner for sentience +/obj/effect/mob_spawn/sentient_artifact + death = FALSE + name = "Sentient Xenoartifact" + short_desc = "You're a maleviolent sentience, possesing an ancient alien artifact." + flavour_text = "Return to your master..." + use_cooldown = TRUE + ghost_usable = TRUE + banType = ROLE_SENTIENT_XENOARTIFACT + density = FALSE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + invisibility = 101 + ///Ref to the trait we're handling + var/datum/xenoartifact_trait/minor/sentient/trait + +/obj/effect/mob_spawn/sentient_artifact/Initialize(mapload, datum/xenoartifact_trait/minor/sentient/new_trait) + trait = new_trait + return ..() + +/obj/effect/mob_spawn/sentient_artifact/create(ckey) + trait?.setup_sentience(ckey) + +//Action for sentience +/obj/effect/proc_holder/spell/targeted/artifact_senitent_action + name = "Trigger Artifact" + desc = "Select a target to activate your artifact on." + range = 1 + charge_max = 0 SECONDS + clothes_req = 0 + include_user = 0 + action_icon = 'icons/mob/actions/actions_revenant.dmi' + action_icon_state = "r_transmit" + action_background_icon_state = "bg_spell" + ///Ref to the artifact we're handling + var/datum/component/xenoartifact/sentient_artifact + +/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/Initialize(mapload, datum/component/xenoartifact/artifact) + . = ..() + sentient_artifact = artifact + range = sentient_artifact?.target_range + +/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/cast(list/targets,mob/user = usr) + if(!sentient_artifact) + return + for(var/atom/M in targets) + //We have to check the range ourselves + if(get_dist(get_turf(parent.parent), get_turf(M)) <= range) + sentient_artifact.register_target(M, TRUE) + if(length(sentient_artifact.targets)) + sentient_artifact.trigger(TRUE) /* Delicate @@ -231,23 +333,43 @@ label_name = "Ringed" label_desc = "Ringed: The Artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///Old wearable state var/old_wearable + ///Ref to action + var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/artifact_action /datum/xenoartifact_trait/minor/ringed/New(atom/_parent) . = ..() + //Artifact action + artifact_action = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent.parent, parent) + //Item equipping var/obj/item/A = parent.parent if(isitem(A)) old_wearable = A.slot_flags A.slot_flags |= ITEM_SLOT_GLOVES + //Action + RegisterSignal(A, COMSIG_ITEM_EQUIPPED, PROC_REF(equip_action)) + RegisterSignal(A, COMSIG_ITEM_DROPPED, PROC_REF(drop_action)) /datum/xenoartifact_trait/minor/ringed/Destroy(force, ...) . = ..() var/obj/item/A = parent.parent if(isitem(A)) A.slot_flags = old_wearable + QDEL_NULL(artifact_action) + +/datum/xenoartifact_trait/minor/ringed/proc/equip_action(datum/source, mob/equipper, slot) + SIGNAL_HANDLER + + var/obj/item/A = parent.parent + if(isitem(A) && A.slot_flags & slot) + equipper.AddSpell(artifact_action) + +/datum/xenoartifact_trait/minor/ringed/proc/drop_action(datum/source, mob/user) + SIGNAL_HANDLER -//TODO: Add item action to trigger the artifact - Racc + user.RemoveSpell(artifact_action, FALSE) /* Shielded @@ -258,6 +380,7 @@ label_name = "Shielded" label_desc = "Shielded: The Artifact's design seems to incorporate shielded elements. This will allow the artifact to be used like a shield." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///Old block level var/old_block_level var/max_block_level = 4 @@ -339,3 +462,106 @@ if(!radio_connection || !signal) return radio_connection.post_signal(src, signal) + +/* + Anchor + Anchors the artifact +*/ +/datum/xenoartifact_trait/minor/anchor + label_name = "Anchor" + label_desc = "Anchor: The Artifact's design seems to incorporate anchoring elements. This will cause the artifact to anchor when triggered, it can also be unanchored with typical tools." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + extra_target_range = 2 + +/datum/xenoartifact_trait/minor/anchor/New(atom/_parent) + . = ..() + var/atom/movable/AM = parent.parent + if(ismovable(AM)) + RegisterSignal(AM, COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), PROC_REF(toggle_anchor)) + +/datum/xenoartifact_trait/minor/anchor/Destroy(force, ...) + . = ..() + var/atom/movable/AM = parent.parent + if(ismovable(AM)) + AM.anchored = FALSE + +/datum/xenoartifact_trait/minor/anchor/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + toggle_anchor() + +/datum/xenoartifact_trait/minor/anchor/proc/toggle_anchor(datum/source, mob/living/user, obj/item/I, list/recipes) + SIGNAL_HANDLER + + var/atom/movable/AM = parent.parent + //handle being held + if(isliving(AM.loc)) + var/mob/living/M = AM.loc + M.dropItemToGround(AM) + //Anchor + if(ismovable(AM) && isturf(AM.loc)) + AM.anchored = !AM.anchored + +/* + Slippery + makes the artifact slippery +*/ +/datum/xenoartifact_trait/minor/slippery + examine_desc = "slippery" + label_name = "Slippery" + label_desc = "Slippery: The Artifact's design seems to incorporate slippery elements. This will cause the artifact to be slippery." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + ///Refernce to slip component for later cleanup + var/datum/component/slippery/slip_comp + +/datum/xenoartifact_trait/minor/slippery/New(atom/_parent) + . = ..() + var/atom/A = parent.parent + slip_comp = A.AddComponent(/datum/component/slippery, 60) + +/datum/xenoartifact_trait/minor/slippery/Destroy(force, ...) + . = ..() + QDEL_NULL(slip_comp) + +/* + Haunted + Allows the artifact to be controlled by ghosts +*/ +/datum/xenoartifact_trait/minor/haunted + label_name = "Haunted" + label_desc = "Haunted: The Artifact's design seems to incorporate incorporeal elements. This will cause the artifact to move unexpectedly." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Refernce to move component for later cleanup + var/datum/component/deadchat_control/controller + +/datum/xenoartifact_trait/minor/haunted/New(atom/_parent) + . = ..() + var/atom/A = parent.parent + controller = A._AddComponent(list(/datum/component/deadchat_control, "democracy", list( + "up" = CALLBACK(src, PROC_REF(haunted_step), A, NORTH), + "down" = CALLBACK(src, PROC_REF(haunted_step), A, SOUTH), + "left" = CALLBACK(src, PROC_REF(haunted_step), A, WEST), + "right" = CALLBACK(src, PROC_REF(haunted_step), A, EAST), + "activate" = CALLBACK(src, PROC_REF(activate_parent), A)), 8 SECONDS)) + +/datum/xenoartifact_trait/minor/haunted/Destroy(force, ...) + . = ..() + QDEL_NULL(controller) + +/datum/xenoartifact_trait/minor/haunted/proc/haunted_step(atom/movable/target, dir) + //Make any mobs drop this before it moves + if(isliving(target.loc)) + var/mob/living/M = target.loc + M.dropItemToGround(target) + playsound(get_turf(target), 'sound/effects/magic.ogg', 50, TRUE) + step(target, dir) + +/datum/xenoartifact_trait/minor/haunted/proc/activate_parent() + //Find a target + for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + parent.register_target(target, TRUE) + parent.trigger(TRUE) + return From bccc45bf9bc6d9e062b2be9793a195de770e2699 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 9 Jan 2024 17:30:51 +1100 Subject: [PATCH 022/339] Activators - 9 1 24 --- .../xenoarchaeology/traits/activators.dm | 249 ++++++++++++++++-- code/modules/xenoarchaeology/traits/minors.dm | 31 ++- 2 files changed, 244 insertions(+), 36 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index fbba3949f91ce..a7dab02d49579 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -5,55 +5,248 @@ var/override_cooldown = FALSE //Throw custom cooldown logic in here -/datum/xenoartifact_trait/activator/proc/trigger_artifact() +/datum/xenoartifact_trait/activator/proc/trigger_artifact(atom/target) SIGNAL_HANDLER + parent.register_target(target) parent.trigger() return +/datum/xenoartifact_trait/activator/proc/translation_type_a(datum/source, atom/target) + SIGNAL_HANDLER + + trigger_artifact(target) + +/datum/xenoartifact_trait/activator/proc/translation_type_b(datum/source, atom/item, atom/target) + SIGNAL_HANDLER + + trigger_artifact(target) + +/datum/xenoartifact_trait/activator/proc/translation_type_c(datum/source, atom/target, atom/item) + SIGNAL_HANDLER + + trigger_artifact(target) + +/datum/xenoartifact_trait/activator/proc/translation_type_d(datum/source, atom/target) + SIGNAL_HANDLER + + var/atom/A = parent.parent + if(!A.density) + return + trigger_artifact(target) + /* Sturdy This trait activates the artifact when it's used, like a generic item */ - /datum/xenoartifact_trait/activator/strudy examine_desc = "sturdy" label_name = "Sturdy" - label_desc = "The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." - weight = 3 + label_desc = "Sturdy: The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT -/datum/xenoartifact_trait/activator/strudy/New() +/datum/xenoartifact_trait/activator/strudy/New(atom/_parent) . = ..() //Register all the relevant signals we trigger from - RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, PROC_REF(translation_type_b)) - RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, PROC_REF(translation_type_a)) - RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(translation_type_a)) - RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, PROC_REF(translation_type_c)) - RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(translation_type_d)) + RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) + RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) -/datum/xenoartifact_trait/activator/strudy/proc/translation_type_a(datum/source, atom/target) - SIGNAL_HANDLER +/* + Flammable + This trait activates the artifact when it's lit +*/ +/datum/xenoartifact_trait/activator/flammable + examine_desc = "flammable" + label_name = "Flammable" + label_desc = "Flammable: The artifact seems to be made of a flammable material. This material seems to be triggered by heat interaction." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Are we 'lit' and looking for targets + var/lit = FALSE + ///Search cooldown logic + var/search_cooldown = 4 SECONDS + var/search_cooldown_timer - parent.register_target(target) - trigger_artifact() +/datum/xenoartifact_trait/activator/flammable/New(atom/_parent) + . = ..() + RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) -/datum/xenoartifact_trait/activator/strudy/proc/translation_type_b(datum/source, atom/item, atom/target) - SIGNAL_HANDLER +/datum/xenoartifact_trait/activator/flammable/translation_type_b(datum/source, atom/item, atom/target) + var/obj/item/I = item + if(isitem(I) && I.is_hot()) + lit = TRUE + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown) + START_PROCESSING(SSobj, src) - parent.register_target(target) - trigger_artifact() +/datum/xenoartifact_trait/activator/flammable/process(delta_time) + if(!lit) + return ..() + if(search_cooldown_timer) + return + for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + //Only add mobs + if(!ismob(target)) + continue + trigger_artifact(target) + lit = FALSE + break + //We can atleast try triggering with no targets, for traits that don't need 'em + if(!length(parent.targets)) + parent.trigger() + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) -/datum/xenoartifact_trait/activator/strudy/proc/translation_type_c(datum/source, atom/target, atom/item) - SIGNAL_HANDLER +/datum/xenoartifact_trait/activator/flammable/proc/reset_timer() + if(search_cooldown_timer) + deltimer(search_cooldown_timer) + search_cooldown_timer = null - parent.register_target(target) - trigger_artifact() +/* + Timed + This trait activates the artifact on a timer, which can be toggled on & off +*/ +/datum/xenoartifact_trait/activator/timed + label_name = "Timed" + label_desc = "Timed: The artifact seems to be made of a harmonizing material. This material seems to activate on a timer, which can be enabled or disabled." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Are we looking for targets + var/searching = FALSE + ///Search cooldown logic + var/search_cooldown = 4 SECONDS + var/search_cooldown_timer -/datum/xenoartifact_trait/activator/strudy/proc/translation_type_d(datum/source, atom/target) - SIGNAL_HANDLER +/datum/xenoartifact_trait/activator/timed/New(atom/_parent) + . = ..() + //Register all the relevant signals we trigger from + RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) + RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) - var/atom/A = parent.parent - if(!A.density) +/datum/xenoartifact_trait/activator/timed/New(atom/_parent) + . = ..() + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown) + START_PROCESSING(SSobj, src) + +/datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, force) + if(force) + return ..() + else + searching = !searching + +/datum/xenoartifact_trait/activator/timed/process(delta_time) + if(!searching) return - parent.register_target(target) - trigger_artifact() + if(search_cooldown_timer) + return + for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + //Only add mobs + if(!ismob(target)) + continue + trigger_artifact(target, TRUE) + break + if(!length(parent.targets)) + parent.trigger() + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) + +/datum/xenoartifact_trait/activator/timed/proc/reset_timer() + if(search_cooldown_timer) + deltimer(search_cooldown_timer) + search_cooldown_timer = null + +/* + Signal + This trait activates the artifact when it's signalled +*/ +/datum/xenoartifact_trait/activator/signal + label_name = "Signal" + label_desc = "Signal: The artifact seems to be made of a radio sensitive material. This material seems to be triggered by radio pulses." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///Signal code + var/code + ///Signal frequency + var/datum/radio_frequency/radio_connection + //Signal + var/datum/signal/signal + +/datum/xenoartifact_trait/activator/signal/New(atom/_parent) + . = ..() + //Code + code = rand(0, 100) + //Signal + signal = new(list("code" = code)) + //Frequency + radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") + radio_connection.add_listener(src) + +/datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) + . = ..() + SSradio.remove_object(src, FREQ_SIGNALER) + QDEL_NULL(signal) + +/datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) + if(!signal) + return + if(signal.data["code"] != code) + return + for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + //Only add mobs + if(!ismob(target)) + continue + trigger_artifact(target, TRUE) + break + if(!length(parent.targets)) + parent.trigger() + +/* + Cell + This trait activates the artifact when a battery is used +*/ +/datum/xenoartifact_trait/activator/cell + label_name = "Cell" + label_desc = "Cell: The artifact seems to be made of a capacitive material. This material seems to be triggered by eletric currents, such as cells." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + +/datum/xenoartifact_trait/activator/cell/New(atom/_parent) + . = ..() + RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + +/datum/xenoartifact_trait/activator/cell/translation_type_b(datum/source, atom/item, atom/target) + var/obj/item/stock_parts/cell/C = item + if(istype(C) && C.charge-(C.maxcharge*0.25) >= 0) + C.use(C.maxcharge*0.25) + trigger_artifact(target) + +/* + Weighted + This trait activates the artifact when it is picked up +*/ +/datum/xenoartifact_trait/activator/weighted + label_name = "Weighted" + label_desc = "Weighted: The artifact seems to be made of a weighted material. This material seems to be triggered by motion, such as being picked up." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + +/datum/xenoartifact_trait/activator/weighted/New(atom/_parent) + . = ..() + RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + +/datum/xenoartifact_trait/activator/weighted/translation_type_d(datum/source, atom/target) + trigger_artifact(target) + +/* + Pitched + This trait activates the artifact when it is thrown +*/ +/datum/xenoartifact_trait/activator/pitched + label_name = "Pitched" + label_desc = "Pitched: The artifact seems to be made of an aerodynamic material. This material seems to be triggered by motion, such as being thrown." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + +/datum/xenoartifact_trait/activator/pitched/New(atom/_parent) + . = ..() + RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + \ No newline at end of file diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 1b827fb4d0876..3630d9349d7f7 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -243,7 +243,7 @@ return for(var/atom/M in targets) //We have to check the range ourselves - if(get_dist(get_turf(parent.parent), get_turf(M)) <= range) + if(get_dist(get_turf(sentient_artifact.parent), get_turf(M)) <= range) sentient_artifact.register_target(M, TRUE) if(length(sentient_artifact.targets)) sentient_artifact.trigger(TRUE) @@ -413,16 +413,30 @@ A.block_upgrade_walk = old_block_upgrade /* - Light + Aerodynamic Makes the artifact easy to throw */ -//datum/xenoartifact_trait/minor/light +/datum/xenoartifact_trait/minor/aerodynamic + examine_desc = "aerodynamic" + label_name = "Aerodynamic" + label_desc = "Aerodynamic: The Artifact's design seems to incorporate shielAerodynamicded elements. This will allow the artifact to be thrown further." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + ///Old throw range + var/old_throw_range -/* - Heavy - Makes the artifact hard to throw -*/ -//datum/xenoartifact_trait/minor/heavy +/datum/xenoartifact_trait/minor/aerodynamic/New(atom/_parent) + . = ..() + var/atom/movable/A = parent.parent + if(ismovable(A)) + old_throw_range = A.throw_range + A.throw_range = 9 + +/datum/xenoartifact_trait/minor/aerodynamic/Destroy(force, ...) + . = ..() + var/atom/movable/A = parent.parent + if(ismovable(A)) + A.throw_range = old_throw_range /* Signaller @@ -451,6 +465,7 @@ /datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) . = ..() SSradio.remove_object(src, FREQ_SIGNALER) + QDEL_NULL(signal) /datum/xenoartifact_trait/minor/signaller/trigger(datum/source, _priority, atom/override) . = ..() From 0aa40c2a5f1b4e1ea215af5a6aae3a371171e319 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 9 Jan 2024 17:52:27 +1100 Subject: [PATCH 023/339] Fix timers - 9 1 24 --- code/modules/xenoarchaeology/traits/activators.dm | 4 ++-- code/modules/xenoarchaeology/traits/majors.dm | 1 - code/modules/xenoarchaeology/traits/minors.dm | 3 +++ 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index a7dab02d49579..18c114fa7c4cd 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -77,7 +77,7 @@ var/obj/item/I = item if(isitem(I) && I.is_hot()) lit = TRUE - search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown) + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) /datum/xenoartifact_trait/activator/flammable/process(delta_time) @@ -127,7 +127,7 @@ /datum/xenoartifact_trait/activator/timed/New(atom/_parent) . = ..() - search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown) + search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) /datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, force) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index dcc0b34be52f0..39b7b8f722cac 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -411,7 +411,6 @@ dump_targets() clear_focus() - /* Echoing The artifact plays a random sound diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 3630d9349d7f7..7b5b3ac495202 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -478,6 +478,9 @@ return radio_connection.post_signal(src, signal) +/datum/xenoartifact_trait/minor/signaller/proc/receive_signal(datum/signal/signal) + return + /* Anchor Anchors the artifact From 1bbd123df760c79f2fb15d23250e7627f6c183e0 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 9 Jan 2024 23:38:36 +1100 Subject: [PATCH 024/339] malfunctions - 9 1 24 --- beestation.dme | 1 + code/__DEFINES/xenoartifact.dm | 10 - .../components/xenoartifact.dm | 4 +- .../xenoarchaeology/traits/malfunctions.dm | 273 ++++++++++++++++++ code/modules/xenoarchaeology/traits/traits.dm | 3 - 5 files changed, 276 insertions(+), 15 deletions(-) create mode 100644 code/modules/xenoarchaeology/traits/malfunctions.dm diff --git a/beestation.dme b/beestation.dme index 073b7deab0e76..1ffdea853837a 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4144,6 +4144,7 @@ #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" +#include "code\modules\xenoarchaeology\traits\malfunctions.dm" #include "code\modules\xenoarchaeology\traits\minors.dm" #include "code\modules\xenoarchaeology\traits\traits.dm" #include "code\modules\zombie\items.dm" diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index 8e7aadadd1fc5..a4efedeb72ad5 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -65,16 +65,6 @@ old content ///Max vendors / buyers in each catergory #define XENOA_MAX_VENDORS 8 -//Specific trait defines -///Bear limit at once -#define XENOA_MAX_BEARS 3 -///Max targets on expansive -#define XENOA_MAX_TARGETS 6 -///Tick chance to untick -#define XENOA_TICK_CANCEL_PROB 13 -///Max amount of evil clones at once -#define XENOA_MAX_CLONES 5 - ///Chance to avoid target if wearing bomb suit #define XENOA_DEFLECT_CHANCE 45 diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 0984950116e73..4104b1be900ba 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -129,11 +129,11 @@ unregister_target(A) //Timer setup if(!cooldown_disabled) - use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), use_cooldown + trait_cooldown, TIMER_STOPPABLE) + use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), max(0, use_cooldown + trait_cooldown), TIMER_STOPPABLE) /datum/component/xenoartifact/proc/build_traits(list/trait_list, amount) if(!length(trait_list)) - CRASH("TODO: - Racc") + CRASH("Something extrodinarily fucked has happened in the artifact component.") var/list/options = trait_list options -= blacklisted_traits for(var/i in 1 to amount) diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm new file mode 100644 index 0000000000000..ded734aef07ad --- /dev/null +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -0,0 +1,273 @@ +/datum/xenoartifact_trait/malfunction + priority = TRAIT_PRIORITY_MALFUNCTION + register_targets = FALSE + +/* + Parallel Bearspace Retrieval + Summons bears +*/ +/datum/xenoartifact_trait/malfunction/bear + label_name = "P.B.R." + label_desc = "Parallel Bearspace Retrieval: A strange malfunction causes the Artifact to open a gateway to deep bearspace." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + ///List of our current bears + var/list/bears = list() + ///How much can we bear? + var/max_bears = 4 + +/datum/xenoartifact_trait/malfunction/bear/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + if(length(bears) >= max_bears) + return + var/turf/T = get_turf(parent.parent) + var/mob/living/simple_animal/hostile/bear/malnourished/new_bear = new(T) + new_bear.name = pick(list("Freddy", "Bearington", "Smokey", "Beorn", "Pooh", "Winnie", "Baloo", "Rupert", "Yogi", "Fozzie", "Boo")) + bears += new_bear + RegisterSignal(new_bear, COMSIG_MOB_DEATH, PROC_REF(handle_death)) + +/datum/xenoartifact_trait/malfunction/bear/proc/handle_death(datum/source) + SIGNAL_HANDLER + + bears -= source + UnregisterSignal(source, COMSIG_MOB_DEATH) + +/* + Bluespace Axis Desync + Strips a random article from the target +*/ +/datum/xenoartifact_trait/malfunction/strip + label_name = "B.A.D." + label_desc = "Bluespace Axis Desync: A strange malfunction causes the Artifact to remove articles from the target." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/strip/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/M in focus) + var/list/clothing_list = list() + for(var/obj/item/clothing/I in M.contents) + clothing_list += I + if(!length(clothing_list)) + break + var/obj/item/clothing/C = pick(clothing_list) + if(!HAS_TRAIT_FROM(C, TRAIT_NODROP, GLUED_ITEM_TRAIT)) + M.dropItemToGround(C) + dump_targets() + clear_focus() + +/* + Cerebral Dysfunction Emergence + Gives the target a trauma +*/ +/datum/xenoartifact_trait/malfunction/trauma + label_name = "C.D.E." + label_desc = "Cerebral Dysfunction Emergence: A strange malfunction causes the Artifact to cause traumas to emerge in the target." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = TRUE + ///Possbile traumas + var/list/possible_traumas = list( + /datum/brain_trauma/mild/hallucinations, /datum/brain_trauma/mild/stuttering, /datum/brain_trauma/mild/dumbness, + /datum/brain_trauma/mild/speech_impediment, /datum/brain_trauma/mild/concussion, /datum/brain_trauma/mild/muscle_weakness, + /datum/brain_trauma/mild/expressive_aphasia, /datum/brain_trauma/severe/narcolepsy, /datum/brain_trauma/severe/discoordination, + /datum/brain_trauma/severe/pacifism, /datum/brain_trauma/special/beepsky) + ///Choosen trauma + var/datum/brain_trauma/trauma + +/datum/xenoartifact_trait/malfunction/trauma/New(atom/_parent) + . = ..() + trauma = pick(possible_traumas) + +/datum/xenoartifact_trait/malfunction/trauma/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/carbon/M in focus) + M.Unconscious(0.5 SECONDS) + M.gain_trauma(trauma, TRAUMA_RESILIENCE_BASIC) + dump_targets() + clear_focus() + +/* + Mass Area Combustion + Makes a bunch of hotspots near the artifact +*/ +/datum/xenoartifact_trait/malfunction/heated + label_name = "M.A.C." + label_desc = "Mass Area Combustion: A strange malfunction that causes the Artifact to violently combust." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + +/datum/xenoartifact_trait/malfunction/heated/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(parent.parent) + playsound(T, 'sound/effects/bamf.ogg', 50, TRUE) + for(var/turf/open/turf in RANGE_TURFS(max(1, 4*(parent.trait_strength/100)), T)) + if(!locate(/obj/effect/safe_fire) in turf) + new /obj/effect/safe_fire(turf) + +//Lights on fire, does nothing else damage / atmos wise +/obj/effect/safe_fire + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + icon = 'icons/effects/fire.dmi' + icon_state = "1" + layer = GASFIRE_LAYER + blend_mode = BLEND_ADD + light_system = MOVABLE_LIGHT + light_range = LIGHT_RANGE_FIRE + light_power = 1 + light_color = LIGHT_COLOR_FIRE + +/obj/effect/safe_fire/Initialize(mapload) + . = ..() + for(var/atom/AT in loc) + if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose + AT.fire_act(400, 50) //should be average enough to not do too much damage + addtimer(CALLBACK(src, PROC_REF(after_burn)), 0.3 SECONDS) + +/obj/effect/safe_fire/proc/after_burn() + qdel(src) + +/* + Rapid Particle Emmision + Irradiates the artifact and targets +*/ +/datum/xenoartifact_trait/malfunction/radiation + label_name = "R.P.E." + label_desc = "Rapid Particle Emmision: A strange malfunction that causes the Artifact to irradiate itself and its targets." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = TRUE + ///Max amount of radiation we can deal + var/max_rad = 25 + +/datum/xenoartifact_trait/malfunction/radiation/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/atom/A = parent.parent + A.rad_act(max_rad*(parent.trait_strength/100)) + for(var/atom/target in focus) + target.rad_act(max_rad*(parent.trait_strength/100)) + dump_targets() + clear_focus() + +/* + Mirrored Bluespace Collapse + Makes evil clones! +*/ +/datum/xenoartifact_trait/malfunction/twin + label_name = "M.B.C." + label_desc = "Mirrored Bluespace Collapse: The Artifact produces an arguably maleviolent clone of target." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = TRUE + ///List of our evil clones + var/list/clones = list() + ///Max amount of evil clones + var/max_clones = 5 + +/datum/xenoartifact_trait/malfunction/twin/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + //Stop artifact making one morbillion clones + if(length(clones) >= max_clones) + return + for(var/atom/target in focus) + if(!isitem(target) && !ismob(target)) + continue + var/mob/living/simple_animal/hostile/twin/T = new(get_turf(parent.parent)) + //Setup appearance for evil twin + T.name = target.name + T.appearance = target.appearance + T.color = COLOR_BLUE + //Handle limit and hardel + clones += T + RegisterSignal(T, COMSIG_PARENT_QDELETING, PROC_REF(handle_death)) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/malfunction/twin/proc/handle_death(datum/source) + clones -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + +/mob/living/simple_animal/hostile/twin + name = "evil twin" + desc = "It looks so familiar." + mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) + speak_chance = 0 + turns_per_move = 5 + response_help = "pokes" + response_disarm = "shoves" + response_harm = "hits" + speed = 0 + maxHealth = 10 + health = 10 + melee_damage = 5 + attacktext = "punches" + attack_sound = 'sound/weapons/punch1.ogg' + a_intent = INTENT_HARM + atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) + unsuitable_atmos_damage = 15 + faction = list("evil_clone") + status_flags = CANPUSH + del_on_death = TRUE + do_footstep = TRUE + mobchatspan = "syndmob" + +/* + Expansive Explosive Emition + I'm about to blow up, and act like I don't know nobody! AH AH AH AH AH! +*/ +/datum/xenoartifact_trait/malfunction/explosion + label_name = "E.E.E." + label_desc = "Expansive Explosive Emition: A strange malfunction that causes the Artifact to explode." + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + rarity = XENOA_TRAIT_WEIGHT_RARE + ///Max explosion stat + var/max_explosion = 5 + +/datum/xenoartifact_trait/malfunction/explosion/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/atom/A = parent.parent + A.visible_message("The [A] begins to heat up, it's delaminating!") + addtimer(CALLBACK(src, PROC_REF(explode)), 10 SECONDS) + //Fancy animation + //TODO: Picking up and dropping breaks this animation - Racc + A.color = COLOR_RED + var/matrix/old_transform = A.transform + var/matrix/new_transform = A.transform + new_transform.Scale(1.5, 1.5) + animate(parent.parent, transform = new_transform, time = 0.5 SECONDS, loop = -1, flags = ANIMATION_PARALLEL) + animate(transform = old_transform, time = 0.5 SECONDS) + +/datum/xenoartifact_trait/malfunction/explosion/proc/explode() + explosion(get_turf(parent.parent), max_explosion/3*(parent.trait_strength/100), max_explosion/2*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100)) + //TODO: Make this calcify the artifact - Racc + parent.cooldown_override = TRUE + +/* + Mass Hallucinatory Injection + Makes the target/s hallucinate +*/ +/datum/xenoartifact_trait/malfunction/hallucination + label_name = "M.H.I." + label_desc = "Mass Hallucinatory Injection: The Artifact causes the target to hallucinate." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BANANIUM_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/hallucination/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/target in focus) + var/datum/hallucination/H = pick(GLOB.hallucination_list) + H = new H(target) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 10ff18fe6538e..8690a16a6775b 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -36,9 +36,6 @@ var/weight = 0 //KG var/conductivity = 0 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable -/datum/xenoartifact_trait/minor -/datum/xenoartifact_trait/malfunction - /datum/xenoartifact_trait/New(atom/_parent) . = ..() parent = _parent From 366e15cbc018ddcf9296c412c86db7abbc368dee Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 10 Jan 2024 22:37:46 +1100 Subject: [PATCH 025/339] Deduction machines - 10 1 24 --- _maps/map_files/MetaStation/MetaStation.dmm | 3 + beestation.dme | 5 +- .../components/xenoartifact.dm | 20 +++- .../{ => tools}/xenoartifact_console.dm | 14 +-- .../tools/xenoartifact_deducers.dm | 108 ++++++++++++++++++ .../{ => tools}/xenoartifact_labeler.dm | 0 .../xenoarchaeology/traits/activators.dm | 4 +- code/modules/xenoarchaeology/traits/majors.dm | 4 +- code/modules/xenoarchaeology/traits/minors.dm | 22 ++-- code/modules/xenoarchaeology/traits/traits.dm | 6 +- .../xenoarchaeology/xenoartifact_sticker.dmi | Bin 599 -> 581 bytes .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1532 -> 1675 bytes 12 files changed, 157 insertions(+), 29 deletions(-) rename code/modules/xenoarchaeology/{ => tools}/xenoartifact_console.dm (96%) create mode 100644 code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm rename code/modules/xenoarchaeology/{ => tools}/xenoartifact_labeler.dm (100%) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index da5c5dc0c7261..1d045f174d25f 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -15810,6 +15810,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/xenoartifact/scale, /turf/open/floor/plasteel/dark, /area/science/explab) "bAz" = ( @@ -52580,6 +52581,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/xenoartifact/calibrator, /turf/open/floor/plasteel/dark, /area/science/explab) "ncI" = ( @@ -54541,6 +54543,7 @@ }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, /obj/effect/turf_decal/stripes/line, +/obj/machinery/xenoartifact/conductor, /turf/open/floor/plasteel/dark, /area/science/explab) "nRS" = ( diff --git a/beestation.dme b/beestation.dme index 1ffdea853837a..9dc3d923f1b7e 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4139,8 +4139,9 @@ #include "code\modules\wiremod\shell\scanner_gate.dm" #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" -#include "code\modules\xenoarchaeology\xenoartifact_console.dm" -#include "code\modules\xenoarchaeology\xenoartifact_labeler.dm" +#include "code\modules\xenoarchaeology\tools\xenoartifact_console.dm" +#include "code\modules\xenoarchaeology\tools\xenoartifact_deducers.dm" +#include "code\modules\xenoarchaeology\tools\xenoartifact_labeler.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 4104b1be900ba..56c76f5f68d3f 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -209,8 +209,8 @@ for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) if(!description_category[i]) description_category[i] = list() - if(T.examine_desc) //Avoid adding null, so later logic works - description_category[i] += initial(T.examine_desc) + if(T.material_desc) //Avoid adding null, so later logic works + description_category[i] += initial(T.material_desc) //Pick one from each category to build an entire description var/unknown_used = FALSE for(var/i in description_category) @@ -222,6 +222,22 @@ unknown_used = TRUE return temp +/datum/component/xenoartifact/proc/get_material_weight() + var/total_weight = 0 + //Get descriptions from each category + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + total_weight += T.weight + return total_weight + +/datum/component/xenoartifact/proc/get_material_conductivity() + var/total_conductivity = 0 + //Get descriptions from each category + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + total_conductivity += T.conductivity + return total_conductivity + ///material datums /datum/component/xenoartifact_material var/name = "debugium" diff --git a/code/modules/xenoarchaeology/xenoartifact_console.dm b/code/modules/xenoarchaeology/tools/xenoartifact_console.dm similarity index 96% rename from code/modules/xenoarchaeology/xenoartifact_console.dm rename to code/modules/xenoarchaeology/tools/xenoartifact_console.dm index 933e6d83ceeed..1d376dcef7294 100644 --- a/code/modules/xenoarchaeology/xenoartifact_console.dm +++ b/code/modules/xenoarchaeology/tools/xenoartifact_console.dm @@ -6,7 +6,7 @@ /obj/item/circuitboard/machine/xenoartifact_inbox name = "bluespace straythread pad (Machine Board)" icon_state = "science" - build_path = /obj/machinery/xenoartifact_inbox + build_path = /obj/machinery/xenoarchaeology_inbox req_components = list( /obj/item/stack/ore/bluespace_crystal = 1, /obj/item/stock_parts/capacitor = 1, @@ -35,7 +35,7 @@ var/current_tab = "Listings" var/current_tab_info = "Here you can find listings for various research samples, usually fresh from the field. These samples aren't distrubuted by the Nanotrasen affiliated cargo system, so instead listing data is sourced from stray bluespace-threads." ///used for 'shipping' - var/obj/machinery/xenoartifact_inbox/linked_inbox + var/obj/machinery/xenoarchaeology_inbox/linked_inbox ///List of linked machines for UI purposes var/list/linked_machines = list() ///Which science server receives points @@ -240,14 +240,14 @@ ui_update() /obj/machinery/computer/xenoartifact_console/proc/sync_devices() - for(var/obj/machinery/xenoartifact_inbox/I in oview(9,src)) + for(var/obj/machinery/xenoarchaeology_inbox/I in oview(9,src)) if(I.linked_console || I.panel_open) return if(!(linked_inbox)) linked_inbox = I linked_machines += I.name I.linked_console = src - I.RegisterSignal(src, COMSIG_PARENT_QDELETING, /obj/machinery/xenoartifact_inbox/proc/on_machine_del) + I.RegisterSignal(src, COMSIG_PARENT_QDELETING, /obj/machinery/xenoarchaeology_inbox/proc/on_machine_del) RegisterSignal(I, COMSIG_PARENT_QDELETING, PROC_REF(on_inbox_del)) say("Successfully linked [I].") return @@ -261,7 +261,7 @@ #undef STABILITY_COST #undef STABILITY_GAIN -/obj/machinery/xenoartifact_inbox +/obj/machinery/xenoarchaeology_inbox name = "bluespace straythread pad" //Science words desc = "This machine takes advantage of bluespace thread manipulation to highjack in-coming and out-going bluespace signals. Science uses it to deliver their very legal purchases." //All very sciencey icon = 'icons/obj/telescience.dmi' @@ -269,12 +269,12 @@ circuit = /obj/item/circuitboard/machine/xenoartifact_inbox var/linked_console -/obj/machinery/xenoartifact_inbox/proc/on_machine_del() +/obj/machinery/xenoarchaeology_inbox/proc/on_machine_del() SIGNAL_HANDLER UnregisterSignal(linked_console, COMSIG_PARENT_QDELETING) linked_console = null -/obj/machinery/xenoartifact_inbox/Destroy() +/obj/machinery/xenoarchaeology_inbox/Destroy() . = ..() on_machine_del() diff --git a/code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm b/code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm new file mode 100644 index 0000000000000..403b93ec849ea --- /dev/null +++ b/code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm @@ -0,0 +1,108 @@ +/* + Misc machines used to interact with artifact traits +*/ + +/obj/machinery/xenoarchaeology + icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' + ///Do we move the artifact to our turf, or inside us? + var/move_inside = FALSE + ///List of things we need to spit out + var/list/held_contents = list() + var/max_contents = 1 + +/obj/machinery/xenoarchaeology/attackby(obj/item/I, mob/living/user, params) + var/list/modifiers = params2list(params) + var/atom/target = get_target() + //Prechecks + if(move_inside && length(held_contents) >= max_contents) + return + ///Move the item to our target, so we can work with it, like we're a table + if(user.a_intent != INTENT_HARM && !(I.item_flags & ABSTRACT)) + if(user.transferItemToLoc(I, target, silent = FALSE)) + //Center the icon where the user clicked. + if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) + return + //Clamp it so that the icon never moves more than 16 pixels in either direction (thus leaving the table turf) + I.pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + I.pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + //Handle contents + if(move_inside) + register_contents(I) + else + return ..() + +/obj/machinery/xenoarchaeology/attack_hand(mob/living/user) + . = ..() + for(var/atom/movable/A in held_contents) + A.forceMove(get_turf(src)) + unregister_contents(A) + +/obj/machinery/xenoarchaeology/proc/register_contents(atom/A) + RegisterSignal(A, COMSIG_PARENT_QDELETING, PROC_REF(unregister_contents)) + held_contents += A + +/obj/machinery/xenoarchaeology/proc/unregister_contents(datum/source) + SIGNAL_HANDLER + + held_contents -= source + UnregisterSignal(source, COMSIG_PARENT_QDELETING) + +/obj/machinery/xenoarchaeology/proc/get_target() + return move_inside ? src : drop_location() + +/* + Scale, measures artifact weight +*/ +/obj/machinery/xenoarchaeology/scale + icon_state = "scale" + +/obj/machinery/xenoarchaeology/scale/attack_hand(mob/living/user) + . = ..() + ///Get the combined weight of all artifacts in our target + var/atom/target = get_target() + var/total_weight = 0 + for(var/atom/A in target) + var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) + if(X) + total_weight += X.get_material_weight() + else if(isitem(A) || isliving(A)) + if(isliving(A) && prob(1)) + say("Unexpected Fatass Detected!") + say("Get the fuck off me, lardass!") + else + say("Unexpected Item Detected!") + if(total_weight) + say("Total Mass: [total_weight] KG.") + else + say("No Mass Detected!") + +/* + Conductor, measures artifact conductivty +*/ +/obj/machinery/xenoarchaeology/conductor + icon_state = "conductor" + +/obj/machinery/xenoarchaeology/conductor/attack_hand(mob/living/user) + . = ..() + ///Get the combined conductivity of all artifacts in our target + var/atom/target = get_target() + var/total_conductivity = 0 + for(var/atom/A in target) + var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) + if(X) + total_conductivity += X.get_material_conductivity() + else if(isitem(A) || isliving(A)) + say("Unexpected Item Detected!") + return + if(total_conductivity) + say("Total Conductivity: [total_conductivity] MPC.") + else + say("No Conductivity Detected!") + + +/* + Calibrator, calibrates artifacts +*/ +/obj/machinery/xenoarchaeology/calibrator + icon_state = "calibrator" + move_inside = TRUE diff --git a/code/modules/xenoarchaeology/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/tools/xenoartifact_labeler.dm similarity index 100% rename from code/modules/xenoarchaeology/xenoartifact_labeler.dm rename to code/modules/xenoarchaeology/tools/xenoartifact_labeler.dm diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 18c114fa7c4cd..31f0045f67b77 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -40,7 +40,7 @@ This trait activates the artifact when it's used, like a generic item */ /datum/xenoartifact_trait/activator/strudy - examine_desc = "sturdy" + material_desc = "sturdy" label_name = "Sturdy" label_desc = "Sturdy: The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -59,7 +59,7 @@ This trait activates the artifact when it's lit */ /datum/xenoartifact_trait/activator/flammable - examine_desc = "flammable" + material_desc = "flammable" label_name = "Flammable" label_desc = "Flammable: The artifact seems to be made of a flammable material. This material seems to be triggered by heat interaction." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 39b7b8f722cac..edbd2828439f2 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -37,7 +37,7 @@ Captures the target for an amount of time */ /datum/xenoartifact_trait/major/hollow - examine_desc = "hollow" + material_desc = "hollow" label_name = "Hollow" label_desc = "The artifact seems to contain hollow components. Triggering these components will capture the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS @@ -109,7 +109,7 @@ The artifact shoots the target with a random projectile */ /datum/xenoartifact_trait/major/projectile - examine_desc = "barreled" + material_desc = "barreled" label_name = "Barreled" label_desc = "Barreled: The artifact seems to contain projectile components. Triggering these components will produce a projectile." flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 7b5b3ac495202..da1afb58db119 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -7,7 +7,7 @@ Increases the artifact trait strength by 25% */ /datum/xenoartifact_trait/minor/charged - examine_desc = "charged" + material_desc = "charged" label_name = "Charged" label_desc = "Charged: The Artifact's design seems to incorporate looping elements. This will cause the artifact to produce more powerful effects." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -25,7 +25,7 @@ Gives the artifact extra uses */ /datum/xenoartifact_trait/minor/capacitive - examine_desc = "capacitive" + material_desc = "capacitive" label_name = "Capacitive" label_desc = "Capacitive: The Artifact's design seems to incorporate a capacitive elements. This will cause the artifact to have more uses." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -57,7 +57,7 @@ Makes the artifact behave like a structure */ /datum/xenoartifact_trait/minor/dense - examine_desc = "dense" + material_desc = "dense" label_name = "Dense" label_desc = "Dense: The Artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -93,7 +93,7 @@ Makes the artifact sharp */ /datum/xenoartifact_trait/minor/sharp - examine_desc = "sharp" + material_desc = "sharp" label_name = "Sharp" label_desc = "Sharp: The Artifact's design seems to incorporate sharp elements. This will cause the artifact to pbe sharper than usual." flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -135,7 +135,7 @@ Decreases the artifact's initial cooldown by XENOA_TRAIT_COOLDOWN_EXTRA_SAFE seconds */ /datum/xenoartifact_trait/minor/cooling - examine_desc = "cooling" + material_desc = "cooling" label_name = "Cooling" label_desc = "Cooling: The Artifact's design seems to incorporate cooling elements. This will cause the artifact to cooldown faster." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -253,7 +253,7 @@ The artifact has limited uses */ /datum/xenoartifact_trait/minor/delicate - examine_desc = "delicate" + material_desc = "delicate" label_name = "Delicate" label_desc = "Delicate: The Artifact's design seems to delicate cooling elements. This will cause the artifact to potentially break." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -318,7 +318,7 @@ Increases target range */ /datum/xenoartifact_trait/minor/scoped - examine_desc = "scoped" + material_desc = "scoped" label_name = "Scoped" label_desc = "Scoped: The Artifact's design seems to incorporate scoped elements. This will cause the artifact to have a larger target range." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -329,7 +329,7 @@ Allows the artifact to be worn in the glove slot */ /datum/xenoartifact_trait/minor/ringed - examine_desc = "ringed" + material_desc = "ringed" label_name = "Ringed" label_desc = "Ringed: The Artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -376,7 +376,7 @@ Makes the artifact act like a shield */ /datum/xenoartifact_trait/minor/shielded - examine_desc = "shielded" + material_desc = "shielded" label_name = "Shielded" label_desc = "Shielded: The Artifact's design seems to incorporate shielded elements. This will allow the artifact to be used like a shield." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -417,7 +417,7 @@ Makes the artifact easy to throw */ /datum/xenoartifact_trait/minor/aerodynamic - examine_desc = "aerodynamic" + material_desc = "aerodynamic" label_name = "Aerodynamic" label_desc = "Aerodynamic: The Artifact's design seems to incorporate shielAerodynamicded elements. This will allow the artifact to be thrown further." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT @@ -527,7 +527,7 @@ makes the artifact slippery */ /datum/xenoartifact_trait/minor/slippery - examine_desc = "slippery" + material_desc = "slippery" label_name = "Slippery" label_desc = "Slippery: The Artifact's design seems to incorporate slippery elements. This will cause the artifact to be slippery." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 8690a16a6775b..0044489afce20 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -3,7 +3,7 @@ var/datum/component/xenoartifact/parent ///Acts as a descriptor for when examining - 'reinforced' 'electrified' 'hollow' - var/examine_desc + var/material_desc ///Used when labeler needs a name and trait is too sneaky to have a descriptor when examining. var/label_name ///Something briefly explaining it in inagame terms. @@ -33,8 +33,8 @@ var/extra_target_range = 0 ///Characteristics for deduction - var/weight = 0 //KG - var/conductivity = 0 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable + var/weight = 1 //KG + var/conductivity = 1 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable /datum/xenoartifact_trait/New(atom/_parent) . = ..() diff --git a/icons/obj/xenoarchaeology/xenoartifact_sticker.dmi b/icons/obj/xenoarchaeology/xenoartifact_sticker.dmi index 8d38c27a27c26de93b41589e5f13f8b71a6de322..970e5c450d479df179eef872caef3b3f66bceb39 100644 GIT binary patch delta 414 zcmV;P0b%~v1jPi9PXUvWP-cIzDvmGCP0Yz5T1!%X1u1GtG`*xKlN7ZinqHJ&nwLVF zYWy}RE4cc(fTIflsPl!7dyD=I<_q=Ec`E~KXLN<{Ouy(-t1pu0TK+FZ?*dq2}UT|7-0q3 z6C=n9#f~7YGzvv02wZ>7TGXr(2DR4+HD93RU1J8iQcfkJzWIR1j`zU#f~IB72MEm$ zuHXvlE>_^1AJhLn78VwM7c~3Ha|rVNpf(^=y%XHq1U0j&IY$Tt77Zkvd{D@|kgx+n zd{j8Zz|@wieIKg%UKk+tiBi;4l24e&d)T<>9eatD1`7fotXmQ^*+Der_y7O^07*qo IM6N<$g6m1MvH$=8 delta 432 zcmV;h0Z;zL1lI(RPXU^dP-cHI6es0Z#24o#=Hw8qqogR4XthQ8rFkhNnh$gl(P}|n zCDC}WlSuI_e)E+TT>V_Y(FFj%%7xK%R2wt^00B)&L_t(oh3!|-mBSzmi#Ip}3xrOP zI18k(|4irRD^mKL*U#&rzk-D@q_UZ&fxiv?38zJQB;62Z9!Ri+I$(bVooPXNETC6w zg^0W&LG`hmN3t12NM13CRC^BzW|)N9282QcHG>_vq=f|j?Ky8-5a8>XK@zg)a z(*Yq-1#)+u*%~1v6M=u~fixtD<{5qL<<5cm%9Bf2Ap$G-JbJI&^Ag#+whfO-N{3S- z1-I`f9~0g~@2#B`%3k&QEk%V@Ctp_aN&Ik_#$^0Tg z6fPh_%{(JBL8+O4tFYiem;`U>^)YsxHYXn&_{BO|O-)QaF0flHXE`xX@P3Q{0004WQchCV=-0C=30kA)oN>e$4oG4h-lEc=jU+|N1)Y4ap05_M_flI8bMh7x3(>Gvp&M zZ@O<^*Lc9a=AM1^1Ov7Y`Syn`59rzVK7#EdEPeVN_wRe(476?*f`WpAf`WpA{=a=w&auE z^S_V}hJ4U_Iu!E3kPn7@Fywrd#3HYIoAn;K@;G=-RrvRCJ&dtG;1_VAm2U8jl_!J8ASU@QjP^uk}{r|y{`tvC@2Xze#AM4d);A6dd0(=sX%jZVs z@jgCM3b23lalq2Y0ZX3(WdFar# z^7)*bgAAbd89?nbfZFE(*?g{;gEXL-gEXL-gEXL-gDfDE&$&%M4QO}#B%s~#lYn-| z&j7Od9Q&Oq0$-abK<+zJ1im)WfI&e)_t0!!)hrVti}a7@(0ozVT!^LkR6ibyQLEDo z0z!YpxdIdlPzdZ1UCHPAb(`*Dvd1Z@ z5A_kNp!{@oZ691$@;L<1*2$Ksc5{7ubHplm8$g)PA%M0{woHiAUO_Mey928JR|4h; zpsABB6Ljn??Qw>z#Rd@6aCXU3w*mPa28dR0yKTJ1+nv-_%ABEobAV#0B^03gyeofT zna?4BwobN81>pX$s_L*mO6~W12Pl6l0L?RKK>2ZZz#^YpS1nb8YMI>A?~c1nAj-BS z;4Z_4INNmv{08}49q?GI)8SYGVthgrx0j>>0~Ez0bOY22$yW_fUMnN(BY$nw?_Pj5 zpKI)A)J-a?0zR&Sdatl)?zc2xQKx?l05;GWKrl@XmjL!{{MFoRF%={MD>cSe64Ci3 zVE`KgS*cGu;9+$T_1EkoKs^U3Ksdx50r^RAu5vdA2|)DXIXN}-wgLP- zolfd+PR--*%>a>`{5rq~4B$0-$N*lWdk^3rFjp3(yaTPk00000NkvXXu0mjfbQARY delta 1457 zcmV;i1y1^l4g3p`Bmr`fB|U$@z`)(kzbGs`NK#^6agP6HGylvp0RI3pX8->)nepq} zJ}@&`O-&~s8%#Ye=!!P@#X7KCEN3|}%7$?500001bW%=J06^y0W&i*Hw0cxnbVOxy zV{&P5bZKvH004NLosqc?!Y~j-Yx^s#q(z9Ur9p|J6yz7sCf*QB&Y^$xn&a;=p`ZXn zK-bE+^9#Z$qm)oa1w zq18+A(eM8iZ(fi^c9&kOhR)>pM>-seKSHtzXA~kRC@3iCm+58XzL<>Ke;GKzx366G z1n<7qczrR6q9|t0P=53iKOXX9)|X!}jpNBHdB&h0PvsXp&X<1xu>v5^kazfSKVp14 z24?gHJo`ezzrM~VbMgY7eKDEMXX*^{0-k+!hP(x4ru+7FAJ4dH?%7v&Fk|bGZ+|{; zgPwiwPjL7NOP`+O{(bM8fx*o}P*6}%P*70N@0aiVFXV$E9~||T-=s@yeiyU(;gBB< z`4Q`XC%=nX|EGWX;(%`xPAOXs7AE9c*axcIZS(ufEk@Dai#^bx`p z^lu@QfbUxR5-1?>Q9$6MfWT(}seG;lRF~iYwa)-*p8I+?HF_KNe7m1(ad| zrG^37-w!U-zptq=sQa+>v0A+ZK31z&z$XE@d~RWG@BKZY0G*EmIv)pgJ_X4BzON}X z30h`cp-F$xGUEzOf|eOqXcD^2@cEnpOcK0MH-N^c0gX=s8lM7W^Em@(77`lJEF?6b zSx9I=vyf1LY(8g7HL($&oyI^0n|PNsC@=d`y3#f&$VNa z1~g-k1~g-k1~g-k1!VHMX46jt+8sX$Xm|W1pxyB^fNVa;zB38%+C%|z?@R)`Hqn4V zK|!}G-E@=^$DQ$PZL*Fw#Bpal9}u8yc)&c@mTjH}`0XCdi$bB*-okwDaJaU!za3@7ab*;Fu6xil_XGs_ zTo3R+>R?`!rU%P=_aMmU5I~7iRh6NDfK_DN*5SBkc|n|7UiZrTTw2x*#Dy&g=J z)FItIt_OFWd=3MYe3d3N9n}I>@}mHC`^bMDg!vo-Sf%!}NmCy^sOp~s-1Y%e3z%L3 z>d7ksP5ZbW6k-qZIRr4XfY}w`vu3dZbom?tC<#^nW%7^A0e)6peM&G{0Q07~Ghmy~ z?GQjksQ5awIPa?{%d&0m33vec90I8NFw3s%U|z6#0H9t-KCS@k`g$d)>jscUy!U@< zd}#Bz-hQS&UX8WSV+;7y9@KktT{Gx|~j@TI%H5iv=uMJqso9>vFj$u#0QIEZ~5C`py3Uex} Date: Thu, 11 Jan 2024 20:53:46 +1100 Subject: [PATCH 026/339] Stickers - 11 1 24 --- beestation.dme | 7 +- .../game/objects/effects/spawners/lootdrop.dm | 2 +- code/game/objects/items/sticker.dm | 93 ++++++++++ code/modules/clothing/outfits/standard.dm | 2 +- .../research/designs/machine_designs.dm | 2 +- code/modules/research/designs/misc_designs.dm | 2 +- ..._console.dm => xenoarchaeology_console.dm} | 36 ++-- ..._labeler.dm => xenoarchaeology_labeler.dm} | 173 +++++------------- ...educers.dm => xenoarchaeology_machines.dm} | 22 +-- .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1675 -> 1517 bytes 10 files changed, 180 insertions(+), 159 deletions(-) create mode 100644 code/game/objects/items/sticker.dm rename code/modules/xenoarchaeology/tools/{xenoartifact_console.dm => xenoarchaeology_console.dm} (88%) rename code/modules/xenoarchaeology/tools/{xenoartifact_labeler.dm => xenoarchaeology_labeler.dm} (50%) rename code/modules/xenoarchaeology/tools/{xenoartifact_deducers.dm => xenoarchaeology_machines.dm} (80%) diff --git a/beestation.dme b/beestation.dme index 9dc3d923f1b7e..aadf5e6294d4a 100644 --- a/beestation.dme +++ b/beestation.dme @@ -1347,6 +1347,7 @@ #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\singularityhammer.dm" #include "code\game\objects\items\spear.dm" +#include "code\game\objects\items\sticker.dm" #include "code\game\objects\items\stunbaton.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" @@ -4139,10 +4140,10 @@ #include "code\modules\wiremod\shell\scanner_gate.dm" #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" -#include "code\modules\xenoarchaeology\tools\xenoartifact_console.dm" -#include "code\modules\xenoarchaeology\tools\xenoartifact_deducers.dm" -#include "code\modules\xenoarchaeology\tools\xenoartifact_labeler.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" +#include "code\modules\xenoarchaeology\tools\xenoarchaeology_console.dm" +#include "code\modules\xenoarchaeology\tools\xenoarchaeology_labeler.dm" +#include "code\modules\xenoarchaeology\tools\xenoarchaeology_machines.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" #include "code\modules\xenoarchaeology\traits\malfunctions.dm" diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index ce177b5d33b08..30c21b76a3028 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -438,7 +438,7 @@ /obj/item/circuitboard/machine/nanite_programmer, /obj/item/circuitboard/machine/nanite_program_hub, /obj/item/circuitboard/machine/xenoartifact_inbox, - /obj/item/circuitboard/computer/xenoartifact_console + /obj/item/circuitboard/computer/xenoarchaeology_console ) /obj/effect/spawner/lootdrop/techstorage/security diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm new file mode 100644 index 0000000000000..ce9f585da766a --- /dev/null +++ b/code/game/objects/items/sticker.dm @@ -0,0 +1,93 @@ +#define STICKER_STATE_STUCK "STICKER_STATE_STUCK" +#define STICKER_STATE_ITEM "STICKER_STATE_ITEM" + +/obj/item/sticker + name = "sticker" + desc = "An adhesive graphic." + icon_state = "madeyoulook" + vis_flags = VIS_INHERIT_ID + w_class = WEIGHT_CLASS_TINY + appearance_flags = TILE_BOUND | PIXEL_SCALE | RESET_COLOR | RESET_ALPHA + ///Our current state for being stuck or unstuck + var/sticker_state = STICKER_STATE_ITEM + ///Built appearance for item state + var/mutable_appearance/item_appearance + ///Build appearance for stuck state + var/mutable_appearance/stuck_appearance + ///Sticker icon + var/sticker_icon + var/sticker_icon_state = "skub" + ///Do we add an outline? + var/do_outline = TRUE + +/obj/item/sticker/Initialize(mapload) + . = ..() + item_appearance = build_item_appearance() + stuck_appearance = build_stuck_appearance() + //Sticker outline + if(do_outline) + add_filter("sticker_outline", 1, outline_filter(1.5, "#fff")) + +/obj/item/sticker/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!can_stick(target) || !proximity_flag) + return + //Update state + sticker_state = STICKER_STATE_STUCK + update_appearance() + //Move to our target + forceMove(target) + layer = target.layer+0.01 + target.vis_contents += src + //Build click offset + var/list/modifiers = params2list(click_parameters) + if(!LAZYACCESS(modifiers, ICON_X) || !LAZYACCESS(modifiers, ICON_Y)) + return + pixel_x = clamp(text2num(LAZYACCESS(modifiers, ICON_X)) - 16, -(world.icon_size/2), world.icon_size/2) + pixel_y = clamp(text2num(LAZYACCESS(modifiers, ICON_Y)) - 16, -(world.icon_size/2), world.icon_size/2) + +/obj/item/sticker/attack_hand(mob/user) + //Remove sticker from vis contents + if(sticker_state == STICKER_STATE_STUCK) + var/atom/movable/AM = loc + AM.vis_contents -= src + layer = initial(layer) + //Set this here so ``update_appearance`` works correctly + sticker_state = STICKER_STATE_ITEM + update_appearance() + . = ..() + //Reset click offset + pixel_x = 0 + pixel_y = 0 + +/obj/item/sticker/after/attackby(obj/item/I, mob/living/user, params) + //If we're stuck to something, pass the attack to our loc + if(sticker_state == STICKER_STATE_STUCK) + var/atom/A = loc + A.attackby(I, user, params) + return + return ..() + +/obj/item/sticker/update_appearance(updates) + . = ..() + switch(sticker_state) + if(STICKER_STATE_ITEM) + appearance = item_appearance + if(STICKER_STATE_STUCK) + appearance = stuck_appearance + else + return + //We have to update the name everytime, due to how setting appearance works + name = initial(name) + +/obj/item/sticker/proc/build_item_appearance() + return mutable_appearance(src.icon, src.icon_state) + +/obj/item/sticker/proc/build_stuck_appearance() + return mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state) + +/obj/item/sticker/proc/can_stick(atom/target) + return ismovable(target) ? TRUE : FALSE + +#undef STICKER_STATE_STUCK +#undef STICKER_STATE_ITEM diff --git a/code/modules/clothing/outfits/standard.dm b/code/modules/clothing/outfits/standard.dm index c3209f1c26888..c8d62359e8d83 100644 --- a/code/modules/clothing/outfits/standard.dm +++ b/code/modules/clothing/outfits/standard.dm @@ -18,7 +18,7 @@ /obj/item/storage/part_replacer/bluespace/tier4=1,\ /obj/item/debug/human_spawner=1,\ /obj/item/debug/omnitool=1,\ - /obj/item/xenoartifact_labeler/debug=1,\ + /obj/item/xenoarchaeology_labeler/debug=1,\ /obj/item/debug/orb_of_power=1 ) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 0084b8097ade2..6ae67e109d20d 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -672,7 +672,7 @@ name = "Computer Design (Research and Development Listing Console)" desc = "The circuit board for a research listing console." id = "xenoa_list_console" - build_path = /obj/item/circuitboard/computer/xenoartifact_console + build_path = /obj/item/circuitboard/computer/xenoarchaeology_console category = list ("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 28ac73db3411e..39e143f67995d 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -262,7 +262,7 @@ id = "xenoa_labeler" build_type = PROTOLATHE materials = list(/datum/material/iron = 2000, /datum/material/glass = 1000, /datum/material/silver = 1000, /datum/material/gold = 3000) - build_path = /obj/item/xenoartifact_labeler + build_path = /obj/item/xenoarchaeology_labeler category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/xenoarchaeology/tools/xenoartifact_console.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm similarity index 88% rename from code/modules/xenoarchaeology/tools/xenoartifact_console.dm rename to code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm index 1d376dcef7294..3c0b7ed6177b5 100644 --- a/code/modules/xenoarchaeology/tools/xenoartifact_console.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm @@ -1,7 +1,7 @@ -/obj/item/circuitboard/computer/xenoartifact_console +/obj/item/circuitboard/computer/xenoarchaeology_console name = "research and development listing console (Computer Board)" icon_state = "science" - build_path = /obj/machinery/computer/xenoartifact_console + build_path = /obj/machinery/computer/xenoarchaeology_console /obj/item/circuitboard/machine/xenoartifact_inbox name = "bluespace straythread pad (Machine Board)" @@ -19,12 +19,12 @@ ///Stability gained on-tick #define STABILITY_GAIN 5 -/obj/machinery/computer/xenoartifact_console +/obj/machinery/computer/xenoarchaeology_console name = "research and development listing console" desc = "A science console used to source sellers, and buyers, for various blacklisted research objects." - icon_screen = "xenoartifact_console" + icon_screen = "xenoarchaeology_console" icon_keyboard = "rd_key" - circuit = /obj/item/circuitboard/computer/xenoartifact_console + circuit = /obj/item/circuitboard/computer/xenoarchaeology_console ///Sellers give artifacts var/list/sellers = list() @@ -47,7 +47,7 @@ ///Stability - lowers as people buy artifacts, stops spam buying var/stability = 100 -/obj/machinery/computer/xenoartifact_console/Initialize() +/obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() linked_techweb = SSresearch.science_tech budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) @@ -63,7 +63,7 @@ //Start processing to gain stability START_PROCESSING(SSobj, src) -/obj/machinery/computer/xenoartifact_console/Destroy() +/obj/machinery/computer/xenoarchaeology_console/Destroy() . = ..() on_inbox_del() qdel(sellers) @@ -71,19 +71,19 @@ qdel(sold_artifacts) STOP_PROCESSING(SSobj, src) -/obj/machinery/computer/xenoartifact_console/process() +/obj/machinery/computer/xenoarchaeology_console/process() stability = min(100, stability + STABILITY_GAIN) //Update UI every 3 seconds, may be delayed if(world.time % 3 == 0) ui_update() -/obj/machinery/computer/xenoartifact_console/ui_interact(mob/user, datum/tgui/ui) +/obj/machinery/computer/xenoarchaeology_console/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "XenoartifactConsole") ui.open() -/obj/machinery/computer/xenoartifact_console/ui_data(mob/user) +/obj/machinery/computer/xenoarchaeology_console/ui_data(mob/user) var/list/data = list() data["points"] = budget ? budget.account_balance : 0 data["seller"] = list() @@ -117,7 +117,7 @@ return data -/obj/machinery/computer/xenoartifact_console/ui_act(action, params) //I should probably use a switch statement for this but, the for statements look painful +/obj/machinery/computer/xenoarchaeology_console/ui_act(action, params) //I should probably use a switch statement for this but, the for statements look painful . = TRUE if(..()) return @@ -167,7 +167,7 @@ update_icon() //Auto sells item on pad, finds seller for you -/obj/machinery/computer/xenoartifact_console/proc/sell() +/obj/machinery/computer/xenoarchaeology_console/proc/sell() if(!linked_inbox) say("Error. No linked hardware.") return @@ -202,9 +202,9 @@ info = "[entry.main]\n[entry.gain]\n" //append sticker traits & pass it off - var/obj/item/xenoartifact_label/L = (locate(/obj/item/xenoartifact_label) in selling_item.contents) + var/obj/item/sticker/xenoartifact_label/L = (locate(/obj/item/sticker/xenoartifact_label) in selling_item.contents) //var/obj/item/xenoartifact/A = selling_item //TODO: - Racc - for(var/datum/xenoartifact_trait/T as() in L?.trait_list) + for(var/datum/xenoartifact_trait/T as() in L?.traits) var/color = rgb(255, 0, 0) //using tertiary operator breaks it /* @@ -227,19 +227,19 @@ say(info) -/obj/machinery/computer/xenoartifact_console/proc/generate_new_seller() //Called after a short period +/obj/machinery/computer/xenoarchaeology_console/proc/generate_new_seller() //Called after a short period var/datum/xenoartifact_seller/S = new S.generate() sellers += S ui_update() -/obj/machinery/computer/xenoartifact_console/proc/generate_new_buyer() +/obj/machinery/computer/xenoarchaeology_console/proc/generate_new_buyer() var/datum/xenoartifact_seller/buyer/B = new B.generate() buyers += B ui_update() -/obj/machinery/computer/xenoartifact_console/proc/sync_devices() +/obj/machinery/computer/xenoarchaeology_console/proc/sync_devices() for(var/obj/machinery/xenoarchaeology_inbox/I in oview(9,src)) if(I.linked_console || I.panel_open) return @@ -253,7 +253,7 @@ return say("Unable to find linkable hadrware.") -/obj/machinery/computer/xenoartifact_console/proc/on_inbox_del() //Hard del measures +/obj/machinery/computer/xenoarchaeology_console/proc/on_inbox_del() //Hard del measures SIGNAL_HANDLER UnregisterSignal(linked_inbox, COMSIG_PARENT_QDELETING) linked_inbox = null diff --git a/code/modules/xenoarchaeology/tools/xenoartifact_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm similarity index 50% rename from code/modules/xenoarchaeology/tools/xenoartifact_labeler.dm rename to code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 4fc5550a5c8a6..bfbab4feefcad 100644 --- a/code/modules/xenoarchaeology/tools/xenoartifact_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -1,8 +1,8 @@ //TODO: Redo this code, or just improve it - Racc -/obj/item/xenoartifact_labeler +/obj/item/xenoarchaeology_labeler name = "artifact labeler" icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' - icon_state = "xenoartifact_labeler" + icon_state = "labeler" desc = "A tool scientists use to label their alien bombs." throw_speed = 3 throw_range = 5 @@ -25,15 +25,13 @@ ///trait dialogue essentially var/list/info_list = list() - ///Name artifacts something pretty - var/sticker_name ///passed down to sticker var/list/sticker_traits = list() ///Cooldown for stickers COOLDOWN_DECLARE(sticker_cooldown) -/obj/item/xenoartifact_labeler/Initialize(mapload) +/obj/item/xenoarchaeology_labeler/Initialize(mapload) . = ..() generate_xenoa_statics() //generate data for trait names @@ -42,37 +40,38 @@ major_traits = get_trait_list_names(GLOB.xenoa_majors) malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) -/obj/item/xenoartifact_labeler/ui_interact(mob/user, datum/tgui/ui) +/obj/item/xenoarchaeology_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) ui = new(user, src, "XenoartifactLabeler") ui.open() -/obj/item/xenoartifact_labeler/ui_data(mob/user) +/obj/item/xenoarchaeology_labeler/ui_data(mob/user) var/list/data = list() data["selected_activator_traits"] = selected_activator_traits - data["activator_traits"] = activator_traits - data["selected_minor_traits"] = selected_minor_traits - data["minor_traits"] = minor_traits - data["selected_major_traits"] = selected_major_traits - data["major_traits"] = major_traits - data["selected_malfunction_traits"] = selected_malfunction_traits - data["malfunction_list"] = malfunction_list - data["info_list"] = info_list return data -/obj/item/xenoartifact_labeler/ui_act(action, params) +/obj/item/xenoarchaeology_labeler/ui_static_data(mob/user) + var/list/data = list() + data["malfunction_list"] = malfunction_list + data["major_traits"] = major_traits + data["minor_traits"] = minor_traits + data["activator_traits"] = activator_traits + + return data + +/obj/item/xenoarchaeology_labeler/ui_act(action, params) if(..()) return if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown)) COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) - create_label(sticker_name) + create_label() return else if(!COOLDOWN_FINISHED(src, sticker_cooldown) && isliving(loc)) var/mob/living/user = loc @@ -82,10 +81,6 @@ clear_selection() return - if(action == "change_print_name" && istext(params["name"])) - sticker_name = sanitize_text(params["name"]) - return - trait_toggle(action, "activator", activator_traits, selected_activator_traits) trait_toggle(action, "minor", minor_traits, selected_minor_traits) trait_toggle(action, "major", major_traits, selected_major_traits) @@ -95,28 +90,27 @@ return TRUE //Get a list of all the specified trait types names -/obj/item/xenoartifact_labeler/proc/get_trait_list_names(list/trait_type) +/obj/item/xenoarchaeology_labeler/proc/get_trait_list_names(list/trait_type) var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) temp += initial(T.label_name) return temp -/obj/item/xenoartifact_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? +/obj/item/xenoarchaeology_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? if(place.Find(culprit)) return TRUE return FALSE -/obj/item/xenoartifact_labeler/afterattack(atom/target, mob/user, proximity_flag) +/obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown)) COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) - create_label(sticker_name, target, user) + create_label(target, user) else if(!COOLDOWN_FINISHED(src, sticker_cooldown)) to_chat(user, "The labeler is still printing.") ///reset all the options -/obj/item/xenoartifact_labeler/proc/clear_selection() - sticker_name = null +/obj/item/xenoarchaeology_labeler/proc/clear_selection() info_list = list() sticker_traits = list() selected_activator_traits = list() @@ -125,16 +119,13 @@ selected_malfunction_traits = list() ui_update() -/obj/item/xenoartifact_labeler/proc/create_label(new_name, mob/target, mob/user) - var/obj/item/xenoartifact_label/P = new(get_turf(src)) - if(new_name) - P.name = new_name - P.set_name = TRUE - P.trait_list = sticker_traits +/obj/item/xenoarchaeology_labeler/proc/create_label(mob/target, mob/user) + var/obj/item/sticker/xenoartifact_label/P = new(get_turf(src)) + P.traits = sticker_traits P.info = selected_activator_traits+selected_minor_traits+selected_major_traits+selected_malfunction_traits - P.attempt_attach(target, user, TRUE) + P.afterattack(target, user, TRUE) -/obj/item/xenoartifact_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) +/obj/item/xenoarchaeology_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) var/datum/xenoartifact_trait/description_holder var/new_trait for(var/t in trait_list) @@ -152,103 +143,39 @@ sticker_traits -= new_trait //This is just a hacky way of getting the info from a datum using its desc becuase I wrote this last and it's not heartbreaking -/obj/item/xenoartifact_labeler/proc/desc2datum(udesc) +/obj/item/xenoarchaeology_labeler/proc/desc2datum(udesc) for(var/datum/xenoartifact_trait/X as() in GLOB.xenoa_all_traits) if((udesc == initial(X.label_desc)) || (udesc == initial(X.label_name))) return X CRASH("The xenoartifact trait description '[udesc]' doesn't have a corresponding trait. Something fucked up.") -// Not to be confused with labeler -/obj/item/xenoartifact_label - icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' - icon_state = "sticker_star" - name = "artifact label" - desc = "An adhesive label describing the characteristics of a Xenoartifact." - var/info = "" - var/set_name = FALSE - var/mutable_appearance/sticker_overlay - var/list/trait_list = list() //List of traits used to compare and generate modifier. - -/obj/item/xenoartifact_label/Initialize() - . = ..() - icon_state = "sticker_[pick("star", "box", "tri", "round")]" - var/sticker_state = "[icon_state]_small" - sticker_overlay = mutable_appearance(icon, sticker_state) - sticker_overlay.layer = FLOAT_LAYER - sticker_overlay.appearance_flags = RESET_COLOR - -/obj/item/xenoartifact_label/proc/attempt_attach(atom/target, mob/user, instant = FALSE) - if(istype(target, /mob/living)) - to_chat(target, "[user] attempts to stick a [src] to you!") - to_chat(user, "You attempt to stick a [src] on [target]!") - if(!do_after(user, 30, target = target)) - if(instant) - qdel(src) - return - if(!user.temporarilyRemoveItemFromInventory(src)) - if(instant) - qdel(src) - return - add_sticker(target) - addtimer(CALLBACK(src, PROC_REF(remove_sticker), target), 15 SECONDS, TIMER_STOPPABLE) - return TRUE - else if(istype(target, /obj/item/xenoartifact)) - var/obj/item/xenoartifact/xenoa_target = target - if(set_name) //You can update the name now - xenoa_target.name = name - calculate_modifier(xenoa_target) - add_sticker(xenoa_target) - if(set_name) - xenoa_target.name = name - if(info) - var/textinfo = list2text(info) - xenoa_target.desc += "There's a sticker attached, it says-\n[textinfo]" - return TRUE - -/obj/item/xenoartifact_label/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - . = ..() - if(proximity_flag) - attempt_attach(target, user, FALSE) - -/obj/item/xenoartifact_label/proc/add_sticker(mob/target) - if(locate(/obj/item/xenoartifact_label) in target) //Remove old stickers - qdel(locate(/obj/item/xenoartifact_label) in target) - target.add_overlay(sticker_overlay) - forceMove(target) - -/obj/item/xenoartifact_label/proc/remove_sticker(mob/target) //Peels off - target.cut_overlay(sticker_overlay) - forceMove(get_turf(target)) - -/obj/item/xenoartifact_label/proc/calculate_modifier(obj/item/xenoartifact/X) //Modifier based off preformance of slueth. To:Do revisit this, complexity would be nice - //var/datum/xenoartifact_trait/trait //TODO: - Racc - var/datum/component/xenoartifact_pricing/xenop = X.GetComponent(/datum/component/xenoartifact_pricing) - if(!xenop) - return - xenop.modifier = initial(xenop.modifier) - /* - TODO: - Racc - for(var/t in trait_list) - trait = new t - if(X.get_trait(trait)) - xenop.modifier += 0.15 - else - xenop.modifier -= 0.35 - */ - -/obj/item/xenoartifact_label/proc/list2text(list/listo) //list2params acting weird. Probably already a function for this. - var/text = "" - for(var/X in listo) - text = "[text] [X]\n" - return text - -/obj/item/xenoartifact_labeler/debug +/obj/item/xenoarchaeology_labeler/debug name = "xenoartifact debug labeler" desc = "Use to create specific Xenoartifacts" -/obj/item/xenoartifact_labeler/debug/afterattack(atom/target, mob/user) +/obj/item/xenoarchaeology_labeler/debug/afterattack(atom/target, mob/user) return -/obj/item/xenoartifact_labeler/debug/create_label(new_name) +/obj/item/xenoarchaeology_labeler/debug/create_label(new_name) var/obj/item/xenoartifact/A = new(get_turf(loc)) A.AddComponent(/datum/component/xenoartifact, /datum/component/xenoartifact_material, sticker_traits) + +/* + Sticker for labeler, so we can label artifact's with their traits +*/ +/obj/item/sticker/xenoartifact_label + icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' + icon_state = "sticker_star" + name = "artifact label" + desc = "An adhesive label, for artifacts." + do_outline = FALSE + ///List of artifact traits we're labelling + var/list/traits + // + var/info = "" + +/obj/item/sticker/xenoartifact_label/Initialize() + //Setup a random appearance + icon_state = "sticker_[pick(list("star", "box", "tri", "round"))]" + sticker_icon_state = "[icon_state]_small" + return ..() diff --git a/code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm similarity index 80% rename from code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm rename to code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 403b93ec849ea..fd0a8e05c90a6 100644 --- a/code/modules/xenoarchaeology/tools/xenoartifact_deducers.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -2,7 +2,7 @@ Misc machines used to interact with artifact traits */ -/obj/machinery/xenoarchaeology +/obj/machinery/xenoarchaeology_machine icon = 'icons/obj/xenoarchaeology/xenoartifact_tech.dmi' ///Do we move the artifact to our turf, or inside us? var/move_inside = FALSE @@ -10,7 +10,7 @@ var/list/held_contents = list() var/max_contents = 1 -/obj/machinery/xenoarchaeology/attackby(obj/item/I, mob/living/user, params) +/obj/machinery/xenoarchaeology_machine/attackby(obj/item/I, mob/living/user, params) var/list/modifiers = params2list(params) var/atom/target = get_target() //Prechecks @@ -31,32 +31,32 @@ else return ..() -/obj/machinery/xenoarchaeology/attack_hand(mob/living/user) +/obj/machinery/xenoarchaeology_machine/attack_hand(mob/living/user) . = ..() for(var/atom/movable/A in held_contents) A.forceMove(get_turf(src)) unregister_contents(A) -/obj/machinery/xenoarchaeology/proc/register_contents(atom/A) +/obj/machinery/xenoarchaeology_machine/proc/register_contents(atom/A) RegisterSignal(A, COMSIG_PARENT_QDELETING, PROC_REF(unregister_contents)) held_contents += A -/obj/machinery/xenoarchaeology/proc/unregister_contents(datum/source) +/obj/machinery/xenoarchaeology_machine/proc/unregister_contents(datum/source) SIGNAL_HANDLER held_contents -= source UnregisterSignal(source, COMSIG_PARENT_QDELETING) -/obj/machinery/xenoarchaeology/proc/get_target() +/obj/machinery/xenoarchaeology_machine/proc/get_target() return move_inside ? src : drop_location() /* Scale, measures artifact weight */ -/obj/machinery/xenoarchaeology/scale +/obj/machinery/xenoarchaeology_machine/scale icon_state = "scale" -/obj/machinery/xenoarchaeology/scale/attack_hand(mob/living/user) +/obj/machinery/xenoarchaeology_machine/scale/attack_hand(mob/living/user) . = ..() ///Get the combined weight of all artifacts in our target var/atom/target = get_target() @@ -79,10 +79,10 @@ /* Conductor, measures artifact conductivty */ -/obj/machinery/xenoarchaeology/conductor +/obj/machinery/xenoarchaeology_machine/conductor icon_state = "conductor" -/obj/machinery/xenoarchaeology/conductor/attack_hand(mob/living/user) +/obj/machinery/xenoarchaeology_machine/conductor/attack_hand(mob/living/user) . = ..() ///Get the combined conductivity of all artifacts in our target var/atom/target = get_target() @@ -103,6 +103,6 @@ /* Calibrator, calibrates artifacts */ -/obj/machinery/xenoarchaeology/calibrator +/obj/machinery/xenoarchaeology_machine/calibrator icon_state = "calibrator" move_inside = TRUE diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index 8ebaa7e3e0948b3d795566d62e7ae65b3f8854ed..668094f0202ebb0dd91c8b24ee526f38a1a4fd33 100644 GIT binary patch literal 1517 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 V7Nxuct-t^P002ovPDHLkV1mNk3SR&K From 5a0c031639c3292a51208edd9a2c376bfd23085b Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 11 Jan 2024 21:55:16 +1100 Subject: [PATCH 027/339] better code for labeler - 11 1 24 --- code/_globalvars/xenoartifact.dm | 3 + code/game/objects/items/sticker.dm | 6 +- .../tools/xenoarchaeology_labeler.dm | 101 ++++++++++-------- code/modules/xenoarchaeology/traits/traits.dm | 7 +- .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1517 -> 1705 bytes 5 files changed, 66 insertions(+), 51 deletions(-) diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index bced13d822176..dee1dc966fbc1 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -9,6 +9,8 @@ GLOBAL_LIST(xenoa_minors) GLOBAL_LIST(xenoa_majors) GLOBAL_LIST(xenoa_malfunctions) GLOBAL_LIST(xenoa_all_traits) +///All traits indexed by name +GLOBAL_LIST(xenoa_all_traits_keyed) ///Blacklist for traits GLOBAL_LIST(xenoa_XENOA_BLUESPACE_TRAITs) @@ -30,6 +32,7 @@ GLOBAL_LIST(xenoa_XENOA_BANANIUM_TRAITs) GLOB.xenoa_majors = compile_artifact_weights(/datum/xenoartifact_trait/major) GLOB.xenoa_malfunctions = compile_artifact_weights(/datum/xenoartifact_trait/malfunction) GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) + GLOB.xenoa_all_traits_keyed = compile_artifact_weights(/datum/xenoartifact_trait, TRUE) GLOB.xenoa_XENOA_BLUESPACE_TRAITs = compile_artifact_whitelist(XENOA_BLUESPACE_TRAIT) GLOB.xenoa_XENOA_PLASMA_TRAITs = compile_artifact_whitelist(XENOA_PLASMA_TRAIT) diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker.dm index ce9f585da766a..6e4e46e7f40e7 100644 --- a/code/game/objects/items/sticker.dm +++ b/code/game/objects/items/sticker.dm @@ -1,3 +1,4 @@ +//TODO: Moves these to a define file - Racc #define STICKER_STATE_STUCK "STICKER_STATE_STUCK" #define STICKER_STATE_ITEM "STICKER_STATE_ITEM" @@ -60,7 +61,7 @@ pixel_x = 0 pixel_y = 0 -/obj/item/sticker/after/attackby(obj/item/I, mob/living/user, params) +/obj/item/sticker/attackby(obj/item/I, mob/living/user, params) //If we're stuck to something, pass the attack to our loc if(sticker_state == STICKER_STATE_STUCK) var/atom/A = loc @@ -88,6 +89,3 @@ /obj/item/sticker/proc/can_stick(atom/target) return ismovable(target) ? TRUE : FALSE - -#undef STICKER_STATE_STUCK -#undef STICKER_STATE_ITEM diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index bfbab4feefcad..14a0029c6fb1b 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -22,14 +22,15 @@ var/list/selected_malfunction_traits = list() var/list/malfunction_list = list() - ///trait dialogue essentially + ///List of descriptions for selected traits var/list/info_list = list() - ///passed down to sticker - var/list/sticker_traits = list() + ///List of selected traits we'll put on the label + var/list/label_traits = list() ///Cooldown for stickers - COOLDOWN_DECLARE(sticker_cooldown) + var/sticker_cooldown = 5 SECONDS + COOLDOWN_DECLARE(sticker_cooldown_timer) /obj/item/xenoarchaeology_labeler/Initialize(mapload) . = ..() @@ -69,18 +70,19 @@ if(..()) return - if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown)) - COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) + //print label + if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown_timer)) + COOLDOWN_START(src, sticker_cooldown_timer, sticker_cooldown) create_label() return - else if(!COOLDOWN_FINISHED(src, sticker_cooldown) && isliving(loc)) + else if(!COOLDOWN_FINISHED(src, sticker_cooldown_timer) && isliving(loc)) var/mob/living/user = loc to_chat(user, "The labeler is still printing.") - + //Clear selections if(action == "clear_traits") clear_selection() return - + //Toggle traits trait_toggle(action, "activator", activator_traits, selected_activator_traits) trait_toggle(action, "minor", minor_traits, selected_minor_traits) trait_toggle(action, "major", major_traits, selected_major_traits) @@ -94,25 +96,21 @@ var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) temp += initial(T.label_name) + return temp -/obj/item/xenoarchaeology_labeler/proc/look_for(list/place, culprit) //This isn't really needed but, It's easier to use as a function. What does this even do? - if(place.Find(culprit)) - return TRUE - return FALSE - /obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) . = ..() - if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown)) - COOLDOWN_START(src, sticker_cooldown, 5 SECONDS) + if(proximity_flag && COOLDOWN_FINISHED(src, sticker_cooldown_timer)) + COOLDOWN_START(src, sticker_cooldown_timer, 5 SECONDS) create_label(target, user) - else if(!COOLDOWN_FINISHED(src, sticker_cooldown)) + else if(!COOLDOWN_FINISHED(src, sticker_cooldown_timer)) to_chat(user, "The labeler is still printing.") ///reset all the options /obj/item/xenoarchaeology_labeler/proc/clear_selection() info_list = list() - sticker_traits = list() + label_traits = list() selected_activator_traits = list() selected_minor_traits = list() selected_major_traits = list() @@ -120,45 +118,36 @@ ui_update() /obj/item/xenoarchaeology_labeler/proc/create_label(mob/target, mob/user) - var/obj/item/sticker/xenoartifact_label/P = new(get_turf(src)) - P.traits = sticker_traits - P.info = selected_activator_traits+selected_minor_traits+selected_major_traits+selected_malfunction_traits - P.afterattack(target, user, TRUE) + var/obj/item/sticker/xenoartifact_label/P = new(get_turf(src), label_traits) + if(target && user) + P.afterattack(target, user, TRUE) /obj/item/xenoarchaeology_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) - var/datum/xenoartifact_trait/description_holder - var/new_trait for(var/t in trait_list) - new_trait = desc2datum(t) - description_holder = new_trait if(action != "assign_[toggle_type]_[t]") continue - if(!look_for(active_trait_list, t)) - active_trait_list += t - info_list += initial(description_holder.label_desc) - sticker_traits += new_trait - else + var/datum/xenoartifact_trait/description_holder = GLOB.xenoa_all_traits_keyed[t] + if(t in active_trait_list) active_trait_list -= t info_list -= initial(description_holder.label_desc) - sticker_traits -= new_trait - -//This is just a hacky way of getting the info from a datum using its desc becuase I wrote this last and it's not heartbreaking -/obj/item/xenoarchaeology_labeler/proc/desc2datum(udesc) - for(var/datum/xenoartifact_trait/X as() in GLOB.xenoa_all_traits) - if((udesc == initial(X.label_desc)) || (udesc == initial(X.label_name))) - return X - CRASH("The xenoartifact trait description '[udesc]' doesn't have a corresponding trait. Something fucked up.") + label_traits -= GLOB.xenoa_all_traits_keyed[t] + else + active_trait_list += t + info_list += initial(description_holder.label_desc) + label_traits += GLOB.xenoa_all_traits_keyed[t] /obj/item/xenoarchaeology_labeler/debug name = "xenoartifact debug labeler" desc = "Use to create specific Xenoartifacts" + icon_state = "labeler_debug" + sticker_cooldown = 0 SECONDS /obj/item/xenoarchaeology_labeler/debug/afterattack(atom/target, mob/user) return /obj/item/xenoarchaeology_labeler/debug/create_label(new_name) var/obj/item/xenoartifact/A = new(get_turf(loc)) - A.AddComponent(/datum/component/xenoartifact, /datum/component/xenoartifact_material, sticker_traits) + A.AddComponent(/datum/component/xenoartifact, /datum/component/xenoartifact_material, label_traits) /* Sticker for labeler, so we can label artifact's with their traits @@ -170,12 +159,34 @@ desc = "An adhesive label, for artifacts." do_outline = FALSE ///List of artifact traits we're labelling - var/list/traits - // - var/info = "" - -/obj/item/sticker/xenoartifact_label/Initialize() + var/list/traits = list() + ///A special examine description built from the traits we have + var/examine_override = "" + +/obj/item/sticker/xenoartifact_label/Initialize(mapload, list/_traits) + //Setup traits & examine desc + traits = _traits + if(length(traits)) + examine_override = "Traits:" + for(var/datum/xenoartifact_trait/T as() in traits) + examine_override = "[examine_override]\n - [initial(T.label_name)]" //Setup a random appearance icon_state = "sticker_[pick(list("star", "box", "tri", "round"))]" sticker_icon_state = "[icon_state]_small" return ..() + +/obj/item/sticker/xenoartifact_label/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + . = ..() + if(!can_stick(target) || !proximity_flag) + return + RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(parent_examine)) + +/obj/item/sticker/xenoartifact_label/attack_hand(mob/user) + if(sticker_state == STICKER_STATE_STUCK) + UnregisterSignal(loc, COMSIG_PARENT_EXAMINE) + . = ..() + +/obj/item/sticker/xenoartifact_label/proc/parent_examine(datum/source, mob/user, list/examine_text) + SIGNAL_HANDLER + + examine_text += examine_override diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 0044489afce20..b1f90a1cf03c5 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -127,13 +127,16 @@ return ///Proc used to compile trait weights into a list -/proc/compile_artifact_weights(path) +/proc/compile_artifact_weights(path, keyed = FALSE) if(!ispath(path)) return var/list/temp = subtypesof(path) var/list/weighted = list() for(var/datum/xenoartifact_trait/T as() in temp) - weighted += list((T) = initial(T.rarity)) //The (T) will not work if it is T + if(keyed) + weighted += list(initial(T.label_name) = (T)) + else + weighted += list((T) = initial(T.rarity)) //The (T) will not work if it is T return weighted ///Compile a blacklist of traits from a given flag/s diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index 668094f0202ebb0dd91c8b24ee526f38a1a4fd33..b61d9bb837f42b6b5a3131b23411862252b4cf7c 100644 GIT binary patch literal 1705 zcmYjSdohIs3=w`Fx(wd7jUC{(A~M-A}42>nH;N zR9&b}-g0Ki5r$Hb*U9?AbUAf;y7^FqLg5^cd6C9tZ9r8fcYz=EEZNoxk0V?>7u#81 zg)_FLdWTO83PKZ0w9r@*fhYq+8I36GCjz;m$z;T;rTOvM!V`vix*I*#0jEy6*_qxB zGLE)7CJ&d)k1hW7rXbnUf>nYwG zMx6WAfbZYXBE&I$SJOBtaf$2cxw16ccv7UDrRR-6+HCCCmKGEnD`#74GSU2P2qR5? zF_i4>ej1QJjMC&yTbhr5vQt!2#Cdu`GClqr06)}JTv`+r9x(q_X7an<1S7PJ~8Z1 zypMt7*6R5aj`Z;7w<^rJd6K*8l`mUwkT1VVT9CDtoOo_PcfNn;Qr?tneX8?I z>Oq(LV{?~>cVYXplyWz1$UMQWT!qK2jvAr9q{7>$H*vq6n|_Zn3;l$~!{J~9)upzo zksUG{0f&k2{q#jy8D#7Q8#o||0Lw>@f$5W=To3XjsS&u|A|b>og#kSTAgS@q`4G$F z1shV8&y(r#rEnHW5oD@>FWM~6y=0s+b}vG`5Y~YC3$KUpw7O05<)pAmUtbFm{|k&U z?fAe*5804`;V+Ty$h_z+2zpQ%IM(f}bS`aggNUbu@*SiGyo zoqdO*@CWZ_*BeuQ_vMay=f>w3m{2xoy#LE?xzr~=69KO4(El*xD)ECnBlbd`OgMQ{ z157^ys~A4?PxKcQ!3l<6?Ge`WQ9;r{11LQDB^=|5XN^{wL(jaG!y22IeyXSao)+CP z_A;|SNnbFEI@|rW?{a9z(j>+aT;zTOjzHQuf&B3jaipTN2~pU%wUulghZr(fNMs#*ELdE; z0DNF83Vv2q><#szpSNsac6yLD2rJu0#+^gO;?%lehI7K)ypZ>E5>A;jMbpFwiQ#12+t#fdZ zE#8RCOgqAOM0!Ud^fH(h|IQkftZnunZ*h{C9~pdUsbgI|OwiWc+)}8^OmDyR=>1KL zP~=!UV2c7q>RLEk#2pE)M^H17zCT6;gEONuJHHrNZ}bXwEe*8u6+YP;u-ulUZ!RNE zC$ln8M80(9h46!omJ61M-KtdAt20w54W4543yH8kRJ?oq;s))hMQVGO@yHXzY}UR$ z2J<0lrd374Svl^DG#$~zO45gyltwB_T0BZFsm*N<1}HZvF27PXriuJHQzURMR#)abU)a)3R{Wn98{$T(B delta 1513 zcmVHz;yKHLAZ00000S4eC?JVYrdFo)SpsGbbM#Og%1HO-<;EHu%LlC@efkQes|lj<8!OEN3|}7a1V%>)P+^*@fFDZ*Bkpc$}4yy$-@K z420+8DWY~q{H-jgRn>vM0&)^VBc)AcC-C|NIwI7v-O1lsKDkuqx@kLAU0V4-Vi!h# zbyCO8R*I*yvCrnPm!d~^@8fJZLc}bKiGocgUMCMcKp};7#Cfoj;zlswtiN#W6Y>NG zS0^BGB=9Z`t0ReE{D)rz*??cZ*o5)DF3>WW`)GnSs0WQ6e{!X&yXy167ptC#C@(>` z5&!@ME=fc|RA_5+VB6py00X&$(;=#wSVaC zIpoL<{5q4J-HYda=@V&(2>IWLkl!G}fZbdW@vZP7qEYx5v9sGWQV0MbJ|Hxxj|c*= zr=)Iy0OCUc@m&CUiwmH92SE84(2`PjU;yzUfcO}o)Zzie=bu4~2Pie0EP(od2ta)V z5OM;9oB$ywK-JJxJ_M*5av#lFgZK7_#D9aEFkw8K<+yLtri}%44{1; zpnV5G4>AwXgUkc;AaejQD9l#mWuwMyMP4>)+*ah}qlPzAFCR6$nR@xCF`KEEw+Qy% z0N5pJ0Q?gDD1hpr1E72dK>03zfPMx%KtBT>pq~K`FefGpFefGpFefGpaGm)cIrce# z^UVL!mp*~ozNPlo0e)b~{|5kq@DZRxgubEM?e%*7et%yG0_rO06!{(^x`jU&3^oFg zd=Cgc>JNuiKy8bxd=CM{2Y?kSAo<<_P<{mvj4TBZK=OSR(6{_<*{+{|gN~K&A%OS* z5K8&x0s%DNBLMXQpe^N_3jzqa0CN2oeh&ab@y|CGxK(sWzDKh*AU*=rRG^~C@Qa_DB=J*-y^_~_+`L&5?Y#!S%4m79-#dF5+I(&NlKK6 zHz2^|d%T|xbHB2mitkH*EpY&~mofXb1So${-LDlOuOZ<9>=Kpg8o#<%uU^5XfM^`q zfQWg>s>cq1@;Lx)5eLxEfC2QfXRvt%=EP(H=EQ`6WJZ)=fa}bc0RGIEb6^QRr{yU>?VDBor6d`Bni3^Z8tU@w~VmY!&c-Rocn@wwRND#8WTZQ7JM7ewxnG zL;12b07du`kV-&G0P>LC_!mH>0@;A)Z8h0wAqbFfhbPJqe9Suh3_1fw8y{{jd`N8h!M)V%=( zm{gg?N>G7{w$3?!I6he{PoKsMxTaenbb>f(HHRspP90ckV+ zhRdtV@OpW3dna{!v%D??%tx|d4E7=oAT?OuaP{*lygz+-{3Z4HaC%Pxaa>tN`ProJ zkbh->RG;ao1jzUG9Z#1}0`PqITk7t)1elg`aX2ZRs*(7AD+lQRg93=RqoPG@1u}4? zKt(Q)cc2y((ZpFnB{Ef_lgyn6P~^|L3P|Wf;jbPbD_~dAHY#w=K_z%Q0Ax8#C_svx zWEMala*8I|4!Dz-*S9}XZ?7*CZxT+{1Bef#<)3*tL07aIz}-Zr*pFLtFayF79Ruo? zX#%xcL| Date: Thu, 11 Jan 2024 23:14:44 +1100 Subject: [PATCH 028/339] bookmark - 11 1 24 --- beestation.dme | 3 +- code/__DEFINES/xenoartifact.dm | 10 +- code/_globalvars/xenoartifact.dm | 23 +- .../game/objects/effects/spawners/lootdrop.dm | 1 - .../research/designs/machine_designs.dm | 8 - .../components/xenoartifact.dm | 20 +- .../tools/console/xenoarchaeology_console.dm | 47 +++ .../tools/console/xenoarchaeology_seller.dm | 106 ++++++ .../tools/xenoarchaeology_console.dm | 320 ------------------ .../tools/xenoarchaeology_labeler.dm | 7 +- 10 files changed, 194 insertions(+), 351 deletions(-) create mode 100644 code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm create mode 100644 code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm delete mode 100644 code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm diff --git a/beestation.dme b/beestation.dme index aadf5e6294d4a..df3757cfc4528 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4141,9 +4141,10 @@ #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" -#include "code\modules\xenoarchaeology\tools\xenoarchaeology_console.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_labeler.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_machines.dm" +#include "code\modules\xenoarchaeology\tools\console\xenoarchaeology_console.dm" +#include "code\modules\xenoarchaeology\tools\console\xenoarchaeology_seller.dm" #include "code\modules\xenoarchaeology\traits\activators.dm" #include "code\modules\xenoarchaeology\traits\majors.dm" #include "code\modules\xenoarchaeology\traits\malfunctions.dm" diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index a4efedeb72ad5..6b352d9b0b18c 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -1,14 +1,14 @@ //Material defines ///Safe -#define XENOA_BLUESPACE /datum/component/xenoartifact_material +#define XENOA_BLUESPACE /datum/xenoartifact_material/bluespace ///Mild -#define XENOA_PLASMA /datum/component/xenoartifact_material +#define XENOA_PLASMA /datum/xenoartifact_material/plasma ///Dangerous -#define XENOA_URANIUM /datum/component/xenoartifact_material +#define XENOA_URANIUM /datum/xenoartifact_material/uranium ///Wildcard -#define XENOA_BANANIUM /datum/component/xenoartifact_material +#define XENOA_BANANIUM /datum/xenoartifact_material/bananium ///The gods are about to do something stupid -#define XENOA_DEBUGIUM /datum/component/xenoartifact_material +#define XENOA_DEBUGIUM /datum/xenoartifact_material //Trait priorities #define TRAIT_PRIORITY_ACTIVATOR "activator" diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index dee1dc966fbc1..8ac0c9678a13f 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -13,10 +13,10 @@ GLOBAL_LIST(xenoa_all_traits) GLOBAL_LIST(xenoa_all_traits_keyed) ///Blacklist for traits -GLOBAL_LIST(xenoa_XENOA_BLUESPACE_TRAITs) -GLOBAL_LIST(xenoa_XENOA_PLASMA_TRAITs) -GLOBAL_LIST(xenoa_XENOA_URANIUM_TRAITs) -GLOBAL_LIST(xenoa_XENOA_BANANIUM_TRAITs) +GLOBAL_LIST(xenoa_bluespace_traits) +GLOBAL_LIST(xenoa_plasma_traits) +GLOBAL_LIST(xenoa_uranium_traits) +GLOBAL_LIST(xenoa_bananium_traits) ///Fill globals /proc/generate_xenoa_statics() @@ -34,17 +34,16 @@ GLOBAL_LIST(xenoa_XENOA_BANANIUM_TRAITs) GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) GLOB.xenoa_all_traits_keyed = compile_artifact_weights(/datum/xenoartifact_trait, TRUE) - GLOB.xenoa_XENOA_BLUESPACE_TRAITs = compile_artifact_whitelist(XENOA_BLUESPACE_TRAIT) - GLOB.xenoa_XENOA_PLASMA_TRAITs = compile_artifact_whitelist(XENOA_PLASMA_TRAIT) - GLOB.xenoa_XENOA_URANIUM_TRAITs = compile_artifact_whitelist(XENOA_URANIUM_TRAIT) - GLOB.xenoa_XENOA_URANIUM_TRAITs = compile_artifact_whitelist(XENOA_BANANIUM_TRAIT) - -/* -New content -*/ + GLOB.xenoa_bluespace_traits = compile_artifact_whitelist(XENOA_BLUESPACE_TRAIT) + GLOB.xenoa_plasma_traits = compile_artifact_whitelist(XENOA_PLASMA_TRAIT) + GLOB.xenoa_uranium_traits = compile_artifact_whitelist(XENOA_URANIUM_TRAIT) + GLOB.xenoa_bananium_traits = compile_artifact_whitelist(XENOA_BANANIUM_TRAIT) ///Material weights, basically rarity GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 5, XENOA_URANIUM = 3, XENOA_BANANIUM = 1)) ///Trait priority list - The order is important and it represents priotity GLOBAL_LIST_INIT(xenoartifact_trait_priorities, list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MALFUNCTION, TRAIT_PRIORITY_MAJOR)) + +///List of research materials we've bought and cargo needs to ship to us +GLOBAL_LIST_INIT(needs_shipping_science_materials, list()) diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 30c21b76a3028..e85546e69095c 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -437,7 +437,6 @@ /obj/item/circuitboard/machine/nanite_chamber, /obj/item/circuitboard/machine/nanite_programmer, /obj/item/circuitboard/machine/nanite_program_hub, - /obj/item/circuitboard/machine/xenoartifact_inbox, /obj/item/circuitboard/computer/xenoarchaeology_console ) diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index 6ae67e109d20d..9677e91acddd0 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -676,14 +676,6 @@ category = list ("Research Machinery") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/xenia_listing_inbox - name = "Machine Design (Bluespace Straythread Pad)" - desc = "The circuit board for a bluespace straythread pad." - id = "xenoa_list_pad" - build_path = /obj/item/circuitboard/machine/xenoartifact_inbox - category = list ("Research Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - /datum/design/board/minor_botanical_dispenser name = "Machine Design (Minor Botanical Chemical Dispenser)" desc = "The circuit board for a minor botanical chemical dispenser." diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 56c76f5f68d3f..bca0def209fc7 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -42,7 +42,7 @@ var/instability = 0 ///What type of artifact are we? - var/datum/component/xenoartifact_material/artifact_type + var/datum/xenoartifact_material/artifact_type ///Cooldown logic for uses var/use_cooldown = XENOA_GENERIC_COOLDOWN @@ -239,7 +239,7 @@ return total_conductivity ///material datums -/datum/component/xenoartifact_material +/datum/xenoartifact_material var/name = "debugium" ///What color we associate with this material var/material_color = "#ff4800" @@ -253,5 +253,19 @@ ///How much we increase artifact instability by for every use var/instability_step = 0 -/datum/component/xenoartifact_material/proc/get_trait_list() +/datum/xenoartifact_material/proc/get_trait_list() return GLOB.xenoa_all_traits + +/datum/xenoartifact_material/bananium + name = "bananium" + material_color = "#f2ff00" + instability_step = 0.5 + +/datum/xenoartifact_material/bananium/get_trait_list() + return GLOB.xenoa_bananium_traits + +/datum/xenoartifact_material/uranium + +/datum/xenoartifact_material/plasma + +/datum/xenoartifact_material/bluespace diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm new file mode 100644 index 0000000000000..ad3be8a523bd3 --- /dev/null +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -0,0 +1,47 @@ +///Stability lost on purchase +#define STABILITY_COST 30 +///Stability gained on-tick +#define STABILITY_GAIN 5 + +/obj/machinery/computer/xenoarchaeology_console + name = "research and development listing console" + desc = "A science console used to source sellers, and buyers, for various blacklisted research objects." + icon_screen = "xenoartifact_console" + icon_keyboard = "rd_key" + circuit = /obj/item/circuitboard/computer/xenoarchaeology_console + + ///Which science server receives points + var/datum/techweb/linked_techweb + ///Which department's budget receives profit + var/datum/bank_account/budget + ///Stability - lowers as people buy artifacts, stops spam buying + var/stability = 100 + +/obj/machinery/computer/xenoarchaeology_console/Initialize() + . = ..() + linked_techweb = SSresearch.science_tech + budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) + //Start processing to gain stability + START_PROCESSING(SSobj, src) + +/obj/machinery/computer/xenoarchaeology_console/Destroy() + . = ..() + STOP_PROCESSING(SSobj, src) + +/obj/machinery/computer/xenoarchaeology_console/process() + stability = min(100, stability + STABILITY_GAIN) + //Update UI every 3 seconds, may be delayed + if(world.time % 3 == 0) + ui_update() + +/obj/machinery/computer/xenoarchaeology_console/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "XenoartifactConsole") + ui.open() + +//Circuitboard for this console +/obj/item/circuitboard/computer/xenoarchaeology_console + name = "research and development listing console (Computer Board)" + icon_state = "science" + build_path = /obj/machinery/computer/xenoarchaeology_console diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm new file mode 100644 index 0000000000000..0fa846cd64c8c --- /dev/null +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -0,0 +1,106 @@ +/* + Seller personality for the RND listing console +*/ + +#define SELLER_PERSONALITY_GENEROUS "SELLER_PERSONALITY_GENEROUS" +#define SELLER_PERSONALITY_NORMAL "SELLER_PERSONALITY_NORMAL" +#define SELLER_PERSONALITY_STINGY "SELLER_PERSONALITY_STINGY" +#define SELLER_PERSONALITY_SCARED "SELLER_PERSONALITY_SCARED" + +//Move this to its own datum file if you implement it for other sub departments of science +/datum/rnd_lister + ///What is this slimeball's name + var/name = "Petrikov" + ///What nonsense flavor dialogue do they spout + var/dialogue = "" + ///What kind of selling personality do they have + var/personality = SELLER_PERSONALITY_GENEROUS + ///How often do they restock their... stock + var/restock_time = 1 MINUTES + ///What science thingy are they selling + var/atom/stock_type + var/list/current_stock + var/max_stock = 1 + +/datum/rnd_lister/New() + . = ..() + //Generate initial stock + replenish_stock(max_stock) + +//Generic random seller +/datum/rnd_lister/random/New() + . = ..() + ///Randomized stats + name = pick(GLOB.xenoa_seller_names) + dialogue = pick(GLOB.xenoa_seller_dialogue) + personality = pick(list(SELLER_PERSONALITY_GENEROUS, SELLER_PERSONALITY_NORMAL, SELLER_PERSONALITY_STINGY)) + +/datum/rnd_lister/proc/get_new_stock() + return new stock_type() + +///Get the price of an atom, persumably our stock, based on our selling personality +/datum/rnd_lister/proc/get_price(atom/A) + switch(personality) + if(SELLER_PERSONALITY_GENEROUS) + return A.custom_price * 0.8 + if(SELLER_PERSONALITY_NORMAL) + return A.custom_price + if(SELLER_PERSONALITY_STINGY) + return A.custom_price * 1.5 + else + return 0 //FOR FREE! + +/datum/rnd_lister/proc/buy_stock(atom/A) + //Remove stock and prepare to replace it + current_stock -= A + addtimer(CALLBACK(src, PROC_REF(replenish_stock)), restock_time) + //Return a supplypack + //TODO: Move this to an init argument of the supply pack + var/datum/supply_pack/science_listing/SL = new() + SL.contains = list(A) + return SL + +/datum/rnd_lister/proc/replenish_stock(amount = 1) + for(var/i in 1 to amount) + var/atom/A = get_new_stock() + current_stock += A + +/* + Artifact sellers +*/ + +/datum/rnd_lister/artifact_seller + ///What kind of artifacts do we sell - Weighted list + var/list/artifact_types = list(XENOA_BLUESPACE = 1, XENOA_PLASMA = 1, XENOA_URANIUM = 1, XENOA_BANANIUM = 1) + +/datum/rnd_lister/artifact_seller/get_new_stock() + var/datum/xenoartifact_material = pick_weight(artifact_types) + var/obj/item/xenoartifact/artifact = new() + artifact.AddComponent(/datum/component/xenoartifact, xenoartifact_material) + return artifact + +/* + Actual types of artifact sellers +*/ + +//Will sell random artifacts equally, but at a stingy price +/datum/rnd_lister/artifact_seller/bastard + name = "Sidorovich" + dialogue = "What are you standing there for? come closer." + personality = SELLER_PERSONALITY_STINGY + +/* + Supply pack for this system + Whenever a listing is purchased, a supply pack with the purchased items is returned +*/ +/datum/supply_pack/science_listing + name = "Research Material Listing" + desc = "Contains potentially hazardous materials, or ridiculous ties." + hidden = TRUE + crate_name = "research material container" + crate_type = /obj/structure/closet/crate/science + +#undef SELLER_PERSONALITY_GENEROUS +#undef SELLER_PERSONALITY_NORMAL +#undef SELLER_PERSONALITY_STINGY +#undef SELLER_PERSONALITY_SCARED diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm deleted file mode 100644 index 3c0b7ed6177b5..0000000000000 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_console.dm +++ /dev/null @@ -1,320 +0,0 @@ -/obj/item/circuitboard/computer/xenoarchaeology_console - name = "research and development listing console (Computer Board)" - icon_state = "science" - build_path = /obj/machinery/computer/xenoarchaeology_console - -/obj/item/circuitboard/machine/xenoartifact_inbox - name = "bluespace straythread pad (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/xenoarchaeology_inbox - req_components = list( - /obj/item/stack/ore/bluespace_crystal = 1, - /obj/item/stock_parts/capacitor = 1, - /obj/item/stock_parts/manipulator = 1, - /obj/item/stack/cable_coil = 1) - def_components = list(/obj/item/stack/ore/bluespace_crystal = /obj/item/stack/ore/bluespace_crystal/artificial) - -///Stability lost on purchase -#define STABILITY_COST 30 -///Stability gained on-tick -#define STABILITY_GAIN 5 - -/obj/machinery/computer/xenoarchaeology_console - name = "research and development listing console" - desc = "A science console used to source sellers, and buyers, for various blacklisted research objects." - icon_screen = "xenoarchaeology_console" - icon_keyboard = "rd_key" - circuit = /obj/item/circuitboard/computer/xenoarchaeology_console - - ///Sellers give artifacts - var/list/sellers = list() - ///Buyers take artifacts - var/list/buyers = list() - ///All tabs - var/list/tab_index = list("Listings", "Export", "Linking") - var/current_tab = "Listings" - var/current_tab_info = "Here you can find listings for various research samples, usually fresh from the field. These samples aren't distrubuted by the Nanotrasen affiliated cargo system, so instead listing data is sourced from stray bluespace-threads." - ///used for 'shipping' - var/obj/machinery/xenoarchaeology_inbox/linked_inbox - ///List of linked machines for UI purposes - var/list/linked_machines = list() - ///Which science server receives points - var/datum/techweb/linked_techweb - ///Actually just a general list of items you've sold - var/list/sold_artifacts = list() - ///Which department's budget receives profit - var/datum/bank_account/budget - ///Stability - lowers as people buy artifacts, stops spam buying - var/stability = 100 - -/obj/machinery/computer/xenoarchaeology_console/Initialize() - . = ..() - linked_techweb = SSresearch.science_tech - budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) - sync_devices() - for(var/I in 1 to XENOA_MAX_VENDORS) //Add initial buyers and sellers - var/datum/xenoartifact_seller/S = new - sellers += S - S.generate() - - var/datum/xenoartifact_seller/buyer/B = new - buyers += B - B.generate() - //Start processing to gain stability - START_PROCESSING(SSobj, src) - -/obj/machinery/computer/xenoarchaeology_console/Destroy() - . = ..() - on_inbox_del() - qdel(sellers) - qdel(buyers) - qdel(sold_artifacts) - STOP_PROCESSING(SSobj, src) - -/obj/machinery/computer/xenoarchaeology_console/process() - stability = min(100, stability + STABILITY_GAIN) - //Update UI every 3 seconds, may be delayed - if(world.time % 3 == 0) - ui_update() - -/obj/machinery/computer/xenoarchaeology_console/ui_interact(mob/user, datum/tgui/ui) - ui = SStgui.try_update_ui(user, src, ui) - if(!ui) - ui = new(user, src, "XenoartifactConsole") - ui.open() - -/obj/machinery/computer/xenoarchaeology_console/ui_data(mob/user) - var/list/data = list() - data["points"] = budget ? budget.account_balance : 0 - data["seller"] = list() - for(var/datum/xenoartifact_seller/S as() in sellers) //Pass seller data - data["seller"] += list(list( - "name" = S.name, - "dialogue" = S.dialogue, - "price" = S.price, - "id" = REF(S), - )) - data["buyer"] = list() - for(var/datum/xenoartifact_seller/buyer/B as() in buyers) //Buyer data - data["buyer"] += list(list( - "name" = B.name, - "dialogue" = B.dialogue, - "price" = B.price, - "id" = B, - )) - data["sold_artifacts"] = list() - for(var/datum/xenoartifact_info_entry/E as() in sold_artifacts) //Pass seller data - data["sold_artifacts"] += list(list( - "main" = E.main, //Sold time - "gain" = E.gain, //Profits - "traits" = E.traits //traits - )) - data["tab_index"] = tab_index - data["current_tab"] = current_tab - data["tab_info"] = current_tab_info - data["linked_machines"] = linked_machines - data["stability"] = stability - - return data - -/obj/machinery/computer/xenoarchaeology_console/ui_act(action, params) //I should probably use a switch statement for this but, the for statements look painful - . = TRUE - if(..()) - return - - if(action == "link_nearby") - sync_devices() - return - else if(action == "sell") - sell() - return - else if(copytext(action, 1, 8) == "set_tab") //Set unique tab information - var/t = copytext(action, 9, length(action)+1) - if(current_tab != t) - current_tab = t - switch(t) - if("Listings")//Not the best way of doing this but I can't be fucked otherwise. - current_tab_info = "Here you can find listings for various research samples, usually fresh from the field. These samples aren't distrubuted by the Nanotrasen affiliated cargo system, so instead listing data is sourced from stray bluespace-threads." - if("Export") - current_tab_info = "Sell any export your department produces through open bluespace strings. Anonymously trade and sell ancient alien bombs, explosive slime cores, or just regular bombs." - if("Linking") - current_tab_info = "Link machines to the Listing Console." - return - else //Buy xenoartifact - var/datum/xenoartifact_seller/S = locate(action) - - if(stability < STABILITY_COST) - say("Error. Insufficient thread stability.") - return - if(!linked_inbox) - say("Error. No linked hardware.") - return - else if(budget.account_balance-S.price < 0) - say("Error. Insufficient funds.") - return - - if(linked_inbox && budget.account_balance-S.price >= 0) - var/obj/item/xenoartifact/A = new (get_turf(linked_inbox.loc), S.difficulty) - var/datum/component/xenoartifact_pricing/X = A.GetComponent(/datum/component/xenoartifact_pricing) - if(X) - X.price = S.price //dont bother trying to use internal singals for this - sellers -= S - stability = max(0, stability - STABILITY_COST) - budget.adjust_money(-1*S.price) - say("Purchase complete. [budget.account_balance] credits remaining in Research Budget") - addtimer(CALLBACK(src, PROC_REF(generate_new_seller)), (rand(1,3)*60) SECONDS) - A = null - update_icon() - -//Auto sells item on pad, finds seller for you -/obj/machinery/computer/xenoarchaeology_console/proc/sell() - if(!linked_inbox) - say("Error. No linked hardware.") - return - var/obj/selling_item - for(var/obj/I in oview(1, linked_inbox)) - for(var/datum/xenoartifact_seller/buyer/B as() in buyers) - if(istype(I, B.buying)) - buyers -= B - addtimer(CALLBACK(src, PROC_REF(generate_new_buyer)), (rand(1,3)*60) SECONDS) - selling_item = I - break - if(selling_item) - break - var/final_price - var/info - if(selling_item) - if(istype(selling_item, /obj/item/xenoartifact)) - var/datum/component/xenoartifact_pricing/X = selling_item.GetComponent(/datum/component/xenoartifact_pricing) - if(X) - //create new info entry datum to store UI dat - var/datum/xenoartifact_info_entry/entry = new() - - //Give rewards - final_price = max(X.modifier*X.price, 1) - budget.adjust_money(final_price) - linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, (final_price*XENOA_RP) * (final_price >= X.price)) - linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, ((XENOA_SOLD_DP*(final_price/X.price)) * max(1, final_price/1000)) * (final_price >= X.price)) - - //Handle player info - entry.main = "[selling_item.name] sold at [station_time_timestamp()] for [final_price] credits, bought for [X.price]." - entry.gain = "Awarded [(final_price*2.3) * (final_price >= X.price)] Research Points & [XENOA_SOLD_DP*(final_price/X.price) * (final_price >= X.price)] Discovery Points." - info = "[entry.main]\n[entry.gain]\n" - - //append sticker traits & pass it off - var/obj/item/sticker/xenoartifact_label/L = (locate(/obj/item/sticker/xenoartifact_label) in selling_item.contents) - //var/obj/item/xenoartifact/A = selling_item //TODO: - Racc - for(var/datum/xenoartifact_trait/T as() in L?.traits) - var/color = rgb(255, 0, 0) - //using tertiary operator breaks it - /* - TODO: - Racc - if(locate(T) in A.traits) - color =rgb(0, 255, 0) - */ - var/name = (initial(T.label_desc) || initial(T.label_name)) - info += {"\n[name]"} - entry.traits += list(list("name" = "[name]", "color" = "[color]")) - - sold_artifacts += entry - qdel(selling_item) - else //Future feature, not currently in use, wont delete captains gun. Placeholder - final_price = 120*rand(1, 10) - budget.adjust_money(final_price) - sold_artifacts += info - qdel(selling_item) - if(info) - say(info) - - -/obj/machinery/computer/xenoarchaeology_console/proc/generate_new_seller() //Called after a short period - var/datum/xenoartifact_seller/S = new - S.generate() - sellers += S - ui_update() - -/obj/machinery/computer/xenoarchaeology_console/proc/generate_new_buyer() - var/datum/xenoartifact_seller/buyer/B = new - B.generate() - buyers += B - ui_update() - -/obj/machinery/computer/xenoarchaeology_console/proc/sync_devices() - for(var/obj/machinery/xenoarchaeology_inbox/I in oview(9,src)) - if(I.linked_console || I.panel_open) - return - if(!(linked_inbox)) - linked_inbox = I - linked_machines += I.name - I.linked_console = src - I.RegisterSignal(src, COMSIG_PARENT_QDELETING, /obj/machinery/xenoarchaeology_inbox/proc/on_machine_del) - RegisterSignal(I, COMSIG_PARENT_QDELETING, PROC_REF(on_inbox_del)) - say("Successfully linked [I].") - return - say("Unable to find linkable hadrware.") - -/obj/machinery/computer/xenoarchaeology_console/proc/on_inbox_del() //Hard del measures - SIGNAL_HANDLER - UnregisterSignal(linked_inbox, COMSIG_PARENT_QDELETING) - linked_inbox = null - -#undef STABILITY_COST -#undef STABILITY_GAIN - -/obj/machinery/xenoarchaeology_inbox - name = "bluespace straythread pad" //Science words - desc = "This machine takes advantage of bluespace thread manipulation to highjack in-coming and out-going bluespace signals. Science uses it to deliver their very legal purchases." //All very sciencey - icon = 'icons/obj/telescience.dmi' - icon_state = "qpad-idle" - circuit = /obj/item/circuitboard/machine/xenoartifact_inbox - var/linked_console - -/obj/machinery/xenoarchaeology_inbox/proc/on_machine_del() - SIGNAL_HANDLER - UnregisterSignal(linked_console, COMSIG_PARENT_QDELETING) - linked_console = null - -/obj/machinery/xenoarchaeology_inbox/Destroy() - . = ..() - on_machine_del() - -/datum/xenoartifact_seller //Vendor - var/name - var/price - var/dialogue - var/difficulty //Xenoartifact shit, not exactly difficulty - -/datum/xenoartifact_seller/proc/generate() - name = pick(GLOB.xenoa_seller_names) - dialogue = pick(GLOB.xenoa_seller_dialogue) - price = rand(5,80) * 10 - switch(price) - if(50 to 300) - difficulty = XENOA_BLUESPACE - if(301 to 500) - difficulty = XENOA_PLASMA - if(501 to 700) - difficulty = XENOA_URANIUM - if(701 to 800) - difficulty = XENOA_BANANIUM - price = price * rand(1.0, 1.5) //Measure of error for no particular reason - addtimer(CALLBACK(src, PROC_REF(change_item)), (rand(1,3)*60) SECONDS) - -/datum/xenoartifact_seller/proc/change_item() - generate() - -/datum/xenoartifact_seller/buyer //Buyer off shoot, for player-selling - var/obj/buying - -/datum/xenoartifact_seller/buyer/generate() - name = pick(GLOB.xenoa_seller_names) - buying = pick(/obj/item/xenoartifact) - if(buying == /obj/item/xenoartifact) //Don't bother trying to use istype here - dialogue = "[name] is requesting: Anomaly : Class : Artifact" - addtimer(CALLBACK(src, PROC_REF(change_item)), (rand(1,3)*60) SECONDS) - -//Used to hold information about artifact transactions. Might get standrardized sooner or later. -/datum/xenoartifact_info_entry - var/main ="" - var/gain = "" - var/list/traits = list() diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 14a0029c6fb1b..9c68c1d350ded 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -147,7 +147,7 @@ /obj/item/xenoarchaeology_labeler/debug/create_label(new_name) var/obj/item/xenoartifact/A = new(get_turf(loc)) - A.AddComponent(/datum/component/xenoartifact, /datum/component/xenoartifact_material, label_traits) + A.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, label_traits) /* Sticker for labeler, so we can label artifact's with their traits @@ -175,6 +175,10 @@ sticker_icon_state = "[icon_state]_small" return ..() +/obj/item/sticker/xenoartifact_label/examine(mob/user) + . = ..() + . += examine_override + /obj/item/sticker/xenoartifact_label/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) . = ..() if(!can_stick(target) || !proximity_flag) @@ -189,4 +193,5 @@ /obj/item/sticker/xenoartifact_label/proc/parent_examine(datum/source, mob/user, list/examine_text) SIGNAL_HANDLER + examine_text += "There is an artifact label attached." examine_text += examine_override From cb059807f3e8f124cbbba9a9c0dea13a40ab971f Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 12 Jan 2024 22:40:59 +1100 Subject: [PATCH 029/339] Pricing - 12 1 24 --- code/__DEFINES/xenoartifact.dm | 9 +- .../components/xenoartifact.dm | 5 + .../tools/console/xenoarchaeology_console.dm | 10 ++ .../tools/xenoarchaeology_labeler.dm | 21 +++ .../tgui/interfaces/XenoartifactConsole.js | 134 +----------------- 5 files changed, 42 insertions(+), 137 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index 6b352d9b0b18c..e39fafb493025 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -39,13 +39,17 @@ #define XENOA_TRAIT_COOLDOWN_DANGEROUS 5 SECONDS #define XENOA_TRAIT_COOLDOWN_GAMER 8 SECONDS -//trait weights, for rarities +///trait weights, for rarities #define XENOA_TRAIT_WEIGHT_COMMON 100 #define XENOA_TRAIT_WEIGHT_UNCOMMON 80 #define XENOA_TRAIT_WEIGHT_RARE 50 #define XENOA_TRAIT_WEIGHT_EPIC 10 #define XENOA_TRAIT_WEIGHT_MYTHIC 1 +///Label reward and punishment values +#define XENOA_LABEL_REWARD 1.8 //Increases custom price by %80 +#define XENOA_LABEL_PUNISHMENT 0.5 //Decreases price by 50% + /* old content */ @@ -62,9 +66,6 @@ old content ///Reserach point reward (modifer) #define XENOA_RP 2.5 -///Max vendors / buyers in each catergory -#define XENOA_MAX_VENDORS 8 - ///Chance to avoid target if wearing bomb suit #define XENOA_DEFLECT_CHANCE 45 diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index bca0def209fc7..33893f46ad82a 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -65,10 +65,12 @@ /datum/component/xenoartifact/Initialize(type, list/traits) . = ..() generate_xenoa_statics() + var/atom/A = parent //Setup our typing artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() + A.custom_price = A.custom_price || artifact_type.custom_price //Build priotity list for(var/i in GLOB.xenoartifact_trait_priorities) @@ -253,6 +255,9 @@ ///How much we increase artifact instability by for every use var/instability_step = 0 + ///Custom price we use if the item doesn't have its own + var/custom_price = 100 + /datum/xenoartifact_material/proc/get_trait_list() return GLOB.xenoa_all_traits diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index ad3be8a523bd3..5ef4e782da316 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -14,15 +14,25 @@ var/datum/techweb/linked_techweb ///Which department's budget receives profit var/datum/bank_account/budget + ///Stability - lowers as people buy artifacts, stops spam buying var/stability = 100 + ///List of current listing sellers + var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard) + /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() + //Link relevant stuff linked_techweb = SSresearch.science_tech budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) //Start processing to gain stability START_PROCESSING(SSobj, src) + ///Build seller list + var/list/new_sellers = sellers.Copy() + sellers = list() + for(var/datum/rnd_lister/S as() in new_sellers) + sellers += new S() /obj/machinery/computer/xenoarchaeology_console/Destroy() . = ..() diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 9c68c1d350ded..922c1e701ba0f 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -152,6 +152,7 @@ /* Sticker for labeler, so we can label artifact's with their traits */ + /obj/item/sticker/xenoartifact_label icon = 'icons/obj/xenoarchaeology/xenoartifact_sticker.dmi' icon_state = "sticker_star" @@ -162,6 +163,8 @@ var/list/traits = list() ///A special examine description built from the traits we have var/examine_override = "" + ///The original custom price of the item we're going to label + var/old_custom_price /obj/item/sticker/xenoartifact_label/Initialize(mapload, list/_traits) //Setup traits & examine desc @@ -180,14 +183,32 @@ . += examine_override /obj/item/sticker/xenoartifact_label/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) + //If you somehow make traits start working with mobs, remove this isliving() check + if(!isliving(target) && (locate(/obj/item/sticker/xenoartifact_label) in target.contents)) + to_chat(user, "[target] already has a label!") + return . = ..() if(!can_stick(target) || !proximity_flag) return + //Set custom price with the artifact component + var/datum/component/xenoartifact/artifact = target.GetComponent(/datum/component/xenoartifact) + if(artifact) + old_custom_price = target.custom_price + for(var/i in artifact.artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact.artifact_traits[i]) + if(locate(T) in traits) + target.custom_price *= XENOA_LABEL_REWARD + else + target.custom_price *= XENOA_LABEL_PUNISHMENT RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(parent_examine)) /obj/item/sticker/xenoartifact_label/attack_hand(mob/user) if(sticker_state == STICKER_STATE_STUCK) UnregisterSignal(loc, COMSIG_PARENT_EXAMINE) + //Set custom price back + var/datum/component/xenoartifact/artifact = loc.GetComponent(/datum/component/xenoartifact) + if(artifact) + loc.custom_price = old_custom_price . = ..() /obj/item/sticker/xenoartifact_label/proc/parent_examine(datum/source, mob/user, list/examine_text) diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 792ecfcbcd48d..80f00331e966b 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -11,141 +11,9 @@ export const XenoartifactConsole = (props, context) => { - - Thread stability - -
- formatMoney(value)} /> - {' credits'} - - }> -
{`${tab_info}`}
-
- - {tab_index.map((tab_name) => ( - - ))} - - {current_tab === 'Listings' && - sellers.map((details) => ( - - ))} - {current_tab === 'Linking' && } - {current_tab === 'Export' && } + test
); }; - -const XenoartifactConsoleTabs = (props, context) => { - const { act, data } = useBackend(context); - const { tab_index, current_tab } = data; - const { tab_name } = props; - return ( - - act(`set_tab_${tab_name}`)}> - {`${tab_name}`} - - - ); -}; - -export const XenoartifactListingBuy = (props, context) => { - const { act, data } = useBackend(context); - const { name, dialogue, price, id } = props; - return ( - -
- {`${name}:`} -
{`${dialogue}`}
- -
-
- ); -}; - -export const XenoartifactListingSell = (props, context) => { - const { act, data } = useBackend(context); - const { name, dialogue } = props; - return ( - -
- {`${name}:`} -
{`${dialogue}`}
-
-
- ); -}; - -export const XenoartifactLinking = (props, context) => { - const { act, data } = useBackend(context); - const { linked_machines } = data; - return ( - - - {linked_machines.map((machine) => ( -
- {`${machine} connection established.`} -
- ))} -
- ); -}; - -export const XenoartifactSell = (props, context) => { - const { act, data } = useBackend(context); - const entries = Object.values(data.sold_artifacts); - const buyers = Object.values(data.buyer); - return ( - -
- - {entries.map((item) => ( -
-
- {`${item.main}`} - {`${item.gain}`} - {item.traits.map((trait) => ( - {`${trait.name}`} - ))} -
-
- ))} -
- -
- {buyers.map((details) => ( - - ))} -
- ); -}; From f46a45318bb4e7e79e729e8c7928f2ba8d194de1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 16:42:27 +1100 Subject: [PATCH 030/339] visuals - 13 1 24 --- .../components/xenoartifact.dm | 87 +++++++++++++----- .../tools/xenoarchaeology_labeler.dm | 7 +- code/modules/xenoarchaeology/traits/traits.dm | 24 ++++- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 41227 -> 39238 bytes 4 files changed, 90 insertions(+), 28 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 33893f46ad82a..abbd6c85e8cb7 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -4,31 +4,17 @@ //TODO: Replace all instances of this - Racc /obj/item/xenoartifact - icon_state = "skub" + name = "artifact" + icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + icon_state = "map_editor" + w_class = WEIGHT_CLASS_NORMAL + desc = "A strange alien device. What could it possibly do?" + throw_range = 3 /obj/item/xenoartifact/with_traits/ComponentInitialize() . = ..() AddComponent(/datum/component/xenoartifact) -/datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. - ///Buying and selling related, based on guess qaulity - var/modifier = 0.5 - ///default price gets generated if it isn't set by console. This only happens if the artifact spawns outside of that process - var/price - -/datum/component/xenoartifact_pricing/Initialize(...) - RegisterSignal(parent, XENOA_CHANGE_PRICE, PROC_REF(update_price)) - ..() - -/datum/component/xenoartifact_pricing/Destroy(force, silent) - UnregisterSignal(parent, XENOA_CHANGE_PRICE) - ..() - -///Typically used to change internally -/datum/component/xenoartifact_pricing/proc/update_price(datum/source, f_price) - price = f_price - - /datum/component/xenoartifact ///List of artifact-traits we have : list(PRIORITY = list(trait)) var/list/artifact_traits = list() @@ -62,7 +48,13 @@ ///Description for the material, based on the traits - Update this with get_material_desc() when you add traits var/material_description = "" -/datum/component/xenoartifact/Initialize(type, list/traits) + ///What the old appearance of the parent was, for resetting their appearance + var/mutable_appearance/old_appearance + +/datum/component/xenoartifact/item/Initialize(type, list/traits, do_appearance = TRUE, do_mask = FALSE) + . = ..() + +/datum/component/xenoartifact/Initialize(type, list/traits, do_appearance = TRUE, do_mask = TRUE) . = ..() generate_xenoa_statics() var/atom/A = parent @@ -71,6 +63,23 @@ artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() A.custom_price = A.custom_price || artifact_type.custom_price + //Build appearance from material + if(do_mask) + old_appearance = A.appearance + var/old_name = A.name + //Build the silhouette of the artifact + var/mutable_appearance/MA = artifact_type.get_mask() + MA.plane = A.plane + A.appearance = MA + //Reset name + A.name = old_name + if(do_appearance) + //Overlay the material texture + var/icon/MA = artifact_type.get_texture() + A.add_filter("texture_overlay", 1, layering_filter(icon = MA, blend_mode = BLEND_INSET_OVERLAY)) + //Throw on some outlines + A.add_filter("outline_1", 2, outline_filter(1, "#000")) + A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color)) //Build priotity list for(var/i in GLOB.xenoartifact_trait_priorities) @@ -80,7 +89,10 @@ if(traits) for(var/datum/xenoartifact_trait/T as() in traits) if(ispath(T)) //We can either pass paths, or initialized traits - T = new T(src) + T = new T(src) + else + T.remove_parent() + T.register_parent(src) //TODO: Setup a proc for traits to register a new parent - Racc //List building, handle custom priorities, just appened to the end if(!artifact_traits[T.priority]) @@ -89,6 +101,7 @@ artifact_traits[T.priority] += T blacklisted_traits += T.blacklist_traits blacklisted_traits += T + //Otherwise, randomly generate our own traits else var/list/focus_traits @@ -114,6 +127,21 @@ //Setup description stuff RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) +/datum/component/xenoartifact/Destroy(force, silent) + . = ..() + //Delete our traits + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + artifact_traits[i] -= T + qdel(T) + //Reset parent's visuals + var/atom/A = parent + A.remove_filter("texture_overlay") + A.remove_filter("outline_1") + A.remove_filter("outline_2") + A.appearance = old_appearance + old_appearance = null + ///Used to trigger all our traits in order /datum/component/xenoartifact/proc/trigger(force) //Timer logic @@ -258,13 +286,28 @@ ///Custom price we use if the item doesn't have its own var/custom_price = 100 + ///Artifact textures + var/texture_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + var/list/texture_icon_states = list("texture-debug1", "texture-debug2", "texture-debug3") + ///Artifact masks + var/mask_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + var/list/mask_icon_states = list("map_editor") + +//Set this proc to return a pre-made list so we can avoid some overhead /datum/xenoartifact_material/proc/get_trait_list() return GLOB.xenoa_all_traits +/datum/xenoartifact_material/proc/get_texture() + return icon(texture_icon, pick(texture_icon_states)) + +/datum/xenoartifact_material/proc/get_mask() + return mutable_appearance(mask_icon, pick(mask_icon_states)) + /datum/xenoartifact_material/bananium name = "bananium" material_color = "#f2ff00" instability_step = 0.5 + texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") /datum/xenoartifact_material/bananium/get_trait_list() return GLOB.xenoa_bananium_traits diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 922c1e701ba0f..65e87fc03a83a 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -142,9 +142,14 @@ icon_state = "labeler_debug" sticker_cooldown = 0 SECONDS +//Create an artifact with all the traits we have selected, but from the item we target /obj/item/xenoarchaeology_labeler/debug/afterattack(atom/target, mob/user) - return + if(length(label_traits)) + target.AddComponent(/datum/component/xenoartifact/item, /datum/xenoartifact_material, label_traits) + else + target.AddComponent(/datum/component/xenoartifact/item, /datum/xenoartifact_material) +//Create an artifact with all the traits we hve selected /obj/item/xenoarchaeology_labeler/debug/create_label(new_name) var/obj/item/xenoartifact/A = new(get_turf(loc)) A.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, label_traits) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index b1f90a1cf03c5..645b356bd1df1 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -38,7 +38,15 @@ /datum/xenoartifact_trait/New(atom/_parent) . = ..() - parent = _parent + register_parent(_parent) + +/datum/xenoartifact_trait/Destroy(force, ...) + . = ..() + dump_targets() + +//The reason this is a seperate proc is so we can init the trait and swap its artifact component parent around +/datum/xenoartifact_trait/proc/register_parent(datum/source) + parent = source RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_parent)) //Setup trigger signals RegisterSignal(parent, XENOA_TRIGGER, PROC_REF(trigger)) @@ -47,13 +55,16 @@ //Stats parent.target_range += extra_target_range -/datum/xenoartifact_trait/Destroy(force, ...) - . = ..() - dump_targets() - +//Remeber to call this before setting a new parent /datum/xenoartifact_trait/proc/remove_parent(datum/source) SIGNAL_HANDLER + //Detach from current parent + if(parent) + UnregisterSignal(parent, COMSIG_PARENT_QDELETING) + UnregisterSignal(parent, XENOA_TRIGGER) + parent.target_range -= extra_target_range + cut_trait_appearance(parent.parent) parent = null dump_targets() @@ -126,6 +137,9 @@ /datum/xenoartifact_trait/proc/generate_trait_appearance(atom/target) return +/datum/xenoartifact_trait/proc/cut_trait_appearance(atom/target) + return + ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path, keyed = FALSE) if(!ispath(path)) diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index fb4a2a24dfc248faf6ba7e6093db371880df4d36..95a6bc2023dd13489e73987a004b30509fb7a060 100644 GIT binary patch literal 39238 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

XBvFH(u>?b< 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 Date: Sat, 13 Jan 2024 16:42:54 +1100 Subject: [PATCH 031/339] Update xenoartifact.dm --- code/modules/xenoarchaeology/components/xenoartifact.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index abbd6c85e8cb7..fa5819045fe28 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -139,6 +139,7 @@ A.remove_filter("texture_overlay") A.remove_filter("outline_1") A.remove_filter("outline_2") + //TOODO: make sure this doesn't cause issues - Racc A.appearance = old_appearance old_appearance = null From 65645bdd7647e3bf0253b3fe10dc96e77bdbd8ba Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 20:23:05 +1100 Subject: [PATCH 032/339] Remove old stuff - 13 1 24 --- beestation.dme | 1 + code/_globalvars/lists/maintenance_loot.dm | 2 +- .../mapgen/Cavegens/LavalandGenerator.dm | 2 +- .../objective_types/alien_artifact.dm | 3 +- .../components/xenoartifact.dm | 79 ++- .../old/xenoartifact_activators.dm | 172 ------ .../old/xenoartifact_majors.dm | 558 ------------------ .../old/xenoartifact_malfunctions.dm | 275 --------- .../old/xenoartifact_minors.dm | 478 --------------- .../old/xenoartifact_traits.dm | 125 ---- .../tools/console/xenoarchaeology_seller.dm | 2 +- code/modules/xenoarchaeology/traits/misc.dm | 20 + 12 files changed, 80 insertions(+), 1637 deletions(-) delete mode 100644 code/modules/xenoarchaeology/old/xenoartifact_activators.dm delete mode 100644 code/modules/xenoarchaeology/old/xenoartifact_majors.dm delete mode 100644 code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm delete mode 100644 code/modules/xenoarchaeology/old/xenoartifact_minors.dm delete mode 100644 code/modules/xenoarchaeology/old/xenoartifact_traits.dm create mode 100644 code/modules/xenoarchaeology/traits/misc.dm diff --git a/beestation.dme b/beestation.dme index df3757cfc4528..09bc62c48fb90 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4149,6 +4149,7 @@ #include "code\modules\xenoarchaeology\traits\majors.dm" #include "code\modules\xenoarchaeology\traits\malfunctions.dm" #include "code\modules\xenoarchaeology\traits\minors.dm" +#include "code\modules\xenoarchaeology\traits\misc.dm" #include "code\modules\xenoarchaeology\traits\traits.dm" #include "code\modules\zombie\items.dm" #include "code\modules\zombie\organs.dm" diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index 72b0682820839..8744a07c143dc 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -115,6 +115,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/wirecutters = 1, /obj/item/wrench = 4, /obj/item/reagent_containers/food/drinks/bottle/homemaderum = 1, - //obj/item/xenoartifact/maint = 1, //TODO: - Racc + /obj/item/xenoartifact/maint = 1, /obj/item/paper_reader = 1, )) diff --git a/code/datums/mapgen/Cavegens/LavalandGenerator.dm b/code/datums/mapgen/Cavegens/LavalandGenerator.dm index 2bc228bff58b8..a90288b758f68 100644 --- a/code/datums/mapgen/Cavegens/LavalandGenerator.dm +++ b/code/datums/mapgen/Cavegens/LavalandGenerator.dm @@ -4,7 +4,7 @@ blacklisted_turf_types = list(/turf/open/lava) // Don't override lava rivers - weighted_feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/item/xenoartifact = 1) + weighted_feature_spawn_list = list(/obj/structure/geyser/random = 1, /obj/item/xenoartifact = 2) weighted_mob_spawn_list = list(/mob/living/simple_animal/hostile/asteroid/goliath/beast/random = 50, /obj/structure/spawner/lavaland/goliath = 3, \ /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random = 40, /obj/structure/spawner/lavaland = 2, \ /mob/living/simple_animal/hostile/asteroid/hivelord/legion/random = 30, /obj/structure/spawner/lavaland/legion = 3, \ diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm index d31a3a92dd7c2..11a1e84507f29 100644 --- a/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/objective_types/alien_artifact.dm @@ -2,8 +2,7 @@ name = "Artifact Recovery" var/generated = FALSE //The blackbox required to recover. - //var/obj/item/xenoartifact/objective/linked_artifact //TODO: - Racc - var/obj/item/linked_artifact + var/obj/item/xenoartifact/objective/linked_artifact min_payout = 5000 max_payout = 25000 diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index fa5819045fe28..c6a1abee6da1c 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -2,7 +2,6 @@ Items with this component will act like alien artifatcs */ -//TODO: Replace all instances of this - Racc /obj/item/xenoartifact name = "artifact" icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' @@ -10,10 +9,28 @@ w_class = WEIGHT_CLASS_NORMAL desc = "A strange alien device. What could it possibly do?" throw_range = 3 + ///What type of artifact + var/datum/xenoartifact_material/artifact_type + +/obj/item/xenoartifact/Initialize(mapload, _artifact_type) + . = ..() + artifact_type = _artifact_type || artifact_type + +/obj/item/xenoartifact/ComponentInitialize() + . = ..() + AddComponent(/datum/component/xenoartifact, artifact_type) + +//Maint variant for loot, has a 80% chance of being safe, 20% of not +/obj/item/xenoartifact/maint/ComponentInitialize() + artifact_type = prob(80) ? /datum/xenoartifact_material/bluespace : null + return ..() -/obj/item/xenoartifact/with_traits/ComponentInitialize() +//Objective variant, simply has the objective trait +/obj/item/xenoartifact/objective/ComponentInitialize() . = ..() - AddComponent(/datum/component/xenoartifact) + AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) + var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) + X?.add_individual_trait(/datum/xenoartifact_trait/misc/objective) /datum/component/xenoartifact ///List of artifact-traits we have : list(PRIORITY = list(trait)) @@ -88,19 +105,7 @@ //If we're force-generating traits if(traits) for(var/datum/xenoartifact_trait/T as() in traits) - if(ispath(T)) //We can either pass paths, or initialized traits - T = new T(src) - else - T.remove_parent() - T.register_parent(src) - //TODO: Setup a proc for traits to register a new parent - Racc - //List building, handle custom priorities, just appened to the end - if(!artifact_traits[T.priority]) - artifact_traits[T.priority] = list() - //handle adding trait - artifact_traits[T.priority] += T - blacklisted_traits += T.blacklist_traits - blacklisted_traits += T + add_individual_trait(T) //Otherwise, randomly generate our own traits else @@ -170,14 +175,7 @@ for(var/i in 1 to amount) //Pick a random trait var/datum/xenoartifact_trait/T = pick_weight(options) - T = new T(src) - //List building - if(!artifact_traits[T.priority]) - artifact_traits[T.priority] = list() - //handle trait adding - artifact_traits[T.priority] += T - blacklisted_traits += T.blacklist_traits - blacklisted_traits += T + add_individual_trait(T) //Cooldown finish logic goes here /datum/component/xenoartifact/proc/reset_timer() @@ -269,6 +267,27 @@ total_conductivity += T.conductivity return total_conductivity +/datum/component/xenoartifact/proc/add_individual_trait(datum/xenoartifact_trait/trait, force = TRUE) + //Is this trait in the blacklist? + if((locate(trait) in blacklisted_traits) && !force) + return FALSE + //We can either pass paths, or initialized traits + if(ispath(trait)) + trait = new trait(src) + else + trait.remove_parent() + trait.register_parent(src) + //TODO: Setup a proc for traits to register a new parent - Racc + //List building, handle custom priorities, just appened to the end + if(!artifact_traits[trait.priority]) + artifact_traits[trait.priority] = list() + //handle adding trait + artifact_traits[trait.priority] += trait + blacklisted_traits += trait.blacklist_traits + blacklisted_traits += trait + + return TRUE + ///material datums /datum/xenoartifact_material var/name = "debugium" @@ -314,7 +333,19 @@ return GLOB.xenoa_bananium_traits /datum/xenoartifact_material/uranium + name = "uranium" + material_color = "#88ff00ff" + instability_step = 25 + texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") /datum/xenoartifact_material/plasma + name = "plasma" + material_color = "#f200ffff" + instability_step = 5 + texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") /datum/xenoartifact_material/bluespace + name = "bluespace" + material_color = "#006affff" + instability_step = 1 + texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") diff --git a/code/modules/xenoarchaeology/old/xenoartifact_activators.dm b/code/modules/xenoarchaeology/old/xenoartifact_activators.dm deleted file mode 100644 index da436be357dc7..0000000000000 --- a/code/modules/xenoarchaeology/old/xenoartifact_activators.dm +++ /dev/null @@ -1,172 +0,0 @@ -///Activation traits - only used to generate charge -///============ -/// Default acvitavor, on-use / interact -///============ -/datum/xenoartifact_trait/activator/impact - desc = "Sturdy" - label_desc = "Sturdy: The material is sturdy. The amount of force applied seems to directly correlate to the size of the reaction." - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - weight = 30 - -/datum/xenoartifact_trait/activator/impact/pass_input(datum/source, obj/item/thing, mob/user, atom/target) - var/obj/item/xenoartifact/X = source - charge = charge*((thing?.force || 10)*0.1) - X.default_activate(charge, user, target) - -///============ -/// Burn activator, responds to heat -///============ -/datum/xenoartifact_trait/activator/burn - desc = "Flammable" - label_desc = "Flammable: The material is flammable, and seems to react when ignited." - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/burn/on_init(obj/item/xenoartifact/X) - ..() - X.max_range += 1 - -/datum/xenoartifact_trait/activator/burn/pass_input(datum/source, obj/item/thing, mob/user, atom/target, params) //xenoa item handles this, see process proc there - var/obj/item/xenoartifact/X = source - if(X.process_type != PROCESS_TYPE_LIT && thing.ignition_effect(X, user)) - X.visible_message("The [X.name] sparks on.") - X.process_type = PROCESS_TYPE_LIT - sleep(1.8 SECONDS) //Give them a chance to escape - START_PROCESSING(SSobj, X) - log_game("[key_name_admin(user)] lit [X] at [world.time] using [thing]. [X] located at [AREACOORD(X)].") - -///============ -/// Timed activator, activates on a timer. Timer is turned on when used, has a chance to turn off. -///============ -/datum/xenoartifact_trait/activator/clock - label_name = "Timed" - label_desc = "Timed: The material produces a resonance pattern similar to quartz, causing it to produce a reaction every so often." - charge = 25 - blacklist_traits = list(/datum/xenoartifact_trait/minor/capacitive) - signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/clock/on_init(obj/item/xenoartifact/X) - ..() - X.max_range += 1 - X.malfunction_mod = 0.5 - -/datum/xenoartifact_trait/activator/clock/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/clothing/neck/stethoscope)) - to_chat(user, "The [X.name] ticks deep from within.\n") - return TRUE - return ..() - -/datum/xenoartifact_trait/activator/clock/pass_input(datum/source, obj/item/thing, mob/user, atom/target, params) - var/obj/item/xenoartifact/X = source - X.process_type = PROCESS_TYPE_TICK - START_PROCESSING(SSobj, X) - log_game("[key_name_admin(user)] set clock on [X] at [world.time] using [thing]. [X] located at [AREACOORD(X)].") - -///============ -/// Signal activator, responds to respective signals sent through signallers -///============ -/datum/xenoartifact_trait/activator/signal - label_name = "Signal" - label_desc = "Signal: The material receives radio frequencies and reacts when a matching code is delivered." - charge = 25 - signals = list(XENOA_SIGNAL) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/signal/on_init(obj/item/xenoartifact/X) - ..() - X.code = rand(1, 100) //Random code is shared by all signaller traits - X.frequency = FREQ_SIGNALER - X.set_frequency(X.frequency) - X.max_range += 1 - -/datum/xenoartifact_trait/activator/signal/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/analyzer)) - to_chat(user, "The [item.name] displays a signal-input code of [X.code], and frequency [X.frequency].") - return TRUE - return ..() - -/datum/xenoartifact_trait/activator/signal/pass_input(datum/source, obj/item/thing, mob/user, atom/target, params) - var/obj/item/xenoartifact/X = source - X.default_activate(charge, user, target) - log_game("[key_name_admin(user)] signalled [X] at [world.time]. [X] located at [AREACOORD(X)].") - -///============ -/// Battery activator, needs a cell to activate -///============ -/datum/xenoartifact_trait/activator/batteryneed - desc = "Charged" - label_desc = "Charged: The material has a natural power draw. Supplying any current to this will cause a reaction." - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/batteryneed/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/multitool)) - to_chat(user, "The [item.name] displays a draw of [X.charge_req].") - return TRUE - return ..() - -/datum/xenoartifact_trait/activator/batteryneed/pass_input(datum/source, obj/item/stock_parts/cell/thing, mob/user, atom/target, params) - var/obj/item/xenoartifact/X = source - if(!istype(thing)) - return - if(thing.use(X.charge_req*10)) - X.default_activate(charge, user, user) - -///============ -/// Weighted activator, picking up activates -///============ -/datum/xenoartifact_trait/activator/weighted - desc = "Weighted" - label_desc = "Weighted: The material is weighted and produces a reaction when picked up." - charge = 25 - signals = list(COMSIG_ITEM_PICKUP) - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/major/distablizer) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/weighted/pass_input(datum/source, obj/item/thing, mob/living/carbon/user, mob/living/carbon/human/target) - var/obj/item/clothing/gloves/artifact_pinchers/P - //Grab ref to gloves for check - if(istype(user)) - P = user.get_item_by_slot(ITEM_SLOT_GLOVES) - if(istype(P) && P?.safety) //This trait is a special tism - return - var/obj/item/xenoartifact/X = source - X.default_activate(charge, user, user) - -///============ -/// Pitch activator, artifact activates when thrown. Credit to EvilDragon#4532 -///============ -/datum/xenoartifact_trait/activator/pitch - label_name = "Pitched" - label_desc = "Pitched: The material is aerodynamic and activates when thrown." - charge = 25 - blacklist_traits = (/datum/xenoartifact_trait/minor/dense) - signals = list(COMSIG_MOVABLE_IMPACT) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator/pitch/pass_input(datum/source, obj/item/thing, mob/user, atom/target) - var/obj/item/xenoartifact/X = source - X.default_activate(charge, user, target) - -///============ -/// Honk, activated when honked or used by a clown -///============ -/datum/xenoartifact_trait/activator/honk - desc = "Honked" - label_desc = "Honked: The material is squishy & humorous. Perhaps the clown would know how to use it?" - charge = 25 - signals = list(COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_IMPACT, COMSIG_ITEM_ATTACK_SELF, COMSIG_ITEM_AFTERATTACK) - weight = 25 - -/datum/xenoartifact_trait/activator/honk/pass_input(datum/source, obj/item/thing, mob/user, atom/target) - var/obj/item/xenoartifact/X = source - //Make sure we're being silly before we activate it - isclown( ) refers to the simplemob - if(!(istype(thing, /obj/item/bikehorn) || istype(thing, /obj/item/bikehorn/golden) || isclown(target) || HAS_TRAIT(user, TRAIT_NAIVE) || HAS_TRAIT(target, TRAIT_NAIVE))) - return - charge = charge*((thing?.force || 10)*0.1) - X.default_activate(charge, user, target) diff --git a/code/modules/xenoarchaeology/old/xenoartifact_majors.dm b/code/modules/xenoarchaeology/old/xenoartifact_majors.dm deleted file mode 100644 index 6d356a902b15c..0000000000000 --- a/code/modules/xenoarchaeology/old/xenoartifact_majors.dm +++ /dev/null @@ -1,558 +0,0 @@ -//Major traits - The artifact's main gimmick, how it interacts with the world -///============ -/// Capture, moves target inside the artifact -///============ -/datum/xenoartifact_trait/major/capture - desc = "Hollow" - label_desc = "Hollow: The shape is hollow, however the inside is deceptively large." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - var/spawn_russian = FALSE - -/datum/xenoartifact_trait/major/capture/on_init(obj/item/xenoartifact/X) - if(prob(1)) - spawn_russian = TRUE - -/datum/xenoartifact_trait/major/capture/activate(obj/item/xenoartifact/X, atom/target) - if(isliving(X.loc)) - var/mob/living/holder = X.loc - holder.dropItemToGround(X, force = TRUE) - if(ismovable(target) && (istype(target, /obj/item) || istype(target, /mob/living))) - var/atom/movable/AM = target - if(AM?.anchored || !AM) - return - addtimer(CALLBACK(src, PROC_REF(release), X, AM), X.charge*0.5 SECONDS) - AM.forceMove(X) - X.buckle_mob(AM) - if(isliving(target)) //stop awful hobbit-sis from wriggling - var/mob/living/victim = target - victim.Paralyze(X.charge*0.5 SECONDS, ignore_canstun = TRUE) - X.cooldownmod = X.charge*0.6 SECONDS - -/datum/xenoartifact_trait/major/capture/proc/release(obj/item/xenoartifact/X, var/atom/movable/AM) //Empty contents - if(QDELETED(src) || QDELETED(X) || QDELETED(AM)) - return - var/turf/T = get_turf(X.loc) - AM.anchored = FALSE - AM.forceMove(T) - if(spawn_russian) - new /mob/living/simple_animal/hostile/russian(T) - log_game("[X] spawned (/mob/living/simple_animal/hostile/russian) at [world.time]. [X] located at [AREACOORD(X)]") - spawn_russian = FALSE - -///============ -/// Shock, the artifact electrocutes the target -///============ -/datum/xenoartifact_trait/major/shock - desc = "Conductive" - label_desc = "Conductive: The shape resembles two lighting forks. Subtle arcs seem to leaps across them." - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/major/shock/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "You feel a slight static after touching the [X.name].") - return TRUE - -/datum/xenoartifact_trait/major/shock/activate(obj/item/xenoartifact/X, atom/target, mob/user) - do_sparks(pick(1, 2), FALSE, X) - if(istype(target, /obj/item/stock_parts/cell)) - var/obj/item/stock_parts/cell/C = target //Have to type convert to work with other traits - C.give((X.charge/100)*C.maxcharge) - - else if(istype(target, /mob/living)) - var/damage = X.charge*0.25 - var/mob/living/carbon/victim = target - victim.electrocute_act(damage, X, 1, 1) - playsound(get_turf(X), 'sound/machines/defib_zap.ogg', 50, TRUE) - X.cooldownmod = (X.charge*0.1) SECONDS - -///============ -/// Timestop, spawns time-stop effect -///============ -/datum/xenoartifact_trait/major/timestop - desc = "Temporal" - label_desc = "Temporal: The shape is drooling and sluggish. Additionally, light around it seems to invert." - -/datum/xenoartifact_trait/major/timestop/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "Your hand feels slow while stroking the [X.name].") - return TRUE - -/datum/xenoartifact_trait/major/timestop/activate(obj/item/xenoartifact/X, atom/target) - var/turf/T = (get_turf(X?.loc) || get_turf(target?.loc)) - if(!T) - return - new /obj/effect/timestop(T, 2, (X.charge*0.2) SECONDS) - X.cooldownmod = (X.charge*0.35) SECONDS - -///============ -/// Laser, shoots varying laser based on charge -///============ -/datum/xenoartifact_trait/major/laser - desc = "Barreled" - label_desc = "Barreled: The shape resembles the barrel of a gun. It's possible that it might dispense candy." - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/major/laser/activate(obj/item/xenoartifact/X, atom/target, mob/living/user) - //light target on fire if we're close - if(isliving(target) && get_dist(target, X.loc || user) <= 1) - var/mob/living/victim = target - victim.adjust_fire_stacks(5*(X.charge/X.charge_req)) - victim.IgniteMob() - return - //otherwise shoot laser - var/obj/projectile/A - switch(X.charge) - if(0 to 24) - A = new /obj/projectile/beam/disabler - if(25 to 79) - A = new /obj/projectile/beam/laser - if(80 to 200) - A = new /obj/projectile/beam/laser/heavylaser - //If target is our own turf, aka someone probably threw us, target a random direction to avoid always shooting east - if(istype(target, /turf) && X.loc == target) - target = get_edge_target_turf(pick(NORTH, EAST, SOUTH, WEST)) - //FIRE! - A.preparePixelProjectile(get_turf(target), X) - A.fire() - playsound(get_turf(src), 'sound/mecha/mech_shield_deflect.ogg', 50, TRUE) - -///============ -/// Corginator, turns the target into a corgi for a short time -///============ -/datum/xenoartifact_trait/major/corginator ///All of this is stolen from corgium. - desc = "Fuzzy" //Weirdchamp - label_desc = "Fuzzy: The shape is hard to discern under all the hair sprouting out from the surface. You swear you've heard it bark before." - flags = XENOA_BLUESPACE_TRAIT - ///List of all affected targets, used for early qdel - var/list/victims = list() - ///Ref to timer - if corgi is deleted early remove this reference to the puppy - var/timer - -/datum/xenoartifact_trait/major/corginator/activate(obj/item/xenoartifact/X, mob/living/target) - X.say(pick("Woof!", "Bark!", "Yap!")) - if(istype(target, /mob/living) && !(istype(target, /mob/living/simple_animal/pet/dog/corgi)) && !IS_DEAD_OR_INCAP(target)) - var/mob/living/simple_animal/pet/dog/corgi/new_corgi = transform(target) - timer = addtimer(CALLBACK(src, PROC_REF(transform_back), new_corgi), (X.charge*0.6) SECONDS, TIMER_STOPPABLE) - victims |= new_corgi - X.cooldownmod = (X.charge*0.8) SECONDS - -/datum/xenoartifact_trait/major/corginator/proc/transform(mob/living/target) - if(!istype(target)) - return - var/obj/shapeshift_holder/H = locate() in target - if(H) - playsound(get_turf(target), 'sound/machines/buzz-sigh.ogg', 50, TRUE) - return - ADD_TRAIT(target, TRAIT_NOBREATH, TRAIT_NOMOBSWAP) - var/mob/living/simple_animal/pet/dog/corgi/new_corgi = new(target.loc) - H = new(new_corgi,src,target) - //hat check - var/mob/living/carbon/C = target - if(istype(C)) - var/obj/item/hat = C.get_item_by_slot(ITEM_SLOT_HEAD) - if(hat?.dog_fashion) - new_corgi.place_on_head(hat,null,FALSE) - RegisterSignal(new_corgi, COMSIG_MOB_DEATH, PROC_REF(transform_back)) - return new_corgi - -/datum/xenoartifact_trait/major/corginator/proc/transform_back(mob/living/simple_animal/pet/dog/corgi/new_corgi) - //Kill timer - deltimer(timer) - timer = null - - var/obj/shapeshift_holder/H = locate() in new_corgi - if(!H) - return - var/mob/living/target = H.stored - UnregisterSignal(new_corgi, COMSIG_MOB_DEATH) - REMOVE_TRAIT(target, TRAIT_NOBREATH, TRAIT_NOMOBSWAP) - victims -= new_corgi - var/turf/T = get_turf(new_corgi) - if(new_corgi.inventory_head && !target.equip_to_slot_if_possible(new_corgi.inventory_head, ITEM_SLOT_HEAD,disable_warning = TRUE, bypass_equip_delay_self=TRUE)) - new_corgi.inventory_head.forceMove(T) - new_corgi.inventory_back?.forceMove(T) - new_corgi.inventory_head = null - new_corgi.inventory_back = null - H.restore(FALSE, FALSE) - target.Knockdown(0.2 SECONDS) - -/datum/xenoartifact_trait/major/corginator/Destroy() //Transform goobers back if artifact is deleted. - . = ..() - if(victims.len) - for(var/mob/living/simple_animal/pet/dog/corgi/H as() in victims) - transform_back(H) - -///============ -/// EMP, produces an empulse -///============ -/datum/xenoartifact_trait/major/emp - label_name = "EMP" - label_desc = "EMP: The shape of the Artifact doesn't resemble anything particularly interesting. Technology around the Artifact seems to malfunction." - flags = XENOA_URANIUM_TRAIT - weight = 25 //annoying trait - -/datum/xenoartifact_trait/major/emp/activate(obj/item/xenoartifact/X) - playsound(get_turf(X), 'sound/magic/disable_tech.ogg', 50, TRUE) - empulse(get_turf(X.loc), max(1, X.charge*0.03), max(1, X.charge*0.07, 1)) //This might be too big - -///============ -/// Invisible, makes the target invisible for a short time -///============ -/datum/xenoartifact_trait/major/invisible //One step closer to the one ring - label_name = "Transparent" - label_desc = "Transparent: The shape of the Artifact is difficult to percieve. You feel the need to call it, precious..." - weight = 25 - var/list/victims = list() - -/datum/xenoartifact_trait/major/invisible/on_item(obj/item/xenoartifact/X, atom/user, obj/item/I) - if(istype(I) && I.light_power > 0) - to_chat(user, "The [I.name]'s light passes through the structure.") - return TRUE - ..() - -/datum/xenoartifact_trait/major/invisible/activate(obj/item/xenoartifact/X, mob/living/target) - if(isliving(target)) - victims += WEAKREF(target) - hide(target) - addtimer(CALLBACK(src, PROC_REF(reveal), target), ((X.charge*0.4) SECONDS)) - X.cooldownmod = ((X.charge*0.4)+1) SECONDS - -/datum/xenoartifact_trait/major/invisible/proc/hide(mob/living/target) - ADD_TRAIT(target, TRAIT_PACIFISM, type) - animate(target, alpha = 0, time = 5) - -/datum/xenoartifact_trait/major/invisible/proc/reveal(mob/living/target) - if(target) - REMOVE_TRAIT(target, TRAIT_PACIFISM, type) - animate(target, alpha = 255, time = 5) - -/datum/xenoartifact_trait/major/invisible/Destroy() - . = ..() - for(var/M in victims) - var/datum/weakref/r = M - var/mob/living/L = r.resolve() - reveal(L) - -///============ -/// Teleports the target to a random nearby location -///============ -/datum/xenoartifact_trait/major/teleporting - desc = "Displaced" - label_desc = "Displaced: The shape's state is unstable, causing it to shift through planes at a localized axis. Just ask someone from science..." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/major/teleporting/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(istype(target, /atom/movable)) - var/atom/movable/victim = target //typecast to access anchored - if(!victim.anchored) - do_teleport(victim, get_turf(victim), (X.charge*0.3)+1, channel = TELEPORT_CHANNEL_BLUESPACE) - -///============ -/// Lamp, creates a light with random color for a short time -///============ -/datum/xenoartifact_trait/major/lamp - label_name = "Lamp" - label_desc = "Lamp: The Artifact emits light. Nothing in its shape suggests this." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - var/light_mod - -/datum/xenoartifact_trait/major/lamp/on_init(obj/item/xenoartifact/X) - X.light_color = pick(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) - -/datum/xenoartifact_trait/major/lamp/activate(obj/item/xenoartifact/X, atom/target, atom/user) - X.visible_message("The [X] lights up!") - X.set_light(X.charge*0.08, max(X.charge*0.05, 5), X.light_color) - addtimer(CALLBACK(src, PROC_REF(unlight), X), (X.charge*0.6) SECONDS) - X.cooldownmod = (X.charge*0.6) SECONDS - -/datum/xenoartifact_trait/major/lamp/proc/unlight(var/obj/item/xenoartifact/X) - X.set_light(0, 0) - -///============ -/// Forcefield, creates a random shape wizard wall -///============ -/datum/xenoartifact_trait/major/forcefield - label_name = "Wall" - label_desc = "Wall: The Artifact produces a resonance that forms impenetrable walls. Here's one you'll never crawl!" - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - var/size - -/datum/xenoartifact_trait/major/forcefield/on_init(obj/item/xenoartifact/X) - size = pick(1, 3, 5) - -/datum/xenoartifact_trait/major/forcefield/activate(obj/item/xenoartifact/X) - if(size >= 1) - new /obj/effect/forcefield/xenoartifact_type(get_turf(X.loc), (X.charge*0.4) SECONDS) - if(size >= 3) - var/outcome = pick(0, 1) - if(outcome || size >= 5) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, NORTH), (X.charge*0.4) SECONDS) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, SOUTH), (X.charge*0.4) SECONDS) - else - new /obj/effect/forcefield/xenoartifact_type(get_step(X, EAST), (X.charge*0.4) SECONDS) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, WEST), (X.charge*0.4) SECONDS) - if(size >= 5) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, WEST), (X.charge*0.4) SECONDS) - new /obj/effect/forcefield/xenoartifact_type(get_step(X, EAST), (X.charge*0.4) SECONDS) - - X.cooldownmod = (X.charge*0.4) SECONDS - -/obj/effect/forcefield/xenoartifact_type //Special wall type for artifact - desc = "An impenetrable artifact wall." - -///============ -/// Heal, heals a random damage type -///============ -/datum/xenoartifact_trait/major/heal - label_name = "Healing" - label_desc = "Healing: The Artifact repeairs any damaged organic tissue the targat may contain. Widely considered the Holy Grail of Artifact traits." - flags = XENOA_BLUESPACE_TRAIT - weight = 25 - var/healing_type - -/datum/xenoartifact_trait/major/heal/on_init(obj/item/xenoartifact/X) - healing_type = pick(BRUTE, BURN, TOX) - -/datum/xenoartifact_trait/major/heal/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/healthanalyzer)) - to_chat(user, "The [item] recognizes foreign [healing_type] healing proteins.\n") - return TRUE - ..() - -/datum/xenoartifact_trait/major/heal/activate(obj/item/xenoartifact/X, atom/target) - playsound(get_turf(target), 'sound/magic/staff_healing.ogg', 50, TRUE) - if(istype(target, /mob/living)) - var/mob/living/victim = target - switch(healing_type) - if(BRUTE) - victim.adjustBruteLoss((X.charge*0.25)*-1) - if(BURN) - victim.adjustFireLoss((X.charge*0.25)*-1) - if(TOX) - victim.adjustToxLoss((X.charge*0.25)*-1) - -///============ -/// Chem, injects a random safe chem into target -///============ -/datum/xenoartifact_trait/major/chem - desc = "Hypodermic" - label_desc = "Hypodermic: The Artifact's shape is comprised of many twisting tubes and vials, it seems a liquid may be inside." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - blacklist_traits = list(/datum/xenoartifact_trait/minor/long) - var/datum/reagent/formula - var/amount - -/datum/xenoartifact_trait/major/chem/on_init(obj/item/xenoartifact/X) - amount = pick(7, 14, 21) - formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) - -/datum/xenoartifact_trait/major/chem/activate(obj/item/xenoartifact/X, atom/target) - if(target?.reagents) - playsound(get_turf(X), pick('sound/items/hypospray.ogg','sound/items/hypospray2.ogg'), 50, TRUE) - var/datum/reagents/R = target.reagents - R.add_reagent(formula, amount*(initial(formula.metabolization_rate))) - log_game("[X] injected [key_name_admin(target)] with [amount]u of [formula] at [world.time]. [X] located at [AREACOORD(X)]") - -///============ -/// Push, pushes target away from artifact -///============ -/datum/xenoartifact_trait/major/push - label_name = "Push" - label_desc = "Push: The Artifact pushes anything not bolted down. The shape doesn't suggest this." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/major/push/activate(obj/item/xenoartifact/X, atom/target) - if(ismovable(target)) - var/atom/movable/victim = target - if(victim.anchored) - return - var/atom/trg = get_edge_target_turf(X.loc, get_dir(X.loc, target.loc) || pick(NORTH, EAST, SOUTH, WEST)) - victim.throw_at(get_turf(trg), (X.charge*0.07)+1, 8) - -///============ -/// Pull, pulls target towards artifact -///============ -/datum/xenoartifact_trait/major/pull - label_name = "Pull" - label_desc = "Pull: The Artifact pulls anything not bolted down. The shape doesn't suggest this." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/major/pull/on_init(obj/item/xenoartifact/X) - X.max_range += 1 - -/datum/xenoartifact_trait/major/pull/activate(obj/item/xenoartifact/X, atom/target) - if(ismovable(target)) - var/atom/movable/victim = target - if(victim.anchored) - return - if(get_dist(X, target) <= 1 && isliving(target)) - var/mob/living/living_victim = target - living_victim.Knockdown(SHOVE_KNOCKDOWN_SOLID) - victim.throw_at(get_turf(X), X.charge*0.08, 8) - -///============ -/// Horn, produces a random noise -///============ -/datum/xenoartifact_trait/major/horn - desc = "Horned" - label_name = "Horn" - label_desc = "Horn: The Artifact's shape resembles a horn. These Artifacts are widely deployed by the most clever clowns." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - var/sound - -/datum/xenoartifact_trait/major/horn/on_init(obj/item/xenoartifact/X) - sound = pick(list('sound/effects/adminhelp.ogg', 'sound/effects/applause.ogg', 'sound/effects/bubbles.ogg', - 'sound/effects/empulse.ogg', 'sound/effects/explosion1.ogg', 'sound/effects/explosion_distant.ogg', - 'sound/effects/laughtrack.ogg', 'sound/effects/magic.ogg', 'sound/effects/meteorimpact.ogg', - 'sound/effects/phasein.ogg', 'sound/effects/supermatter.ogg', 'sound/weapons/armbomb.ogg', - 'sound/weapons/blade1.ogg')) - -/datum/xenoartifact_trait/major/horn/activate(obj/item/xenoartifact/X, atom/target, atom/user) - playsound(get_turf(target), sound, 50, FALSE) - -///============ -/// Gas, replaces a random gas with another random gas -///============ -/datum/xenoartifact_trait/major/gas - desc = "Porous" - label_desc = "Porous: The Artifact absorbs a specific nearby gas and replaces it with an undeterminable one." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - var/static/list/valid_inputs = list( - /datum/gas/oxygen = 6, - /datum/gas/nitrogen = 3, - /datum/gas/plasma = 1, - /datum/gas/carbon_dioxide = 1, - /datum/gas/water_vapor = 3 - ) - var/static/list/valid_outputs = list( - /datum/gas/bz = 3, - /datum/gas/hypernoblium = 1, - /datum/gas/plasma = 3, - /datum/gas/tritium = 2, - /datum/gas/nitryl = 1 - ) - var/datum/gas/input - var/datum/gas/output - -/datum/xenoartifact_trait/major/gas/on_init(obj/item/xenoartifact/X) - input = pick_weight(valid_inputs) - valid_outputs -= input //in the rare case the artifact wants to exhcange plasma for more plasma. - output = pick_weight(valid_outputs) - -/datum/xenoartifact_trait/major/gas/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/analyzer)) - to_chat(user, "The [item] detects trace amounts of [initial(output.name)] exchanging with [initial(input.name)].\n") - return TRUE - ..() - -/datum/xenoartifact_trait/major/gas/activate(obj/item/xenoartifact/X, atom/target, atom/user) - var/turf/T = get_turf(X) - var/datum/gas_mixture/air = T.return_air() - var/input_id = initial(input.id) - var/output_id = initial(output.id) - var/moles = min(air.get_moles(input_id), 5) - if(moles) - air.adjust_moles(input_id, -moles) - air.adjust_moles(output_id, moles) - -///============ -/// Destabilizing, teleports the victim to that weird place from the exploration meme. -///============ -/datum/xenoartifact_trait/major/distablizer - desc = "Destabilizing" - label_desc = "Destabilizing: The Artifact collapses an improper bluespace matrix on the target, sending them to an unknown location." - weight = 25 - flags = XENOA_URANIUM_TRAIT - blacklist_traits = list(/datum/xenoartifact_trait/minor/aura) - var/obj/item/xenoartifact/exit - -/datum/xenoartifact_trait/major/distablizer/on_init(obj/item/xenoartifact/X) - exit = X - GLOB.destabliization_exits += X - -/datum/xenoartifact_trait/major/distablizer/on_item(obj/item/xenoartifact/X, mob/living/carbon/human/user, atom/item) - var/obj/item/clothing/gloves/artifact_pinchers/P - if(istype(user)) - P = user.get_item_by_slot(ITEM_SLOT_GLOVES) - if(!P?.safety && do_banish(item)) - to_chat(user, "The [item] dissapears!") - return TRUE - ..() - -/datum/xenoartifact_trait/major/distablizer/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(do_banish(target)) - X.cooldownmod = X.charge*0.2 SECONDS - -/datum/xenoartifact_trait/major/distablizer/proc/do_banish(atom/target) - . = FALSE - if(isliving(exit.loc)) - var/mob/living/holder = exit.loc - holder.dropItemToGround(exit) - if(istype(target, /obj/item/xenoartifact)) - return - if(ismovable(target)) - var/atom/movable/AM = target - if(AM.anchored) - return - if(AM.forceMove(pick(GLOB.destabilization_spawns))) - return TRUE - -/datum/xenoartifact_trait/major/distablizer/Destroy() - GLOB.destabliization_exits -= exit - ..() - -///============ -/// Dissipating, the artifact creates a could of smoke. -///============ -/datum/xenoartifact_trait/major/smokey - desc = "Dissipating" - label_desc = "Dissipating: The Artifact is dissipating as if it was made of smoke." - flags = XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BLUESPACE_TRAIT - -/datum/xenoartifact_trait/major/smokey/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - var/datum/effect_system/smoke_spread/E = new() - E.set_up(max(3, X.charge*0.08), get_turf(X)) - E.start() - -///============ -/// Marker, colors target with a random color -///============ -/datum/xenoartifact_trait/major/marker - label_name = "Marker" - label_desc = "Marker: The Artifact causes the target to refract a unique color index." - flags = XENOA_PLASMA_TRAIT | XENOA_BLUESPACE_TRAIT - ///The color this artifact dispenses - var/color - -/datum/xenoartifact_trait/major/marker/on_init(obj/item/xenoartifact/X) - color = pick(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK, "all") - -/datum/xenoartifact_trait/major/marker/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - if(color == "all") - target.color = pick(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK) - else - target.color = color - -///============ -/// emote, makes user do a random emote -///============ -/datum/xenoartifact_trait/major/emote - label_name = "Emotional" - label_desc = "Emotional: The Artifact causes the target to experience, or preform, a random emotion." - flags = XENOA_PLASMA_TRAIT | XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - ///Emote to preform - var/datum/emote/emote - -/datum/xenoartifact_trait/major/emote/on_init(obj/item/xenoartifact/X) - emote = pick(GLOB.xenoa_emote) - emote = new emote() - -/datum/xenoartifact_trait/major/emote/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - if(iscarbon(target)) - emote.run_emote(target) - //Not all mobs can preform the given emotes, spin is pretty common though - else if(isliving(target)) - var/datum/emote/spin/E = new() - E.run_emote(target) - -/datum/xenoartifact_trait/major/emote/Destroy() - . = ..() - QDEL_NULL(emote) diff --git a/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm b/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm deleted file mode 100644 index ccdb8d565a7f4..0000000000000 --- a/code/modules/xenoarchaeology/old/xenoartifact_malfunctions.dm +++ /dev/null @@ -1,275 +0,0 @@ -//Malfunctions -//============ -// Bear, produces a bear until it reaches its upper limit -//============ -/datum/xenoartifact_trait/malfunction/bear - label_name = "P.B.R." - label_desc = "Parallel Bearspace Retrieval: A strange malfunction causes the Artifact to open a gateway to deep bearspace." - weight = 15 - flags = XENOA_URANIUM_TRAIT - var/list/bears = list() //bear per bears - -/datum/xenoartifact_trait/malfunction/bear/activate(obj/item/xenoartifact/X) - if(length(bears) >= XENOA_MAX_BEARS) - return - var/turf/T = get_turf(X) - var/mob/living/simple_animal/hostile/bear/malnourished/new_bear = new(T) - new_bear.name = pick("Freddy", "Bearington", "Smokey", "Beorn", "Pooh", "Winnie", "Baloo", "Rupert", "Yogi", "Fozzie", "Boo") //Why not? - bears += new_bear - RegisterSignal(new_bear, COMSIG_MOB_DEATH, PROC_REF(handle_death)) - log_game("[X] spawned a (/mob/living/simple_animal/hostile/bear/malnourished) at [world.time]. [X] located at [AREACOORD(X)]") - X.cooldown += 20 SECONDS - -/datum/xenoartifact_trait/malfunction/bear/proc/handle_death(datum/source) - bears -= source - UnregisterSignal(source, COMSIG_MOB_DEATH) - -//============ -// Badtarget, changes target to user -//============ -/datum/xenoartifact_trait/malfunction/badtarget - label_name = "Maltargeting" - label_desc = "Maltargeting: A strange malfunction that causes the Artifact to always target the original user." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT - -/datum/xenoartifact_trait/malfunction/badtarget/activate(obj/item/xenoartifact/X, atom/target, atom/user) - var/mob/living/M - if(isliving(user)) - M = user - else if(isliving(user?.loc)) - M = user.loc - else - return - X.true_target = X.process_target(M) - X.cooldown += 5 SECONDS - -//============ -// Strip, moves a single clothing on target to floor -//============ -/datum/xenoartifact_trait/malfunction/strip - label_name = "B.A.D." - label_desc = "Bluespace Axis Desync: A strange malfunction inside the Artifact causes it to shift the target's realspace position with its bluespace mass in an offset manner. This results in the target dropping all they're wearing. This is probably the plot to a very educational movie." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/malfunction/strip/activate(obj/item/xenoartifact/X, atom/target) - if(isliving(target)) - var/mob/living/carbon/victim = target - var/list/clothing_list = list() - //Im okay with this targetting clothing in other non-worn slots - for(var/obj/item/clothing/I in victim.contents) - clothing_list += I - //Stops this from stripping funky stuff - var/obj/item/clothing/C = pick(clothing_list) - if(!HAS_TRAIT_FROM(C, TRAIT_NODROP, GLUED_ITEM_TRAIT)) - victim.dropItemToGround(C) - X.cooldown += 10 SECONDS - -//============ -// Trauma, gives target trauma, amazing -//============ -/datum/xenoartifact_trait/malfunction/trauma - label_name = "C.D.E." - label_desc = "Cerebral Dysfunction Emergence: A strange malfunction that causes the Artifact to force brain traumas to develop in a given target." - weight = 25 - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - var/datum/brain_trauma/trauma - -/datum/xenoartifact_trait/malfunction/trauma/on_init(obj/item/xenoartifact/X) - trauma = pick(list( - /datum/brain_trauma/mild/hallucinations, /datum/brain_trauma/mild/stuttering, /datum/brain_trauma/mild/dumbness, - /datum/brain_trauma/mild/speech_impediment, /datum/brain_trauma/mild/concussion, /datum/brain_trauma/mild/muscle_weakness, - /datum/brain_trauma/mild/expressive_aphasia, /datum/brain_trauma/severe/narcolepsy, /datum/brain_trauma/severe/discoordination, - /datum/brain_trauma/severe/pacifism, /datum/brain_trauma/special/beepsky)) - -/datum/xenoartifact_trait/malfunction/trauma/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(ishuman(target)) - var/mob/living/carbon/human/H = target - H.Unconscious(0.3 SECONDS) - H.gain_trauma(trauma, TRAUMA_RESILIENCE_BASIC) - X.cooldownmod += 10 SECONDS - -//============ -// Heated, causes artifact explode in flames -//============ -/datum/xenoartifact_trait/malfunction/heated - label_name = "Combustible" - label_desc = "Combustible: A strange malfunction that causes the Artifact to violently combust." - weight = 15 - flags = XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/malfunction/heated/activate(obj/item/xenoartifact/X, atom/target, atom/user) - var/turf/T = get_turf(X) - playsound(T, 'sound/effects/bamf.ogg', 50, TRUE) - for(var/turf/open/turf in RANGE_TURFS(max(1, 4*((X.charge*1.5)/100)), T)) - if(!locate(/obj/effect/safe_fire) in turf) - new /obj/effect/safe_fire(turf) - -//Lights on fire, does nothing else damage / atmos wise -/obj/effect/safe_fire - anchored = TRUE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - icon = 'icons/effects/fire.dmi' - icon_state = "1" - layer = GASFIRE_LAYER - blend_mode = BLEND_ADD - light_system = MOVABLE_LIGHT - light_range = LIGHT_RANGE_FIRE - light_power = 1 - light_color = LIGHT_COLOR_FIRE - -/obj/effect/safe_fire/Initialize(mapload) - . = ..() - for(var/atom/AT in loc) - if(!QDELETED(AT) && AT != src) // It's possible that the item is deleted in temperature_expose - AT.fire_act(400, 50) //should be average enough to not do too much damage - addtimer(CALLBACK(src, PROC_REF(after_burn)), 0.3 SECONDS) - -/obj/effect/safe_fire/proc/after_burn() - qdel(src) - -//============ -// Radioactive, makes the artifact more radioactive with use -//============ -/datum/xenoartifact_trait/malfunction/radioactive - label_name = "Radioactive" - label_desc = "Radioactive: The Artifact Emmits harmful particles when a reaction takes place." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT - -/datum/xenoartifact_trait/malfunction/radioactive/on_init(obj/item/xenoartifact/X) - X.rad_act(25) - -/datum/xenoartifact_trait/malfunction/radioactive/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/geiger_counter)) - to_chat(user, "The [X.name] has residual radioactive decay features.") - return TRUE - ..() - -/datum/xenoartifact_trait/malfunction/radioactive/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "You feel pins and needles after touching the [X.name].") - return TRUE - -/datum/xenoartifact_trait/malfunction/radioactive/activate(obj/item/xenoartifact/X) - X.rad_act(25) - -//============ -// twin, makes an evil twin of the target -//============ -/datum/xenoartifact_trait/malfunction/twin - label_name = "Anti-Cloning" - label_desc = "Anti-Cloning: The Artifact produces an arguably maleviolent clone of target." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT - var/list/clones = list() - -/datum/xenoartifact_trait/malfunction/twin/activate(obj/item/xenoartifact/X, mob/living/target, atom/user, setup) - //Stop artifact making one morbillion clones - if(length(clones) >= XENOA_MAX_CLONES) - return - //Twin setup - var/mob/living/simple_animal/hostile/twin/T = new(get_turf(X)) - //Setup appearance for evil twin - T.name = target.name - T.appearance = target.appearance - if(istype(target) && length(target.vis_contents)) - T.add_overlay(target.vis_contents) - T.alpha = 255 - T.pixel_y = initial(T.pixel_y) - T.pixel_x = initial(T.pixel_x) - T.color = COLOR_BLUE - //Handle limit and hardel - clones += T - RegisterSignal(T, COMSIG_PARENT_QDELETING, PROC_REF(handle_death)) - -/datum/xenoartifact_trait/malfunction/twin/proc/handle_death(datum/source) - clones -= source - UnregisterSignal(source, COMSIG_PARENT_QDELETING) - -/mob/living/simple_animal/hostile/twin - name = "evil twin" - desc = "It looks just like... someone!" - mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID) - speak_chance = 0 - turns_per_move = 5 - response_help = "pokes" - response_disarm = "shoves" - response_harm = "hits" - speed = 0 - maxHealth = 10 - health = 10 - melee_damage = 5 - attacktext = "punches" - attack_sound = 'sound/weapons/punch1.ogg' - a_intent = INTENT_HARM - atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 1, "min_co2" = 0, "max_co2" = 5, "min_n2" = 0, "max_n2" = 0) - unsuitable_atmos_damage = 15 - faction = list("evil_clone") - status_flags = CANPUSH - del_on_death = TRUE - do_footstep = TRUE - mobchatspan = "syndmob" - -//============ -// explode, a very small explosion takes place, destroying the artifact in the process -//============ -/datum/xenoartifact_trait/malfunction/explode - label_name = "Delaminating" - label_desc = "Delaminating: The Artifact violently collapses, exploding." - flags = XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/malfunction/explode/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - . = ..() - X.visible_message("The [X] begins to heat up, it's delaminating!") - apply_wibbly_filters(X, 3) - addtimer(CALLBACK(src, PROC_REF(explode), X), 10 SECONDS) - -/datum/xenoartifact_trait/malfunction/explode/proc/explode(obj/item/xenoartifact/X) - SSexplosions.explode(X, 0, 1, 2, 1) - qdel(X) - -//============ -// absorbant, absorbs nearby gasses -//============ -/datum/xenoartifact_trait/malfunction/absorbant - label_name = "Absorbing" - label_desc = "Absorbing: The Artifact absorbs large volumes of nearby gasses." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT - ///What gasses we've S U C K E D - var/datum/gas_mixture/air_contents - ///Gasses we can suck. Currently everything but, it's here if we need to blacklist in the future - var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O, GAS_O2, GAS_N2, GAS_STIMULUM, GAS_PLUOXIUM) - ///Adjust for balance - I'm sure this will have no ramifications - var/volume = 1000000 - var/volume_rate = 200000 - ///Ref to artifact for destruction - var/obj/item/xenoartifact/parent - -/datum/xenoartifact_trait/malfunction/absorbant/on_init(obj/item/xenoartifact/X) - air_contents = new(volume) - air_contents.set_temperature(T20C) - parent = X - -/datum/xenoartifact_trait/malfunction/absorbant/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - X.visible_message("[X] begins to vacuum nearby gasses!") - var/turf/T = get_turf(X) - var/datum/gas_mixture/mixture = T.return_air() - mixture.scrub_into(air_contents, volume_rate / mixture.return_volume(), scrubbing) - X.air_update_turf() - -//Throw sucked gas into our tile when we die -/datum/xenoartifact_trait/malfunction/absorbant/Destroy() - . = ..() - var/turf/T = get_turf(parent) - T.assume_air(air_contents) - parent.air_update_turf() - -//============ -// Hallucination, shows a random hallucination to the target once -//============ -/datum/xenoartifact_trait/malfunction/hallucination - label_name = "Hallucinogenic" - label_desc = "Hallucinogenic: The Artifact causes the target to hallucinate." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT - -/datum/xenoartifact_trait/malfunction/hallucination/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - if(isliving(target)) - var/datum/hallucination/H = pick(GLOB.hallucination_list) - H = new H(target) diff --git a/code/modules/xenoarchaeology/old/xenoartifact_minors.dm b/code/modules/xenoarchaeology/old/xenoartifact_minors.dm deleted file mode 100644 index bd3026cc86191..0000000000000 --- a/code/modules/xenoarchaeology/old/xenoartifact_minors.dm +++ /dev/null @@ -1,478 +0,0 @@ -//Minor traits - Use the to define aspects of the artifact without any immediate interaction -//============ -// Looped, increases charge towards 100 -//============ -/datum/xenoartifact_trait/minor/looped - desc = "Looped" - label_desc = "Looped: The Artifact feeds into itself and amplifies its own charge." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/looped/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/multitool)) - to_chat(user, "The [item.name] displays a resistance reading of [X.charge_req*0.1].") - return TRUE - return ..() - -/datum/xenoartifact_trait/minor/looped/activate(obj/item/xenoartifact/X) - X.charge = ((100-X.charge)*0.2)+X.charge //This should generally cut off around 100 - -//============ -// Capacitive, gives the artifact extra uses before it starts cooldown -//============ -/datum/xenoartifact_trait/minor/capacitive - desc = "Capacitive" - label_desc = "Capacitive: The Artifact's structure allows it to hold extra charges." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - var/charges //Extra uses, not total - var/saved_cooldown //This may be considered messy but it's a more practical approach that avoids making an edgecase - -/datum/xenoartifact_trait/minor/capacitive/on_init(obj/item/xenoartifact/X) - charges = pick(0, 1, 2) //Extra charges, not total - -/datum/xenoartifact_trait/minor/capacitive/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The hairs on your neck stand up after touching the [X.name].") - return TRUE - -/datum/xenoartifact_trait/minor/capacitive/activate(obj/item/xenoartifact/X) - if(!(saved_cooldown) && X.cooldown) - saved_cooldown = X.cooldown //Avoid doing this on init beacause malfunctions can change it in the future - if(charges) - charges -= 1 - X.cooldown = -1000 SECONDS //This is better than making a unique interaction in xenoartifact.dm - return - charges = pick(0, 1, 2) - playsound(get_turf(X), 'sound/machines/capacitor_charge.ogg', 50, TRUE) - X.cooldown = saved_cooldown - saved_cooldown = null - -/datum/xenoartifact_trait/minor/capacitive/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/multitool)) - to_chat(user, "The [item.name] displays an overcharge reading of [charges/3].") - return TRUE - return ..() - -//============ -// Dense, makes the artifact mimic a structure -//============ -/datum/xenoartifact_trait/minor/dense //Rather large, quite gigantic, particularly big - desc = "Dense" - label_desc = "Dense: The Artifact is dense and cannot be easily lifted but, the design has a slightly higher reaction rate." - blacklist_traits = list(/datum/xenoartifact_trait/minor/wearable, /datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/light, /datum/xenoartifact_trait/minor/heavy, /datum/xenoartifact_trait/minor/blocking, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/minor/slippery) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/dense/on_init(obj/item/xenoartifact/X) - X.density = TRUE - X.interaction_flags_atom = INTERACT_ATOM_ATTACK_HAND - X.interaction_flags_item = INTERACT_ATOM_ATTACK_HAND - X.charge_req += 20 - -//============ -// Sharp, makes the artifact do extra damage and slice type -//============ -/datum/xenoartifact_trait/minor/sharp - desc = "Sharp" - label_desc = "Sharp: The Artifact is shaped into a fine point. Perfect for popping balloons." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/sharp/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The [X.name] feels sharp.") - return TRUE - -/datum/xenoartifact_trait/minor/sharp/on_init(obj/item/xenoartifact/X) - X.sharpness = IS_SHARP_ACCURATE - X.force = X.charge_req*0.12 - X.attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") - X.attack_weight = 2 - X.armour_penetration = 5 - -//============ -// Cooler, reduces cooldown times -//============ -/datum/xenoartifact_trait/minor/cooler - desc = "Frosted" - label_desc = "Frosted: The Artifact has the unique property of actively cooling itself. This also seems to reduce time between uses." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/cooler/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The [X.name] feels cold.") - return TRUE - -/datum/xenoartifact_trait/minor/cooler/on_init(obj/item/xenoartifact/X) - X.cooldown = 4 SECONDS //Might revisit the value. - -/datum/xenoartifact_trait/minor/cooler/activate(obj/item/xenoartifact/X) - X.charge -= 10 - -//============ -// Sentient, allows a ghost to control the artifact -//============ -/datum/xenoartifact_trait/minor/sentient - label_name = "Sentient" - label_desc = "Sentient: The Artifact seems to be alive, influencing events around it. The Artifact wants to return to its master..." - //Slightly increase weight - muh arpee serber - weight = 55 - ///he who lives inside - var/mob/living/simple_animal/shade/man - ///His doorbell - var/obj/effect/mob_spawn/sentient_artifact/S - -/datum/xenoartifact_trait/minor/sentient/on_touch(obj/item/xenoartifact/X, mob/user) - to_chat(user, "The [X.name] whispers to you...") - return TRUE - -/datum/xenoartifact_trait/minor/sentient/on_init(obj/item/xenoartifact/X) - addtimer(CALLBACK(src, PROC_REF(get_canidate), X), 5 SECONDS) - RegisterSignal(X, COMSIG_PARENT_EXAMINE, PROC_REF(handle_ghost), TRUE) - -//Proc used to give access to ghosts when original player leaves -/datum/xenoartifact_trait/minor/sentient/proc/handle_ghost(datum/source, mob/M, list/examine_text) - if(isobserver(M) && man && !man?.key && (alert(M, "Are you sure you want to control of [man]?", "Assume control of [man]", "Yes", "No") == "Yes")) - man.key = M.ckey - -/datum/xenoartifact_trait/minor/sentient/proc/get_canidate(obj/item/xenoartifact/X, mob/M) - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [X.name]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - setup_sentience(X, C.ckey) - return - S = new(get_turf(X), X) - S.density = FALSE - -/datum/xenoartifact_trait/minor/sentient/proc/setup_sentience(obj/item/xenoartifact/X, ckey) - if(!(SSzclear.get_free_z_level())) - playsound(get_turf(X), 'sound/machines/buzz-sigh.ogg', 50, TRUE) - return - man = new(get_turf(X)) - man.name = pick(GLOB.xenoa_artifact_names) - man.real_name = "[man.name] - [X]" - man.key = ckey - man.status_flags |= GODMODE - log_game("[key_name_admin(man)] took control of the sentient [X]. [X] located at [AREACOORD(X)]") - man.forceMove(X) - man.anchored = TRUE - var/obj/effect/proc_holder/spell/targeted/xeno_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/xeno_senitent_action(,X) - man.AddSpell(P) - //show little guy his traits - to_chat(man, "Your traits are: \n") - for(var/datum/xenoartifact_trait/T in X.traits) - to_chat(man, "[(T.desc || T.label_name)]\n") - if(man.key) - playsound(get_turf(X), 'sound/items/haunted/ghostitemattack.ogg', 50, TRUE) - qdel(S) - -/obj/effect/proc_holder/spell/targeted/xeno_senitent_action //Lets sentience target goober - name = "Activate" - desc = "Select a target to activate your traits on." - range = 1 - charge_max = 0 SECONDS - clothes_req = 0 - include_user = 0 - action_icon = 'icons/mob/actions/actions_revenant.dmi' - action_icon_state = "r_transmit" - action_background_icon_state = "bg_spell" - var/obj/item/xenoartifact/xeno - -/obj/effect/proc_holder/spell/targeted/xeno_senitent_action/Initialize(mapload, var/obj/item/xenoartifact/Z) - . = ..() - xeno = Z - range = Z.max_range+1 - -/obj/effect/proc_holder/spell/targeted/xeno_senitent_action/cast(list/targets, mob/living/simple_animal/revenant/user = usr) - if(!xeno) - return - for(var/atom/M in targets) - xeno.true_target += xeno.process_target(M) - xeno.default_activate(xeno.charge_req+10) - charge_max = xeno.cooldown+xeno.cooldownmod - -/datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) - . = ..() - QDEL_NULL(man) //Kill the inner person. Otherwise invisible runs around - QDEL_NULL(S) - -/obj/effect/mob_spawn/sentient_artifact - death = FALSE - name = "Sentient Xenoartifact" - short_desc = "You're a maleviolent sentience, possesing an ancient alien artifact." - flavour_text = "Return to your master..." - use_cooldown = TRUE - banType = ROLE_SENTIENT_XENOARTIFACT - invisibility = 101 - var/obj/item/xenoartifact/artifact - -/obj/effect/mob_spawn/sentient_artifact/Initialize(mapload, var/obj/item/xenoartifact/Z) - if(!Z) - qdel(src) - return FALSE - artifact = Z - return ..() - -/obj/effect/mob_spawn/sentient_artifact/create(ckey, name) - var/datum/xenoartifact_trait/minor/sentient/S = artifact.get_trait(/datum/xenoartifact_trait/minor/sentient) - S.setup_sentience(artifact, ckey) - -//============ -// Delicate, makes the artifact have limited uses -//============ -/datum/xenoartifact_trait/minor/delicate - desc = "Fragile" - label_desc = "Fragile: The Artifact is poorly made. Continuous use will destroy it." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/delicate/on_init(obj/item/xenoartifact/X) - X.max_integrity = pick(200, 300, 500, 800, 1000) - X.obj_integrity = X.max_integrity - X.alpha = X.alpha * 0.55 - -/datum/xenoartifact_trait/minor/delicate/activate(obj/item/xenoartifact/X, atom/user) - if(X.obj_integrity > 0) - X.obj_integrity -= 100 - X.visible_message("The [X.name] cracks!", "The [X.name] cracks!") - else - X.visible_message("The [X.name] shatters!", "The [X.name] shatters!") - var/obj/effect/decal/cleanable/ash/A = new(get_turf(X)) - A.color = X.material - playsound(get_turf(X), 'sound/effects/glassbr1.ogg', 50, TRUE) - qdel(X) - -//============ -// Aura, adds everything in the vicinity to the target list -//============ -/datum/xenoartifact_trait/minor/aura - desc = "Expansive" - label_desc = "Expansive: The Artifact's surface reaches towards every creature in the room. Even the empty space behind you..." - blacklist_traits = list(/datum/xenoartifact_trait/major/timestop, /datum/xenoartifact_trait/minor/long) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/aura/on_init(obj/item/xenoartifact/X) - X.max_range += 2 - -/datum/xenoartifact_trait/minor/aura/activate(obj/item/xenoartifact/X) - for(var/atom/M in oview(min(X.max_range, 5), get_turf(X.loc))) - if(X.true_target.len >= XENOA_MAX_TARGETS) - return - var/obj/item/I = M - if(istype(M, /mob/living)) - X.true_target |= X.process_target(M) - else if(istype(I) && !(I.anchored)) - X.true_target |= X.process_target(I) - -//============ -// Long, makes the artifact ranged, allows effects to select targets from afar -//============ -/datum/xenoartifact_trait/minor/long - desc = "Scoped" - label_desc = "Scoped: The Artifact has an almost magnifying effect to it. You could probably target someone from really far away with it." - blacklist_traits = list(/datum/xenoartifact_trait/minor/aura) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/long/on_init(obj/item/xenoartifact/X) - X.max_range += 18 - -//============ -// Wearable, allows artifact to be worn like a glove. -//============ -/datum/xenoartifact_trait/minor/wearable - desc = "Shaped" - label_desc = "Shaped: The Artifact is small and shaped. It looks as if it'd fit on someone's finger." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT - -/datum/xenoartifact_trait/minor/wearable/on_init(obj/item/xenoartifact/X) - X.slot_flags = ITEM_SLOT_GLOVES - -/datum/xenoartifact_trait/minor/wearable/activate(obj/item/xenoartifact/X, atom/user) - X.true_target |= list(user) - -//============ -// Allows artifact to act like a shield -//============ -/datum/xenoartifact_trait/minor/blocking - desc = "Shielded" - label_desc = "Shielded: The Artifact's composistion lends itself well to blocking attacks. It would do you good to bring this to a rage cage." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/blocking/on_init(obj/item/xenoartifact/X) - X.block_level = pick(1, 2, 3, 4) - X.block_upgrade_walk = 1 - X.block_power = 25 * pick(0.8, 1, 1.3, 1.5) - -//============ -// Light, allows artifact to be thrown far -//============ -/datum/xenoartifact_trait/minor/light - desc = "Light" - label_desc = "Light: The Artifact is made from a light material. You can pitch it pretty far." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/heavy) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/light/on_init(obj/item/xenoartifact/X) - X.throw_range = 8 - -//============ -// Heavy, artifact cannot be throwwn far -//============ -/datum/xenoartifact_trait/minor/heavy - desc = "Heavy" - label_desc = "Heavy: The Artifact is made from a heavy material. You can't pitch it very far." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/light) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/heavy/on_init(obj/item/xenoartifact/X) - X.throw_range = 1 - -//============ -// Signalsend, activating the artifact sends a set signal -//============ -/datum/xenoartifact_trait/minor/signalsend - label_name = "Signaler" - label_desc = "Signaler: The Artifact sends out a signal everytime it's activated." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/signalsend/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/analyzer)) - to_chat(user, "The [item.name] displays an outputting signal code of [X.code], and frequency [X.frequency].") - return TRUE - return ..() - -/datum/xenoartifact_trait/minor/signalsend/on_init(obj/item/xenoartifact/X) - X.code = rand(1, 100) - X.frequency = FREQ_SIGNALER - X.set_frequency(X.frequency) - -/datum/xenoartifact_trait/minor/signalsend/activate(obj/item/xenoartifact/X) - var/datum/signal/signal = new(list("code" = X.code)) - X.send_signal(signal) - log_game("[X] sent signal code [X.code] on frequency [X.frequency] at [world.time]. [X] located at [AREACOORD(X)]") - -//============ -// Anchor, the artifact can be anchored, anchors when activated -//============ -/datum/xenoartifact_trait/minor/anchor - desc = "Anchored" - label_desc = "Anchored: The Artifact buckles to the floor with the weight of a sun every time it activates. Heavier than you, somehow." - blacklist_traits = list(/datum/xenoartifact_trait/minor/wearable, /datum/xenoartifact_trait/minor/haunted) - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/minor/anchor/activate(obj/item/xenoartifact/X, atom/target, atom/user) - if(isliving(X.loc)) - var/mob/living/holder = X.loc - holder.dropItemToGround(X) - X.visible_message("The [X.name] buckles to the floor!") - X.setAnchored(TRUE) - X.density = TRUE - -/datum/xenoartifact_trait/minor/anchor/on_item(obj/item/xenoartifact/X, atom/user, obj/item/item) - if(item.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You [X.anchored ? "unanchor" : "anchor"] the [X.name] to the [get_turf(X)].") - if(isliving(X.loc)) - var/mob/living/holder = X.loc - holder.dropItemToGround(X) - X.setAnchored(!X.anchored) - if(!X.get_trait(/datum/xenoartifact_trait/minor/dense)) - X.density = !X.density - return TRUE - return ..() - -//============ -// Slippery, the artifact is slippery. Honk -//============ -/datum/xenoartifact_trait/minor/slippery - desc = "Slippery" - label_desc = "Slippery: The Artifact's surface is perpetually slippery. Popular amongst scientific-clown groups." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - var/datum/component/slippery/slipper - -/datum/xenoartifact_trait/minor/slippery/on_init(obj/item/xenoartifact/X) - slipper = X.AddComponent(/datum/component/slippery, 80) - -/datum/xenoartifact_trait/minor/slippery/Destroy(force, ...) - QDEL_NULL(slipper) - return ..() - -//============ -// haunted, the artifact can be controlled by deadchat, works well with sentient -//============ -/datum/xenoartifact_trait/minor/haunted - label_name = "Haunted" - label_desc = "Haunted: The Artifact's appears to interact with bluespace spatial regression, causing the item to appear haunted." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense, /datum/xenoartifact_trait/minor/anchor, /datum/xenoartifact_trait/minor/wearable) - flags = XENOA_BLUESPACE_TRAIT - weight = 15 - var/datum/component/deadchat_control/controller - -/datum/xenoartifact_trait/minor/haunted/on_init(obj/item/xenoartifact/X) - controller = X._AddComponent(list(/datum/component/deadchat_control, "democracy", list( - "up" = CALLBACK(src, PROC_REF(haunted_step), X, NORTH), - "down" = CALLBACK(src, PROC_REF(haunted_step), X, SOUTH), - "left" = CALLBACK(src, PROC_REF(haunted_step), X, WEST), - "right" = CALLBACK(src, PROC_REF(haunted_step), X, EAST), - "activate" = CALLBACK(src, PROC_REF(activate_parent), X)), 10 SECONDS)) - -/datum/xenoartifact_trait/minor/haunted/proc/haunted_step(obj/item/xenoartifact/ref, dir) - if(isliving(ref.loc)) //Make any mobs drop this before it moves - var/mob/living/M = ref.loc - M.dropItemToGround(ref) - playsound(get_turf(ref), 'sound/effects/magic.ogg', 50, TRUE) - step(ref, dir) - -///Used for ghost command -/datum/xenoartifact_trait/minor/haunted/proc/activate_parent(obj/item/xenoartifact/ref) - //Get a target to style on - ref.true_target = ref.get_target_in_proximity(min(ref.max_range+1, 5)) - if(ref.true_target.len) - ref.check_charge(ref.true_target[1]) - -/datum/xenoartifact_trait/minor/haunted/on_item(obj/item/xenoartifact/X, atom/user, atom/item) - if(istype(item, /obj/item/storage/book/bible)) - to_chat(user, "The [X.name] rumbles on contact with the [item].") - return TRUE - return ..() - -/datum/xenoartifact_trait/minor/haunted/Destroy(force, ...) - QDEL_NULL(controller) - return ..() - -//============ -// Delay, delays the activation. Credit to EvilDragon#4532 -//============ -/datum/xenoartifact_trait/minor/delay - label_name = "Delayed" - label_desc = "Delayed: The Artifact's composistion causes activations to be delayed." - blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - weight = 25 - -/datum/xenoartifact_trait/minor/delay/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - X.visible_message("The [X] halts and begins to hum deeply.", "The [X] halts and begins to hum deeply.") - playsound(get_turf(X), 'sound/effects/seedling_chargeup.ogg', 50, TRUE) - sleep(3 SECONDS) - -//============ -// Blink, the artifact dissapears for a short duration after use -//============ -/datum/xenoartifact_trait/minor/blink - label_name = "Desynced" - label_desc = "Desynced: The Artifact falls in & out of existence regularly." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - ///Where your eyes don't go - var/obj/effect/confiscate - -/datum/xenoartifact_trait/minor/blink/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup) - X.visible_message("[X] slips between dimensions!") - confiscate = new(get_turf(X)) - X.forceMove(confiscate) - addtimer(CALLBACK(src, PROC_REF(comeback), X), X.charge*0.20 SECONDS) - -/datum/xenoartifact_trait/minor/blink/proc/comeback(obj/item/xenoartifact/X) - X.visible_message("[X] slips between dimensions!") - X.forceMove(get_turf(confiscate)) - QDEL_NULL(confiscate) - -/datum/xenoartifact_trait/minor/blink/Destroy(force, ...) - . = ..() - if(!isnull(confiscate)) - comeback() diff --git a/code/modules/xenoarchaeology/old/xenoartifact_traits.dm b/code/modules/xenoarchaeology/old/xenoartifact_traits.dm deleted file mode 100644 index d4bdad2bc2c11..0000000000000 --- a/code/modules/xenoarchaeology/old/xenoartifact_traits.dm +++ /dev/null @@ -1,125 +0,0 @@ -///Xenoartifact traits, datum-ised -/datum/xenoartifact_trait - ///Acts as a descriptor for when examining. Also used for naming stuff in the labeler. Keep these short. - var/desc - ///Used when labeler needs a name and trait is too sneaky to have a descriptor when examining. - var/label_name - ///Something briefly explaining it in IG terms or a pun. - var/label_desc - ///Asscoiated flags for artifact typing - var/flags = NONE - ///Other traits the original trait wont work with. Referenced when generating traits. - var/list/blacklist_traits = list() - ///Weight in trait list, most traits wont change this - var/weight = 50 - -//Subtype shenanigahns -/datum/xenoartifact_trait/minor //leave these here for later. - -/datum/xenoartifact_trait/major - -/datum/xenoartifact_trait/malfunction - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT - -/datum/xenoartifact_trait/activator - ///How much an activator trait can output on a standard, modified by the artifacts charge_req and circumstances. - var/charge - ///which signals trait responds to - var/list/signals - ///Not used outside of signal handle, please - var/obj/item/xenoartifact/xenoa - -///Proc used to compile trait weights into a list -/proc/compile_artifact_weights(path) - if(!ispath(path)) - return - var/list/temp = subtypesof(path) - var/list/weighted = list() - for(var/datum/xenoartifact_trait/T as() in temp) - weighted += list((T) = initial(T.weight)) - return weighted - -///Compile a blacklist of traits from a given flag/s -/proc/compile_artifact_blacklist(var/flags) - var/list/output = list() - for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) - if(!(initial(T.flags) & flags)) - output += T - return output - -//Activator signal shenanignas -///Passes information into the activator datum to decide if, and how, the artifact activates -/datum/xenoartifact_trait/activator/proc/pass_input(obj/item/xenoartifact/X) - return - -/datum/xenoartifact_trait/activator/on_init(obj/item/xenoartifact/X) - . = ..() - if(!X) - return - xenoa = X - for(var/s in signals) - switch(s) //Translating signal params to vaugely resemble (/obj/item, /mob/living, params) - if(COMSIG_PARENT_ATTACKBY) - RegisterSignal(xenoa, COMSIG_PARENT_ATTACKBY, PROC_REF(translate_attackby)) - if(COMSIG_ITEM_ATTACK) - RegisterSignal(xenoa, COMSIG_ITEM_ATTACK, PROC_REF(translate_attack)) - if(COMSIG_MOVABLE_IMPACT) - RegisterSignal(xenoa, COMSIG_MOVABLE_IMPACT, PROC_REF(translate_impact)) - if(COMSIG_ITEM_AFTERATTACK) - RegisterSignal(xenoa, COMSIG_ITEM_AFTERATTACK, PROC_REF(translate_afterattack)) - if(COMSIG_ITEM_PICKUP) - RegisterSignal(xenoa, COMSIG_ITEM_PICKUP, PROC_REF(translate_pickup)) - if(COMSIG_ITEM_ATTACK_SELF) - RegisterSignal(xenoa, COMSIG_ITEM_ATTACK_SELF, PROC_REF(translate_attack_self)) - if(XENOA_SIGNAL) - RegisterSignal(xenoa, XENOA_SIGNAL, PROC_REF(translate_attackby)) - RegisterSignal(xenoa, XENOA_DEFAULT_SIGNAL, PROC_REF(pass_input)) //Signal sent by handles - -/datum/xenoartifact_trait/activator/Destroy(force, ...) - . = ..() - if(!xenoa) - return - for(var/s in signals) - UnregisterSignal(xenoa, s) - UnregisterSignal(xenoa, XENOA_DEFAULT_SIGNAL) - xenoa = null - -/datum/xenoartifact_trait/activator/proc/translate_attackby(datum/source, obj/item/thing, mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, thing, user, user) - -/datum/xenoartifact_trait/activator/proc/translate_attack_self(datum/source, mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, user, user) - -/datum/xenoartifact_trait/activator/proc/translate_attack(mob/living/target, mob/living/user) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, user, target) - -/datum/xenoartifact_trait/activator/proc/translate_impact(atom/hit_atom, datum/thrownthing/throwingdatum) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, hit_atom, throwingdatum) //Weird order to fix this becuase signals are mean - -/datum/xenoartifact_trait/activator/proc/translate_afterattack(atom/target, mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, target, params, user) //Weird order to fix this becuase signals are mean - -/datum/xenoartifact_trait/activator/proc/translate_pickup(mob/user, params) - SEND_SIGNAL(xenoa, XENOA_DEFAULT_SIGNAL, xenoa, params) //Weird order to fix this becuase signals are mean - -//End activator -//Declare procs -/datum/xenoartifact_trait/proc/activate(obj/item/xenoartifact/X, atom/target, atom/user, setup = TRUE) //Typical behaviour - return - -/datum/xenoartifact_trait/proc/on_item(obj/item/xenoartifact/X, atom/user, atom/item) //Item hint responses - return FALSE - -///This is better than initialize just for our specific control purposes, definitely not becuase I forgot to use it somehow. -/datum/xenoartifact_trait/proc/on_init(obj/item/xenoartifact/X) - return - -/datum/xenoartifact_trait/proc/on_touch(obj/item/xenoartifact/X, atom/user) //Touch hint - return FALSE - -//Exploration mission GPS trait -/datum/xenoartifact_trait/special/objective - blacklist_traits = list(/datum/xenoartifact_trait/minor/delicate) - -/datum/xenoartifact_trait/special/objective/on_init(obj/item/xenoartifact/X) - X.AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index 0fa846cd64c8c..6e160cb27318e 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -75,7 +75,7 @@ /datum/rnd_lister/artifact_seller/get_new_stock() var/datum/xenoartifact_material = pick_weight(artifact_types) - var/obj/item/xenoartifact/artifact = new() + var/obj/item/xenoartifact/artifact = new(null, xenoartifact_material) artifact.AddComponent(/datum/component/xenoartifact, xenoartifact_material) return artifact diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm new file mode 100644 index 0000000000000..c89c8c887a08c --- /dev/null +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -0,0 +1,20 @@ +/datum/xenoartifact_trait/misc + flags = null + register_targets = FALSE + weight = 0 + conductivity = 0 + +/datum/xenoartifact_trait/misc/objective + blacklist_traits = list(/datum/xenoartifact_trait/minor/delicate) + +/datum/xenoartifact_trait/misc/objective/New(atom/_parent) + . = ..() + var/atom/A = parent.parent + A.AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) + +/datum/xenoartifact_trait/misc/objective/Destroy(force, ...) + . = ..() + var/atom/A = parent.parent + var/datum/component/gps/G = A.GetComponent(/datum/component/gps) + qdel(G) + \ No newline at end of file From 25bbba692761635c0f8c7439511ccf1d61b06975 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 20:29:18 +1100 Subject: [PATCH 033/339] bookmark - 13 1 24 --- code/_globalvars/xenoartifact.dm | 2 +- .../xenoarchaeology/components/xenoartifact.dm | 11 ++++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index 8ac0c9678a13f..9f2dd404acd34 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -40,7 +40,7 @@ GLOBAL_LIST(xenoa_bananium_traits) GLOB.xenoa_bananium_traits = compile_artifact_whitelist(XENOA_BANANIUM_TRAIT) ///Material weights, basically rarity -GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 5, XENOA_URANIUM = 3, XENOA_BANANIUM = 1)) +GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 8, XENOA_URANIUM = 5, XENOA_BANANIUM = 1)) ///Trait priority list - The order is important and it represents priotity GLOBAL_LIST_INIT(xenoartifact_trait_priorities, list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MALFUNCTION, TRAIT_PRIORITY_MAJOR)) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index c6a1abee6da1c..30aa5b86fd123 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -95,7 +95,7 @@ var/icon/MA = artifact_type.get_texture() A.add_filter("texture_overlay", 1, layering_filter(icon = MA, blend_mode = BLEND_INSET_OVERLAY)) //Throw on some outlines - A.add_filter("outline_1", 2, outline_filter(1, "#000")) + A.add_filter("outline_1", 2, outline_filter(2, "#000")) A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color)) //Build priotity list @@ -338,14 +338,23 @@ instability_step = 25 texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") +/datum/xenoartifact_material/uranium/get_trait_list() + return GLOB.xenoa_uranium_traits + /datum/xenoartifact_material/plasma name = "plasma" material_color = "#f200ffff" instability_step = 5 texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") +/datum/xenoartifact_material/plasma/get_trait_list() + return GLOB.xenoa_plasma_traits + /datum/xenoartifact_material/bluespace name = "bluespace" material_color = "#006affff" instability_step = 1 texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") + +/datum/xenoartifact_material/bluespace/get_trait_list() + return GLOB.xenoa_bluespace_traits From 357fd5caed56bf503c9c4219a5decab3c5e39c5f Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 20:30:29 +1100 Subject: [PATCH 034/339] Update xenoartifact.dm --- code/modules/xenoarchaeology/components/xenoartifact.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 30aa5b86fd123..79e8e0dca09f3 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -328,6 +328,7 @@ material_color = "#f2ff00" instability_step = 0.5 texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") + mask_icon_states = list("mask-bananium1") /datum/xenoartifact_material/bananium/get_trait_list() return GLOB.xenoa_bananium_traits @@ -337,6 +338,7 @@ material_color = "#88ff00ff" instability_step = 25 texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") + mask_icon_states = list("mask-uranium1") /datum/xenoartifact_material/uranium/get_trait_list() return GLOB.xenoa_uranium_traits @@ -346,6 +348,7 @@ material_color = "#f200ffff" instability_step = 5 texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") + mask_icon_states = list("mask-plasma1") /datum/xenoartifact_material/plasma/get_trait_list() return GLOB.xenoa_plasma_traits @@ -355,6 +358,7 @@ material_color = "#006affff" instability_step = 1 texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") + mask_icon_states = list("mask-bluespace1") /datum/xenoartifact_material/bluespace/get_trait_list() return GLOB.xenoa_bluespace_traits From a7a1e19d8fff4775515f5d65278fb8f74a5f427b Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 20:37:09 +1100 Subject: [PATCH 035/339] Update xenoartifact.dm --- code/modules/xenoarchaeology/components/xenoartifact.dm | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 79e8e0dca09f3..82543e1c026ab 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -168,13 +168,12 @@ use_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), max(0, use_cooldown + trait_cooldown), TIMER_STOPPABLE) /datum/component/xenoartifact/proc/build_traits(list/trait_list, amount) - if(!length(trait_list)) - CRASH("Something extrodinarily fucked has happened in the artifact component.") var/list/options = trait_list options -= blacklisted_traits for(var/i in 1 to amount) //Pick a random trait var/datum/xenoartifact_trait/T = pick_weight(options) + options -= T add_individual_trait(T) //Cooldown finish logic goes here From 006891a1519c73095971a2621214b33c97b3d794 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 20:58:52 +1100 Subject: [PATCH 036/339] Update MetaStation.dmm --- _maps/map_files/MetaStation/MetaStation.dmm | 564 ++++++++++---------- 1 file changed, 292 insertions(+), 272 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 1d045f174d25f..8bdc197ec8052 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -15798,8 +15798,14 @@ /turf/open/floor/wood, /area/crew_quarters/bar) "bAw" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -15807,11 +15813,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/xenoartifact/scale, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/science/explab) "bAz" = ( /obj/structure/disposalpipe/segment{ @@ -23014,7 +23019,8 @@ /turf/open/floor/plating, /area/science/research) "cmP" = ( -/turf/closed/wall, +/obj/structure/sign/warning/explosives, +/turf/closed/wall/r_wall, /area/science/explab) "cmX" = ( /obj/structure/window/reinforced, @@ -23392,39 +23398,49 @@ /turf/open/floor/plasteel/white, /area/science/research) "cqQ" = ( -/obj/machinery/light_switch{ - pixel_x = -23 - }, -/obj/item/kirbyplants/random, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 10 }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, /turf/open/floor/plasteel/white, /area/science/explab) "cqR" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/sink{ + dir = 1 + }, +/obj/machinery/light, /obj/machinery/power/apc{ areastring = "/area/science/explab"; name = "Experimentation Lab APC"; pixel_y = -24 }, /obj/structure/cable/yellow, -/obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/plasteel/white, /area/science/explab) "cqS" = ( -/obj/item/radio/intercom{ - pixel_y = -29 - }, -/obj/machinery/camera{ - c_tag = "Experimentation Lab"; - dir = 1; - network = list("ss13","rd") - }, -/obj/machinery/light, /obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/plasteel/white, +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/blobstart, +/turf/open/floor/noslip/white, /area/science/explab) "cqV" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, /turf/open/floor/plasteel/white, /area/science/explab) "cqX" = ( @@ -30927,6 +30943,12 @@ /obj/effect/spawner/randomvend/cola, /turf/open/floor/plasteel/dark, /area/hallway/secondary/command) +"edn" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/science/explab) "edK" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 8 @@ -31792,13 +31814,13 @@ /turf/open/floor/plating, /area/maintenance/starboard) "ezt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/computer/xenoartifact_console{ - dir = 1 +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/science/explab) "ezC" = ( /obj/structure/table/reinforced, @@ -32344,9 +32366,12 @@ /turf/open/floor/plasteel/white, /area/medical/surgery) "eKy" = ( -/obj/effect/turf_decal/stripes/line, /obj/structure/closet/bombcloset, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, /area/science/explab) "eKT" = ( /obj/structure/cable/yellow{ @@ -33131,10 +33156,9 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) "fct" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/engine, +/obj/machinery/xenoarchaeology_machine/scale, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, /area/science/explab) "fcY" = ( /obj/machinery/holopad, @@ -33560,11 +33584,8 @@ /turf/open/floor/plasteel, /area/security/prison) "fkR" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, /obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/delivery, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, @@ -37249,13 +37270,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"gOz" = ( -/obj/effect/landmark/start/scientist, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "gPK" = ( /obj/item/paper_bin{ pixel_x = -2; @@ -37768,14 +37782,9 @@ /turf/open/floor/plasteel/dark, /area/security/execution/education) "hal" = ( -/mob/living/simple_animal/pet/dog/pug{ - desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; - name = "Pugley IV"; - real_name = "Pugley IV" +/obj/effect/turf_decal/stripes/line{ + dir = 9 }, -/obj/machinery/xenoartifact_inbox, -/obj/effect/turf_decal/delivery, -/obj/item/xenoartifact, /turf/open/floor/engine, /area/science/explab) "hbi" = ( @@ -40683,14 +40692,10 @@ /turf/open/floor/plasteel/white, /area/security/prison) "ija" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/dark, /area/science/explab) "ijn" = ( /obj/structure/cable/yellow{ @@ -41177,10 +41182,8 @@ /turf/open/floor/plasteel/dark, /area/storage/tech) "isb" = ( -/obj/structure/chair/office/light, -/obj/effect/landmark/start/scientist, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 }, /turf/open/floor/plasteel/white, /area/science/explab) @@ -41211,7 +41214,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/science/explab) "its" = ( /obj/machinery/power/solar_control{ @@ -41289,13 +41292,13 @@ /turf/open/floor/plasteel, /area/hallway/primary/aft) "iuM" = ( -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/oxygen, +/obj/item/book/manual/wiki/xenoarchaeology, +/obj/effect/turf_decal/bot, +/obj/item/healthanalyzer, +/turf/open/floor/plasteel/dark, /area/science/explab) "ivj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ @@ -42215,13 +42218,10 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "iNf" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, /obj/item/radio/intercom{ pixel_y = 21 }, -/turf/open/floor/engine, +/turf/open/floor/plasteel/dark, /area/science/explab) "iNp" = ( /obj/machinery/holopad{ @@ -43381,8 +43381,8 @@ /turf/open/floor/plasteel/dark, /area/security/brig) "jmI" = ( -/obj/machinery/door/window/eastleft{ - dir = 2 +/obj/effect/turf_decal/stripes/line{ + dir = 8 }, /turf/open/floor/engine, /area/science/explab) @@ -43400,10 +43400,6 @@ }, /turf/open/floor/plasteel, /area/security/checkpoint/science/research) -"jny" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall, -/area/science/explab) "jnJ" = ( /obj/structure/cable/yellow{ icon_state = "1-4" @@ -43537,6 +43533,19 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"jsE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4; + layer = 3.2 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "jtl" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43874,23 +43883,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "jAj" = ( -/obj/structure/rack, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/assembly/igniter, -/obj/item/analyzer, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/geiger_counter, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 +/turf/open/floor/plasteel/stairs{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, -/turf/open/floor/plasteel/dark, /area/science/explab) "jAk" = ( /obj/structure/cable/yellow{ @@ -44127,14 +44122,13 @@ /turf/open/floor/plasteel/grimy, /area/tcommsat/computer) "jIH" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/disposalpipe/trunk, -/obj/machinery/disposal/bin, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, /turf/open/floor/plasteel/white, /area/science/explab) "jJD" = ( @@ -44251,12 +44245,6 @@ }, /turf/open/floor/plasteel/dark/corner, /area/engine/atmos) -"jLA" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "jLJ" = ( /obj/effect/turf_decal/bot_white, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -44880,6 +44868,17 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) +"jYb" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "jZe" = ( /obj/structure/table, /obj/item/paper_bin{ @@ -45546,10 +45545,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/central) -"klx" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner, -/turf/open/floor/plasteel/white, -/area/science/explab) "klR" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -46325,11 +46320,6 @@ /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating, /area/maintenance/aft) -"kzk" = ( -/obj/effect/turf_decal/stripes/line, -/obj/structure/closet/emcloset, -/turf/open/floor/plasteel/dark, -/area/science/explab) "kzn" = ( /obj/machinery/door/airlock/external{ name = "Departure Lounge Airlock" @@ -47368,19 +47358,20 @@ /turf/open/floor/plasteel, /area/science/shuttledock) "kUc" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, +/obj/machinery/holopad, +/obj/effect/turf_decal/box, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/landmark/start/scientist, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, /turf/open/floor/plasteel/white, /area/science/explab) "kUe" = ( @@ -49005,15 +48996,13 @@ /turf/open/floor/carpet/red, /area/crew_quarters/heads/hos) "lER" = ( -/obj/machinery/shower{ - dir = 8; - name = "emergency shower" - }, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 }, -/turf/open/floor/noslip/white, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, /area/science/explab) "lFc" = ( /obj/structure/table, @@ -50914,9 +50903,11 @@ /turf/open/floor/wood, /area/library) "mwn" = ( +/obj/structure/closet/firecloset, /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, +/obj/effect/turf_decal/bot, /turf/open/floor/plasteel/white, /area/science/explab) "mww" = ( @@ -51775,11 +51766,17 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "mNG" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 4 }, -/obj/structure/closet/radiation, -/turf/open/floor/plasteel/dark, +/obj/structure/railing{ + dir = 4; + layer = 3.2 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, /area/science/explab) "mNL" = ( /obj/structure/reagent_dispensers/fueltank, @@ -52128,14 +52125,26 @@ /turf/open/floor/plasteel/dark, /area/science/server) "mVU" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/structure/rack, +/obj/item/multitool{ + pixel_x = 3 }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 +/obj/item/assembly/igniter, +/obj/item/analyzer, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 }, -/turf/open/floor/plasteel/white, +/obj/item/geiger_counter, +/obj/item/assembly/signaler{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/turf/open/floor/plasteel/dark, /area/science/explab) "mVY" = ( /obj/structure/table/reinforced, @@ -52371,7 +52380,10 @@ /turf/open/floor/plasteel, /area/medical/genetics) "mYV" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 8 + }, +/obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/explab) "mZn" = ( @@ -52569,8 +52581,11 @@ /turf/open/floor/plasteel, /area/security/brig) "ncb" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -52578,11 +52593,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/effect/landmark/xeno_spawn, +/obj/structure/cable/yellow{ + icon_state = "4-8" }, -/obj/machinery/xenoartifact/calibrator, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/science/explab) "ncI" = ( /obj/effect/decal/cleanable/dirt, @@ -52918,9 +52933,8 @@ /turf/open/floor/plasteel, /area/crew_quarters/dorms) "njb" = ( -/obj/effect/turf_decal/stripes/corner, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/science/explab) "njS" = ( /obj/machinery/shower{ @@ -54213,12 +54227,6 @@ /obj/effect/turf_decal/tile/red/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/security/execution/education) -"nMr" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "nMB" = ( /obj/machinery/portable_atmospherics/scrubber, /obj/structure/window/reinforced{ @@ -54535,16 +54543,22 @@ /turf/open/floor/plasteel, /area/science/mixing) "nRO" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/xenoartifact/conductor, -/turf/open/floor/plasteel/dark, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, /area/science/explab) "nRS" = ( /obj/structure/musician/piano, @@ -55757,15 +55771,6 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) -"ore" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "ori" = ( /obj/effect/turf_decal/pool/corner{ dir = 8 @@ -56580,10 +56585,10 @@ /turf/open/floor/plasteel, /area/engine/engineering) "oHz" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/closet/firecloset, -/obj/structure/sign/warning/nosmoking{ - pixel_y = 32 +/obj/machinery/xenoarchaeology_machine/conductor, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/science/explab) @@ -57466,12 +57471,22 @@ /turf/open/floor/plasteel, /area/hydroponics/garden) "pdF" = ( -/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/end{ + dir = 1 + }, /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, /turf/open/floor/plasteel/white, /area/science/explab) @@ -58702,17 +58717,20 @@ /turf/open/floor/plasteel, /area/engine/atmos) "pFo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/open/floor/plasteel/white, /area/science/explab) @@ -59411,11 +59429,10 @@ /turf/open/floor/plasteel, /area/engine/engineering) "pUs" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ dir = 1 }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/plasteel/white, /area/science/explab) "pUF" = ( @@ -60867,10 +60884,8 @@ /turf/open/floor/engine, /area/engine/engineering) "qzI" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 4 - }, +/obj/item/xenoartifact, +/obj/effect/turf_decal/box, /turf/open/floor/engine, /area/science/explab) "qzT" = ( @@ -64867,11 +64882,17 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "slR" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/turf_decal/stripes/corner{ + dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -64879,7 +64900,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, /area/science/explab) "slY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -65179,8 +65203,8 @@ /turf/open/floor/plating, /area/maintenance/starboard/fore) "ste" = ( -/obj/structure/window/reinforced{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/engine, /area/science/explab) @@ -65204,11 +65228,9 @@ /turf/open/floor/plasteel/grid/steel, /area/medical/virology) "stD" = ( -/obj/structure/window/reinforced, -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, +/obj/machinery/xenoarchaeology_machine/calibrator, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, /area/science/explab) "stH" = ( /obj/structure/disposalpipe/segment, @@ -67744,11 +67766,11 @@ /turf/open/floor/plasteel/white, /area/science/research) "txo" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 }, /obj/structure/disposalpipe/segment{ - dir = 9 + dir = 10 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ dir = 4 @@ -67756,8 +67778,8 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 8 +/obj/structure/cable/yellow{ + icon_state = "4-8" }, /turf/open/floor/plasteel/white, /area/science/explab) @@ -68666,6 +68688,12 @@ icon_state = "platingdmg1" }, /area/maintenance/starboard/fore) +"tUE" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/science/explab) "tUP" = ( /obj/effect/spawner/room/fivexthree, /turf/open/floor/plating, @@ -68735,10 +68763,13 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload_foyer) "tVX" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/stripes/corner, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley IV"; + real_name = "Pugley IV" }, -/obj/machinery/holopad, +/obj/structure/bed/dogbed, /turf/open/floor/plasteel/dark, /area/science/explab) "tWv" = ( @@ -69470,7 +69501,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/engine, /area/science/explab) "ulL" = ( /obj/item/kirbyplants/random, @@ -70638,14 +70669,17 @@ /turf/open/floor/plasteel/dark, /area/science/storage) "uMx" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/tank/internals/oxygen, /obj/effect/turf_decal/stripes/line{ - dir = 8 + dir = 5 }, -/obj/item/book/manual/wiki/xenoarchaeology, -/turf/open/floor/plasteel/dark, +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, /area/science/explab) "uNj" = ( /obj/machinery/door/airlock/external{ @@ -71515,23 +71549,14 @@ /turf/open/floor/plasteel, /area/vacant_room/commissary) "vho" = ( -/obj/effect/turf_decal/stripes/line{ +/obj/machinery/computer/xenoarchaeology_console{ dir = 1 }, -/obj/machinery/light, -/obj/structure/table/reinforced, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science{ - pixel_y = 9 - }, -/obj/item/xenoartifact_labeler{ - pixel_x = -5; - pixel_y = 7 +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 }, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/xenoartifact_labeler, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel/white, /area/science/explab) "vhy" = ( /obj/effect/turf_decal/plaque{ @@ -71958,10 +71983,15 @@ /turf/open/floor/plasteel, /area/hallway/secondary/command) "vqJ" = ( -/obj/structure/table/reinforced, -/obj/item/storage/firstaid/regular, -/obj/item/clothing/neck/stethoscope, -/turf/open/floor/plasteel/dark, +/obj/structure/table, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/turf/open/floor/plasteel/white, /area/science/explab) "vqM" = ( /obj/effect/turf_decal/tile/red/half/contrasted, @@ -76203,10 +76233,13 @@ /turf/open/floor/plating, /area/maintenance/starboard) "wZO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/item/radio/intercom{ + pixel_x = 29 + }, +/turf/open/floor/plasteel/white, /area/science/explab) "wZQ" = ( /obj/structure/disposalpipe/segment, @@ -78282,17 +78315,6 @@ dir = 1 }, /area/hallway/primary/starboard) -"xOA" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "xOG" = ( /turf/closed/wall, /area/medical/virology) @@ -78385,10 +78407,6 @@ /turf/open/floor/plasteel/white, /area/crew_quarters/heads/hor) "xPu" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel/dark, /area/science/explab) "xPx" = ( @@ -79380,6 +79398,11 @@ /turf/open/floor/plasteel, /area/security/prison) "yiI" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, /obj/machinery/requests_console{ department = "Science"; departmentType = 2; @@ -79387,9 +79410,6 @@ pixel_x = -30; receive_ore_updates = 1 }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, /turf/open/floor/plasteel/white, /area/science/explab) "yjg" = ( @@ -113446,7 +113466,7 @@ cgq cgq cgq cgq -jny +cgq dNT cmP thn @@ -113699,7 +113719,7 @@ bST epl cgq eKy -mwn +jYb mwn yiI fkR @@ -113956,10 +113976,10 @@ bST hMg cgq mNG -wZO -wZO -nMr -cqV +jsE +jsE +jsE +jsE cqV kUc cqR @@ -114212,8 +114232,8 @@ ccv bST qrv cgq -jLA -jLA +xPu +xPu stD xPu tVX @@ -114472,8 +114492,8 @@ cgq fct hal jmI +tUE tZG -gOz jAj nRO pUs @@ -114730,8 +114750,8 @@ iNf ste qzI njb -ore -xOA +tZG +jAj ncb mYV vho @@ -114984,11 +115004,11 @@ bST hMg cgq oHz -ulJ +edn ulJ ith -cqV -klx +tZG +jAj pFo isb ezt @@ -115240,7 +115260,7 @@ dbE bST sqD cgq -kzk +xPu iuM mVU lER From a2c065491513615fc92ff551324f3ade09b04d9c Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 22:50:27 +1100 Subject: [PATCH 037/339] Artificial initial - 13 1 24 --- code/__DEFINES/xenoartifact.dm | 3 ++ code/_globalvars/xenoartifact.dm | 2 + code/game/objects/items.dm | 6 +++ .../components/xenoartifact.dm | 28 +++++++++---- .../tools/xenoarchaeology_labeler.dm | 4 +- .../xenoarchaeology/traits/activators.dm | 14 +++---- code/modules/xenoarchaeology/traits/majors.dm | 38 ++++++++++-------- .../xenoarchaeology/traits/malfunctions.dm | 16 ++++---- code/modules/xenoarchaeology/traits/minors.dm | 32 +++++++-------- code/modules/xenoarchaeology/traits/traits.dm | 16 +++++++- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 39238 -> 44617 bytes 11 files changed, 100 insertions(+), 59 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index e39fafb493025..d6202770b90d2 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -7,6 +7,8 @@ #define XENOA_URANIUM /datum/xenoartifact_material/uranium ///Wildcard #define XENOA_BANANIUM /datum/xenoartifact_material/bananium +///Artificial +#define XENOA_PEARL /datum/xenoartifact_material/pearl ///The gods are about to do something stupid #define XENOA_DEBUGIUM /datum/xenoartifact_material @@ -32,6 +34,7 @@ #define XENOA_PLASMA_TRAIT (1<<1) #define XENOA_URANIUM_TRAIT (1<<2) #define XENOA_BANANIUM_TRAIT (1<<3) +#define XENOA_PEARL_TRAIT (1<<4) ///trait cooldowns #define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoartifact.dm index 9f2dd404acd34..b14bc985499d1 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoartifact.dm @@ -17,6 +17,7 @@ GLOBAL_LIST(xenoa_bluespace_traits) GLOBAL_LIST(xenoa_plasma_traits) GLOBAL_LIST(xenoa_uranium_traits) GLOBAL_LIST(xenoa_bananium_traits) +GLOBAL_LIST(xenoa_pearl_traits) ///Fill globals /proc/generate_xenoa_statics() @@ -38,6 +39,7 @@ GLOBAL_LIST(xenoa_bananium_traits) GLOB.xenoa_plasma_traits = compile_artifact_whitelist(XENOA_PLASMA_TRAIT) GLOB.xenoa_uranium_traits = compile_artifact_whitelist(XENOA_URANIUM_TRAIT) GLOB.xenoa_bananium_traits = compile_artifact_whitelist(XENOA_BANANIUM_TRAIT) + GLOB.xenoa_pearl_traits = compile_artifact_whitelist(XENOA_PEARL_TRAIT) ///Material weights, basically rarity GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 8, XENOA_URANIUM = 5, XENOA_BANANIUM = 1)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 46c33f472be7b..a20ba4f80cb28 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1455,3 +1455,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) else return FALSE +/obj/item/rad_act(strength) + . = ..() + //TODO: Add some actual logic to this - Racc + var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) + if(!X) + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 82543e1c026ab..8f575424178bc 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -2,6 +2,7 @@ Items with this component will act like alien artifatcs */ +//Item presets for generic shit /obj/item/xenoartifact name = "artifact" icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' @@ -67,9 +68,9 @@ ///What the old appearance of the parent was, for resetting their appearance var/mutable_appearance/old_appearance - -/datum/component/xenoartifact/item/Initialize(type, list/traits, do_appearance = TRUE, do_mask = FALSE) - . = ..() + + ///Do we make pearls when we're destroyed? + var/make_pearls = FALSE /datum/component/xenoartifact/Initialize(type, list/traits, do_appearance = TRUE, do_mask = TRUE) . = ..() @@ -134,11 +135,6 @@ /datum/component/xenoartifact/Destroy(force, silent) . = ..() - //Delete our traits - for(var/i in artifact_traits) - for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) - artifact_traits[i] -= T - qdel(T) //Reset parent's visuals var/atom/A = parent A.remove_filter("texture_overlay") @@ -147,6 +143,14 @@ //TOODO: make sure this doesn't cause issues - Racc A.appearance = old_appearance old_appearance = null + //Delete and/or 'pearl' our traits + for(var/i in artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) + artifact_traits[i] -= T + if(make_pearls) + new /obj/item/trait_pearl(get_turf(parent), T.type) + qdel(T) + ///Used to trigger all our traits in order /datum/component/xenoartifact/proc/trigger(force) @@ -361,3 +365,11 @@ /datum/xenoartifact_material/bluespace/get_trait_list() return GLOB.xenoa_bluespace_traits + +//Artificial +/datum/xenoartifact_material/pearl + name = "pearl" + material_color = "#f1ffca" + instability_step = 50 + texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") + mask_icon_states = list("mask-pearl1") //This is pretty much a place holder, since artificial artifacts use the item as a mask diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 65e87fc03a83a..389663f077d7b 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -145,9 +145,9 @@ //Create an artifact with all the traits we have selected, but from the item we target /obj/item/xenoarchaeology_labeler/debug/afterattack(atom/target, mob/user) if(length(label_traits)) - target.AddComponent(/datum/component/xenoartifact/item, /datum/xenoartifact_material, label_traits) + target.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, label_traits, TRUE, FALSE) else - target.AddComponent(/datum/component/xenoartifact/item, /datum/xenoartifact_material) + target.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, null, TRUE, FALSE) //Create an artifact with all the traits we hve selected /obj/item/xenoarchaeology_labeler/debug/create_label(new_name) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 31f0045f67b77..b09e2c491cbd3 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -43,7 +43,7 @@ material_desc = "sturdy" label_name = "Sturdy" label_desc = "Sturdy: The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT /datum/xenoartifact_trait/activator/strudy/New(atom/_parent) . = ..() @@ -62,7 +62,7 @@ material_desc = "flammable" label_name = "Flammable" label_desc = "Flammable: The artifact seems to be made of a flammable material. This material seems to be triggered by heat interaction." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Are we 'lit' and looking for targets var/lit = FALSE ///Search cooldown logic @@ -109,7 +109,7 @@ /datum/xenoartifact_trait/activator/timed label_name = "Timed" label_desc = "Timed: The artifact seems to be made of a harmonizing material. This material seems to activate on a timer, which can be enabled or disabled." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Are we looking for targets var/searching = FALSE ///Search cooldown logic @@ -163,7 +163,7 @@ /datum/xenoartifact_trait/activator/signal label_name = "Signal" label_desc = "Signal: The artifact seems to be made of a radio sensitive material. This material seems to be triggered by radio pulses." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Signal code var/code ///Signal frequency @@ -207,7 +207,7 @@ /datum/xenoartifact_trait/activator/cell label_name = "Cell" label_desc = "Cell: The artifact seems to be made of a capacitive material. This material seems to be triggered by eletric currents, such as cells." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT /datum/xenoartifact_trait/activator/cell/New(atom/_parent) . = ..() @@ -226,7 +226,7 @@ /datum/xenoartifact_trait/activator/weighted label_name = "Weighted" label_desc = "Weighted: The artifact seems to be made of a weighted material. This material seems to be triggered by motion, such as being picked up." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) /datum/xenoartifact_trait/activator/weighted/New(atom/_parent) @@ -243,7 +243,7 @@ /datum/xenoartifact_trait/activator/pitched label_name = "Pitched" label_desc = "Pitched: The artifact seems to be made of an aerodynamic material. This material seems to be triggered by motion, such as being thrown." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) /datum/xenoartifact_trait/activator/pitched/New(atom/_parent) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index edbd2828439f2..b010d0342f427 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -9,7 +9,7 @@ label_name = "Electrified" label_desc = "The artifact seems to contain electrifying components. Triggering these components will shock the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT conductivity = 10 ///max damage var/max_damage = 25 @@ -41,7 +41,7 @@ label_name = "Hollow" label_desc = "The artifact seems to contain hollow components. Triggering these components will capture the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT weight = -10 ///Maximum time we hold people for var/hold_time = 15 SECONDS @@ -63,6 +63,10 @@ M.forceMove(parent.parent) //Buckle targets to artifact AM.buckle_mob(M) + //Paralyze so they don't break shit, I know they would if they were able to move + if(isliving(AM)) + var/mob/living/L = AM + L.Paralyze(hold_time*(parent.trait_strength/100)) //Add timer to undo this - becuase the hold time is longer than an actual artifact cooldown, we need to do this per-mob addtimer(CALLBACK(src, TYPE_PROC_REF(/datum/xenoartifact_trait, un_trigger), M), hold_time*(parent.trait_strength/100)) else @@ -90,7 +94,7 @@ label_name = "Temporal" label_desc = "Temporal: The artifact seems to contain temporal components. Triggering these components will create a temporal rift." cooldown = XENOA_TRAIT_COOLDOWN_GAMER - flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE ///Maximum time we stop time for var/max_time = 10 SECONDS @@ -112,7 +116,7 @@ material_desc = "barreled" label_name = "Barreled" label_desc = "Barreled: The artifact seems to contain projectile components. Triggering these components will produce a projectile." - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER extra_target_range = 2 ///List of projectiles we *could* shoot @@ -146,7 +150,7 @@ /datum/xenoartifact_trait/major/animalize ///All of this is stolen from corgium. label_name = "Bestialized" label_desc = "Bestialized: The artifact contains transforming components. Triggering these components transforms the target into an animal." - flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER ///List of potential animals we could turn people into var/list/possible_animals = list(/mob/living/simple_animal/pet/dog/corgi) @@ -209,7 +213,7 @@ label_name = "EMP" label_desc = "EMP: The artifact seems to contain electromagnetic pulsing components. Triggering these components will create an EMP." cooldown = XENOA_TRAIT_COOLDOWN_GAMER - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE rarity = XENOA_TRAIT_WEIGHT_RARE @@ -242,7 +246,7 @@ label_name = "Displaced" label_desc = "The artifact seems to contain displacing components. Triggering these components will displace the target." cooldown = XENOA_TRAIT_COOLDOWN_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT /datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) . = ..() @@ -267,7 +271,7 @@ label_name = "Illuminating" label_desc = "Illuminating: The artifact seems to contain illuminating components. Triggering these components will cause the artifact to illuminate." cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE ///List of possible colors var/list/possible_colors = list(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) @@ -299,7 +303,7 @@ label_name = "Obstructing" label_desc = "Obstructing: The artifact seems to contain obstructing components. Triggering these components will cause the artifact to build walls around itself." cooldown = XENOA_TRAIT_COOLDOWN_GAMER - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE ///What wall size are we making? var/wall_size @@ -348,7 +352,7 @@ label_name = "Hypodermic" label_desc = "Hypodermic: The artifact seems to contain chemical components. Triggering these components will inject the target with a chemical." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///What chemical we're injecting var/datum/reagent/formula ///max amount we can inject people with @@ -383,7 +387,7 @@ label_name = "Forcing" label_desc = "Forcing: The artifact seems to contain impulsing components. Triggering these components will impulse, either pushing or pulling, the target." cooldown = XENOA_TRAIT_COOLDOWN_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Max force we can use, aka how far we throw things var/max_force = 7 ///Force direction, push or pull @@ -419,7 +423,7 @@ label_name = "Echoing" label_desc = "Echoing: The artifact seems to contain echoing components. Triggering these components will cause the artifact to make a noise." cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE ///List of possible noises var/list/possible_noises = list('sound/effects/adminhelp.ogg', 'sound/effects/applause.ogg', 'sound/effects/bubbles.ogg', @@ -448,7 +452,7 @@ label_name = "Porous" label_desc = "Porous: The artifact seems to contain porous components. Triggering these components will cause the artifact to exchange one gas with another." cooldown = XENOA_TRAIT_COOLDOWN_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE ///Possible target gasses var/list/target_gasses = list( @@ -498,7 +502,7 @@ label_name = "Destabilizing" label_desc = "Destabilizing: The artifact seems to contain destabilizing components. Triggering these components will cause the artifact transport the target to another realm." cooldown = XENOA_TRAIT_COOLDOWN_GAMER - flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT rarity = XENOA_TRAIT_WEIGHT_EPIC /datum/xenoartifact_trait/major/shadow_realm/New(atom/_parent) @@ -533,7 +537,7 @@ label_name = "Dissipating" label_desc = "Dissipating: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a cloud of smoke." cooldown = XENOA_TRAIT_COOLDOWN_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE ///The maximum size of our smoke stack in turfs, I think var/max_size = 6 @@ -554,7 +558,7 @@ label_name = "Marking" label_desc = "Marking: The artifact seems to contain colorizing components. Triggering these components will color the target." cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Possible colors var/list/possible_colors = list(COLOR_RED, COLOR_GREEN, COLOR_BLUE, COLOR_PURPLE, COLOR_ORANGE, COLOR_YELLOW, COLOR_CYAN, COLOR_PINK, "all") ///Choosen color @@ -586,7 +590,7 @@ label_name = "Enthusing" label_desc = "Enthusing: The artifact seems to contain emoting components. Triggering these components will cause the target to emote." cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE - flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///List of possible emotes var/list/possible_emotes = list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, /datum/emote/living/scream, /datum/emote/living/tremble, /datum/emote/living/whimper, diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index ded734aef07ad..e2e4cb856c928 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -9,7 +9,7 @@ /datum/xenoartifact_trait/malfunction/bear label_name = "P.B.R." label_desc = "Parallel Bearspace Retrieval: A strange malfunction causes the Artifact to open a gateway to deep bearspace." - flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///List of our current bears var/list/bears = list() ///How much can we bear? @@ -40,7 +40,7 @@ /datum/xenoartifact_trait/malfunction/strip label_name = "B.A.D." label_desc = "Bluespace Axis Desync: A strange malfunction causes the Artifact to remove articles from the target." - flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE /datum/xenoartifact_trait/malfunction/strip/trigger(datum/source, _priority, atom/override) @@ -66,7 +66,7 @@ /datum/xenoartifact_trait/malfunction/trauma label_name = "C.D.E." label_desc = "Cerebral Dysfunction Emergence: A strange malfunction causes the Artifact to cause traumas to emerge in the target." - flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE ///Possbile traumas var/list/possible_traumas = list( @@ -98,7 +98,7 @@ /datum/xenoartifact_trait/malfunction/heated label_name = "M.A.C." label_desc = "Mass Area Combustion: A strange malfunction that causes the Artifact to violently combust." - flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT /datum/xenoartifact_trait/malfunction/heated/trigger(datum/source, _priority, atom/override) . = ..() @@ -140,7 +140,7 @@ /datum/xenoartifact_trait/malfunction/radiation label_name = "R.P.E." label_desc = "Rapid Particle Emmision: A strange malfunction that causes the Artifact to irradiate itself and its targets." - flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE ///Max amount of radiation we can deal var/max_rad = 25 @@ -163,7 +163,7 @@ /datum/xenoartifact_trait/malfunction/twin label_name = "M.B.C." label_desc = "Mirrored Bluespace Collapse: The Artifact produces an arguably maleviolent clone of target." - flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE ///List of our evil clones var/list/clones = list() @@ -226,7 +226,7 @@ /datum/xenoartifact_trait/malfunction/explosion label_name = "E.E.E." label_desc = "Expansive Explosive Emition: A strange malfunction that causes the Artifact to explode." - flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT rarity = XENOA_TRAIT_WEIGHT_RARE ///Max explosion stat var/max_explosion = 5 @@ -259,7 +259,7 @@ /datum/xenoartifact_trait/malfunction/hallucination label_name = "M.H.I." label_desc = "Mass Hallucinatory Injection: The Artifact causes the target to hallucinate." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE /datum/xenoartifact_trait/malfunction/hallucination/trigger(datum/source, _priority, atom/override) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index da1afb58db119..7a2a88c4822b4 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -10,7 +10,7 @@ material_desc = "charged" label_name = "Charged" label_desc = "Charged: The Artifact's design seems to incorporate looping elements. This will cause the artifact to produce more powerful effects." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT /datum/xenoartifact_trait/minor/charged/New(atom/_parent) . = ..() @@ -28,7 +28,7 @@ material_desc = "capacitive" label_name = "Capacitive" label_desc = "Capacitive: The Artifact's design seems to incorporate a capacitive elements. This will cause the artifact to have more uses." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///How many extra charges do we get? var/max_charges = 2 ///How many extra charges do we have? @@ -60,7 +60,7 @@ material_desc = "dense" label_name = "Dense" label_desc = "Dense: The Artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Old value tracker var/old_density var/old_atom_flag @@ -96,7 +96,7 @@ material_desc = "sharp" label_name = "Sharp" label_desc = "Sharp: The Artifact's design seems to incorporate sharp elements. This will cause the artifact to pbe sharper than usual." - flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_SAFE blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///The artifact's old sharpness @@ -138,7 +138,7 @@ material_desc = "cooling" label_name = "Cooling" label_desc = "Cooling: The Artifact's design seems to incorporate cooling elements. This will cause the artifact to cooldown faster." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE /* @@ -148,7 +148,7 @@ /datum/xenoartifact_trait/minor/sentient label_name = "Senitent" label_desc = "Senitent: The Artifact's design seems to incorporate sentient elements. This will cause the artifact to have a mind of its own." - flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Mob who lives inside the artifact, and who we give actions to var/mob/living/simple_animal/shade/sentience ///Mob spawner for ghosts @@ -256,7 +256,7 @@ material_desc = "delicate" label_name = "Delicate" label_desc = "Delicate: The Artifact's design seems to delicate cooling elements. This will cause the artifact to potentially break." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Max amount of uses var/max_uses ///How many uses we have left @@ -295,7 +295,7 @@ /datum/xenoartifact_trait/minor/aura label_name = "Aura" label_desc = "Aura: The Artifact's design seems to incorporate aura elements. This will cause the artifact to target things nearby." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS extra_target_range = 2 ///Max amount of extra targets we can have @@ -321,7 +321,7 @@ material_desc = "scoped" label_name = "Scoped" label_desc = "Scoped: The Artifact's design seems to incorporate scoped elements. This will cause the artifact to have a larger target range." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT extra_target_range = 9 /* @@ -332,7 +332,7 @@ material_desc = "ringed" label_name = "Ringed" label_desc = "Ringed: The Artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///Old wearable state var/old_wearable @@ -379,7 +379,7 @@ material_desc = "shielded" label_name = "Shielded" label_desc = "Shielded: The Artifact's design seems to incorporate shielded elements. This will allow the artifact to be used like a shield." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///Old block level var/old_block_level @@ -420,7 +420,7 @@ material_desc = "aerodynamic" label_name = "Aerodynamic" label_desc = "Aerodynamic: The Artifact's design seems to incorporate shielAerodynamicded elements. This will allow the artifact to be thrown further." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///Old throw range var/old_throw_range @@ -445,7 +445,7 @@ /datum/xenoartifact_trait/minor/signaller label_name = "Signaller" label_desc = "Signaller: The Artifact's design seems to incorporate signalling elements. This will cause the artifact to send a signal when activated." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Signal code var/code ///Signal frequency @@ -488,7 +488,7 @@ /datum/xenoartifact_trait/minor/anchor label_name = "Anchor" label_desc = "Anchor: The Artifact's design seems to incorporate anchoring elements. This will cause the artifact to anchor when triggered, it can also be unanchored with typical tools." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS extra_target_range = 2 @@ -530,7 +530,7 @@ material_desc = "slippery" label_name = "Slippery" label_desc = "Slippery: The Artifact's design seems to incorporate slippery elements. This will cause the artifact to be slippery." - flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) ///Refernce to slip component for later cleanup var/datum/component/slippery/slip_comp @@ -551,7 +551,7 @@ /datum/xenoartifact_trait/minor/haunted label_name = "Haunted" label_desc = "Haunted: The Artifact's design seems to incorporate incorporeal elements. This will cause the artifact to move unexpectedly." - flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Refernce to move component for later cleanup var/datum/component/deadchat_control/controller diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 645b356bd1df1..9f648bbc3d928 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -10,7 +10,7 @@ var/label_desc ///Asscoiated flags for artifact typing and such - var/flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT + var/flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///Other traits this trait wont work with. var/list/blacklist_traits = list() ///How rare is this trait? 100 being common, and 1 being very rare @@ -160,3 +160,17 @@ if((initial(T.flags) & flags)) output += T return output + +//This holds individual traits +/obj/item/trait_pearl + name = "xenopearl" + icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + icon_state = "trait_pearl" + w_class = WEIGHT_CLASS_TINY + desc = "A smooth alien pearl." + ///What trait do we have stored + var/datum/xenoartifact_trait/stored_trait + +/obj/item/trait_pearl/Initialize(mapload, trait) + . = ..() + stored_trait = trait diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 95a6bc2023dd13489e73987a004b30509fb7a060..ce8646442d389d2922b1dc756cbb3b61c3a76028 100644 GIT binary patch literal 44617 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 V;b1$(42}Q*002ovPDHLkV1ji<(J%l2 literal 39238 zcmV)CK*GO?P)(0002{dQ@0+L}hbh za%pgMX>V=-0C=30lTB;GFbsyz_OB4_bu0bYU>9FXO39)93q_u_#3W9FKeq1Q@8E3o zP*(XMkl=mb0ZB{PACC1Is#7gL$p<|S!r^ow zW8>%-QW)z4DA-8x;n7j<|DutuF?o8{eWEboJ8jC5Z8@@IBU6vTA>S(J`ARv@_emZH zn;c(g2KYuZz*o{Z6gvG91)G}*zLg=J8orVtof^K6A)T7XGFKW#yl6sqKl&zxp&q|M z!Fu)j^iSP>SLjOq#bM~!XY4R^{2R+EkJi70!?}X$RLdV|8%W$=acUv}03ZNKL_t(| zoW#3#w4_IQ=l`iU^xHYy+&9lnGk0>(-dwrUVdI<9|LCL zXM#Zp1VTBEMjB1lXmY$0?%bSn_wC&MrrJLScEuXo2f;ah&UsH)S5@~pefs;UdY-4A z68rb>=ReYZZ?`GcyobD6q!?I$8EnQY0F%CS9KRXX)O{gs!u){HIYZgn|WLK4^OBft1Iyc@v&*7u3NahOt-2eIXoxQ*8#Mi1hjnIhC; zVjnwAF4{)Ap^bce6+&uwvkCkY2jR7sk=Nf!;>J%9oKE0B^gQ0_ev}J?*t&wb?S4wv ze~8lTQRLa9sM{V!6g;?vK1B8+!8i6}tXqSb9Km~-Pl@^xANARxuabgoBBCSle zuA%gB3)<6Ab7T*JGyBocbs?m{)*OUm;_7~!`+lF)!cCaEL@7+6kDkIa-H%erqYDi+ zKZ!jugMG(;Be|u6@>ie0|H3om;~|{w_mFG31KW^z=SI-fGJ@K9La+abV%p`|kuMQ& z{s!9(QKNX7aL0%ncW`&*TZ}0xFHSznnDYh)`~~*KCdoP)UmE)mo%&fyN;3!50GCvY zc6lA!-7JRr3e&2_3$Y1K`3ES^HgQAh4r=8rW$tb&Wtvk}UP_)8HV^lr>bLWy_*7v+23AK3r*;{5_p zP;P=?2DOw&Hw%dD1Xgtut`?%^+*NSqu_B}7$>J>72mv3eDiBx{yx=an4WC)UtCvH* zpYY*Bn2{iaS0i81D0}T4yfGJT)y)(_2ITtD=PzR>hnYxhLf`y2^WG47PnuLD3}NsO zdT8xYaor60s_Q7M_Yi&jWx_|_K$Ik!EFw&Y(&=XrWD8)!ZF zEQP`(#j-7!bs<#cX9V`|MG>HjB3bDtRrer9k465@7Ayyv&Y!{G^)|-&b7;~*ssd;I z?f8$pj^)mi3zX38DMTj0e0eSDtq(vEg6R?-YYt6R5?kX<+i0?SfE=(8+)-+9c-3COfIUN#wv-0<1Tk?tU-P}n zm^I6?;wJ79IgpaSR}J3L&oU(j=yLWm;jZB`vYj2yd8V?97?&0U`Y_K{e26S38QJC&UqktZ5z)`|zxoMmQL6os1&Vt3HS3E+lu9jf3 zm%w;8k>n99XB~ycIH~3>7$;sKc;z^DT{EJp6=S{!U*BnDG*4mmN033Vq=RG4qRdZW z*55_c8Nt+w_~v`Cs^Z9|Ff>D=1!|!6p8%aI%1p@E>nDF#T{JYMhT{%SYw*SF=WspeX6s45S(nOFs@fPJW0>ptq z1Ud)xE>d=m&QzF!bD0sXgE4&sAt0VrK)J}AxQ`3o*XTC(kW;caiXbJ2QSvwQ`Rrmo zR4fr^1Fr-Jcvm^g8SeoG{a${myh+J&Igz*vSG}F9krF9&lAKc_BweBf4U3cLY++XW zAu+9%hh#Iz^qSE#?*h;RCNMJR$|vSA?~e{RxIgfwaW294r)6 zOoZwqvvwV$cmFZgnkd%Q47G<}C9`-lju9ad1@)HI=<_#GbLb6<&Nv=_6esFK%;piA zA6e)o^yVwb>+dJH|0if4Uq{}s$v^lPOfOhR&Cnb4-LReNGvm0uLs%QUI7T~$nZZ_p zf&xc!5Db7+Kmis&ch!fnJ+ShdUqe6rHtyPcFgtI=J9Q5I;(1b4I@9rmB-IjHO&cvr zD-SwLC>O_o&A>9?93V(*7A^{Fiq+Wkb4U!55%cJ(ibn~6Gl`-o%qw{^XsVTM`3$QH&79DidE0x5t44y9Hjkk>q{I=%_za_-Z;`e#6ch))YNHlG zk(WV!jG{==L?@Nf2J-ZaBBq)rqWLg{0GR-`)6ELTP*}wZV(vcvI5*1*xrL|w0~}Y+ za=GF>&uFJGiWQU-kcy&s~`4xV$96yi1XU4JvIE{9f-NpNi#{hiOCWCXQG50eW@WKohUH*j|TA-RqX zR2}&!v&tm1JHJll*dYcte~f^o(RAWRSmh1)2OM0fq4@n|0}IJitiW$i!rKn*7vCiE z+}F`sms6_i09}y7rDx|S;9(X15!9qa>3tW?6=cK|)1Q8cxeo{yJ#&QkcmEt^#{)b# z-$6uq7u;6hF0QQtZ{g67rP{c-c!&`aIs7t$$1EeG4UsU4xOOcux0eNWJ?E7OmM4uz zF+hcRZH8C$*BJF|@=~igG5drp|mK6y`TlNaUq%I?Sy*r*b7!M*SrQ> zb*b!ohw#2#Z^V#AGBN;$1WiB;WEj%2iH4Isq_6)V!RNnA zzNL}r>pw)X5-NVU7d0M7jn@$B9mN?OBz5l^3N3&HYe0}&b30?Pa%LBAMXHtLG*EAc zvL}YIR=3db{43PX{t&0Jj(F`cgtTz{VbYBo38$v;I2NTl9%6D;7|(c~j9Nwe;89|) ze-}0FAkUn{IC};+Vo;WKSe~8bod3VlciZn%-L@Rz4dVL!j0BfpeiYc3A!qogv{ef4 z?&6Qk&jQ~89;Od3aWwo?po*)2gX6$Cb)FA6Hun){x3z*(4AE;`WLIfBcQ}LmCu=oR z+71qxZ(*t>4AqCG1~8QZ$F;polwIaPX$kFxCYF~rvBF)3MS(s!g+H{AZsTjD?RmVq zilewVu8R~lpyA3Apfjb+(2vGq*~)4rSX=DiZD)#$p+2r!Tj_Ae=wOZ!Dmcz8KP1o1 ztYInT)Vmk>qf(YnoAqRs8%QeUyrcBdYT2ldJo3nIEdF0|iGEFc>zT8UPO7r>sXg-yk zzXsnM&mdhBt#bi#^-Z{~ow&^{lo}T@8*8U@gGwT}fP|-xRHzKQ5*nX)i-mvpB|P3r z+{Nnh{yyqcg#@8z`bBJYMTu_t_x*CP9PRXfBbMbhUv z%sd%XkA@JS34@NzLhdvrwrJxgv3HpgVI>)h;P;rXd!qX8?|ihs_;G(%WkpcB-#N&=UY zXws$f&F2aCyn`NFga}n*9Df;k^SyY^pGTDf38>ORSY6n)O(d%pQPRDXd@;0?NyC93 z;8r&<{E<#(+a5+PzYQ&@BZNgETFF@Z{ful`g0v;{3*ti~R1X}da^x~)17no^?3)z) z4$1YOrc_snKik8nu3ki8A+xMu7|Akxcz6>i<5{1NUagDTU@H%#cLE1!c2lf#HsXjN zy<&=!+Bk!b!4{cgtJO?V4KU=)F)!y(Re?_p;Z;NEsu!Uv6m^rVlA|O{q|ou}b&S$Q zo;<3m-~xu?W7*s)ZgS@Eh$Z|i)XTW+VLFgt#E#QyE~Z76xXBR+!kkye*kg<%siM)D zp_x4GbTBJiE{Jh1i5bp_5*L&TrbGh+Eaaq8%}d5_umhNnR6K4zQt|k2B7T6~1IlBT znZc>)z@Hq!$yyX*jg&lLX0~slP*s7y?>xTILEN$yu;WDbUnO$%5|LvU2=70SH5_EtO)OAIB~yG}Mja^&;H@_LheS3`ggo?+A@t=n}U z^om(_)6an6Wr6FZ-ko8Ih@lZ-R+Jc0rWjGD>D7{4HYT|c>F11c>iq+-ea9DN^AFy9 zZ0M0&ej^BW4T#6wyh^sdgK*CoJm=4nY}<(v4j{4`;qD7W`;Q^K8lK`T%KQXo`7&~g z7Gu@5VH7-+ojHkF3Q*hjy`&sV*7S7<&kTdxpI&fg6N~CnCV>1Tw5Eyi5dJeeF)b=Sz1HS?Hf^M$|)Z_ zPGNkAi#L9iWM?(rqD|w~y;O9+Lohjxe&H~lP&{ zHN>bpP1;Rhs|6gzL;yY+CRnPYrPPV4NyeRiOwuTdBrGdfo4bk6=GIan-UfLm&-w=# zGcJ-RPhQE95To=MJ?t}v8IwU4yK%O-2Ab;OC_|j{C#i5FEO2I6C>>g4oPY?TDn3fW zC83Nn=NlxWrQbgQzi@$m(_LWq<aQZbHbmLWuOR#yswYaZ)MnBM$33@3$(z%<7&`ld*< zt)}YeK4dYA*B`^lUxHMg%$n=T-w;J+u4O0f94vV4$LPg5%<4`G!D{@;VJyvozx`W^ zW%rSID28{;z~6O*V7s3gt%J(x3xuYwAf^W?HZ3B*@-}?V6mp=4K>sd`G-Rt6A@5L` zyLACG%Rf%_=_AB4{aA{MZ~sBchF?OKtt1;Rhh_j5&mIpIL*0~`tN85s?Fexim3M&) zKm}v^?R+(KnJ&)>RF6tcp@ne1f|M+9oDud=?=-@!;&v+7Bw9J@_OMHg(XFV|NI|>IuvC`V z?pCu_u10eqxQh!AFnKO{b}m+9io%r>@C^XilM{W=weX?)N81LoS#a(VfOn7+P^#Lj9G%Xcuk z^b^e7`VlgBExVSnx-72!=FK37mJ)dK%gByfDQvhCt8FO*O-tY=0Z|2Xfs=={e;syx z3+cV5+2H(V^0Wb)Ii|1U8=)S_3Nl|V$vubuLo7{D%*j!Xc8T1S@5bWiQZ-~>X zAn8U}=o;MaIG{v$SDE05I!3cy$6aO>J4-95w`vGcjf0PpogryYko6_`{keKp7uHgi zspY2h3O-kCXOY|uBuMi?zEO6ZGm+h7vwRc-g@+ zb~qkVN{OS&FsJ?VR-8O=KUsp1F#}L=NmFdgT&$%E|gW zu?9scseSEvLVZWE z%Ht&OU4^*}lsB_f?0=K!Y#+8(i>AzD^t^)=EyqmEQ}>sDjsMgoLOwrgB0;Vg#))V& zfA>3h3kqh#b%f6E#~7Q$II|mb`Aw)1FO@S>7-vpUE60#kZG`9h$gI7aTy+P&!!MED zd>@IeF_>`hT`W;>J;q*XVwKOoeQjSv#g?@Ap3wQSCrfMv$9j{D}ROwIZn|o;5a6lq7tTzs=@-| z=@x2>?UajJ@*>40E_2p1%wl&T_nHA3l{jaakD9%Itj`MRpNP;@cq3q0oLE)2misTz;3Dm!3sQ&*N6L;Ti^}EJ9Tc zR;dxsg}r!CQAHJIb(E^zyYLl4__8xde@K9u_8)n>@3RMAko9m z;mlnnz4~J)ZP#HseT?7z2+m6IKQlw?H@-sf{9%kxIkA_X#@DkSEf6QYW*z$G2x_LC z$`_u+>N$s~Sx07PE6z>@IZ=i$J&GG&1Fa1>OruSW5*ay!&r?At+mF*Tf=Eq3^8)PJ z4u%`ok+{E#swYDGq~Tm{Xo%N_LD}ttdO4Ml3ZzpE}1y&lTPd zo#yq>C|7eWtW;Jb_V3?M_m1x0sGQ;b+QR({#qYiplFH-|`EVP$J4r#SWp>*Vs=E3J zWpm`!BokY=qfJaxbNFREdJIcZiJm=-lSpGX)FEQE7-x1P41-c#3(4E=CV2QTcExJ& zmE(pA6m&nPEMdhKqvmI+I`$OBT!#E@A4L%rD6@T(zwiTcn;t?9RpUSMWu|WaYpAKG z?D@aLJMb>%$_MZ|!|12akgV|&O$eq|E<)6o;l{V4B=Tef6?h|p$$R3M3&C>=%AX%1 zm>S2CbIdf|iLWq4fMJc^h|A*BObZX>zmI<73(291K2a|2X8{TC<$)_9WQ zZ66@H_)ezFYiU2X3vu-O*fL8_O@Oq~T^~WSmOCd`@CB!V3V9L815I3uW`+S5#B#c{ z#r)8FjzhkKBz$8yY5`sN=`6113sXzj?v^k`g6|tHFZ!-9ri>BR0<_8H+>uzpoem7j zJ^WK>IUi5ojVcw6YL_?=yhNAhAX8$LNU)A2a~r8D8hC`klrKxKc7|#FDnfy3*~+5) z4wmNI2+ANs>JUA~Y5Mh380g$$Zr~5|E2wnl>Br9t-eHb-`x!KPuq>N8rQ`pc1V75R zf2-pDHjlFA-xxpj^H)`*(F8;;{}fb-x$2XMBp@xw4H3R@i0QI=*xE{>eFOTq2hMq5 zNf13bfHBpFa^)gsq#Ct(Jw&2-&s{;4I{M^k3N`ETPhY}mUPfxcdh8XT81>9p4-o&! zpEI$f1G!W|si>e33={2nhxm`bL8e@#YWNgl`W(uYljK)j&-|8;5dZOKu{#>bZvU^? z{Vz~xc>rJXES`&J$v3s5F0Vy7{2JxY)-d^rHCS=5t7-`DdjfmlEXj}FM)Jee1kT(_ zVE;Fnb-nl(-h>+pP-*sHddnz3_#-&89a$?Gu3LxGq2TK-P&<8vQd=ih<4VL_38OTI zaOUx3rwEni$+ScnC~u;u{T+3G{V)OrAzc`rL=hTJu$-})S{xTF#X?!XmbI@081-Gk zl{O7lBRjIyeB8;S&`(L-#FJv0VWe-cOY5qoT?clcsK;i19`UiY-|a^MP6=Fbnp=6*2u*cwj#T(qa&BjA78 z{@2C+%j2h5L+!r-zywh7NX6rO&Ru@YGMdn=9D$y0oNyVbrcUDLj$n%t=G;7UtM9}T zS=zt!70O*qQZ8|3u3}YJGI9SOVMZZ* z{3ZM&Gg$sGN-W6iZ7VQuYbKvsjP#b_X2z*}>N^;^L9%Woo(xpK`Z{HAy^b)8IBm_$ z-_=CczaG!nempn*8HzIx(neKW6ro|HXQ{q2hOcjc*~*1breIenBwK5lOV`l&@>d8Q zc@wqgB6?pR-t%XO9DW9&+(^19Or|!7+ITa8cb-E7+?A^-th<@f)whtp)dzJD7;sUY z63-mF2cr~aLtzDWgva?iAr@fLSUdGiS zdgW=}@m--?bTb$1V@kQq45K&#w&d>N>(krV!ajVQ1^}NS)KeYCFR%#akF~{l5&rDc1aN zA-`Arzt|nV&7+)R%`eUS_Rs5p-rM)<0PyCwPCsUOY@GVF2y2RBc^oSkMrMX6G;U#T z<6W2wRFs$(@4yAZy<_O9X{4FLtXM#LRRyIL3Z(@;is5R^l13?7gKr+=-DK*dM5?TK=lB*IYP(xpjP_GG`Hi%o2dBylSH5UDaaCPz=zqffw_fE z*ju2K>m)Kag5y!hl`Ta}jT5?ZfI{nyl*;_{#czV&Q=rG9^Ub$t{ilDR?%DqzV{RS* zf%EgnMRRS8vo8`>8z?xPvg=2=!%Z1Wf*j?aK$&wl&GP@>Llh~V2#^Bw+J%k z87Hr$C@ERy^l1i+ER)41*11bj)_Gtx-1HI7>aq7^(1OYzJl@Q%%+nK>+Vo}AKvtwwQuAQuSS zh5$}L#at7oq=wOlucGK-G-(kU?Ik)qNqPSa6_?&Zo9M<9X(b=2C%e3k=&l}OyPiR< zYi4T4=LuduKw-s4@g=TOz2{r__rHyBvJff5u3w6tnIzq~20Q9UA&J`Gk6pK!bX7Uo zjT@=>*^eoE>m^j(#pzf?>AIV-Yr>QYb=YAAO^H!+>IlZ{IH5gHpr3pfK^C)RErF3U z=s2Vn)q$f?v+oGnTpyYWX0CvWL`Pr?1rv#bz~h46b(ji&p6bg7$kjE_`@k2$A0eCf zA!}7Ali-nNK#@$*pwcR--E+Og+bh zI?A9nMB1(4CaV@*cH_7!xnRsQs}7TQGZe^>^(C3~&of)BXRCb^&<}DK>*++vuchCe zqs87#SgE1HZDZ@)2l(>*9aQlnz|TH$179yc!?DT(3`MTe!a8>eUY`HuYS2gd z_AjmYzv%nd?6(m&DD`ECbP?nH(|88@u>%rW-AYD*l4k;2u7Xx@b;u4E(ONfQHf*Cn zkxX?9#dsXo54b=9+#0TxGl!w@;99123+<_Q&?7B)G!1Xh89Z;zB4wUZnTKS&lU#cz z%EdY2&wK;DOp@zdLuRQTarftOWD4DHA!?iP4UJ+2%h8wJj8tvRSOldoOZ_WvUKW2D2nwZ9W;S{A6t0;DUkZgSiMLz`QC#bz}0PDmQd0!{FvIw!`Z{Q@;*f;$l z^UK;vR5ei*3eoVbFA?u;W^B#xaCzD9;N1CfyiH*5fhEWO9$(@z6KlW7SY0Reg#oG$ zd>6`UDONQSe&TD??tKIMzx*8&pIZr2F8UiLm5D2iH!XvY2}V*M;K$#|^BMbgl9-IC zvwSalfrEhq%!qj^%}ScmD_Nc0LP+=lFNJ7>OG+M)0M>6xZEOZrRNgy#9PL_u)@M`2zF#$??u1MrL0{}+D!uY%#*@2UO&RdfIE9pvA$Qgt<^FGkiI z#V|)nwQofRz<0ct;IaLfz94h6w^K@oAr_;wW*d>cPcnDidgKb@+Lvg64`dd^^tA*M zRUo|J1|h$soy4ORsE2ce4?ls=6UM1sj_IqX{N=wwcU2s%6-W1w^u;K)uA%0wqZp2cD6c{3 z+eg{xWi;DIzNU_B;|LVsk`Zw<>0mEfPtnOS zx9M@lRtF&pVnn0*(oyt+P5%0i1h_G z-{#7Z>yayUE_~`ASbXw1I-YwGyM8An!{S)s4gCHv9#zLxz;Q|lDanXAu9od15$;8` zedN>xDSeE*okUS|RM$@d9}oa}iHAzJkjNG}MhU+$jcNy}%B^I>>?;0%HsG(X{ZZmR zW<`KWWtx}ld-b8uPgw7^RDZb43D$ zQGCbtkXv*IWI&97tOI2f!Ux7s6IraX5c#csoa!jrIgkUh%&%<6sr>}@xlvT53|tR( zz)xx6^%QFt6F&O`vbAlPi*`^9HWIt=F8bssO3=VlO5nVDk=XaXjwQ1cTAG>O{#O)M zFQDq+tGMng^Bp%LHIP0Zn(IM7_ZG3!r*Y~7SgqU0ggPkdDzdJHnMeMBVwH|k5n-%# z3&uznp=bV?Am78{pn}O^j>6j?gox%`fHxWlf77qi(6BV zThW42T|sznAO7Ams1^0p9DIS)lJ#i83g{ZgsjtN|JVV{f&!U-QxQ>GI6OHupP1wOY zd_%`k2d1gWUci^PF}-no)AQupTgk5c2j$0nb_Gtvn3ABN3 zwBbwSmfb>O-nBj)GAl<0)YZ3k4T%Nhh4GWJzW@>uCW5f*DHk zDc0k#-dYL-fG*&lfO+6f&UiNSgWwTP8HdRR#<8+#(!!)G-j6nMA7Ek;K&OFgS2G>p zXL#i_U;!%E(pb}6OO4)wMLQ~el!-c0Vv3ZRBCBK(0z9rx)UKkjw4NIi%lNFlk{XVH z*au1+LoEG|j{y>Q-%F_}hJ9rbVycKgGlQ%%Fuf7foWKf)(d;zp%rs_9!>|lQv=Mz| zoU$uP{K`1mY%l6r2NNIu$tg;;b-0b46axVW)gkmM?8<2x_q~Z*rQ@BMz?bUBiYlm+ z!vv#ml3KEr+{2r(b6FPs@SibiD{(7Zn7R8=CR;XBs8!H?;F%a8dgUVZ&pnA->BqP@ zf~(9y-5_MaJ3oa|${~e<*|C;lEDpMXq6j>r=kc97N@mG23eAg=bC8bsNQKwo)UBg> z;{?&6lX!=&;3_3%tK!V8-j3S>ES3;})TZdQd&?JXyk|9P4ql|_OfvGRSIDhXz*@|L zqwnHVO{^u`aY{3!w|$b)rHfFCu;!`1ApGtTEZswTV?A|!Wq73*ucH&nS8>z$20kfw zuz+r06bh9tlm#q?2lDsmD(mn=lq0UZV>s zN>mkFa8;9(K7&+1bG+2#7PBeU&V5!jE8St>D3IrI(1XbL zQgQSh(ybc_jlWH1$p=Vpy@gEYW{OoBsttitd(kteu$#6pbw@c(FMJ=jqKx#iZDcBg z#DDnTF;6{*weT*~Nr=9F7N>0iGIbR(oknT94ty>&Dg@3?(ekywLLDAQ3Kwl$1=mJH zA_tFBHhmYCN5j?>lu(3Hd>yIUT6}Zk#JUb*n)A#&{HJ7AwG%vXn2-$6cJ3glrt6rg zUCMMwVRGG8#P!!>cvF=6%4t3HB9SM~V>h>xjkPjc+kva8NYx}$Q_kS^OZZ>Jy?2mY zXPxi;IjM7)?&-;Sq|r#4QO>e#Nwy_f4stfwfH4Nc0t}f=Mq%7IWX*8M{X>#sKo#RROk7p?EAMdSt-@0$rcGXl(O--LZea;jn!XPCPF@0jX#k(H+Ln_;%5*YgqE zPZR$HRLlpk3sK3RLnex-%C$(W#z7FVa>xLdAodk<05!l0rdh<#or4@KIZVIv40HA< z0cU_lYYipoQe?|u)QnR-=ODrJ1lhn7?p9t1{EkuQX|hTJTLO>j<}E^atZIUVI?7U2 zl%#_gRuL1hO%s1If>U0JhD=Z|p~0%-vEph<*bh7oEC3$m2}$N`$=m3z1Sx&||2YBv zPY~$;4ea^<+Ce;fUqq^lU=I$U>TZneAo0els(PaAl9-=yq?m(WXeqTU*Ew{9doaTzO}M=vcQ z9a=*=SWbS)N+@^YKRk=8;KzGuKg!Sm+43;?>ZRCz74J2uc&#_Cs4)_o2C z+dpFV)~}JgUlR8`V}es5@{J+t&-{Y%b)RN(%R^Lm?WVADA^&FlCsApP1?Ey7%GA@$ zIWp31?2|$ql}0dZ2Wzc1Zeim!sd$$u zS0|Q|LMu4_k^ujECIA2H^?x3o_{%G?xD~r%36ax1xM%hltfOQ`!@ z0==iv1MgxSa!_pBM5b*w*}4VTwP7T~z-^kSMggVo2nt1l;(L0spLqr?U=WFOg} zpZsFT)U;Fi)Q`w+EhkmAj+qC(iQLeDBbEaxMPRA}xqpmo$j#in-ypWF4I=~LgKy(K zcK|cs!d|%p#p@+^o-CSbQO4P z15(z87ZS{<9-JFK!%Wl7%sRp20V4-xTho+YeHvx&i6Gqw*Z z|9z11(N65_6qE7_G;@x*JO7TMudf2r08<990>6z@|DT`4^qa&s{WHY?RP5M|?S#%|pbjp?+pDpEMp}G4MTWiY2i+nzd(`aXiY`y>Bz(>cHm; zvuI`=73nH6T8_!kC_|2m%rZ%u1Wv~UUMY+_8^&V=Sz$M_nReO<0V&`B@GNi|11Bo? zaDfO{0~16&-6W+bl3c(e2Soz3{$DO^|G#-Dl{M%E9m_T-I4sg_50PEwMHvSF*btgj zARG2jcJeH`+hVqM4T)PeQgA@%L@!!u4o6}TrKSw!Y6r3bAy;|Yqkj){aVNtBF5(U1KAt7#dzTemY8Y@+I=-(w_7aF;fr@2Y^L zLFrFU5$ryNU2`4j5B`)~34|x#q|{1@y?7jMilKIf+wMSaxDT&U#FOg8HPMNCATE02a#kGhwMO=A*C+BX~YnY@f^ZzxdnItooa?iagt8X zGe%s=kando)GVe^#5Qb9*`g@xn3BRJ`WchMj61VDRtPZVTFBS66ZANa;c|Ito7lt+ z$;~uV&r#ztIlqZV>m_L`Shj>_x(KAJXiT(oo4JzhR3igoMOzmZXOWrT)&(CbNy>2& zw1a4t7e#UaG7j7G-@h?d#VgNHRBRME37QjCvQP)I7+6ehSdCq>8rLk~{XM}WFQLrM zQH+8u>y(^6fYY+b6>}6DcA#2^aQFA3m&dXErRc3?@K?NP2<9 ziWWRQ26C>5v1BpRO$!O1JH>4MI_CcB9_GT3h}7WIGn9^WqkjGOL=K9=4Hi}uhi6tj~i~RO1*LHl0?47XWpI^gUG)XH4iM3y*tbd$9d>nWGNvzOPZkt@n zC*%^`w!*7Y4QC?fhs(N9bM8f zF|jG)H=IcMdQ2;ar1X<0&M>2m(NTSrR3=I&YciyC(_^pU=jsfXU5D{_H5w8tXiF_- zHEm3iU_wnW?HnSjOrsbQA-k3(bDP*Tw}MB^>+muN>_X~kJz%3S#_tg6i)Co1J)uF5^9R7`t@|a`h5q)x_DcA3a=- zQN4=dqMOOCQjp`<$dxrRS=)|1-c34KPbvmh-xQ1A{0*L&NtBT&hLJ(CY-CNPm`LN= zb~ARVA46J*Sxgh2?IMiDjIs(v0`2^H97djE_j$BH1;s`Wma3u_a(IhTVvZmKOV*(o zc{H;~pyxQ+!Pm(LA>95^e80<3^5Rp(U0~h$eLTtIWFi{~U3-tboArgc7w# zl7|D*Ir^MYdPDCLRj*-7Dhu^ZtRGvzqt=a-*~jrpcTu!c6mjDtiAg1jv>mvUjJ+6@ z945!eN(U&Be#~}zCCg_%!<$+?)Am*B<;sY>!sgd6cntaj+QPGJR2pr zw;N})A2b=+=Oxp&6y?HM{L!b7O$TN?2}^3QisK~EFiP8To;`yVT!?;MIhG6P>Y(h2 zuVGsSY$H!n(UICWqD5-a29FSNkCWDKqT$D%!BHI~H+Cnv@&;t30>jr&;->qt!nFhr zy@1u-O;IgkXV}Uo)OIr|zd~s`hCkg$ zu&)PG_A*^jLbP%v4e#xvaNsS}wR^}l)Zv^Pq5Rn&kOsK*f1=nOB!lg!Q##rAj$+^Q zLtF!Y5a6{t>Tf?CW6W@!Cpo}|195eo#L49*Th_1 z%n(J@B~+(M&>6yMtfMBOaG$*ylgs!xPm82*cWND1)1Tox#=kLE-c8cePfE^FN>wmA|J_S_Q^k*vR;Z zVX~hBIovoI!pT#-NK!50m2G6BjlZ?_khM{Ac@8aQ^egfW&e4^}SX0;;s_214Ovlo}Pn9o%nq*J|y)8$1q zUD!sRbRo?$V?95byPH1!ZM>?BAB6IBx-OD75@K=$Eo+_hp04I__WFT%0^qDXPvITZ2G~599-64_B!Tw`5BeP=eX<3cLUE5(M25%g(85ja92mTtk zX}yF?m3a0K7HXNqZ8yP|r81IjquVz5jKuGsx43dtV$%+dP_UjKJ>0_FbJhIgfh=FW zw~~rajlh(`=m~=#JY#WhYZHqe=pp`0H7{OE^8U}ds9lwTfFa$?mck)`dpM~L4KJYK6aClN!X)lT-qfA2I zZ)8bQ8HZL18M-^e^1}07F2$zhcJ6r{3>k(TBP)-}InV>97iLnOGSoSKrl; zej4DpNhc+S%5f{o=f6?Gx;0Zw{kxlQy*|gd=|$2cQpG%TJ~wKkvX+;98bwt{D@Mp0 zWfVL!B<(1&N8yIibu8y3pL0#pogb#Xa0_2G??jjWfzNAcu1X_F0gcA#b<|~65%)~d z?Rb-JF7f43AK#0#>jWGgmd|BHfIc-Snh;(32LQxYwY(0Ez|u(>6y>!sv03 z7ed7nh&aIKhGYSHrXYD3&V}Hf^)|(nP2V(_XAwqW0rFMQ>40Sko9ik}WCcteBtryO z21pw=jh;Ma-6WSRo1`D|2cg>rhUo0Y001BWNklSzi4>R$)M*wT zKNyW*&w$zjTiW6Mt8Jb=0==ifs)yQUC`vG?L*W|O3e@>+a&eoC2aGJ_8!V(yp0PA! zQ(#SjTm(x2(+_S3EG@A)I06${NEF0zGI5(w0Za=DMMzJBISAPdTyWcb`9YhvYGCM? z%_SeSg-x15pxaQY*fcc5<>NM2ri*NAogmi|BD`Bhd#8f%>%ga`Kr5j(prGf2ERGZ? zaZKZzYNIp-Rn@(4Er@-k9Cb}E^$i+EK1g#0G-j~RH6krZ!NNF>flp3195hnK>@X<6% zy#vh@AHSB_$VZsjQISv-n|Ev&;(HgLr=0*XY-a0T!x8TER`-M!4^6D&z> z;-lm5<6hQdC*cd;N{)wK<&b%ZFICI@$M}PU<;VGUwg&gm|KJx|FNdW;a?%I`9UVwv z=$e4jS75jkY!@^xg^jCVO$~%RVnk|hKfGu_vJbjPMG%--kY+{omk_}oP$1%lt1~c~ z2762dzhr}?1355lP{KJr)Chy)a3KU2u0qdVNZK&e3IP{%bb@^mO1FWeKve`h6(Er$|2A1YHMR0!adA9aIKjY7WdCNE%>?V>p{( zWgA#JoWBO~G{{qko#rgD5rknuQ3rVpqzstd(51u64e;1q@K1BlaYB6Vbz5P54a_EB zE(5q>E(T-q4DQ)l2p4!HSiXLw>A|5K7(wO)2o}P?ixs*+iJBH+($vl8!T|bKi0omo6r#M}{FE zjC(+~Ny;A1kmI{c{LqpH!vlF8PlZLR2l}(HBB8+AD8xc=t_nuQDmT^-!p;osJuxyr z)2ULyl`VqeqB8}OQ=+}8h`Y+cLvvx?%4JZ$#?vIMNy7O>l&5Q1L>1@sC|C+kym%Q# z;$|}Hx6vF<#PI#Qc+5MIBnfPbnqoD#O6$P>38p>CchWcUTK=#2ugEi;wQoA>&OxjKT@LeCr}ya6qmI0|~HZKnsBE1iuQUUO*N%{?-;acLoNIilERG z5lq-3xb*;N3t&YZtg3|{zX_R3V3`PGa~jBkWs7^_QXy`@;#%0=0`CpOs}Yzy0OJ=y zsR4Q3{A>(>LjsQ*8a&{2!;Om}tHX)YV4Z=+J7DuFSWyGVWN-~Z-UeF|1FNI^gEx?8dcTk32QSUDdqfnj#O9Iz?R_A029kBPP z#`*CqU*GI!;qoMxubO}gkrY(90Rx9K&q}$Jlf5Q4zw3w1aZsFOdmLQM+T2hgfmev0 zTr7hZ8_9Mncp7DJX5jihf=kj=I^B$$7Dn2M+M-kDQZZ5*#|MfmEvP(G$e<}E>gmt{ zY{fzI*m54RZlR7Uy38wBGH58+Oro#|Brq+Bw3Y>ZBR0pW)ED5@{ERqziOMM&O#_uT zQ8~fA=KE-$`Xc`ld7hKbH+a7MB@W1ksFm9YP2S4tVha-t(lhlA)g|DQA>e`8M#%TT z;1FC1L2Cs>ydsDsTU=AyfI=4P>Ogjb%dpwv1UwQO8(}U1`69>)G}OTEWpHj7-a8M44l(6w z%OGX{axB||yd{!ZYlH>Wkc+_ZS@^^2@W}_@<9EW-PKX_ZP8Y~tFlIolgvJ_JS}j8$ z149}Y3I^^mFQ0Eig>p`vba3WC4J96hQPp71VQ}Y7 zIxJ0!He2QBV0?)jvQTLmrR1YNZXS|$!wLr>MWYJwIaGQVxc?DuBNnOR0v>~Mc2DofgO(vGJ znZ4wuV$B5WADE$PM&&odPT$Kj@g*FL zbZ}McpjW;`&X?t!b(CaU2Mat3G*`i54SKxL9Rd9e98bgaB<$D%D=XpbI80{*PL_cx zKh%0)cr{2KSWyd)ZHFsy*moH6T~M_R>Z>4?hMs1yI{pHeBp|*|bco&s@Ut}RxgP%Z zZg?sP-A&-sVEIDW)&e7On2kZv6crdrKoQ#p9O8c!Sxn1liXiYHlK0Oq%LYXPSp&so zvwbD_B`BuF`!xkFj=}yjFnR^-5plklg5%isUyf6-K(V1R1k0O5*K{k;^$t86gfBe= zpS}zJ=!4!qC{BU423qRjp{)>5B_PW5oSy+to=Hn(AX;EoTM3&!F@m~h8WdAhaa7iR zx=4FXg!ujnX7fc>F0fHIr>Nc#gNz1#mFRQj{KIc-3R8Kqc9!q~`1Iv4ZC@Rw?dAlF z_gB$%O=10~^E7VEGQDppa%vb>r$v^hC7K?XV$}@%=CVX@rvW5r&}{bHAQ9d*0lh(3 zI18<_u(6!VzEY^oLGvu2pijw+>v;l5oOs*KovmK92a^22A7t{425$lx2`?Bw58v4Yu_hWrbyUz2_KG&ho9gU-1uPAEQP3FP_bQkPpal zj!19tNQKM~qaPt)1(7%a_RBaq!z2279vQy__$;r=C)lU;VVY?aBgvJ}5!Nh$o0fp4 zifesl91fPj+gE|&f@j{bxbOM` zkwq%E-k0Kps1x^rWD`*dmn#yWDRD03Wrm} zV`cE%6J_`JqU<{DBh?osry6M02};}J(C1<5WGUsh7olkm?z#xGLBTa@(=h90pj#p2 zw%M_~oS6}wYk#Pr#W9MqYmA!hqma-9k&1ayor(j0DndZeY4SkcQNXlxWZOxON<19l z?%BVmp9@U6J2@!7#MSx^c8+f3OT{sMKD&c2_%%+O$9b$_hR;syWK*FY+1`g(2>m>; z7bxKltByMgrNA_o=;yiBu)Q66N8w5oGz&_D@cH}TjpgvC{V?_xjH-y`kwDoFSX3+&saZr2#VM6};PH;tL(BgOd?( zOK^P@R!u-rgYE{3Nf%QCSvc!Nv23b-nF2#%V$MLJ$n{k&aA>^PKSR%)MJA!(m37Me z7K2le&6s!==2$W3<)0@<7#t|zlr36aC9Jz#&Dsa1s9ljDc+)IFuLaWqI8evqFDZ0R zDttz7q;2;oEQvw={L@TEBJ{r==0|VaxHAqmyWE`dxOn27IaUl*bKQ+5rEBA8ZV6-D zg?FL^RaPV{Rc5AGAVeK+C|8I%qZIT4-h2rTd_b0ajTTPE?xWvc$cXPeF=>?N%l0xP zFXOut_wq!>;z?~4FFLyTT>0bNICnQ+$$pA}y$|eTKmvm}GNbcz8>K9f+GuY+$leY( zeqIEHRRl*EI)>oUEl}!%*Ml%L2xbP9CfKk98Uk=~01Ok{E>Ja*9J5nkj|;`5Iszqb zQDFlPL1J^vS7k&%H`IfXgj5D*Tfsa6qZi>F38to@vJ`5=5OTqWCh$50R!?T(xwCM3 z0PKE{t6(MzM=l9Me|Z#&XTY@#YHC5Xp~44sK}c0V;tX`m+Hh&UlFyT5T@{2~ZUd`C z@Ev&=Ocgxku%H=a8T$IcIt%Jr*w7B~6r37@`Vic;6nZ=1Vi%mfApCx zh@$)1KdSSiGfCe5nUBx5RME7|z~L~+4Z(k1HF@S*j>$a8zjpB0xfW_SWpLC%FyZ3D zAs6318{=d&!D64n=TAooyA(z|Ha&w1&;Ht^@Qj2z;H0fm#vPnPEvi`(kqQ1|@)Z(t zf!W{)!>)Hhk*H5rp-SfjvEVrWTD+U#sa;%}zRaP(3A#KTT+w=YU(NTpePTVIH1ga$ zbr0VveVaF2uQC)~$KOrf#)@Jaa150Jan&i3#EZ&m{&*bD_Jes!JnT=FATPtYm5|E9 zXLmwq2fTe+;P~2FxOu6705fT!(W|Q91QJ4gkPN{Sm?zGEh9S%=M(`I{5{<*;2n@%; zo}M?Nh9Me)BL*y*1$z-RF9N3uXGWlV2u7oDWeUs=kn>>2VWY#DUKKtBkV%0==8yl`z4dS;;*h46Ct*uy!T@08MUz(G||!}XD< zpzE3hH9ABJ0=qdfKoQaoVxtzLBSm_x9A%CqZnE6i6le{XJneVoFiPV zv1dyTnlmKN`#6@i*bsE0mRl72Ev)uQ{4Fuiy|8Z?9ZzbwEQ|Lq3(Y1b7o?%yF z0aD@yUUgjLSCRL4CUk-`t~$Ok7UA3Ra(=7^IO06Zqcz9a8sE)5sZX-S41;|Jc$ol$ z#hQ27YSAo+7c>@YIj8BX2 zolT4D<1!%}f~IyGwRV`9f34^AyFRY}z?`_KJ`1j&0B=!Tm^I^q>`ZuZC2h7UZboEy zPoHCT#>dcWrL?cf;r;L||5W88cRWl^3RAW&3G2o{F|jWMF_RXN#d(N2h-o>(DL44z zpy{M%6|Rh_JQOPD`rAk0wr-Jh^UEO@$qIknvyiW)Z9cNF6#tDHWBmrww1e4##FLXT z?ryYr@G~jOcMrn257K^ctGH{^tXZ4jyNjLt>4$FK?#%I5?HX#cvxdp|6m!x9NH!kH zO~_o#9TQu)ff-TG*ot_DEQn{w?nPq~kh#0KkR9WD_@Td?{n|DDq5dgu8@rx=k}lB~ zznyOe53tw!Ja2?vp_+v(N~~m8{4sV}DH786DWt%;7Fw&IsTvF&2HbE}0^=0)l)z7b z?MtDpRs>P5D5|K>2d&M}Rt0qtIMf5=21O6J*1(cl*t#0lEEaeiUBDGh z5ywg9L_#jAg4Rk%*GQb|wOQE&K@Th`hx5Y%N{u9hxn*WVps!s8K_{H(grOc#9I&iL zNW^cB!DL=^9o*n^!9WZO8L=cF;DnlLDD?nMFpz|_3{w-}JR3mXG|94ZmDh(0nBy`^ zAq;^OR3+h-6p$53kSK$FHH1@su9vgCVn`%ylUtl+^qkI6_?Ifye0&yV=ODfvz4&yO zz?~R?m*9pXn@^}*o%0fSp@hP=X@XV(4IOeS>ZD4+kl9`0hn5Utwb{J!fejUDnj$u~ zZR5xkaPH}&*`I+SALb7tgvxa8`>QPFTVwP;)yT_x9gLb5v)KY|juP(JqqF$YICp6> zzxavG=z$RGn(4df^`9rDO(R=A+LP^kWM&WW<=f+u+z&dZQVL;oZM0`Fp`i@kIt$im&{n{z2H3eo z_$;<5ysy1Q$iD~jqC5;Z=$keOVW3EPC@65L5;8IbOo#uQH z(0CFkXHfbqKXi;R;`u3(vq)K?h7ZIxv6=^QVE{ddttmWUU!zhV;+g1Y_*f{waqBpr ztBUcjBlq*QLN~M1%ZSN4`H82K)6O0Swtm@%Nk&Dg{a;mv+&*^bkDc{WcNHFHNozK;c2k*!p$`!B2d?~LR|Vuc1~D6CrRJq#pD^@d zNdfQbtA#(}lwsXs7|+6)VIc~%Er16$3+3o=k9hyx&Ek8!m4)$XgW{PI-i_zD?;eDd zSTzV`E>VFxBE((|@WZP*`-kH=@;2>qib*Taq-n7!py6&e@m$gIIV_eukcG6y`CnA> z>M@cTA?>8NPU~9NH!j zi$QGABXF>a(;XIOQOCJbhd>TwjbdL3U2>k5jX4)?`W2FZefNf;Q1u{hWlK$^cMID`f+6+j<{VJ9@@AmS5p<5P#=>JUhm!A=U8 z@n_O&Cxknzv_sQI5eOC4u%b$kSq&&!u>S?HW1{0+YZYB+TdO#i?mqDOMVE0nKyeH5 zty~ZZtF^<16>#5Lc>Gzo^aeQALTx!r=OA+!=Hieu<~vmp=87<_3nw?66UY4V%W&ox zm^0wo0E??&K@&LLqEkiupqtPThSqktG6%*H=<0`&B;2qVlz9_v(<1o&e(~Af&2asC z2x{>BDL6MEc+jP8*s%dt-Yv2Bk3r0Y$?XeWlrBnOyi-pq=f~qu;9Q-CwVR(^E3!MS;;bz2 z#YJ9JFYAE)sO$q4W6Pi86V5)~3;vvGbriSTLy$&n3S^k0S3bvR^;NE#ck!)>57S~* z095{uyYN# zoWj7;v*412TWVOsbh54h1+W|tEr)bg5LTBH92)3Fm`({l;dBLbTnEM^sCBSzA$wk=Q*5YWc5 zU@8sQrr<;$tg46GS|OQ&gK3yP39nbdM{k8)%Y=e98i(V>m&)q3I?mk*taOnJg*;zwmq1sUITE5qR#^STBo(Jq6wIQUvp zBxIYBToo5ysOQc^faM>X;(<@c=>4&i@Ar(*^mvfFLM?=W!?{`BOwXc6BtCVE4mVE0 zXb2)jOtpxeldudGIjB?ZmB=Ivm{4GWA)Lu>geXpg>$+ zz!w5fbKLm~bB-9b_6l|ltmXs8Ex2VLPrLVW$ak53_i5hNe?@QYMIN2_AP?(qy!>vy zYy*f_nBztQW7S+CLc0?19!b~oI-305u? zi7g`_%#lt(45y1w=717E7!ved1?wWnKCs&mbIwCx1)y>R+`nDGrQf~|=O=~!U*&*h z3*h$U5O71^m>4})9D?Urk}%bfL^mnuFcpK&Q4wG_EeEd#$tq}RfqPcK8~yO7_rxV! zdp+E~T98%UgcE}x_st)3et=Dr#OOo73Crpv{`fN+bq(BkBiy|Vy2phF686B_CNZ!# z6N76baJdgww!*`kK+nLD2{_paC6#d3a&cYG4+)Qg3aG0T#$vi4NHYENlI=9i&cU&m zN#y%San%LkofZ7s(KNk%CS`_3M>NZivL;Wi4WRCxVA~dx=V#&mhjOqYCWe_7#K2de z_(~OKUIKp+TnaNujW)N6+@iyX8{#S~%1~KrFft@zPdX_rwXh|N+de+b_^<1E?oTdi zYa@gop5@DOm=}K<=GCz@--=1wIK@n6GCS@Y(E#`KG&_1HQcs%9r>_d@X$oyK|r8@xbd`lnyZ4)F@j5pBKU!gjHD7EL?2O4|i;W`CLds4zSx5=GWFVS7RAceE~w4D3u158>orFx*kDFaRDw2myN?#FfuACIs9IOiD46l z6j)|J#DF=4AP@|f001BWNklJh#zswocl|YSCK)9hv!EW$fKZYUx`EiZ z0IparxLdNUUPm*UK6Bgek4GkirMO5QgY|j6^oK0pd!BpmIp;b38G_tP!VK(jz?zYg z>N{46_mtcTTYXSf3`23myi`jFu`G$)icf-sV@mq1jaF?zBiC(c#Fl zUCz*%j^lGG`1}UoArUsQ(;8jf9;y=M;7E%ZSjhM$WSHS9q~$e*hTEZjX__Zn-0Xd* zm`STrC{C5Fs|}i)ESA)|z^$WiFTk72z`iO1OT(;KD)asIaL=JqC`%y~B=KHy3}izT zJh@DWcwu`bd!8xeOMmP}b2>@9EaAN}#-+EG@ZgV~%zn0niC-S%nxFTw?15qun}g(R z3E!MB!JA%(xdXyZ_9mi{JA!#-RW(}A2tm4zweBj@K3gA8@t_I>* z>_nrNMfP8_K^>w;+eg9|qjBhB>N!e^ZXC=6770#Z7uYSh?HV+F2F;#f!cr%3DMC(4 zQoP_OPi%w(J4EA&90w~5Mo^R;ESw~6(;I=D0fj-BQUVbRIt<82UGwZp+z!OVbrp$KJG`{CDXpk*7F`#=suwgU!z z;P;6TtTIxL-ZdmjFNQlH;{ta;v}39YbVlG>bvL7$$>y4!_^Sr{+{pf7<|<5*<$$ zu(`=%*P#r1o-4xqV=bOz1$c`LC^AuYm9q6vhIth>flD&jeHt${nY{F>#h*6FbhWEY zEmFDc261}$p%+5*B$8a(S_~Hq5z09E{SJj2OWiOt3{91ApcV%F&{ZTHuxHA7;ROdj z+7?51IQiNw1x)`~2LvM&_$7kPC2ZO&;cs&hnh{64st4~i0|f4D$F;l_%9A5Im(W7i z#!}RkEq8FFaF9OdVdRWT?QkPk8S{ZoL<}|u>_h|%!)WBdPNJDZ_%p>g3p@-fVV+X9 za=CFW9(Isp0}kSdb6_%vfu=rkwi{h?VqlWSBx$8t`!aMK1X@Hy#8wbfvPX`40f7MUS$f zf?Nm2UO3=}UuR)bm52Zx?Sj@W*!OctZ5Ph})C$onaG*-$7@R;?AK0DXxD+OpL$?>= zJ#efG*6xSP7r;vg!B_`FE-(v(sbeNZKH-@rSUCqiz63%cSmS}%W>K|nR>EgK>4d3W zEZ-F5;h&eX?`VeG8_Jn}UK;=PZ7_R?==w5tgmc_g?_>Ui5HTBew3z(haVXg0XXPrL z#Y?hm>XBG~e+id;afpRqjWTDWO7>WgtY3k`IK}0IphM@DAO|A`*ESSzBqA}zbTZ^l z6HeMR?eR0e(+f-bL{_sX3toN1F>`X&0XK_YtiY9W;QGWtD2_o(73?Z!R=`P@OXJ6n z=~Ta1%?*nk)L)Q;TMmuzp<5(wG!w8%OdCS|yzx4**yPy8}N@<9I`0Y)nc}xS1Yl9>4QF$`Qv#hV3w_ ze&HcKR!>WYNvF|i1qIRvYB ziVmu}m9T6&6uCvz#TNjAz+s5SM9F~5Ct~_a71US5Py%)~gSkhPGgQ|LbEVA&dnaVm zplPB8X@56NC=#_f)5_pcHyqdld-lP>J_r_xkf-GW#Q=RD957&COoVEcA&|O+z&Ead zsWU~UHkpBa5m19Lbt0_aA(YmHAXEoL1!yuT>Vx`vpmYXI4Z=YuSWO@m3+*rKptr*& zRkUZ$p8`v#!}13BLp{8@9WuKhd%5r;}>Gi`kM7S5#Oe#cl<^Ci9Dp5hSUWdH3}|!w|%s&>aAW1;q(y>?PPR z2(3OS9)bfk@Zbb~up`5>?H#CTn+DyFFImXXo(yx>fgsar3t-UzV2JoPHdqb{8WO0r zmIm_oxljK)9;1~lN;6NXTY1jd&2p~edcKH8hgc;JB&r!8!FT1C=`7qwM#+-1O}hNY zcrdnykMnh0JPULq1}I&^BaRjx4t}2luIK5q1}Sg`DM;5bInltj#M7XO(gNEdw7;!E zVF}dNiloq?UN|rWW(;})f{7&wE}sc=YK2Bkn$Xn-xu__PbGtV#SIl{?_sJt88M z+X{nmM8ayMpF|!WS$DTc)DadHo^x*!W!n=&BGLC+A4o0Wp9ZQ6j`o2yU1X%w21L_f z4U3({9~AyjNf8{J2lghAyLqGAN9htFF$3+d z6rTFM$?N~_=lt?A8Y@+7m&Sp%49y)GGD(ful`aa)Ae?mJ`+Nrl)kDzh;%gTb^5RB= zht}p$<8{nhQU+lUGzTE9lAAP)7ElV3H*h}s4|Sz=gA(?cJQ zoWYOU2Kc*eB~(rwg2Lp;$90i<&5zWjp`u)cX@3U~8;EH^x{JE$b?zadhS{e1c)+S4 zYkHA$1vm`{URxoeMCoz0F`yl0SdZh7HDc~w)(2i98k@~*mSPfSv)V;R=qdI)UZGEI zK~|vJp3U5zrOb+jST0TBrr^II$zbb(Im{F|=E4QjVA&*i@*r$JB+8WKESQCGc&1>) znnGbVAPGkB1wrwFZi(WrS2|$DWbw#`38fkgJK#t=Jo`Fab&-T_*f_%?*1vobRBF(r zf;<430--RZw^WcOQqY$c3Nn&`gGWV`=XJA1)^}|I>>m(GJrZE6h-u-z5hpl?$UVp~ zWg3(Pp>;_31=|mS7KK$8!|E5o*a6BV;u(6Q!r!ofsw$XTB}_S&13V!}E)sEmEa3#( zNstD>>=#PK-V3`!u%iubTn6`CClOgwO-0aR?=C05+mdE>wI63m4E7d@7jfeNG>3Td zM+!|{Ifgx9va(5)9pKvYUCjHNA+E^gc<={B9NcU(=d0b+O>ooqyCU{%%JJy_B)MXh zNkN&pMQV{zO>7ifC9agSEBHElwPzU6`;n2+EEh-hW-?Y9!?2Mh162W8Q%8!@ zEG)~$Avs8?5ssEO5iaWDCCNj~>Lx55BSjR;0-sjQ`2*K*U-VKIqmkojcH6IDc|lDA zT|g3~0Mt!{Yv;i$ZSdk|Vc*I@kf(`KWn(k6d!c=J#BN5E3M`o|1og;Vcn}B z)j*XO(l&H-LFOQM7Q>PSFtsT6PKq9KAnN;Ux#T{`dGD*Gc!?R=%WQ#qIy6Nsu@zFa?Di+4c^=KS@yqXPv zN>M*SXTqvMZhU4k8+Hydalj^63&)Bw7-d-&Oq7{&O`NLf388&e1v{zIx5v$vm%H(i zf}9^5CRTM1?i(#W+BSnn9!#>MzmJSp#ifgNZyHSTA3HOAIb2INSHzRyDElIVv|AQI zS!Rmt#bYTPFjJ%~i*l!f8MRIx9~$JF4`!L{^x>8@+Vl(u7$Ty?P!&53vYUNAgPq#T z#N-$iS|g3aODT_g0fm?+#h|C3LDxYN$^cn8PRdSWSq8Quqev1-DM3nUrc*v5=C+$A zHWEQCM0IQ?O9mG652*|B@GrpYIB+u&QPjnO5ltzBJO!pt5DhHb_ds-?a6i=Zpfm_Q zWniuq-A$$~7_%)b@&Xe};WNwO4`uLT03t8LbKMZCflvW-Wkkt?+A0|7s0{Uspt%@Y zw!&kR;3G>Q9EDfXpzjc^gH{eCMP#OXBXGeah(saOKO%fiC@K^Qui+e&cwyx%QQ_K` z5FKZxDMGH@{m|luUN1<8VcRaqq<}r3G{UOS!kpRgydiWfM{* zCQa0seQN~o&H|oapJsO|$B;8c&d#DZL{?ZuK7^qz;YZGO49cxcmS*$m?%TLKGZ`@h z-UNLa5znMCEm8F1R8$Hb1r(Z9OdXuVt;5%I zlU|IIzaoo)lMj<+F2zz4TIdxFH%N(*WQ`yEeqqK$VqkZHG6m{_qW4wu3!lgunHpyS z`#S|ARF#TK$eX7_V--9bf`hwZa05hrBN39gU|MAWa);sGdtvQ%cySP(-zKuEcP|#& zdSd|0&7fpO7_u)ZYVSX^0B%_#`h{&U?mYm>s1O4NdXsu;-<48hA8nEsJ%C^Z_6fC7C%TJA66$<&(4+7%A&!(|3Km ze$1jvmvE{QlRSk?nU>+aB@VFq-c<1{i5EXI?#5wROmrxmj~l}>*eN*~BFnsb4_{p3 zr1GMO&_ew__P*@rk?khyj>afNVQIOK*>iRFN8qWW-6Tp??psty?IlUnfJq=F6WLXS zx>N4sA!ix;oUc&esNhQ-E4e9m7;)5%Awm$g1>DHT?Z0CvWubd5qK*M#Qk0C9Bco@q zuu&uhujaw4dMPz(s2iTegve|@Y%T!)l_Z0Bxf=KqgMeyVc-*2k-I7Oa?Fht@q6x_< zgY6c(L)H?J8wn9A#2V=y%fX>mI2IS>!p-e)tOk}h!k0e`kJQ1sJt7ooH;Wf*k5t#% z21Ju^`{fWGgzbNT=lsAjxc5TQP_jk^>j}_d#(Z51^@FHw7&>5u7WEsgZcv4DuL1>p1;^7 z%)W43>_Vmmg#j@>#^-=_2jOt1NR&0!!|msZJjc2o=xv40TBx1^bry6K!|<8~l$9uC z+f{Zq865008H^YV7i7r|%lJJ|kCVZ@2Bkv^)TIHN*baquJ3(!g1F{O40hvs%i?yrW z9I_(ZyUIqI06QNDaQJABg$s4Ao|8aLJBYm;VD~;BAyubpW(3WrBRSF_Wgu5h_^67J zF-e&gZI;f9atZ^TBYK*NK{sEz$w~QV_Je;=M08M?d08p9f4_$Kg8}rc&c|mKLs^FV z*Tk5D%!QvAX2y+ekaR#oWGu_;9H@Id^V#NninQ$Jj<%ItZVZs+4|u2s{J@bBuPs3w zo2Zf^?1&Rr!o-a@X+47?OZXHIZife_?80OEDKJZLm;nsaM8`(Mg%=3}9hE_<@G-^ZOzV%FfQ=B7eqzpr*0M9QU{)g$D%N>06wx@IJKLL;K;COknhTX zqYb+H!S4|Y%jJMjP?#6>#gNuvUl%kTg3gSX5W&bOl}UcM{sLIs0Bg628lc6qL^k}t zABTf4fctz{atX{Y7kQ9LrBJBCppYlgFJX&ka5_X3XkrO$JqjCMhvt!^Vh?u0;3Bwd zIdpfzzUN_o1=LkSogb#u!@nFH#=FVF8FNzGAH&nQ;+vf0in?+(HrdSo zg+$q66HhF__Qx}1O_PdC!eCoiy%u&_=63_b6x3(%HyFhFHMV!z%x_egcYQBX$OT%4 z^1?yd|GS<)t<(7Er_wn55fLRYLh#f?Hb0{f$~sZ~65Sb{pBU{ZHaKJl->9gj{Hi11 z?*=q5+@NM5)J5YJ0j~X1HBTg?Ol&aOyxu0BmALN98OoQZ2>-Dh^@%DDbU1N3vUpZV zC|wh*e~L*-E*ZX@ucXQe@iR1hh+}WkKrb+f9IN=TvWJc3J81E|LQl36Y?~ryh>%iD zKrX~3dr?r4BpFjN$U0MGWs@DL9xh@PPCAjLtsrdyHqym*9ta-8^g-bq@J$kv)`nZa zE{2^|x2NEwDpm>*>U zQDwTT1$GTW`VdIFKyCx;AjHEk^YTo;&VRb5@QJ!IOxq&kF;N^~$~NDeT>`fq1g0 zY>M~=IyyFP95j<4id&jYlF#ywuKjEbu4B;KM%K8WF)F@vIHF*#c%r6h?tdI>9S z#FQ{$y9Y^W#$CLNj>0NFk?7=xf!n#=xP>%N;8r4(7cC{%xsIvV!TIw=?fW(d?Ar*> zHG#JTKDkWTw6D1#w;fbNXg^Db1MP6>47hwY1Ot#9iPd96$P1OhkzZw)Q3*4uME97U z5ksijJH344HwpR-*x4moD?fQ7ytEgZ_QSDV@X$6mcs(qh4_99&oXdSZBAR0#H>XC* zr|XJEL7m0O+#XXz_~e|hab>@7Y+H|s0=JrKm3Y?TK)1!=UNOO1Sp=maA!O0CXw5AQ zi25Vb1Kmm3-3!+ji9P_s0>2ZUI}H2VAl(DL3!$_Edcu%<6`qWMei?k>Hu!EA?C65Y z{V=)6L8K&1Pm7ah_PLlHQdn_EhKk$TNetTPx`sBSATJo^s(*{Iyt#sOM~JLP!Scl^ zcLReiF*j&w7gzO_v8&s~keViuQ;}?oG8`D01X{?31w*6*I_`)MrClS4&5yq2Vu@13 zKvL&vDNQb&;~qj(Opim-$=_6#k*x60omKg2Q#<{`X-eZZ6zL-6t){V+BqkqHsYEMSTVQf6qryt}nm(pFZDnC0XSuitSE@ zYzdh(l9aw)ItRm(NT+D|CZsMbfk1;oUC9@MtXil`DyDXw| z8{tGB89jqb)i7lkN_Ww2HSv1IHugvoFJ(%2#jasft&`RXYq|ZyPO2wZR1`~0Y>?

XBvFH(u>?b< zGor%sa9AQe=;uI(O?}9sq7DixB~YNI6dI;U6i$YS1c#r4T?gP`Kh#u9%$zDwT?VzK zP+bHQDxj`Zm?Jq!Xz}5!nD&;;ig~A|4N_2)rdv@^N+m*g=*sv>8aev=EzB^G1H}ss zlO;R>$jM@-?;IA*FEoofsI&uWs=#u>#)I(6tB`nE^g*0|fyC6QGPP5LUomLFzCS`~ z15BIgrsWX>XF2$6FY%Wy<5zpL^hJlb=N1PAmk;9UZ6No>3hrNBKy*hrB^^Oh6&Ai( z!?>mn;4L)pb(F%|0wVi^*fAeTEkTu6VOlgub0*B9B0u;YxWXET(rG+C4ZX@h(shOp zYW$*4V&P;T(QbvG_8sE@26rWcTu@NT!?8Ag+S|sXxj~+b4DnchjMaVp#L3|^94OTa zdU+O4VFE+Z$vU#+qHdgrs`>4f42SeyZmq52sn{`YT;XBR<6_SrG)N6`{mLBHRV_Gb ze3ZOaj%4*+W=p;hkylhU|I*_5HZLDt;b+mu575@?VsX|&dJk~m(`b;?k89V=wsyaJgzwKf7Q^h>|T!fAP>0*Ay!QNb)Z`9N?=OZy_JOGl-=UPfQ z`ul4B>F6NKueP8*iup_fUwAabV7pF{tg^p3#Y@Cz=mj%S*VpBmx>L&b>(JsP0E;uv>^%K1%K zl)sN1!L6!XHMbP`qHge7wCmK{jhB(~-euP$fN-!nu*g@W558|OOxcVmusz^Ixa zCyH1sMj#M)TV{T)muZ>gegskco7O!}yTMW(*u|6OR+( zaS6k;ak-pWmVsrBoD&6TngdvzwO`N$sBvPYmP&849g6t29-+}C6#8F;~rs$~ID7ukDLSxP)I@f7>MaO z73rL&e-aoI6XZnk4*3SVrly8iEOs*2`~_5ZO%BO4FplIk)k9FA15W4(V!u$v ztG`isv^&m~Mio!HyO?s<5L|c|Sr&bUax{rl)`%7zB-Pc1>B=(oG8g@d%J9&1Zu=-W zv~4{0Qw^8<&)N@0%mP4`Wo+9<(p21r13el;R)Ns!&xmO)N2Fq|rqDWS;HIZyvY zF;*tXiDG0|v5()ksi}$i^XI?oZge6!3e`DdA9J+=KKJY}Ukp!WO1XnA8+*XknZF_n z#U_zfH&fy^mlqVV#f z^i4R|>Ax4o$^7t-EK}`XE`C^Q%fhk#?61bkUxGa#MfW$V8{z0S?4ns z2PwLH05%2L^0<@RY85{Ar7nzgCDy(Gimi~XO5xE=h(gU1g?zUs%x#Z^v0M@|3YMWz z=!S1phN!;JK=XER|L!0Ya~^P*WaDYE3P}Piyq#^t(oXzUHdo}_Jl1QmV$tm={ROyrsZ`&Zf}0OQ zT@<4&z_pnQew#~kb87&l_Rm2GM=Z;5nV*`gXR~l9?JQheL(|?m zo_M+okK1HqzzblbX-*6yC7xK(aAQk8Yp@eDJ@}DPsh|-kC;Y5n()G+fIGxUrM-ppBpX<6I|FrP?n*`51T4k^BpIT_YHIBiXaVl zw?TI)l*BAz7cfZCXk8ej&Z4A>wwsJ^FNVXGe zM4MTbfj3Z&=Jb+G4q>?`fuZ9VPGE#e(1UJt-A2kLuqFA8mvFArKM{P{~NV5iz@9N>^*UGs0Mh_V=@|_ZZo&M;Q(qM26EiJt}px{j?v7l8NfL+$yT- zMwVpcKq0o%g`=|-DQ%LSScIh~am3?j$%L2|JA!ka{)u8NOpsB)dxmD;4eF}j?C0{A zC*l8L5zi&}KNj)qw`{)f?7$n3U^xQ>UAvgt zu!TQ0EvGOLE}n8BJ^(;at&Z1;iQkHvyO1_#7`4) z&)_#tK7;qVODT05JhtZmFElmt?;p91p`=ai)M?C_r}5B^HSBy&;?tj6M0s@?tFE2R z4*v=3>Z3QbATu-Fy7!wL6aM!nf z%14&ZqjX{cOY3HE{r~w-22)OE1!nR0pIE@>FS-clB^P5@76V<~6kB0#y3os$Lq&9V zbrDQuNL1BeN@+Z{jFHVDr3OT8%$sqp(?30&mI-pI7_9`G8VMVe)W|4?Ax0f&66g{* zOprznyF~%r&2OR+B8tvsnvXA}igB9oW0%BgE5@U#2p9GE00)#ran0!jJn-8F{_BTn zp6!bvn{hNnCvnuGy1>QXU)>0-!A8Ouj`L#Dg1JSarjEEK9-$?7=o%rS-_l1QwPJvhUhYa>H$Ra8&m)DCLm5d$BDE z0$!xV5QZ``ZhHjhI{j0@Xqh0VLf7qfkJ|lIyX-X-ykZPNeIFF$Agw`h96TAslzInt zRzi13=!qPP<-#jF@R&MoRCFX_vN3YtEy4-*nDEF1zWyDPwHOm6Eh;+n5dorVf7TGy#)}{p$?|5(7EE-0BZ+g{4(7S zrc73YX~i11TyDXIeSjnmGZ-r1#b%3?+u-I!ez>j;X7-3FQbP&+cURzj$PfqKNiu<0 zl7F7E4od^gsc@{din$AG8LTSi07qJm5ssML_wA>7WyTSTWhcYQe6Atxjk8a@UYIOj!k6Nr~RNZB!fu1@{=kDF4f{UmQ&gSWzM_9XM7td{PqRQi^K&xgTth2p8LQSbjRdFdh z4tEhS+yoRK%}2tRxfFl(Z)?a558!Zk$hnG;WEKCh2&DxMW>$MBEpVLE^iLL}ZGxOE zYHDie=;%1@aVW79F3eM|+(lE4!u%4+!{@fARQ^~JB6y)cbIO|r{G8A+CrB?%iF+qSVR8{IU~ zR7JFkjHuVFX=7V9(nv>%WsB2RN(vn8Jer7<1hm3)ng0LzuRosDT%cGiW}iu?cdXZ- zCJ)X>S=5bdNi&Q7t(cZiS8@O56blYRSVmc$!0CO9VV5*BwW@CWDqe36Y#*! zTAH7p41dy?{Goo3RCLv5N`;1b?NL}Z0Iz$*=;oXXrAa~)6SRl3I5qJx4|Sz6E&DIJ zo8AlwM%to4u*S)$0o%6myA>vvdpOpgWgu=8q;>0@rhgKb182Uz=j|{OeHs-ZP@BI} z&z$QW@Ylys<_~e_hbQvrA7d~n$I_#IHd!$;y1^9%MJ%XSpfmv_fDjz^L(+@2yO5Xf zhx?C2_~!fyD2>6U3Z4i4^NK>;*Y1W*6-581l+V4M#PS+kZG^b~iXiRbSALhx+2kyX z-N%v`*4UPi6!}ylNej!iX&uNU3p|SVT&91r*N?Udaw=H1Y?-uv{d)U&ao*|NOZ|5A zFh6^$1lQtHSiTz?6BthchLcqn8_aoT8pFXX=S|UIRRn6gfHZ6i@u#m-Rwb7$1KNdIKf(a|A|m>{FLs*}f?i}OxL2voZO5)LOWB)|)nOwLrm zw%|i8Oup0)rbCo7%;~@mM3K5GX<1Xoe;kd_nDkQ|i15$XmNV_{A*97Ua5w-5Gy)C> z)C@sfLt7nyY&ZAVB}}%x{A;e8r>)jed?n*JQy5JX;&Ab9z$NC3OE!>0I#v#wrm*o(Dp^ILqddcRKjEX{vxgw+BD=Mo z@b3!=_h<}DS+G4|CrQ`a=zSKuvx6k8G?Jv#81%7q@I6*IjzfxY0IT>s4^d}F5;KX`F;iCI2DYR339qP z-Ncx>e`y=R0ttD4CBf|><`;y}dXMpyN5XtRGau!yLlnl!;75LpMLMbZ?fA@x3mXn>6p+Kv|PGrb6SKz#&nJd!!=u%nAVHp8-z< zd6-OgM(Cdf3Mj8Zkds}*i3;E;WrE)g`DDQ3lgaWGBOhz}XW(HVL4cFq0rJfN`EJ0- zH~oAoptnI@&Ifqw8cz9)u#=^fZwAPB14h2-=UV|CM?QlfZ^3B^;7OZ6`DTET64<;I zWaXQFz7-G%ALO_o=8O49D-3pu8}^XbnbsztSH;-V{(igCL_RfTt_~`DB26PbSMZ{kI@* zYshC1WV8fu)Tcs>KclgRaf~g_dI5MlhI+p+ z*ZXCi=Q2)90LJFmXrghAi>!B2%LH*DA-jWf>w#%R3Tar_yhz5~1+)1E3L zpUTG_4WSte!8_f1zEc3;{TLWHn=q;ZFcu%;ObfwSGSjKv`$VoA7lKp6s0qMWetZbLC<6?dNkV(KM2BjGSBcqc-}LOG06jrn=qq` z6JhLe=07!@vH-l-3mgWY>?jW+285k$8lmfrE1W3d*NeI#rZ+|z^C&( zAGCLoZ=CjAps^TBaw7M9FCjabwVY{_?QCM=@wq^!iQ^i7G(YOu#2{~nH?MEp-+6yy zRGi?monhY#C%XQ(v$s#y27kZ5s}CC9_oETtP6MARlZ{5V)jRD7XDj2M>n70qUI4~% ydN|hw;C<5%FphDI1;zzn9OpE~1z;TKH2#0t)6gtRY?@C10000 Date: Sat, 13 Jan 2024 23:15:10 +1100 Subject: [PATCH 038/339] Fix order - 13 1 24 --- .../components/xenoartifact.dm | 6 ++--- .../xenoarchaeology/traits/activators.dm | 2 +- code/modules/xenoarchaeology/traits/majors.dm | 4 ++-- code/modules/xenoarchaeology/traits/minors.dm | 24 +++++++++---------- code/modules/xenoarchaeology/traits/misc.dm | 3 +-- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 8f575424178bc..2484b9531dae5 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -70,7 +70,7 @@ var/mutable_appearance/old_appearance ///Do we make pearls when we're destroyed? - var/make_pearls = FALSE + var/make_pearls = TRUE //TODO: Remeber to disable this when you're done testing - Racc /datum/component/xenoartifact/Initialize(type, list/traits, do_appearance = TRUE, do_mask = TRUE) . = ..() @@ -134,7 +134,6 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) /datum/component/xenoartifact/Destroy(force, silent) - . = ..() //Reset parent's visuals var/atom/A = parent A.remove_filter("texture_overlay") @@ -150,7 +149,8 @@ if(make_pearls) new /obj/item/trait_pearl(get_turf(parent), T.type) qdel(T) - + + return ..() ///Used to trigger all our traits in order /datum/component/xenoartifact/proc/trigger(force) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index b09e2c491cbd3..c0d5d602de0bd 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -182,9 +182,9 @@ radio_connection.add_listener(src) /datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) - . = ..() SSradio.remove_object(src, FREQ_SIGNALER) QDEL_NULL(signal) + return ..() /datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) if(!signal) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index b010d0342f427..d056f966553d3 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -510,8 +510,8 @@ GLOB.destabliization_exits += parent.parent /datum/xenoartifact_trait/major/shadow_realm/Destroy(force, ...) - . = ..() GLOB.destabliization_exits -= parent.parent + return ..() /datum/xenoartifact_trait/major/shadow_realm/trigger(datum/source, _priority, atom/override) . = ..() @@ -605,8 +605,8 @@ emote = new emote() /datum/xenoartifact_trait/major/emote/Destroy(force, ...) - . = ..() QDEL_NULL(emote) + return ..() /datum/xenoartifact_trait/major/emote/trigger(datum/source, _priority, atom/override) . = ..() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 7a2a88c4822b4..38a1ad97d793c 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -17,8 +17,8 @@ parent.trait_strength *= 1.25 /datum/xenoartifact_trait/minor/charged/Destroy(force, ...) - . = ..() parent.trait_strength /= 1.25 + return ..() /* Capacitive @@ -81,12 +81,12 @@ A.interaction_flags_item = INTERACT_ATOM_ATTACK_HAND /datum/xenoartifact_trait/minor/dense/Destroy(force, ...) - . = ..() var/obj/item/A = parent.parent A.density = old_density A.interaction_flags_atom = old_atom_flag if(isitem(A)) A.interaction_flags_item = old_item_flag + return ..() /* Sharp @@ -123,12 +123,12 @@ A.attack_verb = attack_verbs /datum/xenoartifact_trait/minor/sharp/Destroy(force, ...) - . = ..() var/obj/item/A = parent.parent if(isitem(A)) A.sharpness = old_sharp A.force = old_force A.attack_verb = old_verbs + return ..() /* Cooling @@ -162,9 +162,9 @@ mob_spawner = new(parent.parent, src) /datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) - . = ..() QDEL_NULL(sentience) QDEL_NULL(mob_spawner) + return ..() /datum/xenoartifact_trait/minor/sentient/proc/handle_ghost(datum/source, mob/M, list/examine_text) if(isobserver(M) && !sentience?.key && (alert(M, "Are you sure you want to control of [sentience]?", "Assume control of [sentience]", "Yes", "No") == "Yes")) @@ -272,9 +272,9 @@ A.alpha *= 0.7 /datum/xenoartifact_trait/minor/delicate/Destroy(force, ...) - . = ..() var/atom/A = parent.parent A.alpha /= 0.7 + return ..() /datum/xenoartifact_trait/minor/delicate/trigger(datum/source, _priority, atom/override) . = ..() @@ -353,11 +353,11 @@ RegisterSignal(A, COMSIG_ITEM_DROPPED, PROC_REF(drop_action)) /datum/xenoartifact_trait/minor/ringed/Destroy(force, ...) - . = ..() var/obj/item/A = parent.parent if(isitem(A)) A.slot_flags = old_wearable QDEL_NULL(artifact_action) + return ..() /datum/xenoartifact_trait/minor/ringed/proc/equip_action(datum/source, mob/equipper, slot) SIGNAL_HANDLER @@ -405,12 +405,12 @@ A.block_upgrade_walk = 1 /datum/xenoartifact_trait/minor/shielded/Destroy(force, ...) - . = ..() var/obj/item/A = parent.parent if(isitem(A)) A.block_level = old_block_level A.block_power = old_block_power A.block_upgrade_walk = old_block_upgrade + return ..() /* Aerodynamic @@ -433,10 +433,10 @@ A.throw_range = 9 /datum/xenoartifact_trait/minor/aerodynamic/Destroy(force, ...) - . = ..() var/atom/movable/A = parent.parent if(ismovable(A)) A.throw_range = old_throw_range + return ..() /* Signaller @@ -463,9 +463,9 @@ radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") /datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) - . = ..() SSradio.remove_object(src, FREQ_SIGNALER) QDEL_NULL(signal) + return ..() /datum/xenoartifact_trait/minor/signaller/trigger(datum/source, _priority, atom/override) . = ..() @@ -499,10 +499,10 @@ RegisterSignal(AM, COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), PROC_REF(toggle_anchor)) /datum/xenoartifact_trait/minor/anchor/Destroy(force, ...) - . = ..() var/atom/movable/AM = parent.parent if(ismovable(AM)) AM.anchored = FALSE + return ..() /datum/xenoartifact_trait/minor/anchor/trigger(datum/source, _priority, atom/override) . = ..() @@ -541,8 +541,8 @@ slip_comp = A.AddComponent(/datum/component/slippery, 60) /datum/xenoartifact_trait/minor/slippery/Destroy(force, ...) - . = ..() QDEL_NULL(slip_comp) + return ..() /* Haunted @@ -566,8 +566,8 @@ "activate" = CALLBACK(src, PROC_REF(activate_parent), A)), 8 SECONDS)) /datum/xenoartifact_trait/minor/haunted/Destroy(force, ...) - . = ..() QDEL_NULL(controller) + return ..() /datum/xenoartifact_trait/minor/haunted/proc/haunted_step(atom/movable/target, dir) //Make any mobs drop this before it moves diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm index c89c8c887a08c..e8e7f9ef528ec 100644 --- a/code/modules/xenoarchaeology/traits/misc.dm +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -13,8 +13,7 @@ A.AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) /datum/xenoartifact_trait/misc/objective/Destroy(force, ...) - . = ..() var/atom/A = parent.parent var/datum/component/gps/G = A.GetComponent(/datum/component/gps) qdel(G) - \ No newline at end of file + return ..() From 06e2b5911885637def841f506bc31cffe06fd42d Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 13 Jan 2024 23:46:01 +1100 Subject: [PATCH 039/339] OOOOHHHHH --- .../components/xenoartifact.dm | 31 ++++++++++++------- .../tools/xenoarchaeology_labeler.dm | 2 +- code/modules/xenoarchaeology/traits/traits.dm | 2 ++ 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 2484b9531dae5..87b10ef858d8e 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -12,6 +12,8 @@ throw_range = 3 ///What type of artifact var/datum/xenoartifact_material/artifact_type + ///Use this for debugging or admin shit + var/spawn_with_traits = TRUE /obj/item/xenoartifact/Initialize(mapload, _artifact_type) . = ..() @@ -19,7 +21,8 @@ /obj/item/xenoartifact/ComponentInitialize() . = ..() - AddComponent(/datum/component/xenoartifact, artifact_type) + if(spawn_with_traits) + AddComponent(/datum/component/xenoartifact, artifact_type) //Maint variant for loot, has a 80% chance of being safe, 20% of not /obj/item/xenoartifact/maint/ComponentInitialize() @@ -33,6 +36,9 @@ var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) X?.add_individual_trait(/datum/xenoartifact_trait/misc/objective) +/obj/item/xenoartifact/no_traits + spawn_with_traits = FALSE + /datum/component/xenoartifact ///List of artifact-traits we have : list(PRIORITY = list(trait)) var/list/artifact_traits = list() @@ -134,23 +140,24 @@ RegisterSignal(parent, COMSIG_PARENT_EXAMINE, PROC_REF(on_examined)) /datum/component/xenoartifact/Destroy(force, silent) - //Reset parent's visuals - var/atom/A = parent - A.remove_filter("texture_overlay") - A.remove_filter("outline_1") - A.remove_filter("outline_2") - //TOODO: make sure this doesn't cause issues - Racc - A.appearance = old_appearance - old_appearance = null + if(!QDELETED(parent)) + //Reset parent's visuals + var/atom/A = parent + A.remove_filter("texture_overlay") + A.remove_filter("outline_1") + A.remove_filter("outline_2") + //TOODO: make sure this doesn't cause issues - Racc + A.appearance = old_appearance + old_appearance = null //Delete and/or 'pearl' our traits for(var/i in artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) artifact_traits[i] -= T if(make_pearls) new /obj/item/trait_pearl(get_turf(parent), T.type) - qdel(T) - - return ..() + if(!QDELETED(T)) + qdel(T) + return ..() ///Used to trigger all our traits in order /datum/component/xenoartifact/proc/trigger(force) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 389663f077d7b..da12c4275e7f7 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -151,7 +151,7 @@ //Create an artifact with all the traits we hve selected /obj/item/xenoarchaeology_labeler/debug/create_label(new_name) - var/obj/item/xenoartifact/A = new(get_turf(loc)) + var/obj/item/xenoartifact/no_traits/A = new(get_turf(loc)) A.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, label_traits) /* diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 9f648bbc3d928..d64830b62ccc0 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -65,6 +65,8 @@ UnregisterSignal(parent, XENOA_TRIGGER) parent.target_range -= extra_target_range cut_trait_appearance(parent.parent) + //TODO: If we ever need trait pearls to keep the initialized trait, remove this - Racc + qdel(src) parent = null dump_targets() From 6b6519003794f424a30ffbdf3578811e9134ef8f Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 14 Jan 2024 23:13:35 +1100 Subject: [PATCH 040/339] Calcium - 14 1 24 --- .../components/xenoartifact.dm | 73 +++++++++++++----- .../tools/xenoarchaeology_machines.dm | 53 ++++++++++++- .../xenoarchaeology/traits/malfunctions.dm | 3 +- code/modules/xenoarchaeology/traits/minors.dm | 2 +- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 44617 -> 52621 bytes 5 files changed, 107 insertions(+), 24 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 87b10ef858d8e..b5eb7dc21d684 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -74,11 +74,15 @@ ///What the old appearance of the parent was, for resetting their appearance var/mutable_appearance/old_appearance + ///Do we edit the parent's texture? + var/do_texture = TRUE + ///Do we edit the parent's silhouette? + var/do_mask = TRUE ///Do we make pearls when we're destroyed? var/make_pearls = TRUE //TODO: Remeber to disable this when you're done testing - Racc -/datum/component/xenoartifact/Initialize(type, list/traits, do_appearance = TRUE, do_mask = TRUE) +/datum/component/xenoartifact/Initialize(type, list/traits, _do_appearance = TRUE, _do_mask = TRUE) . = ..() generate_xenoa_statics() var/atom/A = parent @@ -87,23 +91,12 @@ artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() A.custom_price = A.custom_price || artifact_type.custom_price + //Build appearance from material - if(do_mask) - old_appearance = A.appearance - var/old_name = A.name - //Build the silhouette of the artifact - var/mutable_appearance/MA = artifact_type.get_mask() - MA.plane = A.plane - A.appearance = MA - //Reset name - A.name = old_name - if(do_appearance) - //Overlay the material texture - var/icon/MA = artifact_type.get_texture() - A.add_filter("texture_overlay", 1, layering_filter(icon = MA, blend_mode = BLEND_INSET_OVERLAY)) - //Throw on some outlines - A.add_filter("outline_1", 2, outline_filter(2, "#000")) - A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color)) + old_appearance = A.appearance + do_texture = _do_appearance + do_mask = _do_mask + build_material_appearance() //Build priotity list for(var/i in GLOB.xenoartifact_trait_priorities) @@ -298,7 +291,45 @@ return TRUE -///material datums +//Calcifies - breaks - the artifact +/datum/component/xenoartifact/proc/calcify(override_cooldown = TRUE) + //Appearnce + artifact_type = new /datum/xenoartifact_material/calcified() + var/old_mask = do_mask + do_mask = FALSE + build_material_appearance() + do_mask = old_mask + //Disable artifact + cooldown_override = TRUE + +//Build the artifact's appearance +/datum/component/xenoartifact/proc/build_material_appearance() + var/atom/A = parent + //Remove old filters, if they exist + A.remove_filter("texture_overlay") + A.remove_filter("outline_1") + A.remove_filter("outline_2") + //Apply new stuff + if(do_mask) + var/old_name = A.name //Appearance stuff tends to fuck with names + //Build the silhouette of the artifact + var/mutable_appearance/MA = artifact_type.get_mask() + MA.plane = A.plane //This is important lol + A.appearance = MA + //Reset name + A.name = old_name + if(do_texture) + //Overlay the material texture + var/icon/I = artifact_type.get_texture() + A.add_filter("texture_overlay", 1, layering_filter(icon = I, blend_mode = BLEND_INSET_OVERLAY)) + //Throw on some outlines + A.add_filter("outline_1", 2, outline_filter(2, "#000")) + A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color)) + +/* + material datums +*/ + /datum/xenoartifact_material var/name = "debugium" ///What color we associate with this material @@ -380,3 +411,9 @@ instability_step = 50 texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") mask_icon_states = list("mask-pearl1") //This is pretty much a place holder, since artificial artifacts use the item as a mask + +//Calcified +/datum/xenoartifact_material/calcified + name = "calcified" + material_color = "#726387" + texture_icon_states = list("texture-calcified1", "texture-calcified2", "texture-calcified3") diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index fd0a8e05c90a6..e70e974f09f52 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -33,9 +33,7 @@ /obj/machinery/xenoarchaeology_machine/attack_hand(mob/living/user) . = ..() - for(var/atom/movable/A in held_contents) - A.forceMove(get_turf(src)) - unregister_contents(A) + empty_contents() /obj/machinery/xenoarchaeology_machine/proc/register_contents(atom/A) RegisterSignal(A, COMSIG_PARENT_QDELETING, PROC_REF(unregister_contents)) @@ -50,6 +48,11 @@ /obj/machinery/xenoarchaeology_machine/proc/get_target() return move_inside ? src : drop_location() +/obj/machinery/xenoarchaeology_machine/proc/empty_contents() + for(var/atom/movable/A in held_contents) + A.forceMove(get_turf(src)) + unregister_contents(A) + /* Scale, measures artifact weight */ @@ -106,3 +109,47 @@ /obj/machinery/xenoarchaeology_machine/calibrator icon_state = "calibrator" move_inside = TRUE + +/obj/machinery/xenoarchaeology_machine/calibrator/examine(mob/user) + . = ..() + . += "Alt-Click to calibrate inserted artifacts." + +/obj/machinery/xenoarchaeology_machine/calibrator/AltClick(mob/user) + . = ..() + if(!length(held_contents)) + playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) + return + for(var/atom/A as() in contents) + var/solid_as = TRUE + //Once we find an artifact- + var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) + //We then want to find a sticker attached to it- + var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents + //Then we'll check the label traits against the artifact's + if(!X || !L) + playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) + empty_contents() + continue + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) + if(!(locate(T) in L.traits)) + //Forgive malfunctions - this is readable, forgive the nesting + if(!istype(T, /datum/xenoartifact_trait/malfunction)) + solid_as = FALSE + //TODO: make this calcify the artifact - Racc + if(!solid_as) + X.calcify() + playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) + empty_contents() + return + playsound(get_turf(src), 'sound/machines/ding.ogg', 60) + //Disable malfunctions + X.artifact_type.instability_step = 0 + //Prompt user to delete or keep malfunctions + var/decision = tgui_alert(user, "Do you want to calcify [A]'s malfunctions?", "Remove Malfunctions", list("Yes", "No")) + if(decision == "Yes") + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) + if(istype(T, /datum/xenoartifact_trait/malfunction)) + qdel(T) + empty_contents() diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index e2e4cb856c928..c009bb3e05ab7 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -249,8 +249,7 @@ /datum/xenoartifact_trait/malfunction/explosion/proc/explode() explosion(get_turf(parent.parent), max_explosion/3*(parent.trait_strength/100), max_explosion/2*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100)) - //TODO: Make this calcify the artifact - Racc - parent.cooldown_override = TRUE + parent.calcify() /* Mass Hallucinatory Injection diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 38a1ad97d793c..59c45a85bc73a 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -284,7 +284,7 @@ if(current_uses) current_uses -= 1 else if(prob(50)) //After we run out of uses, there is a 50% on use for it to break - parent.cooldown_override = TRUE + parent.calcify() playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) //TODO: Make this calcify the artifact - Racc diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index ce8646442d389d2922b1dc756cbb3b61c3a76028..12274c2f3a15833728e63f774b97ce38e7711a74 100644 GIT binary patch delta 27596 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

}aNciQ254;kms6;)>iqQDX?d-sD;~ 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 Date: Sun, 14 Jan 2024 23:37:25 +1100 Subject: [PATCH 041/339] better transformation conditions - 14 1 24 --- code/datums/components/radioactive.dm | 7 +++++++ code/game/objects/items.dm | 8 -------- code/modules/xenoarchaeology/traits/minors.dm | 2 +- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 54919 -> 54990 bytes 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index cc06f85e39b4b..dcc9da2c08797 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -44,6 +44,13 @@ return if(strength >= RAD_WAVE_MINIMUM) radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*RAD_DISTANCE_COEFFICIENT_COMPONENT_MULTIPLIER, FALSE, can_contaminate) + //Handle artifact transformation + var/obj/item/I = parent + //TODO: Review this - Racc + if(isitem(I) && prob(0.1)) //if you ever make non-items artifacts, change this check + var/datum/component/xenoartifact/X = I.GetComponent(/datum/component/xenoartifact) + if(!X) + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) if(!hl3_release_date) return strength -= strength / hl3_release_date diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 509ab414a634c..c5d798dd3b7a8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1447,17 +1447,9 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) return FALSE return TRUE -/obj/item/rad_act(strength) - . = ..() - //TODO: Add some actual logic to this - Racc - var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) - if(!X) - AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) - // Update icons if this is being carried by a mob /obj/item/wash(clean_types) . = ..() - if(ismob(loc)) var/mob/mob_loc = loc mob_loc.regenerate_icons() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 59c45a85bc73a..62a5b2d25578c 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -61,6 +61,7 @@ label_name = "Dense" label_desc = "Dense: The Artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + blacklist_traits = list(/datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/ringed, /datum/xenoartifact_trait/minor/shielded, /datum/xenoartifact_trait/minor/aerodynamic, /datum/xenoartifact_trait/minor/slippery) ///Old value tracker var/old_density var/old_atom_flag @@ -286,7 +287,6 @@ else if(prob(50)) //After we run out of uses, there is a 50% on use for it to break parent.calcify() playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) - //TODO: Make this calcify the artifact - Racc /* Aura diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 1e4af6cd9ec9d6f2d648060b67fc755d65e80de1..1cfceae696243d6508680f589fb625fc5b49a9c1 100644 GIT binary patch literal 54990 zcmV)NK)1h%P)V=-0C=30l*?+vFc3x8)>jP4whei-(2Y06p?Hz}f*Dy8TUfG<9&P&fUC2#0 zB^fOQ65Jylm>I3%{rFLzp*q##lbqMn2qnC1wxambD)dmoVK0iFbk~P;@Bsrs2`h_p zLrRCqtwf=;^H9Q06c>k<(*72`(l}uw3GM&UH&G}u_zfj&H?L23*594Mp$^SV=*+|S z16@OO^ejyzKVwU~d}N=G9N5Tg&|BnNr959L<@r9*;i#kK3oQWOXaV?2630xZUm~M& z3z1PcLT57SM(9jN*$AEC%d}`(ebJ=&LN|mjbwl`Kie&8gQi^2k_(F>kTl^h3@M zV9^ik!L;ZH{?sHDc0(tVyPdX%u=%UydFzy}O#|bHRe4hBE+}Lq)l5>;XU?+AiX$FIBFo-II zKuDvC>PQ;Zku<&c-P{VXU^nP^!dcJ+Ly29prd^Ktrz@fL0m%! zpU-#Ajb8S^dGdn!B%lC(0*JRXN|#?(bNn>pnqNaK z7Ry)okxv3%KHqP&-P+p9<&d1RRXvk(A?ZCs;a8;VLETE-KD>IAz(Bb zeNWq$o`vxFd~eyl9B+HYxT5vf#)JMOqcx-9fX zix%-;oPXN7i9am+S1o`%;eC7I%QtJf4F9I_h7~JTh<9s|rgMxU-vk7>9M(CVPTt4w z`Y)f=^Y7 z41Bq-JsOSD*ViY#*F(S7(OrXADW!H`e;Z_Nh%I*)$PbNvTA%GX)^8$LgJ73X|E-I{p_LH^6p;ps-c z2?*rX_H^3+4;CvG>9}AE^O#A<-8}vHx=>H|I zU@&Uhk#7&2ZvtLggORsYY13{0U6bHPF9kgBhDYBDhTi?V*D4{-7YXz2f%8qkzP>)` zy`~?36z#v~K-fETfOq@sow>oa$O-Ztg5=u+=bM0#YXzgxXx>CPo%Y`v2%Byazn^h{ zD;)@fyq7_F`#3}1uA!x+MdV`u?48#z-BZrd&Twd7T>>HPViwO-ysO(KLmjM6A*GE^Z5)%r^Eicjsv{26}bHV-CBqD z`tFB?OUohiQjzU4Hf-1+U21|wzCr-V5n!52kNh8pkJMzi%gDzx=Xb+p@0(8%oA=0Qd;42Y5TKha~ViL0(Ejz61GoLetv|^ijd} zkOV^hd!@(|0rOayZ(8ktWCZ~E?}Z?b9yp%_%yV(zX|;b<<>%TzfX-80|zp`C|-CCcExF zk=ghlnehXN;|EaIeGVyQ!%B4^#ZTjTwFUdK#bl@Ya2`H`p30&K9o^={bN79i!J(@Y zz-0yIu}1w{xDG;)k2F&9E#QfvWRhsv6jFQ$y|e~P^-^}?JeXm0e?Lj$m~|_`?L<)| zBy>^^ux8(ZGn>Jo6+*HT-`+iB{T}cwLcF9>uw@^PpoO~dR#IL&Bs$T;XUR_WGBmjg zZT0sFJG>-qQ6hdH_`ua|qv3*rWyMIAEFrbrM&SD|;ydsvQbwSPG*Z?i)A|fjwi91( z51D!E&`0_Z_81c-D`?pL45`#G>4G(6E4(Q3)3{r9AWNW0Y2v~~q~d|A3xV=j9{ioi zdlL9j7hu-PAZ7Yt^bqRMA)JvxoMTg{iBZft55g%h>zau!_!6T{HmDhN_mJb|1je z)egeO!20{p98SdWIfS>CWZhC^RY4L0O9n#?U_{NUY5}gdo|k+IG4BHWpiq<{Oi_$c zUV|_Oag3hCd;Sz=MFpwiN*u$znAP)%%`GQW2acT@YBGjq#tHQuAZji{2q($%auS{e zIFulczH|6@JP&FNbMd`c-f^UNxKV3 zm(3)){5I@8$En}C4au6o^!Z7KLZtO9lCzkip52(42xAR5QgM0<@ns)Jd*NZSr41xK zg-{M?KnTQajnU8|{KtBb`x8jj#YkO!WPNtRYre$L#~&m$6Kp4jNrlSj*mx@}Duf0Q zQ(zg;|AmK;V-n>D_LA@jL|Tw2v}4}*J0xbUpk)7NuSft_T$}U58YH?Na**ptfFB6H z!-p|0wxe(O7y}PHOr{Z(Juzl)eiorc$W*VxKG93<#Un&+SWVCBFEg4IT%l61?Y3+IsXf;kB8Y#hVyK&`ALD`MCO`!S+XOkAYv!JH2$AZ{o@ zAG)9D=3)XZ`|up!NxJbyqAPAj3pj~a&u3z32w65LJ(VCM>m;jIQZRUkc+D~#nJBvC z$I6Zo?A*`fiJP%*lwcH?0{mdjhUh65#>ehNm*RMJ9oOVZbVmcR8#dyd93=SW5e!Yo zJsyKC=g2Ofox8@xVD66)Joq}!-J6N8e;8xga(urY!Zp}Mq+;#+PlEGZoAYhRdk%6P zbpm`~WSi;;423B^@-vE#9zpd$rY?k8G=t>aRm7Klis;f!D5{K-O(Gj0O#brcE|Oh-XohqM!gaUeDx1T^x zQuA+*;o0^gjz|>A00zLcAQ~to6CPx|%0buK+eljyj-j)lXWqX6@?9Q0-i;G% zbQ;xHOz?CE@=*}805@1QkeX3|ENR#WbVNB!%v*vw-iu@;NR_X~HM9%w`55t)4%EK0 zIHryhh(wV`f%06a<(`@%yl4e|5B@ER!+|={N5TcV=_BHFQ+VhY!R^oEkA(>@2$7Lg zbi0ML5Qu=(52;EhI(wM%gU{eh3Z`o2qTB7H?edj%gXXg~=Otpj>u2wkkp8A)t`yf( zCjh{<*IyC7kd18IWc`ZUu6{c3@FaR7fn}u#&sj%s+f!&!4V*f1Eou8a0nSfj2UQ`@F)?+-10vDyg8K_-8(a-T<~IoiKQg?9KNf zD()bmIp~|UlZe2usGa zf#UU{7ggdpbq3R3%w)w9!gFpy>)%H@+e`24dpQ5_H|hT8AJX})Z=+95;@kHcg~!g| zI08gKJ{`#=w0aW7vJfM{1ekS|WNNFxI!7u1o}no!e!d&`sUgC%ZzdrWDqh@7nP4MLnzWP{`M^hV*+E}AQfNw9z}oj_Y@?%@%5ZXI}%1H z1{E*9M)B)Ai8tQ{ngf4ZCslv{RlL1nG{^J_;6vXbB;Pqmz6E$0`%i8cYuB&F?oo+P zq%n2D^5sjeS_Bz?4e7F4EZKpxryna=f?g(LNG8!a3y3$bU}EV!q~1gLx4n+*#2Er3 zojA^h$##YjvuYT*=^I2u21n0XN?Y4;P8pQHzMbMTeb{4BRP5N=!F8gGtXf3I6GF*2 zkVF_Gc=v3|ok5|bGsg9+jjX=ZPzVDQW&!h%DGj&S?! zcV3abZ@l0Y@^BAH-wZTsn3P)1__{fioa(?EPmolm7+Sj?b!e2by)R}0Eb~~AhdZzBU2hZNU7)6V~S%~FLkXNml*z7h-@R+jzZz)9z2mjOfkV&&0RQCBNYGrSIFM+-K(Dt zosZg_`OHBsk8WQ1 zXMY8XAiMA@NK=5&A<={HD0%-HyBECs!wc>tTb2cf;jf0{M_y zqr7j>AqkMcG%QBOlgtU)sV*sHED|Pb=&0J2pVFQ_OU6G3Tf7X{sUzs6Cy{2%z~6Nq z-IgIMxyX8|u!bWv{OSLTE!q$MQW7`Z#rRDRkqiKaiESc^eY_jRlF9l#csusuKh}yS zIZ+4BAqQ&62EnWZ$pc13J$9c1IUADR_n?bd*(A!7JmKQOWtz!JtVpJytk8Z-;RZzgbhl3h<-pm|A@ z$=*0qjvkiHy7`LjO1t|IGZZpaE0AMj7{ zDDj97XDKio#(!`p`uthMDl2d$O@jaS1m5SLM;94XrxUv+5Cf3C2S&!fbL9facWush zL0|iNut9^j-EWq{SV%MRd&P69>8!*P*RT4?V|9t z7qOjw9ZxpMn9{&_T?jlt1Ee1M1_@!qzvl?f$uXQ~pGOOR8Y5kU6#_9|#;PkuOn_do z5M41Se(8D0gwU)w>qwC%R$5Ow6vA== z7LWp~jNEi)AEX{w%BZHJ{$d}RzaE>a;<#`O+w0>9kt9=KV=B}{VrCQa=?Ox={s*)I zL856fvAHg!dmhFV5j2;MR9=g-ryt!@h&Jz5gkq2l`jJ!PRKD~ox+F-iyN|ftMb9n|87)F zHs4HOxCME1kf}M%#O}Tka}vzHG#Q5js|HvJwgXdC{>9T63z`_aXB`L%@66Wk6o~SCGm+M`l4e z+NlwS9e#|P?0BD>#QWka==um@Uk#D9-y(JEDvAzlXUZ8Q-LROl*AHMfRiwf)pJLG`>U{cd8%f!R;hw-w830`ao2G+z-B811OVm^a3x* zwJyxk0O|=4UE_prn2A~bWsDR3C~^Tok9Mw|$?iz0@)Nms7J z5lJH@;-nfDk*Zlrx^gz^)F>DxiMh9;7u|~g!Y{CSY)HwA6dl+{v|%OQ!8eG_`2^9m zw-IYvO}a!yF~EIv2U_eXM$H;V?kuF{xqrthDj+&<9kF5$p~wG%?9pe@8}CLLhQKSw zF=x~vBIl7tqsTLsfYX9%8F$+V^^g1jrFRe^S*U{wSOzKr(S3k|(Yw)YDuyZ}d;MfW z%ZQYhkh^1IqMWxtACb0ksf!aBQr}HEu>ux10(s+)( zft*f~vfYK0OfuNC0DZ})NDFZ6JIKW9mG}(h>IDG#*`OicIY_<*INgZMZbXzeQFOQ+ z=lB-J7S3R7@fS(iB)q#O2%g)I@8V%}-+qi18`(K4NzA!}WK{#AvH;02aGEBnkwNL$ zjY1atR2Q~rH;!ZbP^P*uWDiNdm-K8%RLrI9Xa7iYeF?G9QpP{|e<9b@V4F&T6vH=q z61j7LWYEdveSgZ-hB+7sDA@Tr?$#ZcJ_q84TTt9?QfKy|boHVNko63n<4-fyxQwij zkxyMf?QFxFRms#>6RlnWQ=qHBL(7qp0-lY0FahKX`OHD`Ex_r9QdWVU(XoU<#%2+p z^BI!!+$g=^9q2)mG9(LJ6dyc_?zEVwTukKl6=ZA>Ja7>$Hi<3LjZ#sJa{eT;B_RSK zM0ga}z!Z`!qZbsCoZo~V1eG+|^a%3!5tP_k%pwEVu780dADPM5S#FUcwbMUH}IN0ltp zt|SH)!^;;T0*i1=0PZL8?|vR-a+2%_2w5j^cn5aNB9%>%t+@r&YQfog5xpdgS zEG8Wm46J^L^kNyM)kJGMj4Dj5WCEdsv-?e4r`w2a_ySRXG0B^X83_F&wpj|cjud6v ze?iff7s$8;a^pJ8pdV}a9Fm?PvS22zb^|$;#b}z%SltW?S`RT%y_CsseuBvYh!j=e z(GwK*okRWOCn?%>7)zhRK5Hi7aN+|CAa9;9UpdHS+tAyIfQnh zi>xb-5}JwTD<}Bu1O z(Mz3--t%qJB@Ot8&tV_w1WiWvxRHC#pd3GnW!I2R8)i5PO%=q~e1-8)4Q{*?z4kNk zX$VgVmIF9@67|#tgq1-UX;5^eMJv!|FCrT7VKxmC@4JbTpZq?yazCjxA0t&#gKQNd zkG=^>unH>iwLFV-?i`ky#nMbf<6KO)4;)_9$P{{2F#~lsQuW05aTJv@Id>JlEiWKj zS=4v}OBh&K$eImnMlJFUUnc1yH1ci$03ZNKL_t)FA~k;JX))Zen9S$uQJ;dc{o8RL zYe7443Q0&9s)=M~u{0Ovy}w1IaTQrjAg4yq`j288?L^Kb(IgcmIgHUahH>YgGqq+G zg)cvb>$zW(40$ove~d)^ofvk3W1s zxPhK22!IHJ)dvm*>es?OcS#ISNxb}$#rP3$8ZudIsM63pl6Tdkn^4ns4A-eQ zu(zE+6(&NFFqdz_wf_}#D@?+jK{ZB@Vv~dm%ZaYNAJX87X0YiKs8TVZ{XarZokky< zg}{ZwG*N~pi6@;HikCp!&vCZ3K%g3GXV4e#=Z5$?YV-@aUqvHW{gh$yvQbBuF-DC# zmn!QpL1`0@IA3N!A7@^A6(5rlAOwG_*x9EYXGH4al-a_NwU~#*Og5NpjKpU%D0I5C zUY;rXSLzdsSdzGr+vPblMEWSz9n6wj`7=y<G)91WF#S;AswfKtXI-YAwTSljO> zDE2Z}{R02X`Ey3aAh%53&O@?EiTGDaMFIqTHCs<6*2E}T-t?Trn=Rq`Qxdt@~ESn)}nI^ znCEDZx1&cbzHy&HNd^=PI>!Wi4nqGvkY_+?6BOCNL3{)Te&A3Hw3k=G-lN>ZI&SFh4fB1CqOa;Hiuwc zZ7#f+ia{g>rUF%(h06;@Er@YYXTqAf@To zNVvdALb}F63Z_x520x|S4$$AW0)O8zY!^;pt@|{Y%4#A38{@%Q)Q8(J7JLzHxRq?E zk>SrR!th%V0Fn^v)gW9BJy29o0hUft@0%E*Y9gQcUEFUziEs1>uB~mT=k}1kDWTMeLD#`jwwq-L@#pkRvwNw^I$qdh!wo#>EccKIL92j=yo~ymHZkR-Qw`%-B`*d z&igY&lwlHP2CuLPq*Qc{ps|K=^>Kn~IiC@=AP#XtTx3Y;!=X92Gu}uE+W{}I5eQRg zoaJ{d6OS~HSG}F=)b`WkZQz!PX71PLp_#v;LTcfV$THjc3d4MXLZ_R+WC@A|x|JfU zCvhn**02;qSc2bHK^dAWlHx29Oj86@jZ1v@%qo7Pi$ zY!K^W5BdrRrhO*%Yz#vIQZnpMfX59&&fTFpXfOE`h7E4`$s=g3Z(uF`7}=(qag3Zm zJKaX4L}N76$dr;nEt^5T+`t3o915j_z-n?O!A<}YQB}u6W^uX{gHHBH-Nd9YnxbHn z-CzzQ%Q9g(NsI)hVu7kKZ1uC*{SqoBKNtOy zgY4$+nl5e}T*P;?58~u!eBRi`7g0EXn;)Ej<2FcTp(_H`IA}hQ?ci0R&<)7B5NOj( zXgva5dmtPKP05i7kt4V61FZoTRKdbZ_{la%w1H&;rR3^;CczS501g$x2F$L68)w3s zz3@^I4DW!!6QERpJOY?d>jRqvE+^Eu!0m*MvmvR&fx}=Of!e!a)k0WM0efX|^gvpG zkaANVgvh-#8LA6mR=tdxl!qC=@kbO7?4f)0=W**QHHV)-FRa4VWnu{x+2tbcZX{N; z0GBZgZ1 zvvO;JEs4061bqd9eU#}9xHT_*_KS?jF=|Z%m2IdT;6C#~=8k@szb<-)gZ5W>rsR2c z$SqXLa|jM^Vo`P`Lv+(Vx}EX>cx3RoV4@b%?a;%i53sG!~U|t=3ehs{I9*(wx9tQi$T>c;qgA@hH%85z_9^VXE1!}!;|0?*Cufk6Y z;dC3A`@!^qV=c^S21N(c%w0oGS*|tMeI7b9AUPpa2n(ygsY1Cg_nXq^?y7 zm488rnuudZupd8$<+oE1H<=$F=Y;DI>A2&!D4j7M$>G6rx#;uEA^TZiXN-j1NwJ}j zdUGqkm;EO2&%o#Cz(EKV7ey%2dBDUp;e-`l-bP|7Pu6s55a5=+TC!j2=pVcFAihFaLXFFp$v`=!dL<< zB}d+n7b;!Qy9gu~EU1KsZiF*o*t!eSXCbr!szVTqLwh|~C;$I&Ndm%Kb1lTh26!|M z_pF8AzZZVyhjVpc*I@n(*f10N!Z0xfSra5VcLKx8d39{L?<#U`ZH}ho5_rgo_cAO2 ziUhI-ibJ4=`-iX#9i{yup7suOSt4=YUtv#12>U|FR+y=}W$2oqwr4NtvU(x~4Yr=CN6KXDHQ))5{~fTGRhpuL+P`CEB7-bka~%UuY{DQ7#w{E8D) zQo<@WQAeCI(T>OLpv*i-6O(kQ0tYs#rxx;Q>kcG(foe=y21y{vDsCze*3%Sc=HYg? z(xV*Z2UY*hpACGCnbJS=RPu9tRt~dUdX+Dg%KT{L%lIrm5<5V=fSn_JNngg72JZ%b zhnM67Y}Gn2%{Yn? zp^b2$7gFh5IHf6Yb{JwQP!zD+b3``9r375fo!1ng35aDOotr3xB;~}W%DKNHn-fti zBT&sR{ua{Xk0M(Z1{R8C;yC_y7;8U`q0J|v7J{PU>d)YB+ll1y()Yy~O!!}=bZCUa z!QI$WQBuAlM$2zua*+!$Wx;NV&{!X?;d7{&6qaz~`}I#rxFK4-0wrKjpdZDs4xzG; z7!GtGhy@ITsKtgHiX0B!ln3-Brg^^mShl?;-t(3PNAVVoTSK-7FjIGLcKJsp-2j@tP7JtZ0NX* zQhLOB_7uO)4<$F>iZ5k`)xlq91driltF4bea*y*sdOmk#F0e?1sbm4qNuwO4pDu>+ z;-W;VppGi+LLw{;anyDWyV8y~Rzz+%(IgF|Z5d2UM;3Ncl;L7G_fGr?og8P>d77Q_ z^PI0f$*uh>`0v>P{$=78{=lno*xbiMHRJrw(5r?NT0m~WdoCQMj5CwHE17mOcAAb1l$miVbXxXac~cTI=o>% zm6>lKvQgBbZlwLY$u`|avaA+?i7YJCYzo!VkrWk2-x;J6D=}{Z&tJcW`r6YNQ(0V! zplr!eCjCEv)iR;&gD8?gXXP!35ZL1xv>7)MpD$pB1v{n?+=cqe_kk=W6tfl^ZuSDF zKzV?qtqURRjB68|kZM^V?gO!pitI~#&#Ypjwu~p#i)>R*GNhF8mFzse8*8A{<>%Md zVJ=!{NI6YBN&$Ask0dk{A>q>Pc#L9-qXkTsNMsF}jAdXN7LsDeB?_s@R^i|TV8^b9 zFjPUm+|Kib|HNtk0@g>D^QH7+zGzOcI#b6#X~+3D`7mwnTE3cgQE#;J1!@RU$w6s? zZfTG%+2n+*BC7@o*AN}XF=R!;Qf0=o8G=;ts&a-Y`v@65gF79-h6hM;pD~kzQ}@#; zX3*z3#+200GsRozk>~M0hwkGa5*9zz7P8rPmT#B*n2nS7^1bA@@QJM;_5u+M!pQVr zs)t!flQf69^*h;e680U-k;2M?tpHB;z*p8lp$A^^Lr*uD2~g@_c@xz5;9wURCO93S zYB_OCjDi>hDxtgx0?wS*_1SVsY>G=>nH-^Os=aFn0InahFzNfAL8whYq338wg!^1J8k9605kK>;f4xq>^0$tdih#hWY>V zdjy6$c&OhFT)-rPk5=H2Jgy0Hl_ zZSoig)B!wZF(210mWzc%6fgbOC{b$?LrG!EStP(Ie0VYy)MuJdRKcLxNtP(GEbxgU zmL_iDn~9|qNpFC-i)UP24A@VTBuP?EFe&wO!G3|A_Fe{rhh{6p8q1EV*f>BBCtOn$ zS$^uwF&c$Qy$Io!JSei0jASt>4>IBGCZ}Dc1i-*XtHnEZ8_F)dmCpcJWG9z^} zW#$Y(AY;8XY#*fnq>cQr?nQRAL3BTec8~`l+X+)9T!_QH^P#dl7f$#K;D!dcZEnsB zxAjBcQ0{!8BB(2dlfBS!Hdhs5ZUf9J$q{}q0>^v7XouovSlkTh6r34_u3qQ~gFXoI zXl`wB(g6b|=m~JTV0I`+{?>lj*#7V#k?yl1$<_ax!)%aVAdWHjYc|kuBSjC98LeqS$){0T8{H+j~1@ zejIq_$9?cTxWL7^xO?w!t#7UMohu+EES#S-VQLBH&O&Jl)Gk=H3c8!1xymBX86abW zY!S>!kb_5NpDctPAoh3=$DAG4^^u3JYIAkmbQU>gyU20B%HHHQ?$nkEn;tIMhIl!6gkjNyTYHFR z^CMUvLJT|0=)&M@rE?T-fZPoB4dChlEdcq85H7(?84h$=r~ax&*xUkM7feQAE^5J! z${?(31-}E155VjIPz60LmMSa+3@pRNDKN*NrUy25L%9UcyaVBDP`Y3R>QMmI!s(g^ z+;(WLfzDcZeE?oM1tS+=;V2lRAZ09gqn9i_0yijK(6<)$?}6KTtxlFIS){nV3aSI( ztp%G4BxF`$a zhMzTtox5}$BtNI51y0Iyv}z69TdHP%aXpRYTD;Vt?G&(}xF>pqRyNUSqwPVP|Ori@L%>)hyw3l&C&O%vi)UA)u|{zJ)zJ zhK7@~z&7BXmA=Vo;5W#;g2XFy>oM+4-$73HF{s8k6*`YCxt=eJdG;3fb5U91l>HR1 zh2G=$!5f^Gd}yURX=N)(@jBo4k7Hj4T^+D#6*TxjRv_*H{R(6pFqyGV-?l1{6eyNq zISoY@t5@MmjFH~*A+j}{IFG+XX4eD6_5@);$2m|W zZ`d&R3+ODsRLQy_RIdV;G#Y<5fzSoMqpu)O9;MK-nUSgknD?pByh6c8O)B1tQ8RNM zwUA+c@dunya=dF6`K@P~*ZgO>Za+y`&eKxrBYhRGTfc7;!tr9o?;DANsunZ_?z-I zs`P7YGBRvn91ll;07KFt{w8#RBNflFV9ry}^5}XAMUwFmqB`G3U8!fGl+Jvou& z27_F-P19qn;r^1FW~q+LEb_W~nRnbVPC4D!i`{rkKh@#|)?skP*o5Q&n@z6NG_))3GK^7PSW`Giqz{Y9zlh ziy5%X(6FKrtgZov4G!Og(^p_}8jM*G)nF(vw+O@2Ffa|JYhdq(Eq$=2((1+6x51b0 zf;;-*mbI4cLeE3QX(`h64mhwLF3-bzgJ2AT+z)261((WYaO{G6_rquIfQ#est9LDa zaA^o4MQ93vO|dG_^%=M^3-f8n34z?UcHfiw$P6O60Ih9k^_@&NZzc9nHPu6lXbsIc zqGjsFE?_gu6!jpTufM_SAO15<|NIkbe*G-f6M~qpA7`ON{j1+XU5;TZ>$rwb6OxuN z5{+bIei(#RzdedSJdTVVW9kaw#ltLmN0{{vFz38MTudWlXLn{Fe;2uh`^{NAyav1r zoM8h^FaR8f|6CdD)tY||9AAa|An?AMzq%WlTxC1x_6eF*>?J+jcm?(bWdy_&n2pw3*Jr@C z2@dXt`!>S=`UQOOETpbLc@a`W5b;644=oiiFb~&9E%=s7SiDAVpVXh!s{Cl14l>gH z7#<^uKRH48{#KSeyQr8RVYaH5$nFl(zDoLDdde2g$T`u^eb2v)YTp z*NuDb3?wqhhK4#bPQ}bg>Yn}ym8BfnmL1HtZlZE-5ZmP!aR?_xa_D9O#jxQkH}k;4 z4!)LarOmv6rJuK88IP8M0oIu+oyG=|ri&#rPF~8AlTu9E=NPk_)aF{~(*=8UfleJa z!&aZ_Bw?WkvC_z?Zk zK6=vYsnA!W>n3S^nWVWu&K5@&UMk8#YVuB1hJ3bIydpn&|%JcUu435l_}d5CcM`< z=N)D?+sX3DiE=wh2DA2fp_#TzU=9j0svGY@4|)&*7l!P?fBOHh(0vemCfRfyZRmcSzC~a|&sP|*|cj5lv_ee+x3`l0c6cje@Wqi#x$^t@5gP8Spwp{8%(NzM4 zTKck^`ABR%U(qGp%u|%N@^jh44`q!PRFy@2H7zvbW{PTKn%j&mgiRl_QksICL6eKb zZE>b;UaHcabQn6DFI@m_001BWNkl3yhvDQUizf&#m{k@YM+3bEJiFlT+u=+1z^$91p&EiRcoV>qr}!hifZgmi#Zi;r}@2f6tU+$Ww#0gV2Q zL>ip|4wMd%rIR@&%Cs0@*g3>ou2Dt`>)EbtA!WSIx2Mh{?9g)yJoX?w zaVP9s3wzgEVwYk<+Ju}Fs_oFz46QZr+6S<73?vVhf6)$N+8TveyBj`w0Cx4lFW-cp zeE_dsh3jJwDOi}?uELcuICt6V>zgH@1G*ZZs~*OdVQvZXMUZUP_Z>FCgg^*(u7^+T zgtsQ(cgH{*hfUkzphLqHF`V=pOSm`!lqiUM`AXT6qUtge_6&=K z7PcCF$mVI9v|;WoZKqW3VOh~JAU zU92`6ahvDZW7P23&ww>SGIgTEtS^KLV#c0)4~^r({PU9sr-$dX2$pxVEsuGYTNDf{h)py3&GUQxVJ3P%47o z18ZBLwHn$QV0$afrQnsL5P2IMo8g|l&{Jbs9%2PJKMf2*?HX9$0kd(4N5Q8+?`l}x zD3BXh-|?h9GLQG&U!a~pg&;$zeGBfHOQ`51yBa`Os6BELB|3&8Ln)g_#zaM+35gOW zIs%&k>hxAp)A3uY{X3aAO2m08s^9Yv7~1;rg59C1STe#BxhFit45Q$A3fpjT4A`h>3=Kn7!+M!k>AB`G!vt zutg97jrn{3ftw%tD)RQdxb!gQx~=4ET5$jV89b-nK-;j6h0k?jRteO@WoqBKL3+9d z?lH*f-PAuHq2KruqTI?&xs`tp4)VU|9Twy{0%nNr=w7yD_Rv=DAd61kULdQ4iA!+| z#mbQeweALWU$|${=YNs!3LonaTv%!#=Be0 z9!cNEL#0|g{2$O13RIs3A6%)QpIJ9fr40gOaSM!PC%*T-`vVx1Tv*BZkdHZ|cU=zZv&?=cpa{HtxHhV7U4&3Wi3d zZ64e86XeTTX729B_-mLt+JJp|ABNA)bmcy3zqFdFAN&aw-~BU|%=a+jCEKo8_n8KjoC@@@@KrtjzQXW%M!Bo*? zlO_8SubRuOLB?wi(ov{o%+ZeK%90jIRLPE_tC+eCm+8Se7m{GwKq$1U?I`+Fc*HCi z71nbkfj;tVM98x!h7ViOgNcTsIl)xOUy($>*R0Sk9}D49;m!j6Vc9-XX_=kPI@83M*Y zc3Sa4lGdL!3@}!_6Xg=*@{mYCvH*86YeDk|3$p++7WCP)8uqloFHgYmFq9Xpe1V|?7oao>qqU%QTh35Z!2UH*6mYlz zi$~yy2@5mO)n`E}O#!I|wCgbFgkKb)qrnRIjL*Tu94OI1kjhm%2%dPF!0bs%$`;b1 z4#m{by0%f!vqX1(gSm|!2!NPTsJU?(HLsDo^^+K11b&%i{g3|?*Xe0WPN;sOo7v5s z%zoo-*53FnYf^_9I(aK*zsj}Geutj(&(rz*i)fAeDcZ}N$-jxq<-;bc7!v4u5n-C7 zMU#Z< zPgn)~55NiH0V2Z9qO{CQ+WkCYD1>-s<&&2H8&1ygsoXl8%Oz%AGnCaV&Vq}UWIK#a&c7W5oSIfPA7NN7<;Dz5UPL*-;)grt&T);-FidXv1!;K56MW&>-J8@UB9aq~KV zswHWT{5k(q8fMa1Mlr1#o~H*JA429R@N4V3$zoEA;5PEqQIxF(QZ}NK8BZ9 zRtWJVV4_on%!4e54Ls-hEhDxMNSaX;VaF*#%v}a!0z?HEjh3CjNL#c0D+1PHn~g#& zXA#TMSqOOHwzY6*t<_)mJE5%tULA%vE?Ht#%RO*QH&i$+lbpwAaX)TCA_bZW4i6ZT zmHcXNgjfbHje>sFYG*dKTcmf&1oILU^Ps8_$-s?yXsv)lYoMzJe(Qw6t8jGyhL#{u z0kIMo4v;k{55S-X11YPmE5|_0fg)A`U%pb18mIR#!2OUqDC06&5cV6;L!reh8?|7B%&=6H5V{2D3>(M zl8LIw1PRiZUClOnfN4zg0;{>i64;x$QX9D;v;05Kcc~L6yg8E(N zg4xkoYzdgBEk*>uh5^+j4s;G+Jl#MKklu&U<~vW zEcmQNECd|rgZ0hUiJH}6ZVE~XP!vnd3c9RzrzEU|mS435uIVKUqHODer%kKs_}y0E zC0xc59jd@BgKUBs0#URoktD;F8Mtr*&MUB{#ey||@iBPqD*XNwl+HjT4R}^`2?M0$ z%5~3!q+{K+UIE3wP$sZ=4a4O_Tek*DD zng7O|vP?=lhO7w!#RgWTx8g0>(8!T?WXao$q-{k?qKt%rqp0G`RMDGW$2QslfgnuL ze1>i4Y%BL!Re|fkkFaReJzTQw;^&@|T(BP}JrVfuI4Sp*47U@y5N=$cxebu4O=#4sR()yZuVIVu_*|hb^o7qdIBJOplrZ=7>>`t zp;gv@QPZJXg`^Eers1_~aB!EPteM!OmL_m(2h^)Dr&z?g;I||`v63P9L$D>2gQYyA zG>8{qXdKpe!M*D&h54`_ZiK_I~soAkWVCp=M zsUZxhNTj-s@Wy=@?LdzSZbqmhQO5DwFULs#+Us=0lBJD)Lcp^ae+2j{D- zXBA%K4s#j4A{6~y-O7Ai~#?DrHZ;%ey^YF@ZAGaxIqw*SM~}O1Qj? zgoJ817%z`fF!E@ci6k@>86;H!0r`@FVVKy2jhqr^y!Il|iaFjBE>gxkQ87u51cm_~ zwUVvjyZCZqKig3$@d{VW;}~vGvcQ~$=!6ei+TiXDaC{2hJ_XtlkOClefjJG@DVTP{ zbkf=Y0&v=3cLyvb;9@@{PQ#lDq|#8~fKnNR0#YNCF2WTRGIGKu2F zsO9CKRzRx+b8%(jglQpEr^5==$2Eu+tqL?WX>H2e)mJ0dw_zqpFlx|&R|gGhZRh9YCi zCDOGOOy1fHQZK|HaC{c6sADTdn5nymM4Pa<;#NR5aQ&o2wy7Io7Rg>d&+?wXWO>Lz zPK5F5A@*gq@@dmc8~=bcMxYAI>vA1<7KxP+0W>1mhz&m$$l4HVGyv-f)5%Zl zlN<>gW!!$Am^q8j?xWS%L?BavWN6Il3F>1ulKc)o+xVVy4bS_2$*lbxIXQ_bz@<2O zn;N@;Rt9>dTu zWeHgbvLZuH9%WVIgBc(wx`+YQkK9M41f0>}<)p$ZvNy48)^(P6b}L(40h&khwq zE18xoS*_4}*20=PSjt$5GhMd?u=!;ebHbt<#7$7-)34$gJ&ZeAL<3Bx3adk?my;-k z0x}@lYB5}1{MkId$%|y`+PK+y5bgr$KTYcNtIRd8r)p>f?>pZode`5O`mnG*^Q;bb znaZzE(R}`=%y0Q)7I!~R{oo;r{j2!4_8peQ936TOk7t`{=OS5gH*bg_$HWYpX=Ag| z%U!IchKrPV0UKAbM4wuq3up&6W9_z9bW~nufwydDxmI(Y3EKtoMgpJBM|W-qo#9^E zigk?HhDZdL`AT#je&u^ywS9``e9tnfUPg7QxI_?4$V*wmTJbWz}o{Jk>7`I?g~I|eZ1G-}ZX@me%xH$Si+ zAtFt%O047a^B>_;g;gu>QHSzINc8hFae||+3rtrGvuM9bQi)SCOB9U~=|Ude&_D?6 zvO>`2C#W~j8ClOG$q(^Bxe_~{rHF=|M=8=zrMQS1I*#T9ky)8@=>@OXf-&)wHPc64 z4J`riE7tS#J}_3M#u-@d%E<+*zur;>4|ZFIx7R{2bOjjet4jQZb0HQjuCvVk2OXOUa@dryiR{_~`id1UNN78i39O>c<+NbCO{-?1_cf5&q z_18pfpW$oncbIWp!{Z3i8QDTjrjD$dXE8X-l3anrjnb!1(sYxq{I?JD&ms-T#}afmA!@m`*HlXI=(t{4-b@X zu0T0!G6kjq+|Q@Yzao}1D7y_3wlFD?pkS0JlnWS`$U?@gx^OFQs%i|JfRd^nXs<2wHBHJAW2r=UkJE4Yz#)0E$)yhTFX(j!I~N#aV^WnKYk34E=aA}NVykk2A3$;ZpL{ng-yU6Q@z|P@?iGy zeY?ilijzd_lL$%2CfQIVNGl!KwK!ILFNSq9+B<67E*X@hGP;nt$~bdUh}tBt~bMjTVUM=xDkc& zaafp#OpT=h7%KsFQ&IDj z;NmdM7A!jjE2C68yzrqNuzd|2J`1w@z*nF2E!?CWs3BUng}K^|#8-D=j|m#z{x>S$ z`~eH4QOZ;F7Fkf2 z7#C+5S1-{^8~;m9aNT(n*#jM^e%8g-vzyH%C~(0x%4}eexH5{SX#_iby3Jc4(Cqbpn`fj|IWbaYe_zyd++`1Ee#vID~`V=pO3itWpDBTf03&t z#E((&tiZZFun2Te;vs%0U*&_^3yisrvrwD`)1<;4A|zMhlY%%TH!=!BNa(Ug(Vn9y z>0HPyu#1PVGm9k7fH)0&z#QjzIxvauf#7=ZbXb$tl4D?2T6y5*9LyI%y8)$?bqcd+ zh0s?uSui7BfMUuTiRe|VUYXkoc>@{)R`{jD4|P>g;ex8*%0m@QEI>GKDZsaEgINO> z7hviXygLuw4e;^(;BtUlvyu;rutd5-$ui4nngw}WHY$N-*oy`9Oc?wD%Ki#WMMf#+ zF`Ab=P%#Ds};E>-Nmnh*BJI+AT1|QOdDRUj?M9nd?wM!yF(g4tek1$mH}TcnK{lJ$2#Ie{;yLnM z#l~rLqDZ0*#NA|h47eAA7SbYyLwbcavB-|xNAMNvY0G)JrPRyWsqZ+6c@aP7Z zE5ee1@{onyF~O_`VTW~XmTT1Rg4#-GtbzJ!D}>%wX)Q`ghH5XYsfE6kzWuH>P#^Gc z_*{uXz=|zyYk=NPa0DRhgyjJkc;9MJb+*F&Tde_JiVJE&P+bXCAqe`w^M~NP!>Up@ z7hpUFOoN08%gDGbjiXRdP&|cqag;ky7iTafiEQ;Mlz0YPGK$gKOKNfuW!oPy z)q8-nSEeEp$D0|$KQ@dmxe3<R>fE2&>YN)8PfhV^S+Cu)EOMY z!M3Ga`J>bw2=hfMYyj>_G^iOO=EgyFEDBW1`{iiMB`|3H^wqCHd z6Lif)F$A(?B1u-)#W1bpm1bCmHnR+c0xV<&QpAqOq0yq0aQjRa?Vu&?tU+0dWL2J=0H+t~YoRj^Q*}^|SiC^EtsbE^ z3}*)f)xv?e|0}9FIBt*~(_z_~;%inw%U*c+UO^!bhmV`gL@h$Jwn1?Jek(Wn<_9Jd zQ()x5+W@z16*v^ZZ+~N;R0;0B4R-fP2-Bo&niR5vU;WPD#xcQ;+f{=8X1@Q4)x@5y z=Ns?k`0IyisrljzEX&NE*7)~d8$7h8jm}4gN&LE=7e-P%`eg@=8?sO|$Qvb=o_F)Z zBPBlbc#x)h7H}0^FeyRYLn)$=J`VFalZL)Bp$GCX1;<{u^Xib7RiO$#`cG%ExzZRJ zH?okB7h&w_Mt*oK&*!!~seC9&ak)VFr%rwv@$kh*9dv$t5dAF|a$OlV01h1^Yv<-k z74ah<&o0^tXbLBcCI0;DHEh|m%<{iD`TN&n%**KK!mYnIzfX@&33I8a_ksq79m&;Pq zL~6sUjuK(k3KHpvV%6B4Jl0Yz_t0E}__E zWK}{)ma28>%py*^jL&N)7;@mLa^S9T;Pl&YIBckjf-Ff01cqs%8#(}GU87XeDCadw zIqPdNqy4{YG)*vc6H_-ZbQ8U7pqC9w1)W^JOg67kDC#J4nKHRF7|ScZY#DT~C2aHr zOpeUJLJpEeOR~-;OoBygM-@wu34=Zfxh!0En*7ycCT};u)Nzxm9_S6}v<0DTLWOM7 z(hk>8nA`}LxMj@(`PD%}ha}W@YY4p#d~q4n0F6GGa=}kmWs!g_jAyx*iZs;KkHUx_ z^F}qwrcs((RJ4Mh_AIDGFfXKfvqT0vCU3J$%N`Ms3qcWRx)_OMleyNJq!`| z1kD6s++(GUr7mRg;wE7#5EzCTW>Wv^Fj^;+sxUAL~P z_Bm(oZ-3vnwVB`-fj~3@EvSb?Mhr1zvlhjYN7W68iBS~=MFCAyF=_#}rD0n-nxV>T z1D2s-7#fDIplHerOcaY45eq~tP+|o?@c(G>DT;z+86<6sARAIIdzi@(ryLM^(MjMVX1QCf)j9Ejim<*)c!M|TL-)DgJ!e00*a-ubigOkZF2W? z3oko0HvUa7{j>XN{q!)bImr!wk>ug8s|^39o4yqeiLW054A`)W*Z$7p{>eJYOo@VL zplKm@q-U{gFv&XyPxFa8A{KpZ4`9L0F1#J{urhU+JI&HBAK}w&v-#O~4UYbzgSqQY z6KY5Coe(Y5P<0g(P&Eb3l)<4W3c4u+Ux>!e8VRsexw{I`4f$_XQ_#I=CP=Hb01?N8 zL5!jZd`%$|F_DNdLls?9Q549g4Rl?_H01k4L4@x_C|U?H6iPJ!oRVAsR!WYwGZH#> z+CbHnnctO$8?IA^(2G!2g(wijA|{UH4}h*I*p`l|tLWKwaMKX=N?g`T!BtBnjrG~R za5yj7eM(L0KI29^T2aA`BqSCOg4PMqet7vMu#@ny_3-fXu>TD>QigYWWUh8}0)k;k zbjtzY7+Hvi>5B!gyLBd?Y$bm@%TsR^$a-n~i6pod#?k`n7Mp!fHZfb7B9(QSd^OG6 zuNib`g2X@#W~pdb4ns#p@_6mWs&-Vo-SFI720KRT{Oy_y^Ol#{b0`9IXsbYX0thiJ zmz8QOTaH9rvnc~>ilAB451Q<($6VH=K&nAV-`Nh2&!K)mBRNL}s|J@IC3jAhE-S%E zBnYb(`uu=)TPLg-ynWnfv8VHhSHsXEUM`n-{cVp2)NXp`mdLEBvVKk%|95kNOFrAf zMRzvS?`QZwzlnKwIM1p?JD-WOxWF^+1g}kx@{8j!f4L~b;t!pGa+0C{>gPXx>#%Fo zVSaCx&z#rE>dznL{41uIzhOC_+&9ASwssMmx1T7AQPr5ZvFl0?{g}`b0C?2^uNt6R zXHNjlkpF+(($IB{C={exECN?901*kINKkV^RJ9Q^jdV$fm?(--h*1=1YO&=h(@3cT zCxY0gI9!##djds~3ln6Q#Yo6SU}sItq)xKQoVhPEWe_%kJ_-berQwU1D3mD>NHV2m z$`e7qXbw!5B&4KjFuPaMT(_TucXoic8`NRhCRggrc&*1m7B?aWV~+HdaoXVIHhA=T z_|v=KGq=L8EGTS*y*8*R2&X{rf;qjgxJQL-4TcQf_d*heEmIX|Eg2Kjr!fiPc*rb+EqpTUn zI(M1{TQuI?9nl%Y&{1QdVKRO=OZ)sH%F0tHLMm#nzQW^?XAEXNw3wdbB{H=X+n({L z*ggx^S0K@_K5#WC=#&GUWI2Y4283Y8=!QzciOKIu(0Se{7u+>P_ms{4zvwekb9r;W&xenyu%^Pj|CVIu(``KRe1SLr-DZ_*vd6FR53>eY@!>Ko-VaL5 z7mv1c?6-aV?_*P3b%TJxBGI!8`SN2fQzrvjRh@lD%KTd`;E|QxDEA(u>4qxBg8}UA zrQUM@O;e=Rcnl(p3B8DV(Icpb_)bLR%b+%sGU%*~iHIU}QzdXhjD(J1>+)m((ycas z_^3HDFOQ-a)6g(RwKoCa)uNn~f z5q8D^bVL|qG#0C03yA`OZfQh*MBqj8RI^mfgf18Gm1`iQfM1nDWkZ9Vr{UH2V0a(I zry3Aa1bAmxvxsGPP>Z3fS;Aqe1qluIZ-B>g@YTEF3+v%GX*hBe{0T75gZce%_vMh) z6=0mn=?uq{E@MLH__)XQOPaX&v!~E+nUww&2ta4`7krlXwo!bwlf3J*a&C;irb5q! z1*jR2(HZ}B2mkw_7;nO*9@lAk4Zg6ag(d%Um?hVgSoCT)`wwee@CBDS7uA`3VKHju zB&=$XVX6uPcTI5a6g;#?;mF<)C^6fJx#cp2mg`61NDk)ZVPPIF>Y(drEA%-qmz!QaW*xL%zDp7Yyex64RTF*_R8QRS58U=#VXr0K92m^r#W304+Zps}$*<{I` zH)rD40_=>5?}QM?Xr_i{XastM>FD^5j_pNweni*^T+fflrVZ3a`h%j7YPAqij8_YZ zg^!)KFjG2aQpZT>M1eqUq&9&Y%9BLM>#3ST=tjh`e0}K4V2_2YN#a;898Fi`{pk^^ zreG#@?2L((($R-TY8 zo~*;fMtIPMKl>2ea~-_A9VYWIryo9Wt|U1nwE!L(Uj%)Q`20a>m)9&@SVR)^FQ7^kEp+bX&EF%jpXg)toxU7uHTxba5X5v@R{e(IgXFTIu+J4+GP%ekbH}vexLULO#Xu0~*bVm}{4JFm)>6@T0xVH;2)# zKTYqI!%#A0Ayr5*_vblgyCHM4Cg1rdi)qE;=EYf7exS^(yGFT72oC&XnrpliEGmN8 zm@`ByPolvJH+A%YAybCtoFJ{MoD8e%sJ1c{1_Wk6tcNIOfba!6I+z*q8?Hoam4$9B zV!Vn^;K}siOf8UXwi-LTHIsG#7zqtKX<#OG6cqwDLPRmTrDA6c{CY^j3GpnQniHU^ z3PQvLp&*&iXH0q%O_n@m6wpnTTz5l6(4b62zPxVGs4qk)ci=ON)=bHwI&dOFU+(aV z3bBaMbcHaI*U?Q?rbAAMoi?zu26oy&|Ltoq?l!2V3Rof3--W0IYA=YMhUsV#$Urs? zNdtxo5c(jxVBs8TJQRg+-JmRvpDM%tci_P$X<7Hlt0jXlt;1*qe(?+(*%z}Xxq!io z3UppG%B`(gYCAMiR~BUOzdj4Lv_V3FOUL2dQSc2oFdM&YGjY5Q+blE@)BUpwgbJh6 zAsRlHcH3YYJbrA7gVTaqNh75Ov}Xh-CZJx6NX~OuF`eR@W2ZQA+{01@3+*P(-_yhD zyC&#cQ6hJBo?J@6WENhV#rL1o*gK~2#b6Fg)(yis1?Zoa_j{_1W6!s6|0^+xn#meF z!Fx%YA8eRr#ql04xhkS{brB<>5RTZSMw|G`{C@0{6Z~k`7;9QO&_b0*H;?ht!-9u{ z4m$46^S?F?kblVr(b$1Fb1GU8>R1>sY5*EsROVwXT|9KU$lsO^lhAdpU)h0r$q1wb z$9F2&g^*_+8)f65&Z;{a=}#2nRs&o=LWr1_wgl-mo6w7}(*}j%8fH=_7BObZz)Bg! zKqiyK3#5WxQI(kt!Kz7k(sU!dAR-LKOj@M=0fcHLbV5TV7Le#MQ5A(4@M^O55MfN% zxF-<^R9z)>BQ#5%N`@^{86zQoVsW;9iQ@*1N&!_@(e1_p$eGw_L!NG9Pc(M&#tQ-+ z=#&g+(Ig9F^`unKBs*a4pyY8JJqBVM=&RwvrBJNEyF<|54C@!ek-e~UKWuwn_784Z z37t9Ed|X;vAKna9;b-rM^zP{7_O&SnZYh!)9Fs+CAqP8~;oWwyV|fCcI|8AK^J)`c z+u|^quXCN3r7i7p>x2Rwb-HtHB!tNe!*x70!1dw6z8tBn3uTj&QAAg0V1@z;Sw8-Y zlidEUjea197G!vJIN<*G%DnQQX}&bSn}KB^rWxW4!A}lFJaX7!%mwx5CZFCupT3K0 zn6n^PvU&e?n}6C?V9R)kMQM${+B!~)t#K+DbMS=5V?U4Z9#KeSEtYhtBy!W-d_f1l z87cCWHQn^wa{}hoSn%R({{A~toO&q3IX8~eeyziUuSP67kb*VMVE8g>-7Ywk-~f5I2o|4#U%IPV{r30&W09_J!#SJ=lEq<=Vz%Ve(lR5({)3_ z21?S}kp#dg`$V41%g>}pl}Q(?vD+rHrnHkW3=*b=8+fvSHZ>AC6R#Rz*F$_?o7wS$ z#tt6(5pfKrVW6rJ$#x4r42VQ513!}Q8+g&ot}pK+!mrCzNH^7)=aNk(iY8C8&=)gB zgQ6+KQH*Mw?Lm0ekZflX(=gB%-wC=YZ7;k=TBB)l)f5Gkin2#wEQL$vOAY2T2V{{P zJ8=0RbZ6nIw_(o^3^l`?HdwX{b{8Pn2)jDuaDr?K4iCe@yma_&Sq`7N$HCgr%I?=p zx^o8hz2kBxGZg3zpv{wQKC=e+P&FwG3x-em91#xfW|;(at~!_?b5ns^?x?dnue0IQ zBt_MsrN`iwwGIr{DDOz~`>No=oQ2*Y@Q(?^(lIjg3lOB>g=Or1z`z!QKUvny!kb5+ zzW}Bn;iS0X#SV^5rrA1LW&n#HADm|NU`WD>$XPB2Pee@l3g-?QeDw;O)$0_j*(DiF z$8+r4+RS&KEi*B!a{Y=Nz2}tiM^q;DkeeLc7UUh5S z@bey)sS9CYtJE*f%pM(wrQMRw>W0!rdt_2B%6b*z z8rTuEG{eBs7`^W#Q{U=m>!vi9eq8nlS`{TxwQ(6-2hag&1K&{9c2rU*tr zHLtPnw9ehl9bEc>VYumlTyzaN(!Wh=e3f#%HZ^|5M|ON?-uBd~T_MHp@qeLc+s7`pypM6P!Gt zu%{SsS4%^UI4EqB>`CrdV3@jkO4SemK^knQLwgUQ7;~2S%=Q^Cq1GO70qjbYz4Z@ za6<*C%SBLXhZlNjsbsiRt@CuKP>v&Ru-ZAewTAbv-JJKCJlb_9NMCz|bYM#tRze^} z?n0k6n{^INr^x=U3Ga$Ya>BzP07pk3)A2%;bxj$VUqkYQ8;uWQ=&Ul(CNXof=3(7( zl)+35hSEgeZKJt8;Dev5({Xu$V-L>Zspm|FBSF6IvBYfR=34?5-B)D2q4Luo#SFjJ zO#c`6veL-$#pg==WqtwkyG%B}ISO&Ws&yW;MHG%Fm|uyxCfCa5sK_g$c_LLIr8un9 zy68;kyf9kgyN|?td~^|QiyZ<~IBfHyz0x*7oiStq+@LRrD4r?Q4O?q8$`tIBj#CS$SA9~g7WINhQ+Eo(*72)B zgKnWTP%8ERd;d5F-Kl^TGcz4<$6h!x1<_U+(B_2_;=F873LeJCL7bFQy8cp^&#!xZfe0C>Za}q zm^VdwVUFCI~&KL;D^Q|ipauysTnW2FrIT1cYVY%G8nees}F)I7EYUf2oYTT&RIE(EI| z2Ag5YY{?B0mBuK|G$>^$nbTA`xo@&26-4JRf|0uPWfZ`Yxp3DSi5$IgP`>`QLD^e) zxegt1+7z5~R~@PbJAT^5Grtcw;gzux8uN@K>jv6be9si~KUrYk-|M`*G0EN6R^(R_ z`xt$7k|N1t6H|O;dj~8T1v@XF587a3H(PfLB0s=d89>$n)xba6#D3Lf{zVRqBzgPE zX8Kh4(AUPWuNkKajdd3_QTc~{UU@Xh`db9EZm7Xt7w^Cd`ffVH7nk(#vBNDmPK?#z z(=zuI>}ukz-zM2ua`@6m0=RuYItS!p6c$Mp5GI5ct3TAjkDl)3^us;8U-8h?n2TF< z`tGX3?FV3Xk#H!>O>Q^8@*QqJo<-{qu}zJ1lZll!2%J!IY|=WJ&Lq02;@3l5H^i$- zq$dgmaTH754iI{B(L{;Hd}YoC-42{#p4`eM63c2h1PKa*nSZUeJI#cL| zXKI4R?@q}ITt7f3&t z-@Xgmk3&6#T?gRW3t{DL3eWu}M^uXVz&xAQ1tr1_{ZyO`$xI1rRTY+x6YkMD`kLUx zgh!hWdvK}8D(5ye@%h!Qu&Tmujt1PhGKF>Z35I^v$xF|{jf;}>T~j7bdYs&uV)vE= z@uNAGd~=kQSGoN5QJsM=FJ{?I`lPcd792YN|UO>Xa+X*u;D)}9v?69v2{%>{KOE9bU=Fr3`csDfV56F zb(m8m^QF@)`gDp#Qxe6YxdzD!49n~3^QXD?%9#In)usAOmh{2_a#@SkfhPSt$V({GiZj7>7Uc=?Y6114Pp#k)1QD91qH79fBltxq`vD-+ zsp^zV=teUIcH~D5YK9E>z>%y}5eSS%2Nz^cFOoV=$s^q^JJ5j>qG-y@J!^)%M^yzQ zsn5W=@+6AUpLhb^dmdN@S6l-(t(B@8twDO5s7h_+=A&?KKisrXT3u|c!sHfsz8gMy zBV4~sYD9;N@b*bi0x7V#U>>}_PmZ%3-wSabHf1FebkRzczcZ8QSC{EpQsL+e8NRc* z$k9oMIn7Bvb7eCtzjBK9+sF6-8$sm0@b72i6nyULXeDdvWNn>Qs{^ccB}CQdeb41@ zmMReFOugAmud1=?GsCFoIeSyF`b{0b#C=9JUT`@iew)>4+`pPJyV zFBCZPLyPYmJjKBGbF6QkPYdvdljo&so}f+P^EU)=)dUPTLz_>e`^1id2zAt4Ku=1c zRtjNMgSnxc+)liS}a@SUy&H1*loS%bid@Tvi(tzjl~R86H`@bKz^#NQjN z&@cuOMbe{3m4SAKn-fHGmv&15^`b|;acUU4q(eg^ZEEcPmZcGi2&d?w8Y)IY25211 z-Md!w@arMIBk9gz7|&3*)2%i}Qb$ArO_xnJA!0PZuS*KVnSO(vkqx`Rll9FR(wvB6 z^v$nI%ZppDg4>o!5B1$c(2|7J1JZwGssM*iNq_g13*nxN<@m}sM`6oespMb396|+l z49OX;bi%AIIe5A1$s(C!pt=xGLVg;4Ux;Y?&Rf{Ca)c9`3x`ffWTgU}|mw(jNZP-9)Ye86Rwosj|V6gpN8tfKv%5>ad_j zS6|4fA%%F%qP0~JD}tLobCQvt_w(x~Z2J1zXt^iP->5A-{^J&&IbG!&`4XWj$Z8t5 zcQtd>%>m7SejLgs_2=41-Zh12cW4O>3cGAtuc&d^DvgI;j_H4~m)j_>v z5pewlDd=|zha!ww7I!?fk89qVOXmJop4IA%OvhZ5Xy$v@s_5&Fkh*LO1Q00>T6Hcw zGMC^-X`U+AscIS*Hd&l=T?c&hC=8CnyDikeGl#c_6iyLvXLE|oJr2sM5ozyy!7!iw zU#&d%&6qDgH^~>iZWBi_MnaS1vBnM?`Vn3|Ao2u?3c4+WQ-rb*Rx|~})+F^HhA0ve znsh>(vX55@@B@KqYFMT=Lufnmx3zjeHe(WckqlN{CG?{PVGTlG$l$Ms1a64qMOcQ! z@z1=krb}V6Zflb5DI`1^c`^;sEe$Jepfwt8hAkPRnyyO3O2p_!25!C>?py{>?1pVS zrIvHB3zqiCVBU99&S>&HI58=O&mX=5@?)^`Mc9~?n$3g?L#L1)Qwd3nh!tdt4Jbau zHpEHkLR{Vpm7!VKWu5WoBc_hjxFXK7&Tir7Vv<9J8kM72nu*Z5LPP@SEx`E)k>ITj z*o1bB8Eb?!9UX^EDrEFz1Vb7u3!yE9X^ng}A{)ghfdJ0}&t>-IlQegSZ2m?!Pd=LE zzUvF99~|P2a|^6H*g-I2p+p91t4C(p5X`NCn_%C=Z9MR7%)bm|Ni8mMO?wZ&->7iw zwF&0jJI?Ao9sK;iq4~i!Tvf->1xseBtp4b6Fv{p%8vd&b5Gw>7pMD2Ek>k#xF2u=Z z)UYlaf6GUKG8h(G*bM(Uk01P6<5$DOAR@e2aDQIm>c`voW;h%D&nvL7Nd0`l>v@&W zUuBZ{^mf@;j1q9HVbFQw1V40J3I45_qYd(!R|#gsB)${Qpf`%9V5KB4r|Lzhx{3%R zP!vKhYKU9pYeW#^)nx}a@CBNtkWR~ViU!M6Gz2p!kZrPNXwHe8N#H~?6pS+sF5d}p z{Rr0$u?%gdDW^9&!HTLN{6;zz$mi4sk#<2gZuAq=SZY8GAyW~aLV-9s=5q271EYQIuim(s`-f6F*rSvq_^4y zrX%%jsHEq(EU}w8`kuzZyJ7Hhho_Dv*z?Oa=H5|9vvjt+5OQR@U~Rt*iGW~hj+F1h z-d?ho=UI2T%J*J}`wn(MXB{P1BX!vcP(w+0vLh&@U~3P%o^9r@pBTZgEUIrQq^>J- z!U$1= z7&Q`-eC5Ux1xpF}_pi?<`eieZoE&1(4!BZD5ykLsP~?r#JX@ac=8`qt@PUK0tu63( z3zFEkHa3c_i(o@5&g&WSp-CL9@rDx_0qiFAr8<%(e zgNE&R5uO*~2Li_nF-#Mq!A#XHxge~Rj$4ti=NYb2B5RONB~TTOm>5IT@B>-o8x2S{ z^dj{BbKzefg9EQ4t*ZOMKLyco7%j`)JJ=6V7Z~%U`fK7vctev`cvmih4O?OO7}ON- zLJ6NL6*xH|{aLPC0Hb->SOf8voJKBsK$``7bd|pGnBOZ^#zaKfb(tnlHk0Ar40zltVY+9v$)VmvFO4&?YB%pTgVlIX*TYuGH*i@T{jh2byVS{tr3;| z3a$!CVY0dvE?HNCX^X=Gk-^X{1>`4@*se#Vrknbu%oq9a#s zgsuh@@*(ZBRJ1UZMVFyKpnw^H5;EgS8YFnASfHQIE(t zP0MSy7qM3i14;PRLcV*y!*kI(2h*Ov)kbVE8yO>(9!}Ml2CpJ#4(6^;PaocV8Lmw+SJ4&|JA|XV=i|u?BbmB z95S~I!SZQ}uXnO7@AL7&G^^&cP>x~S(TE>B4!O-4K5$3CMQc4ajViqUU^`d;)*>n>bJixoKgJ!v%%;k;QbvAzzExzAMA3;S{VLhmj(* zdXNf`^hAs6_b0gU;h88Ns7-`1}8ec=c3;>vBDOHP=QWtMS;>BtNX30g&-89(k9J)DXf%1 zecDAeRQyKYKy6IFP<4e`T^7+{BvB(FV$w;2>Xb{W)t2>uAx{HSH!w7vY%)n4gJl?q zIK~SCgotr{c`eg25JFI%s8cU^=)q}NybcyDm7Us}3wsNoH^G7dczv7PwB|HHUsf_e zYfX|LG(HL)OJG409I!xa2c->^lAIMAoPCl2cs`)=Z&|MVXpP+JGUj<>WD+{m6GZ!)+4`bMe%PWfW3yaIV;5zH(U#E2 z7%D$~vw))XbMBW$Vc|4XEa?Sk3TUgs;xU>QPQmdsv`xeQS@7^2ez48uxs#{RotT9| zhIFl&pFEZ4$t|ohbpK6M7FJNtnIg5c3Vq|UTd1fo-9mi4 zAH__fkmL$G$@dkFw}TRo=@z~b^P*QEFm!Ix+M#tE@S(d3dzu)1I>DQ#N_?(m79YFa zfb&m6I^shUt=#zci&$Scf~o5`{#hv_KxM)u-Daa2XXRWe%ckZ!*jbZc(w%8;NyepA zlAWPSXr?B`=t4rKB0Q_mO4vHheJOH1Nle|qtA!*Qimo${Ka^pfSzwAHQJZqjCzUg) zPC5|Bq}vlTrP5>)68g1t6A{O_fsf;P)IAr+laR4#>%=jXC+dtJD&f~d^yO<{`63u- z0WX60#z8p>nMI)6aBLjJIgrr738CnKD9OninI_pQZEuAG=R&+mrZ>_*546(|7i6p) zJ}9SmukL`4T@Ri8@T>`OS%>xUJ3%WX4+@llQ2K$Fxj+}CFYX-}E zY??bEU$aU7`6+UJ(=cZ9^-G$0`OT1DzUre_X0vQae3)nN&USH%4vgd?kn1P#zVCkrIk(#cO`9wFVUxsL^ifx*Ni3qnG%rw0GdWf0O zz>tAw878@8nm7ih=o7}W157Myh8Z`8Gbcjaph3iPafA(NW3t&I*OMffvC&kOFci3@ z0JEX#jT-5crmJL9CWVrVt|OT}%QEEsyS|STcm!dHrm1ME zhKOT|V^t;&m#CE_RYRY@2s)eK__UmxwDlkuMY!Wqc;RITw}Ez<{MyEfavqZadV66( zuY62OXFj<)gkt2Qqj8>6O%oM)J1b(6heoly~S zr_sSdx6bdLvAC_cl)iH+kPTow%f$8+%2AcC-WX!>5ojKP(KhIo^MQsO7omCB zT>&H==`w3aP%p#c9G5mI0ZJqPIg_@Wd8nFfhJ}%2R%Q}O;y9+Bb*bhBv5-6anIIHV zBi#wl^6>*t5Cu{~nryac?n{x(*r=+MM5?MXlWLtoc+R9_GlF+rm4$f_5k`V?)yFU; zy;-*cG+jkeq<9|ZY*P+E*Cb5qIzIKH$JoK5TtJQY*T>6{FTj!GFnk1*lW@yD(p+fc z+n~&X-V``7oH{LSt&OTp-suxNA$ zp8f%xe{0O?6As#>LNRcdJ3Ga?k5-^HqW)Hz*Yh2C?ja`)9W;+oF*t^}Lk z8X-*`{0x{8qHmPMdcjAAmhkAqHMUKRO#8+tUk_Eu@j@ro`Ca4p(78+ zI}y+Jqki!)w1v#_6s$leD#vKkzU*AoV*`x?R$%}}XNd-$~g-Bi&G zg;J?b%1V$+rV)vl*6si+<&ZyF#Vwz;D+wDgY2-_WW)w)SkD1WPb|ob;(`FNi2t|=Q zvTjI9gI^Cpks|zLlS#HCL2cT@s`&VUz_K(vUn2+wm70(1h4cbe+MqJ&5c&~jO6rq! zU7jquu2QdhI7OfOv`2N?rBd`rH2MLG0{Xk}BMnk_fwma#_%m3s9KQ44(ot*R0%

    V$uPnjhD#Nd3dHOw<&wQyuG;Z+Bh{vs0rC4y^G5JX^tCP$KcKy!| zMqh3tclQKyFNt_)GQv5QAz#dJXg@4kCRln`5u;1N8_H6ePD?NU_7YteIb4=8NQ^W? zJ_DAAy1<9dB0YV&a|BVt-~g}DO;%kL_X+L7bM*By4&eWtBCe(a%{vMXFWunO(M5$v@`xbR=vIQqF> z9(M&OnGvTZVMjklo|y-)7|i?N1SmRz9y7n& zAiC)oTrml|lhV4`*P)|E%RrS=ag1pEoH+$_Tf;5;)Qi4kU)DqN6{%}TCz7OXnQ!|Y zA)2lbI1z4D7RNKX-3CWL*3>ZEIou)pCm7{l9|AZLnl5EISvb^RTxlE%BOX!HPMOroQu}M1xENX7#{j3#1oh z5Xj*KS1p263SOHhnwI?h}I3 zfr6zg%uO~kf04_1YfTX2f53QFWbt{%Zd(WjOpOaj5Q>l;ip4Y@=MEKc~_d{D+Bfw;OS!{R6BIObYV07m(|d-5!t#*;r&*Qe6^ny zx0vv!C(u?+^RYh};ISvlFxThuV;MGyGHwuZZLXEogBo;HkrQ!R;7|r?Da6iZ-g*!o zJY3)#tGc1144b-n5%~9On@QZX6E<~I{BZ|g++9PYLT(6KxaHa=;(HsGD6!P}`gIi} zq2X2(YEv$D)*xx9)Jq<=>0syvnM6`@=~aztlY?ImrIW-NTa-qSCvqls)|`P^MJObc zswh&VLOheMoPkw+C&aA=Bytw%_5}5UN2U@`tp_A+9bHoZ3&#y{+z8jJqbQInx|j_Z z^bGN?QuEPu6-`sIO%2o5(Dbtey*Q51>V?FWh${s5bog*KqP>SaLmFcQp*=V2c9U zQ7Lw5vn5=bugEDKk&x!33p*ig!o~w|XjnGN77xPR=gB#+8%JU6I1Kkg-+Y)Y;8Yuw zHms(zUBf%6vvYgMf$@l`LP#m+;g?i0Nf^XpYEMYVv<9;sAf~)c<78Z=zt;p$!<|%d z$827GA;CdW;L~@+D05)PFR~mu=5zk}0XM9uqB|z#x3cWqo2Eq%=v`XCNCzmU1BwfN z7x`m4p&L<;1VbX=WwlO7z~R7Qpeey$-)7PE`F)U?lG_*>ORw(W?(fZ_@^F^G3%GY_ z8+5unxS`B^RMvc|#FF(xP&1*LfH$# z>q$xS+)xD}Vr*N-wsn%OPTdV>pwddCc-J%qDn99?fuhJAKVj=L8e$R4!uQff!c{Q$` z-Nl>RV^;lCq4T1MWI4;$$6dTAqWiKu!~!uUh#i&ROqR$Ex?~oHlqU?fo{m|ySm)eZ z#!y;pFkHHtr#SijL0;Kt@R83tn3;l1Bf=JVdVqJH)oAf7^o+uY8}Os>Bw7rnYVr@= zeRN%a7&0S(0bv4k4_Z#M_}VNtz0${%wITxxBi?yErs65w{1un3tLo&R=t6(8m;I+K zEYl;oP9e@sP&F-V6d(mc#g8M$9No~#w~iH9T+7gw zE%1*wb+PCZ(!l5keH^`bM%$kOZf$>5Xyb*q4l4E3@`RRZ?lQWDBc>jWGjbz;@FEOw-2G zL*wZ)%nX=;GtD18eK<7qKw}SmI6XGQVSolq&v6573yZu*7-7&M-yNeL8}jw1)!P2u3FAFt}_(%GT$6 zvMgr0DD!=9lbCpG2MQt82OSn(kom$HA2rL6tdv1p#_?hAK8SlM+9wuZvWIf_D#z*p ze|;@u`&0K}?du~Cia1vqod2-OXLfx4*t!dQF5|<^HJ(m;^uh=?OnG#V3VZtEpXyuS zn2?X5;KNkF8w{1-4MLXVl#lf?e({Y}roMNL&PQkX*Z;T4+D4Zt+hBl4?=LexBp;*x z4_YwOg2*N~r;vug-T^#%1~5mgWEl`5-I#)>4)MAFq7ov}(5Q;SWY-g|xs@VR^FpU--GMWk@Iy7x2N0)FFyIqc;KDL^8<2kl z8q)&)5Pkvva|fdDfuH?R_~1=AbrTLY;b2XtGqJ`xETCly-k`^B@_k#AJil(zRy~HHij<{Hq7(Z= zv}y(qw(*J)Rws|LqERN}-~Woqo0S^dPQ=G0kI)PGr&O6fHUP)q=Vm5xrft>(m49)1 zg=WvAG0316iITVKktq%d3F?-P+mq=>D#1WuGq=OOHvl&@ntxWH*_8R!@2OFFaD&=b ziC_C8#$9eQ3uW(KfWhLanZKQPNX&zbzS?6DlW=&H<*&D98f z0enlMRP@%q2>KvNw;16D?NR?h-9(Zk22F2-!_jbdg7FH!Yi=h%H5GJQkXsp1ilQsX zs&v~V@cbBE7qPi13j!<6R?%}Bx}_4uF`BB9&sjne4hWoE4La$F@!`%Ct~6fpB{{p* zct5HthfzWlrKnF|sS?XwOeH2?6%zHAufZFSNR%cr{77K3>eFBygXAncCGb-`dbbFX zK7AgZ`T}HMg3A5yz{3&~lM=3!u~^DjYQlf|ZFtwu!4LjJi%)*gM)OY zxA6LH{@H(9Mt^h%t{#P7Qu$pX4o(|9d?X`H?_YF*<)&kZn&CdEX@S(k{i5LZt5#MY1pzF4P{>oPUbA=P3cEg)&$^D!|gKv z@SjW(ob)MaGh{=b@Y*!S_g>@u)q8pWf2hD^gYCysHfP)PI^k_036g}Of+WczMoz?} zkQ9l~ONckz5h<<6!v{_@2E+kGaYB-0D2jyUDn#Bcb-9XaDkANv$m1+bIO;XXvQY-g z5WNGt%y62bqRIl7R4U}i*(Sq*N9e@_j<|L*l8YT}0WZEo8nskP$*qaKOVAZY3DO__ z?jK~4m*5Anps`B?X{oBn7`lQznvF(Y#jv$85>K~P!4{yaD6&A@1%5dGFyc@k{E{do z3DYrQ>F&GR?eF~6U;i!2#S$}9v-F33!Z08R0*)L!iukcNYXATs07*naRIV9Vrj4S= z1Yv;hd#I{Tx8LE);w6$)R2NHyvRD~HA5GDa6$L-=38R35T|`zSN`*2LwF%an8>7bV zgss*lZ@>3P+3+sX>9y$%`wRwsOw*)NssS)FInCKiXNlv8D2|XNnR2Njt{(;@X-Y9) z6swLbqiZ^Iv-3F4fWfd&7{!=|$-0RTQ=buJa6h8a8J-imn9(dq2{k?SR)ayFF3L7cBBQ8*&+rAK-QZB$DyrL&*fpRg5Q^siiDK zkz}GMW~bAlR4ike7S3?U(()3uY8^w@(KQ22)$oIWjnx}0%q?*A&~bM6HP3UAB$=FT z(`vT}!T`uHb(2D&fbV;xX@a7t9NK#jNm4j_@p;j}ExAlhPSfoRZ7)UD#01F_WJzIb zdz0zOX|7$rimvHoS%&9(L{W&UsK|20&>5hqI)y?W(=gfD*~YeWxSofiD7fAbRhBut z{|Hx>t{_PYkg~RMlSBIsao>sixp?&gs;ZIC=aE&h;`xD(>pDb9#GaXXTz5#$s37GM zHodDTih`zStgf%n>2?4xbc2kH!ElJ7YG8MgL@CL({0h|wNYgm z)37+Y{~l~6P!)ykaFHa5AcLVhM3Q7wRWN)hii+#|xSoTis>E@CGnzD*4(ppuiiIN8 za+M2LE{O6{oRE;5v3U$W*~3c6f8^hk;)SBwkP7WWS56t6h)FaC5$5WFC3&)EaSQkmT9qn z;Q+n!r%BU?B1==|X6Ff_fQfp8t?f-5cZg|PwA$OGX^L&y zM2Lge^yCbZEV0wxL6Ri)&hKZt)g%aoGij=ZEXg>Y!_XNL_j^n=#0f6TGJ+^%qSj#X z##JOF9N%T=IheZ1z!~DY4u0sbwq1j=*DFGGYWQ&oMA#m&|1e~Lf8pM z5Lw~;QJfNn0fuf;E|jr#lavfy(>btkh)Y+`lV&M}d=cBS(RH1J`wkJeb6jeEi71J9 z=F3lW{K(ySu7_s1l+t-zHkq|gu+l$6x7S6}G;(%rB)p z@V7J?+Ci@NpCgW9RyS5D7Q{IuPU72|NK{!RPGjOE=F0UeOioPF>vu6t8^;*}uk8%* zt!~n9{hJSEswxh=iXvl`MfqB==Z?}*x>zORM4a^FAR%x>bA;OoXsr!tcLQ`yW};y; zb617RbU|=MrYYT>A^j~6XUE4ML_|?a7>hjYAO6QbL{U^G>JuDXIE1e2T)1+c6G!hx z*L1F3zlvpA)T(u4Stje22+U2AEaU3pWn@K0S2gx69KdxQ9M7Sl9iuT(W5d0~>2s%u zqXiiy3|+9FL- zG+m=qEK|r8C>2XshJ|TbXqtvB%bdG>4he~Vzl#_6q-jF2P-13kj@hXhBuT>aJ+_*g zRLT{WmX|OM1KY~cclyLpOsCf&ioy{B^488*bq#QoU8G=*Y;op_O}*RLQ;3bF*1 zQk5_caU2IlRq$MQ#Ko`R2Oh5H;0Hdssw2rVp6~LLlMcDV)}5a54KU}5D6+ktjNdRYjIY%?Vk8uBt>yBHGPNm8hU$7IjoprLg0(e7#2;B=j~t zjDk+7G$JCkZXpd7O(u+zF^xrW^kwxt-F}yPZ306#Ns^f9 z$r+YcmjRL1Gz}9&H}M0XQlUgCUnF;Uoul7#>~(R#OI!qaUB_2#Q^l}VjDk+CqEl$t z7^;S*s$;-Xk_ryTC{Bo7>0^0 zCB%u0rfOJ*Ns^^Jed;MDC#IR1oF!-5L_UNrL{5&(67beevPu$1Ow<}|w_D83>|vw1 zj)Y9R*AZEzIO3^GpCrpNHk%tnNhF*nj>HP=xm>z-0Yy?QP~~7g)KujBQ#p zceXgV_YiTCVwyIZs?zSZIk0em#>6CR8*3zSOt;rzVb5MvRb#NOP~MX<7!Igbt9ZVL zshilQO~u?p+h4^Gd^*hy9M7SUD^Sdr&{Pf6FiDaW)37KP%e-*u42Eui1pVQFlgI8w zmL+=qF55fXc)mxg^DM2M7K);9W*g;KuE@xys8T)jXsUm!^m zq9meRERO(i8O{}t_K_WargwTR+`{-%pR zh!~Do10-2g<^Jd+e@3NLq1W#+^oH1Gj)l1eCMTwd;)tNFlW%0>IzT>G{~cM7zJ!?H!)3WWtDVbBWqxm64Erq^F3V8WxcshmL^ED z!u==iCy8NseTl)KPp{ua)im0j9WpX1gX|^^fm#UNs zWtNt&jla{s{A7g>y!|Qm{on$>^T*3{rMCdki9~}*uh+ZHdAi*m|HqGC#DCwDugdv8 z^WXm2Fes1S~LOONow()=H&HvS_y6!8rk3IRx+s0Szih*V-lxK6;hKVXG zBxy>V#spD>*AGdPbj;JTi|3XV!4$UJ(IYDoR#_j>Ux?QvVL}*0NXjn6HbT*5k}$=t znxsj}RAWjUf=gw#wzrTKS!5@+H(A|S#nepZtp(yVAqoT9y$(?ra(#749+UD?qBb+(^JYgJi z>DooAg23-9z5_?p1Sl&(lq7b>NC9Mo_Asx2022SJKN~0O1sx# z(C>|E7(TXX;RQbRT7$fmN0KDI@Z9IwKYx&g$p!o%B8npXz{3xG3{7XJ-2z$S*)KoM zy(jKxZhDT(&Ls@p;Mn22SX^G>#_Dy7xgt>)f;1ESFR z^kSEX50rU&u}glV$vqD=NUSoSfA$L10PcC9!Dr7k`R)_9?h~ubpLgE;6|b*aWrKXp zz_x|+hjBz0N4SFkzaOEf64IzOE=z8yg~vgP6sH2fG};X`O9e@=dW|8kNk;6B%I%}< zgfh}=QVpGjxxH++n#iik{Oml}dib1fxwa(r>dzoxZVcU6zoKc`u3ou{ z?|bZYTTC^k8Mp(sTTQ~iM^$7F*6+u4KgCvagH~r7P0{du4_Q_4JdZd@aNGg9DiqVd z_}mvbu(0Xl~NhQFnHno^UTf8 zqsA5X%+9m4vUrC>yqwbmocg^rrXT(&cYW9Yj&6y^La)WYc=%mkaT5F^`_9Kc^A%n3 zPJ5&LH%uQWqj+5ae&}SGt)aO881TZWCigtR*x_F|)#SVHm;~@6=Hq?X}puDo-+}yG-UGvC7mZ zg!5148Bc=Ybb}X8HA$>82M_P%_?r&{VnV!ds>!2oILr&Dnmn~GuJ>}L>XwSB=|oAw z&UPPX#~-QvDd;0!b&?SSSdfgtO#tzT|7G`ptJ@=$kP+8pmI0Db6P{ z1h~FWtJ7j;YL0TT0!VB&H@LBSorSr*L~%sU%3&H7`xg#z_Tm{-IYHG_EYrp`Ep$z1 z;Pgqe1WA%H3^7I&CtO>)!t~Uv(4);V4lEpGyWQf*fupQ#tP&^d6mvy9-=pvJN1@rY zaDrY3$8)eOiy#QNxpk9Dxx#jMm6^s703JL34xYU531nI3>8qbcRWu&h{}zncA!pfK zy?&XE<~qfEk$QCkLpNAiTgKNdeBURZFQ6z2_38w!?_rzPs4ywh?zE9*8Q=F&RTV{1 zIJf>J4;_3v09AE?&CWW$+-9q}P83HBhC}jpo?XP5BFSV)MloL`%`yhgfFw!qJogTV zxO(aI_~+k$zr)=>o*VxjdM&!6pUdSE-EQye5(3S%A7^q;nfHC>5&-}F{`;BC>umHw zCi6P~@-tro;FsU>MxF-FKY4}YZ$5lmh{SXQ#p^PhZt%zqJhj;6M`j-9V=pQEsX4<$ zLL!L5ah~3;7!>NJQ0p5+#9@j*TET^o@huWlSr(5Qaf+&mP-&OTT~?&A&~oUB``up6 z+(>q_Uahmevqcm|+*rBJ@gv8nRqFHx;*jeHA`A+nh$M|EN;4cj5OCqjS&==7g-&e{ z`sk{`(L={Ld-*IN)Jh;jk_BEykz@>AA7@OWI27U!LCD(RCY4f!Lasn_dkaaCk!6J_ ziO_W&35jy4ESe}(l^_af28&3Mg=WE#gGX6hzJ{WxD5}D_n_nbn=P8%U?48>uV7sa; zvO}hcEX%BWXE6+ea;Z$UT&2_NP_NVk9HQPJNn-9jem~DV|0SX*LRC~$MMY6n&ffey zhGuZr%o~}i%&_hZ7z~FD1_NYCqSx9ucbAlbDK{!>8* zUn$$X_XD{*o)5hiIpYdH{i!Ezd;GPo_`CKa=Ht{)mU-XDzr=@s@QplwGi2XGi}Zkf zv(Q6Kh$|8sM9pTAmK2NPuXaD>@WLf5L?I9e`rN<4jEM;|lg?o;lq*N?% z_`qR-L6 zuq7HC%z`GU@kY(bX_N|PXGuaE(M?+=14$M3L;#Sz7PVe~&{ zL}7%k3+Q&Y*TJ@J8ubYP^wIx1RBzIAI^u7OC1h10O%sOhke!ZbP*oI#o5M@=`+W+z zg22`zU=;&rFj8O<96p}!lCyGXng*l7*~?j_Qf6mqZTxekQs&Y#r#bk*2`)Wzns>hG z5gwX9$`c>^|HglFVBbCt?AyoU_3JNtTU%LSZDr+U$9t)54dM7Ne~zDdN1mT~M;`nB zzYw2Ca~b>ozZgFrz3;Dh{-#K<>^lF89sQA+Ti48QG+%ZsIY~v1emGL+Gx8c_LIQJ_ zgcNR3PMbxYTvagpS|y!a&A_f2m_;33)5cx?X`BlD&q%Bw%LI%%KVg!un@Ey8t~C3h zkLSA-a(N8Rz_zRrW?zIbr9zp*3nwt58dsOD;CLS8Qkh1*!9-;O$8~UB2U(R_ySYLX zg@j><;|$2>3zSP0_AMO1(2X(uM>e{)VHl{Y%w30$i~m!SNYj)k7TRD7vkS~l?-7k6 zvPzPsD2jrjh(ci@U%>M{(lq75>NCiifOt$crbNnBg01aMme+2eDk}9#jV#LqOj*$w zI0GEtC1>RU2*Qx{&2@q(AP57R{x!ldA`Bw|VUQG}C?bkNy8SMSqOjd=;;1*-YHb1# z$AaoSLlnC#(;`Y@Y&%bs#3Wh9`o>Kh&$$CnU#W=0`N0QH-1hjJzVEHK-QV}f!+iOv zr}^GTAG^)bUuxxIk#e!fyWjn8-u>=(-}anz>eS2P`8Rsu9ghv0%j6piFXO_(!glkH zRsMxjx19dvb^z(rDO4{M85K>F$yG&M9(uPJe|KBSc3aNOq7XpVED^q#1s$uXi;zba zyTz_hLhOrs2?^a+$u~@LMRN?(m1UVQ3Ml4_6mkVFU%Nz{h?RJE_XvW3yp=-@isVfw zD`ny&A&w*BB&9bLtC*-&B*aO=`ql=8e4Z$dX?1oua_}fo7+{)~sBw&ndr=(GO_!;& zkE~bXE%*E|%e`|vf9^DzCRhc!{Vuw$GgY5rX?YRTwAeSlU*PoP5I+b;dG-iZRXKCv zc}^TXf#-WDs>0Ip5`}z$EE5?eNtUoj3~K;$Q*)F{W%d;Bq8)d+;XY5ArL3>7p&L3$ znsR07GI1QCDi)4A#1BLQ@MXdOHsN zO_yMFSl#Ul-KC8X@wiw?G;5^IH0lZ?6OPy0bV$y5Hj1oZnihjm7nbKc42DCJI3{P=Y;SK-DOZ`OPGDR12*_5%bv-=aqnoags6KuW z;RinDaurq8N8yqHrRlm(y;eulbc*=`hYuVC84mk|ameQO<|tL` zFdPoY(2rJU2Tjuj5;PNMCq+`Y@5BS#HTj5W^pPZ%Rud!a*x2~0&bn)l z%)k-rU9jgd;$Qn9!G*WeTiHf2T@v4>q<07|yq);hJ_vgr$sl7-1Iz)%U7vaYHYVcvNXXmEs!OmFyz#Yzv9Hvd+7B=4!d5i zGjIo3riH3#xW4F|isDeL@L@!;SVq@13WXxB>mtb#uIHeuI#C!C#sTNAoWnFt=BDQG z+#LZnlVm1pbsWdRl5M)ZE;+k^qNvDHgzI@ol1!~q10?*w#dTdYRYTVdWJP9U>n4R< zp24tBd6e^y;*g>5p(h5atTJ%=Sf)jyC2Y7?DQ0s7LBPW70+*LABdek?si~tgmZA`b zA*Nvo>Jr03Q3cD{(yCz1i+5owNlc|wA??Z>+w%r4ub)OwB7t9;+ly&h+}vCPZqMbX zFXHo&(~MM+g=ojf&OP}#Cg*0EoSVIE68!03{26#VJokZr!l9~IDDOTfg7E)bUgyGx z-^=vB`qWo-R2UtC-!a5HlgBzaWC;AhN3XKHc@=<#Dfp$IeE?40ddlvR109vySrA^3t6UBN8qm?e!pGmX(0 zDt;J>jEgg%vpN)=OS-}3rAv?szLt|G?&I907l@*WB#sG?FeHQXm(QUpD#d(}smU2? zaY(PtZ7j_WxjaYCmn z4x)x(;CSLQNk*JGNg8u?=@JYQ#x| zqR3=vimvOFiY5Ak9+qihSvEl!k|r@*ttPsr6U7mQLXn{}pj4C5fRm+rdG7hA(KUm1 zr%kO|BM9$|wXK26uu>r388ECAum>)Yp(7_LolcjDJ=1Kh-g5kLI@H@?{nXo#9s;h- ziO;XK4!X%*zj2NWzi{Fe?E+!D$@5?OF97UI7g0FQ|NQ<(#?R-|fT3)Vq#xqcGYVC2 z?^kv57e5}ho50L%&yOd-i!JgJjDpDNCnNo(I7oz$fh$xztg?YN>fVq2ge19jX0R&; z`MOELvaxgn%P`5Zbc7<6=r{wGp53Ig;o=7#y?zf})zOQ(IQX@;$l0P}D~=8Z^R3;~;xUzT|UDxULd&r9D%dO=#Apigs8c9S!RDCh!hv#{s$5~Y<OFmcN^3rAMl^VY9 z(+kgV_v}4vG&k5Yvxh57m&oVyFv2#~$~A&8z%p%i+AaJrK$hfj15G|xV5%|A*7hb( zpZ+3gmQkzLxclfm+;jY1E?hm2B*}Dp9aKfTo?Bv+>d?*uYc)#ID3QY-Fxvb zAH(E4rM(Aldp=n@kAL|X)w^#^;M<-2_ONI7v6nNox#ME!qM-r_{9cG=s*q*3R6a(m zVUa5+C^SPsvlNViCbU{dyfOfVvS@B7hMK+u3KzV)t@f z7fsWNVv%J6i8x766_rMMXA<3o_X- zMAtPD$15svnsEBuDH^o~NgQ*}v6G}}%FV5H3|%J(LsU&ChlE^}Sle8qQYs@!GO{F# z$vfx~L;-Ok;2q&cz*K#TdToMx@4AmO7tfGp8SUQA9S-qg=LaZnw1`aujgU&EOb7V$ zpZYQ0^}Bz1$KUR*@E`x33LpD$nQN@E^uD{9`sv^2=Fd*QqC;?f>TX(_XQ?8xLDQFy z;a`5~tB#E`MJp|r<&B61Zg=vRbNXkmdQiCiG1c{B(lo=+m0O6c{W9j11RcisyEf;hqpeS#?B#nVFoSUafO;^Cpht;08WX6wv8)P!$zPl4-SfNaKXL*?IoK8z1BJndfNK z8ia8~nu}-qbaiz-M`F%87 zO~^9REX6WyuHCqbX_(_oT1v`Bb3;^}ixm#cAK=v4=LE*-CARDQFTLO03BH=Wco+Ej ze>=fPKJpQ!-!aX`#>Oko0A0$zfumD!?TRSTT^l{Vyb-Z5eQU>h>B0AJI|wgKYkdEs z4{`SS+b6yBuYT#bGDBA|4VCHn!iWMTqR_A~3L06G;j{z%ekf?>l932nL8m;M!^nw@ zkYyVvicHS1P-Gb=@Ws9F5qP3?va{xJ_W34`CmL!@L*WZw{3Na~K3LN*Nz;^4QFKd{ ziX|LpNONb4{-6(xDDiZiiE4vhzsp2@l7m&jol}^Jc=pRrBgrCkF$|MKdkE`$~g?f#PdC-8dIE@eT0Fuj_10x`)#_tE^!>=ctaf5#TZTOIEk@Li@BM3 zqBvr1dXDSMOAMSok|a|umFaXlqK+|Yf)7HG?j_5(`>vBTTTL4E2CFw$m~2e3cw>=b zp@6BIZ0&5J$||xf6D2VR<_{2t0Z}3<^3B#3Vc?HAgQPKHwLk2Ur5T-GhgN5sFboCs z!Z2w}Ofp%Uq%kpx=ecY)H(6X+>NwZWOc+&(`6|{318Qp#tRaPkEiu4ElaVV3fDg9v|S&>Q77<)2c zur3as^K*N-aOIr9??@6$t4rK-^dvzT;Q1b^Yhq7^tZg)fW5yvflXDdEMb?HFnadv| zi-y!I3Y*)TBvDKd1cD|e%gE9MRnf@X1&W0tTics#HaF;vs;Z@8k(`yMRH)G0*<$VH zDoGlnX*!ywBTEuj7B6#f-ys~=r9bS`+-XuNS4iT7Lbb?LV}`h$W2t)@UDH`!y8$p_ zJJ!kDIU?QQ!sYWEK6r#EiV35D-k?Wwdka7CDHcljfncfd1D}cN1f5=oPOroCtK31eWu<`fa?D0G(}*t(J%5iS4P7*U8(vDLp}5Jz1ZkKkQS?73mJTqXVm$j1m&6 zs!=g5Hn%rOk_6K*(KH>)v_@ZSgWjM^Y{dj&5m}PhH@_cE)7ab=mC+Y2onim{ev%}{ zm6j=~^SIuSee?U+Xl}66*`|=op=$;k?o|{`!qhE}A3nk9v(I6hHenp0YdVEOkths> znn@5abR1UK1uMhs)Ev5I;Ce$$!yq03_@X#sa$;KW;*V}O)~<8(z+F7^p8w^*_zN=)kI^-J*Q&iH0+X2IE;jfc$NtozbK*85v$B_#M2&))Ve#pU_4N%pktXTwy6qS5n=*p zs)C^#+<*52q^^a&AI@GAaNI0Qkt9(s@B^Qj$yprN!PJd$XizSe*xqT1?LG*oRqM=5 z&XBkBq=2bgEU$~E@THX{CaQJ9DCF$L7s%%eOjH|eZ8veeA=j6exa-K>xZV&&Rfz{S zrQ9?}4;?2Ae6C)d^Mo|?cppeUxk#b=EAhvCDW92&Ces>hgmDp}KnVZ@} zI-jbgN-1Hoa%hyPg6vrD9B{90HF$|q? z-|*7vb;zJvu8g=j6J$xoG;NY3B281`I3WxJ5oRVSy+IF6)A;@7dtZ|iz24M@uXTKR zS7>-ws4PuKxF1Ww?S>4tJOU@et{T+$7cp|`s7{cfsWP^yjs?e(Bps7s74kZbn#KG~ zfytUpy=q|^3YH=r(93+;{vwvNR=*V!|-M^*tK(NoJ;IIeFJf zBv~c{>Xka_h^BCJYhz3#6~_s>VG5?XLV zpMUzZWEoUTRSJ`k%USroM-YZgPtLH@*svPo!;pRR2T?Q;&xdhHn1~irNfz`diXyUPH&&K-;llG&N);;dUK+*${B0Xe z6)XD9&6{-lJs@MJ+s5}@q9{Ze#iNQWv)yW9>N=)jqU$(ENRwp5)svzs z8mC`)7DZJtbYs+u>vQSqh4K3sNb8geB?eBPFp4PViYSso9L3}K+T0}(NHofOvJtmW z#Bk_{MM6==hkIET2vHD3SGHwi>K17-LYg9R;mWzO$eUJ(@O%f)_wamID7j=1ClRji z3g|_~h|^TSK~zO0$ue|RC(F_i6JLg^D9DnGED7aAP1P}t*N2bio5|D+MsV3%8n3sI zm>?w*!<}3Fk#^OeDTy5 zs8=S4;*hDySyV+MN+OV;)oC+R*@tGQ96NNJ?VTn;7_x8AUKB|pN+L|t;>^Y8x$Dqf z#Bodz_*`DROn=yCc505z?G556qFkz=sv5>a zfbDjR=?Rfbzp-|mBoefZS(*_f0fXoQ&pf$Itx_jv=a7*_tezU9#+(reaT24CCc$_T znHKqcfsBkWih1(FCs-)mi#-|Q4?=RbAl(H4r(hSO#V(1jOcX`*`#r%_k!F~=9Fjj$ zXCV_jsN!1yKvNYIMS!cBPzUb=?pp3Ce2dz&MmOIzDmx{v1fXot=1NjB(brzPNh<1 zFdSl=7CW6CCaMz@3MHoNldNxVk|wF>Uh{5Egk5oI(=d<~g)~WsM=L1 z#Ib;m*rq-1S&(I+n;XY5X)G%A86w}WDjJd|k+bqdpRgMhD5kxzl-w&sNW3y@PAi(xx?o-(<=APwEBN5+uwB(yqZa) zzW>vY@ByCU7k=VVe&>&u>3^w#^F!~Ud*XgRefS4>zWNc4AHSRP=S73U{QNwHLJ95j zCwRxFf0f*)|6kHhh^A!t55AELKm5z2-v!fuwT?o-O=Tb1G#JAGZD8=|U*63x{KTVU ze)c%O(^n`t8M+Be$*@k(rW7kH&k{c6t*ccei*CE>#SPjc??E%CJT=g%@fKhMg_ z3M(rs;^*o|c>L`@&f)j0BKP6o7e0gifBgy%4F5-N^nabn#V3)kJwf-a|Bm4s6avj4 zm<9gw)x6EWo4s`Pd^KPG6Hh!LePFj z0Wd%4u`;5xd+8*g4N^BEeTT-CAASp0?t2e#1^5^o+P&h(U~}~2D*P{$U(Ne`#rASe z`)XIfS2GE|7OU<5-`?4UwpE64{FkL|x{Pe2x;ZzJ&TXt8X)xN_DGC)-aI-fKW{hIT z27;Hu99{_%3SLxiyr>_8Qg>m|6}@mw5S5jwY@=dfD{jRZmO4deBW>5D>5?5Ul5=`a zPEK=jKGG~Ze+W5Wd7t-9{{Q!R&U@bHjUB=>TQ99TRpR+W&yz<4gmLY2CZHMy%_ar< zjvuD}Y=;!~016SvA#8EOcQ7^LXQF9j#aANyqnWyvgdM~&^23^`hn-%>XxVx`XIH(Y zp54`@eUUJ3*uF{tu27H@uMRQMGy<^P+vm5X5J+6;bZLpH|8nFH1On2v;n6|<5M&ak9081-USbruTy!g!AKa^e^94CUHa31F$QN!peZUKD|d z#9S`TaB%b=`bQrHz%v=4?w-fV%;aMIbnr6(PJeSw;UP+)R>*%R4nI~kL=lMF7GO=` ze11=QmguLi6HY`W(#PX*srL>iqJ$GshTm$WyKRot;&MunYpq{J{v*8}e){++I$F2V zyiNI+JH-;3YlZyPW@9z&Sq6*39ywGVV8hQ}l5E*W@5CNXg`>+S&O#V?l7j>1*^v2t8pmOfdvqI{(>7|qfn0mO+aOxRa>fEzEoO=5F1n|(g~9~|ZW-?nqTvyWdxePnwN(%1~d{aigA zVduVFm?ILq&;xiTBT^`&m;71{(Mw7v=B`1k)Z3f%1S$`3ZG8)~4IcjTw~-8YQU866 zEhh%pb^U8d!D9Z;;zAdC@E#jf5L@m6M0h46c#jR@KG}o&WRIarR&p%b%Cy5;5Mw!Q zu%*2v9)Ov(uM)tfn=!oeY3h<`GOc@9e7K#N1D_Ck;#t@Ru4$#ykdxZ&RnI0hN_sPJ zLKthIhgf#c3DP{74~2}{R|#Opz-zRBJBWYk2O9qVgSv&A;QpPZC2+;yfeYs~3oG;h zc9OqTgRK^UXs;G}bt4!X8*>$FyVh|lAfM#6l6~=7BQ{j`07Cl?)};T%oxZ{1_I7S< zyq9caJ!}*ZHo;7)g@^vU#4oKK?7DoEi``><_{J9ic-A$LUdXKy{r}FCT!JcJF^psgjWaZSQ(ji;53))OJ zSlJ0N;>K#P4{sD=k8j)XTNOfHzgoNBF+07vToJeq?tM&nFuQu|vmbi%ovJ3A7OeCD zdde$RW-Sa8mz&RPMHw!k^CMG=GrK-3B5;;QbWoGf8v;2i!#TLC;RwLNU5)<%&L@xe39qAE00000NkvXXu0mjf92HTb literal 54919 zcmV*4Ky|-~P)V=-0C=30mCJ5}Fc3x8_$#ciZ6flhlub5Oq9}{z7tjDhu!;fsk*0rNg9+-Q z3gZQmZQUas&5TXVKThY%l^;JZ?2bx{w&4f9TO};|7KN$YX1ifgh2mBjztIK^y5&Mb zmtrAIs}?LOgwpPC&7x9)M8BS*1|P;MT*hU&+b79#9ZYP3iR~=$z@~*XLy-SR_wE#H z_;Jf*_5Swa`(vR%n6yJsHQ6|;E$R+(q?ctv=yjQp`NBMrt_CfEZsqfIC7-AJSOtx+ zk}fm?bfXcVD`n6GIz5Si&W%Jsnr%j8h!q7+!rg(ie9H6e7d0yBG~ zOAT?l&=8-Ok)XdqUVtG_y_iFod~3W4d7!3ZycF26CDp%fbr#ee1xotnjTM3yUm^Cd6GP zGL~_-o_2RHw`1QQrxTJuATpr`d9JIjsxCRtsp@mT_v5dyXU`tyQ*OQST9e<)yvYNP zJR!WD&+pl@$K0}Ii!e{8Zvww|-3<*5rqAc&@ZrO6TetjHKD2qupS=n+d-wdC@cT>o zcT<|1o99JuLqmfZjYb(99Q?KGjz*(gxNza3T=U{v`OpbI_VVo)0rL0qJ0qsg=bIPs z`FuVG2M6b4;lHTY`deba*q+*-eeo^)9(=#s@@ogd#bltj0={1c{758Xo;-PyWHQN) z9Xo#IIf}o(ets`+m4!-6OXth)n@_#J5_~WD#C!Ja`IYA?znwFB$@F~56n!i5SF0*; z*Er|p7mar$0eXd0 zH!1EKCv}(A&&vhaMk~PYy#C)16Yxzj(9=&pZC=a>?c8yH;cKtA82z%(ylnu!#CmTB zd@rrSGquxv`NuEf7s`Gu|H-g9z-RB=_%Z|huIv9zFah5w2706NI?-OUw6v5+B=TlH zb8!Ipc7gYjeCcQ(e+7K@&W(KgC;fzktpLobaqD6UhhO#nP$1Dq`O?uo%M5;n{_8hf^^RUhkL`cvm+Frk&Le*P`w2BQ^K8x4oX)z3#>Pdo zw44K=tgH;L*N^gI6W2cbCEU;6hcTN$kxWu6)^Op5FJP>P!skbjNHZ)|VitlumPU!% z+4$t5SLuJ?H^c;drx@tX=uak-=1agndGaL9&CS2`w|FBF;bK!e80q{>p9)3pwQ#A7gtE&S59O(|Rx;ns-?hu~Q2^KHULw5#v@mL30X;{2G zk3Hun*wXZ~d)*n};n@vuSYJ}oxlr~2&e!}bz|qojj2&f2zSkRK-?wdoUUc*57l01n#P^0MT>StI>;E2`(|RtGoZ>H6-}Jg5yv_9s z81PM;%NlVPh1CJ1WC(!kmjoD(S@(|tXHQJ9csVZv?(B&Pw)`9j;a0~JJdnEf4e6Af z4$iMAMcsJbV!UXWfq{XS+3%GgWCnzgigB$%#|>NQSoVIP19%J;zRbBWHurE4K26{^ z(gb{`80gK&8)5X)(o*vk#R0-Q2EdDDg1%P#e*eor428m+_}&lzi|%k>bAE{tBc!lFigc-Qw{2Gh$X=N$9Bk_oc_G8sB%7yd%9 zz9a(!12i@+`i(XL-zf&VSP|Nneup<39lqoM_#Yph1Rxl2@xgz0|J>`D

    gu2OrzH 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 From 54efdab643b56eec45e78f7ccb6043c1d012a510 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Jan 2024 00:58:07 +1100 Subject: [PATCH 042/339] Calibration - 15 1 24 Good enough for now --- code/datums/components/radioactive.dm | 4 ++-- .../components/xenoartifact.dm | 16 ++++++++++++++-- .../tools/xenoarchaeology_machines.dm | 4 ++-- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 54990 -> 92665 bytes 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index dcc9da2c08797..82f3195f68a27 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -46,8 +46,8 @@ radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*RAD_DISTANCE_COEFFICIENT_COMPONENT_MULTIPLIER, FALSE, can_contaminate) //Handle artifact transformation var/obj/item/I = parent - //TODO: Review this - Racc - if(isitem(I) && prob(0.1)) //if you ever make non-items artifacts, change this check + //TODO: Review this logic, maybe make it easier - Racc + if(isitem(I) && prob(1)) //if you ever make non-items artifacts, change this check var/datum/component/xenoartifact/X = I.GetComponent(/datum/component/xenoartifact) if(!X) AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index b5eb7dc21d684..2587cdec8ec8f 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -139,7 +139,7 @@ A.remove_filter("texture_overlay") A.remove_filter("outline_1") A.remove_filter("outline_2") - //TOODO: make sure this doesn't cause issues - Racc + //TODO: make sure this doesn't cause issues - Racc A.appearance = old_appearance old_appearance = null //Delete and/or 'pearl' our traits @@ -291,7 +291,7 @@ return TRUE -//Calcifies - breaks - the artifact +//Calcifies, aka breaks, the artifact /datum/component/xenoartifact/proc/calcify(override_cooldown = TRUE) //Appearnce artifact_type = new /datum/xenoartifact_material/calcified() @@ -302,6 +302,18 @@ //Disable artifact cooldown_override = TRUE + +//Calibrates. Does the opposite of calcify +/datum/component/xenoartifact/proc/calibrate() + var/atom/A = parent + //Stats + artifact_type.instability_step = 0 + //Effect + var/mutable_appearance/MA = mutable_appearance('icons/obj/xenoarchaeology/xenoartifact.dmi', "calibrated") + MA.blend_mode = BLEND_ADD + MA.color = artifact_type.material_color + A.add_overlay(MA) + //Build the artifact's appearance /datum/component/xenoartifact/proc/build_material_appearance() var/atom/A = parent diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index e70e974f09f52..2c405f2a72f21 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -143,8 +143,8 @@ empty_contents() return playsound(get_turf(src), 'sound/machines/ding.ogg', 60) - //Disable malfunctions - X.artifact_type.instability_step = 0 + //Calibrate the artifact + X.calibrate() //Prompt user to delete or keep malfunctions var/decision = tgui_alert(user, "Do you want to calcify [A]'s malfunctions?", "Remove Malfunctions", list("Yes", "No")) if(decision == "Yes") diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 1cfceae696243d6508680f589fb625fc5b49a9c1..124774627c427933033a9f31d50ec0a1e38ecdab 100644 GIT binary patch literal 92665 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 ME2$(=CHB?-e~PlT&Hw-a literal 54990 zcmV)NK)1h%P)V=-0C=30l*?+vFc3x8)>jP4whei-(2Y06p?Hz}f*Dy8TUfG<9&P&fUC2#0 zB^fOQ65Jylm>I3%{rFLzp*q##lbqMn2qnC1wxambD)dmoVK0iFbk~P;@Bsrs2`h_p zLrRCqtwf=;^H9Q06c>k<(*72`(l}uw3GM&UH&G}u_zfj&H?L23*594Mp$^SV=*+|S z16@OO^ejyzKVwU~d}N=G9N5Tg&|BnNr959L<@r9*;i#kK3oQWOXaV?2630xZUm~M& z3z1PcLT57SM(9jN*$AEC%d}`(ebJ=&LN|mjbwl`Kie&8gQi^2k_(F>kTl^h3@M zV9^ik!L;ZH{?sHDc0(tVyPdX%u=%UydFzy}O#|bHRe4hBE+}Lq)l5>;XU?+AiX$FIBFo-II zKuDvC>PQ;Zku<&c-P{VXU^nP^!dcJ+Ly29prd^Ktrz@fL0m%! zpU-#Ajb8S^dGdn!B%lC(0*JRXN|#?(bNn>pnqNaK z7Ry)okxv3%KHqP&-P+p9<&d1RRXvk(A?ZCs;a8;VLETE-KD>IAz(Bb zeNWq$o`vxFd~eyl9B+HYxT5vf#)JMOqcx-9fX zix%-;oPXN7i9am+S1o`%;eC7I%QtJf4F9I_h7~JTh<9s|rgMxU-vk7>9M(CVPTt4w z`Y)f=^Y7 z41Bq-JsOSD*ViY#*F(S7(OrXADW!H`e;Z_Nh%I*)$PbNvTA%GX)^8$LgJ73X|E-I{p_LH^6p;ps-c z2?*rX_H^3+4;CvG>9}AE^O#A<-8}vHx=>H|I zU@&Uhk#7&2ZvtLggORsYY13{0U6bHPF9kgBhDYBDhTi?V*D4{-7YXz2f%8qkzP>)` zy`~?36z#v~K-fETfOq@sow>oa$O-Ztg5=u+=bM0#YXzgxXx>CPo%Y`v2%Byazn^h{ zD;)@fyq7_F`#3}1uA!x+MdV`u?48#z-BZrd&Twd7T>>HPViwO-ysO(KLmjM6A*GE^Z5)%r^Eicjsv{26}bHV-CBqD z`tFB?OUohiQjzU4Hf-1+U21|wzCr-V5n!52kNh8pkJMzi%gDzx=Xb+p@0(8%oA=0Qd;42Y5TKha~ViL0(Ejz61GoLetv|^ijd} zkOV^hd!@(|0rOayZ(8ktWCZ~E?}Z?b9yp%_%yV(zX|;b<<>%TzfX-80|zp`C|-CCcExF zk=ghlnehXN;|EaIeGVyQ!%B4^#ZTjTwFUdK#bl@Ya2`H`p30&K9o^={bN79i!J(@Y zz-0yIu}1w{xDG;)k2F&9E#QfvWRhsv6jFQ$y|e~P^-^}?JeXm0e?Lj$m~|_`?L<)| zBy>^^ux8(ZGn>Jo6+*HT-`+iB{T}cwLcF9>uw@^PpoO~dR#IL&Bs$T;XUR_WGBmjg zZT0sFJG>-qQ6hdH_`ua|qv3*rWyMIAEFrbrM&SD|;ydsvQbwSPG*Z?i)A|fjwi91( z51D!E&`0_Z_81c-D`?pL45`#G>4G(6E4(Q3)3{r9AWNW0Y2v~~q~d|A3xV=j9{ioi zdlL9j7hu-PAZ7Yt^bqRMA)JvxoMTg{iBZft55g%h>zau!_!6T{HmDhN_mJb|1je z)egeO!20{p98SdWIfS>CWZhC^RY4L0O9n#?U_{NUY5}gdo|k+IG4BHWpiq<{Oi_$c zUV|_Oag3hCd;Sz=MFpwiN*u$znAP)%%`GQW2acT@YBGjq#tHQuAZji{2q($%auS{e zIFulczH|6@JP&FNbMd`c-f^UNxKV3 zm(3)){5I@8$En}C4au6o^!Z7KLZtO9lCzkip52(42xAR5QgM0<@ns)Jd*NZSr41xK zg-{M?KnTQajnU8|{KtBb`x8jj#YkO!WPNtRYre$L#~&m$6Kp4jNrlSj*mx@}Duf0Q zQ(zg;|AmK;V-n>D_LA@jL|Tw2v}4}*J0xbUpk)7NuSft_T$}U58YH?Na**ptfFB6H z!-p|0wxe(O7y}PHOr{Z(Juzl)eiorc$W*VxKG93<#Un&+SWVCBFEg4IT%l61?Y3+IsXf;kB8Y#hVyK&`ALD`MCO`!S+XOkAYv!JH2$AZ{o@ zAG)9D=3)XZ`|up!NxJbyqAPAj3pj~a&u3z32w65LJ(VCM>m;jIQZRUkc+D~#nJBvC z$I6Zo?A*`fiJP%*lwcH?0{mdjhUh65#>ehNm*RMJ9oOVZbVmcR8#dyd93=SW5e!Yo zJsyKC=g2Ofox8@xVD66)Joq}!-J6N8e;8xga(urY!Zp}Mq+;#+PlEGZoAYhRdk%6P zbpm`~WSi;;423B^@-vE#9zpd$rY?k8G=t>aRm7Klis;f!D5{K-O(Gj0O#brcE|Oh-XohqM!gaUeDx1T^x zQuA+*;o0^gjz|>A00zLcAQ~to6CPx|%0buK+eljyj-j)lXWqX6@?9Q0-i;G% zbQ;xHOz?CE@=*}805@1QkeX3|ENR#WbVNB!%v*vw-iu@;NR_X~HM9%w`55t)4%EK0 zIHryhh(wV`f%06a<(`@%yl4e|5B@ER!+|={N5TcV=_BHFQ+VhY!R^oEkA(>@2$7Lg zbi0ML5Qu=(52;EhI(wM%gU{eh3Z`o2qTB7H?edj%gXXg~=Otpj>u2wkkp8A)t`yf( zCjh{<*IyC7kd18IWc`ZUu6{c3@FaR7fn}u#&sj%s+f!&!4V*f1Eou8a0nSfj2UQ`@F)?+-10vDyg8K_-8(a-T<~IoiKQg?9KNf zD()bmIp~|UlZe2usGa zf#UU{7ggdpbq3R3%w)w9!gFpy>)%H@+e`24dpQ5_H|hT8AJX})Z=+95;@kHcg~!g| zI08gKJ{`#=w0aW7vJfM{1ekS|WNNFxI!7u1o}no!e!d&`sUgC%ZzdrWDqh@7nP4MLnzWP{`M^hV*+E}AQfNw9z}oj_Y@?%@%5ZXI}%1H z1{E*9M)B)Ai8tQ{ngf4ZCslv{RlL1nG{^J_;6vXbB;Pqmz6E$0`%i8cYuB&F?oo+P zq%n2D^5sjeS_Bz?4e7F4EZKpxryna=f?g(LNG8!a3y3$bU}EV!q~1gLx4n+*#2Er3 zojA^h$##YjvuYT*=^I2u21n0XN?Y4;P8pQHzMbMTeb{4BRP5N=!F8gGtXf3I6GF*2 zkVF_Gc=v3|ok5|bGsg9+jjX=ZPzVDQW&!h%DGj&S?! zcV3abZ@l0Y@^BAH-wZTsn3P)1__{fioa(?EPmolm7+Sj?b!e2by)R}0Eb~~AhdZzBU2hZNU7)6V~S%~FLkXNml*z7h-@R+jzZz)9z2mjOfkV&&0RQCBNYGrSIFM+-K(Dt zosZg_`OHBsk8WQ1 zXMY8XAiMA@NK=5&A<={HD0%-HyBECs!wc>tTb2cf;jf0{M_y zqr7j>AqkMcG%QBOlgtU)sV*sHED|Pb=&0J2pVFQ_OU6G3Tf7X{sUzs6Cy{2%z~6Nq z-IgIMxyX8|u!bWv{OSLTE!q$MQW7`Z#rRDRkqiKaiESc^eY_jRlF9l#csusuKh}yS zIZ+4BAqQ&62EnWZ$pc13J$9c1IUADR_n?bd*(A!7JmKQOWtz!JtVpJytk8Z-;RZzgbhl3h<-pm|A@ z$=*0qjvkiHy7`LjO1t|IGZZpaE0AMj7{ zDDj97XDKio#(!`p`uthMDl2d$O@jaS1m5SLM;94XrxUv+5Cf3C2S&!fbL9facWush zL0|iNut9^j-EWq{SV%MRd&P69>8!*P*RT4?V|9t z7qOjw9ZxpMn9{&_T?jlt1Ee1M1_@!qzvl?f$uXQ~pGOOR8Y5kU6#_9|#;PkuOn_do z5M41Se(8D0gwU)w>qwC%R$5Ow6vA== z7LWp~jNEi)AEX{w%BZHJ{$d}RzaE>a;<#`O+w0>9kt9=KV=B}{VrCQa=?Ox={s*)I zL856fvAHg!dmhFV5j2;MR9=g-ryt!@h&Jz5gkq2l`jJ!PRKD~ox+F-iyN|ftMb9n|87)F zHs4HOxCME1kf}M%#O}Tka}vzHG#Q5js|HvJwgXdC{>9T63z`_aXB`L%@66Wk6o~SCGm+M`l4e z+NlwS9e#|P?0BD>#QWka==um@Uk#D9-y(JEDvAzlXUZ8Q-LROl*AHMfRiwf)pJLG`>U{cd8%f!R;hw-w830`ao2G+z-B811OVm^a3x* zwJyxk0O|=4UE_prn2A~bWsDR3C~^Tok9Mw|$?iz0@)Nms7J z5lJH@;-nfDk*Zlrx^gz^)F>DxiMh9;7u|~g!Y{CSY)HwA6dl+{v|%OQ!8eG_`2^9m zw-IYvO}a!yF~EIv2U_eXM$H;V?kuF{xqrthDj+&<9kF5$p~wG%?9pe@8}CLLhQKSw zF=x~vBIl7tqsTLsfYX9%8F$+V^^g1jrFRe^S*U{wSOzKr(S3k|(Yw)YDuyZ}d;MfW z%ZQYhkh^1IqMWxtACb0ksf!aBQr}HEu>ux10(s+)( zft*f~vfYK0OfuNC0DZ})NDFZ6JIKW9mG}(h>IDG#*`OicIY_<*INgZMZbXzeQFOQ+ z=lB-J7S3R7@fS(iB)q#O2%g)I@8V%}-+qi18`(K4NzA!}WK{#AvH;02aGEBnkwNL$ zjY1atR2Q~rH;!ZbP^P*uWDiNdm-K8%RLrI9Xa7iYeF?G9QpP{|e<9b@V4F&T6vH=q z61j7LWYEdveSgZ-hB+7sDA@Tr?$#ZcJ_q84TTt9?QfKy|boHVNko63n<4-fyxQwij zkxyMf?QFxFRms#>6RlnWQ=qHBL(7qp0-lY0FahKX`OHD`Ex_r9QdWVU(XoU<#%2+p z^BI!!+$g=^9q2)mG9(LJ6dyc_?zEVwTukKl6=ZA>Ja7>$Hi<3LjZ#sJa{eT;B_RSK zM0ga}z!Z`!qZbsCoZo~V1eG+|^a%3!5tP_k%pwEVu780dADPM5S#FUcwbMUH}IN0ltp zt|SH)!^;;T0*i1=0PZL8?|vR-a+2%_2w5j^cn5aNB9%>%t+@r&YQfog5xpdgS zEG8Wm46J^L^kNyM)kJGMj4Dj5WCEdsv-?e4r`w2a_ySRXG0B^X83_F&wpj|cjud6v ze?iff7s$8;a^pJ8pdV}a9Fm?PvS22zb^|$;#b}z%SltW?S`RT%y_CsseuBvYh!j=e z(GwK*okRWOCn?%>7)zhRK5Hi7aN+|CAa9;9UpdHS+tAyIfQnh zi>xb-5}JwTD<}Bu1O z(Mz3--t%qJB@Ot8&tV_w1WiWvxRHC#pd3GnW!I2R8)i5PO%=q~e1-8)4Q{*?z4kNk zX$VgVmIF9@67|#tgq1-UX;5^eMJv!|FCrT7VKxmC@4JbTpZq?yazCjxA0t&#gKQNd zkG=^>unH>iwLFV-?i`ky#nMbf<6KO)4;)_9$P{{2F#~lsQuW05aTJv@Id>JlEiWKj zS=4v}OBh&K$eImnMlJFUUnc1yH1ci$03ZNKL_t)FA~k;JX))Zen9S$uQJ;dc{o8RL zYe7443Q0&9s)=M~u{0Ovy}w1IaTQrjAg4yq`j288?L^Kb(IgcmIgHUahH>YgGqq+G zg)cvb>$zW(40$ove~d)^ofvk3W1s zxPhK22!IHJ)dvm*>es?OcS#ISNxb}$#rP3$8ZudIsM63pl6Tdkn^4ns4A-eQ zu(zE+6(&NFFqdz_wf_}#D@?+jK{ZB@Vv~dm%ZaYNAJX87X0YiKs8TVZ{XarZokky< zg}{ZwG*N~pi6@;HikCp!&vCZ3K%g3GXV4e#=Z5$?YV-@aUqvHW{gh$yvQbBuF-DC# zmn!QpL1`0@IA3N!A7@^A6(5rlAOwG_*x9EYXGH4al-a_NwU~#*Og5NpjKpU%D0I5C zUY;rXSLzdsSdzGr+vPblMEWSz9n6wj`7=y<G)91WF#S;AswfKtXI-YAwTSljO> zDE2Z}{R02X`Ey3aAh%53&O@?EiTGDaMFIqTHCs<6*2E}T-t?Trn=Rq`Qxdt@~ESn)}nI^ znCEDZx1&cbzHy&HNd^=PI>!Wi4nqGvkY_+?6BOCNL3{)Te&A3Hw3k=G-lN>ZI&SFh4fB1CqOa;Hiuwc zZ7#f+ia{g>rUF%(h06;@Er@YYXTqAf@To zNVvdALb}F63Z_x520x|S4$$AW0)O8zY!^;pt@|{Y%4#A38{@%Q)Q8(J7JLzHxRq?E zk>SrR!th%V0Fn^v)gW9BJy29o0hUft@0%E*Y9gQcUEFUziEs1>uB~mT=k}1kDWTMeLD#`jwwq-L@#pkRvwNw^I$qdh!wo#>EccKIL92j=yo~ymHZkR-Qw`%-B`*d z&igY&lwlHP2CuLPq*Qc{ps|K=^>Kn~IiC@=AP#XtTx3Y;!=X92Gu}uE+W{}I5eQRg zoaJ{d6OS~HSG}F=)b`WkZQz!PX71PLp_#v;LTcfV$THjc3d4MXLZ_R+WC@A|x|JfU zCvhn**02;qSc2bHK^dAWlHx29Oj86@jZ1v@%qo7Pi$ zY!K^W5BdrRrhO*%Yz#vIQZnpMfX59&&fTFpXfOE`h7E4`$s=g3Z(uF`7}=(qag3Zm zJKaX4L}N76$dr;nEt^5T+`t3o915j_z-n?O!A<}YQB}u6W^uX{gHHBH-Nd9YnxbHn z-CzzQ%Q9g(NsI)hVu7kKZ1uC*{SqoBKNtOy zgY4$+nl5e}T*P;?58~u!eBRi`7g0EXn;)Ej<2FcTp(_H`IA}hQ?ci0R&<)7B5NOj( zXgva5dmtPKP05i7kt4V61FZoTRKdbZ_{la%w1H&;rR3^;CczS501g$x2F$L68)w3s zz3@^I4DW!!6QERpJOY?d>jRqvE+^Eu!0m*MvmvR&fx}=Of!e!a)k0WM0efX|^gvpG zkaANVgvh-#8LA6mR=tdxl!qC=@kbO7?4f)0=W**QHHV)-FRa4VWnu{x+2tbcZX{N; z0GBZgZ1 zvvO;JEs4061bqd9eU#}9xHT_*_KS?jF=|Z%m2IdT;6C#~=8k@szb<-)gZ5W>rsR2c z$SqXLa|jM^Vo`P`Lv+(Vx}EX>cx3RoV4@b%?a;%i53sG!~U|t=3ehs{I9*(wx9tQi$T>c;qgA@hH%85z_9^VXE1!}!;|0?*Cufk6Y z;dC3A`@!^qV=c^S21N(c%w0oGS*|tMeI7b9AUPpa2n(ygsY1Cg_nXq^?y7 zm488rnuudZupd8$<+oE1H<=$F=Y;DI>A2&!D4j7M$>G6rx#;uEA^TZiXN-j1NwJ}j zdUGqkm;EO2&%o#Cz(EKV7ey%2dBDUp;e-`l-bP|7Pu6s55a5=+TC!j2=pVcFAihFaLXFFp$v`=!dL<< zB}d+n7b;!Qy9gu~EU1KsZiF*o*t!eSXCbr!szVTqLwh|~C;$I&Ndm%Kb1lTh26!|M z_pF8AzZZVyhjVpc*I@n(*f10N!Z0xfSra5VcLKx8d39{L?<#U`ZH}ho5_rgo_cAO2 ziUhI-ibJ4=`-iX#9i{yup7suOSt4=YUtv#12>U|FR+y=}W$2oqwr4NtvU(x~4Yr=CN6KXDHQ))5{~fTGRhpuL+P`CEB7-bka~%UuY{DQ7#w{E8D) zQo<@WQAeCI(T>OLpv*i-6O(kQ0tYs#rxx;Q>kcG(foe=y21y{vDsCze*3%Sc=HYg? z(xV*Z2UY*hpACGCnbJS=RPu9tRt~dUdX+Dg%KT{L%lIrm5<5V=fSn_JNngg72JZ%b zhnM67Y}Gn2%{Yn? zp^b2$7gFh5IHf6Yb{JwQP!zD+b3``9r375fo!1ng35aDOotr3xB;~}W%DKNHn-fti zBT&sR{ua{Xk0M(Z1{R8C;yC_y7;8U`q0J|v7J{PU>d)YB+ll1y()Yy~O!!}=bZCUa z!QI$WQBuAlM$2zua*+!$Wx;NV&{!X?;d7{&6qaz~`}I#rxFK4-0wrKjpdZDs4xzG; z7!GtGhy@ITsKtgHiX0B!ln3-Brg^^mShl?;-t(3PNAVVoTSK-7FjIGLcKJsp-2j@tP7JtZ0NX* zQhLOB_7uO)4<$F>iZ5k`)xlq91driltF4bea*y*sdOmk#F0e?1sbm4qNuwO4pDu>+ z;-W;VppGi+LLw{;anyDWyV8y~Rzz+%(IgF|Z5d2UM;3Ncl;L7G_fGr?og8P>d77Q_ z^PI0f$*uh>`0v>P{$=78{=lno*xbiMHRJrw(5r?NT0m~WdoCQMj5CwHE17mOcAAb1l$miVbXxXac~cTI=o>% zm6>lKvQgBbZlwLY$u`|avaA+?i7YJCYzo!VkrWk2-x;J6D=}{Z&tJcW`r6YNQ(0V! zplr!eCjCEv)iR;&gD8?gXXP!35ZL1xv>7)MpD$pB1v{n?+=cqe_kk=W6tfl^ZuSDF zKzV?qtqURRjB68|kZM^V?gO!pitI~#&#Ypjwu~p#i)>R*GNhF8mFzse8*8A{<>%Md zVJ=!{NI6YBN&$Ask0dk{A>q>Pc#L9-qXkTsNMsF}jAdXN7LsDeB?_s@R^i|TV8^b9 zFjPUm+|Kib|HNtk0@g>D^QH7+zGzOcI#b6#X~+3D`7mwnTE3cgQE#;J1!@RU$w6s? zZfTG%+2n+*BC7@o*AN}XF=R!;Qf0=o8G=;ts&a-Y`v@65gF79-h6hM;pD~kzQ}@#; zX3*z3#+200GsRozk>~M0hwkGa5*9zz7P8rPmT#B*n2nS7^1bA@@QJM;_5u+M!pQVr zs)t!flQf69^*h;e680U-k;2M?tpHB;z*p8lp$A^^Lr*uD2~g@_c@xz5;9wURCO93S zYB_OCjDi>hDxtgx0?wS*_1SVsY>G=>nH-^Os=aFn0InahFzNfAL8whYq338wg!^1J8k9605kK>;f4xq>^0$tdih#hWY>V zdjy6$c&OhFT)-rPk5=H2Jgy0Hl_ zZSoig)B!wZF(210mWzc%6fgbOC{b$?LrG!EStP(Ie0VYy)MuJdRKcLxNtP(GEbxgU zmL_iDn~9|qNpFC-i)UP24A@VTBuP?EFe&wO!G3|A_Fe{rhh{6p8q1EV*f>BBCtOn$ zS$^uwF&c$Qy$Io!JSei0jASt>4>IBGCZ}Dc1i-*XtHnEZ8_F)dmCpcJWG9z^} zW#$Y(AY;8XY#*fnq>cQr?nQRAL3BTec8~`l+X+)9T!_QH^P#dl7f$#K;D!dcZEnsB zxAjBcQ0{!8BB(2dlfBS!Hdhs5ZUf9J$q{}q0>^v7XouovSlkTh6r34_u3qQ~gFXoI zXl`wB(g6b|=m~JTV0I`+{?>lj*#7V#k?yl1$<_ax!)%aVAdWHjYc|kuBSjC98LeqS$){0T8{H+j~1@ zejIq_$9?cTxWL7^xO?w!t#7UMohu+EES#S-VQLBH&O&Jl)Gk=H3c8!1xymBX86abW zY!S>!kb_5NpDctPAoh3=$DAG4^^u3JYIAkmbQU>gyU20B%HHHQ?$nkEn;tIMhIl!6gkjNyTYHFR z^CMUvLJT|0=)&M@rE?T-fZPoB4dChlEdcq85H7(?84h$=r~ax&*xUkM7feQAE^5J! z${?(31-}E155VjIPz60LmMSa+3@pRNDKN*NrUy25L%9UcyaVBDP`Y3R>QMmI!s(g^ z+;(WLfzDcZeE?oM1tS+=;V2lRAZ09gqn9i_0yijK(6<)$?}6KTtxlFIS){nV3aSI( ztp%G4BxF`$a zhMzTtox5}$BtNI51y0Iyv}z69TdHP%aXpRYTD;Vt?G&(}xF>pqRyNUSqwPVP|Ori@L%>)hyw3l&C&O%vi)UA)u|{zJ)zJ zhK7@~z&7BXmA=Vo;5W#;g2XFy>oM+4-$73HF{s8k6*`YCxt=eJdG;3fb5U91l>HR1 zh2G=$!5f^Gd}yURX=N)(@jBo4k7Hj4T^+D#6*TxjRv_*H{R(6pFqyGV-?l1{6eyNq zISoY@t5@MmjFH~*A+j}{IFG+XX4eD6_5@);$2m|W zZ`d&R3+ODsRLQy_RIdV;G#Y<5fzSoMqpu)O9;MK-nUSgknD?pByh6c8O)B1tQ8RNM zwUA+c@dunya=dF6`K@P~*ZgO>Za+y`&eKxrBYhRGTfc7;!tr9o?;DANsunZ_?z-I zs`P7YGBRvn91ll;07KFt{w8#RBNflFV9ry}^5}XAMUwFmqB`G3U8!fGl+Jvou& z27_F-P19qn;r^1FW~q+LEb_W~nRnbVPC4D!i`{rkKh@#|)?skP*o5Q&n@z6NG_))3GK^7PSW`Giqz{Y9zlh ziy5%X(6FKrtgZov4G!Og(^p_}8jM*G)nF(vw+O@2Ffa|JYhdq(Eq$=2((1+6x51b0 zf;;-*mbI4cLeE3QX(`h64mhwLF3-bzgJ2AT+z)261((WYaO{G6_rquIfQ#est9LDa zaA^o4MQ93vO|dG_^%=M^3-f8n34z?UcHfiw$P6O60Ih9k^_@&NZzc9nHPu6lXbsIc zqGjsFE?_gu6!jpTufM_SAO15<|NIkbe*G-f6M~qpA7`ON{j1+XU5;TZ>$rwb6OxuN z5{+bIei(#RzdedSJdTVVW9kaw#ltLmN0{{vFz38MTudWlXLn{Fe;2uh`^{NAyav1r zoM8h^FaR8f|6CdD)tY||9AAa|An?AMzq%WlTxC1x_6eF*>?J+jcm?(bWdy_&n2pw3*Jr@C z2@dXt`!>S=`UQOOETpbLc@a`W5b;644=oiiFb~&9E%=s7SiDAVpVXh!s{Cl14l>gH z7#<^uKRH48{#KSeyQr8RVYaH5$nFl(zDoLDdde2g$T`u^eb2v)YTp z*NuDb3?wqhhK4#bPQ}bg>Yn}ym8BfnmL1HtZlZE-5ZmP!aR?_xa_D9O#jxQkH}k;4 z4!)LarOmv6rJuK88IP8M0oIu+oyG=|ri&#rPF~8AlTu9E=NPk_)aF{~(*=8UfleJa z!&aZ_Bw?WkvC_z?Zk zK6=vYsnA!W>n3S^nWVWu&K5@&UMk8#YVuB1hJ3bIydpn&|%JcUu435l_}d5CcM`< z=N)D?+sX3DiE=wh2DA2fp_#TzU=9j0svGY@4|)&*7l!P?fBOHh(0vemCfRfyZRmcSzC~a|&sP|*|cj5lv_ee+x3`l0c6cje@Wqi#x$^t@5gP8Spwp{8%(NzM4 zTKck^`ABR%U(qGp%u|%N@^jh44`q!PRFy@2H7zvbW{PTKn%j&mgiRl_QksICL6eKb zZE>b;UaHcabQn6DFI@m_001BWNkl3yhvDQUizf&#m{k@YM+3bEJiFlT+u=+1z^$91p&EiRcoV>qr}!hifZgmi#Zi;r}@2f6tU+$Ww#0gV2Q zL>ip|4wMd%rIR@&%Cs0@*g3>ou2Dt`>)EbtA!WSIx2Mh{?9g)yJoX?w zaVP9s3wzgEVwYk<+Ju}Fs_oFz46QZr+6S<73?vVhf6)$N+8TveyBj`w0Cx4lFW-cp zeE_dsh3jJwDOi}?uELcuICt6V>zgH@1G*ZZs~*OdVQvZXMUZUP_Z>FCgg^*(u7^+T zgtsQ(cgH{*hfUkzphLqHF`V=pOSm`!lqiUM`AXT6qUtge_6&=K z7PcCF$mVI9v|;WoZKqW3VOh~JAU zU92`6ahvDZW7P23&ww>SGIgTEtS^KLV#c0)4~^r({PU9sr-$dX2$pxVEsuGYTNDf{h)py3&GUQxVJ3P%47o z18ZBLwHn$QV0$afrQnsL5P2IMo8g|l&{Jbs9%2PJKMf2*?HX9$0kd(4N5Q8+?`l}x zD3BXh-|?h9GLQG&U!a~pg&;$zeGBfHOQ`51yBa`Os6BELB|3&8Ln)g_#zaM+35gOW zIs%&k>hxAp)A3uY{X3aAO2m08s^9Yv7~1;rg59C1STe#BxhFit45Q$A3fpjT4A`h>3=Kn7!+M!k>AB`G!vt zutg97jrn{3ftw%tD)RQdxb!gQx~=4ET5$jV89b-nK-;j6h0k?jRteO@WoqBKL3+9d z?lH*f-PAuHq2KruqTI?&xs`tp4)VU|9Twy{0%nNr=w7yD_Rv=DAd61kULdQ4iA!+| z#mbQeweALWU$|${=YNs!3LonaTv%!#=Be0 z9!cNEL#0|g{2$O13RIs3A6%)QpIJ9fr40gOaSM!PC%*T-`vVx1Tv*BZkdHZ|cU=zZv&?=cpa{HtxHhV7U4&3Wi3d zZ64e86XeTTX729B_-mLt+JJp|ABNA)bmcy3zqFdFAN&aw-~BU|%=a+jCEKo8_n8KjoC@@@@KrtjzQXW%M!Bo*? zlO_8SubRuOLB?wi(ov{o%+ZeK%90jIRLPE_tC+eCm+8Se7m{GwKq$1U?I`+Fc*HCi z71nbkfj;tVM98x!h7ViOgNcTsIl)xOUy($>*R0Sk9}D49;m!j6Vc9-XX_=kPI@83M*Y zc3Sa4lGdL!3@}!_6Xg=*@{mYCvH*86YeDk|3$p++7WCP)8uqloFHgYmFq9Xpe1V|?7oao>qqU%QTh35Z!2UH*6mYlz zi$~yy2@5mO)n`E}O#!I|wCgbFgkKb)qrnRIjL*Tu94OI1kjhm%2%dPF!0bs%$`;b1 z4#m{by0%f!vqX1(gSm|!2!NPTsJU?(HLsDo^^+K11b&%i{g3|?*Xe0WPN;sOo7v5s z%zoo-*53FnYf^_9I(aK*zsj}Geutj(&(rz*i)fAeDcZ}N$-jxq<-;bc7!v4u5n-C7 zMU#Z< zPgn)~55NiH0V2Z9qO{CQ+WkCYD1>-s<&&2H8&1ygsoXl8%Oz%AGnCaV&Vq}UWIK#a&c7W5oSIfPA7NN7<;Dz5UPL*-;)grt&T);-FidXv1!;K56MW&>-J8@UB9aq~KV zswHWT{5k(q8fMa1Mlr1#o~H*JA429R@N4V3$zoEA;5PEqQIxF(QZ}NK8BZ9 zRtWJVV4_on%!4e54Ls-hEhDxMNSaX;VaF*#%v}a!0z?HEjh3CjNL#c0D+1PHn~g#& zXA#TMSqOOHwzY6*t<_)mJE5%tULA%vE?Ht#%RO*QH&i$+lbpwAaX)TCA_bZW4i6ZT zmHcXNgjfbHje>sFYG*dKTcmf&1oILU^Ps8_$-s?yXsv)lYoMzJe(Qw6t8jGyhL#{u z0kIMo4v;k{55S-X11YPmE5|_0fg)A`U%pb18mIR#!2OUqDC06&5cV6;L!reh8?|7B%&=6H5V{2D3>(M zl8LIw1PRiZUClOnfN4zg0;{>i64;x$QX9D;v;05Kcc~L6yg8E(N zg4xkoYzdgBEk*>uh5^+j4s;G+Jl#MKklu&U<~vW zEcmQNECd|rgZ0hUiJH}6ZVE~XP!vnd3c9RzrzEU|mS435uIVKUqHODer%kKs_}y0E zC0xc59jd@BgKUBs0#URoktD;F8Mtr*&MUB{#ey||@iBPqD*XNwl+HjT4R}^`2?M0$ z%5~3!q+{K+UIE3wP$sZ=4a4O_Tek*DD zng7O|vP?=lhO7w!#RgWTx8g0>(8!T?WXao$q-{k?qKt%rqp0G`RMDGW$2QslfgnuL ze1>i4Y%BL!Re|fkkFaReJzTQw;^&@|T(BP}JrVfuI4Sp*47U@y5N=$cxebu4O=#4sR()yZuVIVu_*|hb^o7qdIBJOplrZ=7>>`t zp;gv@QPZJXg`^Eers1_~aB!EPteM!OmL_m(2h^)Dr&z?g;I||`v63P9L$D>2gQYyA zG>8{qXdKpe!M*D&h54`_ZiK_I~soAkWVCp=M zsUZxhNTj-s@Wy=@?LdzSZbqmhQO5DwFULs#+Us=0lBJD)Lcp^ae+2j{D- zXBA%K4s#j4A{6~y-O7Ai~#?DrHZ;%ey^YF@ZAGaxIqw*SM~}O1Qj? zgoJ817%z`fF!E@ci6k@>86;H!0r`@FVVKy2jhqr^y!Il|iaFjBE>gxkQ87u51cm_~ zwUVvjyZCZqKig3$@d{VW;}~vGvcQ~$=!6ei+TiXDaC{2hJ_XtlkOClefjJG@DVTP{ zbkf=Y0&v=3cLyvb;9@@{PQ#lDq|#8~fKnNR0#YNCF2WTRGIGKu2F zsO9CKRzRx+b8%(jglQpEr^5==$2Eu+tqL?WX>H2e)mJ0dw_zqpFlx|&R|gGhZRh9YCi zCDOGOOy1fHQZK|HaC{c6sADTdn5nymM4Pa<;#NR5aQ&o2wy7Io7Rg>d&+?wXWO>Lz zPK5F5A@*gq@@dmc8~=bcMxYAI>vA1<7KxP+0W>1mhz&m$$l4HVGyv-f)5%Zl zlN<>gW!!$Am^q8j?xWS%L?BavWN6Il3F>1ulKc)o+xVVy4bS_2$*lbxIXQ_bz@<2O zn;N@;Rt9>dTu zWeHgbvLZuH9%WVIgBc(wx`+YQkK9M41f0>}<)p$ZvNy48)^(P6b}L(40h&khwq zE18xoS*_4}*20=PSjt$5GhMd?u=!;ebHbt<#7$7-)34$gJ&ZeAL<3Bx3adk?my;-k z0x}@lYB5}1{MkId$%|y`+PK+y5bgr$KTYcNtIRd8r)p>f?>pZode`5O`mnG*^Q;bb znaZzE(R}`=%y0Q)7I!~R{oo;r{j2!4_8peQ936TOk7t`{=OS5gH*bg_$HWYpX=Ag| z%U!IchKrPV0UKAbM4wuq3up&6W9_z9bW~nufwydDxmI(Y3EKtoMgpJBM|W-qo#9^E zigk?HhDZdL`AT#je&u^ywS9``e9tnfUPg7QxI_?4$V*wmTJbWz}o{Jk>7`I?g~I|eZ1G-}ZX@me%xH$Si+ zAtFt%O047a^B>_;g;gu>QHSzINc8hFae||+3rtrGvuM9bQi)SCOB9U~=|Ude&_D?6 zvO>`2C#W~j8ClOG$q(^Bxe_~{rHF=|M=8=zrMQS1I*#T9ky)8@=>@OXf-&)wHPc64 z4J`riE7tS#J}_3M#u-@d%E<+*zur;>4|ZFIx7R{2bOjjet4jQZb0HQjuCvVk2OXOUa@dryiR{_~`id1UNN78i39O>c<+NbCO{-?1_cf5&q z_18pfpW$oncbIWp!{Z3i8QDTjrjD$dXE8X-l3anrjnb!1(sYxq{I?JD&ms-T#}afmA!@m`*HlXI=(t{4-b@X zu0T0!G6kjq+|Q@Yzao}1D7y_3wlFD?pkS0JlnWS`$U?@gx^OFQs%i|JfRd^nXs<2wHBHJAW2r=UkJE4Yz#)0E$)yhTFX(j!I~N#aV^WnKYk34E=aA}NVykk2A3$;ZpL{ng-yU6Q@z|P@?iGy zeY?ilijzd_lL$%2CfQIVNGl!KwK!ILFNSq9+B<67E*X@hGP;nt$~bdUh}tBt~bMjTVUM=xDkc& zaafp#OpT=h7%KsFQ&IDj z;NmdM7A!jjE2C68yzrqNuzd|2J`1w@z*nF2E!?CWs3BUng}K^|#8-D=j|m#z{x>S$ z`~eH4QOZ;F7Fkf2 z7#C+5S1-{^8~;m9aNT(n*#jM^e%8g-vzyH%C~(0x%4}eexH5{SX#_iby3Jc4(Cqbpn`fj|IWbaYe_zyd++`1Ee#vID~`V=pO3itWpDBTf03&t z#E((&tiZZFun2Te;vs%0U*&_^3yisrvrwD`)1<;4A|zMhlY%%TH!=!BNa(Ug(Vn9y z>0HPyu#1PVGm9k7fH)0&z#QjzIxvauf#7=ZbXb$tl4D?2T6y5*9LyI%y8)$?bqcd+ zh0s?uSui7BfMUuTiRe|VUYXkoc>@{)R`{jD4|P>g;ex8*%0m@QEI>GKDZsaEgINO> z7hviXygLuw4e;^(;BtUlvyu;rutd5-$ui4nngw}WHY$N-*oy`9Oc?wD%Ki#WMMf#+ zF`Ab=P%#Ds};E>-Nmnh*BJI+AT1|QOdDRUj?M9nd?wM!yF(g4tek1$mH}TcnK{lJ$2#Ie{;yLnM z#l~rLqDZ0*#NA|h47eAA7SbYyLwbcavB-|xNAMNvY0G)JrPRyWsqZ+6c@aP7Z zE5ee1@{onyF~O_`VTW~XmTT1Rg4#-GtbzJ!D}>%wX)Q`ghH5XYsfE6kzWuH>P#^Gc z_*{uXz=|zyYk=NPa0DRhgyjJkc;9MJb+*F&Tde_JiVJE&P+bXCAqe`w^M~NP!>Up@ z7hpUFOoN08%gDGbjiXRdP&|cqag;ky7iTafiEQ;Mlz0YPGK$gKOKNfuW!oPy z)q8-nSEeEp$D0|$KQ@dmxe3<R>fE2&>YN)8PfhV^S+Cu)EOMY z!M3Ga`J>bw2=hfMYyj>_G^iOO=EgyFEDBW1`{iiMB`|3H^wqCHd z6Lif)F$A(?B1u-)#W1bpm1bCmHnR+c0xV<&QpAqOq0yq0aQjRa?Vu&?tU+0dWL2J=0H+t~YoRj^Q*}^|SiC^EtsbE^ z3}*)f)xv?e|0}9FIBt*~(_z_~;%inw%U*c+UO^!bhmV`gL@h$Jwn1?Jek(Wn<_9Jd zQ()x5+W@z16*v^ZZ+~N;R0;0B4R-fP2-Bo&niR5vU;WPD#xcQ;+f{=8X1@Q4)x@5y z=Ns?k`0IyisrljzEX&NE*7)~d8$7h8jm}4gN&LE=7e-P%`eg@=8?sO|$Qvb=o_F)Z zBPBlbc#x)h7H}0^FeyRYLn)$=J`VFalZL)Bp$GCX1;<{u^Xib7RiO$#`cG%ExzZRJ zH?okB7h&w_Mt*oK&*!!~seC9&ak)VFr%rwv@$kh*9dv$t5dAF|a$OlV01h1^Yv<-k z74ah<&o0^tXbLBcCI0;DHEh|m%<{iD`TN&n%**KK!mYnIzfX@&33I8a_ksq79m&;Pq zL~6sUjuK(k3KHpvV%6B4Jl0Yz_t0E}__E zWK}{)ma28>%py*^jL&N)7;@mLa^S9T;Pl&YIBckjf-Ff01cqs%8#(}GU87XeDCadw zIqPdNqy4{YG)*vc6H_-ZbQ8U7pqC9w1)W^JOg67kDC#J4nKHRF7|ScZY#DT~C2aHr zOpeUJLJpEeOR~-;OoBygM-@wu34=Zfxh!0En*7ycCT};u)Nzxm9_S6}v<0DTLWOM7 z(hk>8nA`}LxMj@(`PD%}ha}W@YY4p#d~q4n0F6GGa=}kmWs!g_jAyx*iZs;KkHUx_ z^F}qwrcs((RJ4Mh_AIDGFfXKfvqT0vCU3J$%N`Ms3qcWRx)_OMleyNJq!`| z1kD6s++(GUr7mRg;wE7#5EzCTW>Wv^Fj^;+sxUAL~P z_Bm(oZ-3vnwVB`-fj~3@EvSb?Mhr1zvlhjYN7W68iBS~=MFCAyF=_#}rD0n-nxV>T z1D2s-7#fDIplHerOcaY45eq~tP+|o?@c(G>DT;z+86<6sARAIIdzi@(ryLM^(MjMVX1QCf)j9Ejim<*)c!M|TL-)DgJ!e00*a-ubigOkZF2W? z3oko0HvUa7{j>XN{q!)bImr!wk>ug8s|^39o4yqeiLW054A`)W*Z$7p{>eJYOo@VL zplKm@q-U{gFv&XyPxFa8A{KpZ4`9L0F1#J{urhU+JI&HBAK}w&v-#O~4UYbzgSqQY z6KY5Coe(Y5P<0g(P&Eb3l)<4W3c4u+Ux>!e8VRsexw{I`4f$_XQ_#I=CP=Hb01?N8 zL5!jZd`%$|F_DNdLls?9Q549g4Rl?_H01k4L4@x_C|U?H6iPJ!oRVAsR!WYwGZH#> z+CbHnnctO$8?IA^(2G!2g(wijA|{UH4}h*I*p`l|tLWKwaMKX=N?g`T!BtBnjrG~R za5yj7eM(L0KI29^T2aA`BqSCOg4PMqet7vMu#@ny_3-fXu>TD>QigYWWUh8}0)k;k zbjtzY7+Hvi>5B!gyLBd?Y$bm@%TsR^$a-n~i6pod#?k`n7Mp!fHZfb7B9(QSd^OG6 zuNib`g2X@#W~pdb4ns#p@_6mWs&-Vo-SFI720KRT{Oy_y^Ol#{b0`9IXsbYX0thiJ zmz8QOTaH9rvnc~>ilAB451Q<($6VH=K&nAV-`Nh2&!K)mBRNL}s|J@IC3jAhE-S%E zBnYb(`uu=)TPLg-ynWnfv8VHhSHsXEUM`n-{cVp2)NXp`mdLEBvVKk%|95kNOFrAf zMRzvS?`QZwzlnKwIM1p?JD-WOxWF^+1g}kx@{8j!f4L~b;t!pGa+0C{>gPXx>#%Fo zVSaCx&z#rE>dznL{41uIzhOC_+&9ASwssMmx1T7AQPr5ZvFl0?{g}`b0C?2^uNt6R zXHNjlkpF+(($IB{C={exECN?901*kINKkV^RJ9Q^jdV$fm?(--h*1=1YO&=h(@3cT zCxY0gI9!##djds~3ln6Q#Yo6SU}sItq)xKQoVhPEWe_%kJ_-berQwU1D3mD>NHV2m z$`e7qXbw!5B&4KjFuPaMT(_TucXoic8`NRhCRggrc&*1m7B?aWV~+HdaoXVIHhA=T z_|v=KGq=L8EGTS*y*8*R2&X{rf;qjgxJQL-4TcQf_d*heEmIX|Eg2Kjr!fiPc*rb+EqpTUn zI(M1{TQuI?9nl%Y&{1QdVKRO=OZ)sH%F0tHLMm#nzQW^?XAEXNw3wdbB{H=X+n({L z*ggx^S0K@_K5#WC=#&GUWI2Y4283Y8=!QzciOKIu(0Se{7u+>P_ms{4zvwekb9r;W&xenyu%^Pj|CVIu(``KRe1SLr-DZ_*vd6FR53>eY@!>Ko-VaL5 z7mv1c?6-aV?_*P3b%TJxBGI!8`SN2fQzrvjRh@lD%KTd`;E|QxDEA(u>4qxBg8}UA zrQUM@O;e=Rcnl(p3B8DV(Icpb_)bLR%b+%sGU%*~iHIU}QzdXhjD(J1>+)m((ycas z_^3HDFOQ-a)6g(RwKoCa)uNn~f z5q8D^bVL|qG#0C03yA`OZfQh*MBqj8RI^mfgf18Gm1`iQfM1nDWkZ9Vr{UH2V0a(I zry3Aa1bAmxvxsGPP>Z3fS;Aqe1qluIZ-B>g@YTEF3+v%GX*hBe{0T75gZce%_vMh) z6=0mn=?uq{E@MLH__)XQOPaX&v!~E+nUww&2ta4`7krlXwo!bwlf3J*a&C;irb5q! z1*jR2(HZ}B2mkw_7;nO*9@lAk4Zg6ag(d%Um?hVgSoCT)`wwee@CBDS7uA`3VKHju zB&=$XVX6uPcTI5a6g;#?;mF<)C^6fJx#cp2mg`61NDk)ZVPPIF>Y(drEA%-qmz!QaW*xL%zDp7Yyex64RTF*_R8QRS58U=#VXr0K92m^r#W304+Zps}$*<{I` zH)rD40_=>5?}QM?Xr_i{XastM>FD^5j_pNweni*^T+fflrVZ3a`h%j7YPAqij8_YZ zg^!)KFjG2aQpZT>M1eqUq&9&Y%9BLM>#3ST=tjh`e0}K4V2_2YN#a;898Fi`{pk^^ zreG#@?2L((($R-TY8 zo~*;fMtIPMKl>2ea~-_A9VYWIryo9Wt|U1nwE!L(Uj%)Q`20a>m)9&@SVR)^FQ7^kEp+bX&EF%jpXg)toxU7uHTxba5X5v@R{e(IgXFTIu+J4+GP%ekbH}vexLULO#Xu0~*bVm}{4JFm)>6@T0xVH;2)# zKTYqI!%#A0Ayr5*_vblgyCHM4Cg1rdi)qE;=EYf7exS^(yGFT72oC&XnrpliEGmN8 zm@`ByPolvJH+A%YAybCtoFJ{MoD8e%sJ1c{1_Wk6tcNIOfba!6I+z*q8?Hoam4$9B zV!Vn^;K}siOf8UXwi-LTHIsG#7zqtKX<#OG6cqwDLPRmTrDA6c{CY^j3GpnQniHU^ z3PQvLp&*&iXH0q%O_n@m6wpnTTz5l6(4b62zPxVGs4qk)ci=ON)=bHwI&dOFU+(aV z3bBaMbcHaI*U?Q?rbAAMoi?zu26oy&|Ltoq?l!2V3Rof3--W0IYA=YMhUsV#$Urs? zNdtxo5c(jxVBs8TJQRg+-JmRvpDM%tci_P$X<7Hlt0jXlt;1*qe(?+(*%z}Xxq!io z3UppG%B`(gYCAMiR~BUOzdj4Lv_V3FOUL2dQSc2oFdM&YGjY5Q+blE@)BUpwgbJh6 zAsRlHcH3YYJbrA7gVTaqNh75Ov}Xh-CZJx6NX~OuF`eR@W2ZQA+{01@3+*P(-_yhD zyC&#cQ6hJBo?J@6WENhV#rL1o*gK~2#b6Fg)(yis1?Zoa_j{_1W6!s6|0^+xn#meF z!Fx%YA8eRr#ql04xhkS{brB<>5RTZSMw|G`{C@0{6Z~k`7;9QO&_b0*H;?ht!-9u{ z4m$46^S?F?kblVr(b$1Fb1GU8>R1>sY5*EsROVwXT|9KU$lsO^lhAdpU)h0r$q1wb z$9F2&g^*_+8)f65&Z;{a=}#2nRs&o=LWr1_wgl-mo6w7}(*}j%8fH=_7BObZz)Bg! zKqiyK3#5WxQI(kt!Kz7k(sU!dAR-LKOj@M=0fcHLbV5TV7Le#MQ5A(4@M^O55MfN% zxF-<^R9z)>BQ#5%N`@^{86zQoVsW;9iQ@*1N&!_@(e1_p$eGw_L!NG9Pc(M&#tQ-+ z=#&g+(Ig9F^`unKBs*a4pyY8JJqBVM=&RwvrBJNEyF<|54C@!ek-e~UKWuwn_784Z z37t9Ed|X;vAKna9;b-rM^zP{7_O&SnZYh!)9Fs+CAqP8~;oWwyV|fCcI|8AK^J)`c z+u|^quXCN3r7i7p>x2Rwb-HtHB!tNe!*x70!1dw6z8tBn3uTj&QAAg0V1@z;Sw8-Y zlidEUjea197G!vJIN<*G%DnQQX}&bSn}KB^rWxW4!A}lFJaX7!%mwx5CZFCupT3K0 zn6n^PvU&e?n}6C?V9R)kMQM${+B!~)t#K+DbMS=5V?U4Z9#KeSEtYhtBy!W-d_f1l z87cCWHQn^wa{}hoSn%R({{A~toO&q3IX8~eeyziUuSP67kb*VMVE8g>-7Ywk-~f5I2o|4#U%IPV{r30&W09_J!#SJ=lEq<=Vz%Ve(lR5({)3_ z21?S}kp#dg`$V41%g>}pl}Q(?vD+rHrnHkW3=*b=8+fvSHZ>AC6R#Rz*F$_?o7wS$ z#tt6(5pfKrVW6rJ$#x4r42VQ513!}Q8+g&ot}pK+!mrCzNH^7)=aNk(iY8C8&=)gB zgQ6+KQH*Mw?Lm0ekZflX(=gB%-wC=YZ7;k=TBB)l)f5Gkin2#wEQL$vOAY2T2V{{P zJ8=0RbZ6nIw_(o^3^l`?HdwX{b{8Pn2)jDuaDr?K4iCe@yma_&Sq`7N$HCgr%I?=p zx^o8hz2kBxGZg3zpv{wQKC=e+P&FwG3x-em91#xfW|;(at~!_?b5ns^?x?dnue0IQ zBt_MsrN`iwwGIr{DDOz~`>No=oQ2*Y@Q(?^(lIjg3lOB>g=Or1z`z!QKUvny!kb5+ zzW}Bn;iS0X#SV^5rrA1LW&n#HADm|NU`WD>$XPB2Pee@l3g-?QeDw;O)$0_j*(DiF z$8+r4+RS&KEi*B!a{Y=Nz2}tiM^q;DkeeLc7UUh5S z@bey)sS9CYtJE*f%pM(wrQMRw>W0!rdt_2B%6b*z z8rTuEG{eBs7`^W#Q{U=m>!vi9eq8nlS`{TxwQ(6-2hag&1K&{9c2rU*tr zHLtPnw9ehl9bEc>VYumlTyzaN(!Wh=e3f#%HZ^|5M|ON?-uBd~T_MHp@qeLc+s7`pypM6P!Gt zu%{SsS4%^UI4EqB>`CrdV3@jkO4SemK^knQLwgUQ7;~2S%=Q^Cq1GO70qjbYz4Z@ za6<*C%SBLXhZlNjsbsiRt@CuKP>v&Ru-ZAewTAbv-JJKCJlb_9NMCz|bYM#tRze^} z?n0k6n{^INr^x=U3Ga$Ya>BzP07pk3)A2%;bxj$VUqkYQ8;uWQ=&Ul(CNXof=3(7( zl)+35hSEgeZKJt8;Dev5({Xu$V-L>Zspm|FBSF6IvBYfR=34?5-B)D2q4Luo#SFjJ zO#c`6veL-$#pg==WqtwkyG%B}ISO&Ws&yW;MHG%Fm|uyxCfCa5sK_g$c_LLIr8un9 zy68;kyf9kgyN|?td~^|QiyZ<~IBfHyz0x*7oiStq+@LRrD4r?Q4O?q8$`tIBj#CS$SA9~g7WINhQ+Eo(*72)B zgKnWTP%8ERd;d5F-Kl^TGcz4<$6h!x1<_U+(B_2_;=F873LeJCL7bFQy8cp^&#!xZfe0C>Za}q zm^VdwVUFCI~&KL;D^Q|ipauysTnW2FrIT1cYVY%G8nees}F)I7EYUf2oYTT&RIE(EI| z2Ag5YY{?B0mBuK|G$>^$nbTA`xo@&26-4JRf|0uPWfZ`Yxp3DSi5$IgP`>`QLD^e) zxegt1+7z5~R~@PbJAT^5Grtcw;gzux8uN@K>jv6be9si~KUrYk-|M`*G0EN6R^(R_ z`xt$7k|N1t6H|O;dj~8T1v@XF587a3H(PfLB0s=d89>$n)xba6#D3Lf{zVRqBzgPE zX8Kh4(AUPWuNkKajdd3_QTc~{UU@Xh`db9EZm7Xt7w^Cd`ffVH7nk(#vBNDmPK?#z z(=zuI>}ukz-zM2ua`@6m0=RuYItS!p6c$Mp5GI5ct3TAjkDl)3^us;8U-8h?n2TF< z`tGX3?FV3Xk#H!>O>Q^8@*QqJo<-{qu}zJ1lZll!2%J!IY|=WJ&Lq02;@3l5H^i$- zq$dgmaTH754iI{B(L{;Hd}YoC-42{#p4`eM63c2h1PKa*nSZUeJI#cL| zXKI4R?@q}ITt7f3&t z-@Xgmk3&6#T?gRW3t{DL3eWu}M^uXVz&xAQ1tr1_{ZyO`$xI1rRTY+x6YkMD`kLUx zgh!hWdvK}8D(5ye@%h!Qu&Tmujt1PhGKF>Z35I^v$xF|{jf;}>T~j7bdYs&uV)vE= z@uNAGd~=kQSGoN5QJsM=FJ{?I`lPcd792YN|UO>Xa+X*u;D)}9v?69v2{%>{KOE9bU=Fr3`csDfV56F zb(m8m^QF@)`gDp#Qxe6YxdzD!49n~3^QXD?%9#In)usAOmh{2_a#@SkfhPSt$V({GiZj7>7Uc=?Y6114Pp#k)1QD91qH79fBltxq`vD-+ zsp^zV=teUIcH~D5YK9E>z>%y}5eSS%2Nz^cFOoV=$s^q^JJ5j>qG-y@J!^)%M^yzQ zsn5W=@+6AUpLhb^dmdN@S6l-(t(B@8twDO5s7h_+=A&?KKisrXT3u|c!sHfsz8gMy zBV4~sYD9;N@b*bi0x7V#U>>}_PmZ%3-wSabHf1FebkRzczcZ8QSC{EpQsL+e8NRc* z$k9oMIn7Bvb7eCtzjBK9+sF6-8$sm0@b72i6nyULXeDdvWNn>Qs{^ccB}CQdeb41@ zmMReFOugAmud1=?GsCFoIeSyF`b{0b#C=9JUT`@iew)>4+`pPJyV zFBCZPLyPYmJjKBGbF6QkPYdvdljo&so}f+P^EU)=)dUPTLz_>e`^1id2zAt4Ku=1c zRtjNMgSnxc+)liS}a@SUy&H1*loS%bid@Tvi(tzjl~R86H`@bKz^#NQjN z&@cuOMbe{3m4SAKn-fHGmv&15^`b|;acUU4q(eg^ZEEcPmZcGi2&d?w8Y)IY25211 z-Md!w@arMIBk9gz7|&3*)2%i}Qb$ArO_xnJA!0PZuS*KVnSO(vkqx`Rll9FR(wvB6 z^v$nI%ZppDg4>o!5B1$c(2|7J1JZwGssM*iNq_g13*nxN<@m}sM`6oespMb396|+l z49OX;bi%AIIe5A1$s(C!pt=xGLVg;4Ux;Y?&Rf{Ca)c9`3x`ffWTgU}|mw(jNZP-9)Ye86Rwosj|V6gpN8tfKv%5>ad_j zS6|4fA%%F%qP0~JD}tLobCQvt_w(x~Z2J1zXt^iP->5A-{^J&&IbG!&`4XWj$Z8t5 zcQtd>%>m7SejLgs_2=41-Zh12cW4O>3cGAtuc&d^DvgI;j_H4~m)j_>v z5pewlDd=|zha!ww7I!?fk89qVOXmJop4IA%OvhZ5Xy$v@s_5&Fkh*LO1Q00>T6Hcw zGMC^-X`U+AscIS*Hd&l=T?c&hC=8CnyDikeGl#c_6iyLvXLE|oJr2sM5ozyy!7!iw zU#&d%&6qDgH^~>iZWBi_MnaS1vBnM?`Vn3|Ao2u?3c4+WQ-rb*Rx|~})+F^HhA0ve znsh>(vX55@@B@KqYFMT=Lufnmx3zjeHe(WckqlN{CG?{PVGTlG$l$Ms1a64qMOcQ! z@z1=krb}V6Zflb5DI`1^c`^;sEe$Jepfwt8hAkPRnyyO3O2p_!25!C>?py{>?1pVS zrIvHB3zqiCVBU99&S>&HI58=O&mX=5@?)^`Mc9~?n$3g?L#L1)Qwd3nh!tdt4Jbau zHpEHkLR{Vpm7!VKWu5WoBc_hjxFXK7&Tir7Vv<9J8kM72nu*Z5LPP@SEx`E)k>ITj z*o1bB8Eb?!9UX^EDrEFz1Vb7u3!yE9X^ng}A{)ghfdJ0}&t>-IlQegSZ2m?!Pd=LE zzUvF99~|P2a|^6H*g-I2p+p91t4C(p5X`NCn_%C=Z9MR7%)bm|Ni8mMO?wZ&->7iw zwF&0jJI?Ao9sK;iq4~i!Tvf->1xseBtp4b6Fv{p%8vd&b5Gw>7pMD2Ek>k#xF2u=Z z)UYlaf6GUKG8h(G*bM(Uk01P6<5$DOAR@e2aDQIm>c`voW;h%D&nvL7Nd0`l>v@&W zUuBZ{^mf@;j1q9HVbFQw1V40J3I45_qYd(!R|#gsB)${Qpf`%9V5KB4r|Lzhx{3%R zP!vKhYKU9pYeW#^)nx}a@CBNtkWR~ViU!M6Gz2p!kZrPNXwHe8N#H~?6pS+sF5d}p z{Rr0$u?%gdDW^9&!HTLN{6;zz$mi4sk#<2gZuAq=SZY8GAyW~aLV-9s=5q271EYQIuim(s`-f6F*rSvq_^4y zrX%%jsHEq(EU}w8`kuzZyJ7Hhho_Dv*z?Oa=H5|9vvjt+5OQR@U~Rt*iGW~hj+F1h z-d?ho=UI2T%J*J}`wn(MXB{P1BX!vcP(w+0vLh&@U~3P%o^9r@pBTZgEUIrQq^>J- z!U$1= z7&Q`-eC5Ux1xpF}_pi?<`eieZoE&1(4!BZD5ykLsP~?r#JX@ac=8`qt@PUK0tu63( z3zFEkHa3c_i(o@5&g&WSp-CL9@rDx_0qiFAr8<%(e zgNE&R5uO*~2Li_nF-#Mq!A#XHxge~Rj$4ti=NYb2B5RONB~TTOm>5IT@B>-o8x2S{ z^dj{BbKzefg9EQ4t*ZOMKLyco7%j`)JJ=6V7Z~%U`fK7vctev`cvmih4O?OO7}ON- zLJ6NL6*xH|{aLPC0Hb->SOf8voJKBsK$``7bd|pGnBOZ^#zaKfb(tnlHk0Ar40zltVY+9v$)VmvFO4&?YB%pTgVlIX*TYuGH*i@T{jh2byVS{tr3;| z3a$!CVY0dvE?HNCX^X=Gk-^X{1>`4@*se#Vrknbu%oq9a#s zgsuh@@*(ZBRJ1UZMVFyKpnw^H5;EgS8YFnASfHQIE(t zP0MSy7qM3i14;PRLcV*y!*kI(2h*Ov)kbVE8yO>(9!}Ml2CpJ#4(6^;PaocV8Lmw+SJ4&|JA|XV=i|u?BbmB z95S~I!SZQ}uXnO7@AL7&G^^&cP>x~S(TE>B4!O-4K5$3CMQc4ajViqUU^`d;)*>n>bJixoKgJ!v%%;k;QbvAzzExzAMA3;S{VLhmj(* zdXNf`^hAs6_b0gU;h88Ns7-`1}8ec=c3;>vBDOHP=QWtMS;>BtNX30g&-89(k9J)DXf%1 zecDAeRQyKYKy6IFP<4e`T^7+{BvB(FV$w;2>Xb{W)t2>uAx{HSH!w7vY%)n4gJl?q zIK~SCgotr{c`eg25JFI%s8cU^=)q}NybcyDm7Us}3wsNoH^G7dczv7PwB|HHUsf_e zYfX|LG(HL)OJG409I!xa2c->^lAIMAoPCl2cs`)=Z&|MVXpP+JGUj<>WD+{m6GZ!)+4`bMe%PWfW3yaIV;5zH(U#E2 z7%D$~vw))XbMBW$Vc|4XEa?Sk3TUgs;xU>QPQmdsv`xeQS@7^2ez48uxs#{RotT9| zhIFl&pFEZ4$t|ohbpK6M7FJNtnIg5c3Vq|UTd1fo-9mi4 zAH__fkmL$G$@dkFw}TRo=@z~b^P*QEFm!Ix+M#tE@S(d3dzu)1I>DQ#N_?(m79YFa zfb&m6I^shUt=#zci&$Scf~o5`{#hv_KxM)u-Daa2XXRWe%ckZ!*jbZc(w%8;NyepA zlAWPSXr?B`=t4rKB0Q_mO4vHheJOH1Nle|qtA!*Qimo${Ka^pfSzwAHQJZqjCzUg) zPC5|Bq}vlTrP5>)68g1t6A{O_fsf;P)IAr+laR4#>%=jXC+dtJD&f~d^yO<{`63u- z0WX60#z8p>nMI)6aBLjJIgrr738CnKD9OninI_pQZEuAG=R&+mrZ>_*546(|7i6p) zJ}9SmukL`4T@Ri8@T>`OS%>xUJ3%WX4+@llQ2K$Fxj+}CFYX-}E zY??bEU$aU7`6+UJ(=cZ9^-G$0`OT1DzUre_X0vQae3)nN&USH%4vgd?kn1P#zVCkrIk(#cO`9wFVUxsL^ifx*Ni3qnG%rw0GdWf0O zz>tAw878@8nm7ih=o7}W157Myh8Z`8Gbcjaph3iPafA(NW3t&I*OMffvC&kOFci3@ z0JEX#jT-5crmJL9CWVrVt|OT}%QEEsyS|STcm!dHrm1ME zhKOT|V^t;&m#CE_RYRY@2s)eK__UmxwDlkuMY!Wqc;RITw}Ez<{MyEfavqZadV66( zuY62OXFj<)gkt2Qqj8>6O%oM)J1b(6heoly~S zr_sSdx6bdLvAC_cl)iH+kPTow%f$8+%2AcC-WX!>5ojKP(KhIo^MQsO7omCB zT>&H==`w3aP%p#c9G5mI0ZJqPIg_@Wd8nFfhJ}%2R%Q}O;y9+Bb*bhBv5-6anIIHV zBi#wl^6>*t5Cu{~nryac?n{x(*r=+MM5?MXlWLtoc+R9_GlF+rm4$f_5k`V?)yFU; zy;-*cG+jkeq<9|ZY*P+E*Cb5qIzIKH$JoK5TtJQY*T>6{FTj!GFnk1*lW@yD(p+fc z+n~&X-V``7oH{LSt&OTp-suxNA$ zp8f%xe{0O?6As#>LNRcdJ3Ga?k5-^HqW)Hz*Yh2C?ja`)9W;+oF*t^}Lk z8X-*`{0x{8qHmPMdcjAAmhkAqHMUKRO#8+tUk_Eu@j@ro`Ca4p(78+ zI}y+Jqki!)w1v#_6s$leD#vKkzU*AoV*`x?R$%}}XNd-$~g-Bi&G zg;J?b%1V$+rV)vl*6si+<&ZyF#Vwz;D+wDgY2-_WW)w)SkD1WPb|ob;(`FNi2t|=Q zvTjI9gI^Cpks|zLlS#HCL2cT@s`&VUz_K(vUn2+wm70(1h4cbe+MqJ&5c&~jO6rq! zU7jquu2QdhI7OfOv`2N?rBd`rH2MLG0{Xk}BMnk_fwma#_%m3s9KQ44(ot*R0%

      V$uPnjhD#Nd3dHOw<&wQyuG;Z+Bh{vs0rC4y^G5JX^tCP$KcKy!| zMqh3tclQKyFNt_)GQv5QAz#dJXg@4kCRln`5u;1N8_H6ePD?NU_7YteIb4=8NQ^W? zJ_DAAy1<9dB0YV&a|BVt-~g}DO;%kL_X+L7bM*By4&eWtBCe(a%{vMXFWunO(M5$v@`xbR=vIQqF> z9(M&OnGvTZVMjklo|y-)7|i?N1SmRz9y7n& zAiC)oTrml|lhV4`*P)|E%RrS=ag1pEoH+$_Tf;5;)Qi4kU)DqN6{%}TCz7OXnQ!|Y zA)2lbI1z4D7RNKX-3CWL*3>ZEIou)pCm7{l9|AZLnl5EISvb^RTxlE%BOX!HPMOroQu}M1xENX7#{j3#1oh z5Xj*KS1p263SOHhnwI?h}I3 zfr6zg%uO~kf04_1YfTX2f53QFWbt{%Zd(WjOpOaj5Q>l;ip4Y@=MEKc~_d{D+Bfw;OS!{R6BIObYV07m(|d-5!t#*;r&*Qe6^ny zx0vv!C(u?+^RYh};ISvlFxThuV;MGyGHwuZZLXEogBo;HkrQ!R;7|r?Da6iZ-g*!o zJY3)#tGc1144b-n5%~9On@QZX6E<~I{BZ|g++9PYLT(6KxaHa=;(HsGD6!P}`gIi} zq2X2(YEv$D)*xx9)Jq<=>0syvnM6`@=~aztlY?ImrIW-NTa-qSCvqls)|`P^MJObc zswh&VLOheMoPkw+C&aA=Bytw%_5}5UN2U@`tp_A+9bHoZ3&#y{+z8jJqbQInx|j_Z z^bGN?QuEPu6-`sIO%2o5(Dbtey*Q51>V?FWh${s5bog*KqP>SaLmFcQp*=V2c9U zQ7Lw5vn5=bugEDKk&x!33p*ig!o~w|XjnGN77xPR=gB#+8%JU6I1Kkg-+Y)Y;8Yuw zHms(zUBf%6vvYgMf$@l`LP#m+;g?i0Nf^XpYEMYVv<9;sAf~)c<78Z=zt;p$!<|%d z$827GA;CdW;L~@+D05)PFR~mu=5zk}0XM9uqB|z#x3cWqo2Eq%=v`XCNCzmU1BwfN z7x`m4p&L<;1VbX=WwlO7z~R7Qpeey$-)7PE`F)U?lG_*>ORw(W?(fZ_@^F^G3%GY_ z8+5unxS`B^RMvc|#FF(xP&1*LfH$# z>q$xS+)xD}Vr*N-wsn%OPTdV>pwddCc-J%qDn99?fuhJAKVj=L8e$R4!uQff!c{Q$` z-Nl>RV^;lCq4T1MWI4;$$6dTAqWiKu!~!uUh#i&ROqR$Ex?~oHlqU?fo{m|ySm)eZ z#!y;pFkHHtr#SijL0;Kt@R83tn3;l1Bf=JVdVqJH)oAf7^o+uY8}Os>Bw7rnYVr@= zeRN%a7&0S(0bv4k4_Z#M_}VNtz0${%wITxxBi?yErs65w{1un3tLo&R=t6(8m;I+K zEYl;oP9e@sP&F-V6d(mc#g8M$9No~#w~iH9T+7gw zE%1*wb+PCZ(!l5keH^`bM%$kOZf$>5Xyb*q4l4E3@`RRZ?lQWDBc>jWGjbz;@FEOw-2G zL*wZ)%nX=;GtD18eK<7qKw}SmI6XGQVSolq&v6573yZu*7-7&M-yNeL8}jw1)!P2u3FAFt}_(%GT$6 zvMgr0DD!=9lbCpG2MQt82OSn(kom$HA2rL6tdv1p#_?hAK8SlM+9wuZvWIf_D#z*p ze|;@u`&0K}?du~Cia1vqod2-OXLfx4*t!dQF5|<^HJ(m;^uh=?OnG#V3VZtEpXyuS zn2?X5;KNkF8w{1-4MLXVl#lf?e({Y}roMNL&PQkX*Z;T4+D4Zt+hBl4?=LexBp;*x z4_YwOg2*N~r;vug-T^#%1~5mgWEl`5-I#)>4)MAFq7ov}(5Q;SWY-g|xs@VR^FpU--GMWk@Iy7x2N0)FFyIqc;KDL^8<2kl z8q)&)5Pkvva|fdDfuH?R_~1=AbrTLY;b2XtGqJ`xETCly-k`^B@_k#AJil(zRy~HHij<{Hq7(Z= zv}y(qw(*J)Rws|LqERN}-~Woqo0S^dPQ=G0kI)PGr&O6fHUP)q=Vm5xrft>(m49)1 zg=WvAG0316iITVKktq%d3F?-P+mq=>D#1WuGq=OOHvl&@ntxWH*_8R!@2OFFaD&=b ziC_C8#$9eQ3uW(KfWhLanZKQPNX&zbzS?6DlW=&H<*&D98f z0enlMRP@%q2>KvNw;16D?NR?h-9(Zk22F2-!_jbdg7FH!Yi=h%H5GJQkXsp1ilQsX zs&v~V@cbBE7qPi13j!<6R?%}Bx}_4uF`BB9&sjne4hWoE4La$F@!`%Ct~6fpB{{p* zct5HthfzWlrKnF|sS?XwOeH2?6%zHAufZFSNR%cr{77K3>eFBygXAncCGb-`dbbFX zK7AgZ`T}HMg3A5yz{3&~lM=3!u~^DjYQlf|ZFtwu!4LjJi%)*gM)OY zxA6LH{@H(9Mt^h%t{#P7Qu$pX4o(|9d?X`H?_YF*<)&kZn&CdEX@S(k{i5LZt5#MY1pzF4P{>oPUbA=P3cEg)&$^D!|gKv z@SjW(ob)MaGh{=b@Y*!S_g>@u)q8pWf2hD^gYCysHfP)PI^k_036g}Of+WczMoz?} zkQ9l~ONckz5h<<6!v{_@2E+kGaYB-0D2jyUDn#Bcb-9XaDkANv$m1+bIO;XXvQY-g z5WNGt%y62bqRIl7R4U}i*(Sq*N9e@_j<|L*l8YT}0WZEo8nskP$*qaKOVAZY3DO__ z?jK~4m*5Anps`B?X{oBn7`lQznvF(Y#jv$85>K~P!4{yaD6&A@1%5dGFyc@k{E{do z3DYrQ>F&GR?eF~6U;i!2#S$}9v-F33!Z08R0*)L!iukcNYXATs07*naRIV9Vrj4S= z1Yv;hd#I{Tx8LE);w6$)R2NHyvRD~HA5GDa6$L-=38R35T|`zSN`*2LwF%an8>7bV zgss*lZ@>3P+3+sX>9y$%`wRwsOw*)NssS)FInCKiXNlv8D2|XNnR2Njt{(;@X-Y9) z6swLbqiZ^Iv-3F4fWfd&7{!=|$-0RTQ=buJa6h8a8J-imn9(dq2{k?SR)ayFF3L7cBBQ8*&+rAK-QZB$DyrL&*fpRg5Q^siiDK zkz}GMW~bAlR4ike7S3?U(()3uY8^w@(KQ22)$oIWjnx}0%q?*A&~bM6HP3UAB$=FT z(`vT}!T`uHb(2D&fbV;xX@a7t9NK#jNm4j_@p;j}ExAlhPSfoRZ7)UD#01F_WJzIb zdz0zOX|7$rimvHoS%&9(L{W&UsK|20&>5hqI)y?W(=gfD*~YeWxSofiD7fAbRhBut z{|Hx>t{_PYkg~RMlSBIsao>sixp?&gs;ZIC=aE&h;`xD(>pDb9#GaXXTz5#$s37GM zHodDTih`zStgf%n>2?4xbc2kH!ElJ7YG8MgL@CL({0h|wNYgm z)37+Y{~l~6P!)ykaFHa5AcLVhM3Q7wRWN)hii+#|xSoTis>E@CGnzD*4(ppuiiIN8 za+M2LE{O6{oRE;5v3U$W*~3c6f8^hk;)SBwkP7WWS56t6h)FaC5$5WFC3&)EaSQkmT9qn z;Q+n!r%BU?B1==|X6Ff_fQfp8t?f-5cZg|PwA$OGX^L&y zM2Lge^yCbZEV0wxL6Ri)&hKZt)g%aoGij=ZEXg>Y!_XNL_j^n=#0f6TGJ+^%qSj#X z##JOF9N%T=IheZ1z!~DY4u0sbwq1j=*DFGGYWQ&oMA#m&|1e~Lf8pM z5Lw~;QJfNn0fuf;E|jr#lavfy(>btkh)Y+`lV&M}d=cBS(RH1J`wkJeb6jeEi71J9 z=F3lW{K(ySu7_s1l+t-zHkq|gu+l$6x7S6}G;(%rB)p z@V7J?+Ci@NpCgW9RyS5D7Q{IuPU72|NK{!RPGjOE=F0UeOioPF>vu6t8^;*}uk8%* zt!~n9{hJSEswxh=iXvl`MfqB==Z?}*x>zORM4a^FAR%x>bA;OoXsr!tcLQ`yW};y; zb617RbU|=MrYYT>A^j~6XUE4ML_|?a7>hjYAO6QbL{U^G>JuDXIE1e2T)1+c6G!hx z*L1F3zlvpA)T(u4Stje22+U2AEaU3pWn@K0S2gx69KdxQ9M7Sl9iuT(W5d0~>2s%u zqXiiy3|+9FL- zG+m=qEK|r8C>2XshJ|TbXqtvB%bdG>4he~Vzl#_6q-jF2P-13kj@hXhBuT>aJ+_*g zRLT{WmX|OM1KY~cclyLpOsCf&ioy{B^488*bq#QoU8G=*Y;op_O}*RLQ;3bF*1 zQk5_caU2IlRq$MQ#Ko`R2Oh5H;0Hdssw2rVp6~LLlMcDV)}5a54KU}5D6+ktjNdRYjIY%?Vk8uBt>yBHGPNm8hU$7IjoprLg0(e7#2;B=j~t zjDk+7G$JCkZXpd7O(u+zF^xrW^kwxt-F}yPZ306#Ns^f9 z$r+YcmjRL1Gz}9&H}M0XQlUgCUnF;Uoul7#>~(R#OI!qaUB_2#Q^l}VjDk+CqEl$t z7^;S*s$;-Xk_ryTC{Bo7>0^0 zCB%u0rfOJ*Ns^^Jed;MDC#IR1oF!-5L_UNrL{5&(67beevPu$1Ow<}|w_D83>|vw1 zj)Y9R*AZEzIO3^GpCrpNHk%tnNhF*nj>HP=xm>z-0Yy?QP~~7g)KujBQ#p zceXgV_YiTCVwyIZs?zSZIk0em#>6CR8*3zSOt;rzVb5MvRb#NOP~MX<7!Igbt9ZVL zshilQO~u?p+h4^Gd^*hy9M7SUD^Sdr&{Pf6FiDaW)37KP%e-*u42Eui1pVQFlgI8w zmL+=qF55fXc)mxg^DM2M7K);9W*g;KuE@xys8T)jXsUm!^m zq9meRERO(i8O{}t_K_WargwTR+`{-%pR zh!~Do10-2g<^Jd+e@3NLq1W#+^oH1Gj)l1eCMTwd;)tNFlW%0>IzT>G{~cM7zJ!?H!)3WWtDVbBWqxm64Erq^F3V8WxcshmL^ED z!u==iCy8NseTl)KPp{ua)im0j9WpX1gX|^^fm#UNs zWtNt&jla{s{A7g>y!|Qm{on$>^T*3{rMCdki9~}*uh+ZHdAi*m|HqGC#DCwDugdv8 z^WXm2Fes1S~LOONow()=H&HvS_y6!8rk3IRx+s0Szih*V-lxK6;hKVXG zBxy>V#spD>*AGdPbj;JTi|3XV!4$UJ(IYDoR#_j>Ux?QvVL}*0NXjn6HbT*5k}$=t znxsj}RAWjUf=gw#wzrTKS!5@+H(A|S#nepZtp(yVAqoT9y$(?ra(#749+UD?qBb+(^JYgJi z>DooAg23-9z5_?p1Sl&(lq7b>NC9Mo_Asx2022SJKN~0O1sx# z(C>|E7(TXX;RQbRT7$fmN0KDI@Z9IwKYx&g$p!o%B8npXz{3xG3{7XJ-2z$S*)KoM zy(jKxZhDT(&Ls@p;Mn22SX^G>#_Dy7xgt>)f;1ESFR z^kSEX50rU&u}glV$vqD=NUSoSfA$L10PcC9!Dr7k`R)_9?h~ubpLgE;6|b*aWrKXp zz_x|+hjBz0N4SFkzaOEf64IzOE=z8yg~vgP6sH2fG};X`O9e@=dW|8kNk;6B%I%}< zgfh}=QVpGjxxH++n#iik{Oml}dib1fxwa(r>dzoxZVcU6zoKc`u3ou{ z?|bZYTTC^k8Mp(sTTQ~iM^$7F*6+u4KgCvagH~r7P0{du4_Q_4JdZd@aNGg9DiqVd z_}mvbu(0Xl~NhQFnHno^UTf8 zqsA5X%+9m4vUrC>yqwbmocg^rrXT(&cYW9Yj&6y^La)WYc=%mkaT5F^`_9Kc^A%n3 zPJ5&LH%uQWqj+5ae&}SGt)aO881TZWCigtR*x_F|)#SVHm;~@6=Hq?X}puDo-+}yG-UGvC7mZ zg!5148Bc=Ybb}X8HA$>82M_P%_?r&{VnV!ds>!2oILr&Dnmn~GuJ>}L>XwSB=|oAw z&UPPX#~-QvDd;0!b&?SSSdfgtO#tzT|7G`ptJ@=$kP+8pmI0Db6P{ z1h~FWtJ7j;YL0TT0!VB&H@LBSorSr*L~%sU%3&H7`xg#z_Tm{-IYHG_EYrp`Ep$z1 z;Pgqe1WA%H3^7I&CtO>)!t~Uv(4);V4lEpGyWQf*fupQ#tP&^d6mvy9-=pvJN1@rY zaDrY3$8)eOiy#QNxpk9Dxx#jMm6^s703JL34xYU531nI3>8qbcRWu&h{}zncA!pfK zy?&XE<~qfEk$QCkLpNAiTgKNdeBURZFQ6z2_38w!?_rzPs4ywh?zE9*8Q=F&RTV{1 zIJf>J4;_3v09AE?&CWW$+-9q}P83HBhC}jpo?XP5BFSV)MloL`%`yhgfFw!qJogTV zxO(aI_~+k$zr)=>o*VxjdM&!6pUdSE-EQye5(3S%A7^q;nfHC>5&-}F{`;BC>umHw zCi6P~@-tro;FsU>MxF-FKY4}YZ$5lmh{SXQ#p^PhZt%zqJhj;6M`j-9V=pQEsX4<$ zLL!L5ah~3;7!>NJQ0p5+#9@j*TET^o@huWlSr(5Qaf+&mP-&OTT~?&A&~oUB``up6 z+(>q_Uahmevqcm|+*rBJ@gv8nRqFHx;*jeHA`A+nh$M|EN;4cj5OCqjS&==7g-&e{ z`sk{`(L={Ld-*IN)Jh;jk_BEykz@>AA7@OWI27U!LCD(RCY4f!Lasn_dkaaCk!6J_ ziO_W&35jy4ESe}(l^_af28&3Mg=WE#gGX6hzJ{WxD5}D_n_nbn=P8%U?48>uV7sa; zvO}hcEX%BWXE6+ea;Z$UT&2_NP_NVk9HQPJNn-9jem~DV|0SX*LRC~$MMY6n&ffey zhGuZr%o~}i%&_hZ7z~FD1_NYCqSx9ucbAlbDK{!>8* zUn$$X_XD{*o)5hiIpYdH{i!Ezd;GPo_`CKa=Ht{)mU-XDzr=@s@QplwGi2XGi}Zkf zv(Q6Kh$|8sM9pTAmK2NPuXaD>@WLf5L?I9e`rN<4jEM;|lg?o;lq*N?% z_`qR-L6 zuq7HC%z`GU@kY(bX_N|PXGuaE(M?+=14$M3L;#Sz7PVe~&{ zL}7%k3+Q&Y*TJ@J8ubYP^wIx1RBzIAI^u7OC1h10O%sOhke!ZbP*oI#o5M@=`+W+z zg22`zU=;&rFj8O<96p}!lCyGXng*l7*~?j_Qf6mqZTxekQs&Y#r#bk*2`)Wzns>hG z5gwX9$`c>^|HglFVBbCt?AyoU_3JNtTU%LSZDr+U$9t)54dM7Ne~zDdN1mT~M;`nB zzYw2Ca~b>ozZgFrz3;Dh{-#K<>^lF89sQA+Ti48QG+%ZsIY~v1emGL+Gx8c_LIQJ_ zgcNR3PMbxYTvagpS|y!a&A_f2m_;33)5cx?X`BlD&q%Bw%LI%%KVg!un@Ey8t~C3h zkLSA-a(N8Rz_zRrW?zIbr9zp*3nwt58dsOD;CLS8Qkh1*!9-;O$8~UB2U(R_ySYLX zg@j><;|$2>3zSP0_AMO1(2X(uM>e{)VHl{Y%w30$i~m!SNYj)k7TRD7vkS~l?-7k6 zvPzPsD2jrjh(ci@U%>M{(lq75>NCiifOt$crbNnBg01aMme+2eDk}9#jV#LqOj*$w zI0GEtC1>RU2*Qx{&2@q(AP57R{x!ldA`Bw|VUQG}C?bkNy8SMSqOjd=;;1*-YHb1# z$AaoSLlnC#(;`Y@Y&%bs#3Wh9`o>Kh&$$CnU#W=0`N0QH-1hjJzVEHK-QV}f!+iOv zr}^GTAG^)bUuxxIk#e!fyWjn8-u>=(-}anz>eS2P`8Rsu9ghv0%j6piFXO_(!glkH zRsMxjx19dvb^z(rDO4{M85K>F$yG&M9(uPJe|KBSc3aNOq7XpVED^q#1s$uXi;zba zyTz_hLhOrs2?^a+$u~@LMRN?(m1UVQ3Ml4_6mkVFU%Nz{h?RJE_XvW3yp=-@isVfw zD`ny&A&w*BB&9bLtC*-&B*aO=`ql=8e4Z$dX?1oua_}fo7+{)~sBw&ndr=(GO_!;& zkE~bXE%*E|%e`|vf9^DzCRhc!{Vuw$GgY5rX?YRTwAeSlU*PoP5I+b;dG-iZRXKCv zc}^TXf#-WDs>0Ip5`}z$EE5?eNtUoj3~K;$Q*)F{W%d;Bq8)d+;XY5ArL3>7p&L3$ znsR07GI1QCDi)4A#1BLQ@MXdOHsN zO_yMFSl#Ul-KC8X@wiw?G;5^IH0lZ?6OPy0bV$y5Hj1oZnihjm7nbKc42DCJI3{P=Y;SK-DOZ`OPGDR12*_5%bv-=aqnoags6KuW z;RinDaurq8N8yqHrRlm(y;eulbc*=`hYuVC84mk|ameQO<|tL` zFdPoY(2rJU2Tjuj5;PNMCq+`Y@5BS#HTj5W^pPZ%Rud!a*x2~0&bn)l z%)k-rU9jgd;$Qn9!G*WeTiHf2T@v4>q<07|yq);hJ_vgr$sl7-1Iz)%U7vaYHYVcvNXXmEs!OmFyz#Yzv9Hvd+7B=4!d5i zGjIo3riH3#xW4F|isDeL@L@!;SVq@13WXxB>mtb#uIHeuI#C!C#sTNAoWnFt=BDQG z+#LZnlVm1pbsWdRl5M)ZE;+k^qNvDHgzI@ol1!~q10?*w#dTdYRYTVdWJP9U>n4R< zp24tBd6e^y;*g>5p(h5atTJ%=Sf)jyC2Y7?DQ0s7LBPW70+*LABdek?si~tgmZA`b zA*Nvo>Jr03Q3cD{(yCz1i+5owNlc|wA??Z>+w%r4ub)OwB7t9;+ly&h+}vCPZqMbX zFXHo&(~MM+g=ojf&OP}#Cg*0EoSVIE68!03{26#VJokZr!l9~IDDOTfg7E)bUgyGx z-^=vB`qWo-R2UtC-!a5HlgBzaWC;AhN3XKHc@=<#Dfp$IeE?40ddlvR109vySrA^3t6UBN8qm?e!pGmX(0 zDt;J>jEgg%vpN)=OS-}3rAv?szLt|G?&I907l@*WB#sG?FeHQXm(QUpD#d(}smU2? zaY(PtZ7j_WxjaYCmn z4x)x(;CSLQNk*JGNg8u?=@JYQ#x| zqR3=vimvOFiY5Ak9+qihSvEl!k|r@*ttPsr6U7mQLXn{}pj4C5fRm+rdG7hA(KUm1 zr%kO|BM9$|wXK26uu>r388ECAum>)Yp(7_LolcjDJ=1Kh-g5kLI@H@?{nXo#9s;h- ziO;XK4!X%*zj2NWzi{Fe?E+!D$@5?OF97UI7g0FQ|NQ<(#?R-|fT3)Vq#xqcGYVC2 z?^kv57e5}ho50L%&yOd-i!JgJjDpDNCnNo(I7oz$fh$xztg?YN>fVq2ge19jX0R&; z`MOELvaxgn%P`5Zbc7<6=r{wGp53Ig;o=7#y?zf})zOQ(IQX@;$l0P}D~=8Z^R3;~;xUzT|UDxULd&r9D%dO=#Apigs8c9S!RDCh!hv#{s$5~Y<OFmcN^3rAMl^VY9 z(+kgV_v}4vG&k5Yvxh57m&oVyFv2#~$~A&8z%p%i+AaJrK$hfj15G|xV5%|A*7hb( zpZ+3gmQkzLxclfm+;jY1E?hm2B*}Dp9aKfTo?Bv+>d?*uYc)#ID3QY-Fxvb zAH(E4rM(Aldp=n@kAL|X)w^#^;M<-2_ONI7v6nNox#ME!qM-r_{9cG=s*q*3R6a(m zVUa5+C^SPsvlNViCbU{dyfOfVvS@B7hMK+u3KzV)t@f z7fsWNVv%J6i8x766_rMMXA<3o_X- zMAtPD$15svnsEBuDH^o~NgQ*}v6G}}%FV5H3|%J(LsU&ChlE^}Sle8qQYs@!GO{F# z$vfx~L;-Ok;2q&cz*K#TdToMx@4AmO7tfGp8SUQA9S-qg=LaZnw1`aujgU&EOb7V$ zpZYQ0^}Bz1$KUR*@E`x33LpD$nQN@E^uD{9`sv^2=Fd*QqC;?f>TX(_XQ?8xLDQFy z;a`5~tB#E`MJp|r<&B61Zg=vRbNXkmdQiCiG1c{B(lo=+m0O6c{W9j11RcisyEf;hqpeS#?B#nVFoSUafO;^Cpht;08WX6wv8)P!$zPl4-SfNaKXL*?IoK8z1BJndfNK z8ia8~nu}-qbaiz-M`F%87 zO~^9REX6WyuHCqbX_(_oT1v`Bb3;^}ixm#cAK=v4=LE*-CARDQFTLO03BH=Wco+Ej ze>=fPKJpQ!-!aX`#>Oko0A0$zfumD!?TRSTT^l{Vyb-Z5eQU>h>B0AJI|wgKYkdEs z4{`SS+b6yBuYT#bGDBA|4VCHn!iWMTqR_A~3L06G;j{z%ekf?>l932nL8m;M!^nw@ zkYyVvicHS1P-Gb=@Ws9F5qP3?va{xJ_W34`CmL!@L*WZw{3Na~K3LN*Nz;^4QFKd{ ziX|LpNONb4{-6(xDDiZiiE4vhzsp2@l7m&jol}^Jc=pRrBgrCkF$|MKdkE`$~g?f#PdC-8dIE@eT0Fuj_10x`)#_tE^!>=ctaf5#TZTOIEk@Li@BM3 zqBvr1dXDSMOAMSok|a|umFaXlqK+|Yf)7HG?j_5(`>vBTTTL4E2CFw$m~2e3cw>=b zp@6BIZ0&5J$||xf6D2VR<_{2t0Z}3<^3B#3Vc?HAgQPKHwLk2Ur5T-GhgN5sFboCs z!Z2w}Ofp%Uq%kpx=ecY)H(6X+>NwZWOc+&(`6|{318Qp#tRaPkEiu4ElaVV3fDg9v|S&>Q77<)2c zur3as^K*N-aOIr9??@6$t4rK-^dvzT;Q1b^Yhq7^tZg)fW5yvflXDdEMb?HFnadv| zi-y!I3Y*)TBvDKd1cD|e%gE9MRnf@X1&W0tTics#HaF;vs;Z@8k(`yMRH)G0*<$VH zDoGlnX*!ywBTEuj7B6#f-ys~=r9bS`+-XuNS4iT7Lbb?LV}`h$W2t)@UDH`!y8$p_ zJJ!kDIU?QQ!sYWEK6r#EiV35D-k?Wwdka7CDHcljfncfd1D}cN1f5=oPOroCtK31eWu<`fa?D0G(}*t(J%5iS4P7*U8(vDLp}5Jz1ZkKkQS?73mJTqXVm$j1m&6 zs!=g5Hn%rOk_6K*(KH>)v_@ZSgWjM^Y{dj&5m}PhH@_cE)7ab=mC+Y2onim{ev%}{ zm6j=~^SIuSee?U+Xl}66*`|=op=$;k?o|{`!qhE}A3nk9v(I6hHenp0YdVEOkths> znn@5abR1UK1uMhs)Ev5I;Ce$$!yq03_@X#sa$;KW;*V}O)~<8(z+F7^p8w^*_zN=)kI^-J*Q&iH0+X2IE;jfc$NtozbK*85v$B_#M2&))Ve#pU_4N%pktXTwy6qS5n=*p zs)C^#+<*52q^^a&AI@GAaNI0Qkt9(s@B^Qj$yprN!PJd$XizSe*xqT1?LG*oRqM=5 z&XBkBq=2bgEU$~E@THX{CaQJ9DCF$L7s%%eOjH|eZ8veeA=j6exa-K>xZV&&Rfz{S zrQ9?}4;?2Ae6C)d^Mo|?cppeUxk#b=EAhvCDW92&Ces>hgmDp}KnVZ@} zI-jbgN-1Hoa%hyPg6vrD9B{90HF$|q? z-|*7vb;zJvu8g=j6J$xoG;NY3B281`I3WxJ5oRVSy+IF6)A;@7dtZ|iz24M@uXTKR zS7>-ws4PuKxF1Ww?S>4tJOU@et{T+$7cp|`s7{cfsWP^yjs?e(Bps7s74kZbn#KG~ zfytUpy=q|^3YH=r(93+;{vwvNR=*V!|-M^*tK(NoJ;IIeFJf zBv~c{>Xka_h^BCJYhz3#6~_s>VG5?XLV zpMUzZWEoUTRSJ`k%USroM-YZgPtLH@*svPo!;pRR2T?Q;&xdhHn1~irNfz`diXyUPH&&K-;llG&N);;dUK+*${B0Xe z6)XD9&6{-lJs@MJ+s5}@q9{Ze#iNQWv)yW9>N=)jqU$(ENRwp5)svzs z8mC`)7DZJtbYs+u>vQSqh4K3sNb8geB?eBPFp4PViYSso9L3}K+T0}(NHofOvJtmW z#Bk_{MM6==hkIET2vHD3SGHwi>K17-LYg9R;mWzO$eUJ(@O%f)_wamID7j=1ClRji z3g|_~h|^TSK~zO0$ue|RC(F_i6JLg^D9DnGED7aAP1P}t*N2bio5|D+MsV3%8n3sI zm>?w*!<}3Fk#^OeDTy5 zs8=S4;*hDySyV+MN+OV;)oC+R*@tGQ96NNJ?VTn;7_x8AUKB|pN+L|t;>^Y8x$Dqf z#Bodz_*`DROn=yCc505z?G556qFkz=sv5>a zfbDjR=?Rfbzp-|mBoefZS(*_f0fXoQ&pf$Itx_jv=a7*_tezU9#+(reaT24CCc$_T znHKqcfsBkWih1(FCs-)mi#-|Q4?=RbAl(H4r(hSO#V(1jOcX`*`#r%_k!F~=9Fjj$ zXCV_jsN!1yKvNYIMS!cBPzUb=?pp3Ce2dz&MmOIzDmx{v1fXot=1NjB(brzPNh<1 zFdSl=7CW6CCaMz@3MHoNldNxVk|wF>Uh{5Egk5oI(=d<~g)~WsM=L1 z#Ib;m*rq-1S&(I+n;XY5X)G%A86w}WDjJd|k+bqdpRgMhD5kxzl-w&sNW3y@PAi(xx?o-(<=APwEBN5+uwB(yqZa) zzW>vY@ByCU7k=VVe&>&u>3^w#^F!~Ud*XgRefS4>zWNc4AHSRP=S73U{QNwHLJ95j zCwRxFf0f*)|6kHhh^A!t55AELKm5z2-v!fuwT?o-O=Tb1G#JAGZD8=|U*63x{KTVU ze)c%O(^n`t8M+Be$*@k(rW7kH&k{c6t*ccei*CE>#SPjc??E%CJT=g%@fKhMg_ z3M(rs;^*o|c>L`@&f)j0BKP6o7e0gifBgy%4F5-N^nabn#V3)kJwf-a|Bm4s6avj4 zm<9gw)x6EWo4s`Pd^KPG6Hh!LePFj z0Wd%4u`;5xd+8*g4N^BEeTT-CAASp0?t2e#1^5^o+P&h(U~}~2D*P{$U(Ne`#rASe z`)XIfS2GE|7OU<5-`?4UwpE64{FkL|x{Pe2x;ZzJ&TXt8X)xN_DGC)-aI-fKW{hIT z27;Hu99{_%3SLxiyr>_8Qg>m|6}@mw5S5jwY@=dfD{jRZmO4deBW>5D>5?5Ul5=`a zPEK=jKGG~Ze+W5Wd7t-9{{Q!R&U@bHjUB=>TQ99TRpR+W&yz<4gmLY2CZHMy%_ar< zjvuD}Y=;!~016SvA#8EOcQ7^LXQF9j#aANyqnWyvgdM~&^23^`hn-%>XxVx`XIH(Y zp54`@eUUJ3*uF{tu27H@uMRQMGy<^P+vm5X5J+6;bZLpH|8nFH1On2v;n6|<5M&ak9081-USbruTy!g!AKa^e^94CUHa31F$QN!peZUKD|d z#9S`TaB%b=`bQrHz%v=4?w-fV%;aMIbnr6(PJeSw;UP+)R>*%R4nI~kL=lMF7GO=` ze11=QmguLi6HY`W(#PX*srL>iqJ$GshTm$WyKRot;&MunYpq{J{v*8}e){++I$F2V zyiNI+JH-;3YlZyPW@9z&Sq6*39ywGVV8hQ}l5E*W@5CNXg`>+S&O#V?l7j>1*^v2t8pmOfdvqI{(>7|qfn0mO+aOxRa>fEzEoO=5F1n|(g~9~|ZW-?nqTvyWdxePnwN(%1~d{aigA zVduVFm?ILq&;xiTBT^`&m;71{(Mw7v=B`1k)Z3f%1S$`3ZG8)~4IcjTw~-8YQU866 zEhh%pb^U8d!D9Z;;zAdC@E#jf5L@m6M0h46c#jR@KG}o&WRIarR&p%b%Cy5;5Mw!Q zu%*2v9)Ov(uM)tfn=!oeY3h<`GOc@9e7K#N1D_Ck;#t@Ru4$#ykdxZ&RnI0hN_sPJ zLKthIhgf#c3DP{74~2}{R|#Opz-zRBJBWYk2O9qVgSv&A;QpPZC2+;yfeYs~3oG;h zc9OqTgRK^UXs;G}bt4!X8*>$FyVh|lAfM#6l6~=7BQ{j`07Cl?)};T%oxZ{1_I7S< zyq9caJ!}*ZHo;7)g@^vU#4oKK?7DoEi``><_{J9ic-A$LUdXKy{r}FCT!JcJF^psgjWaZSQ(ji;53))OJ zSlJ0N;>K#P4{sD=k8j)XTNOfHzgoNBF+07vToJeq?tM&nFuQu|vmbi%ovJ3A7OeCD zdde$RW-Sa8mz&RPMHw!k^CMG=GrK-3B5;;QbWoGf8v;2i!#TLC;RwLNU5)<%&L@xe39qAE00000NkvXXu0mjf92HTb From b731362aec6796a99562d47d9843505981d81356 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Jan 2024 14:37:01 +1100 Subject: [PATCH 043/339] bookmark - 15 1 24 --- .../components/xenoartifact.dm | 6 ++++-- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 92665 -> 79436 bytes 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 2587cdec8ec8f..a5796346907cf 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -74,6 +74,7 @@ ///What the old appearance of the parent was, for resetting their appearance var/mutable_appearance/old_appearance + var/old_name ///Do we edit the parent's texture? var/do_texture = TRUE ///Do we edit the parent's silhouette? @@ -94,6 +95,7 @@ //Build appearance from material old_appearance = A.appearance + old_name = A.name do_texture = _do_appearance do_mask = _do_mask build_material_appearance() @@ -141,6 +143,7 @@ A.remove_filter("outline_2") //TODO: make sure this doesn't cause issues - Racc A.appearance = old_appearance + A.name = old_name old_appearance = null //Delete and/or 'pearl' our traits for(var/i in artifact_traits) @@ -323,13 +326,12 @@ A.remove_filter("outline_2") //Apply new stuff if(do_mask) - var/old_name = A.name //Appearance stuff tends to fuck with names //Build the silhouette of the artifact var/mutable_appearance/MA = artifact_type.get_mask() MA.plane = A.plane //This is important lol A.appearance = MA //Reset name - A.name = old_name + A.name = "[artifact_type.name] [old_name]" if(do_texture) //Overlay the material texture var/icon/I = artifact_type.get_texture() diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 124774627c427933033a9f31d50ec0a1e38ecdab..7a180e462a3a2e500d921523a9006d55a776ce8f 100644 GIT binary patch literal 79436 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
      +
      {`${value["dialogue"]}`}
      + + {stock.map((stock_item) => ( +
      {`${stock_item}`}
      + ))} +
      + + ); +}; From b4938b2e4794df3d5e57965c33aa0248d26dd7cf Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Jan 2024 19:17:04 +1100 Subject: [PATCH 045/339] Console UI initial - 15 1 24 --- _maps/map_files/MetaStation/MetaStation.dmm | 75 ++++++++++++------ .../tools/console/xenoarchaeology_console.dm | 9 ++- .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1705 -> 1697 bytes .../tgui/interfaces/XenoartifactConsole.js | 8 +- 4 files changed, 65 insertions(+), 27 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 4594f9f7a189a..03293898e6c20 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -24922,6 +24922,9 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, /turf/open/floor/plasteel/white, /area/science/explab) "cLt" = ( @@ -28177,6 +28180,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ dir = 1 }, +/obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/plasteel/white, /area/science/explab) "dkv" = ( @@ -28587,12 +28591,14 @@ /area/maintenance/starboard/fore) "dqv" = ( /obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/line, /obj/item/clothing/gloves/artifact_pinchers, /obj/item/clothing/gloves/artifact_pinchers{ pixel_y = 5 }, -/turf/open/floor/plasteel/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/science/explab) "dqD" = ( /obj/effect/turf_decal/tile/red/half/contrasted{ @@ -31022,10 +31028,8 @@ /turf/open/floor/plating, /area/maintenance/fore) "epB" = ( -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 8 - }, /obj/structure/chair/office/light, +/obj/effect/turf_decal/trimline/purple/filled/line, /turf/open/floor/plasteel/white, /area/science/explab) "epS" = ( @@ -36903,6 +36907,9 @@ pixel_y = -1 }, /obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/science/explab) "gNf" = ( @@ -38400,6 +38407,9 @@ dir = 8; pixel_x = 24 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/white, /area/science/explab) "hsy" = ( @@ -43054,14 +43064,14 @@ /area/hallway/secondary/command) "jin" = ( /obj/structure/table, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, /obj/item/xenoarchaeology_labeler, /obj/item/xenoarchaeology_labeler{ pixel_y = 6 }, -/turf/open/floor/plasteel/white, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, /area/science/explab) "jiw" = ( /obj/structure/table/wood, @@ -43462,6 +43472,14 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, +/obj/structure/closet/crate/science, +/obj/effect/turf_decal/bot, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/science/explab) "jtl" = ( @@ -45125,6 +45143,8 @@ /obj/item/radio/intercom{ pixel_y = 21 }, +/obj/machinery/xenoarchaeology_machine/scale, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/science/explab) "kfx" = ( @@ -52856,6 +52876,9 @@ /obj/structure/extinguisher_cabinet{ pixel_x = 27 }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/science/explab) "ngT" = ( @@ -58424,6 +58447,14 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/aisat) +"puW" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/science/explab) "pvm" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -63173,12 +63204,12 @@ /turf/open/floor/plating, /area/maintenance/fore) "rsl" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, /obj/item/radio/intercom{ pixel_x = 29 }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, /turf/open/floor/plasteel/white, /area/science/explab) "rsn" = ( @@ -63416,6 +63447,9 @@ /obj/item/book/manual/wiki/xenoarchaeology, /obj/effect/turf_decal/bot, /obj/item/healthanalyzer, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/science/explab) "rzX" = ( @@ -67555,11 +67589,6 @@ }, /turf/open/floor/plasteel, /area/medical/genetics) -"tjF" = ( -/obj/machinery/xenoarchaeology_machine/scale, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/science/explab) "tjJ" = ( /turf/open/floor/plasteel, /area/maintenance/aft) @@ -71782,10 +71811,10 @@ dir = 1 }, /obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/plasteel/dark, /area/science/explab) "vaz" = ( /obj/machinery/vending/tool, @@ -115103,7 +115132,7 @@ gQv cgq xbX xbX -bxI +xbX xbX pMQ iWv @@ -115358,7 +115387,7 @@ ccx bST pDp cgq -tjF +bxI pvu xvZ vDs @@ -116129,7 +116158,7 @@ dbE bST sqD cgq -xbX +puW rzj ngS gMR diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 9d12f6902d98e..589e1ae70497b 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -21,6 +21,8 @@ ///List of current listing sellers var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard) + var/list/test = list() + /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() //Link relevant stuff @@ -55,8 +57,11 @@ data["sellers"] = list() for(var/datum/rnd_lister/seller as() in sellers) - data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = list("test"))) - + var/list/stock = list(list("name" = "test", "description" = "test_desc")) + for(var/atom/A as() in seller.current_stock) + stock += list(list("name" = "pepper", "description" = "spicy")) + data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock)) + test = data return data //Circuitboard for this console diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index b61d9bb837f42b6b5a3131b23411862252b4cf7c..e7afc2982e74ea86e2e0b3118d050a2654ca7ab4 100644 GIT binary patch delta 1302 zcmV+x1?l>!4WSK?SrY#MGyi5Y|I9N0{{S;)|2{A?k!yPdvpKpCk?PNX(@8`@RA_R3JsPby%6imXA2~rP|KXwD12|#YJ#I?1H34d6HJYXGD*FNcgY| zEC4aK(@wvPUIAhLYaqP<@==7n%106QD<4OA_2$4zBOn04M+o+y zj}YubA0v}RFfEh_9Fn=j{s;N2N)>n7B~R#Q2^kh0Kmrq zv<5T)@aZ`)paFo70%#o^kO0uf0HBWnKpz8;iULSQ0i>b;Qc(aMg9GiO06GTF$7<0Y z@UdF74}1c^*l!0EK;`2Am5&2dJ_TTX62SQcfb$6e=SKhr1H2G_l>o-40gO)r7(W7F z3Ly<(3Ly<(3Ly<(3Lym`3k9(iu(A{pTLCLe5wR7pvJ_EU0du7Y-wc^6MfhgOTq(jg zL*_~mu^BR#0yO^?fLwwWfLwwWfL?;X3V_a01VH-{0PRNrv>yX7bASdgbASdgbASdg zbASf0Co&Sip2$dl0DB@M0qlv41c;qU890_w0I@SE1IJPdV5gmaS0$;hB;!0|`sHPm z=Dt$Shy0y-c`*QpkSYMK0Qk!R)FPmw|E~8G)H0n!0C<+k2*{UiJqR%xjmG2gdnv@O zb(2D;mV%5ARRo400*NH1hhPD!`}<@vK>$*(mu?Y|A1LU5AsCI|{r&K;eFX9&UpW#1 z13(SI0f75^2Y{dsJU;^9{*C}p{7G6U$*#>aAtMk67<>13(Io!B z1Atnla}S`9e+oc9pC18ue-8lYMbst&`B7fbLoib7zXBMA05;P$(agc)0xy%syje+f5!k!rfs4fzII z;O_6^wh@>e&oYiEn}z@&1_=gm2=4C)fF-wy1^`(9oJ+&DkSYQAP>U-7^*#om3*q}3 zfcgqQgXM=cKoElr0?33o0P|@LAm0uF?EO914`;`JwM;LLAwWC=GD%npvKa!P_o7L- zAIpS#qpUJ4|7ieFEieG?%@QSHug~FL9Cp(T;I-%nz{Mcj9)O+$TZ;ggM+*#KRL+4A zAed^i#!2YDUbVm~ArB_us63Go05AnUK*KVe@kO!V^>u^*&}Y(TM4&^97E)_@2$XrN ze2A!jON$m#b-)vxVi~FqEm{H0%RR2P*C9^l7A>@tyL-9I+vk#WI=5({56k6JeP~%d zKafu67CZgl72E(i`u`aMxK}02JG3_W{SbJ+aulgZJNUg2_#FuU?%3q_L69GP{ABd; zC>MF{?%3q_KyY%pIy+Z7Tb+s`$Z?aunbfa;1!8q^`B~}mLR{54F#Z>*Ka>K0V_n}| z7q{Z>eywyb&TeZR7~cT|{>Hlb^QL$>7mrU$;_LZCtpnpbfWY5a->$#O4!(;YQeyo* z=)m|}1W+M|G5Hbj41XSM&;>-3T@FZjm$Ovo^K#lPB?CxH1 ztk+_Fe;3Sh<2!)huKZpvm7@3-Q;_ zzms(@q=cUpyP;vs^l9(f|Me M07*qoM6N<$f(NHX5&!@I delta 1310 zcmV+(1>yRk4XF)~SrR@lGyecH|7J7)%rgN005fL)k!yPd-d%Nik?PNX+et)0RA_X*?AAk2RWg!wx_n7<2z1H7_A5nfh4im+4pD8g>#;|MQa?HMTq1OWI5!4C8h zf?eoi1Oni-lKKh?0DKgG0Qe{X@M8e-D=`4&M*x%`0Z={;FpyH;zyW}d0stQc06q?& zG@t>1PtSn?4FG%;KxuD}1b{vU0DTMq`WS#v6hJ5nAQS}?t1wP&u$ZR*QCk zkJX}G;1dAaem$T7Djx@^d>o+iDFEY>0M;h}tWN+~KLRiq;DxAv1kgSWpnV!Z`w;+L z2x$Oa2x$Oa2x$Oa2q^$jD2S~fDN7Nt6(nUTBDR90EJf5-kl0d$Z-$92Mfhfz*iwXV zhKVgj#AcY-Awb990FX=20FX=20MJYDR{>CC6ai3v1VH%_0OiL3^caGK((O7`FK2@OeSxIT4ul-f{cx121YG2z^nUz`*b>O1<*7Daey(rzwhsd z08|3=16Mhjf%p)No%=fiK=B84;OQ9v_xAw6i!+A+g_P)8KZi&L@`JpfThN*~_jm5w z^ePr>TuOeZo>&INr$t>Im^k-$1i-{;!t@$f&Fd$Yfo1^k{*C~cI8B&O$^e)FA%I-} z6~Gt)&~ci7Frj0bG|wTj7ia*GgCSOmr{MmM0iYR}&4N`hn+wf^^f%7E0GLI8bOBT$eCq*-?`C9t;%yNBQvuBV zJ=hOrBaU2v{xYEUqG`AvD*zj31^@!I2mlzyB?iFF^*P*&BN-q8oE%}5kOh-40uUtH ziLV}DSuB}9jZpwK2PgnI1T6vLgH&o<&Ve==Ae(pUzz9)T2gc=z3>wBHw z2SI-D?!DH#gPiBy^}WvTf#CRLeR?K!x<285MKH#7emBW~*zooF#RsX2bAIV{p#6_R zpQHl6v#zeMiW`1=w~@Nzr#D^)+P46K-&xn6uZ#OL{_rTpzntBB9cbSI1b%0Iz4|IT z_{P5r@y)lO1MNQ}fK2iI*_Q_{;(vSyGobzF&%ow87fB#9Ap4dOAD=G+k6h${%)m2w z0>}t&PH*q{X2Umkx4|sez6I!i707jdxjyHz4DgHdHC6{M*A^h~d(rU;*OiX1PmYle z>io`H@_&B(EA@l_w@k!!x~1P)9R0Jo-(&x14|RU8{Ubfp`91gF8fdGnw(6k&0rsfm UYEL>f5&!@I07*qoM6N<$g2_)% {
      {`${value["dialogue"]}`}
      - {stock.map((stock_item) => ( -
      {`${stock_item}`}
      + {stock.map((stock_list) => ( +
      +
      {`${stock_list["description"]}`}
      +
      ))}
      From 3a490582f79c1c00780acb510ae7b138a462400c Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Jan 2024 21:08:44 +1100 Subject: [PATCH 046/339] ooohhhh --- .../xenoarchaeology/tools/console/xenoarchaeology_console.dm | 2 +- .../xenoarchaeology/tools/console/xenoarchaeology_seller.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 589e1ae70497b..bdcc36a7c46bd 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -57,7 +57,7 @@ data["sellers"] = list() for(var/datum/rnd_lister/seller as() in sellers) - var/list/stock = list(list("name" = "test", "description" = "test_desc")) + var/list/stock = list(list("name" = "test", "description" = "test_desc"), list("name" = "test", "description" = "test_desc")) for(var/atom/A as() in seller.current_stock) stock += list(list("name" = "pepper", "description" = "spicy")) data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock)) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index 6e160cb27318e..ea87497a66c9a 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -19,7 +19,7 @@ var/restock_time = 1 MINUTES ///What science thingy are they selling var/atom/stock_type - var/list/current_stock + var/list/current_stock = list() var/max_stock = 1 /datum/rnd_lister/New() From 401159971201044864343f76021f6773ecf04538 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Jan 2024 13:10:33 +1100 Subject: [PATCH 047/339] bookmark - 16 1 24 --- code/datums/components/radioactive.dm | 2 +- .../tools/console/xenoarchaeology_console.dm | 11 +++++++---- .../tools/console/xenoarchaeology_seller.dm | 3 +++ tgui/packages/tgui/interfaces/XenoartifactConsole.js | 9 +++++---- 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 82f3195f68a27..535822523ba27 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -50,7 +50,7 @@ if(isitem(I) && prob(1)) //if you ever make non-items artifacts, change this check var/datum/component/xenoartifact/X = I.GetComponent(/datum/component/xenoartifact) if(!X) - AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) + I.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) if(!hl3_release_date) return strength -= strength / hl3_release_date diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index bdcc36a7c46bd..f04970de4e711 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -19,7 +19,7 @@ var/stability = 100 ///List of current listing sellers - var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard) + var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard/two) var/list/test = list() @@ -55,13 +55,16 @@ /obj/machinery/computer/xenoarchaeology_console/ui_data(mob/user) var/list/data = list() + //Seller data data["sellers"] = list() for(var/datum/rnd_lister/seller as() in sellers) - var/list/stock = list(list("name" = "test", "description" = "test_desc"), list("name" = "test", "description" = "test_desc")) + var/list/stock = list() for(var/atom/A as() in seller.current_stock) - stock += list(list("name" = "pepper", "description" = "spicy")) + stock += list(list("name" = A?.name, "description" = A?.desc)) data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock)) - test = data + //Stability + data["stability"] = stability + return data //Circuitboard for this console diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index ea87497a66c9a..2d7e528a71cc8 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -89,6 +89,9 @@ dialogue = "What are you standing there for? come closer." personality = SELLER_PERSONALITY_STINGY +/datum/rnd_lister/artifact_seller/bastard/two + name = "SidorovichII" + /* Supply pack for this system Whenever a listing is purchased, a supply pack with the purchased items is returned diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index cf7aa59bbad7f..f47a19951f5d6 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -5,12 +5,13 @@ import { Window } from '../layouts'; export const XenoartifactConsole = (props, context) => { const { act, data } = useBackend(context); - const { } = data; + const { stability } = data; const sellers = data.sellers || []; return ( - + + {sellers.map((value) => ( ))} @@ -26,11 +27,11 @@ const XenoartifactConsoleSellerEntry = (props, context) => { const stock = value["stock"] || []; return ( -
      +
      {`${value["dialogue"]}`}
      {stock.map((stock_list) => ( -
      +
      {`${stock_list["description"]}`}
      ))} From 35a97a3b7a4bd169977042d9b771e625756c37c2 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Jan 2024 16:45:18 +1100 Subject: [PATCH 051/339] Better routing - 16 1 24 --- _maps/_basemap.dm | 2 +- .../tools/console/xenoarchaeology_console.dm | 21 ++++++++++++++++--- .../tools/console/xenoarchaeology_seller.dm | 3 --- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 697687da4fc9b..712a6b8908ffd 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -19,7 +19,7 @@ var/stability = 100 ///List of current listing sellers - var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard/two) + var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard) var/list/test = list() @@ -60,7 +60,7 @@ for(var/datum/rnd_lister/seller as() in sellers) var/list/stock = list() for(var/atom/A as() in seller.current_stock) - stock += list(list("name" = A?.name, "description" = A?.desc, "id" = REF(A))) + stock += list(list("name" = A?.name, "description" = A?.desc, "id" = REF(A), "cost" = A?.custom_price || 0)) data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock, "id" = REF(seller))) //Stability data["stability"] = stability @@ -80,7 +80,22 @@ //Ship the pack var/datum/supply_order/SO = new(SP, null, null, null, "Research Material Requisition") SO.generateRequisition(get_turf(src)) - new /obj/effect/pod_landingzone(get_turf(src), /obj/structure/closet/supplypod, SO) + //Landing zone shit + var/LZ = get_turf(src) + var/area/landingzone = GLOB.areas_by_type[/area/quartermaster/storage] + var/list/empty_turfs + if(!landingzone) + WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") + landingzone = get_area(src) + for(var/turf/open/floor/T in landingzone.get_contained_turfs()) + if(T.is_blocked_turf()) + continue + LAZYADD(empty_turfs, T) + CHECK_TICK + if(empty_turfs?.len) + LZ = pick(empty_turfs) + //FIRE! + new /obj/effect/pod_landingzone(LZ, /obj/structure/closet/supplypod/bluespacepod, SO) ui_update() diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index a12f097f6b2b4..b1e297088f405 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -88,9 +88,6 @@ dialogue = "What are you standing there for? come closer." personality = SELLER_PERSONALITY_STINGY -/datum/rnd_lister/artifact_seller/bastard/two - name = "SidorovichII" - /* Supply pack for this system Whenever a listing is purchased, a supply pack with the purchased items is returned From 6ec57b414beb2a6f1c87eb3ff5af99793d653efd Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Jan 2024 18:33:58 +1100 Subject: [PATCH 052/339] Bookmark - 16 1 24 --- _maps/map_files/MetaStation/MetaStation.dmm | 49 +++---------------- .../components/xenoartifact.dm | 3 ++ .../tools/console/xenoarchaeology_console.dm | 36 +++++++------- .../tools/xenoarchaeology_machines.dm | 15 +++++- code/modules/xenoarchaeology/traits/majors.dm | 15 +++--- .../tgui/interfaces/XenoartifactConsole.js | 5 +- 6 files changed, 53 insertions(+), 70 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 3fcd9cd5d6f53..ffb31e6e1335a 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -21855,11 +21855,6 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, /obj/structure/cable/yellow{ icon_state = "4-8" }, @@ -21869,9 +21864,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, /turf/open/floor/plasteel/white, /area/science/explab) "cPb" = ( @@ -36580,24 +36572,11 @@ /area/crew_quarters/bar) "iaH" = ( /obj/structure/table, -/obj/item/xenoarchaeology_labeler, -/obj/item/xenoarchaeology_labeler{ - pixel_y = 6 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, -/obj/structure/table/reinforced, -/obj/item/storage/firstaid/regular, +/obj/effect/loot_jobscale/medical/first_aid_kit, /obj/item/clothing/neck/stethoscope, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, /turf/open/floor/plasteel/dark, /area/science/explab) "iaK" = ( @@ -43154,6 +43133,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/xenoarchaeology_labeler, /turf/open/floor/plasteel/dark, /area/science/explab) "kFB" = ( @@ -55513,15 +55496,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"pyq" = ( -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/explab) "pyU" = ( /obj/effect/spawner/randomvend/cola, /turf/open/floor/carpet, @@ -56088,9 +56062,6 @@ /obj/effect/turf_decal/trimline/purple/filled/end{ dir = 1 }, -/obj/machinery/light{ - dir = 4 - }, /obj/machinery/airalarm{ dir = 8; pixel_x = 24 @@ -56098,17 +56069,9 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, /obj/machinery/light{ dir = 4 }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, /turf/open/floor/plasteel/white, /area/science/explab) "pKq" = ( @@ -113719,7 +113682,7 @@ cgq iZs iZs iZs -pyq +iZs ity jET hju diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 53337bac781d2..2f7c1a4df025e 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -329,9 +329,12 @@ //Build the silhouette of the artifact var/mutable_appearance/MA = artifact_type.get_mask() MA.plane = A.plane //This is important lol + MA.layer = A.layer A.appearance = MA //Reset name + var/old_desc = A.desc A.name = "[artifact_type.name] [old_name]" + A.desc = old_desc //Appearance resets this shit if(do_texture) //Overlay the material texture var/icon/I = artifact_type.get_texture() diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 712a6b8908ffd..34dbeed16b7b7 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -64,6 +64,9 @@ data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock, "id" = REF(seller))) //Stability data["stability"] = stability + ///Cash available + var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_CAR_ID) + data["money"] = D.account_balance return data @@ -74,29 +77,26 @@ switch(action) //Purchase items if("stock_purchase") + //If we got no instability + if(!stability) + say("Insufficient straythread stability!") + return //Locate seller and purchase our item from them var/datum/rnd_lister/seller = locate(params["seller_id"]) + //If we got no cash + var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_CAR_ID) + if(seller.get_price(locate(params["item_id"])) > D.account_balance) + say("Insufficient funds!") + return var/datum/supply_pack/SP = seller?.buy_stock(locate(params["item_id"])) //Ship the pack - var/datum/supply_order/SO = new(SP, null, null, null, "Research Material Requisition") + var/datum/supply_order/SO = new(SP, null, null, null, "Research Material Requisition", D) SO.generateRequisition(get_turf(src)) - //Landing zone shit - var/LZ = get_turf(src) - var/area/landingzone = GLOB.areas_by_type[/area/quartermaster/storage] - var/list/empty_turfs - if(!landingzone) - WARNING("[src] couldnt find a Quartermaster/Storage (aka cargobay) area on the station, and as such it has set the supplypod landingzone to the area it resides in.") - landingzone = get_area(src) - for(var/turf/open/floor/T in landingzone.get_contained_turfs()) - if(T.is_blocked_turf()) - continue - LAZYADD(empty_turfs, T) - CHECK_TICK - if(empty_turfs?.len) - LZ = pick(empty_turfs) - //FIRE! - new /obj/effect/pod_landingzone(LZ, /obj/structure/closet/supplypod/bluespacepod, SO) - + //TODO: For whatever reason this doesn't auto approve - Racc + SSsupply.shoppinglist += SO + //Take our toll + stability = clamp(stability-STABILITY_COST, 0, 100) + ui_update() //Circuitboard for this console diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 2c405f2a72f21..5ba51fae9b7ce 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -112,7 +112,18 @@ /obj/machinery/xenoarchaeology_machine/calibrator/examine(mob/user) . = ..() - . += "Alt-Click to calibrate inserted artifacts." + . += "Alt-Click to calibrate inserted artifacts." + +/obj/machinery/xenoarchaeology_machine/calibrator/attack_hand(mob/living/user) + if(length(contents)) + return ..() + else + var/turf/T = get_turf(src) + for(var/obj/item/I in T.contents) + if(move_inside && length(held_contents) >= max_contents) + return + I.forceMove(src) + register_contents(I) /obj/machinery/xenoarchaeology_machine/calibrator/AltClick(mob/user) . = ..() @@ -127,6 +138,8 @@ var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents //Then we'll check the label traits against the artifact's if(!X || !L) + if(!L) + say("No label detected!") playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) empty_contents() continue diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index d056f966553d3..233d196671e86 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -318,21 +318,22 @@ . = ..() if(!.) return + var/time = wall_time*(parent.trait_strength/100) //Don't use a switch case, we just pass through the ifs and add walls as we go if(wall_size >= 1) - new /obj/effect/forcefield/xenoartifact_type(get_turf(parent.parent), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_turf(parent.parent), time) if(wall_size >= 2) //If we're not making a symetrical design, pick a random orientation var/outcome = pick(0, 1) if(outcome || wall_size >= 3) - new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, NORTH), (parent.trait_strength*wall_time)) - new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, SOUTH), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, NORTH), time) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, SOUTH), time) else - new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), (parent.trait_strength*wall_time)) - new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), time) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), time) if(wall_size >= 3) - new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), (parent.trait_strength*wall_time)) - new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), (parent.trait_strength*wall_time)) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), time) + new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), time) //Special wall type for artifact. Throw any extra code or special logic in here /obj/effect/forcefield/xenoartifact_type diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index c5fcdb8ab42c3..e5bd9d8926faa 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -5,11 +5,14 @@ import { Window } from '../layouts'; export const XenoartifactConsole = (props, context) => { const { act, data } = useBackend(context); - const { stability } = data; + const { stability, money } = data; const sellers = data.sellers || []; return ( + + {`Research Budget: ${money}`} +
      From af91e8e98003cbda19ca554260fa350da6c98e7d Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Jan 2024 20:53:01 +1100 Subject: [PATCH 053/339] anti-artifact - 16 1 24 --- _maps/map_files/MetaStation/MetaStation.dmm | 11 +++++---- code/modules/clothing/gloves/miscellaneous.dm | 9 ++++++++ .../components/xenoartifact.dm | 6 ++++- .../tools/console/xenoarchaeology_console.dm | 5 +--- code/modules/xenoarchaeology/traits/minors.dm | 5 ++++ code/modules/xenoarchaeology/traits/traits.dm | 23 +++++++++++++++++++ .../tgui/interfaces/XenoartifactConsole.js | 9 ++++---- 7 files changed, 54 insertions(+), 14 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index ffb31e6e1335a..27ac6ba42bbdd 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -28939,6 +28939,12 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat/foyer) +"fcT" = ( +/obj/item/radio/intercom{ + pixel_y = 21 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "fcY" = ( /obj/machinery/holopad, /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -46802,9 +46808,6 @@ /turf/open/space, /area/ai_monitored/security/armory) "mft" = ( -/obj/item/radio/intercom{ - pixel_y = 21 - }, /obj/machinery/xenoarchaeology_machine/scale, /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, @@ -113679,7 +113682,7 @@ ccv bST vcc cgq -iZs +fcT iZs iZs iZs diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index acd01cd5bb2fe..766cacf9b4605 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -143,4 +143,13 @@ var/obj/item/clothing/gloves/artifact_pinchers/pinchy = target if(istype(pinchy)) pinchy.safety = !pinchy.safety + var/datum/component/anti_artifact/A = pinch.GetComponent(/datum/component/anti_artifact) + if(pinchy.safety && !A) + pinchy.AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100) + else if(A) + A.RemoveComponent() + UpdateButtonIcon() + +/datum/action/item_action/artifact_pincher_mode/UpdateButtonIcon(status_only = FALSE, force) + if(..()) //button available button.icon_state = (pinchy.safety ? "template_active" : "template") diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 2f7c1a4df025e..0300b602485bd 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -8,7 +8,7 @@ icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' icon_state = "map_editor" w_class = WEIGHT_CLASS_NORMAL - desc = "A strange alien device. What could it possibly do?" + desc = "A strange alien artifact. What could it possibly do?" throw_range = 3 ///What type of artifact var/datum/xenoartifact_material/artifact_type @@ -212,6 +212,10 @@ //Range check if(get_dist(get_turf(parent), get_turf(target))> target_range && !force) return + //Anti-artifact check + var/mob/M = target + if(M.anti_artifact_check()) + return targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 34dbeed16b7b7..9c05144355abe 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -21,8 +21,6 @@ ///List of current listing sellers var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard) - var/list/test = list() - /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() //Link relevant stuff @@ -67,7 +65,7 @@ ///Cash available var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_CAR_ID) data["money"] = D.account_balance - + return data /obj/machinery/computer/xenoarchaeology_console/ui_act(action, params) @@ -92,7 +90,6 @@ //Ship the pack var/datum/supply_order/SO = new(SP, null, null, null, "Research Material Requisition", D) SO.generateRequisition(get_turf(src)) - //TODO: For whatever reason this doesn't auto approve - Racc SSsupply.shoppinglist += SO //Take our toll stability = clamp(stability-STABILITY_COST, 0, 100) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 62a5b2d25578c..038dcc3061b7c 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -15,11 +15,16 @@ /datum/xenoartifact_trait/minor/charged/New(atom/_parent) . = ..() parent.trait_strength *= 1.25 + setup_generic_touch_hint() /datum/xenoartifact_trait/minor/charged/Destroy(force, ...) parent.trait_strength /= 1.25 return ..() +/datum/xenoartifact_trait/minor/charged/do_hint(mob/user, atom/item) + . = ..() + to_chat(user, "Your hair stands on end!") + /* Capacitive Gives the artifact extra uses diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index d64830b62ccc0..157019bf4db2f 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -142,6 +142,29 @@ /datum/xenoartifact_trait/proc/cut_trait_appearance(atom/target) return +/datum/xenoartifact_trait/proc/setup_generic_item_hint() + RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(hint_translation_type_a)) + +/datum/xenoartifact_trait/proc/setup_generic_touch_hint() + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hint_translation_type_b)) + +/datum/xenoartifact_trait/proc/hint_translation_type_a(datum/source, obj/item, mob/living, params) + SIGNAL_HANDLER + + do_hint(living, item) + +/datum/xenoartifact_trait/proc/hint_translation_type_b(datum/source, mob/living) + SIGNAL_HANDLER + + do_hint(living, null) + +/datum/xenoartifact_trait/proc/do_hint(mob/user, atom/item) + //If they have science goggles, or equivilent, they are shown exatcly what trait this is + if(user?.can_see_reagents()) + var/atom/A = parent + A.balloon_alert(user, label_name, parent.artifact_type.material_color, TRUE) + return + ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path, keyed = FALSE) if(!ispath(path)) diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index e5bd9d8926faa..a17e540b0c88e 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -10,10 +10,10 @@ export const XenoartifactConsole = (props, context) => { return ( - - {`Research Budget: ${money}`} - +
      {`Research Budget: ${money}`}
      + +
      {"Purchase research materials from independant sellers, using the science budget. Purchased items will be routed through cargo."} @@ -40,9 +40,8 @@ const XenoartifactConsoleSellerEntry = (props, context) => {
      {`${value["dialogue"]}`}
      {stock.map((stock_list) => ( -
      +
      act(`stock_purchase`, {item_id: stock_list["id"], seller_id: value["id"],})}/>} key={stock_list}>
      {`${stock_list["description"]}`}
      -
      ))} From 8fbcb2101e982a1d44c78b7577efa2754bd1401e Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Jan 2024 21:22:35 +1100 Subject: [PATCH 054/339] Hints - 16 1 24 --- _maps/_basemap.dm | 2 +- beestation.dme | 2 +- code/modules/clothing/gloves/miscellaneous.dm | 6 ++- .../xenoarchaeology/traits/activators.dm | 16 ++++++- code/modules/xenoarchaeology/traits/majors.dm | 29 +++++++++++- .../xenoarchaeology/traits/malfunctions.dm | 9 ++++ code/modules/xenoarchaeology/traits/minors.dm | 44 ++++++++++++++++++- code/modules/xenoarchaeology/traits/traits.dm | 6 +-- 8 files changed, 104 insertions(+), 10 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 9499d3e8cb593..bf3b820460161 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/beestation.dme b/beestation.dme index 1376d5f039c31..601f57eeb6c87 100644 --- a/beestation.dme +++ b/beestation.dme @@ -3761,8 +3761,8 @@ #include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" #include "code\modules\security\crimes.dm" #include "code\modules\security\genpop.dm" -#include "code\modules\security\workshop.dm" #include "code\modules\security\prison_scanner.dm" +#include "code\modules\security\workshop.dm" #include "code\modules\security_levels\keycard_authentication.dm" #include "code\modules\security_levels\security_levels.dm" #include "code\modules\shuttle\arrivals.dm" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 766cacf9b4605..7896b3bba6b1d 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -143,7 +143,7 @@ var/obj/item/clothing/gloves/artifact_pinchers/pinchy = target if(istype(pinchy)) pinchy.safety = !pinchy.safety - var/datum/component/anti_artifact/A = pinch.GetComponent(/datum/component/anti_artifact) + var/datum/component/anti_artifact/A = pinchy.GetComponent(/datum/component/anti_artifact) if(pinchy.safety && !A) pinchy.AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100) else if(A) @@ -152,4 +152,6 @@ /datum/action/item_action/artifact_pincher_mode/UpdateButtonIcon(status_only = FALSE, force) if(..()) //button available - button.icon_state = (pinchy.safety ? "template_active" : "template") + var/obj/item/clothing/gloves/artifact_pinchers/pinchy = target + if(istype(pinchy)) + button.icon_state = (pinchy.safety ? "template_active" : "template") diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index c0d5d602de0bd..54e9a44770983 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -1,6 +1,15 @@ -//These traits cause the xenoartifact to trigger, activate +/* + Activators + These traits cause the xenoartifact to trigger, activate + + * weight - All activators MUST have a weight that is a multiple of 8 + * conductivity - If an activator should have conductivity, it will be a multiple of 8 too +*/ + /datum/xenoartifact_trait/activator register_targets = FALSE + weight = 8 + conductivity = 0 ///Do we override the artifact's generic cooldown? var/override_cooldown = FALSE @@ -44,6 +53,7 @@ label_name = "Sturdy" label_desc = "Sturdy: The artifact seems to be made of a sturdy material. This material seems to be triggered by physical interaction." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 16 /datum/xenoartifact_trait/activator/strudy/New(atom/_parent) . = ..() @@ -110,6 +120,7 @@ label_name = "Timed" label_desc = "Timed: The artifact seems to be made of a harmonizing material. This material seems to activate on a timer, which can be enabled or disabled." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 32 ///Are we looking for targets var/searching = FALSE ///Search cooldown logic @@ -208,6 +219,7 @@ label_name = "Cell" label_desc = "Cell: The artifact seems to be made of a capacitive material. This material seems to be triggered by eletric currents, such as cells." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 32 /datum/xenoartifact_trait/activator/cell/New(atom/_parent) . = ..() @@ -228,6 +240,7 @@ label_desc = "Weighted: The artifact seems to be made of a weighted material. This material seems to be triggered by motion, such as being picked up." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = 32 /datum/xenoartifact_trait/activator/weighted/New(atom/_parent) . = ..() @@ -245,6 +258,7 @@ label_desc = "Pitched: The artifact seems to be made of an aerodynamic material. This material seems to be triggered by motion, such as being thrown." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = 24 /datum/xenoartifact_trait/activator/pitched/New(atom/_parent) . = ..() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 233d196671e86..3ec20385f863a 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -1,5 +1,14 @@ +/* + Major + These traits cause the xenoartifact to do a specific action + + * weight - All majors should have a weight that is a multiple of 3 + * conductivity - If a major should have conductivity, it will be a multiple of 3 too +*/ /datum/xenoartifact_trait/major priority = TRAIT_PRIORITY_MAJOR + weight = 3 + conductivity = 0 /* Electrified @@ -10,7 +19,7 @@ label_desc = "The artifact seems to contain electrifying components. Triggering these components will shock the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT - conductivity = 10 + conductivity = 27 ///max damage var/max_damage = 25 @@ -43,6 +52,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT weight = -10 + weight = 27 ///Maximum time we hold people for var/hold_time = 15 SECONDS @@ -96,6 +106,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_GAMER flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE + weight = 24 ///Maximum time we stop time for var/max_time = 10 SECONDS @@ -119,6 +130,7 @@ flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER extra_target_range = 2 + weight = 21 ///List of projectiles we *could* shoot var/list/possible_projectiles = list(/obj/projectile/beam/disabler, /obj/projectile/beam/laser, /obj/projectile/seedling, /obj/projectile/beam/xray, /obj/projectile/bullet) ///The projectile type we *will* shoot @@ -152,6 +164,8 @@ label_desc = "Bestialized: The artifact contains transforming components. Triggering these components transforms the target into an animal." flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER + weight = 15 + conductivity = 12 ///List of potential animals we could turn people into var/list/possible_animals = list(/mob/living/simple_animal/pet/dog/corgi) ///The animal we will turn people into @@ -216,6 +230,8 @@ flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE rarity = XENOA_TRAIT_WEIGHT_RARE + weight = 9 + conductivity = 36 /datum/xenoartifact_trait/major/emp/trigger(datum/source, _priority, atom/override) . = ..() @@ -247,6 +263,8 @@ label_desc = "The artifact seems to contain displacing components. Triggering these components will displace the target." cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + conductivity = 15 /datum/xenoartifact_trait/major/displaced/trigger(datum/source, _priority, atom/override) . = ..() @@ -273,6 +291,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE + weight = 18 ///List of possible colors var/list/possible_colors = list(LIGHT_COLOR_FIRE, LIGHT_COLOR_BLUE, LIGHT_COLOR_GREEN, LIGHT_COLOR_RED, LIGHT_COLOR_ORANGE, LIGHT_COLOR_PINK) ///Our actual color @@ -305,6 +324,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_GAMER flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE + weight = 33 ///What wall size are we making? var/wall_size ///Max time we keep walls around for @@ -354,6 +374,7 @@ label_desc = "Hypodermic: The artifact seems to contain chemical components. Triggering these components will inject the target with a chemical." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 30 ///What chemical we're injecting var/datum/reagent/formula ///max amount we can inject people with @@ -389,6 +410,8 @@ label_desc = "Forcing: The artifact seems to contain impulsing components. Triggering these components will impulse, either pushing or pulling, the target." cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 21 + conductivity = 27 ///Max force we can use, aka how far we throw things var/max_force = 7 ///Force direction, push or pull @@ -455,6 +478,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE + weight = 15 ///Possible target gasses var/list/target_gasses = list( /datum/gas/oxygen = 6, @@ -505,6 +529,8 @@ cooldown = XENOA_TRAIT_COOLDOWN_GAMER flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT rarity = XENOA_TRAIT_WEIGHT_EPIC + weight = 36 + conductivity = 36 /datum/xenoartifact_trait/major/shadow_realm/New(atom/_parent) . = ..() @@ -540,6 +566,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE + weight = 6 ///The maximum size of our smoke stack in turfs, I think var/max_size = 6 diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index c009bb3e05ab7..a78a7630e0408 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -1,6 +1,15 @@ +/* + Malfunction + These traits cause the xenoartifact to malfunction, typically making the artifact wrose + + * weight - All malfunctions should have a weight that is a multiple of 7 + * conductivity - If a malfunction should have conductivity, it will be a multiple of 7 too +*/ /datum/xenoartifact_trait/malfunction priority = TRAIT_PRIORITY_MALFUNCTION register_targets = FALSE + weight = 7 + conductivity = 0 /* Parallel Bearspace Retrieval diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 038dcc3061b7c..7309e7662cbc2 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -1,6 +1,16 @@ +/* + Minors + These traits cause the xenoartifact to behave uniquely, just misc shit + + * weight - All minors should have a weight that is a multiple of 5 + * conductivity - If a minor should have conductivity, it will be a multiple of 5 too +*/ + /datum/xenoartifact_trait/minor priority = TRAIT_PRIORITY_MINOR register_targets = FALSE + weight = 5 + conductivity = 0 /* Charged @@ -11,6 +21,8 @@ label_name = "Charged" label_desc = "Charged: The Artifact's design seems to incorporate looping elements. This will cause the artifact to produce more powerful effects." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 10 + conductivity = 15 /datum/xenoartifact_trait/minor/charged/New(atom/_parent) . = ..() @@ -34,6 +46,8 @@ label_name = "Capacitive" label_desc = "Capacitive: The Artifact's design seems to incorporate a capacitive elements. This will cause the artifact to have more uses." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + conductivity = 30 ///How many extra charges do we get? var/max_charges = 2 ///How many extra charges do we have? @@ -67,6 +81,7 @@ label_desc = "Dense: The Artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/ringed, /datum/xenoartifact_trait/minor/shielded, /datum/xenoartifact_trait/minor/aerodynamic, /datum/xenoartifact_trait/minor/slippery) + weight = 30 ///Old value tracker var/old_density var/old_atom_flag @@ -145,7 +160,16 @@ label_name = "Cooling" label_desc = "Cooling: The Artifact's design seems to incorporate cooling elements. This will cause the artifact to cooldown faster." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT - cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE + cooldown = -5 SECONDS //Point of balance + weight = 15 + +/datum/xenoartifact_trait/minor/cooling/New(atom/_parent) + . = ..() + setup_generic_touch_hint() + +/datum/xenoartifact_trait/minor/cooling/do_hint(mob/user, atom/item) + . = ..() + to_chat(user, "[parent.parent] feels cool to the touch!") /* Sentient @@ -155,6 +179,7 @@ label_name = "Senitent" label_desc = "Senitent: The Artifact's design seems to incorporate sentient elements. This will cause the artifact to have a mind of its own." flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 30 ///Mob who lives inside the artifact, and who we give actions to var/mob/living/simple_animal/shade/sentience ///Mob spawner for ghosts @@ -263,6 +288,7 @@ label_name = "Delicate" label_desc = "Delicate: The Artifact's design seems to delicate cooling elements. This will cause the artifact to potentially break." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = -5 ///Max amount of uses var/max_uses ///How many uses we have left @@ -303,6 +329,8 @@ flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS extra_target_range = 2 + weight = 15 + conductivity = 5 ///Max amount of extra targets we can have var/max_extra_targets = 10 @@ -328,6 +356,8 @@ label_desc = "Scoped: The Artifact's design seems to incorporate scoped elements. This will cause the artifact to have a larger target range." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT extra_target_range = 9 + weight = 10 + conductivity = 15 /* Ringed @@ -386,6 +416,7 @@ label_desc = "Shielded: The Artifact's design seems to incorporate shielded elements. This will allow the artifact to be used like a shield." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = 15 ///Old block level var/old_block_level var/max_block_level = 4 @@ -427,6 +458,7 @@ label_desc = "Aerodynamic: The Artifact's design seems to incorporate shielAerodynamicded elements. This will allow the artifact to be thrown further." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + weight = -5 ///Old throw range var/old_throw_range @@ -451,6 +483,7 @@ label_name = "Signaller" label_desc = "Signaller: The Artifact's design seems to incorporate signalling elements. This will cause the artifact to send a signal when activated." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 15 ///Signal code var/code ///Signal frequency @@ -466,6 +499,7 @@ signal = new(list("code" = code)) //Frequency radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") + setup_generic_item_hint() /datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) SSradio.remove_object(src, FREQ_SIGNALER) @@ -478,6 +512,11 @@ return INVOKE_ASYNC(src, PROC_REF(do_signal)) +/datum/xenoartifact_trait/minor/signaller/do_hint(mob/user, atom/item) + . = ..() + if(istype(item, /obj/item/analyzer)) + to_chat(user, "[item] detects a frequency & code of [FREQ_SIGNALER]-[code]!") + /datum/xenoartifact_trait/minor/signaller/proc/do_signal() if(!radio_connection || !signal) return @@ -496,6 +535,7 @@ flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS extra_target_range = 2 + weight = 10 /datum/xenoartifact_trait/minor/anchor/New(atom/_parent) . = ..() @@ -537,6 +577,7 @@ label_desc = "Slippery: The Artifact's design seems to incorporate slippery elements. This will cause the artifact to be slippery." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) + conductivity = 5 ///Refernce to slip component for later cleanup var/datum/component/slippery/slip_comp @@ -557,6 +598,7 @@ label_name = "Haunted" label_desc = "Haunted: The Artifact's design seems to incorporate incorporeal elements. This will cause the artifact to move unexpectedly." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 35 ///Refernce to move component for later cleanup var/datum/component/deadchat_control/controller diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 157019bf4db2f..de0e284e4d34d 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -143,10 +143,10 @@ return /datum/xenoartifact_trait/proc/setup_generic_item_hint() - RegisterSignal(parent, COMSIG_PARENT_ATTACKBY, PROC_REF(hint_translation_type_a)) + RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, PROC_REF(hint_translation_type_a)) /datum/xenoartifact_trait/proc/setup_generic_touch_hint() - RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hint_translation_type_b)) + RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(hint_translation_type_b)) /datum/xenoartifact_trait/proc/hint_translation_type_a(datum/source, obj/item, mob/living, params) SIGNAL_HANDLER @@ -161,7 +161,7 @@ /datum/xenoartifact_trait/proc/do_hint(mob/user, atom/item) //If they have science goggles, or equivilent, they are shown exatcly what trait this is if(user?.can_see_reagents()) - var/atom/A = parent + var/atom/A = parent.parent A.balloon_alert(user, label_name, parent.artifact_type.material_color, TRUE) return From cc2e0ee00109f5f76b21f893dcddf8d3327697da Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 17 Jan 2024 14:11:05 +1100 Subject: [PATCH 055/339] bookmark - 17 1 24 --- .../xenoarchaeology/traits/activators.dm | 7 +++++++ code/modules/xenoarchaeology/traits/minors.dm | 18 +++++++++--------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 54e9a44770983..1cf6ca7947dd0 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -226,11 +226,18 @@ RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) /datum/xenoartifact_trait/activator/cell/translation_type_b(datum/source, atom/item, atom/target) + do_hint(target, item) var/obj/item/stock_parts/cell/C = item if(istype(C) && C.charge-(C.maxcharge*0.25) >= 0) C.use(C.maxcharge*0.25) + C.say("[target] is gay") trigger_artifact(target) +/datum/xenoartifact_trait/activator/cell/do_hint(mob/user, atom/item) + if(istype(item, /obj/item/multitool)) + to_chat(user, "[item] detects a capacitive draw of 25%!") + return ..() + /* Weighted This trait activates the artifact when it is picked up diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 7309e7662cbc2..bb7f3326f75dd 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -299,14 +299,6 @@ //Generate uses max_uses = pick(list(3, 6, 9)) current_uses = max_uses - //TODO: Move this to the didicated appearance proc - Racc - var/atom/A = parent.parent - A.alpha *= 0.7 - -/datum/xenoartifact_trait/minor/delicate/Destroy(force, ...) - var/atom/A = parent.parent - A.alpha /= 0.7 - return ..() /datum/xenoartifact_trait/minor/delicate/trigger(datum/source, _priority, atom/override) . = ..() @@ -319,6 +311,14 @@ parent.calcify() playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) +/datum/xenoartifact_trait/minor/delicate/generate_trait_appearance(atom/target) + . = ..() + target.alpha *= 0.7 + +/datum/xenoartifact_trait/minor/delicate/cut_trait_appearance(atom/target) + . = ..() + target.alpha /= 0.7 + /* Aura Adds nearby atoms to the target list @@ -513,9 +513,9 @@ INVOKE_ASYNC(src, PROC_REF(do_signal)) /datum/xenoartifact_trait/minor/signaller/do_hint(mob/user, atom/item) - . = ..() if(istype(item, /obj/item/analyzer)) to_chat(user, "[item] detects a frequency & code of [FREQ_SIGNALER]-[code]!") + return ..() /datum/xenoartifact_trait/minor/signaller/proc/do_signal() if(!radio_connection || !signal) From ddce80c4e639a31d752cb320453e67d60ec5e6f0 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 17 Jan 2024 16:38:42 +1100 Subject: [PATCH 056/339] better blocking - 17 1 24 --- code/__DEFINES/xenoartifact.dm | 10 +++---- code/datums/components/anti_artifact.dm | 8 +++++- code/modules/clothing/gloves/miscellaneous.dm | 10 ++++--- code/modules/mob/mob.dm | 4 +-- .../components/xenoartifact.dm | 9 ++++-- .../tools/xenoarchaeology_machines.dm | 9 ++++++ .../xenoarchaeology/traits/activators.dm | 28 +++++++++++++------ code/modules/xenoarchaeology/traits/majors.dm | 2 +- 8 files changed, 56 insertions(+), 24 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index d6202770b90d2..3cdda64cf5779 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -53,16 +53,14 @@ #define XENOA_LABEL_REWARD 1.8 //Increases custom price by %80 #define XENOA_LABEL_PUNISHMENT 0.5 //Decreases price by 50% +///Types of artifact activation +#define XENOA_ACTIVATION_TOUCH "XENOA_ACTIVATION_TOUCH" +#define XENOA_ACTIVATION_CONTACT "XENOA_ACTIVATION_CONTACT" + /* old content */ -//Also not materials but also related -///Process type on burn -#define PROCESS_TYPE_LIT "is_lit" -///Process type on ticking -#define PROCESS_TYPE_TICK "is_tick" - ///Discovery point reward #define XENOA_DP 350 #define XENOA_SOLD_DP 350 diff --git a/code/datums/components/anti_artifact.dm b/code/datums/components/anti_artifact.dm index e40b3860d5baa..90ca6c785243f 100644 --- a/code/datums/components/anti_artifact.dm +++ b/code/datums/components/anti_artifact.dm @@ -7,6 +7,8 @@ var/allowed_slots = ~ITEM_SLOT_BACKPACK ///Chance to block var/chance = 100 + ///Override, turning this on will disable this component + var/override = FALSE var/datum/callback/reaction var/datum/callback/expire @@ -40,9 +42,13 @@ UnregisterSignal(user, COMSIG_MOB_RECEIVE_ARTIFACT) -/datum/component/anti_artifact/proc/protect(datum/source, mob/user, self, list/protection_sources) +/datum/component/anti_artifact/proc/protect(datum/source, mob/user, self, list/protection_sources, slot) SIGNAL_HANDLER + //Slot logic + if(slot && !(slot & allowed_slots) || override) + return + //Generic protection logic if((!self || blocks_self) && prob(chance)) protection_sources += parent reaction?.Invoke(user) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 7896b3bba6b1d..df5a8efb69bb1 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -136,6 +136,11 @@ actions_types = list(/datum/action/item_action/artifact_pincher_mode) var/safety = FALSE +/obj/item/clothing/gloves/artifact_pinchers/ComponentInitialize() + . = ..() + var/datum/component/anti_artifact/A = AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100, ITEM_SLOT_GLOVES) + A?.override = !safety + /datum/action/item_action/artifact_pincher_mode name = "Toggle Safety" @@ -144,10 +149,7 @@ if(istype(pinchy)) pinchy.safety = !pinchy.safety var/datum/component/anti_artifact/A = pinchy.GetComponent(/datum/component/anti_artifact) - if(pinchy.safety && !A) - pinchy.AddComponent(/datum/component/anti_artifact, INFINITY, FALSE, 100) - else if(A) - A.RemoveComponent() + A?.override = !pinchy.safety UpdateButtonIcon() /datum/action/item_action/artifact_pincher_mode/UpdateButtonIcon(status_only = FALSE, force) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 72b621b53f3a0..8a313bd74f265 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -902,9 +902,9 @@ return src ///Return any anti artifact atom on this mob -/mob/proc/anti_artifact_check(self = FALSE) +/mob/proc/anti_artifact_check(self = FALSE, slot) var/list/protection_sources = list() - if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_ARTIFACT, src, self, protection_sources) & COMPONENT_BLOCK_ARTIFACT) + if(SEND_SIGNAL(src, COMSIG_MOB_RECEIVE_ARTIFACT, src, self, protection_sources, slot) & COMPONENT_BLOCK_ARTIFACT) if(protection_sources.len) return pick(protection_sources) else diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 0300b602485bd..dca95720c44e4 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -205,7 +205,7 @@ focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) -/datum/component/xenoartifact/proc/register_target(atom/target, force) +/datum/component/xenoartifact/proc/register_target(atom/target, force, type) //Don't register new targets unless the cooldown is finished if(use_cooldown_timer && !force) return @@ -214,7 +214,12 @@ return //Anti-artifact check var/mob/M = target - if(M.anti_artifact_check()) + var/slot = ~ITEM_SLOT_GLOVES + //Throw you custom clothing block logic here + switch(type) + if(XENOA_ACTIVATION_TOUCH) + slot = ITEM_SLOT_GLOVES + if(M.anti_artifact_check(FALSE, slot)) return targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 5ba51fae9b7ce..2469b7f31285e 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -68,6 +68,11 @@ var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) if(X) total_weight += X.get_material_weight() + //If there's a label and we're obliged to 'help' the player + var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents + if(L) + for(var/datum/xenoartifact_trait/T as() in L.traits) + say("[T.label_name] - Weight: [T.weight]") else if(isitem(A) || isliving(A)) if(isliving(A) && prob(1)) say("Unexpected Fatass Detected!") @@ -94,6 +99,10 @@ var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) if(X) total_conductivity += X.get_material_conductivity() + var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents + if(L) + for(var/datum/xenoartifact_trait/T as() in L.traits) + say("[T.label_name] - Conductivity: [T.conductivity]") else if(isitem(A) || isliving(A)) say("Unexpected Item Detected!") return diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 1cf6ca7947dd0..cc5847f74b4e4 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -14,10 +14,10 @@ var/override_cooldown = FALSE //Throw custom cooldown logic in here -/datum/xenoartifact_trait/activator/proc/trigger_artifact(atom/target) +/datum/xenoartifact_trait/activator/proc/trigger_artifact(atom/target, type = XENOA_ACTIVATION_CONTACT, force) SIGNAL_HANDLER - parent.register_target(target) + parent.register_target(target, force, type) parent.trigger() return @@ -64,6 +64,19 @@ RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) +/datum/xenoartifact_trait/activator/strudy/translation_type_b(datum/source, atom/item, atom/target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/strudy/translation_type_d(datum/source, atom/item, atom/target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/strudy/translation_type_a(datum/source, atom/target) + var/atom/A = parent.parent + if(A.loc == target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + return + trigger_artifact(target) + /* Flammable This trait activates the artifact when it's lit @@ -141,7 +154,7 @@ search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) -/datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, force) +/datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, type, force) if(force) return ..() else @@ -156,7 +169,7 @@ //Only add mobs if(!ismob(target)) continue - trigger_artifact(target, TRUE) + trigger_artifact(target, XENOA_ACTIVATION_CONTACT, TRUE) break if(!length(parent.targets)) parent.trigger() @@ -206,7 +219,7 @@ //Only add mobs if(!ismob(target)) continue - trigger_artifact(target, TRUE) + trigger_artifact(target, XENOA_ACTIVATION_CONTACT) break if(!length(parent.targets)) parent.trigger() @@ -230,8 +243,7 @@ var/obj/item/stock_parts/cell/C = item if(istype(C) && C.charge-(C.maxcharge*0.25) >= 0) C.use(C.maxcharge*0.25) - C.say("[target] is gay") - trigger_artifact(target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/cell/do_hint(mob/user, atom/item) if(istype(item, /obj/item/multitool)) @@ -254,7 +266,7 @@ RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) /datum/xenoartifact_trait/activator/weighted/translation_type_d(datum/source, atom/target) - trigger_artifact(target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /* Pitched diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 3ec20385f863a..d720272856595 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -621,7 +621,7 @@ flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///List of possible emotes var/list/possible_emotes = list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, - /datum/emote/living/scream, /datum/emote/living/tremble, /datum/emote/living/whimper, + /datum/emote/living/shiver, /datum/emote/living/tremble, /datum/emote/living/whimper, /datum/emote/living/smile, /datum/emote/living/pout, /datum/emote/living/gag, /datum/emote/living/deathgasp, /datum/emote/living/dance, /datum/emote/living/blush) ///Emote to preform From c3f36bf2b7d7516a8c3050629d76407d5f249941 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 17 Jan 2024 16:59:09 +1100 Subject: [PATCH 057/339] Update _basemap.dm --- _maps/_basemap.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" From 8fa646935747b4712c11cabcc97d1dfd154947df Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 17 Jan 2024 17:13:09 +1100 Subject: [PATCH 058/339] oooohhh --- code/modules/xenoarchaeology/components/xenoartifact.dm | 2 +- .../modules/xenoarchaeology/tools/xenoarchaeology_machines.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index dca95720c44e4..37c54b0b15bfe 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -219,7 +219,7 @@ switch(type) if(XENOA_ACTIVATION_TOUCH) slot = ITEM_SLOT_GLOVES - if(M.anti_artifact_check(FALSE, slot)) + if(isliving(M) && M.anti_artifact_check(FALSE, slot)) return targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 2469b7f31285e..db878769772c2 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -72,7 +72,7 @@ var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents if(L) for(var/datum/xenoartifact_trait/T as() in L.traits) - say("[T.label_name] - Weight: [T.weight]") + say("[initial(T.label_name)] - Weight: [initial(T.weight)]") else if(isitem(A) || isliving(A)) if(isliving(A) && prob(1)) say("Unexpected Fatass Detected!") @@ -102,7 +102,7 @@ var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents if(L) for(var/datum/xenoartifact_trait/T as() in L.traits) - say("[T.label_name] - Conductivity: [T.conductivity]") + say("[initial(T.label_name)] - Conductivity: [initial(T.conductivity)]") else if(isitem(A) || isliving(A)) say("Unexpected Item Detected!") return From 17e529f9eb144065f9ccc4a198ef733a6f76e37a Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 17 Jan 2024 22:09:51 +1100 Subject: [PATCH 059/339] Update xenoartifact.dm --- code/modules/xenoarchaeology/components/xenoartifact.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 37c54b0b15bfe..ec1b8a5e76ce9 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -299,7 +299,7 @@ //handle adding trait artifact_traits[trait.priority] += trait blacklisted_traits += trait.blacklist_traits - blacklisted_traits += trait + blacklisted_traits += trait.type return TRUE From ed61951b240d0e871125a36e6e38b72a8331ce07 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 17 Jan 2024 22:37:53 +1100 Subject: [PATCH 060/339] better anti spread - 17 1 24 --- code/modules/xenoarchaeology/components/xenoartifact.dm | 6 ++++++ .../xenoarchaeology/tools/xenoarchaeology_labeler.dm | 4 ++++ .../xenoarchaeology/tools/xenoarchaeology_machines.dm | 4 ++++ code/modules/xenoarchaeology/traits/majors.dm | 5 +---- tgui/packages/tgui/interfaces/XenoartifactLabeler.js | 1 - 5 files changed, 15 insertions(+), 5 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index ec1b8a5e76ce9..9ffbc53ca7f0a 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -221,6 +221,12 @@ slot = ITEM_SLOT_GLOVES if(isliving(M) && M.anti_artifact_check(FALSE, slot)) return + //Just check if the thing itself has the anti-component + var/datum/component/anti_artifact/A = target.GetComponent(/datum/component/anti_artifact) + if(A?.charges) + A.charges -= 1 + return + //Regular target follow through targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index ce9feb6bd1533..f13063fb59157 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -41,6 +41,10 @@ major_traits = get_trait_list_names(GLOB.xenoa_majors) malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) +/obj/item/xenoarchaeology_labeler/ComponentInitialize() + . = ..() + AddComponent(/datum/component/anti_artifact) + /obj/item/xenoarchaeology_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index db878769772c2..1994c062900ca 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -10,6 +10,10 @@ var/list/held_contents = list() var/max_contents = 1 +/obj/machinery/xenoarchaeology_machine/ComponentInitialize() + . = ..() + AddComponent(/datum/component/anti_artifact) + /obj/machinery/xenoarchaeology_machine/attackby(obj/item/I, mob/living/user, params) var/list/modifiers = params2list(params) var/atom/target = get_target() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index d720272856595..bbfeb80b2a574 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -27,8 +27,7 @@ . = ..() if(!.) return - if(length(focus)) - playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) + playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) for(var/atom/target in focus) if(iscarbon(target)) var/mob/living/carbon/victim = target @@ -270,8 +269,6 @@ . = ..() if(!.) return - if(length(focus)) - playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) for(var/atom/movable/target in focus) if(!target.anchored) do_teleport(target, get_turf(target), (parent.trait_strength*0.3)+1, channel = TELEPORT_CHANNEL_BLUESPACE) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 1f87d01f85113..331d795e2b4e1 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -140,7 +140,6 @@ const XenoartifactlabelerSticker = (props, context) => { const { act } = useBackend(context); return ( - act('change_print_name', { name: input })} />
      +
      {sorted_minors.map((trait) => ( @@ -70,6 +70,7 @@ const XenoartifactlabelerTraits = (props, context) => { ))}
      +
      {sorted_majors.map((trait) => ( @@ -82,6 +83,7 @@ const XenoartifactlabelerTraits = (props, context) => { ))}
      +
      {sorted_malfs.map((trait) => ( @@ -130,7 +132,10 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { return (
      -
      {`${info}`}
      +
      {`${info["desc"]}`}
      + {info["hints"].map((hint) => ( +
      ); From ae5cc93bfda632e4b73951ae66ad7743cfe51b96 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Jan 2024 14:27:19 +1100 Subject: [PATCH 065/339] Adds hints to traits - 19 1 24 --- code/__DEFINES/xenoartifact.dm | 6 +++ .../components/xenoartifact.dm | 5 +- .../xenoarchaeology/traits/activators.dm | 16 +++++- code/modules/xenoarchaeology/traits/majors.dm | 8 +++ code/modules/xenoarchaeology/traits/minors.dm | 50 ++++++++++++++++++- code/modules/xenoarchaeology/traits/traits.dm | 7 +++ .../tgui/interfaces/XenoartifactLabeler.js | 8 +-- 7 files changed, 93 insertions(+), 7 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index 3cdda64cf5779..dd18d25d92e0b 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -57,6 +57,12 @@ #define XENOA_ACTIVATION_TOUCH "XENOA_ACTIVATION_TOUCH" #define XENOA_ACTIVATION_CONTACT "XENOA_ACTIVATION_CONTACT" +///Common defines for trait hints +#define XENOA_TRAIT_HINT_MATERIAL list("icon" = "eye", "desc" = "This trait can appear in the artifact's material description.") +#define XENOA_TRAIT_HINT_INHAND list("icon" = "search", "desc" = "This trait can be detected by 'feeling' the artifact.") +#define XENOA_TRAIT_HINT_TRIGGER(X) list("icon" = "wrench", "desc" = "This trait can be triggered with a [X].") +#define XENOA_TRAIT_HINT_DETECT(X) list("icon" = "search", "desc" = "This trait can be detected with a [X].") + /* old content */ diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 1ea8e9cce1f7d..4fb5587c563be 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -408,6 +408,7 @@ instability_step = 0.5 texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") mask_icon_states = list("mask-bananium1") + custom_price = 500 /datum/xenoartifact_material/bananium/get_trait_list() return GLOB.xenoa_bananium_traits @@ -418,6 +419,7 @@ instability_step = 25 texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") mask_icon_states = list("mask-uranium1") + custom_price = 450 /datum/xenoartifact_material/uranium/get_trait_list() return GLOB.xenoa_uranium_traits @@ -428,6 +430,7 @@ instability_step = 5 texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") mask_icon_states = list("mask-plasma1") + custom_price = 250 /datum/xenoartifact_material/plasma/get_trait_list() return GLOB.xenoa_plasma_traits @@ -448,7 +451,7 @@ material_color = "#f1ffca" instability_step = 50 texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") - mask_icon_states = list("mask-pearl1") //This is pretty much a place holder, since artificial artifacts use the item as a mask + custom_price = 500 //Calcified /datum/xenoartifact_material/calcified diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index cd80998085f59..cae3dd62cd0f3 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -80,6 +80,8 @@ return trigger_artifact(target) +/datum/xenoartifact_trait/activator/strudy/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_MATERIAL) /* Flammable This trait activates the artifact when it's lit @@ -125,7 +127,7 @@ /datum/xenoartifact_trait/activator/flammable/get_dictionary_hint() . = ..() - return list(list("icon" = "wrench", "desc" = "This trait can be triggered with a 'hot' tool.")) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_TRIGGER("'hot' tool"), list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target.")) /datum/xenoartifact_trait/activator/flammable/proc/reset_timer() if(search_cooldown_timer) @@ -183,6 +185,10 @@ parent.trigger() search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) +/datum/xenoartifact_trait/activator/timed/get_dictionary_hint() + . = ..() + return list(list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target, periodically.")) + /datum/xenoartifact_trait/activator/timed/proc/reset_timer() if(search_cooldown_timer) deltimer(search_cooldown_timer) @@ -247,6 +253,10 @@ to_chat(user, "[item] detects an input frequency & code of [FREQ_SIGNALER]-[code]!") return ..() +/datum/xenoartifact_trait/activator/signal/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target.")) + /datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) if(!signal) return @@ -294,6 +304,10 @@ to_chat(user, "[item] detects a capacitive draw of 25%!") return ..() +/datum/xenoartifact_trait/activator/cell/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TRIGGER("charged cell"), XENOA_TRAIT_HINT_DETECT("multitool")) + /* Weighted This trait activates the artifact when it is picked up diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index bbfeb80b2a574..524d052178c44 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -95,6 +95,10 @@ M.forceMove(get_turf(AM)) return ..() +/datum/xenoartifact_trait/major/hollow/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Temporal Creates a timestop object at the position of the artfiact @@ -154,6 +158,10 @@ dump_targets() clear_focus() +/datum/xenoartifact_trait/major/projectile/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Bestialized The artifact shoots the target with a random projectile diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 4dc1d316c9df2..eb81c7dcc7959 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -56,6 +56,10 @@ target.vis_contents -= particle_holder QDEL_NULL(particle_holder) +/datum/xenoartifact_trait/minor/charged/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND) + /* Capacitive Gives the artifact extra uses @@ -90,6 +94,10 @@ current_charge = max_charges parent.cooldown_disabled = FALSE +/datum/xenoartifact_trait/minor/capacitive/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Dense Makes the artifact behave like a structure @@ -128,6 +136,10 @@ A.interaction_flags_item = old_item_flag return ..() +/datum/xenoartifact_trait/minor/dense/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Sharp Makes the artifact sharp @@ -170,6 +182,10 @@ A.attack_verb = old_verbs return ..() +/datum/xenoartifact_trait/minor/sharp/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Cooling Decreases the artifact's initial cooldown by XENOA_TRAIT_COOLDOWN_EXTRA_SAFE seconds @@ -197,7 +213,7 @@ return //Build particle holder particle_holder = new(parent.parent) - particle_holder.add_emitter(/obj/emitter/snow_smoke, "snow_smoke", 10) + particle_holder.add_emitter(/obj/emitter/snow_smoke, "snow_smoke", 10) //TODO: make this a proper effect, it's a placeholder for now - Racc //Layer onto parent target.vis_contents += particle_holder @@ -208,6 +224,10 @@ target.vis_contents -= particle_holder QDEL_NULL(particle_holder) +/datum/xenoartifact_trait/minor/cooling/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND) + /* Sentient Allows ghosts to control the artifact @@ -356,6 +376,10 @@ . = ..() target.alpha /= 0.7 +/datum/xenoartifact_trait/minor/delicate/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Aura Adds nearby atoms to the target list @@ -396,6 +420,10 @@ weight = 10 conductivity = 15 +/datum/xenoartifact_trait/minor/scoped/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Ringed Allows the artifact to be worn in the glove slot @@ -443,6 +471,10 @@ user.RemoveSpell(artifact_action, FALSE) +/datum/xenoartifact_trait/minor/delicate/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Shielded Makes the artifact act like a shield @@ -485,6 +517,10 @@ A.block_upgrade_walk = old_block_upgrade return ..() +/datum/xenoartifact_trait/minor/shielded/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Aerodynamic Makes the artifact easy to throw @@ -512,6 +548,10 @@ A.throw_range = old_throw_range return ..() +/datum/xenoartifact_trait/minor/aerodynamic/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Signaller Sends a signal when the artifact is activated @@ -588,6 +628,10 @@ var/rand_time = rand(5, 15) SECONDS addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) +/datum/xenoartifact_trait/minor/signaller/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency")) + /* Anchor Anchors the artifact @@ -653,6 +697,10 @@ QDEL_NULL(slip_comp) return ..() +/datum/xenoartifact_trait/slippery/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_MATERIAL) + /* Haunted Allows the artifact to be controlled by ghosts diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index f43e6c222df63..ece6f9fbc99c3 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -32,6 +32,9 @@ ///Extra target range we add to the artifact var/extra_target_range = 0 + ///How much extra value does this trait apply to the artifact - It's important this is applied before anyone can use stickers on the artifact + var/extra_value = 0 + ///Characteristics for deduction var/weight = 1 //KG var/conductivity = 1 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable @@ -53,7 +56,9 @@ //Appearance generate_trait_appearance(parent.parent) //Stats + var/atom/A = parent.parent parent.target_range += extra_target_range + A.custom_price += extra_value //Remeber to call this before setting a new parent /datum/xenoartifact_trait/proc/remove_parent(datum/source) @@ -63,7 +68,9 @@ if(parent) UnregisterSignal(parent, COMSIG_PARENT_QDELETING) UnregisterSignal(parent, XENOA_TRIGGER) + var/atom/A = parent.parent parent.target_range -= extra_target_range + A.custom_price -= extra_value cut_trait_appearance(parent.parent) //TODO: If we ever need trait pearls to keep the initialized trait, remove this - Racc qdel(src) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 82ff1b47c9e92..e5b86aa717086 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -45,7 +45,7 @@ const XenoartifactlabelerTraits = (props, context) => { return ( -
      +
      {sorted_activators.map((trait) => ( {
      -
      +
      {sorted_minors.map((trait) => ( {
      -
      +
      {sorted_majors.map((trait) => ( {
      -
      +
      {sorted_malfs.map((trait) => ( Date: Fri, 19 Jan 2024 15:31:28 +1100 Subject: [PATCH 066/339] Better safety checking - 19 1 24 --- _maps/map_files/debug/runtimestation.dmm | 928 +++++++++++++++--- .../tools/console/xenoarchaeology_console.dm | 2 +- .../tools/xenoarchaeology_labeler.dm | 4 + .../xenoarchaeology/traits/activators.dm | 37 +- .../tgui/interfaces/XenoartifactConsole.js | 2 +- .../tgui/interfaces/XenoartifactLabeler.js | 1 + 6 files changed, 854 insertions(+), 120 deletions(-) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index b0371d2d4406c..792c1a1ee7c60 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -233,6 +233,17 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/gravity_generator) +"aJ" = ( +/obj/machinery/door/airlock/external{ + name = "Departure Lounge Airlock" + }, +/obj/effect/turf_decal/delivery, +/obj/structure/fans/tiny, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "aN" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -1063,10 +1074,6 @@ }, /turf/open/floor/plasteel, /area/storage/primary) -"dD" = ( -/obj/effect/landmark/observer_start, -/turf/open/floor/plasteel, -/area/storage/primary) "dE" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -1969,6 +1976,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) "fX" = ( @@ -2280,6 +2290,11 @@ }, /turf/open/floor/plasteel, /area/science) +"hl" = ( +/obj/machinery/xenoarchaeology_machine/calibrator, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/science/explab) "hD" = ( /obj/machinery/power/apc{ dir = 1; @@ -2302,6 +2317,12 @@ }, /turf/open/floor/plasteel, /area/construction) +"iu" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit/departure_lounge) "jb" = ( /obj/machinery/door/airlock, /obj/structure/cable{ @@ -2309,6 +2330,13 @@ }, /turf/open/floor/plasteel, /area/science) +"jB" = ( +/obj/machinery/computer/rdservercontrol, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "jE" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -2361,12 +2389,58 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"lq" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 10 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/bot, +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"lB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/explab) +"lT" = ( +/turf/open/floor/plasteel/dark, +/area/science/explab) "lX" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"mb" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/structure/railing{ + dir = 9 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/end{ + dir = 1 + }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"mc" = ( +/turf/closed/wall/r_wall, +/area/science/explab) "mm" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2376,6 +2450,11 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"mt" = ( +/obj/item/xenoartifact, +/obj/effect/turf_decal/box, +/turf/open/floor/engine, +/area/science/explab) "mG" = ( /obj/machinery/light, /obj/structure/closet/secure_closet/hos{ @@ -2393,12 +2472,39 @@ }, /turf/open/floor/plasteel, /area/bridge) +"mV" = ( +/obj/machinery/vending/wardrobe/science_wardrobe, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "nq" = ( /obj/effect/turf_decal/stripes/corner{ dir = 8 }, /turf/open/floor/plasteel, /area/storage/primary) +"nr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/engine, +/area/science/explab) +"nt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/railing{ + dir = 5 + }, +/obj/item/kirbyplants/random, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "nw" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -2429,10 +2535,40 @@ }, /turf/open/floor/plasteel, /area/bridge) +"oc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "ou" = ( /obj/machinery/airalarm/directional/west, /turf/open/floor/plating, /area/engine/atmos) +"ow" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/explab) +"oA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/space) "oV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2467,11 +2603,105 @@ }, /turf/open/floor/plating, /area/maintenance/department/bridge) +"qp" = ( +/obj/item/radio/intercom{ + pixel_y = 21 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"qH" = ( +/obj/item/radio/intercom{ + pixel_x = 29 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"rl" = ( +/obj/structure/filingcabinet{ + pixel_x = -7 + }, +/obj/structure/filingcabinet{ + pixel_x = 7 + }, +/obj/machinery/light_switch{ + pixel_x = 23 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Research Division - Server Room"; + network = list("ss13","rd"); + pixel_x = 22 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"rO" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/science/explab) +"sv" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas, +/obj/item/tank/internals/oxygen, +/obj/item/book/manual/wiki/xenoarchaeology, +/obj/effect/turf_decal/bot, +/obj/item/healthanalyzer, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"sz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/explab) +"sA" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/research{ + name = "Experimentation Lab"; + req_one_access_txt = "8;49" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple/fourcorners/contrasted, +/turf/open/floor/plasteel/white, +/area/science/explab) "sE" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable, /turf/open/floor/plating/airless, /area/space/nearstation) +"sI" = ( +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -26 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "sT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2482,6 +2712,44 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"sY" = ( +/obj/structure/table, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/loot_jobscale/medical/first_aid_kit, +/obj/item/clothing/neck/stethoscope, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"tu" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"tP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"tT" = ( +/obj/machinery/computer/xenoarchaeology_console{ + dir = 1 + }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "ut" = ( /obj/structure/closet/secure_closet/atmospherics{ locked = 0 @@ -2491,6 +2759,22 @@ }, /turf/open/floor/plating, /area/engine/atmos) +"uz" = ( +/obj/machinery/door/airlock/maintenance{ + name = "Experimentation Lab Maintenance"; + req_one_access_txt = "8;49" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plating, +/area/science/explab) "vm" = ( /turf/closed/wall/r_wall, /area/maintenance/aft) @@ -2498,6 +2782,11 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/storage/primary) +"vG" = ( +/obj/effect/turf_decal/stripes/line, +/obj/effect/landmark/observer_start, +/turf/open/floor/plasteel/dark, +/area/science/explab) "vP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2510,6 +2799,21 @@ /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) +"wx" = ( +/obj/structure/closet/emcloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/requests_console{ + department = "Science"; + departmentType = 2; + name = "Science Requests Console"; + pixel_x = -30; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "wO" = ( /obj/machinery/light, /obj/machinery/clonepod/prefilled, @@ -2602,9 +2906,56 @@ dir = 1 }, /area/medical/medbay) +"BP" = ( +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/science/server"; + dir = 1; + name = "Research Division Server Room APC"; + pixel_y = 24 + }, +/obj/structure/railing{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"BY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/science/explab) "Ce" = ( /turf/open/floor/plasteel, /area/medical/chemistry) +"Cr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/effect/landmark/xeno_spawn, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "Ct" = ( /obj/structure/closet/syndicate/resources/everything, /turf/open/floor/plasteel, @@ -2642,6 +2993,31 @@ /obj/machinery/modular_fabricator/component_printer, /turf/open/floor/plasteel, /area/medical/chemistry) +"Dg" = ( +/obj/structure/rack, +/obj/item/multitool{ + pixel_x = 3 + }, +/obj/item/assembly/igniter, +/obj/item/analyzer, +/obj/item/stock_parts/cell/high{ + charge = 100; + maxcharge = 15000 + }, +/obj/item/geiger_counter, +/obj/item/assembly/signaler{ + pixel_x = -8; + pixel_y = 5 + }, +/obj/effect/turf_decal/bot, +/obj/structure/extinguisher_cabinet{ + pixel_x = 27 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "EG" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -2651,6 +3027,11 @@ }, /turf/open/floor/plasteel, /area/construction) +"EL" = ( +/obj/structure/chair/office/light, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/plasteel/white, +/area/science/explab) "ES" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2682,20 +3063,97 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"GL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "Ha" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, /turf/open/floor/plasteel/dark, /area/engine/gravity_generator) +"Hb" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/structure/railing/corner{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"Hl" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/space) +"HS" = ( +/obj/structure/sign/warning/explosives, +/turf/closed/wall/r_wall, +/area/science/explab) "If" = ( /obj/machinery/rnd/production/techfab/department, /turf/open/floor/plasteel, /area/science) +"Is" = ( +/obj/structure/table, +/obj/item/folder/white{ + pixel_x = 4; + pixel_y = -3 + }, +/obj/item/pen, +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/dark_blue/filled/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"IU" = ( +/obj/structure/closet/firecloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, +/area/science/explab) "JF" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, /turf/open/floor/plasteel, /area/medical/chemistry) +"Kb" = ( +/turf/open/floor/plasteel/stairs{ + dir = 1 + }, +/area/science/explab) "Kx" = ( /obj/structure/table, /obj/item/analyzer, @@ -2703,10 +3161,91 @@ /obj/machinery/light, /turf/open/floor/plating, /area/engine/atmos) +"KX" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/structure/closet/crate/science, +/obj/effect/turf_decal/bot, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "Ly" = ( /obj/machinery/chem_dispenser/chem_synthesizer, /turf/open/floor/plasteel/dark, /area/medical/chemistry) +"LE" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"LP" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/railing/corner{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/purple/filled/corner{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) +"LQ" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/space) +"LY" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable/yellow{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/science/explab) +"Mg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4; + layer = 3.2 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 5 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "MT" = ( /obj/structure/closet/secure_closet/captains{ locked = 0 @@ -2749,6 +3288,21 @@ /obj/machinery/door/airlock/external/glass, /turf/open/floor/plating, /area/medical/medbay) +"QG" = ( +/obj/structure/table, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/xenoarchaeology_labeler, +/turf/open/floor/plasteel/dark, +/area/science/explab) "QO" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/effect/turf_decal/tile/blue/half/contrasted{ @@ -2768,6 +3322,23 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/aft) +"Ro" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/machinery/shower{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/blobstart, +/turf/open/floor/noslip/white, +/area/science/explab) +"Rz" = ( +/obj/machinery/xenoarchaeology_machine/conductor, +/obj/effect/turf_decal/delivery, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "RC" = ( /obj/machinery/power/rtg/advanced, /obj/structure/cable{ @@ -2775,6 +3346,22 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) +"RJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/science/explab) +"RY" = ( +/obj/effect/turf_decal/stripes/corner, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley IV"; + real_name = "Pugley IV" + }, +/obj/structure/bed/dogbed, +/turf/open/floor/plasteel/dark, +/area/science/explab) "Sj" = ( /obj/structure/table/optable, /obj/effect/turf_decal/tile/blue{ @@ -2782,6 +3369,24 @@ }, /turf/open/floor/plasteel/white/corner, /area/medical/medbay) +"SZ" = ( +/obj/effect/turf_decal/trimline/purple/filled/warning{ + dir = 8 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "Tt" = ( /turf/open/floor/plating, /area/maintenance/aft) @@ -2792,10 +3397,44 @@ /obj/item/healthanalyzer/advanced, /turf/open/floor/plasteel, /area/medical/medbay) +"Uu" = ( +/obj/machinery/holopad, +/obj/effect/turf_decal/box, +/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "Vg" = ( /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/central) +"Vp" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/science/explab) +"Vq" = ( +/obj/structure/closet/radiation, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 8 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "Vy" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2809,10 +3448,30 @@ /obj/structure/fans/tiny, /turf/open/floor/plasteel, /area/engine/engineering) +"VV" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/effect/turf_decal/bot, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/science/explab) "Wh" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/atmos) +"WJ" = ( +/obj/structure/closet/bombcloset, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 9 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/white, +/area/science/explab) "WT" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2840,6 +3499,19 @@ }, /turf/open/floor/plasteel, /area/engine/atmos) +"Xr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/railing{ + dir = 4; + layer = 3.2 + }, +/obj/effect/turf_decal/trimline/purple/filled/line{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/explab) "XC" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2849,6 +3521,11 @@ }, /turf/open/floor/plasteel, /area/science) +"XQ" = ( +/obj/machinery/xenoarchaeology_machine/scale, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/science/explab) "XR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -2873,6 +3550,20 @@ }, /turf/open/floor/plasteel, /area/science) +"YB" = ( +/obj/effect/turf_decal/trimline/purple/filled/line, +/obj/structure/sink{ + dir = 1 + }, +/obj/machinery/light, +/obj/machinery/power/apc{ + areastring = "/area/science/explab"; + name = "Experimentation Lab APC"; + pixel_y = -24 + }, +/obj/structure/cable/yellow, +/turf/open/floor/plasteel/white, +/area/science/explab) "YI" = ( /obj/machinery/light{ dir = 1 @@ -2889,6 +3580,13 @@ /obj/machinery/suit_storage_unit/ce, /turf/open/floor/plasteel, /area/engine/atmos) +"ZQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/purple/filled/line, +/turf/open/floor/plasteel/white, +/area/science/explab) "ZW" = ( /obj/machinery/camera/autoname, /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ @@ -7993,7 +8691,7 @@ cV fA dt dJ -dD +dJ dJ dI dJ @@ -8464,14 +9162,14 @@ fG fH fR fW -fO -fO -fb -aa -aa -aa -aa -aa +iu +iu +aJ +Hl +Hl +Hl +Hl +LQ aa aa aa @@ -8563,7 +9261,7 @@ aa aa aa aa -aa +oA aa aa aa @@ -8655,7 +9353,7 @@ aa aa aa aa -aa +oA aa aa aa @@ -8747,7 +9445,7 @@ aa aa aa aa -aa +oA aa aa aa @@ -8832,17 +9530,17 @@ eu eu et aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +mc +mc +mc +mc +mc +mc +sA +HS +mc +BP aa aa aa @@ -8924,17 +9622,17 @@ fm ev et aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +WJ +Vq +IU +wx +mV +sI +SZ +lq +mc +jB aa aa aa @@ -9016,17 +9714,17 @@ fh fh et aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +Mg +Xr +Xr +Xr +Xr +tP +Uu +YB +mc +Is aa aa aa @@ -9108,17 +9806,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +qp +lT +lT +lT +RY +nt +Hb +Ro +mc +rl aa aa aa @@ -9200,17 +9898,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +hl +RJ +ow +Vp +LE +Kb +GL +tu +mc +mc aa aa aa @@ -9292,17 +9990,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +XQ +sz +mt +rO +vG +Kb +Cr +EL +tT +mc aa aa aa @@ -9384,17 +10082,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +Rz +BY +lB +nr +LE +Kb +oc +ZQ +QG +mc aa aa aa @@ -9476,17 +10174,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +LY +sv +Dg +VV +KX +mb +LP +qH +sY +mc aa aa aa @@ -9568,17 +10266,17 @@ aa aa aa aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa -aa +mc +mc +mc +mc +mc +mc +mc +uz +mc +mc +mc aa aa aa diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 9c05144355abe..14e07de2ca2bf 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -88,7 +88,7 @@ return var/datum/supply_pack/SP = seller?.buy_stock(locate(params["item_id"])) //Ship the pack - var/datum/supply_order/SO = new(SP, null, null, null, "Research Material Requisition", D) + var/datum/supply_order/SO = new(SP, "NA", "NA", null, "Research Material Requisition", D) SO.generateRequisition(get_turf(src)) SSsupply.shoppinglist += SO //Take our toll diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 7f27ebfb1b561..9bae08a49fac0 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -199,6 +199,10 @@ sticker_icon_state = "[icon_state]_small" return ..() +/obj/item/sticker/xenoartifact_label/ComponentInitialize() + . = ..() + AddComponent(/datum/component/anti_artifact) + /obj/item/sticker/xenoartifact_label/examine(mob/user) . = ..() . += examine_override diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index cae3dd62cd0f3..5d2fbff5f1c88 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -29,11 +29,15 @@ /datum/xenoartifact_trait/activator/proc/translation_type_b(datum/source, atom/item, atom/target) SIGNAL_HANDLER + if(check_item_safety(item)) + return trigger_artifact(target) /datum/xenoartifact_trait/activator/proc/translation_type_c(datum/source, atom/target, atom/item) SIGNAL_HANDLER + if(check_item_safety(item)) + return trigger_artifact(target) /datum/xenoartifact_trait/activator/proc/translation_type_d(datum/source, atom/target) @@ -44,6 +48,13 @@ return trigger_artifact(target) +/datum/xenoartifact_trait/activator/proc/check_item_safety(atom/item) + var/datum/component/anti_artifact/A = item.GetComponent(/datum/component/anti_artifact) + if(A?.charges) + A.charges -= 1 + return TRUE + return FALSE + /* Sturdy This trait activates the artifact when it's used, like a generic item @@ -65,11 +76,13 @@ RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) /datum/xenoartifact_trait/activator/strudy/translation_type_b(datum/source, atom/item, atom/target) + if(check_item_safety(item)) + return trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/strudy/translation_type_d(datum/source, atom/item, atom/target) var/atom/A = parent.parent - if(!isliving(A.loc)) + if(!isliving(A.loc) || check_item_safety(item)) return trigger_artifact(target, XENOA_ACTIVATION_TOUCH) @@ -103,7 +116,7 @@ /datum/xenoartifact_trait/activator/flammable/translation_type_b(datum/source, atom/item, atom/target) var/obj/item/I = item - if(isitem(I) && I.is_hot()) + if(isitem(I) && I.is_hot() && !check_item_safety(item)) lit = TRUE search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) @@ -185,6 +198,24 @@ parent.trigger() search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) +/datum/xenoartifact_trait/activator/timed/translation_type_b(datum/source, atom/item, atom/target) + if(check_item_safety(item)) + return + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/timed/translation_type_d(datum/source, atom/item, atom/target) + var/atom/A = parent.parent + if(!isliving(A.loc) || check_item_safety(item)) + return + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + +/datum/xenoartifact_trait/activator/timed/translation_type_a(datum/source, atom/target) + var/atom/A = parent.parent + if(A.loc == target) + trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + return + trigger_artifact(target) + /datum/xenoartifact_trait/activator/timed/get_dictionary_hint() . = ..() return list(list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target, periodically.")) @@ -295,7 +326,7 @@ /datum/xenoartifact_trait/activator/cell/translation_type_b(datum/source, atom/item, atom/target) do_hint(target, item) var/obj/item/stock_parts/cell/C = item - if(istype(C) && C.charge-(C.maxcharge*0.25) >= 0) + if(istype(C) && C.charge-(C.maxcharge*0.25) >= 0 && !check_item_safety(item)) C.use(C.maxcharge*0.25) trigger_artifact(target, XENOA_ACTIVATION_TOUCH) diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index a17e540b0c88e..bf751f495ddb3 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -40,7 +40,7 @@ const XenoartifactConsoleSellerEntry = (props, context) => {
      {`${value["dialogue"]}`}
      {stock.map((stock_list) => ( -
      act(`stock_purchase`, {item_id: stock_list["id"], seller_id: value["id"],})}/>} key={stock_list}> +
      act(`stock_purchase`, {item_id: stock_list["id"], seller_id: value["id"],})}>{`$${stock_list["cost"]}`}} key={stock_list}>
      {`${stock_list["description"]}`}
      diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index e5b86aa717086..55f0be35f5609 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -7,6 +7,7 @@ export const XenoartifactLabeler = (props, context) => { + From ed706e6737b8c370654d559e6dea33da90ecbc31 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Jan 2024 20:34:18 +1100 Subject: [PATCH 067/339] BEAMS - 19 1 24 --- _maps/_basemap.dm | 2 +- code/datums/beam.dm | 3 + .../components/xenoartifact.dm | 23 ++++++ .../tools/xenoarchaeology_labeler.dm | 8 -- .../tools/xenoarchaeology_machines.dm | 4 - .../xenoarchaeology/traits/activators.dm | 66 +++++++++------- code/modules/xenoarchaeology/traits/minors.dm | 78 ++++++++++++++----- code/modules/xenoarchaeology/traits/traits.dm | 3 +- 8 files changed, 125 insertions(+), 62 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/datums/beam.dm b/code/datums/beam.dm index 13535f0dc5bca..f33e791552e27 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -27,6 +27,8 @@ var/beam_type = /obj/effect/ebeam ///This is used as the visual_contents of beams, so you can apply one effect to this and the whole beam will look like that. never gets deleted on redrawing. var/obj/effect/ebeam/visuals + ///What color override we're using + var/color_override = "#fff" /datum/beam/New(beam_origin, beam_target, beam_icon='icons/effects/beam.dmi', beam_icon_state="b_beam", time=INFINITY, maxdistance=INFINITY, btype = /obj/effect/ebeam) origin = beam_origin @@ -93,6 +95,7 @@ break var/obj/effect/ebeam/X = new beam_type(origin_turf) X.owner = src + X.color = color_override elements += X //Assign our single visual ebeam to each ebeam's vis_contents diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 4fb5587c563be..eeebfa032d96c 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -233,6 +233,7 @@ A.charges -= 1 return //Regular target follow through + create_beam(target) targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target), TRUE) @@ -364,6 +365,28 @@ A.add_filter("outline_1", 2, outline_filter(2, "#000")) A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color)) +///Create a hint beam from the artifact to the target +/datum/component/xenoartifact/proc/create_beam(atom/movable/target) + if(!get_turf(target)) + return + var/atom/A = parent + var/datum/beam/xenoa_beam/B = new((!isturf(A.loc) ? A.loc : A), target, time=1.5 SECONDS, beam_icon='icons/obj/xenoarchaeology/xenoartifact.dmi', beam_icon_state="xenoa_beam", btype=/obj/effect/ebeam/xenoa_ebeam) + B.color_override = artifact_type.material_color + INVOKE_ASYNC(B, TYPE_PROC_REF(/datum/beam, Start)) + +/* + Artifact beam subtype +*/ + +/obj/effect/ebeam/xenoa_ebeam + name = "artifact beam" + +/datum/beam/xenoa_beam/redrawing(atom/movable/mover, atom/oldloc, direction) + . = ..() + //Add a custom check to stop the beam shooting off into infinity, artifacts fuck with default beam stuff + if(!isturf(target.loc)) + targer = get_turf(target.loc) + /* material datums */ diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 9bae08a49fac0..c9ad1543ace2c 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -41,10 +41,6 @@ major_traits = get_trait_list_names(GLOB.xenoa_majors) malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) -/obj/item/xenoarchaeology_labeler/ComponentInitialize() - . = ..() - AddComponent(/datum/component/anti_artifact) - /obj/item/xenoarchaeology_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -199,10 +195,6 @@ sticker_icon_state = "[icon_state]_small" return ..() -/obj/item/sticker/xenoartifact_label/ComponentInitialize() - . = ..() - AddComponent(/datum/component/anti_artifact) - /obj/item/sticker/xenoartifact_label/examine(mob/user) . = ..() . += examine_override diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 1994c062900ca..db878769772c2 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -10,10 +10,6 @@ var/list/held_contents = list() var/max_contents = 1 -/obj/machinery/xenoarchaeology_machine/ComponentInitialize() - . = ..() - AddComponent(/datum/component/anti_artifact) - /obj/machinery/xenoarchaeology_machine/attackby(obj/item/I, mob/living/user, params) var/list/modifiers = params2list(params) var/atom/target = get_target() diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 5d2fbff5f1c88..01b968eb6689d 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -43,7 +43,7 @@ /datum/xenoartifact_trait/activator/proc/translation_type_d(datum/source, atom/target) SIGNAL_HANDLER - var/atom/A = parent.parent + var/atom/A = parent?.parent if(!A.density) return trigger_artifact(target) @@ -68,12 +68,14 @@ /datum/xenoartifact_trait/activator/strudy/New(atom/_parent) . = ..() + if(!parent?.parent) + return //Register all the relevant signals we trigger from - RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) - RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) - RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) - RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) - RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + RegisterSignal(parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(parent?.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent?.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent?.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) + RegisterSignal(parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) /datum/xenoartifact_trait/activator/strudy/translation_type_b(datum/source, atom/item, atom/target) if(check_item_safety(item)) @@ -81,13 +83,13 @@ trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/strudy/translation_type_d(datum/source, atom/item, atom/target) - var/atom/A = parent.parent + var/atom/A = parent?.parent if(!isliving(A.loc) || check_item_safety(item)) return trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/strudy/translation_type_a(datum/source, atom/target) - var/atom/A = parent.parent + var/atom/A = parent?.parent if(A.loc == target) trigger_artifact(target, XENOA_ACTIVATION_TOUCH) return @@ -112,7 +114,9 @@ /datum/xenoartifact_trait/activator/flammable/New(atom/_parent) . = ..() - RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + if(!parent?.parent) + return + RegisterSignal(parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) /datum/xenoartifact_trait/activator/flammable/translation_type_b(datum/source, atom/item, atom/target) var/obj/item/I = item @@ -126,7 +130,7 @@ return ..() if(search_cooldown_timer) return - for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + for(var/atom/target in oview(parent.target_range, get_turf(parent?.parent))) //Only add mobs if(!ismob(target)) continue @@ -164,15 +168,15 @@ /datum/xenoartifact_trait/activator/timed/New(atom/_parent) . = ..() + if(!parent?.parent) + return //Register all the relevant signals we trigger from - RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) - RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) - RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) - RegisterSignal(parent.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) - RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + RegisterSignal(parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(parent?.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent?.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + RegisterSignal(parent?.parent, COMSIG_ITEM_AFTERATTACK, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_c)) + RegisterSignal(parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) -/datum/xenoartifact_trait/activator/timed/New(atom/_parent) - . = ..() search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) @@ -187,8 +191,8 @@ return if(search_cooldown_timer) return - playsound(get_turf(parent.parent), 'sound/effects/clock_tick.ogg', 60, TRUE) - for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + playsound(get_turf(parent?.parent), 'sound/effects/clock_tick.ogg', 60, TRUE) + for(var/atom/target in oview(parent.target_range, get_turf(parent?.parent))) //Only add mobs if(!ismob(target)) continue @@ -204,13 +208,13 @@ trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/timed/translation_type_d(datum/source, atom/item, atom/target) - var/atom/A = parent.parent + var/atom/A = parent?.parent if(!isliving(A.loc) || check_item_safety(item)) return trigger_artifact(target, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/timed/translation_type_a(datum/source, atom/target) - var/atom/A = parent.parent + var/atom/A = parent?.parent if(A.loc == target) trigger_artifact(target, XENOA_ACTIVATION_TOUCH) return @@ -246,6 +250,8 @@ /datum/xenoartifact_trait/activator/signal/New(atom/_parent) . = ..() + if(!parent?.parent) + return //Code code = rand(0, 100) //Signal @@ -267,7 +273,7 @@ if(!ismovable(target)) return //Build particle holder - particle_holder = new(parent.parent) + particle_holder = new(parent?.parent) particle_holder.add_emitter(/obj/emitter/sonar, "sonar", 9) //Layer onto parent target.vis_contents += particle_holder @@ -293,7 +299,7 @@ return if(signal.data["code"] != code) return - for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + for(var/atom/target in oview(parent.target_range, get_turf(parent?.parent))) //Only add mobs if(!ismob(target)) continue @@ -305,7 +311,7 @@ /datum/xenoartifact_trait/activator/signal/proc/do_sonar(repeat = TRUE) if(QDELETED(src)) return - playsound(get_turf(parent.parent), 'sound/effects/ping.ogg', 60, TRUE) + playsound(get_turf(parent?.parent), 'sound/effects/ping.ogg', 60, TRUE) var/rand_time = rand(5, 15) SECONDS addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) @@ -321,7 +327,9 @@ /datum/xenoartifact_trait/activator/cell/New(atom/_parent) . = ..() - RegisterSignal(parent.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + if(!parent?.parent) + return + RegisterSignal(parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) /datum/xenoartifact_trait/activator/cell/translation_type_b(datum/source, atom/item, atom/target) do_hint(target, item) @@ -352,7 +360,9 @@ /datum/xenoartifact_trait/activator/weighted/New(atom/_parent) . = ..() - RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + if(!parent?.parent) + return + RegisterSignal(parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) /datum/xenoartifact_trait/activator/weighted/translation_type_d(datum/source, atom/target) trigger_artifact(target, XENOA_ACTIVATION_TOUCH) @@ -370,4 +380,6 @@ /datum/xenoartifact_trait/activator/pitched/New(atom/_parent) . = ..() - RegisterSignal(parent.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + if(!parent?.parent) + return + RegisterSignal(parent?.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index eb81c7dcc7959..9148a0ac6a8f0 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -28,10 +28,14 @@ /datum/xenoartifact_trait/minor/charged/New(atom/_parent) . = ..() + if(!parent?.parent) + return parent.trait_strength *= 1.25 setup_generic_touch_hint() /datum/xenoartifact_trait/minor/charged/Destroy(force, ...) + if(!parent?.parent) + return ..() parent.trait_strength /= 1.25 return ..() @@ -44,7 +48,7 @@ if(!ismovable(target)) return //Build particle holder - particle_holder = new(parent.parent) + particle_holder = new(parent?.parent) particle_holder.add_emitter(/obj/emitter/electrified, "electrified", 10) //Layer onto parent target.vis_contents += particle_holder @@ -78,6 +82,8 @@ /datum/xenoartifact_trait/minor/capacitive/New() . = ..() + if(!parent?.parent) + return current_charge = max_charges parent.cooldown_disabled = TRUE @@ -90,7 +96,7 @@ current_charge -= 1 parent.cooldown_disabled = TRUE else - playsound(get_turf(parent.parent), 'sound/machines/capacitor_charge.ogg', 50, TRUE) + playsound(get_turf(parent?.parent), 'sound/machines/capacitor_charge.ogg', 50, TRUE) current_charge = max_charges parent.cooldown_disabled = FALSE @@ -116,6 +122,8 @@ /datum/xenoartifact_trait/minor/dense/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/obj/item/A = parent.parent //Density old_density = A.density @@ -129,6 +137,8 @@ A.interaction_flags_item = INTERACT_ATOM_ATTACK_HAND /datum/xenoartifact_trait/minor/dense/Destroy(force, ...) + if(!parent?.parent) + return ..() var/obj/item/A = parent.parent A.density = old_density A.interaction_flags_atom = old_atom_flag @@ -162,6 +172,8 @@ /datum/xenoartifact_trait/minor/sharp/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/obj/item/A = parent.parent if(isitem(A)) //Sharpness @@ -175,6 +187,8 @@ A.attack_verb = attack_verbs /datum/xenoartifact_trait/minor/sharp/Destroy(force, ...) + if(!parent?.parent) + return var/obj/item/A = parent.parent if(isitem(A)) A.sharpness = old_sharp @@ -201,18 +215,20 @@ /datum/xenoartifact_trait/minor/cooling/New(atom/_parent) . = ..() + if(!parent?.parent) + return setup_generic_touch_hint() /datum/xenoartifact_trait/minor/cooling/do_hint(mob/user, atom/item) . = ..() - to_chat(user, "[parent.parent] feels cool to the touch!") + to_chat(user, "[parent?.parent] feels cool to the touch!") /datum/xenoartifact_trait/minor/cooling/generate_trait_appearance(atom/movable/target) . = ..() if(!ismovable(target)) return //Build particle holder - particle_holder = new(parent.parent) + particle_holder = new(parent?.parent) particle_holder.add_emitter(/obj/emitter/snow_smoke, "snow_smoke", 10) //TODO: make this a proper effect, it's a placeholder for now - Racc //Layer onto parent target.vis_contents += particle_holder @@ -246,7 +262,7 @@ . = ..() if(SSticker.HasRoundStarted()) get_canidate() - else + else if(parent?.parent) mob_spawner = new(parent.parent, src) /datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) @@ -259,29 +275,29 @@ sentience.key = M.ckey /datum/xenoartifact_trait/minor/sentient/proc/get_canidate() - var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [parent.parent]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) + var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [parent?.parent]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) if(LAZYLEN(candidates)) var/mob/dead/observer/O = pick(candidates) setup_sentience(O.ckey) return - mob_spawner = new(parent.parent, src) + mob_spawner = new(parent?.parent, src) /datum/xenoartifact_trait/minor/sentient/proc/setup_sentience(ckey) //Sentience - sentience = new(parent.parent) + sentience = new(parent?.parent) sentience.name = pick(GLOB.xenoa_artifact_names) - sentience.real_name = "[sentience.name] - [parent.parent]" + sentience.real_name = "[sentience.name] - [parent?.parent]" sentience.key = ckey sentience.status_flags |= GODMODE //Action - var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent.parent, parent) + var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent?.parent, parent) sentience.AddSpell(P) //Display traits to sentience to_chat(sentience, "Your traits are: \n") for(var/datum/xenoartifact_trait/T in parent.artifact_traits) to_chat(sentience, "[T.label_name]\n") sentience.add_memory(T.label_name) - playsound(get_turf(parent.parent), 'sound/items/haunted/ghostitemattack.ogg', 50, TRUE) + playsound(get_turf(parent?.parent), 'sound/items/haunted/ghostitemattack.ogg', 50, TRUE) //Cleanup QDEL_NULL(mob_spawner) @@ -361,12 +377,12 @@ . = ..() if(!.) return - playsound(get_turf(parent.parent), 'sound/effects/glass_step.ogg', 50, TRUE) + playsound(get_turf(parent?.parent), 'sound/effects/glass_step.ogg', 50, TRUE) if(current_uses) current_uses -= 1 else if(prob(50)) //After we run out of uses, there is a 50% on use for it to break parent.calcify() - playsound(get_turf(parent.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) + playsound(get_turf(parent?.parent), 'sound/effects/glassbr1.ogg', 50, TRUE) /datum/xenoartifact_trait/minor/delicate/generate_trait_appearance(atom/target) . = ..() @@ -399,11 +415,11 @@ . = ..() if(!.) return - for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + for(var/atom/target in oview(parent.target_range, get_turf(parent?.parent))) if(length(parent.targets) > (max_extra_targets * (parent.trait_strength/100))) continue //Only add mobs or items - if(!ismob(target) && !isobj(target)) + if(!ismob(target) && !isitem(target)) continue parent.register_target(target) @@ -441,6 +457,8 @@ /datum/xenoartifact_trait/minor/ringed/New(atom/_parent) . = ..() + if(!parent?.parent) + return //Artifact action artifact_action = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent.parent, parent) //Item equipping @@ -453,16 +471,18 @@ RegisterSignal(A, COMSIG_ITEM_DROPPED, PROC_REF(drop_action)) /datum/xenoartifact_trait/minor/ringed/Destroy(force, ...) + QDEL_NULL(artifact_action) + if(!parent?.parent) + return ..() var/obj/item/A = parent.parent if(isitem(A)) A.slot_flags = old_wearable - QDEL_NULL(artifact_action) return ..() /datum/xenoartifact_trait/minor/ringed/proc/equip_action(datum/source, mob/equipper, slot) SIGNAL_HANDLER - var/obj/item/A = parent.parent + var/obj/item/A = parent?.parent if(isitem(A) && A.slot_flags & slot) equipper.AddSpell(artifact_action) @@ -497,6 +517,8 @@ /datum/xenoartifact_trait/minor/shielded/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/obj/item/A = parent.parent if(isitem(A)) //Level @@ -510,6 +532,8 @@ A.block_upgrade_walk = 1 /datum/xenoartifact_trait/minor/shielded/Destroy(force, ...) + if(!parent?.parent) + return ..() var/obj/item/A = parent.parent if(isitem(A)) A.block_level = old_block_level @@ -537,12 +561,16 @@ /datum/xenoartifact_trait/minor/aerodynamic/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/atom/movable/A = parent.parent if(ismovable(A)) old_throw_range = A.throw_range A.throw_range = 9 /datum/xenoartifact_trait/minor/aerodynamic/Destroy(force, ...) + if(!parent?.parent) + return ..() var/atom/movable/A = parent.parent if(ismovable(A)) A.throw_range = old_throw_range @@ -602,7 +630,7 @@ . = ..() if(!ismovable(target)) return - particle_holder = new(parent.parent) + particle_holder = new(parent?.parent) particle_holder.add_emitter(/obj/emitter/sonar/out, "sonar", 10) target.vis_contents += particle_holder @@ -624,7 +652,7 @@ /datum/xenoartifact_trait/minor/signaller/proc/do_sonar(repeat = TRUE) if(QDELETED(src)) return - playsound(get_turf(parent.parent), 'sound/effects/ping.ogg', 60, TRUE) + playsound(get_turf(parent?.parent), 'sound/effects/ping.ogg', 60, TRUE) var/rand_time = rand(5, 15) SECONDS addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) @@ -646,11 +674,15 @@ /datum/xenoartifact_trait/minor/anchor/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/atom/movable/AM = parent.parent if(ismovable(AM)) RegisterSignal(AM, COMSIG_ATOM_TOOL_ACT(TOOL_WRENCH), PROC_REF(toggle_anchor)) /datum/xenoartifact_trait/minor/anchor/Destroy(force, ...) + if(!parent?.parent) + return ..() var/atom/movable/AM = parent.parent if(ismovable(AM)) AM.anchored = FALSE @@ -665,7 +697,7 @@ /datum/xenoartifact_trait/minor/anchor/proc/toggle_anchor(datum/source, mob/living/user, obj/item/I, list/recipes) SIGNAL_HANDLER - var/atom/movable/AM = parent.parent + var/atom/movable/AM = parent?.parent //handle being held if(isliving(AM.loc)) var/mob/living/M = AM.loc @@ -690,6 +722,8 @@ /datum/xenoartifact_trait/minor/slippery/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/atom/A = parent.parent slip_comp = A.AddComponent(/datum/component/slippery, 60) @@ -715,6 +749,8 @@ /datum/xenoartifact_trait/minor/haunted/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/atom/A = parent.parent controller = A._AddComponent(list(/datum/component/deadchat_control, "democracy", list( "up" = CALLBACK(src, PROC_REF(haunted_step), A, NORTH), @@ -737,7 +773,7 @@ /datum/xenoartifact_trait/minor/haunted/proc/activate_parent() //Find a target - for(var/atom/target in oview(parent.target_range, get_turf(parent.parent))) + for(var/atom/target in oview(parent.target_range, get_turf(parent?.parent))) parent.register_target(target, TRUE) parent.trigger(TRUE) return diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index ece6f9fbc99c3..9894183d7b76f 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -41,7 +41,8 @@ /datum/xenoartifact_trait/New(atom/_parent) . = ..() - register_parent(_parent) + if(_parent) + register_parent(_parent) /datum/xenoartifact_trait/Destroy(force, ...) . = ..() From 96df53b4b63f893d8b41a18825c103c473e04bc8 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Jan 2024 21:10:26 +1100 Subject: [PATCH 068/339] Base for wiremod - 19 1 24 --- beestation.dme | 1 + .../wiremod/components/action/artifact.dm | 28 +++++++++++++++++++ .../components/xenoartifact.dm | 4 +-- .../tools/xenoarchaeology_machines.dm | 3 +- .../xenoarchaeology/traits/activators.dm | 1 + .../xenoarchaeology/traits/malfunctions.dm | 2 ++ code/modules/xenoarchaeology/traits/traits.dm | 6 ++++ 7 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 code/modules/wiremod/components/action/artifact.dm diff --git a/beestation.dme b/beestation.dme index aeb8d54e6dbd1..e38257fd3b0fb 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4073,6 +4073,7 @@ #include "code\modules\wiremod\components\abstract\compare.dm" #include "code\modules\wiremod\components\abstract\indexer.dm" #include "code\modules\wiremod\components\abstract\module.dm" +#include "code\modules\wiremod\components\action\artifact.dm" #include "code\modules\wiremod\components\action\light.dm" #include "code\modules\wiremod\components\action\mmi.dm" #include "code\modules\wiremod\components\action\pathfind.dm" diff --git a/code/modules/wiremod/components/action/artifact.dm b/code/modules/wiremod/components/action/artifact.dm new file mode 100644 index 0000000000000..44dfd792bb1bd --- /dev/null +++ b/code/modules/wiremod/components/action/artifact.dm @@ -0,0 +1,28 @@ +/** + * # Artifact Component + * + * Works like an artifact, requires xenopearls to function, essentially + */ +/obj/item/circuit_component/artifact + display_name = "Simulated Artifact" + desc = "A component that simulates a xenoartifact." + circuit_flags = CIRCUIT_FLAG_INPUT_SIGNAL|CIRCUIT_FLAG_OUTPUT_SIGNAL + ///The target the artifact is triggering on + var/datum/port/input/target + ///Ref to the artifact component + var/datum/component/xenoartifact/artifact_comp + +/obj/item/circuit_component/artifact/ComponentInitialize() + . = ..() + artifact_comp = AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, null, FALSE, FALSE) + +/obj/item/circuit_component/artifact/get_ui_notices() + . = ..() + +/obj/item/circuit_component/artifact/populate_ports() + target = add_input_port("Target", PORT_TYPE_ATOM, trigger = null) + +/obj/item/circuit_component/artifact/input_received(datum/port/input/port) + if(target.value) + artifact_comp.register_target(target.value) + artifact_comp.trigger() diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index eeebfa032d96c..2abe77de6286f 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -152,7 +152,7 @@ for(var/i in artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) artifact_traits[i] -= T - if(make_pearls) + if(make_pearls && T.can_pearl) new /obj/item/trait_pearl(get_turf(parent), T.type) if(!QDELETED(T)) qdel(T) @@ -385,7 +385,7 @@ . = ..() //Add a custom check to stop the beam shooting off into infinity, artifacts fuck with default beam stuff if(!isturf(target.loc)) - targer = get_turf(target.loc) + target = get_turf(target.loc) /* material datums diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index db878769772c2..0ef53675e9507 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -155,8 +155,7 @@ for(var/i in X.artifact_traits) for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) if(!(locate(T) in L.traits)) - //Forgive malfunctions - this is readable, forgive the nesting - if(!istype(T, /datum/xenoartifact_trait/malfunction)) + if(T.contribute_calibration) solid_as = FALSE //TODO: make this calcify the artifact - Racc if(!solid_as) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 01b968eb6689d..2604bf6e7d987 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -10,6 +10,7 @@ register_targets = FALSE weight = 8 conductivity = 0 + can_pearl = FALSE ///Do we override the artifact's generic cooldown? var/override_cooldown = FALSE diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index a78a7630e0408..df9f7eea3500e 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -10,6 +10,8 @@ register_targets = FALSE weight = 7 conductivity = 0 + contribute_calibration = FALSE + can_pearl = FALSE /* Parallel Bearspace Retrieval diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 9894183d7b76f..f51ca48dad16a 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -35,6 +35,12 @@ ///How much extra value does this trait apply to the artifact - It's important this is applied before anyone can use stickers on the artifact var/extra_value = 0 + ///Does this trait contribute to calibration + var/contribute_calibration = TRUE + + ///Can this trait be made a pearl? + var/can_pearl = TRUE + ///Characteristics for deduction var/weight = 1 //KG var/conductivity = 1 //microsiemens per centimeter - I had to look this up - Don't worry about making this accurate / reasonable From 22c4c72beeda1366a7ea72276cfc6888722af09a Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Jan 2024 22:13:00 +1100 Subject: [PATCH 069/339] Now make it work - 19 1 24 --- _maps/_basemap.dm | 2 +- beestation.dme | 2 +- code/__DEFINES/traits.dm | 2 +- .../components/{action => atom}/artifact.dm | 7 ++-- .../components/xenoartifact.dm | 16 ++++++--- .../tools/xenoarchaeology_labeler.dm | 2 ++ .../tools/xenoarchaeology_machines.dm | 33 ++++++++++++------- .../xenoarchaeology/traits/activators.dm | 19 +++++++---- code/modules/xenoarchaeology/traits/minors.dm | 4 ++- 9 files changed, 58 insertions(+), 29 deletions(-) rename code/modules/wiremod/components/{action => atom}/artifact.dm (80%) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 9499d3e8cb593..bf3b820460161 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/beestation.dme b/beestation.dme index e38257fd3b0fb..80e5425d4b257 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4073,7 +4073,6 @@ #include "code\modules\wiremod\components\abstract\compare.dm" #include "code\modules\wiremod\components\abstract\indexer.dm" #include "code\modules\wiremod\components\abstract\module.dm" -#include "code\modules\wiremod\components\action\artifact.dm" #include "code\modules\wiremod\components\action\light.dm" #include "code\modules\wiremod\components\action\mmi.dm" #include "code\modules\wiremod\components\action\pathfind.dm" @@ -4081,6 +4080,7 @@ #include "code\modules\wiremod\components\action\radio.dm" #include "code\modules\wiremod\components\action\soundemitter.dm" #include "code\modules\wiremod\components\action\speech.dm" +#include "code\modules\wiremod\components\atom\artifact.dm" #include "code\modules\wiremod\components\atom\direction.dm" #include "code\modules\wiremod\components\atom\gps.dm" #include "code\modules\wiremod\components\atom\health.dm" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index ff2a58cba765b..dd50b317ccfce 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -289,8 +289,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_FISH_SAFE_STORAGE "fish_case" //Fish in this won't die #define TRAIT_FISH_CASE_COMPATIBILE "fish_case_compatibile" //Stuff that can go inside fish cases #define TRAIT_NEEDS_TWO_HANDS "needstwohands" // The items needs two hands to be carried - #define TRAIT_AI_BAGATTACK "bagattack" // This atom can ignore the "is on a turf" check for simple AI datum attacks, allowing them to attack from bags or lockers as long as any other conditions are met +#define TRAIT_ARTIFACT_IGNORE "artifact_ignore" //This item is compltely ignored by artifacts, this is different to anti-artifact /// Allows heretics to cast their spells. #define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" diff --git a/code/modules/wiremod/components/action/artifact.dm b/code/modules/wiremod/components/atom/artifact.dm similarity index 80% rename from code/modules/wiremod/components/action/artifact.dm rename to code/modules/wiremod/components/atom/artifact.dm index 44dfd792bb1bd..a0107079113dc 100644 --- a/code/modules/wiremod/components/action/artifact.dm +++ b/code/modules/wiremod/components/atom/artifact.dm @@ -18,11 +18,12 @@ /obj/item/circuit_component/artifact/get_ui_notices() . = ..() + . += create_ui_notice("Speech Cooldown", "orange", "stopwatch") /obj/item/circuit_component/artifact/populate_ports() - target = add_input_port("Target", PORT_TYPE_ATOM, trigger = null) + target = add_input_port("Target", PORT_TYPE_ATOM) /obj/item/circuit_component/artifact/input_received(datum/port/input/port) - if(target.value) - artifact_comp.register_target(target.value) + if(target?.value) + artifact_comp.register_target(target.value, FALSE, XENOA_ACTIVATION_CONTACT) artifact_comp.trigger() diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 2abe77de6286f..68366715a7177 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -86,6 +86,10 @@ ///Do we play a sound? - This is mostly here for admins to disable when they're doing gimmicks var/play_hint_sound = TRUE + ///States + var/calcified = FALSE + var/calibrated = FALSE + /datum/component/xenoartifact/Initialize(type, list/traits, _do_appearance = TRUE, _do_mask = TRUE) . = ..() generate_xenoa_statics() @@ -172,7 +176,8 @@ for(var/i in GLOB.xenoartifact_trait_priorities) SEND_SIGNAL(src, XENOA_TRIGGER, i) //Malfunctions - handle_malfunctions() + if(!calibrated) + handle_malfunctions() //Cleanup targets for(var/atom/A in targets) unregister_target(A) @@ -211,7 +216,7 @@ focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) -/datum/component/xenoartifact/proc/register_target(atom/target, force, type) +/datum/component/xenoartifact/proc/register_target(atom/target, force, type = XENOA_ACTIVATION_CONTACT) //Don't register new targets unless the cooldown is finished if(use_cooldown_timer && !force) return @@ -322,6 +327,7 @@ artifact_type = new /datum/xenoartifact_material/calcified() var/old_mask = do_mask do_mask = FALSE + calcified = TRUE build_material_appearance() do_mask = old_mask //Disable artifact @@ -332,7 +338,7 @@ /datum/component/xenoartifact/proc/calibrate() var/atom/A = parent //Stats - artifact_type.instability_step = 0 + calibrated = TRUE //Effect var/mutable_appearance/MA = mutable_appearance('icons/obj/xenoarchaeology/xenoartifact.dmi', "calibrated") MA.blend_mode = BLEND_ADD @@ -367,7 +373,7 @@ ///Create a hint beam from the artifact to the target /datum/component/xenoartifact/proc/create_beam(atom/movable/target) - if(!get_turf(target)) + if(!get_turf(target) || locate(parent) in target.contents) return var/atom/A = parent var/datum/beam/xenoa_beam/B = new((!isturf(A.loc) ? A.loc : A), target, time=1.5 SECONDS, beam_icon='icons/obj/xenoarchaeology/xenoartifact.dmi', beam_icon_state="xenoa_beam", btype=/obj/effect/ebeam/xenoa_ebeam) @@ -384,7 +390,7 @@ /datum/beam/xenoa_beam/redrawing(atom/movable/mover, atom/oldloc, direction) . = ..() //Add a custom check to stop the beam shooting off into infinity, artifacts fuck with default beam stuff - if(!isturf(target.loc)) + if(!isturf(target?.loc)) target = get_turf(target.loc) /* diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index c9ad1543ace2c..aac493a9ed796 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -34,6 +34,7 @@ /obj/item/xenoarchaeology_labeler/Initialize(mapload) . = ..() + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) generate_xenoa_statics() //generate data for trait names activator_traits = get_trait_list_names(GLOB.xenoa_activators) @@ -184,6 +185,7 @@ var/old_custom_price /obj/item/sticker/xenoartifact_label/Initialize(mapload, list/_traits) + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) //Setup traits & examine desc traits = _traits if(length(traits)) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 0ef53675e9507..b88896a578f55 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -10,6 +10,10 @@ var/list/held_contents = list() var/max_contents = 1 +/obj/machinery/xenoarchaeology_machine/Initialize(mapload) + . = ..() + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) + /obj/machinery/xenoarchaeology_machine/attackby(obj/item/I, mob/living/user, params) var/list/modifiers = params2list(params) var/atom/target = get_target() @@ -145,19 +149,26 @@ var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) //We then want to find a sticker attached to it- var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents - //Then we'll check the label traits against the artifact's - if(!X || !L) + //Early checks + if(!X || !L || X?.calibrated || X?.calcified) + var/decision = "No" if(!L) say("No label detected!") - playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) - empty_contents() - continue - for(var/i in X.artifact_traits) - for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) - if(!(locate(T) in L.traits)) - if(T.contribute_calibration) - solid_as = FALSE - //TODO: make this calcify the artifact - Racc + decision = tgui_alert(user, "Do you want to continue, this will destroy [A]?", "Calcify Artifact", list("Yes", "No")) + if(decision == "No") + playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) + empty_contents() + continue + else + solid_as = FALSE + //Loop through traits and see if we're fucked or not + if(solid_as) //This is kinda wacky but it's for a player option so idc + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) + if(!(locate(T) in L.traits)) + if(T.contribute_calibration) + solid_as = FALSE + //If we're cooked if(!solid_as) X.calcify() playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 2604bf6e7d987..18d4755064c3a 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -18,9 +18,12 @@ /datum/xenoartifact_trait/activator/proc/trigger_artifact(atom/target, type = XENOA_ACTIVATION_CONTACT, force) SIGNAL_HANDLER + //Trait check - This is different from an anti artifact check and should be done here to avoid activations, this trait is a helper essentially + if(HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + return FALSE parent.register_target(target, force, type) parent.trigger() - return + return TRUE /datum/xenoartifact_trait/activator/proc/translation_type_a(datum/source, atom/target) SIGNAL_HANDLER @@ -50,10 +53,14 @@ trigger_artifact(target) /datum/xenoartifact_trait/activator/proc/check_item_safety(atom/item) + //Anti artifact check var/datum/component/anti_artifact/A = item.GetComponent(/datum/component/anti_artifact) if(A?.charges) A.charges -= 1 return TRUE + //Trait check + if(HAS_TRAIT(item, TRAIT_ARTIFACT_IGNORE)) + return TRUE return FALSE /* @@ -91,7 +98,7 @@ /datum/xenoartifact_trait/activator/strudy/translation_type_a(datum/source, atom/target) var/atom/A = parent?.parent - if(A.loc == target) + if(isliving(A.loc)) trigger_artifact(target, XENOA_ACTIVATION_TOUCH) return trigger_artifact(target) @@ -181,8 +188,8 @@ search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) -/datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, type, force) - if(force) +/datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, type, force, do_real_trigger) + if(do_real_trigger) return ..() else searching = !searching @@ -197,7 +204,7 @@ //Only add mobs if(!ismob(target)) continue - trigger_artifact(target, XENOA_ACTIVATION_CONTACT, TRUE) + trigger_artifact(target, XENOA_ACTIVATION_CONTACT, FALSE, TRUE) break if(!length(parent.targets)) parent.trigger() @@ -216,7 +223,7 @@ /datum/xenoartifact_trait/activator/timed/translation_type_a(datum/source, atom/target) var/atom/A = parent?.parent - if(A.loc == target) + if(isliving(A.loc)) trigger_artifact(target, XENOA_ACTIVATION_TOUCH) return trigger_artifact(target) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 9148a0ac6a8f0..bb92d89a4a744 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -260,9 +260,11 @@ /datum/xenoartifact_trait/minor/sentient/New(atom/_parent) . = ..() + if(!parent?.parent) + return if(SSticker.HasRoundStarted()) get_canidate() - else if(parent?.parent) + else mob_spawner = new(parent.parent, src) /datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) From ea22a705b5be8abddcc5ae6f4ef57ef9a261fbc0 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 20 Jan 2024 00:10:53 +1100 Subject: [PATCH 070/339] Compression - 19 1 24 --- .../components/xenoartifact.dm | 30 +++++++++++------- .../xenoarchaeology/traits/activators.dm | 6 +++- code/modules/xenoarchaeology/traits/minors.dm | 19 +++++++++-- icons/obj/sticker.dmi | Bin 447 -> 364 bytes 4 files changed, 41 insertions(+), 14 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 68366715a7177..583160551d299 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -224,18 +224,10 @@ if(get_dist(get_turf(parent), get_turf(target))> target_range && !force) return //Anti-artifact check - var/mob/M = target - var/slot = ~ITEM_SLOT_GLOVES - //Throw you custom clothing block logic here - switch(type) - if(XENOA_ACTIVATION_TOUCH) - slot = ITEM_SLOT_GLOVES - if(isliving(M) && M.anti_artifact_check(FALSE, slot)) + if(anti_check(target, type)) return - //Just check if the thing itself has the anti-component - var/datum/component/anti_artifact/A = target.GetComponent(/datum/component/anti_artifact) - if(A?.charges) - A.charges -= 1 + //Prexisting check + if(target & targets && !force) return //Regular target follow through create_beam(target) @@ -380,6 +372,22 @@ B.color_override = artifact_type.material_color INVOKE_ASYNC(B, TYPE_PROC_REF(/datum/beam, Start)) +/datum/component/xenoartifact/proc/anti_check(atom/target, type = XENOA_ACTIVATION_CONTACT) + var/mob/M = target + var/slot = ~ITEM_SLOT_GLOVES + //Throw you custom clothing block logic here + switch(type) + if(XENOA_ACTIVATION_TOUCH) + slot = ITEM_SLOT_GLOVES + if(isliving(M) && M.anti_artifact_check(FALSE, slot)) + return TRUE + //Just check if the thing itself has the anti-component + var/datum/component/anti_artifact/A = target.GetComponent(/datum/component/anti_artifact) + if(A?.charges && prob(A.chance)) + A.charges -= 1 + return TRUE + return FALSE + /* Artifact beam subtype */ diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 18d4755064c3a..6f923a40e8b52 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -191,7 +191,11 @@ /datum/xenoartifact_trait/activator/timed/trigger_artifact(atom/target, type, force, do_real_trigger) if(do_real_trigger) return ..() - else + else + if(HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + return FALSE + if(parent.anti_check(target, type)) + return FALSE searching = !searching /datum/xenoartifact_trait/activator/timed/process(delta_time) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index bb92d89a4a744..1ca0250ee38b2 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -262,10 +262,16 @@ . = ..() if(!parent?.parent) return + //Setup ghost canidates and mob spawners if(SSticker.HasRoundStarted()) get_canidate() else mob_spawner = new(parent.parent, src) + //Do a fancy animation + //TODO: Replace this - Racc + if(!sentience) + var/atom/A = parent.parent + A.Shake(duration = -1) /datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) QDEL_NULL(sentience) @@ -610,7 +616,7 @@ setup_generic_item_hint() if(!(locate(/datum/xenoartifact_trait/activator) in parent.artifact_traits[TRAIT_PRIORITY_ACTIVATOR])) - addtimer(CALLBACK(src, PROC_REF(do_sonar)), 5 SECONDS) + addtimer(CALLBACK(src, PROC_REF(do_sonar)), 2 SECONDS) /datum/xenoartifact_trait/minor/signaller/Destroy(force, ...) SSradio.remove_object(src, FREQ_SIGNALER) @@ -655,7 +661,7 @@ if(QDELETED(src)) return playsound(get_turf(parent?.parent), 'sound/effects/ping.ogg', 60, TRUE) - var/rand_time = rand(5, 15) SECONDS + var/rand_time = rand(6, 12) SECONDS addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) /datum/xenoartifact_trait/minor/signaller/get_dictionary_hint() @@ -760,11 +766,20 @@ "left" = CALLBACK(src, PROC_REF(haunted_step), A, WEST), "right" = CALLBACK(src, PROC_REF(haunted_step), A, EAST), "activate" = CALLBACK(src, PROC_REF(activate_parent), A)), 8 SECONDS)) + addtimer(CALLBACK(src, PROC_REF(do_wail)), 17 SECONDS) /datum/xenoartifact_trait/minor/haunted/Destroy(force, ...) QDEL_NULL(controller) return ..() +/datum/xenoartifact_trait/minor/haunted/proc/do_wail(repeat = TRUE) + if(QDELETED(src)) + return + playsound(get_turf(parent?.parent), 'sound/spookoween/ghost_whisper.ogg', 60, TRUE) + var/rand_time = rand(26, 34) SECONDS + addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) + + /datum/xenoartifact_trait/minor/haunted/proc/haunted_step(atom/movable/target, dir) //Make any mobs drop this before it moves if(isliving(target.loc)) diff --git a/icons/obj/sticker.dmi b/icons/obj/sticker.dmi index 6c24b6fcff5f628c9e590da337d9d264d1d2a961..6c9b9829cba8f7a914250b308c68ba11bbc7528b 100644 GIT binary patch delta 247 zcmVP5{nsR?A1>pF1>Er$cmbB3reBJbb6hXIM?_j0J`s@`4A`E5 zf-lhL5I}DXWPT*bKvU3+1>Eld-~em5-hp~$1X39|;~6MW)qzZ3bP!-RDnu2awTi%L xIw#DWsZQr{2zP3C2lLX1&`)#w&F`1`KXyI$6B=X?ltlml002ovPDHLkV1oX4V#WXf delta 330 zcmV-Q0k!_@0>1;07ezn>0{{R3SVwH_0000UP)t-sz`(%6b|(G9C-31(NiQG3z`+0i z{{R30|CyQp0GaB;){y`J00DGTPE!Ct=GbNc004K9O=^D;REO6Vc zTl3zCAKI7xb3c?0W1L-74})6|{wl!0z|eagm^0|W>2(JlPrVTzKreH>AC?~L{jdOz c{qO_50r$Zt8s)5rYXATM07*qoM6N<$g2>T~fdBvi From 5662aa529397ef1990b25405d8865e43de379692 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 20 Jan 2024 00:14:46 +1100 Subject: [PATCH 071/339] Compression - 19 1 24 --- code/modules/xenoarchaeology/traits/minors.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 1ca0250ee38b2..2f2d9fff44eee 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -777,7 +777,7 @@ return playsound(get_turf(parent?.parent), 'sound/spookoween/ghost_whisper.ogg', 60, TRUE) var/rand_time = rand(26, 34) SECONDS - addtimer(CALLBACK(src, PROC_REF(do_sonar)), rand_time) + addtimer(CALLBACK(src, PROC_REF(do_wail)), rand_time) /datum/xenoartifact_trait/minor/haunted/proc/haunted_step(atom/movable/target, dir) From a81e65e33d761a0e82d751be20ff46318fd0cdcc Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 20 Jan 2024 00:25:06 +1100 Subject: [PATCH 072/339] bookmark - 20 1 24 --- .../tools/xenoarchaeology_machines.dm | 3 ++- code/modules/xenoarchaeology/traits/minors.dm | 14 +++++--------- 2 files changed, 7 insertions(+), 10 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index b88896a578f55..981470c0be6fa 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -154,7 +154,8 @@ var/decision = "No" if(!L) say("No label detected!") - decision = tgui_alert(user, "Do you want to continue, this will destroy [A]?", "Calcify Artifact", list("Yes", "No")) + if(X && !X.calcified) + decision = tgui_alert(user, "Do you want to continue, this will destroy [A]?", "Calcify Artifact", list("Yes", "No")) if(decision == "No") playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) empty_contents() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 2f2d9fff44eee..1502333bfca74 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -264,14 +264,9 @@ return //Setup ghost canidates and mob spawners if(SSticker.HasRoundStarted()) - get_canidate() + INVOKE_ASYNC(src, PROC_REF(get_canidate)) else mob_spawner = new(parent.parent, src) - //Do a fancy animation - //TODO: Replace this - Racc - if(!sentience) - var/atom/A = parent.parent - A.Shake(duration = -1) /datum/xenoartifact_trait/minor/sentient/Destroy(force, ...) QDEL_NULL(sentience) @@ -286,8 +281,9 @@ var/list/mob/dead/observer/candidates = poll_ghost_candidates("Do you want to play as the maleviolent force inside the [parent?.parent]?", ROLE_SENTIENT_XENOARTIFACT, null, 8 SECONDS) if(LAZYLEN(candidates)) var/mob/dead/observer/O = pick(candidates) - setup_sentience(O.ckey) - return + if(istype(O)) //I though LAZYLEN would catch this, I guess NULL is getting injected somewhere + setup_sentience(O.ckey) + return mob_spawner = new(parent?.parent, src) /datum/xenoartifact_trait/minor/sentient/proc/setup_sentience(ckey) @@ -775,7 +771,7 @@ /datum/xenoartifact_trait/minor/haunted/proc/do_wail(repeat = TRUE) if(QDELETED(src)) return - playsound(get_turf(parent?.parent), 'sound/spookoween/ghost_whisper.ogg', 60, TRUE) + playsound(get_turf(parent?.parent), 'sound/spookoween/ghost_whisper.ogg', 40, TRUE) var/rand_time = rand(26, 34) SECONDS addtimer(CALLBACK(src, PROC_REF(do_wail)), rand_time) From 46267a0aed76c4fa865d41049c370f03c646f740 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 20 Jan 2024 21:32:01 +1100 Subject: [PATCH 073/339] More labels - 20 1 24 --- code/__DEFINES/xenoartifact.dm | 3 + .../byond_particles/emitter/spark.dm | 7 +- .../wiremod/components/atom/artifact.dm | 24 ++++++- .../components/xenoartifact.dm | 28 ++++++-- .../tools/xenoarchaeology_labeler.dm | 2 +- .../xenoarchaeology/traits/activators.dm | 2 +- code/modules/xenoarchaeology/traits/majors.dm | 67 ++++++++++++++++-- code/modules/xenoarchaeology/traits/minors.dm | 10 +-- code/modules/xenoarchaeology/traits/misc.dm | 2 + code/modules/xenoarchaeology/traits/traits.dm | 5 ++ icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 79436 -> 79929 bytes .../tgui/interfaces/XenoartifactLabeler.js | 2 +- 12 files changed, 128 insertions(+), 24 deletions(-) diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoartifact.dm index dd18d25d92e0b..66a7e95cb7aaf 100644 --- a/code/__DEFINES/xenoartifact.dm +++ b/code/__DEFINES/xenoartifact.dm @@ -62,6 +62,9 @@ #define XENOA_TRAIT_HINT_INHAND list("icon" = "search", "desc" = "This trait can be detected by 'feeling' the artifact.") #define XENOA_TRAIT_HINT_TRIGGER(X) list("icon" = "wrench", "desc" = "This trait can be triggered with a [X].") #define XENOA_TRAIT_HINT_DETECT(X) list("icon" = "search", "desc" = "This trait can be detected with a [X].") +#define XENOA_TRAIT_HINT_TWIN list("icon" = "clone", "desc" = "This trait has sister traits which perform a similar, but unqiue, action.") +#define XENOA_TRAIT_HINT_TWIN_VARIANT(X) list("icon" = "fingerprint", "desc" = "This variant will [X].") +#define XENOA_TRAIT_HINT_RANDOMISED list("icon" = "dice", "desc" = "This trait's effects may differ between instances.") /* old content diff --git a/code/modules/particles/byond_particles/emitter/spark.dm b/code/modules/particles/byond_particles/emitter/spark.dm index 95a8bfdabd920..e1cba4dcbace9 100644 --- a/code/modules/particles/byond_particles/emitter/spark.dm +++ b/code/modules/particles/byond_particles/emitter/spark.dm @@ -24,11 +24,12 @@ lifespan = 10 fade = 2 fadein = 1 - position = generator("box", list(-6, -6, -6), list(6, 6, 6), UNIFORM_RAND) + position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) - friction = 0.15 + rotation = generator("num", 0, 360, UNIFORM_RAND) + friction = 0.21 color = "#94f3ff" - scale = list(0.15, 0.15) + scale = list(0.14, 0.14) grow = list(0.1, 0.1) icon = 'icons/effects/particles/misc.dmi' icon_state = list("static_1") diff --git a/code/modules/wiremod/components/atom/artifact.dm b/code/modules/wiremod/components/atom/artifact.dm index a0107079113dc..d2cccf28e7963 100644 --- a/code/modules/wiremod/components/atom/artifact.dm +++ b/code/modules/wiremod/components/atom/artifact.dm @@ -14,7 +14,7 @@ /obj/item/circuit_component/artifact/ComponentInitialize() . = ..() - artifact_comp = AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, null, FALSE, FALSE) + artifact_comp = AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, list(), FALSE, FALSE) /obj/item/circuit_component/artifact/get_ui_notices() . = ..() @@ -27,3 +27,25 @@ if(target?.value) artifact_comp.register_target(target.value, FALSE, XENOA_ACTIVATION_CONTACT) artifact_comp.trigger() + +/obj/item/circuit_component/artifact/attackby(obj/item/I, mob/living/user, params) + . = ..() + //Pearls + var/obj/item/trait_pearl/P = I + if(istype(P)) + if(!artifact_comp.add_individual_trait(P.stored_trait)) + playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) + else + P.forceMove(src) + +/obj/item/circuit_component/artifact/screwdriver_act(mob/living/user, obj/item/I) + . = ..() + //Dump the pearls + for(var/obj/item/trait_pearl/P in contents) + P.forceMove(get_turf(src)) + //Clear the artifact's traits + for(var/i in artifact_comp.artifact_traits) + for(var/datum/xenoartifact_trait/T as() in artifact_comp.artifact_traits[i]) + artifact_comp.artifact_traits[i] -= T + qdel(T) + diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 583160551d299..c5f287b44ef67 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -208,10 +208,14 @@ return time /datum/component/xenoartifact/proc/handle_malfunctions(itterate = TRUE) + //Instability rolls if(!prob(instability)) if(itterate) instability += artifact_type.instability_step return + //Max malfunction checks, against our material + if(length(artifact_traits[TRAIT_PRIORITY_MALFUNCTION]) >= artifact_type.max_trait_malfunctions) + return var/list/focus_traits focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) @@ -227,7 +231,7 @@ if(anti_check(target, type)) return //Prexisting check - if(target & targets && !force) + if((target in targets) && !force) return //Regular target follow through create_beam(target) @@ -296,6 +300,11 @@ //Is this trait in the blacklist? if((locate(trait) in blacklisted_traits) && !force) return FALSE + //Double check our material restrictions + var/list/trait_type = list(/datum/xenoartifact_trait/activator, /datum/xenoartifact_trait/minor, /datum/xenoartifact_trait/major, /datum/xenoartifact_trait/malfunction) + for(var/datum/xenoartifact_trait/i in trait_type) + if(istype(trait, i) && length(artifact_traits[initial(i.priority)]) >= artifact_type) + return FALSE //We can either pass paths, or initialized traits if(ispath(trait)) trait = new trait(src) @@ -396,10 +405,12 @@ name = "artifact beam" /datum/beam/xenoa_beam/redrawing(atom/movable/mover, atom/oldloc, direction) - . = ..() - //Add a custom check to stop the beam shooting off into infinity, artifacts fuck with default beam stuff - if(!isturf(target?.loc)) - target = get_turf(target.loc) + //Add a custom check to stop the beam shooting off into infinity, artifact traits fuck with default beam stuff + if(!isturf(target?.loc) || oldloc?.z != target?.z) + target = get_turf(oldloc) + if(!target) + qdel(src) + return ..() /* material datums @@ -410,12 +421,15 @@ ///What color we associate with this material var/material_color = "#ff4800" - ///Trait info, how many of each trait are we allowed + ///Trait info, how many of each trait are we allowed / start with var/trait_activators = 1 var/trait_minors = 3 var/trait_majors = 1 var/trait_malfunctions = 0 + ///How many malfunctions can we gain, maximum + var/max_trait_malfunctions = 1 + ///How much we increase artifact instability by for every use var/instability_step = 0 @@ -457,6 +471,8 @@ texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") mask_icon_states = list("mask-uranium1") custom_price = 450 + trait_malfunctions = 1 + max_trait_malfunctions = 2 /datum/xenoartifact_material/uranium/get_trait_list() return GLOB.xenoa_uranium_traits diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index aac493a9ed796..427e8cdfb7de9 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -146,7 +146,7 @@ for(var/t in focus) var/datum/xenoartifact_trait/description_holder = GLOB.xenoa_all_traits_keyed[t] description_holder = new description_holder() - info_list += list(list("desc" = description_holder.label_desc, "hints" = description_holder.get_dictionary_hint())) + info_list += list(list("name" = description_holder.label_name,"desc" = description_holder.label_desc, "hints" = description_holder.get_dictionary_hint())) qdel(description_holder) /obj/item/xenoarchaeology_labeler/debug diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 6f923a40e8b52..7f376ccfbdb9e 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -304,7 +304,7 @@ /datum/xenoartifact_trait/activator/signal/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target.")) + return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), XENOA_TRAIT_HINT_RANDOMISED, list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target.")) /datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) if(!signal) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 524d052178c44..05302a2634c6e 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -10,6 +10,13 @@ weight = 3 conductivity = 0 +/datum/xenoartifact_trait/major/trigger(datum/source, _priority, atom/override) + . = ..() + //TODO: Reconsider - Racc + for(var/mob/living/M as() in oview(9, get_turf(parent.parent))) + if(istype(M)) + do_hint(M) + /* Electrified Electrocutes the mob target, or charges the cell target @@ -160,13 +167,13 @@ /datum/xenoartifact_trait/major/projectile/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED) /* Bestialized The artifact shoots the target with a random projectile */ -/datum/xenoartifact_trait/major/animalize ///All of this is stolen from corgium. +/datum/xenoartifact_trait/major/animalize label_name = "Bestialized" label_desc = "Bestialized: The artifact contains transforming components. Triggering these components transforms the target into an animal." flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT @@ -180,6 +187,14 @@ ///How long we keep them as animals var/animal_time = 15 SECONDS +/datum/xenoartifact_trait/major/animalize/mothroach + label_name = "Bestialized Δ" + possible_animals = list(/mob/living/basic/mothroach) + +/datum/xenoartifact_trait/major/animalize/mothroach/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a mothroach")) + /datum/xenoartifact_trait/major/animalize/New(atom/_parent) . = ..() choosen_animal = pick(possible_animals) @@ -209,6 +224,10 @@ REMOVE_TRAIT(target, TRAIT_NOBREATH, TRAIT_GENERIC) return ..() +/datum/xenoartifact_trait/major/animalize/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a corgi")) + //Transform a valid target into our choosen animal /datum/xenoartifact_trait/major/animalize/proc/transform(mob/living/target) if(!istype(target)) @@ -319,6 +338,10 @@ else light_source.set_light(0, 0) +/datum/xenoartifact_trait/major/illuminating/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + /* Obstructing Builds forcefields around the artifact @@ -360,6 +383,10 @@ new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, WEST), time) new /obj/effect/forcefield/xenoartifact_type(get_step(parent.parent, EAST), time) +/datum/xenoartifact_trait/major/forcefield/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + //Special wall type for artifact. Throw any extra code or special logic in here /obj/effect/forcefield/xenoartifact_type desc = "An impenetrable artifact wall." @@ -406,13 +433,17 @@ dump_targets() clear_focus() +/datum/xenoartifact_trait/major/chem/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + /* Forcing Inacts a pushing or pulling force on the target */ /datum/xenoartifact_trait/major/force label_name = "Forcing" - label_desc = "Forcing: The artifact seems to contain impulsing components. Triggering these components will impulse, either pushing or pulling, the target." + label_desc = "Forcing: The artifact seems to contain impulsing components. Triggering these components will impulse, push or pull, the target." cooldown = XENOA_TRAIT_COOLDOWN_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT weight = 21 @@ -420,11 +451,14 @@ ///Max force we can use, aka how far we throw things var/max_force = 7 ///Force direction, push or pull - var/force_dir + var/force_dir = 1 -/datum/xenoartifact_trait/major/force/New(atom/_parent) - . = ..() - force_dir = rand(0, 1) +/datum/xenoartifact_trait/major/force/pull + label_name = "Forcing Δ" + force_dir = 0 + +/datum/xenoartifact_trait/major/force/pull/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pull the target")) /datum/xenoartifact_trait/major/force/trigger(datum/source, _priority, atom/override) . = ..() @@ -444,6 +478,9 @@ dump_targets() clear_focus() +/datum/xenoartifact_trait/major/force/get_dictionary_hint() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("push the target")) + /* Echoing The artifact plays a random sound @@ -473,6 +510,10 @@ return playsound(get_turf(parent.parent), noise, 50, FALSE) +/datum/xenoartifact_trait/major/noise/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + /* Porous The artifact replaces one random gas with another @@ -524,6 +565,10 @@ air.adjust_moles(input_id, -moles) air.adjust_moles(output_id, moles) +/datum/xenoartifact_trait/makor/gas/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + /* Destabilizing Send the target to the shadow realm @@ -615,6 +660,10 @@ dump_targets() //Get rid of anything else, since we can't interact with it clear_focus() +/datum/xenoartifact_trait/major/color/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) + /* Enthusing Colors the target @@ -653,3 +702,7 @@ /datum/xenoartifact_trait/major/emote/proc/run_emote(mob/living/carbon/target) emote.run_emote(target) + +/datum/xenoartifact_trait/major/emote/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 1502333bfca74..b6c0e761b9e6e 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -398,7 +398,7 @@ /datum/xenoartifact_trait/minor/delicate/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED) /* Aura @@ -547,7 +547,7 @@ /datum/xenoartifact_trait/minor/shielded/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED) /* Aerodynamic @@ -610,6 +610,8 @@ //Frequency radio_connection = SSradio.add_object(src, FREQ_SIGNALER, "[RADIO_XENOA]_[REF(src)]") + if(!parent?.parent) + return setup_generic_item_hint() if(!(locate(/datum/xenoartifact_trait/activator) in parent.artifact_traits[TRAIT_PRIORITY_ACTIVATOR])) addtimer(CALLBACK(src, PROC_REF(do_sonar)), 2 SECONDS) @@ -662,7 +664,7 @@ /datum/xenoartifact_trait/minor/signaller/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency")) + return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency"), XENOA_TRAIT_HINT_RANDOMISED) /* Anchor @@ -735,7 +737,7 @@ QDEL_NULL(slip_comp) return ..() -/datum/xenoartifact_trait/slippery/get_dictionary_hint() +/datum/xenoartifact_trait/minor/slippery/get_dictionary_hint() . = ..() return list(XENOA_TRAIT_HINT_MATERIAL) diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm index e8e7f9ef528ec..22d97a3dfddc2 100644 --- a/code/modules/xenoarchaeology/traits/misc.dm +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -3,6 +3,8 @@ register_targets = FALSE weight = 0 conductivity = 0 + contribute_calibration = FALSE + can_pearl = FALSE /datum/xenoartifact_trait/misc/objective blacklist_traits = list(/datum/xenoartifact_trait/minor/delicate) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index f51ca48dad16a..f0e82d23bec41 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -1,3 +1,8 @@ +/* + For laternate versions of traits, that you want as seperate on the labeler, use the format- + 'trait_name Δ' 'trait_name Σ' 'trait_name Ω', for up to three alternates, add more symbols if you have a trait with 4 alts or more +*/ + /datum/xenoartifact_trait ///Reference to the artifact var/datum/component/xenoartifact/parent diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 7a180e462a3a2e500d921523a9006d55a776ce8f..ca1f99400467dd0ed232dd0e33bc0802ab6354c8 100644 GIT binary patch literal 79929 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�-LM4_$U=#}1* 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 delta 79006 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%0A2#ZtKjm@5-Z!_$;SnM zeXj#?5DD-`z*L~~Qn>9FiOH12PoDCaIS2tq#zJTP-7Y=-9)hzh^6;tqvTm6e;DE`yDaX%FG1@q69g+k7?dFu#+p&d?Sb*4pm~)| z)tx06f>)n0_(^YsB~{h@*5AK@9?aq8LnxArG70Cu)52F?E%AY^0c!5bP?;)!GyQJ? z{%t1Ahu&$j^j$r;&j(Q&ZCDSOE?&Xl>}wj*SED>SX%Kf*_IgP^{+W6%+Bn737Xp0t znK{PY5RxX5v&zhc0~~mM4k=tkYLCk6-}HEHD8z5w7-7qMdl(up_`>G}AE>Qm*~imp zooOhfz%oE~A()3~42UuP)dahLzAo5VEKuJX;<~N`D?17>Qs$-O6`m^CES4AXu8)-I zyzMw7mok>BX8-6VNV0^Y$*8)FtjWl-gz&(%UF@=pQ*m)Dznj8>Eu@ABA#g1ZyX=z9 zRs*It@=%$Kh$f$;bqRB|I1QHzCKS{t)h(-(&RVLvCT9Z(M$boeS3}1bD7MxE`J>aBUCQ_OQw>#ga{-V168Y~pZDe=lQhFK6;+u(KW?xXYog0*VLy(}Gv`!{}a+ zmq7grsL>%DfNTZMOhNV)IGljDZ5CKL!TD)$58)?jR{TM9r*v4I5nNpFA}iq9AUXc# zE&zE)&=D--woY=~6J#S$-UYn^BuAi|g3CJm7(*%tnH;zZv}zu~2sj-eWjnx!prblo`uIF$dlh$QF2tKg%kh z!^*f|*9c4$Aye^>Q%DOE6>vSMSdgCvcMysNI2sWA>Aiv%nqg><;CL9it6UZ(z!p%g z2--X0fA&&6RnGt)ngT6OOH{!w$5>udA+Apop6aGL2aQdA za4v>8U5C1{kG6IVryQfR02(uh!yQN~ad2uy z%dfRSG;!7Emh$cKG^Mc4>XqYAbjS?WFjcbnvznzWtrL80VuUBkIgSn{Sie3+;<^Gi z)mBmXNSJTzD6nN+fc6_^`9E715qN(;)aPKR1^3t@l)fOYDNq_Jusj2q5_|S29MKhi z|I#?ie|H$_MxZ(iXuQ2I8P1BQTKVV4rupvI3_cTYgIfk@_VN@@T!fR(suv`cashli z+ryjR=yuV;)dUELMh()L3i+~)Kp;yJk_3t(qZMqE39BT3$8JfIgd|BAhDOjdu%iye zYy~~&P|Dgk6&Gn9E4}%ykdo{lUzQ~lRYucfzp3Byz@IY7yQvO@h|krbcwl=aEW1ch z333S+;V4@;9UK8gqHDMwc#490DdT}Y=E@mX2Xz zeu>=E{qVR0+4Iml>Tg1~2-2+2ek6Rbi7HSNfU`3&ng=oFgO4OYvVjt~0+gx}@9KcT zaX6ZQqi5mF(~uP~v<#vqoHzyI7*t;Yk^+r25UdA(xem51fqS>X(>?H$z2HS)Z8xl3 z22(STEP^=YgP(B0w!xnN8yl_A5QV8Za7!R*faf2>=!A9M;Ms8G9HjFgPXR4H6ZAZA zJg{t#$3QB8+Y3E5JlPHp+yQ?z2PgLV=e_uH*xU@W8JH^o0hmj{Sh_%9wgsvxyeAgt zu|kD^d&f;MbzVKKkW3d4(>jF1lsYQRP6(8_Fs!Q}$kvX@du+ ziv%MXQWXtFakwko%IeM_ub&y?J$Jb*|Fe^T0mmAs99e=9DZ=78R{ee-57e~t%`a+y zoc~T8i*FpmQO;wP927@ER%LWRRwNYN-<*;pq3S;Hc-}m-a6K?&pIvyMYX0xCBB55^ z48r6KHl7eTwm_0REJecg1gB4hK_J1#B!Kt`^$g+fMdk9Y;T>k-}DiWrlqN_6MC;2`ZZ<4C= zQtI+8ETxgdb`m@VgAgHxk+_C}`Z+Y+z;FKY8bSAVp9Tt#W~+&tq>DiOE3TO2Z}M03 zlk)HJ^_qv-&u(sQAK=RI4Sd3S2LZmtyPW6w9TfHv;S3ff{=+Y0Mj;9s7H!g26i{KV2}pa`Du_k^iJ z+JWUQaAg;~J`7LQz~oLCKL$!O$n(jk9Z}FF2nL`%2%!L6wH%5z>^lJ7LFl*@wy%e^ z&9FxXa|p`9?`Ema(^BC_XKAZ{hNYb{2M0aMVQ`!Mkx51fuIh#xyWuCN;M^>DJwC{Y zTL1IN{xq1f3tk>XCn)vc_P`6zgBgT(-2vZy26|qBzAU`n1d0OZr@$VCK%<{vj1~nk zN{jG#xm;xWiE3sCqCEL(ifAQ_H5G)ifwn4zyx-*X6LH$58A8!A(>ua{?A@tRr+5Sw z6`)l{xpEZha^Oi|&ZBBcrg8$FepTbhc#%(SkFaD-mXl{)K!utdGzI_%-6*q8u4aFq z%Qde>V0#)AgW?&TV@1JbaS1~637N-g;qeZNy$Zn&8H@s4dY;&dJPk&Gao5Ai8>n42 zwWf-b)7U#;v9hA_aHW8MrntP2&G7Qx3SW^MX^@V?XI{O~{n_QoDuS0Kv*G0!^uH6m~-en6prlDDbkZB*k;2Bc{I z_g4)CRaI~uk5H9?UG@RUb3I(wqfl~?<@q%O^9}I?t}FabjuOPHOrK>fWc!y~5Ekjt zy#Ku7AxS$pSv}N*{7ozge@zPqDn)2*1vvm-$aj(S4X}ED5xnaXcM@e zPWV;kLI$aS_~x;M=Z`=31ZW+wxCu%%FnkF9;~DtiJ@C7?!}kqH?SfM#$RTiMKy84I zW?0!IL$m-x8b>P*fw2$=z8U6Bw#c&fTDD#8QNJkzLMFH+&1FaHcw@iL!JW;-g9@Xn z!<_DL`_(qA%=$F5Hb81u8_uB^0Zc+`=8(20G1kw2v2?$}8z)@qZ2@%!mT5Z4b5Ux$ z(n#w@kUTJvx%!F<4?m^R`p`<61~NnnAr3uNA!k}Fy(0$!7m%Q=KuRTRs|2$Gath#p zDNr?;R7o&lePC|VPy|Uf{&iBrT?)O{-S?|t8Vb1GmZO`W&Hjl zWoCwLs%4eaeObOxuz7f0Bhq`%5WgW$`iu>ynkhE*qA32HEd+Ruz^S+t(-rKZgH>{I zEgw|$pug#jh>qvFsJe_@a?k=QnyLEC2nbhyzc~{QpiuI48P^r)nu4bK>_<_2_bgHq z@L#t*9LvM0xIQaWeYY@D@Aq4u$EOQS%(Fd&>ru(uxR#3<(Et_C5oq&ZX%!q?+e0-J zT+79-xIU{hWb}aQ1L$PsJRQn%wiVa2nHGO>3lCQkc(TAl!()iBQ%BhzV7TENXGZ>i zh-JLNCyUoJ62F8K`Qzt{bBI>fxQUveU>r8SEldc;q(f2)tun0c7i_nIHhor z!``c8^EP-8RG_mFmTPb(1idw2AB4Smn4W}dFM)LpaA+K+3%*Vw1C0@A3BvFOkb6K}d}5|Dn@XGndE;cI!g?Na!IJK=7~>OPQVE+b zF8lpJPeA&f5F)@H?kLPx^?leS*$7=rV5qN*JTn z24u3Q3}(g)T<=x$N40hQdp5<7Qb{;f4RbPXW5)mg?9-@TA4buX3+%$RJu(wTlTWr5 zR0SI|qGOdD5CTP4P&5Twb-h{Q0^hAYb; z2_#u1L^HyBl-kN_LZQP9DTnxM>%a3CWACR+`Z|vkf1BTu)9jX><305<|D1d;Q7?wX zP7qIGaFF-dn|aUpt-!~4O5Vq_+Id_zkK$xGo!HIB6>#+m&{Y3#b8sAX)xybB(DN+h zE3hL5RuQIpfPXFsgh5vzp+UI@YJ+gwMlb{L^p7FG3liJms_jsx!_X}BWNXnM}V$rIq7@qZbf(C|Ad%$MOU;E^qSVLGP5 z%2sFzgRH`E5vF#*w@moRJK){d!3&3BdKNm`;Fk5EnDFpR9(P|_p=PPdO?T(m=NaTO z5jMPc0`<;Oz=VMs-&boWK~)y>{vr)mP0(O^U|5hcVI&Tlb8yOJ=d&^cLnS^CswFSk z{9q!(kAGfK>AoXKe2v2u@hE#{=Gd&N1h(b)r%#9ZlieF}+j8iJM$jt|d|Q$m|1Qb( z2g2meS5ZTa=M(Hz`y3}$1#*3^=R*$@N03Wr9v$Jc8vD2!{VsUKYxABU`{f)b!C)ww`6I(XM%e?kKVru zb4?`#%hRCG`|${$iFM|LBShp5>vUf*xV^ zr7KaYeW6)+f=bT9uK4cDf)*4^81u|#9(~|FYM5aS)lhUIxf-HA22%#gdIi_B zk%d8t27>J7&e>1X&rzlVr`RPw!P&MGTz@yZl|Qz|_{QwD{82>XfV-Cm+GqIK#C2?| zv>}UUfqoE=0Z#*QZuMHZwNedCbDVx2-2hjvg1%8WodnH;>KJ_dZg_4D{AdS^y#S*s zetS@$_F7ol{p~J;Xz;R%B9HjZZnlHh~9K;P6OhGOUZrBG_ zNkBXVaT(?u7@vXA1ROpA$@2VlNnkiod;{DJ$j#t2`64@MAOg`a1T`2+fn)hSn3r`x zSDjyebX}(}PCuE2p4Z`9ak&3Fcz@s3khdVL!bA?f^Az-*7Mu(&rE_bF`fDb*y*f(a zh(hSfl>dcZZiW3d5Rl-~B&?qROM~8atgOk@KoJfZD4wA4n>lbKCgvOzEG}&{LDzV^ ze}*%29)*lTNVchscnnTKvEUM1Qey2~h`*j3VQ`>=A$u${<6LyIiB0!R(SNcwL+t8V zVj&Nvqp-7;FFm1fYEt2&b_d-zj>3u*w9Wa~J5odcGgUnJq99Pv*=`0n7&Q6vOLMFp zXyW3lT&g#v(E<|AxJhUt&L_IsFo&o3*W;6Huc||FWd38{B>#5KG$298OXDTk*X znP69^%7(jqEc0AJId4<8{60ukH37mkCQil03~QuD3+O==;R*DRh7r;bKqL~RGG78D z$mJq%XP;oRF;X$BDN0uZ6P$~G@lYi$3ocU|=Y!6wL zamp@=;j=Q$^j#?};6H@-rhX-a&z6utR%KLk9)MyxW?1vtovcWBs?3a4Awet8DW^#p zNh)@QP&tlH7$|a=)5ZSO-SmqkjD(Mnl16!~_GyOX)%@+mU3|IV@fB@7kLx}BVcnOw zYVJ<{toR|K;#m-TfPV}QX=Fy{>qe?sA$7B=a~DsafW1fjP3c*nSHX!Pxc?HU4#P7s z7#ak(0LmiRvI5$puzvs?7Xl`zn!hAwr$CGYEznd0@qo`TqPj04mzZZIJ_Dt_4V*0G z3NX72+}$vG3|^98Y8o1G$%vPF3G5F8i)(SHweBg_WCa|@^f>ch|)gIqmi4#J690mtW=%={nBR)KoI!-E(1^)7iBTorx?uw@mbbMVFxv?btyo3|XCF*QLSH&>as_QGVw;!@TVc6SX&nVn^69YV+X1EH8d7 z%*VPKS+v?g*Bwej@b$AU51%VBSqAyrIu9J~qGekFy?+&A8Iz+gn|$t2iv7t9%fkvE zKaix#R2T^g&I~F%@@<#O!xDk0L3e{pAU4OXo9p<&c$!aaZ=~tngRrE)(&yUw%s8@da#MArRB4_;AU>wUu2+%bRS#}B58d#2v z>j@utT>rdw#l66K{OfSBioPqR>hguxf^i*5@qd||V|f=uBT11Eu0Yn_%t5N;9isI? zbWKCG)FPRh3I1X7$7JLRv#}9|&DTJYXv;RDN{8`dMtk``)}0JbUC;69le`?=M^Eqs zr?o!b(foJZGO?KtI%TezdK;guev#+Qrx>cbh(DRUnYC6oum_a^f7N4=C4|Zbey|q~ z^?!r=28cOdHz~_-cpc=5@UiP4aV@-fz}InFTHu!2_`w&+@pU5R zh3f@3i1~;ayy+Gt(=a&#!)XxH^NE1NkW9dC2bRu)SPGp>!BFAg2=orYXcA6OfqMev zGKe$`orj@eU=TzF^p!qf)W`hm38}DlIe!!_7zd06#!P<6=Xd=JYOzKe$hX%8}K zKSxMg1s8Y0jmzMvUSFgZCAhp38l&*!UN|`fLkZ}pfz_+wL<;O(aJ@$TVrWL{*c1XZN~~~H3V{MU$^~xtb`z`RWw5Logbt@`Iki*pAIS_WCTnRJjKQK=xU7fJ z+6gX6=@4-sT!x)B^nJI6Z;!f6$XUL=x{2VulN1M*qbL&TtVKAa5ejNZl7H{&R7%c; zFuWd6L4X;ZAHwPQ8{JV|6j?!%KvPsa;i2mC1>MMTf4V%!n}1#|J9r)_vT|WhxSsI! zr;3YJuzi3EsPl=A4yrCwnDtqpU2(CBJ}3#-Pkanj8_2qXYk64n;18}SiUsmAvu7nTX?1M#Bz}H^}rlC>+U5Dy8bbr+PVsa`AqTuhL zg?t%BhExTL&U`d!{&t`$@Y(@z2EZMfkB+JS!yAQC2y(g)TDr>rBkRngtg7yO|2gxW z@2z>Hpn!s6Mg{>z!~qp?Hk!m3H71&L`o-=}Cs|3Shu7)!d)?_FX)~B~cM_8rr$iG` zoFalEgCHP7K><|-HGhw{?mV3N{jqPAo%L!h*OFCL_ndp{?BD+VzSCw`7rb>0^1TA! z_8gEa5&$;?au=`w)XQK=6)al@OY5ONDt-WJ362lF zrvZThH;&gR)3;87lddUG@E=<;mokgeO2{bb;}U!=oUq<5(m0SR`_4%7V^!!&u13a z5WQAoxX(eF)Jd8WPmHCwbDqa1zm%hX`z08OKt2jVm0)Y0wd*qc-%f+yJs#u_T_wJ- zTtk^-A-N9D1q<~=J+yiZbW5C0+uU0n6hL3jr_U|%rGE=U-16Nf9;sbLP*ZtsVvH9v zQ;b;-PrUE&jo-BpxYvT#X^7i^0iy~0HyYUgOO@wFa@^pw@N#gNjt8gVit`lDZpL+e zT-PHU(g;K~fw%ZzL^TvmK@Tcu0R=@@W*4&O3dYPnGS}gq0Tp27)wtuEscWY6Ow{dxt-iPx|uCZ ziS3-Lfh#L7a{}0f#uy-Tr?rr6Be(H*w4UAC1%Li`+mq}VzKVa4PSTscg};lx&93lo zdA({U%`9Y5W;HjaAK^wXM@IS{W)6&Xu(%1@o58W+Vi3+t;2ef?3HUK^%~Dv_Di(3c z5?w?j0*mLvvL={Q3wzJONE%3r#g*8ygFdwj>srxHNrw2KR2=V(ImjiF+m*Hk4Ge z?JC;7)WvEo&X;y&_;PX)9gRAN-W>(sX3cgJYF$zngLLG4u8-Gn$W8Ny(Il=c5td49 zR~l&us=PLu;Xj`7d2qCo+NC9IWPi92;KyCl9K2K_8ZGdrYg^cJtjHa50G3Wbl}owo zBFj))B`_bm?4kuk@rc$1XA6%cBd`@;Fi^hdV-=kl;WAo8EN~cOcwVq8}Bq6;7{#|6agAr7k z2$5hI*biK+JRIFbxWHfKm-BG>HvXdi1D;5{!bxcvU(aYfHFgD$2iiCopWu>yk>2oW z_C`Yd)VqxB<2SHm;~!|B3xBn7!Qhn3V$<;xV)15=z;PK0dFUI1SPT}_LVGPNZ5Hp( zbl{D%aO5Nm4GC~rDv3^DDg|X*{J(Vpf}4bXNcRQ%^~h)8%4LF9cRbj07LIknnUEOg zf~vUI(Lw0TfS&hkwxZL<4Yo7{*cp zw~9vvu2jl_;WNwr9q)pkDR7Te#<&fFV&5_!22wCS4&DIB^Pp{xu&@*gqO+5OP#cB0 zb@1j<@Q#4C3ND)qH!Kl4E8i8`!(A4X4}!d?3>S5JCmpJAP^2=L3Y=_&f($ViQZeWc zaPf^QCig2`o^~1c%72tymx!WpbF)HEF~PI%j-lkDto~;UA|=WPs?qzKD4HHDoFcL~ z&sE>ZbK!+r_MEO}T~MXmFhn3OLlDZYi{-+kWz&|ID}|?mx1fR(#4#b~+UT+d(Go;` z&_evA-{A8d5n65=!hEro|NCD)o8vB@xmKm5RP**bEB0^A^ z%8K!_ty$=!3>nsU!blN57!aWRvH+JrXukz;?-hbMd*__^{X6H2_wi;CMkXDs4-ypAdO!3SuW=o^U9359-Cqs!R0QYGd2<3W68Zm z$ZH(`X(N9xzh`sF%whx;7HT23x7V`tfhjsZo8rvhs=T=;#C_Xxl~&V2Yb_G;LOeGy z#aEBj!?ICC7?BTlE$nIH$SDukvN2ZM5G#SKVf7|BE0^imSb~ud`+r|Ws|+9i#u$O? z$4Q{DePe>$-?#CHXG7d^o5!4+3eZ)?>|RCdjvjx$w5*v=U#O;3@-gZysuv8x$prg; z8)8qU#ABbb;jXi&bc8H8lO)4?%V_wj0eyt9Sjr<(aNXQIeHo2pe>?=8Yz-7q(e z(;s6;xrwK(5_esUp|m*!bcIMl$B1ayB}aIyA}Y~_5UMU?6&=cD2Qx32F4yt!U0?XN z0LOn6MavC(xSog4M~i<(F%1wfDi(@LcV*cE3vxWs^;jhbHK1ZdgqUy!Xm(~Wp~}DA ziq=O~Wn@*nzNAQajz6n@o}uVvSrW2;zzB=t7mRemC8&)Ey8Fq!aK0a;)8J<-!lxMxLq@2RmF3XBQ7puUW?0oEz+?@uJlOpL_$hzU zaa~v}y0EQ_#l3X*LL@4>EL{gBD8O&!Ls2lb<*;EDd~6+j|2a7MI_T@5wH_u*P%@F?ZVt@SiBt0OoQ_- zob7|bENtlnr6OY7vaa|3p$?=bn z|8DT&c!p1JPq6r*ei*5Tx*UIKC6FtWysQg=a9*0|W5aYl5~g!Xuvkz?BajnAwX%oog)BgUGU#r_e? zHGA5Bap}@9F4w53x-m{{Kdz59+Lh7un0Kmsb4YMBDjmm34C%*h;K5z7L zF#g|6szU^WA>z!#$E3hCJ@PSzn$L6Iy@PL!K1hex2<${8qG>3kiCDklNA_cUksy1+ zJNZduC$ELiajm(92XlYRS?D~^*L(}ryO)oj`8DVI!8;7nJkZy}yf~;5WL+38hysBa ze+e3*fE?xaV& zfN5|mMq<|yESHC1#OkWycfS)I7%O1w^{`_zG{nSc<#{lXhYJ&Ms2474gB^<@n}a=h zn0y~zZGz9<3^%S24B}84_78~eacMJLz7Y1F5psd?F7T6ZASRfwjjLt;Mh~H0m!)x8 zj^5XzeD6@2-pPLw^QuBTdQBCpzdA_WU1NOmy}6W97WdZI5Yts+0hKlDY>e$0yu8JS zW|^-qm%vt;dbf%eSz*niL&$4OfJ9SAj>trWePb(V1Xl)q1_6WB~zpO7_JOao5dd=;pAT|;gMgISo*UCeAcQWUJGyLll;Ey zP>f{w^Lt`!dh86uviNZe$*+b3^C2A(Zs__ltVoJNla?TYpy~5a9*Pj?ng>U!@f8bc z#U%2BquhV>K?8T~OYyzNMI>4S1Y#O?$;Hgu=m7;is3I#e#gvIzw1xhr;)-{C@LX50 zxUyL2Gu|xQ6V^d6<6f0emriwTYsElou?#D0`T+gMHHjyzTgr5VE>$+))PEDdOr`? zLBc#$Xfg5LAsod7uk{xU?)Mn8BlXxsqzTqDM{U%d*) z$Atc;Nrx2+;FgsT3qtR(h`vyCgh^ErqQ)5&sA5r0gf+-EK}QGNwF+ME zgWnw#AK|*I;FdK4EVf-ZbP43%%4=2(q?&&utQRo@R?Lz3&42o+YvJ~5;m#G%Jt8zv z)gf5dE)26%DY!5Qr+Z=bVt8N^*adiZ6yEQGL?hg>QhYAQ`-Mh{2AI<*gq?X)fYkI= zBmoQC&OF16p=M_^7I-de@K?90>B>r&@voEk6k!=lR*>td+eN7=gB<+n+==e~au ztV#(p+kzBCOst(vxMc~V76cTgvKq^RDsqPngF#5Eu&6*|tHWTwgg<6bQ{&-F9y=Z# zVB{BVJpa1@t*y0GKak|>ay2jhq?(t9^L#6r!I3>;io#uuRa|?kP1T=Wgse_+S1qA? zr|{}ZR681}lL2bB7TB^z;g@gvw7q}cLdz9NEK}jw-XL#Zvbpi{Ftn9%`dzd+26zAR z4A<{lK=g+-yrL8tnfBQjtm5%)GU^>Ygtxp8Hn>s=CBFckS%CfH2rp%e;M?Ss9G8`^=DTC} zu!IA^pMY1*Ul$kfSn)yrF1VbxBfGdHpXA4lKci*zo80D1054TWvAHNr67YV)H}f~K zz4T?iAA6M((q1mg$Czv#Wjc2QkCq;xX6qB&vKekz4zG2?51to`cS(N-+_((x-YDwY zg%Q!cXfu`vPweuN1YQy3K5!HWZGu}i3jyI@{S>Bl3mnPQVblZj257E=s~1DQ3^W7d z0xMD!;dYmO$QK}Ii+kz51Z~x@WUxq`k4}J zoG(En4AmM`tFUOkP;q~2QMh#z+_M6HcM6W4fRYFE8)12~C?;nHpl?FR4lYfK`}*Wo zNRGjY*I`c#LIDWM&_9ScV=gGhNx!0f@~PNR0^o-PgO}}sT>l&bS(WiuU8Z^pZ1rPo z4^;CDZ<6z=0=eE8Rk$dP4qgywNx}Ma2+lA71aJaAy073AR8)UTM8giF11|I{u)={_ z2c{L0d6$^$BiSC92AE~$UOh=wlf$8JHSzmrV?2Cg3i)IG+ejGhAQS%zJwzZr>JU-e<;Hcem8dib8m~aug6**@{yI|GAJKJg@Nd z&=7bortk5?q{MYE*79v)0iC)&epkFtkbzWy_^pb}%$$RurjLl+cna;aQb& z&KBR3D@Il=pb)PPqsl6#V_`eaAJOuj@1Y*7dxdbraV)P$*`CDoY+B3}{MFdqEb-q! z975lTM+AS_KSY4z{7d}XqPbYrCuymSd8eV1F$U_AEH!HK<1|$q5_JQ{_Ysm6% zslVj!Vs*S9f1OdOk9VTKXVMtwYY&5J!~gjWoE-wM2lNDV7sTSfa~(9-3&*%-xq3vvT2PQW#b z;KLy}(Fgq_!nc*SKsha#tfnfcj)-pN)F@mki6F6fHN=A-`OM}dpv4d)WdE4JxvuN1 z%<4XDTLp*u;HKN**302%@4{OrM68Dvh3s0mavJhB^i6~HwirW4b$H7c*xvnji_fWW z9NvGAKuax5=Md+$d!mTSlF(K~B*^O(0cIUYl@oT){;-Z7S7l_#Bag(OZgNB}GgQhE zF%%+E2MCc*y7(oH;gJw6`9{!7;tV`wBJ;{D3slkjfx_bZVE)x5Ug`~U`q#BAxVwmA zsJ#E0L(egf&20e)+So_pgsn1kwGg{H$@YJ%Wgg!P51*@th9XkDKzPd~kR4%o3%HO9 z!;xlAzEZ_kem8<<807a!gm1`l&AoLz^@PF7U3Ij7b&8w+dyK8WswICgf#pj?RwYT? zc?wof0wstjn8#%FH9^3`(;Q^mM|M2{JeGaI0){>D^LsmRe_h2h1N}?}Y_5^QxITXz zw$r>bn&kago4E3dCb;DswVPA?&7u&2+bf0oNGH5iLuqf6q+`*#NujmVgTL%yB&G{r zVg(2WkR%DK?BJALf(e6QTu0LsN*POZD3vwrc>*7@%Pz7iVHF&56XNs~S%ygXBO|LM zi{~AnRCY*24IBqOX+ z&I#Im#;X>LX+*+7WJ$rtM^h9mTY&6ZMH1kcE~@Y}k_`0I72eN&ZsmHGQsf*0f?JEwf1C&JRjPkk$!)nS z7!6O5lBUSY)AXswIX4FTkHEQOK#v%|oN@5tFfat}Dwta%ib1X@gmsDpi#wn<18H4g zCBgY{+a}nt1Rnn_47?4&%i+3BP#c01=iziKcp0HJLK43xj|n^|v=lb46N`M;A?QC+ zp}Td+cf;{3L?PQA6|5D$z>qSTVrZ>lHi*H$RC)1p=r2b5sW5bPXWArAdd)-nKB1Xt1_+QKJQ6+#yo$QY`M%dNn+6` zpIKRpcG)Eu2{3g*LmjsH?#~J|{(cS{v@o3;iqzdU1+@-a=SSFcI?uwl5;X2ev8Gqz zjUz6(vl3+)LY~gL8n|+M2Br-z91pW7oQ0=rVc9f`mKG?!8-OzrxLkqLjgYB=XaSI6 zLWMH{-stuD<@pp^ILv=H?~c;&iSs~?wkyZEb^k*49t`1rr-6kJOcMHw^MoGN#b~Hh zT0=Qi{!WT7*9@)?&EuL_p#- zFUxbq6jzQ$#B0~339K3dLh$rr{^N%wc8zC|-5i=?lkf9rjR$}D>zkIs;{U-`RS2xY zbQx7wkR<7kC~c(@*9zdf9=<2x_?58?uuAT%k<|!kv)UWa5p=recvz;3s>+1I8rAb6 zqy`JK0Jl|gP<4H_XbFn{BPF$Md)SsIqBwkUKZ+{S6@zhomKBSKB510Lt_u1+Tg>Bn z;`bz39I)wm9+Q84S=3v4@8?3*6ywHu2slWZ>XZ!lmGq*u4)1yMbQ82>A+- z5tsEmfy;mZgNr3dry)~@8#=)GckuZPcM&Z&h>^=k6uY%9rwAbYa zFGBoKlw0n$*|^!{z^KIDC+oQG%hRm?Mw(Ucs+fP55|~j1s&dpePJs@ zb0HE%0F@ zD`E!20gWe~w`qN|mD@M!%->|eJ?ARVVNeLSG#Bv6cTVFsbfFLytjGLuh+9z7L`Yhw zjQD>m==i3DtxMQ>3&jf%mUTj|O%N3uiLC5Y1YHOaI^@E$^Z46;ciBCdfX;-a!DQ78%!+i?YJ=6ODm zkVby0Ot>Z>@E}ceL%OP=DJrp02;T=o)9`#B)3)(EpRy%hOE)w;&m%igq?j^M|I9f> z+tgq3Px3h~c@wC97?3Ej6rI~pcn5e!{P8H@(}=`%lxV_K!~(Vb0%M^ua@qTd@-lz= zY{BwzsYBr|My1R6P2@Q)=@GO#Kvz~s1(a!!hDE_$x*ZlR7fR(q8M;!SCSXxJ>^&+r?Rg1kjR^;QAtC%> zGDz+W_wvNVOnkK(@gifCH+Chh5VFS1*BU7sCtlMb}yW5X?>IF^qp{BDcex zha;RVI;?+q66wwn$U5+T1Br`auKz-sy15sjHcwblxn(Fp=iw;tJRRVLr{Gg}TWsB| z^UkX_xqppu&HV-9>$2!;$A|`1Czf$l+V9+rQOkytzh7b8$R4QJ=TQ}g)2(K5RR22o2si|r_pLKXk@ zQj!PHCg^O7!-h$~5p1x?{Qv+U07*naRQd~i@O0vf^Ys642f4*L43j6I0BM=JUFl!q!xFD0NUXE_TkQJe+?{FuF6yyMr0N zP(6oF-=)F&0f@MKe4>V%|F)AmQa$LZO3C`;^XzgHWg@i!WKCwq-X1mr6v`z6F&%rd zJS#2~j&qTuIAhgNbVY>0dxEm}oR1O;g8`MQ)-dtr5W1>i794_=M8lb{{}}^2Q{W^? zuvXcEML4dLpDcmz6RCd-k_bnL2F2WCs5+kSQ?@Nirb*E(Q>vWprw3Hw2$(1`em;X$ zbWqzo4dlmp%>FvhbCE+z4?ETOdDS_=wcN^Wd>M^F@syw=(aI!wzANuzsH%&yVq*C& z!_iATl|9L4_*(+(0!9!AsBPg{y_aVak8?KgI^*6HaU(&zG?#yc`NbU0zYLnNHu$>e zetZq8>R^7G5apd4gR|4%W??iYiijk^^~+&Zo9HMCE)4gBl@{jIU{F{nd;|{C920t& zY!U{>VJHO~I^kEoC<5`Y2ppTV5n`V@ajLH3gI_JQNMeV86N7N{41A!%;<+LM_G|aU zu9Jchv)+fP972CESV?Y>GnM-u5kg6l!r{L9P7xc@UM+-{AB=<43(-zc1JE}P-V&k6 zE;*1ci7`^13(#5{8QrxNuIm_t(|Kr*DLYHh4t`KdVAr z9L549i#Dq7V9hCDq;+^|AygM(#{_k`0QS)iw5e+RSQ&q_X_SRGWT}gmc>X^_JoQ?c zuRY+PeO6)TZ(UCPbCk;)8(7+`;s-R&_Lu1yEK@FMtZWWY)d0ytfXJT>5^tS`u>jw^ zvWhp~b@=se3pF>F6`LC%8G@b|lvJz*8T4&quw@t)<{(`SJ6rkgUYDQuWJ&uD5m_Rm zl^A6l-Ex2UQU4@gKU_!iqG_Sa!36>oKZqg?Ykd1umhk%u3BQ2{uAD>X$A(}<3NALo zYaK|ZWv!_wabVPo|hT)6iNUvdaA5#;oq`*$l&~EiBPp~#*Dio&4Te>aC!rh{8|F;H|BQn^Uxe|JXb@6m=|egULOa3@4j_fNx#YB<^tcWi}+ZB z)k;&sH22L-#?SRo@t4?z|x5zp3Hm0gHd<&J?g}RTd;HTMk7zsAuRdOyamQ^G*i&T6Y8M`cznwhTdBC?+)-<-xvki zVXdYUQ+2wWBBP$mJz72I%0*sy+2GFfa$1+=*-Hk?lw8_{7#2-@099`%_V#m6BvMkK04F+_M$9zXz&D zV6+yR#Qfb~D&r|8fkqobB~VNOrWdoYG|p8OOM+CHzh=g!nJ-xpVnoLk&hlt5gzx(l zV`cJ558o4=%}f#S+{(D+e3XC3W1AkXEh20~RR&e9VM5UWvMeH5Wm%dX^=25ZnQ?G7 za9))KFmAgzu17X+q3I%CLp5v^RYsCTcs-?$M3DfhB4h&Pl0`9XGIlO43Rva(s*8`} ztK^hMK1`hAwDt;<_5?CAnirtY?xF0Ja2y|5a!?hJHML?26>Xj_=@fs}6n%}yNY)JV zwiF`kjgXWsQ6!D$K}4(N^2wWdEPV|d(Xe=#6aIU6VNeUeFi-#~26NkC$7S$dKfHNR z;2UxR2H@+F_Z zd~lA#(I&X5auUbylOli1XFvs~7W^@B4Y#7_2?m5dC*?rW6dhRiB~cWwTMYAd2v6DB zdU1~yfKp*1Tm-y!QDh&DX9Z2)a}kDmKpKGC9)MsJ_Us2~4zz@!B99fkTNTx@^9d!-HeOBbNlVU8(b*eY(; zN13(+!=jdZ2;GEktETPsG6`;SVadU5rQ8|=)~%S z6sAp#oP~d7dl-g-X(`x_N3LK|HXT|3BchR;Ea6x#dRXLBtE%X%R8^*!Hz}npiqj_f z=`y*rNwA^^k|akfEEEnoUv5@;@n7;vfYN7XiczywVax)~;@Lmb*qawQ0vp`aWGJ7lqn-)MS z4b^`WmEvbWO_dNFW-O=+!!0X>!+$(45*J-pQ2rwm&>MuYFi7X&@P|+?0w+OP3U~i6 zShW(q_j9nPp#5?P2cSPA3Z>BrSFVB^7eikXE{zJ@sJ0548-%OAHUh&*xG)ZfJfTxk zfVow$s1cGa@L>;p@Ctn6jv89pU4nB9#IAqIz|uTJZ^zjAL77J%%i)e|ygXuZ`?X;f zJ=`ar^c6)yQIC^~wZ!k6V8N9xznpX_^+idhqntkrohv++-mG`CyACL3;-V!H@7Sl!%%QsPUp^7ea zuR+-`LSSN9Kzt9B-rN z<%RGEjfEeZ07=DGeL9*n+#P+ebrOG0h2YX0uvDloP~Dzq(D(5w|IKtkYCxf!wJ4@7 z;XW@qBy&QC5($Qg1O(n<)jKGvgk5qe=LI-Do7-H;=m}K^2qtubQH@Ala8_t2eh6_8 zq9o1cH=B7ItLPAj=_Hy%IAw>)(Siu|i|W|6M(Z)a~pTswHSOB69Gs`#OeqFZ@42JS)8IlCbk zFNo}&kFA4yHjBJy-v`SPMM#k=Inh8M04rKyl_ZLfQpq8*U3jAl_IrOYnu5|E(e>4C zhC8kkEZGmAhRLI_Y%{F545pLNl@<>FsyVP~p19750l|jp8q8^iEsG$ei}S}8H;H3| z!eQ855Tjha4Wf(0kwA%R*jI)npFE5*M?;S(FrJ|I$r@gI&0w%-<7qafa)6<-$1lr((h^dlh@tqH=ffO3qY{yAR^OCCGJ_oWZiG{pJcexvLzP$% zs-mN_%-YR5c;kGOxFLxTzH;1>?s>H93YQba@f?mz2Gf{aHb2CdHyboxnG(CeM1<4( zqC9)VWlvw0Dip46jIeUG&6yPJ>>D9pukzT2D%!RbP-8B!qD+74!y0zqk3u1gccO}YPr{QIQhaMo z6VzwnKohS6|F*4);Eoe;po#QP>iN>C0$$kRCa0R)wk7aCQ#q2y7dg*XQAP_Ylyee= zsWO3>Mo5z>W=wwqdI?R{hz3I0 zE{gk{*C@n>vMh8#k|aEd5~3R$nid`|5LO7+0ZoU+b)q{eWMO_)iZI+!1a_a#tz#rv-fh_N%76J40=K~;ZD9A6aCVNW-l9}+^vrSsvwwcwUv z&nS#tgrPQQ?SQ!+4Aw&Ct#vfiDVPH)CyqIEkGo8z95QheDiYY3v$j&@yOji(mXi+s~G3|EY`2LxoK4%wWO2X7vn@% zgld1)re%2wEn*|-C6LNsHInR8amp@5*Q4LFc~dUpU~|DP(VhtMl{*a@zjy|sQ(_xO zVfl6S-1qn#a!!eO!OX zN2-9Fk}To766LIoQ|l54>BO7E!o1p_!}ELs0hK^NB~(@^mYrFuK34(H6-9!aMI@vl zNuuKk2GrRMY0nqH`3!TXo(!$wu(6Yp9OVA~Te#kt#N-7+v;tA!0s=M7lfx&i6iMni za!Qh%lcQvpQDljT5+bOFFysIsH%foptwVQXIIfG0k4Atn5)L*hQ?w9an!{rJCP8&LqKp4@O5I-yk$VUL_#jmqY<@eaLwt^)P2csZVqo*DQtmHbG4_ z9Ib~7qu|+FjN*NWKdyt7es|%a^qsyeOP$FHm(qA@bA9}-ERm1 z<>oE0rcvmi7SuzP3R5!=Q>BQ?vIxkptAX}9c)t(cIR!lv0@Uvwf~gJg;I%L^1YNJg znI@Rq40EHS{EKQwEWR1-8v?I~8yGiu8VrpZ8(SFLfNj}wX{}O~YEe~IWmaWor_qp%)e(&=$4E)f=+SE5=pL! zv^>t--;MC=^9>I4vJB-K{M)yVvhM?Rq`OvOHV4mWd=4D(EcU|-U>gO46`dq z^Q-;}pN%i`npnta#9=aM{8JQJSnt>o%?;7nT$o4?YCHg~PM2IJL!89Ol1$35@B$wz z-Iv=4g;<#Y9R^OTTLtd~!QFD509ley6v5GwG#RfO(5X4-lPcMwH2|@0-5qe#(m5T& zQYjWqyg>)|HNbz9W$6au=@#g0=@&(ju$NZb{+0(zKIWp1qyrwLFt{~nitF- zd|t;ND4*u>k<-js$5?fjk)?zYa~P8p8afg(NfMLD&@yU-r36=U`T5#k@GJZXS(Z_y zM}dCfENM&3E+@E>=&||WyWtNtIDHv)vK+5(qk|+0;HD{fTS+3A_iHtn>xpTew9wCtT(~j{f1|?B zzXxXW@VbA)fDE7b3e27r{ZRM33SKiM_M>SqU4TL#fVu(H+Axw8b*D^Ps4GSxJah); zpMY>dWLpa{JkS#0_rdqT|IvZwDOlJBd+vb!+hpFhPo@&7JbYT>vtL=GGNkdo*BDgp z>{8j$gGrAgKd{8we;VRXzY??lRhJ|Q8OzCh_ZxpDhTqVDtWW9o9y3qNeEpP*nj}b8 zOs6i>b79+d2wO4Q=VoA}g>ra_{X-sqe<@+(3$Mc3-bU`^=*?C*`!SU-Z@T=6b%4}l z!pEvtc`RmG?9B9W@xQL6E{bqY(SRwhr8T3NS@+Qc3_H>B=Y^ z+s#-1R>e~kmPTDZ@?#nH{`3WCns|@xVDo_@o2wcv$rHr8q=&O3Ay|(&<<;oM4w4jb zppYSqMD`O!vFO){`mAzQCNpdzZMw8;E=hl!kRCG8EtTeS57kuYR9z$)GQ-y39FH=h|;3Xd8sTsD12PyZ4@DmwZ>Cx8L*i;s1E1PU4t4PWvtf7-E6({(y z?p3~b;|KY{@cVK2G?vm}w0s}_)i1N>ZE(j?p?&kX4rjj#pF08RVfcyHiJHcf7Whwq zDty?819)Z;UVjkYcmxVL=xw>CBv5}!!+4?pREC4&aBxCU6#`e704`ol^UI&;vL3=y z%R<`qC*A>HIs+%p!IhKnCy&GVx5HgW;d|aDio0i5#cEcvHJwX@e83A{Eti;T&K{yA>olq%>#@wbOq?wC3!9R;qu+o2nQ)}?{ zvd{qvW5^otxmh^30M068?uN>kpkMf3hren-@SX58?}m>o!|`RNcg=Eo7|(6+2{p)R&wwipC6^f z*!~Xm41RWegx*++6;I_CPApPwIaE3clmpT7tvV!1kBA6$UB_<8v;!5dqp+6VWc#au zD;m|m%u=n&{OWg>Dc-(Hc|FgseZE2WUtOWRYZ+zF27G-RU;Uy^+uncRs?}h!oflFb zx&#{;qKyK|*T$in;YaS#dGlPF%x!Hl?>i623!MAIJil~G!O}NrIT4BJ!CV1uS;c(I z1n)Rw^7pdCf^Va%GVhrzGQBOdYj%L z!`TYE;h~xedPT#jBO?z>|x(0sKkwUx?<^~vV|M4?@bKmvQ0tRq;~mIlpZuuK+ux*8sCbx3!o)5Jl7#c0Nq8`T)cx@O zw<$#Vh|_?7P84J5h{E%OPr#kGNF3e+QJA2{5{jH4%YDLWA`Ak<7;H~WO3zZ+V@>YmSI6QK?U8RTNRP zQUF^LOX%aHu%`hFV*+%d7^JjdA%z#<@v{;Y$>gzFlTdDADj}JYpnzPs1b6L~$PXvD zf#5_Aje)gaxNsa3{6+3PET(8*JPXIZ4#}fXJPNnnDKURMB4JAjbNPh%D*X4~g?Iie zyzQS^eEuU2mxduTVQ}ILdw8(9j?=F5<3CtHzjqTZ?t@=c`9lJBjTzjz*CTxG2Bo_< z(fu{pEWlHf@b?A{vy5>|5C6yldv*o<{Otuky0S?;TR<9@**zNb_*%%T<_lOeF1i!a zxvcYFh8%zH7%6b#YZCu%WcVvt|`3Tqo;K(9>%K6GPOK3bT!bgK~|Xhdp}VIS0)h zyz}@3=k7Z}Aul1H8>jF@iKF=v+S(O<{?9h~9ru4I%KI-+Y>&Y2WeM*Lu#Ya19oYaq zqTDr6DlyGkmdtMs@pBi~_}+SffA+(pc(=IZwQ-WJi+^bh<4u?Nxzert-2YdE3kDna z#jH)#X*K*l7$kiUEeS;hNs>j4Bod$`DH6UD5w6;p8BO?X846x67!Xncf-oYA5)?&3 zvlV}WzLt;IRZ&evEW0c6U=_;mYYinye+AAE+Cf{+sG6dp%7T}c&!$PIOu8Kh-wE-0 zV&74}9jBiHU4JKBh-C@sIzzrKgG4`wkUsH;f1CtPgzJUE#x+X%>+>>(u8``Zp^;HB zQrdtCtEW_<)~~B5vS7S=u0QxOLSHa!qac4K^5cPF{noeJ(wF_!U;k|ixjf^e6STW+ zeBZ0bx>8EX1l@c+nBGvJH7fsQS6$RIG@dJ-+ zDu=8{=JwG+K39-8P+08`Cr?=F0$#kBo8p{Aqu} zFdzs6WJ#uwFN*#99#I^V%LrRXS(ec?oym!5dc6*vZW})cF%6TMscl?dxP&AtB(V^E znx2?OLgMn$WmHu|k!5_}qtolq>a-w%+i$%CfLgsq+DcIwsz9g6)WkTAXo)LV=Lv(5 zcBjR9ZJi(tkdUYhS4dfD);HEE6-s~Pb9rvx@df~@&Lti{`53aI@RhGl@r^`s+il;_ z=cVJvzpan|(0|-3z4*KS@rDXw-WG4?Av{it-Q{0Y$Qo0ok~%w*YJD~NHBGiY&MJQI>d2= zqNwcNwhKv8IQ`5?A>b|9jE;=aY&VgRP*hC-R1zUe3hNtdjE#(O>GDN%O(#hb9M>TT zd{jk6mJ_M)9uph*(i#Fs%dDN!NrZ^>>j?2inWV7ZiRniCysq9$J#%| zKf<{0zWWBL%|j18^pe3;-LmB!iGOb6a|n#*X|-oGO8*Z{uD*Uc3o_zho-88 zp+~O|T9`dn)~e*PIZA~R=Vs4|_OdV{BEpR$y4?|LJ2`UT7G~!! zpldqA#bJ^pA!Vhxy1K-0xx(t&GQ&f|$Xbl=dAPnux7)$l8V+4fLXnXyV5w-b;bPr*23%oJJ65<0fB zM7ZIId190d#IEBoCJJNxAYjMLF7mkow%x-rEq2W8q;>WLaU9Xbcr0suh2VK`F6pF-ggq2EBZ#M~}fFKGODUYyidOPh-i&CL1ri!vc6o&Yr_`fYI zU1n;08c9)b>`in}r)ziVC&B*|{}eANo((?Fe(h#KNOiqXv~npDDN7@c6Y^P|R8c6g z8GQx&(f(4K*9n*eHWx+X)9PxE#pMpAo{*OG?T~+DM?yB0CT*Bdguo36{RqF|_ay=Z z_yl2$?|T@!Ng-PxrJKYg=$g*XncbYfc$PSc$!2n-tQ5Mgvupcq!g`wX)kg`UfXAPD zjDvd*IXWtp0pA_#p{Ri%(G&}ugs9UjGYY`WbJ zV?_pX&PgdG4i=QhG9}Ek1%`r0wAnTWLd%Y zJrWXf*&LZvc2FzR6b0MvF+5bETC37&i#B`D_lV<&cDIe^xx#9?pON~$&y}Ui43~#- z*EK5IE-tp8Bn(29R+q?SMI9=P!W%@SR9Sx|j6=dGWcKnbBf}%K+D%L|MX%QdzOfq6 zKgB=pc)lst3xUr|4e7W4{YMj36$NKSk+BM*ecQ~4!n2;%&~JDUM}@S9KiI-0ad`cj#@pxSfC?i19AyOv3+JIw%w!W z^r&e2sSKA{wa;_n%yGgXz|ajG-y@&RGcr8NaA}D1bI-7SYA3Bu3)iz*udXpMI*I3d z)EYHZS;aC1u&&qEiK7@z*U0AzWYd3H^0_>gVPTpUnx-MkGG{KFK|-S4ZsK?@aU7A$ z<{2NIWMXt2Ns@3}hxO_j#X^z!g?UWFAZ4X#_u7O(NTbyt2>d<+`C8^#$QQZw&{0y} z7};Ew&2Wy3muHbB1zCb(zJwq8^m;uMRl%`s!KjuLT+hLFdbpm8uIfm#jN^aWynm!e zdXM$ok?}2v-mGY{`*uG5(O>-CmtBN@DVfI0-T%w|>`iAtk}P593Pwtpp~REcsHRGG(`Dgui_nW`tvMK3oqWD;L~mVV`YM`? zA4CHik2pz?;)wO?8r!FLGQWQ?N6+aIh7pD?v2A=0er#iz7FIBdIxKUgwZeLJg^BS= zR#umZ6PUYliDJHp=ljfepJ06KEm)St)kqP2Brs$SgS-VOUNA&C-x~efT zK8fqO6!S$SNha`pl$=WxTC}@uiup3lR)a8!X||gTm4`8OlPC%q8yRO|X#o(+x~5@b z=q9e`lF#PJXL6+XtgwIYJNLibarOGX06cI);nyO(LCQ%ae*zseG439BBGC?|(B5=XCA?SalNi0F{Z$wK(VZd;? z!bZKuaB)YRSN@-o&P*ZlCV}?C5QrX@`i!PKpdO%m(HOmDtmVBWwXA) z^u!E{%L}ATi|Xb&ySD8njABePg{G?1n{{^1?4&Y0!qwHQL}5s?)nI078>*_&Sy3oV zC3LzSN~IEx>tKKCCMh#T(VU|0F5!AEjp`~rr$;uOC6~#gsT!tX5=AklVNu8xc>4S) z4BY?;+T9Mf?7tORmT0w`Y;11exDK_(6CGV;R9juMrWAK~cXxMpcc-|%6pEB$!QI^o z#f!UZaVQ=jcqnc~i`zZl&7Z6lImyao&&(rx&!T_}Q|#c>FdFJ_RNDpPl?^Ea+t^2% zN41bJf1dnq-$XM8RXlk(Z7FKQBU~z6zh;cv-n^Gl&@0I|rzemp_kkmQT)dmb(DImfFyu zhbs<_pHC7wSoG>+A$i*Kk1T6TyLeqg%E4PR`$LWfAU6eVH+GoO=S?@RuFz#od;VS& z7Zbjx9~9c#d0`V(NYr8>_{qud^cy{NZfsF~vW)tJ9Efa7h-uX;#jjerdUN>vcHGW$ku=XNTT-)8 z%No*Vt|tij;MhWfmK6zn!OAPAs#g8T$sqs_91wD#mxCqmN4g)`6R(OWyRx9~Y4EuV zrz3};k5}t$CbgspYR#)Vl0Emt8<-L=O$dis?^*5t|H|Km=GzW}?}DYfW1ofI)-N6l zvRa{e3A17^kAz}D&+{m~?fppyMI`|qv!+7EPjrZw6bEOkU>IP$dD`^Be4kJBbN@qi zY5xN>np7e;b$cs_@UZXRFxnE;2GkxJ3L0x_`fiIBUl+B^-Em)!33Y#ovY79`Go|Fj zM_SUGm*T}o!FAG!jA3Dw^H3v-@|6w--^G;pZsWF;G19OOR(hyvs~gbOgl@IJV_n3& zAVE=+)7fJ}VC1u6Ub6Kj=n}0JSWAkLzH>J8H73@KTYKBvB$O@Dt4-Uk0;_7ANhUMF0Acs5g>r| z1hCJzixbL%S8E_rnZ7%fV;w-5VHjiRoD)qdB0Yn826sk$t79`~$eO_p|1c5|#7f)iNOD zT|Sh?@DfWMhvi9!OxTCz(AgYuNbHTnY=OO>U+&0=JOLr$$nFB;x6AIW-v#&V)a_Of zNWa>NBq)2m>z&nb4b(p~zA-eOMN#}12`zedhS%i1WC-qmvwxSFO>l5f;$#%{J1UAQ z{XD{_){26V(RW(?09{t3a2Fr#k0<8%tlT4L*k#*o9Pjfa_dOsiAn0%ht zs!6_G_(khzr_$AC8&1svzx?oUE);k3ukK$2P0{a?Hl%yEZ0{4r^M&8}fKd>0tB9Q! z+pitf%#o9JW}w;qoilkeh*h((O$(30*m;9?^^QMB6-~3t5mVbM{Bm{mA_=KuY~-oP zcva}GP`I|-?D>ysk=&~5@ia?^!#ne{0x_An`Q!|Sj3R73`644W>Mo82yqE_+~$ z8i2Z(4^W9Be}Nq|d4#zWNCR-sWxa zcS$M?0kysj(LWI4SqySsF6=%^?e1<VNpdF4|NYSTJVraPxnsiggs|T0y5YPMKrl zwu>zZA5TIOvx1OxQEN-mHeFjk*&XoBE0(ev36r<);zmqJIV_*T%?fwu&pCZvm-7e@ zjb&p6U}Gl40EUQ|1Rn<$M^0NxB*Wgx4qFlnG%RME*~o^fZy;sx)7u$fT86l;USW_| zR%%kG_vZ96%-4My+xmc(gKW(|+n`;YJ)6-k3Fjwu-64*Aaa&2HN#WZc9C_^F;@z%f zc6YaZ?K{2mA13YJUQ@na0-;Vx_I=nm>^K}S4Yo265G1ON_x!UUoG+1#pe?ngLR$?& zc{H=S6s-AN7gy&BRn*2WW@1RwxaZCKq$Pwgl)S%WH~N)~Dnpm6g~#t(Op!G);C#!d zm?0ZGZ5MDgX9IFbSNXiBe}10$(4Rm>ckwKr_UHU}Wr;#WI4u4=_C(MN3rrN$rPx$b zwkX-b-aa=XLf*>-30k>%`FQy8dlm@yf=wcRX9dm9YnhoV75gOB^d1s6_sjpT!9_E+ zu?IsV4MJXZ`R|J5eycgEg0i4Y)Zou|QOdqbHKr!qt$RetNk*aJi3LXZxd9ljHYrEe zRBiY-3VTxBe73-A_L6}6cg~l0|3Se#Q91%Gs=UrP z{JO%~AN1%9^x&Nf_?k?qcvTnZNYLaovx?gC-r~oP#yWkr_u^NvDqOXbA#n9 z?GTiVFnK?9t>dg0VHllU3O=Im~KcnyhJ?BM}cAYGs~C zs~^V*(nKCkK|b4LSoFxE4nCkp?fS+*XGDN7xS7Tk(!g9lZ))j^KJk>6;EhuMf0UTzpG>Lto7;EriYRyQc(do?F2B1l+<}_d+DNV9t70m1KYz~2SC$K$ zrG;YOo0>EpHwlGAs>r&!*5Sf^FeKpgbia_E9HBNL*S7T$PZ58RmconLEA_ZL`zIvm zZ&E`MAp=-8%)ORALC;_F`>0SNm2o~Ir?Nfh#M0RuJ$)KsLJG819=r*t^T}jBh_eM7 zSCO77#e(A5SmCsT>rR!F@UG#hi%Y9~Lo}E2WKr1oPyzCFY-5lfPhMUde}+v`MkJ#s znX}=)FWt%PT6Ws$0_wKL_9MaxRz$!%0a7Z#AgsvRc#b=gMNWIX7BT7iVL}l(6h>cL z8y{a@U%2;$A8mSj;K4keV9fZ~`^c-?ON87Oq+Gn@hK|rvjPk_|FZ?J{nj@`Zz6wf3 z)rwE~IFAk!8-YjpQ2Wo*;{H2{lTBvf!(hTb__M*mP2fQo+NRF-|00^y`&UHc!}`{f#zUCP$gxJn2oOuei%q|+PB)f&Nt+%WerkPPy{>|xlMw`;P253Q zV)e_SmuRN=m=`51199qHx{1Mj34q9cttkX5)8ZXssO$+T zW*YVwJSX=T4zvg!&AHJ;y#jR6R1lpQw4$q1qXKMi?Hb#ZV>5(X?ND$?J%JO)8aLiF zm3T}pR4`QV*T1tzNHNGaoC~Sa4J9|ch_pq7-D`;|9+tz*FH-i|?a$PsE>n|Qi9X|Z zm6B70f(xsAKL8{$v&uJWF~rKIG66L&adZ9t`f}H@#Ei^(?4J)1JhMK zNXO2&9PEBnBTDBX^m?tc#*?i~+QZ)FgIqtB zf1-O8I2_swdu@Y|=%|PGt#;s?ds)ieqSKln@`m0obFxc%QZk;C8?A@aWZjp-#Z1Kx z>%%b*L9tcVIm};j#5~xVMCf9CDu#A7#bcdv^;}MeJ)(EJ$Tq(-io<=gi7eZf*E6ir$8*y4r_@udBvRCR}lHq_AN6guRpa%{z7{$C#dvFxMdmSc}#1E-A=eVh5g zM1X205@df#w4K5k5CZ{h6~23@mOGL!dGB!*I1y12H-a1YcY+@wz(_yX+-lB0C;eLy zKVj|>QZ2F&UTx=KE)LaBqQB_7N$`Ak2 z&G0g&+MnaNul+Ig9xp$B{qQM2P|*3YH9XG}aX|Fp5GLR}E(wFDG%p6kw(ZH=N+ldi zyXGRW8L4`5?#{N9k}?y((P{f{fF^bfJ*CdfTf^y0DxQZF(5T+ z5m#}Uk(E2#H~gh&V)69;mO^!T6k>q8%s(znAnlVAe9 zX(*pSz6VfQ*;_}(G%{1;(O1iP#1}I$#X2rd**6K*$&!uboBEL%w&iVu} z(h=2$Kp#|OokOP_t`=E559HHM0Vmaby@HG8rnXQ*U*A5(rQYxh#D^d%CcIP`EI7Cj z&E`!xZ9IV!eZLc)Q~t&coXC))5|9iZsY$s!Rz#@|aVQg=3JySb9Sip!9<925n5kRG z*lc*^hrULVo?Cj~e;4yU7qFiZT}durZuYJSo6hyVED>Tn6X zT6Jqixp@McGdXpGW`!N}+6i;>@9Ly=Ruc0;40?rLKjQ!X&!MCBZR^7k8;FAgqbbYu z^kRSc$^WtBeSI(S^}qZ+bc|qIb#cUixBXXyv7mQR;g-+&IWeRaEwdH!|B~PX+ywN- z2w7Ef8PYgny5cY7!Ym5dnMc?swo0wYD;q0{|X%nA=#v$4-N3yb0dKB%_Ns2IOj1=|V_Pz6*3 z(x{PSofFi7a;UiNpIuJxm;W@KAx$(FPe^1fs?0ijniRl^TFaX+<_W8gTlEGk3UdfC zIf-466$ZFvMWR>s=wG-*-66U`wVwX|VrLq_^CFFTYw1M*TxwGen{w)Q7e^{v%895M ztXiUm&NzrLdy@PIg+QluA)SV`fk9m{sfaciuP7*l3r!0@4p1X*;OPkMT&3Xpf8;P;ITQ0JB6To>8t%7PpEu3Pnh-E z3gZ^{N?qVt0%u1O``p#3{=bE3^>HqK4T_%IUWmm5$p*^HWzxA~oQ=er zBBA?6^83RNLEpI4Tn4X9x0OP>D#75zxDmnXUIJD7Km$4P@}JEmd|ei zknEz(aE4y9+=p+f6`6AR54HSx<4GQV64Uz>7K+(<@EYOaN7$3;>emr`!mJ79KTFX+ zAOLFPiVr3flL>`2qGGl)M%_wFtxh2Ee#^$?q(XcznDLXym1XtN}rH!_$YPVXhD()1%qd>JtOGf|p z%}YI5#@pQCr&xIT@g9%y-PuMQ8>??Y91SbLl~MW*dyGfK9RgvP#WlRPsAuJi5krLD z#8^wm7(tC}02rLk?qN5(|K+T9W3{4Bu4SFwxs_!T5SjlOuNw{BngI+Oa7dcykAg*# zJjYy)?8}&+-5c>Z@{@_9xQuz$LCM{y=unjnnRuEMJW?|tQj!cs$6F<%4khF)%i>HeXzGJ0s%I@PE552BZoN@~|h;T^drwqpFbCVxAEm_ ztV7uNbm-u_Qhq}oa;t|vo_}lKOV#=nBF&PAB|P^(T0H&HuQZFNVl{U96l}AYJ?7X! z`muGN?7gRYMi+g{Kxp`o`;l1PdRd!F*7RquFw~nvYJwo?b}~PFhpF0=G#D5>^Z$7S zW+c_IKyY$a(NW>l#6a>x(AS=@`vUk5bTI+}{iO-mCN5DHs@$tRh6&3CrooNc#%f_Gywu)Ih3^ zay76JY@3AvOT=SSJi+;H-%EsVAZsp`|8?Yw=dg*Gw$cIQEn`#*Qfd#5>M?g zu1SYlLgVjmo?kI7W``-vSE*tpC$GlvRc6|L9Ts5P)yMEF;b6^1HOo zTb~6>ztH*Se(9%L$(e{rQ}^dM5Ox%0KPJVyc=1L5a-w@6LJR)r>erH&k-&k#SN3Mk zCsHv{3l)Xy1RPz6M! z5MAuTU!pfp#cP||s$SF3yURJIM zx3(feQ0mi^$Rh+xsnh4pES$Ie1fD3rQ5amGgAI&1H#3RQxV|e#@Jm`5YqyoL?d=Ry$Dy4-&^GVKt^WFo7fgY zDLDKiB+gUG#>@(muLhSI5#i_#YmlmASL;aQ?W_pocx9sA5E8LudYETrf?|ho6^&}^ zc=#no&R)I&MwNe^{{hE^%-%Ol;pN?u)Ll@kUP}$IrOoh|5ZeH~+?a-#Og>$@svX9K z=wM1%`;#XRp%cpYo2fSw^uwFkN8!hqm@(jb7UY=lHfT5v2H}9ZB>IDP|&+^ zqNH!~Ykv@la;ngMk?h&~C2sx=rYG z`pit;hwwu%bSeQ{SNoqJ?$G9MuTt(sI+~5IjBblIH|Li2kB$f^RP2=>6_H`~InPOh z=WdpQ;T}K%F1sK;pBK~!v&|OdP^HCSI`?)1s#IGp`Z!suKO`&EK0~;zMa(o#h7u0AGHl8vL4yQeivt}Of5Ug{1lJdstE zj#Z=fB^r3huXf6*$~goU+w;e*BUzbt1`xxELsZcJ^h4fObEHsZ9uGEWsZjf${`IO@A{a1Cd_ZcF<47Aj_wH=+%3+Gp){FS^4Qcj1S-L zVTETcDsEtCxbib5?Q;2J@hqbT&PnYwP`6KiA^vDEk;S0po2@Wn`*9fgxR}&?_ze+k z5P7o-<-E>G!tZD~WdXhZ8d|w{qs`390ttH^&D{i@KM|3Lt8E@#)bHzm=4>|{1)^EY^%?4py4v!FK^{-r!N=}6IKZ}>!Qz}^Y$F7}*@+4h^c@YD8 z?~3HZs)K`6J>5eO(Lg}+sgUW|v;D_B=Wc3`{7*-d{G&V$4*?JinIq>+VbIpoyJpF?_k-jN@e9ig0Bxg;1f6b)GJ`gZG{g*;A_0f-qy zg!U7uGw7ftW8`eJvCxY}o(K+PX5OvBk%udDpF3mZEXXgPEEA= zM*;I4ubG?8(x<7EREmhk*6-{bc+e@+qyZ_SExIJyr$TnJ1#m1Wc;XImG4G)Ojx0bz zzV%Cx=~IH7Q&S`Nmuo5Y*VWYisAB1KP2@_P&=lb#nuX;jwkhf8h1X<*H=5 zVdZ$c@(!x9k6WORfYt{#eS&{*$=NzR6iM0_9I(CTCYuXT)ej!ye>-bV-)mk(byK zYO}t$?hUw!KvqNxo?ZW3NlP$mfOVBakhTkkvl`d~^k%|?<9};PscO`~fCSfQiSjAjK|+3T0Ke7Z-YuL^Gda zQCqv~?*`>nBjLJR-y~4ZpL68@$uDpj2n^^$OPd5;BGK++vkcJ+B~F`oCjjRj1v&nd z_e&a~l=S#x$})cYW_ZynjdQzx3kbe+tO2`iLY!Xoxj#pZiU zA8wIx@n}f}?TdvJ8U4fSG2y_$K2kMRR}ok~f|0ODV+s%}{;rerSsozlj$*DPO^cWP#CK@%&> zr>+S0vQ@VBIfw0TyC`>92h1o{dHS&tG}=Td?E8T9gS!l#64V4thNy=1FvXPmQoGX z+pqOo{=B>Ud3dwp%k9rsmTs`tmehvND=AzB$C` z^`zF2O=*HfCqFvm(kEN}ic09V3;NuOyHUOHKe7}G2VRk!#pTqd@H*yrv;-hm02V?% z(dnRHM!`kl;Z@Ff>T#_J`k-Q_K|VD;^)a5>w;27RB_|vc>ViVqOu9DB3n?()vVfe! zCHPSD_5JVnbst;^@fgTIaY3nx?U5>A*oUepnUB7Vwc5~qzT!w9N$le}rxpxmUWx8bjGmRN$PMr{eqY8n5C5QNIZ;$?zz-(zxOj(sS( z$F!$$A(NabI&GqU8~M)#%{IC#i9?%+U-im;dncz;$S7w%lPzET#dpgU4%Q8PPx6uc z&roAB^u{N;KkyE+(t?I&N*tHdRs?6a$*Ai!k+IN0oVOMSVsPm<&<`|9Ej>b{mTt0G zT%$*UZLPcf5~!M*>5{5p?8~gWlu-mX-lq2USkIYFlt))p<{|cQ^@c8`-$Xh%tXg)J z#;n$AK)>Jdw=(8b$oU?M^)SuwaYR}{wIq9x4wfWABulQv0q6ptgz8lF|+>c=q(#x!;&VOxe z$Y*buJ_Ft!rj!}`HPgHP-b-r1LpLh4w0%NWUpJF7*qT}%F)f-)efd{~+QI(*-2D>F zI;|-}Y*-$T+_BkHIOzc;r}XvvgJd0RV}f!}QLK`pN(s;fS_?c?X283gavGZiCZc_e zj2%+bEYK~()mgYCtpfG9H;}1jxMVZ%pcy~xJA`As{J9>(i)Uv0y*&Z8>q%u{dA(h& zCmN(myD~EO4>|pLY&PkQybH{WG_v@nG3mh-F_0ypQzc_b4VP(WWyH{`@ZGfy6DJMi zpI|R}Ciuj&BV@3C78LFpIX>*ghGr9Ob7EJx7RMk>JIvaJrgqECl`+(&z8~yJTxuSt zw#HEC$-JkFcg?IY)`W)u-izf}4b5xWbIMs@{eUAg=eiuT8Xo{Ns>nb@NzRxxoqF+` zb||?ftH`9@^Unr+Qw|z8cS)Hx+iwk!pBewk&&&zC=TxVpBqt-jR|efQ-f%z+j8v|# zL;Bs)c{L=Mow;UhXfcI;zLDpWWFsp^UHH3Mn|&AYLtu`Cnib8*RSQeyR<#$|ytf#k zwtnh@J}*XF z>o2kn1)G$Vt4La>7Ti^ljqtD!3XL|B?Fgxe%#RwCR~B=A$aJzc#bCa7e6n)lW3M5? z=|&KMxbI9S=F{Nm83;Z{`O9Z{Nqei^x};v~wua#|nEnIE8fOQE_BvL%VOC?a;N6a4 z?QpB?m;3d1E+ZnEWC;fqoBv2bx^Oi;0lyrrNY>*XrXN+=>Ln_UpVc(gtWcz}5K48N z+_v5d;tn}!%1T#V-S2;yPiFAgIE;R4d%+`y`*(*qijrCw3g|xj#JYr88>$j)#I1*i~Q+#jQTzB%H@Qwu}<9=dbHB|zCxqbQ$>$x zYP3+QA7&Pc3eK_lleSpsw2vY-a;(GZ5}b*?!2pIjk zZK7=ZCXSY6Iy9P$03#I;E!wYvRknpBq?41ZGl*;{C62NkOSuU*BVe2$Wt;OX(?mn4^Z zSf{_|l-d-Q(nMUVzAY0_NJ8z5t70tic*MA-=03$7$1uBX8q9#g-BKIb!%dLh|IDcK zFefo3W|K(%E@4a>_az241{j+d%OL#%moeg@$P2LG_vqy=WmTi$M~&}a$D?KXHoe3% z#i#q*1nNec5HvDFM!3|Ax#SoGsCWRU%zI+ao2OExieXQ>A`x>1%n%or3{@FjDvPYR z!v3>Sc|rqxju$9%z>r*^SSjZhu}ll(M?BN6#XOmawU5u;&oTF^PM^PP+L+QM z!aOx@8e6qm|Gf{*JMvY;n8W`Bx12A3Gl}LSQLiBSEYgvcn_6vHKUxdfit_d{>%E%@ zNqDBJFPra4=+O?o`|U(P%`QPQeg01`czZ8q?y$M=96AmX#V!o%$W*uy0DFEAi3yN+ zu3T|}D;ZHNInF1CKPr{y=>1`e-R1W;?crusGlGCJp_~_k9#$mAdKo80Ltd%=(UETx ztWPoLvF*)$y5IKhqucoR92y(o$B&V4@EZamX82LhV!l3y+xu zCz6}OJ5)I3D3lx%eZ+XTd>&Rn_FF5PCu0(UJppAtbon`PFF4*!Hxm5l-Mjl&Bfah- zY9Shvd?&l$C~|0oI@kEe`|8_kwnE7&?wCbzR}7OMPT*N;@XF1z3*TpM;GrMQh}{r= z;2c`Da%+ zWd+GRb8&$kHFy~rU`5pKtl7%tl}e5a#F4dJM6Lzu{Lc*KT9BOhzS~G0f^+}MRhUwX z%oMj;N*=nIWfMbG7nCVC<#o~E?Gg+~I?@YofpG$^JcIjG w`a`^!KX-G!`x8mR!T20(>AYiN{QC!1ZycdBN|A&c7~rNXuOU|_^C|TI0H1_pssI20 diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 55f0be35f5609..b7bc510d763da 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -131,7 +131,7 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { const { act } = useBackend(context); const { info } = props; return ( -
      +
      {`${info["desc"]}`}
      {info["hints"].map((hint) => ( From a67fcbc4de3b0d79ab872bbb16caac05b0c5bfac Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 20 Jan 2024 22:42:52 +1100 Subject: [PATCH 074/339] Announcement - 20 1 24 --- _maps/_basemap.dm | 2 +- beestation.dme | 1 + code/__DEFINES/dcs/signals/signals_global.dm | 2 + code/modules/cargo/exports.dm | 4 + .../xenoarchaeology/components/materials.dm | 104 ++++++++++++++++ .../components/xenoartifact.dm | 100 ---------------- .../tools/console/xenoarchaeology_console.dm | 113 +++++++++++++++++- .../tools/console/xenoarchaeology_seller.dm | 2 + code/modules/xenoarchaeology/traits/majors.dm | 4 + icons/effects/particles/misc.dmi | Bin 1579 -> 1702 bytes .../tgui/interfaces/XenoartifactConsole.js | 9 +- 11 files changed, 233 insertions(+), 108 deletions(-) create mode 100644 code/modules/xenoarchaeology/components/materials.dm diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/beestation.dme b/beestation.dme index 80e5425d4b257..c1c1acb114cfc 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4164,6 +4164,7 @@ #include "code\modules\wiremod\shell\scanner_gate.dm" #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" +#include "code\modules\xenoarchaeology\components\materials.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_labeler.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_machines.dm" diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 132dee7e28ea9..18b0303b09b93 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -38,3 +38,5 @@ #define COMSIG_GLOB_STARLIGHT_COLOUR_CHANGE "!starlight_colour_change" /// Called whenever the crew manifest is updated #define COMSIG_GLOB_CREW_MANIFEST_UPDATE "!crew_manifest_update" +/// Called whenever something is sold through exports +#define COMSIG_GLOB_ATOM_SOLD "!tom_sold" diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index e735cd9d98539..9e0ff89844b68 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -49,6 +49,10 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) report.exported_atoms += " [thing.name]" break + + //Send signal before it's potentially deleted + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_SOLD, thing, sold) + if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) diff --git a/code/modules/xenoarchaeology/components/materials.dm b/code/modules/xenoarchaeology/components/materials.dm new file mode 100644 index 0000000000000..50d7cf596fbf6 --- /dev/null +++ b/code/modules/xenoarchaeology/components/materials.dm @@ -0,0 +1,104 @@ +/* + material datums +*/ + +/datum/xenoartifact_material + var/name = "debugium" + ///What color we associate with this material + var/material_color = "#ff4800" + + ///Trait info, how many of each trait are we allowed / start with + var/trait_activators = 1 + var/trait_minors = 3 + var/trait_majors = 1 + var/trait_malfunctions = 0 + + ///How many malfunctions can we gain, maximum + var/max_trait_malfunctions = 1 + + ///How much we increase artifact instability by for every use + var/instability_step = 0 + + ///Custom price we use if the item doesn't have its own + var/custom_price = 100 + + ///Artifact textures + var/texture_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + var/list/texture_icon_states = list("texture-debug1", "texture-debug2", "texture-debug3") + ///Artifact masks + var/mask_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + var/list/mask_icon_states = list("map_editor") + + ///What rate do we convert custom price to discovery points to? + var/dp_rate = 0.5 + ///What rate do we convert custom price to research points to? + var/rnd_rate = 1.5 + +//Set this proc to return a pre-made list so we can avoid some overhead +/datum/xenoartifact_material/proc/get_trait_list() + return GLOB.xenoa_all_traits + +/datum/xenoartifact_material/proc/get_texture() + return icon(texture_icon, pick(texture_icon_states)) + +/datum/xenoartifact_material/proc/get_mask() + return mutable_appearance(mask_icon, pick(mask_icon_states)) + +/datum/xenoartifact_material/bananium + name = "bananium" + material_color = "#f2ff00" + instability_step = 0.5 + texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") + mask_icon_states = list("mask-bananium1") + custom_price = 500 + +/datum/xenoartifact_material/bananium/get_trait_list() + return GLOB.xenoa_bananium_traits + +/datum/xenoartifact_material/uranium + name = "uranium" + material_color = "#88ff00ff" + instability_step = 25 + texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") + mask_icon_states = list("mask-uranium1") + custom_price = 450 + trait_malfunctions = 1 + max_trait_malfunctions = 2 + +/datum/xenoartifact_material/uranium/get_trait_list() + return GLOB.xenoa_uranium_traits + +/datum/xenoartifact_material/plasma + name = "plasma" + material_color = "#f200ffff" + instability_step = 5 + texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") + mask_icon_states = list("mask-plasma1") + custom_price = 250 + +/datum/xenoartifact_material/plasma/get_trait_list() + return GLOB.xenoa_plasma_traits + +/datum/xenoartifact_material/bluespace + name = "bluespace" + material_color = "#006affff" + instability_step = 1 + texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") + mask_icon_states = list("mask-bluespace1") + +/datum/xenoartifact_material/bluespace/get_trait_list() + return GLOB.xenoa_bluespace_traits + +//Artificial +/datum/xenoartifact_material/pearl + name = "pearl" + material_color = "#f1ffca" + instability_step = 50 + texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") + custom_price = 500 + +//Calcified +/datum/xenoartifact_material/calcified + name = "calcified" + material_color = "#726387" + texture_icon_states = list("texture-calcified1", "texture-calcified2", "texture-calcified3") diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index c5f287b44ef67..5fbc775c2a779 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -411,103 +411,3 @@ if(!target) qdel(src) return ..() - -/* - material datums -*/ - -/datum/xenoartifact_material - var/name = "debugium" - ///What color we associate with this material - var/material_color = "#ff4800" - - ///Trait info, how many of each trait are we allowed / start with - var/trait_activators = 1 - var/trait_minors = 3 - var/trait_majors = 1 - var/trait_malfunctions = 0 - - ///How many malfunctions can we gain, maximum - var/max_trait_malfunctions = 1 - - ///How much we increase artifact instability by for every use - var/instability_step = 0 - - ///Custom price we use if the item doesn't have its own - var/custom_price = 100 - - ///Artifact textures - var/texture_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' - var/list/texture_icon_states = list("texture-debug1", "texture-debug2", "texture-debug3") - ///Artifact masks - var/mask_icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' - var/list/mask_icon_states = list("map_editor") - -//Set this proc to return a pre-made list so we can avoid some overhead -/datum/xenoartifact_material/proc/get_trait_list() - return GLOB.xenoa_all_traits - -/datum/xenoartifact_material/proc/get_texture() - return icon(texture_icon, pick(texture_icon_states)) - -/datum/xenoartifact_material/proc/get_mask() - return mutable_appearance(mask_icon, pick(mask_icon_states)) - -/datum/xenoartifact_material/bananium - name = "bananium" - material_color = "#f2ff00" - instability_step = 0.5 - texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") - mask_icon_states = list("mask-bananium1") - custom_price = 500 - -/datum/xenoartifact_material/bananium/get_trait_list() - return GLOB.xenoa_bananium_traits - -/datum/xenoartifact_material/uranium - name = "uranium" - material_color = "#88ff00ff" - instability_step = 25 - texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") - mask_icon_states = list("mask-uranium1") - custom_price = 450 - trait_malfunctions = 1 - max_trait_malfunctions = 2 - -/datum/xenoartifact_material/uranium/get_trait_list() - return GLOB.xenoa_uranium_traits - -/datum/xenoartifact_material/plasma - name = "plasma" - material_color = "#f200ffff" - instability_step = 5 - texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") - mask_icon_states = list("mask-plasma1") - custom_price = 250 - -/datum/xenoartifact_material/plasma/get_trait_list() - return GLOB.xenoa_plasma_traits - -/datum/xenoartifact_material/bluespace - name = "bluespace" - material_color = "#006affff" - instability_step = 1 - texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") - mask_icon_states = list("mask-bluespace1") - -/datum/xenoartifact_material/bluespace/get_trait_list() - return GLOB.xenoa_bluespace_traits - -//Artificial -/datum/xenoartifact_material/pearl - name = "pearl" - material_color = "#f1ffca" - instability_step = 50 - texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") - custom_price = 500 - -//Calcified -/datum/xenoartifact_material/calcified - name = "calcified" - material_color = "#726387" - texture_icon_states = list("texture-calcified1", "texture-calcified2", "texture-calcified3") diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 14e07de2ca2bf..a31f6c0eb6856 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -21,6 +21,23 @@ ///List of current listing sellers var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard) + ///radio used by the console to send messages on science channel + var/obj/item/radio/headset/radio + ///Do we do purchase notices on the radio? + var/radio_purchase_notice = TRUE + ///Do we do solved notices on the radio? + var/radio_solved_notice = TRUE + + ///Are we allowed to call the cargo shuttle? + var/can_call_shuttle = TRUE + + ///Generic messages we modify to match the situation + var/safety_warning = "For safety and ethical reasons, the automated supply shuttle \ + cannot transport live organisms, human remains, classified nuclear weaponry, \ + homing beacons, mail, or machinery housing any form of artificial intelligence." + var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." + var/permission_warning = "Invalid access! Scan Quartermaster ID, or equivilent, to enable." + /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() //Link relevant stuff @@ -28,15 +45,20 @@ budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) //Start processing to gain stability START_PROCESSING(SSobj, src) - ///Build seller list + ///Build seller list //TODO: Clear these on destroy - Racc var/list/new_sellers = sellers.Copy() sellers = list() for(var/datum/rnd_lister/S as() in new_sellers) sellers += new S() + //Radio setup + radio = new /obj/item/radio/headset/headset_sci(src) + //Look for sold artifacts + RegisterSignal(SSdcs, COMSIG_GLOB_ATOM_SOLD, PROC_REF(check_sold)) /obj/machinery/computer/xenoarchaeology_console/Destroy() . = ..() STOP_PROCESSING(SSobj, src) + QDEL_NULL(radio) /obj/machinery/computer/xenoarchaeology_console/process() stability = min(100, stability + STABILITY_GAIN) @@ -58,11 +80,11 @@ for(var/datum/rnd_lister/seller as() in sellers) var/list/stock = list() for(var/atom/A as() in seller.current_stock) - stock += list(list("name" = A?.name, "description" = A?.desc, "id" = REF(A), "cost" = A?.custom_price || 0)) + stock += list(list("name" = A?.name, "description" = A?.desc, "id" = REF(A), "cost" = seller.get_price(A) || 0)) data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock, "id" = REF(seller))) //Stability data["stability"] = stability - ///Cash available + //Cash available var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_CAR_ID) data["money"] = D.account_balance @@ -82,20 +104,99 @@ //Locate seller and purchase our item from them var/datum/rnd_lister/seller = locate(params["seller_id"]) //If we got no cash - var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_CAR_ID) + var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) if(seller.get_price(locate(params["item_id"])) > D.account_balance) say("Insufficient funds!") return - var/datum/supply_pack/SP = seller?.buy_stock(locate(params["item_id"])) + //Annouce it - TODO: Adjust this / flesh it out - Racc + if(radio_purchase_notice) + radio?.talk_into(src, "[locate(params["item_id"])] was requested for purchase, for [seller.get_price(locate(params["item_id"]))] credits, at [station_time_timestamp()].", RADIO_CHANNEL_SCIENCE) + //handle ID and such + var/name = "*None Provided*" + var/rank = "*None Provided*" + var/ckey = usr.ckey + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + name = H.get_authentification_name() + rank = H.get_assignment(hand_first = TRUE) + else if(issilicon(usr)) + name = usr.real_name + rank = "Silicon" //Ship the pack - var/datum/supply_order/SO = new(SP, "NA", "NA", null, "Research Material Requisition", D) + var/datum/supply_pack/SP = seller?.buy_stock(locate(params["item_id"])) + var/datum/supply_order/SO = new(SP, name, rank, ckey, "Research Material Requisition", D) SO.generateRequisition(get_turf(src)) SSsupply.shoppinglist += SO //Take our toll stability = clamp(stability-STABILITY_COST, 0, 100) + if("send") + if(!can_call_shuttle) + say(permission_warning) + return + if(!SSshuttle.supply.canMove()) + say(safety_warning) + return + if(SSshuttle.supplyBlocked) + say(blockade_warning) + return + if(SSshuttle.supply.getDockedId() == "supply_home") + SSshuttle.supply.export_categories = EXPORT_CARGO + SSshuttle.moveShuttle("supply", "supply_away", TRUE) + say("The supply shuttle is departing.") + usr.investigate_log(" sent the supply shuttle away.", INVESTIGATE_RESEARCH) + else + usr.investigate_log(" called the supply shuttle.", INVESTIGATE_RESEARCH) + say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") + SSshuttle.moveShuttle("supply", "supply_home", TRUE) + . = TRUE ui_update() +/obj/machinery/computer/xenoarchaeology_console/attackby(obj/item/C, mob/user) + . = ..() + var/obj/item/card/id/I = C + if(istype(I) && (ACCESS_HEADS in I.access)) + can_call_shuttle = !can_call_shuttle + say("Toggled shuttle permission. Shuttle permission [can_call_shuttle ? "enabled" : "disabled"].") + +/obj/machinery/computer/xenoarchaeology_console/proc/check_sold(datum/source, atom/movable/AM, sold) + SIGNAL_HANDLER + + var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in AM.contents + var/datum/component/xenoartifact/X = AM.GetComponent(/datum/component/xenoartifact) + if(X && L) + //Calculate success rate + var/score = 0 + var/max_score = 0 + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) + if(T.contribute_calibration) + if(locate(T) in L.traits) + score += 1 + else + score -= 1 + max_score += 1 + var/success_rate = score / max_score + //Rewards + var/dp_reward = max(0, AM.custom_price*X.artifact_type.dp_rate) + var/rnd_reward = max(0, AM.custom_price*X.artifact_type.rnd_rate) + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, dp_reward) + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_GENERIC, rnd_reward) + //Announce victory or fuck up + if(radio_solved_notice) + var/success_type + switch(success_rate) + if(0.99 to INFINITY) + success_type = "incredible discovery!" + if(0.9 to 0.79) + success_type = "admirable research." + if(0.7 to 0.3) + success_type = "sufficient research." + else + success_type = "scientific failure." + radio?.talk_into(src, "[AM] has been submitted with a success rate of [100*success_rate]% '[success_type]', at [station_time_timestamp()].\nAwarded [dp_reward] Discovery Points, and [rnd_reward] Research Points!", RADIO_CHANNEL_SCIENCE) + //TODO: Add monetary reward, cargo already reaps the benehfits of selling it - Racc + //Circuitboard for this console /obj/item/circuitboard/computer/xenoarchaeology_console name = "research and development listing console (Computer Board)" diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index b1e297088f405..7b328c15c8840 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -58,6 +58,7 @@ //TODO: Move this to an init argument of the supply pack var/datum/supply_pack/science_listing/SL = new() SL.contains = list(A) + SL.max_supply = 1 return SL /datum/rnd_lister/proc/replenish_stock(amount = 1) @@ -98,6 +99,7 @@ hidden = TRUE crate_name = "research material container" crate_type = /obj/structure/closet/crate/science + access_any = TRUE #undef SELLER_PERSONALITY_GENEROUS #undef SELLER_PERSONALITY_NORMAL diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 05302a2634c6e..9ff6b14a0fa5c 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -100,6 +100,9 @@ var/atom/movable/M = target if(M.loc == AM) M.forceMove(get_turf(AM)) + var/mob/living/L = M + if(isliving(M)) + L.Knockdown(2 SECONDS) return ..() /datum/xenoartifact_trait/major/hollow/get_dictionary_hint() @@ -221,6 +224,7 @@ for(var/mob/living/target in focus) var/obj/shapeshift_holder/H = (locate(/obj/shapeshift_holder) in target) || istype(target.loc, /obj/shapeshift_holder) ? target.loc : null H?.restore(FALSE, FALSE) + target.Knockdown(2 SECONDS) REMOVE_TRAIT(target, TRAIT_NOBREATH, TRAIT_GENERIC) return ..() diff --git a/icons/effects/particles/misc.dmi b/icons/effects/particles/misc.dmi index 3c5e9945defff348002a9e2069b7a2a5d1d897d3..803c3a125e4e6d9e04ec2059167ac02afcd3b9b9 100644 GIT binary patch literal 1702 zcmbuAdpOg37{GsSS%oQ*sf-fB$t4w2GqTuZF|FoMXbDS7SlTn$F-52q9brV|l93pb zmRq?Twn#$dGPyicV~7?;&hPwxo~P$L=kt8N@B7#Hz5Mmwa>qHVZqV5P0DvmS#R(5) z`ach{4vepn{(LaKq@Ex~I0b~0t^{9>2)+~w08v@DnH6fW7Mf_0)HKxZVsgQ0o_2yi z-Pc03jJv73iZCj)vvH9x9&?o(7S(U(k$r27S((U?gr5kMLn!xt^00xjl85_fseSDN z^6a~INByLOJ38wQ&n9mkI}#^fG_JkSa@5!bn>_tpV?zqY(8~eyEFZ3-xwzfajMS{W zE8UL!1TfHZ;lSuBnsuBQd$^^3p1 zvQUY%YNGb;xS_t9nwqN7s?Dpb3y{fV!V)e)snZtv+CuQX4FkXV`g6a{oiVXk+!YT} zD_n!Mh0(&p=lSPX%=mHl@ltBtWfF%(C7e5*%RBT0z$AWa@|C2DMJzEZJ*v$L~3tu-b( zdet>B29nzZc1fB+PQIJe0VWwLsO^ydYZg==m0}=5k_v+}pWm_1#wi>AG>_#1$aVH` zJGUN##GRtGlHG}UGr^gLEEdb2p_ky(7DJ^{KMfBLKg1O&WK*gXT~fve+eS=nL_Snn z^^>8{njDbm=FSFfcIx^n#o24KsRp*tSiNt(@z!psH8nNI9n_ubD@XeJ`YJjU2?LG1 zKbn`+(R#&dih92kH&$<++w*1RjPyr$(EH`T=G=N9a^D#BWI8{@d-wH>i!8k(W&H}p zO{Ivth0-q1qm6m8^g{5%UL6h>mMe%S#(iqQdK0?FSGXmr8aXXmHxe7cu~wMVxD4HA zV9js$T1D;d2T$VUz@<4G&3mtY|3Fl|Fdwq#9amEI`Na^rBC+*}0sU1KWG{ZAQkx4+ zxh>rqpk=h5zL^pJ(4x>NmVFKHrp&4EDGbuc>3we<@EBsfC-zbZmdMreifccHpR~IC z(b|Gp>B(T4*ur}zR!X;ZEfBqGRRn=?hJg%(zbpRGM!h>%hc_NLNoqu~6$>gf`J$3UQ*A96{i&6g-? zX8&FWp>u?Lml);VJk5vl?#kBjRxJf{IzV8Q9dF z{pwt0@y;h5`)hA~NdD+mnYMNeZM+-!N?(3tdar^F2v#MQ_o~TZaKG+-RBu6Rhfs@B zT{_t8NYIGhzq8R9A-iaf=^1L1^`HpK=}(n>wlI>^o-yMc0=VYhgImzzI-uI|!}v!g z`jJ$YQj}(X^TXZTV=P0FS2ow@y+QTMP3NcxW4pT?@e*5Fu)h3O@2H8NuAy$!eB*ESU%+n*yZyQ=QLgwh?D&1MDatPri;Htlqavx#1_i9f|1+n+;;@q1&kc7uV#k^jL{M`$n0AhX=r*aZXPi{bK(H!-5on literal 1579 zcma)+dpOg39LImu+?Q22x$IzRDI=9jD}^CON3M~Y4Y`$DQbyVqBlmlT((p~j-1~g=XuUw=RD{2JfH99`#hiL`}ur7&-?Ry(p;SFp$Zxb z002O-4z_Nfr+`L~lL1eDd^{F(ZSfx7F}8u10-{5sVnQP$0DxGM+{fIKXbh7XZ(mj+ z6T&kqaF2JS`cb@$p>=OlLj-#l7vNfYQXhyMvXERTa)HmO1-kchlV>D5P2NSE4Et=h z^m`73IkxIVXWN`WqC?It`aQcGwfolA=3}-Ya{kkV2qTQm*5(M~$PoSdwhs{IIMUK5 zBz2cNFOY3p&k%{ZH*@T&v4j&nFap^KLFQL_Ns!Fg8EGH{~hjX=J zCU*e<#0YC^?LjPAxbxa^-a&;@+e728$RSJ)ibtqJ3OK|YyCma%I?>CqZ&>-q1KWlb z*%Swfrq}5%{~E~qCmfz%{(x*0o_ZwXZdu6p-Ai;LPd37&+8wtVJ*!te2iurH+wjw4QV_V85z0niguWl z6p9!h|NZBKBu~%YmaG9q0!=!c2r@W2I+~?Qzr@>9@vahTAhjdlxwkB3zZs(@-PJKP z^H}Ebdkw)LH$d*anYl2t;_1nJN-%clH+jU_j6V^3E)#kZL|%77EY8-_()u${P#~Z0 zR$Lic^L4j_cDHD;)uQhUjYhM)nVp@TFWe}ejw4;Yy4KJKX4=m~Yb(iooSK?K>Qe8A z7CS$1??z9v0thIp6W~u)d#BgNB@#(2Yc!$|mb<*R&i>wd6Ql{nC3Ofp*lZ(h5cPmx zxhswZXKsI+jOiTQ;FO7pF=1-dm(Iz@)&j%OFyz#5G>P=1htKD$>QYC9LLt4RWF#dM z@2Q%n9(DMRv$>hsmJf0>N>mag9XX1O1!E22bd{e+*Ip}Xu{#C928K7e* z<@!ec-6|NByQ03J=35yX83aSC%%@%fin{42ZsJC50gB58?{#%`+9?P;uJm;)bW(`3yT#y*Ry)q+^*Rq zSUHhQ-Z+ZQMV(R`85=uxtElrKG{GEph+Zyd+xs80_fIz^1K03Y4e!_5XC--@`(KJg zk1JKBtCH9el*=uqX${Tcn&(2k#slcvm76}EC#%Ax=ES06--hMph~DlX;Epm=sl5Yx zrZTvRRTuWWD|pea4&fr_T4l*TG8x~A%){GwVYk<(3IO)mWWI6i@qvJ}_y zE_C>cKyFmr zjW=!568YuuzOlM+IL4S_jsX={y56S$j*R!vSoKd;mX8s{p!)<5Rm+i~6InX%`>%_w zcn#C$3r?E8+b_KE>_nWk_|!N=_I<_*H~oWe4A(FKbThno)C6>lYl5(ri0OZ+K~QDl e`?BFe(+w%}lLmC!Z%V`9_6M+b&bIX!LgHWZS>A8} diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index bf751f495ddb3..c2819bc3668d2 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -10,7 +10,14 @@ export const XenoartifactConsole = (props, context) => { return ( -
      {`Research Budget: ${money}`}
      + + +
      {`Research Budget: ${money}`}
      +
      + + + +
      From 27e47eb76ca2faf1ab1d43970df24ce8ef81bb79 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 21 Jan 2024 00:57:38 +1100 Subject: [PATCH 075/339] bookmark - 21 1 24 --- beestation.dme | 2 +- .../byond_particles/emitter/artifact.dm | 94 +++++++++++++++++++ .../byond_particles/emitter/smoke.dm | 13 --- .../byond_particles/emitter/sonar.dm | 26 ----- .../byond_particles/emitter/spark.dm | 21 ----- .../xenoarchaeology/traits/activators.dm | 2 +- 6 files changed, 96 insertions(+), 62 deletions(-) create mode 100644 code/modules/particles/byond_particles/emitter/artifact.dm delete mode 100644 code/modules/particles/byond_particles/emitter/sonar.dm diff --git a/beestation.dme b/beestation.dme index c1c1acb114cfc..b78057878b3c8 100644 --- a/beestation.dme +++ b/beestation.dme @@ -3363,12 +3363,12 @@ #include "code\modules\particles\byond_particles\particle_holder.dm" #include "code\modules\particles\byond_particles\particle_procs.dm" #include "code\modules\particles\byond_particles\particool.dm" +#include "code\modules\particles\byond_particles\emitter\artifact.dm" #include "code\modules\particles\byond_particles\emitter\burst.dm" #include "code\modules\particles\byond_particles\emitter\fire.dm" #include "code\modules\particles\byond_particles\emitter\misc.dm" #include "code\modules\particles\byond_particles\emitter\sm_particles.dm" #include "code\modules\particles\byond_particles\emitter\smoke.dm" -#include "code\modules\particles\byond_particles\emitter\sonar.dm" #include "code\modules\particles\byond_particles\emitter\spark.dm" #include "code\modules\particles\byond_particles\emitter\weather.dm" #include "code\modules\particles\byond_particles\particle\burst.dm" diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm new file mode 100644 index 0000000000000..6c151e6f843eb --- /dev/null +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -0,0 +1,94 @@ +/* + Particles for artifacts +*/ + +///Sonar +/obj/emitter/sonar + particles = new/particles/sonar + plane = ABOVE_LIGHTING_PLANE + +/obj/emitter/sonar/out + particles = new/particles/sonar/out + +/particles/sonar + width = 100 + height = 100 + count = 3 + spawning = 0.15 + lifespan = 15 + fade = 3 + fadein = 3 + friction = 0.25 + color = "#0081ff" + scale = list(2, 2) + grow = list(-0.1, -0.1) + icon = 'icons/effects/particles/misc.dmi' + icon_state = list("circle_1") + +/particles/sonar/out + color = "#55ff00" + scale = list(0.5, 0.5) + grow = list(0.1, 0.1) + +///Snow smoke, idk +/obj/emitter/snow_smoke + alpha = 200 + particles = new/particles/electrified/snow_smoke + +/obj/emitter/snow_smoke/Initialize(mapload) + . = ..() + add_filter("blur", 1, list(type="blur", size=1)) + +/particles/electrified/snow_smoke + icon = 'icons/effects/particles/smoke.dmi' + icon_state = list("steam_1" = 1, "steam_2" = 1, "steam_3" = 2) + +///Electrified +/obj/emitter/electrified + particles = new/particles/electrified + plane = ABOVE_LIGHTING_PLANE + +/obj/emitter/electrified/Initialize(mapload) + . = ..() + add_filter("bloom" , 1 , list(type="bloom", size=3, offset = 0.5, alpha = 220)) + +/particles/electrified + count = 10 + spawning = 1 + lifespan = 10 + fade = 2 + fadein = 1 + position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) + velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) + rotation = generator("num", 0, 360, UNIFORM_RAND) + friction = 0.21 + color = "#94f3ff" + scale = list(0.14, 0.14) + grow = list(0.1, 0.1) + icon = 'icons/effects/particles/misc.dmi' + icon_state = list("static_1") + +///Electrified +/obj/emitter/spiral + particles = new/particles/spiral + plane = ABOVE_LIGHTING_PLANE + +/obj/emitter/spiral/Initialize(mapload) + . = ..() + add_filter("bloom" , 1 , list(type="bloom", size=3, offset = 0.5, alpha = 220)) + +/particles/spiral + count = 75 + spawning = 25 + lifespan = 3 + fade = 1 + fadein = 2 + rotation = generator("num", 0, 360, UNIFORM_RAND) + spin = generator("num", 10, 20, UNIFORM_RAND) + friction = 0.21 + color = "#94f3ff" + scale = generator("box", list(1, 1, 1), list(1.8, 1.8, 1.8), UNIFORM_RAND) + grow = list(-0.5, -0.5) + icon = 'icons/effects/particles/misc.dmi' + icon_state = list("line_1") + diff --git a/code/modules/particles/byond_particles/emitter/smoke.dm b/code/modules/particles/byond_particles/emitter/smoke.dm index b5b601c38b4f7..7f3c5afc7562b 100644 --- a/code/modules/particles/byond_particles/emitter/smoke.dm +++ b/code/modules/particles/byond_particles/emitter/smoke.dm @@ -30,16 +30,3 @@ friction = 0.2 gravity = list(0, 0.95) grow = 0.05 - -///Snow smoke, idk -/obj/emitter/snow_smoke - alpha = 200 - particles = new/particles/electrified/snow_smoke - -/obj/emitter/snow_smoke/Initialize(mapload) - . = ..() - add_filter("blur", 1, list(type="blur", size=1)) - -/particles/electrified/snow_smoke - icon = 'icons/effects/particles/smoke.dmi' - icon_state = list("steam_1" = 1, "steam_2" = 1, "steam_3" = 2) diff --git a/code/modules/particles/byond_particles/emitter/sonar.dm b/code/modules/particles/byond_particles/emitter/sonar.dm deleted file mode 100644 index 74c8258dda716..0000000000000 --- a/code/modules/particles/byond_particles/emitter/sonar.dm +++ /dev/null @@ -1,26 +0,0 @@ -/obj/emitter/sonar - particles = new/particles/sonar - plane = ABOVE_LIGHTING_PLANE - -/obj/emitter/sonar/out - particles = new/particles/sonar/out - -/particles/sonar - width = 100 - height = 100 - count = 3 - spawning = 0.15 - lifespan = 15 - fade = 3 - fadein = 3 - friction = 0.25 - color = "#0081ff" - scale = list(2, 2) - grow = list(-0.1, -0.1) - icon = 'icons/effects/particles/misc.dmi' - icon_state = list("circle_1") - -/particles/sonar/out - color = "#55ff00" - scale = list(0.5, 0.5) - grow = list(0.1, 0.1) diff --git a/code/modules/particles/byond_particles/emitter/spark.dm b/code/modules/particles/byond_particles/emitter/spark.dm index e1cba4dcbace9..992ce56e89e8c 100644 --- a/code/modules/particles/byond_particles/emitter/spark.dm +++ b/code/modules/particles/byond_particles/emitter/spark.dm @@ -12,24 +12,3 @@ /obj/emitter/sparks/flare/Initialize(mapload) . = ..() add_filter("bloom" , 1 , list(type="bloom", size=3, offset = 0.5, alpha = 220)) - -///Electrified -/obj/emitter/electrified - particles = new/particles/electrified - plane = ABOVE_LIGHTING_PLANE - -/particles/electrified - count = 10 - spawning = 1 - lifespan = 10 - fade = 2 - fadein = 1 - position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) - velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) - rotation = generator("num", 0, 360, UNIFORM_RAND) - friction = 0.21 - color = "#94f3ff" - scale = list(0.14, 0.14) - grow = list(0.1, 0.1) - icon = 'icons/effects/particles/misc.dmi' - icon_state = list("static_1") diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 7f376ccfbdb9e..fea34c4708804 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -19,7 +19,7 @@ SIGNAL_HANDLER //Trait check - This is different from an anti artifact check and should be done here to avoid activations, this trait is a helper essentially - if(HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + if(target && HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) return FALSE parent.register_target(target, force, type) parent.trigger() From 5db9fe829cde7803320c149b41d3e79f65149ccd Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 21 Jan 2024 16:25:18 +1100 Subject: [PATCH 076/339] Fix export - 21 1 24 --- code/__DEFINES/dcs/signals/signals_global.dm | 2 +- code/__DEFINES/traits.dm | 1 + code/modules/cargo/export_scanner.dm | 4 +- code/modules/cargo/exports.dm | 7 ++- .../byond_particles/emitter/artifact.dm | 17 +++--- .../byond_particles/particle_procs.dm | 2 + .../components/xenoartifact.dm | 36 +++++++++--- .../tools/console/xenoarchaeology_console.dm | 58 +------------------ .../tools/console/xenoarchaeology_seller.dm | 4 +- .../tools/xenoarchaeology_labeler.dm | 13 +++-- .../xenoarchaeology/traits/activators.dm | 5 +- code/modules/xenoarchaeology/traits/minors.dm | 6 +- code/modules/xenoarchaeology/traits/traits.dm | 4 ++ .../tgui/interfaces/XenoartifactConsole.js | 11 +--- 14 files changed, 74 insertions(+), 96 deletions(-) diff --git a/code/__DEFINES/dcs/signals/signals_global.dm b/code/__DEFINES/dcs/signals/signals_global.dm index 18b0303b09b93..64a6fc91165cd 100644 --- a/code/__DEFINES/dcs/signals/signals_global.dm +++ b/code/__DEFINES/dcs/signals/signals_global.dm @@ -39,4 +39,4 @@ /// Called whenever the crew manifest is updated #define COMSIG_GLOB_CREW_MANIFEST_UPDATE "!crew_manifest_update" /// Called whenever something is sold through exports -#define COMSIG_GLOB_ATOM_SOLD "!tom_sold" +#define COMSIG_GLOB_ATOM_SOLD "!atom_sold" diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index dd50b317ccfce..b9d193dba1bb7 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -291,6 +291,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_NEEDS_TWO_HANDS "needstwohands" // The items needs two hands to be carried #define TRAIT_AI_BAGATTACK "bagattack" // This atom can ignore the "is on a turf" check for simple AI datum attacks, allowing them to attack from bags or lockers as long as any other conditions are met #define TRAIT_ARTIFACT_IGNORE "artifact_ignore" //This item is compltely ignored by artifacts, this is different to anti-artifact +#define TRAIT_IGNORE_EXPORT_SCAN "ignore_export_scan" //The export scanner can't scan this item /// Allows heretics to cast their spells. #define TRAIT_ALLOW_HERETIC_CASTING "allow_heretic_casting" diff --git a/code/modules/cargo/export_scanner.dm b/code/modules/cargo/export_scanner.dm index cfba7f3acafa5..78e84216f9533 100644 --- a/code/modules/cargo/export_scanner.dm +++ b/code/modules/cargo/export_scanner.dm @@ -18,7 +18,9 @@ /obj/item/export_scanner/afterattack(obj/O, mob/user, proximity) . = ..() - if(!istype(O) || !proximity) + if(!istype(O) || !proximity || HAS_TRAIT(O, TRAIT_IGNORE_EXPORT_SCAN)) + if(HAS_TRAIT(O, TRAIT_IGNORE_EXPORT_SCAN)) + to_chat(user, "[O] cannot be scanned!") return if(istype(O, /obj/machinery/computer/cargo)) diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 9e0ff89844b68..8e753d2c51fb7 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -50,8 +50,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they report.exported_atoms += " [thing.name]" break - //Send signal before it's potentially deleted - SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_SOLD, thing, sold) + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_SOLD, thing, sold) if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) @@ -81,6 +80,9 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they sold = E.sell_object(thing, report, dry_run, allowed_categories , apply_elastic) report.exported_atoms += " [thing.name]" break + + SEND_GLOBAL_SIGNAL(COMSIG_GLOB_ATOM_SOLD, thing, sold) + if(!dry_run && (sold || delete_unsold)) if(ismob(thing)) thing.investigate_log("deleted through cargo export",INVESTIGATE_CARGO) @@ -180,6 +182,7 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(apply_elastic) cost *= NUM_E**(-1*k_elasticity*amount) //marginal cost modifier SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[O.type]", "[the_cost]")) + return TRUE // Total printout for the cargo console. diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index 6c151e6f843eb..dc3b1539da5d5 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -70,25 +70,26 @@ ///Electrified /obj/emitter/spiral - particles = new/particles/spiral plane = ABOVE_LIGHTING_PLANE -/obj/emitter/spiral/Initialize(mapload) - . = ..() - add_filter("bloom" , 1 , list(type="bloom", size=3, offset = 0.5, alpha = 220)) +/obj/emitter/spiral/proc/setup(_color) + particles = new/particles/spiral(_color) /particles/spiral - count = 75 - spawning = 25 + count = 90 + spawning = 30 lifespan = 3 fade = 1 - fadein = 2 + fadein = 1 rotation = generator("num", 0, 360, UNIFORM_RAND) spin = generator("num", 10, 20, UNIFORM_RAND) friction = 0.21 color = "#94f3ff" - scale = generator("box", list(1, 1, 1), list(1.8, 1.8, 1.8), UNIFORM_RAND) + scale = generator("box", list(1.2, 1.2, 1.2), list(1.8, 1.8, 1.8), UNIFORM_RAND) grow = list(-0.5, -0.5) icon = 'icons/effects/particles/misc.dmi' icon_state = list("line_1") +/particles/spiral/New(_color) + . = ..() + color = _color || color diff --git a/code/modules/particles/byond_particles/particle_procs.dm b/code/modules/particles/byond_particles/particle_procs.dm index f596be1817d5f..3bc4109816db3 100644 --- a/code/modules/particles/byond_particles/particle_procs.dm +++ b/code/modules/particles/byond_particles/particle_procs.dm @@ -34,6 +34,8 @@ particles like bonfires. else addtimer(CALLBACK(src, PROC_REF(remove_emitter), particle_key), lifespan) + return new_emitter + /atom/proc/remove_emitter(particle_key, burst_mode = FALSE) if(!particle_key) CRASH("remove_emitter called without a key ref.") diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 5fbc775c2a779..0be0c5a3ad5c1 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -18,6 +18,7 @@ /obj/item/xenoartifact/Initialize(mapload, _artifact_type) . = ..() artifact_type = _artifact_type || artifact_type + ADD_TRAIT(src, TRAIT_IGNORE_EXPORT_SCAN, GENERIC_ITEM_TRAIT) /obj/item/xenoartifact/ComponentInitialize() . = ..() @@ -39,6 +40,26 @@ /obj/item/xenoartifact/no_traits spawn_with_traits = FALSE +/* + Export datum, so we can sell artifacts for dosh +*/ + +/datum/export/artifact + unit_name = "xenoartifact" + export_types = list(/obj/item/xenoartifact) + +/datum/export/artifact/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + cost = O.custom_price + return ..() + +/datum/export/artifact/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + . = ..() + return O.GetComponent(/datum/component/xenoartifact) ? TRUE : . + +/* + Artifact component +*/ + /datum/component/xenoartifact ///List of artifact-traits we have : list(PRIORITY = list(trait)) var/list/artifact_traits = list() @@ -89,6 +110,7 @@ ///States var/calcified = FALSE var/calibrated = FALSE + var/atom/movable/artifact_particle_holder/calibrated_holder /datum/component/xenoartifact/Initialize(type, list/traits, _do_appearance = TRUE, _do_mask = TRUE) . = ..() @@ -337,14 +359,14 @@ //Calibrates. Does the opposite of calcify /datum/component/xenoartifact/proc/calibrate() - var/atom/A = parent + var/atom/movable/A = parent //Stats calibrated = TRUE //Effect - var/mutable_appearance/MA = mutable_appearance('icons/obj/xenoarchaeology/xenoartifact.dmi', "calibrated") - MA.blend_mode = BLEND_ADD - MA.color = artifact_type.material_color - A.add_overlay(MA) + calibrated_holder = new(A) + var/obj/emitter/spiral/S = calibrated_holder.add_emitter(/obj/emitter/spiral, "calibration", 11) + S.setup(artifact_type.material_color) + A.vis_contents += calibrated_holder //Build the artifact's appearance /datum/component/xenoartifact/proc/build_material_appearance() @@ -355,13 +377,13 @@ A.remove_filter("outline_2") //Apply new stuff if(do_mask) + var/old_desc = A.desc //Build the silhouette of the artifact var/mutable_appearance/MA = artifact_type.get_mask() MA.plane = A.plane //This is important lol MA.layer = A.layer A.appearance = MA - //Reset name - var/old_desc = A.desc + //Rset name & desc A.name = "[artifact_type.name] [old_name]" A.desc = old_desc //Appearance resets this shit if(do_texture) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index a31f6c0eb6856..9998f5c0b3749 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -15,9 +15,6 @@ ///Which department's budget receives profit var/datum/bank_account/budget - ///Stability - lowers as people buy artifacts, stops spam buying - var/stability = 100 - ///List of current listing sellers var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard) @@ -28,23 +25,11 @@ ///Do we do solved notices on the radio? var/radio_solved_notice = TRUE - ///Are we allowed to call the cargo shuttle? - var/can_call_shuttle = TRUE - - ///Generic messages we modify to match the situation - var/safety_warning = "For safety and ethical reasons, the automated supply shuttle \ - cannot transport live organisms, human remains, classified nuclear weaponry, \ - homing beacons, mail, or machinery housing any form of artificial intelligence." - var/blockade_warning = "Bluespace instability detected. Shuttle movement impossible." - var/permission_warning = "Invalid access! Scan Quartermaster ID, or equivilent, to enable." - /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() //Link relevant stuff linked_techweb = SSresearch.science_tech budget = SSeconomy.get_budget_account(ACCOUNT_SCI_ID) - //Start processing to gain stability - START_PROCESSING(SSobj, src) ///Build seller list //TODO: Clear these on destroy - Racc var/list/new_sellers = sellers.Copy() sellers = list() @@ -60,12 +45,6 @@ STOP_PROCESSING(SSobj, src) QDEL_NULL(radio) -/obj/machinery/computer/xenoarchaeology_console/process() - stability = min(100, stability + STABILITY_GAIN) - //Update UI every 3 seconds, may be delayed - if(world.time % 3 == 0) - ui_update() - /obj/machinery/computer/xenoarchaeology_console/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) if(!ui) @@ -82,8 +61,6 @@ for(var/atom/A as() in seller.current_stock) stock += list(list("name" = A?.name, "description" = A?.desc, "id" = REF(A), "cost" = seller.get_price(A) || 0)) data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = stock, "id" = REF(seller))) - //Stability - data["stability"] = stability //Cash available var/datum/bank_account/D = SSeconomy.get_budget_account(ACCOUNT_CAR_ID) data["money"] = D.account_balance @@ -97,10 +74,6 @@ switch(action) //Purchase items if("stock_purchase") - //If we got no instability - if(!stability) - say("Insufficient straythread stability!") - return //Locate seller and purchase our item from them var/datum/rnd_lister/seller = locate(params["seller_id"]) //If we got no cash @@ -127,41 +100,14 @@ var/datum/supply_order/SO = new(SP, name, rank, ckey, "Research Material Requisition", D) SO.generateRequisition(get_turf(src)) SSsupply.shoppinglist += SO - //Take our toll - stability = clamp(stability-STABILITY_COST, 0, 100) - if("send") - if(!can_call_shuttle) - say(permission_warning) - return - if(!SSshuttle.supply.canMove()) - say(safety_warning) - return - if(SSshuttle.supplyBlocked) - say(blockade_warning) - return - if(SSshuttle.supply.getDockedId() == "supply_home") - SSshuttle.supply.export_categories = EXPORT_CARGO - SSshuttle.moveShuttle("supply", "supply_away", TRUE) - say("The supply shuttle is departing.") - usr.investigate_log(" sent the supply shuttle away.", INVESTIGATE_RESEARCH) - else - usr.investigate_log(" called the supply shuttle.", INVESTIGATE_RESEARCH) - say("The supply shuttle has been called and will arrive in [SSshuttle.supply.timeLeft(600)] minutes.") - SSshuttle.moveShuttle("supply", "supply_home", TRUE) - . = TRUE ui_update() -/obj/machinery/computer/xenoarchaeology_console/attackby(obj/item/C, mob/user) - . = ..() - var/obj/item/card/id/I = C - if(istype(I) && (ACCESS_HEADS in I.access)) - can_call_shuttle = !can_call_shuttle - say("Toggled shuttle permission. Shuttle permission [can_call_shuttle ? "enabled" : "disabled"].") - /obj/machinery/computer/xenoarchaeology_console/proc/check_sold(datum/source, atom/movable/AM, sold) SIGNAL_HANDLER + radio?.talk_into(src, "test", RADIO_CHANNEL_SCIENCE) + var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in AM.contents var/datum/component/xenoartifact/X = AM.GetComponent(/datum/component/xenoartifact) if(X && L) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index 7b328c15c8840..a6415ad823005 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -58,7 +58,7 @@ //TODO: Move this to an init argument of the supply pack var/datum/supply_pack/science_listing/SL = new() SL.contains = list(A) - SL.max_supply = 1 + Sl.cost = A.custom_price return SL /datum/rnd_lister/proc/replenish_stock(amount = 1) @@ -100,6 +100,8 @@ crate_name = "research material container" crate_type = /obj/structure/closet/crate/science access_any = TRUE + max_supply = 1 + current_supply = 1 #undef SELLER_PERSONALITY_GENEROUS #undef SELLER_PERSONALITY_NORMAL diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 427e8cdfb7de9..1f0331c1e137a 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -213,12 +213,17 @@ var/datum/component/xenoartifact/artifact = target.GetComponent(/datum/component/xenoartifact) if(artifact) old_custom_price = target.custom_price + //Build list of artifact's traits + var/list/artifact_traits = list() for(var/i in artifact.artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact.artifact_traits[i]) - if(locate(T) in traits) - target.custom_price *= XENOA_LABEL_REWARD - else - target.custom_price *= XENOA_LABEL_PUNISHMENT + artifact_traits += T + //Compare them to ours + for(var/datum/xenoartifact_trait/T as() in traits) + if(locate(T) in artifact_traits) + target.custom_price *= XENOA_LABEL_REWARD + else + target.custom_price *= XENOA_LABEL_PUNISHMENT RegisterSignal(target, COMSIG_PARENT_EXAMINE, PROC_REF(parent_examine)) /obj/item/sticker/xenoartifact_label/attack_hand(mob/user) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index fea34c4708804..8134438e03b23 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -92,7 +92,7 @@ /datum/xenoartifact_trait/activator/strudy/translation_type_d(datum/source, atom/item, atom/target) var/atom/A = parent?.parent - if(!isliving(A.loc) || check_item_safety(item)) + if(!isliving(A.loc) && !A.density || check_item_safety(item)) return trigger_artifact(target, XENOA_ACTIVATION_TOUCH) @@ -257,8 +257,7 @@ var/datum/signal/signal ///Reference to our particle holder - we need to use holders & vis contents, otherwise shit gets fucky with filters - //TODO: Make this a dedicated subtype with no mouse opacity - Racc - var/atom/movable/particle_holder + var/atom/movable/artifact_particle_holder/particle_holder /datum/xenoartifact_trait/activator/signal/New(atom/_parent) . = ..() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index b6c0e761b9e6e..f71dfafe3a4e6 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -24,7 +24,7 @@ weight = 10 conductivity = 15 ///Reference to our particle holder - var/atom/movable/particle_holder + var/atom/movable/artifact_particle_holder/particle_holder /datum/xenoartifact_trait/minor/charged/New(atom/_parent) . = ..() @@ -211,7 +211,7 @@ flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = -5 SECONDS //Point of balance weight = 15 - var/atom/movable/particle_holder + var/atom/movable/artifact_particle_holder/particle_holder /datum/xenoartifact_trait/minor/cooling/New(atom/_parent) . = ..() @@ -593,7 +593,7 @@ label_desc = "Signaller: The Artifact's design seems to incorporate signalling elements. This will cause the artifact to send a signal when activated." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT conductivity = 15 - var/atom/movable/particle_holder + var/atom/movable/artifact_particle_holder/particle_holder ///Signal code var/code ///Signal frequency diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index f0e82d23bec41..3965f8e290967 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -221,3 +221,7 @@ /obj/item/trait_pearl/Initialize(mapload, trait) . = ..() stored_trait = trait + +///Particle holder for trait appearances - Throw any extras you want in here +/atom/movable/artifact_particle_holder + mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index c2819bc3668d2..9c9555bb00b39 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -10,16 +10,7 @@ export const XenoartifactConsole = (props, context) => { return ( - - -
      {`Research Budget: ${money}`}
      -
      - - - -
      - - +
      {`Research Budget: ${money}`}
      From 554bdfac7f4f450f6c344440cb670bb7e9de0541 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 21 Jan 2024 17:11:06 +1100 Subject: [PATCH 077/339] Update xenoarchaeology_seller.dm --- .../xenoarchaeology/tools/console/xenoarchaeology_seller.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index a6415ad823005..b97df5983a360 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -58,7 +58,7 @@ //TODO: Move this to an init argument of the supply pack var/datum/supply_pack/science_listing/SL = new() SL.contains = list(A) - Sl.cost = A.custom_price + SL.cost = A.custom_price return SL /datum/rnd_lister/proc/replenish_stock(amount = 1) From e4d184a73d450018ab35730e5b52e79ed94ba202 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 21 Jan 2024 17:25:38 +1100 Subject: [PATCH 078/339] Fix packs - 21 1 24 --- code/modules/cargo/packs.dm | 3 ++- code/modules/particles/byond_particles/emitter/artifact.dm | 4 ++-- .../xenoarchaeology/tools/console/xenoarchaeology_console.dm | 1 + .../xenoarchaeology/tools/console/xenoarchaeology_seller.dm | 2 ++ tgui/packages/tgui/interfaces/XenoartifactConsole.js | 2 +- 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/code/modules/cargo/packs.dm b/code/modules/cargo/packs.dm index c7589366fe2c9..8df303c7ffd74 100644 --- a/code/modules/cargo/packs.dm +++ b/code/modules/cargo/packs.dm @@ -19,6 +19,7 @@ var/DropPodOnly = FALSE//only usable by the Bluespace Drop Pod via the express cargo console var/admin_spawned = FALSE var/small_item = FALSE //Small items can be grouped into a single crate. + var/can_secure = TRUE //Can this order be secured /datum/supply_pack/New() . = ..() @@ -27,7 +28,7 @@ /datum/supply_pack/proc/generate(atom/A, datum/bank_account/paying_account) var/obj/structure/closet/crate/C - if(paying_account) + if(paying_account && can_secure) C = new /obj/structure/closet/crate/secure/owned(A, paying_account) C.name = "[crate_name] - Purchased by [paying_account.account_holder]" else diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index dc3b1539da5d5..1df23d54530c6 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -50,7 +50,7 @@ /obj/emitter/electrified/Initialize(mapload) . = ..() - add_filter("bloom" , 1 , list(type="bloom", size=3, offset = 0.5, alpha = 220)) + add_filter("bloom" , 1 , list(type="bloom", size=1, offset = 0.5, alpha = 220)) /particles/electrified count = 10 @@ -68,7 +68,7 @@ icon = 'icons/effects/particles/misc.dmi' icon_state = list("static_1") -///Electrified +///Calibartion spiral thing /obj/emitter/spiral plane = ABOVE_LIGHTING_PLANE diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 9998f5c0b3749..a7492e025f647 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -20,6 +20,7 @@ ///radio used by the console to send messages on science channel var/obj/item/radio/headset/radio + //TODO: Add a toggle for these - Racc ///Do we do purchase notices on the radio? var/radio_purchase_notice = TRUE ///Do we do solved notices on the radio? diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index b97df5983a360..3afdf5dccf105 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -59,6 +59,7 @@ var/datum/supply_pack/science_listing/SL = new() SL.contains = list(A) SL.cost = A.custom_price + SL.current_supply = max(1, SL.current_supply) //Bruh return SL /datum/rnd_lister/proc/replenish_stock(amount = 1) @@ -102,6 +103,7 @@ access_any = TRUE max_supply = 1 current_supply = 1 + can_secure = FALSE #undef SELLER_PERSONALITY_GENEROUS #undef SELLER_PERSONALITY_NORMAL diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 9c9555bb00b39..58970fc6a4649 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -8,7 +8,7 @@ export const XenoartifactConsole = (props, context) => { const { stability, money } = data; const sellers = data.sellers || []; return ( - +
      {`Research Budget: ${money}`}
      From 9b72a259b70553f1db8b513fa9bb03b7d0dcdb2d Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 21 Jan 2024 22:05:22 +1100 Subject: [PATCH 079/339] Fix bad activation - 21 1 24 --- _maps/_basemap.dm | 2 +- _maps/map_files/MetaStation/MetaStation.dmm | 2 ++ .../byond_particles/emitter/artifact.dm | 18 +++++++++------- .../components/xenoartifact.dm | 2 +- .../tools/console/xenoarchaeology_seller.dm | 2 +- .../xenoarchaeology/traits/activators.dm | 20 +++++++++++++++++- code/modules/xenoarchaeology/traits/majors.dm | 5 ++++- code/modules/xenoarchaeology/traits/traits.dm | 4 ++++ icons/effects/particles/misc.dmi | Bin 1702 -> 1866 bytes 9 files changed, 42 insertions(+), 13 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 9499d3e8cb593..bf3b820460161 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 27ac6ba42bbdd..1adb7a3fabe7d 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -36583,6 +36583,8 @@ }, /obj/effect/loot_jobscale/medical/first_aid_kit, /obj/item/clothing/neck/stethoscope, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science, /turf/open/floor/plasteel/dark, /area/science/explab) "iaK" = ( diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index 1df23d54530c6..d45839cb1e275 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -40,17 +40,18 @@ add_filter("blur", 1, list(type="blur", size=1)) /particles/electrified/snow_smoke - icon = 'icons/effects/particles/smoke.dmi' - icon_state = list("steam_1" = 1, "steam_2" = 1, "steam_3" = 2) + icon = 'icons/effects/particles/smoke.dmi' + icon_state = list("steam_1" = 1, "steam_2" = 1, "steam_3" = 2) ///Electrified /obj/emitter/electrified particles = new/particles/electrified plane = ABOVE_LIGHTING_PLANE + blend_mode = BLEND_ADD /obj/emitter/electrified/Initialize(mapload) - . = ..() - add_filter("bloom" , 1 , list(type="bloom", size=1, offset = 0.5, alpha = 220)) + . = ..() + add_filter("bloom" , 1 , list(type="bloom", size=1, offset = 0.1, alpha = 255)) /particles/electrified count = 10 @@ -64,13 +65,14 @@ friction = 0.21 color = "#94f3ff" scale = list(0.14, 0.14) - grow = list(0.1, 0.1) + grow = list(0.08, 0.08) icon = 'icons/effects/particles/misc.dmi' - icon_state = list("static_1") + icon_state = list("static_1", "static_2") ///Calibartion spiral thing /obj/emitter/spiral plane = ABOVE_LIGHTING_PLANE + blend_mode = BLEND_ADD /obj/emitter/spiral/proc/setup(_color) particles = new/particles/spiral(_color) @@ -85,10 +87,10 @@ spin = generator("num", 10, 20, UNIFORM_RAND) friction = 0.21 color = "#94f3ff" - scale = generator("box", list(1.2, 1.2, 1.2), list(1.8, 1.8, 1.8), UNIFORM_RAND) + scale = generator("box", list(1.5, 1.5, 1.5), list(2, 2, 2), UNIFORM_RAND) grow = list(-0.5, -0.5) icon = 'icons/effects/particles/misc.dmi' - icon_state = list("line_1") + icon_state = list("line_1", "line_2", "line_3") /particles/spiral/New(_color) . = ..() diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 0be0c5a3ad5c1..43d30ffacc19f 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -250,7 +250,7 @@ if(get_dist(get_turf(parent), get_turf(target))> target_range && !force) return //Anti-artifact check - if(anti_check(target, type)) + if(anti_check(target, type) && !force) return //Prexisting check if((target in targets) && !force) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index 3afdf5dccf105..aa71bccc05c82 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -55,7 +55,7 @@ current_stock -= A addtimer(CALLBACK(src, PROC_REF(replenish_stock)), restock_time) //Return a supplypack - //TODO: Move this to an init argument of the supply pack + //TODO: Make this just return an item, and have the console reuse the same pack over and over var/datum/supply_pack/science_listing/SL = new() SL.contains = list(A) SL.cost = A.custom_price diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 8134438e03b23..09059642cdcb7 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -21,6 +21,9 @@ //Trait check - This is different from an anti artifact check and should be done here to avoid activations, this trait is a helper essentially if(target && HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) return FALSE + //Stop traits that don't register targets activating when we feel them + if(parent.anti_check(target, type)) + return FALSE parent.register_target(target, force, type) parent.trigger() return TRUE @@ -125,10 +128,25 @@ if(!parent?.parent) return RegisterSignal(parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) + RegisterSignal(parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) + RegisterSignal(parent?.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + //TODO: Add indicators for lit / unlit - Racc + +/datum/xenoartifact_trait/activator/flammable/translation_type_a(datum/source, atom/target) + lit = FALSE + +/datum/xenoartifact_trait/activator/flammable/translation_type_d(datum/source, atom/target) + var/atom/A = parent.parent + if(A.density) + lit = FALSE /datum/xenoartifact_trait/activator/flammable/translation_type_b(datum/source, atom/item, atom/target) var/obj/item/I = item if(isitem(I) && I.is_hot() && !check_item_safety(item)) + if(HAS_TRAIT(item, TRAIT_ARTIFACT_IGNORE)) + return FALSE + if(parent.anti_check(target, XENOA_ACTIVATION_TOUCH)) + return FALSE lit = TRUE search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) @@ -143,11 +161,11 @@ if(!ismob(target)) continue trigger_artifact(target) - lit = FALSE break //We can atleast try triggering with no targets, for traits that don't need 'em if(!length(parent.targets)) parent.trigger() + lit = FALSE //This is a semi-weird way to do it, but it lets us 'disable' the fuse if we want search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) /datum/xenoartifact_trait/activator/flammable/get_dictionary_hint() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 9ff6b14a0fa5c..73ac6e6778d3a 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -13,6 +13,8 @@ /datum/xenoartifact_trait/major/trigger(datum/source, _priority, atom/override) . = ..() //TODO: Reconsider - Racc + if(!.) + return for(var/mob/living/M as() in oview(9, get_turf(parent.parent))) if(istype(M)) do_hint(M) @@ -267,7 +269,8 @@ . = ..() if(!.) return - INVOKE_ASYNC(src, PROC_REF(do_emp)) //empluse() calls stoplag(), which calls sleep() + else + INVOKE_ASYNC(src, PROC_REF(do_emp)) //empluse() calls stoplag(), which calls sleep() /datum/xenoartifact_trait/major/emp/proc/do_emp() var/turf/T = get_turf(parent.parent) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 3965f8e290967..23e266fb5b2b4 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -166,6 +166,7 @@ /datum/xenoartifact_trait/proc/setup_generic_touch_hint() RegisterSignal(parent.parent, COMSIG_ITEM_ATTACK_SELF, PROC_REF(hint_translation_type_b)) + RegisterSignal(parent.parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(hint_translation_type_b)) /datum/xenoartifact_trait/proc/hint_translation_type_a(datum/source, obj/item, mob/living, params) SIGNAL_HANDLER @@ -175,6 +176,9 @@ /datum/xenoartifact_trait/proc/hint_translation_type_b(datum/source, mob/living) SIGNAL_HANDLER + var/atom/A = parent.parent + if(!A.density && A.loc != living) + return do_hint(living, null) /datum/xenoartifact_trait/proc/do_hint(mob/user, atom/item) diff --git a/icons/effects/particles/misc.dmi b/icons/effects/particles/misc.dmi index 803c3a125e4e6d9e04ec2059167ac02afcd3b9b9..f2d15ac85b6cbf8a30706567471622cd4210e40f 100644 GIT binary patch literal 1866 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 From 21ead5d1577215cb5fde390abdffe1422ce08ff1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 21 Jan 2024 23:45:00 +1100 Subject: [PATCH 080/339] Tooltips - 21 1 24 --- .../particles/byond_particles/emitter/artifact.dm | 2 +- .../tools/console/xenoarchaeology_console.dm | 1 + .../tools/xenoarchaeology_labeler.dm | 8 ++++++-- .../tgui/interfaces/XenoartifactLabeler.js | 14 ++++++++------ 4 files changed, 16 insertions(+), 9 deletions(-) diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index d45839cb1e275..f98582a939870 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -84,7 +84,7 @@ fade = 1 fadein = 1 rotation = generator("num", 0, 360, UNIFORM_RAND) - spin = generator("num", 10, 20, UNIFORM_RAND) + spin = generator("num", 10, 15, UNIFORM_RAND) friction = 0.21 color = "#94f3ff" scale = generator("box", list(1.5, 1.5, 1.5), list(2, 2, 2), UNIFORM_RAND) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index a7492e025f647..85ecd9559c2ce 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -111,6 +111,7 @@ var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in AM.contents var/datum/component/xenoartifact/X = AM.GetComponent(/datum/component/xenoartifact) + radio?.talk_into(src, "test2, label is [L], and component is [X].", RADIO_CHANNEL_SCIENCE) if(X && L) //Calculate success rate var/score = 0 diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 1f0331c1e137a..8ca9dcbc7681b 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -25,6 +25,9 @@ ///List of descriptions for selected traits var/list/info_list = list() + ///List of trait stats for tooltip shit, this is kinda fucked but who gives a shit + var/list/tooltip_stats = list() + ///List of selected traits we'll put on the label var/list/label_traits = list() @@ -64,6 +67,7 @@ data["major_traits"] = major_traits data["minor_traits"] = minor_traits data["activator_traits"] = activator_traits + data["tooltip_stats"] = tooltip_stats return data @@ -96,8 +100,8 @@ /obj/item/xenoarchaeology_labeler/proc/get_trait_list_names(list/trait_type) var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) - temp += initial(T.label_name) - + temp += list(initial(T.label_name)) + tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity)) return temp /obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index b7bc510d763da..5c3309779348f 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -49,7 +49,7 @@ const XenoartifactlabelerTraits = (props, context) => {
      {sorted_activators.map((trait) => ( - {
      {sorted_minors.map((trait) => ( - {
      {sorted_majors.map((trait) => ( - {
      {sorted_malfs.map((trait) => ( - { ); }; -const XenoartifactlabelerGenerateList = (props, context) => { - const { act } = useBackend(context); +const XenoartifactlabelerGenerateEntry = (props, context) => { + const { act, data } = useBackend(context); const { specific_trait, check_against, trait_type } = props; + const { tooltip_stats } = data; return ( act(`assign_${trait_type}_${specific_trait}`)} + tooltip={`Weight: ${tooltip_stats[specific_trait]["weight"]}, Conductivity: ${tooltip_stats[specific_trait]["conductivity"]}`} /> ); From 2441a55ba8f7a6766e1fad7c22a8f5c1e0c40d62 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 22 Jan 2024 12:51:10 +1100 Subject: [PATCH 081/339] Trait clarification - 22 1 24 --- beestation.dme | 4 ++-- .../{xenoartifact.dm => xenoarchaeology.dm} | 0 .../{xenoartifact.dm => xenoarchaeology.dm} | 13 ++++++++----- .../xenoarchaeology/components/materials.dm | 14 +++++++++++--- .../tools/xenoarchaeology_labeler.dm | 6 ++++++ code/modules/xenoarchaeology/traits/traits.dm | 9 +++++++-- .../tgui/interfaces/XenoartifactLabeler.js | 6 +++++- 7 files changed, 39 insertions(+), 13 deletions(-) rename code/__DEFINES/{xenoartifact.dm => xenoarchaeology.dm} (100%) rename code/_globalvars/{xenoartifact.dm => xenoarchaeology.dm} (78%) diff --git a/beestation.dme b/beestation.dme index b78057878b3c8..e079e0ae88749 100644 --- a/beestation.dme +++ b/beestation.dme @@ -186,7 +186,7 @@ #include "code\__DEFINES\weather.dm" #include "code\__DEFINES\wiremod.dm" #include "code\__DEFINES\wires.dm" -#include "code\__DEFINES\xenoartifact.dm" +#include "code\__DEFINES\xenoarchaeology.dm" #include "code\__DEFINES\xenobiology.dm" #include "code\__DEFINES\zmimic.dm" #include "code\__DEFINES\dcs\flags.dm" @@ -304,7 +304,7 @@ #include "code\_globalvars\soul_glimmer.dm" #include "code\_globalvars\traits.dm" #include "code\_globalvars\turf.dm" -#include "code\_globalvars\xenoartifact.dm" +#include "code\_globalvars\xenoarchaeology.dm" #include "code\_globalvars\lists\achievements.dm" #include "code\_globalvars\lists\admin.dm" #include "code\_globalvars\lists\ambience.dm" diff --git a/code/__DEFINES/xenoartifact.dm b/code/__DEFINES/xenoarchaeology.dm similarity index 100% rename from code/__DEFINES/xenoartifact.dm rename to code/__DEFINES/xenoarchaeology.dm diff --git a/code/_globalvars/xenoartifact.dm b/code/_globalvars/xenoarchaeology.dm similarity index 78% rename from code/_globalvars/xenoartifact.dm rename to code/_globalvars/xenoarchaeology.dm index b14bc985499d1..15c7ca84f75c1 100644 --- a/code/_globalvars/xenoartifact.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -24,10 +24,12 @@ GLOBAL_LIST(xenoa_pearl_traits) if(length(GLOB.xenoa_all_traits)) return + //Bruh GLOB.xenoa_seller_names -= "" GLOB.xenoa_seller_dialogue -= "" GLOB.xenoa_artifact_names -= "" + //List of weights based on trait type GLOB.xenoa_activators = compile_artifact_weights(/datum/xenoartifact_trait/activator) GLOB.xenoa_minors = compile_artifact_weights(/datum/xenoartifact_trait/minor) GLOB.xenoa_majors = compile_artifact_weights(/datum/xenoartifact_trait/major) @@ -35,11 +37,12 @@ GLOBAL_LIST(xenoa_pearl_traits) GLOB.xenoa_all_traits = compile_artifact_weights(/datum/xenoartifact_trait) GLOB.xenoa_all_traits_keyed = compile_artifact_weights(/datum/xenoartifact_trait, TRUE) - GLOB.xenoa_bluespace_traits = compile_artifact_whitelist(XENOA_BLUESPACE_TRAIT) - GLOB.xenoa_plasma_traits = compile_artifact_whitelist(XENOA_PLASMA_TRAIT) - GLOB.xenoa_uranium_traits = compile_artifact_whitelist(XENOA_URANIUM_TRAIT) - GLOB.xenoa_bananium_traits = compile_artifact_whitelist(XENOA_BANANIUM_TRAIT) - GLOB.xenoa_pearl_traits = compile_artifact_whitelist(XENOA_PEARL_TRAIT) + //Traits divided by flavor + GLOB.xenoa_bluespace_traits = compile_artifact_whitelist(/datum/xenoartifact_material/bluespace) + GLOB.xenoa_plasma_traits = compile_artifact_whitelist(/datum/xenoartifact_material/plasma) + GLOB.xenoa_uranium_traits = compile_artifact_whitelist(/datum/xenoartifact_material/uranium) + GLOB.xenoa_bananium_traits = compile_artifact_whitelist(/datum/xenoartifact_material/bananium) + GLOB.xenoa_pearl_traits = compile_artifact_whitelist(/datum/xenoartifact_material/pearl) ///Material weights, basically rarity GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 8, XENOA_URANIUM = 5, XENOA_BANANIUM = 1)) diff --git a/code/modules/xenoarchaeology/components/materials.dm b/code/modules/xenoarchaeology/components/materials.dm index 50d7cf596fbf6..b34b2c270d09f 100644 --- a/code/modules/xenoarchaeology/components/materials.dm +++ b/code/modules/xenoarchaeology/components/materials.dm @@ -34,6 +34,9 @@ ///What rate do we convert custom price to research points to? var/rnd_rate = 1.5 + ///What traits flags are we associated with + var/trait_flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + //Set this proc to return a pre-made list so we can avoid some overhead /datum/xenoartifact_material/proc/get_trait_list() return GLOB.xenoa_all_traits @@ -51,40 +54,44 @@ texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") mask_icon_states = list("mask-bananium1") custom_price = 500 + trait_flags = XENOA_BANANIUM_TRAIT /datum/xenoartifact_material/bananium/get_trait_list() return GLOB.xenoa_bananium_traits /datum/xenoartifact_material/uranium name = "uranium" - material_color = "#88ff00ff" + material_color = "#88ff00" instability_step = 25 texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") mask_icon_states = list("mask-uranium1") custom_price = 450 trait_malfunctions = 1 max_trait_malfunctions = 2 + trait_flags = XENOA_URANIUM_TRAIT /datum/xenoartifact_material/uranium/get_trait_list() return GLOB.xenoa_uranium_traits /datum/xenoartifact_material/plasma name = "plasma" - material_color = "#f200ffff" + material_color = "#f200ff" instability_step = 5 texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") mask_icon_states = list("mask-plasma1") custom_price = 250 + trait_flags = XENOA_PLASMA_TRAIT /datum/xenoartifact_material/plasma/get_trait_list() return GLOB.xenoa_plasma_traits /datum/xenoartifact_material/bluespace name = "bluespace" - material_color = "#006affff" + material_color = "#006aff" instability_step = 1 texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") mask_icon_states = list("mask-bluespace1") + trait_flags = XENOA_BLUESPACE_TRAIT /datum/xenoartifact_material/bluespace/get_trait_list() return GLOB.xenoa_bluespace_traits @@ -96,6 +103,7 @@ instability_step = 50 texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") custom_price = 500 + trait_flags = XENOA_PEARL_TRAIT //Calcified /datum/xenoartifact_material/calcified diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 8ca9dcbc7681b..005e84ad1a121 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -102,6 +102,12 @@ for(var/datum/xenoartifact_trait/T as() in trait_type) temp += list(initial(T.label_name)) tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity)) + //Generate material availability + var/list/materials = list(XENOA_BLUESPACE, XENOA_PLASMA, XENOA_URANIUM, XENOA_BANANIUM, XENOA_PEARL) + tooltip_stats["[initial(T.label_name)]"] += list("availability" = list()) + for(var/datum/xenoartifact_material/M as() in materials) + if(initial(M.trait_flags) & initial(T.flags)) + tooltip_stats["[initial(T.label_name)]"]["availability"] += list(list("color" = initial(M.material_color))) return temp /obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 23e266fb5b2b4..3993d6a9c4fde 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -208,8 +208,13 @@ /proc/compile_artifact_whitelist(var/flags) var/list/output = list() for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) - if((initial(T.flags) & flags)) - output += T + if(!ispath(flags)) + if((initial(T.flags) & flags)) + output += T + else + var/datum/xenoartifact_material/M = flags + if((initial(T.flags) & initial(M.trait_flags))) + output += T return output //This holds individual traits diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 5c3309779348f..795b644e30cd9 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -130,8 +130,9 @@ const XenoartifactlabelerGenerateEntry = (props, context) => { }; const XenoartifactlabelerGenerateInfo = (props, context) => { - const { act } = useBackend(context); + const { act, data } = useBackend(context); const { info } = props; + const { tooltip_stats } = data; return (
      @@ -139,6 +140,9 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { {info["hints"].map((hint) => (
      ); From 64da553431adb3bcd096626410cc04bc3fe1b93e Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 22 Jan 2024 13:08:34 +1100 Subject: [PATCH 082/339] Trait misc - 22 1 24 --- code/__DEFINES/xenoarchaeology.dm | 1 + code/_globalvars/xenoarchaeology.dm | 4 +- code/datums/components/food/edible.dm | 13 ++++ code/game/sound.dm | 2 +- .../discoverable_component.dm | 41 ++++++++++++ .../discovery_research/discovery_scanner.dm | 1 + .../xenoarchaeology/components/materials.dm | 8 +++ .../components/xenoartifact.dm | 10 ++- .../tools/xenoarchaeology_labeler.dm | 2 +- .../xenoarchaeology/traits/activators.dm | 67 ++++++++++++++++++- code/modules/xenoarchaeology/traits/majors.dm | 6 +- code/modules/xenoarchaeology/traits/minors.dm | 16 +++-- code/modules/xenoarchaeology/traits/misc.dm | 41 ++++++++++++ code/modules/xenoarchaeology/traits/traits.dm | 6 +- .../tgui/interfaces/XenoartifactLabeler.js | 6 +- 15 files changed, 206 insertions(+), 18 deletions(-) diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index 66a7e95cb7aaf..3421896b5fc01 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -65,6 +65,7 @@ #define XENOA_TRAIT_HINT_TWIN list("icon" = "clone", "desc" = "This trait has sister traits which perform a similar, but unqiue, action.") #define XENOA_TRAIT_HINT_TWIN_VARIANT(X) list("icon" = "fingerprint", "desc" = "This variant will [X].") #define XENOA_TRAIT_HINT_RANDOMISED list("icon" = "dice", "desc" = "This trait's effects may differ between instances.") +#define XENOA_TRAIT_HINT_APPEARANCE(X) list("icon" = "snowflake", "desc" = "This trait's changes the artifact's appearance. [X]") /* old content diff --git a/code/_globalvars/xenoarchaeology.dm b/code/_globalvars/xenoarchaeology.dm index 15c7ca84f75c1..35347016608c9 100644 --- a/code/_globalvars/xenoarchaeology.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -50,5 +50,5 @@ GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA ///Trait priority list - The order is important and it represents priotity GLOBAL_LIST_INIT(xenoartifact_trait_priorities, list(TRAIT_PRIORITY_ACTIVATOR, TRAIT_PRIORITY_MINOR, TRAIT_PRIORITY_MALFUNCTION, TRAIT_PRIORITY_MAJOR)) -///List of research materials we've bought and cargo needs to ship to us -GLOBAL_LIST_INIT(needs_shipping_science_materials, list()) +///List of 'discovered' traits +GLOBAL_LIST_INIT(discovered_traits, list()) diff --git a/code/datums/components/food/edible.dm b/code/datums/components/food/edible.dm index 459375e9f4485..5cbea4f6cfbbc 100644 --- a/code/datums/components/food/edible.dm +++ b/code/datums/components/food/edible.dm @@ -492,3 +492,16 @@ Behavior that's still missing from this component that original food items had t var/satisfaction_text = pick("burps from enjoyment.", "yaps for more!", "woofs twice.", "looks at the area where \the [parent] was.") L.manual_emote(satisfaction_text) qdel(parent) + +///Ability to feed food to items? +/datum/component/edible/proc/feed_to_item(datum/source, atom/movable/eater) + SIGNAL_HANDLER + + if(bitecount == 0 || prob(50)) + eater.visible_message("[eater] nibbles away at \the [parent].", allow_inside_usr = TRUE) + bitecount++ + . = COMPONENT_CANCEL_ATTACK_CHAIN + if(bitecount >= 5) + var/satisfaction_text = pick("burps from enjoyment.", "looks at the area where \the [parent] was.") + eater.visible_message("[eater] [satisfaction_text]", allow_inside_usr = TRUE) + qdel(parent) diff --git a/code/game/sound.dm b/code/game/sound.dm index 76963bb051aca..63a5056e5988c 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -253,7 +253,7 @@ distance_multiplier - Can be used to multiply the distance at which the sound is S.status = SOUND_UPDATE SEND_SOUND(src, S) -/client/proc/playtitlemusic(vol = 50) +/client/proc/playtitlemusic(vol = 0) set waitfor = FALSE UNTIL(SSticker.login_music) //wait for SSticker init to set the login music diff --git a/code/modules/exploration_crew/discovery_research/discoverable_component.dm b/code/modules/exploration_crew/discovery_research/discoverable_component.dm index 1b9685404b15b..43eca45f91f55 100644 --- a/code/modules/exploration_crew/discovery_research/discoverable_component.dm +++ b/code/modules/exploration_crew/discovery_research/discoverable_component.dm @@ -53,3 +53,44 @@ playsound(user, 'sound/machines/terminal_success.ogg', 60) to_chat(user, "New datapoint scanned, [point_reward] discovery points gained.") pulse_effect(get_turf(A), 4) + +/* + Equivilent for artifacts + essentially looks at the artifact's traits +*/ + +/datum/component/discoverable/artifact + +/datum/component/discoverable/artifact/discovery_scan(datum/techweb/linked_techweb, mob/user) + //Already scanned our atom. + var/atom/A = parent + if(scanned) + to_chat(user, "[A] has already been analysed.") + return + //Is it *even* an artifact + var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) + if(!X) + return + //Loop through artfact traits + var/total_payout = 0 + var/discovered_traits = 0 + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T as() in X.artifact_traits[i]) + //Already scanned another of this type. + var/discover_id = get_discover_id?.Invoke() || T.type + if(linked_techweb.scanned_atoms[discover_id] && !unique) + continue + if(A.flags_1 & HOLOGRAM_1) + continue + total_payout += T.discovery_reward + discovered_traits += 1 + linked_techweb.scanned_atoms[discover_id] = TRUE + scanned = TRUE + if(total_payout) + linked_techweb.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, total_payout) + playsound(user, 'sound/machines/terminal_success.ogg', 60) + to_chat(user, "New datapoint scanned, [total_payout] discovery points gained.\n[discovered_traits] new traits discovered!") + pulse_effect(get_turf(A), 4) + else + playsound(user, 'sound/machines/uplinkerror.ogg', 60) + to_chat(user, "No new traits detected in [A].") diff --git a/code/modules/exploration_crew/discovery_research/discovery_scanner.dm b/code/modules/exploration_crew/discovery_research/discovery_scanner.dm index d43b84f4db65c..5784524de2765 100644 --- a/code/modules/exploration_crew/discovery_research/discovery_scanner.dm +++ b/code/modules/exploration_crew/discovery_research/discovery_scanner.dm @@ -13,6 +13,7 @@ . = ..() if(!linked_techweb) linked_techweb = SSresearch.science_tech + ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) /obj/item/discovery_scanner/Destroy() linked_techweb = null //Note: Shouldn't hard del anyway since techwebs don't get deleted, however if they do then troubles will arise and this will need to be changed. diff --git a/code/modules/xenoarchaeology/components/materials.dm b/code/modules/xenoarchaeology/components/materials.dm index b34b2c270d09f..2100b80db478d 100644 --- a/code/modules/xenoarchaeology/components/materials.dm +++ b/code/modules/xenoarchaeology/components/materials.dm @@ -37,6 +37,9 @@ ///What traits flags are we associated with var/trait_flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///What icon we use in the labeler + var/label_icon = "circle" + //Set this proc to return a pre-made list so we can avoid some overhead /datum/xenoartifact_material/proc/get_trait_list() return GLOB.xenoa_all_traits @@ -55,6 +58,7 @@ mask_icon_states = list("mask-bananium1") custom_price = 500 trait_flags = XENOA_BANANIUM_TRAIT + label_icon = "circle" /datum/xenoartifact_material/bananium/get_trait_list() return GLOB.xenoa_bananium_traits @@ -69,6 +73,7 @@ trait_malfunctions = 1 max_trait_malfunctions = 2 trait_flags = XENOA_URANIUM_TRAIT + label_icon = "certificate" /datum/xenoartifact_material/uranium/get_trait_list() return GLOB.xenoa_uranium_traits @@ -81,6 +86,7 @@ mask_icon_states = list("mask-plasma1") custom_price = 250 trait_flags = XENOA_PLASMA_TRAIT + label_icon = "play" /datum/xenoartifact_material/plasma/get_trait_list() return GLOB.xenoa_plasma_traits @@ -92,6 +98,7 @@ texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") mask_icon_states = list("mask-bluespace1") trait_flags = XENOA_BLUESPACE_TRAIT + label_icon = "star" /datum/xenoartifact_material/bluespace/get_trait_list() return GLOB.xenoa_bluespace_traits @@ -104,6 +111,7 @@ texture_icon_states = list("texture-pearl1", "texture-pearl2", "texture-pearl3") custom_price = 500 trait_flags = XENOA_PEARL_TRAIT + label_icon = "question" //Calcified /datum/xenoartifact_material/calcified diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 43d30ffacc19f..fc7f03893a411 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -117,6 +117,9 @@ generate_xenoa_statics() var/atom/A = parent + //Add discovery component + A.AddComponent(/datum/component/discoverable/artifact) + //Setup our typing artifact_type = type || pick_weight(GLOB.xenoartifact_material_weights) artifact_type = new artifact_type() @@ -165,8 +168,11 @@ /datum/component/xenoartifact/Destroy(force, silent) if(!QDELETED(parent)) - //Reset parent's visuals var/atom/A = parent + //Remove discovery component + var/datum/component/discoverable/artifact/X = A.GetComponent(/datum/component/discoverable/artifact) + X.RemoveComponent() + //Reset parent's visuals A.remove_filter("texture_overlay") A.remove_filter("outline_1") A.remove_filter("outline_2") @@ -193,7 +199,7 @@ reset_timer(use_cooldown_timer) //Sound hint if(play_hint_sound) - playsound(get_turf(parent), 'sound/magic/blink.ogg', 60, TRUE) + playsound(get_turf(parent), 'sound/magic/blink.ogg', 50, TRUE) //Trait triggers for(var/i in GLOB.xenoartifact_trait_priorities) SEND_SIGNAL(src, XENOA_TRIGGER, i) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 005e84ad1a121..fdfa0bd8c8867 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -107,7 +107,7 @@ tooltip_stats["[initial(T.label_name)]"] += list("availability" = list()) for(var/datum/xenoartifact_material/M as() in materials) if(initial(M.trait_flags) & initial(T.flags)) - tooltip_stats["[initial(T.label_name)]"]["availability"] += list(list("color" = initial(M.material_color))) + tooltip_stats["[initial(T.label_name)]"]["availability"] += list(list("color" = initial(M.material_color), "icon" = initial(M.label_icon))) return temp /obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 09059642cdcb7..95f311c31deca 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -134,11 +134,14 @@ /datum/xenoartifact_trait/activator/flammable/translation_type_a(datum/source, atom/target) lit = FALSE + //Indicator hint + indicator_hint() /datum/xenoartifact_trait/activator/flammable/translation_type_d(datum/source, atom/target) var/atom/A = parent.parent if(A.density) lit = FALSE + indicator_hint() /datum/xenoartifact_trait/activator/flammable/translation_type_b(datum/source, atom/item, atom/target) var/obj/item/I = item @@ -148,6 +151,7 @@ if(parent.anti_check(target, XENOA_ACTIVATION_TOUCH)) return FALSE lit = TRUE + indicator_hint(1) search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) START_PROCESSING(SSobj, src) @@ -166,6 +170,7 @@ if(!length(parent.targets)) parent.trigger() lit = FALSE //This is a semi-weird way to do it, but it lets us 'disable' the fuse if we want + indicator_hint() search_cooldown_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), search_cooldown, TIMER_STOPPABLE) /datum/xenoartifact_trait/activator/flammable/get_dictionary_hint() @@ -177,6 +182,10 @@ deltimer(search_cooldown_timer) search_cooldown_timer = null +/datum/xenoartifact_trait/activator/flammable/proc/indicator_hint(engaging = FALSE) + var/atom/A = parent?.parent + A?.balloon_alert_to_viewers("[A] [engaging ? "snuffs out." : "flicks on"]!") + /* Timed This trait activates the artifact on a timer, which can be toggled on & off @@ -215,6 +224,7 @@ if(parent.anti_check(target, type)) return FALSE searching = !searching + indicator_hint(searching) /datum/xenoartifact_trait/activator/timed/process(delta_time) if(!searching) @@ -239,7 +249,7 @@ /datum/xenoartifact_trait/activator/timed/translation_type_d(datum/source, atom/item, atom/target) var/atom/A = parent?.parent - if(!isliving(A.loc) || check_item_safety(item)) + if(!isliving(A.loc) && !A.density || check_item_safety(item)) return trigger_artifact(target, XENOA_ACTIVATION_TOUCH) @@ -259,6 +269,11 @@ deltimer(search_cooldown_timer) search_cooldown_timer = null +/datum/xenoartifact_trait/activator/timed/proc/indicator_hint(engaging = FALSE) + var/atom/A = parent?.parent + A?.balloon_alert_to_viewers("[A] [engaging ? "stops ticking." : "starts ticking"]!") + + /* Signal This trait activates the artifact when it's signalled @@ -321,7 +336,7 @@ /datum/xenoartifact_trait/activator/signal/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), XENOA_TRAIT_HINT_RANDOMISED, list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target.")) + return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), XENOA_TRAIT_HINT_RANDOMISED, list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target."), XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact.")) /datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) if(!signal) @@ -412,3 +427,51 @@ if(!parent?.parent) return RegisterSignal(parent?.parent, COMSIG_MOVABLE_IMPACT, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) + +/* + Hungry + This trait activates the artifact when it's fed +*/ +/datum/xenoartifact_trait/activator/strudy/hungry + material_desc = null + label_name = "Hungry" + label_desc = "Hungry: The artifact seems to be made of a semi-living, hungry, material. This material seems to be triggered by feeding interactions." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 32 + ///How much damage do we deal per bite? + var/eat_damage = 3 + +/datum/xenoartifact_trait/activator/strudy/hungry/trigger_artifact(atom/target, type, force) + . = ..() + //Find a food item + var/mob/living/M = target + var/datum/component/edible/food_item + if(isliving(M)) + var/list/sides = list("left", "right") + for(var/i in sides) + var/atom/A = M.get_held_items_for_side(i) + food_item = A?.GetComponent(/datum/component/edible) + if(food_item) + break + if(!food_item) + food_item = target?.GetComponent(/datum/component/edible) + + //If food + var/atom/movable/AM = parent.parent + if(food_item) + playsound(AM.loc, 'sound/items/eatfood.ogg', 60, 1, 1) + food_item.feed_to_item(src, parent.parent) + return + //Otherwise, nibble the target + if(isliving(M)) + playsound(AM.loc, 'sound/weapons/bite.ogg', 60, 1, 1) + AM.do_attack_animation(M) + M.adjustBruteLoss(eat_damage) + AM.visible_message("[AM] bites [M]!", allow_inside_usr = TRUE) + to_chat(M, "[AM] bites you!") + return + + return FALSE + +/datum/xenoartifact_trait/activator/strudy/hungry/get_dictionary_hint() + return list() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 73ac6e6778d3a..c3e1f1e110bf7 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -591,9 +591,13 @@ /datum/xenoartifact_trait/major/shadow_realm/New(atom/_parent) . = ..() - GLOB.destabliization_exits += parent.parent + if(!parent?.parent) + return + GLOB.destabliization_exits += parent?.parent /datum/xenoartifact_trait/major/shadow_realm/Destroy(force, ...) + if(!parent?.parent) + return GLOB.destabliization_exits -= parent.parent return ..() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index f71dfafe3a4e6..61003ae8cdc51 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -62,7 +62,7 @@ /datum/xenoartifact_trait/minor/charged/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND, XENOA_TRAIT_HINT_APPEARANCE("This trait will make static particles appear around the artifact.")) /* Capacitive @@ -86,6 +86,7 @@ return current_charge = max_charges parent.cooldown_disabled = TRUE + setup_generic_item_hint() /datum/xenoartifact_trait/minor/capacitive/trigger(datum/source, _priority, atom/override) . = ..() @@ -100,9 +101,14 @@ current_charge = max_charges parent.cooldown_disabled = FALSE +/datum/xenoartifact_trait/minor/capacitive/do_hint(mob/user, atom/item) + . = ..() + if(istype(item, /obj/item/multitool)) + to_chat(user, "[item] detects [current_charge] additional charges!") + /datum/xenoartifact_trait/minor/capacitive/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_DETECT("multitool, which will also reveal the artifact's additional charges.")) /* Dense @@ -242,7 +248,7 @@ /datum/xenoartifact_trait/minor/cooling/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_INHAND, XENOA_TRAIT_HINT_APPEARANCE("This trait will make frost particles appear around the artifact.")) /* Sentient @@ -398,7 +404,7 @@ /datum/xenoartifact_trait/minor/delicate/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED) + return list(XENOA_TRAIT_HINT_MATERIAL, XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_APPEARANCE("This trait will make the artifact noticeably transparent.")) /* Aura @@ -664,7 +670,7 @@ /datum/xenoartifact_trait/minor/signaller/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency"), XENOA_TRAIT_HINT_RANDOMISED) + return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency"), XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact.")) /* Anchor diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm index 22d97a3dfddc2..efc89776cafa5 100644 --- a/code/modules/xenoarchaeology/traits/misc.dm +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -6,6 +6,10 @@ contribute_calibration = FALSE can_pearl = FALSE +/* + Objective trait for exploration artifacts +*/ + /datum/xenoartifact_trait/misc/objective blacklist_traits = list(/datum/xenoartifact_trait/minor/delicate) @@ -19,3 +23,40 @@ var/datum/component/gps/G = A.GetComponent(/datum/component/gps) qdel(G) return ..() + +/* + Special activator for closets +*/ + +/datum/xenoartifact_trait/activator/weighted/closet + material_desc = null + flags = NONE + +/datum/xenoartifact_trait/activator/weighted/closet/New(atom/_parent) + . = ..() + if(!parent?.parent || !istype(parent.parent, /obj/structure/closet)) + return FALSE + +/datum/xenoartifact_trait/activator/weighted/closet/trigger_artifact(atom/target, type = XENOA_ACTIVATION_CONTACT, force) + var/obj/structure/closet/C = parent.parent + //Trait check - This is different from an anti artifact check and should be done here to avoid activations, this trait is a helper essentially + if(target && HAS_TRAIT(target, TRAIT_ARTIFACT_IGNORE)) + return FALSE + //Stop traits that don't register targets activating when we feel them + if(parent.anti_check(target, type)) + return FALSE + //Door check + if(!C.opened) + return FALSE + //Collect targets + var/turf/T = get_turf(C) + for(var/atom/movable/AM in T?.contents) + parent.register_target(AM, force, XENOA_ACTIVATION_CONTACT) + parent.trigger() + return TRUE + +/obj/structure/closet/artifact + +/obj/structure/closet/artifact/ComponentInitialize() + . = ..() + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material, list(/datum/xenoartifact_trait/activator/weighted/closet, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/minor/capacitive, /datum/xenoartifact_trait/major/animalize), FALSE, FALSE) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 3993d6a9c4fde..2df12372042e8 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -39,6 +39,8 @@ ///How much extra value does this trait apply to the artifact - It's important this is applied before anyone can use stickers on the artifact var/extra_value = 0 + ///How many discovery points does this trait give? + var/discovery_reward = 100 ///Does this trait contribute to calibration var/contribute_calibration = TRUE @@ -66,7 +68,9 @@ //Setup trigger signals RegisterSignal(parent, XENOA_TRIGGER, PROC_REF(trigger)) //Appearance - generate_trait_appearance(parent.parent) + //Consider making a dedicated 'thing' for this check + if(parent.do_texture) + generate_trait_appearance(parent.parent) //Stats var/atom/A = parent.parent parent.target_range += extra_target_range diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 795b644e30cd9..14fead1618fa8 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -141,7 +141,7 @@ const XenoartifactlabelerGenerateInfo = (props, context) => {
      @@ -151,9 +151,9 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { const XenoartifactlabelerSticker = (props, context) => { const { act } = useBackend(context); return ( - +
      ); }; From df956d2e3ec17e90de536d36a84bd548f6734bc0 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 22 Jan 2024 15:53:14 +1100 Subject: [PATCH 083/339] Update sound.dm --- code/game/sound.dm | 2 +- code/modules/xenoarchaeology/traits/misc.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/game/sound.dm b/code/game/sound.dm index 63a5056e5988c..76963bb051aca 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -253,7 +253,7 @@ distance_multiplier - Can be used to multiply the distance at which the sound is S.status = SOUND_UPDATE SEND_SOUND(src, S) -/client/proc/playtitlemusic(vol = 0) +/client/proc/playtitlemusic(vol = 50) set waitfor = FALSE UNTIL(SSticker.login_music) //wait for SSticker init to set the login music diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm index efc89776cafa5..623cb81ba0990 100644 --- a/code/modules/xenoarchaeology/traits/misc.dm +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -56,6 +56,7 @@ return TRUE /obj/structure/closet/artifact + name = "Bishop" //Proper name /obj/structure/closet/artifact/ComponentInitialize() . = ..() From f965ff0b64410427eb8b9751e7ea8bd6ba6cf815 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 22 Jan 2024 17:00:10 +1100 Subject: [PATCH 084/339] Fix dense - 22 1 24 --- code/__DEFINES/xenoarchaeology.dm | 1 + code/modules/xenoarchaeology/traits/activators.dm | 7 ++++--- code/modules/xenoarchaeology/traits/malfunctions.dm | 7 +++---- code/modules/xenoarchaeology/traits/minors.dm | 2 +- code/modules/xenoarchaeology/traits/misc.dm | 3 ++- code/modules/xenoarchaeology/traits/traits.dm | 4 ++++ 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index 3421896b5fc01..425e1b5a20a33 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -35,6 +35,7 @@ #define XENOA_URANIUM_TRAIT (1<<2) #define XENOA_BANANIUM_TRAIT (1<<3) #define XENOA_PEARL_TRAIT (1<<4) +#define XENOA_MISC_TRAIT (1<<5) ///trait cooldowns #define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 95f311c31deca..309bcec6aa9c3 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -97,7 +97,7 @@ var/atom/A = parent?.parent if(!isliving(A.loc) && !A.density || check_item_safety(item)) return - trigger_artifact(target, XENOA_ACTIVATION_TOUCH) + trigger_artifact(target || item, XENOA_ACTIVATION_TOUCH) /datum/xenoartifact_trait/activator/strudy/translation_type_a(datum/source, atom/target) var/atom/A = parent?.parent @@ -443,6 +443,8 @@ /datum/xenoartifact_trait/activator/strudy/hungry/trigger_artifact(atom/target, type, force) . = ..() + if(!.) + return //Find a food item var/mob/living/M = target var/datum/component/edible/food_item @@ -467,8 +469,7 @@ playsound(AM.loc, 'sound/weapons/bite.ogg', 60, 1, 1) AM.do_attack_animation(M) M.adjustBruteLoss(eat_damage) - AM.visible_message("[AM] bites [M]!", allow_inside_usr = TRUE) - to_chat(M, "[AM] bites you!") + M.visible_message("[AM] bites [M]!", "[AM] bites you!") return return FALSE diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index df9f7eea3500e..648cd6740ce7f 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -193,9 +193,8 @@ continue var/mob/living/simple_animal/hostile/twin/T = new(get_turf(parent.parent)) //Setup appearance for evil twin - T.name = target.name T.appearance = target.appearance - T.color = COLOR_BLUE + T.color = parent.artifact_type.material_color //Handle limit and hardel clones += T RegisterSignal(T, COMSIG_PARENT_QDELETING, PROC_REF(handle_death)) @@ -247,14 +246,14 @@ if(!.) return var/atom/A = parent.parent - A.visible_message("The [A] begins to heat up, it's delaminating!") + A.visible_message("The [A] begins to heat up, it's delaminating!", allow_inside_usr = TRUE) addtimer(CALLBACK(src, PROC_REF(explode)), 10 SECONDS) //Fancy animation //TODO: Picking up and dropping breaks this animation - Racc A.color = COLOR_RED var/matrix/old_transform = A.transform var/matrix/new_transform = A.transform - new_transform.Scale(1.5, 1.5) + new_transform.Scale(1.3, 1.3) animate(parent.parent, transform = new_transform, time = 0.5 SECONDS, loop = -1, flags = ANIMATION_PARALLEL) animate(transform = old_transform, time = 0.5 SECONDS) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 61003ae8cdc51..7da28ac6ee95c 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -779,7 +779,7 @@ /datum/xenoartifact_trait/minor/haunted/proc/do_wail(repeat = TRUE) if(QDELETED(src)) return - playsound(get_turf(parent?.parent), 'sound/spookoween/ghost_whisper.ogg', 40, TRUE) + playsound(get_turf(parent?.parent), 'sound/spookoween/ghost_whisper.ogg', 30, TRUE) var/rand_time = rand(26, 34) SECONDS addtimer(CALLBACK(src, PROC_REF(do_wail)), rand_time) diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm index 623cb81ba0990..562a670946202 100644 --- a/code/modules/xenoarchaeology/traits/misc.dm +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -5,6 +5,7 @@ conductivity = 0 contribute_calibration = FALSE can_pearl = FALSE + flags = XENOA_MISC_TRAIT /* Objective trait for exploration artifacts @@ -30,7 +31,7 @@ /datum/xenoartifact_trait/activator/weighted/closet material_desc = null - flags = NONE + flags = XENOA_MISC_TRAIT /datum/xenoartifact_trait/activator/weighted/closet/New(atom/_parent) . = ..() diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 2df12372042e8..239eb33c65a75 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -202,6 +202,8 @@ var/list/temp = subtypesof(path) var/list/weighted = list() for(var/datum/xenoartifact_trait/T as() in temp) + if(initial(T.flags) & XENOA_MISC_TRAIT) + continue if(keyed) weighted += list(initial(T.label_name) = (T)) else @@ -212,6 +214,8 @@ /proc/compile_artifact_whitelist(var/flags) var/list/output = list() for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) + if(initial(T.flags) & XENOA_MISC_TRAIT) + continue if(!ispath(flags)) if((initial(T.flags) & flags)) output += T From ff8d485a94be8782c7476393583856062afcfd7a Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 25 Jan 2024 21:35:47 +1100 Subject: [PATCH 085/339] Trait QOL - 25 1 24 --- _maps/_basemap.dm | 2 +- .../byond_particles/emitter/artifact.dm | 4 ++ .../wiremod/components/atom/artifact.dm | 3 +- .../components/xenoartifact.dm | 12 +++- code/modules/xenoarchaeology/traits/majors.dm | 67 ++++++++++++++++++- .../xenoarchaeology/traits/malfunctions.dm | 2 +- code/modules/xenoarchaeology/traits/minors.dm | 8 ++- code/modules/xenoarchaeology/traits/traits.dm | 2 + 8 files changed, 91 insertions(+), 9 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index f98582a939870..adf168c987db4 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -74,6 +74,10 @@ plane = ABOVE_LIGHTING_PLANE blend_mode = BLEND_ADD +/obj/emitter/spiral/New(loc, ...) + . = ..() + add_filter("blur", 1, gauss_blur_filter(0.5)) + /obj/emitter/spiral/proc/setup(_color) particles = new/particles/spiral(_color) diff --git a/code/modules/wiremod/components/atom/artifact.dm b/code/modules/wiremod/components/atom/artifact.dm index d2cccf28e7963..7e45cfb0ca290 100644 --- a/code/modules/wiremod/components/atom/artifact.dm +++ b/code/modules/wiremod/components/atom/artifact.dm @@ -46,6 +46,5 @@ //Clear the artifact's traits for(var/i in artifact_comp.artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact_comp.artifact_traits[i]) - artifact_comp.artifact_traits[i] -= T - qdel(T) + qdel(T) //Artifact component should handle harddels diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index fc7f03893a411..4943735fea281 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -347,6 +347,8 @@ artifact_traits[trait.priority] += trait blacklisted_traits += trait.blacklist_traits blacklisted_traits += trait.type + //Ant-hardel stuff + RegisterSignal(trait, COMSIG_PARENT_QDELETING, PROC_REF(handle_trait)) return TRUE @@ -357,12 +359,12 @@ var/old_mask = do_mask do_mask = FALSE calcified = TRUE - build_material_appearance() + if(do_texture) + build_material_appearance() do_mask = old_mask //Disable artifact cooldown_override = TRUE - //Calibrates. Does the opposite of calcify /datum/component/xenoartifact/proc/calibrate() var/atom/movable/A = parent @@ -425,6 +427,12 @@ return TRUE return FALSE +/datum/component/xenoartifact/proc/handle_trait(datum/source) + SIGNAL_HANDLER + + var/datum/xenoartifact_trait/T = source + artifact_traits[T.priority] -= T + /* Artifact beam subtype */ diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index c3e1f1e110bf7..2380611681b6a 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -269,8 +269,7 @@ . = ..() if(!.) return - else - INVOKE_ASYNC(src, PROC_REF(do_emp)) //empluse() calls stoplag(), which calls sleep() + INVOKE_ASYNC(src, PROC_REF(do_emp)) //empluse() calls stoplag(), which calls sleep() /datum/xenoartifact_trait/major/emp/proc/do_emp() var/turf/T = get_turf(parent.parent) @@ -717,3 +716,67 @@ /datum/xenoartifact_trait/major/emote/get_dictionary_hint() . = ..() return list(XENOA_TRAIT_HINT_RANDOMISED) + +/* + Flashing + Creates a flash effect at the position of the artfiact +*/ +/datum/xenoartifact_trait/major/flash + label_name = "Flashing" + label_desc = "Flashing: The artifact seems to contain flashing components. Triggering these components will create a blinding flash." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = FALSE + weight = 18 + conductivity = 18 + ///Maximum flash range + var/max_flash_range = 7 + +/datum/xenoartifact_trait/major/flash/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(parent.parent) + var/flash_range = max_flash_range * (parent.trait_strength/100) + playsound(T, 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) + new /obj/effect/dummy/lighting_obj (T, flash_range + 2, 4, COLOR_WHITE, 2) + for(var/mob/living/M in viewers(flash_range, T)) + flash(get_turf(M), M) + for(var/mob/living/M in hearers(flash_range, T)) + bang(get_turf(M), M) + +//IDK, I coped both of these from flashbang.dm +/datum/xenoartifact_trait/major/flash/proc/flash(turf/T, mob/living/M) + if(M.stat == DEAD) //They're dead! + return + var/distance = max(0,get_dist(get_turf(src),T)) + //When distance is 0, will be 1 + //When distance is 7, will be 0 + //Can be less than 0 due to hearers being a circular radius. + var/distance_proportion = max(1 - (distance / (max_flash_range * (parent.trait_strength/100))), 0) + + if(M.flash_act(intensity = 1, affect_silicon = 1)) + if(distance_proportion) + M.Paralyze(20 * distance_proportion) + M.Knockdown(200 * distance_proportion) + else + M.flash_act(intensity = 2) + +/datum/xenoartifact_trait/major/flash/proc/bang(turf/T, mob/living/M) + if(M.stat == DEAD) + return + var/distance = max(0,get_dist(get_turf(src),T)) + M.show_message("BANG", MSG_AUDIBLE) + var/atom/A = parent.parent + if(!distance || A.loc == M || A.loc == M.loc) //Stop allahu akbarring rooms with this. + M.Paralyze(20) + M.Knockdown(200) + M.soundbang_act(1, 200, 10, 15) + else + if(distance <= 1) + M.Paralyze(5) + M.Knockdown(30) + + var/distance_proportion = max(1 - (distance / (max_flash_range * (parent.trait_strength/100))), 0) + if(distance_proportion) + M.soundbang_act(1, 200 * distance_proportion, rand(0, 5)) diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 648cd6740ce7f..37953ab7ad01b 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -247,7 +247,7 @@ return var/atom/A = parent.parent A.visible_message("The [A] begins to heat up, it's delaminating!", allow_inside_usr = TRUE) - addtimer(CALLBACK(src, PROC_REF(explode)), 10 SECONDS) + addtimer(CALLBACK(src, PROC_REF(explode)), 30*(parent.trait_strength/100) SECONDS) //Fancy animation //TODO: Picking up and dropping breaks this animation - Racc A.color = COLOR_RED diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 7da28ac6ee95c..064ded4a7ac2c 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -102,9 +102,9 @@ parent.cooldown_disabled = FALSE /datum/xenoartifact_trait/minor/capacitive/do_hint(mob/user, atom/item) - . = ..() if(istype(item, /obj/item/multitool)) to_chat(user, "[item] detects [current_charge] additional charges!") + return ..() /datum/xenoartifact_trait/minor/capacitive/get_dictionary_hint() . = ..() @@ -279,6 +279,10 @@ QDEL_NULL(mob_spawner) return ..() +/datum/xenoartifact_trait/minor/sentient/get_dictionary_hint() + . = ..() + return list(list("icon" = "exclamation", "desc" = "This trait will make the artifact unable to be sold.")) + /datum/xenoartifact_trait/minor/sentient/proc/handle_ghost(datum/source, mob/M, list/examine_text) if(isobserver(M) && !sentience?.key && (alert(M, "Are you sure you want to control of [sentience]?", "Assume control of [sentience]", "Yes", "No") == "Yes")) sentience.key = M.ckey @@ -717,6 +721,8 @@ //Anchor if(ismovable(AM) && isturf(AM.loc)) AM.anchored = !AM.anchored + //Message + AM.visible_message("[AM] [AM.anchored ? "anchors to" : "unanchors from"] [get_turf(AM)]!", allow_inside_usr = TRUE) /* Slippery diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 239eb33c65a75..36a9124698bf9 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -189,6 +189,8 @@ //If they have science goggles, or equivilent, they are shown exatcly what trait this is if(user?.can_see_reagents()) var/atom/A = parent.parent + if(!isturf(A.loc)) + A = A.loc A.balloon_alert(user, label_name, parent.artifact_type.material_color, TRUE) return From e217891e15762ace6f7d5c5abeb9d5648b41ecf4 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 26 Jan 2024 00:28:30 +1100 Subject: [PATCH 086/339] Better pearling - 26 1 24 --- _maps/map_files/MetaStation/MetaStation.dmm | 84 ++++++++++-------- beestation.dme | 3 +- code/game/objects/effects/contraband.dm | 8 ++ .../byond_particles/emitter/artifact.dm | 4 +- .../components/xenoartifact.dm | 52 +++++++---- .../{components => misc}/materials.dm | 0 code/modules/xenoarchaeology/misc/tutorial.dm | 32 +++++++ .../tools/xenoarchaeology_machines.dm | 10 ++- code/modules/xenoarchaeology/traits/minors.dm | 3 + code/modules/xenoarchaeology/traits/traits.dm | 61 +++++++++++-- icons/obj/contraband.dmi | Bin 81928 -> 83242 bytes 11 files changed, 193 insertions(+), 64 deletions(-) rename code/modules/xenoarchaeology/{components => misc}/materials.dm (100%) create mode 100644 code/modules/xenoarchaeology/misc/tutorial.dm diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 1adb7a3fabe7d..5e8170a02753a 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -16623,8 +16623,9 @@ /turf/open/floor/circuit/telecomms/mainframe, /area/tcommsat/server) "bUM" = ( -/obj/item/xenoartifact, /obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/obj/item/paper/artifact_tutorial, /turf/open/floor/engine, /area/science/explab) "bUQ" = ( @@ -21062,7 +21063,8 @@ }, /obj/effect/turf_decal/bot, /obj/effect/landmark/blobstart, -/turf/open/floor/noslip/white, +/obj/effect/mapping_helpers/make_non_slip, +/turf/open/floor/plasteel/white, /area/science/explab) "cIH" = ( /obj/structure/cable/yellow{ @@ -26020,7 +26022,7 @@ icon_state = "4-8" }, /obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; + name = "Xenoarchaeology Lab"; req_one_access_txt = "8;49" }, /obj/effect/turf_decal/stripes/line{ @@ -35411,6 +35413,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, +/obj/structure/sign/poster/official/xenoarchaeology{ + pixel_y = 32 + }, /turf/open/floor/plasteel/white, /area/science/explab) "hDL" = ( @@ -36583,8 +36588,9 @@ }, /obj/effect/loot_jobscale/medical/first_aid_kit, /obj/item/clothing/neck/stethoscope, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science, +/obj/item/healthanalyzer{ + pixel_y = 7 + }, /turf/open/floor/plasteel/dark, /area/science/explab) "iaK" = ( @@ -37037,11 +37043,6 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/closet/crate/science, -/obj/effect/turf_decal/bot, -/obj/item/xenoartifact, -/obj/item/xenoartifact, -/obj/item/xenoartifact, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -43014,6 +43015,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, +/obj/effect/mapping_helpers/tile_breaker, /turf/open/floor/plasteel/white, /area/science/explab) "kDG" = ( @@ -43134,17 +43136,13 @@ /area/crew_quarters/dorms) "kFA" = ( /obj/structure/table, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_y = 5 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/xenoarchaeology_labeler{ - pixel_y = 6 +/obj/structure/sign/poster/official/xenoarchaeology{ + pixel_y = -32 }, -/obj/item/xenoarchaeology_labeler, +/obj/item/book/manual/wiki/xenoarchaeology, /turf/open/floor/plasteel/dark, /area/science/explab) "kFB" = ( @@ -56664,21 +56662,6 @@ /turf/open/floor/plasteel, /area/science/mixing) "pUX" = ( -/obj/structure/rack, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/assembly/igniter, -/obj/item/analyzer, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/geiger_counter, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, /obj/effect/turf_decal/bot, /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -56686,6 +56669,12 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/effect/mapping_helpers/tile_breaker, /turf/open/floor/plasteel/dark, /area/science/explab) "pVa" = ( @@ -62033,15 +62022,24 @@ /turf/open/floor/plasteel, /area/engine/break_room) "rUc" = ( -/obj/structure/rack, +/obj/effect/turf_decal/bot, /obj/item/storage/toolbox/mechanical{ pixel_x = -2; pixel_y = -1 }, -/obj/effect/turf_decal/bot, +/obj/item/analyzer{ + pixel_x = -9 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/obj/structure/table, /turf/open/floor/plasteel/dark, /area/science/explab) "rUd" = ( @@ -66842,15 +66840,23 @@ /turf/open/floor/plasteel, /area/crew_quarters/locker) "tPq" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/tank/internals/oxygen, -/obj/item/book/manual/wiki/xenoarchaeology, /obj/effect/turf_decal/bot, -/obj/item/healthanalyzer, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/table, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, /turf/open/floor/plasteel/dark, /area/science/explab) "tQn" = ( diff --git a/beestation.dme b/beestation.dme index e079e0ae88749..276346c8098da 100644 --- a/beestation.dme +++ b/beestation.dme @@ -4164,8 +4164,9 @@ #include "code\modules\wiremod\shell\scanner_gate.dm" #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" -#include "code\modules\xenoarchaeology\components\materials.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" +#include "code\modules\xenoarchaeology\misc\materials.dm" +#include "code\modules\xenoarchaeology\misc\tutorial.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_labeler.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_machines.dm" #include "code\modules\xenoarchaeology\tools\console\xenoarchaeology_console.dm" diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index a283f551f1eca..89ad0370fdf4f 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -667,4 +667,12 @@ desc = "A poster begging you to max your suit sensors. Otherwise, you may be harder to locate if you sustain damage." icon_state = "poster50" +/obj/structure/sign/poster/official/xenoarchaeology + name = "Xenoarchaeology" + desc = "A poster with featuring several diagrams of artifacts.\ + \n\ + Artifacts can be labeled and sold through cargo to obtain research & discovery points.\n\ + Poorly labeled artifacts will yield fewer rewards than accurately labeled ones." + icon_state = "poster51" + #undef PLACE_SPEED diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index adf168c987db4..823e19fae8fa6 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -76,7 +76,7 @@ /obj/emitter/spiral/New(loc, ...) . = ..() - add_filter("blur", 1, gauss_blur_filter(0.5)) + add_filter("blur", 1, gauss_blur_filter(0.7)) /obj/emitter/spiral/proc/setup(_color) particles = new/particles/spiral(_color) @@ -88,7 +88,7 @@ fade = 1 fadein = 1 rotation = generator("num", 0, 360, UNIFORM_RAND) - spin = generator("num", 10, 15, UNIFORM_RAND) + spin = generator("num", 8, 10, UNIFORM_RAND) friction = 0.21 color = "#94f3ff" scale = generator("box", list(1.5, 1.5, 1.5), list(2, 2, 2), UNIFORM_RAND) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 4943735fea281..057b30f6e4bd1 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -2,7 +2,9 @@ Items with this component will act like alien artifatcs */ -//Item presets for generic shit +/* + Item presets for generic stuff +*/ /obj/item/xenoartifact name = "artifact" icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' @@ -12,8 +14,6 @@ throw_range = 3 ///What type of artifact var/datum/xenoartifact_material/artifact_type - ///Use this for debugging or admin shit - var/spawn_with_traits = TRUE /obj/item/xenoartifact/Initialize(mapload, _artifact_type) . = ..() @@ -22,23 +22,34 @@ /obj/item/xenoartifact/ComponentInitialize() . = ..() - if(spawn_with_traits) - AddComponent(/datum/component/xenoartifact, artifact_type) + add_artifact_component() + +/obj/item/xenoartifact/proc/add_artifact_component() + AddComponent(/datum/component/xenoartifact, artifact_type) -//Maint variant for loot, has a 80% chance of being safe, 20% of not +///Maint variant for loot, has a 80% chance of being safe, 20% of not /obj/item/xenoartifact/maint/ComponentInitialize() artifact_type = prob(80) ? /datum/xenoartifact_material/bluespace : null return ..() -//Objective variant, simply has the objective trait +///Objective variant, simply has the objective trait /obj/item/xenoartifact/objective/ComponentInitialize() . = ..() AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) X?.add_individual_trait(/datum/xenoartifact_trait/misc/objective) +///No trait variant, for debug tools /obj/item/xenoartifact/no_traits - spawn_with_traits = FALSE + +/obj/item/xenoartifact/no_traits/add_artifact_component() + return + +///Variant for 'tutorial' +/obj/item/xenoartifact/tutorial + +/obj/item/xenoartifact/tutorial/add_artifact_component() + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/bluespace, list(/datum/xenoartifact_trait/activator/strudy, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/major/hollow)) /* Export datum, so we can sell artifacts for dosh @@ -101,9 +112,6 @@ ///Do we edit the parent's silhouette? var/do_mask = TRUE - ///Do we make pearls when we're destroyed? - var/make_pearls = TRUE //TODO: Remeber to disable this when you're done testing - Racc - ///Do we play a sound? - This is mostly here for admins to disable when they're doing gimmicks var/play_hint_sound = TRUE @@ -180,12 +188,10 @@ A.appearance = old_appearance A.name = old_name old_appearance = null - //Delete and/or 'pearl' our traits + //Delete our traits for(var/i in artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact_traits[i]) artifact_traits[i] -= T - if(make_pearls && T.can_pearl) - new /obj/item/trait_pearl(get_turf(parent), T.type) if(!QDELETED(T)) qdel(T) return ..() @@ -244,9 +250,17 @@ //Max malfunction checks, against our material if(length(artifact_traits[TRAIT_PRIORITY_MALFUNCTION]) >= artifact_type.max_trait_malfunctions) return + //Hint sound + var/atom/A = parent + playsound(A, 'sound/effects/light_flicker.ogg', 60) + A.visible_message("[A] makes a concerning sound, as if something has gone terribly wrong...") + //Build malfunctions var/list/focus_traits focus_traits = GLOB.xenoa_malfunctions & artifact_type.get_trait_list() build_traits(focus_traits, artifact_type.trait_malfunctions) + //Reset instability + //TODO: Consider reworking this - Racc + instability = 0 /datum/component/xenoartifact/proc/register_target(atom/target, force, type = XENOA_ACTIVATION_CONTACT) //Don't register new targets unless the cooldown is finished @@ -399,8 +413,8 @@ var/icon/I = artifact_type.get_texture() A.add_filter("texture_overlay", 1, layering_filter(icon = I, blend_mode = BLEND_INSET_OVERLAY)) //Throw on some outlines - A.add_filter("outline_1", 2, outline_filter(2, "#000")) - A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color)) + A.add_filter("outline_1", 2, outline_filter(2, "#000", flags = OUTLINE_SHARP)) + A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color, flags = OUTLINE_SHARP)) ///Create a hint beam from the artifact to the target /datum/component/xenoartifact/proc/create_beam(atom/movable/target) @@ -433,6 +447,12 @@ var/datum/xenoartifact_trait/T = source artifact_traits[T.priority] -= T +/datum/component/xenoartifact/proc/remove_individual_trait(datum/xenoartifact_trait/trait, destroy = FALSE) + artifact_traits[trait.priority] -= trait + UnregisterSignal(trait, COMSIG_PARENT_QDELETING) + if(destroy) + qdel(trait) + /* Artifact beam subtype */ diff --git a/code/modules/xenoarchaeology/components/materials.dm b/code/modules/xenoarchaeology/misc/materials.dm similarity index 100% rename from code/modules/xenoarchaeology/components/materials.dm rename to code/modules/xenoarchaeology/misc/materials.dm diff --git a/code/modules/xenoarchaeology/misc/tutorial.dm b/code/modules/xenoarchaeology/misc/tutorial.dm new file mode 100644 index 0000000000000..087e58b9cb65b --- /dev/null +++ b/code/modules/xenoarchaeology/misc/tutorial.dm @@ -0,0 +1,32 @@ +//Tutorial paper for labelling artifacts +/obj/item/paper/artifact_tutorial + name = "letter of instruction" + default_raw_text = "Hello, ______. \n\ + \n\ + I hope you have settled into your new post well, and have begun your research.\ + Under reccomendation of ______, your outpost has been licensed to research class-X artifacts.\ + We hope you'll appreciate the gesture.\n\ + \n\ + We have shipped you some samples to get you started. The one supplied along with this note should\ + serve as a fine introduction.\n\ + \n\ + To start researching an artifact, note its material. If you examine this one here, you will find\ + it is a **bluespace** artifact, this lets us know which artifact traits are compatible with it.\ + Use your artifact labeler to see what materials a trait is compatible with.\n\ + If you're wearing your science goggles, your proper PPE, you may also notice another, more\ + in-depth material description. This will hint at what traits the artifact has, and can be\ + checked in your labeler.\n\ + Another piece of PPE you should be wearing is your anti-tactile pinchers, these will stop\ + artifacts from making you a missing persons case. If you are wearing these, and have them\ + enabled, you should be able to 'feel' the artifact, your science goggles will recognize any\ + sensations and inform you which trait they correspond to.\n\ + Finally, don't forget about those dusty machines in the corner. They can be used to measure weight\ + and conductivity, respectively. If you label an artifact then weigh it, it will tell you the\ + weight of the currently labeled traits, and the artifact's total weight. You can use this in\ + combination with your labeler to deduce what other traits the artifact has.\n\ + \n\ + When you're done, be sure to label the artifact and hand it over to cargo, remember to tell them not\ + to touch it. If you've done a good job, we'll be sure to send you back some resources to aid your\ + research.\n\ + \n\ + Good luck, and safe travels." diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 981470c0be6fa..593c5080f9f65 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -63,6 +63,10 @@ /obj/machinery/xenoarchaeology_machine/scale icon_state = "scale" +/obj/machinery/xenoarchaeology_machine/scale/examine(mob/user) + . = ..() + . += "Interact to measure artifact weight.\nLabeled artifacts will also show label weights, against the total." + /obj/machinery/xenoarchaeology_machine/scale/attack_hand(mob/living/user) . = ..() ///Get the combined weight of all artifacts in our target @@ -94,6 +98,10 @@ /obj/machinery/xenoarchaeology_machine/conductor icon_state = "conductor" +/obj/machinery/xenoarchaeology_machine/conductor/examine(mob/user) + . = ..() + . += "Interact to measure artifact conductivity.\nLabeled artifacts will also show label conductivity, against the total." + /obj/machinery/xenoarchaeology_machine/conductor/attack_hand(mob/living/user) . = ..() ///Get the combined conductivity of all artifacts in our target @@ -125,7 +133,7 @@ /obj/machinery/xenoarchaeology_machine/calibrator/examine(mob/user) . = ..() - . += "Alt-Click to calibrate inserted artifacts." + . += "Alt-Click to calibrate inserted artifacts.\nArtifacts can be calibrated by labeling them 100% correctly, excluding malfunctions." /obj/machinery/xenoarchaeology_machine/calibrator/attack_hand(mob/living/user) if(length(contents)) diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 064ded4a7ac2c..6270489248e4d 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -303,6 +303,9 @@ sentience.real_name = "[sentience.name] - [parent?.parent]" sentience.key = ckey sentience.status_flags |= GODMODE + //Stop them from wriggling away + var/atom/movable/AM = parent.parent + AM.buckle_mob(AM, TRUE) //Action var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/P = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent?.parent, parent) sentience.AddSpell(P) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 36a9124698bf9..fade43c952b12 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -45,7 +45,7 @@ ///Does this trait contribute to calibration var/contribute_calibration = TRUE - ///Can this trait be made a pearl? + ///Can this trait be made a pearl? - aka can this trait be used in circuits var/can_pearl = TRUE ///Characteristics for deduction @@ -64,17 +64,21 @@ //The reason this is a seperate proc is so we can init the trait and swap its artifact component parent around /datum/xenoartifact_trait/proc/register_parent(datum/source) parent = source + var/atom/movable/AM = parent.parent RegisterSignal(parent, COMSIG_PARENT_QDELETING, PROC_REF(remove_parent)) //Setup trigger signals RegisterSignal(parent, XENOA_TRIGGER, PROC_REF(trigger)) + //If we need to setup signals for pearl stuff + if(can_pearl) + RegisterSignal(AM, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER), PROC_REF(catch_pearl_tool)) + RegisterSignal(AM, COMSIG_MOVABLE_MOVED, PROC_REF(catch_move)) //Appearance - //Consider making a dedicated 'thing' for this check + //TODO: Consider making a dedicated 'thing' for this check - Racc if(parent.do_texture) generate_trait_appearance(parent.parent) //Stats - var/atom/A = parent.parent parent.target_range += extra_target_range - A.custom_price += extra_value + AM.custom_price += extra_value //Remeber to call this before setting a new parent /datum/xenoartifact_trait/proc/remove_parent(datum/source) @@ -88,6 +92,9 @@ parent.target_range -= extra_target_range A.custom_price -= extra_value cut_trait_appearance(parent.parent) + if(can_pearl) + UnregisterSignal(A, COMSIG_ATOM_TOOL_ACT(TOOL_SCREWDRIVER)) + UnregisterSignal(A, COMSIG_MOVABLE_MOVED) //TODO: If we ever need trait pearls to keep the initialized trait, remove this - Racc qdel(src) parent = null @@ -197,6 +204,43 @@ /datum/xenoartifact_trait/proc/get_dictionary_hint() return list() +//Check the artifact, item, moves to see if we open up for 'pearling' +/datum/xenoartifact_trait/proc/catch_move(datum/source, atom/target, dir) + SIGNAL_HANDLER + + if(!parent.calibrated) + return + //Check if we're at our heart location, which is based on our weight-x and conductivity-y + var/atom/A = parent.parent + if(target.x % weight == 0 && target.y % conductivity == 0) + //TODO: make an effect for this, see atomic cowboy, is the reference - Racc + A.visible_message("[A] develops a slight opening!\nYou could probably use a screwdriver on [A]!", allow_inside_usr = TRUE) + //Do effects + else + //Undo effects + return + +/datum/xenoartifact_trait/proc/catch_pearl_tool(datum/source, mob/living/user, obj/item/I, list/recipes) + SIGNAL_HANDLER + + if(!parent.calibrated) + return + var/atom/A = parent.parent + if(A.x % weight != 0 || A.y % conductivity != 0) + return + INVOKE_ASYNC(src, PROC_REF(pry_action), user, I) + +/datum/xenoartifact_trait/proc/pry_action(mob/living/user, obj/item/I) + var/atom/A = parent.parent + to_chat(user, "You begin to pry [A] open with [I].") + if(do_after(user, 5 SECONDS, A)) + //Screwdriver mini game thing + new /obj/item/trait_pearl(get_turf(A), src) + parent.remove_individual_trait(src) + remove_parent() + else + to_chat(user, "You reconsider...") + ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path, keyed = FALSE) if(!ispath(path)) @@ -227,7 +271,9 @@ output += T return output -//This holds individual traits +/* + Container for traits used in circuits +*/ /obj/item/trait_pearl name = "xenopearl" icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' @@ -241,6 +287,11 @@ . = ..() stored_trait = trait +/obj/item/trait_pearl/examine(mob/user) + . = ..() + if(user.can_see_reagents()) + . += "[src] holds '[initial(stored_trait.label_name)]'." + ///Particle holder for trait appearances - Throw any extras you want in here /atom/movable/artifact_particle_holder mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index 892a5043e4965661cb6440e0d8f349d1082346cc..f6e275e8e8414ad98cf6692db8a7552534e07751 100644 GIT binary patch literal 83242 zcma&NRX`kFuq`~eJAn!A?iSqLHF$6c5Fog_ySsaU1P$&UGDvV|2=4AMa3|ln=RW*T z|HIJTyJwo}?%GwWR;?Yat}2ItN`wjk05BBfr8NNnm>}rK6d4gZ(imDR0zH`Y(bjX5 zwsN&_vHj|1>*NRkc;)3UPN)uu1H=Ei`@X|lBO1I99Vj6VS#qBzBhM&*|2&%O^6*>Kn5_XeuqY@$Bwxi{f7U${{E^>l2VrSFbRBMq^^n`3_zgmW zp+PH=Z8>x38+CZh0Z&+IY~8_ ziy+1JqdjYxr{Jmd#dlWEq6M0UgF+-{e(eI>j+1e@-1~du?EKcC;$r5653vQC;8rac{2HL;M=uzk$akK zk{#7w{^GE*8A<{>d{M|=ThTE{2Tp_wtMdr>=|zpT2W*WoQB)N7e_=|n696bl*e;PY zspFPsq6JMy_i}2U)+s1%sqpGY5TA*f&cfsCx!GB;(|l`>4gyiUZ0Yo89-{cYiBO>3 zcHDbz?GzehN)DA&ZKiNDATlMkBsM%uxFpOh52p%V5Pt#;atL7RngboK9KT8%b-k&Hp5RG)axnI zs#YkMK%%d(%#g8BHGzx&PB#|>%gYL%GQ#s+-A-l{U zP4x*Rky${Jiu$i;AwgrQ^i9s&vOnr>n_nH#4*?M+;eP=Vg&l`u-n}zEU$!ay@kF*zYpmqt#IDFFJT=(j zfIi5uIFv#|nXX!#Ho!A+)id)tlgN%PWngI7+_MlUb%b>Y2%%tDTwC-w1#Di7aRa>k z)~hoiT^{S02ShL4NT+$cR}aQ!()S7Y?d9UDjUHTSm}5tajC(Et|1yE&Nl zo`tvlMe-S#v>Xx@6_rrCySfNXW(wpG|IQ@YYr4PW{V>@TV-BtBE#SJETN6VFC27!c z$4mFIfI&xuuF*Akb)PYw72t*7ROs}vbehDA$z43%rN}@$$KOUC=_|$7ZMdXauZdRa z^viWI=^y*iBusI}<{B(hV|Ram)Gf+MQ9eQyBT^Xv>H$q+-rNF3(0`ET(u*de@e^EE z1@(!yFI^d!pX*qIG|Aq2?qEnny%F>C^M4gU&b6WbB71%Go@?p6gRP$VJ}~erg~7Xj zuH=1t!V7=H9^YhZXSY(B6L@%yxspAWRqc2ZMV+AD;sAH?M+&QZk6H_S@&xs{!a_UZRQIP^fL&{KKL_wf^UD4DoQ^ z+{Bl=ysziNQ1GHkqVDcWuCqAIU;%@XSdjr1UPb7CbB#?(r@OqpCPrYirGODqj!sTa zHm@&_y9Ss08@)kIqOYM4M`Y&tz=Ps@Si&yHC#33^e{-Ne3A67W0^!5lJU@zyV^ynD;ydLlaN4Mln-D9N@p)km5@l~7Db-d2R6#}Op z0DU-nrgfN`x8{#myHqh$2%VDTo!674M32{lApYl*ruMTvdj6C8L4fwySJA6q)O9Ps zk0o!%^SmIvdVnbmS_Z2S^ejPF#uHNGe|8OiY6`kr>BE(1NT$8LYnNKTkp&RvYWuUxQhCq3_6* zqYRE=p5}g^KS+15LM0cGh!ue&@YOGcfg)i*#C-Sk^mM63g)ww5S&qzXdn7)O^yeUs z+&8=U&5au*E)Jun50JY%C)XjIlMfI(5O~A?u4ZNt>Mv^~7tVn4_MmD~qIdiW)Pygq<2J?p`TTAB8xdGSyFHgM=bRj0aTDP) zotMm}1E%X*UMAc>T>hE`uhRQNpXbzQ(xIr+PPWhohZUNQ=k~%_26V62$9-t{VTeH< zG>`Y%v|*$rlxhKT#H+aMMZ@~ONQ-#r&Ve469 zBUcKS*^gn;_Fz{Q!>v4QE+g5&I@C5(K!H914Ww<-q-e`oGL1|BUDyWOS3<%d%-XQ-8G{h$OmFWyow6MMvP>!)m9djgA*xWBb$ zj*bUs*3s+3>D1PZE{|6bvR5ww$k`d_;M1zgV%j-Z(^p!8Tk zxXhxEVwyvjt&F(ZqEI;tj0jG{1>Z++XPuonwm7U-Na6jz?DBt;%>Qm&0q+~NJVxT) zGb!MPVP{n+Fr^Q0pod{2QzC~1Nfrm$=Iq85|9^AM)OFN$R=HB<$2pYmx6n|$_+;?b zcZ?T3M`!H;I zMun6x3S=O+HM*jX==;Qf*MX)g2wa`m4nH8M*?w_mbv0HKb?Um_fq0PPcL9R}uI3@W zBBSyw%Q^FDrY0^tj2UodWyQex@Bdg~a@@=J^!)Sb85)kV`JHEajLZxF{C81k{ySQ> zN83z?=F?TjPKUywdxU=}>!0z@BcjcK{{m@ZtjE77d`%}K1o#(2Q%gvLpiinx;e8{X z*Y59hbLi(;#q#!O{`u74-y>ZX>pEg7f{XSLhaS0ZdP@lgEfSvw@jxRb%qd_a=rdB; z^yg1#KjHqI1Vg_wkqdVU;Bn&r2{-fk6ESr3vxk%r#Y8RwbTsD!a0SNp6Z5}Op3py- z2NR+HjM>8o_YkimU4enRzy#pm5C2*EKS<&K@1~A@>$V5x-wnZ~vUO*RSZG7~NT+_- zox)J{ZJd&HzOk>Io?}G*ckfM}GXO1m4067&rN;(1Y59HXm;jIWkPqMSfHN@TS)5X| z3L)6Avpfprnou{xhNXm;z*c9#=TO0$<$;OX1_n_eUkGCja;PgNE0$jfC-NugcevTg zV9Nc6K}M!c+Ff=`{irF>_W({>Lt3xn&NhFaM+C%N{~A2Z>t5J=r>_Y*82^kLZJ+Du$8_% zBPdV;o5TCclFxBXPht5#-*5szW>tmae;BsTOi%asjK_JuT#nXMX;n5_fe2c@ENeEr zzMGiPg#!hT2D6HjWns91w2vYij>!lWvSFjjr5RD3Pf z;n;p}zTlE3S9+*R8>Wt28yU!=)5l3ZHR_`e7V$v`gjrTc8kGk)Dr#zSjo8$%Wszab zu&4j<$Hn$uG*{n2tc$d;`tbX#>~7Usgvr;u`4{Q^K?b!!@f< zq7l#7A=lw%^7i)j!{PtU%HG$f>kCy46-Ou*+gB<8zeDCGQHWc9Z zncGM%XuQPxvA-h{pwfM2d+nM@KtxFt%?Pw)Do*hwg7=F< zihbI{7fIM9Oi0-95)HEX{y23lI3La=c1gM_EIu21iVd5~+g0QZED)Xp`gmAJCiLQt zSMWPbii#n&_=YcBF~PqvXS*iOtwpZlV9UttN$r@imWChq}8P zf7yTYFmUr`o4=x>B0}h_&7yGYtzbXhkgA;jkvW+L1@$9C>R<2FR^pJyWQhe#pfz&> zbw4r-2Mth?f)vh>DU3F$fp8*)BdDS`pm@Mjsn%Pl!=5Zrd2l%_U9Z1t53o<&n=)JQB3m+pX? z2)|y4W;VP~!zG8O#@&r2!E$D%G`R0&Xq?fVmH({j&LQTk85nH%@G~hOha{bJ#E1F& zTP`}3B~9R1H6iz9r1%|RRh9qCLGM$L$h=H@%c8|zE(Xn~OJwYvoDbGH(c#1#Ce@_3 zyn=l=8ne=-qEcsi#AQq$lJr6*JHjZeaB@!}b~p(yk5}ucazB=#oyg0q zEo(XDeM`$x5B_O9<78KBqj$af`E#ut@Htw^luTPjsRegtUGH6z<2mitWah_zZuupIDwI}09skrL zc5sufw$E(dw4}mk<Exj-b7kFb8x|yKk zR|rheQvY)-`&;xiyBG{R;kE#Tbb`;)KAy-bN-BNR2UNW_r@$Cpl2p}1fQJZE!N~u4 zrIUjNubk$aIr8V3uKN_#%6erqklV#zP=#|P4n1e>KJF-I70zhNHC_or2r5#@7(d;W zKL-nLRg$w2-wOi1K0>eU%^m-F+ZpWkyD}v7^ArV11`1p$CHsE}6O%ukD3D>HuRNMs zbrZ~;=<>bEMEc+OV7EeE8Y>k@Dba(qL)WJYnp`p}$sLXS^`4S626Fo%cA*rJ; zj*D#;#zPaWEwc?~_v^%1N6d2@IfQZr8eO_*;QRLT%nuh|d-_I0jXzYSQ4u6X6@%*j zIls5m-wrm2>>GCf$9+Zw)JvcdGDa4b(vGG5GJ?nXP3~2FT zC7&Y1=mD^lC)q)v-hZ~LWC?pW8nimDGq=D$#aj_QP)I53a@Ql&-xV9ns-qy2!pKN< zzN6#=Xa!eQH#!3}6nZ;5BYPG)$I6sYZicVv#|0u;nFG~MgD!D2aJjE9)GoFf&6P|& zk4C$jZd!OG)<9I{G&Sa2nwz(TZ&(SNGSq*YAS1msHTHi56d7IGNo)%J`E);d(~7}~ z7O2JOi?eg@=KjNW*4Wp36I!55c5oe@%w!I)l1>f^x9QMDk?)eoP1AFWCId1MF%Ll) z`Jrzj!pyH?z%c&HYK6ZIJsOrsZpV`{=XcATpdqX)g$hBJu?0h4_h&dc*hRoS?1xA*y-R<= z1SwBXc6;5I2&se@2E&gV@?D^)ZErRUo36-H_6^v+tn72M?WSHbw|Jb?$rAfnat@W) zj!@Maz0NWdaSX1tS~D(}Eoms(6uZw)!sAH7%galnAW4@>nF(s}-j?+^S?Z@mBly#K zNgLz1y*rI54z1asRnfoN56V5=+cQ%X1`bQqTS2-tTwu#rUdc!YGV|4y{n#UttYM~L zN^9f?Rd7)N0%GrUU&bTSgXs_$Qg-8+nNK3^XD%^^(>Yov+MIR)(>B2SXsa8 zH$^Cv%1Ta+=;oc9{Hs^Ek-_(zDyg=!6;<;!y5~)JS)3LTu!>bl?+&HbiyX*%wnzb? zabozSA(ZH^`{1)>2p236!;gsHmZ9{?XRGBW)21HX+v8(w`zu!K<&T;=>&IC&*GIyhJ|wn| zC@t`#YJ?S+(Oo&aSr#1zp4@d_Z$!3te|2Vdu>5~7AWD<9WrZ>BeguuZi^6(5s~E9@ zwI`)#zpR%ntZfK?4Hq5HNEn`0MA9oC2CLZf)qvn@K&`g-m1PZ z6l%^a!HC!bV2TMIc2)*0VB%kV!I-1t7*O}4Xn7cJw90edNtW+BJNZl6EpYaH^x<(` zEg-~x^^0Cp#Ql5Qk=nK2bemJGf6^B9p~Y;4WC;URx}pwAV^x?=&By3uYPpXYvF~Nd z)^64ZkLB1D%W_U41(I)l$I9$bLSQRwlU%skTI3eaw>`05Nv1#)*e^%H~qY%yZ`X%aCOd^;_z+1q9e zH!Go~l@=I~N0rJvP8hX>(3 zA9FwSiQ8{6RnC&ejx1}vnOWb$p~W%xrN<*=vvj+LPqA4@$>oY5U0*GTNwHL|EnSq= zA)I8wM@5F$A`C#E#UFB31`+_>FZ7|227h!ZL&d~|+?hm6Xb<0ji}#E1qdg1Ae9ur+ z|5GrCi#4U}%9cX$$(DVh*U>O>Rb4LSzWp@GLLai#6q+EkH}0AZxn*~mco}>!e^z?= za^mI#5qT!A_5d*J*5W@mVji4*|J3c%Ypet%!u3{GS7nTi*G20PF6(~GwG}A3i;XKLjv@8pQ2f6yT1VGG7vOZAlyEvC$C9~4nkQO(24%VSip-! zJcTB!B04Qa@^AX}rRU-lK}QrSf}^k(rBphrU)Z>>u zBgKmx2zCZjzSP^l%JO#v9JKSovl!p!+9YHwG{3Aq%W#^Sz-LEhl$c2*Q6%}2tc5(= zJ%prI={!njca*~cc16F+7`=#7uHiM8jCbfH#w_4CE;qZS_8=NrWby!%yQe=l3b4!$ zdBiyTfqq^V9V;%B&XlNxQK{+cLEO#v~vR<{+tJnW_jkr z_EkHv|7{?DB?Qc377XgwWV&Sk`nuQpn)=?PJ!&l?bIEV;Jlka~+|Awn@<&DnW%EW7 zl=+qwqKMzSl~Nqb8$+9~RsmI(=Z`nr)>$XtkLpBt?rCIIg!>;`lpRNuewQ7pcLt8A zhH+@L3Pc4)8w!iq+ShOp#C`h2F~<(!6EN)XRxh!=P#D=FWdW#aVx69 zgTEI1PP>{PU#~s@z6V_Dhverg3wdE$fS=i3wJg>9Xw5#<@t{Fn%SrqdheSPvhUHTi zFeull$Gg`AO7!(SrK_%eWNfmY(3}!`^OITRR!QYRJz>B+Pe^@O)KpLcB95Gbum^&; z!69w8oI6|L!+7xWvv2mWq|l!MF;~x_Z!@g@2U&aZFAfx^qaQy z&z=T)HA6S!w5F&CpVEBrwt7gYZ6;t%Z!S0i=!GJw0||VR_yxJv*CQ%xT?g7)Vm|9P0*NFIoW6^*e_2>fIWG= z0j{Q&0MJ<#On=@J`lJ?^gw@j)f?>aK@#~$E-UY}!>j0^;fa~W+9nXsCF2pVzl0RvT zT1)>!&B05ElZ^5wNTuNGdP2D<$sTC4l13p(lS-P?#^{cHld^osnFI>LhDYLw-^^~x z(}tYKqj0FT4GmWV>=CpDDGdV=RSb}wt1Sf9gHTEW?$u)`(YMMDz9|o~_y?eHu+Ez>Qy?4{@n=ZpnC7Kd89yLZZ4_*lcU7Vz(7)`W=@~AWc{=M?5#iZlEpLeOA z%)?~WMw=03B}CiiQuK3R;G;5Iy+abDP}eNRjjo4h`uI>Cl;5Z>d6i5rI>7515QmF8 z$o*+Ct=(=3%u4b9xZ;upH3jmR_b}ORsAgHf;q-*4fut{NiO|*t3 zi)Miwa8&qC&;6;+^YPw>{@|NNi^^Qr|7rnB^}2m{nLmE_8uop#VGeA5a@`x(C|~A| zZPF+5D)=DZ`}6bo*^?P?tAj1VY;)iLi1@gHG*Sa8e#i5}tLkxY|IK{?B2yp8D=Py9 zHjEJ)IZPwZU|t;&SAk?$o`Ef$fG*2A@Z42X`Eey_{ntazC9=kPS8*M?97#kO zi3Fwg91l;!Lsz1X&g;36Gs3!v$U{%!aR+p23g**ATMX3mcmC=_5LHB^KQX~nqeE!~ z|HUHai(?Ob1nC?G-gkn_D=U$pX=7qyZefATdm(NWfK@z#geXJ7Y1s20LGp9o^ zN3NNps~sgMd5{RFMJeT&mCVTo+0|HnkOui(07=R*X!}{;r=tnTwON|!*UJQn1v@jT zL|Cp~unBGvEc}e8r}voQZ^@ATKm(qYQmY6?F+*}$=c}lz9dtV1n!K@?`%Sd5@PH#o zL@QgLY*1MMdb``MzFB4KLVbsbJi5N!Jk)m@I!XTZi`-j_N@n0sCWyfG6g%-6KPKmd z`GZ)36uQ~PmI)iFTLQwkurrGDj)egqS9EMTpP8uvU*O}mC-Y2gO%1ohsx`C)P7?5d zGq*sO_jTZN1lIkxF8ltX?)Cj(q?YMLo2!TI#EbjhxBQL{!KT($&m_u?8n}xYvI;Gh zAlzyrI0<}LM;PUp4MskTxTPR?OBx9#Vc$iP_tDBWE;}`7z^(Ld1OR$7?thEKNzB2d-tvcHiV>4)GqpP^v8jS}3j7>u+;&{5Q zZE!$;hev}FA3qUC`VL!$b6udYz}-F?HN2W|@!;@m=!OeW#?8yKu!w)l{r>3L9w`D) z1(+SEI7pk}ZT`kj6+_+OdwtXWGn?U?BNtOpzL4h@5=}2 z=5H9DY9EivS;sM37vBmG~LW-Ql&pe(!#(?LzK z<<9*czK16!9BJs+wdz}yL3p#9)&cwoGaMO&1(eGlS6d5hCM3}gE{n05CH1qfp6w@Uup?G?${0AzUO!Qb{&q* zpxtnnC^=?6S%VwndM=!q!#VrQ(Rkuq^^J4@cPS$NCygRgm{wPHA#1JGT{i|8&UEah zCL#}C0lEKjlzeL8hoP;#y%ch=!|JXCyBRP=m5{qm5za_4L7Y*C44%4tsF9^YIeXxr z%Ep$rlmhuP8DHFOtI5OwmVdg#hc_e((Oct>pPs$7sWh0(&ME_cU6C92<;A`dVt;Qt zg585^lM3FZN3*Y&?Y;i4uyZ}WoY%k9y~#m@#0)1w@TJYf{iX0S{jL>RKs&l`5YkD= zFPSwT2(D`2n@!tsMWOTBdvb=U>&s1%56F&XGwJ&Cqw?EBe4u7ke;!cvsK@$k}FAM8Kk?J4|03y{7 zU_<-yGB_5hV)^huQ9mfn{~5Bjf8g`H%BlL^hi6CqiMF=ujI2UMC`)7F{p;0*=7z@{ zm4T2;SN)a#>#0TO_r90MYnZm1872L;uV&uQscNEQ?fV6W?vJ^-L;(JsKZAfQQD0f_ zHx&AwP@2N+vf0VLpR-}@Yy(CgV!^kLK4_F8>%$rS?`?XBgEEq-YoJQ5BqI8e_Zb{L z4Waq^u|#ymBWP69Dz2eai}`fUB6cq<_)qnzh(w=a+69`^9>?(MzBRag3o?)->g=w* z4Q`YGuV-b(K@ObG42Zo}7thIe;1OF;wSn3{3V(&sTxxLjduYN-B)DVwd&>{@-h^+N z*n)>!jen2h1pun~`PG>88v;^jm=Y{lItjw%sC<_O3%bdh+2+3pRTXi4{2?>u^6lIA#_^pSu3t?88V~VT(KJ?CoaG z$YzjNJ`2fxNU~vbvo4IG#$=-%{KkKH2+%m4Tit!Jb^WoupSWY?knA zs_CTBmHz}yj2iRGvbBzy#nSueHx~DHsaPMCwVvYNUrBZuWlCiOjWL)fo?;Npffh#m ztGurZqw*>6)RS5aJNiE0cozOM5ukH$2$U{yf;Lrg2~l^@L<74agl@NcD5%TbqR-vw zCdmB~NTkwoa!B-req1dMu8YQ=#c4-Q1f#=>5`kIt3ENj|JkBJp`}v+Od)YQF$3I#% zQ^&M*UupW$q;djYUFnSdI2&s*xeMhOW$yj&r`tZ`7%OGY++Gawkhvh|tBHgkfYtbv z7Pk{;p{Fn~Fyb_0#?u&i*o@@Y=Cm6EP}1SQoHNyT*8uuv?L9FCTPzrAlv2Ex%m z)M@mpP!=9>KI2X3!&#q)-Pd&<)Nt2lLELv1`fM4g{Vgo$N=Y;+f7ng+lR&qW91@CQ zw%C!Pnj=9nPc3T_rUc`0EvOnaAAVWKQ5M}WU z99wuWlzE0qdvvDyK434pA3Cl|;1Xo{?^Sy5RTAPMrBHz7oNS2ADA5#g2wX@mofa>D z?Vd{k+?(B{!&%UJFTgB@S121-%Wqp3_n#E|?-=k=-yN^EsF>Ig6XxMu9TbXU_4VfK z8mVg2aRzpu$NC*In{3}j>R#SD`K7Lse;U^9y>owknETjslV0b1U&`)s*c%wlJ@p1_ z@_lvWuP!8qD!?7okYFFQ<7omFZ9yMu|MnG1@YlFhaLsHPSnDfXnPGV#~=4(L@i2%8GZRB=VmBV ztC=Vgwoh=5k$yM7LY>lnv7c}QLw$qqEtkIW7JLqL6ZzYwbF4(GU>S03oz(dQ#fa;M zqYXiQE4v)hA(>Wr@a-cx?#%me2Xa}?ubO!u2RM|=Qh>kVlTDGa2S$EkSmIJ>{L(Ye z#>^;}uatTTS*v+X!i4Hw!dPCTrUFl5=i>6v@i9cit8IA{iW4RG`RqoNnFT{==+=26 zXqbGav>iCVSfEwDa74HO%6Io?4&9sy`Z!qlG8^@;6b80MM3QJIXkEG9)9qZ(t@44I z^f}Nu&7@4ink6>P%UgoS>9 zV%#nM{(ELmKsmu&D3<6iXp+`FJAs@!1sc9$rqVF>zD+m<4E{@#qHh(sj!eDm^A$CW zy=Fi!u~*I(hgry|m^oa&nsBgYOu{ZG7Ku@2v|1+=%q%l{Jw<3z=uePV;`-=P!ca2k z%#kS8V-5-CnaYwIt=@HOt)=BQ<7dX~4JmwC*d;|9J-sE`4iG4R*wgz2b?Qp8)oRMj z;~|bO3+$aPe>j_LruMEt>`0rnoo8E4fzQN%DUo~Xq66fjHa-VjIi17SpFjUt+?&$o z$KAKgW{V4wjI?FIf>xC)TEB$1<+EPaEw{XT5sg9>#VRK&T?~=*Pskpbo+H3lIpYX9 z`=JwVYG7dSnfRg||89Bk0W3yQ=DEct$MJThh13jRjRDjA^XKML`FG;fIV66L98Y!R-G#bbOC4nKDoMu4NRZOns`4oA}knJ{x zchCkn5V68``x!wU;S0S^To%yxpIjO`**B58-umw|%gMJeL<1CPI{)ifY(L z5B|oR3X(XF)rk+wC!22}^`KRu%lTh>NWQ;j2S30Cw8T2w_=l^o_o(aOk%)hb!rQoI zRF?YFT$&D5H+`in_1tNHaivifWE+hfaMk45OzYwc0{=>#nU|?hQRiTD z&(Am-_~}xr3;Y zy#|X!glaSx#&YBVGQgL`VQiU5w^35hw0HN6CvsygS?bpqhQGw6zoogt-l~IjJ)d;JwW|Fl%vA3^^bhO*a z&1ABMQQIHMQce#~-@gb)*mZw$MZK0gdnzbwH%ZSIKgGtNeS#Z(;#fXtl~DZngFFl-f&&`fQg9blQin7+n^YA@KEx*v{gNhV zidV+V9-?6yaMpxmE6J$bay>~IC_p8G$yD=x*Z>9fK4Q*-+WADy4`yuYUogsu3=Wnr zc&Z}IuOBL1+2ux1&Cp8L3bf47oB4yyfWz4sXb1xwGzr`0UX;1CmH0a@_~>w`2(YUW zk}%*F%EC(1)g(~zITk{?0gNQ_(a{l8z-A}3Fqw*sG9ql*pXuDDjYuSxQdFkmZ49S5 zw}@fE4c5|_!r!12uJ3gL()c5)Z1 z>13qNJW`;Ar8kl$bGMw{QAQTWx;kU&+#ED}kB#rgC+z(pLviV5#~2yia%*;8-}|&q z`!%JXb^az@^JR;$*A!a)Gn9Kh9agq)#W1&Bjt~o+cU`v~R^;;UBuQlnd9uAd_r4i= zz$!A9FjQB+(9%1u@Q1o8SnCW;CH*4;PVQ6*Io;HxZKv~4iLT^isreG zbggC;6BnFS#{;+CCd z&FNqMZ9O~0JFEOn#dI!~C2?_jq4=w?{Ji)aT04oQY%u=C{-%Vi%&4iUrbTDh&-N>H zk}1|nGLAnNiR~|L1ywptO;pPys_wdC00uHA^A^t9Jncfz-h(by4(6ylD{?i9o{QfLyeB~A4)6$t`U z6D}tyb^_Tk!LP%#z>*G%;AE*N2A@xTxs> zU$+%LWC(qs?)6ILO3NzAs?z!m3mY*GtEq?sFR?5@qo64~d5^*ZUGc&SxvZ)0Rnhjr z2myqcs-ITu0IF?WFx=HlUdEJo67r-??o~-Vak-+CT<{bXlvgEaDO++!c+m7}6>#rx zWdu@yBPt{+l;E*21*GI5y6E$d{$i`OPl3v$pXB;EeuW8iY$tt+v0&$Fp&(==5{@KV zgg?Y4rp#}LSCU3|Do{2ooceXi%^9ri?=a7+UX*9ddvU!pHcVhPlVr++YS97>q9{#=fV`%6a@aK~T;C z+PhGI*8H08k1&nxd?X)asF=_DNS=JsGf9hTno?!&f!1+Z{UZx1W$|o$??v6MMQn8& z2K5J@9AbQ2@$;+G`LQ%$y7tWNc@p~b)@0hQ6%0By5`Y;2!|7EXi{y<9Si4z)?O&uw zJ>LqJKg}PJ^I(2irM+-9ddfxgs>qE!JApMFbCt3AI!*t9K&+Re*zZiH>A3x7CZ3}= z7>k{UGo9&<{v@==$`@XO+$?L9i}Z_-jvFixD*rJhy3NW^!bKV;2*G{`AeeRGcz#B| ztAP3m@FBF>KKEd~EktsZ0FYxts#NTY)ZSwLcdGMV7{JAv`Y?9mL_w|pC4-{PW3u@n zdTLLS6a8naD6}N_oujGP;^{6C2o~S&3n$si8gcXaW3Tmg3>C?f$X(b$*U@|CO_P>$pQE6dQ)7RN%+2IP=(s`E&#cWaupdr6gTTjfGM? zlYv2LcnzjUd>h{83DJ?0TMw+q-e${)m}1-VVXFhaqmH}Z+)vkB<(LC~e1z+n^Wdd) z#qTOiwoJtQu7X6GJbhWOp#GQ!Md@fTS@XSiTJyV}M+!DM8r4@h&wVRzL*bcF6b>I_ z|4qB}ybaSj9`sG$*5gLD%q5;D_lKLJM0Jn21Alz0fa?KCQ~rEOy2?~gI+Hc+imEf^ zm3;q9MI`@lew0RKHCIr=@k#PiI}~j%HD!oVVBBP{7*iHK`iJ~@3m7d*`(t;DF-vvf zDo-o0fK)*^>q72VoE!UXzhv3it1>vy=29fc(*Wx=|CVGm@I<=r#6$v_-jpJT-#p4zQtzWLfJl3Tby5R3$~4%* zkrm&HG!=88FkCG!%BZ#0Zw)7wARR2$=yq6ijnqS~XXxK7&zStX@24?I4N%AxTK?nz zt+0F8O__b@lkvP-rLBay2#!75dFu(pC2u=W?Ha$h>Mon%rHPiNo1Z`@9_2(0rHH8y z3$|AvG24vf6cfCkeR=fleSg)Zr7Dz{i#q(^NAnJY5owmIrXWXMQ2_`)Q~=E-yH^0= z+c_-~pMzq+zdt1Ia~h$DS?Ft6X|wJ%^XF%0BlnQ2d;aR;%qbHfXTYBDmk$Vfb7~G| zno}y$vLcu$A18oxlf zlz#i`x?$b6c|%y?oQa|^?Oy6s04aAfbIaNJ+IU+jcyzCKqff08f;2Xl#Sk-gzxQiD z#x@pQcqd{ocp9e~PjrQJ&=ERFO-tQ#5Jj!mWvbS$84L>T+p zQ-kPtGC0soD%ja~w_a5#7MLesV`FWzOgip=cJ1@Y&x^GZGU>Mu)mlD7UVGk=nS_c+ zjWoJ7cBsf_ME%CiMh!%j(fDQABoP`d>G$wAQU*N$x^mR7k)pr)hCi+F5koEz+~Xfd zE=C58kjA+?Lb|t{9!LDhKV6B9&-jEy1N1 zIsUE*iO}^3gr}=L{z3q-uV^qyenR>kRcc&%@7|3T9qdIzqW|};TTN zZ;41YO*46Q4#hmuc1=yzT8enW{?bN{nYJJPnQ$x_HJ9)-?o+uH8N5#E>55I3e}3P} z7~91dRVDkB*Eo3b)vTVn4fm<>ySag2N?E=4alCT28!z*RTbCK0seWGyVTgU^C04?| zb_zpGgibMlp{)0A!fK8d)4~XZ3+?pELOEg^uaDY(bcL~wy@14hRM|Q5-y7Tq6 zsrTrrxqPGtm7O-%Nk1caU{FeQ@BVuF;R)GOGU6UWR=*L6DI2pr^A`X>9F+irv01H zr(tIr^ieA{-H3*HKI?F+ENz|J0q5%hJ#2Wk?i`-|B9voboi)V1yi^>z5P6@|@}o3o9{AAuq%f!$?^1Uj^d&2|8nR2O8CpB3Yp<27_gHJ0RO>yb2dijhUc>Zo~Hc|89E@D6db<*rT`LH}j zPAemB8`9D($4sEkY{b0bVE4Nj_HcG&KT5#kuR>w#ed73L<7aey&GR9b@#VBnnHmyz=-NE@CTwl-;wkYPkU7`D#j2m%u4D)@2$w$Bg(Vq{e zzHJI!_@f>gl2r4oO~TIwZN&XQN?d2{0dwRHS#H*(nLPpT|3;&fBvU_r@Z@YI@kZ09 z2JzxQW0VPTN(bb_focAEPnzQBXYUHUU%9iJtq{C07}S& z4=iO27ZTNm$j84`t>r&(0h9`TU==vNNFFHg_iJ21?Z=xhO!ZQU_|ZA=q}^;9t(lzj zso%J?ZscugRLa;HFC?DG`D+IY{tsK{7?o-Jwef6EwkO-R?V4vBw3&rR3e*>7H*`LjHRo_ z|CWu}f>GIGd}nQ2$*G%svmmhqnQjZhC-;o8yvtdE13x-FOFUhZIae(;^HGnvV5F7J zJKNS#Z)^A~(@kzScg@va*~2xmz@e~%Ci7Qt#-jbS&L&IRgH9gCh0XLx5YPY=mJ`r zRL1E-8o5>GR`+r2q8*kK`}FemZ?HtdHMLpRJOb9(+r=2=^8ab!St%W>KBd6#VA=8+ zue;PiQyI{~r>C}1q*+>C1?8DH3pR--H&9?AZRzW6LCp84(;SFNqvr6m7@U=!zDUF5 z_-bGgF*(Znr&xfTd`hvWJ?U_^xIx$tYrQ#1GFU>UaNXIu@>j)Iu0Q%Hnwl|eHHfOV zN6i0>qWcL$HrLh^CfV_(I(xUn-&$@*=%r^}B?vsWlqhY$nT4HZa_p=I zHeKFtmx$x@TSAYvc%!=SMc^!HF!67y>sjm?b6Wxn&HgKfGYfuvulL{mD#S{jU3$;i zNeHGp=WLKtnJ&ND>V{V=6-USR@C+a+zIt8v!P?|rTEw6EAV|hR8an)vD?H=lM2;}K zKc{Sd693Jz(l{`spB|Q7IJp*y?RK&buhR1 zE8p#r>qGtRpp_u*^_j(lAfzj2VAW-WF{;YT$^e)0YKJE?dpu9*WKMpG#Xla5C@ACy z1kPC=68p8V5(P>Oo4@Y%YaTsfZf=4Gf@pR5tdup4o4l%+s$vK|>dcVac83OF8m)w~ zm1a0e*9?v8?IVt7>jrIM3Gg-9n?C%~18XWO+dDz)*tKc^Eul z)3Z60Xd!*oT%M{RSz<)FjCL9L^Cu#2V77y}#CNpB|57%n@9R!F&U56{Oqru0DcCo? zJs&@)to;w3B z;j=951mRCFV!vzA(=soFj9S!8m3w=H^~woCTU?kpu}Gz+AA&@z3LV(8v0s#8$(G*1 zqYvgfa4^(GT{W`*x~yEl__9xyhlWx*Pe3-vj?SVwxQ_e4SY$`Oj>SBxtsp4m7UMa!B?M{$BS=g4$9va z$2~!M1C=R0FZPN7v1gvFo(slzh`EVh#XVsJt%H#yc-=@ngd*k18glOZg%f6`fYdQuO8hvEbspX zGi?6mYpv>me@(j^U-&**4y4Uvk&-FQR;i8jo({Iz0|obfG-empo{3W*mo({K<_BQf z-_L=#^3*3MpyoEwbmTt%%i}7 zjc5-tdRtrmFS8gmyl21K7#<%VPrh@8b5)fZz(dGnx^m&qdg*OzOntXfwFg#*DgMp# zq4!UVjBnsg>{rZN+!>kTBm_t}x#oAsNjN_aiDDg*fpw>OR;SHK>-4$hxNc(@<27D; z5xe#v|F`tJ`GexNd-D_vW}5SkE%w$$#XktT$t-vMQyiV1iipE>`QYY_cs{OtyxttH z3%#ssk%&xXv$94!VWsdTzNCaWndC&1f6Kf}+Fx0B(JRRj7R_bPJ|ZhcGSCNBE*8`9 zZH%R;&$3SA--qy*fH_s%-4*OvS1_u&wb|Q#cI3LxEnu;?ab^W`R_cu0b?o+^3uk+XQ_Q|>uWJGf;dDd?c zq+*+{lKF3|txhDhXLBk>)4M5Os*QRgPP0`blVcg+V)5NH5^*>&KN=x=S&$ZN(@L2c zOKsonKXsn27(feKZRX9(P@+@(8EhBpQE_?1)q&j~cfmo=HW$ln4zCV=7JJ&yld%L5 zelPFsf}c1KH*1xe!C#&)Po!BvnP!=SzFc<9e?k_WIz{<%h}baTa51~o;5+LzDk^Ia z>^^$-r2Uens=w-!_paRRxfle0K7NqGwbhC=7Uy;OK4SV$fv`V+V0*Akj3LZtl|_+P z>6D3&v9P>Ps0kf4LzeUGi(cMgH(1E?LsdR&R9cJBP5lbTo*9Mkk z^@fiP$P@?p5jJ_T4j1_G3wKN%HcE2_ygi`Mg)18^vlj-FhtG(qs-4t|z`gGVI91m@ z;IIXf{OazCOjf%=62X-C>qW>Y5X|I`tT_sIU;c|q?5aZ1+}D5*a^iRI=ojJmb>^hY z4Il?mA`w>^8JDfPQY;m<7@?v!k0p7KHs5U$SyG4I%XuGt!ru}uFH|R!+`tg}OWtui z|EO*!U%JaBz+Hug37XY?6d5ig>?~8p`^%hgXgAH+{dcFb+NtgPK;H19&l`+kM!tBU z@{(i`?re>`YM&|d8$~r$TB4^K44{($qmA6sQ-6bVf2AY8_#7NN{7Ga7dARlGb1>*; zi){yXKbe=!huYaPx(urFn}*54uyf0+1bN?FseBf%8+BdJCm&F>v3xvV{pWiXyoVqp z$Ei|>)C^e8V0ParJ0aA^$YhzcAAP$M{wW72ETReySAE79_2NJ!k5aaBzi)I-gyT#O3LifA$MpEq-g@O8kjYvxM_Pku&YIN3l&z2F zKkSnD4kKc*9pTSp)SZhe{Eilc$kax<@}#=Mqm&ri;{WF1arqCA@a*EEw4@+Nto+&#t~bMKKz5Dp(SzB?+j^uN@ zj7VzZYG0ltXDD^-lPOu9mKdAp%-Y!9L+3b3y|_@W?naiG9Y3jVgRSLj#HX}7NDYKx z7ZJ3s#>b*_Ue_DUg#qPPZ?r|XX~Zq~sjT*Wm}wh(AF4LSaglU$2KERVO|1-jn%9#B z!=j%`r(evBH(Z4@^UM#vVT80r0+Q2s;Y%;B&Yob#Z|m0hoE8%IUdn=GCL^^s4dG`QxSu2q6W+BudrW%K!?JKv3DO8n`5Yl0E ztN+>$MvD{{#TaS~Wvm`iM?z$zheXHiHlua2U@|8yT})K0FPoPQ$K96=hHF|k5xmv{ z7_ceQ9D2ULu@~qLrD^9*)cB7-uWvCO0KaV4 zcUkWJoG<6ffc~cAZnNfi&HvR%u!(vLgDt}eUiU3YPfX}(X5@t6hiL1jlt4Q?*}P2a zjO606tj4mSIQ_Kg`S{PV8RLX<{?Zf~jpD@xQ*&1te_5Z(-PqYVjx0XkaGF}pEQ%!- zq(p)B&!jD#&>$`IDO&UMZtoG!`(6nRzA`n;8_H$&J+IPCi{9(pj+VjH!5)d!&g7F8 zi(MYAZoyyCHmAVVn94>o6IMlT%ftSA7tZ*~2$b+z`MAlW4QQ+n4Qn#x ztcsDcLH|KsbIrm+EPncDqBmGFgX@;;lSvl!Q-O!Dp3a_H0EE|CV4DrZuXuw6#awyY zX{qi_7g+9uKN!Q`1yWET)C~7B4B#oOGB{~d%~1UP{WY|GEz8uXL7To;aobXlxPDadyE1CsdILj-+d9^%riCaDVwyC7MDB)i=meBLeo_itY89NEm~m1kSSIBPxttrzcinCy1@|_Mo>`j zKUJjtddp;t&aYqa{iN;&R)B7jgPZ$qH-`Ckj|7zY_~$qXMRy7Km~kz=3Clk2Q@H)=1k@by?YZhJgmSU(GVNh35z z@JemdXYbM2cQb_E`A$`&QD4`sQtkDli{ClVK_Q1P4p1$V$Yur6bVtxiqEn?6+p%@N zkI@shTALW7R7U$pS}g8=po-5k(}OjxR$Hy7>r?9fbtkOO9n1rE8yxP> z3yQ+v+6&GMu%c7!)%773IsclknNl;O&3Gb*jKNj#@fOyXalC4L-(D+z5gU69u!1(b zg(~mnKNB!u=%UHv>33Ej1Py%ACBvP0;vI5u+rw%4Cj+0d4|&qVP4?>@VoDCs;%hb>%wKybd*qUJ&-+Vyh!1gy_uG+;P)!QO(xKt#_NMK%Z z>uhQ3(!v<2d`lnP@Z16bfdFGLwdehSc_9A`5sn1N@i`5$gQ;QyVzm-AT1wg7>jBgw zpoomB7s{mD7YkPLdQ1CbLaGX!?3Ao=;_0! zie}~aoY;ApwaJ+U2hz5*!#=N`p6T-s8e$`w=c%oJGoj)qMX}G7&`}udJNE|zeZqAy z)q!9m)63Zm-=C8&2sP4EhGXr`o9seXn--mSj|Duhne>o3U6gWI^uSs$Q^e=ig+I95r+gRN_W?P|2Bmt+HlE96`Qk~Is#QGZE zynus@p2ZfNZn}#-!2sK=1ePKZ++Om4OXJ%zx+5Qk52G4UM5_v;GL^up1<8HPW`n7qJ8tTY74Q?8w_qmqOf6m^{-l{O7A;WOR)Go zs9(?I7>$Rf$1tn<)YhY4GqH=#R*e_%2+$xLiKKUv>f9b9WppDerD5TSD>pI zw7c5a2KX{fnm~(UfZ;83$?7tdK?~N3bqcsX-P}%7v_yuZqpQBjLY7T zs(}H~1TG*_9l^88MTe7_=imiEej!Jf#$%!he?B~jr|Y&*-ft2D_YsYrA$mX`S1+&2 zJ;br=-5-!r36Dz@A>coxfZo!(f!D4?JK!GY8jLKFgeG$)xED|iWU_j9K$ zNhUin87hKHaM-2JoPiB>JV*~ht3>$W<#T`bM5j}57)e;7mpIP8$G&HX_hX`E zcStgk&G_!anvP80`-8p}cRRtm-wdOo{TWs$uD7zausCsTtqw#X#&av%YTEoikO`J3 zWcI8HIT44s(4nk}1raFlzE+P&P%J9sxd_o~Z;p(_*y6CD)J&(Yq8dm|`2Y?`!)1f75!0-Oeu z-TxZbZ%3%r9Nut19^@t@hnYwz`~H>%#%GrEg{DzVQK7gj0Q2Ost3owHM`Cd7o+4sz zJ92xi%`~?AJGSm`*-}MJ`CcyM$b_H2AP5*l-p5G5Rn}8QQZ$QhSc=bVM;@MvB8tNL z$rvais-+_Lg3i>w!j&}gL2#W^OEx>062Ktu&}ExdtGmJ8g6l@tgLJUG&m3)-NO8B`^oZc7cJ}0 zW7^&QMxa;i+Rj_Kfad{{Mqq~`9RAtTf-Q>H29U5IgIUzTRdAa%9AWBx9!`t!ddn0C z2dDnqhhjv4S+jlKgnIglIJ>biNHHETu$mE&qA@lO3l}b~v$`pIAkcZgMF#1S^3pAUCK`V+T%lLF21Wn%IaluATWR zQCyKuT9ycnQIQE^AeG>izbK;f-SB5$3v&?mwH|D2Q*0qv|YK>YVi}@UIJ)3X7V>CMa z?F3^{bW>@oMcrB|kn=`9z5TiVL%D-jV9P(osH z{Ko?bGu!T__)jh`EdlcAe~#=bqYnhxtgyv?XYTqK-QM)P*iiO2qxkSo%OVxmi?m*#qDFZJ+mCvy*L$k3I8z{`7Yi&G zQ^QC!h{&H18j6o^Vy-H(BJ5YflqVi=)Z7n^+RNH7&?Q!oK~#MmN}b>JA2M{5B6YrA z?ImN}w*VifYjJ=<7ZEW&GV;phe!GJXtCS4M%DM8wf(ix#4V!pBnE!lh9qeV(y}!wU ziqU_y*yUT7{#hTktN?S_p+PFE)6OOncDZl-U0M1fTWoF$IWFM*t-^!d{tgORY@wBY z1GTO+ZfP^bCHpSks@fs6~skpuMfz0KtN596j}|q8Ol_Mv#8e_ z5Kw|QDQHgg>)nKq&IAuD*j7~@PjN#;^sz$(Cg)oA{=4&F8~vwaVS)Oi{qsAUELYyn z^$?F7rP9SQ%-kvmdqQR`uG-7FmGbcEZT4Q|j$VtC{_tu!ap)!8#5Wck!90q*b5o}? zVyF%_2L%jhwi6^DrkK3(WchMd7aN&{q$Xnx1*tLVV40vj+wUz7U$t^XRK@lgAc4tr zpmzUMD#M$m7)&L5%hz=9#y+0BUs|34Uw%I+5`d+>-tux^F0AOJjM}nyeJ^U>FPAJq zmsZr;iZjmvSb6u__Tr0cYf&Usb$S8>qa;EAxm7&hDb4HK+pn4$syw9>1!@~d$FkyL zNX7Z+Q&8-0!tbTth~hiOnLWxzh~X!vm!;H2E>~B9u~9Jx?Vb1gU6IkAAS1t-m`=J_ z2%oFc;Sid_A7xO$jWZH!6J$;oWzSihL#{>{VLMSIzx895GnCIABd=EJZ?dTCiCk1B z5fi*DsX}aZP9YzBUZt3tl6ud4|A?j~ghH9XqtQs4e@!LTY!V&nLAg zT0H}#_%sU;=kU~u(_o4(&l5Hs(zp8mFq@yOdplH?BT@I zt9D0ioCRJm#hQn`*iYR4B<-fX7h%#4Y_ahph}UGApEjye3A|aXX3+gfJhkliS4NK` zfTnSSh~LBct$O{XwkgC&7U!DCmzR5y@xZPlFh-y~{k|+%4arB@jugz%`kl|n@Xq4X z?2?3qAqBCZC(&1_lVH9<=a9(^@P$copz@!yw03RSfnP*izvvwX|5gmtU4iW728}cV z1qzd^%`R9hL_YUZ4ejNJqA*gx-C9{mS8281&h$%zjwSB-AcZ1HMrDQ}W86d+yQ`}U zsEx%PzX7v+kW=wX@pj+j!FOA`N>#bvS)U=F0OonZ&hiU91p-9;S@NhkfXn#&6w>=9 zEd>gEeFgC!Pv`QcloteKo3rtrdp?71Ug>`dyB#VlJ58U8FS`S$mrl(LoL%06MSA z^Bya75hTc`U+ebYxzK-kO#^!$J_q$WBcbWfWpQXN?QV|vheGuNXw`p9T6HTqTLOQX z#Z_v>Xkrz>Xrjfetd9D=LK60q0k8MK_(r7Lf|}rpN;v?llrz}~z*oq#Q@$#rSii*n zYh>8H@k*jtECB^5}u9 zbz!PAkOg-|Icrzq%3+i@T6PCw%$Y?xLX=_~y+jv=XmY3Sm&5w4fh)B`qd*?Q+RX0A zNPM+f4&(t2osYv)^sJIH<$}w#vZzGRd;b|Mb02NWDAX1*3|j$WU|^6lPizs5PCDng z``dFtI|x)a!`uY|#U4#_OrnE6Bd&#GKqqgYz?6Vh78Oyn=ZSOw%=8#?#L#rGTF4(K zh0MMe%9k1AxNZzUvCL*2$!Lbi0`PY zt0S3xYV)4vVi1Q|Ca1I3NrJNsL`9b+Kgj%BOqR@>QqQoRjq(Fcw68a*cb1XT-Uk{_ z^LGU{6q8*R55tDoYv7-2aVUaD1PMxXs@>!Z_gTqEYf@T>c*L^H-7yT?siCQ(Rd`u+ zN?1lH8+Az+r1aWML-dbvZpzVZG*QY>aU^)i6kIwOrogN%o$v7sn1(;>isTc`~HNKy9ivA0QM^9;diW2vrx?ue!XU!9%ww^NR zBHB7TD7kr75=Zx!SWU8M6MR;FJts1_ZcDwYs??uIUZQbK=Tqp|5~ZFq(qkCM<89OR zML)KP=+N-UNGV}#It0K0z01FaM-%Y|L=n*|w#>QQp~2A#FtAv#c%?;e!h|1?eP3`v zgs+|(?l>7n0ldIdTP4I7P)Gss2xi(oj1$aZLIx!*uII~v;c5`1pr?Adk~`x#APIgi z1qr-Ox&Rzq)l_4yeeORlgs=lFA#xP~p;QI=bs{J2mj^iehyw@m4sa328N>0=lVGud z^D!y{M-I#d2QSbCyA|b^#X_nC_RQXQ@O&Me_SYFg0c1y=9~{%n&zMFdcU1(4-O5zY zvqe@fvv%dTdEwJ&*iii;L6GJK8J=Z|X6F^EeZCI3FaS6mgU97eYb4>074w6PpdT!_ zrEUbmQpxm=DFeB~{qgan1nCRE5t=N9glV*#frQD}FT`5{ji- z%5%5BBT41#g}+f3FJN%F8Ov9!j6_MDYv7MMNRR4ZVM)xp=S7|-vj4RGj$HoHiGv&Y z6!@4iKXO8yBn2x-QB0$&FD;eIpaDgxD3$mc8O`)ZA49Q$jxPRa3xsCEpdc2;%EIal zPj=n=4uxtE=s(N5Y!oPXecsU@fc&1>VKai+GGMtMQa^4Llv zKToZQc`E4nbO=3Pk0J!Lyg<^zZHW_Bn@BAgoi7r-_a9Wf9pwfS$=n5SP=hBmH5>_e z1D(YQho{_|q<)FhM*ewH;_!FzSb%8$7v_#LE-;M*g8KJZMM>R)y8l@~15iN8!+d+G z-DY<#I}fS`#V8-!ESWE?{kXW_XB2ZbrXv1eUeM;XT=KAg?F%~$o+gyVE}Jev$Vziq z=fE;Y5Y8x&;}t2OA#Z0|td%dPQ7a&^+Fkr&JAHK**iDr+kvRV{cSRO10W~`~Vm|Wy zX(t+?-Hwc&uPCbwYsF1J6S|5b)|U&JH~8r2Y38{7K9W`J7sp
      LWQCprVO|0#GSm zpb5>D-n^Na1-ys|xO|vrCQj6OUpno)cYaVLYKA9LCoUGl>F~5f5!Uq|%ZkeMx~Nr{ z#Ke-t@*pmiJ0Ta_)af-x0~MB_|3qcukUIs6J!%?qTUPI-3V}4afuAqcIt@kETLAT% z=P1`Ls87=gaVPv6Y5-OhO@8x(x?v`Yen0ZAyf(J=4*hal3*NrX-t@Z& zy|W4-2oEgJ$)98Zt9__vRqnEp$@WXiFaJxZe531MMXaA5JD>dzLsHWcm1lez`aZOQ zfUGg1L_1yxX|}!#EWnJiCs6W_&~a9$sldXWwiZ}LB|ZyCU+VCMlP||3E7t9s&R+;@ z7lxE9iCi9RYTwmi{H1G5=K3|S492_<9VJZgq;%FoIx%BJK{O6UMAMfTCUT=h2Eu@N zsw^t;$5sY=I7mqLD4Bilumh{!6AC-*Ivf0Slj6Vqg^?9Xs97{{c<{3>&V=AtX#E(> zlN<5^CC(EBtV;g;!8T!Ddu>ei46j76vj}FkQj&_NoQmQc`cpjv`{A&4drJiQyFa-* zyWzM&`{YxChdN5#mRNNl6CvJZDfrQSdw5O^DJ+qS1k*fq2j4<6$yE!D#;X_RB4v?=Li(Y8;M*yZ^c+z*_#?xdi?G3Txk* zBeW`pg~4vLuEk+FP!uKk#>H^^E+-y$mw*$0GP<0Q(#`ojm?cPELVYS_)T@L;Jro4BQRLj+ z>6hkUG#)g6#d(osoA&agi<^in=OtbaVNZyf@=ikQ_XA6CAz(_-0^Bw{?x{0f!L!Sb zQLRF-SIbJ0ZV$SxywAUddo`SFUzdFavD0h*jg@{?L`Vm#xnP^@8l2u!nKse|p8+IK z=L3yUo9`m!?gh4BtA`!cuvV z7um!nh-WeXDIY`dG}R?E{0OFse&0`3e_n^}p-#D3BT45AgcdbEUHIj99b8U@lbuMO zbi@)HD2nWxMk(DNDXB{NHP~Etg)9we+x&a3HJqSL5@J;t5$t?@lnfo-y2U{?Q@qi) zgvtXRNB7hWz_8f^#vWH>H3CP$9C`Rafx8lL9H%Mp67$RNcB|{`?Ub|pX2!e9`8P|g z1!)^KSq%cvcgF(u>#Cv-Yf>?S7Kt@_Gdax4!h(e3fTM`iUn!}fz6k=-PLTEi!2=}* zJivw*16rMYR+LW;qPg7mlZP*xy%f)ZB*jri#JX`r{s!qMXML8 z7H?e7caQC2XG`@c2%2b9<0s~bqdYkE*apIy%bh0a1ZcQ)Cp@#&b90{I2TPliPBHx? zu;a6<(Ak+q#(Im40UBQpx2(a{T*+*Pah*QCmKk{%oQxX|H<)r~4#Y&X)ltVKJ%ZJx zq+%P-Fy495#UBYF*Ydmob3gEK{AI0W(my84KOPV5~I5;$5Ad3(z0DHHsX zTYlKtuRy^%*j5{JZoPsLiH9hSHZq36x?yoi5EoVq(UJyfuup=xCaMYlhumr6%4{c_ zT7qmm%5Jw4#7eL_5`zD01Pa{wlL#{_Ak{fC!!d6l%BZU#C(srBzfFBO&y$gP(}f|V z1X@xBdRYu9%KS}2qi@iI%6>y+S(+*6_4O@r6aoWtw6KR&P=&%N2F6+BZ2EohaPJ!ZuCYpr( za^1AAD8j^1ZVFG{re^_|a44m$KW>Tn=lPv4{^0b$u^lglix$~VYn z=rv#7AD34-yc2Cdr_N5oHLp-u{`3R2Xf~rWVPK_CcB6$OZ3r9ksM81@COj#MhAXrr z2K5(ZfF>NFJ=+2at(WN~LmXb2ow?*&3ZE<*NUrrT!(C=_qw0NA z#iW`!q-O>1c(E?{Z;|&1ITrp?8gq|=hXAc@DW65y{n?6Qu^7Wt{;F zgB51}Dijp0AVS6%yVskp6><4{RH7(%w0yMC4VC^m5hYpYeombE!`}4kRa0Em3&b5y zGW#>mQbSUSO}%emBy^L6#}&R1M6pWo)3R9u>~Y;IzG=JHe}<&YfDe-Ay&_#6`Yp@b z{n0+8LfE8??|YJQ|Vj5S4Ko48RNY%h{g87YEG9D75sIzMEwX&MD{Ss zs8kbUc?|SzlBUOcFE>stC9^qo7y{v+NvFzYT4>PQm@LV4AKL->odI;wbj3$Tsc8wQ z3NO%5P^v@Cb0Z}z=lGNz2)sqce+s$UWdt`U+8s%NcbS&Z<-!6-Mrzt*AK-873SI#+ z{$drI)xWjQC2k1z`}gl_9OIMIE_1ZRB-IA#@1Tfcrvr+R!WF28IWxqQOHZ%#1|AWF z2)c>TG9w$r9a#;BKXoQQIZ;j< zxz#~i1hlBlPdnd_BLwANI=aR|_;x5FE$`}Jv&3UxTJc_(qesxa#ejIt&6g62cFCr6_hvxT<(`IMZ=r2m-xVU$#ProgO z?<+}XBPU1Ddj`wMA+%Drd+oLI0{H!-S?8!#ZM9)|hKN^VCm9|ocayx~YamEe0kq6uVz1u4+E0c;=gx#A0Z%v3@#^OvXOUhUwije> z)J@Mqm+p2bfXfXGy$)OO}UH$_%aspuNOAq!N7*aVY|_sWoglu`I(4mZ31 znnM2Nsj1d-i)ct;5e=!Px(iY8X0>cC&0XfOq2B7GP^FD2vhwVt1Z6q|H46RcE#XKNZ{y#2xPylwuUR2C91k9Msw{%I$ zTY=T{Uy?ZIJ--8ldS$vJlI8ah*woxJ!<{Nt@Zd+?MN&sB$;_i78>6%2Q<5!g#Zd6n zrJNa;806RjHK9~JvmV$41Sw+0EtHHQA?^|ipNfWtw{^IRj#ryM%;E{8zAI8{gEgSe z+VrEpu{80?N%SS|>5S$_ud!8TXD5_ru++n_g3{Bm|LZeS>qI<=XI6H-G#B&ian@aE zRVRGt)O)1WYPOU9lg;&&l|ju5^{kOs^WM{ac7A@qEI|-Evv5k_PQlTSV=CoISHPnI z^LKINwwA({6Q%kw&Hcsee+O;vJ7RcH4xrl_xJhN=XtFsb1U?rR6O*nh+`y1sMmgfO24%>|%SaL&QISmO zULhoYA!HdT+IlmhAVyz;r4k~9bOPUkHcEBErri6@14;+&J`A zdtLSI`$Rn);&s=1+H!Pqi{ITFByL=z>mx^a0xPxM@SUMmWkR-2!E4v~42E)ar32H#}7#N~FihsvqQZ1quv;*7oZ=Drq+odccHyntqY zS;B!rRoZoyYaDeq4|jHr0xVVx1-|9nI_Fdk!eyGf3SfRGSYcI9d;Qj}hvpbn$gXmk9A73rODz%*H4&+j3@|1ZM zdVlMAXmh!K^Z$zy7*pnpA3+#s5nSB-vpYY2YRcG~<@&^k^TNe(^}7!m{62eN(04vr z^?921_I7Lg>+}Yl)Q`6(aCBgVn?N5**}gT9KT^`Wj-rc5w=q;L2uZ~epy8pTcvz+8 z`-Kd_hrpR2&Rk^J!cYE2U8C?H47M5)x6yL_VmQ`We+-Q&0jPK<2?+neI!~pMq70QoO6+y@KEE2W=7uh zaLCY!P{>GiP~kKoH3V%%qSUn8*_DJWSLT*krHaqM5 zp0|0d>i@0Upq;l#e?ODi%}wH!3)CM0+*~l%Be|*^2WC|reEhtC1Wgx!YYKmyD8KZf z2J`|I`#!S-p|PxC>6f=3QlD(FQ-S3vxa79s>|m0rbaWsv$U|b?^cXQ|dRD;?Wiu<$ ztkm=*wmR>-%v5GsG?WNDz}@3~9G=_=Me#X7c0H6sGC*`lB=oq_=kY41x~A;Ma~Rk` z>Z}{k(fu>{zcI8~Z+S8efO=J#cyFT3D=Sk~$p0ti=^5SLu2X*>?}-*~!!cQ5b>@2! zdr9(&$3PFJwu;%fJEKC?RKq`@<>5@pULiJ6lA-KI{P7-D^Dh$w7rMtA<;D|7nb$d* z^LsvyGBPYJDTDO7yvVWoIlLx^1D+scS4M>a4$v}XjH8olXo&Sszc(`=rXegCqd%VT zDgH#u0S)e4r|}x*=Jh!%_Vap~Yz8RlX-AOR`JLy%e6n(%G~3RThc($W#)s4(v?a$} z{FtGH|6xoh{(-`4aQHJYp>U{j^q6f&p+)A0!2J-NVYff}SN#`!F#5nijuEC1`n`5i z9$j*G&5>HM_Tq@0c{!NGu`=hxk$vc(=>_4Y_K2RzIx2uph7w@|jOSr|e9+6=Ps^j) z%k7^p$bH@{w^oIz-LVtVybpk1Y;I#d)Fzwq^z6@j>@<%_zf#n$9czhIF(c-6R7N(-+`-hG~m7!$%-K#LSn2UB{mv=|-^XytiM zJY`NuWLNA#dL)tdE&Am=c@+rxWXT}LWX6fb2VNu9UBlQQnI?;w#bHvWAx9MMTEN%c z+kx}Ot7{e0EsVWi*V3w&)!WQd1IDQ_fU1bjMo~A6t|q=vI2R*VQ*ymKTQdTKOBS9; zn)C(AuwZ_;!7gVc8=vGG?DWK?$e8Z_K1~sW%RhRAc*M%%LhTA@gb)!0*2qy8hH+}l zFNqph{B>!skDxELesTX@eZao@e*}EG4Evc&iaJx->yoE@XEFc6uAT*xTOkY9;eyuo z-5s{;*o*aL5Tb8*3PVwOXveLpL&k)ZoRnRs7?1Wt$I$C}f}|5qq^LVT91+KLoUzq; zQBymqqV6c^s>SV9c?g1fL(s54Av#k3CvW3DFYWiw*YSPVioM(;ra)69!MPpz7)EV$c)9`CD^$HYOrV1;K;ykdn9R$wI7xt7O+hsS(4Rnf z4Hb*pX;oiZ3V54a;zr6{3MK0M->xG3^1U{KP^-)3ndwknEc%{=fvno|>U01$11gNr zhf&w3OKtWekAE|QBKzry(^HYjf4i~`o_5I#4pT>aJ1*pXYq@o1w(%9L0gD8&_3Bs6 zWp^la6gv#->MuI$pG?y2?7zsytZi2Yd~8qlt*Ox{;v)wffqRU5=g^toh@*sPAuYD4 z+TDmzw?5O+0YoNbyit$nA0zA)=3^}#`ikG*!)T%j12*CmMl8KglkWt;$=fLcW&mee zOO<#FqGGLdlLS&96$712v{>ylDUrIjjZ*rc9adv{->4J!b^kv@%05yC-8NG~{j_F8 z_P@3o$9Ud^^|fa!CM<-oR2gDg3`*}m$}jSLCmJSlh0<_{JDG5=5TS6;*TI)Bq?X+! zWJOu@8?mG~Put@|p;lgK@Y684$jNbPFUOXT&~LspyYjrO_~Im@1uF=VF@&i!z*nRK z%|TA6!xfR>VMmL59E3^lrd$g4+`L~=bN6m}+tGpvnNXO1hRn<+6>$K6t%c+9`F?h1 z)c%htrBCfRtGZ7`Wz??%Q`4RsNl)%LVj$l?fJV5N74fr=z$pOf zW9`k_(Gex!TTfnf&s9;3p7cEdp$u56eD=T33~lH@?`4>rko z)EwjVRO&tt;p9zI#4H32b92Pw5D-awO|41OrIl6DBOv92m&}iX1~#*XwN(v4AVIfQ zdvgjh6V?9i5j_mdn#jU7<3T+e$*LAT=;oGMcZcR0zs1)t&5ql8>vd}Mk7qx$B+;rP z!zv^aCDWl~Wn@P3JGS_HgsG>^EieCZ?o@g51}ZlagK zFn_q3X_Lk2A~6X|o1DVIl6+sdHaz0%o^E))NmRxbLTQTA3xT@XE6%d4e95k>ppNX{ zo=}iNc2(1_K$Dqy`{{rEc{xJt=8E&3{)Y-p3G#gNE1to!fTt^7xPj1~3QgEQrmuwX zdrxmS<}0$(m(nWm!Hlr0j>9{GvHKn=2d*wFSCk6;XXQU$KFcMa|A{JX=1#$?f6LMn zf{MV9KzQlhDZF$3W=ayI)IA3?g~YGs!}oQo)2QhloVWwzFqK&w(2x%f`RA~e8G_|3 zS{Y2|?)hnS!fDuZCA8;f+`s+)>YKL@D0mOuEm1=ng1?dn5pa+uA)WeK6Ysa7`({Uf z*f`mCr4QTEIvBcvf*~iiqC`F} zh`o0c7<&kSy7mmhwytPmk0y!Rx9T^E6cXfNB_mjFaGfMS)4v69_gf%1^wSqrPqxg> z8_Lw6-ph>+&J3VoZ;|8T-&_%+Bu}3Hmz5Q6R7cL@WVjrcz zbG|#k%!U3P7PkVaFpXNDXM{2oOf=hi7p(cboETLI#>#@#Br-;IKkEV>8tii+fo9_&nc#35AXa7RZeYPQP+%2A08nTVS@NJ8)Bo{R5KI%9^nTO&BSY0#Ogn|J;ASnK+QOmc|>^nI~HLx7|}W{s-Egvc9>D39qHMFnFo0{^}&mC=DFG_I!GK)HmDmIqf1ysD}fFN}r!6 zzh`T@b4%-H+K7rl&o@vcrU3M9RfLJwsh4r2cw7$)+>(AQ`q{*rXsVX7hDFGbiQupD z*qICY9@P!Qh*Ri0@a}XRWD|ga(zO+JjB59-PRz=RqPZcg+5L*9x~(X(0E6)YS%i#1 zkDdg4WBp?2>WN^C?RRUd^u!fhq?i>DJe8{)A=n=CE&uzc@a-D`MZ2v;X&~tBe5E0@ z4?9UDD=Vw>P0h0;4)BaQ72njKE@kry`xJ1Cj<1Ug zt79v_scHM4KUvF`Q&0wfF1*m(418{#_!ojH2Ed^!>1o)TNb>S7zI))~^o&iM!wPYq zK-=)J5&q`(z(7oID$>Gt{;TS&mz5&>r3;gIL&-5;OsOn1R{<8%4N#}BMBq_0W%3SA zrMk=rOMe`p$MjP|sID71rZyuP?jT?s5wug25}**xO+^hFrZR*B*G_U-j1G^Bxlh{p zd2RNsJz1{`Jd_BR@=+e}2n=fb&^@7X>f=W;T0?VL6GzFw_|@ES^Nh?#NhUY0Rd`>q z5iZyk4p??Bi_mPDbn*Xb0qVX)ocE@ifp$gjG&$y!@5Ik%8KK zonp!QUZQKi-kripA6PeuJkjNiWA)L35JY*}YjfN8qifu=yS_93XuLh5*QTss5*XN* zf=1KM?7EGi{@a004J`>o(GXhQZD2K$Q@cG3_ZcSw1O1{d9?C@mmP7?3!I-Ht6Y(*a z16d!9**He<{L;U&Ux(_3bqi#%Z(jV`HXJKEihM2eUHRCRdGqY*y3#-1zO_BB*=2c; zo!D=*bMEFNOOw>l!mz)5B_|;t4Ln}>vsS>vW3`0^()hmqBzf~ZHi|12Ys z(wUdaz6A~M1i=KF&;zL|n5q&=!a6cR zK!G6gDcFV8am2EYmxR(Q1UDdLHDPh{W3%Y|u zear=J#;v^@iNB_ZJ>46QM?QIP;yq5S>nV>QNCUiu*$h^!`br4=s{bSGD}&bcgPP&f2f)njdTlqH zNDDP^(pStMrKXC5w7AXt(E6_dPtexHl&<|s^K$rgXq@(=G;!F6xVra+BC=XvLznK4 zK`%v+b@?xfg`53n0`!!y9M8@GDFdvI=eyM$`-7T@2pH>+MzpK{e!~3ww{t^K%o4&Q; zsY6z{;teJ!n=qJlzR2=TCKzaJ0!c%Id+%TViOXa}hUMB-haoSqhqbZFF&1L%23uvSO$2Y|FU@`}>I-wbi2RqDhL|7l z-kV@4;l1}_wl5drX%LTcbPpJU6No62KazYUdZY{`qOuh{HQt+FUim{N6!5#PT$TP5 zC*+$8#Mc`#M8jpadY2!m-iz^}JF58?VU(o|R__SgRtrK|PrSY|F({N3R?&f+P0%WQ zNmLewM4CbKg0W`;I9^>}S(*Dv@S0mP25FciWpbM^*0+^JrS=MOm^uTad9Y{)Q+FlI zpFzMR@AUM>V!TZT-2GJL2ZW{KS4dD-ZM%H3ei{2H<@~RfXc9Wc5;U|Xr*&m7FG0g* zr}>rJJsOoDc1A;NQ3Kl}8_0O=>RF=~D?g1+Ra1_pu zc@y!nB1K8&1%71UlZ9klIt)aKpf;bX4<7#&h+>So!#5kZOk-!&pP5ey;!Ao-<4r$3 zW$zc*q91^&BLoXvK`?GS}gcGbyqbZaib&EK5K zf^fGDwO zj{ZN#AUv7lcgTbu&Af+;h4z6UA9t>rfcg|~>bL#b)Xd+6v6`Od>}r*hgYhY^ItfxP zlKM71oHFA^@CgV0AilobDuKxOU|qZE^8lfdtA(|kJ~HTC&8)J5kycQ2clygMAaw1} z(7`P{^}H z_PV?GvG7wxZ8MqtDt`SUNs%RF7-_8u-0k$-I6ynf+kIky^HBY=+%40|+$T5%HTEr{ zB~7X)X>eVMm3Y9ap~1Y9CaPaaGc7E!`u^k-@n|@&N``jn!~1H9+1}@xCoHsd%+SUD zyd$QsXm3cQ#W7pAk&hR|>#Q1EgiOC=6Ein|uPJ2#KL@^&6Q-0;{UYDxj4Idb zgwtRy&lk%_Rmc)78}0Ene0G13Ecugo)i?Chy(MC!rDRIH%MsQt!B8^6ysiP=T_T7h zwZKoIET=)1r)>9iyp3mYT5{;Sx6e=0-vb^Vh)tlD42U)`QMHuVb`!065(X22lrsKy zYR^G%a$X(^c2s{$`+FABjKzkc4m^;w&evOOXS9U^m3lhby$J5~b2-%B%pJa4)g z5YSJRwTi#={(w$fLPPDxMlkC~8ryq%;CoaRykJHBb|5sF&6kmbO%FuJ!W?-^SM<2; zR{@S58$QEQ3K znz#6Zf)(lwk_lQw1d6W8ZDuRs}#SxTm0 z$`4%yjchvImb4d>i`8@RfjT((^k(eM?O+}AA@H4;a_v}`za6|jN|!Q@v&%Y)0pIE( z>wrnN8XtSbvlsLEy;tGSYuZL1>uZ-C4Ct3=62WSQi@IieNVf&AnA_i^{x>1Le~9tW zK|eF@(6tcHiqlu|iqY@G1}+czl=E*zDYXX+;uOqNFEPo&r1HtkPrSTGGJiU zD7?fGUi!=|lx6xEZ-s@%D4Pu?WnsG<1|G>@Mq}GYKQca0=HKB81|hiVl<2uel|Dgs zL2Dt4w*7Qsn9vm^U1F5GAT#{g<+p@Q5ttvm0=AL7h7*Zz2r4O}2Tb-zi{ zTWoG^6$zb^DJGZ{zs5z%H1^6~aGDn)2L@ywL}J=2ETm=s#3(srj>`G@iT?fj_t;?8 zSl#{E11B6P`Y|#Ee#j*9IZPOGj~T(w+9ORYNP&$S&~D!+r4)V99w`+d-hrPIRXcy5 zSpi-UEpg<3txS}=Cw$olF<6=|mP7u#2uI&7;qKFDdPl&* zoRrB$6V1p};K+K;HXM`_hHMFr)+xmQN^7qBB2~?}fRPxon@S=oEK9!SGUVaM6pOii z9{Z%$uzWef>z1m{Dwvzl$o(Kggr{FTkE~%$p{zhrV}g^P5T#BWLs}EA>dmM6ehCGy z?+z)EAiR$kkMyBmH9!(%s}vdXV-qZ7Tb5GIq$AS4@>_?diM5a06j&WeBNY5XAH97J zyk)wA(27_*>$v36EPh^m_B0j;#v|_xiHP_LZm4o&qXbwimIv-uxC&m4;N)GN*$%+dZfHn(!r#Jw2Bhi83G zREGt1o7)^*Lx(0N{%pH&+e}H>+2fb6Vmmb(GHl=6cmS?VMn*>N>Mt&-ERVl?twN%u zt^FHTG8j)*8V#0gUUjS`f(3z=mzN_Am|{z&rl*UCC&$JH0LmKk)7co_iC> z_~e0%`PA>H3E5Ucc{jYF>Fu?w!0O=Fras)w>}gtI{q&Er&*-OQi)LCQ8FdCR9eOvrV(eR#DLc$p5b2=kd;bhd{E{|3v@vAc6t2H+ASK&5cf^pDL z99A0N7GJch!NEF(6HLVRz!kpg+30E_8rvIl@FsC zptfKeFBu62yp-&MA1-3Kt04M9_cCff5JXXszw(Q8Hh`!2yfS$*C-t*`bUt1e@%^N(8|5=AqSj+E%P~JdX<#h^OzrxTI)m7;yjh*OjufDm$Kq^x^>XtCtaTT zE>TDS4Sg_L(Ifgv>P+2b`l#QRS}mTDOe5B#1M|$4if+xC&DO6E_A1IXWs_lz2c96AKMxsJ@bu z<*jE;H(R}Lpd^i8uF7bSCUFG7;rU_n1#}ZVnzyyTEZ=D;kYMUi1aS8|ZP;isG|NGP zu}A7yM34d<9ess<8MrY_6iXCo_ojF~QJ`<48X_k*rnQ%wlFwNuu^YwSw(F&{rei0p zJBu)aPt9)}#PAnrq<7n>qmO2)eRx{IU=CBi3!50jcWCfsJ2*+ zVVa^AAA3QuY;L#nl!DGIm6!OEmIcBj4~p8bQICwbdHNzE1mfD&iJbxhF3f zWge%i`Pfh;PK)p;z*$d?+XH<5lk<0AQJ;wIhx%>AUiR6c*TsdH?t0E+)&;`~l1^*Q z%pG8Wed7hjp0TLOL6O=1j8+OH8ylOc36j^ZXQrll7~{5y1Uy4-;U|9peLgv{5y*>l#|Pyx%Uc*b1P$k5vjp@$2{L5RZ685Em@>GUGLL4 zTUmsJGE0PqB|Diw)M$TCNTlr`?R1K30Rh9$g*H#qkKgD)dpNe11(=Lc-x6LU8H7^h z`TxCu9yWNpZR~(b!V_^t?urjlVK`JL;!nVoUvlLnby~tBY3h z?>IA=U$PH>Ozh_H*!x%>I-F4#8Bp&~`yGw)VnWLU1ZfbD9(jBc4~yQKqcdth)9Y(%KB zGcBAPyqHw6-n+CsX2ukX!Hr&_*CCr)cM4he?_~Go^RlX~Jt(b;Cx$d>eEL-6IBqjH z?@n48tcPPJn+A45`QmV^+=HDaTGb*ymtg_h+6EaY|=z<~JC@M?;CHEEohWo+6oPC}HhRlJ{@YXp>q>A~MTu zpLX)dGEHG2+dc}VnfRNc>r;ZMc8qVEK*Bo3KORy2*_A-lV{sn`(w(K>)J1QsStr`M zo_^amq=j`FB4=?sQAUxIzxkv$R2=yNAUhrm3B&L;-)CbNzfd4NFWyKk#4Krz_oMF? zl1CaIYW{Ck&t-qT12#a#^Ar(gZrT2EzlQBCC$+5mwYj{rX%E_*C(-~beU>E$d+@Q~ zXTtrhZj<9>2@QnuO9CeviHRr1!t1s>|5>W9Kb{7UC3y~!#)e$>>c1I1v$S9p4H9W^|D9+4t`NYuvDNq+YEV>38Cfn^kQg%Qu`<~BFw)m437ASHe^29{$D@tIfh z?>BXl=S8C(trzTNGh_C6u3Kt8o?TiR8iTlrm&!9Sfyg6qDHYG&d8X{Dmn#Nz89ZB4 z@Lo((P62}1ig(Yq1m}4+?#Nbpw-+%mSpsLYNYeedEL zn$_Y#udK+!nq1Hpe6!~adS;PmTSTDmaaBb7RsY=|2r5PK>Zv8T2`i*97I;rM@ZQO( z`e3KkZ|*qSJ~3A^KOt9;Y-L1tAX*iE{Jloq#V#ZS_8sYq@4Y93{14B`Oy|>?#KP~f z3h_t-b?%9)wf~*)X;yPd8LTMk$Ajy;L63N8%F4KdeoRxE0~(T3oqBS>RzuB|%#qRa z;SYMzu(JbyykHZTK->5qvsNW)f5y>q%@XWZZ?BS@S-22vS!gEtS zyA%2)Jb{=VqX1f z`pm5QP18CAElj$fQp(HA>we&(D+zaRlK){=4P-uf-WmT!Bu}FK9#US|=iFpml^QgR z>1b#miGz3|6FzLY>MoRi+feaviu$dbC!R5=xi}P@tt@krZdOSs#c!m?j*QGqf?MPU zrVz{R{MuIJ;j(AsERMsqjP5`b;#BOD1(Sue7ENXI1; zPR>Im-5Sb%KM{f>yyutI&p}-c|NSN7yztcH``|@QlnGY!uFsJQ^gAsXG!bA{&pr9K zu#Am4JUxHCko%-t{yIr84b(%r2rj;*5_X|21sO`IcIQz`JT-?rbgQ&nD$gfe^}RCm z3*Z_@Zwy#m#-$SdI(FmH6nKRW^c{p8s%TfJj3q~7dVZ<;yDpc&S<@>{F80HtZ%}2GRrkZzsP^Pa%BsUC5*GE!j3x%pXVVjko&uu`- zFAMu7thnL|VzsER7MP-c8Bx7q@qH!7`wa+K+o^RkKRZlCqGt(kq(Q5F~~N z{EXSOsXfk(5Ad#{D4bLPwwf@aDH%05F!d@gJ$-L6i$B9_&m}8Gt}} z6hR8v$is=Yx;6FLw>0swh$|zI(#C#-U&*6-NwM*)EG(39$aB|?+JT(f+GZ*kLSg_C zI7Ec1tz}s`MIv&dMAOsYUk_1j$Rh&Y>pCk$=n-7sl;jmq>_1TUR@p~SJhp?}y0TMZp z-U_K7-v|=~d*A1)I#r8uT`tW|(rV;aew9|+&%J`hteX#H20W;*!M~4m@4?lwQnHnF zbTYhf7hCT}E z44ttcQljxAy@WmhBvh3wVI)}$sj}@Q!3&R0{CCSJd7oSchP!?Ld*n z{Q0CA*k>v#f9$|a3;tkq>klS)t3_6=k7`X&omrnB@o%jE2S0iTa{LV4zpzoJEdVVX z7kUCw(f4=XLx0hNsvr0Jbp_}_CR3e(ttmVCGGrhpVgLI-_}lSJ;2Z6A5n?}kkou7V zdTEVauo%wgo5ZhNw9(+c7FUD0$>8_5CWg(W|hlj&qCFAgsx zG8eX9+Btm~zba>$+c2DZf}>k7hf?*nB1zwLZlmzVkJeCiCjywow6wHRCQ&MJpX3`( zoDG<+v9XG$rvOdR1098sqp~Q`Q1CFND};u}O&G8+E13?_wfY2N-&RXUTTX(;)#*fa zV|_pVAuiH~kW5F(Ser>(ad6Kjye5E5DyRc#e-vqk%N?_OO;JfZMjrmiSZisXfxm@M zu7E=GEM3x%LuKM=YWAdo)y;X#MdF>V4-a?UMLIe?<#$NR7aXrQzELC5xxkl)Ag;r} zf)0hCtMKpxl+<(@+!wB*`RrYG|Hh`tV@$QQ23mriSzSc4v(ozIFevy&Ck2~FI&m99Hv4v?k+a*J)&YI+w4`1Lb@rRCC{ZkFk*SNf)g2`7t5WQpZ}Ldi#!8!Hsts7AICtw-w)@VTNL5Vu?9biY{?APXU~^iEy=CpOYxjKeqV+uK zHVpFkIe&8J_Pd1ba;8&dRMBmFzXh_LBDdRO1@)rV|MreQFxt9&R4#wJgds}UtGxt|_+U0|`{U%L#8luPrLemE3+gYMHJ#V=4UN1#??j%aD`DYX@ zx!OQ6`-K_|`YO1<$zlUwoqtEz-bEn&7f5p|S8afM#KDEysNyVKDj(yBgEZNsix!L= zm|vLqDOyVSqXKKVg{z4gJf;ndG=oug{X5|}Z+$ljG@-3){6!cHfZnbEmJ`&eH3yG` zwH#l%W-F5+b%mD)3u8E~@3?Cg<&n%(P7$^YsC>{9CD8J82vu7UrR@)G5WtKcmelqm z4m0yq7g1bEG(f#Bz_NX+lsWo));~xwCQ(*QRPu9v=w z>Q9*(r~wh2l0Zly{pJt%oe_ISv4+P=poKbG1Yk@Xl@81@=`L-h1X!mUQf)fh%Ti=% z7@HH@8Q~ShJ_W|0K_21&`?Y>F!Jac7p^9;k1qq0%53cU=9k&r1muaCCHpZDCxe_r(K=3 z8*x_A<^-3p@{q`~63+x&E9Af?-;wp=_;-gE%eD6!t zJzw`41zt!_T!_vT#Q9IRD&Od^XX zKd{o~pb!u^6@TXA#ogO9I0{BRY`+?y|2s zK~IAzr6>Of3s4yvs+q=RoXVc~b@VV-es*+rhZ+34UGnv5QR-$`VIgoN?9x{vEQf%? zl|rRKjV@YHw`l|84WmuNvQP6J=YbpPV0>;#%I(hB$BgWu?!VK@kZem@MDNeYPyNWK z&>B&fSJy3@Qt&uFzE{&%XMmvGkD!{Tfb1RLse%M$Cec-dTT`L3nUf=TLPDulKB?|&V_H)@TB23sCKSPj`NZ0REr2>m+7+E7n@us#!mu%i?hcCo4jLHwr-f4*>$Rw9K?Y7T?X*~;t6Z>`@!@zsYB z&ykyC=iY16{d%90F>Y@otqHD4{U8g5Hx`>C37@Hvk8p-Uj+t}#It}ao0DCoO;jxau zYd@bZ(YmJQ@53$*POGbP#C23TX)b6)ZS}Dh>oHqw%jwPH3xW*H&0kM9`7HHS*+}z zs#7)7x;Aug3z`ttCuW@5$e57pr{^Vyrf(!YTngPaD(BdXDYX7_>Nbv!^KLJISJ?gL z3e>T%VEki#+vO7wYJxi4MBNW31d_XNe9`~s2K@WRb1YwMQ3}qUYIbgf3f+YDxn|tw z3fSwQVOd*RA|ZDLxLb$+;xcm*14;u|Cx!S6cejRtG>FXk(~VV$O47JxSs7uh0kV+mJ$zRettgZ$@*xjSeO!zgA2)QG=t+~fp|8+ip}kR=K$w#$!fqzu)3Bb zz0A!KRqVjqYQ{c@E|e_|Y;;%fkt`B2!$^l!=hhprp_LaFsSx`ynMF#PpXz>I+`(&n zqsYy`5cbb#fF_Q`RFO2ms+#aSJA2L}rQ62duQ4^p&>q(@O!sB+fzs#IAE-j=*D-Y} z;BFW!0FO%4(np@qxA-1vsQ+}(^b-7i=g;+t#h+*0pdSk_h&W4qeg&s~U-Mz4-BW0| zyJbL;D7jVhBHp_4X*7WQ+0(QsAYHKsJ=e`+n_una(haSj+|^fM4$CD5mzWl!eK#+bKI6?5Dz4z5Me2|f&UC3o3(h$k#_QBsjpeB7#&~<|a zN@ysdp-p^sxs<-}-|efxs2|K$AeQ%Ok z8FL?fBb^@B^IL(^8ZTLKh2gsfx;V!fn^!Tsn=<6#1 zWSGxS6y1~pkiOU3eLRM+gWddbla2LsmHl!@9uS+vPI}nuk!ia#Q@$HX@U>Bhu<7(t z)*NMUa*Z0=EY}ML9pt#C`TGy(_3YOJ2D{=?jWO$b=fx}wFZh{KD}lc3z&TK00qSJ5 zZhgWeS^GF{i-^}~P}Cfvslr*)Oc*MG`ir*e>WqJD%y~l`7>+M_i}H!2e{a|h*1CDI z$Q*0!Ma33UK!*E0+0R)IF|~hq51{XU*eejgeGB*c>r@uR)l2^Zubf#ug}BKfd|iVDrG zy4P>8Qa3fNA@pf%(pz)_B+yT+nYYcjht4~ZlAPH%_DnHu zY0LnpL ze##0yjcM_sqOuZ=yYXzPj-j|ownku31Q3^Y8P@nbyefOu>SUVn#qrAL|8`kh9$Q;> zut3|~Hz%ZGb)!}dJRDp}u~xqlCmTD&$7iC>S!p|O@fSwuN!X?W@VEPgxbAIC=w~{D zL(bQ%87HVxdz8{YoC@_Iw<1WkWVWZaYp-}v-lP;)%UWx*SC>P^o${?~xCBmf zjV1o=uu1g6mgQsLFj#DV2EL>e29nW8?!VhgTJW~i@0#VVms`?~`AEg=8C<5+(s0%C zR|-~;Qf>*qw5ha++Q*mbQatiVkFB8_d6=rdchr2)red> z)mggb2%w!IOv(HP7oa7h-{2rzI`a}BrLAeF^k5~nut{vI1&FXC5B7qGA743^AR0}w zP_sH*8IVpq*;>be{s$P3LjLn-hAQJp+B;1;xE`dm_mukhB_`C*J24CC^)-?|`Mu4v z0&#qF7Hs|ywL)%(s1T>t4=jD~7){-Y!)k!gqAh1CxGkqa&Kd@#KLwJ~9bn%OI2AFd zld|UgS3|?Zh%I(Q4Gl>_3JF)d%*{YJhK*a5!q$)ao3uU&`^jrS#;0C^os$E^p%!>j zEg|7wXdL-zC*n@RPZU9!$?*ZmokUYRFpeRULYCT!l0GT;v4C0`BO+I-NJMJiGac)m zM$C&H2*t{(suF;1W*Ge?5Cb$2v3zrWMU-$peLveCOn^0T9xP-?@h3mJ)YwssW`;*)mTcqda&V{-1Vka!N{Zf=7o57l2aD$jAsMaV&%( z9H3#7WR>CKbTU*3Glk?vWLu#9`IvB`@O0-zEJwFQ$aspsJLGQWzT~neoa{iPtVnl+ zmx|~Nu-mBEo@$f%-z`!GA}gj@P33=GKY*-KetbHaAq0DSjSqpjxq$te~DNFiwMp>h;V4rL&1DX;x% zNReua1pkhpe$$jw6)Z%RK_b9x;EA=M}f}BH=MbB3O3U` zo28ncM{t_XoBs%vhMgVr(_O%PZ90GXX+em7N$BQ#=y&v^32|~0rN1L4A=!JSDR6Hx zF2sK^bf2}l@_couF(jrJ3G@(UIXq*Nb6qR0q>}I!vZ44EPU-~-QL&(MG}jp}e}m=A z-2VE&{H0`6Q>)p5I-r|{$aIH^p^9-59)=)56VFa?B#XdH3o;^hs)gW6-U*Je2y!fr|bSS z(P8$yO{cK8S`KmiZqD}lF#K)FTe z6`nuzw4pr<`2S}OZ{I?Hc@=7HZU(4b=^uJB#o*BdHAufMlE{64(LFv5Y9Z-lz$GI7 z<4-buN_dMTeOE5@{ni`pD(-GW1MPm|Y+a*Cmqi2xNw`*Xdq4jNy&g$7AZF08-0@#K z>$+)X!uDUG-Nm=Dk*`R9;wT5SoNApt^nWS;vv&M+azVG+y}VaeV0Kj-m?OZIsGVAq z;AaBPV;?Xe2|Y!>*#iNFsR*dkVhH?Xe*<8-Rmh^R)44K;f`)B~8R<<43TcU@1^sx5 z9UrTtOiZY?wee@y)+n31Qqu!yLyt6VaiThvMi*bzKsR>u5Y;<;(_lgQ|58?-4)^!v zh9*Zx`GyuiX~7SYmLePn|DLp2(BYtfCLibI-kU8nTLCp?gigEp)4M4)z-su5&--?E%&w~xO&pBhgl6l_(|Vs8BC*5?Vx+!}ck zGg-AD4v?(AsgB3(zuGZ>^684(tD1=Wtoui?NZ{>qNl;qt!!1Kdkc>Pp@VIj;;>PFH z1UTg14ZRm3$&W!15i#w>?~9Y=gRDxXX-?9m8r}P_C&%JDu?zGi_0s(62_U;weVMTV z4SlZ|=#ig?Dp(-n_w&u!-89!wp9`8z^u{32c-*4fWabZg8|rQy#|t;qbxl2NzNCW% zUAXsy8ngnnf$Y8uHlz@ApUga*5r_M} z*<9ZMF6a8D%GW!;_Bg~uHXQw^`gRs~6;r_cI3|rWSU+j#jfHO$V)t2TS71_srF|PU zemWR$Gj8!^^&Sr3o416)F1J}p35Fp@uvA=#=f1L)2`b%8Ij(UfdZ zP?sPIl1ux#@imglF^VFWs^zhqDKkg6Pzo+`5XIifp~M&(i<7n{cC)#M%vY_(Nv?jg#hg%ianEq(uv@fEih%;mbN|`_shhr+ zmdsDt*86qG&pHR=!#s^NHxF4tEK%A$@njk^>QX3IMp6=I2*(JQP4UfN0yH%s(J*u3 z+OD67E~@m5XH7EX=-;V8%o;3~xqxbxDgAYcGzFwmmcCUW2^w0bP=GvwZ%eB!_#{nt z+_~R(&0DhRwKJ9wCS6Li?4rc5fXHrSyRuGS*xPR&FLk8v^Ovc1vhCj|?YqU@v%e3j zyifXx6dpJD5#BHhGRI z(ds_x$~Koj{g$SL8C%OT=GajT}!JZn06-O)npEW)8NSp_lt0hmEanmCmkI? z`9}2d$T}_6Il@w&(n{7JQGqQ*02*KcONmLQD$|lfPxkN2h^7pm6jD#CK8cFt(y+7f z$D@R6aJPHi1)=vV?8~?KM<$Kz_o&Y2D1O1~armtuCg@x>0bcBr+D$=#MR@7fMjS&_ zBh?9hb&FXJ=wGeLSTPAl{Lf$@+!x% z^_MxHuj!8y#704Dnm|prHLdCM)mip}d2A>8)5^WYNOR5ec{?pqVy=rA*t9DF1HOqm zw=f6kLHGwpWjcI;SBl}D{Sx?P0Co)+!C$bzH!d}1dAy->jb^2-OOS)>Jddwh0u%`% z?-qZDh;oI+%?ypY^6nf_zIZuQZWpRT+s}mDRnT=>@VsK^EnG^&jy_U z{2)e4_V=a%qhf@PqvsM;i;rLm*P|`z4>)k5McVPR&wpy``o{TUR-T>uZ*_i!S@Z%h zMB2f`{=bKp=Ad?RSgT>SXB1Oc_1WJ2A}O-XYtUTJ?_+qov%{A4Zg2WPeVc`d zF53Vk%uu>8AvYH0qvO>9U~cwVaIUROCjY2tcR`=i$esuM5#N-h*B(beP@c3bgX6us z@f6EK=%kcR)Zsz09# z`q&X*f5t5jQGuDn*XwCE9;)xKSr-8Ch`x2xLDYLOU~`dA?;NSeP!#BF{aO+Bmdn~*By$@=m8|8fKyfK5rPvY|GC`1XS^n* z>WArj-{{>Hj0nPeUkBanmO=v*a5VoM*jZ9193kr7)guZO6ieuPWCuTiXr2IHq?vI2ARN2x!4-Wy8!S2%Lrl|Q4V z=h~{rh`Jo}9PCevVGFTwJ<{2ywor*Ki)Bc`n0f`(;knl#l)7U6p_x*6dc?A3u~rgbd!(Mb?A$?-(W5L&`)4Ej|I!j`VMd}XF=C>@ zeAb+PfWQ*R?YX7CXp+#1)g{6VL~1;4!4?O#=Q}cY4NO$~qQP>dv_70c(hV(xAMHItJ5sn1D z$?VBT&x`9X`_@L64IgYA5wX^VzOmi#v$s0kPcOv09QK>NH+orU!0)>$SvT9VH#a)N zV<3u#FKTv=p^tdIz!Dn^mNhpqdWAaI$c#KyMC12y7l}1b7}0~>R&q9*_}Mm z=ME$=$<6=bEZ{cr4Vm)Jt6elVCkJr)=~9IT`$bMb*YEqU@=zZ%cFa$(+dD=VdTc3i z1@>>pW-36vKZoP4?mhC?jtYdx}ABfq;{8Hzg#jz@ud-<&P zT>BG*T>2C25L!gNKMdE`Jf9*yg7zH*tAg_XmgkLUvmj&{JcaH!_~UqwcyGT5z7POKTOwwRWH@o6=LWKFfR`}DOlAghHgHqmQ{5o zq)cGj+09`cHRajnf&7yez(dJ&ITV1{_H&xJ?1D{)@C}1Be0XRPq`=Ph&@g!p^ifze zQwx>v9MyQeZXt3+M*K&cVg|oIJ&PjiME^iKNNk^|4;;><&>NQ2>)!lC|DHJ9a7HAu zb+@V}@W+lC4-GTnDYXWg|Gh#>;5(ZW$<5KFhFy0g`S|?4f|qQzt5+hxA}D$r5=$1$ zNvXZZ9K9P$)>A$_yavSgG?a^HVkQVHzJG73cM|gJu6$GcTY7}g>xQZFUWFRWO=5;a-91E81`CQErC0*^=17e2SpFhtUqP`U`PK``rCTsG$;eQ1* zx%kW`Y=RuPc77V$D~UbIin;|!sb&t^!5{EjVcWRJCnvrSlSz;p%~Ab^KUub&Zu`p2 zfUs6SIOuDGvtdCaY$LQnZk7V_nb58>>$zYkN%xv%LGtGO$&ju962}7iONcacmDh}? zQ}FFwNXPAZy40khP<-Ib)v4HfhG1_K;}QQ{A$L35@BjTm^jwzuI$v9D_~sJN}M0@hAQlQ6=*b0SRsscs1U4I(DHjl9| zLrAZ=UMRlagrIm3LhJq2cF#$@6C`J5&^MTzm6nebEvCedNI4_Gl&`^mRaM!a+|T!k_Wxi3H0KST4jd~Dq=x%;uP&D- z91bYOqSZ@#*CBMhct^Na?jvNp)|(3xzey3vz+qYYJX(dsu2&ljQ2A#=uMe+R>}%@G zdQrSimwNBGnt6dHWEX&W6V^z8bPr4A0gMkEhUXS5jps+w4LGbRM>Nx~C$Ryb%jop* z`p7=dP_T%sw! z&-Pv5^O!Z*&)j5VUNCeOM;tN7w{{g}%2QMuzPag(1DA@fUYf$B6!jq}G~{Tw?47oN zTT$?NwWLbkwR*cBnYpP;d9~;FVl+V#L1UHQpKYBYD)Zo$Ls20{v9YnjK-dD{=8li; z3=9pI>po-Pyski`g~ALC4Zl}cTLDesI&^~}{HRxk9(#&FsU7Bw?d8wN@h1*O7>MQv zS=Q_9&fZIF1+$atK^Tyb|2{;QF?@mM(tQoq_IEC!12Z~O=-3S|4;Ct{My3;%A_oJ* zHpcE)fsa4WN5IWB5;V10!Xlwrz8S}GLeH>`rKRMVK)|x&U&_e}jU}kb(vL1$XlHgh zcSBRu6_B=T!%NVx(8AbZ!%4OdPG&;p zrH|O~@DP3f+ufICpS}OP_6&Tfs_;TE7uUnALFp9HM&3R7!QK!j-O&4T7pjRF#n=}c zF7an-Ne@x@Z2_PNAX`hjMG~aql&W@kug*xB&tVi~&iT)8PnW*{z&Q;7APC6F{sS)p zfXss$@bgcvBtTm<>#)EdFIWwvGJ#+ndQw_Ps2hN)^xGIE(B zL>NoBErv-iY7{C7r7N%Nl0Q-R9Fu~Pd)|_YJNlk~#VJ^5I=Ewq*kJbOJ4oydk)Sxx zD`;@TTJO3G2qPj`1x%UW+^radM$7)7H!3ABqpr)JnDt8W7iD8MY&X9huvvyO1M?m& zEztXCJuVzfUA^dWYQD<+GCDl$R;*YHtNVh>IW`EOiGW{SVg&BpTnz4m+KIumm|hs? zX2DPACZU_8Wu^u%3IiI^P1}&T-c8G{XGSMTNGr~W{!jKs$Vl7bRZvTFeq9vg3x0QJ> z@3!)mb!^b7;T5jv&~agmantrKFb6o*6>})9shrk^%hW3ebL)6DIg_+gp`DY zv~(j#Nh%W3f^-WEQZsaScL>tmAq?Fi-JMGJ3=A{h{k`w^f7ko1Z?Twr&mCa6=j?Ot z+56f1d1jMj2>d+c9)B>Rhk+^L=ht>Ot|J;!}ThbxN~-x3*d zR~E@_Tz=G%!%_Dm@~(|-eRO2I&4fqCkXYi~>IT-F!@L+3RaFUCb01&uv-I$#Yc4z~a7^zK^`JLfZE*p#EdtzmD0olH zzPn?g)wmw0--tgUqM^LNeZ>M)pdVRbmh_18oauZ}vBJS6t8P}46t+$J4)oVV7*=k| zMhhfdC(bVT_s1?p#`AGlbaqOUegG;d15Zj`B&iu8x z&i(5M}UN6362I-R(b8hZv16x8wtW+U(~D}Dr2PPu*moQr$4iI z+#Zq4R2wsMR>J#FvKT0z14(r$o9FaC=M1c>l%uN$Is34WOrDRGcd)fz(7ogZWDl+I zy1afY-74r#4PiBGYutM3ggCm9M{H!`!_O0&DRtd2I=uJ)%rh`C`Rfiah{k0ZpNFio z@XzKz2O2t!zkO}VR%h*)ibC__(QJSKAUpuf>{Puum>va>?$@c=Z**oSB_*M~0}?~} z0KcO3x^Cm`U8!gjY`g*Fkn^!C+;#cwPpumKe1C&{jvxf;DRk)(f4+6GW21=2Q%Ak2 z(OWqQSGR^H#!e(*6{UiZeoa1+@#gMfPg11teO#A6R`y#y%DiGo!#0SU59+;Eq1rQs?ui|5s{JU4~Q!X=Sfb-mJ?9KKokRqc;G;Yr9up4 zcju#bxg?>d!^7+Xje-g33Bm34w5>CNGgN0+H>rOQ4`pO) zE5)*i{@K}yz{Vwtq_1u7#Q#L+a@n8Y{E2pS6MX9>5?*PnYCiYyqvLsuIuB7XMO+*W z-z)D6FWRAmsHiCBeg=TBWHp@A^Za=zr)d1Q*GU3HKfdLr7k6M*Gc$;jd1!^s_%Cpf z>_m01u}|@jN|0*`w@m?myMTJ_P~m@0QK;@&q^J+fxwXEYR5`&}ESs5yW!qT<(D?#d z?Q0E9P1|l_b5ut$L>3|^pmu;+P!r^wVDX%kG(0x8xT7Qc=4c_*!s%rH?En3eMj(n@ z(E#D{MLmK;3c0Wbkbl?(sp;GsUs}I0Rn)D2e%@Xz*0}#l6X#(`f>d`;Y_9Ii%;fL%;{A;m*9f3F^$WGI zys=a|Ytm@@A}=VFe5)ujA_7hRu)?TaM-8*Wpn0O<_q_LO8YBey7~_XXiJ&E*tvar0 zcDN#D-XnfH&foibA&9e0@r)O|3=+hvFv4Tg$*}nLZPS^#Bv(Id z&Usm#VcAzII#N2I5=MG(?P)YwZS)et3~M~}0uyVDLp9XKTW-G!O71KxqW`c(N@iTe zUd|%CXTS4T`7Y`XK(Pn#3$5J(R-lY7Z^0#(e_bjY>a`9qGX? zR8*y}#MV6byd;Va8V7H;@LD`9p`jNu$3BIBo_Z9|CBP(=n7$kJd0Q)SctW*+yE3fj-3R+J zAgvgb(jnh53Z-yoMl8!~FTdynlIo@kP=($ol@F)0$=DVbI)#^$hm-Ut54qV66Hd$M z0OETi!o(!^0%=K6z-2X0682*jWM+tuoSt4{5SGWq@$_s~=p){Dc+n&MnV0i~n1l{QBB|R?kuy;Heg(^^;1bj4{lv@+$6cm zFCWAu9HL&J?%>!}qPf!yt27MIC0_!BWK`~e_Y1WLV4&H6o35$Rlw=L+6e2_t$+m~F zi;Eka&@lQU`T0LliEJ}6Gw+%V551rVw(ttkEG?Bu5OUEcc1;qpA$84YB_6a zur`|;0p$qLbjOAY!4ml>KbLGUe+Soo&_R{r?kdjJS=#tY?&&SE^&SxK&Km~?5cL-8 zdKi~KF7GYGFh)6${E0yuo3K+vyIpazZ@+j5e3T-_NopSDX@K?g$Y%dpcnXOp&-SBw z`ZVdVCSC%SPUUaO!H(kGjfkDS4l`LRa3f-~yX&hB3X+g5a=Y1J+~(oR_U+q?rL;&p zk$z=L&ZzHWYtHwYHS;Pn27i0!#^qZ;{L9fVb2bhRjrKJ!po?zH5evt^`MA8Mm0*n< zR22@EwQbSvKerYbR|(6a;kWQgLDl|i(t@Jo9m?L4S43f2u_yL!Cr%JHE?sequ&Hd_ zsw=6Rm&cdVf+(rL5PB;YdtdO@AW!Z2PHI@imIE*UU=ovys;|2}TCx!d^-&=dUR z{{zA`qkA=dV1loV*vsv|JoXjAx#r_4?!RC)Ua>$-Z9|#Zd>V85c%;Ah5AEBR z_m%?0y|&~OhMDuSi(SVA{#cM2-jZcIl3vqE5;#zE7^@ox+%h3(euxwv1}3kt}m8dL1(CC9F9EUZ+94G{_1g1w=SJcGOFR% zy~c4X?_Lt@qK*20*p%JG$)gm(YK;8aH5%Rodsn*_oAD$1FC0&f+x*U-tIem9eJD(6 z1L{29r9&PtGGgV@YPfp;+_vuuAuJ-afg(qypUL;mojgLU}i^ffxA1|TrUJ_38 z)qQ9GB@;8YD?C}CVd4wtN$u!WE;f|uCSZerF~8+q_jmYz&s#%Y>1xf%s`MM~j*eTz zKRcaxd>iN;B`>v00joQfu0m|(Hg)&`?0PS{rd}=Inc&yoNj30?i9&5~Ua>H=ediDo z7nV7vw%Q6DR}9K14-49;xD(7wBHANbet`h(GmQygJ|O&sdKo+ir>pOjuTS_tr9!5a zBi8Pw29ad15FT`T7&3~A=affV=MVW&Xfagjli@p)Ph=9L_E*j-J3jtAAojr8M3F6{ zdSXrL_JT<(9(P#Rdb<22{g1xXU$*)+yf|($NnmKF6A7C}r}1OZh?&Aem353rO=2^t z`*pOlLG3VG{63pvIt%cA46vm-?A`QT+u-G=Q=0!(to{jYbb0`C9=cN{_o7D z4@i2Msoguwj(2oBXwg*d|JkbaeP)$0yy*E;vFd9zn~!ae1T(E)5-%Y-E+6);Yn#UL+Ui*iE&6qwUa2dMN(%a9|Y2eMZy?89vc+eKH z!5w8Ra|_S3pHu#T@-KRVApk)SW%6NvmSIAL-q+VRGqu%yl|cryCe&;^(454ob_zca6^@p_MVV+o-3kS8;tjw2mC8=(lRWL; zC+EPgMEF(f0Zu4V!^+zk@C-TdefgyN$Oxyj^ez4`k__pj(uFZjJ5Gw>oT07Xs4YF( zR}Bb0-#719iR!z@kPkai#Rz@q4H~6q2P||}rlT%215^6RuJqdj zPzVKiedL+7txPc-|A)j@bAN4%bFRRpLB5rvzRdClUfM$a8j?Yi8fVG8 zzRK!#@3W-BQwg# z6AWJDOCt`=mk^H%IZ`K#$nyaMWSZDipGdV?Z%Js{XCeCRSa4ddp{%5yZ+js0w5}?E z`4xUiQvAGmJLa=Vh^v`~5Cj^(rAR+YpYrA_ZGsTtPST(&`e)KV?6C)R$J{W?59zNv zi3-?Dg$3y96l0K&_zU<-U1{`ynS`3t`n^v5Qk1P77>XHx89CQH1yTrrHn;(F65MID z>p#Hfn_s@-yYM5Ku!E(!H>LS~*#?QA@yBBY%2AU<&ya%z9jRm2`9!ZRiYQb5#EXZvJ_K)?xhI3J*~3j7`|( zWlH?VAmBpAad9@|7H4}^Mg3DO1@z+eg*JyCVj#8X0Ns}OxLL7ci(c@$@&Vyu_}I?aq;?;Y81k(&H`fPilY!x5Yv=LmjB2n{*T{=2^faH#8>4x! z--huG(d2|=w$;J?OvZANJD@_<*vR07Z6mRXQTjpQLvnm`FRcYJ`%Cb!@#(~Es2R*| z*jUL2cfL0f+G&#Bb9l~0h7UQuK`^Mh@8mO_AWnzL zJ5I3-0X-KGp!-=>B*q9n!QBKncHz_&q+wVj-srUI*6={J&XC0UkZ;jJ8^=#V-}=ix z6ad+11t)%Fsr@qk@##4l#!!Bk;|f#Rxs${XzcIQUCDjoYR&%n-Q+>l|f7!(oM}ndH zQQ}RvflX%-5ujsy?$%z$NR@@130HpIxhr=TGv_>7I#8U0g%S;Kk0!4ybttBft14Z` z&CKYZLpr|VRdTgE&s9D#?Wc&Nr0*mn0QzU9IA*i^;ql~4duN13Y7!h!U)?ymk&VH6 zv{1rfR|p|bTRMM6>a&#%)o)K3OmW=IztY%8dO*=MC)X~jLw{VhJS2zj>Lm?-qdxcQ zDEm_-Swru2t0U=!mNM}`Q)05jKx;e$zfesLIW zot)#y=~^Q(ifH}x1VPL%tM`OM@}Jmg6l&J`F>XmupTx3|fdq(yd+1@$#0o_^S8j3B zsUAOXyHiU|?G_g@*Z8s{a ztxP+ilc|rnr&@W6%Tq-?Ce{df(rOHV{K!S&wC)xkm@CQ}k-FnDV7HGCiQnqb>-_1Q z2ch)aW2IW|w|_Z!+LInkytDs1>Kc1zSE%;e{R7@=HOG@k2RK$=?>3wpnQDVyRfbNx zhN*9g4z7?@aekX)&2=6RCNABBvKjPwb5PXY3{-xm@ftK?l}+nF>0HWt)7bJ^3m|mD zKoc`=M0p&FXz{ooE9tAIR-fBj)GT@VTf+k1`9MlCAuTYuchvZ7Z;>+Mb?pUNTfzM; zl3X+;+y@k-IaY|Yl{EJU3ClI9*kRJBDSph8g{gBps8wIsl%J|%XsA=C(L@pb{M6K6 zye~Y4NNLH7=c28oVc}}pDA(_-C2)?;AO1YZ$3lIpy$Cp&+V7{jYqs-M;Pl3F6U*sc zJ73hTP)Mz#w8Re-S;z~^S_?Z`y9M3<4!uw7f1D%PJC}`Sz@<1t2CsJs(T$EwzI zh7qCla%8T=wrtb7btkT-8)N)s<}iJIL;4q(^9ViH&vr`Cv)fiE`O*5zBsWTq7?s}9PH}X3cWONLUnApR_2CN2kR}F8jrCPM=w|fW zH?_~$(p^@$>!ZLosr$pAMq5sBwF$b6m%fC&`9lfnuT2DGzh|M^6j6B8Uii4{CxB(G zb9&RB3m({YG5?&Oo1I*m;lo1qB0l?cfGCx>4%_i&Q1V?Qoc(6K{nLS{PLHWm? z`tR?o02{rJNz+Q5`Zq*eQbH^y=4x57NCBEh)L!!e){J!m8(@FF~J@i zv)&dpGYRg$j*R)GTP;%wLLn{5J6|8~PHmumO7Gi&?!2;zDLN;Nu$Yq~j zhNgzE9_}`v{Ar7u@_qNj$xS2my{H}kK!i~amEr~q8e$_ifqctG5Ko~~wxTn+&e-OlPe$E}bLj1nFlWIGhuJFD!poD(4L(Q8 zw=c>UvODo*0UH;oRrF?y0d!Ux6Sh&cCiU$8{uchC!nkAkyN2nGPCTQ76$Kv$k}uWp zSJ8~`{;x(JsFKtxU7x;+*vFSA|C0+)o+P3K+_iio3cuULZ7#a)%&w$7G}O4JzuNaM zHVL5>LtL%W`PX2_P0XDo&sp4GvwbcUzq|THr(%Ff*WTL=_aQd7@e%p$kTM5|NVZ=~ zOqD(Kr~kmeAV>#CPDR7_mqdRRF{Mv01|OG z5)+PvOYnJKX^u(zGhzDr0;5dK_Z&B*(x4gOx_ed=Ta(Q@tB>Sq_9-4!QPN5TfpHz=Sdn zyw<_LVN?CFhWcd^oInutp8#$<6WSE`#Eh4#x{2Sp)v%4ewS1Y_<#>5UU90|*alSq2 z2C>2+99rT~)e1~B`WTT#8o#Kh1&*1ezvyP?Ug9odW|SWnW9usCs~{lw8tn(H$sFG# z%|6Lbu}`|RfoeTm(zs^`v|k$)Sb0tN{NI*T4D5)XllD>sbuaS-bv#4nr9pzkt+nc% z@#hwrA*h>Y0l$H*-z#WSQwrloPz{@|re@c2qurd3IPZ>=qsS0Wd8+GldNtoc!1Fm^mV*3SZKIC~#RZ4R zVom()wfWzfW_oS!yPyh#`|%I9EEW{>xsASRQ(9=QZ;1!$pijE#yk zlTcW4enTzz+X>H`H=l$-!0Yrc{HISL@14ETbC)S1Y6AlCbt@g{x7Iz?Qj4krOJvOLQK!?0RjOEBI?D7eSPl%%76rBps>`jIdgtq zCriEfAKxq4!?rcY=g*%z|1b7ZGc(4Eiwi(tr5^lvUjsyi;E;91nn<0lSx+*g)Q`v|`B5DRd3 zK5g3moHcW>v~lo#?m6n|43pJrKX1y}ssmLNnbOyqdjstsWy{Gtu((GpPEVdtmGtCX6hL9iJXQQ~dfhe|2i= zos|{qwpL56yPI3dOHF%wPNLAjpdhU0&-?iI`*$w>tgi#1q^=VXlXAknw@O0L!cqST z2v}RgV|C{Rhw8@m$1{I9f?bo=d5Qc!Ud?~>>J_Q0Px8V%sQS6v%*uO@5~{hnC8ZMa zcp>g29gmFlDV?W!gp543b&5=#rXJw4T^Cz9Gx3D0i;0V~bJC18IfxI9sj_l#B=&42 z&VhUoTjc~ai=jY6^r8?S4fYVgnl5sIg{D)z?#DU0OL$D0go0im0~!AW^TtN29sG<0 zUBC|t(j?&cX67?ME{)kp(kGn?k@VrjWHrwTX_WYX4R);$o=27Fwu&zEU-nOgPtY2u zl`?}(YcdaRnwBD5D)$ziB27JI4-NL@dmy99u{GyA2ijZ0k7Jp>e?0+w%TjG!;wCGh z8uo90_x3Y(J}qJumdtR%ZhL=JeTHK?mKN$PVtQi>(f3w2FfNQfkk{W8geT23G`tW) zPD-OBR##?Ti|i0U;zXNQ)D#ppKcP&|t)H|K;lOsE){kNW`Dbj zB+z`b>MswV(-g<#irRZJVbp)>tzovgstxpe47*A%G0P#Sot=$xXueW9AvsyuOF@#t zxR8w&m^8o`-BG9V*<1>st@~P`Q#>k&Li*1fS-H7m z15V^`Jb|7nsql&E4z!BT&aN~-a*JVHh=Pu38Y?aki?yz*fwwlo$`lBIZ#XG6^+=~B z0`>;L_<)aXjAG*%@q5lFV_-sKHyP=}4`%ATmqvx~Csu=lJoaHL&JzwE7v21^m~q)8 zqr2twU;6{R)6ZALVVmiLq6bawXdN}yPIsB^0S?crJ5kEFiYE#`49L1khaYlt;uW^e zhx_`|oovs(x4PX`0U&Wpi--gr@eFqxAe;*S4qst_SDr%jQ`YV0^mHlevTCE|TAfcJ z_V!|0MM;-{0dkJ2r++F_i6nYwdb!K<-(=@p0r1DZ!9k|mZ@A<~#x!!9^HBq-6B8_~ zz$lsS_~YR;!MS>A--nn|OL|=4$a4JYMj2XIS(P8q#JsPouXn$RI%sqjd4A!QeDLaX z3yC?J)D)iI&o5M?RFhw@pOIxNvVj>|SWOJQeB23*lY!pS!}b@;e;)DqM&k zbQ+S*R(`ztb>G^(I7hdfqQ9kX5FdR#MLmc9fsNmSh3GOFvJUw8_@*wiUW_r;*#<*I z;AU7PQ6?O}bvavf7w{?wqPBN-maf+h+DL#^_A$Aq zr@O6A)|;Ns3^%h=YwX8QS2T<7E!I7)O|V{)YYcO8qP?TPD?Qvi&&D4q^gBV{Op~jw z+(il$(wjGulv9$`vV!3(vjZ62LaOAJ%;It~-O`rFdNWtc>fNd^yQ_W)KVNWphxU%< zz1oSi&!aoPO3HCzQbqfNa5VPi9%fs!LfA>V>vk}m_BKH5>#cs)6B zjNs}tc}TE<*K-GJyTIT^R^hoA!hs1n(}aL&STepNE|hA0X}2KsvaBPg@Qd zEl#`29*yeQeMG!3mY1Gaa|r*6&Dt>2(3fDViXDNzz3>d=IoUd@Hlh*qqEU>dD=s%@ zrE8}JKSJHJtzk3MhRm!MhbYpS8&t@ZjZIYzTubYQ`=`!BmF?BoNakE)SwUm>OL({8 zO7ru7`KAJ|gL|EVl?1^|0ZVyvgy}x})HOnI%C7?Gc)$S7hX28@+JA^1bvwWh)v!F; ze__A&J3wv2cVd2=14HbIL(X|%b3pb(b$?p098($2)*6I~21|XF`T(b5TIWRAmm|=| z4kXBpE-oucpD~PzNNsY z^hmGaTz>pZE#=5)@QhQ@h99_7Y@ybA>*_;z%=u1j=Ec$1jVJViP|iRFyVi>VYR~QP zVl*JQtS#us*t1cU9(T z_lcXLlHi!&Wgr5Hv3z?bQP2ALGFedg3+)#l*im{`y#PY!M8cKGcfC1Bh4(SooUmMZ zEM$Axb-AHdmAT!63SQt33a*g^6Suau?(Xm3V~Kv-D~wOxp*RJ|x_}Fp=VJ!A1mUmp z7Q0Sb^6|junue>1Kpx~LV`Ftd24V=}H!z@3)#=5kPwi8P*vzlxOW!A_80X@i*7A;z zi|dJ^suzJQi%jGS#Q@^rz!h09Tb@QkbMx_vVh>483c}kXtI=+^uFDlH^a2clV~L!@~Z}uUioOwCG_B@$>jY|Ky)49@POM0z&w?79+4PB4OGF za@C6}RG%1|P03z~`qkB8cE$(HF&9sh$Fd?~G;JU>{r!@jXB~GXz|T1=Y?6CaEkvLX zwb+ZI^{Y(+j#O{Hr3KUR6l>wfx_m)1Fc)|0IcQz)y5{HJ!|f8C;D}+D(f2K1#GVt+ z;ic?_9R(O$jxCt!v+q`!-5}SWFbH=@Mz*(-s*9LxQQP`meT$G^cl4~3N-``m+TyUwJk517Q4^oIQ+ohYIL1%^)k=b_yxtL7K*wiGxijZRVGba$ zd;j|!LtA)_Y+C9LX@Y!y?c>|g_bWBz41*muIbc#eNoiN{v(6lDkT>!Y!*{Mzb6*Pj4>>^&rX&c5`A@!?+h6 zQACFcnCujXZpF{J1>yl7mJZo*R_sixr$V|GI_mAuSZRs_NmTQU`x&xBB>bW#{+9rb=!+%5WQk?OLXSolwXUFGJb z*5TH<^E}~)KP{zzQ1h=}H9n#Mg*oFmlE4#8|FV$$jibY>4wP5t&F9h$mvgn(9lnFZ zs}i!|qci;EpK#EwoaB=b*6Rf{mjhdF`rdS3)=&=O$t^NCMxjF!JbIy$6C3J(RJeUiFTUppVv0SIy>kbyI? zq-6%Gjf3eh^DLRr`ol-jMb3U(ec{e6&eGy&dqwi(VDD%jT_HDa09iH!!(K-nVuRi1 z)hdjjL2h2@^D0V8`PRpufy=>u_ub1IyZC(9aYB*m7E0q$sjeY8Tjkam95#brL#@{N$kEk*PF7K|IfJI z3bGb~ha@;(YRnY!EvB5;|qDZ;RBzl-qN~HcUmfb5K`!B>f0j}1w7)gz_{-L0vjcw~yv0~{gK^IeBoGe+Wcq)T zv*qj2dF!UxdsWd%!Tyg(7JuEuP|6^0MWq58Mu+#f?_ z3dxW_;hQSjg-@nR^P+nmKLv7Yf5ditxMPjDf_RDM{tg&NMw`y!4&g3U^bi6wm zX(+`)x18IL7hhkENe;%o?9U+lbv-=(-#U}|aQ*SfVOHpeLJ@_x-!~Qy0Wk_A-2f7VB8u#w;p(vGcsqm{} zeC-~N7<6&0slLEt697_wBbr6Y$OvYG1D;tj?C7HvC?6i0YrIRb`1ZvTh+UymCOJtm zRIj2yAIMSJ4Rq}1i=0L4k61U_5nDyB^X-Mu)|_G!ubioiN726#CN5blM%(M-%3sbd zGm~x#jV0!-h}yDTilHAO&ejl&s4uWxbL3Uq<-_~$sNi#)&!lmD8^D^w8^D#z;n-Yo zYox}T_MsBs7X%6!6651Z+|XlWYWhV1=mGt3#tQrgpYO6a{$ld>DiejfY@OzXMUTGt zcQy(!ntC?xYYR{1*`U^(AOO(FkBu56*ZT(*ifY|3fNkC8+_P+Me*PbMU^<>#!BMdg zeE<(Z{kD^X&6czYTLDX@_@VHxUx3xgs#z6j()h9~#i7R9%4FFdn~?{!OPH^`Rh2MEyVosG$)*@`lJck#BNNzA_&rMx%j3?S9{3L3DJA%1-Ek$8Xbq?K=3V`m6NS z$fFY`)k|VQzT32QPEXZ`vE!m8t262U`uAMT!Z*Q%8SQ*edR@2kDtyY`tf5YLnt@Wt zOTgg6ha@-Lu-nX5Y<%1;ryyQ*!p!eNXx>D-(`Wp4v4wd|Xyp{FdRC?qx$*JujMpnu zD4s>pZ&tORJ{3U$yxT|9fKmWRCY@ONvsc#`?(Z-%q>NV3Tb%QRm-r^cs7kUUY_c%* zv2U3InTVh~uG$8xZHgew093lJmtS0}uq??=LL!5ZwshK%tO5XX%KVr-2p`=S1^=mm}E-K zFCf6**6S+eJ9&qoh7lftUe*0v1_bNhzp>z7ekge2;{D(9!W)=maG=*K3nKZdjgTbK zBrc6E<*1^dwR2}Dw1mG788{JL3uY?Hct;eE*tPghEk|e#e=@u(Ua88MVevNI5(QL- z@ty$OMV|^uI|sb}H!Ow)O+TlA|0LxlMKYSWVSw__Go}9k8U5f{re|!kmc%z=$_~LlI|WfY^6RqJSI^S(AvE5 z6GZg*J(=jYRg*Ey;(?6O;UO9z8J2&$!ENY%g8-$!-SQsqPc|~U<-1HxJ=>LWr)3H` zqWHlDK070zPN}X!f7bKR;X!^#9%v)(f3hbYc=`JE>vuRJw3~6vonUV|)pmc`rqb-L znyG@h2^k-ZHuE(POQ1S3vOI?C^=qHUY6=%6qEDn|B}~_k!o5QQQ)Pp(D?1G9Rt%-f zCkyAncuG-dAi954ZVYKaCMSl6yjZ;5HTg?H+osBU5JoC35gTHD*?tqZ3(|2f@(y`s z?L@r6!AJ%aBslFi|DzeRM|B?~2M)N?@RUZ`V|YaFXxyK-z%}t59EEYHskI4Ba3Ndk z?5c8>r#bni15OmplfDzeVj?N6hbJfnEzL>$jyR$LDpFE8R{z?}|7>YoF{1ncbJ7C- z+xKVYdE+((EZ<(7D6|i7#s!@KYtnw;S@})-Wxg7VPU^Scc;=&c9N|?S^LH?ihrHPnxwZud+_ZVkde)_R~kn?b8(F~L{ZWrkay5#1YP;mI}rpD&qNQE zyg~Z)I7s>Hp7i745n?Mx#q)k@;R{e#v3lFC(gx=;71|Yi`n|m0q?Gk#W{#1df5P(9eu(@*AP2*@@HtCrc4pH(kKI@^^jBWHR z+k_ajD=7Ei33w(E@y|ZuJj&L{&EUf~1w;-Ae~qm&vJL4@yGCw;NZk9H(KyRU`~WYx z5#+#{7o1ExZ(kd;=KO3M$8$g3%5O8Vdn?Ve;h}nYiy{L_f7%*XOmEZ&9RCQIbThhZ z82-v?vD}-9Nx5^~S!kp6>ZlZ<2}hqydbX+$1TPv5D<4Xls+w||qCj#n0F?NW=#3q^ zPL*Nl1g14BL{9#^A%dx}vY5+!m%?2+23=HBh5mNA$@_`1G!!6&4SaBzA>| z6B~e2o8&H=eo)<>iMYq7np{as^q8Dii=HqRfiGD)ye$7>dHa5Nn%SI`IJa7{j}CNZ znK=0Y5i_&%)xcyrbsv67Wu;ntP+h8JbLei19y8*q@wF2w*ir*0`T#-1n~SD$v~~8a zApp9xL(lN5uivj?b;Xpr=kN@Q-%td}^*)%PXEO#r`WH)UN_oUCs{PCOOq4J{myzE>t$Qcdn}5BNs3l zF2MYm8I)2LeshP|l3i7W%tB7w#oVIlzCMkel8}GtDspnZy+<0Y240 zd&K5h)5=fz#Ff&F2gU!%1wdtmwxQaNR`ys}*mEwQlI5SuIT$&}v309kH}_)oA!=+N-D5^_ zQqqDe3=Al1Y!iP=+gIuhutCwjMN>muW~Oo^=Z>xQ`&*mZRPBmAevTma6_({WvMZs)N1v_a|=nPZ464<)bQDyHE zW!VJgRYzd}*%rxGcOTFn^8%_b{|APyXp?UIzaZ##I4Tns7<@_?vbea2;#o$y?o3Kt z*n1n`hJ@d1(}(ourb(--A7@jyf zwvca%jR7O3%_u7}>RzbB>f%h%@w$I&fZ$)x`Wh>MmD74mWq?@8Nd7ZR#Wf;SSXHPN z|EoO7t>$1j3KdCd;XgOzJ2Ii2>D4|q<4s_b%3u^vLV|i&NxIb-)2xCt+G%~Z5l5hn zrb0~1eb~q-a!K3bh{HQvJ>hc@H+GbEs>!?ZVXy!IalaT{9E=8p2r+ShX;oNQ_y=(1 zfyzLjr2Nf)1>}PF!VBFLiG|>OikcGbjZ#GMzx&%eRw=epQ3L1B8`&>gCQjdeZqmFhp$vek%0> zto;0>x++8>2om*zy-DSBh=;Fl2Y00msT@0hVip#KV1`{p3Y7K!)^6sB*IR!6zkf%z z(54!pX1dprAJ8vx7V(ug+Nv{*4BoT{89ZcL0^7@m+OozAm4Rq#MKv`-fIxcxc&(l4 z)0g4f97%W$1oDQ1gG$OrB=8C0_GWirTN^-+*o0wh1J9nIL+nRY_f(blOG~GtvC;Y) zA*bp!^1t1_{ghy)?GHX__)2iUlfKG-!A`f4x9}{QHb7|dNR-m$VO-X9as29s1j&`1 z3!MMOXId+X+2^qY$X7K0^(Q}5 zVcDc?cw~B89SE+iCiM<)JtbFw#xEjeJkC_fZql20({`%ZW%kdgct1I6$V=W;npY{l zqL(_^IxBPL&8zXa`7CMP5)9|R(}E7X{nVXLPC@P3;~lHN8X)$a(>XUUG6Rc7If(pJ za;0PlDXyPFAMrnNa`q>65B?S>#8*?9?`(CO9kNJlFF?ox1}@bbGosUTcmZVYR!{PFNF*r!f7D`Po`(4ZLIB0C#JQ>Bu?H7o_wFHH}$2`jir63piq>N2=U{M)*YP?SU2-+Y=f-4k)ZTAyy0QSLqN4HYw; z8n!>%K71|YS^DABRk1eFNz(ua49A;iQ6B?qTT~ai@+8LovqGPyJ^q_1STcU)X)y{~lanvEF5E6p+dn>Y zUElnL(W*DsU$3frZpAcUUexD&F%uAIdg*<`zY_*_9i;n4q<@C9l5!G{ZrBU4(>ovB z2G}pK>Pv-ahk!>C%QxiY7rPNke__WZzl;7{rOhJ;&p4h4z}`=}27b3%Yj7t;N&WTB zx}r^&*{g%n8?E^TJZ{gPJy4G&24FXYdDMaUre3bG%qq@Z4ej$Ofshm56fXU_z4-|y zMHJ`Cy4u>}va&ipbW-?|qJg@yNI#ACKpT;Ghu&V+;I7KY9!dKgmsJGa_`$K1)!xfx z_z;s5-Qoexe|Dzymg5|T3DNuT_%2Unp1+>!+Tig-AoKX?p~TlaLE)$Wkj)S6fFWOB z)^yk{yH3tzyuk1Sx;4_-+1X1pC-M|B`}+(s&(eJ;?(b95Z#j_>{Ay!f+WK0@GEY4+ z)p!KO`i_IYd)W~(T5mIrDv#oE-%BHj@ftY7HucsO6m_$qAd+H{p7;oSYn}mdCd@NY zfK6Ik=-rN^Xf0%-ab}VVN)i;1o+$W|cR_bbb;JB+%+QK*1yj{@-whRhKxTiBVb>=JY`JQf}jpH4f!ucC4btKmXW|~#GR?|QAP6T#62~w*NCS|HIbhqAoI<19)U>AV}*6|q0q7;tS3h4 z#UYZ&EH|A>?fkgZA1OSK2b43e(q-V?GapS2cNMm}+<>6NjHN)=M24aZh8Ei&s`4Wk zk%?i?(~pbc8Y(faEpvVaN9g6mZs-h7mxFHr5_&9?A`>&SvxP0I1V7&eIp@E^@XmMd zT920(d>5*}X8BzX0wj)oVN?-`(pe9i#kMQh(^+9MU~0D%cCH?wD)ZUMqvFLO*>g{7 zv_ttJ4pDGr_AS@EDmBILRQf()G{?-)d0%Z=xDE`MI$!%3C2_gTvB(h5pGfh!Z=we zDZMrQba?-f<3WHJ>z>8>cHwJ-Dpj=g9hg^Aa`J31MM_Ev{tMm@0#tT;7?JVu5jq>= z#%C?503q9r3j}TZH&MUF#i-EXNj*4(Ygca{z`(3XbxPgv=p>A4pZ!I_e_YIXagS&R zcM1(wt3b5_AowKI0tTxeCMl$+VXQNV~$`capUoq!Z zua+O;EJmgp2<%s`OktHW5oXwSSn>!g<5em7VC4&qq43{}ZKxuJOHV`S=a=-~s3giM zHP4L9gkDq+)8orK(xb4RF|@!f9deh)FDeeNN4;|k(jVu(gJNw_j?b;?W0`n(cvwb_ zRo=`7mQ}GK5+At-Mn+;kUQr%ocmCj5byD}vyblUWJ0IwaTfeDcV0)~%|CI(fIucTrXGlQv4#N5L z9w}AhOR;r^T^~&U!#mKVFb`lNaPpwph@hAS@WPicOvuT}0V+y(7TVvq(Y?oaB4RxU()|j1)1cz|H<1smO7Vcet5BpYg}t+8 z4Aoz^dV^Nc%hPT5fT4BPK0W-jF)m?Mt4Q?r+(?p}00?DcEduQWM7v%CFdqNM+r+FaWmi|8$J>(vKn@0A_N>_3|9Ah; z&`{*kdze5)Tj25Wab&wp9#F@gD0e2?1O9yu9paD{w-yPO?4Kqvs@+X+({i8So2Vg<9aiJ=iIgqV^wkW$>U?%Qp8!0;6>uXy=; zc4|y3q$>*x3juMS1>iwJp2usW$r(Pcr2lju{H{=;dL($x87RfS zhbFrUJPkU!e_hN6Wl7+VR~j8D9&K$ElbBv4C3_=bx*zB~akA~R>wQ~~SD}g=X;U>T zZ9DR%eqT9bEtX%1EE?O77eeReC}w5N>(x&o?teAy6(&-GjmPPqL*IN_IC+i^q3XfT z14=0wi1OzV7?5Vd4(c6YP=p$|o(pRN&}x={iuIuFC|vuvG)5x{AOq7X&^{afs+UL- z0s-x=Zu%lcjxa2KqSigXH7xu2Tf(3@w6Fr-`9Tl3WXXWIqp7Ls=jnMMBomu~HN>fxYJqvGKW@*jA|a1ZvE@*| zx^-w1Jl<;i!l8p~fPMuWSx5kr^=4PkpEn5!$+A}R>-N;VCV@73j?Mn|uYZCb-Vw7S z(b9;bmsUs#kQ>3NK;-13SY>fB(9WNmo2J_PKnmC31Rt1#?sy#|($Wh%63<}&t}=hM zInvemvQqs6m#{=O?0?&El!Z2c3-rv1y}`OZdHOiV$Izpc>( z`w-(ANZa=G_D)t+#I3e?Zr%6@d7U$OdwZK(TGm!hoza!@-CZBe$D`q3v`UZ_SD!up zzUf+MxiNj9Xs1d5$RNX@Z$4Xxnv9$AY9Bi6y@>xj$N8rz?{dWV0PB%m3IDUJW6`}s z6vo9vha*VXPdh`1%#O*JZIv+mIRad`=jO-WE_^nkQRsqdzou=OSVKB*_0>463In?B zq}4-)lFL-se%F%<&ELD&!MYV_k>-Q|>)K;cIPk+RsMW|37}7`&LP?Wt#Gk(&XI)`x z3%XgOFZN4%z?x7NjZG=UQvcxAd{>vuY)HV%WCOnM#3 z)#R}sK47#ngDES~sz>RU8;(GBSJS}ne5tWCj@pvaPl|9$Lb7|ii!+DD#$L~t+{S;u zqZEXnpInYp>4}EjK~8_e_C>rk9zqKO`*RF>XmxWs3U_i{4Ujp*xHAcXd<#H;2!S&M zlKH#dt;4S~%>zA;%`DZy#%_I>15)2x6{gcc{gv#rb4Y%ONd1$`8!D=3eqegN4}f3b z+&ovG{vW>5Nz0o4#eb9f29-Nxl7?v)G$wrXUi@LdAo9M&jy8~kVj@u=i@_9yw!|Iu zib9>q6@<$7X0>?y+?j>YeWKv{$KWO!&8SwNzNW0Xn zxu-(uUH2UR38eo+pM)llAEnHX2)XVCxa^HQ<+!#(&+Y>z?Lpz}In17SnZnlRU})d@ z#v<$}vy1h6bhgsH=^<`Fx#7r*YtL1ZOUz4fYxG8UUFSAKf)gk*=Riwao2$M4hfG7m z26rfb1o?+7qaxz$<5P8eHlYyAnx@t)t&JNWl9Qfd_t-1*eslMd%jBHz?GV1;z`U2k zEE7ChfhmoJumj&zM}v4u_=SD>DF%?2-}sCeoRPe6A6)vJ{X`9K{42mCARzGmnBX~D zkOsXNCk;V96uA}(39=4x;!YCr0cwTBJ?o#v8j0|GyxoW~51vk)&d}sHwRJdo_+xMDuJ3WMKwtLf zoBVype+p0j z9o%hMH+j4;$8ise{Vb`Ywa%XzXYW1wltk1KiD52><5;%{EB5{Z*+%0uMbYyHt%bkV zsaomUzmOBFBqvMxq^mt90&Y%T$)5z-L6MkS8ERJD%Xr;uk{EJ-X2MSO+FX=|Y62}S zmwy`Qd~`T9q2TaMiy6yU+ge%3B&O$dn9O8-SgFWzqwm;E7~1{*oe<$U!Qg=3d(AbL zJWCbH{)OP^RrD(s63Q{Juk`T+*%xoNiO~0TW*|ts@?X1?@KYHOFdtYA8t0oL}7(T9j{yJfS!WZ;1ddaxPqjsB(t$Mm5_-_({I93pkBxqSwt13309d$7-C4|8SZ*AbH39K|s5 zj+)?308xk#yV-cA_?8_`qCTz@*4!sVR4G?4Ig~ zPdFJOcimQU&bTOr*@%9co6D@dRl3Dgp#$Ke^uLc-ah0bz9 ziAj^hkMHxm5QL7G+niBua9V|ut`w#yFRN17I;5<^dhv_|CIrQd802~jii9DHUctBS zQKnggfTL@X$isK#uQu;TE71Y^@k^0L_7rVdQOIISVCA=Hxze)8$J4)Jerr5$oHX|x zb+rt6h+CW|mnYDX&DjM(B!oVTzKM2bnV!0#VZMIP_pN_9zW!`j#UJRcLH!TVZT(wc z%U%8=y7CN{HtrT^ye2Lx<*1|JCe>FOd@1q#?Wzx-bi5>=YdouQqqdK0-nZ4c-^r7n zed$j;%`5iraifs^8xid*&xFul7f~}u(54E_C>z@q#}xYY-^*Z}jz%j)WKkQNXfpJv zX#jB~$q-o776)K!9q5f!cL1P%x_Z1W5pBh}0L*uAIADYX`9vTUaOdqAAs~Aju7v^S zh13u+BvHNBx+RFeAmoO_i6UD%F#hEfyUaZ4*n|4S1NT!v`vFgrYf|C4$Vxa`0=@3{ zW@srv#{w2{+cVH=mBfy(~*8^KrO4K zBp03;MpCKf)9fPuYeNtJs#`2g)98>Sbqs7M{Grz!xdN;*e>pB$@3c;v~`bYln_P}OG_WGxMHqg&(N?cslxsE29zcL>O3^Y6nciBz{RpaOFse$cAEDuu<<(ZBI7?sxip+-l z)KsWmeiuMS^+IQOQQvkF(x~F3*>VQ&%j#rdKSTE$Esmyd*_I@*7R;u4n<43&hNV5> z^cyEKDLgowwOdNxN7%?%AlKf=J{sIrPs-=0EAYyLNwFj4t4tCTlXlO6)5Pp#urXo& zw^xK#!bz_;h=#0_;wn!aT)26#(ft?f_zl=82_w*e?a$okmv)MAq}LVw8A8J9QzsXf zbmde27#UbYW0Gs5sLQG*%Q?;e5t^n>H8Z7%a| zhP%h7-+%tRjDD3-n3$9E9bmCO$FBwa>M9ImTGVfmpu4m)q3HNH=nadD^rF|aCt!th z#vy{Zh@7`#_O%C%xF~c!=S@#T;JqsFie~{a+>nmt_5@2#CJ7x?pBRS#2WJ9cLFJ-G z=fA|^*W%@s-7I)soDuyt@<*HiJ<~^R?c0+R=$#f|YgcsND0+dvduYF&cvG4tTo z@_fa=NpF)rosYSZdnj4NFgR=EZzlfUZ&+0cin#U7G5;vi;?)Ky59guD|7h|Vh`q&E z0_kH%leSvn7>1ZP+wz%Fpf9MR+Di)S`HYENc-QM!Ybq8-dbJ3V0tZ37Pwdu=YlV0H zRz^&39gAcCQN)qHCfC~}vUXrcp4yoc@REd1AQ>56*~p^$;pUb2>|3dT0y1MU|@a=HXUqHySc!#?h-v1RN zQ1DkyK@LlHp-AeyqP4>IXRss|OpV-)mv8NeS1487-}>5A@~Z%?^Q(+z>qC_!d145z zYK!>FQD+Vx8DAt5u1~NEIg^U44%yU{0SrzzF=BDgZBkeCt7JXpCNe+zZQk2;ViXm| zVjCE_lcKP(x(3dGl&lI!MTQhZi-8#b)i8tNTvGY-afm`-3-Pnr%!)_hb6|c8Bv^xZ z+tboJxe^%~gU=0rJvKPioLObFyfN{Cgpq&tMg&0Ur#eq;Om6n#B+*Pl<{bPS3I5op zBvU{?)b>5pWWVHc=@TEAVJOS&v%>p{^du6ZUG!RN85o_%3etK2n!Jg^@Z8(xL23U> zlp-V6O&aWpxy;NG>Hn+ALkAX?hblF(4GNH0IN2{vQTGBbQevw_Ojvp07Sj=Q(v@o7 z28G!!1yUz0?t)i2LDZ}W)4)`(E!QSjVC;`?0T>xMbncm(@Rw=9WHf?Xyd3DwA%Y! zM--=_D
        nl}QQ?t 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 ofm0sh($ literal 81928 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Æs2sk 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

        bq<>6WFL9qaEuQ z6K?sii%+ltYBLPz?ZrzD=?G!HE`F-*iwic&Q%{u`30bP8Z*nmZIw~ND&qFC5>Yns7 zY~`*=%;i&B&TcBg?t2L#NVk4sJ_i2GJlO$E44BI8e{|NlwU5_&;=da^-lAo8?#PTM zV{$7HQ{P-2#Vh`RDlsF?Ub+?&kLNFWKB~rBCd<@ufRee@7%4$@a)?0tFVGqV?1oAB zpLf$ZF8H!r5>|A9Ys^iDt9OSZ);erErrdvwoUiAeuqC;ZG_FXCb83mog@3e)kX0w+ zLBOAr-qPFFkb2je-Yy%CT3Xg}h5t1i5j|g2y?ZXiXh8+U=bv`RYUQ*==56_=IE9~S zs38cdwm=kCdl45m#Zxt3LfE&;cSR`@j!jd}*9z@L4blOW6kPBmMo^y3PSPV96%KtA z>3!+QgIJgcZ9*`TpqV&qCM^V5Q60(|K74MGR!mS|w>ULVll*4nC?f@y!ND3^MH@>(c0Oz6~=76ZfELr_Ya@&bV8JDO9JOLrUrL!X8qE^3_ z>TcG!WS=TLk=jj(wy18>dlbCV34#!`9fhL{(ufFsHkISX=z}?K{#gAbif%~2_`JBt z4(Fo5@>5JrsHjYZioRu3!a>OO_H7V9fBRIPmLham8!XKr-o~16zkUb$&$zb=Cbuu_ z?ae7FD*Bs$kCqcn=C9v*=YjA;TaD&oGYcbc*lrRi??d1byBch*)uRm6d4B8lgd)V0 zpv=PRFcoPl=$2lZlrpYaR1aC(8mGG3c1TW2+*8*54aCDYRDwOZKH`8l=qtnhapXMx zcdT4hmqYq$aB`QmWBqn`yOio12Fz>s?PG{U>XZ7NINa!#H>0p9yxhxGiScM~vA5%| zU|VcGF|79?VCPlvqM#c|p-&xNhlNyCa=D7q|Es2d0TyXSdP=NQoVVD6N)Q$8}+h=TTdB=WHAwZ|E z`G zPS`bTbr~WqnQry4+=XHWO_mrur@U<`aoE=_9Sg#%JkPgY#_n5=2?1(cD@S@zs3j(k zt8{ZndRjjVs})kmj2dJdOL&EcUaBSidxci5jK&U(`^cCEs%<>GT4=zm_qRPxO68i3 zDZC|C#eso$)myDCSnc9Q1Zd_lVXfcznAW8E)b3lx@z{=r7h@p)z83U^%R*sT-{?3; zE$J~FC<5WK0@ckJKbAq{hTW2gYpbA)SyLP?U9g3h(a~N6B>b(M({bQxvD*Cpl^>T% z2xm;~z~Li07aVz$*gHE_dv9X1k@ikDJxMOsDfff#=npo0%gO* zR>^rUxAN5xEY>%5_v4jXSEt!PZ+O_W^-W_`9rlx?b$wi3L)ienV(gyfho~WpZP)wYuKRO(g^Pg)ajZ9?p~VS6yx%pM3v4;g4$5 zyLzL)4_inz!Qq!iHDXGGn~`aU?v=I#2qm2pJg!G<0VsoxGk*ruVg{?-f|9#nLV6mYGsv?g8#!S zMpIolDpCGRCD(i}hxjBrt?>rtrGOQjQyzfmb4*j!8Ds1{AI-13yKk9*Op6$ajH}^K z{Wp(h^^!#3N(J2sUXIWYwmRN&-fyeX@2ODuXH1VxLSXNp&-pcv37mnPakGDOWjaBK z;ceu#>|v|6cPx_zYH6oiYT(NM{`q?$2A~3G$DOfzA!()$Kn6A%?NtbMT>RpPvWCvU zbZ{B*fX@KwJ+$}dpfr%e#5p>QSg9zIL$s7m6pvU0iU1~e9?VsN(sMgefzQMi-lObl z!zk@)6Unqn!A|r~#*rH&cW`3ureu;7vncO`iLE)PH7?tYA$)VbOkkhW3nh%D8jJ)uRTy*>p%T!S9Rd*=*k)at3 zKhNbJH1c7KMRu!iwXgOCwHD&(hx~KtQ5iqI2Cx*F<1gnFU~^nZk-Ojk5& zY)FgN>w5evbD=)rJ~{USRE%_2@iBik`Zl7CDpBrlF9kg1-(Z;`D**7rA5k8mmZ

        FW$Jv#0TJ;Rqp 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%0AlJ`vVFBwtY9@W)CL}sqScM%KiMYZF>m6 zqMU#5Ttu}eaRmsaEQn&BV-;tOu8G^eZiSs%LH>ff?|xO_;hgA^0x zdTZSG3FH`@Z+ZU~N=D{=ueF9Xkh72c73Hc1FZstj&h9-jK~dvH-V6gZg~jj-;2jSZ zUQ|v5rfAd`(;qb=G7zEusEr+}jXM3DaoqecJWR|(fasgm#BXmfpFej(Q;A;JPb4sP zZ>YVgn;c7@{SqA`@hp3Hq)GN`7+!WRMD4dlxEphha{CXTM^y%{r`7w^>>IiWbJ2q3 z(b14Vl+2O)!wPK9uLZH*>T63#cY?P?us}CBISb5CI1Umb#J}2)w%w_0tFt>K+OHl> zQ%@6S`G8}e6pYP}#R>8t>v+}@my@FSgv_|1;7MhSF7Q8I2s_G_kSPM0S?8sO^yp zDGS1?mdxZOM|Q7aXg!lya&xVq?ZQk^7&8V2eFhGthQ8a6GCcmMv+mR*8;4g)`cN`_ zAK~%=ftcOlhfLJt(9R%?;so@wFsDCg*Uw5=+3kgB?<4wvqS|dpmwt3xw({sv58Yhk zm2Ny9Y@hcZZJ=XEhBuCEhsQq={}H<>O0Z;JSA=);*7t=ovBP(IO2WjIq5ZUW7ya$H zB}*s&8#p5F{4dRYBt#EUAx{QiiJW|2-G`kut2d$?^b>h|T#LSAKvqMQu~R*7z|6{b zQdMzx5|oe0FN~h2U8wJ&E1Uz)aaEWQs0gT#xd%#lMnR#JuG{rAR`WgLwKk99@H*B( z+F309929h_VyBhBZ|CD!sO%(9A8`9M0-%;ak|539qnU$w_l(x+Bg;;~Nz1Kkgzb~9 zDA5&i{=r2Y#tXxN-xkmqrz=pMv2@wT6av~3ZAdPKcvx)kPpQ%L;l9?#{O^B*G|^ZaSd-((g?OpeL+ZXCN17_%Fu! zGcXf){a97CbuPsaw8(wN<^Q?cvWy=a>?Xv@h`=c%Sw=PGb%7*kEmLZs89TbV@9jn| zWrh9K66$;>_W#?Z7-o6T5m7`HDHDLm=7QHmga&rlGzi-cA20pzhhbB}s6j5aKT+Ck59h)f%*)t>!62!2 z!VxW&NWTN?P%IF0VEtn=>e3`#WwZ{GeUUm<=%`$1qPUZm(mxn4Bwy}3ymmLvy3ZV0 z6ZUCjdg^JoPPi#VL=L~mPsa#b8>yha2Mm8FV(^KG?ZsgCqX@4c+j8S#`OKF{@Rl;^z`pPLuxuI98`4 zAdv1;?vwzQ-~np9uM5<|n#L@`F;dZ+=;GH3M?8{U-1)R_yeA=(?q_V8r;SXBf3t?) z#5#y$1S6{_T;mmg9&olq_GFY}Ygk{mlV9{jNW)5~hVPZ%Y{wlSk0_A>`1ZOoM?x|D zmx#ibs&m*@78?Z=DI4WdG~0%_HKY>$1R)kmH_*nJ6Go@FA1!e@uc zwInNh$P>-WLfG5Oq(qTiie4T_#X6QKrrvw!*y^EAh-3n1jLV%I4Ar|GxVxhhKlE>F z59JO_%MPgdLrh_6MNqrtLGqIN+e4}q*hpxCrpa?GqR|+s{;^d>ll^on6qDZhUGg87 z<>Z83JR~$Dj0Aqrrut?Yl5Qye{O4;%SddUAkP^73O3|;B27{%6krP!XyPYoG^9q>} zc6I=DW1_f^EVUFC$t#xKAWomQCi#-RT=79Y?`J2?jq#G|BdV z-}wA!u6l8=LX6?;?Gsxs6jy!*r5x8r*z`4&RYiXF7JFBAd1xe8m9eC?aBGyJq8dmgVHGkCO9mQ{L=acP%LDA>G?I%@EmPZmYy=hB`Qy z>UW|_A?;q91bt6EfkJhd@0JAv7(af5r*oLBGcAO9`|_%o97N6Kgs;j=V=K0)YM3L`8ko zceN$r+36-+Ox@HP?^WTOgsH-B_ov7-BwP-0vyav2F+pzD{Fc*drI|_5tNWYy&GBE% zwRU$v@;^n=AD>AQwoTLGlQO+~`amsU-S9n9PeI3@dLbUObo zn1A!Q89#ixVoTN=3ghnY4odv==_^A~H4>@A9fpS^0y>jX>ICtI!KP*MB=?Miy0*`5 z?n8c2-XAXh_3>V@@j)5)?k1r6h=C~u0Nr08K$ERd!lB4#)tm_;*29?2NvQmXL*;FG z+a8o+$W5bQDF`L+f2_V88qf&qcbfVvakgB?VCDB)a<0J^*l|=@=(>j1pgX}M?spSd z{vVeyl+xF7jQ?-w5o#0q)X~!M2ZYiULK*H~^nl!GdC!@%b61w2B+t4ow*S-m{TmYk z^etJReC5JUy_ZC=hfV8Chan{VfV}!AZJ`B!ynC^ksQY)aG81p@WHJuQfA^jmX04sp z=2?M8r|wGu$fwy`!;OhzwJ1lm$9s({9Vm^^{lYhoi$1mV{9UWZD(i$k;oFnt=_tie zR4i_O?qG=`-jN8oOY*);TwKC%MOunsSAs4<2r8L+@RhWiecd)_`%?+(-a%Z8K`HG( z#y@&ie7fknwWXB;rlY8$qJB}Blf-`ZQs?LIA|hSy%KhTq^1|zU)vx|Gry>&4T!C#+ z!>UYt(iDHbM?`&hHl!c+*L4iO6Iz;Zbj>XfMMFcem1x-OJ$U=k|`vH)b`W7isnhdGT>^^H@=yK6paJej{?kS|c=x zPrX-+>vpogOdYh@F?oW|(EO?a5!=+?X)WK}l3(^OUdINVb;)_xMW+O|$A7j(U}%+e zX8wCoce_A1CTXVCZ)w0KG(4*xjv{50Q7u*DX1fWGMeOgrWmQrl6=MkS-5BfXv{fyZ z<7+vcoOwF(FMS=1B^TiFYSy#?8MEa=@8-aXD!oTgXdix>R#Sbuvuv3*l*uJjrknds zBF(-{F~lPtGSxjVhTS%%@EHWN_DuNFv5O0T(tQr-k81HCz+Do1gN+8DuA#wu()^E?^^!B$^D(62zoCsAkfHAH9tRP4Hhx~IdZyxMG$iPURW#v{nxZv^}tY` zeFEMS|9MTwh8z5th`$nMzbm>q>kI3$48Ok&{je6Qsv13Y6Ih9FwpRHYTg$SE`NT2#?yB&sI9#Ur77aBDi(CDD z;LqDj9$9O=t0lo)zglVb>nq8b0wP@%Z>qV;E^`E_@(TEM`G1o77}$fN*zzWf?ghl=z<}IR1r{*v!=D$)vpJxEpj6L! zb{3zL;Wq}gW>Sk4VZ8?|Oc%#(lN=zB-r0y$h`)0Q5P6oqkpaGqyj93kwHqkGxC7jr z+dj}ZZ$69lI5N1hGT{-{sQEcTAhK<$pWD#hOvyYbmw=SiWKevBbjR>~h;8dOlrhFN zOBk7fDvX3Mhixss=hz#H(B8Vb%cV045ElM3mOD1q{n(oiz2q#VkfxMpzS+W`hq2tz zziKLh1eYz?-73JZOOIam<-^i$aUCJ9x8kDh>Bo-=N)as&^IfG^o17t{Ww&Wb7#|rn z#iVchODzyVsbJva*!M<Pj?>w~9zh4Pc)=AK$+ zpza0IABHs-<8e(T{%BZ(zzBkGuC)jLuw8nDT^N6!AIW z3I-L%v(F-l&Af5Y0-*bo;N0}uB0dbM__7Bi8v*;rYsJX??Qr!m>>$yTUW1B<7Ddbk z`+-4wV;oivkYYmLIr?w zUFq^OCyX;v{7_xlgf`b!@xv!vW9d=n(%F8;p0NC-)HzE^EAQ`K6?d9YjUStd2&dbU zwdPrAcDk`gTkum`TUSL=85WgBDvQb*2(=tZ+EU*f`Io8Zz%}L z5BA16z5cBL+H$JGGZ%@(BW2{cIp5xo7j?F))GGT)nf9DqQ?LTkF|dJ zOoeabNnfvEy>XCk^ckbzry;m@pU=1R=Ud}is%f9dwO@07kS=u=218`kKBR!PG&E#! zT_`jk>qFM^f1gVBkWoXD=Q#WY3aPGoF{EDayzFDHwLq|c3Y$wM$xnpLu!r1ODY2{5 zkjET99?;^Sfq-1^OIEKKr-BlbqWW<|sWhR+B|x$kWZls8H4O#+@Hm6g;J5!6S<)d* zG-ZJ(LmWHDy6+ZN#Qa~qep&e6U~(HTc@BqQbOxJ%yBo$Lrj$MH{C?d`sHU7a^rYKv zN8A-w{O9CAtO(y4s6iYaTJgaBK)K$1ND6w%`Oo%St^3#;z6Y;n$XJ11XY_9{n<^pA z7}kH0Ge3KCf1hFrofjt!Y?-5wPn%$IRF7-#b@1O#o0`A~O&3vvSe}y-$gSazfqr0@ z7r86i=wJpK@_m&QI8_K^`4~2Hs#mV!+!cek#V_Tvk5pnx&tF`8G!Ru+N~i!;zX+6+)&Ap~~_Zez;{`@4HKU{7OY(-@F{`MaJ%DE=R7h<6a{b%#>sH&CGwydnlfN6rgtIOPZ>mj{U ziaD3V58gLihd?!UwoB8VVANH!*~-5I{}p&$fLRVM81Z5=#)GFyc^<91@49($Kaj9x zyk!Iq9X`SCF4A;%CPaT*UzalI<#+vByw(y8+^kPHo@@CBmGTi*G(YNI%CCyE6W{~% zHI+zm|JZN1a!y-I-o-S`Wg$$VcLRMb=^az?u#y0mEZs3`Xrx;_K3~0ge7xLi988r7 z;tWGCT#{uXZe&Dt*PN+brb9l@ioRF39cMFfx3MWfYA}AOsIZ^RUJ`aPfgC{W3r_Yh zlRnmv{!eh{>EAlf^yq_X@)^i_AebF^KEz&i>usWRfs%e?pq$vu8nTnOm?jaq;^{@kSp4RfH(h(Ruip@c<>zd6tHZY%PufFfyWE z!+YM}&tZV6%LFlja7ftp-7&hGc;nmK8{3bk?>5@aue6+YxnF#BdZEwsx@hCK^)T6a zL2jDp$-8Hv6?>9T|EJUs9^NL%PV44n8@yPHLv~DvI&_5*+pW}lgzBlJ?X-mQ2}w5Kw?2|_ zflG;-oqvDX=I~2=qz>$~_5bE}3i>?X;y&1&o|T1lK-8MjXxWw;p8~Q%j}v1|?Fv}i z(?JH!(6dL6c2~Cc*ozK`?EPgH%z9E`;(#ZDPKEPB?-f9?QQvy0!-si$24h_IJ>$^u zkll8aTDsmdVNmM0Vj%O3juhvZ4elN0^dwAus}`?p<+b4de*Xz9zXej=;_n4;qWXHX z?9OI+*c`l?)Cj7FCV)AANMgTk)xsrHLn>74K2QE4coT`e{g2smYV2MMgBg)dE7z^v z#{yr+9Z{azY-I(lg#hHLoTiH&n44K97H%~ zhtVmiEQ+QU-oKBabW#z#r}95ZbY5O?17Qm4qb4!>Uj)UDC1MCFwpceUBb&C*qG_1j z)o0mMOk=Ss|6$PfzM&aDR)zCj^plyV0ng`w(vQPrBqy^aB$4tL5-gY#;EOe5)jID; zqZ>xw{o+@yat>W5WRIN$VVvpszX?qUVyN~n#kCGPT7A<|G4dEgR0I`}0kQRzImrQk zq}tT-t~voYn5z_{4ir1Q!~w8YTgqA$v{*Sw0XM6N=4k`nrMiN8_(5FD6hpvV#NV%AQAVq&t( zn$9oA-m_I__2)ftk6fqRbbct|7Qc^ar1QW(4AIhlgIKcRT68;`@^ldh&d(gsH`E(A zKrLFEs66?{aNC`>WW%xJ$kvGw8F3nic-Y=@bqBsm31VHyRd-UP0pH?_F0wz z?{NK5j#t4J+q~*MZ#hR3N3i&hlJ;{3$3HQOkE9*NQ@;o=VBfW|?(xv%l8T*OWJ)1MT zI<-f5i8wl-i1rz^^fqbFKr+-Mv=(znCwa=>9^X!Q$+w#KB6u(16iAOpy4 z!10}6;@B&>OkTL^NZk8--F*#S4(#GEry!F^j+{t@{EBQNA}_sPa)nH!R0yvL)Zj-K zyw%Hri5FEUaiUV;-WUNp$3m~96pa)CO6r}BjpQ|FtGl(F2ik~{`uMeB(AUoqQ~a%V z4ihhQka^zZ1;i^bB;^)j*COO)?=nyo(p6Y}3##SloSFHnA&d8FyT2odCAu?$-1Uhg zPax6$6fb}#{iXaQ57l5;ims3?5tAQ};O_^mY8XIAXIkSj5!ytv(0U>kk~)Q-IImdE zIxv&(k&nTMH@9JGcQG1k@p%?22SACCwtZ4Q0N5dbx)gzkDj*svU)EN#s5sRVCb|Ys zIle&lpti?vt8uujcFr?$Z3#Nz2jxA699aL(JHKcU=^*%Cer(~n#Afr4uPa))Aeaaa z^N{dZ?HDy+eojT=qE{MKV_@Kg=2m9SXhk<7_ddIetn{+PrwT3F-D;}#%o5*KW1BrA z7qN}~3nLQ(sVm3)BJXzLc_X+<@)#1zG7tr=iV%yc$Db6z8Qf6avjWU>{kehu_-=_u zc8bAzTzR79jf4if5f2tRetzNdH|d+&fh->(?V&V`zR-NgK}V$M-H zxM$gIt2tpizLN?FoU@+0>k=uidD^rpKnf2af-l!s*0#qcuU)`tXkJ27QCDOc#i{w1 zxXrfvlL*o1>{ij(ch~=3d|3W6kIjf%F(G>|o0y%QM$(_i%i_zo*IW#RfUqMZ|1+h9 z0p4U6@UjR6DM29U0w1a?Cf*u9h{8@&7in0$kffVP`}8T+?@n8icoEDKGl6eS`~;q& zC>hFjf{HwQKIpC6YD2|B+U0ib{MK6PJ=lOC4~J6U*Nq@H&ZNBlE7G!UuzM-1yhQZ+ z8HA&4?I2;)XFgT?)%TaX=|$w2f2*b#kFJbp%A7dP{E|e9{EI3mMTa^O?}NM+rs6$U zA6+B>pOio!9?KwU;Ixjtuijr^d0|$B1?G=3__boGaVNO>Pruz~`}58nvIF}7YZ5;& zh;09X#K+3!&M&l}TG3jGiWnnFvo7wXa0}g4458NE41A!p>tD({kBw@GV&rDOpkQ89 zMnC>P%y)AY(y!87cvOx>9w=VMD*}3H#!Z87E1m+VQNAt(5XEiet;l3rdCk& zf-}HfJg~kJV_#66!VS7HOXUEsKd-U%xOq!Q9TWX9(h&@Q8V+c8oRl>pM^cqDU1IuwX4}8jAyFO; z*_l-%U2uVpfv1~FiA0_(UmI#I94w}ETRojt^X9SJ;S&WuJ(Vh1Vu~n11&Je;tQfn9 zY0qM?`VOzP+Q}@CA>cHfkx2zW3z9D2LUxA|H))Ot53&g)?qG?eDC+MAtak6{E)WGh z6FV`9iR>V5EZ)>wRE+&6N2R*0osH3B7Som*OTQq7O{ql2iMkb6`YJ~5e1Jv(tQAAh zwYQAr>KDRG`#Uk6A3*)Z(SN|Shcpy}UlGmo(?tHy3{D4ceqV|GrhFn7Rn~+zaFO~g z$1Oaf=r&nAif&cVE>_1eE+g!*>L~l9-xcKurw~gx(7;T6QO1yXb~pmASpN^Z3xw9_ zbrJ;8{*BRzqEP7KzGNI$zFkNulhGfk;9RRD>_{YfssRGP;>PCHJerR?ks=R>@ZCEK$bPEb->R886>DZc=Ws$2`mgfT z5f0!K17(Dxs13m>PpK33!y^aNJu8%ogcCGNBF=+B9E2@qU#dpHS}yK1V2BMmhvqjG zuo+~B#%H49FMzD2O!x-&gON;%db76i+_x5T>=8OTy5&imYMK7iZoA?%S-qAc ztVe?8pU2j7D8kt86M-aU%RsC<{Jh(K zcUVLh6kiXiji?6D9{cqY&@s+Nr}vZOy0VtS#-`H}DT8Qt<}{_DY5#faePkM(q1zP~ z-P7_wAk`l7@BdpQf43`C-r)|FMc>JW6?Cy#*ovz|bc z)a#|;Q?7=zL*cLZe|POUTo^?B_r_Qz_<^`c?xaZeBejwq62IiMjvQ!7sG9BlJfs)P zBsB>TiY4O}iBC8gkR^hNLRJIrKiYkPTzFPjQLH|q&Wy2kmbt{s?PEejxwx^;f$d}_ zt=*}W4ND#>n@1e4Ju3ZEUedY8m~HmaNVMcKHPrOmaYieGI9(Y1n%v|7QZtTzpCnT4 z6*19v3IQ{@vWXyWpcY?bM1acoO7sdHgbk!PMGX9Re`FD^0-mM z!?u5(1Z~*LDP1q!s~s|P7oq(!;8`#_w!q|27DWF>FEx??2uQ@jsaP; zd;?4P&-F*_P^MubF-iGkq=5uwFdN%>j}k1SC=BpPlg#&wj!?H) z@oP=_;2Yc_S2fy|gVK|(yBNiu>$B1p-hPW4E8R3nIa~wx3RVyYeBDl+pC60t1pe|l zfaP;lc==nSN35web8{l?qOZ}uN6zfgGbM^AQisXtb%3}4t&oLgL~RlLNs_V%ool2e zTWad-{@B74hm1%L6O3jYC0!pC&fzYj@{vGY!4J%_b?F%Hzsq>XWmE+ zi)SkgRs2@kHk?7Wr|j|26M~3P>WN_iEKZb=Wq|DDUQ!Y(A0KHF{?S3n6vwZ&J8Pt$ z50ip-8QQcPR1oJFV$q&ro)?NN*B3I|7N5OliT7ddcNW|%J@V>Kp`@iC>U4#!WD4H> zBHK)tt032p{ZI{5RNOSt_sQ9fs~Mj`nwggThdgQM_d51NJ)(_4-vwUosBpnWdJh<< zA>nI>Cjl1y?ec47&ufKu)b*McN)Lg& zL{@y+f*!eeZT&|=-2Rv==WKu#mw-}T2u`i|`JVbs-Gji$Xx#_KrY3>J%0j)CHLHSO zBZBCKjHG_m40W|-Aj7MytQD0o1i$vKvwjHXB#W3MJ~6Yxs;>fC)s}s#mBxG~gSN-l z*mp}#{5SUIaclR_N|G+SUDDNZb+9ocE$lRc_F-r9ChrRV3>pl-Tx_=;?kLw&9*!Tp zF}oZN6unOVetA~KqW10>hxU5fVeaconHD!HGIx-*`l9o1_M`Xn{3ltcb;zTyTNDVD z_?LoQOnk(5wXaE~wR4Fz!k}kA(UKOgd^J}x#hRSxrEVsx=PP=vwsWxp6I7iX zCnB>9febJBj2pQ9C_x-zM{D)B6ZjwJgRJbAc~Gx zn0Z%5*ou}^RyJ*LB8zOXrTVZRtjM6z5u~u&W9n*QaK*U$D+6T&yZC?NyXX&s$d0Om z(5}>;9hy@0e$g+!%QPnK>gJ7M;aU0i64pAr_#yb2;l!ty$Rn+J)9jv#6tmv8f9nr# zk8PhV68N%jexX-$Kz{&5219vgu>?AKw+dmu+B>c3tOO@iwYSEtXhYEzMT3;Xp&><{ zbKAf;KA1K(vtEYcyz=NO9y3!%KkA;eOLPaKosG(?X6KYJ*oPoi= zTrSP(=`>}y$R>a3-=xGZ&9v7057#6I_Qpd*+l6ET>hS*+>^c+0=g;?aH+Wk=N%>a`wF$Csbh<@ZAfz?c38`2X?dgHlT7~7U~Pg`lfSf` zt9I1LmFJHO`CK7?FxHa%+55En?-;9n|JAuWyvnP{M=V?RlTv$6=-Rc9=SFrQ`A_}w zbDzo|bk{vZ0l1f&o*v4kvA1p87P7OmsfNX!jc_|P+{W*kYp#L)`}b2tz}oUNAFVEU z#Sj$aoVZd^ao#1*%EY#OnW}t7_)oU@5Z>MVD71dLKa6bsCLDQZCDeJU69k635^!ay zb9N-Fb1C!k{`tvovYF9rqTGrVE1*Y@9xi3RkdKHmm`ldj$&`Ur`B^F2?3a|Rj)rA? zxvb9H`ybYQm{R)*zfJI|e5g#M3C?t<%ACt1a=H1JSe9Ev>I0oCoO&xiG0gedD4)-3 z;MPzgWr<;3b2K|C!>&P{}D@b3N(9`$}wDI&eL+LH8WtsmWU*eA02 z&y+!`0Qj}4`SnYX{Bhab%PzYNdLKIm^$#D0{mIENw^l7UOwLKy4eHjd3;Fr^F4v+W zP+9PbmycwATdy^yujTRW{0=llMW8AlEqzo1RU<+ig#O@w22l6E*TbleZ^A2oxLSy! zLg33#5m>!{*%BD4WvB?O%I9&{I|t#^sZ+4<<@PZ4OJ|Sog}dsy)X#XXz1y|EkZ%N@ z{8^q?0^Z0+@=s4sr;`aqVi&>MV#>EwmG7|R!?eZQ(jywu^kC6$fG{D?*H>l}@^{Un zBB);3LrH#0J>dsh0j0JbPs^-ktr^4h2)P` zKazd+>C^C8S{n2s=Z8sqESIgR&UyhVFEy1Pq>=xy2amv=w-1FACyv48t(+@Pp8o4F zB-BWwDFfzN9imq1ba-`AoHhCQc`?ok*~TV+8>)XIjnyM z)(fyApMhET>2ZP3DkT}-oAD=Hnc?h#VV>0!{&%$Jdjj6bM~H+j)*-}R0)LIS@)=Zn z0t{B&X47>J9M?N?AEKFIyi?)r8jdSF&4YoDvfk+jAY@s5w{;S%T zRXu&x$1wkQ%|}0ym$$_5y3!Hx+$)BwS(zsc3!)uo> znoZl+tXaz|`75alD2!VDul%8vqY?mc=2f67Uk|N@yaXe2E0Z*eIvB!Bc)L$p8i zhBrrFH2Jy3+BnjxeFa1bRHdnz8TP93&AzXC?jX$bO2FIuN9!Lg`&zYXNv?1LfB!RQ z&U7nRm5)ArbmQn+`X=+S#oBVh7b-n3=E%!OA3nNq^ela|`Q$@dPa-T#?f%h+k8T{Z zmcL%UUaWTiVHeEbKN9}VIbWM@zj4w&qSkjP~~VizH{Wo?XHS%&)o z$Z)u=wnjzBO`kc+a4UxWq&&^86l73&0gU7~Y|d9ft5k zfZH?b!L(iSDc`=39~)+ags4!sy=N-Tqs!;Zr?eM-+QQ>-I$wWJU|-(975Ga2;>E^; z$+zEryR`iO%l-cwTzxIy;3Rpi`GA0kDp`Z z`Rfh({<==yMnC9=fNy`JvWdicq^Zc0r2}5%YfGZfB^&CdI75P*%-h< zkc!7BxJE!KT8Yrc|P=5k`=0Ev0}doSqqK5Dmjjv*}lWs}+% zfNa3(_uqea3<9U^v4^ygUI4TDk^HgyyLM17xV&AzKs0Q{gYrH>t1{`0%BugND6Ru?IK6L4ER~Tynie3g?zIv zpo=Bn8~Ej`FGg4^F$Pwy)3(||q8;=0`;Izh)xYzptE&jhu^pyjofRPYAIs5{3>ynz zJqy+|Idu3>N1oLkUAxIe3FyJF2f)y+TQ?{yETr+dxPkJ$q&xK|=?!3PP8W;{s#+DM z+Bf!Y(4YZrzj5P67e%1*N7dUd4F`E2y>B2*uV|4@&v|^*VvIHrylt!7wN~Y`$e#xX z%%kUKAYOxEqm`9|EXmgcCHo;Sk+Z7gkC<@e~k8F(LYz$#{UWN6NQj{t_1d< zDucCqPSOaWizT1+0<6Fn@)_#?q{WEm+^prlw9g6YbFL43{`u!{&pr2eEuY2lr-ykr z27q}Co6J*`&*J#K9Rt8T%CD@c9|DHln4F`eIeRKKcm(%mKv^1KYJb4nPlC&F90J&cd zpk-4@dt7#zO}4-&Aq)rQ2ZL2!04o0ii|0RU|1NRx+oC!2eA~3?((9TvX++5%+lo+@ zPk`1xLbUG9C<6YPCtGZXQESxYdx`==(#JtzPvnoVa{oN|uut^$BjGdP*Z>X$w{K9L zwv#CWRrv*Ov+2BpxA$)rGV-@1A3If*^4^3MD9f+3$NsBFY1peo-8Vzdu~UUZPEd|BA%{yz3uo%S*BKHS(h-vbcm0;tHxF#rsM^v3dc z~T3~^8#GkxaOZ|{Hi7Sz5+iR*s6Ty`ayC>bOom(;E5lB;{Zmk zAS?2D$lO4@5)jM1k>?TOShfVQg;me19vU4#URLtWt5*qGRmM@C}`a2+#$@~9#MZgn3!dvp!lkW+l zVz5g7GWnC>m7NxL5`$-h+ir^;tbKJbdbo%pT0{$%oHM6O5f-jKeYd>-CJ0r^7y--Um> zd>(ux5I@K&f|37;!-SOe_n%jXK;mo$@bvedaJYR24xUJq(~H`~FGb}eRRBojUAlB} zoCn&MTt#w6s}#u|G4$9mc!Rr+tx$>W@j689+O=sfKn3htByMrhH&s}10ipb-{u&M^ ziSmfRl|hM;n|;M+5ZU$)s3@+0veHU8ak2uc=W2@O**%XzmVFrvv2Af)1)Myk=F>;{ z-V8)~3+?&qFL%l-0$&opt9A5Z+q7C5leg zwlYTDnlU1vzXN9FqayIu-Q$h?iv?bOR#ukd9DmzL{CF_Z$CN1pO!*05vLzu@>%P!Of)g&{6Djc-_F{OD@j`gzdW(311p!pp;Qh!`3 z`GXuI);^Y_8wf)}k??;%>_-12<6*apG! zTUTFWNj|!~N`xO`KyU!qDr^u?;%d=X2@i)7VXC=aTeI>#p%tA2;CgN*98^XAh#7^B zvR7}3q<JWHqFmibO7LV1svF(?I=Tqpz4B>DgZWXj<+L(I$CcrBlxYG5E_1(9BkxH_cH+GoWIZOzCx8VvOn*&E46 z7?HP3A@Ia6%d5)26ws5ex1J0mdaH!5E8mCn0F>p2_;wzEvV8FEJOFQyxZ(rYk#$(h zpq1aw?u-9%x4tjlhlqRsA*kJ=K5SXGgeslc8!Dh{(-H7NzR*0i1`NHoHH`*p zUMm@nlJ;jGpKR*0b$bBImoJCz-Mdo@AG>6=h*ggY00({XKqbIp{aG&nf$ead0Jmks zHmD3R3P@!ffLdTd&b&zQGQt&4}fnY%NOOHqZ`Gj$mhWmyaDRiZ0~`QmB4kK92>{>jPFP?B}Z(c?I< zeFp4oHXk0d^@3%f{nkV6(Lg0Df2Hlgq!N%S0N&C;5^s=^0mqIXcjOUta#+nEXpfV= zxNEUpOjH!?*|!g@0_6vWfQws)o$IA~Wme^r{yu2)Tb(Ekut9k_l7stF0V-`x$p_C? zKC2grUu>f~7Xan6wfyzmKw_C*8&&I{$qyEOnMnSO>=~FMVCB4G@CN+v--!Gf_yJ)a z=svR2Be1e^r7!Vsmv0C{?lsfU=RS}6-m@00q{a2Z(jg%;gPvpk2_Go|B=L-B*Oy_; zt7GhEyP#q40chBw5p1U`O=JRe$W;1#sR9VLzkOS`y059j<6a@vgX&~3l+SE1Ph$Yg z(ih9baROEO=>He(d|O!sE>r?y4*>oDX4{&Te<{J_KigX)aeiSqk^GHPc0J-2*X;{T z$rmBB`gx_m>MJWr&nwXU`tN4tqcV_10r?szKPPmHPxb>~YXPaaz)}8|#2laO2f)?> zQgOng{N*`Ye6k+^TMJ0#0pPklxPoTw25D|}l-v*Rg9YzBO?~o+t^0q3`Z?`k-A`{j zqJd~T`!)DkR@VZ;B_B}H;6^VvCjl3Q6VKV)1aZMQoUG<)wz4!t1>bdL<)TKqEkl@%3GAi5$#g2=Cve78VXQpdJ#3yA5o zH7g(C$#O@_UvveDWq6M6Bvtt@&nb?jPI=*58}+4F=iTKrYC*USEL8w=#>@m-4-x#p`P{U;PF|9ozqZ?Oh3c6h-#_CNq;euSao;s#0wWu*44$8^#bu=bwL*|s8!5D;ESLvu?sEl8+l<3?4cJ;xk8$&) z{5LJE@}}>uZSpATO^1e(WBgTd#+7Z8Ew@zY@N`S1m# z+>|A0{SF?cV+T@m(t&P6@b$(oP;*uy{jP(@0qZ_N6C?lH+LKI!oy5N6JL!hbvjP8LRk%w>gZOjsMg+ns7$%Nxstz-A7EehA05i~7er2q;0F!sT7o5hxqPt>z`HY;JKmV?GdoDk^XDsmqba{E zF1ugv7=Ty@AnyqfXkNd3c959o&#z}F;yyf#&tgX9tOS{_^YcxVT^M zI)G_2XL-f|g7M}_?w<*})-T1|%eVL_6s-_FkYFd(kBT?(eGLMQKWOR!C?QCHrrW$D zpx48xOY3Ix-t*DF6ZvL304MnpxJ5fkOarfJJybb8a$63uvb+#P6Ne2GuGT3$-i zE1yVT4rTnS$0s$r*3vzC5g80RK;+|l}0a~j69~=JUpDVHJk{@6x1aIj^ z|9JNCmdc;xANdhIm1vRwQ;ZL&?aTYI-63N4rP^znq_sSy@@=)29y) zD=I25c<^AnURsJ_!-nzjwUQF_?b{d6XJqj3pB*~jt@3jGi{%|NW(=;n>MG3Z+!@1% z59cc>wSweFIi|tX_^{`2o_Y|mcnV43GdxG4`7baxJ%X_MsXR(*h=o%Oiz|4yRnJ{vk+`5`JNY{bY1O&B`Kg{vQp!i1;e&|~ak zbRM%3ga6Qgi|=vZnrX4P?4B*CntTA)Jei29`%M`4ShQ~Ww0=UkA*O@2+N`Om;T~AU zariK+++Dk{W5*62*4EZ~+;vkAfWi|ePH@whUil|ZoMJML@nhmE`*7=vJ8}B-SxkKG zgy(2%wBm+Y`nehKe*(4G#W8lsFwgOAof9?AHmHx!=W!7#(~0;+%R89XKi!km zr^@G;`k2LU{LbMcn_VN2`N|*phY&&tA%qY@2qAWzR;4JS71rc%(5J; z**{gwA9cRvcPSX+N>9wOq{Jp!vQx7y?X$}*c^PGv%+$`792TZ0q*~f0W>|7l+gUQ& zT||BCWI-}29Q{rBsb<;qKIV`=SU?~&7* zwpyxPyKVN%Afeatu1GAqv=dNc5d6j{ty?8Mgy!a8`IS6 zoa<{BU=RxnXyF-4H<0fn7yB0mr56LI%ZV^U7&??_cM?VAzwP_hE&sw&?d5;Ik-|5P~V0`QCutvE26@8mCjU77{YuB#z#6SMee|XrnOBcWQh@Aq}Kr?x? z!eB7q|DO80=KNal^5mOZ^?Cm*P*ngfgEVh_!IOnN9C7as{OhSA9unwWnJy3I*TlI| zhp|b>Z{Mi^%NMOgc3B2?tdc(9A)^Q4leu5`oEKFV@aytxaqwRfo&39tb<* zSyvc+kka2{U<7L76LR@-C<$MQU^k&x z!fbN7!*CcF3A-E((yzc7##abOm?d`$lCx(Q`{A<|Ix(@^^}mr3fSr+XWMniNo9g+! zT6XyoFqtDcu{78vkD`t+1LyW|dOnNW*wMt|(MCz0&EbUAZbKNc5WD7L`AM49W&_h1 z;OmNXY_cNCznOzOH`LO#ru{d_Ki~B)pr!!DdudUQYDBCDp1a)lyFAgB%Q{$@gr=s} z--RZa^8Y13T>;pqe`)IRvSN$Fe)?*^kZaPIF3W{KpS*kMW@}b^42L+4tjo&RQ}zDOwgQP3-s3i z`ILXY>t7&HooQ8$!4Pq+F&#;%nLtVgkKcU%{dn{-@2YY#1JPovLx&Ej-v6xiG*13* z0B-t=cSD@hanu9Yqe;F);Rj^xgkSTp`|N*v;&d(#1=Qk%A4949FF@TFP=wT7l@otU z=gLriZZH^e`m}cU4MM&W%GSR!?yqM+&?6u0?_KbAb5qi};6$Bv`H@j3tX%pjKNl{A zX{Re9v0y*s3;Sr_Uzf^%-fNEsCC48w=<45g{Bx5}^*{ZqwJqn<0X_9ksGHumRpskJ zx}z2+W%0kh^bg>VfAowAv}Fg8znT(IlKtZx9Bhd zIi;2(kv|OryNuyDR?B{H8QC~=uo}l}zSku?CZz!NXS5TLDF4PLD>~)rvmGn3d2cl$ zBf^8K|MMr`fNZP({g{J+!=}#!VXtUDXqno3T#NVB9ltv zuXpX*wV4ti^0&-e%iS-?m4Ti?V7a|s-lA_w5d=a=0jNX02Vf4v+69AJRZ!(e^W+1Il)}zw&6AVHoAa$tkeP^@t zpnCgmRr|l%xPZU00!rVz<1B0ryY|1z)^gsA!nQc*jK<=ZZpFnnzQEHW6Mf@8kJKUm ztX(~?ME0Fd_EaPeanq7$z69VsTt%P#GR;>ph zxATkhKng<7B#2)U)CYmtN4;X<7UUJhc&2hHp_cA1FNcm%c)K4079jH14IT2sTvD;D z+4PO?g-yWaV+X=P^8?+#H@lT7%0tzj7RI_Se}KVW&y+w6OyNd2Ty~lt$oc`=9o#os zrH_?JpFlkT^7QGsUgz7ISH{(#hc>DFYYrdbCKxr#Ffzofj(Yq5kDS^3veGr`r`XI7c+KH>@CBH{w z!)a7kS7YUeFJa8>+Fg_T>j7wutEGiz0jWb(0Yt>b;@(%cwVDwAojSE|bWZZsASZq@ z_w3mCm8Z3@j5q%yG>b>9ISwB#TIRbZhv!Nb^nGMJ?9Y9U> zcJ`|ngYKOqU)?D=aR@h<_`Gs02#<;J4E~0*mYt0?9uL(VLQ+-+)=pzcVCjnY;BJtNhX8z}*SZ5CzkUG~g=ZNlBS^w%SO;tzK2h=(_Q>**N?B|rniDoC=PhTF$yY+z>L+tg zp!m7Kz=+T2QuIQy$DwA=>nQG?iS4yg3+?jJ1F>N4LWG-5Xlwj|{rJH*g{~O(7k+*9 z`fsGM^i8xdOZx}t3^Q_n|D*(Jj~(|6V3Pgc5k%{szmpEPf6DR~#J_DbnfTbT^b1V8 zW*}197QoRY*|zKIj$rb{nXo*2yLLeu<;#)0F2Qpy$iKB=ur_CEPUw5)ql(r4hkGRD zeBbp$dC!1wQQSsP{o6-PgL3moJ@p?5g7^hGyNN$CDh>(p2`C>h7|APVapD)(gE0Zg zLF7L%#ej$1@ztwWd#?T7>}^<(5_sd7wDnduP$N!KIxih%J(Gk~&GG_~^^$uRw0Qr3 zr!Lnl>z58y1rQr4eJ(TxKxoO{A1F@e*~JCA7)Zz$P&4^#Uh*jhj-CM9sdb*X-_}1t zhx~A(|K7^>wM%$UAgk;a9N2mq73KYS`ia`Z{2D0=VLFmeq;mNgZc&5HDgC6>?Ega1 z3A?|!1;r=KNOnCfU|IR^ogrqU>_Fw+f5T0;&&0;hUPQt>TkzI%w<9qzm6QLNJ7)47 zkyzW)bMHITrs6k~-7YoGq5kDK*6oC6Tp+y8yU(B6>&<**DsF#3zxyY|)H10awYhzv~6vcx$K6@FOtCrNVal2p)UyJ52gVH*8pW z?jL|TTq28#&OLlDu=tuqf8edWg3ep8Z1oSUyBYPeh%QE%c;Qyl-VCR~UJB2DcZpul##Gak>1T0;2v2WWo`!qdQD*Pv-SM zpz}_iM&wTjME(Rl_0RL~SOjOCMB3Dfe>z(-uMzpnLF6BvT!3{e7GU4@Ri5vIZ144V z0LAZRBYVy6pn3pA^vCC1%g>4U{b7zF9JL1zp()0_ckcV|OJQDN5K_SxKL$dG2ISgY3A z!r;0$ZzRT!8o|%6`DYje<*a(!U;Ohvp5Acc5Gq-mK-c9;;KVm8 zz<;iK%HNOtVDR0l71D{$`cLaxfH0ND2a)`MMv45_&7TcV{aa6ANq}eSsei)Imv(a! zSA%H%6YBQt18uubN`S}fj`N-X%_Jl84|WVdKoGyM`-_=DVt_b&wR?JZq0|f5S0inM zn46V`nfB8dQ7g^AkB`-E*Qa#=Yc}m-4X}32LV}~`TpkYmQyji{$U9Y=;!CTBtKJ)e zI#d-vV}nE#ME>$Q-APGFd|z7HcauU=0s{BF>?Q4}m;^L~j%g@Dz7j<4)Z(eDo68C4 z>kp?R(iDrv`m^ZiCLp@b^9}f8(DLnes}K3}+l>zHq>To%E*Lq1x3WHZ^%+D)MZsom zz@^vS&0FG6J*aMmG7(W|mEWYUNVYBgg8#tj-B*3^EY2L;kILS^;n&vBmo%pu_z)&JukeW`knp88jUNSsVS1VR3yClJ%U0JUqGOi~2-x%|7Jp5mG}r}3W3u?q$x z`QXMNB}*XEf1kDLg%VIh`p&IbZfe8NUraFJjeS4hX?9NQnU@)x52^mrGKUJ}?hYp%%MoNIfFJHU|#69!-Ba_ z!g_2siu!4H$10bv1hshRBj@?pkGjvLP{e0*a8oOROQtY!itMey6YIzH=14TTYPDD04mFPD6ZZdd-ErM#|PIDA(D z%V++ONl0!EI?U42*tKyfNf2Lsb#x5i9t{4VjwT75VLgC+&9X@W`0D{Ip&1n|Ak+iU z4%J_UmA63S@xjx@yca-9pw2zuCgvK4nU`V95-Iz1N%tMnOMIBp-_ ze&J?5ADKfrt0n-fDlOnc^X``jh_x&Zvt!T|Mtt_31H1M~grA+V6q~=v=hrBoVeL$~ zx(7ES<&0w0rpXZwyV2^I3R+jUkhj8@zVQ^&vI=pyW+(a$kOs!+I?WamGl2x`F6}E( z&ni}}l1-l!0KFS2fhMNpDz2Z52-e(L_IHVF=$ag2(3n83AZ#tPYUQBvf0q&O*q6NB zYx@~#5Rc0C{mQB6v~nu2Qo1JE-jwzQ+Gv)eNB&O}*QpN}xX}fp=eS_WYJ0Z|U=K zfJIYq{GxJTPIDhgqy(n3@Gka_oc!G&@}F0j!)FGyOxs?FSwMogm7(19BX9l7p}Z#q zb*S$L;G`cwIzJ~RpoYE^R^!6T{!+_-{tkTgdaj532^7C@++TzGqa^uWRL{N*rr3CX z&Xs`6*F50(VHbOm3=jEx(!YEJ#{Lgr&7yU>6p$%WeGqsJQveIMHQ=M?Ch|DV`QCj@ zYAJ~{e=x(KeGo8AGN;K0bE#GT!>qeui=K?q8-OR4PsgE#Q>dt7WV5<6c0_N2x#ljk zzvUSp^7lN_?X^-1sQj%*_v6(o7#SZu!PBfgyfZ%r+cy9`N1(?=!|~1M3w`b#t$di( zJ^MpP`K!s_y;Nqyo+Bw&x%}NrrRkBQhbeqG1tDM5zZ!^S)#`uFyX%lv^O`50Ab$Z} z_0RCx$R-$Ss<|DXj;FJi;pF1~_~e_=4xh^K;5a`J;MUJlDf?^#2_$r)MFUK=td7@-V0K20Zc6=bZcr zXVx<^wqE0#udI*Hz29&8238#gXe$4GM^2*t>{&#|#P|)rf8}M28~=N}&cZ#wF@SoUFjxU_}0;1ist58<`17ocsw_?cDDPsTZ(G zhbIt!Jpcik=U=~ME20OKH4DW$flv=X8&nlQ-6{WFZ%+O)d;h~%mEhW^KkyJfp{RH~ zAFLGDADpMpd!;}5>C?Nq5=F(RAuKY+2J0Y5f!%K25+$r_@6mg>SLup-nink@W(oBhGpOYM`n0 z4H~ULqWpq#D>Q}LGEA2& zf9Tb#m(N&0;6AQ|drsD4|B+*y^a*7CAtjKXpRZYN$aCjU2UP{o(n1U+l;)2&r%H2& z{SL^s0FuA(&5u#qMcPMLPW%G2Q4A>o3YAdZ6Cg}G1Gr>aGt1&6KVIeDJz}NZb!X%9 zN%Fg9!@~4m?NP5+NIUAdcTj>J0*Hw8?YoH9zrb5hEahDsV?7YV9(#OiXP@hFTbJXs zq8HFYr_Kjd{yE(*M9;!}>D~a|K3nn>N(BD(&ON%ypX8TRjYe7YxjRrJ`CIE*i!$u` zmNUCS^-rz#w0I+5?JN0l8|u04Z+GR(C(ZV$f0~aa`~vA!07o6MNXqx!!-0sOK;$o1 z0)qTo6LN2$a!;V*8aaX^yz;^$Jlyu}COk3gZGPUXs0ij;M&Z?mX7D(Z%hFt@T7Mz31!L;gP|1o11~Ld$V%qBJWhg&p_Z;+=wg z=+$>IG*>cVeY{V*<32*5{d=Q-*BSM%`Ty4GdI;K~J_xMAk&y!|SV z_a1c}5(+NlgO+0Uh@QPkMLxBbe=t}%Z!P;}hSOeyn(`aj-%4hiOMcsr&mOd~Vv=^* zbxLCkrf}{N)L=4lpZ_K|NlCjTyDeu~vi+^k8;{ZzHS8e_8S>gMvllo>L5yaF_CE*i9>z{D1)!SRW zmXW@|%^SUD-;Wd3ojdwNOOD$@B;R^aUkPlGJlT^Ue_!}tp-UK4B`wU+|GBBjm+btl zf&H5g&`#r;^G7+PrRWDXpGIbB9ODg}G^#8Wi?l~JZS>vb@VJ<%JuY?q_wL>4^DM~( zw1>4MwG)}k?YL*__wJrlLMc1wq&M~*@#g!_hrm)&~-%NO;3_cIIe%$>u%^=~8h&n{i{PpyA~p86N4RSjQZFfcImZQ>1VWufrcd?PVRpPXl## z&=C>%(`$QFt{lMWCaK$7c&p5$bKh)5zBiiR8peK9E^RGP;SN@5-&flF_kVi;IUO@q zuhV%}X<=QQYNz>y=Tkdm4LGixf=)t*FTq8WJwzrx<#>v8=x+T}-un_&)T zipJFh2aRpGtH~&BFbOMDHljV-z~XkNgJ0vVRHw9C2`TAoYoyChi^*?v#9v-Lqe|@Jk z5#g@>Loxl!kJ%mP_x<~q>)%_sHRPY&v4+PBbj$(@^#Fc4sE)Q!3#?=RJAk%Xu%)&| zSZX%Hk}}by?<5qJbw*Bk7rr#V`;do`kyC=CjP^*)C`56)uIM}XF$}zN28N7z9u>X% zpg7Ww;=&Hd$x`?K;JYy36 z@RtX0(<2jco#i%6u-uM&o|u9^KKp0<>6It((Cg2jGb7-VD2HzOw3AoQ3%YZ1PfTuu z%&fNT$Uv8_9Z}k$2wV3Y3KV?-3o7IZqqC%u)q#~y<4{4d~`MLSXZJ&?AjvZJXbVOlU8QOO)M~5=@ zZh2Yk`6(!6@7cLiIVyTyfPMonLV89vQc}{;u3b6u+XdLIO$GTy1xP5!LQHO3Br!5f zV&#|Du7gkgw=e7AssFUhB3}RHB^Bt}Yan{|8-k9k{ELDpf2#j1_TJ}9KGpw&m-KB` z|5FC{_o@E}hF1C1|CCFHdg}khu~*}nQR8_1KRCEbSN#)+u={n)@;Q`g^0?Zy9^p0o z2!{L%3JUntP5GfrlgHJrrP&U1;@3m|1nL2-nr*?d7w`8RpFMXkzJB##Y<%+x&#~c+ zX;}WZ2k_;rDLh>N`s3I#?`iD%a2EC~e36G+=TFC`x1L01ruO>(CE?trScDKl2qF9z vW66>w=lf4MuQ>OK)**xtLI@%JSK|KxxlndR=$BpN00000NkvXXu0mjfD@GWN From 383c59eb9688cc32db48ac95a03423c01c89acfa Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 26 Jan 2024 19:26:00 +1100 Subject: [PATCH 087/339] Console improvements - 26 1 24 --- .../tools/console/xenoarchaeology_console.dm | 30 ++++++++++++++----- .../tools/console/xenoarchaeology_seller.dm | 4 ++- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 85ecd9559c2ce..0c5f5f5dbe597 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -26,6 +26,11 @@ ///Do we do solved notices on the radio? var/radio_solved_notice = TRUE + ///The supply pack we ship stuff in + var/datum/supply_pack/console_pack + ///Our current, if available, order + var/datum/supply_order/console_order + /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() //Link relevant stuff @@ -71,7 +76,7 @@ /obj/machinery/computer/xenoarchaeology_console/ui_act(action, params) if(..()) return - + switch(action) //Purchase items if("stock_purchase") @@ -97,10 +102,21 @@ name = usr.real_name rank = "Silicon" //Ship the pack - var/datum/supply_pack/SP = seller?.buy_stock(locate(params["item_id"])) - var/datum/supply_order/SO = new(SP, name, rank, ckey, "Research Material Requisition", D) - SO.generateRequisition(get_turf(src)) - SSsupply.shoppinglist += SO + if(!console_pack) + console_pack = new /datum/supply_pack/science_listing() + console_pack.contains = list() + console_pack?.current_supply = max(1, console_pack.current_supply) + if(!console_order || !(locate(console_order) in SSsupply.shoppinglist)) + console_pack.contains = list() + console_pack.cost = 0 + console_pack.cost += seller?.get_price(locate(params["item_id"])) + console_pack.contains += seller?.buy_stock(locate(params["item_id"])) + if(console_order) + SSsupply.shoppinglist -= console_order + qdel(console_order) + console_order = new(console_pack, name, rank, ckey, "Research Material Requisition", D) + console_order.generateRequisition(get_turf(src)) + SSsupply.shoppinglist |= console_order ui_update() @@ -108,7 +124,7 @@ SIGNAL_HANDLER radio?.talk_into(src, "test", RADIO_CHANNEL_SCIENCE) - + var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in AM.contents var/datum/component/xenoartifact/X = AM.GetComponent(/datum/component/xenoartifact) radio?.talk_into(src, "test2, label is [L], and component is [X].", RADIO_CHANNEL_SCIENCE) @@ -121,7 +137,7 @@ if(T.contribute_calibration) if(locate(T) in L.traits) score += 1 - else + else score -= 1 max_score += 1 var/success_rate = score / max_score diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index aa71bccc05c82..906abfbabb0b0 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -54,13 +54,15 @@ //Remove stock and prepare to replace it current_stock -= A addtimer(CALLBACK(src, PROC_REF(replenish_stock)), restock_time) + /* //Return a supplypack //TODO: Make this just return an item, and have the console reuse the same pack over and over var/datum/supply_pack/science_listing/SL = new() SL.contains = list(A) SL.cost = A.custom_price SL.current_supply = max(1, SL.current_supply) //Bruh - return SL + */ + return A /datum/rnd_lister/proc/replenish_stock(amount = 1) for(var/i in 1 to amount) From 15c977e1c9f2b8b6b85b4989744004efafd5b94a Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 26 Jan 2024 20:30:34 +1100 Subject: [PATCH 088/339] Update majors.dm --- code/modules/xenoarchaeology/traits/majors.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 2380611681b6a..208809f1dc3f1 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -1,7 +1,7 @@ /* Major These traits cause the xenoartifact to do a specific action - + * weight - All majors should have a weight that is a multiple of 3 * conductivity - If a major should have conductivity, it will be a multiple of 3 too */ @@ -284,7 +284,7 @@ Invisible TODO: Consider removing this - Racc */ -//datum/xenoartifact_trait/major/invisible +//datum/xenoartifact_trait/major/invisible /* Displaced @@ -401,7 +401,7 @@ Healing TODO: Consider re-designing this - Racc */ -//datum/xenoartifact_trait/major/heal +//datum/xenoartifact_trait/major/heal /* Hypodermic @@ -684,7 +684,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_EXTRA_SAFE flags = XENOA_BLUESPACE_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///List of possible emotes - var/list/possible_emotes = list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, + var/list/possible_emotes = list(/datum/emote/flip, /datum/emote/spin, /datum/emote/living/laugh, /datum/emote/living/shiver, /datum/emote/living/tremble, /datum/emote/living/whimper, /datum/emote/living/smile, /datum/emote/living/pout, /datum/emote/living/gag, /datum/emote/living/deathgasp, /datum/emote/living/dance, /datum/emote/living/blush) @@ -705,7 +705,7 @@ if(!.) return for(var/mob/living/carbon/target in focus) - INVOKE_ASYNC(src, PROC_REF(run_emote), target) + INVOKE_ASYNC(src, PROC_REF(run_emote), target) //TODO: Add a default hint - Racc dump_targets() //Get rid of anything else, since we can't interact with it clear_focus() From 8c8c6b402f92020e2c32cff7fb5ac2f592e6c45b Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 26 Jan 2024 21:55:56 +1100 Subject: [PATCH 089/339] Trait misc - 26 1 24 --- _maps/map_files/debug/runtimestation.dmm | 95 +++++++++--------- .../wiremod/components/atom/artifact.dm | 4 +- code/modules/xenoarchaeology/traits/majors.dm | 36 ++++++- .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1697 -> 1963 bytes 4 files changed, 86 insertions(+), 49 deletions(-) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 792c1a1ee7c60..5db80b45b044d 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -2451,8 +2451,9 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "mt" = ( -/obj/item/xenoartifact, /obj/effect/turf_decal/box, +/obj/item/xenoartifact/tutorial, +/obj/item/paper/artifact_tutorial, /turf/open/floor/engine, /area/science/explab) "mG" = ( @@ -2478,6 +2479,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 8 }, +/obj/effect/mapping_helpers/tile_breaker, /turf/open/floor/plasteel/white, /area/science/explab) "nq" = ( @@ -2568,7 +2570,7 @@ icon_state = "4-8" }, /turf/open/floor/plating, -/area/space) +/area/science/explab) "oV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2643,15 +2645,23 @@ /turf/open/floor/engine, /area/science/explab) "sv" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas, -/obj/item/tank/internals/oxygen, -/obj/item/book/manual/wiki/xenoarchaeology, /obj/effect/turf_decal/bot, -/obj/item/healthanalyzer, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/table, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 + }, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, /turf/open/floor/plasteel/dark, /area/science/explab) "sz" = ( @@ -2668,7 +2678,7 @@ icon_state = "4-8" }, /obj/machinery/door/airlock/research{ - name = "Experimentation Lab"; + name = "Xenoarchaeology Lab"; req_one_access_txt = "8;49" }, /obj/effect/turf_decal/stripes/line{ @@ -2719,6 +2729,9 @@ }, /obj/effect/loot_jobscale/medical/first_aid_kit, /obj/item/clothing/neck/stethoscope, +/obj/item/healthanalyzer{ + pixel_y = 7 + }, /turf/open/floor/plasteel/dark, /area/science/explab) "tu" = ( @@ -2782,11 +2795,6 @@ /obj/machinery/door/airlock, /turf/open/floor/plating, /area/storage/primary) -"vG" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/landmark/observer_start, -/turf/open/floor/plasteel/dark, -/area/science/explab) "vP" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2994,21 +3002,6 @@ /turf/open/floor/plasteel, /area/medical/chemistry) "Dg" = ( -/obj/structure/rack, -/obj/item/multitool{ - pixel_x = 3 - }, -/obj/item/assembly/igniter, -/obj/item/analyzer, -/obj/item/stock_parts/cell/high{ - charge = 100; - maxcharge = 15000 - }, -/obj/item/geiger_counter, -/obj/item/assembly/signaler{ - pixel_x = -8; - pixel_y = 5 - }, /obj/effect/turf_decal/bot, /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -3016,6 +3009,12 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/effect/mapping_helpers/tile_breaker, /turf/open/floor/plasteel/dark, /area/science/explab) "EG" = ( @@ -3111,7 +3110,7 @@ icon_state = "1-2" }, /turf/open/floor/plating, -/area/space) +/area/science/explab) "HS" = ( /obj/structure/sign/warning/explosives, /turf/closed/wall/r_wall, @@ -3165,11 +3164,6 @@ /obj/effect/turf_decal/stripes/corner{ dir = 8 }, -/obj/structure/closet/crate/science, -/obj/effect/turf_decal/bot, -/obj/item/xenoartifact, -/obj/item/xenoartifact, -/obj/item/xenoartifact, /obj/structure/cable/yellow{ icon_state = "1-2" }, @@ -3224,7 +3218,7 @@ icon_state = "1-4" }, /turf/open/floor/plating, -/area/space) +/area/science/explab) "LY" = ( /obj/machinery/power/floodlight, /obj/structure/cable/yellow{ @@ -3244,6 +3238,9 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, +/obj/structure/sign/poster/official/xenoarchaeology{ + pixel_y = 32 + }, /turf/open/floor/plasteel/white, /area/science/explab) "MT" = ( @@ -3290,17 +3287,13 @@ /area/medical/medbay) "QG" = ( /obj/structure/table, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_y = 5 - }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/item/xenoarchaeology_labeler{ - pixel_y = 6 +/obj/structure/sign/poster/official/xenoarchaeology{ + pixel_y = -32 }, -/obj/item/xenoarchaeology_labeler, +/obj/item/book/manual/wiki/xenoarchaeology, /turf/open/floor/plasteel/dark, /area/science/explab) "QO" = ( @@ -3329,7 +3322,8 @@ }, /obj/effect/turf_decal/bot, /obj/effect/landmark/blobstart, -/turf/open/floor/noslip/white, +/obj/effect/mapping_helpers/make_non_slip, +/turf/open/floor/plasteel/white, /area/science/explab) "Rz" = ( /obj/machinery/xenoarchaeology_machine/conductor, @@ -3449,15 +3443,24 @@ /turf/open/floor/plasteel, /area/engine/engineering) "VV" = ( -/obj/structure/rack, +/obj/effect/turf_decal/bot, /obj/item/storage/toolbox/mechanical{ pixel_x = -2; pixel_y = -1 }, -/obj/effect/turf_decal/bot, +/obj/item/analyzer{ + pixel_x = -9 + }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/obj/structure/table, /turf/open/floor/plasteel/dark, /area/science/explab) "Wh" = ( @@ -9995,7 +9998,7 @@ XQ sz mt rO -vG +LE Kb Cr EL diff --git a/code/modules/wiremod/components/atom/artifact.dm b/code/modules/wiremod/components/atom/artifact.dm index 7e45cfb0ca290..dc3ad8a37d0e2 100644 --- a/code/modules/wiremod/components/atom/artifact.dm +++ b/code/modules/wiremod/components/atom/artifact.dm @@ -46,5 +46,5 @@ //Clear the artifact's traits for(var/i in artifact_comp.artifact_traits) for(var/datum/xenoartifact_trait/T as() in artifact_comp.artifact_traits[i]) - qdel(T) //Artifact component should handle harddels - + artifact_comp.remove_individual_trait(T) + diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 208809f1dc3f1..f16f433bd3e57 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -261,7 +261,7 @@ cooldown = XENOA_TRAIT_COOLDOWN_GAMER flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = FALSE - rarity = XENOA_TRAIT_WEIGHT_RARE + rarity = XENOA_TRAIT_WEIGHT_MYTHIC //Fuck this trait weight = 9 conductivity = 36 @@ -630,14 +630,48 @@ ///The maximum size of our smoke stack in turfs, I think var/max_size = 6 +/datum/xenoartifact_trait/major/smoke/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a corgi")) + /datum/xenoartifact_trait/major/smoke/trigger(datum/source, _priority, atom/override) . = ..() if(!.) return + make_smoke() + +/datum/xenoartifact_trait/major/smoke/proc/make_smoke() var/datum/effect_system/smoke_spread/E = new() E.set_up(max_size*(parent.trait_strength/100), get_turf(parent.parent)) E.start() +/datum/xenoartifact_trait/major/smoke/chem + label_name = "Dissipating Δ" + label_desc = "Dissipating Δ: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a cloud of smoke containing a random chemical." + cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + ///What chemical we're injecting + var/datum/reagent/formula + ///max amount we can inject people with + var/formula_amount + var/generic_amount = 11 + +/datum/xenoartifact_trait/major/smoke/chem/New(atom/_parent) + . = ..() + formula = get_random_reagent_id(CHEMICAL_RNG_GENERAL) + formula_amount = (initial(formula.overdose_threshold) || generic_amount) - 1 + +/datum/xenoartifact_trait/major/smoke/chem/make_smoke() + var/datum/effect_system/smoke_spread/chem/E = new() + var/datum/reagents/R = new(formula_amount) + R.add_reagent(formula, formula_amount) + E.set_up(R, max_size*(parent.trait_strength/100), get_turf(parent.parent)) + E.start() + +/datum/xenoartifact_trait/major/smoke/chem/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("create a cloud of smoke containing a random chemical"), XENOA_TRAIT_HINT_RANDOMISED) + /* Marking Colors the target diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index e7afc2982e74ea86e2e0b3118d050a2654ca7ab4..1df494e288c3c3fcc7b9051b4e4acab2e37fcbe0 100644 GIT binary patch delta 1649 zcmV-%29Eim4XY23BLV@KktJk*@$B1)Z)(7-oW-}G$iAb=z@vFmKBIP0igIgR!);{O za&+c!J6c3kig6@RKP6F6N_2m-wYJ8{$?$u;+CGZNp?ZsSYfhnAVcBM5;AnD^w{L{6 zZ*!lMf2gRZpp}t}l!|~P7Z-(oeq=p3jC5>f+jDXEdxZabrXO~m8f}+<6J)uhnZ1{W zR4E$AhH=xXoY9((P^DUC=xUu7Y>Wk7gc4cEtFnC6Pr#y-mII!h6uYD}cp{%fp;n2qP0k?p)bv*fd_+KPy}mCd@F%#>hY-;aair(aLM$mC-$txHD~Ln{=dE-Fpvp?>&fffw_d=x-xZjJ$E{ zuYj>O+b3SO4FDnp0)PnswtWDF2#DzKn|cZgnf4t3EDU)B_)EPW=I1+|PPg0L&xP29 zZUX2OQV_DXh(H@ez~{vD5Hvt`e}C`wdI&&}>!n@<_y=No2udAze_vRr9)V~vuLy~N z0-%Oq0Komd27pxuHXi|Se@6f)em{tXc-QLblM!$ObaVIj`8pBsg~Zt9la7Ep1>M~J z-2y0NI?4gW{6_%D=jI~-@9!1>y@;wrAXV7*gj)w7=fIXl0L-HV1L&l4 zzy`3U+Msk2ny(ivuu90RN!UqGWCQ?AK^~xF84g$yC#<-R5CHm2x_^lX)M!ybVlB6U z!rUrvBdXJ)f+ir*?}98u8sd-R1RjL^`!wRM3IZXe2%~ z%AN;Er*?}*jT-F?!Ohb5>{D}@Ke706JH50;LBcPSNj-lG0A{CFS7{5t?N0$9(gBVL z0JlG}cz|zHT9jAmD1WKvPbBg0ii3xiS5}2qmJb~iC)lLAKe5)<*OJ4_M~)s7I(lUJ zaG?X`-+srPcinx@z4zU3`4emXf%W+K%88R3LMKnG94~aB{0AR;_>o5+JN5VzmOrsh zubqz1te!o0Ug+G})iZ?-lz-vLr!HQ4`k7~+v;2w0L(Dt4ynpe$(8gt}1La@2dhPm+ z7hZhn<>>=di@+5>N(|C%vs00000NkvXXu0mjfiU$x< delta 1381 zcmV-r1)BP+51|c^BLV=uktJkd@ax*|?AeKMYrd?Szqg#hzMjFro?XLjWY=@i*{{s_j`o@dS=^mWIZ@grCMg_YC||T zMLRi0JUT!#G_yIn50k|K&VK~cNkl); zitxJfQG~t9M-lcbA4hog=D0Ps-&;Ku+| zlNf;ZBLLcu0B9cv7%1r$H~{cb0N|qlz{df!1~dTh={Yc<0f3JJXdN7o0MN$(ppOAS z9|Mqz0!T#xq@n;)Q2-r-1MQ;#ItI?iYSA9>v0Ahbd;-AOZwC}W<>LUAj{{Ub1z>#= z!1)A#^9cawM*s!`ynhgt0LG^Qj86j?KLTJ1Aq`*(Aq`*(Aq`*(Aq5}{1+f*dvJ??p z0V_)pu@$hg6j56NbEOF144ErM_-4plDZ)2H=1LK<88VjwH2)TWT!I#WT!I#WUV^_0 zfX-0_K>HB@?MDE#9|JIRfCeygfCeygfCeygfCjK9G7`X^$bU!xdm(fl{qV4T1o9(aIT8T_Kn=kGfctv~fS?XMKLX(XjsQ^nNm?k$ zuFW$cBM=7|d-r$IB?5_(8oPed5s0T??A_l3fLf+=51^2L3P3-f9|3rO4*=*z)FuM? zQC`qPFjDKk0vLq=Hq$oI&@m%Q?K4640v)A>I>6Wj+<)H@06R`Q%<}!|G*|`GnbcIO zJ3w`R#{f*GZK55(d{OvX%#Wq!^LYpWW&i=;?(gHa5ttp%GL9&lh5#T22?lTo?(YbI zCAWzN09gN=OT)I1DgpRViz@*2J_eu*;rkkZ`U*dT<%cyu5Q7W?$b>im^Jxtr-wpxn z{XN(ZXMe}FOfQZhKs*96NmvT983Lg9qDitwde=H#UR@rfSv_wZJMN4<_NLJdqIqFa<aB{jjJ6Aeeor)sJag)E9 z)PJu9Vs&x(S?TgZT-7=-{uik~lmdTaUEf?6x8m-8t#mKWZfhMF-vI>v#=80Qrg%6P zk55YC>-j^i1LHe@z~5NkuD{6+zKb7HV*Nen!1!APP$7Oe|N1E8_@5rb2pE6+5m^5a zG6-Y@RNo5X%l0DhBxDT82y78RjqvvD?s8tN*J6Et7tC_wJAnRIfm-KRs|%sZfVjL^ zVRhhYA4m41qU7EIpdI{F(+p#Qe_d+Z&H nf24;dzvuot1MRfaP8;Z7JR9b-Tsmpe00000NkvXXu0mjf@QrOV From 2b199d0693a6363e2e4b3f1fc9976969405cb7a8 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 26 Jan 2024 22:24:52 +1100 Subject: [PATCH 090/339] Update activators.dm --- code/modules/xenoarchaeology/traits/activators.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 309bcec6aa9c3..9db458e128568 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -1,7 +1,7 @@ /* Activators These traits cause the xenoartifact to trigger, activate - + * weight - All activators MUST have a weight that is a multiple of 8 * conductivity - If an activator should have conductivity, it will be a multiple of 8 too */ @@ -271,7 +271,7 @@ /datum/xenoartifact_trait/activator/timed/proc/indicator_hint(engaging = FALSE) var/atom/A = parent?.parent - A?.balloon_alert_to_viewers("[A] [engaging ? "stops ticking." : "starts ticking"]!") + A?.balloon_alert_to_viewers("[A] [!engaging ? "stops ticking." : "starts ticking"]!") /* From 3a74a2d406372c32972cda911345e72a8a492158 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 27 Jan 2024 00:30:22 +1100 Subject: [PATCH 091/339] Labeler stuff - 27 1 24 --- _maps/_basemap.dm | 2 +- .../tools/xenoarchaeology_labeler.dm | 4 +- code/modules/xenoarchaeology/traits/majors.dm | 87 ++++++++++++++++++- .../xenoarchaeology/traits/malfunctions.dm | 12 ++- code/modules/xenoarchaeology/traits/traits.dm | 4 +- .../tgui/interfaces/XenoartifactLabeler.js | 16 ++-- 6 files changed, 109 insertions(+), 16 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 9499d3e8cb593..bf3b820460161 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index fdfa0bd8c8867..9ccfb596a8762 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -74,7 +74,7 @@ /obj/item/xenoarchaeology_labeler/ui_act(action, params) if(..()) return - + //print label if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown_timer)) COOLDOWN_START(src, sticker_cooldown_timer, sticker_cooldown) @@ -101,7 +101,7 @@ var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) temp += list(initial(T.label_name)) - tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity)) + tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity), "alt_name" = initial(T.alt_label_name)) //Generate material availability var/list/materials = list(XENOA_BLUESPACE, XENOA_PLASMA, XENOA_URANIUM, XENOA_BANANIUM, XENOA_PEARL) tooltip_stats["[initial(T.label_name)]"] += list("availability" = list()) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index f16f433bd3e57..fe91ecac7729c 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -37,6 +37,8 @@ if(!.) return playsound(get_turf(parent.parent), 'sound/machines/defib_zap.ogg', 50, TRUE) + do_sparks(3, FALSE, parent.parent) + //electrocute targets for(var/atom/target in focus) if(iscarbon(target)) var/mob/living/carbon/victim = target @@ -46,6 +48,8 @@ C.give((parent.trait_strength/100)*C.maxcharge) //Yes, this is potentially potentially powerful, but it will be cool var/atom/log_atom = parent.parent log_game("[parent] in [log_atom] electrocuted [key_name_admin(target)] at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") + //If there's an exposed cable below us, charge it + //TODO: - Racc dump_targets() //Get rid of anything else, since we can't interact with it clear_focus() @@ -200,6 +204,14 @@ . = ..() return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a mothroach")) +/datum/xenoartifact_trait/major/animalize/mouse + label_name = "Bestialized Σ" + possible_animals = list(/mob/living/simple_animal/mouse) + +/datum/xenoartifact_trait/major/animalize/mouse/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a mouse")) + /datum/xenoartifact_trait/major/animalize/New(atom/_parent) . = ..() choosen_animal = pick(possible_animals) @@ -337,6 +349,13 @@ . = ..() if(!.) return + do_light() + +/datum/xenoartifact_trait/major/illuminating/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce a randomly colored light")) + +/datum/xenoartifact_trait/major/illuminating/proc/do_light() lit = !lit var/atom/light_source = parent.parent if(lit) @@ -344,9 +363,21 @@ else light_source.set_light(0, 0) -/datum/xenoartifact_trait/major/illuminating/get_dictionary_hint() +/datum/xenoartifact_trait/major/illuminating/shadow + label_name = "Illuminating Δ" + label_desc = "Illuminating Δ: The artifact seems to contain de-illuminating components. Triggering these components will cause the artifact to de-illuminate." + +/datum/xenoartifact_trait/major/illuminating/shadow/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_RANDOMISED) + return list(XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("create a localised shadow")) + +/datum/xenoartifact_trait/major/illuminating/shadow/do_light() + lit = !lit + var/atom/light_source = parent.parent + if(lit) + light_source.set_light(parent.trait_strength*0.04, min(parent.trait_strength*0.1, 10)*-1, color) + else + light_source.set_light(0, 0) /* Obstructing @@ -632,7 +663,7 @@ /datum/xenoartifact_trait/major/smoke/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("turn the target into a corgi")) + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("produce a harmless cloud of smoke")) /datum/xenoartifact_trait/major/smoke/trigger(datum/source, _priority, atom/override) . = ..() @@ -814,3 +845,53 @@ var/distance_proportion = max(1 - (distance / (max_flash_range * (parent.trait_strength/100))), 0) if(distance_proportion) M.soundbang_act(1, 200 * distance_proportion, rand(0, 5)) + + +/* + Plushing + Makes plushies +*/ + + +/* + Bleeding + The artifact bleeds when activated +*/ + +/* + Moody + Changes the target's mood +*/ + +/* + Chatty + Talks, like polly +*/ + +/* + lissen ghosts - allows the ghosts to insert messages. + + change bodypart sprite - changes the sprite of a limb/bodypart + + radio chatter - anomalously tap into a random used frequency and “speak” sentence picked from predefined,picked from previous node or random + + freeze - target cannot move (resist to escape) + + slowness - target is significantly slowed down (resist to escape) + + speed - target is faster for a time + + burn - engulf target in area fire + + organtraction - extracts a random organ from the target. if valid. must be at X distance from target + + blind - temorary blindness + deaf - temporary deafness + mute - temporary muteness + + parapalegic - temporary kiera mode + + vomit - causes vomiting. droping the target on the ground for a short time + + +*/ diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 37953ab7ad01b..16602d5a7ed0d 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -1,7 +1,7 @@ /* Malfunction These traits cause the xenoartifact to malfunction, typically making the artifact wrose - + * weight - All malfunctions should have a weight that is a multiple of 7 * conductivity - If a malfunction should have conductivity, it will be a multiple of 7 too */ @@ -19,6 +19,7 @@ */ /datum/xenoartifact_trait/malfunction/bear label_name = "P.B.R." + alt_label_name = "Parallel Bearspace Retrieval" label_desc = "Parallel Bearspace Retrieval: A strange malfunction causes the Artifact to open a gateway to deep bearspace." flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT ///List of our current bears @@ -50,6 +51,7 @@ */ /datum/xenoartifact_trait/malfunction/strip label_name = "B.A.D." + alt_label_name = "Bluespace Axis Desync" label_desc = "Bluespace Axis Desync: A strange malfunction causes the Artifact to remove articles from the target." flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE @@ -76,6 +78,7 @@ */ /datum/xenoartifact_trait/malfunction/trauma label_name = "C.D.E." + alt_label_name = "Cerebral Dysfunction Emergence" label_desc = "Cerebral Dysfunction Emergence: A strange malfunction causes the Artifact to cause traumas to emerge in the target." flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE @@ -108,6 +111,7 @@ */ /datum/xenoartifact_trait/malfunction/heated label_name = "M.A.C." + alt_label_name = "Mass Area Combustion" label_desc = "Mass Area Combustion: A strange malfunction that causes the Artifact to violently combust." flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT @@ -150,6 +154,7 @@ */ /datum/xenoartifact_trait/malfunction/radiation label_name = "R.P.E." + alt_label_name = "Rapid Particle Emmision" label_desc = "Rapid Particle Emmision: A strange malfunction that causes the Artifact to irradiate itself and its targets." flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE @@ -173,6 +178,7 @@ */ /datum/xenoartifact_trait/malfunction/twin label_name = "M.B.C." + alt_label_name = "Mirrored Bluespace Collapse" label_desc = "Mirrored Bluespace Collapse: The Artifact produces an arguably maleviolent clone of target." flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE @@ -235,7 +241,8 @@ */ /datum/xenoartifact_trait/malfunction/explosion label_name = "E.E.E." - label_desc = "Expansive Explosive Emition: A strange malfunction that causes the Artifact to explode." + alt_label_name = "Expansive Explosive Emmission" + label_desc = "Expansive Explosive Emmission: A strange malfunction that causes the Artifact to explode." flags = XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT rarity = XENOA_TRAIT_WEIGHT_RARE ///Max explosion stat @@ -267,6 +274,7 @@ */ /datum/xenoartifact_trait/malfunction/hallucination label_name = "M.H.I." + alt_label_name = "Mass Hallucinatory Injection" label_desc = "Mass Hallucinatory Injection: The Artifact causes the target to hallucinate." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_PLASMA_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT register_targets = TRUE diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index fade43c952b12..19f3b5b875f7b 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -11,6 +11,8 @@ var/material_desc ///Used when labeler needs a name and trait is too sneaky to have a descriptor when examining. var/label_name + ///Alternate name displayed when hovering + var/alt_label_name ///Something briefly explaining it in inagame terms. var/label_desc @@ -106,7 +108,7 @@ trigger(null, priority, target) targets += target RegisterSignal(target, COMSIG_PARENT_QDELETING, PROC_REF(unregister_target_signal), TRUE) - + //Cleanly unregister an effected target /datum/xenoartifact_trait/proc/unregister_target(datum/source, do_untrigger = FALSE) SIGNAL_HANDLER diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 14fead1618fa8..ff8440739938a 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -7,7 +7,7 @@ export const XenoartifactLabeler = (props, context) => { - + @@ -58,7 +58,7 @@ const XenoartifactlabelerTraits = (props, context) => { ))}

      - +
      {sorted_minors.map((trait) => ( @@ -71,7 +71,7 @@ const XenoartifactlabelerTraits = (props, context) => { ))}
      - +
      {sorted_majors.map((trait) => ( @@ -84,7 +84,7 @@ const XenoartifactlabelerTraits = (props, context) => { ))}
      - +
      {sorted_malfs.map((trait) => ( @@ -123,7 +123,9 @@ const XenoartifactlabelerGenerateEntry = (props, context) => { content={specific_trait} checked={check_against.includes(specific_trait)} onClick={() => act(`assign_${trait_type}_${specific_trait}`)} - tooltip={`Weight: ${tooltip_stats[specific_trait]["weight"]}, Conductivity: ${tooltip_stats[specific_trait]["conductivity"]}`} + tooltip={`${tooltip_stats[specific_trait]["alt_name"] ? `${tooltip_stats[specific_trait]["alt_name"]} \n` : ``} + Weight: ${tooltip_stats[specific_trait]["weight"]}, + Conductivity: ${tooltip_stats[specific_trait]["conductivity"]}`} /> ); @@ -138,10 +140,10 @@ const XenoartifactlabelerGenerateInfo = (props, context) => {
      {`${info["desc"]}`}
      {info["hints"].map((hint) => ( -
      From 9338ab7543f8c1087ef91dc31016254eebb4e825 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 27 Jan 2024 22:49:41 +1100 Subject: [PATCH 092/339] Suggestions - 27 1 24 --- .../xenoarchaeology/traits/activators.dm | 3 +- code/modules/xenoarchaeology/traits/majors.dm | 52 +++++---- .../xenoarchaeology/traits/malfunctions.dm | 33 ++++++ code/modules/xenoarchaeology/traits/minors.dm | 101 +++++++++++++++++- .../tgui/interfaces/XenoartifactLabeler.js | 2 +- 5 files changed, 162 insertions(+), 29 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 9db458e128568..634987344b4e2 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -439,7 +439,8 @@ flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT weight = 32 ///How much damage do we deal per bite? - var/eat_damage = 3 + var/eat_damage = 15 + //TODO: Add an eat timer - Racc /datum/xenoartifact_trait/activator/strudy/hungry/trigger_artifact(atom/target, type, force) . = ..() diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index fe91ecac7729c..0ba1134d53d39 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -292,12 +292,6 @@ var/atom/log_atom = parent.parent log_game("[parent] in [log_atom] made an EMP at [world.time]. [log_atom] located at [AREACOORD(log_atom)]") -/* - Invisible - TODO: Consider removing this - Racc -*/ -//datum/xenoartifact_trait/major/invisible - /* Displaced Teleports the target to a random nearby turf @@ -846,16 +840,36 @@ if(distance_proportion) M.soundbang_act(1, 200 * distance_proportion, rand(0, 5)) - /* - Plushing - Makes plushies + Combusting + Ignites the target */ +/datum/xenoartifact_trait/major/combusting + label_name = "Combusting" + label_desc = "The artifact seems to contain combusting components. Triggering these components will ignite the target." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 24 + weight = 12 + ///max fire stacks + var/max_stacks = 6 +/datum/xenoartifact_trait/major/combusting/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/atom/target in focus) + if(iscarbon(target)) + var/mob/living/carbon/victim = target + victim.adjust_fire_stacks(max_stacks*(parent.trait_strength/100)) + victim.IgniteMob() + else + target.fire_act(1000, 500) + dump_targets() + clear_focus() /* - Bleeding - The artifact bleeds when activated + Plushing + Makes plushies */ /* @@ -877,21 +891,15 @@ freeze - target cannot move (resist to escape) - slowness - target is significantly slowed down (resist to escape) - - speed - target is faster for a time - - burn - engulf target in area fire - organtraction - extracts a random organ from the target. if valid. must be at X distance from target - blind - temorary blindness - deaf - temporary deafness - mute - temporary muteness + pacified - target is temporarily pacified + + dash - dash self rapidly at target location. damage anything you pass - parapalegic - temporary kiera mode + syphon heat - greatly cools of the area with min temp depending on anomaly max strenght. and the anomaly gains energy proprtional to the heat consumed :boom: - vomit - causes vomiting. droping the target on the ground for a short time + freeze - reduces target’s temperature down to a min determined by anomaly’s max */ diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 16602d5a7ed0d..93b1da9e24af3 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -13,6 +13,15 @@ contribute_calibration = FALSE can_pearl = FALSE +/datum/xenoartifact_trait/malfunction/trigger(datum/source, _priority, atom/override) + . = ..() + //TODO: Reconsider - Racc + if(!.) + return + for(var/mob/living/M as() in oview(9, get_turf(parent.parent))) + if(istype(M)) + do_hint(M) + /* Parallel Bearspace Retrieval Summons bears @@ -288,3 +297,27 @@ H = new H(target) dump_targets() clear_focus() + +/* + Bluespace Axis Desync + Strips a random article from the target +*/ +/datum/xenoartifact_trait/malfunction/vomit + label_name = "S.S.E." + alt_label_name = "Spontaneous Stomach Evacuation" + label_desc = "Spontaneous Stomach Evacuationc: A strange malfunction causes the Artifact to make the target vomit." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + +/datum/xenoartifact_trait/malfunction/vomit/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/M in focus) + if(iscarbon(M)) + var/mob/living/carbon/C = M + C.vomit(distance = rand(1, 2)) + else + new /obj/effect/decal/cleanable/vomit(get_turf(parent.parent)) + dump_targets() + clear_focus() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 6270489248e4d..a294c6b23859e 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -1,7 +1,7 @@ /* Minors These traits cause the xenoartifact to behave uniquely, just misc shit - + * weight - All minors should have a weight that is a multiple of 5 * conductivity - If a minor should have conductivity, it will be a multiple of 5 too */ @@ -366,7 +366,7 @@ //We have to check the range ourselves if(get_dist(get_turf(sentient_artifact.parent), get_turf(M)) <= range) sentient_artifact.register_target(M, TRUE) - if(length(sentient_artifact.targets)) + if(length(sentient_artifact.targets)) sentient_artifact.trigger(TRUE) /* @@ -613,7 +613,7 @@ var/datum/radio_frequency/radio_connection //Signal var/datum/signal/signal - + /datum/xenoartifact_trait/minor/signaller/New(atom/_parent) . = ..() //Code @@ -687,8 +687,6 @@ label_name = "Anchor" label_desc = "Anchor: The Artifact's design seems to incorporate anchoring elements. This will cause the artifact to anchor when triggered, it can also be unanchored with typical tools." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT - cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS - extra_target_range = 2 weight = 10 /datum/xenoartifact_trait/minor/anchor/New(atom/_parent) @@ -807,3 +805,96 @@ parent.register_target(target, TRUE) parent.trigger(TRUE) return + +/* + Bleeding + The artifact bleeds for a short period after being activated +*/ +/datum/xenoartifact_trait/minor/bleed + label_name = "Bleeding" + label_desc = "Bleeding: The Artifact's design seems to incorporate bleeding elements. This will cause the artifact to bleed when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + ///Timer stuff to keep track of when we're bleeding + var/bleed_duration = 5 SECONDS + var/bleed_timer + +/datum/xenoartifact_trait/minor/bleed/New(atom/_parent) + . = ..() + if(!parent?.parent) + return + var/atom/movable/AM = parent.parent + RegisterSignal(AM, COMSIG_MOVABLE_MOVED, PROC_REF(catch_bleed_move)) + +/datum/xenoartifact_trait/minor/bleed/trigger(datum/source, _priority, atom/override) + . = ..() + if(!. || bleed_timer) + return + new /obj/effect/decal/cleanable/blood(get_turf(parent.parent)) + bleed_timer = addtimer(CALLBACK(src, PROC_REF(reset_timer)), bleed_duration, TIMER_STOPPABLE) + +/datum/xenoartifact_trait/minor/bleed/proc/reset_timer() + if(bleed_timer) + deltimer(bleed_timer) + bleed_timer = null + +/datum/xenoartifact_trait/minor/bleed/proc/catch_bleed_move(datum/source, atom/target, dir) + SIGNAL_HANDLER + + if(!bleed_timer) + return + var/obj/effect/decal/cleanable/blood/tracks/T = new /obj/effect/decal/cleanable/blood/tracks(get_turf(parent.parent)) + T.setDir(dir) + +/* + Magnetic + The artifact attracts metalic objects when activated +*/ +/datum/xenoartifact_trait/minor/magnetic + label_name = "Magnetic" + label_desc = "Magnetic: The Artifact's design seems to incorporate magnetic elements. This will cause the artifact to attract metalic objects when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 30 + ///Maximum magnetic pull + var/max_pull_steps = 2 + ///Maximum range + var/max_pull_range = 4 + +/datum/xenoartifact_trait/minor/magnetic/push + label_name = "Magnetic Δ" + label_desc = "Magnetic Δ: The Artifact's design seems to incorporate magnetic elements. This will cause the artifact to repulse metalic objects when triggered." + +/datum/xenoartifact_trait/minor/magnetic/push/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("push metalic objects away from it")) + +/datum/xenoartifact_trait/minor/magnetic/push/magnetic_direction(atom/movable/AM, atom/target) + step_away(AM, target) + +/datum/xenoartifact_trait/minor/magnetic/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_turf(parent.parent) + var/pull_steps = max_pull_steps * (parent.trait_strength/100) + var/pull_range = max_pull_range * (parent.trait_strength/100) + for(var/obj/M in orange(pull_range, T)) //TODO: Consider condensing these - Racc + if(M.anchored || !(M.flags_1 & CONDUCT_1)) + continue + INVOKE_ASYNC(src, PROC_REF(magnetize), M, T, pull_steps) + for(var/mob/living/silicon/S in orange(pull_range, T)) + if(isAI(S)) + continue + INVOKE_ASYNC(src, PROC_REF(magnetize), S, T, pull_steps) + +/datum/xenoartifact_trait/minor/magnetic/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pull metalic objects towards it")) + +/datum/xenoartifact_trait/minor/magnetic/proc/magnetize(atom/movable/AM, atom/target, _pull_steps) + for(var/i in 1 to _pull_steps) + magnetic_direction(AM, target) + sleep(1) //TODO: make sure this is cocure - Racc + +/datum/xenoartifact_trait/minor/magnetic/proc/magnetic_direction(atom/movable/AM, atom/target) + step_towards(AM, target) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index ff8440739938a..e7eec1e8173a8 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -123,7 +123,7 @@ const XenoartifactlabelerGenerateEntry = (props, context) => { content={specific_trait} checked={check_against.includes(specific_trait)} onClick={() => act(`assign_${trait_type}_${specific_trait}`)} - tooltip={`${tooltip_stats[specific_trait]["alt_name"] ? `${tooltip_stats[specific_trait]["alt_name"]} \n` : ``} + tooltip={`${tooltip_stats[specific_trait]["alt_name"] ? `${tooltip_stats[specific_trait]["alt_name"]}` : ``} Weight: ${tooltip_stats[specific_trait]["weight"]}, Conductivity: ${tooltip_stats[specific_trait]["conductivity"]}`} /> From 5620f793a643413b4223acf62d183cfef29cc437 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 28 Jan 2024 21:54:47 +1100 Subject: [PATCH 093/339] More suggestions - 28 1 24 --- code/modules/xenoarchaeology/traits/majors.dm | 54 ++++++++----------- .../xenoarchaeology/traits/malfunctions.dm | 29 +++++++++- code/modules/xenoarchaeology/traits/minors.dm | 26 +++++++++ 3 files changed, 76 insertions(+), 33 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 0ba1134d53d39..87715e40dfcb3 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -846,7 +846,7 @@ */ /datum/xenoartifact_trait/major/combusting label_name = "Combusting" - label_desc = "The artifact seems to contain combusting components. Triggering these components will ignite the target." + label_desc = "Combusting: The artifact seems to contain combusting components. Triggering these components will ignite the target." flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT conductivity = 24 weight = 12 @@ -868,38 +868,30 @@ clear_focus() /* - Plushing - Makes plushies -*/ - -/* - Moody - Changes the target's mood + Freezing + Freezes the target */ +/datum/xenoartifact_trait/major/freezing + label_name = "Freezing" + label_desc = "Freezing: The artifact seems to contain freezing components. Triggering these components will freeze the target." + flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 12 + weight = 24 -/* - Chatty - Talks, like polly -*/ +/datum/xenoartifact_trait/major/freezing/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/target in focus) + //Pretty much copied from the wizard traps + to_chat(target, "You're frozen solid!") + target.Paralyze(20) + target.adjust_bodytemperature(-300) + target.apply_status_effect(/datum/status_effect/freon) + dump_targets() + clear_focus() /* - lissen ghosts - allows the ghosts to insert messages. - - change bodypart sprite - changes the sprite of a limb/bodypart - - radio chatter - anomalously tap into a random used frequency and “speak” sentence picked from predefined,picked from previous node or random - - freeze - target cannot move (resist to escape) - - organtraction - extracts a random organ from the target. if valid. must be at X distance from target - - pacified - target is temporarily pacified - - dash - dash self rapidly at target location. damage anything you pass - - syphon heat - greatly cools of the area with min temp depending on anomaly max strenght. and the anomaly gains energy proprtional to the heat consumed :boom: - - freeze - reduces target’s temperature down to a min determined by anomaly’s max - - + Plushing + Makes plushies */ diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 93b1da9e24af3..e4c006b046066 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -299,8 +299,8 @@ clear_focus() /* - Bluespace Axis Desync - Strips a random article from the target + Spontaneous Stomach Evacuation + makes the target puke */ /datum/xenoartifact_trait/malfunction/vomit label_name = "S.S.E." @@ -321,3 +321,28 @@ new /obj/effect/decal/cleanable/vomit(get_turf(parent.parent)) dump_targets() clear_focus() + +/* + Immediate Organ Extraction + steals the target's appendix +*/ +/datum/xenoartifact_trait/malfunction/organ_stealer + label_name = "I.O.E" + alt_label_name = "Immediate Organ Extraction" + label_desc = "Immediate Organ Extraction: A strange malfunction causes the Artifact to extract the target's appendix." + flags = XENOA_BLUESPACE_TRAIT| XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + register_targets = TRUE + ///What organ slot do we yank from + var/target_organ_slot = ORGAN_SLOT_APPENDIX + +/datum/xenoartifact_trait/malfunction/organ_stealer/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/mob/living/carbon/M in focus) + var/obj/item/organ/O = M.getorganslot(target_organ_slot) + O?.Remove(M) + O?.forceMove(get_turf(parent.parent)) + dump_targets() + clear_focus() + diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index a294c6b23859e..9bd57ee600089 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -898,3 +898,29 @@ /datum/xenoartifact_trait/minor/magnetic/proc/magnetic_direction(atom/movable/AM, atom/target) step_towards(AM, target) + +/* + Impulsing + The artifact dashes away when activated +*/ +/datum/xenoartifact_trait/minor/impulse + label_name = "Impulsing" + label_desc = "Impulsing: The Artifact's design seems to incorporate impulsing elements. This will cause the artifact to have a impulsing away from its current position, when triggered." + flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + weight = 15 + conductivity = 10 + ///Max force we can use, aka how far we throw things + var/max_force = 7 + +/datum/xenoartifact_trait/minor/impulse/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + var/turf/T = get_edge_target_turf(get_turf(parent.parent), pick(NORTH, EAST, SOUTH, WEST)) + var/atom/movable/AM = parent.parent + //handle being held + if(isliving(AM.loc)) + var/mob/living/L = AM.loc + L.dropItemToGround(AM) + //Get the fuck outta dodge + AM.throw_at(T, max_force*(parent.trait_strength/100), 4) From 33b7d016b27f5d34f715d0b193acc69e8719b531 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 29 Jan 2024 14:26:44 +1100 Subject: [PATCH 094/339] more!!!!! - 29 1 24 --- code/modules/xenoarchaeology/traits/majors.dm | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index 87715e40dfcb3..8185797a6e4b7 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -891,6 +891,41 @@ dump_targets() clear_focus() +/* + Flourishing + Ages up plants +*/ +/datum/xenoartifact_trait/major/growing + label_name = "Flourishing" + label_desc = "Flourishing: The artifact seems to contain flourishing components. Triggering these components will age up plant targets." + flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 6 + weight = 6 + ///Max amount we increase age by + var/max_aging = 5 + +/datum/xenoartifact_trait/major/growing/trigger(datum/source, _priority, atom/override) + . = ..() + if(!.) + return + for(var/obj/machinery/hydroponics/target in focus) + target.age += max_aging * (parent.trait_strength/100) + dump_targets() + clear_focus() + +/datum/xenoartifact_trait/major/growing/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("make plants age up")) + +/datum/xenoartifact_trait/major/growing/youth + label_name = "Flourishing Δ" + label_desc = "Flourishing Δ: The artifact seems to contain flourishing components. Triggering these components will age down plant targets." + max_aging = -5 + +/datum/xenoartifact_trait/major/growing/youth/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("make plants age down")) + /* Plushing Makes plushies From 79f76ab43ebc0391a937c3ed0f855650706554fc Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 1 Feb 2024 20:11:58 +1100 Subject: [PATCH 095/339] bookmark - 1 2 24 --- .../components/xenoartifact.dm | 1 - .../xenoarchaeology/traits/activators.dm | 19 +++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 057b30f6e4bd1..58a154b4a4ab0 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -353,7 +353,6 @@ else trait.remove_parent() trait.register_parent(src) - //TODO: Setup a proc for traits to register a new parent - Racc //List building, handle custom priorities, just appened to the end if(!artifact_traits[trait.priority]) artifact_traits[trait.priority] = list() diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 634987344b4e2..1d2d68f5d9d31 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -130,7 +130,6 @@ RegisterSignal(parent?.parent, COMSIG_PARENT_ATTACKBY, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_b)) RegisterSignal(parent?.parent, COMSIG_ATOM_ATTACK_HAND, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_d)) RegisterSignal(parent?.parent, COMSIG_ITEM_ATTACK_SELF, TYPE_PROC_REF(/datum/xenoartifact_trait/activator, translation_type_a)) - //TODO: Add indicators for lit / unlit - Racc /datum/xenoartifact_trait/activator/flammable/translation_type_a(datum/source, atom/target) lit = FALSE @@ -440,7 +439,9 @@ weight = 32 ///How much damage do we deal per bite? var/eat_damage = 15 - //TODO: Add an eat timer - Racc + //Timer logic for biting people + var/bite_cooldown = 4 SECONDS + var/bite_timer /datum/xenoartifact_trait/activator/strudy/hungry/trigger_artifact(atom/target, type, force) . = ..() @@ -465,15 +466,21 @@ playsound(AM.loc, 'sound/items/eatfood.ogg', 60, 1, 1) food_item.feed_to_item(src, parent.parent) return - //Otherwise, nibble the target - if(isliving(M)) + //Otherwise, nibble the target, and spit them out, they're gross, ew + if(isliving(M) && !bite_timer) playsound(AM.loc, 'sound/weapons/bite.ogg', 60, 1, 1) AM.do_attack_animation(M) M.adjustBruteLoss(eat_damage) - M.visible_message("[AM] bites [M]!", "[AM] bites you!") - return + M.visible_message("[AM] bites [M]!", "[AM] bites you!\n[AM] doesn't like that taste!") + addtimer(CALLBACK(src, PROC_REF(handle_timer)), bite_cooldown, TIMER_STOPPABLE) + return FALSE return FALSE /datum/xenoartifact_trait/activator/strudy/hungry/get_dictionary_hint() return list() + +/datum/xenoartifact_trait/activator/strudy/hungry/proc/handle_timer() + if(bite_timer) + del_timer(bite_timer) + bite_timer = null From 6a4d3bfd2e910dbd1431ae70ea0dd75530a3f772 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 3 Feb 2024 09:59:18 +1100 Subject: [PATCH 096/339] bookmark - 3 2 24 --- _maps/_basemap.dm | 2 +- code/modules/xenoarchaeology/traits/activators.dm | 2 +- code/modules/xenoarchaeology/traits/traits.dm | 15 ++++++++++++--- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 1d2d68f5d9d31..f6ba14d3e082f 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -482,5 +482,5 @@ /datum/xenoartifact_trait/activator/strudy/hungry/proc/handle_timer() if(bite_timer) - del_timer(bite_timer) + deltimer(bite_timer) bite_timer = null diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 19f3b5b875f7b..f7095da271142 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -233,16 +233,25 @@ INVOKE_ASYNC(src, PROC_REF(pry_action), user, I) /datum/xenoartifact_trait/proc/pry_action(mob/living/user, obj/item/I) - var/atom/A = parent.parent + var/atom/movable/A = parent.parent to_chat(user, "You begin to pry [A] open with [I].") - if(do_after(user, 5 SECONDS, A)) - //Screwdriver mini game thing + //Do a fancy little animation + A.vis_contents += I + //TODO: This might require 515 - Racc + //Clean up the animation later + addtimer(CALLBACK(src, PROC_REF(pry_action_finish), I), 6 SECONDS) + if(do_after(user, 8 SECONDS, A)) new /obj/item/trait_pearl(get_turf(A), src) parent.remove_individual_trait(src) remove_parent() else to_chat(user, "You reconsider...") +//Cleanup animations or whatever else we did for the pry action +/datum/xenoartifact_trait/proc/pry_action_finish(obj/item/I) + var/atom/movable/A = parent.parent + A.vis_contents -= I + ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path, keyed = FALSE) if(!ispath(path)) From 8d1fd22fab3c443878be8925b1753f121d49cd06 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 4 Feb 2024 14:50:45 +1100 Subject: [PATCH 097/339] Fix filters - 4 2 24 --- _maps/_basemap.dm | 2 +- .../components/xenoartifact.dm | 5 ++++- .../modules/xenoarchaeology/misc/materials.dm | 4 ++-- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 79929 -> 56761 bytes 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 9499d3e8cb593..bf3b820460161 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 58a154b4a4ab0..a8cbe54f8efc6 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -394,6 +394,7 @@ var/atom/A = parent //Remove old filters, if they exist A.remove_filter("texture_overlay") + A.remove_filter("outline_fix") A.remove_filter("outline_1") A.remove_filter("outline_2") //Apply new stuff @@ -412,7 +413,9 @@ var/icon/I = artifact_type.get_texture() A.add_filter("texture_overlay", 1, layering_filter(icon = I, blend_mode = BLEND_INSET_OVERLAY)) //Throw on some outlines - A.add_filter("outline_1", 2, outline_filter(2, "#000", flags = OUTLINE_SHARP)) + //TODO: Check if this fix is still needed in 515 - Racc from 514 + A.add_filter("outline_fix", 1.1, outline_filter(0)) //This fixes a weird byond thing. BLEND_INSET_OVERLAY will encrouch on outline 1 if we dont do this + A.add_filter("outline_1", 2, outline_filter(1, "#000", flags = OUTLINE_SHARP)) A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color, flags = OUTLINE_SHARP)) ///Create a hint beam from the artifact to the target diff --git a/code/modules/xenoarchaeology/misc/materials.dm b/code/modules/xenoarchaeology/misc/materials.dm index 2100b80db478d..573b999f606a0 100644 --- a/code/modules/xenoarchaeology/misc/materials.dm +++ b/code/modules/xenoarchaeology/misc/materials.dm @@ -55,7 +55,7 @@ material_color = "#f2ff00" instability_step = 0.5 texture_icon_states = list("texture-bananium1", "texture-bananium2", "texture-bananium3") - mask_icon_states = list("mask-bananium1") + mask_icon_states = list("mask-bananium1", "mask-bananium2", "mask-bananium3") custom_price = 500 trait_flags = XENOA_BANANIUM_TRAIT label_icon = "circle" @@ -83,7 +83,7 @@ material_color = "#f200ff" instability_step = 5 texture_icon_states = list("texture-plasma1", "texture-plasma2", "texture-plasma3") - mask_icon_states = list("mask-plasma1") + mask_icon_states = list("mask-plasma1", "mask-plasma2", "mask-plasma3") custom_price = 250 trait_flags = XENOA_PLASMA_TRAIT label_icon = "play" diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index ca1f99400467dd0ed232dd0e33bc0802ab6354c8..6d6cbae57653eb207d29bb1e9a4a3ee85e6c5b23 100644 GIT binary patch literal 56761 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�-LM4_$U=#}1* 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 From b1095473572f56a3bee3b194815a6d502bf6c3b1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 4 Feb 2024 17:02:46 +1100 Subject: [PATCH 098/339] Better DP design - 4 2 24 --- code/datums/components/radioactive.dm | 7 ----- .../projectile/energy/nuclear_particle.dm | 10 ++++++ .../tools/console/xenoarchaeology_console.dm | 24 +++++++------- .../tools/xenoarchaeology_machines.dm | 31 +++++++++++++++++-- code/modules/xenoarchaeology/traits/minors.dm | 12 ++----- 5 files changed, 52 insertions(+), 32 deletions(-) diff --git a/code/datums/components/radioactive.dm b/code/datums/components/radioactive.dm index 535822523ba27..cc06f85e39b4b 100644 --- a/code/datums/components/radioactive.dm +++ b/code/datums/components/radioactive.dm @@ -44,13 +44,6 @@ return if(strength >= RAD_WAVE_MINIMUM) radiation_pulse(parent, strength, RAD_DISTANCE_COEFFICIENT*RAD_DISTANCE_COEFFICIENT_COMPONENT_MULTIPLIER, FALSE, can_contaminate) - //Handle artifact transformation - var/obj/item/I = parent - //TODO: Review this logic, maybe make it easier - Racc - if(isitem(I) && prob(1)) //if you ever make non-items artifacts, change this check - var/datum/component/xenoartifact/X = I.GetComponent(/datum/component/xenoartifact) - if(!X) - I.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) if(!hl3_release_date) return strength -= strength / hl3_release_date diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index 98eb16acb14b7..a528d2ebe48bd 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -52,6 +52,16 @@ name = "impossibly strong nuclear particle" damage = 30 +/obj/projectile/energy/nuclear_particle/Impact(atom/A) + . = ..() + //TODO: Consider using some fancy math here, or something - Racc + //TODO: Make thise this even targets items - Racc + if(isitem(A) && prob(33)) + var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) + if(!X) + A.AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/pearl, null, TRUE, FALSE) + qdel(src) //TODO: Consider this - Racc + /atom/proc/fire_nuclear_particle(angle = rand(0,360), customize = FALSE, custompower = 1e12) //used by fusion to fire random nuclear particles. Fires one particle in a random direction. var/obj/projectile/energy/nuclear_particle/P = new /obj/projectile/energy/nuclear_particle(src) if(customize) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 0c5f5f5dbe597..ebc96f7dd7575 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -123,11 +123,11 @@ /obj/machinery/computer/xenoarchaeology_console/proc/check_sold(datum/source, atom/movable/AM, sold) SIGNAL_HANDLER - radio?.talk_into(src, "test", RADIO_CHANNEL_SCIENCE) - - var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in AM.contents - var/datum/component/xenoartifact/X = AM.GetComponent(/datum/component/xenoartifact) - radio?.talk_into(src, "test2, label is [L], and component is [X].", RADIO_CHANNEL_SCIENCE) + var/obj/item/sticker/xenoartifact_label/L = AM + if(!istype(L)) + return + var/atom/artifact = L.loc + var/datum/component/xenoartifact/X = artifact.GetComponent(/datum/component/xenoartifact) if(X && L) //Calculate success rate var/score = 0 @@ -139,26 +139,24 @@ score += 1 else score -= 1 - max_score += 1 + max_score = T.contribute_calibration ? max_score + 1 : max_score var/success_rate = score / max_score //Rewards - var/dp_reward = max(0, AM.custom_price*X.artifact_type.dp_rate) - var/rnd_reward = max(0, AM.custom_price*X.artifact_type.rnd_rate) - linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, dp_reward) + var/rnd_reward = max(0, (artifact.custom_price*X.artifact_type.rnd_rate)*success_rate) linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_GENERIC, rnd_reward) //Announce victory or fuck up if(radio_solved_notice) var/success_type switch(success_rate) - if(0.99 to INFINITY) + if(0.9 to INFINITY) success_type = "incredible discovery!" - if(0.9 to 0.79) + if(0.89 to 0.7) success_type = "admirable research." - if(0.7 to 0.3) + if(0.69 to 0.3) success_type = "sufficient research." else success_type = "scientific failure." - radio?.talk_into(src, "[AM] has been submitted with a success rate of [100*success_rate]% '[success_type]', at [station_time_timestamp()].\nAwarded [dp_reward] Discovery Points, and [rnd_reward] Research Points!", RADIO_CHANNEL_SCIENCE) + radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', at [station_time_timestamp()].\nAwarded [rnd_reward] Research Points!", RADIO_CHANNEL_SCIENCE) //TODO: Add monetary reward, cargo already reaps the benehfits of selling it - Racc //Circuitboard for this console diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 593c5080f9f65..b8cd47dc2ecf8 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -34,7 +34,7 @@ register_contents(I) else return ..() - + /obj/machinery/xenoarchaeology_machine/attack_hand(mob/living/user) . = ..() empty_contents() @@ -130,6 +130,21 @@ /obj/machinery/xenoarchaeology_machine/calibrator icon_state = "calibrator" move_inside = TRUE + ///Which science server receives points + var/datum/techweb/linked_techweb + ///radio used by the console to send messages on science channel + var/obj/item/radio/headset/radio + +/obj/machinery/xenoarchaeology_machine/calibrator/New(loc, ...) + . = ..() + //Link relevant stuff + linked_techweb = SSresearch.science_tech + //Radio setup + radio = new /obj/item/radio/headset/headset_sci(src) + +/obj/machinery/xenoarchaeology_machine/calibrator/Destroy() + . = ..() + QDEL_NULL(radio) /obj/machinery/xenoarchaeology_machine/calibrator/examine(mob/user) . = ..() @@ -151,7 +166,7 @@ if(!length(held_contents)) playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) return - for(var/atom/A as() in contents) + for(var/atom/A as() in contents-radio) var/solid_as = TRUE //Once we find an artifact- var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) @@ -171,18 +186,30 @@ else solid_as = FALSE //Loop through traits and see if we're fucked or not + var/score = 0 + var/max_score = 0 if(solid_as) //This is kinda wacky but it's for a player option so idc for(var/i in X.artifact_traits) for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) if(!(locate(T) in L.traits)) if(T.contribute_calibration) solid_as = FALSE + else + score += 1 + max_score = T.contribute_calibration ? max_score + 1 : max_score //If we're cooked if(!solid_as) X.calcify() playsound(get_turf(src), 'sound/machines/uplinkerror.ogg', 60) empty_contents() return + //handle science rewards + if(score) + var/success_rate = score / max_score + var/dp_reward = max(0, (A.custom_price*X.artifact_type.dp_rate)*success_rate) + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, dp_reward) + //Announce this, for honor or shame + radio?.talk_into(src, "[A] has been calibrated, and generated [dp_reward] Discovery Points!", RADIO_CHANNEL_SCIENCE) playsound(get_turf(src), 'sound/machines/ding.ogg', 60) //Calibrate the artifact X.calibrate() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 9bd57ee600089..d2894dd502f93 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -819,13 +819,6 @@ var/bleed_duration = 5 SECONDS var/bleed_timer -/datum/xenoartifact_trait/minor/bleed/New(atom/_parent) - . = ..() - if(!parent?.parent) - return - var/atom/movable/AM = parent.parent - RegisterSignal(AM, COMSIG_MOVABLE_MOVED, PROC_REF(catch_bleed_move)) - /datum/xenoartifact_trait/minor/bleed/trigger(datum/source, _priority, atom/override) . = ..() if(!. || bleed_timer) @@ -838,9 +831,8 @@ deltimer(bleed_timer) bleed_timer = null -/datum/xenoartifact_trait/minor/bleed/proc/catch_bleed_move(datum/source, atom/target, dir) - SIGNAL_HANDLER - +/datum/xenoartifact_trait/minor/bleed/catch_move(datum/source, atom/target, dir) + . = ..() if(!bleed_timer) return var/obj/effect/decal/cleanable/blood/tracks/T = new /obj/effect/decal/cleanable/blood/tracks(get_turf(parent.parent)) From 99acaf530aada894f13b8a1f9cdf8c7f47ee0b2e Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 8 Feb 2024 13:24:15 +1100 Subject: [PATCH 099/339] Update traits.dm --- code/modules/xenoarchaeology/traits/traits.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index f7095da271142..e7e1acffabc49 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -237,20 +237,29 @@ to_chat(user, "You begin to pry [A] open with [I].") //Do a fancy little animation A.vis_contents += I - //TODO: This might require 515 - Racc + var/matrix/old_transform = I.transform + var/matrix/new_transform = I.transform + new_transform.Turn(23) + old_transform.Turn(-23) + animate(I, transform = new_transform, time = 0.15 SECONDS, loop = -1, easing = JUMP_EASING) + animate(transform = old_transform, time = 0.15 SECONDS, easing = JUMP_EASING) //Clean up the animation later - addtimer(CALLBACK(src, PROC_REF(pry_action_finish), I), 6 SECONDS) + var/cleanup_timer = addtimer(CALLBACK(src, PROC_REF(pry_action_finish), I), 8 SECONDS, TIMER_STOPPABLE) if(do_after(user, 8 SECONDS, A)) new /obj/item/trait_pearl(get_turf(A), src) parent.remove_individual_trait(src) remove_parent() else + A.vis_contents -= I + animate(I, transform = null) + deltimer(cleanup_timer) to_chat(user, "You reconsider...") //Cleanup animations or whatever else we did for the pry action /datum/xenoartifact_trait/proc/pry_action_finish(obj/item/I) var/atom/movable/A = parent.parent A.vis_contents -= I + animate(I, transform = null) ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path, keyed = FALSE) From a01fd62f07155cd342197b28a49d93562ff1a2e1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 11 Feb 2024 12:34:31 +1100 Subject: [PATCH 100/339] bookmark - 11 2 24 --- code/__DEFINES/xenoarchaeology.dm | 1 + code/datums/components/storage/storage.dm | 2 +- .../components/xenoartifact.dm | 6 +-- .../xenoarchaeology/traits/malfunctions.dm | 39 ++++++++++++++---- code/modules/xenoarchaeology/traits/misc.dm | 6 +-- code/modules/xenoarchaeology/traits/traits.dm | 8 ++-- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 56761 -> 78039 bytes 7 files changed, 42 insertions(+), 20 deletions(-) diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index 425e1b5a20a33..40b95bb0f8670 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -36,6 +36,7 @@ #define XENOA_BANANIUM_TRAIT (1<<3) #define XENOA_PEARL_TRAIT (1<<4) #define XENOA_MISC_TRAIT (1<<5) +#define XENOA_HIDE_TRAIT (1<<6) ///trait cooldowns #define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index e4dd941fd45e6..238a16a5c5ecb 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -890,5 +890,5 @@ var/atom/parent_atom = parent var/matrix/M = parent_atom.transform var/matrix/old_M = parent_atom.transform - animate(parent, time = 1.5, loop = 0, transform = M.Scale(1.11, 0.85)) + animate(parent, time = 1.5, loop = 0, transform = M.Scale(1.11, 0.85), flags = ANIMATION_PARALLEL) animate(time = 2, transform = old_M) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index a8cbe54f8efc6..1e65378e46819 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -414,9 +414,9 @@ A.add_filter("texture_overlay", 1, layering_filter(icon = I, blend_mode = BLEND_INSET_OVERLAY)) //Throw on some outlines //TODO: Check if this fix is still needed in 515 - Racc from 514 - A.add_filter("outline_fix", 1.1, outline_filter(0)) //This fixes a weird byond thing. BLEND_INSET_OVERLAY will encrouch on outline 1 if we dont do this - A.add_filter("outline_1", 2, outline_filter(1, "#000", flags = OUTLINE_SHARP)) - A.add_filter("outline_2", 3, outline_filter(1, artifact_type.material_color, flags = OUTLINE_SHARP)) + A.add_filter("outline_fix", 2, outline_filter(0)) //This fixes a weird byond thing. BLEND_INSET_OVERLAY will encrouch on outline 1 if we dont do this + A.add_filter("outline_1", 3, outline_filter(1, "#000", flags = OUTLINE_SHARP)) + A.add_filter("outline_2", 4, outline_filter(1, artifact_type.material_color, flags = OUTLINE_SHARP)) ///Create a hint beam from the artifact to the target /datum/component/xenoartifact/proc/create_beam(atom/movable/target) diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index e4c006b046066..72cd659f76e0e 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -256,24 +256,45 @@ rarity = XENOA_TRAIT_WEIGHT_RARE ///Max explosion stat var/max_explosion = 5 + ///Are we exploding? + var/exploding + ///Ref to the exploding effect + var/atom/movable/exploding_indicator //We can't use an overlay, becuase it breaks filters, and the overlay filter doesn't animate + +/datum/xenoartifact_trait/malfunction/explosion/New(atom/_parent) + . = ..() + var/obj/A = parent.parent + //Make the artifact robust so it doesn't destroy itself + A.armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 500, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10) + //Build indicator appearance + exploding_indicator = new() + exploding_indicator.appearance = mutable_appearance('icons/obj/xenoarchaeology/xenoartifact.dmi', "explosion_warning", plane = LOWEST_EVER_PLANE) + exploding_indicator.render_target = "[REF(exploding_indicator)]" + exploding_indicator.vis_flags = VIS_UNDERLAY + exploding_indicator.appearance_flags = KEEP_APART + //Get it nearby so we can render it later + A.vis_contents += exploding_indicator + +/datum/xenoartifact_trait/malfunction/explosion/Destroy(force, ...) + . = ..() + QDEL_NULL(exploding_indicator) /datum/xenoartifact_trait/malfunction/explosion/trigger(datum/source, _priority, atom/override) . = ..() - if(!.) + if(!. || exploding) return + exploding = TRUE var/atom/A = parent.parent A.visible_message("The [A] begins to heat up, it's delaminating!", allow_inside_usr = TRUE) addtimer(CALLBACK(src, PROC_REF(explode)), 30*(parent.trait_strength/100) SECONDS) - //Fancy animation - //TODO: Picking up and dropping breaks this animation - Racc - A.color = COLOR_RED - var/matrix/old_transform = A.transform - var/matrix/new_transform = A.transform - new_transform.Scale(1.3, 1.3) - animate(parent.parent, transform = new_transform, time = 0.5 SECONDS, loop = -1, flags = ANIMATION_PARALLEL) - animate(transform = old_transform, time = 0.5 SECONDS) + //Fancy effect to alert players + A.add_filter("explosion_indicator", 1.1, layering_filter(render_source = exploding_indicator.render_target, blend_mode = BLEND_INSET_OVERLAY)) /datum/xenoartifact_trait/malfunction/explosion/proc/explode() + var/atom/A = parent.parent + A.remove_filter("explosion_indicator") + if(parent.calcified) //Let players defuse it + return explosion(get_turf(parent.parent), max_explosion/3*(parent.trait_strength/100), max_explosion/2*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100)) parent.calcify() diff --git a/code/modules/xenoarchaeology/traits/misc.dm b/code/modules/xenoarchaeology/traits/misc.dm index 562a670946202..2b75035d5b8f8 100644 --- a/code/modules/xenoarchaeology/traits/misc.dm +++ b/code/modules/xenoarchaeology/traits/misc.dm @@ -5,7 +5,7 @@ conductivity = 0 contribute_calibration = FALSE can_pearl = FALSE - flags = XENOA_MISC_TRAIT + flags = XENOA_MISC_TRAIT | XENOA_HIDE_TRAIT /* Objective trait for exploration artifacts @@ -31,7 +31,7 @@ /datum/xenoartifact_trait/activator/weighted/closet material_desc = null - flags = XENOA_MISC_TRAIT + flags = XENOA_MISC_TRAIT | XENOA_HIDE_TRAIT /datum/xenoartifact_trait/activator/weighted/closet/New(atom/_parent) . = ..() @@ -57,7 +57,7 @@ return TRUE /obj/structure/closet/artifact - name = "Bishop" //Proper name + name = "\The Bishop" //Proper name /obj/structure/closet/artifact/ComponentInitialize() . = ..() diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index e7e1acffabc49..5588106d17214 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -215,8 +215,8 @@ //Check if we're at our heart location, which is based on our weight-x and conductivity-y var/atom/A = parent.parent if(target.x % weight == 0 && target.y % conductivity == 0) - //TODO: make an effect for this, see atomic cowboy, is the reference - Racc - A.visible_message("[A] develops a slight opening!\nYou could probably use a screwdriver on [A]!", allow_inside_usr = TRUE) + var/atom/target_loc = A.loc + target_loc.visible_message("[A] develops a slight opening!\nYou could probably use a screwdriver on [A]!", allow_inside_usr = TRUE) //Do effects else //Undo effects @@ -268,7 +268,7 @@ var/list/temp = subtypesof(path) var/list/weighted = list() for(var/datum/xenoartifact_trait/T as() in temp) - if(initial(T.flags) & XENOA_MISC_TRAIT) + if(initial(T.flags) & XENOA_HIDE_TRAIT) continue if(keyed) weighted += list(initial(T.label_name) = (T)) @@ -280,7 +280,7 @@ /proc/compile_artifact_whitelist(var/flags) var/list/output = list() for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) - if(initial(T.flags) & XENOA_MISC_TRAIT) + if(initial(T.flags) & XENOA_HIDE_TRAIT) continue if(!ispath(flags)) if((initial(T.flags) & flags)) diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 6d6cbae57653eb207d29bb1e9a4a3ee85e6c5b23..79a495b590d6be0512dcd8b5be18011c22d643e6 100644 GIT binary patch literal 78039 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 KOI1r4hx`u>A3LW2 literal 56761 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 Date: Sun, 11 Feb 2024 13:43:44 +1100 Subject: [PATCH 101/339] pre labeled - 11 2 24 --- code/__DEFINES/xenoarchaeology.dm | 2 ++ .../ruin_generator/mapping.dm | 2 +- .../xenoarchaeology/components/xenoartifact.dm | 15 +++++++++++++++ .../tools/xenoarchaeology_labeler.dm | 10 ++++++++++ .../xenoarchaeology/traits/malfunctions.dm | 4 ++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index 40b95bb0f8670..c757af14f3b87 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -20,6 +20,8 @@ ///Signal for artifact trigger #define XENOA_TRIGGER "xenoa_trigger" +///Signal for artifact calcified +#define XENOA_CALCIFIED "xenoa_calcified" ///generic starting cooldown timer for triggers #define XENOA_GENERIC_COOLDOWN 5 SECONDS diff --git a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm index e56455f32a2cf..8cd6eb2e2f6d9 100644 --- a/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm +++ b/code/modules/shuttle/super_cruise/orbital_poi_generator/ruin_generator/mapping.dm @@ -186,7 +186,7 @@ loot = list( "" = 4, /obj/item/disk/tech_disk/research/random = 24, - /obj/item/xenoartifact = 6, + /obj/item/xenoartifact/pre_labeled = 6, /obj/item/gun/energy/vortex = 3, /obj/item/gun/energy/alien = 1 ) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index 1e65378e46819..e484fdc991588 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -51,6 +51,19 @@ /obj/item/xenoartifact/tutorial/add_artifact_component() AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/bluespace, list(/datum/xenoartifact_trait/activator/strudy, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/major/hollow)) +///Pre-labeled varient +/obj/item/xenoartifact/pre_labeled + +/obj/item/xenoartifact/pre_labeled/ComponentInitialize() + . = ..() + var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) + var/trait_list = list() + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) + trait_list += T.type + var/obj/item/sticker/xenoartifact_label/old/P = new(get_turf(src), trait_list) + P.afterattack(src, src, TRUE) + /* Export datum, so we can sell artifacts for dosh */ @@ -378,6 +391,8 @@ //Disable artifact cooldown_override = TRUE + SEND_SIGNAL(src, XENOA_CALCIFIED) + //Calibrates. Does the opposite of calcify /datum/component/xenoartifact/proc/calibrate() var/atom/movable/A = parent diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 9ccfb596a8762..eee76a0cadc7a 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -194,6 +194,16 @@ ///The original custom price of the item we're going to label var/old_custom_price +/obj/item/sticker/xenoartifact_label/old + name = "old artifact label" + color = "#bd812e" + +/obj/item/sticker/xenoartifact_label/old/build_stuck_appearance() + var/mutable_appearance/MA = mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state) + MA.color = color + return MA + + /obj/item/sticker/xenoartifact_label/Initialize(mapload, list/_traits) ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) //Setup traits & examine desc diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 72cd659f76e0e..467fbbef7c308 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -263,6 +263,8 @@ /datum/xenoartifact_trait/malfunction/explosion/New(atom/_parent) . = ..() + if(!parent?.parent) + return var/obj/A = parent.parent //Make the artifact robust so it doesn't destroy itself A.armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 500, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10) @@ -274,6 +276,8 @@ exploding_indicator.appearance_flags = KEEP_APART //Get it nearby so we can render it later A.vis_contents += exploding_indicator + //Register a signal to cancel the process + //TODO XENOA_CALCIFIED signal /datum/xenoartifact_trait/malfunction/explosion/Destroy(force, ...) . = ..() From 7fbc42290f65b03639a172db469006218151dd6b Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 11 Feb 2024 20:15:25 +1100 Subject: [PATCH 102/339] Organizing - 11 2 24 --- beestation.dme | 5 +- code/__DEFINES/xenoarchaeology.dm | 18 ---- code/_globalvars/xenoarchaeology.dm | 3 + code/game/objects/items/sticker/misc.dm | 8 ++ .../objects/items/{ => sticker}/sticker.dm | 23 ++-- .../components/xenoartifact.dm | 82 -------------- code/modules/xenoarchaeology/misc/exports.dm | 15 +++ code/modules/xenoarchaeology/misc/items.dm | 101 ++++++++++++++++++ .../xenoarchaeology/traits/malfunctions.dm | 16 ++- icons/obj/sticker.dmi | Bin 364 -> 951 bytes .../obj/xenoarchaeology/xenoartifact_tech.dmi | Bin 1963 -> 1365 bytes 11 files changed, 158 insertions(+), 113 deletions(-) create mode 100644 code/game/objects/items/sticker/misc.dm rename code/game/objects/items/{ => sticker}/sticker.dm (77%) create mode 100644 code/modules/xenoarchaeology/misc/exports.dm create mode 100644 code/modules/xenoarchaeology/misc/items.dm diff --git a/beestation.dme b/beestation.dme index 276346c8098da..dd8d8cb773f81 100644 --- a/beestation.dme +++ b/beestation.dme @@ -1353,7 +1353,6 @@ #include "code\game\objects\items\signs.dm" #include "code\game\objects\items\singularityhammer.dm" #include "code\game\objects\items\spear.dm" -#include "code\game\objects\items\sticker.dm" #include "code\game\objects\items\stunbaton.dm" #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" @@ -1513,6 +1512,8 @@ #include "code\game\objects\items\stacks\tiles\tile_mineral.dm" #include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" #include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\sticker\misc.dm" +#include "code\game\objects\items\sticker\sticker.dm" #include "code\game\objects\items\storage\backpack.dm" #include "code\game\objects\items\storage\bags.dm" #include "code\game\objects\items\storage\belt.dm" @@ -4165,6 +4166,8 @@ #include "code\modules\wiremod\shell\server.dm" #include "code\modules\wiremod\shell\shell_items.dm" #include "code\modules\xenoarchaeology\components\xenoartifact.dm" +#include "code\modules\xenoarchaeology\misc\exports.dm" +#include "code\modules\xenoarchaeology\misc\items.dm" #include "code\modules\xenoarchaeology\misc\materials.dm" #include "code\modules\xenoarchaeology\misc\tutorial.dm" #include "code\modules\xenoarchaeology\tools\xenoarchaeology_labeler.dm" diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index c757af14f3b87..e4a452b6e384a 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -70,21 +70,3 @@ #define XENOA_TRAIT_HINT_TWIN_VARIANT(X) list("icon" = "fingerprint", "desc" = "This variant will [X].") #define XENOA_TRAIT_HINT_RANDOMISED list("icon" = "dice", "desc" = "This trait's effects may differ between instances.") #define XENOA_TRAIT_HINT_APPEARANCE(X) list("icon" = "snowflake", "desc" = "This trait's changes the artifact's appearance. [X]") - -/* -old content -*/ - -///Discovery point reward -#define XENOA_DP 350 -#define XENOA_SOLD_DP 350 -///Reserach point reward (modifer) -#define XENOA_RP 2.5 - -///Chance to avoid target if wearing bomb suit -#define XENOA_DEFLECT_CHANCE 45 - -//Xenoartifact signals. -#define XENOA_DEFAULT_SIGNAL "xenoa_default_signal" -#define XENOA_SIGNAL "xenoa_signal" -#define XENOA_CHANGE_PRICE "xenoa_change_price" diff --git a/code/_globalvars/xenoarchaeology.dm b/code/_globalvars/xenoarchaeology.dm index 35347016608c9..9f7c7cb4f97a4 100644 --- a/code/_globalvars/xenoarchaeology.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -19,6 +19,9 @@ GLOBAL_LIST(xenoa_uranium_traits) GLOBAL_LIST(xenoa_bananium_traits) GLOBAL_LIST(xenoa_pearl_traits) +///Whitelist of items ofr familiar artifacts +GLOBAL_LIST_INIT(xenoa_familiar_items, list(/obj/item/kitchen/fork)) + ///Fill globals /proc/generate_xenoa_statics() if(length(GLOB.xenoa_all_traits)) diff --git a/code/game/objects/items/sticker/misc.dm b/code/game/objects/items/sticker/misc.dm new file mode 100644 index 0000000000000..2beccc9ba594f --- /dev/null +++ b/code/game/objects/items/sticker/misc.dm @@ -0,0 +1,8 @@ +/obj/item/sticker/skub + icon_state = "skub" + sticker_icon_state = "skub_sticker" + +/obj/item/sticker/c4 + icon_state = "c4" + sticker_icon_state = "c4_sticker" + do_outline = FALSE diff --git a/code/game/objects/items/sticker.dm b/code/game/objects/items/sticker/sticker.dm similarity index 77% rename from code/game/objects/items/sticker.dm rename to code/game/objects/items/sticker/sticker.dm index cbfd4fb76478f..a016c27992967 100644 --- a/code/game/objects/items/sticker.dm +++ b/code/game/objects/items/sticker/sticker.dm @@ -7,9 +7,8 @@ desc = "An adhesive graphic." icon = 'icons/obj/sticker.dmi' icon_state = "happy" - vis_flags = VIS_INHERIT_ID w_class = WEIGHT_CLASS_TINY - appearance_flags = TILE_BOUND | PIXEL_SCALE | RESET_COLOR | RESET_ALPHA + appearance_flags = TILE_BOUND | PIXEL_SCALE | KEEP_APART ///Our current state for being stuck or unstuck var/sticker_state = STICKER_STATE_ITEM ///Built appearance for item state @@ -28,7 +27,7 @@ stuck_appearance = build_stuck_appearance() //Sticker outline if(do_outline) - add_filter("sticker_outline", 1, outline_filter(1.1, "#fff", flags = OUTLINE_SQUARE)) + add_filter("sticker_outline", 1, outline_filter(1.1, "#fff")) /obj/item/sticker/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) . = ..() @@ -75,18 +74,26 @@ switch(sticker_state) if(STICKER_STATE_ITEM) appearance = item_appearance + vis_flags = null if(STICKER_STATE_STUCK) appearance = stuck_appearance + vis_flags = VIS_INHERIT_LAYER | VIS_INHERIT_PLANE | VIS_INHERIT_DIR else return - //We have to update the name everytime, due to how setting appearance works - name = initial(name) /obj/item/sticker/proc/build_item_appearance() - return mutable_appearance(src.icon, src.icon_state) + return setup_appearance(mutable_appearance(src.icon, src.icon_state)) /obj/item/sticker/proc/build_stuck_appearance() - return mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state) + return setup_appearance(mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state)) + +//used to set appearance stuff that gets reset by appearance assigns +/obj/item/sticker/proc/setup_appearance(_appearance) + var/mutable_appearance/MA = _appearance + MA.name = name + MA.appearance_flags = appearance_flags + MA.desc = desc + return MA /obj/item/sticker/proc/can_stick(atom/target) - return ismovable(target) ? TRUE : FALSE + return ismovable(target) || iswallturf(target) ? TRUE : FALSE diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index e484fdc991588..adba05ae2144d 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -1,85 +1,3 @@ -/* - Items with this component will act like alien artifatcs -*/ - -/* - Item presets for generic stuff -*/ -/obj/item/xenoartifact - name = "artifact" - icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' - icon_state = "map_editor" - w_class = WEIGHT_CLASS_NORMAL - desc = "A strange alien artifact. What could it possibly do?" - throw_range = 3 - ///What type of artifact - var/datum/xenoartifact_material/artifact_type - -/obj/item/xenoartifact/Initialize(mapload, _artifact_type) - . = ..() - artifact_type = _artifact_type || artifact_type - ADD_TRAIT(src, TRAIT_IGNORE_EXPORT_SCAN, GENERIC_ITEM_TRAIT) - -/obj/item/xenoartifact/ComponentInitialize() - . = ..() - add_artifact_component() - -/obj/item/xenoartifact/proc/add_artifact_component() - AddComponent(/datum/component/xenoartifact, artifact_type) - -///Maint variant for loot, has a 80% chance of being safe, 20% of not -/obj/item/xenoartifact/maint/ComponentInitialize() - artifact_type = prob(80) ? /datum/xenoartifact_material/bluespace : null - return ..() - -///Objective variant, simply has the objective trait -/obj/item/xenoartifact/objective/ComponentInitialize() - . = ..() - AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) - var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) - X?.add_individual_trait(/datum/xenoartifact_trait/misc/objective) - -///No trait variant, for debug tools -/obj/item/xenoartifact/no_traits - -/obj/item/xenoartifact/no_traits/add_artifact_component() - return - -///Variant for 'tutorial' -/obj/item/xenoartifact/tutorial - -/obj/item/xenoartifact/tutorial/add_artifact_component() - AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/bluespace, list(/datum/xenoartifact_trait/activator/strudy, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/major/hollow)) - -///Pre-labeled varient -/obj/item/xenoartifact/pre_labeled - -/obj/item/xenoartifact/pre_labeled/ComponentInitialize() - . = ..() - var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) - var/trait_list = list() - for(var/i in X.artifact_traits) - for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) - trait_list += T.type - var/obj/item/sticker/xenoartifact_label/old/P = new(get_turf(src), trait_list) - P.afterattack(src, src, TRUE) - -/* - Export datum, so we can sell artifacts for dosh -*/ - -/datum/export/artifact - unit_name = "xenoartifact" - export_types = list(/obj/item/xenoartifact) - -/datum/export/artifact/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE) - cost = O.custom_price - return ..() - -/datum/export/artifact/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE) - . = ..() - return O.GetComponent(/datum/component/xenoartifact) ? TRUE : . - /* Artifact component */ diff --git a/code/modules/xenoarchaeology/misc/exports.dm b/code/modules/xenoarchaeology/misc/exports.dm new file mode 100644 index 0000000000000..d3d4e2c91255b --- /dev/null +++ b/code/modules/xenoarchaeology/misc/exports.dm @@ -0,0 +1,15 @@ +/* + Export datum, so we can sell artifacts for dosh +*/ + +/datum/export/artifact + unit_name = "xenoartifact" + export_types = list(/obj/item/xenoartifact) + +/datum/export/artifact/get_cost(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + cost = O.custom_price + return ..() + +/datum/export/artifact/applies_to(obj/O, allowed_categories = NONE, apply_elastic = TRUE) + . = ..() + return O.GetComponent(/datum/component/xenoartifact) ? TRUE : . diff --git a/code/modules/xenoarchaeology/misc/items.dm b/code/modules/xenoarchaeology/misc/items.dm new file mode 100644 index 0000000000000..e8a6762dc32ec --- /dev/null +++ b/code/modules/xenoarchaeology/misc/items.dm @@ -0,0 +1,101 @@ +/* + generic artifact +*/ +/obj/item/xenoartifact + name = "artifact" + icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + icon_state = "map_editor" + w_class = WEIGHT_CLASS_NORMAL + desc = "A strange alien artifact. What could it possibly do?" + throw_range = 3 + ///What type of artifact + var/datum/xenoartifact_material/artifact_type + +/obj/item/xenoartifact/Initialize(mapload, _artifact_type) + . = ..() + artifact_type = _artifact_type || artifact_type + ADD_TRAIT(src, TRAIT_IGNORE_EXPORT_SCAN, GENERIC_ITEM_TRAIT) + +/obj/item/xenoartifact/ComponentInitialize() + . = ..() + add_artifact_component() + +///Proc to add your artifact stuff, here so we can override it +/obj/item/xenoartifact/proc/add_artifact_component() + AddComponent(/datum/component/xenoartifact, artifact_type) + +/* + Maint variant + has a 90% chance of being bluespace, 10% of being anything else, like a regular artifact. + Lets crew discover / play with artifacts without blowing shit up +*/ +/obj/item/xenoartifact/maint/ComponentInitialize() + artifact_type = prob(90) ? /datum/xenoartifact_material/bluespace : null + return ..() + +/* + objective variant + spawns with objective trait, shouldn't effect labelling. +*/ +/obj/item/xenoartifact/objective/ComponentInitialize() + . = ..() + AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) + var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) + X?.add_individual_trait(/datum/xenoartifact_trait/misc/objective) + +/* + No trait variant + Spawns with no traits, helps with debug and other stuff +*/ +/obj/item/xenoartifact/no_traits + +/obj/item/xenoartifact/no_traits/add_artifact_component() + return + +/* + tutorial variant + Has set traits, is accompanied by a piece of paper in the map that uses it to explain how-to-artifact-science. +*/ +/obj/item/xenoartifact/tutorial + +/obj/item/xenoartifact/tutorial/add_artifact_component() + AddComponent(/datum/component/xenoartifact, /datum/xenoartifact_material/bluespace, list(/datum/xenoartifact_trait/activator/strudy, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/charged, /datum/xenoartifact_trait/minor/cooling, /datum/xenoartifact_trait/major/hollow)) + +/* + Pre-labeled variant + for loots +*/ +/obj/item/xenoartifact/pre_labeled + +/obj/item/xenoartifact/pre_labeled/ComponentInitialize() + . = ..() + var/datum/component/xenoartifact/X = GetComponent(/datum/component/xenoartifact) + var/trait_list = list() + for(var/i in X.artifact_traits) + for(var/datum/xenoartifact_trait/T in X.artifact_traits[i]) + trait_list += T.type + var/obj/item/sticker/xenoartifact_label/old/P = new(get_turf(src), trait_list) + P.afterattack(src, src, TRUE) + +/* + Familiar variant + This is technically a helper. + Spawns a random item, from a list, and gives it an artifact component + Used for archaeology, loot, and joke stuff +*/ +/obj/effect/mapping_helpers/familiar_artifact + name = "familiar artifact" + icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' + icon_state = "map_editor" + +/obj/effect/mapping_helpers/familiar_artifact/Initialize(mapload) + . = ..() + return INITIALIZE_HINT_LATELOAD + +/obj/effect/mapping_helpers/make_non_slip/LateInitialize() + . = ..() + var/atom/A = pick(GLOB.xenoa_familiar_items) + A = new A(loc) + A.name = "artifact" + A.AddComponent(/datum/component/xenoartifact) + A.name = "familiar [A.name]" diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 467fbbef7c308..2767e27d45fc1 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -277,7 +277,7 @@ //Get it nearby so we can render it later A.vis_contents += exploding_indicator //Register a signal to cancel the process - //TODO XENOA_CALCIFIED signal + RegisterSignal(parent, XENOA_CALCIFIED, PROC_REF(cancel_explosion)) /datum/xenoartifact_trait/malfunction/explosion/Destroy(force, ...) . = ..() @@ -287,21 +287,29 @@ . = ..() if(!. || exploding) return - exploding = TRUE var/atom/A = parent.parent A.visible_message("The [A] begins to heat up, it's delaminating!", allow_inside_usr = TRUE) - addtimer(CALLBACK(src, PROC_REF(explode)), 30*(parent.trait_strength/100) SECONDS) + exploding = addtimer(CALLBACK(src, PROC_REF(explode)), 30*(parent.trait_strength/100) SECONDS, TIMER_STOPPABLE) //Fancy effect to alert players A.add_filter("explosion_indicator", 1.1, layering_filter(render_source = exploding_indicator.render_target, blend_mode = BLEND_INSET_OVERLAY)) /datum/xenoartifact_trait/malfunction/explosion/proc/explode() var/atom/A = parent.parent A.remove_filter("explosion_indicator") - if(parent.calcified) //Let players defuse it + if(parent.calcified) //Just in-case this somehow happens return explosion(get_turf(parent.parent), max_explosion/3*(parent.trait_strength/100), max_explosion/2*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100), max_explosion*(parent.trait_strength/100)) parent.calcify() +//Tidy stuff up when we're calcified +/datum/xenoartifact_trait/malfunction/explosion/proc/cancel_explosion() + SIGNAL_HANDLER + + var/atom/A = parent.parent + A.remove_filter("explosion_indicator") + deltimer(exploding) + UnregisterSignal(parent, XENOA_CALCIFIED) + /* Mass Hallucinatory Injection Makes the target/s hallucinate diff --git a/icons/obj/sticker.dmi b/icons/obj/sticker.dmi index 6c9b9829cba8f7a914250b308c68ba11bbc7528b..3d7843cdb3575696d3d0f84c36d2b446954c0bf8 100644 GIT binary patch delta 860 zcmV-i1Ec)x0=EZ$iBL{Q4GJ0x0000DNk~Le0001B0001B2m=5B0M$l^3IG5AY*0*8 zMZmzo!*(Y9!zb_IO5m`t_0!Y*-rh+sAMVG;#+;ntxVZ1e#{AUODJdx-At5dHGgVb9RXI615z}rq^pVKOCwzQ- zz`(%&_a)fv8^Ztq00DGTPE!Ct=GbNc005DZO=^D;R9&21nnaW$qD@RTAwmg$(|`ex zlA4oP2@=*ZYD-7ywNCStqx%w4?w40$fQ%K~!jg?U!Lwqc9ML3k_`oRuBWJ z9;e>)|NqC^Bv8@rX1TYvr4xS2El;x*jACbSrd&TV=igINri6yuho`3iPVu0l1(Z;(Md?lYT4-uau->G9Kas4UdGIu-U~Pyv z@l<^}T?HppVAns#N1PPuv1yt%Ebu!_?lLEU6|@hn7o2cG=u2b;bpry(2MPT3NC@J& zuD}V%6(k7kUF70h>Mlw)tZ&nw&$oxgRd9Py{FGwmKJl4MCS&Ow@pCr+$uFH0cS$M%-!`9-F^ws+FjvG)ZC(61DE&{ zNss3B)pUc=zoO<&;QA~6#MYge0BwxFpf?c0>ToKRyC;C$P=0 zrBGw(bTl#&P;XGZqexH;N?f7zG`hA+=tS@Z8Ps!ib?^7rYsr{ZK mx!<#bQl6*) delta 268 zcmdna{)Wl7Gr-TCmrII^fq{Y7)59eQNIL+r0t+*c4A`8!9Z2y9_=LC~IB?)_ncCmO z>hB+VdFsncWZTUHN->rM`2{mLJiCzw{>GF~p+x?Zk_MEe0GezU*pY6KuIIENSNXdtGI@yx!vu);k}?D;THET^8Rpr8q`^ zue(c>l%3#2DV`hi8k_VlJQr}t=SitkIpGj|p@;R(dxi%L**oqvR;988Nm@LX)CjoR z=o4QekYJ|eBD!E}*MUqc^)qu;`aLh?D9vM;m!E-aNIFvS(< OECx?kKbLh*2~7a+P-UF} diff --git a/icons/obj/xenoarchaeology/xenoartifact_tech.dmi b/icons/obj/xenoarchaeology/xenoartifact_tech.dmi index 1df494e288c3c3fcc7b9051b4e4acab2e37fcbe0..3178a80052ab1f50034b76c76b81f7272b424f50 100644 GIT binary patch delta 1043 zcmV+u1nm2(57i1piBL{Q4GJ0x0000DNk~Le0001B0000$2m=5B0MhD$JOBUzZct2A zMZmzoh;C}Vq?srzJV;Vv-Oj&WagG-mAU-fNv2IfVfAuGBe*gdg0d!JMQvg8b*k%9# z0FQc9Sad{Xb7OL8aCB*JZU6vyoKseCa&`CgQ*iP1D@x2wg|OkOlJoOY zN|Q_Se~SpKOw7qlDoP|qX-;BNYECNA>f%#UlSYD-004j3Oq0ySRrvq_ z0{TfrK~z|U?N(=Vn?Mj1aL7n-!V_D~c6zg|^u#5-IKB5?l-_%>^Y63E0lwpa<7D|m zX7oJ6$-HIXzP&P6Dk))@A`FWVs}wx?1Jf2^e-ctAL-^>M054&p06_uLKY@e;?9PyO zixQnSas-HFfdhD~q)wA(5-qYw86A{42L@D>U80=E6a~}{-~%VSM1=#pBEn8_zyz{N zR0v4>pjQW3`iAKsAT=9}Ob0!-2qqALwFhIigWMJ+I&BLA4*a1&F!tymdyy4!U{`D> zf4fAn(_y1|hE-&SqmgnJ1upaVL0o58X7s*Vl~z&J1yljL0<6DUDh{h$toy zd$3kXV8sr&d87#eX)0aiB*&j)MA}X!uCR(+u|=YQVwt*xI+P^Wp)8>1KqDet%ViFh zu*%CR(1{55fdGCAtyE}41VLVOMkdb66h=D&;KS)2o$}%6XENFmfMMVF@uj~!e-39d z+7SZ`@V|gRY>iUdts|dT0LMO`ErD z-6ru$w70jN$;Q-l2QfX>m`o&KfBcS}yLRu{yKnyiiC1E#HRH@S=jIP0=I5HTi3E&4 zboj{8W5-XNJSFi;KnozjLgzH1vmhm4{F$@o&R@8A>GBnQfnpA>Ub}wd=B?Xz?yi=D zd-oqaeDwIq(`P+7pb7`Tcb~s_`RetXx9{`?aGmF^BF1;S?>~I}^!dwIMg3KT$lC{u z?{>d^|MBzJ??3wc03qyDDko6!N>FEU=`Uhw(V_5P@_Q9OzyJee;~x#vc|Kg1SyBK1 N002ovPDHLkV1hC6*8Kng delta 1662 zcmY+Fdr(vN632fh2_z!VpvXfY7r}tS1*K&iVnRqm0a2pJ!$*r;#PF~s$U_ha=LCrI zP(Xr|h-gHtRuoL3h$7@vK~sbRBA7NrzzPH{=K4UA2;|0g?##V^e0IM(-0zO}0exD=))y_=;d|1VhtdwFCZ?n(a*_ea zI(O!Dr)hzgapBAhHz!%+@{O-In8&&{Bj>vLK|B&U@qi@Jrm-ZwLm+9%O?7L^7(QBm z=ch&9i&M2d0p~Jvem(!?iA}=c(=8VLUdKn&01~)crTShQ^n|SzaR%|fSFj4O@tOH6 zqL%m}c0-;bFA6k-#~glMWnYYY=eM|Cxmq??dZu>#)!J_bKa@L5{XK$OYx?JH53S7` zx_q_c<-6BwntH0S-2Gwg02p9`nf~Dkyt$eanQ|ZV2SV8qCNbPSpw(rl_we&GL)6N4 z?{C?)=?!}oIj~uVidwlW?{Ug1;b_P=SgrEM2>W9um}s{$)5Cz<_2-8mWg6)&S4S1mv!wCncBR5Sk(28Uw90 z_|6h}v;v*NO{8L^)_uW_1{IsUXpyCCq)VxC)a}7felYzYJ_Y*GhWL-okIcc)(zFeN&#VKPIt{oE+U|0-SIdWCdvB z0zRQgsjAI3G7^5U2kyqlaO#jwhv^wgUFa>jVt_B>Cu5YW!pwhcE27&m(V6b|=AY4z z!m9af0=?qZf(i$72Ax)M{2|ix1-1JBis5WF?o4fX*B6lco=?bGyb)TfH+)nU~BUvoE!PeNaH|+BdJ4j z5NsIs9Wso8Yr2oQ+;?f3Oi92ZHgr()G3Qni&M>5);vYsIeLxYf9CAlKQZS-lGU_2P z>UVH#(4##Jj8?~D=y%H@DWhEiNL@}Betv(Sh?e*hpe%+lqHV=ZaO6O{oIH1;;4 zcKe-T!jptu{;?jnc=yIOaMoQLuFq%MOIL)7%_B}(odL&Z9in8f%�RHL`sJE2xU8 z`81~QPy53Mc|!@#w9k6aZK7tBRU+{b7dX{6v#zi8OcyQU9kbP^ z105;zYRhUracFa0*}(Pl)XZq**l#1=eA6m;@|P?BjLy~y<1e%<7WaJ7M`^$N=I-Ew zLyg#}1Gls1w5QfY=gv;eV#7<(jm=#jw04}X`41Fb1nwDEwPZ%iSXBPOqA4l~&Mp=c z%j%W^iTZ70vqW=L3u5a!B6)8g{-Ns9O+LJkw|q$3NS8+7tNa{vTDb~d)I1#@ZpJch zZ~IPWU!}3!Sj>5*4OEWyZ<&NwOC)`qCs%h}>VJ7)wi3TucXm_Kr>_wl5Xx*~#N_`6 D6rk^F From 999379c75e7a88e4c083f9c1bc9c30d8ce5d94eb Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 16 Feb 2024 20:35:07 +1100 Subject: [PATCH 103/339] Labeler code improvement 16 2 24 --- .../tools/xenoarchaeology_labeler.dm | 112 ++++++------------ .../tgui/interfaces/XenoartifactLabeler.js | 29 ++--- 2 files changed, 48 insertions(+), 93 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index eee76a0cadc7a..0354f17f01b7a 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -8,23 +8,14 @@ throw_range = 5 w_class = WEIGHT_CLASS_TINY - ///Checked trait - var/list/selected_activator_traits = list() - ///Display names + ///Checked traits + var/list/selected_traits = list() + ///Trait lists var/list/activator_traits = list() - - var/list/selected_minor_traits = list() var/list/minor_traits = list() - - var/list/selected_major_traits = list() var/list/major_traits = list() - - var/list/selected_malfunction_traits = list() var/list/malfunction_list = list() - ///List of descriptions for selected traits - var/list/info_list = list() - ///List of trait stats for tooltip shit, this is kinda fucked but who gives a shit var/list/tooltip_stats = list() @@ -40,10 +31,10 @@ ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) generate_xenoa_statics() //generate data for trait names - activator_traits = get_trait_list_names(GLOB.xenoa_activators) - minor_traits = get_trait_list_names(GLOB.xenoa_minors) - major_traits = get_trait_list_names(GLOB.xenoa_majors) - malfunction_list = get_trait_list_names(GLOB.xenoa_malfunctions) + activator_traits = get_trait_list_stats(GLOB.xenoa_activators) + minor_traits = get_trait_list_stats(GLOB.xenoa_minors) + major_traits = get_trait_list_stats(GLOB.xenoa_majors) + malfunction_list = get_trait_list_stats(GLOB.xenoa_malfunctions) /obj/item/xenoarchaeology_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -53,11 +44,7 @@ /obj/item/xenoarchaeology_labeler/ui_data(mob/user) var/list/data = list() - data["selected_activator_traits"] = selected_activator_traits - data["selected_minor_traits"] = selected_minor_traits - data["selected_major_traits"] = selected_major_traits - data["selected_malfunction_traits"] = selected_malfunction_traits - data["info_list"] = info_list + data["selected_traits"] = selected_traits return data @@ -75,33 +62,40 @@ if(..()) return - //print label - if(action == "print_traits" && COOLDOWN_FINISHED(src, sticker_cooldown_timer)) - COOLDOWN_START(src, sticker_cooldown_timer, sticker_cooldown) - create_label() - return - else if(!COOLDOWN_FINISHED(src, sticker_cooldown_timer) && isliving(loc)) - var/mob/living/user = loc - to_chat(user, "The labeler is still printing.") - //Clear selections - if(action == "clear_traits") - clear_selection() - return - //Toggle traits - trait_toggle(action, "activator", activator_traits, selected_activator_traits) - trait_toggle(action, "minor", minor_traits, selected_minor_traits) - trait_toggle(action, "major", major_traits, selected_major_traits) - trait_toggle(action, "malfunction", malfunction_list, selected_malfunction_traits) - build_info_list() - + switch(action) + if("print_traits") + if(COOLDOWN_FINISHED(src, sticker_cooldown_timer)) + COOLDOWN_START(src, sticker_cooldown_timer, sticker_cooldown) + create_label() + else if(!COOLDOWN_FINISHED(src, sticker_cooldown_timer) && isliving(loc)) + to_chat(loc, "The labeler is still printing.") + return + if("clear_traits") + clear_selection() + return + if("toggle_trait") + var/trait_key = params["trait_name"] + var/list/focus = list(activator_traits, minor_traits, major_traits, malfunction_list) + for(var/list/i as() in focus) + if(!(trait_key in i)) + continue + if(trait_key in selected_traits) + selected_traits -= trait_key + label_traits -= GLOB.xenoa_all_traits_keyed[trait_key] + else + selected_traits += trait_key + label_traits += GLOB.xenoa_all_traits_keyed[trait_key] return TRUE -//Get a list of all the specified trait types names -/obj/item/xenoarchaeology_labeler/proc/get_trait_list_names(list/trait_type) +//Get a list of all the specified trait types stats +//TODO: Consider baking this +/obj/item/xenoarchaeology_labeler/proc/get_trait_list_stats(list/trait_type) var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) temp += list(initial(T.label_name)) - tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity), "alt_name" = initial(T.alt_label_name)) + var/datum/xenoartifact_trait/hint_holder = new T() + tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity), "alt_name" = initial(T.alt_label_name), "desc" = initial(T.label_desc), "hints" = hint_holder.get_dictionary_hint()) + qdel(hint_holder) //Generate material availability var/list/materials = list(XENOA_BLUESPACE, XENOA_PLASMA, XENOA_URANIUM, XENOA_BANANIUM, XENOA_PEARL) tooltip_stats["[initial(T.label_name)]"] += list("availability" = list()) @@ -120,12 +114,8 @@ ///reset all the options /obj/item/xenoarchaeology_labeler/proc/clear_selection() - info_list = list() label_traits = list() - selected_activator_traits = list() - selected_minor_traits = list() - selected_major_traits = list() - selected_malfunction_traits = list() + selected_traits = list() ui_update() /obj/item/xenoarchaeology_labeler/proc/create_label(mob/target, mob/user) @@ -133,32 +123,6 @@ if(target && user) P.afterattack(target, user, TRUE) -/obj/item/xenoarchaeology_labeler/proc/trait_toggle(action, toggle_type, var/list/trait_list, var/list/active_trait_list) - for(var/t in trait_list) - if(action != "assign_[toggle_type]_[t]") - continue - if(t in active_trait_list) - active_trait_list -= t - label_traits -= GLOB.xenoa_all_traits_keyed[t] - else - active_trait_list += t - label_traits += GLOB.xenoa_all_traits_keyed[t] - -//Idk how efficient this is -/obj/item/xenoarchaeology_labeler/proc/build_info_list() - var/list/focus = list() - focus += selected_activator_traits - focus += selected_minor_traits - focus += selected_major_traits - focus += selected_malfunction_traits - - info_list = list() - for(var/t in focus) - var/datum/xenoartifact_trait/description_holder = GLOB.xenoa_all_traits_keyed[t] - description_holder = new description_holder() - info_list += list(list("name" = description_holder.label_name,"desc" = description_holder.label_desc, "hints" = description_holder.get_dictionary_hint())) - qdel(description_holder) - /obj/item/xenoarchaeology_labeler/debug name = "xenoartifact debug labeler" desc = "Use to create specific Xenoartifacts" diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index e7eec1e8173a8..53b814410cefb 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -24,15 +24,10 @@ export const XenoartifactLabeler = (props, context) => { const XenoartifactlabelerTraits = (props, context) => { const { act, data } = useBackend(context); const { - selected_activator_traits, activator_traits, - selected_minor_traits, minor_traits, - selected_major_traits, major_traits, malfunction_list, - selected_malfunction_traits, - info_list, } = data; let alphasort = function (a, b) { @@ -51,7 +46,6 @@ const XenoartifactlabelerTraits = (props, context) => { {sorted_activators.map((trait) => ( @@ -64,7 +58,6 @@ const XenoartifactlabelerTraits = (props, context) => { {sorted_minors.map((trait) => ( @@ -77,7 +70,6 @@ const XenoartifactlabelerTraits = (props, context) => { {sorted_majors.map((trait) => ( @@ -91,7 +83,6 @@ const XenoartifactlabelerTraits = (props, context) => { ))} @@ -103,10 +94,10 @@ const XenoartifactlabelerTraits = (props, context) => { const XenoartifactlabelerInfo = (props, context) => { const { act, data } = useBackend(context); - const { info_list } = data; + const { selected_traits } = data; return ( - {info_list.map((info) => ( + {selected_traits.map((info) => ( ))} @@ -115,14 +106,14 @@ const XenoartifactlabelerInfo = (props, context) => { const XenoartifactlabelerGenerateEntry = (props, context) => { const { act, data } = useBackend(context); - const { specific_trait, check_against, trait_type } = props; - const { tooltip_stats } = data; + const { specific_trait, trait_type } = props; + const { tooltip_stats, selected_traits } = data; return ( act(`assign_${trait_type}_${specific_trait}`)} + checked={selected_traits.includes(specific_trait)} + onClick={() => act(`toggle_trait`, { trait_name: specific_trait })} tooltip={`${tooltip_stats[specific_trait]["alt_name"] ? `${tooltip_stats[specific_trait]["alt_name"]}` : ``} Weight: ${tooltip_stats[specific_trait]["weight"]}, Conductivity: ${tooltip_stats[specific_trait]["conductivity"]}`} @@ -136,13 +127,13 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { const { info } = props; const { tooltip_stats } = data; return ( -

      +
      -
      {`${info["desc"]}`}
      - {info["hints"].map((hint) => ( +
      {`${tooltip_stats[info]["desc"]}`}
      + {tooltip_stats[info]["hints"].map((hint) => (
      - - + + {sellers.map((value) => ( - + ))} @@ -34,13 +38,13 @@ const XenoartifactConsoleSellerEntry = (props, context) => { const stock = value["stock"] || []; return ( -
      +
      {`${value["dialogue"]}`}
      - + {stock.map((stock_list) => ( -
      act(`stock_purchase`, {item_id: stock_list["id"], seller_id: value["id"],})}>{`$${stock_list["cost"]}`}} key={stock_list}> +
      act(`stock_purchase`, { item_id: stock_list["id"], seller_id: value["id"] })}>{`$${stock_list["cost"]}`}} key={stock_list}>
      {`${stock_list["description"]}`}
      - +
      ))}
      From e2f81c9b002767ceb0019219658b56fbad346e54 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Apr 2024 16:21:08 +1000 Subject: [PATCH 155/339] Console UI - 15 4 24 --- .../tools/console/xenoarchaeology_console.dm | 29 +++++-- .../tgui/interfaces/XenoartifactConsole.js | 86 ++++++++++++++++--- 2 files changed, 97 insertions(+), 18 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 63c471f4b3122..2580d904de169 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -20,7 +20,6 @@ ///radio used by the console to send messages on science channel var/obj/item/radio/headset/radio - //TODO: Add a toggle for these - Racc ///Do we do purchase notices on the radio? var/radio_purchase_notice = TRUE ///Do we do solved notices on the radio? @@ -31,6 +30,9 @@ ///Our current, if available, order var/datum/supply_order/console_order + ///History + var/list/history = list() + /obj/machinery/computer/xenoarchaeology_console/Initialize() . = ..() //Link relevant stuff @@ -75,6 +77,19 @@ //Audio data["purchase_radio"] = radio_purchase_notice data["solved_radio"] = radio_solved_notice + //History + data["history"] = history + //Current requests + data["active_request"] = list() + if(console_order?.pack) + data["active_request"] = list(list( + "object" = console_order.pack.name, + "cost" = console_order.pack.get_cost(), + "supply" = console_order.pack.current_supply, + "orderer" = console_order.orderer, + "reason" = console_order.reason, + "id" = console_order.id + )) return data @@ -92,9 +107,10 @@ if(seller.get_price(locate(params["item_id"])) > D.account_balance) say("Insufficient funds!") return - //Annouce it - TODO: Adjust this / flesh it out - Racc + //Annouce it if(radio_purchase_notice) radio?.talk_into(src, "[locate(params["item_id"])] was requested for purchase, for [seller.get_price(locate(params["item_id"]))] credits, at [station_time_timestamp()].", RADIO_CHANNEL_SCIENCE) + history += list("[locate(params["item_id"])] was requested for purchase, for [seller.get_price(locate(params["item_id"]))] credits, at [station_time_timestamp()].") //handle ID and such var/name = "*None Provided*" var/rank = "*None Provided*" @@ -158,8 +174,6 @@ var/monetary_reward = ((artifact.custom_price * success_rate * 2)^1.5) * (success_rate >= 0.5 ? 1 : 0) budget.adjust_money(monetary_reward) //Announce victory or fuck up - if(!radio_solved_notice) - return var/success_type switch(success_rate) if(0.9 to INFINITY) @@ -170,9 +184,12 @@ success_type = "sufficient research" else success_type = prob(50) ? "scientific failure." : "who let the clown in?" - radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ - at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, and a monetary commision of $[monetary_reward].",\ + if(!radio_solved_notice) + radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ + at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, and a monetary commision of $[monetary_reward].",\ RADIO_CHANNEL_SCIENCE) + history += list("[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ + at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, and a monetary commision of $[monetary_reward].") //Circuitboard for this console /obj/item/circuitboard/computer/xenoarchaeology_console diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 91c59678497a3..19f83da4fbfea 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -1,34 +1,58 @@ -import { useBackend } from '../backend'; -import { Box, Tabs, Section, Button, BlockQuote, Icon, Collapsible, AnimatedNumber, ProgressBar, Flex, Divider } from '../components'; +import { useBackend, useSharedState } from '../backend'; +import { Box, Tabs, Section, Button, BlockQuote, Icon, Collapsible, AnimatedNumber, ProgressBar, Flex, Divider, Table } from '../components'; import { formatMoney } from '../format'; import { Window } from '../layouts'; export const XenoartifactConsole = (props, context) => { const { act, data } = useBackend(context); - const { stability, money, purchase_radio, solved_radio } = data; + const [tab, setTab] = useSharedState(context, 'tab', 'listings'); + const { stability, money, purchase_radio, solved_radio, current_tab } = data; const sellers = data.sellers || []; return ( - +
      - -
      {`Research Budget: ${money}`}
      + + {`Research Budget: ${money} credits`} - +
      - + + setTab('listings')} selected={tab === 'listings'}> + Listings + + setTab('requests')} selected={tab === 'requests'}> + Requests + + setTab('history')} selected={tab === 'history'}> + History + + + + {tab === 'listings' && } + {tab === 'requests' && } + {tab === 'history' && } +
      +
      + ); +}; + +const XenoartifactConsoleSellerTab = (props, context) => { + const { act, data } = useBackend(context); + const { stability, money, purchase_radio, solved_radio, current_tab } = data; + const sellers = data.sellers || []; + return ( + {sellers.map((value) => ( ))} - - -
      + ); }; @@ -37,7 +61,7 @@ const XenoartifactConsoleSellerEntry = (props, context) => { const { value } = props; const stock = value["stock"] || []; return ( - +
      {`${value["dialogue"]}`}
      @@ -51,3 +75,41 @@ const XenoartifactConsoleSellerEntry = (props, context) => { ); }; + +const XenoartifactConsoleRequestsTab = (props, context) => { + const { act, data } = useBackend(context); + const requests = data.active_request || []; + return ( + + {requests.map((request) => ( + + + #{request.id} + + {request.object} + + {request.orderer} + + + {request.reason} + + + {formatMoney(request.cost)} cr + + + ))} +
      + ); +}; + +const XenoartifactConsoleHistoryTab = (props, context) => { + const { act, data } = useBackend(context); + const history = data.history || []; + return ( + + {history.map((value) => ( +
      {value}
      + ))} +
      + ); +}; From 126ef7493ded4ea4c3c01eb9d629f8db0800d4c3 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Apr 2024 23:36:55 +1000 Subject: [PATCH 156/339] Crush some TODOs - 15 4 24 --- .../xenoarchaeology/traits/activators.dm | 1 + code/modules/xenoarchaeology/traits/majors.dm | 2 +- code/modules/xenoarchaeology/traits/minors.dm | 62 ++++++++++++++----- 3 files changed, 49 insertions(+), 16 deletions(-) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 99e20917aedda..892ff07874326 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -388,6 +388,7 @@ This trait activates the artifact when a coin is used */ /datum/xenoartifact_trait/activator/item_key/greedy + material_desc = "slotted" label_name = "Greedy" label_desc = "Greedy: The artifact seems to be made of a collective material. This material seems to be triggered by inserting coins." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index b16a3523ecd29..b9a8e956056fa 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -51,7 +51,7 @@ //If there's an exposed cable below us, charge it var/obj/structure/cable/C = locate(/obj/structure/cable) in get_turf(parent.parent) //TODO: Make sure it's actually exposed - C.powernet?.newavail += max_cable_charge*(parent.trait_strength/100) + C?.powernet?.newavail += max_cable_charge*(parent.trait_strength/100) //Get rid of anything else, since we can't interact with it dump_targets() //Tidy up focus too diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index e79b1bf1746c0..4aa9c7d2d5580 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -119,7 +119,7 @@ label_name = "Dense" label_desc = "Dense: The artifact's design seems to incorporate dense elements. This will cause the artifact to be much heavier than usual." flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT - blacklist_traits = list(/datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/ringed, /datum/xenoartifact_trait/minor/shielded, /datum/xenoartifact_trait/minor/aerodynamic, /datum/xenoartifact_trait/minor/slippery) + blacklist_traits = list(/datum/xenoartifact_trait/minor/sharp, /datum/xenoartifact_trait/minor/ringed, /datum/xenoartifact_trait/minor/shielded, /datum/xenoartifact_trait/minor/aerodynamic, /datum/xenoartifact_trait/minor/slippery, /datum/xenoartifact_trait/minor/ringed/attack) weight = 30 incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE ///Old value tracker @@ -327,7 +327,8 @@ /datum/xenoartifact_trait/minor/sentient/proc/suicide(datum/source) SIGNAL_HANDLER - qdel(src) + QDEL_NULL(sentience) + QDEL_NULL(mob_spawner) //Spawner for sentience /obj/effect/mob_spawn/sentient_artifact @@ -473,25 +474,20 @@ Ringed Allows the artifact to be worn in the glove slot */ -//TODO: Rework this - Racc /datum/xenoartifact_trait/minor/ringed material_desc = "ringed" label_name = "Ringed" - label_desc = "Ringed: The artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn." + label_desc = "Ringed: The artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn, and catch information from the wearer." flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT blacklist_traits = list(/datum/xenoartifact_trait/minor/dense) incompatabilities = TRAIT_INCOMPATIBLE_MOB | TRAIT_INCOMPATIBLE_STRUCTURE ///Old wearable state var/old_wearable - ///Ref to action - var/obj/effect/proc_holder/spell/targeted/artifact_senitent_action/artifact_action /datum/xenoartifact_trait/minor/ringed/New(atom/_parent) . = ..() if(!parent?.parent) return - //Artifact action - artifact_action = new /obj/effect/proc_holder/spell/targeted/artifact_senitent_action(parent.parent, parent) //Item equipping var/obj/item/A = parent.parent if(isitem(A)) @@ -502,7 +498,6 @@ RegisterSignal(A, COMSIG_ITEM_DROPPED, PROC_REF(drop_action)) /datum/xenoartifact_trait/minor/ringed/Destroy(force, ...) - QDEL_NULL(artifact_action) if(!parent?.parent) return ..() var/obj/item/A = parent.parent @@ -510,21 +505,58 @@ A.slot_flags = old_wearable return ..() +/datum/xenoartifact_trait/minor/ringed/get_dictionary_hint() + . = ..() + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pass attacks on the user to the artifact, when worn. This only applies to attacks involving items")) + /datum/xenoartifact_trait/minor/ringed/proc/equip_action(datum/source, mob/equipper, slot) SIGNAL_HANDLER - var/obj/item/A = parent?.parent - if(isitem(A) && A.slot_flags & slot) - equipper.AddSpell(artifact_action) + if(slot == ITEM_SLOT_GLOVES) + RegisterSignal(equipper, COMSIG_PARENT_ATTACKBY, PROC_REF(catch_attack)) /datum/xenoartifact_trait/minor/ringed/proc/drop_action(datum/source, mob/user) SIGNAL_HANDLER - user.RemoveSpell(artifact_action, FALSE) + UnregisterSignal(user, COMSIG_PARENT_ATTACKBY) -/datum/xenoartifact_trait/minor/delicate/get_dictionary_hint() +//Foward the attack to our artifact +/datum/xenoartifact_trait/minor/ringed/proc/catch_attack(datum/source, obj/item, mob/living, params) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(cool_async_action), item, living, params) + +/datum/xenoartifact_trait/minor/ringed/proc/cool_async_action(obj/item, mob/living, params) + var/atom/A = parent?.parent + A?.attackby(item, living, params) + +//Variant for when the user attacks +/datum/xenoartifact_trait/minor/ringed/attack + material_desc = "ringed" + label_name = "Ringed Δ" + label_desc = "Ringed Δ: The artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn, and catch information from the wearer." + +/datum/xenoartifact_trait/minor/ringed/attack/equip_action(datum/source, mob/equipper, slot) + if(slot == ITEM_SLOT_GLOVES) + RegisterSignal(equipper, COMSIG_MOB_ATTACK_HAND, PROC_REF(catch_user_attack)) + +/datum/xenoartifact_trait/minor/ringed/attack/drop_action(datum/source, mob/user) + UnregisterSignal(user, COMSIG_MOB_ATTACK_HAND) + +/datum/xenoartifact_trait/minor/ringed/attack/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_MATERIAL) + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pass attacks from the user to the artifact, when worn")) + +/datum/xenoartifact_trait/minor/ringed/attack/proc/catch_user_attack(datum/source, mob/user, mob/target, params) + SIGNAL_HANDLER + + INVOKE_ASYNC(src, PROC_REF(other_cool_async_action), user, target, params) + +/datum/xenoartifact_trait/minor/ringed/attack/proc/other_cool_async_action(mob/user, mob/target, params) + if(user == target) + return + var/obj/item/A = parent?.parent + A?.afterattack(target, user, TRUE) /* Shielded From a70e5e877b06da5bf017fd3a02285d513ae353f1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Apr 2024 23:42:52 +1000 Subject: [PATCH 157/339] Joe M. Mama - 15 4 23 --- code/modules/projectiles/projectile/energy/nuclear_particle.dm | 1 - code/modules/xenoarchaeology/traits/minors.dm | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/projectiles/projectile/energy/nuclear_particle.dm b/code/modules/projectiles/projectile/energy/nuclear_particle.dm index d14d8718695b8..525446242e33c 100644 --- a/code/modules/projectiles/projectile/energy/nuclear_particle.dm +++ b/code/modules/projectiles/projectile/energy/nuclear_particle.dm @@ -52,7 +52,6 @@ name = "impossibly strong nuclear particle" damage = 30 -//TODO: Reconsider using this proc - Racc : CONSULT //TODO: Consider adding an atmos requirement - Racc : CONSULT, PLAYTEST /obj/projectile/energy/nuclear_particle/scan_moved_turf() . = ..() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 4aa9c7d2d5580..4aeddc24d69cd 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -879,7 +879,7 @@ var/seek_distance = 9 /datum/xenoartifact_trait/minor/haunted/instant/haunted_step(atom/movable/target, dir) - //TODO: Check if this is an expensive no no - Racc : CONSULT + //This may seem scary, and expensive, but it's only called WHEN ghosts try to move the artifact var/list/mobs = oview(seek_distance, parent.parent) if(!(locate(/mob/living) in mobs)) return ..() From fc54605104e595c5cf1cc66df962908b544fb976 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Apr 2024 06:07:10 +1000 Subject: [PATCH 158/339] Kill TODO - 16 4 24 --- code/modules/xenoarchaeology/misc/tutorial.dm | 32 +++++++++---------- .../tools/console/xenoarchaeology_seller.dm | 8 ----- 2 files changed, 16 insertions(+), 24 deletions(-) diff --git a/code/modules/xenoarchaeology/misc/tutorial.dm b/code/modules/xenoarchaeology/misc/tutorial.dm index a7c316985e1b3..4a4ada637039f 100644 --- a/code/modules/xenoarchaeology/misc/tutorial.dm +++ b/code/modules/xenoarchaeology/misc/tutorial.dm @@ -5,26 +5,26 @@ /obj/item/sticker/sticky_note/artifact_tutorial custom_text = "Hello, ______. \n\ \n\ - I hope you have settled into your new post well, and have begun your research.\ - Under reccomendation of ______, your outpost has been licensed to research class-X artifacts.\ + I hope you have settled into your new post well, and have begun your research. \ + Under reccomendation of ______, your outpost has been licensed to research class-X artifacts. \ We hope you'll appreciate the gesture.\n\ \n\ - We have shipped you some samples to get you started. The one supplied along with this note should\ + We have shipped you some samples to get you started. The one supplied along with this note should \ serve as a fine introduction.\n\ \n\ - To start researching an artifact, note its material. If you examine this one here, you will find\ - it is a **bluespace** artifact, this lets us know which artifact traits are compatible with it.\ - Use your artifact labeler to see what materials a trait is compatible with.\n\ - If you're wearing your science goggles, your proper PPE, you may also notice another, more\ - in-depth material description. This will hint at what traits the artifact has, and can be\ - checked in your labeler.\n\ - Another piece of PPE you should be wearing is your anti-tactile pinchers, these will stop\ - artifacts from making you a missing persons case. If you are wearing these, and have them\ - enabled, you should be able to 'feel' the artifact, your science goggles will recognize any\ - sensations and inform you which trait they correspond to.\n\ - Finally, don't forget about those dusty machines in the corner. They can be used to measure weight\ - and conductivity, respectively. If you label an artifact then weigh it, it will tell you the\ - weight of the currently labeled traits, and the artifact's total weight. You can use this in\ + To start researching an artifact, note its material. If you examine this one here, you will find \ + it is a **bluespace** artifact, this lets us know which artifact traits are compatible with it. \ + Use your artifact labeler to see what materials a trait is compatible with.\n \ + If you're wearing your science goggles, your proper PPE, you may also notice another, more \ + in-depth material description. This will hint at what traits the artifact has, and can be \ + checked in your labeler.\n \ + Another piece of PPE you should be wearing is your anti-tactile pinchers, these will stop \ + artifacts from making you a missing persons case. If you are wearing these, and have them \ + enabled, you should be able to 'feel' the artifact, your science goggles will recognize any \ + sensations and inform you which trait they correspond to.\n \ + Finally, don't forget about those dusty machines in the corner. They can be used to measure weight \ + and conductivity, respectively. If you label an artifact then weigh it, it will tell you the \ + weight of the currently labeled traits, and the artifact's total weight. You can use this in \ combination with your labeler to deduce what other traits the artifact has.\n\ \n\ When you're done, be sure to label the artifact and hand it over to cargo, remember to tell them not\ diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index 906abfbabb0b0..ee475484abf57 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -54,14 +54,6 @@ //Remove stock and prepare to replace it current_stock -= A addtimer(CALLBACK(src, PROC_REF(replenish_stock)), restock_time) - /* - //Return a supplypack - //TODO: Make this just return an item, and have the console reuse the same pack over and over - var/datum/supply_pack/science_listing/SL = new() - SL.contains = list(A) - SL.cost = A.custom_price - SL.current_supply = max(1, SL.current_supply) //Bruh - */ return A /datum/rnd_lister/proc/replenish_stock(amount = 1) From 0c373b64cddc3a6eec5385e216cf78218d8f2d3f Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 16 Apr 2024 15:19:47 +1000 Subject: [PATCH 159/339] Icons - 16 4 24 --- .../modules/xenoarchaeology/misc/materials.dm | 4 ++-- icons/obj/xenoarchaeology/xenoartifact.dmi | Bin 77936 -> 77669 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/xenoarchaeology/misc/materials.dm b/code/modules/xenoarchaeology/misc/materials.dm index c29330343fbc2..f8678a5dd9baa 100644 --- a/code/modules/xenoarchaeology/misc/materials.dm +++ b/code/modules/xenoarchaeology/misc/materials.dm @@ -68,7 +68,7 @@ material_color = "#88ff00" instability_step = 25 texture_icon_states = list("texture-uranium1", "texture-uranium2", "texture-uranium3") - mask_icon_states = list("mask-uranium1") + mask_icon_states = list("mask-uranium1", "mask-uranium2", "mask-uranium2") custom_price = 450 trait_malfunctions = 1 max_trait_malfunctions = 2 @@ -96,7 +96,7 @@ material_color = "#006aff" instability_step = 1 texture_icon_states = list("texture-bluespace1", "texture-bluespace2", "texture-bluespace3") - mask_icon_states = list("mask-bluespace1") + mask_icon_states = list("mask-bluespace1", "mask-bluespace2", "mask-bluespace3") trait_flags = XENOA_BLUESPACE_TRAIT label_icon = "star" diff --git a/icons/obj/xenoarchaeology/xenoartifact.dmi b/icons/obj/xenoarchaeology/xenoartifact.dmi index 6f5265b20340b6941483b2c60e9a7340e2d3066b..970d430be37ff7df63a058a9d729ab0a7dbd962d 100644 GIT binary patch delta 13134 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 delta 13403 zcmV-hG^ESr-URUA1h7y1f15|ibynxzzcbf7^gOAh)@%)yEy1?`OZ%i1Dr^DVD@T>>q(2e{ZpQ_9=x{UFGVz z3LAC@SUY3PUuM$#W|OtuKG(M=S$A!S>u#}F^@==%T#h`EWb0muHT@dZs!Hq2N=#0| zeZPXGa+2=lMYuW#u_7$Wz>*1AF$uTkSa?;1S4301dtsP?54`|AdDzoe|AEgOHPo3V}K&o-?>o@fB9Ataar8);tqseh*h8`3yG5Oeh3ll z=;rB1Vmw;Su}C#|xt}KH`)pQiws|J)5t%o=%!gIuP}HE^hVLxquf8Dh;DH=33%B#X zQhnUj(Mi~qdAK^p55{xc{`MP0E>3-?$Mi(rjS~O?imuSvf0-7$BeJN&3TiT=b-7WX zmK)?ZJRVgSThetYj(S~|X}UyXI_bVB$*u@vgE^$yvP*awqC(xSx=aj}MZ%-wV>_az zED}<|4~VseFk%`;NJCK-!l4imBSc3sg|2EuLm?DdER!mhiD^5cJ}ac*`#y!S3b~;Q zuI*FISQxbge?s36Y8CazYTD}F6-bR3SzTbPUK{7vMg^A2WLyoq$yN^UX zf#up;#(XC>5BBNhe#Vnia-NhmhSUa@b`~cR!=!qqwe%>p7^3 zg6q1df2vALx<%whMWTem5j@Ys_gqHCM^I#uiQnGVK|C5Kl2*{e(9zn-$mlTCig9&a z7t6#yzc=yMYI+oXk-^*@Ngm6YeBh5PjE^1=r59V;3GI&3^_l`#-L)V6jzQwLA7SyW zCFaZx7sYCO5wWo(;4cfuvQf2N4Be3;0JERl8>?`VRj9*nVnSBUOd zm{nSY&S4#1Hb$gk@Zh5w&%a>NGu%e^Vh0u!z|w`>hGjt1g7yrd>n2cpi_n*W=X>Fs z^ZBO-eg40v$JlhFKwC9LPpO4p?Jm-HC`sF*GW6xd?Nq5%NBSz77cl16pEOR#td zA^|*~Wccgdd~r*O54Uvl@wXaicaFd-Ct0yN##?{W$q(!due<9;QD|8UmJ&c|!m4er z3q`*~DoR*4s5q8r#aj`%Ck=(sTB(Grf7J7GgqI-1w*)Z-z7Vh1G@${M?1>PGggCl0 zgBDU6f@gY7;H+A($&Lys)Vf@%(5(rG$MuGNHLQ?`L`g+s7@CHmiXu$QwJBAr6e?w^ zRxQq>i=CgsSeenmJa$=VNIR~Nrpkm9dMyp$7?FCl{35>=D6d!Ft05ItuLr}0f0)0j zi$Ha}BTP$wjP{Nst*InoBZR8RjRMGArNq9cN5~v4^UT)G$dZhvYJ`jswqxUZE+A^c zY)8bd(#fb`*8l(@07*naRHbr}WFk#G7N=Y;QLR={WCh1{C=~L9!Vz-C9J;1q znkJdbQTlrN7#SZSolKL>XNbk(XsSvom1b`5Tv5lShbR;an6}8&u2d_yf38a`5@Vo$ zKDm6BgGUaqd;e~-g)D6?ZFIJGkt^m<6cy8~i0Sy3A7Av>YE*@xB!?f-*g9ge{_Q2y zhz$R>089y9Ge%U?aJKfKJh_};e-~EZ&~amt1)Vngx2Zg_$Kx$8^N6pIcyyb`lMhEQ zAMM20(o240A5VNI&O<+vf7t)LL5~`yyH~=kh6(N-CbaA@jK)}Mb&wrVczmZ#_r4A~ z$J4N(7k)4o9+-o@r3FO|!9W#S%8*OJx99VvUj+Q0ojDFyT*@9~m4K{NrRv&jt5#Xn z6DPj7Qd3g&fe@9aQv`=1eCi>I4bLb%{cw!lgI%<>InZgr{$BX;e=?+B48X6GP>$2O z&|}Y#&%Uz5CacIc)1)ZF(vA>+`>GJUdq0HBA~v?GiywX`%0|1w-{0Jg{_dl2!%^tU zLaU9T82sS59Jk%|5@cD%^F^|qRdO14enk;GMzLgsXecZy#1&rztm}19HKDPF?5bDy zh-#060N)p79Fiome}LQO$BD#4Xo|w&=O+mqp<*a@<5Z#BQ*m*NE~a&?+{39Yti`}C3pK`i zR=DQ|4Q~fu?2c)*Z0)*On_d%4Gh!NTeF?%botAilL?nWte~CbJXpHWTZWKksvQ13OB#}te zmc0&At=olVf7vLCf{*ZSQc2Nm!nSQ<(HI0!DCUr51%iM`B!aFPnAIwod;I+>cJ` zqERGSL6JnAm+d$;O(h{2QYn{7#1lj!QF^=j7@Zi!fA@Xz#T?3iy>|Uy$B(4g{!pCn z{?cMuSA^AX$-L6#j==sFe)9Pc-+jp8CwnaJ-)6G?(J=8NA?CfKN^2ru>!V59 zJcX<89%0p@fO(k?4n61c_+Xi5Gd2;`XK_NIze^*NsIaF{CR0)Axn~nmtq60AbSy1$ zO(e2R(Q5g ze>kb5g%qrkLp5(xt-7d+h&|bk*XYJ!)H0!kCXa-#3h9iBWm2^S@dQCo+cK80Oo!q` zm5~>6R0>W*uX!SC)*9=nMB;j5NvVYt6ivakeVp2^U|mFMevolIfb7S(E%idm&xDUr=*DV2rzT*a&scpm9=3(FQSV{B}MSR_`{j1Gu~qe5j- zQ5u5r=|l@HsTKm?CzH>h>!Qui+&KfxiC@J;X$Z%0=xpyK5ldp(mLPT87F{-Ce{u28 zmY}=6i&P>_S7ZO3s$2EMAP zLJZ$^DVB;~RsLsl8NwkkmPPXy0}_d7oMa+NM_VTonQ=jso-Yy- zC2^CCgu^xQ|2PMZ9KiED)X)8}e~L0Lk#njnm>cD_?iS^g`li5x-HBTj}8%|0(Km955I4i@SA+zeQ-J7`Bs@tW22Z+m5?L4e?V@WsPMUG zP41cO$Ff`b$z+Zl*$EE$J}FsdksKxBD?IO2sQ5lzhR*VSgCAxl`1H3d78)_avc^Hj z!^@*aPos;bWTz*!bxLq^LevP8jKuK60j=E*MzqT0p%P}{m{_}8+otzyuMrQa z*IOmJB7_qfv9=JN?+KaAKxk*nwOuzPA%Y)C=_ESBlrt7a(Z+Us6AVMavK1WHr&zWz zEtg(ITb$x}m%<4FK7Vtth!NLG^+tu4fJ-=HP%_2mWV;S!%S4f7%4QX-DysamN6I|6 zWvnLFFQF)6$x^Ru&*UcYeV=3^MJAUanMjg|B`~cj1gZ3FhuEt=Xpq0lzbLi(rt{6kAGl9VrZ&PsZ@X@%$qZh zYNbM^kRg}P)yf|ftU$yBO|uF?K)SZP8=V+I>sE0c8_PCP6orBQ`DAlhT-Tvcw6Ppp zs4J*Cm2#Pt%T_TqF~-Vet2li05DVrlVDEvw7`j0+mSl8t6jfG{WtqK)_OYOU0o7`m zkWteQ_kD&(hJR{3!z4P}J26d@LMe}BnZzP7CbHv=oGe|_krf%svTC_OK0O^h>^-y> z^}P#Q=^gM0&n=U9Sss>^IP&WR_djFu;g1*bMl~K7vUuamqb$B#M7mj7Arkl5_7@!t zKh#F@U1KbGiO0W=dsO$unasr*d>)pr^jY!t99oxzb$>8HJ`*GGJmT$nx^AfQ(zr%= zC=HWwFf8Q7Hgx9bS!P3Ap=A3kK<0ybH$@4)`+k-fAr>YK)^>&%G#s{$ zWjX3pa07*^AJC#oEEv$Z`t4bw&nEfLN2+YC*kp_fc3`3CA}hMQYcM}L zNySkE7IkZQuipo^j>B^iI4}on6*|ha43sz=2wBj&XCW&hvCk~nRB~b>+7*|{qR=&p zg(Jj55diEC7e$psW51GvTvPt5FU4e8BGM8foPW{@$2DT@;YOmNI7kSE$+ab%R3jj} zBDViiJrP{fWqi1d1SH}*j^mRrS~#xH@MxK8)y2>i5}jgcQqRh+*IZSy7R7OsQrSUM zC3H>1ZR(n^(TIkjD}-v*`m!QERl8c#!;YxvQK3&HYSz5Ql5KLoM>r+2p`&R*#FMfh zihugfVl{7*8>%odQfBYLJgO=a4Xa|OP!qLQejt`Kp6{WmdSgpFSID8t3h`)yLb1@u zo$-C2LaBhP$aua>q|>4}B;+Uh`{uE8aJ#7Ak|g#W-pAETR|!wbtfE#zL^^Gb43A+s zHkNDC)7eKnmf%R~dHP~k5jZ8<(h4KvBY${~i)C4&O;HdK_#UdF5sSo0#1o8;k1#Se zOuiuUk&=l7(Qu4pJk8kTC`XPS#`9e?O-IvoWJzLh?+Yv(SVXx}p-?I?HaSK*mBw>D z;w=ffI(l$3QTF9FqiZ?`j~ozAmn5NUIp8{!VVTMT!Q1c*p5ZMm}hK!RDUcX z<05k!z_d)-TiVIyvt;vGx;wkEY?E{{g?iPUPod1w&=U%brr7(9R(|qxgToaEUvsFM zA&!_9%erb?#Rn76ZW11F>1@@>WE{vzNT~{j5?~ER*}PLFCOcg7nmm#fX5*J)Ja@q7 zs3T#h5(^?}7A-YdbF&Wq=y8f0l7C28QN(1>eV+kc;d;WjzRR%pgp)dlwTOK|>q5zO8RpU4P7yLpW&=YY$V&TEvSErHVr&q@pSkU{Ez(s-}l&Rgffz z=1kG&i(`ea#j=g63f0DtuAqlRz_`JGK|nmJHAu;Ge6jRWBwW+QwS-p~ifLFSmrBNL zctORS2*^ij#j4eu&dF8y+3_l)6IIGpu~i?B>BJ)SEoDK5oo!tdN`D0s(FD0-uC_Eh zmT9c28tG7&k?~q;4W5Y~l$B9Ry=$gTBWjBf@5z@mfU%Z0N&pksV6v1{KbWJB7 zPvF>MSz}oirE;0WLw}+xMQ>Lhx@J(RmIxUJZmodUaUD9_yK9Xq#m|8w`&qhR8BaYs zimIs0>FLL*C5x6u6k1YY*0sNqXAl0Cz^bBZn#jbqEm0t==(xVej=>$wpEJ$;7O9$R;AVQ%j{G+pO~y}Ph&TVz7#A6`pmyMlE{Wq<2tmtCVC6Iqvh(!$Qm z#3L{tgNf}f9T^4YR)K)RCWS*miT++4ECq91#vBRptDlE?!O!xcw**M@;MspmFu2d= zy6YTXv#Nwz)hRrhVC#+;EviHBiY!{pLDH+Dz|-zxa-WK8dQ?20gTBKEwOf42Ys(N3}X^(i&4?W8Mv_o<$nO@H)-Cou|&1%p=$6otw{F1 zHeT|6(S0=VM3uX0D5$oAX2=w>7Uc<31c(F3<;oO`RZ>ZjP?w0r&{Yj$kc*0xdb=i7 zAsv@-T=xhRStJ=YTI>V?o*N+5+L%hRMBqu71qZjyBNWj|_C)dB0Ow#)WFCi9LLrri zsZudr%6}Cxxr?>BGewc0XcLQQwL7LlIHaP~GN=9ESo%N^Kscf`cCnONfvKV^RP#2f z;h;xVjHpH=sbiO%hSH)U3vu~uR@`MvwQ)GLZ0u~_YP|PkTqhh-iG_*v>@tRK)N+9KLjWzQG>$7W$z@3<6pG+^B9QO89=2@}GK3OkzL-bTG}OP{l_$E< z$0!)|kEJkd8J8mMts0dHgV@3{x6SS1w||=hR{tM~&Ko=;g#=Ik(8TgQx?eg8fsa4p z6I5mXV?0lCzDazEOJPjo>7xOwm#JL)h7qKe5NIY{=?M<~ulfA)HyZE$NEJPv1tQ?K z!2JXK?m>kX%Rr4w44DpJaSx#cpvyXc)7?kct9L_u2++U{gK9y`QI_47;Pt=k;OU~AV%1@SL=Nd_4|^Z(p9)NtY zL?RXwB?Xd9#1I*&;b={6!*y#h7P;YVNHxy~#1bR$!K^ySlGNC7lQbEtBm%~IpGrI( zZcOA-#%$E4MH4zkSS6hfVbw|RIL?!0>4d`5I_cE)i#$)XmyRWjS_|qLDS!I4QjV}f zC0C1Yb&7f~)lir`P!KJPYFqc3Dr43pH(b|mBx=TEI^kL?Y5?6(j!UYPYLc!JrAnDy zd!A>-!qsRYxOVxqY<_N2Eul`lub$2xJYQt}4(=Ny0NT=R0qFLp(vej zT};~){o^GaRaZqGj-udt9tRHXLy{z}yLKIEc^;}NGc-I-q*D}?9)BG6wr}Efy z5)V8wLPwj%T{jwZtSiwmzYKjASHJx*Bmc9FZ$IKQ`dgDAaOqCSy!w?A?Jv(l+@@u1 znYr6!9^Y!B1_4sor+=7{DVs2F0NlKf_OrRrnMYZ9n5)_>ezhlH{1?{}9w;Ce6O;!# z*m1AQZzfItJ-m!aU%r9Di4$XC(!(tio)nE)q(wOzrtfq6x^ zWh)SZKo)uR*hmMuVB;cw`%4u|Q8?UX@}&>PSn|g&KrV#!m^e^u)Ron9hg9vvW!3THsCUWmYtpV_XQZCk=o5|W_%7fD_!3C6Un`gu zDFoGmEtZXnOr*sC5?E!2%)t_#CkQ7jNe$wu|E_yns(&Uo)Ey;RYP5;1%h+006(bbp zxjma%y<#;0ecf|#J*Uw?&-Faw(I~}onWYPbh*&^CPiGH@jvhvmWwDJ7#A69O-xaNi zH4%)S*FT?q`}c_BEE8FhP!)~M+ny#8i6Wy=DwQxTlU=)a($UrdKv5bZ8BenR@IIl| z7)_8bfsiwh=Lz0(iH|KLZWZj`lGyhw397EAu?)}lC2^IKAq^eW(ln& zfVCN_35RethH^+FMZlLo6XIs2mGQE}15y>cYI8R&bYE43vcV^MIw^NY7_wCUeDfj3 z@_$u2iUG7bAlaZ+36wG(9_px0B`;HORIH-HNOY2c>wp6qV?T^DHYW3TuV^K`c9_=D zB%l4yETum?Kxf#+)Rq)&qMV>OR>ieEjHpI=(rS1(byTtzYAwOgb9@ZPN6|(5 zoa0HTYP#sP`m>NMq38-)i$ORo1l;V3OJTTDyRLu2`!^zL z!zHUd>GepNF~##s)k{NFmwao z_b_ywAP{2w&un`dfNPhp;lPpoSeC_jW`geaF4|h#IdEh@o+H{u2Y!I%Srna}JoVT? zTGMSrBT-~z5v%cyT9Tr;Ik=vSUL&D;kT?_y6N|+O2(TTO$9DdVxyfsYbbs2IMWGiI zGDOj|sqq5VX(FdsI% zh@?CC*2EsZ@=OsU5hCH~l!qjoz@{Sm{A{$un%}jNj^^lU&*Ez?j%MLyq9i6mJP;Z~ zaz}~Vy_EF{oZdDvK?j4`faUT83szc`U$GZ*^Lg{8UUshEOe!fM?|hoXlPzc? z2l&)?CizEmHOl*5AYJH$FUN7$IaF33BHlR;x<_j%gwo-Yn}`$phc-UBdxSS;QoQB8 zU0AD3l3EWz$;95%jd9x^KG|{&pZvEpykIcC-e;sYLq2Oa{z)R4RYFmPsCf{8>IqVk z6bZZP;SN^_#WW#LVSgxCWsyHr4?v4GcpzdN6{R6zYL!&fkRrC-Yki}DMv=X-RtcF^9|$-ta>Y=2%T6Bit!SieJ9a&_g zyRM7xddRg#1U^2hq9JJ#(QpjM79BQx-v>$D_++V;KY!*6F?$I|9P!pFmHazkL>0-U0>F}aXp5$km^y}BJ4^DUN z*+^nK$A5Lcug?Ug`dLAffSNc9E|=xc#gNeYTmLlJ@W>Y~$_tn(*<5Nem<@8N+dW@W zJ=3w$7hkm^h%OGF?zI_5c~B(TUCH)W|HVID@Z?y(etj_G?)^C?@TC~TRK_t~=bZLB z(>T$m^Rt@jxMtes@z+1sm`)yx8eJS_=_{_9u7B~J7k2SHz!h)*LQwxl&olwly^qsP z+k78#;2ACt7Mi;^7(H)N>b{-_)$&)`QQ-uyyupN z2Xdv`KVO_~jeV&n*aZ#rH~-}ixaU2$u>XOBd}8urNSijDVE+v_ zzvhCjJ5}8O*nghYe&LA@%5S)f+=|sawD@&wX}OQ(%U7~vhiJFk-``I>oU)bU!?Vf`7$PWq_a?jFN>`G`QubD^IY$VMgEW^x$k> z&`hKL#Xj8~_IMIH;WcS3moxdCFIis<`CRUv;wjtkb>e~3lh0Q_dXV>ju^s;9%>aD% z$sf(=0DCeIvTlJ;^?!12j&%!CJh?YVYN;jWpAFcy{h7|v;Tc;Up%Mr+>Ra3(cjF`l$Uvmwy+tjmwREPB)%YcER%beB%cM>Ev>Ge)Yv24DI-z zeCocd(Pl5>6951XTuDShRKsoP;WhyNeBGPRXz*>3Q-96}H^{$c-GUTKHHT8o@rG4` zh~BU&MX9@kZJWkWsyS|5(Lu(5ZJSOcpGUTf*WVg?aLP8-aER?|=iuD39e?MR?ezB_ zTb9)y*GULK$~pM2gTc?ejPHGQkbnQ={XD*CDc^g|pYokQzMsv@<}o-jhrz>h7<^*R zX>Cp?PB&35Wb&N$oZy*@-WfaJ^G`d8>LkP&$ft=JA)lGJ<|!UfGMNMf5#@4uHvP*H z09M`^LJ$85sZ^4=bNe}X@P80`xDC5Hal-lMOEPD|o70b>R4cT_bVf6#~WArt*Vmw$1Wg9kF5W0>(+ z*-UOqT;S($rZJu30qx$knccfKGd8@JuYU9(EAI@k@=j3+YgZ@8<%D;XN(rKxi6vN1 z=0Q4R@Rv{Q;v)|{!Emj8aQ*jR{pJZi^1u_UTOd549ghvtoz!`9Zw@bL@z|HbGj zC)m{qqQ)Q}{>6!F?CJ7+-Wqz4wpA%U^1u_^`v*6$<*3cT^?!TG0|UK~2R^!bHP`g& zeB^;Aczyp;G6s#f(38MTJ;F2Eh#;ShLl7Glf1eAL>s|}|$7xBYj>g{^So8Wf!`F@l zr;Eir%a^Zg99#dpSj?Z`Ilbs{npn)4Fk{Jp$CJ>RVnSSg6L=c-!b`;O2$zmIf!1wZ=WJNfpvzteba@BaM&EEpI#t)cqs=fcJz zctg7&8RsJpvmB^we$xrZEdTV6ae#YyB>><5%^0!aF-qMX$B3r8qj5bD9??|bL|XwG zWN~uvx&GW|K5#vmg2#Pd+b+Bx1le%h@8c1VCr==zbAMsBlix1H)jsX<(-0Is=Qz$m zf|pa?(1na+wwIqXiPM&1q|+%T_Z?|GPN!4sdTKKZ*Q{XIQ=56yjW=<9|57&G|MSK< z3kC*QFfhR0{rgY*bL7w=j!e-57%jo_Pyd!bzCFet-yS2f`o{p2#tsr${o}^-&PN_* z%Tci`tACTv@kDb|&#`O9hR3F4+YYrf9v@FQaLgMzbm$P7g3z-0^7qGh-K%b3#nK+u zc%NWh>iewmKEWFA6RcR;!-}On?AY<#X-Vl!m~HZz^10_)iXG=6UFdr{>v{F-PhmND zv7hNwGJI!(^Bu$G zOg`sZa&abHP%-L{f47mZ-S=-ib8wK(zFz+DuJ@mEOr3bvu3gI=cicg-SVY(LDcjKQ zeI@_&V2OWvu!ObqRm3{xqJ%0`HovLyynlA@E6;k3I_cP%sd+yD$xT1P?7xNEx7^nt zn`<(6qCL8TYchB8-n*~j?)NVNgq-OY9z524L5ZB2NgWQUCy>;+FkN@i>AV}CHwm2~ zHgu_y?=Hsfbd2M4_AV9qTn?mlKJWFE7?7_V4ZJ(0Gdw&@;Z2>sgYC@vGs_F}GVg<2Ch`sl|T)q{F)imb{Ai-YvY+ z`W}Zqwhl&QR{Zlf3Gdo~)>+_RK7acpJ@4Gl7v6d7JY&Z@@WOLW_}g0kT|V>u@(IsP z1sA*JJ5xCzXC2cS0>T$ErgOgc(-7Q-N4_AfNW#Op=bewLk><9RY zjC>pkZGY^yboTYq+1JbHk)w_0zw_fCLUod7zW81iwFuGcl?z1><|nBkc7NXce!Bnq z7v~(%#vypa?Io&PV}w_gC;{L6{%#JA>;_j+whvJ1fc9nXxI8(D>W` zhD^s?I^uEW{O^0{-ZPJ*YwqItm3QIY{ysu;fkSiH`?Ghj;B{h|RVNlD(vMp`+_+Yq zgpNOEsyO+JGaHr9r@Qv7kALGVJ8#onGIBX+=}gD=ubeveWNGTmB zQmo(@IXQfWH@o<$U~;H#J_5`4%PF!1KStrl%BIs`DD>osMLVe}7&q#d=OT=6D=T zEWy_Uyg649yJjuXUq4OPj?WW){fBs=<8_$6SWc~cYCSylWxTf?+uiXhrv}-L9q&N- zkM+R%+B1Xa{0vUU`RcCB)Z{;(fbfirqgLa!zR_c2<}m9-dxhYX7*M9CmDKP=<98(< zL9^@=mS!LR#fHXD9e=+Lx3cE;9ROVQx#w8+`R(HIXP#!~Ju4c2PX(Fh4gg@ja24LZ z9mIUA@dM!P+kyGQRkW;}*Er{Rk~ul%bGqlwg!a;YB1H?eV&N`bhq-zglW+Sb`)_^? z^n!HwM9voEQhR)w7|`*rUn%U{g@ z{2#LH;V(01@P9G%(Icqk5-9tyZIJfEz*A42@!XR=pqV6}^U)-}Se%P|P9cViB%zD- zDyD;knz%GLWeHX%pOb&*y4#2pD`&mfufwgp`}Q4ddT=>^`VZ~gci(+<-`+jt05rg^ z*mW%Jf<1#m{$fw<`GdpG34!K=!_Eoko&5L7nA@%K+J9TF=eaGDXFV=hHXqrVK(WR# z=PkoYwc&*{NCgD#Fj-x~wL{x^cIgTh?z)HPuHV2{{_KYU7*QRoEQs+R|KSe2w{4ga z5<1sb?@ZnCPPz7RNrtDqc9GTdC#dXQLMf2nH}7Y*Fx4e^Lz4BIPrq>>|nIbmyN-7W86pzChw#B%S~r_RuV2}$o6!27MId9oGwpD3fA0vQ5Si!6TocSf8>#O zT{aW?Y?u~FjVWH^av-`hO|IGOa(b!9GF4oR=hbXX*u*(8U4$@|?eWWjeBjgxG*i{? zr+>41E<2ZMEK|klKC7vo+w_2%9?)5Fxe!7Vzn^G&Kuw$#P4a1CCLulY$Ro2oh9;Vr zHQajZt+PFZD;lR{LZ1znD%YTCzlkQU44l&gnyt*xru`-^1)3hv?Bc8hG#z;f7jyoV zZoi3Rn5k{?CIQVZW;6&r+XZ%4y8Yh=tbbp>J~-Rwc&^u*xV$mryI`~Z<+#%AznF2p zLTocRmL_Hf=M{u*;_||!sQsC(CVv;&&%U|reR1K89?%(^%v~Z}>GscsGfmK$79wkU z8cj?m&KQI~;}>m;?RZbdw6!IT$LR_+n?dN=#rem8&VMGi zc_}=EE8YHOjLSJ7eDb(1*KuBHI4uE9sTcRjlkFUy!L$Yxf6wi|*m1eN*GsWnZQ{ak z3IScvKV^!`lBrz#O1D2oaN&uF^*jGeHKJ?U2hMLY&6Gsx zrJkslO89H0Z8ULiOiw2CY>~k4x&3A)@XVk|K9>(Ea&eF$phvOZ4~5{&eDW zlk3Ge;a-emZsPoL{-qda3%b@P;RPh>HSM2>iz!8z&2ACLAAg~?X4;!;mVazqJ~%%D zn(4{iw0~LQVt4H7kI!eaUx@xvbNTt=#ncICs*`V~ypSv1{w2nA*OX0#gwAEN>9zd+ zVd_EX^O;aH5tO~s?O#GnN0-hfnwSb^PL5-?J%AUv{R>%ITuK6Hl1&rSfo5BtCSLS7 zUovcx=jDT0A)wj*0=!u4pMTFdXZt8p4 zBqiWN32Y`vy@{E}1;v1l|0mAI7U-2`zi#hR$)lbt{xs8*_(HFLrqAhOuGz%QqM?X* zu_}8PTL5^a+rJ!fB~0X|BI4}g1WDHExWisd|E4S5eiN4-O#+%-G&p<1H*rOyNkFrU xW)QlGCYqQvGzqAQCYqQvGzqAQCYqQv{Qt;4Mebs-%!2>`002ovPDHLkV1l%}QWXFI From 102e61cf8c0315248ca31878c46d7e0ef22e95dc Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 18 Apr 2024 16:02:06 +1000 Subject: [PATCH 160/339] Some content stuff - 18 4 24 --- _maps/_basemap.dm | 2 +- code/_globalvars/xenoarchaeology.dm | 3 -- code/modules/xenoarchaeology/misc/items.dm | 23 --------------- .../tools/console/xenoarchaeology_console.dm | 3 +- .../tools/console/xenoarchaeology_seller.dm | 28 +++++++++++++++++-- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index bf3b820460161..9499d3e8cb593 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/_globalvars/xenoarchaeology.dm b/code/_globalvars/xenoarchaeology.dm index 5d9e2de16a8cf..79ab3dbb09cc4 100644 --- a/code/_globalvars/xenoarchaeology.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -19,9 +19,6 @@ GLOBAL_LIST(xenoa_uranium_traits) GLOBAL_LIST(xenoa_bananium_traits) GLOBAL_LIST(xenoa_pearl_traits) -///Whitelist of items ofr familiar artifacts -GLOBAL_LIST_INIT(xenoa_familiar_items, list(/obj/item/kitchen/fork)) - ///Incompatability lists GLOBAL_LIST(xenoa_item_incompatible) GLOBAL_LIST(xenoa_mob_incompatible) diff --git a/code/modules/xenoarchaeology/misc/items.dm b/code/modules/xenoarchaeology/misc/items.dm index e81649e92616f..48ccb8d691b92 100644 --- a/code/modules/xenoarchaeology/misc/items.dm +++ b/code/modules/xenoarchaeology/misc/items.dm @@ -83,26 +83,3 @@ trait_list += T.type var/obj/item/sticker/xenoartifact_label/old/P = new(get_turf(src), trait_list) P.afterattack(src, src, TRUE) - -/* - Familiar variant - This is technically a helper. - Spawns a random item, from a list, and gives it an artifact component - Used for archaeology, loot, and joke stuff -*/ -/obj/effect/mapping_helpers/familiar_artifact - name = "familiar artifact" - icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' - icon_state = "map_editor" - -/obj/effect/mapping_helpers/familiar_artifact/Initialize(mapload) - . = ..() - return INITIALIZE_HINT_LATELOAD - -/obj/effect/mapping_helpers/familiar_artifact/LateInitialize() - . = ..() - var/atom/A = pick(GLOB.xenoa_familiar_items) - A = new A(loc) - A.name = "artifact" - A.AddComponent(/datum/component/xenoartifact) - A.name = "familiar [A.name]" diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 2580d904de169..f893e3fec3288 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -16,7 +16,8 @@ var/datum/bank_account/budget ///List of current listing sellers - var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/bastard) + var/list/sellers = list(/datum/rnd_lister/artifact_seller/bastard, /datum/rnd_lister/artifact_seller/uranium_bananium, + /datum/rnd_lister/artifact_seller/bluespace, /datum/rnd_lister/artifact_seller/plasma_bluespace) ///radio used by the console to send messages on science channel var/obj/item/radio/headset/radio diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm index ee475484abf57..179ed5c9d4ba8 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_seller.dm @@ -5,7 +5,6 @@ #define SELLER_PERSONALITY_GENEROUS "SELLER_PERSONALITY_GENEROUS" #define SELLER_PERSONALITY_NORMAL "SELLER_PERSONALITY_NORMAL" #define SELLER_PERSONALITY_STINGY "SELLER_PERSONALITY_STINGY" -#define SELLER_PERSONALITY_SCARED "SELLER_PERSONALITY_SCARED" //Move this to its own datum file if you implement it for other sub departments of science /datum/rnd_lister @@ -78,11 +77,35 @@ Actual types of artifact sellers */ -//Will sell random artifacts equally, but at a stingy price +//Will sell random artifacts equally /datum/rnd_lister/artifact_seller/bastard name = "Sidorovich" dialogue = "What are you standing there for? come closer." + personality = SELLER_PERSONALITY_NORMAL + max_stock = 2 + +//Sells uranium, and rarely, banaium artifacts +/datum/rnd_lister/artifact_seller/uranium_bananium + name = "Deepthroat" + dialogue = "..." + personality = SELLER_PERSONALITY_STINGY + artifact_types = list(XENOA_URANIUM = 3, XENOA_BANANIUM = 1) + +//Sells bluespace +/datum/rnd_lister/artifact_seller/bluespace + name = "Raichovich" + dialogue = "These things make my head hurt, take the from me!" + personality = SELLER_PERSONALITY_NORMAL + artifact_types = list(XENOA_BLUESPACE = 1) + max_stock = 3 + +//Sells plasma & bluespace +/datum/rnd_lister/artifact_seller/plasma_bluespace + name = "Shalashaska" + dialogue = "Maybe I'm colorblind, but some of these don't look blue..." personality = SELLER_PERSONALITY_STINGY + artifact_types = list(XENOA_BLUESPACE = 1, XENOA_PLASMA = 1) + max_stock = 2 /* Supply pack for this system @@ -102,4 +125,3 @@ #undef SELLER_PERSONALITY_GENEROUS #undef SELLER_PERSONALITY_NORMAL #undef SELLER_PERSONALITY_STINGY -#undef SELLER_PERSONALITY_SCARED From 941ab004b262f386b3a48ffb851edb7acdae8575 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 18 Apr 2024 22:07:32 +1000 Subject: [PATCH 161/339] OH GOD - 18 4 24 --- code/datums/chatmessage.dm | 16 +- .../xenoarchaeology/old/xenoartifact.dm | 523 ------------------ .../xenoarchaeology/traits/malfunctions.dm | 14 +- code/modules/xenoarchaeology/traits/traits.dm | 6 +- 4 files changed, 23 insertions(+), 536 deletions(-) delete mode 100644 code/modules/xenoarchaeology/old/xenoartifact.dm diff --git a/code/datums/chatmessage.dm b/code/datums/chatmessage.dm index a8bce61569c5b..1598fb44cf9dc 100644 --- a/code/datums/chatmessage.dm +++ b/code/datums/chatmessage.dm @@ -455,14 +455,14 @@ if(5) return "#[num2hex(c, 2)][num2hex(m, 2)][num2hex(x, 2)]" -/atom/proc/balloon_alert(mob/viewer, text, color = null, show_in_chat = TRUE) +/atom/proc/balloon_alert(mob/viewer, text, color = null, show_in_chat = TRUE, offset_x, offset_y) if(!viewer?.client) return switch(viewer.client.prefs.read_player_preference(/datum/preference/choiced/show_balloon_alerts)) if(BALLOON_ALERT_ALWAYS) - new /datum/chatmessage/balloon_alert(text, src, viewer, color) + new /datum/chatmessage/balloon_alert(text, src, viewer, color, offset_x, offset_y) if(BALLOON_ALERT_WITH_CHAT) - new /datum/chatmessage/balloon_alert(text, src, viewer, color) + new /datum/chatmessage/balloon_alert(text, src, viewer, color, offset_x, offset_y) if(show_in_chat) to_chat(viewer, "[text].") if(BALLOON_ALERT_NEVER) @@ -482,7 +482,7 @@ /datum/chatmessage/balloon_alert tgt_color = "#ffffff" //default color -/datum/chatmessage/balloon_alert/New(text, atom/target, mob/owner, color) +/datum/chatmessage/balloon_alert/New(text, atom/target, mob/owner, color, offset_x, offset_y) if (!istype(target)) CRASH("Invalid target given for chatmessage") if(QDELETED(owner) || !istype(owner) || !owner.client) @@ -492,7 +492,7 @@ //handle color if(color) tgt_color = color - INVOKE_ASYNC(src, PROC_REF(generate_image), text, target, owner) + INVOKE_ASYNC(src, PROC_REF(generate_image), text, target, owner, offset_x, offset_y) /datum/chatmessage/balloon_alert/Destroy() if(!QDELETED(message_loc)) @@ -504,7 +504,7 @@ animate(message, alpha = 0, pixel_y = message.pixel_y + MESSAGE_FADE_PIXEL_Y, time = fadetime, flags = ANIMATION_PARALLEL) addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(qdel), src), fadetime, TIMER_DELETE_ME, SSrunechat) -/datum/chatmessage/balloon_alert/generate_image(text, atom/target, mob/owner) +/datum/chatmessage/balloon_alert/generate_image(text, atom/target, mob/owner, offset_x, offset_y) // Register client who owns this message var/client/owned_by = owner.client RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, PROC_REF(on_parent_qdel)) @@ -536,6 +536,8 @@ message.maptext_height = WXH_TO_HEIGHT(owned_by?.MeasureText(text, null, BALLOON_TEXT_WIDTH)) message.maptext_x = (BALLOON_TEXT_WIDTH - bound_width) * -0.5 message.maptext = MAPTEXT("[text]") + message.pixel_x = offset_x + message.pixel_y = offset_y // View the message owned_by.images += message @@ -547,7 +549,7 @@ duration_mult += duration_length * BALLOON_TEXT_CHAR_LIFETIME_INCREASE_MULT // Animate the message - animate(message, alpha = 255, pixel_y = world.icon_size * 1.1, time = BALLOON_TEXT_SPAWN_TIME) + animate(message, alpha = 255, pixel_y = (message.pixel_y + world.icon_size) * 1.1, time = BALLOON_TEXT_SPAWN_TIME) LAZYADD(message_loc.balloon_alerts, src) diff --git a/code/modules/xenoarchaeology/old/xenoartifact.dm b/code/modules/xenoarchaeology/old/xenoartifact.dm deleted file mode 100644 index 14e402c54b465..0000000000000 --- a/code/modules/xenoarchaeology/old/xenoartifact.dm +++ /dev/null @@ -1,523 +0,0 @@ -/obj/item/xenoartifact - name = "artifact" - icon = 'icons/obj/xenoarchaeology/xenoartifact.dmi' - icon_state = "map_editor" - w_class = WEIGHT_CLASS_NORMAL - item_flags = ISWEAPON - light_color = LIGHT_COLOR_FIRE - desc = "A strange alien device. What could it possibly do?" - throw_range = 3 - - ///How much input the artifact is getting from activator traits - var/charge = 0 - ///This isn't a requirement anymore. This just affects how effective the charge is - var/charge_req - ///Processing type, used for tick - var/process_type - ///List of targted entities for traits - var/list/true_target = list() - - ///Associated traits & colour - var/material - ///activation trait, minor 1, minor 2, minor 3, major, malfunction - var/list/traits = list() - ///Internal list of unallowed traits - var/list/blacklist = list() - ///Touch hint - var/datum/xenoartifact_trait/touch_desc - ///used for special examine circumstance, science goggles & ghosts - var/special_desc = "The artifact is made from a" - ///Description used for label, used because directly adding shit to desc isn't a good idea - var/label_desc - ///How far the artifact can reach - var/max_range = 1 - - //Used for signaler trait - var/code - var/frequency - var/datum/radio_frequency/radio_connection - - //Time between uses - var/cooldown = 8 SECONDS - ///Extra time traits can add to the cooldown - var/cooldownmod = 0 - COOLDOWN_DECLARE(xenoa_cooldown) - - ///Everytime the artifact is used this increases. When this is successfully proc'd the artifact gains a malfunction and this is lowered. - var/malfunction_chance = 0 - ///How much the chance can change in a sinlge itteration - var/malfunction_mod = 1 - ///Ref to trait list for malfunctions - var/list/blacklist_ref - - //snowflake variable for shaped - var/transfer_prints = FALSE - -/obj/item/xenoartifact/ComponentInitialize() - . = ..() - AddComponent(/datum/component/xenoartifact_pricing) - AddComponent(/datum/component/discoverable, XENOA_DP, TRUE) //Same values as original artifacts from exploration - -/obj/item/xenoartifact/Initialize(mapload, difficulty) - . = ..() - - generate_xenoa_statics() //This wont load if it's already done, aka this wont spam - - blacklist_ref = GLOB.xenoa_bluespace_blacklist - material = difficulty //Difficulty is set, in most cases - if(!material) - material = pick_weight(list(XENOA_BLUESPACE = 8, XENOA_PLASMA = 5, XENOA_URANIUM = 3, XENOA_BANANIUM = 1)) //Maint artifacts and similar situations - - var/price - var/extra_masks = 0 - switch(material) - if(XENOA_BLUESPACE) //Check xenoartifact_materials.dm for info on artifact materials/types/traits - name = "bluespace [name]" - generate_traits(GLOB.xenoa_bluespace_blacklist) - if(!price) - price = pick(100, 200, 300) - extra_masks = pick(1) - - if(XENOA_PLASMA) - name = "plasma [name]" - blacklist_ref = GLOB.xenoa_plasma_blacklist - generate_traits(GLOB.xenoa_plasma_blacklist) - if(!price) - price = pick(200, 300, 500) - malfunction_mod = 3 - extra_masks = pick(1) - - if(XENOA_URANIUM) - name = "uranium [name]" - blacklist_ref = GLOB.xenoa_uranium_blacklist - generate_traits(GLOB.xenoa_uranium_blacklist, TRUE) - if(!price) - price = pick(300, 500, 800) - malfunction_mod = 5 - extra_masks = pick(1) - - if(XENOA_BANANIUM) - name = "bananium [name]" - generate_traits() - if(!price) - price = pick(500, 800, 1000) - malfunction_mod = 5 - extra_masks = 0 - SEND_SIGNAL(src, XENOA_CHANGE_PRICE, price) //update price, bacon requested signals - - //Initialize traits that require that. - for(var/datum/xenoartifact_trait/t as() in traits) - t.on_init(src) - - //Sprite process - //Base texture - var/icon/texture = new('icons/obj/xenoarchaeology/xenoartifact.dmi', "texture-[material]-[pick(1, 2, 3)]") - //Masking - var/list/indecies = list(1, 2, 3, 4, 5) //Indecies for masks - var/index = pick(indecies) - indecies -= index - var/icon/mask = new('icons/obj/xenoarchaeology/xenoartifact.dmi', "mask-[material]-[index]") - for(var/i in 1 to extra_masks) - index = pick(indecies) - indecies -= index - var/icon/extra_mask = new('icons/obj/xenoarchaeology/xenoartifact.dmi', "mask-[material]-[index]") - mask.Blend(extra_mask, ICON_UNDERLAY) - texture.AddAlphaMask(mask) - icon = texture - add_filter("inner_band", 1, list("type" = "outline", "color" = "#000", "size" = 1)) - add_filter("outer_band", 1.1, list("type" = "outline", "color" = material, "size" = 1)) - -/obj/item/xenoartifact/Destroy() - SSradio.remove_object(src, frequency) - for(var/datum/xenoartifact_trait/T as() in traits) - qdel(T) //deleting the traits individually ensures they properly destroy, deleting the list bunks it - traits = null - qdel(touch_desc) - for(var/atom/movable/AM in contents) - if(istype(AM, /obj/item/xenoartifact_label)) //Delete stickers - qdel(AM) - else - AM.forceMove((loc ? loc : get_turf(src))) - return ..() - -/obj/item/xenoartifact/CanAllowThrough(atom/movable/mover, turf/target) //tweedle dee, density feature - if(get_trait(/datum/xenoartifact_trait/minor/dense) || anchored) - return FALSE - return ..() - -/obj/item/xenoartifact/attack_hand(mob/user) //tweedle dum, density feature - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - - if(isliving(loc) && touch_desc?.on_touch(src, user) && user.can_see_reagents()) - balloon_alert(user, (initial(touch_desc.desc) ? initial(touch_desc.desc) : initial(touch_desc.label_name)), material) - - if(get_trait(/datum/xenoartifact_trait/minor/dense) || anchored) - if(process_type == PROCESS_TYPE_LIT) //Snuff out candle - to_chat(user, "You snuff out [name]") - process_type = null - return FALSE - if(P?.safety && isliving(loc)) - SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, src, user, user) //we're in the ghetto now - - if(P?.safety && isliving(loc)) - return - ..() - -/obj/item/xenoartifact/examine(mob/living/carbon/user) - . = ..() - if(user.can_see_reagents()) //Not checking carbon throws a runtime concerning observers - . += "[special_desc]" - if(isobserver(user)) - for(var/datum/xenoartifact_trait/t as() in traits) - . += (t?.desc ? "[t.desc]" : "[t.label_name]") - . += label_desc - -/obj/item/xenoartifact/attack_self(mob/user) - if(!isliving(loc) && (!get_trait(/datum/xenoartifact_trait/minor/dense) || anchored)) - return - - if(process_type == PROCESS_TYPE_LIT) //Snuff out candle - to_chat(user, "You snuff out [name]") - process_type = null - return - - if(isliving(loc) && touch_desc?.on_touch(src, user) && user.can_see_reagents()) - balloon_alert(user, (initial(touch_desc.desc) ? initial(touch_desc.desc) : initial(touch_desc.label_name)), material) - - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - if(P?.safety && isliving(loc)) - return - ..() - -/obj/item/xenoartifact/attackby(obj/item/I, mob/living/user, params) - var/tool_text - for(var/datum/xenoartifact_trait/t as() in traits) //chat, bubble-hints & helpers - if(t?.on_item(src, user, I) && user.can_see_reagents()) - tool_text = "[tool_text][t.desc ? t.desc : t.label_name]\n" - if(tool_text) - balloon_alert(user, tool_text, material) - - //allow people to remove stickers - if(I.tool_behaviour == TOOL_WIRECUTTER && (locate(/obj/item/xenoartifact_label) in contents)) - label_desc = null - I.use_tool() - qdel(locate(/obj/item/xenoartifact_label) in contents) - - //Let people label in peace - if(istype(I, /obj/item/xenoartifact_label) || istype(I, /obj/item/xenoartifact_labeller)) - return - - //abort if safety - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - if(P?.safety) - to_chat(user, "You perform a safe operation on [src] with [I].") - return - ..() - -/obj/item/xenoartifact/afterattack(atom/target, mob/user, proximity_flag, click_parameters) - //abort if safety - var/obj/item/clothing/gloves/artifact_pinchers/P = locate(/obj/item/clothing/gloves/artifact_pinchers) in user.contents - if(P?.safety) - to_chat(user, "You perform a safe operation on [src].") - return - ..() - -///Run traits. Used to activate all minor, major, and malfunctioning traits in the artifact's trait list. Sets cooldown when properly finished. -/obj/item/xenoartifact/proc/check_charge(mob/user, charge_mod) - log_game("[user] attempted to activate [src] at [world.time]. Located at [AREACOORD(src)].") - - if(COOLDOWN_FINISHED(src, xenoa_cooldown) && !istype(loc, /obj/item/storage)) - COOLDOWN_START(src, xenoa_cooldown, cooldown+cooldownmod) - if(prob(malfunction_chance) && traits.len < 7 + (material == XENOA_URANIUM ? 1 : 0)) //See if we pick up an malfunction - generate_malfunction_unique() - malfunction_chance = 0 //Lower chance after contracting - else //otherwise increase chance. - malfunction_chance = min(malfunction_chance + malfunction_mod, 100) - - charge += charge_mod - charge = (charge+charge_req)/1.9 //Not quite an average. Generally produces better results. - - for(var/datum/xenoartifact_trait/minor/t in traits)//Minor traits aren't apart of the target loop, specifically becuase they pass data into it. - t.activate(src, user, user) - log_game("[src] activated minor trait [t] at [world.time]. Located at [AREACOORD(src)]") - - //Clamp charge to avoid fucky wucky - charge = max(10, charge) - - //Add holder for muh balance - /* - Uncomment this if artifact abuse becomes a huge issue - - if(isliving(loc) || isliving(pulledby)) - var/mob/living/M = isliving(loc) ? loc : pulledby - if(!istype(M.get_item_by_slot(ITEM_SLOT_GLOVES), /obj/item/clothing/gloves/artifact_pinchers) && !istype(get_area(M), /area/science)) - true_target |= list(M) - */ - - for(var/atom/M in true_target) //target loop, majors & malfunctions - if(get_dist(get_turf(src), get_turf(M)) <= max_range) - create_beam(M) //Indicator beam, points to target, M - for(var/datum/xenoartifact_trait/t as() in traits) //Major traits - if(!istype(t, /datum/xenoartifact_trait/minor)) - log_game("[src] activated trait [t] at [world.time]. Located at [AREACOORD(src)]") - t.activate(src, M, user) - if(!get_trait(/datum/xenoartifact_trait/major/horn)) - playsound(get_turf(src), 'sound/magic/blink.ogg', 25, TRUE) - - charge = 0 - true_target?.Cut(1, 0) - -///Generate traits outside of blacklist. Malf = TRUE if you want malfunctioning traits. -/obj/item/xenoartifact/proc/generate_traits(list/blacklist_traits, malf = FALSE) - //Provided blacklist or nothing, covers bananium - blacklist = blacklist_traits?.Copy() || list() - - var/datum/xenoartifact_trait/desc_holder - desc_holder = generate_trait_unique(GLOB.xenoa_activators, blacklist, FALSE) //Activator - special_desc = initial(desc_holder.desc) ? "[special_desc] [initial(desc_holder.desc)]" : "[special_desc]n Unknown" - - desc_holder = null - var/datum/xenoartifact_trait/minor_desc_holder - for(var/i in 1 to 3) - minor_desc_holder = generate_trait_unique(GLOB.xenoa_minors, blacklist, FALSE) //Minor/s - desc_holder = desc_holder ? desc_holder : minor_desc_holder - if(!touch_desc) - touch_desc = traits[traits.len] - if(!touch_desc.on_touch(src, src)) - touch_desc = null //not setting this to null fucks with check, qdel refuses to be helpful another day - - special_desc = initial(desc_holder?.desc) ? "[special_desc] [initial(desc_holder.desc)] material." : "[special_desc] material." - - if(malf) - generate_trait_unique(GLOB.xenoa_malfs, blacklist) //Malf - - desc_holder = generate_trait_unique(GLOB.xenoa_majors, blacklist, FALSE) //Major - special_desc = initial(desc_holder.desc) ? "[special_desc] The shape is [initial(desc_holder.desc)]." : "[special_desc] The shape is Unknown." - - charge_req = rand(1, 10) * 10 - -///generate a single trait against a blacklist. Used in larger /obj/item/xenoartifact/proc/generate_traits() -/obj/item/xenoartifact/proc/generate_trait_unique(list/trait_list, list/blacklist_traits = list()) - var/datum/xenoartifact_trait/new_trait //Selection - var/list/selection = trait_list.Copy() //Selectable traits - selection -= blacklist_traits - if(selection.len < 1) - log_game("An impossible event has occured. [src] has failed to generate any traits!") - return - new_trait = pick_weight(selection) - blacklist += new_trait //Add chosen trait to blacklist - traits += new new_trait - new_trait = new new_trait //type converting doesn't work too well here but this should be fine. - blacklist += new_trait.blacklist_traits //Cant use initial() to access lists without bork'ing it - return new_trait - -///generates a malfunction respective to the artifact's type - don't use anywhere but for check_charge malfunctions -/obj/item/xenoartifact/proc/generate_malfunction_unique(list/blacklist) - var/list/malfunctions = GLOB.xenoa_malfs.Copy() - malfunctions -= blacklist - malfunctions -= traits - if(!malfunctions.len) - return - //Pick one to use - var/datum/xenoartifact_trait/T = pick(malfunctions) - T = new T - traits += T - -///Gets a singular entity, there's a specific traits that handles multiple. -/obj/item/xenoartifact/proc/get_target_in_proximity(range) - for(var/mob/living/M in oview(range, get_turf(src))) - . = process_target(M) - if(isliving(loc) && !.) - . = process_target(loc) - //Return a list becuase byond is fucky and WILL overwrite the typing - return list(.) - -///Returns the desired trait and it's values if it's in the artifact's list -/obj/item/xenoartifact/proc/get_trait(typepath) - return (locate(typepath) in traits) - -///Used for hand-holding secret technique. Pulling entities swaps them for you in the target list. -/obj/item/xenoartifact/proc/process_target(atom/target) - if(ishuman(target)) //early return if deflect chance - var/mob/living/carbon/human/H = target - if(H.wear_suit && H.head && isclothing(H.wear_suit) && isclothing(H.head)) - if(H.anti_artifact_check()) - to_chat(target, "The [name] was unable to target you!") - playsound(get_turf(target), 'sound/weapons/deflect.ogg', 25, TRUE) - return - - if(isliving(target)) //handle pulling - var/mob/living/M = target - . = M?.pulling ? M.pulling : M - else - . = target - RegisterSignal(., COMSIG_PARENT_QDELETING, PROC_REF(on_target_del), TRUE) - return - -///Hard del handle -/obj/item/xenoartifact/proc/on_target_del(atom/target) - UnregisterSignal(target, COMSIG_PARENT_QDELETING) - true_target -= list(target) - -///Helps show how the artifact is working. Hint stuff. Draws a beam between artifact and target -/obj/item/xenoartifact/proc/create_beam(atom/target) - if((locate(src) in target?.contents) || !get_turf(target)) - return - var/datum/beam/xenoa_beam/B = new((!isturf(loc) ? loc : src), target, time=1.5 SECONDS, beam_icon='icons/obj/xenoarchaeology/xenoartifact.dmi', beam_icon_state="xenoa_beam", btype=/obj/effect/ebeam/xenoa_ebeam) - B.set_color(material) - INVOKE_ASYNC(B, TYPE_PROC_REF(/datum/beam/xenoa_beam, Start)) - -///Default template used to interface with activator signals. -/obj/item/xenoartifact/proc/default_activate(chr, mob/user, atom/target) - if(!COOLDOWN_FINISHED(src, xenoa_cooldown)) - return FALSE - charge = chr - true_target |= process_target(target) - check_charge(user) - return TRUE - -///Signaler traits. Sets listening freq -/obj/item/xenoartifact/proc/set_frequency(new_frequency) - SSradio.remove_object(src, frequency) - frequency = new_frequency - radio_connection = SSradio.add_object(src, frequency, "[RADIO_XENOA]_[REF(src)]") //not doing the weird filter fucks with other artifacts - -///Signaler traits. Sends signal -/obj/item/xenoartifact/proc/send_signal(datum/signal/signal) - if(!radio_connection||!signal) - return - radio_connection.post_signal(src, signal) - -/obj/item/xenoartifact/receive_signal(datum/signal/signal) - if(!signal || signal.data["code"] != code) - return - SEND_SIGNAL(src, XENOA_SIGNAL, null, get_target_in_proximity(max_range), get_target_in_proximity(max_range)) //I don't think this sends a signal - -/obj/item/xenoartifact/on_block(mob/living/carbon/human/owner, atom/movable/hitby) - . = ..() - if(!(COOLDOWN_FINISHED(src, xenoa_cooldown)) || !get_trait(/datum/xenoartifact_trait/minor/blocking)) - return - SEND_SIGNAL(src, COMSIG_PARENT_ATTACKBY, src, owner, hitby) //I don't think this sends a signal - -/obj/item/xenoartifact/process(delta_time) - switch(process_type) - if(PROCESS_TYPE_LIT) //Burning - true_target = get_target_in_proximity(min(max_range, 5)) - if(true_target[1]) - visible_message("The [name] flicks out.") - default_activate(25, null, null) - process_type = null - return PROCESS_KILL - if(PROCESS_TYPE_TICK) //Clock-ing - playsound(get_turf(src), 'sound/effects/clock_tick.ogg', 50, TRUE) - visible_message("The [name] ticks.") - true_target = get_target_in_proximity(min(max_range, 5)) - default_activate(25, null, null) - if(DT_PROB(XENOA_TICK_CANCEL_PROB, delta_time) && COOLDOWN_FINISHED(src, xenoa_cooldown)) - process_type = null - return PROCESS_KILL - else - return PROCESS_KILL - -/obj/item/xenoartifact/maint //Semi-toddler-safe version, for maint loot table. - material = XENOA_BLUESPACE - -/obj/item/xenoartifact/maint/Initialize(mapload, difficulty) - if(prob(1)) - material = pick(XENOA_PLASMA, XENOA_URANIUM, XENOA_BANANIUM) - difficulty = material - ..() - -/datum/component/xenoartifact_pricing ///Pricing component for shipping solution. Consider swapping to cargo after change. - ///Buying and selling related, based on guess qaulity - var/modifier = 0.5 - ///default price gets generated if it isn't set by console. This only happens if the artifact spawns outside of that process - var/price - -/datum/component/xenoartifact_pricing/Initialize(...) - RegisterSignal(parent, XENOA_CHANGE_PRICE, PROC_REF(update_price)) - ..() - -/datum/component/xenoartifact_pricing/Destroy(force, silent) - UnregisterSignal(parent, XENOA_CHANGE_PRICE) - ..() - -///Typically used to change internally -/datum/component/xenoartifact_pricing/proc/update_price(datum/source, f_price) - price = f_price - - ///Objective version for exploration -/obj/item/xenoartifact/objective/Initialize(mapload, difficulty) - traits += new /datum/xenoartifact_trait/special/objective - ..() - -/obj/item/xenoartifact/objective/ComponentInitialize() - AddComponent(/datum/component/gps, "[scramble_message_replace_chars("#########", 100)]", TRUE) - AddComponent(/datum/component/tracking_beacon, EXPLORATION_TRACKING, null, null, TRUE, "#eb4d4d", TRUE, TRUE) - ..() - -/obj/effect/ebeam/xenoa_ebeam //Beam code. This isn't mine. See beam.dm for better documentation. - name = "artifact beam" - -/datum/beam/xenoa_beam - var/color - -/datum/beam/xenoa_beam/proc/set_color(col) //Custom proc to set beam colour - color = col - -/datum/beam/xenoa_beam/Draw() - var/Angle = round(get_angle(origin,target)) - var/matrix/rot_matrix = matrix() - var/turf/origin_turf = get_turf(origin) - rot_matrix.Turn(Angle) - - //Translation vector for origin and target - var/DX = (32*target?.x+target?.pixel_x)-(32*origin?.x+origin?.pixel_x) - var/DY = (32*target?.y+target?.pixel_y)-(32*origin?.y+origin?.pixel_y) - var/n = 0 - var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement - - for(n in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X - if(QDELETED(src)) - break - var/obj/effect/ebeam/xenoa_ebeam/X = new(origin_turf) // Start Xenoartifact - This assigns colour to the beam - X.color = color - X.owner = src - elements += X // End Xenoartifact - - //Assign our single visual ebeam to each ebeam's vis_contents - //ends are cropped by a transparent box icon of length-N pixel size laid over the visuals obj - if(n+32>length) - var/icon/II = new(icon, icon_state) - II.DrawBox(null,1,(length-n),32,32) - X.icon = II - else - X.vis_contents += visuals - X.transform = rot_matrix - - //Calculate pixel offsets (If necessary) - var/Pixel_x - var/Pixel_y - if(DX == 0) - Pixel_x = 0 - else - Pixel_x = round(sin(Angle)+32*sin(Angle)*(n+16)/32) - if(DY == 0) - Pixel_y = 0 - else - Pixel_y = round(cos(Angle)+32*cos(Angle)*(n+16)/32) - - //Position the effect so the beam is one continous line - var/a - if(abs(Pixel_x)>32) - a = Pixel_x > 0 ? round(Pixel_x/32) : CEILING(Pixel_x/32, 1) - X.x += a - Pixel_x %= 32 - if(abs(Pixel_y)>32) - a = Pixel_y > 0 ? round(Pixel_y/32) : CEILING(Pixel_y/32, 1) - X.y += a - Pixel_y %= 32 - - X.pixel_x = Pixel_x - X.pixel_y = Pixel_y - CHECK_TICK diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 309f7a96a3501..51e7f96ba9659 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -18,8 +18,18 @@ if(!.) return for(var/mob/living/M in oview(XENOA_TRAIT_BALLOON_HINT_DIST, get_turf(parent.parent))) - if(M.can_see_reagents()) - do_hint(M) + do_hint(M) + +/datum/xenoartifact_trait/malfunction/do_hint(mob/user, atom/item) + //If they have science goggles, or equivilent, they are shown exatcly what trait this is + if(!user?.can_see_reagents()) + return + var/atom/A = parent.parent + if(!isturf(A.loc)) + A = A.loc + A.balloon_alert(user, label_name, parent.artifact_type.material_color, offset_y = 8) + //show_in_chat doesn't work + to_chat(user, "[parent.parent] : [label_name]") /* Parallel Entity Retrieval diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 8cf5fa38fd007..5d2ee5ae5f1a9 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -207,7 +207,7 @@ var/atom/A = parent.parent if(!isturf(A.loc)) A = A.loc - A.balloon_alert(user, label_name, parent.artifact_type.material_color, TRUE) + A.balloon_alert(user, label_name, parent.artifact_type.material_color) //show_in_chat doesn't work to_chat(user, "[parent.parent] : [label_name]") @@ -226,9 +226,7 @@ var/atom/target_loc = A.loc target_loc.visible_message("[A] develops a slight opening!\nYou could probably use a screwdriver on [A]!", allow_inside_usr = TRUE) //Do effects - else - //Undo effects - return + playsound(A, 'sound/machines/clockcult/ark_damage.ogg', 50, TRUE) /datum/xenoartifact_trait/proc/catch_pearl_tool(datum/source, mob/living/user, obj/item/I, list/recipes) SIGNAL_HANDLER From 80f11ceab6163a68b7fb073cf2493fab63e6cda2 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Apr 2024 19:44:23 +1000 Subject: [PATCH 162/339] Fix map conflicts - 19 4 24 --- _maps/map_files/BoxStation/BoxStation.dmm | 72 ++++++++------------- _maps/map_files/CorgStation/CorgStation.dmm | 11 +--- _maps/map_files/KiloStation/KiloStation.dmm | 8 +-- _maps/map_files/MetaStation/MetaStation.dmm | 65 +++++++------------ _maps/map_files/RadStation/RadStation.dmm | 31 ++++----- 5 files changed, 63 insertions(+), 124 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index b14adc39f423f..15ef0bcd95ce2 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -2172,7 +2172,7 @@ /obj/item/healthanalyzer{ pixel_y = 7 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "aFJ" = ( /obj/effect/landmark/event_spawn, @@ -2253,7 +2253,7 @@ /obj/effect/turf_decal/stripes/closeup{ dir = 1 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "aGL" = ( /obj/structure/cable/yellow{ @@ -7484,7 +7484,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "cdh" = ( /obj/structure/disposalpipe/sorting/mail/flip{ @@ -15512,7 +15512,7 @@ pixel_y = 3 }, /obj/structure/table, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "ewo" = ( /obj/effect/turf_decal/stripes/line{ @@ -17336,7 +17336,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "fha" = ( /obj/structure/table, @@ -19603,7 +19603,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "gbd" = ( /obj/machinery/atmospherics/pipe/manifold4w/general/visible, @@ -21802,7 +21802,7 @@ }, /obj/structure/closet/radiation, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "gVc" = ( /obj/structure/disposalpipe/segment{ @@ -25634,7 +25634,7 @@ /obj/machinery/recharger, /obj/item/gun/energy/laser/practice, /obj/item/gun/energy/laser/practice, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "iwy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4, @@ -27453,9 +27453,7 @@ /obj/structure/disposalpipe/junction{ dir = 1 }, -/turf/open/floor/plasteel/dark/side{ - dir = 1 - }, +/turf/open/floor/iron/dark, /area/science/misc_lab) "jcc" = ( /obj/machinery/door/poddoor/preopen{ @@ -27974,7 +27972,7 @@ /obj/structure/railing{ dir = 8 }, -/turf/open/floor/plasteel/stairs, +/turf/open/floor/iron/stairs, /area/science/misc_lab) "joi" = ( /obj/machinery/computer/secure_data{ @@ -30450,7 +30448,7 @@ /obj/effect/turf_decal/stripes/closeup{ dir = 1 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "koq" = ( /obj/structure/disposalpipe/segment{ @@ -31985,7 +31983,7 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "kVy" = ( /obj/effect/turf_decal/trimline/dark_blue/filled/line{ @@ -33185,7 +33183,7 @@ dir = 4; pixel_x = -23 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "lpZ" = ( /obj/structure/chair/stool{ @@ -34571,7 +34569,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "lXk" = ( /obj/structure/closet/emcloset, @@ -35862,7 +35860,7 @@ dir = 8 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "mxL" = ( /obj/machinery/light/small{ @@ -37815,7 +37813,7 @@ pixel_x = 2; pixel_y = 2 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "nkW" = ( /obj/machinery/porta_turret/ai{ @@ -39093,7 +39091,7 @@ /obj/item/folder/white, /obj/item/folder/white, /obj/item/pen, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "nNW" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -46265,20 +46263,6 @@ icon_state = "0-8" }, /obj/machinery/power/apc/auto_name/east, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/xenoartifact_console{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/east{ - pixel_x = 24 - }, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/science/misc_lab) @@ -50386,7 +50370,7 @@ /obj/structure/disposalpipe/segment, /obj/effect/turf_decal/stripes/closeup, /obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron, /area/science/misc_lab) "rZR" = ( /obj/structure/table, @@ -50656,7 +50640,7 @@ /obj/item/wrench, /obj/item/crowbar, /obj/item/hand_labeler, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "seG" = ( /obj/machinery/computer/operating{ @@ -52823,7 +52807,7 @@ dir = 4; layer = 3.2 }, -/turf/open/floor/plasteel/stairs, +/turf/open/floor/iron/stairs, /area/science/misc_lab) "sVb" = ( /obj/structure/chair{ @@ -56839,7 +56823,7 @@ layer = 3.2 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "uBB" = ( /obj/effect/landmark/event_spawn, @@ -57192,7 +57176,7 @@ /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/aisat_interior) "uJD" = ( -/turf/open/floor/plasteel/stairs, +/turf/open/floor/iron/stairs, /area/science/misc_lab) "uJV" = ( /obj/structure/cable{ @@ -57538,7 +57522,7 @@ dir = 8 }, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "uQB" = ( /obj/structure/cable/yellow{ @@ -59656,7 +59640,7 @@ /obj/item/target/syndicate, /obj/machinery/light, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "vIy" = ( /obj/structure/table, @@ -59706,7 +59690,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "vJw" = ( /obj/structure/cable/yellow{ @@ -59789,7 +59773,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "vKs" = ( /obj/structure/window/reinforced, @@ -65251,7 +65235,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "xNY" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ @@ -65327,7 +65311,7 @@ /obj/structure/cable/yellow{ icon_state = "0-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/misc_lab) "xPr" = ( /obj/effect/spawner/xmastree, diff --git a/_maps/map_files/CorgStation/CorgStation.dmm b/_maps/map_files/CorgStation/CorgStation.dmm index 21c012b811dcc..8f8a9a6f28df7 100644 --- a/_maps/map_files/CorgStation/CorgStation.dmm +++ b/_maps/map_files/CorgStation/CorgStation.dmm @@ -50633,14 +50633,6 @@ /area/crew_quarters/toilet) "qnT" = ( /obj/machinery/vending/sticker, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, -/obj/effect/spawner/randomarcade{ - dir = 4 - }, /turf/open/floor/carpet/royalblue, /area/crew_quarters/theatre) "qoj" = ( @@ -52453,7 +52445,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, /obj/structure/disposalpipe/segment, /obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/white, /area/science/explab) "qUE" = ( /obj/structure/chair/office/light{ @@ -63562,7 +63554,6 @@ /obj/effect/turf_decal/bot, /obj/effect/landmark/blobstart, /obj/effect/mapping_helpers/make_non_slip, -/turf/open/floor/plasteel/white, /area/science/explab) "uyB" = ( /obj/structure/cable/yellow{ diff --git a/_maps/map_files/KiloStation/KiloStation.dmm b/_maps/map_files/KiloStation/KiloStation.dmm index 7864d6e27941b..0ceca25ea6d20 100644 --- a/_maps/map_files/KiloStation/KiloStation.dmm +++ b/_maps/map_files/KiloStation/KiloStation.dmm @@ -20595,6 +20595,7 @@ "cHX" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/structure/tank_dispenser/oxygen, /turf/open/floor/plating, /area/maintenance/port/aft) "cHY" = ( @@ -50813,18 +50814,11 @@ /area/security/prison) "ltb" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/corner, /obj/machinery/vending/sticker, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/corner{ dir = 1 }, -/obj/structure/tank_dispenser/oxygen, -/obj/effect/turf_decal/bot, /turf/open/floor/plating, /area/maintenance/port/aft) "ltv" = ( diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 5e4c19e62f157..2ee4def2616e3 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4208,7 +4208,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/dark, /area/science/explab) "aRd" = ( /obj/structure/table, @@ -4773,7 +4772,7 @@ "aXv" = ( /obj/effect/turf_decal/delivery, /obj/machinery/xenoarchaeology_machine/calibrator/tutorial, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "aXG" = ( /obj/machinery/dna_scannernew, @@ -16910,7 +16909,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "dPw" = ( /obj/structure/cable/yellow{ @@ -24103,7 +24102,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "gqi" = ( /obj/item/radio/intercom{ @@ -27409,7 +27408,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "hpz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2, @@ -28772,7 +28771,7 @@ "hIS" = ( /obj/machinery/xenoarchaeology_machine/scale, /obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "hIY" = ( /obj/effect/spawner/structure/window/reinforced/tinted, @@ -31687,7 +31686,7 @@ /obj/item/xenoartifact, /obj/item/xenoartifact, /obj/effect/mapping_helpers/tile_breaker, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "iFX" = ( /turf/open/floor/plating, @@ -36251,7 +36250,7 @@ /obj/item/radio/intercom{ pixel_y = 21 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "khR" = ( /obj/item/storage/secure/safe{ @@ -40046,7 +40045,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "lvV" = ( /obj/machinery/door/window/westleft{ @@ -43096,7 +43095,7 @@ pixel_x = 5 }, /obj/structure/table, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "msY" = ( /obj/structure/cable/yellow{ @@ -48084,7 +48083,7 @@ dir = 9 }, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "obO" = ( /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -50555,7 +50554,7 @@ /obj/item/clothing/glasses/science{ pixel_y = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "oUb" = ( /obj/effect/turf_decal/stripes/line{ @@ -52857,7 +52856,7 @@ /obj/structure/cable/yellow{ icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "pIB" = ( /obj/structure/cable/yellow{ @@ -56695,7 +56694,7 @@ /obj/structure/sign/poster/official/xenoarchaeology{ pixel_y = 32 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "qTB" = ( /obj/structure/cable/yellow{ @@ -61654,7 +61653,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "sAw" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, @@ -66299,10 +66298,6 @@ /obj/machinery/holopad, /turf/open/floor/iron/dark, /area/aisat) -"tZG" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/explab) "tZQ" = ( /obj/structure/table, /obj/item/nanite_remote, @@ -71934,9 +71929,6 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) -"vXJ" = ( -/turf/open/floor/plasteel/dark, -/area/science/explab) "vXK" = ( /obj/structure/closet/emcloset, /obj/machinery/light/small{ @@ -73710,19 +73702,6 @@ }, /turf/open/floor/iron, /area/storage/primary) -"wDf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4; - layer = 3.2 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "wDj" = ( /obj/machinery/holopad{ pixel_x = 9; @@ -73875,7 +73854,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "wGk" = ( /obj/structure/closet/crate, @@ -78616,7 +78595,7 @@ /turf/closed/wall, /area/medical/patients_rooms) "ycI" = ( -/turf/open/floor/plasteel/stairs{ +/turf/open/floor/iron/stairs{ dir = 1 }, /area/science/explab) @@ -113446,9 +113425,9 @@ bST fug cgq qTl -wDf -wDf -wDf +dap +dap +dap dap iyf aYW @@ -113703,8 +113682,8 @@ bST dvu cgq khQ -vXJ -vXJ +tWh +tWh tWh tiD hpy @@ -114477,7 +114456,7 @@ liD pCt pvg bYD -tZG +cIC ycI eqQ kJa diff --git a/_maps/map_files/RadStation/RadStation.dmm b/_maps/map_files/RadStation/RadStation.dmm index a3bfe471f8d61..fb90c7c01116b 100644 --- a/_maps/map_files/RadStation/RadStation.dmm +++ b/_maps/map_files/RadStation/RadStation.dmm @@ -17374,7 +17374,7 @@ id = "telelab"; name = "test chamber blast door" }, -/turf/open/floor/engine, +/turf/open/floor/plating, /area/science/explab) "fpm" = ( /obj/structure/closet/bombcloset, @@ -18376,21 +18376,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, -/obj/machinery/light{ - dir = 2 - }, /obj/machinery/power/floodlight, /obj/structure/cable/yellow, /obj/effect/turf_decal/bot, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light, /turf/open/floor/engine, /area/science/explab) "fGl" = ( @@ -22169,6 +22157,9 @@ pixel_y = -35 }, /obj/item/beacon, +/obj/machinery/light{ + dir = 2 + }, /turf/open/floor/engine, /area/science/explab) "gKK" = ( @@ -26328,7 +26319,7 @@ /obj/structure/closet/bombcloset/white, /obj/machinery/firealarm/directional/west, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "idd" = ( /obj/effect/turf_decal/tile/neutral/half/contrasted, @@ -41552,7 +41543,7 @@ /obj/effect/loot_jobscale/medical/first_aid_kit, /obj/item/clothing/neck/stethoscope, /obj/item/healthanalyzer, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "mJl" = ( /obj/machinery/door/firedoor, @@ -42825,7 +42816,7 @@ /obj/machinery/computer/xenoarchaeology_console{ dir = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "nge" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -57568,7 +57559,7 @@ }, /obj/item/paicard, /obj/item/book/manual/wiki/xenoarchaeology, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "rRY" = ( /obj/effect/decal/cleanable/dirt, @@ -67052,7 +67043,7 @@ pixel_y = -34 }, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "uUA" = ( /turf/closed/wall/r_wall, @@ -72110,7 +72101,7 @@ /obj/item/clothing/glasses/science{ pixel_y = 8 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "wBp" = ( /obj/machinery/door/poddoor/preopen{ @@ -72133,7 +72124,7 @@ /obj/structure/cable/yellow{ icon_state = "4-8" }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/dark, /area/science/explab) "wBx" = ( /obj/effect/turf_decal/bot, From bcb94c0122d9f8a94edea0ac2fa4a2bce3e5f466 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Apr 2024 19:52:01 +1000 Subject: [PATCH 163/339] UI fixes - 19 4 24 --- _maps/map_files/debug/runtimestation.dmm | 941 +++--------------- .../tgui/interfaces/XenoartifactConsole.js | 61 +- .../tgui/interfaces/XenoartifactLabeler.js | 49 +- 3 files changed, 171 insertions(+), 880 deletions(-) diff --git a/_maps/map_files/debug/runtimestation.dmm b/_maps/map_files/debug/runtimestation.dmm index 66bb51f42aadc..bca3e790dace1 100644 --- a/_maps/map_files/debug/runtimestation.dmm +++ b/_maps/map_files/debug/runtimestation.dmm @@ -658,98 +658,12 @@ /obj/item/storage/firstaid/regular, /turf/open/floor/iron, /area/storage/primary) -"gN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden/layer2{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"he" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "hh" = ( /obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/iron, /area/construction) -"hj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/railing/corner{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"hE" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/sign/poster/official/xenoarchaeology{ - pixel_y = -32 - }, -/obj/item/paicard{ - pixel_x = -7 - }, -/obj/item/book/manual/wiki/xenoarchaeology{ - pixel_x = -6 - }, -/obj/item/sticky_note_pile{ - pixel_y = 3; - pixel_x = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "hJ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -769,13 +683,6 @@ }, /turf/open/floor/iron, /area/science) -"is" = ( -/obj/machinery/computer/rdservercontrol, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "iu" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -795,16 +702,6 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) -"iF" = ( -/obj/machinery/computer/xenoarchaeology_console{ - dir = 1 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "iS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -854,25 +751,12 @@ }, /turf/open/floor/iron, /area/quartermaster/storage) -"jo" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, -/turf/open/floor/plasteel/dark, -/area/science/explab) "jv" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 8 }, /turf/open/floor/iron, /area/engine/atmos) -"jw" = ( -/obj/structure/closet/bombcloset, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 9 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/white, -/area/science/explab) "jB" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -901,29 +785,6 @@ }, /turf/open/floor/iron, /area/bridge) -"jN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/structure/railing{ - dir = 9 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/filled/end{ - dir = 1 - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "kc" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -931,60 +792,12 @@ /obj/machinery/light, /turf/open/floor/iron, /area/hallway/secondary/entry) -"kk" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/research{ - name = "Xenoarchaeology Lab"; - req_one_access_txt = "8;49" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "kp" = ( /obj/machinery/light{ dir = 8 }, /turf/open/floor/iron, /area/security/brig) -"kG" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_y = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/science/server"; - dir = 1; - name = "Research Division Server Room APC"; - pixel_y = 24 - }, -/obj/structure/railing{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "kN" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1000,10 +813,6 @@ }, /turf/open/floor/iron, /area/bridge) -"kV" = ( -/obj/structure/sign/warning/explosives, -/turf/closed/wall/r_wall, -/area/science/explab) "li" = ( /obj/machinery/airalarm/directional/east, /turf/open/floor/iron, @@ -1052,15 +861,6 @@ /obj/machinery/camera/autoname, /turf/open/floor/iron, /area/hallway/secondary/entry) -"mr" = ( -/obj/item/radio/intercom{ - pixel_x = 29 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "mI" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -1080,14 +880,6 @@ dir = 1 }, /area/medical/medbay) -"mJ" = ( -/obj/structure/closet/firecloset, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/white, -/area/science/explab) "mV" = ( /obj/structure/cable{ icon_state = "1-2" @@ -1164,14 +956,6 @@ /obj/item/paper/guides/jobs/security/labor_camp, /turf/open/floor/iron, /area/security/brig) -"oO" = ( -/obj/machinery/xenoarchaeology_machine/conductor, -/obj/effect/turf_decal/delivery, -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "pb" = ( /obj/machinery/light{ dir = 4 @@ -1182,13 +966,6 @@ }, /turf/open/floor/iron, /area/medical/chemistry) -"pj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/plasteel/white, -/area/science/explab) "pl" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -1214,29 +991,6 @@ }, /turf/open/floor/iron, /area/science) -"pv" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/atmospherics/components/unary/vent_pump/on/layer2{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"pw" = ( -/obj/machinery/door/airlock/maintenance{ - name = "Experimentation Lab Maintenance"; - req_one_access_txt = "8;49" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/turf/open/floor/plating, -/area/science/explab) "py" = ( /obj/machinery/modular_fabricator/component_printer, /turf/open/floor/iron, @@ -1338,23 +1092,6 @@ /obj/item/storage/belt/utility/chief/full, /turf/open/floor/iron, /area/engine/engineering) -"rj" = ( -/obj/machinery/holopad, -/obj/effect/turf_decal/box, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "rp" = ( /obj/machinery/light{ dir = 1 @@ -1493,26 +1230,6 @@ }, /turf/open/floor/iron, /area/hallway/primary/central) -"sW" = ( -/obj/structure/filingcabinet{ - pixel_x = -7 - }, -/obj/structure/filingcabinet{ - pixel_x = 7 - }, -/obj/machinery/light_switch{ - pixel_x = 23 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Research Division - Server Room"; - network = list("ss13","rd"); - pixel_x = 22 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "tb" = ( /obj/machinery/camera/autoname{ dir = 1 @@ -1646,22 +1363,11 @@ }, /turf/open/floor/plating, /area/engine/atmos) -"uu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/science/explab) "uw" = ( /obj/structure/table, /obj/machinery/light, /turf/open/floor/iron, /area/storage/primary) -"uD" = ( -/turf/open/floor/plasteel/stairs{ - dir = 1 - }, -/area/science/explab) "vk" = ( /turf/open/floor/iron/dark, /area/engine/gravity_generator) @@ -1762,21 +1468,6 @@ }, /turf/open/floor/iron, /area/storage/primary) -"wj" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/science/explab) -"wk" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "wo" = ( /obj/machinery/rnd/production/protolathe/department, /turf/open/floor/iron, @@ -1788,11 +1479,10 @@ /obj/machinery/door/airlock/public/glass, /turf/open/floor/iron, /area/medical/chemistry) -"wx" = ( -/obj/structure/chair/office/light, -/obj/effect/turf_decal/trimline/purple/filled/line, -/turf/open/floor/plasteel/white, -/area/science/explab) +"ww" = ( +/obj/effect/landmark/observer_start, +/turf/open/floor/iron, +/area/storage/primary) "wy" = ( /obj/structure/table, /obj/item/card/id/ert{ @@ -1840,12 +1530,6 @@ dir = 1 }, /area/medical/medbay) -"xi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/science/explab) "xu" = ( /obj/effect/turf_decal/plaque{ icon_state = "L9" @@ -1883,16 +1567,6 @@ /obj/machinery/chem_master, /turf/open/floor/iron/dark, /area/medical/chemistry) -"xN" = ( -/obj/effect/turf_decal/stripes/corner, -/mob/living/simple_animal/pet/dog/pug{ - desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; - name = "Pugley IV"; - real_name = "Pugley IV" - }, -/obj/structure/bed/dogbed, -/turf/open/floor/plasteel/dark, -/area/science/explab) "xQ" = ( /obj/machinery/gulag_teleporter, /turf/open/floor/iron, @@ -1926,9 +1600,6 @@ /obj/machinery/chem_heater, /turf/open/floor/iron/dark, /area/medical/chemistry) -"yt" = ( -/turf/closed/wall/r_wall, -/area/science/explab) "yD" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -2016,26 +1687,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"Ab" = ( -/obj/item/storage/toolbox/mechanical{ - pixel_x = -2; - pixel_y = -1 - }, -/obj/item/analyzer{ - pixel_x = -9 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/multitool{ - pixel_x = -1 - }, -/obj/item/geiger_counter{ - pixel_x = 5 - }, -/obj/structure/table, -/turf/open/floor/plasteel/dark, -/area/science/explab) "Af" = ( /obj/effect/turf_decal/plaque{ icon_state = "L10" @@ -2114,12 +1765,6 @@ }, /turf/open/floor/iron, /area/storage/primary) -"AU" = ( -/obj/item/radio/intercom{ - pixel_y = 21 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "AV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2153,12 +1798,6 @@ dir = 1 }, /area/medical/medbay) -"BA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/science/explab) "BE" = ( /obj/machinery/power/apc{ dir = 1; @@ -2193,22 +1832,6 @@ }, /turf/open/floor/iron, /area/medical/medbay) -"BW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4; - layer = 3.2 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/obj/structure/sign/poster/official/xenoarchaeology{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "Cj" = ( /obj/machinery/power/apc{ dir = 4; @@ -2236,29 +1859,10 @@ "CB" = ( /turf/open/floor/iron, /area/security/brig) -"CJ" = ( -/turf/open/floor/plasteel/dark, -/area/science/explab) "Da" = ( /obj/machinery/suit_storage_unit/captain, /turf/open/floor/iron, /area/engine/engineering) -"Dg" = ( -/obj/effect/turf_decal/bot, -/obj/structure/extinguisher_cabinet{ - pixel_x = 27 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/closet/crate/science, -/obj/item/xenoartifact, -/obj/item/xenoartifact, -/obj/item/xenoartifact, -/obj/item/xenoartifact, -/obj/effect/mapping_helpers/tile_breaker, -/turf/open/floor/plasteel/dark, -/area/science/explab) "Dl" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2284,10 +1888,6 @@ /obj/item/storage/backpack/holding, /turf/open/floor/iron, /area/bridge) -"DP" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/engine, -/area/science/explab) "DT" = ( /obj/machinery/chem_dispenser/chem_synthesizer, /turf/open/floor/iron/dark, @@ -2327,16 +1927,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/iron, /area/storage/primary) -"Ff" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -26 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "FD" = ( /obj/structure/cable{ icon_state = "4-8" @@ -2349,25 +1939,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"FR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/effect/landmark/xeno_spawn, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "FU" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -2380,12 +1951,6 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/iron, /area/construction) -"Gr" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/science/explab) "Gy" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -2459,33 +2024,6 @@ /obj/structure/fans/tiny, /turf/open/floor/iron/dark, /area/security/brig) -"Hw" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/structure/railing/corner{ - dir = 4 - }, -/obj/effect/turf_decal/trimline/purple/filled/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"HF" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/science/explab) "HI" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2518,31 +2056,11 @@ /obj/effect/turf_decal/bot, /turf/open/floor/iron, /area/quartermaster/storage) -"HQ" = ( -/obj/machinery/power/floodlight, -/obj/structure/cable/yellow{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/science/explab) "HT" = ( /obj/structure/table, /obj/item/melee/transforming/energy/axe, /turf/open/floor/iron, /area/storage/primary) -"HY" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/loot_jobscale/medical/first_aid_kit, -/obj/item/clothing/neck/stethoscope, -/obj/item/healthanalyzer{ - pixel_y = 7 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "Ie" = ( /turf/open/floor/iron, /area/medical/chemistry) @@ -2588,25 +2106,6 @@ }, /turf/open/floor/iron, /area/quartermaster/miningoffice) -"Jx" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/table, -/obj/item/clothing/gloves/artifact_pinchers, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_y = 5 - }, -/obj/item/xenoarchaeology_labeler, -/obj/item/xenoarchaeology_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science, -/obj/item/clothing/glasses/science{ - pixel_y = 8 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "Jz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -2621,11 +2120,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, /area/medical/chemistry) -"JO" = ( -/obj/machinery/xenoarchaeology_machine/scale, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/science/explab) "JP" = ( /obj/machinery/door/airlock/public/glass, /turf/open/floor/iron, @@ -2656,17 +2150,6 @@ /obj/structure/closet/syndicate/resources/everything, /turf/open/floor/iron, /area/science) -"KK" = ( -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 10 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/bot, -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "KL" = ( /obj/machinery/conveyor_switch/oneway{ id = "cargoload" @@ -2720,24 +2203,6 @@ }, /turf/open/floor/iron, /area/medical/chemistry) -"LR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden/layer4{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "LU" = ( /obj/machinery/camera/autoname{ dir = 4 @@ -2762,27 +2227,6 @@ }, /turf/open/floor/iron, /area/storage/primary) -"My" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/science/explab) -"MB" = ( -/obj/structure/closet/emcloset, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/requests_console{ - department = "Science"; - departmentType = 2; - name = "Science Requests Console"; - pixel_x = -30; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "MK" = ( /obj/machinery/computer/operating{ dir = 1 @@ -2792,12 +2236,6 @@ }, /turf/open/floor/iron/cafeteria, /area/medical/medbay) -"ML" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/iron, -/area/hallway/secondary/exit/departure_lounge) "MN" = ( /obj/machinery/door/airlock, /obj/structure/cable{ @@ -2812,11 +2250,6 @@ }, /turf/open/floor/iron/white/corner, /area/medical/medbay) -"Nb" = ( -/obj/effect/turf_decal/stripes/line, -/obj/effect/landmark/observer_start, -/turf/open/floor/plasteel/dark, -/area/science/explab) "Nc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -2859,20 +2292,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"NY" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/machinery/shower{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/landmark/blobstart, -/obj/effect/mapping_helpers/make_non_slip, -/turf/open/floor/plasteel/white, -/area/science/explab) -"Oq" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/dark, -/area/science/explab) "Oy" = ( /obj/structure/cable{ icon_state = "2-8" @@ -2909,15 +2328,6 @@ }, /turf/open/floor/iron, /area/science) -"Pp" = ( -/obj/machinery/vending/wardrobe/science_wardrobe, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/effect/mapping_helpers/tile_breaker, -/turf/open/floor/plasteel/white, -/area/science/explab) "Pq" = ( /obj/machinery/light, /obj/machinery/clonepod/prefilled, @@ -2926,19 +2336,6 @@ }, /turf/open/floor/iron/white/corner, /area/medical/medbay) -"Ps" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/railing{ - dir = 4; - layer = 3.2 - }, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "Pt" = ( /obj/machinery/power/apc{ dir = 1; @@ -2990,20 +2387,6 @@ }, /turf/open/floor/iron, /area/science) -"Qq" = ( -/obj/effect/turf_decal/trimline/purple/filled/line, -/obj/structure/sink{ - dir = 1 - }, -/obj/machinery/light, -/obj/machinery/power/apc{ - areastring = "/area/science/explab"; - name = "Experimentation Lab APC"; - pixel_y = -24 - }, -/obj/structure/cable/yellow, -/turf/open/floor/plasteel/white, -/area/science/explab) "Qt" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 @@ -3028,45 +2411,10 @@ }, /turf/open/floor/iron/dark, /area/engine/gravity_generator) -"QU" = ( -/obj/effect/turf_decal/trimline/purple/filled/warning{ - dir = 8 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer2{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white, -/area/science/explab) -"QZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/science/explab) "Rb" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/aft) -"Rd" = ( -/obj/structure/closet/radiation, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 8 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "Rg" = ( /obj/structure/closet/secure_closet/hop{ locked = 0 @@ -3104,12 +2452,6 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"RG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/engine, -/area/science/explab) "RM" = ( /obj/structure/cable{ icon_state = "1-2" @@ -3122,11 +2464,6 @@ }, /turf/open/floor/iron, /area/engine/engineering) -"RO" = ( -/obj/effect/turf_decal/box, -/obj/item/xenoartifact/tutorial, -/turf/open/floor/engine, -/area/science/explab) "RY" = ( /obj/machinery/camera/autoname, /turf/open/floor/iron, @@ -3189,17 +2526,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/iron, /area/security/brig) -"Tc" = ( -/obj/machinery/door/airlock/external{ - name = "Departure Lounge Airlock" - }, -/obj/effect/turf_decal/delivery, -/obj/structure/fans/tiny, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/iron, -/area/hallway/secondary/exit/departure_lounge) "Tg" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -3296,19 +2622,6 @@ }, /turf/open/floor/iron, /area/engine/gravity_generator) -"UG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/structure/railing{ - dir = 5 - }, -/obj/item/kirbyplants/random, -/obj/effect/turf_decal/trimline/purple/filled/line{ - dir = 5 - }, -/turf/open/floor/plasteel/white, -/area/science/explab) "UI" = ( /obj/machinery/light, /obj/structure/closet/secure_closet/engineering_chief{ @@ -3399,12 +2712,6 @@ dir = 1 }, /area/medical/medbay) -"WD" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/science/explab) "WK" = ( /obj/machinery/light{ dir = 1 @@ -3461,9 +2768,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 }, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/iron, /area/hallway/secondary/exit/departure_lounge) "XO" = ( @@ -3514,21 +2818,6 @@ }, /turf/open/floor/iron, /area/hallway/secondary/entry) -"Yx" = ( -/obj/structure/table, -/obj/item/folder/white{ - pixel_x = 4; - pixel_y = -3 - }, -/obj/item/pen, -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/trimline/dark_blue/filled/line{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/science/explab) "YB" = ( /obj/machinery/light{ dir = 8 @@ -8704,7 +7993,7 @@ JP vM Ef pF -pF +ww pF yS pF @@ -9175,14 +8464,14 @@ xx IW fR XK -ML -ML -Tc -My -My -My -My -Gr +vt +vt +GZ +aa +aa +aa +aa +aa aa aa aa @@ -9274,7 +8563,7 @@ aa aa aa aa -HF +aa aa aa aa @@ -9366,7 +8655,7 @@ aa aa aa aa -HF +aa aa aa aa @@ -9458,7 +8747,7 @@ aa aa aa aa -HF +aa aa aa aa @@ -9543,17 +8832,17 @@ iV iV et aa -yt -yt -yt -yt -yt -yt -yt -kk -kV -yt -kG +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -9635,17 +8924,17 @@ jn ni et aa -yt -jw -Rd -mJ -MB -Pp -Ff -QU -KK -yt -is +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -9727,17 +9016,17 @@ fh fh et aa -yt -BW -Ps -Ps -Ps -Ps -he -rj -Qq -yt -Yx +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -9819,17 +9108,17 @@ aa aa aa aa -yt -AU -CJ -CJ -CJ -xN -UG -Hw -NY -yt -sW +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -9911,17 +9200,17 @@ aa aa aa aa -yt -jo -QZ -BA -xi -Oq -uD -gN -pv -yt -yt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -10003,17 +9292,17 @@ aa aa aa aa -yt -JO -uu -RO -DP -Nb -uD -FR -wx -iF -yt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -10095,17 +9384,17 @@ aa aa aa aa -yt -oO -wj -WD -RG -Oq -uD -LR -pj -hE -yt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -10187,17 +9476,17 @@ aa aa aa aa -yt -HQ -Jx -Dg -Ab -wk -jN -hj -mr -HY -yt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa @@ -10279,17 +9568,17 @@ aa aa aa aa -yt -yt -yt -yt -yt -yt -yt -pw -yt -yt -yt +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa aa aa aa diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 19f83da4fbfea..cb21d585e40c0 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -16,22 +16,32 @@ export const XenoartifactConsole = (props, context) => { {`Research Budget: ${money} credits`} - -
      setTab('listings')} selected={tab === 'listings'}> - Listings + Listings setTab('requests')} selected={tab === 'requests'}> - Requests + Requests setTab('history')} selected={tab === 'history'}> - History + History @@ -48,10 +58,10 @@ const XenoartifactConsoleSellerTab = (props, context) => { const { stability, money, purchase_radio, solved_radio, current_tab } = data; const sellers = data.sellers || []; return ( - - {sellers.map((value) => ( - - ))} + + {sellers.map((value) => ( + + ))} ); }; @@ -59,15 +69,26 @@ const XenoartifactConsoleSellerTab = (props, context) => { const XenoartifactConsoleSellerEntry = (props, context) => { const { act } = useBackend(context); const { value } = props; - const stock = value["stock"] || []; + const stock = value['stock'] || []; return ( -
      -
      {`${value["dialogue"]}`}
      +
      +
      {`${value['dialogue']}`}
      {stock.map((stock_list) => ( -
      act(`stock_purchase`, { item_id: stock_list["id"], seller_id: value["id"] })}>{`$${stock_list["cost"]}`}} key={stock_list}> -
      {`${stock_list["description"]}`}
      +
      + act(`stock_purchase`, { item_id: stock_list['id'], seller_id: value['id'] }) + }>{`$${stock_list['cost']}`} + } + key={stock_list}> +
      {`${stock_list['description']}`}
      ))} @@ -106,10 +127,12 @@ const XenoartifactConsoleHistoryTab = (props, context) => { const { act, data } = useBackend(context); const history = data.history || []; return ( - - {history.map((value) => ( -
      {value}
      - ))} + + {history.map((value) => ( +
      + {value} +
      + ))}
      ); }; diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index 5258ff79191e7..c1ac25ae39834 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -23,12 +23,7 @@ export const XenoartifactLabeler = (props, context) => { const XenoartifactlabelerTraits = (props, context) => { const { act, data } = useBackend(context); - const { - activator_traits, - minor_traits, - major_traits, - malfunction_list, - } = data; + const { activator_traits, minor_traits, major_traits, malfunction_list } = data; let alphasort = function (a, b) { return a.localeCompare(b, 'en'); @@ -44,11 +39,7 @@ const XenoartifactlabelerTraits = (props, context) => {
      {sorted_activators.map((trait) => ( - + ))}
      @@ -56,11 +47,7 @@ const XenoartifactlabelerTraits = (props, context) => {
      {sorted_minors.map((trait) => ( - + ))}
      @@ -68,23 +55,15 @@ const XenoartifactlabelerTraits = (props, context) => {
      {sorted_majors.map((trait) => ( - + ))}
      - +
      {sorted_malfs.map((trait) => ( - + ))}
      @@ -114,9 +93,9 @@ const XenoartifactlabelerGenerateEntry = (props, context) => { content={specific_trait} checked={selected_traits.includes(specific_trait)} onClick={() => act(`toggle_trait`, { trait_name: specific_trait })} - tooltip={`${tooltip_stats[specific_trait]["alt_name"] ? `${tooltip_stats[specific_trait]["alt_name"]},` : ``} - Weight: ${tooltip_stats[specific_trait]["weight"]}, - Conductivity: ${tooltip_stats[specific_trait]["conductivity"]}`} + tooltip={`${tooltip_stats[specific_trait]['alt_name'] ? `${tooltip_stats[specific_trait]['alt_name']},` : ``} + Weight: ${tooltip_stats[specific_trait]['weight']}, + Conductivity: ${tooltip_stats[specific_trait]['conductivity']}`} /> ); @@ -129,12 +108,12 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { return (
      -
      {`${tooltip_stats[info]["desc"]}`}
      - {tooltip_stats[info]["hints"].map((hint) => ( -
      From 899627b6eda77f53c9ef928a6208973d7f26a935 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Apr 2024 20:04:25 +1000 Subject: [PATCH 164/339] Misc Fixes - 19 4 24 --- _maps/RandomZLevels/snowdin.dmm | 23 ++-------------- .../map_files/Deltastation/DeltaStation2.dmm | 26 +++++++++---------- _maps/map_files/FlandStation/FlandStation.dmm | 20 +++++++------- _maps/shuttles/whiteship/whiteship_delta.dmm | 1 - .../antagonists/wizard/equipment/artefact.dm | 2 +- .../tgui/interfaces/XenoartifactConsole.js | 3 ++- 6 files changed, 28 insertions(+), 47 deletions(-) diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index b1f52cd184796..8e22949e8943d 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -7941,8 +7941,6 @@ dir = 8 }, /obj/structure/closet/crate, -/obj/item/relic, -/obj/item/relic, /turf/open/floor/plating{ broken = 1 }, @@ -8012,9 +8010,6 @@ /area/awaymission/snowdin/outside) "yx" = ( /obj/structure/closet/crate, -/obj/item/relic, -/obj/item/relic, -/obj/item/relic, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) "yy" = ( @@ -11876,12 +11871,6 @@ }, /turf/open/floor/iron, /area/awaymission/snowdin/post/mining_main) -"Ng" = ( -/obj/structure/closet/crate, -/obj/item/relic, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "Nj" = ( /obj/structure/door_assembly/door_assembly_min{ anchored = 1; @@ -12328,14 +12317,6 @@ }, /turf/open/floor/iron/white, /area/awaymission/snowdin/post) -"PK" = ( -/obj/structure/closet/crate, -/obj/item/relic, -/obj/item/relic, -/obj/item/relic, -/obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, -/turf/open/floor/iron, -/area/awaymission/snowdin/post/mining_dock) "PO" = ( /obj/effect/spawner/randomvend/snack, /obj/effect/turf_decal/tile/neutral/fourcorners/contrasted, @@ -64286,7 +64267,7 @@ wL wL Nk yj -PK +UT xW eJ eJ @@ -64542,7 +64523,7 @@ xy XD xy Nk -Ng +UT yx wD eJ diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index fd9e53d9728df..21b12e1d3dcba 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -17257,7 +17257,7 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 1 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "dnk" = ( /obj/structure/chair/fancy/comfy{ @@ -18089,7 +18089,7 @@ name = "emergency shower" }, /obj/item/kirbyplants/random, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "dAW" = ( /obj/structure/table/reinforced, @@ -26608,7 +26608,7 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 4 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "fIy" = ( /obj/structure/cable/white, @@ -38245,7 +38245,7 @@ /obj/effect/turf_decal/stripes/closeup{ dir = 1 }, -/turf/open/floor/iron/dark, +/turf/open/floor/iron/white, /area/science/explab) "iNF" = ( /obj/machinery/door/poddoor/shutters/preopen{ @@ -39760,7 +39760,7 @@ "jli" = ( /obj/machinery/holopad, /obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "jls" = ( /obj/structure/cable/yellow{ @@ -43157,7 +43157,7 @@ /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "khy" = ( /obj/machinery/door/airlock/maintenance_hatch{ @@ -43695,12 +43695,12 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 1 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "knK" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, /obj/effect/turf_decal/tile/purple/half/contrasted, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "knQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -46887,7 +46887,7 @@ dir = 4 }, /obj/effect/turf_decal/tile/purple/fourcorners/contrasted, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "lfK" = ( /obj/structure/chair/office{ @@ -47843,7 +47843,7 @@ }, /obj/effect/turf_decal/tile/purple/anticorner/contrasted, /obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "luB" = ( /obj/structure/chair{ @@ -49706,7 +49706,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/iron/white, /area/maintenance/department/science) "lTR" = ( /obj/structure/table, @@ -56571,7 +56571,7 @@ /obj/structure/cable/yellow{ icon_state = "2-8" }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "nOX" = ( /obj/effect/decal/cleanable/dirt, @@ -93797,7 +93797,7 @@ /obj/effect/turf_decal/tile/purple/half/contrasted{ dir = 4 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "xZX" = ( /obj/structure/chair{ diff --git a/_maps/map_files/FlandStation/FlandStation.dmm b/_maps/map_files/FlandStation/FlandStation.dmm index 0e20de0c3ad18..fc23254c12ac3 100644 --- a/_maps/map_files/FlandStation/FlandStation.dmm +++ b/_maps/map_files/FlandStation/FlandStation.dmm @@ -5084,7 +5084,7 @@ dir = 1 }, /obj/effect/turf_decal/tile/purple/fourcorners/contrasted, -/turf/open/floor/iron/techmaint, +/turf/open/floor/iron/white, /area/science/explab) "bng" = ( /obj/structure/closet/emcloset, @@ -11697,7 +11697,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 1 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "ddJ" = ( /obj/structure/cable/yellow{ @@ -30262,7 +30262,7 @@ dir = 1 }, /obj/effect/turf_decal/trimline/purple/filled/corner, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "hJy" = ( /obj/effect/turf_decal/bot, @@ -32571,7 +32571,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 6 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "ilX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ @@ -42414,7 +42414,7 @@ /obj/effect/turf_decal/trimline/purple/filled/end{ dir = 4 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "kDV" = ( /obj/effect/turf_decal/bot, @@ -56605,7 +56605,7 @@ /obj/effect/turf_decal/trimline/purple/filled/end{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "odw" = ( /obj/structure/bodycontainer/morgue{ @@ -58983,7 +58983,7 @@ pixel_y = -28 }, /obj/effect/mapping_helpers/make_non_slip, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "oGO" = ( /obj/structure/lattice/catwalk/over, @@ -62987,7 +62987,7 @@ icon_state = "1-2" }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "pBz" = ( /obj/structure/lattice/catwalk/over, @@ -67396,7 +67396,7 @@ dir = 1 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel/dark, +/turf/open/floor/noslip/dark, /area/science/explab) "qFB" = ( /obj/effect/turf_decal/bot, @@ -76766,7 +76766,7 @@ /obj/structure/cable/yellow{ icon_state = "2-4" }, -/turf/open/floor/plasteel/white, +/turf/open/floor/iron/white, /area/science/explab) "sTj" = ( /obj/structure/cable/yellow{ diff --git a/_maps/shuttles/whiteship/whiteship_delta.dmm b/_maps/shuttles/whiteship/whiteship_delta.dmm index 632c48dd2eb4f..44d8c16df2012 100644 --- a/_maps/shuttles/whiteship/whiteship_delta.dmm +++ b/_maps/shuttles/whiteship/whiteship_delta.dmm @@ -2093,7 +2093,6 @@ }, /obj/structure/closet/crate, /obj/item/grenade/chem_grenade/metalfoam, -/obj/item/relic, /obj/item/t_scanner, /obj/effect/spawner/lootdrop/maintenance{ lootcount = 3; diff --git a/code/modules/antagonists/wizard/equipment/artefact.dm b/code/modules/antagonists/wizard/equipment/artefact.dm index 22b5341c1ef41..4772365a7b403 100644 --- a/code/modules/antagonists/wizard/equipment/artefact.dm +++ b/code/modules/antagonists/wizard/equipment/artefact.dm @@ -166,7 +166,7 @@ if(ismob(A)) to_chat(A, "There is no way out of this place...") return - var/atom/return_thing = pick(GLOB.destabliization_exits) + var/atom/return_thing = pick(GLOB.destabliization_exits) || pick(get_safe_random_station_turfs()) var/turf/T = get_turf(return_thing) if(!T) return diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index cb21d585e40c0..44e5c8ee4f163 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -85,7 +85,8 @@ const XenoartifactConsoleSellerEntry = (props, context) => { icon={'shopping-cart'} onClick={() => act(`stock_purchase`, { item_id: stock_list['id'], seller_id: value['id'] }) - }>{`$${stock_list['cost']}`} + }>{`$${stock_list['cost']}`} + } key={stock_list}>
      {`${stock_list['description']}`}
      From e905fb377dcc01c27737ebbed420a5fceca38d94 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Apr 2024 20:14:47 +1000 Subject: [PATCH 165/339] Bruh --- _maps/map_files/EchoStation/EchoStation.dmm | 154 ++++++++++-------- _maps/map_files/Mining/Lavaland.dmm | 7 +- .../tgui/interfaces/XenoartifactConsole.js | 5 +- 3 files changed, 87 insertions(+), 79 deletions(-) diff --git a/_maps/map_files/EchoStation/EchoStation.dmm b/_maps/map_files/EchoStation/EchoStation.dmm index de3787324a6c0..bf65c26716f5f 100644 --- a/_maps/map_files/EchoStation/EchoStation.dmm +++ b/_maps/map_files/EchoStation/EchoStation.dmm @@ -113,10 +113,8 @@ dir = 8; network = list("ss13","rd") }, -/mob/living/simple_animal/pet/dog/pug{ - density = 0; - dir = 8 - }, +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/scale, /turf/open/floor/engine, /area/science/explab) "acU" = ( @@ -358,37 +356,19 @@ /turf/open/floor/iron/white, /area/medical/medbay/central) "aiv" = ( -/obj/structure/table/reinforced, -/obj/item/xenoartifact_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/xenoartifact_labeler{ - pixel_y = 6 - }, -/obj/item/clothing/glasses/science{ - pixel_x = 4; - pixel_y = 10 - }, -/obj/item/healthanalyzer, -/obj/item/analyzer, -/obj/item/clothing/gloves/artifact_pinchers{ - pixel_y = 3 - }, -/obj/item/multitool, -/obj/item/clothing/mask/gas, -/obj/item/book/manual/wiki/xenoarchaeology, -/obj/item/clothing/neck/stethoscope, /obj/structure/extinguisher_cabinet{ pixel_x = -28 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/iron, +/obj/structure/closet/bombcloset/white, +/obj/item/storage/firstaid/radbgone, +/obj/item/clothing/head/radiation, +/obj/item/clothing/suit/radiation, +/obj/item/geiger_counter, +/obj/effect/turf_decal/bot, +/turf/open/floor/iron/dark, /area/science/explab) "aiA" = ( /obj/effect/turf_decal/stripes/line, @@ -505,9 +485,6 @@ /turf/open/floor/iron/dark, /area/ai_monitored/turret_protected/ai_upload) "ake" = ( -/obj/item/xenoartifact, -/obj/machinery/xenoartifact_inbox, -/obj/effect/turf_decal/delivery, /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/engine, /area/science/explab) @@ -1340,11 +1317,6 @@ name = "Engineering Viewing Platform" }) "awc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/rnd/experimentor, -/obj/effect/turf_decal/delivery, /obj/machinery/light{ dir = 1 }, @@ -1733,6 +1705,11 @@ "aCm" = ( /turf/closed/wall, /area/maintenance/department/bridge) +"aCv" = ( +/obj/effect/turf_decal/delivery, +/obj/item/xenoartifact, +/turf/open/floor/engine, +/area/science/explab) "aCA" = ( /obj/effect/turf_decal/bot, /obj/machinery/portable_atmospherics/pump, @@ -2182,6 +2159,7 @@ /area/bridge) "aKy" = ( /obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/calibrator/tutorial, /turf/open/floor/engine, /area/science/explab) "aKC" = ( @@ -2760,15 +2738,24 @@ /turf/closed/indestructible/rock/bedrock, /area/quartermaster/storage) "aUG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/structure/table, +/obj/item/clothing/gloves/artifact_pinchers, +/obj/item/clothing/gloves/artifact_pinchers{ + pixel_y = 5 }, -/obj/effect/turf_decal/bot, -/obj/machinery/computer/rdconsole/experiment, +/obj/item/xenoarchaeology_labeler, +/obj/item/xenoarchaeology_labeler{ + pixel_y = 6 + }, +/obj/item/clothing/glasses/science, +/obj/item/clothing/glasses/science{ + pixel_y = 8 + }, +/obj/effect/turf_decal/stripes/line, /obj/item/radio/intercom{ pixel_y = 28 }, -/turf/open/floor/iron, +/turf/open/floor/iron/dark, /area/science/explab) "aUN" = ( /obj/structure/table/reinforced, @@ -4596,14 +4583,11 @@ /turf/open/floor/iron, /area/security/brig) "bMy" = ( -/obj/structure/chair/office/light{ - dir = 1 - }, -/obj/effect/landmark/start/scientist, /obj/machinery/light_switch{ pixel_x = -25; pixel_y = -25 }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4, /turf/open/floor/iron/white, /area/science/explab) "bMB" = ( @@ -22263,15 +22247,18 @@ /area/engine/atmos) "lhu" = ( /obj/effect/decal/cleanable/dirt/dust, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on/layer4{ - dir = 8 - }, /obj/machinery/power/apc/auto_name/south{ pixel_y = -24 }, /obj/structure/cable/yellow{ icon_state = "0-8" }, +/obj/machinery/computer/xenoarchaeology_console{ + dir = 8 + }, +/obj/item/book/manual/wiki/xenoarchaeology{ + pixel_x = -6 + }, /turf/open/floor/iron/white, /area/science/explab) "lhB" = ( @@ -22399,12 +22386,13 @@ /area/crew_quarters/cafeteria) "llo" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on/layer2, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ - dir = 6 - }, /obj/structure/cable/yellow{ icon_state = "2-4" }, +/obj/effect/landmark/start/scientist, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ + dir = 1 + }, /turf/open/floor/iron/white, /area/science/explab) "lly" = ( @@ -38215,6 +38203,8 @@ /turf/open/floor/iron/dark, /area/quartermaster/storage) "tyz" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/xenoarchaeology_machine/conductor, /turf/open/floor/engine, /area/science/explab) "tyI" = ( @@ -38874,6 +38864,18 @@ /obj/machinery/airalarm/directional/north, /turf/open/floor/wood, /area/vacant_room/office) +"tOK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/mob/living/simple_animal/pet/dog/pug{ + desc = "It's Pugley IV, the research department's lovable pug clone. Hopefully nothing happens to this one - fourth time lucky!"; + name = "Pugley IV"; + real_name = "Pugley IV" + }, +/obj/structure/bed/dogbed, +/turf/open/floor/engine, +/area/science/explab) "tOO" = ( /obj/effect/turf_decal/tile/purple/anticorner/contrasted{ dir = 1 @@ -40840,11 +40842,6 @@ /turf/open/floor/iron, /area/maintenance/department/cargo) "uMJ" = ( -/obj/machinery/computer/xenoartifact_console, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, /obj/machinery/camera/autoname{ dir = 6; network = list("ss13","rd") @@ -40852,7 +40849,14 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/iron, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/bot, +/obj/structure/closet/crate/science, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/obj/item/xenoartifact, +/turf/open/floor/iron/dark, /area/science/explab) "uNe" = ( /obj/machinery/door/airlock/maintenance_hatch{ @@ -42607,17 +42611,27 @@ /turf/open/floor/plating, /area/maintenance/department/bridge) "vOC" = ( -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/bombcloset/white, -/obj/item/geiger_counter, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/storage/firstaid/radbgone, /obj/machinery/airalarm/directional/north, -/turf/open/floor/iron, +/obj/effect/turf_decal/stripes/corner, +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_x = -2; + pixel_y = -1 + }, +/obj/item/analyzer{ + pixel_x = -9 + }, +/obj/item/multitool{ + pixel_x = -1 + }, +/obj/item/geiger_counter{ + pixel_x = 5 + }, +/obj/item/sticky_note_pile{ + pixel_y = 3; + pixel_x = 8 + }, +/turf/open/floor/iron/dark, /area/science/explab) "vPx" = ( /obj/structure/railing, @@ -132394,7 +132408,7 @@ wZl hYK aYd aqy -aYd +tOK aAV aJn scy @@ -132650,7 +132664,7 @@ olN pyQ nFR awc -tyz +aCv ake aAV aBR diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index 285aef8e30d5c..8d15071b06b99 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -5311,11 +5311,6 @@ /obj/machinery/light/small, /turf/open/floor/carpet/blue, /area/mine/living_quarters) -"Nz" = ( -/obj/machinery/rnd/experimentor, -/obj/effect/decal/cleanable/dirt/dust, -/turf/open/floor/engine, -/area/mine/science) "NB" = ( /obj/structure/camera_assembly{ dir = 6 @@ -50314,7 +50309,7 @@ mp qy zA cE -Nz +YW mp Zd Zd diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 44e5c8ee4f163..b49e591f40d6d 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -83,9 +83,8 @@ const XenoartifactConsoleSellerEntry = (props, context) => { buttons={ } key={stock_list}> From bcfd0680bac710bf4719aa7cac963907502a12a1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Apr 2024 20:21:55 +1000 Subject: [PATCH 166/339] visible_message --- .../modules/mob/living/simple_animal/hostile/megafauna/drake.dm | 2 +- code/modules/mob/mob.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm index 4abd745e7598d..3687c402fecd5 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/drake.dm @@ -384,7 +384,7 @@ Difficulty: Medium return FALSE return ..() -/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, separation = " ") +/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, allow_inside_usr = FALSE, separation = " ") if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit return return ..() diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index d7f2d36d39963..cf63a9bafea2b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -232,7 +232,7 @@ if(length(show_to)) create_chat_message(src, null, show_to, raw_msg, null, visible_message_flags) -/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, separation = " ") +/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, list/visible_message_flags, allow_inside_usr = FALSE, separation = " ") . = ..() if(self_message) show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE) From ed980de76795bd27e63e636b46f04e1db98389a1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 19 Apr 2024 21:30:50 +1000 Subject: [PATCH 167/339] Hints & Tutorial - 19 4 24 --- _maps/map_files/MetaStation/MetaStation.dmm | 3 +- code/game/objects/effects/contraband.dm | 9 +++++ .../modules/xenoarchaeology/misc/materials.dm | 2 +- code/modules/xenoarchaeology/misc/tutorial.dm | 36 ++++++------------ icons/obj/contraband.dmi | Bin 83242 -> 84136 bytes 5 files changed, 23 insertions(+), 27 deletions(-) diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 2ee4def2616e3..8257f9e82a774 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -4208,6 +4208,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{ dir = 4 }, +/turf/open/floor/iron/white, /area/science/explab) "aRd" = ( /obj/structure/table, @@ -56691,7 +56692,7 @@ /obj/effect/turf_decal/trimline/purple/filled/line{ dir = 5 }, -/obj/structure/sign/poster/official/xenoarchaeology{ +/obj/structure/sign/poster/official/xenoarchaeology_pearl{ pixel_y = 32 }, /turf/open/floor/iron/white, diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 95a0220561102..0673d4e8286aa 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -679,4 +679,13 @@ Poorly labeled artifacts will yield fewer rewards than accurately labeled ones." icon_state = "poster51" +/obj/structure/sign/poster/official/xenoarchaeology_pearl + name = "???" + desc = "A poster featuring an artifact you don't recognize.\ + \n\ + Legends say, artifacts can be made by striking objects with nuclear particles. They also \ + say once stabilized, artifacts behave strangely when aligned to certain grids, related to \ + the characteristics of their traits." + icon_state = "poster52" + #undef PLACE_SPEED diff --git a/code/modules/xenoarchaeology/misc/materials.dm b/code/modules/xenoarchaeology/misc/materials.dm index f8678a5dd9baa..37d7281714872 100644 --- a/code/modules/xenoarchaeology/misc/materials.dm +++ b/code/modules/xenoarchaeology/misc/materials.dm @@ -11,7 +11,7 @@ var/trait_activators = 1 var/trait_minors = 3 var/trait_majors = 1 - var/trait_malfunctions = 0 + var/trait_malfunctions = 0 //How many malfunctions we start with ///How many malfunctions can we gain, maximum var/max_trait_malfunctions = 1 diff --git a/code/modules/xenoarchaeology/misc/tutorial.dm b/code/modules/xenoarchaeology/misc/tutorial.dm index 4a4ada637039f..fd94db8724ba1 100644 --- a/code/modules/xenoarchaeology/misc/tutorial.dm +++ b/code/modules/xenoarchaeology/misc/tutorial.dm @@ -3,35 +3,21 @@ */ /obj/item/sticker/sticky_note/artifact_tutorial - custom_text = "Hello, ______. \n\ + custom_text = "Went out for coffee, mind doing this one for me?\n\ \n\ - I hope you have settled into your new post well, and have begun your research. \ - Under reccomendation of ______, your outpost has been licensed to research class-X artifacts. \ - We hope you'll appreciate the gesture.\n\ + It's pretty simple, just remember to wear your PPE. In-case you \ + forgot, that's your anti-tactile pinchers & science goggles, and \ + you'll probably want a labeler too.\n\ \n\ - We have shipped you some samples to get you started. The one supplied along with this note should \ - serve as a fine introduction.\n\ + If you're going to label this for me, remember that you need to \ + label exactly 1 activator, 3 minors, and 1 major. I think some \ + of these things can develop malfunctions, I heard the green ones \ + even start with one too, so keep an eye out for that.\n\ \n\ - To start researching an artifact, note its material. If you examine this one here, you will find \ - it is a **bluespace** artifact, this lets us know which artifact traits are compatible with it. \ - Use your artifact labeler to see what materials a trait is compatible with.\n \ - If you're wearing your science goggles, your proper PPE, you may also notice another, more \ - in-depth material description. This will hint at what traits the artifact has, and can be \ - checked in your labeler.\n \ - Another piece of PPE you should be wearing is your anti-tactile pinchers, these will stop \ - artifacts from making you a missing persons case. If you are wearing these, and have them \ - enabled, you should be able to 'feel' the artifact, your science goggles will recognize any \ - sensations and inform you which trait they correspond to.\n \ - Finally, don't forget about those dusty machines in the corner. They can be used to measure weight \ - and conductivity, respectively. If you label an artifact then weigh it, it will tell you the \ - weight of the currently labeled traits, and the artifact's total weight. You can use this in \ - combination with your labeler to deduce what other traits the artifact has.\n\ + After you've labeled it, correctly, you can hand it over to cargo, \ + to sell. The console will handle the rest.\n\ \n\ - When you're done, be sure to label the artifact and hand it over to cargo, remember to tell them not\ - to touch it. If you've done a good job, we'll be sure to send you back some resources to aid your\ - research.\n\ - \n\ - Good luck, and safe travels." + XOXO - Howard" /* How to use the calibrator diff --git a/icons/obj/contraband.dmi b/icons/obj/contraband.dmi index f6e275e8e8414ad98cf6692db8a7552534e07751..a51b046568d678acf1649933b1d48e09fbe66c90 100644 GIT binary patch delta 12928 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

      PgeI?e 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 ahDjC=a}>D7Vby}39|buT*$Qcsp#K9VM8!-1 From d36ddd2023cf66ab6e79f45e2835e77ab790e634 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 22 Apr 2024 09:11:14 +1000 Subject: [PATCH 168/339] Update malfunctions.dm --- code/modules/xenoarchaeology/traits/malfunctions.dm | 1 - 1 file changed, 1 deletion(-) diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 51e7f96ba9659..8f531b6ebb077 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -134,7 +134,6 @@ faction = list("evil_clone") status_flags = CANPUSH del_on_death = TRUE - do_footstep = TRUE mobchatspan = "syndmob" /* From cd3e27f7acc1400e187e162c4d1e153d303565eb Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 5 May 2024 15:13:35 +1000 Subject: [PATCH 169/339] Improve rewards - 5 5 24 --- .../tools/console/xenoarchaeology_console.dm | 8 ++++++-- .../tools/xenoarchaeology_tracker.dm | 20 ++++++++++++++----- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index f893e3fec3288..3ecb3f28ea39f 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -170,7 +170,11 @@ //Rewards //Research Points var/rnd_reward = max(0, (artifact.custom_price*X.artifact_type.rnd_rate)*success_rate) + //Discovery Points + var/dp_reward = max(0, (artifact.custom_price*X.artifact_type.dp_rate)*success_rate) + //Alloctae linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_GENERIC, rnd_reward) + linked_techweb?.add_point_type(TECHWEB_POINT_TYPE_DISCOVERY, dp_reward) //Money //TODO: Check if this is sufficient - Racc : PLAYTEST var/monetary_reward = ((artifact.custom_price * success_rate * 2)^1.5) * (success_rate >= 0.5 ? 1 : 0) budget.adjust_money(monetary_reward) @@ -187,10 +191,10 @@ success_type = prob(50) ? "scientific failure." : "who let the clown in?" if(!radio_solved_notice) radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ - at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, and a monetary commision of $[monetary_reward].",\ + at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, [dp_reward] Discovery Points, and a monetary commision of $[monetary_reward].",\ RADIO_CHANNEL_SCIENCE) history += list("[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ - at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, and a monetary commision of $[monetary_reward].") + at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, [dp_reward] Discovery Points, and a monetary commision of $[monetary_reward].") //Circuitboard for this console /obj/item/circuitboard/computer/xenoarchaeology_console diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm index 4b059171b0877..4014d744720ef 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_tracker.dm @@ -11,8 +11,7 @@ sticker_icon_state = "tracker_small" do_outline = FALSE ///Reward stuff - var/reward_type = TECHWEB_POINT_TYPE_DISCOVERY - var/reward_amount = 100 + var/list/rewards = list(TECHWEB_POINT_TYPE_DISCOVERY = 100, TECHWEB_POINT_TYPE_GENERIC = 300) ///radio used to send messages on science channel var/obj/item/radio/headset/radio var/use_radio = TRUE @@ -31,6 +30,10 @@ . = ..() QDEL_NULL(radio) +/obj/item/sticker/artifact_tracker/examine(mob/user) + . = ..() + . += "Alt-Click to disable the radio & reward notice." + /obj/item/sticker/artifact_tracker/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) . = ..() if(!can_stick(target) || !proximity_flag) @@ -55,9 +58,16 @@ /obj/item/sticker/artifact_tracker/proc/catch_activation(datum/source, priority) SIGNAL_HANDLER - if(priority == TRAIT_PRIORITY_ACTIVATOR) + if(priority != TRAIT_PRIORITY_ACTIVATOR) + return + for(var/reward in rewards) + //Reward + var/reward_amount = rewards[reward] + linked_techweb?.add_point_type(reward, reward_amount) + //Message + if(!use_radio) + return var/datum/component/xenoartifact/X = source - var/message = "[X.parent] has generated [reward_amount] points of [reward_type] at [get_area(get_turf(src))]." + var/message = "[X.parent] has generated [reward_amount] points of [reward] at [get_area(get_turf(src))]." say(message) radio?.talk_into(src, message, RADIO_CHANNEL_SCIENCE) - linked_techweb?.add_point_type(reward_type, reward_amount) From 5b9614afb5446289b852c7eef64e047e8bbed246 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 5 May 2024 15:32:44 +1000 Subject: [PATCH 170/339] Fix conductor - 5 5 24 --- code/game/objects/effects/contraband.dm | 2 +- .../tools/xenoarchaeology_machines.dm | 12 +++++++++--- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/code/game/objects/effects/contraband.dm b/code/game/objects/effects/contraband.dm index 0673d4e8286aa..a6a8d22dd018f 100644 --- a/code/game/objects/effects/contraband.dm +++ b/code/game/objects/effects/contraband.dm @@ -683,7 +683,7 @@ name = "???" desc = "A poster featuring an artifact you don't recognize.\ \n\ - Legends say, artifacts can be made by striking objects with nuclear particles. They also \ + Legends say, artifacts can be made by striking objects with nuclear particles while submerged in tritium. They also \ say once stabilized, artifacts behave strangely when aligned to certain grids, related to \ the characteristics of their traits." icon_state = "poster52" diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index a0d90df94a4ec..81409143dc0dd 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -141,13 +141,19 @@ var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) if(X) total_conductivity += X.get_material_conductivity() + //If there's a label and we're obliged to 'help' the player var/obj/item/sticker/xenoartifact_label/L = locate(/obj/item/sticker/xenoartifact_label) in A.contents if(L) for(var/datum/xenoartifact_trait/T as() in L.traits) - say("[initial(T.label_name)] - Conductivity: [initial(T.conductivity)]") + say("[initial(T.label_name)] - conductivity: [initial(T.conductivity)]") else if(isitem(A) || isliving(A)) - say("Unexpected Item Detected!") - return + if(isliving(A)) + if(prob(1)) + say("Unexpected Fatass Detected!") + say("Get the fuck off me, lardass!") + else + say("Unexpected Item Detected!") + return if(total_conductivity) say("Total Conductivity: [total_conductivity] MPC.") else From 5358b6c28c43e4fe73d698778e63f35b7eb02da1 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 9 May 2024 17:02:02 +1000 Subject: [PATCH 171/339] Review - 9 5 24 --- code/__DEFINES/sticker.dm | 2 +- code/__DEFINES/xenoarchaeology.dm | 14 +++++++------- code/_globalvars/xenoarchaeology.dm | 4 ---- code/datums/components/storage/storage.dm | 2 +- code/game/objects/items.dm | 1 + code/modules/cargo/exports.dm | 1 - code/modules/spells/spell_types/shapeshift.dm | 2 +- 7 files changed, 11 insertions(+), 15 deletions(-) diff --git a/code/__DEFINES/sticker.dm b/code/__DEFINES/sticker.dm index c577b0ea897e1..bf548f8c3cbf7 100644 --- a/code/__DEFINES/sticker.dm +++ b/code/__DEFINES/sticker.dm @@ -10,7 +10,7 @@ #define STICKER_RARITY_MYTHIC (1<<4) //Sticker series -#define STICKER_SERIES_1 (1<<10) //Bump these along if you somehow need more rarities +#define STICKER_SERIES_1 (1<<10) //Bump these along if you somehow need more rarities > 10 //Drop weight #define STICKER_WEIGHT_COMMON 100 diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index 7100b9775816d..430fb2de01cfa 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -37,13 +37,13 @@ #define XENOA_TRAIT_STRENGTH_STRONG 100 ///trait flags -#define XENOA_BLUESPACE_TRAIT (1<<0) -#define XENOA_PLASMA_TRAIT (1<<1) -#define XENOA_URANIUM_TRAIT (1<<2) -#define XENOA_BANANIUM_TRAIT (1<<3) -#define XENOA_PEARL_TRAIT (1<<4) -#define XENOA_MISC_TRAIT (1<<5) -#define XENOA_HIDE_TRAIT (1<<6) +#define XENOA_BLUESPACE_TRAIT (1<<0) //Github's webview fucks these up, but they look fine in the editor +#define XENOA_PLASMA_TRAIT (1<<1) +#define XENOA_URANIUM_TRAIT (1<<2) +#define XENOA_BANANIUM_TRAIT (1<<3) +#define XENOA_PEARL_TRAIT (1<<4) +#define XENOA_MISC_TRAIT (1<<5) +#define XENOA_HIDE_TRAIT (1<<6) ///trait cooldowns #define XENOA_TRAIT_COOLDOWN_EXTRA_SAFE -3 SECONDS diff --git a/code/_globalvars/xenoarchaeology.dm b/code/_globalvars/xenoarchaeology.dm index 79ab3dbb09cc4..8e9babb111323 100644 --- a/code/_globalvars/xenoarchaeology.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -1,6 +1,4 @@ ///Global names for science sellers -GLOBAL_LIST_INIT(xenoa_seller_names, world.file2list("strings/names/science_seller.txt")) -GLOBAL_LIST_INIT(xenoa_seller_dialogue, world.file2list("strings/science_dialogue.txt")) GLOBAL_LIST_INIT(xenoa_artifact_names, world.file2list("strings/names/artifact_sentience.txt")) ///traits types, referenced for generation @@ -46,8 +44,6 @@ GLOBAL_LIST_INIT(discovered_traits, list()) return //Bruh - GLOB.xenoa_seller_names -= "" - GLOB.xenoa_seller_dialogue -= "" GLOB.xenoa_artifact_names -= "" //List of weights based on trait type diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 6287d5adada44..b4ed7cb592bb4 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -895,5 +895,5 @@ var/atom/parent_atom = parent var/matrix/M = parent_atom.transform var/matrix/old_M = parent_atom.transform - animate(parent, time = 1.5, loop = 0, transform = M.Scale(1.11, 0.85), flags = ANIMATION_PARALLEL) + animate(parent, time = 1.5, loop = 0, transform = M.Scale(1.11, 0.85)) animate(time = 2, transform = old_M) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index ee7951a7116e0..d76ddcded5036 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1453,6 +1453,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) // Update icons if this is being carried by a mob /obj/item/wash(clean_types) . = ..() + if(ismob(loc)) var/mob/mob_loc = loc mob_loc.regenerate_icons() diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 2fdcd76c0b69c..bc04e7d41087d 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -182,7 +182,6 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they if(apply_elastic) cost *= NUM_E**(-1*k_elasticity*amount) //marginal cost modifier SSblackbox.record_feedback("nested tally", "export_sold_cost", 1, list("[O.type]", "[the_cost]")) - return TRUE // Total printout for the cargo console. diff --git a/code/modules/spells/spell_types/shapeshift.dm b/code/modules/spells/spell_types/shapeshift.dm index 7007f2f0759ff..6d14521d983b9 100644 --- a/code/modules/spells/spell_types/shapeshift.dm +++ b/code/modules/spells/spell_types/shapeshift.dm @@ -173,7 +173,7 @@ qdel(shape) qdel(src) -//Fuck off fuck you +//Special subtype for artifacts that use it in a wonky-ish way, don't worry :) /obj/shapeshift_holder/no_damage /obj/shapeshift_holder/no_damage/restore(death=FALSE, convert_damage = FALSE) From 59988f54185b94dbf2e45f50659aa20d51dbbe03 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 9 May 2024 17:03:42 +1000 Subject: [PATCH 172/339] Update xenoarchaeology.dm --- code/_globalvars/xenoarchaeology.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/_globalvars/xenoarchaeology.dm b/code/_globalvars/xenoarchaeology.dm index 8e9babb111323..79ab3dbb09cc4 100644 --- a/code/_globalvars/xenoarchaeology.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -1,4 +1,6 @@ ///Global names for science sellers +GLOBAL_LIST_INIT(xenoa_seller_names, world.file2list("strings/names/science_seller.txt")) +GLOBAL_LIST_INIT(xenoa_seller_dialogue, world.file2list("strings/science_dialogue.txt")) GLOBAL_LIST_INIT(xenoa_artifact_names, world.file2list("strings/names/artifact_sentience.txt")) ///traits types, referenced for generation @@ -44,6 +46,8 @@ GLOBAL_LIST_INIT(discovered_traits, list()) return //Bruh + GLOB.xenoa_seller_names -= "" + GLOB.xenoa_seller_dialogue -= "" GLOB.xenoa_artifact_names -= "" //List of weights based on trait type From 2faa7fdba2cdd6ec25b927a4599b4d81d1dbc85f Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Thu, 9 May 2024 20:57:09 +1000 Subject: [PATCH 173/339] Update BoxStation.dmm --- _maps/map_files/BoxStation/BoxStation.dmm | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 52aed4a591f7e..4446fda44d3eb 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -12891,19 +12891,6 @@ }, /obj/machinery/power/apc/auto_name/east, /obj/effect/decal/cleanable/dirt, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/effect/decal/cleanable/dirt, -/obj/machinery/computer/xenoartifact_console{ - dir = 8 - }, -/obj/machinery/power/apc/auto_name/east, /obj/effect/decal/cleanable/dirt, /turf/open/floor/iron, /area/science/misc_lab) From 8a53b8de0ee34887e0e2bf290a0800cc3d08bfc9 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 11 May 2024 20:55:55 +1000 Subject: [PATCH 174/339] Merge branch 'master' of https://github.com/DrDuckedGoose/BeeStation-Hornet From a7d7fb8255df637a5545d49377fdac6c662490c5 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 11 May 2024 21:32:06 +1000 Subject: [PATCH 175/339] Update EchoStation.dmm --- _maps/map_files/EchoStation/EchoStation.dmm | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/_maps/map_files/EchoStation/EchoStation.dmm b/_maps/map_files/EchoStation/EchoStation.dmm index 7d4fcebe8069b..35551cbe9967a 100644 --- a/_maps/map_files/EchoStation/EchoStation.dmm +++ b/_maps/map_files/EchoStation/EchoStation.dmm @@ -21583,21 +21583,7 @@ pixel_y = 3; pixel_x = 8 }, -/obj/merge_conflict_marker{ - name = "---Merge Conflict Marker---"; - - desc = "A best-effort merge was performed. You must resolve this conflict yourself (manually) and remove this object once complete." - }, /obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/closet/bombcloset/white, -/obj/item/geiger_counter, -/obj/item/clothing/suit/utility/radiation, -/obj/item/clothing/head/utility/radiation, -/obj/item/storage/firstaid/radbgone, -/obj/machinery/airalarm/directional/north, /turf/open/floor/iron/dark, /area/science/explab) "kxS" = ( @@ -36584,10 +36570,10 @@ }, /obj/structure/closet/bombcloset/white, /obj/item/storage/firstaid/radbgone, -/obj/item/clothing/head/radiation, -/obj/item/clothing/suit/radiation, /obj/item/geiger_counter, /obj/effect/turf_decal/bot, +/obj/item/clothing/head/utility/radiation, +/obj/item/clothing/suit/utility/radiation, /turf/open/floor/iron/dark, /area/science/explab) "smw" = ( From a2eb65b30b91721ef8a05e00e8db0f012b083c12 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 19 May 2024 15:19:17 +1000 Subject: [PATCH 176/339] Unlint stuff - 19 5 24 --- .../modules/particles/byond_particles/emitter/artifact.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index 063eae041b278..6dce57e105543 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -17,7 +17,7 @@ spawning = 0.15 lifespan = 15 fade = 3 - fadein = 3 + UNLINT(fadein = 3) friction = 0.25 color = "#0081ff" scale = list(2, 2) @@ -43,7 +43,7 @@ spawning = 1 lifespan = 10 fade = 4 - fadein = 4 + UNLINT(fadein = 4) position = generator("box", list(-15, 10, -15), list(15, 12, 15), UNIFORM_RAND) velocity = list(0, -2, 0) gravity = list(0, 0.1, 0) @@ -64,7 +64,7 @@ spawning = 1 lifespan = 10 fade = 2 - fadein = 1 + UNLINT(fadein = 1) position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) rotation = generator("num", 0, 360, UNIFORM_RAND) @@ -92,7 +92,7 @@ spawning = 30 lifespan = 3 fade = 1 - fadein = 1 + UNLINT(fadein = 1) rotation = generator("num", 0, 360, UNIFORM_RAND) spin = generator("num", 8, 10, UNIFORM_RAND) friction = 0.21 From dbccf866ded684995a49c372c2b8524b6afcd57e Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 19 May 2024 15:22:36 +1000 Subject: [PATCH 177/339] Update misc.dm --- code/modules/particles/byond_particles/emitter/misc.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/particles/byond_particles/emitter/misc.dm b/code/modules/particles/byond_particles/emitter/misc.dm index e37c7770538e0..1d3c416d685f0 100644 --- a/code/modules/particles/byond_particles/emitter/misc.dm +++ b/code/modules/particles/byond_particles/emitter/misc.dm @@ -12,7 +12,7 @@ spawning = 15 lifespan = 20 fade = 1 - fadein = 3 + UNLINT(fadein = 3) friction = 0.15 gravity = list(0, -1, 0) color = generator("color", "#ff0000", "#0000ff", UNIFORM_RAND) From 54162121f2f705dbb439c4aaa4d8448ba1313aa2 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 19 May 2024 21:58:43 +1000 Subject: [PATCH 178/339] temp - 19 5 24 --- .../modules/particles/byond_particles/emitter/artifact.dm | 8 ++++---- code/modules/particles/byond_particles/emitter/misc.dm | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index 6dce57e105543..6ffd4d86278cc 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -17,7 +17,7 @@ spawning = 0.15 lifespan = 15 fade = 3 - UNLINT(fadein = 3) + //UNLINT(fadein = 3) friction = 0.25 color = "#0081ff" scale = list(2, 2) @@ -43,7 +43,7 @@ spawning = 1 lifespan = 10 fade = 4 - UNLINT(fadein = 4) + //UNLINT(fadein = 4) position = generator("box", list(-15, 10, -15), list(15, 12, 15), UNIFORM_RAND) velocity = list(0, -2, 0) gravity = list(0, 0.1, 0) @@ -64,7 +64,7 @@ spawning = 1 lifespan = 10 fade = 2 - UNLINT(fadein = 1) + //UNLINT(fadein = 1) position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) rotation = generator("num", 0, 360, UNIFORM_RAND) @@ -92,7 +92,7 @@ spawning = 30 lifespan = 3 fade = 1 - UNLINT(fadein = 1) + //UNLINT(fadein = 1) rotation = generator("num", 0, 360, UNIFORM_RAND) spin = generator("num", 8, 10, UNIFORM_RAND) friction = 0.21 diff --git a/code/modules/particles/byond_particles/emitter/misc.dm b/code/modules/particles/byond_particles/emitter/misc.dm index 1d3c416d685f0..0128d4b00da5e 100644 --- a/code/modules/particles/byond_particles/emitter/misc.dm +++ b/code/modules/particles/byond_particles/emitter/misc.dm @@ -12,7 +12,7 @@ spawning = 15 lifespan = 20 fade = 1 - UNLINT(fadein = 3) + //UNLINT(fadein = 3) friction = 0.15 gravity = list(0, -1, 0) color = generator("color", "#ff0000", "#0000ff", UNIFORM_RAND) From 57d15b35a0938313776301d04921f8ca34310936 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 19 May 2024 22:01:41 +1000 Subject: [PATCH 179/339] This is my villain arc --- .../byond_particles/emitter/artifact.dm | 16 ++++++++++++---- .../particles/byond_particles/emitter/misc.dm | 4 +++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/code/modules/particles/byond_particles/emitter/artifact.dm b/code/modules/particles/byond_particles/emitter/artifact.dm index 6ffd4d86278cc..4c7e87d71c21c 100644 --- a/code/modules/particles/byond_particles/emitter/artifact.dm +++ b/code/modules/particles/byond_particles/emitter/artifact.dm @@ -17,7 +17,9 @@ spawning = 0.15 lifespan = 15 fade = 3 - //UNLINT(fadein = 3) + #ifndef SPACEMAN_DMM // Waiting on next release of DreamChecker + fadein = 3 + #endif friction = 0.25 color = "#0081ff" scale = list(2, 2) @@ -43,7 +45,9 @@ spawning = 1 lifespan = 10 fade = 4 - //UNLINT(fadein = 4) + #ifndef SPACEMAN_DMM + fadein = 4 + #endif position = generator("box", list(-15, 10, -15), list(15, 12, 15), UNIFORM_RAND) velocity = list(0, -2, 0) gravity = list(0, 0.1, 0) @@ -64,7 +68,9 @@ spawning = 1 lifespan = 10 fade = 2 - //UNLINT(fadein = 1) + #ifndef SPACEMAN_DMM + fadein = 1 + #endif position = generator("box", list(-5, -5, -5), list(5, 5, 5), UNIFORM_RAND) velocity = generator("box", list(-3, -3, -3), list(3, 3, 3), UNIFORM_RAND) rotation = generator("num", 0, 360, UNIFORM_RAND) @@ -92,7 +98,9 @@ spawning = 30 lifespan = 3 fade = 1 - //UNLINT(fadein = 1) + #ifndef SPACEMAN_DMM + fadein = 1 + #endif rotation = generator("num", 0, 360, UNIFORM_RAND) spin = generator("num", 8, 10, UNIFORM_RAND) friction = 0.21 diff --git a/code/modules/particles/byond_particles/emitter/misc.dm b/code/modules/particles/byond_particles/emitter/misc.dm index 0128d4b00da5e..b8361839ff1d0 100644 --- a/code/modules/particles/byond_particles/emitter/misc.dm +++ b/code/modules/particles/byond_particles/emitter/misc.dm @@ -12,7 +12,9 @@ spawning = 15 lifespan = 20 fade = 1 - //UNLINT(fadein = 3) + #ifndef SPACEMAN_DMM + fadein = 3 + #endif friction = 0.15 gravity = list(0, -1, 0) color = generator("color", "#ff0000", "#0000ff", UNIFORM_RAND) From 9be138404c890cfafd4cf8af92c518c0a60ff435 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Fri, 31 May 2024 17:39:55 +1000 Subject: [PATCH 180/339] :D From 8c78aaa82948e91a6e4acd93ca56221c247af054 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 25 Jun 2024 19:19:40 +1000 Subject: [PATCH 181/339] :D From fde3cffc7214e9452912f976fd8519ac11cddb4e Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Tue, 2 Jul 2024 16:54:36 +1000 Subject: [PATCH 182/339] :D From cb6953589f2219734c4120de612c97020f1f4938 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Wed, 3 Jul 2024 15:34:18 +1000 Subject: [PATCH 183/339] Heart to Heart - 3 7 24 --- .../tools/console/xenoarchaeology_console.dm | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 3ecb3f28ea39f..7ec24f24d281a 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -181,14 +181,14 @@ //Announce victory or fuck up var/success_type switch(success_rate) + if(0.3 to 0.69) + success_type = "sufficient research" + if(0.7 to 0.89) + success_type = "admirable research" if(0.9 to INFINITY) success_type = "incredible discovery" - if(0.89 to 0.7) - success_type = "admirable research" - if(0.69 to 0.3) - success_type = "sufficient research" else - success_type = prob(50) ? "scientific failure." : "who let the clown in?" + success_type = prob(1) ? "scientific failure." : "who let the clown in?" if(!radio_solved_notice) radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, [dp_reward] Discovery Points, and a monetary commision of $[monetary_reward].",\ From 62bb083f5beb3427c077354cf851b9488fa00f1c Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 6 Jul 2024 11:55:54 +1000 Subject: [PATCH 184/339] Quick fixes - 6 7 24 --- code/game/objects/items/sticker/sticker.dm | 6 ++++++ code/modules/xenoarchaeology/misc/items.dm | 2 ++ .../xenoarchaeology/tools/xenoarchaeology_machines.dm | 2 +- code/modules/xenoarchaeology/traits/activators.dm | 2 +- code/modules/xenoarchaeology/traits/traits.dm | 4 ++-- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/sticker/sticker.dm b/code/game/objects/items/sticker/sticker.dm index 3f7a9be748af4..76dc7c0a37b39 100644 --- a/code/game/objects/items/sticker/sticker.dm +++ b/code/game/objects/items/sticker/sticker.dm @@ -87,6 +87,12 @@ else return +/obj/item/sticker/Click(location, control, params) + . = ..() + //This is a fix for some changes you guys made to attack_hand() + if(get_dist(usr, src) <= 1) + attack_hand(usr) + /obj/item/sticker/proc/build_item_appearance() return setup_appearance(mutable_appearance(src.icon, src.icon_state, plane = src.plane)) diff --git a/code/modules/xenoarchaeology/misc/items.dm b/code/modules/xenoarchaeology/misc/items.dm index 48ccb8d691b92..498993376fcfc 100644 --- a/code/modules/xenoarchaeology/misc/items.dm +++ b/code/modules/xenoarchaeology/misc/items.dm @@ -10,6 +10,8 @@ throw_range = 3 ///What type of artifact var/datum/xenoartifact_material/artifact_type + ///Cover some special interactions we fuck up + var/transfer_prints = TRUE /obj/item/xenoartifact/Initialize(mapload, _artifact_type) . = ..() diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 81409143dc0dd..7e6ccb2f1bd5c 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -209,7 +209,7 @@ . += "Alt-Click to calibrate inserted artifacts.\nArtifacts can be calibrated by labeling them 100% correctly, excluding malfunctions." /obj/machinery/xenoarchaeology_machine/calibrator/attack_hand(mob/living/user) - if(length(contents)) + if(length(held_contents)) return ..() else var/turf/T = get_turf(src) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index 892ff07874326..a5b5edf65674c 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -492,7 +492,7 @@ var/maneater = FALSE /datum/xenoartifact_trait/activator/sturdy/hungry/trigger_artifact(atom/target, type, force) - if(parent.anti_check(target, type)) + if(parent.anti_check(target, type) || parent.calcified) return FALSE //Find a food item var/mob/living/M = target diff --git a/code/modules/xenoarchaeology/traits/traits.dm b/code/modules/xenoarchaeology/traits/traits.dm index 5d2ee5ae5f1a9..75ef5b8cf9d9e 100644 --- a/code/modules/xenoarchaeology/traits/traits.dm +++ b/code/modules/xenoarchaeology/traits/traits.dm @@ -222,7 +222,7 @@ return //Check if we're at our heart location, which is based on our weight-x and conductivity-y var/atom/A = parent.parent - if(target.x % weight == 0 && target.y % conductivity == 0) + if(target.x % (weight || target.x) == 0 && target.y % (conductivity || target.y) == 0) var/atom/target_loc = A.loc target_loc.visible_message("[A] develops a slight opening!\nYou could probably use a screwdriver on [A]!", allow_inside_usr = TRUE) //Do effects @@ -234,7 +234,7 @@ if(!parent.calibrated) return var/atom/A = parent.parent - if(A.x % weight != 0 || A.y % conductivity != 0) + if(A.x % (weight || A.x) != 0 || A.y % (conductivity || A.y) != 0) return INVOKE_ASYNC(src, PROC_REF(pry_action), user, I) From c7e91e84af708824918038fa5429abced4471c3b Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sat, 6 Jul 2024 21:17:57 +1000 Subject: [PATCH 185/339] Fixes - 6 7 24 --- code/_globalvars/bitfields.dm | 3 +++ code/game/objects/items/sticker/sticker.dm | 7 +------ 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index 1536539db1fc7..029d52547df00 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -184,6 +184,9 @@ DEFINE_BITFIELD(flags_1, list( "ADMIN_SPAWNED_1" = ADMIN_SPAWNED_1, "PREVENT_CONTENTS_EXPLOSION_1" = PREVENT_CONTENTS_EXPLOSION_1, "UNPAINTABLE_1" = UNPAINTABLE_1, + "IS_ONTOP_1" = IS_ONTOP_1, + "HTML_USE_INITAL_ICON_1" = HTML_USE_INITAL_ICON_1, + "NO_DIRECT_ACCESS_FROM_CONTENTS_1" = NO_DIRECT_ACCESS_FROM_CONTENTS_1, )) DEFINE_BITFIELD(flags_ricochet, list( diff --git a/code/game/objects/items/sticker/sticker.dm b/code/game/objects/items/sticker/sticker.dm index 76dc7c0a37b39..2c2ca76c9ebe0 100644 --- a/code/game/objects/items/sticker/sticker.dm +++ b/code/game/objects/items/sticker/sticker.dm @@ -3,6 +3,7 @@ desc = "An adhesive graphic." icon = 'icons/obj/sticker.dmi' icon_state = "happy" + flags_1 = IS_ONTOP_1 w_class = WEIGHT_CLASS_TINY appearance_flags = TILE_BOUND | PIXEL_SCALE | KEEP_APART ///Our current state for being stuck or unstuck @@ -87,12 +88,6 @@ else return -/obj/item/sticker/Click(location, control, params) - . = ..() - //This is a fix for some changes you guys made to attack_hand() - if(get_dist(usr, src) <= 1) - attack_hand(usr) - /obj/item/sticker/proc/build_item_appearance() return setup_appearance(mutable_appearance(src.icon, src.icon_state, plane = src.plane)) From dc28fadfaa74d7eb59465c6f2b65d7e9ff42f236 Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Sun, 7 Jul 2024 22:29:43 +1000 Subject: [PATCH 186/339] Improvements - 7 7 24 --- code/__DEFINES/xenoarchaeology.dm | 3 +- code/_globalvars/xenoarchaeology.dm | 15 ++++ .../tools/console/xenoarchaeology_console.dm | 2 +- .../tools/xenoarchaeology_labeler.dm | 49 ++++++++++++- .../tools/xenoarchaeology_machines.dm | 8 ++- .../xenoarchaeology/traits/activators.dm | 16 +++-- code/modules/xenoarchaeology/traits/majors.dm | 16 ++++- .../xenoarchaeology/traits/malfunctions.dm | 2 + code/modules/xenoarchaeology/traits/minors.dm | 13 +++- code/modules/xenoarchaeology/traits/pearl.dm | 5 +- .../tgui/interfaces/XenoartifactLabeler.js | 70 +++++++++++++++---- 11 files changed, 167 insertions(+), 32 deletions(-) diff --git a/code/__DEFINES/xenoarchaeology.dm b/code/__DEFINES/xenoarchaeology.dm index 430fb2de01cfa..eee87b3f09e92 100644 --- a/code/__DEFINES/xenoarchaeology.dm +++ b/code/__DEFINES/xenoarchaeology.dm @@ -72,10 +72,11 @@ ///Common defines for trait hints #define XENOA_TRAIT_HINT_MATERIAL list("icon" = "eye", "desc" = "This trait can appear in the artifact's material description.") -#define XENOA_TRAIT_HINT_INHAND list("icon" = "search", "desc" = "This trait can be detected by 'feeling' the artifact.") +#define XENOA_TRAIT_HINT_INHAND list("icon" = "hand-sparkles", "desc" = "This trait can be detected by 'feeling' the artifact.") #define XENOA_TRAIT_HINT_TRIGGER(X) list("icon" = "wrench", "desc" = "This trait can be triggered with a [X].") #define XENOA_TRAIT_HINT_DETECT(X) list("icon" = "search", "desc" = "This trait can be detected with a [X].") #define XENOA_TRAIT_HINT_TWIN list("icon" = "clone", "desc" = "This trait has sister traits which perform a similar, but unqiue, action.") #define XENOA_TRAIT_HINT_TWIN_VARIANT(X) list("icon" = "fingerprint", "desc" = "This variant will [X].") #define XENOA_TRAIT_HINT_RANDOMISED list("icon" = "dice", "desc" = "This trait's effects may differ between instances.") #define XENOA_TRAIT_HINT_APPEARANCE(X) list("icon" = "snowflake", "desc" = "This trait's changes the artifact's appearance. [X]") +#define XENOA_TRAIT_HINT_SOUND(X) list("icon" = "volume-up", "desc" = "This trait will passively make noise. listen for [X].") diff --git a/code/_globalvars/xenoarchaeology.dm b/code/_globalvars/xenoarchaeology.dm index 79ab3dbb09cc4..ca3ca469e31bf 100644 --- a/code/_globalvars/xenoarchaeology.dm +++ b/code/_globalvars/xenoarchaeology.dm @@ -30,6 +30,7 @@ GLOBAL_LIST(labeler_minor_traits) GLOBAL_LIST(labeler_major_traits) GLOBAL_LIST(labeler_malfunction_traits) GLOBAL_LIST_INIT(labeler_tooltip_stats, list()) +GLOBAL_LIST(labeler_traits_filter) ///Material weights, basically rarity GLOBAL_LIST_INIT(xenoartifact_material_weights, list(XENOA_BLUESPACE = 10, XENOA_PLASMA = 8, XENOA_URANIUM = 5, XENOA_BANANIUM = 1)) @@ -75,6 +76,7 @@ GLOBAL_LIST_INIT(discovered_traits, list()) GLOB.labeler_minor_traits = get_trait_list_stats(GLOB.xenoa_minors) GLOB.labeler_major_traits = get_trait_list_stats(GLOB.xenoa_majors) GLOB.labeler_malfunction_traits = get_trait_list_stats(GLOB.xenoa_malfunctions) + GLOB.labeler_traits_filter = build_trait_filters() ///Proc used to compile trait weights into a list /proc/compile_artifact_weights(path, keyed = FALSE) @@ -132,6 +134,7 @@ GLOBAL_LIST_INIT(discovered_traits, list()) /proc/get_trait_list_stats(list/trait_type) var/list/temp = list() for(var/datum/xenoartifact_trait/T as() in trait_type) + //generate tool tips temp += list(initial(T.label_name)) var/datum/xenoartifact_trait/hint_holder = new T() GLOB.labeler_tooltip_stats["[initial(T.label_name)]"] = list("weight" = initial(T.weight), "conductivity" = initial(T.conductivity), "alt_name" = initial(T.alt_label_name), "desc" = initial(T.label_desc), "hints" = hint_holder.get_dictionary_hint()) @@ -143,3 +146,15 @@ GLOBAL_LIST_INIT(discovered_traits, list()) if(initial(M.trait_flags) & initial(T.flags)) GLOB.labeler_tooltip_stats["[initial(T.label_name)]"]["availability"] += list(list("color" = initial(M.material_color), "icon" = initial(M.label_icon))) return temp + +/proc/build_trait_filters() + var/list/temp = list() + for(var/datum/xenoartifact_trait/T as() in GLOB.xenoa_all_traits) + T = new T() + var/list/hints = T.get_dictionary_hint() + for(var/i in hints) + if(!temp[i["icon"]]) + temp[i["icon"]] = list() + temp[i["icon"]] += list("[initial(T.label_name)]") + QDEL_NULL(T) + return temp diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 7ec24f24d281a..499c496c8baf6 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -189,7 +189,7 @@ success_type = "incredible discovery" else success_type = prob(1) ? "scientific failure." : "who let the clown in?" - if(!radio_solved_notice) + if(radio_solved_notice) radio?.talk_into(src, "[artifact] has been submitted with a success rate of [100*success_rate]% '[success_type]', \ at [station_time_timestamp()]. The Research Department has been awarded [rnd_reward] Research Points, [dp_reward] Discovery Points, and a monetary commision of $[monetary_reward].",\ RADIO_CHANNEL_SCIENCE) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm index 8efb271915685..4d01e59cfa3e7 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_labeler.dm @@ -8,8 +8,23 @@ w_class = WEIGHT_CLASS_TINY ///Checked traits var/list/selected_traits = list() + ///List of deselected traits + var/list/deselected_traits = list() ///List of selected traits we'll put on the label var/list/label_traits = list() + ///List of possible trait filters + var/list/trait_filters = list(list("icon" = "eye", "desc" = "Traits that can appear in the material description."), + list("icon" = "hand-sparkles", "desc" = "Traits that can be detected by 'feeling' the artifact."), + list("icon" = "wrench", "desc" = "Traits that can be triggered with specific items."), + list("icon" = "search", "desc" = "Traits that can be detected with specific items."), + list("icon" = "clone", "desc" = "Traits that have 'clones' or 'twins'."), + list("icon" = "dice", "desc" = "Traits with randomized effects."), + list("icon" = "snowflake", "desc" = "Traits that spawn particles, or change the artifact's appearance."), + list("icon" = "volume-up", "desc" = "Traits that passively make noise")) + ///List of currently enabled trait filters + var/list/enabled_trait_filters = list() + ///List of filtered traits + var/list/filtered_traits = list() ///Cooldown for stickers var/sticker_cooldown = 5 SECONDS COOLDOWN_DECLARE(sticker_cooldown_timer) @@ -19,6 +34,9 @@ ADD_TRAIT(src, TRAIT_ARTIFACT_IGNORE, GENERIC_ITEM_TRAIT) //bake / used baked stuff so we don't have to waste electricity generate_xenoa_statics() + //Fill enabled filters with all filters + for(var/i in trait_filters) + enabled_trait_filters += i["icon"] /obj/item/xenoarchaeology_labeler/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -29,6 +47,9 @@ /obj/item/xenoarchaeology_labeler/ui_data(mob/user) var/list/data = list() data["selected_traits"] = selected_traits + data["deselected_traits"] = deselected_traits + data["enabled_trait_filters"] = enabled_trait_filters + data["filtered_traits"] = filtered_traits return data @@ -40,6 +61,8 @@ data["activator_traits"] = GLOB.labeler_activator_traits data["tooltip_stats"] = GLOB.labeler_tooltip_stats + data["trait_filters"] = trait_filters + return data /obj/item/xenoarchaeology_labeler/ui_act(action, params) @@ -63,12 +86,31 @@ for(var/list/i as() in focus) if(!(trait_key in i)) continue + //Selected traits if(trait_key in selected_traits) selected_traits -= trait_key label_traits -= GLOB.xenoa_all_traits_keyed[trait_key] - else - selected_traits.Insert(1, trait_key) - label_traits.Insert(1, GLOB.xenoa_all_traits_keyed[trait_key]) + if(!params["select"]) + deselected_traits += trait_key + continue + else if(!(trait_key in deselected_traits)) + if(params["select"]) + selected_traits.Insert(1, trait_key) + label_traits.Insert(1, GLOB.xenoa_all_traits_keyed[trait_key]) + else + deselected_traits += trait_key + continue + //Deselected traits + if(trait_key in deselected_traits) + deselected_traits -= trait_key + if("toggle_filter") + var/specific_filter = params["filter"] + if(specific_filter in enabled_trait_filters) + enabled_trait_filters -= specific_filter + filtered_traits += GLOB.labeler_traits_filter[params["filter"]] + else + enabled_trait_filters += specific_filter + filtered_traits -= GLOB.labeler_traits_filter[params["filter"]] return TRUE /obj/item/xenoarchaeology_labeler/afterattack(atom/target, mob/user, proximity_flag) @@ -83,6 +125,7 @@ /obj/item/xenoarchaeology_labeler/proc/clear_selection() label_traits = list() selected_traits = list() + deselected_traits = list() ui_update() /obj/item/xenoarchaeology_labeler/proc/create_label(mob/target, mob/user) diff --git a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm index 7e6ccb2f1bd5c..b2659bcb65a19 100644 --- a/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm +++ b/code/modules/xenoarchaeology/tools/xenoarchaeology_machines.dm @@ -90,6 +90,7 @@ ///Get the combined weight of all artifacts in our target var/atom/target = get_target() var/total_weight = 0 + var/label_weight = 0 for(var/atom/A in target) var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) if(X) @@ -99,6 +100,7 @@ if(L) for(var/datum/xenoartifact_trait/T as() in L.traits) say("[initial(T.label_name)] - Weight: [initial(T.weight)]") + label_weight += initial(T.weight) else if(isitem(A) || isliving(A)) if(isliving(A)) if(prob(1)) @@ -108,7 +110,7 @@ say("Unexpected Item Detected!") return if(total_weight) - say("Total Mass: [total_weight] KG.") + say("Total Mass: [total_weight] KG.\n[label_weight ? "Label Mass: [label_weight]." : ""]") else say("No Mass Detected!") playsound(src, 'sound/machines/uplinkpurchase.ogg', 50, TRUE) @@ -137,6 +139,7 @@ ///Get the combined conductivity of all artifacts in our target var/atom/target = get_target() var/total_conductivity = 0 + var/label_conductivity = 0 for(var/atom/A in target) var/datum/component/xenoartifact/X = A.GetComponent(/datum/component/xenoartifact) if(X) @@ -146,6 +149,7 @@ if(L) for(var/datum/xenoartifact_trait/T as() in L.traits) say("[initial(T.label_name)] - conductivity: [initial(T.conductivity)]") + label_conductivity += initial(T.conductivity) else if(isitem(A) || isliving(A)) if(isliving(A)) if(prob(1)) @@ -155,7 +159,7 @@ say("Unexpected Item Detected!") return if(total_conductivity) - say("Total Conductivity: [total_conductivity] MPC.") + say("Total Conductivity: [total_conductivity] MPC.\n[label_conductivity ? "Label Conductivity: [label_conductivity]." : ""]") else say("No Conductivity Detected!") playsound(src, 'sound/machines/uplinkpurchase.ogg', 50, TRUE) diff --git a/code/modules/xenoarchaeology/traits/activators.dm b/code/modules/xenoarchaeology/traits/activators.dm index a5b5edf65674c..34ae8ce776a6a 100644 --- a/code/modules/xenoarchaeology/traits/activators.dm +++ b/code/modules/xenoarchaeology/traits/activators.dm @@ -144,6 +144,7 @@ /datum/xenoartifact_trait/activator/sturdy/timed/process(delta_time) if(!searching) + playsound(get_turf(parent?.parent), 'sound/effects/clock_tick.ogg', 10, TRUE) return if(search_cooldown_timer) return @@ -160,7 +161,8 @@ /datum/xenoartifact_trait/activator/sturdy/timed/get_dictionary_hint() . = ..() - return list(list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target, periodically.")) + return list(list("icon" = "exclamation", "desc" = "This trait will, after an arming time, activate on the nearest living target, periodically."), + XENOA_TRAIT_HINT_SOUND("clock ticking")) /datum/xenoartifact_trait/activator/sturdy/timed/proc/reset_timer() if(search_cooldown_timer) @@ -169,7 +171,7 @@ /datum/xenoartifact_trait/activator/sturdy/timed/proc/indicator_hint(engaging = FALSE) var/atom/A = parent?.parent - A?.balloon_alert_to_viewers("[A] [!engaging ? "stops ticking." : "starts ticking"]!") + A?.balloon_alert_to_viewers("[A] [!engaging ? "stops ticking" : "starts ticking"]!") /* Flammable @@ -307,7 +309,11 @@ /datum/xenoartifact_trait/activator/signal/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), XENOA_TRAIT_HINT_RANDOMISED, list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target."), XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact.")) + return list(XENOA_TRAIT_HINT_TRIGGER("signaller assembly"), + XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its trigger code & frequency"), + XENOA_TRAIT_HINT_RANDOMISED, list("icon" = "exclamation", "desc" = "This trait will activate on the nearest living target."), + XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact."), + XENOA_TRAIT_HINT_SOUND("sonar pings")) /datum/xenoartifact_trait/activator/signal/proc/receive_signal(datum/signal/signal) if(!signal) @@ -416,6 +422,7 @@ label_name = "Greedy Δ" label_desc = "Greedy Δ: The artifact seems to be made of a collective material. This material seems to be triggered by inserting credit holochips." key_item = /obj/item/holochip + conductivity = 8 ///How many credits we need to activate var/credit_requirement = 1 @@ -541,6 +548,7 @@ label_desc = "Hungry Δ: The artifact seems to be made of a semi-living, hungry, material. This material seems to be triggered by feeding interactions." flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT maneater = TRUE + conductivity = 8 /datum/xenoartifact_trait/activator/sturdy/hungry/maneater/get_dictionary_hint() return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("eat food items, and mobs")) @@ -613,6 +621,7 @@ label_desc = "Edible Δ: The artifact seems to be made of an edible material. This material seems to be triggered by being consumed." bite_time = 6 SECONDS food_reagents = list() + conductivity = 8 /datum/xenoartifact_trait/activator/edible/random/New(atom/_parent) var/random_reagents = rand(1, 3) @@ -646,4 +655,3 @@ if(isliving(A.loc)) trigger_artifact(target, XENOA_ACTIVATION_SPECIAL) return - trigger_artifact(target) diff --git a/code/modules/xenoarchaeology/traits/majors.dm b/code/modules/xenoarchaeology/traits/majors.dm index b9a8e956056fa..94d728997263d 100644 --- a/code/modules/xenoarchaeology/traits/majors.dm +++ b/code/modules/xenoarchaeology/traits/majors.dm @@ -61,14 +61,14 @@ Hollow Captures the target for an amount of time */ +//TODO: This sometimes fucks peoples camera. It'll release them, but the camera acts if they're still inside - Racc /datum/xenoartifact_trait/major/hollow material_desc = "hollow" label_name = "Hollow" label_desc = "Hollow: The artifact seems to contain hollow components. Triggering these components will capture the target." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS flags = XENOA_BLUESPACE_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT - weight = -10 - weight = 27 + weight = -15 ///Maximum time we hold people for var/hold_time = 15 SECONDS @@ -192,6 +192,7 @@ flags = XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT cooldown = XENOA_TRAIT_COOLDOWN_GAMER possible_projectiles = list(/obj/projectile/beam/laser, /obj/projectile/bullet, /obj/projectile/energy/tesla) + conductivity = 3 /datum/xenoartifact_trait/major/projectile/unsafe/get_dictionary_hint() . = ..() @@ -271,6 +272,7 @@ /datum/xenoartifact_trait/major/animalize/vermin label_name = "Bestialized Δ" possible_animals = list(/mob/living/basic/mothroach, /mob/living/simple_animal/mouse, /mob/living/basic/cockroach) + conductivity = 6 /datum/xenoartifact_trait/major/animalize/vermin/get_dictionary_hint() . = ..() @@ -279,6 +281,7 @@ /datum/xenoartifact_trait/major/animalize/dangerous label_name = "Bestialized Σ" possible_animals = list(/mob/living/simple_animal/hostile/bear, /mob/living/simple_animal/hostile/carp, /mob/living/simple_animal/hostile/killertomato) + conductivity = 3 /datum/xenoartifact_trait/major/animalize/dangerous/get_dictionary_hint() . = ..() @@ -381,6 +384,7 @@ /datum/xenoartifact_trait/major/illuminating/shadow label_name = "Illuminating Δ" label_desc = "Illuminating Δ: The artifact seems to contain de-illuminating components. Triggering these components will cause the artifact to de-illuminate." + conductivity = 3 /datum/xenoartifact_trait/major/illuminating/shadow/get_dictionary_hint() . = ..() @@ -529,6 +533,7 @@ label_name = "Exchanging Δ" label_desc = "Exchanging Δ: The artifact seems to contain exchanging components. Triggering these components will exchange the damage of the last two targets." damage_type = BURN + conductivity = 3 /datum/xenoartifact_trait/major/exchange/burn/get_dictionary_hint() return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("exchange burn damage between two targets")) @@ -580,6 +585,7 @@ label_desc = "Hypodermic Δ: The artifact seems to contain chemical components. Triggering these components will inject the target with a chemical." chem_category = CHEMICAL_RNG_FUN rarity = XENOA_TRAIT_WEIGHT_RARE + conductivity = 3 /datum/xenoartifact_trait/major/chem/fun/get_dictionary_hint() . = ..() @@ -605,6 +611,7 @@ /datum/xenoartifact_trait/major/force/pull label_name = "Forcing Δ" force_dir = 0 + conductivity = 3 /datum/xenoartifact_trait/major/force/pull/get_dictionary_hint() return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("pull the target")) @@ -797,6 +804,7 @@ label_name = "Dissipating Σ" label_desc = "Dissipating: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a body of foam." max_size = 5 + conductivity = 3 /datum/xenoartifact_trait/major/smoke/foam/get_dictionary_hint() . = ..() @@ -813,6 +821,7 @@ label_desc = "Dissipating Δ: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a cloud of smoke containing a random chemical." cooldown = XENOA_TRAIT_COOLDOWN_DANGEROUS flags = XENOA_BLUESPACE_TRAIT | XENOA_PLASMA_TRAIT | XENOA_URANIUM_TRAIT | XENOA_BANANIUM_TRAIT | XENOA_PEARL_TRAIT + conductivity = 12 ///What chemical we're injecting var/datum/reagent/formula ///max amount we can inject people with @@ -841,6 +850,7 @@ label_name = "Dissipating Ω" label_desc = "Dissipating Ω: The artifact seems to contain dissipating components. Triggering these components will cause the artifact to create a body of foam containing a random chemical." max_size = 5 + conductivity = 21 /datum/xenoartifact_trait/major/smoke/chem/foam/make_smoke() var/datum/effect_system/foam_spread/E = new() @@ -888,6 +898,7 @@ /datum/xenoartifact_trait/major/color/random label_name = "Marking Δ" label_desc = "Marking Δ: The artifact seems to contain colorizing components. Triggering these components will color the target." + conductivity = 3 /datum/xenoartifact_trait/major/color/random/get_dictionary_hint() . = ..() @@ -1085,6 +1096,7 @@ label_name = "Flourishing Δ" label_desc = "Flourishing Δ: The artifact seems to contain flourishing components. Triggering these components will age down plant targets." max_aging = -5 + conductivity = 3 /datum/xenoartifact_trait/major/growing/youth/get_dictionary_hint() . = ..() diff --git a/code/modules/xenoarchaeology/traits/malfunctions.dm b/code/modules/xenoarchaeology/traits/malfunctions.dm index 8f531b6ebb077..144fd1c2ec257 100644 --- a/code/modules/xenoarchaeology/traits/malfunctions.dm +++ b/code/modules/xenoarchaeology/traits/malfunctions.dm @@ -78,6 +78,7 @@ label_desc = "Parallel Entity Retrieval Δ: A strange malfunction causes the Artifact to open a gateway to another plane that summons a random entity." max_summons = 6 summon_type = /mob/living/simple_animal/hostile/carp + conductivity = 7 /datum/xenoartifact_trait/malfunction/animal/carp/get_dictionary_hint() return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("summon space carps")) @@ -414,6 +415,7 @@ alt_label_name = "Immediate Organ Extraction Δ" label_desc = "Immediate Organ Extraction Δ: A strange malfunction causes the Artifact to extract the target's tongue." target_organ_slot = ORGAN_SLOT_TONGUE + conductivity = 14 /datum/xenoartifact_trait/malfunction/organ_stealer/tongue/get_dictionary_hint() . = ..() diff --git a/code/modules/xenoarchaeology/traits/minors.dm b/code/modules/xenoarchaeology/traits/minors.dm index 4aeddc24d69cd..49bd1b50c96c0 100644 --- a/code/modules/xenoarchaeology/traits/minors.dm +++ b/code/modules/xenoarchaeology/traits/minors.dm @@ -535,6 +535,7 @@ material_desc = "ringed" label_name = "Ringed Δ" label_desc = "Ringed Δ: The artifact's design seems to incorporate ringed elements. This will allow the artifact to be worn, and catch information from the wearer." + conductivity = 15 /datum/xenoartifact_trait/minor/ringed/attack/equip_action(datum/source, mob/equipper, slot) if(slot == ITEM_SLOT_GLOVES) @@ -725,7 +726,9 @@ /datum/xenoartifact_trait/minor/signaller/get_dictionary_hint() . = ..() - return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency"), XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact.")) + return list(XENOA_TRAIT_HINT_DETECT("analyzer, which will also reveal its output code & frequency"), + XENOA_TRAIT_HINT_RANDOMISED, XENOA_TRAIT_HINT_APPEARANCE("This trait will make radar particles appear around the artifact."), + XENOA_TRAIT_HINT_SOUND("sonar ping")) /* Anchor @@ -839,7 +842,8 @@ return ..() /datum/xenoartifact_trait/minor/haunted/get_dictionary_hint() - return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("allow the artifact to be moved, by ghosts, every 8 seconds")) + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("allow the artifact to be moved, by ghosts, every 8 seconds"), + XENOA_TRAIT_HINT_SOUND("ghost moaning")) /datum/xenoartifact_trait/minor/haunted/proc/do_wail(repeat = TRUE) if(QDELETED(src)) @@ -872,6 +876,7 @@ label_desc = "Haunted Δ: The artifact's design seems to incorporate incorporeal elements. This will cause the artifact to move unexpectedly, when not observed." move_delay = 1 SECONDS blacklist_traits = list(/datum/xenoartifact_trait/minor/haunted) + conductivity = 5 ///Cooldown for the use action var/action_cooldown var/action_cooldown_time = 8 SECONDS @@ -890,7 +895,8 @@ return ..() /datum/xenoartifact_trait/minor/haunted/instant/get_dictionary_hint() - return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("allow the artifact to be moved, by ghosts, when no-one is looking")) + return list(XENOA_TRAIT_HINT_TWIN, XENOA_TRAIT_HINT_TWIN_VARIANT("allow the artifact to be moved, by ghosts, when no-one is looking"), + XENOA_TRAIT_HINT_SOUND("ghost moaning")) /datum/xenoartifact_trait/minor/haunted/instant/proc/reset_action_timer() if(action_cooldown) @@ -978,6 +984,7 @@ label_name = "Magnetic Δ" label_desc = "Magnetic Δ: The artifact's design seems to incorporate magnetic elements. This will cause the artifact to repulse metalic objects when triggered." blacklist_traits = list(/datum/xenoartifact_trait/minor/magnetic) + conductivity = 10 /datum/xenoartifact_trait/minor/magnetic/push/get_dictionary_hint() . = ..() diff --git a/code/modules/xenoarchaeology/traits/pearl.dm b/code/modules/xenoarchaeology/traits/pearl.dm index 1ec15a2191e18..61cff110284f6 100644 --- a/code/modules/xenoarchaeology/traits/pearl.dm +++ b/code/modules/xenoarchaeology/traits/pearl.dm @@ -12,8 +12,7 @@ /obj/item/sticker/trait_pearl/Initialize(mapload, trait) . = ..() - //Debug, mapping, presets, etc. - stored_trait = trait || pick(subtypesof(/datum/xenoartifact_trait/activator)) + stored_trait = trait /obj/item/sticker/trait_pearl/afterattack(atom/movable/target, mob/user, proximity_flag, click_parameters) //Prechecks @@ -45,7 +44,7 @@ /obj/item/sticker/trait_pearl/examine(mob/user) . = ..() if(user.can_see_reagents()) - . += "[src] holds '[initial(stored_trait.label_name)]'." + . += "[src] holds '[initial(stored_trait.label_name) || "nothing"]'.\nYou can affix it to an item." /obj/item/sticker/trait_pearl/build_stuck_appearance() var/mutable_appearance/MA = setup_appearance(mutable_appearance(sticker_icon || src.icon, sticker_icon_state || src.icon_state)) diff --git a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js index c1ac25ae39834..ad2cfe8ae5f35 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactLabeler.js +++ b/tgui/packages/tgui/interfaces/XenoartifactLabeler.js @@ -1,12 +1,27 @@ import { useBackend } from '../backend'; -import { Button, Section, Box, Flex, Input, BlockQuote, Icon, Divider } from '../components'; +import { Button, Section, Box, Flex, Input, BlockQuote, Icon, Divider, Dropdown, Collapsible } from '../components'; import { Window } from '../layouts'; export const XenoartifactLabeler = (props, context) => { return ( - + - +

      + + + + + +
      + +
      + + + +
      @@ -23,7 +38,7 @@ export const XenoartifactLabeler = (props, context) => { const XenoartifactlabelerTraits = (props, context) => { const { act, data } = useBackend(context); - const { activator_traits, minor_traits, major_traits, malfunction_list } = data; + const { activator_traits, minor_traits, major_traits, malfunction_list, enabled_trait_filters, filtered_traits } = data; let alphasort = function (a, b) { return a.localeCompare(b, 'en'); @@ -34,11 +49,16 @@ const XenoartifactlabelerTraits = (props, context) => { const sorted_majors = major_traits.sort(alphasort); const sorted_malfs = malfunction_list.sort(alphasort); + let filtered_activators = sorted_activators.filter(n => !filtered_traits.includes(n)); + let filtered_minors = sorted_minors.filter(n => !filtered_traits.includes(n)); + let filtered_majors = sorted_majors.filter(n => !filtered_traits.includes(n)); + let filtered_malfs = sorted_malfs.filter(n => !filtered_traits.includes(n)); + return (
      - {sorted_activators.map((trait) => ( + {filtered_activators.map((trait) => ( ))} @@ -46,7 +66,7 @@ const XenoartifactlabelerTraits = (props, context) => {
      - {sorted_minors.map((trait) => ( + {filtered_minors.map((trait) => ( ))} @@ -54,7 +74,7 @@ const XenoartifactlabelerTraits = (props, context) => {
      - {sorted_majors.map((trait) => ( + {filtered_majors.map((trait) => ( ))} @@ -62,7 +82,7 @@ const XenoartifactlabelerTraits = (props, context) => {
      - {sorted_malfs.map((trait) => ( + {filtered_malfs.map((trait) => ( ))} @@ -73,7 +93,7 @@ const XenoartifactlabelerTraits = (props, context) => { const XenoartifactlabelerInfo = (props, context) => { const { act, data } = useBackend(context); - const { selected_traits } = data; + const { selected_traits, labeler_traits_filter } = data; return ( {selected_traits.map((info) => ( @@ -86,16 +106,21 @@ const XenoartifactlabelerInfo = (props, context) => { const XenoartifactlabelerGenerateEntry = (props, context) => { const { act, data } = useBackend(context); const { specific_trait, trait_type } = props; - const { tooltip_stats, selected_traits } = data; + const { tooltip_stats, selected_traits, deselected_traits } = data; return ( act(`toggle_trait`, { trait_name: specific_trait })} + color={deselected_traits.includes(specific_trait) ? "bad" : "transparent"} + onClick={() => act(`toggle_trait`, { trait_name: specific_trait, select: true })} tooltip={`${tooltip_stats[specific_trait]['alt_name'] ? `${tooltip_stats[specific_trait]['alt_name']},` : ``} Weight: ${tooltip_stats[specific_trait]['weight']}, Conductivity: ${tooltip_stats[specific_trait]['conductivity']}`} + oncontextmenu={(e) => { + e.preventDefault(); + act(`toggle_trait`, { trait_name: specific_trait, select: false }); + }} /> ); @@ -123,9 +148,28 @@ const XenoartifactlabelerGenerateInfo = (props, context) => { const XenoartifactlabelerSticker = (props, context) => { const { act } = useBackend(context); return ( -
      +
      +
      + ); +}; + +const XenoartifactlabelerGenerateFilterEntry = (props, context) => { + const { act, data } = useBackend(context); + // const { specific_trait, trait_type } = props; + const { trait_filters, enabled_trait_filters } = data; + return ( + + {trait_filters.map((filter) => ( +
      - +
      @@ -49,10 +49,10 @@ const XenoartifactlabelerTraits = (props, context) => { const sorted_majors = major_traits.sort(alphasort); const sorted_malfs = malfunction_list.sort(alphasort); - let filtered_activators = sorted_activators.filter(n => !filtered_traits.includes(n)); - let filtered_minors = sorted_minors.filter(n => !filtered_traits.includes(n)); - let filtered_majors = sorted_majors.filter(n => !filtered_traits.includes(n)); - let filtered_malfs = sorted_malfs.filter(n => !filtered_traits.includes(n)); + let filtered_activators = sorted_activators.filter((n) => !filtered_traits.includes(n)); + let filtered_minors = sorted_minors.filter((n) => !filtered_traits.includes(n)); + let filtered_majors = sorted_majors.filter((n) => !filtered_traits.includes(n)); + let filtered_malfs = sorted_malfs.filter((n) => !filtered_traits.includes(n)); return ( @@ -112,7 +112,7 @@ const XenoartifactlabelerGenerateEntry = (props, context) => { act(`toggle_trait`, { trait_name: specific_trait, select: true })} tooltip={`${tooltip_stats[specific_trait]['alt_name'] ? `${tooltip_stats[specific_trait]['alt_name']},` : ``} Weight: ${tooltip_stats[specific_trait]['weight']}, @@ -163,11 +163,11 @@ const XenoartifactlabelerGenerateFilterEntry = (props, context) => { {trait_filters.map((filter) => (

      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�)ktM(0`l-=6 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 ME2$(=CHB?-e~PlT&Hw-a From 3e119d573c2759669f937011c7210ee6eb18f79c Mon Sep 17 00:00:00 2001 From: DrDuckedGoose Date: Mon, 15 Jan 2024 16:55:58 +1100 Subject: [PATCH 044/339] Console UI initial - 15 1 24 --- .../components/xenoartifact.dm | 4 +-- .../tools/console/xenoarchaeology_console.dm | 9 ++++++ .../tgui/interfaces/XenoartifactConsole.js | 31 +++++++++++++++---- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/code/modules/xenoarchaeology/components/xenoartifact.dm b/code/modules/xenoarchaeology/components/xenoartifact.dm index a5796346907cf..53337bac781d2 100644 --- a/code/modules/xenoarchaeology/components/xenoartifact.dm +++ b/code/modules/xenoarchaeology/components/xenoartifact.dm @@ -180,9 +180,9 @@ for(var/i in 1 to amount) //Pick a random trait var/datum/xenoartifact_trait/T = pick_weight(options) - options -= T add_individual_trait(T) - + options -= blacklisted_traits + //Cooldown finish logic goes here /datum/component/xenoartifact/proc/reset_timer() if(use_cooldown_timer) diff --git a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm index 5ef4e782da316..9d12f6902d98e 100644 --- a/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm +++ b/code/modules/xenoarchaeology/tools/console/xenoarchaeology_console.dm @@ -50,6 +50,15 @@ ui = new(user, src, "XenoartifactConsole") ui.open() +/obj/machinery/computer/xenoarchaeology_console/ui_data(mob/user) + var/list/data = list() + + data["sellers"] = list() + for(var/datum/rnd_lister/seller as() in sellers) + data["sellers"] += list(list("name" = seller.name, "dialogue" = seller.dialogue, "stock" = list("test"))) + + return data + //Circuitboard for this console /obj/item/circuitboard/computer/xenoarchaeology_console name = "research and development listing console (Computer Board)" diff --git a/tgui/packages/tgui/interfaces/XenoartifactConsole.js b/tgui/packages/tgui/interfaces/XenoartifactConsole.js index 80f00331e966b..0a1d4de9109c0 100644 --- a/tgui/packages/tgui/interfaces/XenoartifactConsole.js +++ b/tgui/packages/tgui/interfaces/XenoartifactConsole.js @@ -1,19 +1,38 @@ import { useBackend } from '../backend'; -import { Box, Tabs, Section, Button, BlockQuote, Icon, Collapsible, AnimatedNumber, ProgressBar } from '../components'; +import { Box, Tabs, Section, Button, BlockQuote, Icon, Collapsible, AnimatedNumber, ProgressBar, Flex, Divider } from '../components'; import { formatMoney } from '../format'; import { Window } from '../layouts'; export const XenoartifactConsole = (props, context) => { const { act, data } = useBackend(context); - const { tab_index, current_tab, tab_info, points, stability } = data; - const sellers = Object.values(data.seller); + const { } = data; + const sellers = data.sellers || []; return ( - - test - + + {sellers.map((value) => ( + + ))} + ); }; + +const XenoartifactConsoleSellerEntry = (props, context) => { + const { act } = useBackend(context); + const { value } = props; + const stock = value["stock"] || []; + return ( + +