From 7687a28e7ceecea6b9e0aacdb58a2271b063f9d3 Mon Sep 17 00:00:00 2001 From: Sol N <116288367+flowercuco@users.noreply.github.com> Date: Sun, 18 Dec 2022 12:23:32 +0000 Subject: [PATCH] refreshes syndi-kits and syndicate surplus crates, introduces shared limited stock (#71869) ## About The Pull Request After all, the Syndicate loves a good throwback. ![C6O47fPhAB](https://user-images.githubusercontent.com/116288367/207737104-3d24574f-02e0-433d-8ea7-6825ca4cb970.png) This PR does a few things with the goal of reimplementing and revitalizing syndicate traitor kits and the syndicate surplus crate. Of note is that I have added in a way for limited stock items to share their limited stock. Following maintainer guidance the syndicate traitor kits have increased in price and as a result some of the lower value ones have been adjusted. I've given all active bundles current TC costs per item knowing full well they will be inaccurate eventually.
Changes as a result of my audit of syndikits ### UNCHANGED Recon, Spai, Stealthy, Screwed, Sniper, Nukie Meta, Implants Mad Scientist, Bees Lord Singuloth is also unchanged and disabled, I think that it should turn into a new supermatter themed kit maybe. outside of current scope. ### Gun Kit Replaced emag with doorjack and gave it a chameleon holster, literally moved 1 tc elsewhere ### Murderer replaced emag again, no additions its a lot of tc and Just Good ### Hacker added doorjack, otherwise unchanged ### Sabotage no changes other than adding in extra bombs it didnt have ### James Bond gave him some gadgets with the freedom implant, emp flashlight, and one x4. also a cyanide pill and deck of cards for fun ### Ninja Added in miner Jump Boots, smoke spell, and doorjack. dont just want it to be space ninja ### Dark Lord Added in new lightning bolt spell granter and made the desword default to red. probably overbudget. ### White Whale dehydrated carp added so you can ride it alongside the ones you grenade out. hard to imagine changing this ### Mr Freeze changed temperature gun to be cryo only so that i could give him the cryo thermal pistol. cold attacks only. ### 2006 Traitor doorjack.
tl;dr theyre all about 30 tc worth of shit more or less some are more but thats what rarity should be for you can only buy from one type of syndicrate per round ![QOF1WO7CC6](https://user-images.githubusercontent.com/116288367/207739417-00ae6b81-b6aa-4774-a4bb-f2d880988ff4.gif) Next up is the return of the surplus crate. Crate is generated, gives you gear **based on your progression at the time of buying the crate**, you can use it all at the start and get some chameleon kits and not a lot of dangerous weapons or wait till later. I've changed the weight on some items here and there and given weight to role and species locked items, though I will admit that latter is unimportant because I set moth lanterns to be unable to appear in these two crates. ![dreamseeker_t8abXysKqK](https://user-images.githubusercontent.com/116288367/206761978-96e2a51e-f9a5-48e4-a863-a9198fa15ea2.gif) But who cares about that your eyes instantly went to the United Surplus Crate and the United Surplus Key lets be honest. The united surplus crate is 80 TC worth of uplink items relative to your current progression when you purchase it and gives you a locked box. It **will explode if you try to break it** so be careful with it. It gives you 80 TC and costs 20 TC because it is impossible to open without key. The rub of course is that the Syndicate forbids agents from buying more than one surplus item of any kind, you need to find another traitor and make them buy you a key to open your box. Or I guess you can share the box? ![dreamseeker_ts0AZeiyfy](https://user-images.githubusercontent.com/116288367/207740388-3f688bba-5d71-48d2-8079-671bbed7e54e.gif) Regardless, if the crate is opened with any other means it doesn't spawn its contents, you need 2 traitor uplinks. Both of these items have a 30 minute timer because you don't want a crate that has 5 emp flashlights in it. You at least want one energy sword. I did a lot of code shit and changed various things to be proc based to allow for more editing and interjection of things, as I wrote in code comments making a crate thats locked to a specific set of progression just means changing the proc that generates a list of valid uplink items to check items' progression values to a specified value instead of your characters progression. Ok I think that goes over everything more or less???? ## Why It's Good For The Game I've heard that people liked these and I think they are quite fun, being able to go from "i dunno what to do as a traitor" to "ah, of course, I will become the Bombler" is a fun thing to be able to have, and people like to get a bunch of random shit in the mail. Some of it even feels free!!!!!!!!!!!!!!!!!!! Brain points go up!!! The division of procs allows for more creativity with this system than existed before as well as other possibilities for interacting with the uplink handler in funny ways. ## Changelog :cl: add: the syndicate is once again distributing syndi-kits, some now with new technology add: a fresh batch of syndicate surplus crates have been sent out, though they seem a bit lighter than before add: in an effort to encourage cooperation, a traitor can now purchase either the new United Surplus Syndicate Crate or its key, but not both add: lightning bolt book granter for wizard event and one syndie-kit bundle add: temperature gun that only makes things colder for one syndie-kit bundle code: it is now possible to have uplink items share limited stock bal: role-restricted items no longer can be delivered by the stray syndicate drop pod event /:cl: --- 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 tgstation.dme | 2 + .../packages/tgui/interfaces/Uplink/index.tsx | 3 +- 19 files changed, 390 insertions(+), 107 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 0e15654bd2f..4a824044e35 100644 --- a/code/datums/components/uplink.dm +++ b/code/datums/components/uplink.dm @@ -218,8 +218,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 cb930ecf106..ee82ea7bd6a 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 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 18243ce0393..630b02d40e9 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 abb3ad1bda7..babdede8e7d 100644 --- a/code/modules/uplink/uplink_items/device_tools.dm +++ b/code/modules/uplink/uplink_items/device_tools.dm @@ -250,6 +250,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 6cc37d185c5..fe7c6bf83f1 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/ez_clean_bundle @@ -162,6 +165,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" @@ -174,6 +178,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" @@ -193,6 +198,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" @@ -211,6 +217,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" @@ -227,7 +234,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" @@ -240,6 +246,7 @@ item = /obj/item/sbeacondrop/clownbomb cost = 15 restricted_roles = list(JOB_CLOWN) + surplus = 10 /datum/uplink_item/role_restricted/clown_bomb/New() . = ..() @@ -257,6 +264,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" @@ -268,6 +276,7 @@ item = /obj/item/mecha_parts/mecha_equipment/concealed_weapon_bay cost = 3 restricted_roles = list(JOB_ROBOTICIST, JOB_RESEARCH_DIRECTOR) + surplus = 15 /datum/uplink_item/role_restricted/his_grace name = "His Grace" @@ -279,7 +288,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 // High progression cost @@ -294,6 +303,7 @@ item = /obj/item/reagent_containers/syringe/spider_extract cost = 10 restricted_roles = list(JOB_RESEARCH_DIRECTOR, JOB_SCIENTIST, JOB_ROBOTICIST) + surplus = 10 /datum/uplink_item/role_restricted/blastcannon name = "Blast Cannon" @@ -305,3 +315,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 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 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/tgstation.dme b/tgstation.dme index ac623496ae6..2ae7e5fa739 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1823,6 +1823,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" @@ -2047,6 +2048,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]; }