From b80abedb59f05a47209e708e03ea667e440a35d4 Mon Sep 17 00:00:00 2001 From: SkyratBot <59378654+SkyratBot@users.noreply.github.com> Date: Sat, 7 Jan 2023 07:42:14 +0100 Subject: [PATCH] [MIRROR] refreshes syndi-kits and syndicate surplus crates, introduces shared limited stock [MDB IGNORE] (#18209) * refreshes syndi-kits and syndicate surplus crates, introduces shared limited stock * merge conflict * Surplus balance, Consolidated our surplus crate and the new tg one to just use our stats * use upstream surplus loot crates * syndicrate Co-authored-by: Sol N <116288367+flowercuco@users.noreply.github.com> Co-authored-by: tastyfish --- code/__DEFINES/antagonists.dm | 6 + code/datums/components/uplink.dm | 4 +- .../items/granters/magic/lightning_bolt.dm | 16 ++ .../game/objects/items/storage/uplink_kits.dm | 177 ++++++++++-------- .../crates_lockers/crates/syndicrate.dm | 76 ++++++++ .../antagonists/traitor/uplink_handler.dm | 42 +++-- code/modules/asset_cache/assets/uplink.dm | 1 + code/modules/cargo/packs/general.dm | 7 +- .../projectiles/guns/energy/special.dm | 6 + .../spells/spell_types/right_and_wrong.dm | 1 + code/modules/uplink/uplink_items.dm | 11 ++ code/modules/uplink/uplink_items/bundle.dm | 123 ++++++++++++ .../uplink/uplink_items/device_tools.dm | 1 + code/modules/uplink/uplink_items/job.dm | 19 +- code/modules/uplink/uplink_items/species.dm | 2 +- icons/obj/library.dmi | Bin 21482 -> 22241 bytes icons/obj/storage/crates.dmi | Bin 26064 -> 27258 bytes .../modules/aesthetics/crates/code/crates.dm | 3 + .../skyrat-uplinks/code/categories/bundles.dm | 38 +--- tgstation.dme | 2 + .../packages/tgui/interfaces/Uplink/index.tsx | 3 +- 21 files changed, 397 insertions(+), 141 deletions(-) create mode 100644 code/game/objects/items/granters/magic/lightning_bolt.dm create mode 100644 code/game/objects/structures/crates_lockers/crates/syndicrate.dm diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm index 8c66bbe50ef..b24fdc145d2 100644 --- a/code/__DEFINES/antagonists.dm +++ b/code/__DEFINES/antagonists.dm @@ -249,6 +249,12 @@ GLOBAL_LIST_INIT(ai_employers, list( /// because they have nothing else that supports an implant. #define UPLINK_IMPLANT_TELECRYSTAL_COST 4 +/// Items with this stock key do not share stock with other items +#define UPLINK_SHARED_STOCK_UNIQUE "uplink_shared_stock_unique" +/// Stock keys for items that share inventory stock +#define UPLINK_SHARED_STOCK_KITS "uplink_shared_stock_kits" +#define UPLINK_SHARED_STOCK_SURPLUS "uplink_shared_stock_surplus" + // Used for traitor objectives /// If the objective hasn't been taken yet #define OBJECTIVE_STATE_INACTIVE 1 diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm index 4fb916a497d..a2e6f17f81c 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -230,8 +230,8 @@ )) var/list/remaining_stock = list() - for(var/datum/uplink_item/item as anything in stock_list) - remaining_stock[item.type] = stock_list[item] + for(var/item as anything in stock_list) + remaining_stock[item] = stock_list[item] data["extra_purchasable"] = extra_purchasable data["extra_purchasable_stock"] = extra_purchasable_stock data["current_stock"] = remaining_stock diff --git a/code/game/objects/items/granters/magic/lightning_bolt.dm b/code/game/objects/items/granters/magic/lightning_bolt.dm new file mode 100644 index 00000000000..3e3cbade46f --- /dev/null +++ b/code/game/objects/items/granters/magic/lightning_bolt.dm @@ -0,0 +1,16 @@ +/obj/item/book/granter/action/spell/lightningbolt + granted_action = /datum/action/cooldown/spell/pointed/projectile/lightningbolt + action_name = "lightning bolt" + icon_state ="booklightning" + desc = "Become like lightning, the rain transformed." + remarks = list( + "I never quite liked insulated gloves...", + "Will this effect my haircut?", + "I wonder if I can use this to charge a MODsuit?", + "Ouch! That page had static...", + "Is cackling optional?", + "Just think like a tesla ball...", + "UNLIMITED power? Well... maybe if I practice...", + "Wait until they're grouped up...", + ) + diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index d95207b5795..7b13ad501c4 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -20,6 +20,7 @@ #define KIT_MR_FREEZE "mr_freeze" #define KIT_TRAITOR_2006 "ancient" +/// last audited december 2022 /obj/item/storage/box/syndicate /obj/item/storage/box/syndicate/bundle_a/PopulateContents() @@ -44,7 +45,7 @@ new /obj/item/storage/box/syndie_kit/space(src) //4 tc new /obj/item/grenade/frag(src) // ~2 tc each? new /obj/item/grenade/frag(src) - new /obj/item/flashlight/emp(src) + new /obj/item/flashlight/emp(src) // 4 tc if(KIT_BLOODY_SPAI) new /obj/item/card/id/advanced/chameleon(src) // 2 tc @@ -61,84 +62,86 @@ new /obj/item/chameleon(src) // 7 tc if(KIT_STEALTHY) - new /obj/item/gun/energy/recharge/ebow(src) - new /obj/item/pen/sleepy(src) - new /obj/item/healthanalyzer/rad_laser(src) - new /obj/item/chameleon(src) - new /obj/item/soap/syndie(src) - new /obj/item/clothing/glasses/thermal/syndi(src) - new /obj/item/flashlight/emp(src) - new /obj/item/jammer(src) + new /obj/item/gun/energy/recharge/ebow(src) // 10 tc + new /obj/item/pen/sleepy(src) // 4 tc + new /obj/item/healthanalyzer/rad_laser(src) // 3 tc + new /obj/item/chameleon(src) // 7 tc + new /obj/item/soap/syndie(src) // 1 tc + new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc + new /obj/item/flashlight/emp(src) // 2 tc + new /obj/item/jammer(src) // 5 tc if(KIT_GUN) - new /obj/item/gun/ballistic/revolver/syndicate(src) + new /obj/item/gun/ballistic/revolver/syndicate(src) // 13 tc + new /obj/item/ammo_box/a357(src) // 4tc new /obj/item/ammo_box/a357(src) - new /obj/item/ammo_box/a357(src) - new /obj/item/card/emag(src) - new /obj/item/grenade/c4(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/storage/belt/holster/chameleon(src) // 1 tc + new /obj/item/card/emag/doorjack(src) // 3 tc replaced the emag with the doorjack + new /obj/item/grenade/c4(src) // 1 tc + new /obj/item/clothing/gloves/color/latex/nitrile(src) // ~1 tc for whole outfit new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/under/suit/black_really(src) new /obj/item/clothing/neck/tie/red/hitman(src) if(KIT_SCREWED) - new /obj/item/sbeacondrop/bomb(src) - new /obj/item/grenade/syndieminibomb(src) - new /obj/item/sbeacondrop/powersink(src) - new /obj/item/clothing/suit/space/syndicate/black/red(src) + new /obj/item/sbeacondrop/bomb(src) // 11 tc + new /obj/item/grenade/syndieminibomb(src) // 6 tc + new /obj/item/sbeacondrop/powersink(src) // 11 tc + new /obj/item/clothing/suit/space/syndicate/black/red(src) // outfit 1 tc new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) - new /obj/item/encryptionkey/syndicate(src) + new /obj/item/encryptionkey/syndicate(src) // 2 tc if(KIT_MURDER) - new /obj/item/melee/energy/sword/saber(src) - new /obj/item/clothing/glasses/thermal/syndi(src) - new /obj/item/card/emag(src) - new /obj/item/clothing/shoes/chameleon/noslip(src) - new /obj/item/encryptionkey/syndicate(src) - new /obj/item/grenade/syndieminibomb(src) + new /obj/item/melee/energy/sword/saber(src) // 8 tc + new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc + new /obj/item/card/emag/doorjack(src) // 3 tc + new /obj/item/clothing/shoes/chameleon/noslip(src) // 2 tc + new /obj/item/encryptionkey/syndicate(src) // 2 tc + new /obj/item/grenade/syndieminibomb(src) // 6 tc if(KIT_IMPLANTS) - new /obj/item/implanter/freedom(src) - new /obj/item/implanter/uplink/precharged(src) - new /obj/item/implanter/emp(src) - new /obj/item/implanter/explosive(src) - new /obj/item/implanter/storage(src) + new /obj/item/implanter/freedom(src) // 5 tc + new /obj/item/implanter/uplink/precharged(src) // 10 tc is inside this thing + new /obj/item/implanter/emp(src) // 1 tc + new /obj/item/implanter/explosive(src) // 2 tc + new /obj/item/implanter/storage(src) // 8 tc if(KIT_HACKER) //L-L--LOOK AT YOU, HACKER - new /obj/item/ai_module/syndicate(src) - new /obj/item/card/emag(src) - new /obj/item/encryptionkey/binary(src) - new /obj/item/ai_module/toy_ai(src) - new /obj/item/multitool/ai_detect(src) - new /obj/item/storage/toolbox/syndicate(src) - new /obj/item/camera_bug(src) - new /obj/item/clothing/glasses/thermal/syndi(src) - new /obj/item/card/id/advanced/chameleon(src) + new /obj/item/ai_module/syndicate(src) // 4 tc + new /obj/item/card/emag(src) // 4 tc + new /obj/item/card/emag/doorjack(src) // 3 tc + new /obj/item/encryptionkey/binary(src) // 5 tc + new /obj/item/ai_module/toy_ai(src) // ~6 tc + new /obj/item/multitool/ai_detect(src) // 1 tc + new /obj/item/storage/toolbox/syndicate(src) // 1 tc + new /obj/item/camera_bug(src) // 1 tc + new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc + new /obj/item/card/id/advanced/chameleon(src) // 2 tc - if(KIT_LORD_SINGULOTH) //can't loose the goose anymore without SM :( - new /obj/item/sbeacondrop(src) + if(KIT_LORD_SINGULOTH) //currently disabled, i might return with another anti-engine kit + new /obj/item/sbeacondrop(src) // 10 tc new /obj/item/clothing/suit/space/syndicate/black/red(src) new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) - new /obj/item/card/emag(src) - new /obj/item/storage/toolbox/syndicate(src) + new /obj/item/card/emag(src) // 4 tc + new /obj/item/storage/toolbox/syndicate(src) // 1 tc new /obj/item/card/id/advanced/mining(src) - new /obj/item/stack/spacecash/c10000(src) + new /obj/item/stack/spacecash/c10000(src) // this is technically 10 tc but not really new /obj/item/toy/spinningtoy(src) //lol if(KIT_SABOTAGE) - /obj/item/storage/backpack/duffelbag/syndie/sabotage - new /obj/item/camera_bug(src) - new /obj/item/sbeacondrop/powersink(src) - new /obj/item/computer_disk/virus/detomatix(src) - new /obj/item/storage/toolbox/syndicate(src) - new /obj/item/pizzabox/bomb(src) - new /obj/item/storage/box/syndie_kit/emp(src) + new /obj/item/storage/backpack/duffelbag/syndie/sabotage(src) // 5 tc for 3 c4 and 2 x4 + new /obj/item/camera_bug(src) // 1 tc + new /obj/item/sbeacondrop/powersink(src) // 11 tc + new /obj/item/computer_disk/virus/detomatix(src) // 6 tc + new /obj/item/storage/toolbox/syndicate(src) // 1 tc + new /obj/item/pizzabox/bomb(src) // 6 tc + new /obj/item/storage/box/syndie_kit/emp(src) // 2 tc if(KIT_SNIPER) //This shit is unique so can't really balance it around tc, also no silencer because getting killed without ANY indicator on what killed you sucks new /obj/item/gun/ballistic/automatic/sniper_rifle(src) // 12 tc - new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) - new /obj/item/clothing/glasses/thermal/syndi(src) - new /obj/item/clothing/gloves/color/latex/nitrile(src) + new /obj/item/ammo_box/magazine/sniper_rounds/penetrator(src) // 5 tc + new /obj/item/clothing/glasses/thermal/syndi(src) // 4 tc + new /obj/item/clothing/gloves/color/latex/nitrile(src) // ~ 1 tc for outfit new /obj/item/clothing/mask/gas/clown_hat(src) new /obj/item/clothing/under/suit/black_really(src) new /obj/item/clothing/neck/tie/red/hitman(src) @@ -166,31 +169,40 @@ KIT_TRAITOR_2006 = 1 ))) if(KIT_JAMES_BOND) - new /obj/item/gun/ballistic/automatic/pistol(src) - new /obj/item/suppressor(src) + new /obj/item/gun/ballistic/automatic/pistol(src) // 7 tc + new /obj/item/suppressor(src) // 3 tc + new /obj/item/ammo_box/magazine/m9mm(src) // 1 tc new /obj/item/ammo_box/magazine/m9mm(src) - new /obj/item/ammo_box/magazine/m9mm(src) - new /obj/item/card/id/advanced/chameleon(src) - new /obj/item/clothing/under/chameleon(src) - new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) + new /obj/item/card/id/advanced/chameleon(src) // 2 tc + new /obj/item/clothing/under/chameleon(src) // 1 tc + new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) // 5 tc new /obj/item/reagent_containers/cup/rag(src) + new /obj/item/implanter/freedom(src) // 5 tc + new /obj/item/flashlight/emp(src) // 2 tc + new /obj/item/grenade/c4/x4(src) // 1ish tc + new /obj/item/reagent_containers/pill/cyanide(src) + new /obj/item/toy/cards/deck/syndicate(src) // 1 tc, for poker if(KIT_NINJA) new /obj/item/katana(src) // Unique , hard to tell how much tc this is worth. 8 tc? new /obj/item/reagent_containers/hypospray/medipen/stimulants(src) // 5 tc for(var/i in 1 to 6) - new /obj/item/throwing_star(src) // ~5 tc for all 6 - new /obj/item/storage/belt/chameleon(src) // Unique but worth at least 2 tc + new /obj/item/throwing_star(src) // 1 tc + new /obj/item/storage/belt/chameleon(src) // worth some fraction of a tc new /obj/item/chameleon(src) // 7 tc new /obj/item/card/id/advanced/chameleon(src) // 2 tc + new /obj/item/card/emag/doorjack(src) // 3 tc + new /obj/item/book/granter/action/spell/smoke(src) // ninja smoke bomb. 1 tc + new /obj/item/clothing/shoes/bhop(src) // mining item, lets you jump at people, at least 2 tc if(KIT_DARK_LORD) - new /obj/item/dualsaber(src) - new /obj/item/dnainjector/telemut/darkbundle(src) + new /obj/item/dualsaber/red(src) // 16 tc + new /obj/item/dnainjector/telemut/darkbundle(src) // ~ 4 tc for tk new /obj/item/clothing/suit/hooded/chaplain_hoodie(src) - new /obj/item/card/id/advanced/chameleon(src) - new /obj/item/clothing/shoes/chameleon/noslip(src) //because slipping while being a dark lord sucks - new /obj/item/book/granter/action/spell/summonitem(src) + new /obj/item/card/id/advanced/chameleon(src) // 2 tc + new /obj/item/clothing/shoes/chameleon/noslip(src) //2 tc ,because slipping while being a dark lord sucks + new /obj/item/book/granter/action/spell/summonitem(src) // ~2 tc + new /obj/item/book/granter/action/spell/lightningbolt(src) // 4 tc if(KIT_WHITE_WHALE_HOLY_GRAIL) //Unique items that don't appear anywhere else new /obj/item/gun/ballistic/rifle/boltaction/harpoon(src) @@ -198,6 +210,7 @@ new /obj/item/clothing/suit/hooded/carp_costume/spaceproof(src) new /obj/item/clothing/mask/gas/carp(src) new /obj/item/grenade/spawnergrenade/spesscarp(src) + new /obj/item/toy/plush/carpplushie/dehy_carp(src) // 1 tc, for use as a personal mount if(KIT_MAD_SCIENTIST) new /obj/item/clothing/suit/toggle/labcoat/mad(src) // 0 tc @@ -211,17 +224,17 @@ new /obj/item/assembly/signaler(src) // 0 tc new /obj/item/assembly/signaler(src) // 0 tc new /obj/item/storage/toolbox/syndicate(src) // 1 tc - new /obj/item/pen/edagger(src) - new /obj/item/gun/energy/wormhole_projector/core_inserted(src) - new /obj/item/gun/energy/decloner/unrestricted(src) + new /obj/item/pen/edagger(src) // 2 tc + new /obj/item/gun/energy/wormhole_projector/core_inserted(src) // 5 tc easily + new /obj/item/gun/energy/decloner/unrestricted(src) // 5 tc at least also if(KIT_BEES) new /obj/item/paper/fluff/bee_objectives(src) // 0 tc (motivation) new /obj/item/clothing/suit/hooded/bee_costume(src) // 0 tc new /obj/item/clothing/mask/animal/small/bee(src) // 0 tc new /obj/item/storage/belt/fannypack/yellow(src) // 0 tc - new /obj/item/grenade/spawnergrenade/buzzkill(src) - new /obj/item/grenade/spawnergrenade/buzzkill(src) + new /obj/item/grenade/spawnergrenade/buzzkill(src) // these are the random super bees this is definitely all of the tc budget for this one + new /obj/item/grenade/spawnergrenade/buzzkill(src) // 10 tc per grenade new /obj/item/reagent_containers/cup/bottle/beesease(src) // 10 tc? new /obj/item/melee/beesword(src) //priceless @@ -231,14 +244,15 @@ new /obj/item/clothing/mask/chameleon(src) new /obj/item/clothing/suit/hooded/wintercoat(src) new /obj/item/clothing/shoes/winterboots(src) + new /obj/item/grenade/gluon(src) // whole belt is 22 and gluon is weight 4 so lets just go with like 7 total new /obj/item/grenade/gluon(src) new /obj/item/grenade/gluon(src) new /obj/item/grenade/gluon(src) - new /obj/item/grenade/gluon(src) - new /obj/item/dnainjector/geladikinesis(src) + new /obj/item/dnainjector/geladikinesis(src) // both abilities are probably 3 tc total new /obj/item/dnainjector/cryokinesis(src) - new /obj/item/gun/energy/temperature/security(src) - new /obj/item/melee/energy/sword/saber/blue(src) //see see it fits the theme bc its blue and ice is blue + new /obj/item/gun/energy/temperature/freeze(src) // ~6 tc + new /obj/item/gun/energy/laser/thermal/cryo(src) // ~6 tc + new /obj/item/melee/energy/sword/saber/blue(src) //see see it fits the theme bc its blue and ice is blue, 8 tc if(KIT_TRAITOR_2006) //A kit so old, it's probably older than you. //This bundle is filled with the entire unlink contents traitors had access to in 2006, from OpenSS13. Notably the esword was not a choice but existed in code. new /obj/item/storage/toolbox/emergency/old/ancientbundle(src) //Items fit neatly into a classic toolbox just to remind you what the theme is. @@ -246,12 +260,13 @@ /obj/item/storage/toolbox/emergency/old/ancientbundle/ //So the subtype works /obj/item/storage/toolbox/emergency/old/ancientbundle/PopulateContents() - new /obj/item/card/emag(src) - new /obj/item/pen/sleepy(src) + new /obj/item/card/emag(src) // 4 tc + new /obj/item/card/emag/doorjack(src) //emag used to do both. 3 tc + new /obj/item/pen/sleepy(src) // 4 tc new /obj/item/reagent_containers/pill/cyanide(src) - new /obj/item/chameleon(src) //its not the original cloaking device, but it will do. - new /obj/item/gun/ballistic/revolver/syndicate(src) - new /obj/item/implanter/freedom(src) + new /obj/item/chameleon(src) //its not the original cloaking device, but it will do. 8 tc + new /obj/item/gun/ballistic/revolver(src) // 13 tc old one stays in the old box + new /obj/item/implanter/freedom(src) // 5 tc new /obj/item/stack/telecrystal(src) //The failsafe/self destruct isn't an item we can physically include in the kit, but 1 TC is technically enough to buy the equivalent. /obj/item/storage/box/syndicate/contract_kit //SKYRAT EDIT - CHANGED IN MODULAR FOLDER diff --git a/code/game/objects/structures/crates_lockers/crates/syndicrate.dm b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm new file mode 100644 index 00000000000..c5106354ae5 --- /dev/null +++ b/code/game/objects/structures/crates_lockers/crates/syndicrate.dm @@ -0,0 +1,76 @@ +/obj/structure/closet/crate/syndicrate + name = "surplus syndicrate" + desc = "A conspicuous crate with the Syndicate logo on it. You don't know how to open it." + icon_state = "syndicrate" + max_integrity = 500 + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0) + resistance_flags = FIRE_PROOF | ACID_PROOF + integrity_failure = 0 //prevents bust_open from activating + /// variable that only lets the crate open if opened by a key from the uplink + var/created_items = FALSE + /// this is what will spawn when it is opened with a syndicrate key + var/list/unlock_contents = list() + +/// if the crate takes damage it will explode 25% of the time +/obj/structure/closet/crate/syndicrate/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1) + if(created_items) + return ..() + if(damage_amount < DAMAGE_PRECISION) + return ..() + if(prob(75)) + return ..() + visible_message(span_danger("The syndicrate's anti-tamper system activates!")) + explosion(src, heavy_impact_range = 1, light_impact_range = 2, flash_range = 2) + qdel(src) + +///ensures that the syndicrate can only be unlocked by opening it with a syndicrate_key +/obj/structure/closet/crate/syndicrate/attackby(obj/item/item, mob/user, params) + if(!istype(item, /obj/item/syndicrate_key) || created_items) + return ..() + created_items = TRUE + for(var/item_path as anything in unlock_contents) + new item_path(src) + unlock_contents = list() + qdel(item) + to_chat(user, span_notice("You twist the key into both locks at once, opening the crate.")) + playsound(src, 'sound/machines/boltsup.ogg', 50, vary = FALSE) + update_appearance(updates = UPDATE_OVERLAYS) + togglelock(user) + +/obj/structure/closet/crate/syndicrate/attackby_secondary(obj/item/weapon, mob/user, params) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +///overwrites default opening behavior until it is unlocked via the syndicrate key +/obj/structure/closet/crate/syndicrate/can_open(mob/living/user, force = FALSE) + if(!created_items) + balloon_alert(user, "Locked!") + return FALSE + return ..() + +///syndicrate has a unique overlay for being unlocked +/obj/structure/closet/crate/syndicrate/closet_update_overlays(list/new_overlays) + . = new_overlays + if(created_items) + . += "syndicrate_unlocked" + +/obj/item/syndicrate_key + name = "syndicrate key" + desc = "A device bearing a serpentine emblem, capable of splitting itself into two keys. Can be used to open one syndicrate." + icon = 'icons/obj/storage/crates.dmi' + icon_state = "syndicrate_key" + w_class = WEIGHT_CLASS_TINY + +/obj/item/syndicrate_key/Initialize(mapload) + . = ..() + register_item_context() + +/obj/item/add_item_context(obj/item/source, list/context, atom/target, mob/living/user,) + . = ..() + + var/obj/structure/closet/crate/syndicrate/target_structure = target + if(!istype(target_structure)) + return NONE + if(target_structure.created_items) + return NONE + context[SCREENTIP_CONTEXT_LMB] = "Unlock Syndicrate" + return CONTEXTUAL_SCREENTIP_SET diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm index 8b65312fc6c..800844a70dc 100644 --- a/code/modules/antagonists/traitor/uplink_handler.dm +++ b/code/modules/antagonists/traitor/uplink_handler.dm @@ -16,8 +16,8 @@ var/progression_points = 0 /// The purchase log of this uplink handler var/datum/uplink_purchase_log/purchase_log - /// Associative array of uplink item = stock left - var/list/item_stock = list() + /// Associative array of stock keys = stock left. For items that don't share stock, the key is their typepath + var/list/item_stock = list(UPLINK_SHARED_STOCK_KITS = 1 , UPLINK_SHARED_STOCK_SURPLUS = 1) /// Extra stuff that can be purchased by an uplink, regardless of flag. var/list/extra_purchasable = list() /// Whether this uplink handler has objectives. @@ -56,22 +56,32 @@ SEND_SIGNAL(src, COMSIG_UPLINK_HANDLER_ON_UPDATE) return +/// Checks if traitor has enough reputation to purchase an item +/datum/uplink_handler/proc/not_enough_reputation(datum/uplink_item/to_purchase) + return has_progression && progression_points < to_purchase.progression_minimum + +/// Checks for uplink flags as well as items restricted to roles and species +/datum/uplink_handler/proc/check_if_restricted(datum/uplink_item/to_purchase) + if((to_purchase in extra_purchasable)) + return TRUE + if(!(to_purchase.purchasable_from & uplink_flag)) + return FALSE + if(length(to_purchase.restricted_roles) && !(assigned_role in to_purchase.restricted_roles)) + return FALSE + if(length(to_purchase.restricted_species) && !(assigned_species in to_purchase.restricted_species)) + return FALSE + return TRUE + /datum/uplink_handler/proc/can_purchase_item(mob/user, datum/uplink_item/to_purchase) if(debug_mode) return TRUE - if(!(to_purchase in extra_purchasable)) - if(!(to_purchase.purchasable_from & uplink_flag)) - return FALSE + if(!check_if_restricted(to_purchase)) + return FALSE - if(length(to_purchase.restricted_roles) && !(assigned_role in to_purchase.restricted_roles)) - return FALSE - if(length(to_purchase.restricted_species) && !(assigned_species in to_purchase.restricted_species)) - return FALSE - - var/current_stock = item_stock[to_purchase] + var/current_stock = item_stock[to_purchase.stock_key] var/stock = current_stock != null? current_stock : INFINITY - if(telecrystals < to_purchase.cost || stock <= 0 || (has_progression && progression_points < to_purchase.progression_minimum)) + if(telecrystals < to_purchase.cost || stock <= 0 || not_enough_reputation(to_purchase)) return FALSE return TRUE @@ -80,14 +90,14 @@ if(!can_purchase_item(user, to_purchase)) return - if(to_purchase.limited_stock != -1 && !(to_purchase in item_stock)) - item_stock[to_purchase] = to_purchase.limited_stock + if(to_purchase.limited_stock != -1 && !(to_purchase.stock_key in item_stock)) + item_stock[to_purchase.stock_key] = to_purchase.limited_stock telecrystals -= to_purchase.cost to_purchase.purchase(user, src, source) - if(to_purchase in item_stock) - item_stock[to_purchase] -= 1 + if(to_purchase.stock_key in item_stock) + item_stock[to_purchase.stock_key] -= 1 SSblackbox.record_feedback("nested tally", "traitor_uplink_items_bought", 1, list("[initial(to_purchase.name)]", "[to_purchase.cost]")) on_update() diff --git a/code/modules/asset_cache/assets/uplink.dm b/code/modules/asset_cache/assets/uplink.dm index 6af6e1ff93e..7d1b6d950b9 100644 --- a/code/modules/asset_cache/assets/uplink.dm +++ b/code/modules/asset_cache/assets/uplink.dm @@ -28,6 +28,7 @@ "purchasable_from" = item.purchasable_from, "restricted" = item.restricted, "limited_stock" = item.limited_stock, + "stock_key" = item.stock_key, "restricted_roles" = item.restricted_roles, "restricted_species" = item.restricted_species, "progression_minimum" = item.progression_minimum, diff --git a/code/modules/cargo/packs/general.dm b/code/modules/cargo/packs/general.dm index d7819b8a60e..b1ff57bccf9 100644 --- a/code/modules/cargo/packs/general.dm +++ b/code/modules/cargo/packs/general.dm @@ -256,11 +256,12 @@ /datum/supply_pack/misc/syndicate name = "Assorted Syndicate Gear" desc = "Contains a random assortment of syndicate gear." - special = TRUE ///Cannot be ordered via cargo + special = TRUE //Cannot be ordered via cargo contains = list() crate_name = "syndicate gear crate" crate_type = /obj/structure/closet/crate - var/crate_value = 30 ///Total TC worth of contained uplink items + ///Total TC worth of contained uplink items + var/crate_value = 30 var/uplink_flag = UPLINK_TRAITORS ///Generate assorted uplink items, taking into account the same surplus modifiers used for surplus crates @@ -275,6 +276,8 @@ var/datum/uplink_item/uplink_item = pick(uplink_items) if(!uplink_item.surplus || prob(100 - uplink_item.surplus)) continue + if(length(uplink_item.restricted_roles) || length(uplink_item.restricted_species)) + continue if(crate_value < uplink_item.cost) continue crate_value -= uplink_item.cost diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 78be2aef3f7..12212dd9b9b 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -338,6 +338,12 @@ desc = "A weapon that can only be used to its full potential by the truly robust." pin = /obj/item/firing_pin +/obj/item/gun/energy/temperature/freeze + name = "cryogenic temperature gun" + desc = "A gun that reduces temperatures. Only for those with ice in their veins." + pin = /obj/item/firing_pin + ammo_type = list(/obj/item/ammo_casing/energy/temp) + /obj/item/gun/energy/gravity_gun name = "one-point gravitational manipulator" desc = "An experimental, multi-mode device that fires bolts of Zero-Point Energy, causing local distortions in gravity. Requires a gravitational anomaly core to function." diff --git a/code/modules/spells/spell_types/right_and_wrong.dm b/code/modules/spells/spell_types/right_and_wrong.dm index 9b973b90f48..2758cea178c 100644 --- a/code/modules/spells/spell_types/right_and_wrong.dm +++ b/code/modules/spells/spell_types/right_and_wrong.dm @@ -67,6 +67,7 @@ GLOBAL_LIST_INIT(summoned_magic, list( /obj/item/book/granter/action/spell/barnyard, /obj/item/book/granter/action/spell/charge, /obj/item/book/granter/action/spell/summonitem, + /obj/item/book/granter/action/spell/lightningbolt, /obj/item/gun/magic/wand/nothing, /obj/item/gun/magic/wand/death, /obj/item/gun/magic/wand/resurrection, diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 12c0134e37a..cf9f7315eb9 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -46,6 +46,8 @@ var/surplus = 100 /// Whether this can be discounted or not var/cant_discount = FALSE + /// If this value is changed on two items they will share stock, defaults to not sharing stock with any other item + var/stock_key = UPLINK_SHARED_STOCK_UNIQUE /// How many items of this stock can be purchased. var/limited_stock = -1 //Setting this above zero limits how many times this item can be bought by the same traitor in a round, -1 is unlimited /// A bitfield to represent what uplinks can purchase this item. @@ -66,6 +68,12 @@ // String to be shown instead of the price, e.g for the Random item. var/cost_override_string = "" +/datum/uplink_item/New() + . = ..() + if(stock_key != UPLINK_SHARED_STOCK_UNIQUE) + return + stock_key = type + /datum/uplink_category /// Name of the category var/name @@ -125,3 +133,6 @@ ..() if(user?.mind?.failed_special_equipment) user.mind.failed_special_equipment -= item + +/// Code that enables the ability to have limited stock that is shared by different items +/datum/shared_uplink_stock diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm index 103125633d4..cabfd2ed249 100644 --- a/code/modules/uplink/uplink_items/bundle.dm +++ b/code/modules/uplink/uplink_items/bundle.dm @@ -51,3 +51,126 @@ desc = "Twenty telecrystals in their rawest and purest form; can be utilized on active uplinks to increase their telecrystal count." item = /obj/item/stack/telecrystal/twenty cost = 20 + +/datum/uplink_item/bundles_tc/bundle_a + name = "Syndi-kit Tactical" + desc = "Syndicate Bundles, also known as Syndi-Kits, are specialized groups of items that arrive in a plain box. \ + These items are collectively worth more than 25 telecrystals, but you do not know which specialization \ + you will receive. May contain discontinued and/or exotic items. \ + The Syndicate will only provide one Syndi-Kit per agent." + progression_minimum = 30 MINUTES + item = /obj/item/storage/box/syndicate/bundle_a + cost = 25 + stock_key = UPLINK_SHARED_STOCK_KITS + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/datum/uplink_item/bundles_tc/bundle_b + name = "Syndi-kit Special" + desc = "Syndicate Bundles, also known as Syndi-Kits, are specialized groups of items that arrive in a plain box. \ + In Syndi-kit Special, you will receive items used by famous syndicate agents of the past. \ + Collectively worth more than 25 telecrystals, the syndicate loves a good throwback. \ + The Syndicate will only provide one Syndi-Kit per agent." + progression_minimum = 30 MINUTES + item = /obj/item/storage/box/syndicate/bundle_b + cost = 25 + stock_key = UPLINK_SHARED_STOCK_KITS + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + +/datum/uplink_item/bundles_tc/surplus + name = "Syndicate Surplus Crate" + desc = "A dusty crate from the back of the Syndicate warehouse delivered directly to you via Supply Pod. \ + If the rumors are true, it will fill it's contents based on your current reputation. Get on that grind. \ + Contents are sorted to always be worth 30 TC. The Syndicate will only provide one surplus item per agent." + item = /obj/structure/closet/crate // will be replaced in purchase() + cost = 20 + purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) + stock_key = UPLINK_SHARED_STOCK_SURPLUS + /// Value of items inside the crate in TC + var/crate_tc_value = 30 + /// crate that will be used for the surplus crate + var/crate_type = /obj/structure/closet/crate + +/// generates items that can go inside crates, edit this proc to change what items could go inside your specialized crate +/datum/uplink_item/bundles_tc/surplus/proc/generate_possible_items(mob/user, datum/uplink_handler/handler) + var/list/possible_items = list() + for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) + var/datum/uplink_item/uplink_item = SStraitor.uplink_items_by_type[item_path] + if(src == uplink_item || !uplink_item.item) + continue + if(!handler.check_if_restricted(uplink_item)) + continue + if(!uplink_item.surplus) + continue + if(handler.not_enough_reputation(uplink_item)) + continue + possible_items += uplink_item + return possible_items + +/// picks items from the list given to proc and generates a valid uplink item that is less or equal to the amount of TC it can spend +/datum/uplink_item/bundles_tc/surplus/proc/pick_possible_item(list/possible_items, tc_budget) + var/datum/uplink_item/uplink_item = pick(possible_items) + if(prob(100 - uplink_item.surplus)) + return null + if(tc_budget < uplink_item.cost) + return null + return uplink_item + +/// fills the crate that will be given to the traitor, edit this to change the crate and how the item is filled +/datum/uplink_item/bundles_tc/surplus/proc/fill_crate(obj/structure/closet/crate/surplus_crate, list/possible_items) + var/tc_budget = crate_tc_value + while(tc_budget) + var/datum/uplink_item/uplink_item = pick_possible_item(possible_items, tc_budget) + if(!uplink_item) + continue + tc_budget -= uplink_item.cost + new uplink_item.item(surplus_crate) + +/// overwrites purchase for surplus items to instead spawn this crate and run the previous procs +/datum/uplink_item/bundles_tc/surplus/purchase(mob/user, datum/uplink_handler/handler, atom/movable/source) + var/obj/structure/closet/crate/surplus_crate = new crate_type() + if(!istype(surplus_crate)) + CRASH("crate_type is not a crate") + var/list/possible_items = generate_possible_items(user, handler) + + fill_crate(surplus_crate, possible_items) + + podspawn(list( + "target" = get_turf(user), + "style" = STYLE_SYNDICATE, + "spawn" = surplus_crate, + )) + +/datum/uplink_item/bundles_tc/surplus/united + name = "United Surplus Crate" + desc = "A shiny and large crate to be delivered directly to you via Supply Pod. It has an advanced locking mechanism with an anti-tampering protocol. \ + It is recommended that you only attempt to open it by having another agent purchase a Surplus Crate Key. Unite and fight. \ + Rumored to contain a valuable assortment of items based on your current reputation, but you never know. Contents are sorted to always be worth 80 TC. \ + The Syndicate will only provide one surplus item per agent." + cost = 20 + item = /obj/structure/closet/crate/syndicrate + progression_minimum = 30 MINUTES + stock_key = UPLINK_SHARED_STOCK_SURPLUS + crate_tc_value = 80 + crate_type = /obj/structure/closet/crate/syndicrate + +/// edited version of fill crate for super surplus to ensure it can only be unlocked with the syndicrate key +/datum/uplink_item/bundles_tc/surplus/united/fill_crate(obj/structure/closet/crate/syndicrate/surplus_crate, list/possible_items) + if(!istype(surplus_crate)) + return + var/tc_budget = crate_tc_value + while(tc_budget) + var/datum/uplink_item/uplink_item = pick_possible_item(possible_items, tc_budget) + if(!uplink_item) + continue + tc_budget -= uplink_item.cost + surplus_crate.unlock_contents += uplink_item.item + +/datum/uplink_item/bundles_tc/surplus_key + name = "United Surplus Crate Key" + desc = "This inconscpicous device is actually a key that can open any United Surplus Crate. It can only be used once. \ + Though initially designed to encourage cooperation, agents quickly discovered that you can turn the key to the crate by yourself. \ + The Syndicate will only provide one surplus item per agent." + cost = 20 + item = /obj/item/syndicrate_key + progression_minimum = 30 MINUTES + stock_key = UPLINK_SHARED_STOCK_SURPLUS diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm index d6cea88e96e..5e8e22427d1 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -252,6 +252,7 @@ progression_minimum = 30 MINUTES item = /obj/item/sbeacondrop cost = 10 + surplus = 0 // not while there isnt one on any station purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) /datum/uplink_item/device_tools/powersink diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm index 97c8878a8fc..b5088f9c9db 100644 --- a/code/modules/uplink/uplink_items/job.dm +++ b/code/modules/uplink/uplink_items/job.dm @@ -7,7 +7,6 @@ /datum/uplink_item/role_restricted category = /datum/uplink_category/role_restricted purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) - surplus = 0 // No progression cost /datum/uplink_item/role_restricted/haunted_magic_eightball @@ -18,6 +17,7 @@ cost = 2 restricted_roles = list(JOB_CURATOR) limited_stock = 1 //please don't spam deadchat + surplus = 5 /datum/uplink_item/role_restricted/bureaucratic_error_remote name = "Organic Resources Disturbance Inducer" @@ -26,6 +26,7 @@ limited_stock = 1 item = /obj/item/devices/bureaucratic_error_remote restricted_roles = list(JOB_HEAD_OF_PERSONNEL, JOB_QUARTERMASTER) + surplus = 5 /datum/uplink_item/role_restricted/clumsinessinjector //clown ops can buy this too, but it's in the pointless badassery section for them name = "Clumsiness Injector" @@ -34,6 +35,7 @@ cost = 1 restricted_roles = list(JOB_CLOWN) illegal_tech = FALSE + surplus = 25 /datum/uplink_item/role_restricted/ancient_jumpsuit name = "Ancient Jumpsuit" @@ -61,6 +63,7 @@ item = /obj/item/firing_pin/clown/ultra restricted_roles = list(JOB_CLOWN) illegal_tech = FALSE + surplus = 25 /datum/uplink_item/role_restricted/clownsuperpin name = "Super Ultra Hilarious Firing Pin" @@ -70,6 +73,7 @@ item = /obj/item/firing_pin/clown/ultra/selfdestruct restricted_roles = list(JOB_CLOWN) illegal_tech = FALSE + surplus = 25 /datum/uplink_item/role_restricted/syndimmi name = "Syndicate Brand MMI" @@ -87,7 +91,6 @@ progression_minimum = 10 MINUTES item = /obj/item/hot_potato/syndicate cost = 4 - surplus = 0 restricted_roles = list(JOB_COOK, JOB_BOTANIST, JOB_CLOWN, JOB_MIME) /datum/uplink_item/role_restricted/combat_baking @@ -171,6 +174,7 @@ item = /obj/item/disk/surgery/brainwashing restricted_roles = list(JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_ROBOTICIST) cost = 5 + surplus = 50 /datum/uplink_item/role_restricted/springlock_module name = "Heavily Modified Springlock MODsuit Module" @@ -183,6 +187,7 @@ item = /obj/item/mod/module/springlock/bite_of_87 restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) cost = 2 + surplus = 15 /datum/uplink_item/role_restricted/reverse_revolver name = "Reverse Revolver" @@ -202,6 +207,7 @@ cost = 5 //you need two for full damage, so total of 10 for maximum damage limited_stock = 2 //you can't use more than two! restricted_roles = list("Shaft Miner") + surplus = 20 /datum/uplink_item/role_restricted/mimery name = "Guide to Advanced Mimery Series" @@ -220,6 +226,7 @@ cost = 10 item = /obj/item/autosurgeon/syndicate/laser_arm restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) + surplus = 20 /datum/uplink_item/role_restricted/chemical_gun name = "Reagent Dartgun" @@ -236,7 +243,6 @@ cost = 10 item = /obj/item/pneumatic_cannon/pie/selfcharge restricted_roles = list(JOB_CLOWN) - surplus = 0 //No fun unless you're the clown! /datum/uplink_item/role_restricted/clown_bomb name = "Clown Bomb" @@ -249,6 +255,7 @@ item = /obj/item/sbeacondrop/clownbomb cost = 15 restricted_roles = list(JOB_CLOWN) + surplus = 10 /datum/uplink_item/role_restricted/clown_bomb/New() . = ..() @@ -266,6 +273,7 @@ item = /obj/vehicle/sealed/car/clowncar cost = 20 restricted_roles = list(JOB_CLOWN) + surplus = 10 /datum/uplink_item/role_restricted/concealed_weapon_bay name = "Concealed Weapon Bay" @@ -277,6 +285,7 @@ item = /obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay cost = 3 restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) + surplus = 15 /* //SKYRAT REMOVAL START /datum/uplink_item/role_restricted/his_grace @@ -289,7 +298,7 @@ item = /obj/item/his_grace cost = 20 restricted_roles = list(JOB_CHAPLAIN) - surplus = 5 //Very low chance to get it in a surplus crate even without being the chaplain + surplus = 5 */ //SKYRAT REMOVAL END // High progression cost @@ -306,6 +315,7 @@ item = /obj/item/reagent_containers/syringe/spider_extract cost = 10 restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST) + surplus = 10 */ // SKYRAT EDIT END @@ -319,3 +329,4 @@ item = /obj/item/gun/blastcannon cost = 14 //High cost because of the potential for extreme damage in the hands of a skilled scientist. restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST) + surplus = 5 diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm index 85f0ee9e050..54ba353c00a 100644 --- a/code/modules/uplink/uplink_items/species.dm +++ b/code/modules/uplink/uplink_items/species.dm @@ -5,7 +5,6 @@ /datum/uplink_item/species_restricted category = /datum/uplink_category/species purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) - surplus = 0 /datum/uplink_item/species_restricted/moth_lantern name = "Extra-Bright Lantern" @@ -14,3 +13,4 @@ cost = 2 item = /obj/item/flashlight/lantern/syndicate restricted_species = list(SPECIES_MOTH) + surplus = 0 diff --git a/icons/obj/library.dmi b/icons/obj/library.dmi index 322bad96e1ec958fd7aa5a38060042e300941bb2..b002d8c7261af9aba43ba53072d26ebe853c788e 100644 GIT binary patch literal 22241 zcmbrm2RK}9yEeR(sL`WDFR27cL@%QSiJmAyloZjz2tu?OqK1T2f-s06dhZNDNc0xn zDACL4WBR}3d7gK_-`@NCzWx8d<5M$oU^h#7bZb{C++NX0?tAnecXt#iB#CL8po<#+)DPfeZshpMCH4tAOf8MkEc)cdH z8ik&sDJ5GBmYinFcfMoT%FF9(_^tWmJ!8>P%EA+Dah`j!8#N!CfAO{1d9q~9^39|z zo9P$LDJSQe1gAQ&Uqh9jNZ};UcFDX__>{+^bn=3y33WSL%Im53x<3|2p6&?6*RWc= zU2}B2x>K)!PMLR~68vs!YBw!#b6e2pxkjuGeZ`ALmB@mwO!2(TpE9(c%XZ7UUm@VaZx-!z1saX{SpihVfBvaBm1!C?V0O64{mFgWY_MF{&^&)0XUGidCj z59RmY9@=@ync_<>=8e|}-aR+S`jxRai;TO~&S#eMAUdvI&J-bTaW$hA{Zb=^^%mT- zQ=3PMzq4@ZqLUH!Y#ri8)j5p{BR#k93N<~qunH-K^QQ7=))KS}H@LJ-Zb)m_sBdTt zu0Ms^I8uBn3r`F9IkdLdeBGF-DI5^ZwVYtWRdDbsY`!||wl&dg^%GGKTcB{+gSl3m zIxu?cN4O^~!0h~CyYB*mg4XcIXyq#By#CiqYn@C2Jd0tIL&HyWd*>ZzDPem%1e@#V zZk=)ZgVI1UUF&Atd7Qd74!9c?r}z1`q8ZkJH%`PB z-y9aVi!smq^()U=-JM#yFf+IK7dI0wW+b!ldF6rmMD%xt7zcG$_E1($&2MKzsWml) zo15T|AC=dScXe-k@|H_l#$%g%d(%?UQ2F}3jie-*h0d<7u$xO$3hlCa@RPlQSMKKd zX|>2bE>d6s(h;zF9JDd$rJ3}T&p34PPVX|`2N-Fok^Dj{Z!F$dd@-C=Gg_P{1Ux;a zr+N*3kX%i#12pMG&YV(AVySOHJ1wa!U*3IoIa3sfdZomurF$}At-zf-wucinXpAf* zYU#duzjoHcj7(GwYBI$xL->!Mv(sCl2JZNk3D%Arbp8k$`x0^2XsNa6S;xIBOiX*t zVJQ$o+bGBqu?tMu_))^inCc4?gfKJoQq1QuumD)eK~<4h$cJzKZa5p$y1iI~UkTNG zSldJ(t+K=2=cS7mS=6E3O&4|aHYO-O<2w3{Aw)n8WhXJL8)Qnvutco&At7Dpx-Rp@ zHD=&h$*#h@Koo^flw4n6d5#=$4Q_IfD3sc4volcV97p0WZO#QwWDIYBZFu%Wf2_L~8(~vipoc z`hI_g+#-3Wlj5-r84iR9`Te3;8UAK}$BNsWMEszu8qcP=zp%9_OFLWl?jVgAm}5IZ zRcX(^TYDm8LYn#BUHlzHRZkbgNve`pR}PoFfM!fzKU6m7;D&oL&h7<*wSHc}8N8q2 z8DFluLZ%cz%j6luIlMKr2#IK|fz&bx%q!2kNUUF-CHF)(M#nx%=C zTzl;I>*$`kh936eo$i?pHNa;ej6l$q{lQ@Qd|*hQ>P~omcJ_BCyS_Blo$ZBq-JttJ z^?gJ2DZ~8eAVD1WopK1<1&?Hvp*oIsYc$l=Z^?7Ed#P6Ia!C(X{;?OTagAW{TRO52 z&)qA{H-M6#k0tdX_|x!XcUVexovEsntc#Xz$H~z#X`t<<3sTAep!yL}ZZ>#MwK+MN zx1iSr#xXd!Yx+)(D_->|ef=x9-DQF2;F5I!fm&`nx|xn3Iq&DI@2{V2$|Vu5YnE(N zg%mPJeG$2{xEA;H{JJW}JAXaYu34hIY{yIpb6Q0x{T4tSzH#KpiWLe zusp2GVHp{o9hG^ced>8$M@GLf{MxIqw-g-|Kd&Dw_lZ}uwlHW_T{Ui4xICjgCLn)s z7!0W>*+Ve<2=&wS#wsyfD_<;lxn3N9f!aJ?>&iMtki{Z#+uI<`OI8j4`vGAe(_VFG zf4BBz`6F_-jIU8V`K8;VXKC<(YN05B$((QSxz|yim`BG0i*JU9Sa~SfCP0wJrkHVS2?X3`q9QVUUy+ZHN_ab=epDy6(g$#pteWYYr-Ic z*kxs9!PdC>zHyJ~lB(y2Zkkl9LSUWF@2l=3F?&5P3*XHdzeMM(W4Cs~S~{572a{j3 z!FU%YI_4*9`{vqm@6|l?X8Ya~%(F26Ao!4_ZnBoP2XQo%uW-ec$LO)tH>|f1bA8Yd zMa@<{I(cz9m9{zfjB}QDmxB7|Pv7oMCESY5X_YiiM+K@_R~*?~vWY?=5!}9y5tQ(0 zI|t~9Ai}qWFma@z3LE$2Pk%Vkt)Lz?N-i>CGW;yilT`gPRn|YhDa;q}E%~fMoW#+7 zfn-ZXZ>JEWAnDoJG^AFsjkY}$X4?RM_@iTx*t75}Bt{Y^CCgq2 zlj(!%!!$EL9MA5PRLz+6Q<3#X^s7X}VB*t`W2&D15umb*jq0>H5D>%?T1)!&JnFX| zs)7qpW9mmqDurKp?7w`L+>aa3nSO^Mj@ljzTo_Qw?0AN6`OZ@$&xtf9 zQZQYb5JDFaGBf9Nw(u!`x-$|pc8y#bTt?g>KO0)EgWDtEvgeFzd4Ztsy(f69N0SMD zhAW$=TQTOEkr(0h_s*YuMfEE6M1>Jf`OKw0iCQv$zm0k7Y8ih_> zvGl1weIbhoxIe^(CX6=jISs){Vc&1(T;hw$ZG*e!^vMD}M-<@L+U44jj|QxZXfH6> zv6OIT1U$C7fP6Wzv2{NDj{fiohjjtk3ll;?j}bvg^jM9(b3BDwJS{j5b%YmbSAs0B z&&sPYoAQ&uX?h>KhD1V03xIhs`QfqPxozESYia0p*4O-9>x4+h{t(m>DK2kH#*Dg} zV6lNjghZRIktVI_&Z?#AVFV1fxn@b6c!5KPx*~7B#{l#q;jEk=1!*+sM8Yc`{V($8 z9>A_iS9(@5j2^OOc-=U67kBAl{tS?Y8yrKuX)?u6^J=c<-&?*`U;v?6R31|fk8%#_# zdUw50Bg@{HsfD1X+HAK&4}|Ov-ZHZ^PZn=OfFC{2o%K%;C@Ng4&Z8+Ot>xX+ca3gC zLkhnMxiDEAiG6JmM~?Fr?5BKfaYYXBY9GBC7XDdWovMdStI8zKO>}KX1sEy7`$M;% zEO0G!Mlwal&~?+MeT{Nb-CCVd!)$Pfz?t@uhwc@4kzJ0;v{0*8#V+w1Ojox4Xs!;*C%XF2H;Yzp6 z!W;6!NwIX)gg#WUvRn~Jy>SDWauJAA`}|h2go;x+CFj)PQ;8%5 zeDVO$4IX4${1O;)(UtI@zFeiK@xLj?3p2wozW=+rP*#eS&ORLoWB3ehcAS#;8J$f^ zIWz;rvmA|cGI5zxfA$%s3zNeM3c0v2=@5ZSg)J{pKY6=xg?S?ENKRSpwfG7e3BsFU zhYzU7OcuDFVTVeTGm|Jm$CY())J97f-V8L%bH8Ky(R!nj4TnY&or-n0PU84`AZy)k zZW1kqS-(OCc?-66Z-tq|%4P4Y%HIwffqj;Z-sbzN@!lTFBuWf$W!+@43_A(W<$Z_^ z8)5B5bA;6UaZ>cl8?{~lFXkFCiIMySJqU4s2o%a?1U22zCJgCTltnn({aA5T-NTLA z3mNUEj{@ve{<>wqYrlGodZN;eWn;!XoFXi8RVp2Jr@RC;+7wl@1r`N89&9bL(@_t?eF4NQI}9)&eSYk;nU;zX5+z z9o+O(g;VI!iL@nLK4yq9b{b*uPMdGQnQ+$o`hT&+jo5XH8UGGdHrv*VJkW+(z0uCU z-@2MOhf(C{PW78w;FXo@sd)G|BTxuUHmE^1Qot!RV=5!GxV~OxF$;T)gfsaD5XH$P zaR^x)NzRx85jzD=<5VUgU>aN*QyCy9sBg}PE`IrvZKTJ$;@>#WF>7#h@adaYJz{8@ z#3Y&=#0f(?=I*+6Q8?6(7Vn~qclU~S@j@GlAQ~rP52M^928(l2kCD`hwRucA63thw zuW|kdHQzkoPtfkWV&Q z_VG6H_Bhk@+c&F3t2*n}RR{iF1*hTtg6S93ZWw6<*KZ@iE#hBmC<~#g4$d!1j?{CT zw{$skoAzO}=D~W--^JM^Q-qJU|Ei!v3@>tR)EHT89{_ly4Ms-_jSwk6|EU836V?Wl zcFUQh8_+v%a!+1Scmht|6<6*Of6F6^myZZ@uCM1<%)>6hOL!mRDtXPY=1s5G1}p>H)H$2gvCjAc0M{5Gbg&W9$v&DjeW1$iePyBs`QnzWzozOiGL$oOp4< zj4U{99v@)tR=z?1u?R>WNhEa-E0Ti;NO&FtBu@`j7y_7T%%=-!dcvzS4ql)ek=K6D z>i)f;6BjXx4ErFml`2GEvf7xfDwaL!yG}0|S2nme|HoW`Aj?L!pX&#)>VPQ{J;`&; zz>ngfH93OVbg0_)6fE-DoY2CQ{WF@8$m_tb5rN%P_fFW>AFA60c&OJ_{AmMVs3HAeKPUNBwzukTc*)`K5nBjU_<*n%JcKze80ESE~*J>$S76Gr&9k zP zcqL?ClEYTRg5YRwsmncXIgpIU2n$?VCm!1&gbwv{JD}g)KcEUG8Q^EO^oVcj#CB}v zc)*5oqc_yjqF(nm=z2mnC`pNygNAf`aByG zriOeKw3KyHUSN%F?v<$A$(zX2)gaS*fJUQ6>_B%dt_>P7nG0c!`u-}m6ZK%aE;_Av z0`hS1%wq*l^(1n9SHiuW`SxtLlKF$ak5^iKm@EjyzPMN!TP+26tYJDYC;(`KZ_Qg7 zRp2x3T2kcrs;wo#p8Z-#^Vsz6Q)Am5Rlkg6s|HPq2PjacKwDo|xUD-MH!Sp3nH^4c zL&c2=yg;RJFfp->veElu%4wd+QZqHTm4DJe3_F>Xd1$ovF1a|}Vh1qNQ=Zg&d{1mP z<=3hP|C{lNYeO4GN!ecd+J5Pudelt~E{@0e#l(018U!cd95D}$ot*CDZ5t6*1t7KfZFP7o1(X_{#ZcV2XmmA{}=y1cf38`rui#SF~eX;X5&$D;fP{Jsle0 zLVm`xb_SKQ`w?Zl0R=Wu_toz(RjpIR;j+Yj>SKW0!$;;wP$6#0YhQje4Bxo4{e|6~{sBp2tl-tLg;!*b`*{wPKUL=>G&2Kfw+r$#; zjoQvecm`^;C+Eo^e(`t+MzD=9UcA^bfKJs6n5gnT`2OWdUjYh%F_5%$ zn!-WK@yiQ@?*N#@VmC`7ZSh~P4Ig{KMRCW{uXFEg#dDCO(u=lUZyg?kTnVXzgb^u? zQoa-vyoBLC_X>IOgb(zbBmG4_tHjttqfd-^7r3zlTSZ^W zs1X=qu^}J*@R((gyzmDP#Ht>b`W6Ti_jNzp1KJmYaq?W%q$#-!};$I3AvL(Qq-r7<(d|ze*RG;YlQHz&=A$;wY;C|<%akE5Y};X zP2b3Zb8ifiF}2#1D=tjsD!fG0*S6nTL4pA35a=AL|kk z;FV_vJbmx-KkEJ%+8)dOpf!}LZc+7Dq0B8elmBj8K?7Pj+33Tle2vKeEM(dxEc7se zquY8qk?cqdt(wu|^?;D`yu6w-+=jx4ZrD=|ql|re!U3d+|F2JvQ(aq4w4w?O*`SDVmT*nlps=>l zve^p#dRR{DJSbgGa|n!6of@zhzB*1-Q59J=MRj|Vg)d~nXzD%?e{IubL!{u-EX-W? z2;G)otCgO*a@CElio@Q5DT7(`wW(H37?1X7`m!*?8`%}rXf3cC%%W_jVFO`z3W{2~ zHLiiCecQ%L>kKU$=eje89FQn&AIT_9ZBa-GLR0lh7ML4B-UG41Y>QL0M5!RrO1T0lqf;GTR38AXH~L>fQT)f6bmmD1(BPaf`xO(t@py2D*7k7B+|7jb$2j$u0CnygAK0dxu$1bk% z%6}HvHE=&ORSiWojE#*cwnj2(+1d)!`EI(p&P{m7#>AM|+e3`e|Mv2fV^uKr_H~Y? zgt+)ybK1YUyRUyh3#xrv3lKDa^+Au{-{1eL3WygyvzFk04_f?B?f&z>u;KW{nMA-c zi~UR5WF2or%F4@aU0hr)NJ>^}r@en4P9OwLLn;4m3@E2nPRjxOyz)|_{_#)OMFU`N zhX?`gsCiC__eY?uZGCxK<`@A!$R)dmXQlh2=*=0=*^pr*63O=(gJt|LvYBgfbe(HX zejb$1d?A2mW`>5b%sr4Fx|gj$pC(G?b5|J-?fB4NR81lv@#30yo>Q$TQfw|k5{EzS zioN=asfFL7<}av-a$N`8*%g$=*;Tr$DpPkUpKPa-aDKi#(=RDgEhivBVpo~nV>}ay z$ViZWFwNS1FCqn0&65S7NXEhrfkiwB8kWG2{c0;nV8||UgW@NqoR+7htW`GJ=lr9r zibwELP56}%T~QUFy#OU%eHvL^AN3G9;voiO^Js*bfJ!r4GxV zzDMPW-F2+l)^r#VcUT)fdFJd{tcsnrbxdm%3vDnAvo$Ry{`w!#$4xD+JHCptc(R^(*qR*54Sp3YyT8yu6!! zr2$vU4E{rm*3n-(cka7PD)w;COYc}h-sl%}_?OA)HVORa z;Z<;VbL{cc7YqHTvEK~S|2)ww=)9K z#0xs?&M^4jpLr(*a!Mi=L4V$PB8(VB1y#Sf@r92^iHKu8%; zcY7CAZ3VjHaI4T1u#X>8Q#TooLT)VeA)qTvVDFW2mC|a!)DukD(caAceZ$iF~Le(p1cakK~uV zR}>ojgwE}+ge?dWIU6TxF==K9r3j-@61$UMr&i*T5fBoYw{Vn)yQ@$1V-kv6I5=2A zUF6D%smd&GZT$E^ihF`dUjyY^KcM!VnD$8}fSsHOZ@UFaKP2YZzl6-5>)+UTY-w%H z3u;8Ik-U_wtTPXtoa*q|H23ypLHni zyt9A4qeqjReMS7}YR?fKvl^y__oGt9Ilv!?^_PkP$7fK!ihpgpdKO&ktW&D>9RT3UEOerO@)o?8>9m5Z>zVsXKHq*A zlS6$CDO4sFHSuFb&I(vjBVW(a;W5malDz&~NGIz76tWQ4x<#dO&Eu03Zlgw_`{Na= zSZ?X>kyNxkjUNTqf33Q5_d>rCFR30-x0>*9BYl%+xC z*;4zpc`ZKJf|C1FN=%O@e5Y~Q9W}Mzj!DjWgC7rxCPuxc1Qddu;Tw_4N7symCWHe0 z%zZk2`-Cy3666-0bBC$9qYdcM;T@^~TW>x=LatDKdEYbLtZ^1wG_4Q3{Z1VHWYH7w1(Ycjdb@MKz#zI!k znV_FYgDOq=trLjE>@-~n(f5Fi>5^9RK#<%JYU;O58}?))G6?>1uvXsoKsA^bOjX)}CKMO=R*-UI5B&B6G?p4eBfQe_^GT^=48 z$#5Gj%H}Fkt z{@i)8xuKz<_Klv{aWrUyb}B4%Vg9A<302ldiN^!7?af1dY=`HMgG;tl;H9X*;s4$X zJSNjJmAVH}%Nc`7?#ajbc_4?JW(uK=b4O~+TnPW=hfRC~M@%?S)<&OMF-wv2S45(SyqTN|;Y+p&adJ-ssy0Lla^FROWT{im|B?y?ncF){jl593l z_4c%Wi_dDQ{POf@xzwQVDk^C6M4wNMa7jG^^m+4BZc#OW6{!vd`VpdoZDNlrI@~&9 z14=$;P%MHLh4A~vhO;vO6#S6ZaCZ@K)n6|;hdlH9YU@2e2sk!7)YG&duQ>x!3i6zH zh^0>LEWjVa4{>TQ?wM>lttLTY>@_?vScb_pd*1WK(9ZWNqlbfkEXdD1Yu!ydM|33` z<=n1DHZ)9m!AVpsD~CCaJmZS|AS@9l7`avsog5ukcfmD!3{jA%JCi*t`v}lqT=$2| zrK>+inHuA}^Y7ZMlox<>z4A4RB%GC#Q%}Rh8xH=x-V~RRD0NFbNIaKeUwHhEMIWUr zp0mxbH-G;8S>n5Ct&nP@PmDMEwDMB{|M*kNC;qbOiMQ;RCQB$>5+*?KLR3|!KcuC_ z4G#~$-eh28e3OzATTpPxwu{OC)XMW5!6Ew$U}FoDQPdniI=aK?eiMtaTNknOh!l!`=bNdF(kQF`|7Viy&sx+dSx!k)YMcYmlDIUwQT-W zVSQp~yH&UHX#aJfW%CEsx|*CQ9T*MSlfYHbTVZNF4_ZGTGtoZX|Z5O(dz)jV71+&7JCMjMzylXws>caBL_i^ivJ@TLf75>8~^WJSm*6 z_{{voYdCACI%5zZx%PU8O1sit44gZe)RYuA*V7_YChN6X#)8rA*B2wXrV5wU!4EtG zEkXmoi)jM%{6fiO%%QqCb(`MNM={sywTv1R8>z` zq@J*4i!TQV+opw{In{h2@%E4CTq$PBxZ;h0>#o2N-jM{DZW}fJmyb>0(;69U{gq-LKgAx^#d2Xig^g%JllXamJTbg2HOg`+gd82_}jnb0Ptl z6-D|k(Q*^R3~@)K`=Xrbs_6b8;eTqZ_U#S+XqnZa*6Px7d+EGy##-h_{)CuseG7^F zFm)dcVD287g-U}#34zab=;~Qmf!<4s(K7frO5i`4tFD9lesE#4Lm)H(PktDc{!>u6 z--|317;?B8+F$$&J>9jpMQ>e3e+uxjggq>~=2lW~FFiAtLy6wLJ&$34oP`x{ztgyO z08pSlYnZDegNdYjPU9Mv$;92*xXB#ygzVOH{gUz;h2QV~i#bdCz6BF=R#h_>$vrqS zi%9>qaGUeFb-b|!oz86*6Rm>`^#0@|RPN{+XoNtFfaWd?X!c$=UTv~fi;r-tt_)-T{E#BDPI?MmU3_mli4G;tGCRzV zIjFWiMmZ>3-LZ4QYv)2*c5a_=;=kSMWM>YPipR#q8idNuR`J8BQC5LSaHAh-Gdz z8_T=j@mEwg!4VH9!>mxUnHyUy-}hICY!??7k8UqG1IRmgs>hg#5eI&s z57#yVolT+-b>uWA#*OJfT|q&`3LI+}OVCD(+PRQPO|*BTScI;s&`oW@z`*N$`a1fG zK#X8?Y-~{T=W)le>Ep*PZJKebgDD!h!k{Dq@5+*F75uLu*}q+)|A)=6R-%@5i9_ht zJ8jUeSi!dR>+$wMYfRH5TEY5vu-K#nkPnD`q`Bk0HsmL z?Ud*r7zuHfO@H4^*;(b5*lvE{HwYEMbQALP1B*jfroPNBNz+PWK?j{nk zv5&}LliYW(C!KnqueLC7FKl^i+onAi&24#La&NZ&VbdXe9Tv1*n)K8#0jpTQQV-$IbnPgHPaRSfRT^y`t9gBJ!x@}FDryYSzPjBWR&4gZ{ zLVsw=3l6bn8Yp4$GHv{1c;x~77s}h_?#aiKRXpwOJ$nL*u@N}?IC~>F9nx1K#uHAi z+8QM_f!TJboXR6Z0qS=te9ydZmtZa4fzn}r-v=R>`xqI?6$JKZkTCNJA|(*JCb7)| zyjz#pwkjBtRu?wIQ_Ko6e2Q07r3FVkln-sTmka_81!}Yb8L&mZx4K7JwUIA{~%_QWg4eG$VjNbDB7Ci;7kC z=|>GeKq=MeOQS$No^~G{WsJO|ffTK4J7n{U(>lgND$0b#6C}VV*!MT?O$L)*eB}JF zN!%mH!Xijkr#nEeG)eBad;@(&!L!7HoI4DEd+KaLk6mDX3#&sp^*_71o>uns^i&c8 zOnfmY*gE=dy~N?lUNPY{EY@EbuWzYEgxR`tOA^i=d$$&0TF03k;T4>h6gf_U3U+Y9 z;jcum|95eh{{zYVl`L|9<#|nc8sYnw>dkU^P4n)$#`rX3r#=2DeowF_85Uc6uxP(_ zi1bF;uU3ED{eT?Y^s_tkP1(yQ5%LfHQfkes$(`R$*}|qNp7nJj>*_GP(Y>}x5s&=} z<`kGM6IX2uJT|rvNA*~#lc$;XZ_-Vd)UjWfp`LZcN&Zgs&aP8xf2!T#v8h$%rsBok z!E()dEnBEFcrUSt?T4-BVeJ)>N%uQ}r%s$@@~pao1QX<4$-iFcAA7y^v>tW(Vmmcp zFtuB+Gu>(<1Hhch6GAZy9dV~^&k%KTi%t@sX{D-=Gnlp}1)aJuZXQg9G%cj>V&}Eg zV7tyM9joy#ncU(dg9yzT9PSfBOek^(f*=c|qjOEwSf&Ge!oCrY>mTxY1UolNISY6V zdKpOec>*-nEymJE9Du`*XjHQJw*vb;*Uo)>Js5^mbLgn5g(|afqYp4blaUZe89(4T zDU|awKO>{JqfjKDWFF~97DYkFs{U?^efeM) zvePedTypPVbh32+>vFqtV`r4|5!iyMIocX%-%c_VXrMxVwt#NrMyk~+at8|yT0$KWV zE7gY^{8)Dt$;rdq%v9aI2kv!ORE}B77@{QICey~&DP8WAjXU6Yn#%ydK{uG=Xn&&z zv>8~ltF}x=bq1MgYXQ^Bt5SZ(CMTGYHXJ<6>Xu6UkTlH06C= z${z?_qF>^k7Q4N9zHN(tD>)h?RM+e@gJ-b~X|?5WpQD|n7ci&zz4^WjJ-~<{1}#%3 z6?3$LadE4Y01v*LbU})y%H8JW{C!L?@JtcrpPQrm60C95V=@n+P1`H6Fy}f!kM{a8 z&9b~1M}yqposjit!RIqC5Y3}@f*0ueDhhhy^N1nP?H|m-aHKdmdm-o^AqocV8kX&W zoMnfj?bFZpR~6IzGvze`pwF3pC%$lni1=pz)(#A63J|zy6fT%DWH^a;9 z$*AhWliNLkG~yONg7xk6g6SrvV-ju4?K0^pl#W&zmo=!ZVEZ9p6hJbp9mcg_26_i` z(mK|Ps{tX`v5&koa{`)9NC_lnLFl>o8r>=1TW%{VQ!*#j4>QQg zHa{+(l&;2@oE+B@o=Ty}58BH2%HLNm4tMg--N;}S*Mk21^6Ka}qip37rtZ*v=4A(h zERgnWh12H9yVr$5rC89x$U4rciOnFM%8V^&A1|VOM3~B>8iS`jHj4|st-94aSzO0u zp3C6Ci6>rMV|W4)xdm*nPwI9mO0ACGAZHjZkHwxtR-qq6Q6kAO?o!!` zc=z+a`4jioKSPU|FI;dbDTF8?$?P}uwO}w>wy#9)4V}M);hUkhwrJ>DxqS(AxBST;Dr|m}n3z+) zLp5$+$Ge7Ecdd7xla@pZzMm#?kZXn`7=lx9yLLaaQTMY|15?)@5--}ila-)~M6Pld zY)?_}2(GB=H7x32RLpGCl8Ck3L@9aaGg8Qf(TJXfCQBhRjMPiGP1Tbj3$w%0s5QZof*k>~cFu?_Uq4`+g2@BI<;rNODW|pv?4uTUaD) z5@<1-t+C_s^LP55B-B&PuC)EAvxghZI3rmLaOa944`k7PBw?#Qk+*1G}YCr2v*9SnrGY&tuJCukT3WLsUNeT`p|wiSC@ zKfB@mK(lJH+!mXfFB}Wp^)+=g@ek^A{*l1=GnJko+Xm)b*zQV-eBROiq!s^WMF?+R}V9vsJy(ToY_-ydiB}%wvrc;f_|O`I7*q}d zFq?{YdnYm{ic1&I`>i-Xi+ba%lQwsV#p|YtoDZoeIlvePJrZrIyJ8$fVS*viGD3i{ zHBaF$S=0i`zNePBIXwebrmLlywC?+oiHsMeFiTNy-?Gp3 znml~?@LBft2%%YK*+R^+;r+XJV{P83s%sXUDFb|trhn>`LhiLtB5ZJ*a|lK6b8p|h zGre_dzFhHI`yzW23+whK(LXB9k0&PG57ngiGIlRqfVD=qQ&8AN^5X>cS~+6#lklHm zGadKIvi;JoJ2fCQO>*o?xX1|U5n5^L6m%#tOtFfCiHoHiuw&VkxZbwyN{aRu$rO2A&=lY zO|6HllHNXb>u%2Fsi!xs(Z**(z8rkYc?q+%J@kFf5r%m2$@>h3 zni#3knTZvCsRHz*%synIO1Cc*@)RPJ^$Za3PoCYlk;2@fo}ylheOKXYfB{tREpOLL zb6lrwan=>aVblrn23bgVoT>tU4|zfXe3@&@GD_^v%c7n6k10Gk4Us6c4CuXECn7iv zIV8%0psUppLY`1cfh}3;Oi2vsS^#EqJ?YmsC_0oXttT^(g}-@*igtTOA2a_kPn7;j z2njIw7dO`z6m*o>b0uQXp#u0kPtT+65_j6qZ$KjQQ%aRILN5k?Pu$)0>Pnp>T%}*c zz&6R)Sr-vfOHSPU=R>OSOExUQflt*nZiHQh;8@(1I&yfG4%SxGI&ws5&a};ySN?*N zm<|ACNHArhanh-(>19L#-Q@R^c|-|6iwAefq5lEY#`sf)B=;D^Q{#|HoGRcbf&CCPCph zu|uo-wbZYMR!`zTh2?Y4I`8&GU&Jy77^PcTe#TcGcXxN&h(5D;1Gz2Ytj8qtQ*c%f4?Hkp)_-TTQNg6Kma$ zviAeS4GW=Ew2_Z3Ei4|b-b{qa8|83-SwVFZcDQYPnq9j2?1^m3`5bCTpTTEgN!gwP+;#s7Uv-qZJ4(qj zO?K||O%cDpZHlM(_~@%`BmA&Csc0q`FA8Q|Jggt__wPhi&|6tqCE$jJhHO_?SMMFW z&_Q!nIaQ3q!^wflcX|Ak`g7nbk$8y^Nr{jFEy)AaUf*hwht~c6vl*Z(hUr7cldPi) zmj`b(mLQK8;GD%b&|@f9r-y633?n>in0BOujg){t#mXk4-G=N9>{%Wb=~l-IRa7J} zxusY(J35}_QMh~>Jf&f2nOE!YSGnX#XhCL7&YK~>itcm%fP1!8-hh*`4fXg`c_TCv zisCafMITSqupx+nbU%HC+Nh9j+P1c~v3SveCNj&V$#8BNoxmkG%=Kb;2~u=_;b27b z0BojBw{qDdo}c0puLI0g<1Ax|ByO%q5;fPUQ#{sbpj(JU>)}XpjM#hgCRuX$^o7~y z(*b+=iIxw>%N!Gav0s`Er$t0sHXqm{!qRdmWGmI%#|$n8phK{jwjtFaNZ+K?2zh5^ zNvUYYM?Iz7Opti z3lQ;95uReq6VnDE01k8cQ0zY4_18$3cR3jOqdFK6GG6{@?w1YpASsdOd=>L6OM7$- zcud^4=91}Ke-(ieXq*4Wap!1Sqg$o8`V_SF?fT`w!^hoes(f%V9;HgI@SkbaeB*Ny zOK<U#WG(CE1$g zKWrb3+F9RIy4T#Py|LBEN5&uAdl)_gapOfBej=qPhq;s9w^(W2f3mqPvojDQR0?kP z!(7rwLPv&cS2siJlWc)ep^*tlAxw<(B|~w1=yJ`In@>r5Tym4YPXEz+e6-f zX(*k1mmPisS!sgn{sz=D6r=a;?L#`WY47(bE6+#G2W(7LQAxxLUjL4+V?6MGr^Lha z@ftM*`HT+cJ9mdbm=`(z{59;$2k;+^JT?kMOjf(kC-bd%+n=+RHnBjn00D;^FJyWZsKAtHJp%)6L&H~2xR)}$&TKC;u^GOUG zZodjNjuspfC-oUx^hRkrV zyY>DflMe<>`C~-%Zn?_P)fcbgJHBnqt$2xYGL}b)$*I}JVAc$2FYnDv1~2tAV0_yc zXZBYb>CG0tu8VJvMcrfW;(pm33?n(uRd3ga-D(7_Eyv;3bS#){Mi1fS!c8Uq_`)}h zz|M5>ehHw!yxHNCd%RsM8}`*OJvdH4%lhfwfS&IZwbE+l))A_hMeJbK?vw{4?gsaZ zO^OJmU76uG>6y9ypV^$4UbN57X+5!eqMFd?b?2tEXS+*MXOK9pVti%LrM-)oh1_Y8 zhB(BsJBI&6K(FF*I%W?|@8^0HmCgmrmp&awZ|}jebbz8x-ZxQhD1TIJ%$KAa6#zXn z8=#^NX^(gt2RqDk>P!20&4nFQpgR-T<%O;Ba!`pr=LEBm^XCR%?eL@x)3(0DIoPbi z2qlkMm>>DPUm6Vvdh+DSSW|HQY7a6SLlF>_KK;#DdG@T>h$?aRY#+9pJ9NM^u)d2r z>$hY$#$|Yd!J3XHS^6E=(vFrW4^8wkYH#Z2H%x9H)t%rUp1>CC2KmE5qbS-iT^TYJ zmip1Tw)H}uCQAq^+t@!vlds61%9aE>Z&7e3^v1h$bKozy59yJSZZm*y4C*3QYe3NW z=&Qqzw`bL=AH8tq37>v$EOw{!g$l#9v(StTR)Zfl(S;mNnUnSf0(8YYi&z&0uNMEY zG}d@&mZzHjR`h_sZs-r@dWT#(q`JY8SIT+n>*-A4@rtv`-5Sbkx7V>}zqixl2h71d z_V3?yzEI6InhxNpk~Nu|W00uv`)QZJQE5XZxbN3W$Nv0z^R|{CWy_NgHc_{g)?Y7V z-n^}5RqqmmnDf&IY<3#nIs7f&N5r2Iq~>tXWri@h?=AQGX7q7ANC2&LKz3#GWZ*2o zzA*oqhdZi~mYHsvnwRPLjk3%pTD~h-F`0es3}pZes>N5jjm8v2kc5p2xh?JNwiL_t ztC1=z-U-}j{4{A-81(8&ZW0eRM<_rKrP`iU!`WXljmFy-U-!eEhZNODE*}k>f}7G1 zcQ6LWQCnL}A+)!(LtGBap#UtPd|pba7o?@3Y#wu4HW6eDIXhGxOsVY0C&(PBU=-Cj z2fkYB9-rCP_PFUm|K_WDi@ySO$4-rqJ-MOl1JJ39pA&{|!!yVSj1E5x!`|bLm24sL z|0(6n!=YUNKR#ng$QtGxLO4+=LmM3#BviIGWQ$0OELq0Z7_t?KG6$86I-wkl3S-HP zHAxI6>0}s7mMk+gmNCmS-`lA_et-O~?{%*0``=v8HP?OL&;86Z&-;0O-tSNP^l<4A z{zkJ=QJfq|HPcM5R3{7uFLYMIy@0SSpJJ6DCUjc$Mtqld<#=0zoY{QFtm{AS>hhL< zxW~(`$w)?~So8P`KVrxrz?_2Z~wtD%^9to!WIWRiw-G~tpPL$G?^ z%{^v~VCPm>+r3`mfM@i_#@hr11p!nH<|k{96s>Kh@5j$pku-ciqw zmT?cP6KsGFzCkp;x^6HyQVlQ;#@dF)+!HH!Y+n*YFa;$`xxpu2umb+tqgC>9zfBHb zRcSc8qTz0=k_*t&V1>_^Uay2LCUk$h~l=HDYgkA3rnY8u5kZCiQA{uaz!m4hQUX zP?TuZrQ6kruLsT~4g|q!r}0#e;gq&Qo1-OJ3(C7QCypOzuf2mL?pZ0*{GM0QMdKhg?~W$_;8Hq@iTy?T3lRTj_-M#=S7 z)M!9m-JEN9^wAzk@I?aFpAl^s9MZFFZeTIsg_45p&-uAt7-`uV0pra#yT3 zSEj*tru}3UxCUW81yiH(B#vVvB&TJS#9tCUAb_1cop_vRWih#wm8niZX|%Zk0soxO z7;YHCc{2ZaXSse5%&+);sa^shtF5JZ5%Yk_X{6R-j7SxPX$bI+^lafA0(Og7;Y_@w z%|lmAr6GIHl$MrWaKpNG#B`KF50yY>;A(Z9Lz+@GX_-hf-t_)+Qu|0MPlfchjlhAR zW*06TA_@g!+6|2?k_&pKbkFnczSz;n@V ze!mfiZublhClygJJ4#^bgQh9Mr?fPlOj7Q=msQ^)_jNRa60Xg-Kf7w>#E#yt?WYbK z?HXvx+qU*5;{nFvh{YDVLwCpFu1VhR)6j(ON&h_KP;=IDPMOl0<+wVE@*BE&zEP@x zYkK3gnop3(TN+y;Eobjm#+r2%7L76Kt=5H&KKT4uDYLtR5NzNnqSKLK&W%t>96@wC z5}D@hotI!uY+dT<(=NBFhJM#7Vn*#UH}Y$r%QNhJxYGCywhf4_%iRwr>jd+!DJP|x zqGPAL$J=mI+~_ca61w{?20;*_d+2dq8r_zb>G+q^*y}(+vUM;_TSkzI+rBOPHDxP$ z#Kerb9{4~`ONg18^{YK}@SXJAfQq`}_GP*NihN=(SbXu~MKkF0U}#K2PH*BlCe5DrvJ<*a%d(5n?QmSP0slj?vliilU z9bf53QM)=O21A&vOOv41P@cmDbsVC>@Io-h)>tOMW|$$%Mng8T;TJ$`74Mn&4;R6cZB% zJ9T4bd+0+UFd{8gX6!Bd=IWv%<7l4Z7APg&j?KQ6WmWVzs>O3=XAs4 z&Iv?Bha=I@tM6v7n7>Pcqlp>SIP+7POJc%_6DZ>DDDNgbE(#g*UG)y5a$Ecx&}Ike z>^u(bEm@qLJ?X(3(gf7-JV>JK-}zEFerl2MSFns3&)hXkRr*6j9n4yKG_-j#r0Ke)Hduhc8@06OVzrnCt}qe9 zMbCfMU^?F#7O%lOOhIHOKQ4Nmt~1^jlK?fE_wDfvmyXX7&{&hbg7*s=%&v_^P{>ML zVbKtdc_bkqbj<47aE&l9MKGw6xCq%TuzV$~7Dqi8#r`(kO0ay&tBgMQKIeR`N$C}f5Rb z!#ayhEye}9UkE)2oYbz?)ThV2VR{&bu6sCftD`#p=ogQH{uFZ~?O{cIk?vKPov4?u zZ_%=bOhO*G!z%4Z`tTz+_^EDgwp}!Z(wJY`4&OJ7UKK#G^J>OQ0go661%=Ufdx?dG zyOMf5$Z7$NYPkuK>{2roA&me!9=mzd(PQj&?!mhmu2Q%H25BWg=cb>xkBP<%eS(GB zZuJq>Of6N08!fVen*4^)USRX_ve%Gp%K0rOT-a};H0s2?%loi1m)E=L*J&nZ+(g*KpXE;vk+gc|#$l_6#&6CF@wm6R z&nZtMREkp7VeZ(|no5`(^66^#5pg5uuhSA38z8L3fu(TY7Irv`INXhgEFSe3l%)LR zm^cu}hjw&!o;UUukx+|jGSSk2*N#ijt;EI6s1uW_#@gyZ16;+82Kl!G5W<`wI zb0Ss%op1O=^lY?kg0ZfwcwTQ;WDk;|$^FQ$i<=}3V`I)KA|+6lC&G7W{Zn|6e;prvz0rd3@oH=iI7}L9<;RF@~|I<&=mE z8P;)vw1CJ-xJMw}<#(cE8Fq{4hPA8TDJx1<6?naVi}|+(4Of0=CD6NhKI3h-OKna` z#Qw`*phfF;z!VC(53g;oMNgTuAC=03P|YpI9K0A9iuYE02p8HA2I}_L6t* z{9#4;#92T|_b!^TTUuJOGQn+`r?-(b0KS!(72-i4oMsL4evIZVS`KZ`113Kl$CS62 zbw*I;((wo9?3r+8&Xw#%R>>->gu@46s0E0hj&o9tH;&BlS{%LP3(1%sNt&yed-B0F z;M4UZ+-o|%5KaM61A0=C&~ebmIOrT%Q0hq@CS#p?{e@4hAWa(t-)p!?hdAgn>+J1~ z<9*<`#R{UCp{v<|m0Mr;ku7aw(8O^=LSFf~w&ym*QnSui3>~;-=37x9vtH<~AkuV$s3lcJXnM5%i-IXCe z%Mgrs2E6zLuQBn8RkJXWk67_}lKd-fZU`8rD6RnuZIZEf+6aFAI9K)f(oB)p+UG)@^iSXZnDO>l| z&(z(Yy>uso@ZDAItf2PEv)ajlYwJ3?wum1MDzMAzLz*cRQBaV!Ii~s}^k-d1E`P!e zJr2{yaKfDdbg!s!@{~^cam@nwX!5rE{}hz_(Uq~V8qS{^0ae-k|F)zokf}O$!mDv= Tu@|(ig`KdpKUQ(n>*jv|ms>+* literal 21482 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 We@tuL048~YK);-II8$!po$z15pP%ml diff --git a/icons/obj/storage/crates.dmi b/icons/obj/storage/crates.dmi index 208af28f97cf2c94d01f2d9076aa8c3136c3f192..1ce37de5c5dcd42f5529e715364a83328954bb98 100644 GIT binary patch delta 6409 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 Nl;t(#DrGE#{|BYbmcal3 delta 5206 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 diff --git a/modular_skyrat/modules/aesthetics/crates/code/crates.dm b/modular_skyrat/modules/aesthetics/crates/code/crates.dm index a09c9b63178..d7a7201a563 100644 --- a/modular_skyrat/modules/aesthetics/crates/code/crates.dm +++ b/modular_skyrat/modules/aesthetics/crates/code/crates.dm @@ -1,6 +1,9 @@ /obj/structure/closet/crate icon = 'modular_skyrat/modules/aesthetics/crates/icons/crates.dmi' +/obj/structure/closet/crate/syndicrate + icon = 'icons/obj/storage/crates.dmi' + /obj/item/delivery icon = 'modular_skyrat/modules/aesthetics/crates/icons/crates.dmi' diff --git a/modular_skyrat/modules/skyrat-uplinks/code/categories/bundles.dm b/modular_skyrat/modules/skyrat-uplinks/code/categories/bundles.dm index 5e83e8119b1..f93e915b8c1 100644 --- a/modular_skyrat/modules/skyrat-uplinks/code/categories/bundles.dm +++ b/modular_skyrat/modules/skyrat-uplinks/code/categories/bundles.dm @@ -15,38 +15,8 @@ cost = 20 purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) -/datum/uplink_item/bundles_tc/surplus_crate - name = "Surplus Crate" - desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ - but you never know. Contents are sorted to always be worth 50 TC." - item = /obj/effect/gibspawner/generic - cost = 20 - /// The contents of the surplus crate will be equal to this var in TC - var/telecrystal_count = 50 +/datum/uplink_item/bundles_tc/surplus + crate_tc_value = 50 -/datum/uplink_item/bundles_tc/surplus_crate/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source) - telecrystal_count = initial(telecrystal_count) - var/list/uplink_items = list() - var/obj/structure/closet/crate/holder_crate = new(get_turf(user)) - for(var/datum/uplink_item/item_path as anything in SStraitor.uplink_items_by_type) - var/datum/uplink_item/item = SStraitor.uplink_items_by_type[item_path] - if(item.purchasable_from & UPLINK_TRAITORS) - uplink_items += item - - while(telecrystal_count) - var/datum/uplink_item/uplink_item = pick(uplink_items) - if(!uplink_item.surplus || prob(100 - uplink_item.surplus)) - continue - if(telecrystal_count < uplink_item.cost) - continue - if(!uplink_item.item) - continue - telecrystal_count -= uplink_item.cost - new uplink_item.item(holder_crate) - -/datum/uplink_item/bundles_tc/surplus_crate/super - name = "Super Surplus Crate" - desc = "A dusty SUPER-SIZED crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \ - but you never know. Contents are sorted to always be worth 125 TC." - telecrystal_count = 125 - cost = 40 +/datum/uplink_item/bundles_tc/surplus/united + crate_tc_value = 125 diff --git a/tgstation.dme b/tgstation.dme index b22551d853d..3c54a24472e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1901,6 +1901,7 @@ #include "code\game\objects\items\granters\magic\fireball.dm" #include "code\game\objects\items\granters\magic\forcewall.dm" #include "code\game\objects\items\granters\magic\knock.dm" +#include "code\game\objects\items\granters\magic\lightning_bolt.dm" #include "code\game\objects\items\granters\magic\mime.dm" #include "code\game\objects\items\granters\magic\mindswap.dm" #include "code\game\objects\items\granters\magic\sacred_flame.dm" @@ -2125,6 +2126,7 @@ #include "code\game\objects\structures\crates_lockers\crates\critter.dm" #include "code\game\objects\structures\crates_lockers\crates\large.dm" #include "code\game\objects\structures\crates_lockers\crates\secure.dm" +#include "code\game\objects\structures\crates_lockers\crates\syndicrate.dm" #include "code\game\objects\structures\crates_lockers\crates\wooden.dm" #include "code\game\objects\structures\icemoon\cave_entrance.dm" #include "code\game\objects\structures\lavaland\geyser.dm" diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx index f432d422e39..2ae997f15eb 100644 --- a/tgui/packages/tgui/interfaces/Uplink/index.tsx +++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx @@ -19,6 +19,7 @@ type UplinkItem = { purchasable_from: number; restricted: BooleanLike; limited_stock: number; + stock_key: string; restricted_roles: string; restricted_species: string; progression_minimum: number; @@ -187,7 +188,7 @@ export class Uplink extends Component<{}, UplinkState> { const hasEnoughProgression = progression_points >= item.progression_minimum; - let stock: number | null = current_stock[item.id]; + let stock: number | null = current_stock[item.stock_key]; if (item.ref) { stock = extra_purchasable_stock[item.ref]; }