From a19f63b04360453cf5354bf21beb585f1b51a9c6 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 00:50:25 -0400
Subject: [PATCH 01/29] demodular
---
code/__DEFINES/uplink.dm | 18 ++++++++++++++++++
monkestation/code/datums/components/uplink.dm | 17 -----------------
tgstation.dme | 1 -
3 files changed, 18 insertions(+), 18 deletions(-)
delete mode 100644 monkestation/code/datums/components/uplink.dm
diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm
index 78b01849dea13..02ec341882da4 100644
--- a/code/__DEFINES/uplink.dm
+++ b/code/__DEFINES/uplink.dm
@@ -23,3 +23,21 @@
/// Minimal cost for an item to be eligible for a discount
#define TRAITOR_DISCOUNT_MIN_PRICE 4
+
+#define STARTING_COMMON_CONTRACTS 3
+#define STARTING_UNCOMMON_CONTRACTS 2
+#define STARTING_RARE_CONTRACTS 1
+/datum/component/uplink/proc/become_contractor()
+ uplink_handler.uplink_flag = UPLINK_CONTRACTORS
+ uplink_handler.clear_secondaries()
+ uplink_handler.generate_objectives(list(
+ /datum/traitor_objective/target_player/kidnapping/common = STARTING_COMMON_CONTRACTS,
+ /datum/traitor_objective/target_player/kidnapping/uncommon = STARTING_UNCOMMON_CONTRACTS,
+ /datum/traitor_objective/target_player/kidnapping/rare = STARTING_RARE_CONTRACTS,
+ ))
+ for(var/item in subtypesof(/datum/contractor_item))
+ uplink_handler.contractor_market_items += new item
+
+#undef STARTING_COMMON_CONTRACTS
+#undef STARTING_UNCOMMON_CONTRACTS
+#undef STARTING_RARE_CONTRACTS
diff --git a/monkestation/code/datums/components/uplink.dm b/monkestation/code/datums/components/uplink.dm
deleted file mode 100644
index 449e264e12d67..0000000000000
--- a/monkestation/code/datums/components/uplink.dm
+++ /dev/null
@@ -1,17 +0,0 @@
-#define STARTING_COMMON_CONTRACTS 3
-#define STARTING_UNCOMMON_CONTRACTS 2
-#define STARTING_RARE_CONTRACTS 1
-/datum/component/uplink/proc/become_contractor()
- uplink_handler.uplink_flag = UPLINK_CONTRACTORS
- uplink_handler.clear_secondaries()
- uplink_handler.generate_objectives(list(
- /datum/traitor_objective/target_player/kidnapping/common = STARTING_COMMON_CONTRACTS,
- /datum/traitor_objective/target_player/kidnapping/uncommon = STARTING_UNCOMMON_CONTRACTS,
- /datum/traitor_objective/target_player/kidnapping/rare = STARTING_RARE_CONTRACTS,
- ))
- for(var/item in subtypesof(/datum/contractor_item))
- uplink_handler.contractor_market_items += new item
-
-#undef STARTING_COMMON_CONTRACTS
-#undef STARTING_UNCOMMON_CONTRACTS
-#undef STARTING_RARE_CONTRACTS
diff --git a/tgstation.dme b/tgstation.dme
index 633725e19bc45..11c83b6c2dfce 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6476,7 +6476,6 @@
#include "monkestation\code\datums\components\throw_bounce.dm"
#include "monkestation\code\datums\components\turf_checker_complex.dm"
#include "monkestation\code\datums\components\turf_healing.dm"
-#include "monkestation\code\datums\components\uplink.dm"
#include "monkestation\code\datums\components\wound_converter.dm"
#include "monkestation\code\datums\components\crafting\borg_crafting.dm"
#include "monkestation\code\datums\components\crafting\robot.dm"
From 87823b3cfba4d1cea28bb2d3f088390896cc21b2 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 01:11:40 -0400
Subject: [PATCH 02/29] I dont like contractor
---
code/__DEFINES/uplink.dm | 3 +++
code/__DEFINES/~monkestation/uplink.dm | 2 --
tgstation.dme | 1 -
3 files changed, 3 insertions(+), 3 deletions(-)
delete mode 100644 code/__DEFINES/~monkestation/uplink.dm
diff --git a/code/__DEFINES/uplink.dm b/code/__DEFINES/uplink.dm
index 02ec341882da4..f1927992cd176 100644
--- a/code/__DEFINES/uplink.dm
+++ b/code/__DEFINES/uplink.dm
@@ -9,6 +9,9 @@
/// This item is purchasable to clown ops
#define UPLINK_CLOWN_OPS (1 << 2)
+/// the uplink flag for contractors
+#define UPLINK_CONTRACTORS (1 << 6)
+
/// Progression gets turned into a user-friendly form. This is just an abstract equation that makes progression not too large.
#define DISPLAY_PROGRESSION(time) round(time/60, 0.01)
diff --git a/code/__DEFINES/~monkestation/uplink.dm b/code/__DEFINES/~monkestation/uplink.dm
deleted file mode 100644
index fc05b3f16e344..0000000000000
--- a/code/__DEFINES/~monkestation/uplink.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/// the uplink flag for contractors
-#define UPLINK_CONTRACTORS (1 << 6)
diff --git a/tgstation.dme b/tgstation.dme
index 11c83b6c2dfce..1c013c04d0dee 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -499,7 +499,6 @@
#include "code\__DEFINES\~monkestation\text.dm"
#include "code\__DEFINES\~monkestation\time.dm"
#include "code\__DEFINES\~monkestation\twitch.dm"
-#include "code\__DEFINES\~monkestation\uplink.dm"
#include "code\__DEFINES\~monkestation\virology.dm"
#include "code\__DEFINES\~monkestation\vv.dm"
#include "code\__DEFINES\~monkestation\dcs\signals\signals_atom.dm"
From 5dbf36432b7a83f3868baf0fabcf5d1313b9b414 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 02:59:17 -0400
Subject: [PATCH 03/29] https://github.com/tgstation/tgstation/pull/91969
---
code/modules/antagonists/traitor/datum_traitor.dm | 2 +-
code/modules/uplink/uplink_items.dm | 11 ++++++++++-
code/modules/uplink/uplink_items/device_tools.dm | 1 +
code/modules/uplink/uplink_items/explosive.dm | 2 ++
4 files changed, 14 insertions(+), 2 deletions(-)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 519e7c808a940..82e21cececb30 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -105,7 +105,7 @@
if((uplink_handler.assigned_role in item.restricted_roles) || (uplink_handler.assigned_species in item.restricted_species))
uplink_items += item
continue
- uplink_handler.extra_purchasable += create_uplink_sales(rand(uplink_sales_min, uplink_sales_max), /datum/uplink_category/discounts, 5, uplink_items) //monkestation edit: from 1 stock to 5
+ uplink_handler.extra_purchasable += create_uplink_sales(rand(uplink_sales_min, uplink_sales_max), /datum/uplink_category/discounts, -1, uplink_items)
if(give_objectives)
forge_traitor_objectives()
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 3d2db3d05a893..b777bac7b0c68 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -30,7 +30,16 @@
"Use only as directed.",
"16% sales tax will be charged for orders originating within Space Nebraska.",
)
- uplink_item.limited_stock = limited_stock
+ //We want to limit the purchase amount of some items without adjusting the pricing.
+ if (uplink_item.limited_discount_stock > 0) {
+ uplink_item.limited_stock = uplink_item.limited_discount_stock
+ }
+
+ //if stock limited is passed into the function, we'll override everything
+ if (limited_stock > 0) {
+ uplink_item.limited_stock = limited_stock
+ }
+
if(uplink_item.cost >= 20) //Tough love for nuke ops
discount *= 0.5
uplink_item.stock_key = WEAKREF(uplink_item)
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index f90b02bfcd515..d4a8d14e99427 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -258,6 +258,7 @@
progression_minimum = 30 MINUTES
item = /obj/item/powersink
cost = 11
+ limited_discount_stock = 1
/datum/uplink_item/device_tools/syndicate_contacts
name = "Polarized Contact Lenses"
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index 095b2e4cea65a..d17b204b38f2f 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -85,6 +85,7 @@
progression_minimum = 30 MINUTES
item = /obj/item/sbeacondrop/emp
cost = 7
+ limited_discount_stock = 4
/datum/uplink_item/explosives/syndicate_bomb/emp/New()
..()
@@ -102,6 +103,7 @@
progression_minimum = 30 MINUTES
item = /obj/item/sbeacondrop/bomb
cost = 11
+ limited_discount_stock = 4
/datum/uplink_item/explosives/syndicate_bomb/New()
. = ..()
From b221d8b9ef27e2bf6ee462b316f608ff3654d39e Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 03:15:57 -0400
Subject: [PATCH 04/29] demodularization
semiporthttps://github.com/tgstation/tgstation/pull/91969
---
.../game/objects/items/storage/uplink_kits.dm | 98 ++++++++++
code/modules/uplink/uplink_items.dm | 11 +-
.../modules/uplink/uplink_items/ammunition.dm | 18 ++
code/modules/uplink/uplink_items/badass.dm | 26 +++
code/modules/uplink/uplink_items/bundle.dm | 102 ++++++++++
.../uplink/uplink_items/device_tools.dm | 40 +++-
code/modules/uplink/uplink_items/explosive.dm | 80 +++++++-
.../modules/uplink/uplink_items/gadgets.dm | 0
code/modules/uplink/uplink_items/job.dm | 174 ++++++++++++++++++
code/modules/uplink/uplink_items/species.dm | 31 ++++
.../uplink/uplink_items/stealthy_tools.dm | 7 +-
code/modules/uplink/uplink_items/suits.dm | 8 +
.../code/modules/uplink/uplink_items.dm | 30 ---
.../modules/uplink/uplink_items/badass.dm | 25 ---
.../modules/uplink/uplink_items/bundles.dm | 97 ----------
.../uplink/uplink_items/device_tools.dm | 38 ----
.../modules/uplink/uplink_items/explosive.dm | 77 --------
.../code/modules/uplink/uplink_items/job.dm | 173 -----------------
.../modules/uplink/uplink_items/species.dm | 31 ----
.../uplink/uplink_items/stealthy_tools.dm | 8 -
.../code/modules/uplink/uplink_items/suits.dm | 7 -
.../code/modules/uplink/uplink_kits.dm | 97 ----------
tgstation.dme | 12 +-
23 files changed, 578 insertions(+), 612 deletions(-)
rename monkestation/code/modules/uplink/uplink_items/misc.dm => code/modules/uplink/uplink_items/gadgets.dm (100%)
delete mode 100644 monkestation/code/modules/uplink/uplink_items.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/badass.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/bundles.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/device_tools.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/explosive.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/job.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/species.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/stealthy_tools.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_items/suits.dm
delete mode 100644 monkestation/code/modules/uplink/uplink_kits.dm
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index a6d0bd96724c3..9d762249f7eed 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -20,6 +20,12 @@
#define KIT_MR_FREEZE "mr_freeze"
#define KIT_TRAITOR_2006 "ancient"
+#define KIT_AMATEUR_ASSASSIN "amateur_assassin"
+#define KIT_INTERN_INFILTRATOR "intern_infiltrator"
+#define KIT_BEGINNER_BOMBER "beginner_bomber"
+#define KIT_STARTER_SABOTEUR "starter_saboteur"
+#define KIT_ROOKIE_RAIDER "rookie_raider"
+
/// last audited december 2022
/obj/item/storage/box/syndicate
@@ -277,6 +283,92 @@
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/syndie_kit/mini_kit
+ name = "Syndicate Mini-Kit"
+ desc = "A tiny, suspicious-looking box. Contains a starter set of basic tools."
+ icon_state = "mini_syndiebox"
+ illustration = null
+
+/obj/item/paper/selfdestruct/mini_kit_guide
+ name = "Syndicate Field Note (Mini-Kit)"
+ desc = "A hastily written note. Seems important though, that's why it's red."
+ color = "#b94030"
+ armed = TRUE
+ default_raw_text ={"
+
Syndicate Operative Field Note
+
+
NOTICE: This message will self-incinerate in 20 seconds after being opened.
+
+
Kit Contents: Each Mini-Kit contains a randomized loadout. Open the box to inspect your tools and adapt accordingly.
+
+
Using Your Uplink: Your telecrystal uplink is your lifeline. Spend wisely. This kit saves TC to give you flexibility. Keep it locked and hidden when not in use.
+
+
Disposal: Once you've taken all items from the kit, hold the empty box and press Z (or your 'Activate Item in Hand' key). The box will fold into an inconspicuous piece of cardboard.
+
+
This note will auto-incinerate momentarily.
+
+
Failure is not an option. Succeed or die trying.
+ "}
+
+/obj/item/paper/selfdestruct/mini_kit_guide/Initialize(mapload)
+ . = ..()
+ update_appearance()
+
+/obj/item/storage/box/syndie_kit/mini_kit/PopulateContents()
+ new /obj/item/paper/selfdestruct/mini_kit_guide(src)
+ switch (pick_weight(list(
+ KIT_AMATEUR_ASSASSIN = 3,
+ KIT_INTERN_INFILTRATOR = 3,
+ KIT_BEGINNER_BOMBER = 2,
+ KIT_STARTER_SABOTEUR = 3,
+ KIT_ROOKIE_RAIDER = 2
+ )))
+ if(KIT_AMATEUR_ASSASSIN)
+ new /obj/item/storage/pill_bottle/syndicate/poison(src)
+ new /obj/item/pen/sleepy(src)
+ new /obj/item/clothing/gloves/latex/nitrile(src)
+ new /obj/item/soap/syndie(src)
+ new /obj/item/switchblade(src)
+ new /obj/item/restraints/handcuffs(src)
+ new /obj/item/stack/sticky_tape(src)
+ new /obj/item/clothing/glasses/blindfold(src)
+ new /obj/item/clothing/glasses/thermal(src)
+
+ if(KIT_INTERN_INFILTRATOR)
+ new /obj/item/storage/toolbox/syndicate(src)
+ new /obj/item/storage/box/syndie_kit/chameleon(src)
+ new /obj/item/encryptionkey/syndicate(src)
+ new /obj/item/card/id/advanced/chameleon(src)
+ new /obj/item/implanter/uplink(src)
+
+ if(KIT_BEGINNER_BOMBER)
+ new /obj/item/grenade/syndieminibomb(src)
+ new /obj/item/grenade/c4/x4(src)
+ new /obj/item/grenade/c4/x4(src)
+ new /obj/item/grenade/c4(src)
+ new /obj/item/grenade/c4(src)
+ new /obj/item/grenade/c4(src)
+ new /obj/item/grenade/frag(src)
+ new /obj/item/grenade/frag(src)
+
+ if(KIT_STARTER_SABOTEUR)
+ new /obj/item/card/emag(src)
+ new /obj/item/jammer(src)
+ new /obj/item/crowbar/power/syndicate(src)
+ new /obj/item/clothing/mask/balaclava(src)
+ new /obj/item/multitool/ai_detect(src)
+
+ if(KIT_ROOKIE_RAIDER)
+ new /obj/item/gun/ballistic/automatic/pistol/sol/evil(src)
+ new /obj/item/storage/box/syndie_kit/weapons_auth(src)
+ new /obj/item/ammo_box/magazine/c35sol_pistol(src)
+ new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
+ new /obj/item/clothing/shoes/chameleon/noslip(src)
+ new /obj/item/clothing/suit/armor/vest(src)
+ new /obj/item/ammo_box/c35sol(src)
+
+ return
+
/obj/item/storage/box/syndicate/contract_kit
name = "Contract Kit"
desc = "Supplied to Syndicate contractors."
@@ -817,3 +909,9 @@
#undef KIT_BEES
#undef KIT_MR_FREEZE
#undef KIT_TRAITOR_2006
+
+#undef KIT_AMATEUR_ASSASSIN
+#undef KIT_INTERN_INFILTRATOR
+#undef KIT_BEGINNER_BOMBER
+#undef KIT_STARTER_SABOTEUR
+#undef KIT_ROOKIE_RAIDER
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index b777bac7b0c68..3d2db3d05a893 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -30,16 +30,7 @@
"Use only as directed.",
"16% sales tax will be charged for orders originating within Space Nebraska.",
)
- //We want to limit the purchase amount of some items without adjusting the pricing.
- if (uplink_item.limited_discount_stock > 0) {
- uplink_item.limited_stock = uplink_item.limited_discount_stock
- }
-
- //if stock limited is passed into the function, we'll override everything
- if (limited_stock > 0) {
- uplink_item.limited_stock = limited_stock
- }
-
+ uplink_item.limited_stock = limited_stock
if(uplink_item.cost >= 20) //Tough love for nuke ops
discount *= 0.5
uplink_item.stock_key = WEAKREF(uplink_item)
diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm
index 43f9fa540d4e2..b46ce1487ea28 100644
--- a/code/modules/uplink/uplink_items/ammunition.dm
+++ b/code/modules/uplink/uplink_items/ammunition.dm
@@ -80,3 +80,21 @@
desc = "60 rounds of 12.7x70mm for use with the Devitt Mk3 light tank."
item = /obj/item/mecha_ammo/makeshift/lighttankmg
cost = 2
+
+/datum/uplink_item/ammo/trickshot
+ name = "Trickshot Shell Box"
+ desc = "A box with 10 trickshot shells, capable of bouncing up to five times, they are made for the most talented trickshooters around."
+ cost = 3
+ item = /obj/item/storage/box/trickshot
+
+/datum/uplink_item/ammo/uraniumpen
+ name = "Uranium Penetrator Box"
+ desc = "A box with 10 uranium penetrators, capable to penetrating walls and objects, but not people. Works best with thermals!"
+ cost = 3
+ item = /obj/item/storage/box/uraniumpen
+
+/datum/uplink_item/ammo/beeshot
+ name = "Beeshot Box"
+ desc = "A box with 10 Beeshot shells. Creates very angry bees upon impact. Not as strong as buckshot."
+ cost = 3
+ item = /obj/item/storage/box/beeshot
diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm
index 6ad30063be2d2..83102e2f425e1 100644
--- a/code/modules/uplink/uplink_items/badass.dm
+++ b/code/modules/uplink/uplink_items/badass.dm
@@ -114,3 +114,29 @@
desc = "This pair of top notch combat boots comes fit with a reinforced toe in which is slotted a tiny kinetic penetrator made from tungsten composite. Wearing 'em lets you kick people in the groin with MAXIMUM pain."
item = /obj/item/clothing/shoes/combat/nutcracker
cost = 8
+
+/datum/uplink_item/badass/costumes/syndimaid
+ name = "Syndicate Maid Outfit"
+ desc = "A box containing a 'tactical' and 'practical' maid outfit. We uh... found this... laying around... you sure you want this thing?"
+ item = /obj/item/storage/box/syndimaid
+ cost = 4
+ purchasable_from = ALL
+ limited_stock = 1
+ cant_discount = TRUE
+
+/datum/uplink_item/badass/costumes/syndibunny
+ name = "Syndicate Bunny Suit"
+ desc = "A box containing a bunny suit and tailcoat. Due to a catastrophic typo we recieved a specialized syndicate bunny suit instead of a battle suit. Just get rid of it."
+ item = /obj/item/storage/box/syndibunny
+ cost = 4
+ purchasable_from = ALL
+ limited_stock = 1
+ cant_discount = TRUE
+
+/datum/uplink_item/badass/bad_time_stickers
+ name = "Leaked Sticker Pack"
+ desc = "A box of leaked stickers from the NT production line."
+ item = /obj/item/storage/box/monkestation_stickers/bad_time
+ cost = 1
+ purchasable_from = ALL
+ cant_discount = TRUE
diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm
index 2de8888d0bebf..615968730ce80 100644
--- a/code/modules/uplink/uplink_items/bundle.dm
+++ b/code/modules/uplink/uplink_items/bundle.dm
@@ -178,3 +178,105 @@
progression_minimum = 30 MINUTES
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
stock_key = UPLINK_SHARED_STOCK_SURPLUS
+
+/datum/uplink_item/bundles_tc/contract_kit
+ name = "Contractor Bundle"
+ desc = "A box containing everything you need to take contracts from the Syndicate. Kidnap people and drop them off at specified locations for rewards in the form of Telecrystals \
+ (Usable in the provided uplink) and Contractor Points. Can not be bought if you have taken any secondary objectives."
+ item = /obj/item/storage/box/syndie_kit/contract_kit
+ cost = 20
+ purchasable_from = UPLINK_TRAITORS
+
+/datum/uplink_item/bundles_tc/contract_kit/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
+ if(length(handler.active_objectives) || !handler.can_take_objectives || !handler.has_objectives)
+ return FALSE
+
+ for(var/datum/traitor_objective/objective in handler.completed_objectives)
+ if(objective.objective_state != OBJECTIVE_STATE_INVALID)
+ return FALSE
+
+ return TRUE
+
+/datum/uplink_item/bundles_tc/contract_kit/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
+ . = ..()
+ var/datum/component/uplink/our_uplink = source.GetComponent(/datum/component/uplink)
+ if(uplink_handler && our_uplink)
+ our_uplink.become_contractor()
+
+///Override for any unique checks for specific items, by default returns TRUE
+/datum/uplink_item/proc/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
+ return TRUE
+
+/datum/uplink_item/bundles_tc/surplus/lootbox
+ name = "Syndicate Lootbox Crate"
+ desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \
+ With their all new kit, codenamed 'scam' the syndicate attempted to extract the energy of the die of fate to \
+ make a loot-box style system but failed, so instead just fake their randomness using ook's evil twin brother to sniff out the items to shove in it. \
+ Item price not guaranteed. Can contain normally unobtainable items. Purchasing this will prevent you from purchasing any non-random item. \
+ Cannot be purchased if you have already bought another item."
+
+/datum/uplink_item/bundles_tc/surplus/lootbox/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
+ //we dont acually have the var that makes this get checked so do it manually
+ if(length(handler.purchase_log.purchase_log) > 0)
+ return FALSE
+ return TRUE
+
+/datum/uplink_item/bundles_tc/surplus/lootbox/spawn_item(spawn_path, mob/user, datum/uplink_handler/handler, atom/movable/source)
+ crate_tc_value = rand(1,20) * 5 // randomise how much in TC it gives, from 5 to 100 TC
+
+ if(crate_tc_value == 5) //horrible luck, welcome to gambling
+ crate_tc_value = 0
+ to_chat(user, span_warning("You feel an overwhelming sense of pride and accomplishment."))
+
+ if(crate_tc_value == 100) // Jackpot, how lucky
+ crate_tc_value *= 2
+ print_command_report("Congratulations to [user] for being the [rand(2, 9)]th lucky winner of the syndicate lottery! \
+ Dread Admiral Sabertooth has authorised the beaming of your special equipment immediately! Happy hunting operative.",
+ "Syndicate Gambling Division High Command", TRUE)
+ if(ishuman(user) && !(locate(/obj/item/implant/weapons_auth) in user)) //jackpot winners dont have to find firing pins for any guns they get
+ var/obj/item/implant/weapons_auth/auth = new
+ auth.implant(user)
+ to_chat(user, span_notice("You feel as though the syndicate have given you the ability to use weapons beyond your normal access level."))
+
+ var/obj/structure/closet/crate/surplus_crate = new crate_type()
+ // quick safety check
+ if(!istype(surplus_crate))
+ CRASH("crate_type is not a crate")
+
+ var/list/possible_items = generate_possible_items(user, handler, TRUE)
+ // again safety check, if things fucked up badly we give them back their cost and return
+ if(!possible_items || !length(possible_items))
+ handler.telecrystals += cost
+ to_chat(user, span_warning("You get the feeling something went wrong and that you should inform syndicate command."))
+ qdel(surplus_crate)
+ CRASH("lootbox crate failed to generate possible items")
+
+ fill_crate(surplus_crate, possible_items)
+
+ // unlike other chests, lets give them the chest with STYLE by droppodding in a STYLIZED pod
+ podspawn(list(
+ "target" = get_turf(user),
+ "style" = STYLE_SYNDICATE,
+ "spawn" = surplus_crate,
+ ))
+
+ // lock everything except random entries, once you start gambling you cannot stop
+ handler.add_locked_entries(subtypesof(/datum/uplink_item) - /datum/uplink_item/bundles_tc/random)
+
+ // return the source, this is so the round-end uplink section shows how many TC the traitor spent on us (20TC) and a radio icon. Instead of 0 TC and a blank one
+ return source
+
+//pain
+///Check if we should ignore handler locked_entries or not
+/datum/uplink_item/bundles_tc/random/proc/check_ignore_locked(datum/uplink_handler/handler)
+ return (length(handler.locked_entries) == (length(subtypesof(/datum/uplink_item)) - 1)) && !(src.type in handler.locked_entries)
+
+
+/datum/uplink_item/bundles_tc/syndicate_mini_kit
+ name = "Syndicate Mini-Kit"
+ desc = "A small, budget-friendly kit for new operatives. Contains a selection of basic tools. \
+ The Syndicate provides only one Mini-Kit per agent."
+ item = /obj/item/storage/box/syndie_kit/mini_kit
+ cost = 10
+ stock_key = UPLINK_SHARED_STOCK_KITS
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index d4a8d14e99427..0815cd7a735a7 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -258,7 +258,6 @@
progression_minimum = 30 MINUTES
item = /obj/item/powersink
cost = 11
- limited_discount_stock = 1
/datum/uplink_item/device_tools/syndicate_contacts
name = "Polarized Contact Lenses"
@@ -272,3 +271,42 @@
desc = "High-tech rope, a refined hook structure, the peak of climbing technology. Only useful for climbing up holes, provided the operation site has any."
item = /obj/item/climbing_hook/syndicate
cost = 1
+
+/datum/uplink_item/device_tools/tram_remote
+ surplus = 40
+
+/datum/uplink_item/device_tools/rad_laser
+ surplus = 40
+
+/datum/uplink_item/device_tools/hacked_linked_surgery
+ name = "Syndicate Surgery Implant"
+ desc = "A powerful brain implant, capable of uploading perfect, forbidden surgical knowledge to its users mind, \
+ allowing them to do just about any surgery, anywhere, without making any (unintentional) mistakes. \
+ Comes with a syndicate autosurgeon for immediate self-application."
+ cost = 12
+ item = /obj/item/autosurgeon/syndicate/hacked_linked_surgery
+ surplus = 50
+
+/datum/uplink_item/device_tools/compressionkit
+ name = "Bluespace Compression Kit"
+ desc = "A modified version of a BSRPED that can be used to reduce the size of most items while retaining their original functions! \
+ Does not work on storage items. \
+ Recharge using bluespace crystals. \
+ Comes with 5 charges."
+ item = /obj/item/compression_kit
+ cost = 4
+
+/datum/uplink_item/device_tools/polyglot_voicebox
+ name = "Syndicate Polyglot Voicebox"
+ desc = "A polyglot voicebox which, after replacing the user's tongue will allow them to emulate \
+ the tongue of any species. \
+ WARNING: The polyglot voicebox does not allow you to speak additional languages"
+ cost = 2
+ item = /obj/item/autosurgeon/syndicate/polyglot_voicebox
+ surplus = 25
+
+/datum/uplink_item/device_tools/autosurgeon
+ name = "Syndicate Autosurgeon"
+ desc = "A multi-use autosurgeon for implanting whatever you want into yourself. Rip that station apart and make it part of you."
+ item = /obj/item/autosurgeon/syndicate
+ cost = 5
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index d17b204b38f2f..56c0f1d249dd6 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -85,7 +85,6 @@
progression_minimum = 30 MINUTES
item = /obj/item/sbeacondrop/emp
cost = 7
- limited_discount_stock = 4
/datum/uplink_item/explosives/syndicate_bomb/emp/New()
..()
@@ -103,8 +102,85 @@
progression_minimum = 30 MINUTES
item = /obj/item/sbeacondrop/bomb
cost = 11
- limited_discount_stock = 4
/datum/uplink_item/explosives/syndicate_bomb/New()
. = ..()
desc = replacetext(desc, "%MIN_BOMB_TIMER", SYNDIEBOMB_MIN_TIMER_SECONDS)
+
+/datum/uplink_item/explosives/soap_clusterbang
+ surplus = 60
+
+/datum/uplink_item/explosives/explosive_flash
+ name = "Explosive Flash"
+ desc = "A fake, hollowed out flash that holds a small bombcore. It explodes on usage with a satisfying click."
+ cost = 2
+ item = /obj/item/assembly/flash/explosive
+
+/datum/uplink_item/explosives/door_charge
+ name = "Door Charge"
+ desc = "A small charge that can be rigged to a door, causing it to explode when the handle is moved. Tiny OS and microphone installed for taunting your victims."
+ cost = 5
+ item = /obj/item/traitor_machine_trapper/door_charge
+
+/datum/uplink_item/explosives/china_lake
+ name = "China Lake 40mm Grenade Launcher"
+ desc = "A robust, 4 round pump-action grenade launcher. Comes preloaded with three 40mm HE shells."
+ cost = 10
+ item = /obj/item/gun/ballistic/shotgun/china_lake
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/grenade_launcher
+ name = "40mm Grenade Launcher"
+ desc = "A single round break-operation grenade launcher. Comes preloaded with a 40mm HE shell."
+ cost = 5
+ item = /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm
+ name = "Box of 40mm HE Grenades"
+ desc = "A box of four 40mm HE grenades. For use with a grenade launcher."
+ cost = 5
+ item = /obj/item/storage/fancy/a40mm_box
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm/rubber
+ name = "Box of 40mm Rubber Slug Shells"
+ desc = "A box of four 40mm rubber slug shells. For use with a grenade launcher."
+ cost = 2
+ item = /obj/item/storage/fancy/a40mm_box/rubber
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm/incendiary
+ name = "Box of 40mm Incendiary Grenades"
+ desc = "A box of four 40mm incendiary grenades. For use with a grenade launcher."
+ cost = 5
+ item = /obj/item/storage/fancy/a40mm_box/incendiary
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm/smoke
+ name = "Box of 40mm Smoke Grenades"
+ desc = "A box of four 40mm smoke grenades. For use with a grenade launcher."
+ cost = 1
+ item = /obj/item/storage/fancy/a40mm_box/smoke
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm/stun
+ name = "Box of 40mm Stun Grenades"
+ desc = "A box of four 40mm stun grenades. For use with a grenade launcher."
+ cost = 3
+ item = /obj/item/storage/fancy/a40mm_box/stun
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm/hedp
+ name = "Box of 40mm HEDP Grenades"
+ desc = "A box of four 40mm HEDP grenades. For use with a grenade launcher."
+ cost = 5
+ item = /obj/item/storage/fancy/a40mm_box/hedp
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/explosives/a40mm/frag
+ name = "Box of 40mm Fragmentation Grenades"
+ desc = "A box of four 40mm fragmentation grenades. For use with a grenade launcher."
+ cost = 5
+ item = /obj/item/storage/fancy/a40mm_box/frag
+ purchasable_from = ~UPLINK_CLOWN_OPS
diff --git a/monkestation/code/modules/uplink/uplink_items/misc.dm b/code/modules/uplink/uplink_items/gadgets.dm
similarity index 100%
rename from monkestation/code/modules/uplink/uplink_items/misc.dm
rename to code/modules/uplink/uplink_items/gadgets.dm
diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm
index 89dbc030eb49f..4415efdfe20bd 100644
--- a/code/modules/uplink/uplink_items/job.dm
+++ b/code/modules/uplink/uplink_items/job.dm
@@ -356,3 +356,177 @@
limited_stock = 3
restricted_roles = list(JOB_ASSISTANT, JOB_MIME, JOB_CLOWN)
refundable = FALSE
+
+/datum/uplink_item/role_restricted/minibible
+ name = "Miniature Bible"
+ desc = "We understand it can be difficult to carry out some of our missions. Here is some spiritual counsel in a small package."
+ progression_minimum = 5 MINUTES
+ cost = 1
+ item = /obj/item/book/bible/mini
+ restricted_roles = list(JOB_CHAPLAIN, JOB_CLOWN)
+
+/datum/uplink_item/role_restricted/reverse_bear_trap
+ surplus = 60
+
+/datum/uplink_item/role_restricted/modified_syringe_gun
+ surplus = 50
+
+/datum/uplink_item/role_restricted/clonekit
+ name = "Clone Army Kit"
+ desc = "Everything you need for a clone army, armaments not included."
+ progression_minimum = 5 MINUTES
+ cost = 20
+ item = /obj/item/storage/box/clonearmy
+ restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) // Experimental cloners were traditionally bought by cargo.
+
+///I know this probably isn't the right place to put it, but I don't know where I should put it, and I can move it later.
+/obj/item/disk/clonearmy
+ name = "DNA data disk" //Cunning disguise.
+ var/objective = ""
+ icon_state = "datadisk0"
+
+/obj/item/disk/clonearmy/Initialize(mapload)
+ . = ..()
+ icon_state = "datadisk[rand(0,7)]"
+ add_overlay("datadisk_gene")
+
+/obj/item/disk/clonearmy/attack_self(mob/user)
+ var/targName = tgui_input_text(user, "Enter a directive for the evil clones.", "Clone Directive Entry", objective, CONFIG_GET(number/max_law_len), TRUE)
+ if(!targName)
+ return
+ if(is_ic_filtered(targName))
+ to_chat(user, span_warning("Error: Directive contains invalid text."))
+ return
+ var/list/soft_filter_result = is_soft_ooc_filtered(targName)
+ if(soft_filter_result)
+ if(tgui_alert(user,"Your directive contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes")
+ return
+ message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for a clone directive. Directive: \"[html_encode(targName)]\"")
+ log_admin_private("[key_name(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for a clone directive. Directive: \"[targName]\"")
+ objective = targName
+ ..()
+
+/obj/item/disk/clonearmy/attack()
+ return
+
+/obj/item/disk/clonearmy/afterattack(atom/target, mob/user, proximity)
+ . = ..()
+ var/atom/A = target
+ if(!proximity)
+ return
+ if(!istype(A, /obj/machinery/clonepod/experimental))
+ return
+ to_chat(user, "You upload the directive to the experimental cloner.")
+ var/obj/machinery/clonepod/experimental/pod = target
+ pod.custom_objective = objective
+ pod.RefreshParts()
+ pod.locked = TRUE // The pod shouldn't be eligible for cloner event.
+
+/datum/uplink_item/role_restricted/syndicate_plant_gene
+ name = "Catalytic Inhibitor Serum Plant Data Disk"
+ desc = "This plant data disk contains the genetic blueprint for the Catalytic Inhibitor Serum gene.\
+ enabling plants to produce a serum that halts all internal chemical reactions"
+ item = /obj/item/disk/plantgene/syndicate
+ cost = 17
+ restricted_roles = list(JOB_BOTANIST)
+
+/datum/uplink_item/role_restricted/power_gloves
+ name = "Power Gloves"
+ desc = "Are the Engineers on your station creating too much power? Use this to set them in their place. T-ray scanner not included"
+ cost = 8
+ item = /obj/item/clothing/gloves/color/yellow/power_gloves
+ restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN)
+
+/datum/uplink_item/role_restricted/tunnel_khans
+ name = "Tunnel Khans Care Package"
+ desc = "A... questionably packed box written on with gray crayon. It's really hard to read. We hope that your assistant mind can comprehend it better than us."
+ cost = 13
+ item = /obj/item/storage/box/syndie_kit/khan_package
+ restricted_roles = list(JOB_ASSISTANT)
+
+/datum/uplink_item/role_restricted/acid_spit
+ name = "Refined Matter Eater Mutator"
+ desc = "A mutator containing the recently refined \"Matter Eater\" mutation from clowns. \
+ The strain was refined to only cause 20 genetic instability instead of 40 in an undisclosed amount of time. \
+ Be cautious as it can be detected using genetic scanners and is curable with mutadone."
+ cost = 3
+ item = /obj/item/dnainjector/syndicate_matter_eater
+ restricted_roles = list(JOB_GENETICIST)
+
+/datum/uplink_item/role_restricted/acid_spit
+ name = "Acid Spit Mutator"
+ desc = "A mutator containing the recently extracted \"acid spit\" mutation from xenomorphs. \
+ The strain was refined over many months until the point of only causing 20 genetic instability instead of 70. \
+ Be cautious as it can be detected using genetic scanners and is curable with mutadone."
+ cost = 8
+ item = /obj/item/dnainjector/acid_spit
+ restricted_roles = list(JOB_GENETICIST)
+
+/datum/uplink_item/role_restricted/xray
+ name = "Refined X-Ray Vision Mutator Box"
+ desc = "A mutator containing a refined X-ray mutation allowing you to see through walls at the cost of eye health. \
+ The strain was refined over many weeks until the point of only causing 40 genetic instability instead of 60. \
+ Be cautious as it can be detected using genetic scanners and is curable with mutadone. \
+ This package also includes 3 oculine medipens to negate the negative effects of the mutation upon your body."
+ cost = 8
+ item = /obj/item/storage/box/syndie_kit/xray
+ restricted_roles = list(JOB_GENETICIST)
+
+/datum/uplink_item/role_restricted/laser_eyes
+ name = "Stabilized Laser Eyes Mutator Box"
+ desc = "A mutator containing the recently discovered \"laser eyes\" mutation. \
+ The strain was refined over 2 minutes in elite syndicate laboratories until the point of only causing 40 genetic instability instead of 60. \
+ Be cautious as it can be detected using genetic scanners and is curable with mutadone. \
+ This package also includes 3 oculine medipens to negate the negative effects of the mutation upon your body."
+ cost = 8
+ item = /obj/item/storage/box/syndie_kit/laser_eyes
+ restricted_roles = list(JOB_GENETICIST)
+
+/datum/uplink_item/role_restricted/corrupted_mender
+ name = "Corrupted Mending Touch Mutator"
+ desc = "A mutator containing a \"Mending Touch\" mutation, we have used special methods in order to make it able to smite anyone. \
+ However this mending touch mutation causes 50 instability instead of 35 due to high complexity. \
+ Be cautious as it can be detected using genetic scanners and is curable with mutadone."
+ cost = 12
+ item = /obj/item/dnainjector/syndicate_mending_touch
+ restricted_roles = list(JOB_GENETICIST)
+
+/datum/uplink_item/role_restricted/stabilizer_chromosome
+ name = "Stabilizer Chromosome"
+ desc = "A chromosome that reduces mutation instability by 20%. Whilst able to be found in people it is rather rare at a 6% chance. \
+ For this reason we are offering you this rare opportunity of a lifetime for a low cost."
+ cost = 2
+ surplus = 0
+ item = /obj/item/chromosome/stabilizer
+ restricted_roles = list(JOB_GENETICIST)
+ illegal_tech = FALSE
+
+/datum/uplink_item/role_restricted/synchronizer_chromosome
+ name = "Synchronizer Chromosome"
+ desc = "A chromosome that reduces downsides of negative effects on mutations by 50% or hides visual effects of certain mutations. \
+ Due to not being easily mass-producable we are offering this chromosome to you agent for increased damage to the station."
+ cost = 1
+ surplus = 0
+ item = /obj/item/chromosome/synchronizer
+ restricted_roles = list(JOB_GENETICIST)
+ illegal_tech = FALSE
+
+/datum/uplink_item/role_restricted/power_chromosome
+ name = "Power Chromosome"
+ desc = "A chromosome that increases mutation power by 50% or unlocks more powerful effects for specific mutations. \
+ Due to not being easily mass-producable we are offering this chromosome to you agent for increased damage to the station."
+ cost = 1
+ surplus = 0
+ item = /obj/item/chromosome/power
+ restricted_roles = list(JOB_GENETICIST)
+ illegal_tech = FALSE
+
+/datum/uplink_item/role_restricted/energy_chromosome
+ name = "Energetic Chromosome"
+ desc = "A chromosome that reduces action mutation cooldowns by 50% or increases chances of random mutation effects. \
+ Due to not being easily mass-producable we are offering this chromosome to you agent for increased damage to the station."
+ cost = 1
+ surplus = 0
+ item = /obj/item/chromosome/energy
+ restricted_roles = list(JOB_GENETICIST)
+ illegal_tech = FALSE
diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm
index fa42da23dc9b4..6fb0015acf5ac 100644
--- a/code/modules/uplink/uplink_items/species.dm
+++ b/code/modules/uplink/uplink_items/species.dm
@@ -15,4 +15,35 @@
restricted_species = list(SPECIES_MOTH)
surplus = 80 //monkestation edit: from 0 to 80
+/datum/uplink_item/species_restricted/mothletgrenade //Monkestation addition
+ name = "Mothlet Grenade"
+ desc = "A experimental greande comprised of a Co2 canister, and dozens of tiny brainwashed moths (dubbed mothlets) \
+ these little guys have been brainwashed and taught how to undo virtually all kinds of clothing and equipment \
+ along with how to disarm people. We sadly couldn't figure out how to teach them friend from foe so just be careful \
+ handling them, as they wont hesitate to pants you and the captain at the same time."
+ item = /obj/item/grenade/frag/mothlet
+ cost = 4
+ restricted_species = list(SPECIES_MOTH)
+ surplus = 0
+
+/datum/uplink_item/species_restricted/monkey_barrel
+ name = "Angry Monkey Barrel"
+ desc = "Expert Syndicate Scientists put pissed a couple monkeys off and put them in a barrel. It isn't that complicated, but it's very effective"
+ cost = 7
+ item = /obj/item/grenade/monkey_barrel
+ restricted_species = list(SPECIES_MONKEY, SPECIES_SIMIAN)
+
+/datum/uplink_item/species_restricted/monkey_ball
+ name = "Monkey Ball"
+ desc = "Stolen experimental MonkeTech designed to bring a monkey's speed to dangerous levels."
+ cost = 12
+ item = /obj/vehicle/ridden/monkey_ball
+ restricted_species = list(SPECIES_MONKEY, SPECIES_SIMIAN)
+
+/datum/uplink_item/species_restricted/tribal_claw_scroll
+ name = "Silver-Scale Scroll"
+ desc = "A scroll with ancient heritage. It can teach the user the secrets of Tribal Claw, an offensive martial art reliant on one's claws and tail."
+ cost = 10
+ item = /obj/item/book/granter/martial/tribal_claw
+ restricted_species = list(SPECIES_LIZARD)
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index c5aeda563e4b7..9737aeef164b9 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -25,17 +25,14 @@
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
cost = 1
-//MONKESTATION REMOVAL START moved to monkestation/code/modules/uplink/uplink_items/stealthy_tools.dm
-/*
/datum/uplink_item/stealthy_tools/chameleon
name = "Chameleon Kit"
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
- Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately."
+ Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately. \
+ The chameleon technology can be locked and unlocked using a multitool, hiding it from others."
item = /obj/item/storage/box/syndie_kit/chameleon
cost = 2
purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume
-*/
-//MONKESTATION REMOVAL END
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/suits.dm
index 50a287ae50bb6..0575fb610633e 100644
--- a/code/modules/uplink/uplink_items/suits.dm
+++ b/code/modules/uplink/uplink_items/suits.dm
@@ -88,3 +88,11 @@
desc = "A MODsuit module that grants to the user Optical camouflage and the ability to overload light sources to recharge suit power."
item = /obj/item/mod/module/stealth/wraith
cost = 2
+
+/datum/uplink_item/suits/syndie_armor
+ name = "Syndicate Body armor"
+ desc = "A highly compact set of body armor with two inner slots for small items.\
+ It comes with chameleon features."
+ item = /obj/item/clothing/suit/chameleon/syndie_armor
+ cost = 4
+ purchasable_from = ALL
diff --git a/monkestation/code/modules/uplink/uplink_items.dm b/monkestation/code/modules/uplink/uplink_items.dm
deleted file mode 100644
index fb237f6f01361..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-///Override for any unique checks for specific items, by default returns TRUE
-/datum/uplink_item/proc/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
- return TRUE
-
-/datum/uplink_item/dangerous/lever_action
- name = "Pump action Shotgun"
- desc = "A classic sturdy and robust shotgun. Fits five shells."
- item = /obj/item/gun/ballistic/shotgun/lethal
- cost = 7
-
-//NEW TOT SHOTGUN AMMO BOXES
-/datum/uplink_item/ammo/trickshot
- name = "Trickshot Shell Box"
- desc = "A box with 10 trickshot shells, capable of bouncing up to five times, they are made for the most talented trickshooters around."
- cost = 3
- item = /obj/item/storage/box/trickshot
-
-/datum/uplink_item/ammo/uraniumpen
- name = "Uranium Penetrator Box"
- desc = "A box with 10 uranium penetrators, capable to penetrating walls and objects, but not people. Works best with thermals!"
- cost = 3
- item = /obj/item/storage/box/uraniumpen
-
-/datum/uplink_item/ammo/beeshot
- name = "Beeshot Box"
- desc = "A box with 10 Beeshot shells. Creates very angry bees upon impact. Not as strong as buckshot."
- cost = 3
- item = /obj/item/storage/box/beeshot
-
-//END OF NEW TOT SHOTGUN AMMO
diff --git a/monkestation/code/modules/uplink/uplink_items/badass.dm b/monkestation/code/modules/uplink/uplink_items/badass.dm
deleted file mode 100644
index 4dbca914bf05c..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/badass.dm
+++ /dev/null
@@ -1,25 +0,0 @@
-/datum/uplink_item/badass/costumes/syndimaid
- name = "Syndicate Maid Outfit"
- desc = "A box containing a 'tactical' and 'practical' maid outfit. We uh... found this... laying around... you sure you want this thing?"
- item = /obj/item/storage/box/syndimaid
- cost = 4
- purchasable_from = ALL
- limited_stock = 1
- cant_discount = TRUE
-
-/datum/uplink_item/badass/costumes/syndibunny
- name = "Syndicate Bunny Suit"
- desc = "A box containing a bunny suit and tailcoat. Due to a catastrophic typo we recieved a specialized syndicate bunny suit instead of a battle suit. Just get rid of it."
- item = /obj/item/storage/box/syndibunny
- cost = 4
- purchasable_from = ALL
- limited_stock = 1
- cant_discount = TRUE
-
-/datum/uplink_item/badass/bad_time_stickers
- name = "Leaked Sticker Pack"
- desc = "A box of leaked stickers from the NT production line."
- item = /obj/item/storage/box/monkestation_stickers/bad_time
- cost = 1
- purchasable_from = ALL
- cant_discount = TRUE
diff --git a/monkestation/code/modules/uplink/uplink_items/bundles.dm b/monkestation/code/modules/uplink/uplink_items/bundles.dm
deleted file mode 100644
index a131836c644be..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/bundles.dm
+++ /dev/null
@@ -1,97 +0,0 @@
-/datum/uplink_item/bundles_tc/contract_kit
- name = "Contractor Bundle"
- desc = "A box containing everything you need to take contracts from the Syndicate. Kidnap people and drop them off at specified locations for rewards in the form of Telecrystals \
- (Usable in the provided uplink) and Contractor Points. Can not be bought if you have taken any secondary objectives."
- item = /obj/item/storage/box/syndie_kit/contract_kit
- cost = 20
- purchasable_from = UPLINK_TRAITORS
-
-/datum/uplink_item/bundles_tc/contract_kit/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
- if(length(handler.active_objectives) || !handler.can_take_objectives || !handler.has_objectives)
- return FALSE
-
- for(var/datum/traitor_objective/objective in handler.completed_objectives)
- if(objective.objective_state != OBJECTIVE_STATE_INVALID)
- return FALSE
-
- return TRUE
-
-/datum/uplink_item/bundles_tc/contract_kit/purchase(mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
- . = ..()
- var/datum/component/uplink/our_uplink = source.GetComponent(/datum/component/uplink)
- if(uplink_handler && our_uplink)
- our_uplink.become_contractor()
-
-/datum/uplink_item/bundles_tc/surplus/lootbox
- name = "Syndicate Lootbox Crate"
- desc = "A dusty crate from the back of the Syndicate warehouse. Rumored to contain a valuable assortment of items, \
- With their all new kit, codenamed 'scam' the syndicate attempted to extract the energy of the die of fate to \
- make a loot-box style system but failed, so instead just fake their randomness using ook's evil twin brother to sniff out the items to shove in it. \
- Item price not guaranteed. Can contain normally unobtainable items. Purchasing this will prevent you from purchasing any non-random item. \
- Cannot be purchased if you have already bought another item."
-
-/datum/uplink_item/bundles_tc/surplus/lootbox/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
- //we dont acually have the var that makes this get checked so do it manually
- if(length(handler.purchase_log.purchase_log) > 0)
- return FALSE
- return TRUE
-
-/datum/uplink_item/bundles_tc/surplus/lootbox/spawn_item(spawn_path, mob/user, datum/uplink_handler/handler, atom/movable/source)
- crate_tc_value = rand(1,20) * 5 // randomise how much in TC it gives, from 5 to 100 TC
-
- if(crate_tc_value == 5) //horrible luck, welcome to gambling
- crate_tc_value = 0
- to_chat(user, span_warning("You feel an overwhelming sense of pride and accomplishment."))
-
- if(crate_tc_value == 100) // Jackpot, how lucky
- crate_tc_value *= 2
- print_command_report("Congratulations to [user] for being the [rand(2, 9)]th lucky winner of the syndicate lottery! \
- Dread Admiral Sabertooth has authorised the beaming of your special equipment immediately! Happy hunting operative.",
- "Syndicate Gambling Division High Command", TRUE)
- if(ishuman(user) && !(locate(/obj/item/implant/weapons_auth) in user)) //jackpot winners dont have to find firing pins for any guns they get
- var/obj/item/implant/weapons_auth/auth = new
- auth.implant(user)
- to_chat(user, span_notice("You feel as though the syndicate have given you the ability to use weapons beyond your normal access level."))
-
- var/obj/structure/closet/crate/surplus_crate = new crate_type()
- // quick safety check
- if(!istype(surplus_crate))
- CRASH("crate_type is not a crate")
-
- var/list/possible_items = generate_possible_items(user, handler, TRUE)
- // again safety check, if things fucked up badly we give them back their cost and return
- if(!possible_items || !length(possible_items))
- handler.telecrystals += cost
- to_chat(user, span_warning("You get the feeling something went wrong and that you should inform syndicate command."))
- qdel(surplus_crate)
- CRASH("lootbox crate failed to generate possible items")
-
- fill_crate(surplus_crate, possible_items)
-
- // unlike other chests, lets give them the chest with STYLE by droppodding in a STYLIZED pod
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = surplus_crate,
- ))
-
- // lock everything except random entries, once you start gambling you cannot stop
- handler.add_locked_entries(subtypesof(/datum/uplink_item) - /datum/uplink_item/bundles_tc/random)
-
- // return the source, this is so the round-end uplink section shows how many TC the traitor spent on us (20TC) and a radio icon. Instead of 0 TC and a blank one
- return source
-
-//pain
-///Check if we should ignore handler locked_entries or not
-/datum/uplink_item/bundles_tc/random/proc/check_ignore_locked(datum/uplink_handler/handler)
- return (length(handler.locked_entries) == (length(subtypesof(/datum/uplink_item)) - 1)) && !(src.type in handler.locked_entries)
-
-
-/datum/uplink_item/bundles_tc/syndicate_mini_kit
- name = "Syndicate Mini-Kit"
- desc = "A small, budget-friendly kit for new operatives. Contains a selection of basic tools. \
- The Syndicate provides only one Mini-Kit per agent."
- item = /obj/item/storage/box/syndie_kit/mini_kit
- cost = 10
- stock_key = UPLINK_SHARED_STOCK_KITS
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/monkestation/code/modules/uplink/uplink_items/device_tools.dm b/monkestation/code/modules/uplink/uplink_items/device_tools.dm
deleted file mode 100644
index 4075a66e79956..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/device_tools.dm
+++ /dev/null
@@ -1,38 +0,0 @@
-/datum/uplink_item/device_tools/tram_remote
- surplus = 40
-
-/datum/uplink_item/device_tools/rad_laser
- surplus = 40
-
-/datum/uplink_item/device_tools/hacked_linked_surgery
- name = "Syndicate Surgery Implant"
- desc = "A powerful brain implant, capable of uploading perfect, forbidden surgical knowledge to its users mind, \
- allowing them to do just about any surgery, anywhere, without making any (unintentional) mistakes. \
- Comes with a syndicate autosurgeon for immediate self-application."
- cost = 12
- item = /obj/item/autosurgeon/syndicate/hacked_linked_surgery
- surplus = 50
-
-/datum/uplink_item/device_tools/compressionkit
- name = "Bluespace Compression Kit"
- desc = "A modified version of a BSRPED that can be used to reduce the size of most items while retaining their original functions! \
- Does not work on storage items. \
- Recharge using bluespace crystals. \
- Comes with 5 charges."
- item = /obj/item/compression_kit
- cost = 4
-
-/datum/uplink_item/device_tools/polyglot_voicebox
- name = "Syndicate Polyglot Voicebox"
- desc = "A polyglot voicebox which, after replacing the user's tongue will allow them to emulate \
- the tongue of any species. \
- WARNING: The polyglot voicebox does not allow you to speak additional languages"
- cost = 2
- item = /obj/item/autosurgeon/syndicate/polyglot_voicebox
- surplus = 25
-
-/datum/uplink_item/device_tools/autosurgeon
- name = "Syndicate Autosurgeon"
- desc = "A multi-use autosurgeon for implanting whatever you want into yourself. Rip that station apart and make it part of you."
- item = /obj/item/autosurgeon/syndicate
- cost = 5
diff --git a/monkestation/code/modules/uplink/uplink_items/explosive.dm b/monkestation/code/modules/uplink/uplink_items/explosive.dm
deleted file mode 100644
index a2b7f4fa3487a..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/explosive.dm
+++ /dev/null
@@ -1,77 +0,0 @@
-/datum/uplink_item/explosives/soap_clusterbang
- surplus = 60
-
-/datum/uplink_item/explosives/explosive_flash
- name = "Explosive Flash"
- desc = "A fake, hollowed out flash that holds a small bombcore. It explodes on usage with a satisfying click."
- cost = 2
- item = /obj/item/assembly/flash/explosive
-
-/datum/uplink_item/explosives/door_charge
- name = "Door Charge"
- desc = "A small charge that can be rigged to a door, causing it to explode when the handle is moved. Tiny OS and microphone installed for taunting your victims."
- cost = 5
- item = /obj/item/traitor_machine_trapper/door_charge
-
-/datum/uplink_item/explosives/china_lake
- name = "China Lake 40mm Grenade Launcher"
- desc = "A robust, 4 round pump-action grenade launcher. Comes preloaded with three 40mm HE shells."
- cost = 10
- item = /obj/item/gun/ballistic/shotgun/china_lake
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/grenade_launcher
- name = "40mm Grenade Launcher"
- desc = "A single round break-operation grenade launcher. Comes preloaded with a 40mm HE shell."
- cost = 5
- item = /obj/item/gun/ballistic/revolver/grenadelauncher/unrestricted
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm
- name = "Box of 40mm HE Grenades"
- desc = "A box of four 40mm HE grenades. For use with a grenade launcher."
- cost = 5
- item = /obj/item/storage/fancy/a40mm_box
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm/rubber
- name = "Box of 40mm Rubber Slug Shells"
- desc = "A box of four 40mm rubber slug shells. For use with a grenade launcher."
- cost = 2
- item = /obj/item/storage/fancy/a40mm_box/rubber
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm/incendiary
- name = "Box of 40mm Incendiary Grenades"
- desc = "A box of four 40mm incendiary grenades. For use with a grenade launcher."
- cost = 5
- item = /obj/item/storage/fancy/a40mm_box/incendiary
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm/smoke
- name = "Box of 40mm Smoke Grenades"
- desc = "A box of four 40mm smoke grenades. For use with a grenade launcher."
- cost = 1
- item = /obj/item/storage/fancy/a40mm_box/smoke
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm/stun
- name = "Box of 40mm Stun Grenades"
- desc = "A box of four 40mm stun grenades. For use with a grenade launcher."
- cost = 3
- item = /obj/item/storage/fancy/a40mm_box/stun
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm/hedp
- name = "Box of 40mm HEDP Grenades"
- desc = "A box of four 40mm HEDP grenades. For use with a grenade launcher."
- cost = 5
- item = /obj/item/storage/fancy/a40mm_box/hedp
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/explosives/a40mm/frag
- name = "Box of 40mm Fragmentation Grenades"
- desc = "A box of four 40mm fragmentation grenades. For use with a grenade launcher."
- cost = 5
- item = /obj/item/storage/fancy/a40mm_box/frag
- purchasable_from = ~UPLINK_CLOWN_OPS
diff --git a/monkestation/code/modules/uplink/uplink_items/job.dm b/monkestation/code/modules/uplink/uplink_items/job.dm
deleted file mode 100644
index 478d4ea6bbdc9..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/job.dm
+++ /dev/null
@@ -1,173 +0,0 @@
-/datum/uplink_item/role_restricted/minibible
- name = "Miniature Bible"
- desc = "We understand it can be difficult to carry out some of our missions. Here is some spiritual counsel in a small package."
- progression_minimum = 5 MINUTES
- cost = 1
- item = /obj/item/book/bible/mini
- restricted_roles = list(JOB_CHAPLAIN, JOB_CLOWN)
-
-/datum/uplink_item/role_restricted/reverse_bear_trap
- surplus = 60
-
-/datum/uplink_item/role_restricted/modified_syringe_gun
- surplus = 50
-
-/datum/uplink_item/role_restricted/clonekit
- name = "Clone Army Kit"
- desc = "Everything you need for a clone army, armaments not included."
- progression_minimum = 5 MINUTES
- cost = 20
- item = /obj/item/storage/box/clonearmy
- restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) // Experimental cloners were traditionally bought by cargo.
-
-///I know this probably isn't the right place to put it, but I don't know where I should put it, and I can move it later.
-/obj/item/disk/clonearmy
- name = "DNA data disk" //Cunning disguise.
- var/objective = ""
- icon_state = "datadisk0"
-
-/obj/item/disk/clonearmy/Initialize(mapload)
- . = ..()
- icon_state = "datadisk[rand(0,7)]"
- add_overlay("datadisk_gene")
-
-/obj/item/disk/clonearmy/attack_self(mob/user)
- var/targName = tgui_input_text(user, "Enter a directive for the evil clones.", "Clone Directive Entry", objective, CONFIG_GET(number/max_law_len), TRUE)
- if(!targName)
- return
- if(is_ic_filtered(targName))
- to_chat(user, span_warning("Error: Directive contains invalid text."))
- return
- var/list/soft_filter_result = is_soft_ooc_filtered(targName)
- if(soft_filter_result)
- if(tgui_alert(user,"Your directive contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes")
- return
- message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for a clone directive. Directive: \"[html_encode(targName)]\"")
- log_admin_private("[key_name(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for a clone directive. Directive: \"[targName]\"")
- objective = targName
- ..()
-
-/obj/item/disk/clonearmy/attack()
- return
-
-/obj/item/disk/clonearmy/afterattack(atom/target, mob/user, proximity)
- . = ..()
- var/atom/A = target
- if(!proximity)
- return
- if(!istype(A, /obj/machinery/clonepod/experimental))
- return
- to_chat(user, "You upload the directive to the experimental cloner.")
- var/obj/machinery/clonepod/experimental/pod = target
- pod.custom_objective = objective
- pod.RefreshParts()
- pod.locked = TRUE // The pod shouldn't be eligible for cloner event.
-
-/datum/uplink_item/role_restricted/syndicate_plant_gene
- name = "Catalytic Inhibitor Serum Plant Data Disk"
- desc = "This plant data disk contains the genetic blueprint for the Catalytic Inhibitor Serum gene.\
- enabling plants to produce a serum that halts all internal chemical reactions"
- item = /obj/item/disk/plantgene/syndicate
- cost = 17
- restricted_roles = list(JOB_BOTANIST)
-
-/datum/uplink_item/role_restricted/power_gloves
- name = "Power Gloves"
- desc = "Are the Engineers on your station creating too much power? Use this to set them in their place. T-ray scanner not included"
- cost = 8
- item = /obj/item/clothing/gloves/color/yellow/power_gloves
- restricted_roles = list(JOB_STATION_ENGINEER, JOB_CHIEF_ENGINEER, JOB_ATMOSPHERIC_TECHNICIAN)
-
-/datum/uplink_item/role_restricted/tunnel_khans
- name = "Tunnel Khans Care Package"
- desc = "A... questionably packed box written on with gray crayon. It's really hard to read. We hope that your assistant mind can comprehend it better than us."
- cost = 13
- item = /obj/item/storage/box/syndie_kit/khan_package
- restricted_roles = list(JOB_ASSISTANT)
-
-/datum/uplink_item/role_restricted/acid_spit
- name = "Refined Matter Eater Mutator"
- desc = "A mutator containing the recently refined \"Matter Eater\" mutation from clowns. \
- The strain was refined to only cause 20 genetic instability instead of 40 in an undisclosed amount of time. \
- Be cautious as it can be detected using genetic scanners and is curable with mutadone."
- cost = 3
- item = /obj/item/dnainjector/syndicate_matter_eater
- restricted_roles = list(JOB_GENETICIST)
-
-/datum/uplink_item/role_restricted/acid_spit
- name = "Acid Spit Mutator"
- desc = "A mutator containing the recently extracted \"acid spit\" mutation from xenomorphs. \
- The strain was refined over many months until the point of only causing 20 genetic instability instead of 70. \
- Be cautious as it can be detected using genetic scanners and is curable with mutadone."
- cost = 8
- item = /obj/item/dnainjector/acid_spit
- restricted_roles = list(JOB_GENETICIST)
-
-/datum/uplink_item/role_restricted/xray
- name = "Refined X-Ray Vision Mutator Box"
- desc = "A mutator containing a refined X-ray mutation allowing you to see through walls at the cost of eye health. \
- The strain was refined over many weeks until the point of only causing 40 genetic instability instead of 60. \
- Be cautious as it can be detected using genetic scanners and is curable with mutadone. \
- This package also includes 3 oculine medipens to negate the negative effects of the mutation upon your body."
- cost = 8
- item = /obj/item/storage/box/syndie_kit/xray
- restricted_roles = list(JOB_GENETICIST)
-
-/datum/uplink_item/role_restricted/laser_eyes
- name = "Stabilized Laser Eyes Mutator Box"
- desc = "A mutator containing the recently discovered \"laser eyes\" mutation. \
- The strain was refined over 2 minutes in elite syndicate laboratories until the point of only causing 40 genetic instability instead of 60. \
- Be cautious as it can be detected using genetic scanners and is curable with mutadone. \
- This package also includes 3 oculine medipens to negate the negative effects of the mutation upon your body."
- cost = 8
- item = /obj/item/storage/box/syndie_kit/laser_eyes
- restricted_roles = list(JOB_GENETICIST)
-
-/datum/uplink_item/role_restricted/corrupted_mender
- name = "Corrupted Mending Touch Mutator"
- desc = "A mutator containing a \"Mending Touch\" mutation, we have used special methods in order to make it able to smite anyone. \
- However this mending touch mutation causes 50 instability instead of 35 due to high complexity. \
- Be cautious as it can be detected using genetic scanners and is curable with mutadone."
- cost = 12
- item = /obj/item/dnainjector/syndicate_mending_touch
- restricted_roles = list(JOB_GENETICIST)
-
-/datum/uplink_item/role_restricted/stabilizer_chromosome
- name = "Stabilizer Chromosome"
- desc = "A chromosome that reduces mutation instability by 20%. Whilst able to be found in people it is rather rare at a 6% chance. \
- For this reason we are offering you this rare opportunity of a lifetime for a low cost."
- cost = 2
- surplus = 0
- item = /obj/item/chromosome/stabilizer
- restricted_roles = list(JOB_GENETICIST)
- illegal_tech = FALSE
-
-/datum/uplink_item/role_restricted/synchronizer_chromosome
- name = "Synchronizer Chromosome"
- desc = "A chromosome that reduces downsides of negative effects on mutations by 50% or hides visual effects of certain mutations. \
- Due to not being easily mass-producable we are offering this chromosome to you agent for increased damage to the station."
- cost = 1
- surplus = 0
- item = /obj/item/chromosome/synchronizer
- restricted_roles = list(JOB_GENETICIST)
- illegal_tech = FALSE
-
-/datum/uplink_item/role_restricted/power_chromosome
- name = "Power Chromosome"
- desc = "A chromosome that increases mutation power by 50% or unlocks more powerful effects for specific mutations. \
- Due to not being easily mass-producable we are offering this chromosome to you agent for increased damage to the station."
- cost = 1
- surplus = 0
- item = /obj/item/chromosome/power
- restricted_roles = list(JOB_GENETICIST)
- illegal_tech = FALSE
-
-/datum/uplink_item/role_restricted/energy_chromosome
- name = "Energetic Chromosome"
- desc = "A chromosome that reduces action mutation cooldowns by 50% or increases chances of random mutation effects. \
- Due to not being easily mass-producable we are offering this chromosome to you agent for increased damage to the station."
- cost = 1
- surplus = 0
- item = /obj/item/chromosome/energy
- restricted_roles = list(JOB_GENETICIST)
- illegal_tech = FALSE
diff --git a/monkestation/code/modules/uplink/uplink_items/species.dm b/monkestation/code/modules/uplink/uplink_items/species.dm
deleted file mode 100644
index 3655c256a5566..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/species.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/datum/uplink_item/species_restricted/mothletgrenade //Monkestation addition
- name = "Mothlet Grenade"
- desc = "A experimental greande comprised of a Co2 canister, and dozens of tiny brainwashed moths (dubbed mothlets) \
- these little guys have been brainwashed and taught how to undo virtually all kinds of clothing and equipment \
- along with how to disarm people. We sadly couldn't figure out how to teach them friend from foe so just be careful \
- handling them, as they wont hesitate to pants you and the captain at the same time."
- item = /obj/item/grenade/frag/mothlet
- cost = 4
- restricted_species = list(SPECIES_MOTH)
- surplus = 0
-
-/datum/uplink_item/species_restricted/monkey_barrel
- name = "Angry Monkey Barrel"
- desc = "Expert Syndicate Scientists put pissed a couple monkeys off and put them in a barrel. It isn't that complicated, but it's very effective"
- cost = 7
- item = /obj/item/grenade/monkey_barrel
- restricted_species = list(SPECIES_MONKEY, SPECIES_SIMIAN)
-
-/datum/uplink_item/species_restricted/monkey_ball
- name = "Monkey Ball"
- desc = "Stolen experimental MonkeTech designed to bring a monkey's speed to dangerous levels."
- cost = 12
- item = /obj/vehicle/ridden/monkey_ball
- restricted_species = list(SPECIES_MONKEY, SPECIES_SIMIAN)
-
-/datum/uplink_item/species_restricted/tribal_claw_scroll
- name = "Silver-Scale Scroll"
- desc = "A scroll with ancient heritage. It can teach the user the secrets of Tribal Claw, an offensive martial art reliant on one's claws and tail."
- cost = 10
- item = /obj/item/book/granter/martial/tribal_claw
- restricted_species = list(SPECIES_LIZARD)
diff --git a/monkestation/code/modules/uplink/uplink_items/stealthy_tools.dm b/monkestation/code/modules/uplink/uplink_items/stealthy_tools.dm
deleted file mode 100644
index 70b20258e6046..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ /dev/null
@@ -1,8 +0,0 @@
-/datum/uplink_item/stealthy_tools/chameleon
- name = "Chameleon Kit"
- desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
- Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately. \
- The chameleon technology can be locked and unlocked using a multitool, hiding it from others."
- item = /obj/item/storage/box/syndie_kit/chameleon
- cost = 2
- purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume
diff --git a/monkestation/code/modules/uplink/uplink_items/suits.dm b/monkestation/code/modules/uplink/uplink_items/suits.dm
deleted file mode 100644
index eb4ecd48ef4aa..0000000000000
--- a/monkestation/code/modules/uplink/uplink_items/suits.dm
+++ /dev/null
@@ -1,7 +0,0 @@
-/datum/uplink_item/suits/syndie_armor
- name = "Syndicate Body armor"
- desc = "A highly compact set of body armor with two inner slots for small items.\
- It comes with chameleon features."
- item = /obj/item/clothing/suit/chameleon/syndie_armor
- cost = 4
- purchasable_from = ALL
diff --git a/monkestation/code/modules/uplink/uplink_kits.dm b/monkestation/code/modules/uplink/uplink_kits.dm
deleted file mode 100644
index 2161d91c95cfa..0000000000000
--- a/monkestation/code/modules/uplink/uplink_kits.dm
+++ /dev/null
@@ -1,97 +0,0 @@
-#define KIT_AMATEUR_ASSASSIN "amateur_assassin"
-#define KIT_INTERN_INFILTRATOR "intern_infiltrator"
-#define KIT_BEGINNER_BOMBER "beginner_bomber"
-#define KIT_STARTER_SABOTEUR "starter_saboteur"
-#define KIT_ROOKIE_RAIDER "rookie_raider"
-
-/obj/item/storage/box/syndie_kit/mini_kit
- name = "Syndicate Mini-Kit"
- desc = "A tiny, suspicious-looking box. Contains a starter set of basic tools."
- icon_state = "mini_syndiebox"
- illustration = null
-
-/obj/item/paper/selfdestruct/mini_kit_guide
- name = "Syndicate Field Note (Mini-Kit)"
- desc = "A hastily written note. Seems important though, that's why it's red."
- color = "#b94030"
- armed = TRUE
- default_raw_text ={"
-
Syndicate Operative Field Note
-
-
NOTICE: This message will self-incinerate in 20 seconds after being opened.
-
-
Kit Contents: Each Mini-Kit contains a randomized loadout. Open the box to inspect your tools and adapt accordingly.
-
-
Using Your Uplink: Your telecrystal uplink is your lifeline. Spend wisely. This kit saves TC to give you flexibility. Keep it locked and hidden when not in use.
-
-
Disposal: Once you've taken all items from the kit, hold the empty box and press Z (or your 'Activate Item in Hand' key). The box will fold into an inconspicuous piece of cardboard.
-
-
This note will auto-incinerate momentarily.
-
-
Failure is not an option. Succeed or die trying.
- "}
-
-/obj/item/paper/selfdestruct/mini_kit_guide/Initialize(mapload)
- . = ..()
- update_appearance()
-
-/obj/item/storage/box/syndie_kit/mini_kit/PopulateContents()
- new /obj/item/paper/selfdestruct/mini_kit_guide(src)
- switch (pick_weight(list(
- KIT_AMATEUR_ASSASSIN = 3,
- KIT_INTERN_INFILTRATOR = 3,
- KIT_BEGINNER_BOMBER = 2,
- KIT_STARTER_SABOTEUR = 3,
- KIT_ROOKIE_RAIDER = 2
- )))
- if(KIT_AMATEUR_ASSASSIN)
- new /obj/item/storage/pill_bottle/syndicate/poison(src)
- new /obj/item/pen/sleepy(src)
- new /obj/item/clothing/gloves/latex/nitrile(src)
- new /obj/item/soap/syndie(src)
- new /obj/item/switchblade(src)
- new /obj/item/restraints/handcuffs(src)
- new /obj/item/stack/sticky_tape(src)
- new /obj/item/clothing/glasses/blindfold(src)
- new /obj/item/clothing/glasses/thermal(src)
-
- if(KIT_INTERN_INFILTRATOR)
- new /obj/item/storage/toolbox/syndicate(src)
- new /obj/item/storage/box/syndie_kit/chameleon(src)
- new /obj/item/encryptionkey/syndicate(src)
- new /obj/item/card/id/advanced/chameleon(src)
- new /obj/item/implanter/uplink(src)
-
- if(KIT_BEGINNER_BOMBER)
- new /obj/item/grenade/syndieminibomb(src)
- new /obj/item/grenade/c4/x4(src)
- new /obj/item/grenade/c4/x4(src)
- new /obj/item/grenade/c4(src)
- new /obj/item/grenade/c4(src)
- new /obj/item/grenade/c4(src)
- new /obj/item/grenade/frag(src)
- new /obj/item/grenade/frag(src)
-
- if(KIT_STARTER_SABOTEUR)
- new /obj/item/card/emag(src)
- new /obj/item/jammer(src)
- new /obj/item/crowbar/power/syndicate(src)
- new /obj/item/clothing/mask/balaclava(src)
- new /obj/item/multitool/ai_detect(src)
-
- if(KIT_ROOKIE_RAIDER)
- new /obj/item/gun/ballistic/automatic/pistol/sol/evil(src)
- new /obj/item/storage/box/syndie_kit/weapons_auth(src)
- new /obj/item/ammo_box/magazine/c35sol_pistol(src)
- new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
- new /obj/item/clothing/shoes/chameleon/noslip(src)
- new /obj/item/clothing/suit/armor/vest(src)
- new /obj/item/ammo_box/c35sol(src)
-
- return
-
-#undef KIT_AMATEUR_ASSASSIN
-#undef KIT_INTERN_INFILTRATOR
-#undef KIT_BEGINNER_BOMBER
-#undef KIT_STARTER_SABOTEUR
-#undef KIT_ROOKIE_RAIDER
diff --git a/tgstation.dme b/tgstation.dme
index 1c013c04d0dee..55d1f53baa443 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6150,6 +6150,7 @@
#include "code\modules\uplink\uplink_items\dangerous.dm"
#include "code\modules\uplink\uplink_items\device_tools.dm"
#include "code\modules\uplink\uplink_items\explosive.dm"
+#include "code\modules\uplink\uplink_items\gadgets.dm"
#include "code\modules\uplink\uplink_items\implant.dm"
#include "code\modules\uplink\uplink_items\job.dm"
#include "code\modules\uplink\uplink_items\nukeops.dm"
@@ -8869,17 +8870,6 @@
#include "monkestation\code\modules\twitch_bits\events\random_item.dm"
#include "monkestation\code\modules\twitch_bits\events\rod.dm"
#include "monkestation\code\modules\twitch_bits\events\skinny.dm"
-#include "monkestation\code\modules\uplink\uplink_items.dm"
-#include "monkestation\code\modules\uplink\uplink_kits.dm"
-#include "monkestation\code\modules\uplink\uplink_items\badass.dm"
-#include "monkestation\code\modules\uplink\uplink_items\bundles.dm"
-#include "monkestation\code\modules\uplink\uplink_items\device_tools.dm"
-#include "monkestation\code\modules\uplink\uplink_items\explosive.dm"
-#include "monkestation\code\modules\uplink\uplink_items\job.dm"
-#include "monkestation\code\modules\uplink\uplink_items\misc.dm"
-#include "monkestation\code\modules\uplink\uplink_items\species.dm"
-#include "monkestation\code\modules\uplink\uplink_items\stealthy_tools.dm"
-#include "monkestation\code\modules\uplink\uplink_items\suits.dm"
#include "monkestation\code\modules\vehicles\monkey_ball.dm"
#include "monkestation\code\modules\vehicles\wheelchair.dm"
#include "monkestation\code\modules\vehicles\cars\vim.dm"
From 645f8c3b8f56948bb3cca937171c3fb4208e6b10 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 03:21:01 -0400
Subject: [PATCH 05/29] fixes some illegal tech
---
code/modules/uplink/uplink_items/bundle.dm | 6 +++---
code/modules/uplink/uplink_items/nukeops.dm | 2 ++
2 files changed, 5 insertions(+), 3 deletions(-)
diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm
index 615968730ce80..9abe3bac075ac 100644
--- a/code/modules/uplink/uplink_items/bundle.dm
+++ b/code/modules/uplink/uplink_items/bundle.dm
@@ -76,13 +76,13 @@
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 40 TC. The Syndicate will only provide one surplus item per agent."
+ Contents are sorted to always be worth 50 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 = 40 //monkestation edit: from 30 to 40
+ var/crate_tc_value = 50
/// crate that will be used for the surplus crate
var/crate_type = /obj/structure/closet/crate
@@ -153,7 +153,7 @@
item = /obj/structure/closet/crate/syndicrate
progression_minimum = 30 MINUTES
stock_key = UPLINK_SHARED_STOCK_SURPLUS
- crate_tc_value = 100 //monkestation edit: from 80 to 100
+ crate_tc_value = 100
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
diff --git a/code/modules/uplink/uplink_items/nukeops.dm b/code/modules/uplink/uplink_items/nukeops.dm
index 760201118e696..bf59905d252c5 100644
--- a/code/modules/uplink/uplink_items/nukeops.dm
+++ b/code/modules/uplink/uplink_items/nukeops.dm
@@ -699,6 +699,7 @@
item = /obj/item/mod/module/injector
cost = 2
purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
+ illegal_tech = FALSE
/datum/uplink_item/suits/holster
name = "MODsuit Holster Module"
@@ -706,6 +707,7 @@
item = /obj/item/mod/module/holster
cost = 2
purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
+ illegal_tech = FALSE
/datum/uplink_item/device_tools/assault_pod
name = "Assault Pod Targeting Device"
From 1f0ce66f634e987cade86b767db1d4a01797fe00 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 03:35:12 -0400
Subject: [PATCH 06/29] https://github.com/tgstation/tgstation/pull/88482
---
code/game/objects/items/storage/toolbox.dm | 72 ++++++++++++++++++
code/modules/antagonists/clown_ops/outfits.dm | 1 +
.../boxes_magazines/external/pistol.dm | 2 +-
.../boxes_magazines/external/toy.dm | 2 +-
.../modules/projectiles/guns/ballistic/toy.dm | 3 +
.../modules/uplink/uplink_items/ammunition.dm | 16 ++--
code/modules/uplink/uplink_items/dangerous.dm | 20 ++---
icons/obj/storage/case.dmi | Bin 1694 -> 1936 bytes
8 files changed, 97 insertions(+), 19 deletions(-)
diff --git a/code/game/objects/items/storage/toolbox.dm b/code/game/objects/items/storage/toolbox.dm
index 3f5aadfd428fa..b0b6311d5e214 100644
--- a/code/game/objects/items/storage/toolbox.dm
+++ b/code/game/objects/items/storage/toolbox.dm
@@ -378,6 +378,78 @@
// Somewhere to store it all.
new /obj/item/storage/backpack/satchel(src)
+/obj/item/storage/toolbox/guncase/traitor
+ name = "makarov gun case"
+ desc = "A weapon's case. Has a blood-red 'S' stamped on the cover. There seems to be a strange switch along the side inside a plastic flap."
+ icon_state = "pistol_case"
+ base_icon_state = "pistol_case"
+ // What ammo box do we spawn in our case?
+ var/ammo_box_to_spawn = /obj/item/ammo_box/c9mm
+ // Timer for the bomb in the case.
+ var/explosion_timer
+ // Whether or not our case is exploding. Used for determining sprite changes.
+ var/currently_exploding = FALSE
+
+/obj/item/storage/toolbox/guncase/traitor/Initialize(mapload)
+ . = ..()
+ register_context()
+
+/obj/item/storage/toolbox/guncase/traitor/examine(mob/user)
+ . = ..()
+ . += span_notice("Activate the Evidence Disposal Explosive using Alt-Right-Click.")
+
+/obj/item/storage/toolbox/guncase/traitor/add_context(atom/source, list/context, obj/item/held_item, mob/user)
+ . = ..()
+
+ context[SCREENTIP_CONTEXT_ALT_RMB] = "Activate Evidence Disposal Explosive"
+ return CONTEXTUAL_SCREENTIP_SET
+
+/obj/item/storage/toolbox/guncase/traitor/PopulateContents()
+ new weapon_to_spawn (src)
+ for(var/i in 1 to 2)
+ new extra_to_spawn (src)
+ new ammo_box_to_spawn(src)
+
+/obj/item/storage/toolbox/guncase/traitor/update_icon_state()
+ . = ..()
+ if(currently_exploding)
+ icon_state = "[base_icon_state]_exploding"
+ else
+ icon_state = "[base_icon_state]"
+
+/obj/item/storage/toolbox/guncase/traitor/click_alt_secondary(mob/user)
+ . = ..()
+ var/i_dont_even_think_once_about_blowing_stuff_up = tgui_alert(user, "Would you like to activate the evidence disposal bomb now?", "BYE BYE", list("Yes","No"))
+ if(i_dont_even_think_once_about_blowing_stuff_up == "No")
+ return
+ explosion_timer = addtimer(CALLBACK(src, PROC_REF(think_fast_chucklenuts)), 5 SECONDS, (TIMER_UNIQUE|TIMER_OVERRIDE))
+ to_chat(user, span_warning("You prime [src]'s evidence disposal bomb!"))
+ log_bomber(user, "has activated a", src, "for detonation")
+ playsound(src, 'sound/weapons/armbomb.ogg', 50, TRUE)
+ currently_exploding = TRUE
+ update_appearance()
+
+/// proc to handle our detonation
+/obj/item/storage/toolbox/guncase/traitor/proc/think_fast_chucklenuts()
+ explosion(src, devastation_range = 0, heavy_impact_range = 0, light_impact_range = 2, explosion_cause = src)
+ qdel(src)
+
+/obj/item/storage/toolbox/guncase/traitor/ammunition
+ name = "makarov 9mm magazine case"
+ weapon_to_spawn = /obj/item/ammo_box/magazine/m9mm
+
+/obj/item/storage/toolbox/guncase/traitor/donksoft
+ name = "\improper Donksoft riot pistol gun case"
+ weapon_to_spawn = /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine
+ extra_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_box_to_spawn = /obj/item/ammo_box/foambox/riot
+
+/obj/item/storage/toolbox/guncase/traitor/ammunition/donksoft
+ name = "\improper Donksoft riot pistol magazine case"
+ weapon_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot
+ extra_to_spawn = /obj/item/ammo_box/magazine/toy/pistol/riot
+ ammo_box_to_spawn = /obj/item/ammo_box/foambox/riot
+
/obj/item/storage/toolbox/repair
name = "robotic repair toolbox"
desc = "Capable of robusting and repairing any troublesome robots after the fact."
diff --git a/code/modules/antagonists/clown_ops/outfits.dm b/code/modules/antagonists/clown_ops/outfits.dm
index 7dc84b56d856f..58ebfc41c7b86 100644
--- a/code/modules/antagonists/clown_ops/outfits.dm
+++ b/code/modules/antagonists/clown_ops/outfits.dm
@@ -10,6 +10,7 @@
r_pocket = /obj/item/bikehorn
id = /obj/item/card/id/advanced/chameleon
backpack_contents = list(
+ /obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine = 1, //The clown op equivalent to the Ansem
/obj/item/pen/edagger = 1,
/obj/item/dnainjector/clumsymut = 1, //in case you want to be clumsy for the memes
/obj/item/storage/box/syndie_kit/clownpins = 1, //for any guns that you get your grubby little clown op mitts on
diff --git a/code/modules/projectiles/boxes_magazines/external/pistol.dm b/code/modules/projectiles/boxes_magazines/external/pistol.dm
index 3736746503ba3..5f3a7b43a54ae 100644
--- a/code/modules/projectiles/boxes_magazines/external/pistol.dm
+++ b/code/modules/projectiles/boxes_magazines/external/pistol.dm
@@ -83,7 +83,7 @@
base_icon_state = "9x19p"
ammo_type = /obj/item/ammo_casing/c9mm
caliber = CALIBER_9MM
- max_ammo = 8
+ max_ammo = 12
multiple_sprites = AMMO_BOX_FULL_EMPTY
multiple_sprite_use_base = TRUE
diff --git a/code/modules/projectiles/boxes_magazines/external/toy.dm b/code/modules/projectiles/boxes_magazines/external/toy.dm
index 7503cd032f60d..5d8d44c1d57ad 100644
--- a/code/modules/projectiles/boxes_magazines/external/toy.dm
+++ b/code/modules/projectiles/boxes_magazines/external/toy.dm
@@ -20,7 +20,7 @@
/obj/item/ammo_box/magazine/toy/pistol
name = "foam force pistol magazine"
icon_state = "9x19p"
- max_ammo = 8
+ max_ammo = 12
multiple_sprites = AMMO_BOX_FULL_EMPTY
/obj/item/ammo_box/magazine/toy/pistol/riot
diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm
index c28c0ada039a6..551b2b0189306 100644
--- a/code/modules/projectiles/guns/ballistic/toy.dm
+++ b/code/modules/projectiles/guns/ballistic/toy.dm
@@ -28,6 +28,9 @@
/obj/item/gun/ballistic/automatic/pistol/toy/riot
accepted_magazine_type = /obj/item/ammo_box/magazine/toy/pistol/riot
+/obj/item/gun/ballistic/automatic/pistol/toy/riot/clandestine
+ projectile_damage_multiplier = 1.4
+
/obj/item/gun/ballistic/automatic/pistol/riot/Initialize(mapload)
magazine = new /obj/item/ammo_box/magazine/toy/pistol/riot(src)
return ..()
diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm
index b46ce1487ea28..5ecf973207cba 100644
--- a/code/modules/uplink/uplink_items/ammunition.dm
+++ b/code/modules/uplink/uplink_items/ammunition.dm
@@ -7,20 +7,20 @@
surplus = 40
/datum/uplink_item/ammo/toydarts
- name = "Box of Riot Darts"
- desc = "A box of 40 Donksoft riot darts, for reloading any compatible foam dart magazine. Don't forget to share!"
- item = /obj/item/ammo_box/foambox/riot
+ name = "Donksoft Riot Pistol Ammunition Case"
+ desc = "A case containing three spare magazines for the Donksoft riot pistol, along with a box of loose riot darts."
+ item = /obj/item/storage/toolbox/guncase/traitor/ammunition/donksoft
cost = 2
surplus = 0
illegal_tech = FALSE
purchasable_from = ~UPLINK_NUKE_OPS
/datum/uplink_item/ammo/pistol
- name = "9mm Handgun Magazine"
- desc = "An additional 8-round 9mm magazine, compatible with the Makarov pistol."
- progression_minimum = 10 MINUTES
- item = /obj/item/ammo_box/magazine/m9mm
- cost = 1
+ name = "9mm Magazine Case"
+ desc = "A case containing three additional 8-round 9mm magazines, compatible with the Makarov pistol, as well as \
+ a box of loose 9mm ammunition."
+ item = /obj/item/storage/toolbox/guncase/traitor/ammunition
+ cost = 2
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
illegal_tech = FALSE
diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm
index 006ef445ab466..780b45fd87d56 100644
--- a/code/modules/uplink/uplink_items/dangerous.dm
+++ b/code/modules/uplink/uplink_items/dangerous.dm
@@ -7,20 +7,22 @@
category = /datum/uplink_category/dangerous
/datum/uplink_item/dangerous/foampistol
- name = "Toy Pistol with Riot Darts"
- desc = "An innocent-looking toy pistol designed to fire foam darts. Comes loaded with riot-grade \
- darts effective at incapacitating a target."
- item = /obj/item/gun/ballistic/automatic/pistol/toy/riot
+ name = "Donksoft Riot Pistol Case"
+ desc = "A case containing an innocent-looking toy pistol designed to fire foam darts at higher than normal velocity. \
+ Comes loaded with riot-grade darts effective at incapacitating a target, two spare magazines and a box of loose \
+ riot darts. Perfect for nonlethal takedowns at range, as well as deniability. While not included in the kit, the \
+ pistol is compatible with suppressors, which can be purchased separately."
+ item = /obj/item/storage/toolbox/guncase/traitor/donksoft
cost = 2
surplus = 50 //monkestation edit: from 10 to 50
purchasable_from = ~UPLINK_NUKE_OPS
/datum/uplink_item/dangerous/pistol
- name = "Makarov Pistol"
- desc = "A small, easily concealable handgun that uses 9mm auto rounds in 8-round magazines and is compatible \
- with suppressors."
- progression_minimum = 10 MINUTES
- item = /obj/item/gun/ballistic/automatic/pistol
+ name = "Makarov Pistol Case"
+ desc = "A weapon case containing an unknown variant of the Makarov pistol, along with two spare magazines and a box of loose 9mm ammunition. \
+ Chambered in 9mm. Perfect for frequent skirmishes with security, as well as ensuring you have enough firepower to outlast the competition. \
+ While not included in the kit, the pistol is compatible with suppressors, which can be purchased seperately."
+ item = /obj/item/storage/toolbox/guncase/traitor
cost = 7
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/icons/obj/storage/case.dmi b/icons/obj/storage/case.dmi
index 18c4e7feb152fb405cd6702df471ba932533a903..410c4f86deed6d9e5dcfc1da2cb49a34aab991f4 100644
GIT binary patch
delta 1765
zcmV2m=5B0B!b@ZvX%Q@R22C
z1@f@~|J0F)ACavvk>D7AGyedfhGKbVRlvZ&EG;pGI6tEf6Ws|AYHoFvNKYIbA4p12
z%%rV|00001bW%=J06^y0W&i*I40=>pbVOxyV{&P5bZKvH004NLmDIs*!ypU*&~x~T
zs6B3-wro50GPSCDSbrfR!AYz-I0CwMe?PLQ%MP1xl?$MU!5FfC%-^=V{UP7H@6`u5
zk8JaG{_^msvNM{{#m;k~vJSBA!qo9W2Z+r@7hP3
zDJzNVBbcNfS;dz-l1g#JDk*y~nq-S#sTlGA_9lGGeuZ?^GNmgp(Sfw@wGexxc+F%u
zsn9k^!Rf%R6x~CAcCEIOT3q4k%Y|90k&!GrhHFY$i^Ub#g>f%Bv#>hr>?}JVqT&T-&_hw#|Nn1)Hc2nENt(2i6!4ty>70`C
zK=|IItr*9$00000W9$$l9uYKr+3eVa>;$Mn$gWW3Er(Kyr(R}gzlR?Sd9PY+RGqq0$KVHiQ1wiDt4RjkjUWe2
zZiH)LT#xd!wW`{*^3e_qe-D(+srx5lyfY5vII6RX+XMpeo$qbO~
zy+b_jhbcUhK4*X=q5#?6d)N4-AsykyuL|Fm`SJrCHhybJN4W93!nb994KsjG0qF?q
z`8CV{hiB4TO_zlUP+>uZeCcJN^^`lsDRi0e4avHH-NH#%=-_L`nhEZ*G2`rZUA-v
zm=Dt!`#W6!nLevPJEzanzdS(rE;4grD;+@L>1+7A
zjGfo#>0che=IJB@C_H_Q#$6y!|MCEWO9;PzALaGrC4U^V@D|EDka|9%lYJCLw?)o^%zem)GKEv6Thr+iif=qmzz
z5d|2GVlFN&g8fDGOq^gi9`|~^aR6|D!fn1ry;@w8wn5=nHfOh{b2lQh>Zk@>&qxm;iLM0gVtsOEK>FH
z0i>Ru{K@(^aSDZ%jl>tJ!u!$HTh3i5d*vM$@FHYh(7(REioKBlvSr7m_y^I_ls6J!
zweHTYyyF6brN00000NkvXX
Hu0mjfd{|6R
delta 1523
zcmV0001>2m=5B0K5^G9{>OV)sZD+
zk&hk*^05H_)BusKFatCH0Fm7of1rk9d1qA?Q=Ux#0004WQchCV=-0C=30)6H(eFbn|TbMq7t90wCHIC7al6Nm8%mD{?lg_|HJgYotY
zs~DG|8s!pOUw&jKWBb1S*zN7+b7xK{fxNS8yL_FQ>`YZ`Q}DJhS&P)Pf3XijgotT6
zDul2uA>hbl6-h|BxyfpQ4*U6^3|M}NmgVfr16G6j$_oGe!dj``u^5ycR=~Q$Z&VHa
z5#3Yxnfof~wDCOLfu0^2LI+A5h|@FE;Xy^NCXNEpORjo{UK((kUfkgH?BzhN`G3JG
zWs%`>{V|h8Kkj?f6k1i^f61Zp{&$+ElJmm~jqP^7`Tf&BDbpcI{Q=`3000DaNklFBwGx-z{sGZYrC|D5=gj}mj3^rv?Iw^$!Z*|g7j&ErV<
zg3rg1FXZz)1VNAv*`jE4LTRD5Wy`0i9g+b>?ZBja0ppu=);r&ae+GcVnm)4LK=E`Z
z^~t33`a_1&p+?{O3E0{uVHlEaKB?9pjYb2qLt8}mFe6sF7XiU=OdB*F26Sep@9yqy
z?~L&Prz;DpA`(jqXi<6%jhfF0a83
z+t`@Y>ht-$R%d5bmB2>#rm;xP5|0KE+eV5d1|1C6>e0SLWTQ7Um@c5wpjwX(VBHQX
zL^gUugJtRrs`Y4p^4mn)!O8DB-Mzts$sZGK2Pc2(^bR@*e@m$CpkD8wgA$RA?oC4x
z!QeoISm~{=V*ao%<2|b$4JE`IwN`gdFp~&ubOb>V1VIqwyGQz$mJr`YXPEN4Rt67`
zsvMHox6qkCLw?uJ;L%}~BNCJ5x+$NlTLCM*r9oppN2ITPp-(LIwgyf49Fe{^$9@=+
z#`^PgP@T`EfAzzBN9)JM@0)a$0l%?s$md8}m9AVmsv0!t>@)IJ>NnR7-|UGm6PFDd
zboQB6SD7K7tGfiCK544ckNkBcVxvdRoANn!M!Y^be}Vnt^ff<0sE4Y4cGgax&sDlH
zpCf$zUeOMvs|btgccz=K;#fS#-~fJix-p;2E`kEMOgq$#`5dXa(Rm%}2!bF8f*=Tj
zw8fb30sp?yALH#iz5d@)ufPAG@n_8UfHww%?+gZ)27@2e1{>siz0xG#>y;+?UavIC
z_j;v4f4iqoT;^LgcM#53t>B+~O%gal?zs%mr9iFdNi^XEaVWVmVhk8=-mzm5RRt#R{2e_&&
z;7CsdfB8@}cy)cXTCLaXbR-pUr6(GH6@%B;f7h$^X0utdkzAmWeq+*aB)u@0oqUDA
z7uCU!rE8`!W
z47AEtIxyHSo$A0K&-ZR_4Ediz#}2;ubI@77mpo}G3@VkZfU|U}S^lWIMe+j9^1bBi
z6Ks^He9NbW!Qy>E>8OKr(Mse~n+`h4G4~SI6sY*ML^dsTP(XgxIm`E+=UI#(2!gy&
Z{s+HD65)fmK%xKu002ovPDHLkV1my#{zCu&
From f996e76904c42985fd0f410edd07d53288cca7bc Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 03:52:56 -0400
Subject: [PATCH 07/29] remove finals
https://github.com/tgstation/tgstation/pull/79793
---
code/datums/components/uplink.dm | 1 -
.../antagonists/traitor/datum_traitor.dm | 5 +-
.../final_objective/battlecruiser.dm | 49 ------
.../final_objective/final_objective.dm | 48 ------
.../objectives/final_objective/infect_ai.dm | 56 -------
.../final_objective/objective_dark_matteor.dm | 83 ----------
.../objectives/final_objective/romerol.dm | 46 ------
.../final_objective/space_dragon.dm | 51 ------
.../final_objective/supermatter_cascade.dm | 57 -------
.../antagonists/traitor/uplink_handler.dm | 2 -
code/modules/station_goals/meteor_shield.dm | 2 -
.../final_objective/become_wizard.dm | 148 ------------------
.../final_objective/final_objective.dm | 2 -
tgstation.dme | 9 --
.../tgui/interfaces/Uplink/ObjectiveMenu.tsx | 18 +--
.../Uplink/PrimaryObjectiveMenu.tsx | 30 +---
.../packages/tgui/interfaces/Uplink/index.tsx | 3 -
17 files changed, 5 insertions(+), 605 deletions(-)
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/infect_ai.dm
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/objective_dark_matteor.dm
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/romerol.dm
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm
delete mode 100644 code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm
delete mode 100644 monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm
delete mode 100644 monkestation/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
diff --git a/code/datums/components/uplink.dm b/code/datums/components/uplink.dm
index 4a08e1788d4c6..cf1c956a58004 100644
--- a/code/datums/components/uplink.dm
+++ b/code/datums/components/uplink.dm
@@ -229,7 +229,6 @@
data["primary_objectives"] = primary_objectives
data["potential_objectives"] = potential_objectives
data["active_objectives"] = active_objectives
- data["completed_final_objective"] = uplink_handler.final_objective
var/list/stock_list = uplink_handler.item_stock.Copy()
var/list/extra_purchasable_stock = list()
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 82e21cececb30..6de06de9f0690 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -135,7 +135,7 @@
else
string += ", [to_display.telecrystal_reward] TC"
string += ", [to_display.progression_reward] PR"
- if(to_display.objective_state == OBJECTIVE_STATE_ACTIVE && !istype(to_display, /datum/traitor_objective/ultimate))
+ if(to_display.objective_state == OBJECTIVE_STATE_ACTIVE)
string += " Fail this objective"
string += " Succeed this objective"
if(to_display.objective_state == OBJECTIVE_STATE_INACTIVE)
@@ -337,9 +337,6 @@
traitor_won = FALSE
objectives_text += "
Objective #[count]: [objective.explanation_text] [objective.get_roundend_success_suffix()]"
count++
- if(uplink_handler.final_objective)
- objectives_text += "
[span_greentext("[traitor_won ? "Additionally" : "However"], the final objective \"[uplink_handler.final_objective]\" was completed!")]"
- traitor_won = TRUE
result += "
[owner.name] [traitor_flavor["roundend_report"]]"
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm b/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm
deleted file mode 100644
index b136a6f695cb3..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/battlecruiser.dm
+++ /dev/null
@@ -1,49 +0,0 @@
-/datum/traitor_objective/ultimate/battlecruiser
- name = "Reveal Station Coordinates to nearby Syndicate Battlecruiser"
- description = "Use a special upload card on a communications console to send the coordinates \
- of the station to a nearby Battlecruiser. You may want to make your syndicate status known to \
- the battlecruiser crew when they arrive - their goal will be to destroy the station."
-
- /// Checks whether we have sent the card to the traitor yet.
- var/sent_accesscard = FALSE
- /// Battlecruiser team that we get assigned to
- var/datum/team/battlecruiser/team
-
-/datum/traitor_objective/ultimate/battlecruiser/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- // There's no empty space to load a battlecruiser in...
- if(SSmapping.is_planetary())
- return FALSE
-
- return TRUE
-
-/datum/traitor_objective/ultimate/battlecruiser/on_objective_taken(mob/user)
- . = ..()
- team = new()
- var/obj/machinery/nuclearbomb/selfdestruct/nuke = locate() in SSmachines.get_machines_by_type(/obj/machinery/nuclearbomb/selfdestruct)
- if(nuke.r_code == NUKE_CODE_UNSET)
- nuke.r_code = random_nukecode()
- team.nuke = nuke
- team.update_objectives()
- handler.owner.add_antag_datum(/datum/antagonist/battlecruiser/ally, team)
-
-
-/datum/traitor_objective/ultimate/battlecruiser/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!sent_accesscard)
- buttons += add_ui_button("", "Pressing this will materialize an upload card, which you can use on a communication console to contact the fleet.", "phone", "card")
- return buttons
-
-/datum/traitor_objective/ultimate/battlecruiser/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("card")
- if(sent_accesscard)
- return
- sent_accesscard = TRUE
- var/obj/item/card/emag/battlecruiser/emag_card = new()
- emag_card.team = team
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = emag_card,
- ))
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
deleted file mode 100644
index 1e5d22e80b19d..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/datum/traitor_objective_category/final_objective
- name = "Final Objective"
- objectives = list(
- /datum/traitor_objective/ultimate/romerol = 1,
- /datum/traitor_objective/ultimate/battlecruiser = 1,
-// /datum/traitor_objective/ultimate/space_dragon = 1, //monkestation removal
- /datum/traitor_objective/ultimate/supermatter_cascade = 1,
- /datum/traitor_objective/ultimate/infect_ai = 1,
- /datum/traitor_objective/ultimate/dark_matteor = 1,
-// /datum/traitor_objective/ultimate/wizard = 1, //monkestation edit
- )
- weight = 100
-
-/datum/traitor_objective/ultimate
- abstract_type = /datum/traitor_objective/ultimate
- progression_minimum = 140 MINUTES
- needs_reward = FALSE
-
- var/progression_points_in_objectives = 20 MINUTES
-
- /// what pop we need to generate
- var/pop_lock = 35
-
-/// Determines if this final objective can be taken. Should be put into every final objective's generate function.
-/datum/traitor_objective/ultimate/can_generate_objective(generating_for, list/possible_duplicates)
- if(SSgamemode.get_correct_popcount() < pop_lock)
- return FALSE
- if(handler.get_completion_progression(/datum/traitor_objective) < progression_points_in_objectives)
- return FALSE
- if(SStraitor.get_taken_count(type) > 0) // Prevents multiple people from ever getting the same final objective.
- return FALSE
- if(length(possible_duplicates) > 0)
- return FALSE
- return TRUE
-
-/datum/traitor_objective/ultimate/on_objective_taken(mob/user)
- . = ..()
- handler.maximum_potential_objectives = 0
- for(var/datum/traitor_objective/objective as anything in handler.potential_objectives)
- if(objective == src)
- continue
- objective.fail_objective()
- user.playsound_local(get_turf(user), 'sound/traitor/final_objective.ogg', vol = 100, vary = FALSE, channel = CHANNEL_TRAITOR)
- handler.final_objective = name
-
-/datum/traitor_objective/ultimate/uplink_ui_data(mob/user)
- . = ..()
- .["final_objective"] = TRUE
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/infect_ai.dm b/code/modules/antagonists/traitor/objectives/final_objective/infect_ai.dm
deleted file mode 100644
index d0068e6bf8abb..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/infect_ai.dm
+++ /dev/null
@@ -1,56 +0,0 @@
-/datum/traitor_objective/ultimate/infect_ai
- name = "Infect the station AI with an experimental virus."
- description = "Infect the station AI with an experimental virus. Go to %AREA% to receive an infected law upload board \
- and use it on the AI core or a law upload console."
-
- ///area type the objective owner must be in to recieve the law upload module
- var/area/board_area_pickup
- ///checker on whether we have sent the law upload module
- var/sent_board = FALSE
-
-/datum/traitor_objective/ultimate/infect_ai/can_generate_objective(generating_for, list/possible_duplicates)
- . = ..()
- if(!.)
- return FALSE
-
- for(var/mob/living/silicon/ai/ai in GLOB.ai_list)
- if(ai.stat == DEAD || ai.mind?.has_antag_datum(/datum/antagonist/malf_ai) || !is_station_level(ai.z))
- continue
- return TRUE
-
- return FALSE
-
-/datum/traitor_objective/ultimate/infect_ai/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/list/possible_areas = GLOB.the_station_areas.Copy()
- for(var/area/possible_area as anything in possible_areas)
- //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair
- if(istype(possible_area, /area/station/hallway) || istype(possible_area, /area/station/security))
- possible_areas -= possible_area
- if(!length(possible_areas))
- return FALSE
- board_area_pickup = pick(possible_areas)
- replace_in_name("%AREA%", initial(board_area_pickup.name))
- return TRUE
-
-/datum/traitor_objective/ultimate/infect_ai/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!sent_board)
- buttons += add_ui_button("", "Pressing this will call down a pod with an infected law upload board.", "wifi", "upload_board")
- return buttons
-
-/datum/traitor_objective/ultimate/infect_ai/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("upload_board")
- if(sent_board)
- return
- var/area/delivery_area = get_area(user)
- if(delivery_area.type != board_area_pickup)
- to_chat(user, span_warning("You must be in [initial(board_area_pickup.name)] to receive the infected law upload board."))
- return
- sent_board = TRUE
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = /obj/item/ai_module/malf,
- ))
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/objective_dark_matteor.dm b/code/modules/antagonists/traitor/objectives/final_objective/objective_dark_matteor.dm
deleted file mode 100644
index ace2574c20025..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/objective_dark_matteor.dm
+++ /dev/null
@@ -1,83 +0,0 @@
-/datum/traitor_objective/ultimate/dark_matteor
- name = "Summon a dark matter singularity to consume the station."
- description = "Go to %AREA%, and recieve the smuggled satellites + emag. Set up and emag the satellites, \
- after enough have been recalibrated by the emag, IT COMES. Warning: The dark matter singularity will hunt all creatures, you included."
-
- //this is a prototype so this progression is for all basic level kill objectives
-
- ///area type the objective owner must be in to recieve the satellites
- var/area/satellites_spawnarea_type
- ///checker on whether we have sent the satellites yet.
- var/sent_satellites = FALSE
-
-/datum/traitor_objective/ultimate/dark_matteor/can_generate_objective(generating_for, list/possible_duplicates)
- . = ..()
- if(!.)
- return FALSE
- if(SSmapping.is_planetary())
- return FALSE //meteors can't spawn on planets
- return TRUE
-
-/datum/traitor_objective/ultimate/dark_matteor/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/list/possible_areas = GLOB.the_station_areas.Copy()
- for(var/area/possible_area as anything in possible_areas)
- if(!ispath(possible_area, /area/station/maintenance/solars) && !ispath(possible_area, /area/station/solars))
- possible_areas -= possible_area
- if(length(possible_areas) == 0)
- return FALSE
- satellites_spawnarea_type = pick(possible_areas)
- replace_in_name("%AREA%", initial(satellites_spawnarea_type.name))
- return TRUE
-
-/datum/traitor_objective/ultimate/dark_matteor/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!sent_satellites)
- buttons += add_ui_button("", "Pressing this will call down a pod with the smuggled satellites.", "satellite", "satellite")
- return buttons
-
-/datum/traitor_objective/ultimate/dark_matteor/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("satellite")
- if(sent_satellites)
- return
- var/area/delivery_area = get_area(user)
- if(delivery_area.type != satellites_spawnarea_type)
- to_chat(user, span_warning("You must be in [initial(satellites_spawnarea_type.name)] to recieve the smuggled satellites."))
- return
- sent_satellites = TRUE
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = /obj/structure/closet/crate/engineering/smuggled_meteor_shields,
- ))
-
-/obj/structure/closet/crate/engineering/smuggled_meteor_shields
-
-/obj/structure/closet/crate/engineering/smuggled_meteor_shields/PopulateContents()
- ..()
- for(var/i in 1 to 11)
- new /obj/item/meteor_shield_capsule(src)
- new /obj/item/card/emag/meteor_shield_recalibrator(src)
- new /obj/item/paper/dark_matteor_summoning(src)
-
-/obj/item/paper/dark_matteor_summoning
- name = "notes - dark matter meteor summoning"
- default_raw_text = {"
- Summoning a dark matter meteor.
-
-
- Operative, this crate contains 10+1 spare meteor shield satellites stolen from NT’s supply lines. Your mission is to
- deploy them in space near the station and recalibrate them with the provided emag. Be careful: you need a 30 second
- cooldown between each hack, and NT will detect your interference after seven recalibrations. That means you
- have at least 5 minutes of work and 1 minute of resistance.
-
- This is a high-risk operation. You’ll need backup, fortification, and determination. The reward?
- A spectacular dark matter singularity that will wipe out the station.
-
- **Death to Nanotrasen.**
-"}
-
-/obj/item/card/emag/meteor_shield_recalibrator
- name = "cryptographic satellite recalibrator"
- desc = "It's a cryptographic sequencer that has been tuned to recalibrate meteor shields quicker and with less risk of frying them."
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/romerol.dm b/code/modules/antagonists/traitor/objectives/final_objective/romerol.dm
deleted file mode 100644
index 491c7977b0c8e..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/romerol.dm
+++ /dev/null
@@ -1,46 +0,0 @@
-/datum/traitor_objective/ultimate/romerol
- name = "Spread the experimental bioterror agent Romerol by calling a droppod down at %AREA%"
- description = "Go to %AREA%, and recieve the bioterror agent. Spread it to the crew, \
- and watch then raise from the dead as mindless killing machines. Warning: The undead will attack you too."
-
- //this is a prototype so this progression is for all basic level kill objectives
-
- ///area type the objective owner must be in to recieve the romerol
- var/area/romerol_spawnarea_type
- ///checker on whether we have sent the romerol yet.
- var/sent_romerol = FALSE
-
-/datum/traitor_objective/ultimate/romerol/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/list/possible_areas = GLOB.the_station_areas.Copy()
- for(var/area/possible_area as anything in possible_areas)
- //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair
- if(ispath(possible_area, /area/station/hallway) || ispath(possible_area, /area/station/security))
- possible_areas -= possible_area
- if(length(possible_areas) == 0)
- return FALSE
- romerol_spawnarea_type = pick(possible_areas)
- replace_in_name("%AREA%", initial(romerol_spawnarea_type.name))
- return TRUE
-
-/datum/traitor_objective/ultimate/romerol/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!sent_romerol)
- buttons += add_ui_button("", "Pressing this will call down a pod with the biohazard kit.", "biohazard", "romerol")
- return buttons
-
-/datum/traitor_objective/ultimate/romerol/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("romerol")
- if(sent_romerol)
- return
- var/area/delivery_area = get_area(user)
- if(delivery_area.type != romerol_spawnarea_type)
- to_chat(user, span_warning("You must be in [initial(romerol_spawnarea_type.name)] to recieve the bioterror agent."))
- return
- sent_romerol = TRUE
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = /obj/item/storage/box/syndie_kit/romerol,
- ))
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm b/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm
deleted file mode 100644
index 8768df88baca1..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/space_dragon.dm
+++ /dev/null
@@ -1,51 +0,0 @@
-//MONKESTATION FILE REMOVAL: REPLACED WITH THE /datum/traitor_objective/ultimate/wizard OBJECTIVE
-/*
-/datum/traitor_objective/ultimate/space_dragon
- name = "Find a Space Carp and mutate their DNA with your own using a DNA harvester we will drop pod at %AREA%"
- description = "Go to %AREA%, and recieve the Carp DNA scanner. Use it on any Space Carp to harvest its DNA. \
- From there, use it on yourself, to mutate your own DNA with it and become a Space Dragon. \
- Don't worry about finding one, I'm sure there'll have a wave of carp right when you need it."
-
- ///Area type the objective owner must be in to recieve the DNA extractor.
- var/area/dna_scanner_spawnarea_type
- ///Whether the DNA extraction kit was sent already.
- var/recieved_dna_scanner = FALSE
-
-/datum/traitor_objective/ultimate/space_dragon/on_objective_taken(mob/user)
- . = ..()
- force_event(/datum/round_event_control/carp_migration, "[handler.owner]'s final objective")
-
-/datum/traitor_objective/ultimate/space_dragon/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/list/possible_areas = GLOB.the_station_areas.Copy()
- for(var/area/possible_area as anything in possible_areas)
- //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair
- if(ispath(possible_area, /area/station/hallway) || ispath(possible_area, /area/station/security))
- possible_areas -= possible_area
- if(length(possible_areas) == 0)
- return FALSE
- dna_scanner_spawnarea_type = pick(possible_areas)
- replace_in_name("%AREA%", initial(dna_scanner_spawnarea_type.name))
- return TRUE
-
-/datum/traitor_objective/ultimate/space_dragon/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!recieved_dna_scanner)
- buttons += add_ui_button("", "Pressing this will call down a pod with the DNA extraction kit.", "biohazard", "carp_dna")
- return buttons
-
-/datum/traitor_objective/ultimate/space_dragon/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("carp_dna")
- if(recieved_dna_scanner)
- return
- var/area/delivery_area = get_area(user)
- if(delivery_area.type != dna_scanner_spawnarea_type)
- to_chat(user, span_warning("You must be in [initial(dna_scanner_spawnarea_type.name)] to recieve the DNA extraction kit."))
- return
- recieved_dna_scanner = TRUE
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = /obj/item/storage/box/syndie_kit/space_dragon,
- ))*/
diff --git a/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm b/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm
deleted file mode 100644
index 8f21d9f1ea851..0000000000000
--- a/code/modules/antagonists/traitor/objectives/final_objective/supermatter_cascade.dm
+++ /dev/null
@@ -1,57 +0,0 @@
-/datum/traitor_objective/ultimate/supermatter_cascade
- name = "Destroy the station by causing a crystallizing resonance cascade"
- description = "Destroy the station by causing a supermatter cascade. Go to %AREA% to retrieve the destabilizing crystal \
- and use it on the supermatter."
-
- ///area type the objective owner must be in to recieve the destabilizing crystal
- var/area/dest_crystal_area_pickup
- ///checker on whether we have sent the crystal yet.
- var/sent_crystal = FALSE
-
-/datum/traitor_objective/ultimate/supermatter_cascade/can_generate_objective(generating_for, list/possible_duplicates)
- . = ..()
- if(!.)
- return FALSE
-
- if(isnull(GLOB.main_supermatter_engine))
- return FALSE
- var/obj/machinery/power/supermatter_crystal/engine/crystal = locate() in GLOB.main_supermatter_engine
- if(!is_station_level(crystal.z) && !is_mining_level(crystal.z))
- return FALSE
-
- return TRUE
-
-/datum/traitor_objective/ultimate/supermatter_cascade/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/list/possible_areas = GLOB.the_station_areas.Copy()
- for(var/area/possible_area as anything in possible_areas)
- //remove areas too close to the destination, too obvious for our poor shmuck, or just unfair
- if(ispath(possible_area, /area/station/hallway) || ispath(possible_area, /area/station/security))
- possible_areas -= possible_area
- if(length(possible_areas) == 0)
- return FALSE
- dest_crystal_area_pickup = pick(possible_areas)
- replace_in_name("%AREA%", initial(dest_crystal_area_pickup.name))
- return TRUE
-
-/datum/traitor_objective/ultimate/supermatter_cascade/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!sent_crystal)
- buttons += add_ui_button("", "Pressing this will call down a pod with the supermatter cascade kit.", "biohazard", "destabilizing_crystal")
- return buttons
-
-/datum/traitor_objective/ultimate/supermatter_cascade/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("destabilizing_crystal")
- if(sent_crystal)
- return
- var/area/delivery_area = get_area(user)
- if(delivery_area.type != dest_crystal_area_pickup)
- to_chat(user, span_warning("You must be in [initial(dest_crystal_area_pickup.name)] to receive the supermatter cascade kit."))
- return
- sent_crystal = TRUE
- podspawn(list(
- "target" = get_turf(user),
- "style" = STYLE_SYNDICATE,
- "spawn" = /obj/item/destabilizing_crystal,
- ))
diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm
index da39eefea2cc4..9cd4df4f61027 100644
--- a/code/modules/antagonists/traitor/uplink_handler.dm
+++ b/code/modules/antagonists/traitor/uplink_handler.dm
@@ -258,8 +258,6 @@
objective.update_progression_reward()
/datum/uplink_handler/proc/abort_objective(datum/traitor_objective/to_abort)
- if(istype(to_abort, /datum/traitor_objective/ultimate))
- return
if(to_abort.objective_state != OBJECTIVE_STATE_ACTIVE)
return
to_abort.fail_objective(penalty_cost = to_abort.telecrystal_penalty)
diff --git a/code/modules/station_goals/meteor_shield.dm b/code/modules/station_goals/meteor_shield.dm
index 347fcf1bd1284..3b7b7c3469ded 100644
--- a/code/modules/station_goals/meteor_shield.dm
+++ b/code/modules/station_goals/meteor_shield.dm
@@ -133,8 +133,6 @@ monkestation end */
to_chat(user, span_warning("The last satellite emagged needs [DisplayTimeText(COOLDOWN_TIMELEFT(src, shared_emag_cooldown))] to recalibrate first. Emagging another so soon could damage the satellite network."))
return FALSE
var/cooldown_applied = METEOR_SHIELD_EMAG_COOLDOWN
- if(istype(emag_card, /obj/item/card/emag/meteor_shield_recalibrator))
- cooldown_applied /= 3
COOLDOWN_START(src, shared_emag_cooldown, cooldown_applied)
obj_flags |= EMAGGED
to_chat(user, span_notice("You access the satellite's debug mode and it begins emitting a strange signal, increasing the chance of meteor strikes."))
diff --git a/monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm b/monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm
deleted file mode 100644
index de86a220d34b3..0000000000000
--- a/monkestation/code/modules/antagonists/traitor/objectives/final_objective/become_wizard.dm
+++ /dev/null
@@ -1,148 +0,0 @@
-/* commented out for now until reworked
-
-/datum/traitor_objective/ultimate/wizard
- name = "Go to %AREA% and invoke a rune of power."
- description = "Go to %AREA% and draw a rune of power with the provided impliment. Then, invoke the rune to gain great magical power."
-
- ///Area where the rune must be drawn
- var/area/area_of_power
- ///Have we sent our spraycan yet
- var/spraycan_sent = FALSE
-
-/datum/traitor_objective/ultimate/wizard/generate_objective(datum/mind/generating_for, list/possible_duplicates)
- var/list/possible_areas = GLOB.the_station_areas.Copy()
- var/list/extra_blacklisted_areas = list(/area/station/hallway, /area/station/security, /area/station/ai_monitored)
- for(var/area/possible_area as anything in possible_areas)
- if(is_type_in_list(possible_area, (TRAITOR_OBJECTIVE_BLACKLISTED_AREAS + extra_blacklisted_areas)) || initial(possible_area.outdoors))
- possible_areas -= possible_area
-
- if(!length(possible_areas))
- return FALSE
-
- area_of_power = pick(possible_areas)
- replace_in_name("%AREA%", initial(area_of_power.name))
- return TRUE
-
-/datum/traitor_objective/ultimate/wizard/generate_ui_buttons(mob/user)
- var/list/buttons = list()
- if(!spraycan_sent)
- buttons += add_ui_button("", "Pressing this will materialize an enchanted spraycan in your hand.", "wifi", "spraycan")
- return buttons
-
-/datum/traitor_objective/ultimate/wizard/ui_perform_action(mob/living/user, action)
- . = ..()
- switch(action)
- if("spraycan")
- if(spraycan_sent)
- return
-
- spraycan_sent = TRUE
- var/obj/item/traitor_spraycan/enchanted/spray = new(user.drop_location())
- spray.owning_mind = WEAKREF(user.mind)
- user.put_in_hands(spray)
- spray.balloon_alert(user, "\The [spray] materializes in your hand.")
-
-//the spraycan
-
-/obj/item/traitor_spraycan
- ///Is our rune multi stage
- var/multi_stage = TRUE
-
-/obj/item/traitor_spraycan/enchanted
- name = "enchanted seditious spraycan"
- desc = "An enchanted spraycan able to draw a single rune of power."
- multi_stage = FALSE
- ///Weakref to the mind that owns this spraycan, used for transfer to the rune
- var/datum/weakref/owning_mind
-
-/obj/item/traitor_spraycan/enchanted/try_draw_new_rune(mob/living/user, turf/target_turf)
- for(var/turf/nearby_turf as anything in RANGE_TURFS(1, target_turf))
- if(isindestructiblewall(nearby_turf) || is_type_in_typecache(nearby_turf, no_draw_turfs))
- user.balloon_alert(user, "invalid floor!")
- return
-
- draw_rune(user, target_turf)
-
-/obj/item/traitor_spraycan/enchanted/draw_rune(mob/living/user, turf/target_turf)
- drawing_rune = TRUE
- target_turf.balloon_alert(user, "drawing rune...")
- var/obj/effect/temp_visual/wizard_rune/traitor_drawing/draw_effect = new(target_turf)
- if(!do_after(user, 4 SECONDS, target_turf))
- target_turf.balloon_alert(user, "interrupted!")
- drawing_rune = FALSE
- qdel(draw_effect)
- new /obj/effect/temp_visual/wizard_rune/failed(target_turf)
- return
-
- var/evaporated_obstacles = FALSE
- for(var/atom/possible_obstacle in range(1, target_turf))
- if(!possible_obstacle.density)
- continue
- evaporated_obstacles = TRUE
- new /obj/effect/temp_visual/emp/pulse(possible_obstacle)
-
- if(iswallturf(possible_obstacle))
- var/turf/closed/wall/wall = possible_obstacle
- wall.dismantle_wall(devastated = TRUE)
- continue
- possible_obstacle.atom_destruction("magic")
-
- if(evaporated_obstacles)
- playsound(target_turf, 'sound/magic/blind.ogg', 100, TRUE)
-
- target_turf.balloon_alert(user, "rune created.")
- var/obj/effect/grand_rune/traitor/new_rune = new(target_turf)
- new_rune.owning_mind = WEAKREF(owning_mind?.resolve())
- expended = TRUE
- desc = "A very suspicious looking spraycan, it's empty."
- drawing_rune = FALSE
-//the rune
-
-#define TRAITOR_RUNE_INVOKE_TIME 30 SECONDS //you just have to invoke it once but it takes a while to channel
-#define TRAITOR_GRAND_RUNE_INVOKES_TO_COMPLETE 1
-
-/obj/effect/grand_rune/traitor
- name = "suspicious rune"
- desc = "A flowing circle of shapes and runes is etched into the floor, it has an odd red tint."
- icon = 'monkestation/icons/effects/96x96.dmi'
- icon_state = "traitor_wizard_rune"
- spell_colour = "#780000"
- invoke_time = TRAITOR_RUNE_INVOKE_TIME
- invokes_needed = TRAITOR_GRAND_RUNE_INVOKES_TO_COMPLETE
-
-/obj/effect/grand_rune/traitor/get_invoke_time()
- return invoke_time
-
-/obj/effect/grand_rune/traitor/on_invocation_complete(mob/living/user)
- is_in_use = FALSE
- if(!user.mind) // oh wait, thats a monkey invoking us. Ew
- user.balloon_alert(user, "you are not real, silly!")
- return
- if(user.mind.has_antag_datum(/datum/antagonist/wizard)) // why are you like this?
- user.balloon_alert(user, "can't be more powerfull!")
- return
-
- playsound(src,'sound/magic/staff_change.ogg', 75, TRUE)
- icon = 'icons/effects/96x96.dmi'
- flick("activate", src)
-
- user.mind.set_assigned_role(SSjob.GetJobType(/datum/job/space_wizard))
- user.mind.special_role = ROLE_WIZARD
- user.mind.add_antag_datum(/datum/antagonist/wizard/traitor)
-
- trigger_side_effects()
- tear_reality()
-
- addtimer(CALLBACK(src, PROC_REF(remove_rune)), 6)
-
-#undef TRAITOR_RUNE_INVOKE_TIME
-#undef TRAITOR_GRAND_RUNE_INVOKES_TO_COMPLETE
-
-//the temp visual for drawing the rune
-
-/obj/effect/temp_visual/wizard_rune/traitor_drawing
- icon = 'monkestation/icons/effects/96x96.dmi'
- icon_state = "traitor_wizard_rune_draw"
- duration = 4 SECONDS
-
-*/
diff --git a/monkestation/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm b/monkestation/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
deleted file mode 100644
index fa64e26afccc2..0000000000000
--- a/monkestation/code/modules/antagonists/traitor/objectives/final_objective/final_objective.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/datum/traitor_objective/ultimate
- valid_uplinks = UPLINK_TRAITORS | UPLINK_CONTRACTORS
diff --git a/tgstation.dme b/tgstation.dme
index 55d1f53baa443..86e64982b9fdf 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -3363,13 +3363,6 @@
#include "code\modules\antagonists\traitor\objectives\sleeper_protocol.dm"
#include "code\modules\antagonists\traitor\objectives\steal.dm"
#include "code\modules\antagonists\traitor\objectives\abstract\target_player.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\battlecruiser.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\final_objective.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\infect_ai.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\objective_dark_matteor.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\romerol.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\space_dragon.dm"
-#include "code\modules\antagonists\traitor\objectives\final_objective\supermatter_cascade.dm"
#include "code\modules\antagonists\valentines\heartbreaker.dm"
#include "code\modules\antagonists\valentines\valentine.dm"
#include "code\modules\antagonists\venus_human_trap\venus_human_trap.dm"
@@ -7013,8 +7006,6 @@
#include "monkestation\code\modules\antagonists\traitor\objectives\kidnapping.dm"
#include "monkestation\code\modules\antagonists\traitor\objectives\kill_pet.dm"
#include "monkestation\code\modules\antagonists\traitor\objectives\tide_bug_department.dm"
-#include "monkestation\code\modules\antagonists\traitor\objectives\final_objective\become_wizard.dm"
-#include "monkestation\code\modules\antagonists\traitor\objectives\final_objective\final_objective.dm"
#include "monkestation\code\modules\antagonists\valentines\valentine.dm"
#include "monkestation\code\modules\antagonists\wizard\wizard.dm"
#include "monkestation\code\modules\antagonists\wizard\equipment\artefact.dm"
diff --git a/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx b/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx
index 39619957eaa1b..4cd53fdce7690 100644
--- a/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/ObjectiveMenu.tsx
@@ -7,7 +7,6 @@ import {
Dimmer,
Flex,
Icon,
- NoticeBox,
Section,
Stack,
Tooltip,
@@ -32,7 +31,6 @@ export type Objective = {
ui_buttons?: ObjectiveUiButton[];
objective_state: ObjectiveState;
original_progression: number;
- final_objective: BooleanLike;
};
export type ObjectiveUiButton = {
@@ -305,12 +303,9 @@ const ObjectiveFunction = (
contractorRep={objective.contractor_rep}
objectiveState={objective.objective_state}
originalProgression={objective.original_progression}
- hideTcRep={objective.final_objective}
- finalObjective={objective.final_objective}
+ hideTcRep={false}
canAbort={
- !!handleAbort &&
- !objective.final_objective &&
- objective.objective_state === ObjectiveState.Active
+ !!handleAbort && objective.objective_state === ObjectiveState.Active
}
grow={grow}
handleCompletion={(event) => {
@@ -359,7 +354,6 @@ type ObjectiveElementProps = {
telecrystalPenalty: number;
grow: boolean;
hideTcRep: BooleanLike;
- finalObjective: BooleanLike;
canAbort: BooleanLike;
handleCompletion?: (event: React.MouseEvent) => void;
@@ -383,7 +377,6 @@ export const ObjectiveElement = (props: ObjectiveElementProps) => {
originalProgression,
hideTcRep,
grow,
- finalObjective,
...rest
} = props;
@@ -446,13 +439,6 @@ export const ObjectiveElement = (props: ObjectiveElementProps) => {
Failing this objective will deduct {telecrystalPenalty} TC.
)}
- {finalObjective && objectiveState === ObjectiveState.Inactive && (
-
- Taking this objective will lock you out of getting anymore
- objectives! Furthermore, you will be unable to abort this
- objective.
-
- )}
diff --git a/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx b/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx
index 78992e3227d80..751ceb4b52ce2 100644
--- a/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/PrimaryObjectiveMenu.tsx
@@ -1,16 +1,15 @@
import { useBackend } from '../../backend';
-import { Box, Button, Dimmer, Section, Stack } from '../../components';
+import { Box, Button, Section, Stack } from '../../components';
import { ObjectiveElement } from './ObjectiveMenu';
type PrimaryObjectiveMenuProps = {
primary_objectives;
- final_objective;
can_renegotiate;
};
export const PrimaryObjectiveMenu = (props: PrimaryObjectiveMenuProps) => {
const { act } = useBackend();
- const { primary_objectives, final_objective, can_renegotiate } = props;
+ const { primary_objectives, can_renegotiate } = props;
return (
@@ -23,30 +22,6 @@ export const PrimaryObjectiveMenu = (props: PrimaryObjectiveMenuProps) => {
Completing Secondary Objectives may allow you to acquire additional
equipment.
- {final_objective && (
-
-
- PRIORITY MESSAGE
-
- SOURCE: xxx.xxx.xxx.224:41394
-
-
- \\Debrief in progress.
-
- \\Final Objective confirmed complete.
- \\Your work is done here, agent.
-
-
- CONNECTION CLOSED_
-
-
- )}
{primary_objectives.map((prim_obj, index) => (
@@ -69,7 +44,6 @@ export const PrimaryObjectiveMenu = (props: PrimaryObjectiveMenuProps) => {
hideTcRep
canAbort={false}
grow={false}
- finalObjective={false}
/>
))}
diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx
index 313768568b27b..47aa5872ab719 100644
--- a/tgui/packages/tgui/interfaces/Uplink/index.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx
@@ -70,7 +70,6 @@ type UplinkData = {
primary_objectives: {
[key: number]: string;
};
- completed_final_objective: string;
potential_objectives: Objective[];
active_objectives: Objective[];
maximum_active_objectives: number;
@@ -190,7 +189,6 @@ export class Uplink extends Component<{}, UplinkState> {
progression_points,
primary_objectives,
can_renegotiate,
- completed_final_objective,
active_objectives,
potential_objectives,
has_objectives,
@@ -441,7 +439,6 @@ export class Uplink extends Component<{}, UplinkState> {
{(currentTab === 0 && primary_objectives && (
)) ||
From 4f732a712edfb9ea1a470913b32508c683c816f8 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 03:55:32 -0400
Subject: [PATCH 08/29] 'kill' secondarys
---
code/modules/antagonists/traitor/datum_traitor.dm | 2 +-
.../modules/antagonists/contractor/datums/contractor_datum.dm | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 6de06de9f0690..f4c32270eca28 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -21,7 +21,7 @@
antag_count_points = 8 //gains more points the more objectives they complete, should also add this to things like heretics
var/give_objectives = TRUE
/// Whether to give secondary objectives to the traitor, which aren't necessary but can be completed for a progression and TC boost.
- var/give_secondary_objectives = TRUE
+ var/give_secondary_objectives = FALSE // Planning proper secondary kill later but april 1st almost here and just for now.
var/should_give_codewords = TRUE
///give this traitor an uplink?
var/give_uplink = TRUE
diff --git a/monkestation/code/modules/antagonists/contractor/datums/contractor_datum.dm b/monkestation/code/modules/antagonists/contractor/datums/contractor_datum.dm
index 06dc0f5891b3d..7d2db99f7d996 100644
--- a/monkestation/code/modules/antagonists/contractor/datums/contractor_datum.dm
+++ b/monkestation/code/modules/antagonists/contractor/datums/contractor_datum.dm
@@ -36,6 +36,7 @@
show_to_ghosts = TRUE
give_uplink = FALSE
suicide_cry = "FOR THE CONTRACTS!!"
+ give_secondary_objectives = TRUE
/// The outfit the contractor is equipped with
var/contractor_outfit = /datum/outfit/contractor
From aeec81c95a7a048b1ed6b65eaca1e7802edf60ac Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 04:02:27 -0400
Subject: [PATCH 09/29] 25 tc
---
code/__DEFINES/antagonists.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/__DEFINES/antagonists.dm b/code/__DEFINES/antagonists.dm
index 6360164da8e6b..6a70a626d447f 100644
--- a/code/__DEFINES/antagonists.dm
+++ b/code/__DEFINES/antagonists.dm
@@ -290,7 +290,7 @@ GLOBAL_LIST_INIT(human_invader_antagonists, list(
#define MAROON_PROB 30
/// How many telecrystals a normal traitor starts with
-#define TELECRYSTALS_DEFAULT 20
+#define TELECRYSTALS_DEFAULT 25
/// How many telecrystals mapper/admin only "precharged" uplink implant
#define TELECRYSTALS_PRELOADED_IMPLANT 10
/// The normal cost of an uplink implant; used for calcuating how many
From e0d7a16c5ef949ae9b6ceca0669b9291fc3aaf4c Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 04:47:10 -0400
Subject: [PATCH 10/29] lets not die
---
code/modules/uplink/uplink_items/species.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/uplink/uplink_items/species.dm b/code/modules/uplink/uplink_items/species.dm
index 6fb0015acf5ac..8c859c36dbe8e 100644
--- a/code/modules/uplink/uplink_items/species.dm
+++ b/code/modules/uplink/uplink_items/species.dm
@@ -15,7 +15,7 @@
restricted_species = list(SPECIES_MOTH)
surplus = 80 //monkestation edit: from 0 to 80
-/datum/uplink_item/species_restricted/mothletgrenade //Monkestation addition
+/datum/uplink_item/species_restricted/mothletgrenade
name = "Mothlet Grenade"
desc = "A experimental greande comprised of a Co2 canister, and dozens of tiny brainwashed moths (dubbed mothlets) \
these little guys have been brainwashed and taught how to undo virtually all kinds of clothing and equipment \
From e855708e16596668227a1aa51b36c941e942737f Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 16:43:46 -0400
Subject: [PATCH 11/29] accidental mega commit because I forgor, does a lot
---
.../game/objects/items/storage/uplink_kits.dm | 2 -
.../reagent_containers/cups/bottle.dm | 24 +-
code/modules/uplink/uplink_items/bundle.dm | 12 +-
.../uplink/uplink_items/cybernetics.dm | 72 ++++++
code/modules/uplink/uplink_items/dangerous.dm | 239 ------------------
.../uplink/uplink_items/device_tools.dm | 11 +-
code/modules/uplink/uplink_items/explosive.dm | 13 +-
code/modules/uplink/uplink_items/firearms.dm | 156 ++++++++++++
code/modules/uplink/uplink_items/gadgets.dm | 6 -
code/modules/uplink/uplink_items/implant.dm | 19 +-
code/modules/uplink/uplink_items/melees.dm | 99 ++++++++
code/modules/uplink/uplink_items/stealthy.dm | 76 +-----
.../{suits.dm => utility_clothing.dm} | 46 ++--
.../cybernetics/augments/uplink/uplink.dm | 31 ---
tgstation.dme | 7 +-
15 files changed, 393 insertions(+), 420 deletions(-)
create mode 100644 code/modules/uplink/uplink_items/cybernetics.dm
delete mode 100644 code/modules/uplink/uplink_items/dangerous.dm
create mode 100644 code/modules/uplink/uplink_items/firearms.dm
create mode 100644 code/modules/uplink/uplink_items/melees.dm
rename code/modules/uplink/uplink_items/{suits.dm => utility_clothing.dm} (74%)
delete mode 100644 monkestation/code/modules/cybernetics/augments/uplink/uplink.dm
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 9d762249f7eed..38a32c9313cba 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -533,7 +533,6 @@
/obj/item/storage/box/syndie_kit/emp/PopulateContents()
for(var/i in 1 to 5)
new /obj/item/grenade/empgrenade(src)
- new /obj/item/implanter/emp(src)
/obj/item/storage/box/syndie_kit/chemical
name = "chemical kit"
@@ -548,7 +547,6 @@
new /obj/item/reagent_containers/cup/bottle/fentanyl(src)
new /obj/item/reagent_containers/cup/bottle/formaldehyde(src)
new /obj/item/reagent_containers/cup/bottle/spewium(src)
- new /obj/item/reagent_containers/cup/bottle/cyanide(src)
new /obj/item/reagent_containers/cup/bottle/histamine(src)
new /obj/item/reagent_containers/cup/bottle/initropidril(src)
new /obj/item/reagent_containers/cup/bottle/pancuronium(src)
diff --git a/code/modules/reagents/reagent_containers/cups/bottle.dm b/code/modules/reagents/reagent_containers/cups/bottle.dm
index 1ffe381808fcf..656395e29d5d5 100644
--- a/code/modules/reagents/reagent_containers/cups/bottle.dm
+++ b/code/modules/reagents/reagent_containers/cups/bottle.dm
@@ -34,7 +34,7 @@
/obj/item/reagent_containers/cup/bottle/spewium
name = "spewium bottle"
- desc = "A small bottle of spewium."
+ desc = "A small bottle of spewium. Causes uncontrollable vomitting, causes organ vomitting in high doses."
list_reagents = list(/datum/reagent/toxin/spewium = 50)
/obj/item/reagent_containers/cup/bottle/morphine
@@ -137,7 +137,7 @@
/obj/item/reagent_containers/cup/bottle/polonium
name = "polonium bottle"
- desc = "A small bottle. Contains Polonium."
+ desc = "A small bottle. Contains Polonium. A highly radioactive and toxic chemical."
list_reagents = list(/datum/reagent/toxin/polonium = 50)
/obj/item/reagent_containers/cup/bottle/magillitis
@@ -147,22 +147,22 @@
/obj/item/reagent_containers/cup/bottle/venom
name = "venom bottle"
- desc = "A small bottle. Contains Venom."
+ desc = "A small bottle. Contains Venom. A toxic chemical that gets stronger the more is ingested."
list_reagents = list(/datum/reagent/toxin/venom = 50)
/obj/item/reagent_containers/cup/bottle/fentanyl
name = "fentanyl bottle"
- desc = "A small bottle. Contains Fentanyl."
+ desc = "A small bottle. Contains Fentanyl. Damages the brain and causes toxic damage before causing victim to pass out."
list_reagents = list(/datum/reagent/toxin/fentanyl = 50)
/obj/item/reagent_containers/cup/bottle/formaldehyde
name = "formaldehyde bottle"
- desc = "A small bottle. Contains formaldehyde, a chemical that prevents organs from decaying."
+ desc = "A small bottle. Contains formaldehyde, a chemical that prevents organs from decaying. Slightly toxic to the living."
list_reagents = list(/datum/reagent/toxin/formaldehyde = 50)
/obj/item/reagent_containers/cup/bottle/initropidril
name = "initropidril bottle"
- desc = "A small bottle. Contains initropidril."
+ desc = "A small bottle. Contains initropidril. A lethal toxin causing extreme loss of breath, paralysis, and heart attacks."
list_reagents = list(/datum/reagent/toxin/initropidril = 50)
/obj/item/reagent_containers/cup/bottle/pancuronium
@@ -172,27 +172,27 @@
/obj/item/reagent_containers/cup/bottle/sodium_thiopental
name = "sodium thiopental bottle"
- desc = "A small bottle. Contains sodium thiopental."
+ desc = "A small bottle. Contains sodium thiopental. A non-toxic chemical that induces stamina damage and unconsciousness in its victim."
list_reagents = list(/datum/reagent/toxin/sodium_thiopental = 50)
/obj/item/reagent_containers/cup/bottle/coniine
name = "coniine bottle"
- desc = "A small bottle. Contains coniine."
+ desc = "A small bottle. Contains coniine. A slow but deadly toxin that stops breathing."
list_reagents = list(/datum/reagent/toxin/coniine = 50)
/obj/item/reagent_containers/cup/bottle/curare
name = "curare bottle"
- desc = "A small bottle. Contains curare."
+ desc = "A small bottle. Contains curare. A slightly toxic chemical that induces paralysis and small amounts of breath loss."
list_reagents = list(/datum/reagent/toxin/curare = 50)
/obj/item/reagent_containers/cup/bottle/amanitin
name = "amanitin bottle"
- desc = "A small bottle. Contains amanitin."
+ desc = "A small bottle. Contains amanitin. A extremely powerful delayed toxin that deals its a massive amount of toxin damage at once upon full metabolization."
list_reagents = list(/datum/reagent/toxin/amanitin = 50)
/obj/item/reagent_containers/cup/bottle/histamine
name = "histamine bottle"
- desc = "A small bottle. Contains Histamine."
+ desc = "A small bottle. Contains Histamine. A incredibly lethal, or minorly annoying toxin depending on the dose"
list_reagents = list(/datum/reagent/toxin/histamine = 50)
/obj/item/reagent_containers/cup/bottle/diphenhydramine
@@ -535,5 +535,5 @@
//Changeling stuff
/obj/item/reagent_containers/cup/bottle/antipathogenic_changeling
name = "Changeling Immunoglobulin bottle"
- desc = "A small bottle. Contains Changeling Immunoglobulin, a strong anti-pathogenic agent."
+ desc = "A small bottle. Contains Changeling Immunoglobulin, a strong anti-pathogenic agent that instantly cures any virus."
list_reagents = list(/datum/reagent/medicine/antipathogenic/changeling = 50)
diff --git a/code/modules/uplink/uplink_items/bundle.dm b/code/modules/uplink/uplink_items/bundle.dm
index 9abe3bac075ac..3b4afa97c4e7f 100644
--- a/code/modules/uplink/uplink_items/bundle.dm
+++ b/code/modules/uplink/uplink_items/bundle.dm
@@ -56,7 +56,7 @@
The Syndicate will only provide one Syndi-Kit per agent."
progression_minimum = 30 MINUTES
item = /obj/item/storage/box/syndicate/bundle_a
- cost = 20
+ cost = 25
stock_key = UPLINK_SHARED_STOCK_KITS
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
@@ -68,7 +68,7 @@
The Syndicate will only provide one Syndi-Kit per agent."
progression_minimum = 30 MINUTES
item = /obj/item/storage/box/syndicate/bundle_b
- cost = 20
+ cost = 25
stock_key = UPLINK_SHARED_STOCK_KITS
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
@@ -78,7 +78,7 @@
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 50 TC. The Syndicate will only provide one surplus item per agent."
item = /obj/structure/closet/crate // will be replaced in purchase()
- cost = 20
+ cost = 25
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
stock_key = UPLINK_SHARED_STOCK_SURPLUS
/// Value of items inside the crate in TC
@@ -149,7 +149,7 @@
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 100 TC. \
The Syndicate will only provide one surplus item per agent."
- cost = 20
+ cost = 25
item = /obj/structure/closet/crate/syndicrate
progression_minimum = 30 MINUTES
stock_key = UPLINK_SHARED_STOCK_SURPLUS
@@ -173,7 +173,7 @@
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
+ cost = 25
item = /obj/item/syndicrate_key
progression_minimum = 30 MINUTES
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
@@ -184,7 +184,7 @@
desc = "A box containing everything you need to take contracts from the Syndicate. Kidnap people and drop them off at specified locations for rewards in the form of Telecrystals \
(Usable in the provided uplink) and Contractor Points. Can not be bought if you have taken any secondary objectives."
item = /obj/item/storage/box/syndie_kit/contract_kit
- cost = 20
+ cost = 25
purchasable_from = UPLINK_TRAITORS
/datum/uplink_item/bundles_tc/contract_kit/unique_checks(mob/user, datum/uplink_handler/handler, atom/movable/source)
diff --git a/code/modules/uplink/uplink_items/cybernetics.dm b/code/modules/uplink/uplink_items/cybernetics.dm
new file mode 100644
index 0000000000000..f8659d348026d
--- /dev/null
+++ b/code/modules/uplink/uplink_items/cybernetics.dm
@@ -0,0 +1,72 @@
+/datum/uplink_category/cybernetics
+ name = "Cybernetics"
+ weight = 3
+
+/datum/uplink_item/cybernetics
+ category = /datum/uplink_category/cybernetics
+ surplus = 0
+ cant_discount = FALSE
+
+/datum/uplink_item/cybernetics/sandy
+ name = "Sandevistan Bundle"
+ desc = "A box containing an autosurgeon for a sandevistan, allowing you to outspeed targets."
+ item = /obj/item/autosurgeon/organ/syndicate/sandy
+ cost = 10
+ purchasable_from = UPLINK_TRAITORS
+
+/datum/uplink_item/cybernetics/mantis
+ name = "Mantis Blade Bundle"
+ desc = "A box containing autosurgeons for two mantis blade implants, one for each arm."
+ item = /obj/item/storage/box/syndie_kit/mantis
+ cost = 12
+ purchasable_from = UPLINK_TRAITORS
+
+/obj/item/storage/box/syndie_kit/mantis/PopulateContents()
+ new /obj/item/autosurgeon/organ/syndicate/syndie_mantis(src)
+ new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src)
+
+/datum/uplink_item/cybernetics/dualwield
+ name = "C.C.M.S Bundle"
+ desc = "A box containing an autosurgeon a C.C.M.S implant that lets you dual wield melee weapons."
+ item = /obj/item/autosurgeon/organ/syndicate/dualwield
+ cost = 10
+ purchasable_from = UPLINK_TRAITORS
+
+/datum/uplink_item/cybernetics/razorwire
+ name = "Razorwire Implant"
+ desc = "An integrated spool of razorwire, capable of being used as a weapon when whipped at your foes. \
+ Two tile range and can anchor further targets to keep them still."
+ item = /obj/item/autosurgeon/organ/syndicate/razorwire
+ progression_minimum = 15 MINUTES
+ cost = 5
+ surplus = 20
+
+/datum/uplink_item/cybernetics/hacked_linked_surgery
+ name = "Syndicate Surgery Implant"
+ desc = "A powerful brain implant, capable of uploading perfect, forbidden surgical knowledge to its users mind, \
+ allowing them to do just about any surgery, anywhere, without making any (unintentional) mistakes. \
+ Comes with a syndicate autosurgeon for immediate self-application."
+ cost = 10
+ item = /obj/item/autosurgeon/syndicate/hacked_linked_surgery
+ surplus = 50
+
+/datum/uplink_item/cybernetics/hivenode_implanter
+ name = "Hive Node Implanter"
+ desc = "A Xenomorph hive node. When implanted, allows connection to any Xenomorphs in nearby psionic networks."
+ cost = 5 //similar price to binary translator
+ item = /obj/item/autosurgeon/syndicate/organ/hivenode
+
+
+/datum/uplink_item/cybernetics/thermals
+ name = "Thermal Eyes"
+ desc = "These cybernetic eyes will give you thermal vision. Comes with only a single-use autosurgeon, a corner cut to achieve a lower price point."
+ item = /obj/item/autosurgeon/syndicate/thermal_eyes
+ cost = 5
+ surplus = 40
+
+/datum/uplink_item/cybernetics/xray
+ name = "X-ray Vision Implant"
+ desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon."
+ item = /obj/item/autosurgeon/syndicate/xray_eyes
+ cost = 10
+ surplus = 30
diff --git a/code/modules/uplink/uplink_items/dangerous.dm b/code/modules/uplink/uplink_items/dangerous.dm
deleted file mode 100644
index 780b45fd87d56..0000000000000
--- a/code/modules/uplink/uplink_items/dangerous.dm
+++ /dev/null
@@ -1,239 +0,0 @@
-//All bundles and telecrystals
-/datum/uplink_category/dangerous
- name = "Conspicuous Weapons"
- weight = 9
-
-/datum/uplink_item/dangerous
- category = /datum/uplink_category/dangerous
-
-/datum/uplink_item/dangerous/foampistol
- name = "Donksoft Riot Pistol Case"
- desc = "A case containing an innocent-looking toy pistol designed to fire foam darts at higher than normal velocity. \
- Comes loaded with riot-grade darts effective at incapacitating a target, two spare magazines and a box of loose \
- riot darts. Perfect for nonlethal takedowns at range, as well as deniability. While not included in the kit, the \
- pistol is compatible with suppressors, which can be purchased separately."
- item = /obj/item/storage/toolbox/guncase/traitor/donksoft
- cost = 2
- surplus = 50 //monkestation edit: from 10 to 50
- purchasable_from = ~UPLINK_NUKE_OPS
-
-/datum/uplink_item/dangerous/pistol
- name = "Makarov Pistol Case"
- desc = "A weapon case containing an unknown variant of the Makarov pistol, along with two spare magazines and a box of loose 9mm ammunition. \
- Chambered in 9mm. Perfect for frequent skirmishes with security, as well as ensuring you have enough firepower to outlast the competition. \
- While not included in the kit, the pistol is compatible with suppressors, which can be purchased seperately."
- item = /obj/item/storage/toolbox/guncase/traitor
- cost = 7
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/dangerous/whispering_jester_45
- name = "Whispering-Jester .45 ACP Handgun"
- desc = "A .45 handgun that is designed by Rayne Corp. The handgun has a built in suppressor. It's magazines contain 18 rounds."
- item = /obj/item/gun/ballistic/automatic/pistol/whispering_jester_45
- cost = 11
- surplus = 50
-
-/datum/uplink_item/dangerous/throwingweapons
- name = "Box of Throwing Weapons"
- desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \
- throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs."
- progression_minimum = 10 MINUTES
- item = /obj/item/storage/box/syndie_kit/throwing_weapons
- cost = 3
- illegal_tech = FALSE
-
-/datum/uplink_item/dangerous/sword
- name = "Energy Sword"
- desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \
- pocketed when inactive. Activating it produces a loud, distinctive noise."
- progression_minimum = 20 MINUTES
- item = /obj/item/melee/energy/sword/saber
- cost = 8
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/dangerous/powerfist
- name = "Power Fist"
- desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
- Upon hitting a target, the piston-ram will extend forward to make contact for some serious damage. \
- Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \
- deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
- progression_minimum = 20 MINUTES
- item = /obj/item/melee/powerfist
- cost = 6
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/dangerous/rapid
- name = "Gloves of the North Star"
- desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
- progression_minimum = 20 MINUTES
- item = /obj/item/clothing/gloves/rapid
- cost = 8
-
-/datum/uplink_item/dangerous/doublesword
- name = "Double-Bladed Energy Sword"
- desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
- all energy projectiles, but requires two hands to wield. It also struggles to protect you from tackles."
- progression_minimum = 30 MINUTES
- item = /obj/item/dualsaber
- cost = 16
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/dangerous/doublesword/get_discount_value(discount_type)
- switch(discount_type)
- if(TRAITOR_DISCOUNT_BIG)
- return 0.5
- if(TRAITOR_DISCOUNT_AVERAGE)
- return 0.35
- else
- return 0.2
-
-/datum/uplink_item/dangerous/guardian
- name = "Holoparasites"
- desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
- organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
- progression_minimum = 30 MINUTES
- item = /obj/item/guardian_creator/tech
- cost = 18
- surplus = 40 //monkestation edit: from 0 to 40
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- restricted = TRUE
- refundable = TRUE
-
-/datum/uplink_item/dangerous/revolver
- name = "Syndicate Revolver"
- desc = "Waffle Co.'s modernized Syndicate revolver. Fires 7 brutal rounds of .357 Magnum."
- item = /obj/item/gun/ballistic/revolver/syndicate
- progression_minimum = 30 MINUTES
- cost = 13
- surplus = 50
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/dangerous/razorwire
- name = "Razorwire Implant"
- desc = "An integrated spool of razorwire, capable of being used as a weapon when whipped at your foes. \
- Two tile range and can anchor further targets to keep them still."
- item = /obj/item/autosurgeon/organ/syndicate/razorwire
- progression_minimum = 15 MINUTES
- cost = 12
- surplus = 20
-
-/datum/uplink_item/dangerous/mantis_blade
- name = "Razorwire Implant"
- desc = "An integrated spool of razorwire, capable of being used as a weapon when whipped at your foes. \
- Two tile range and can anchor further targets to keep them still."
- item = /obj/item/autosurgeon/organ/syndicate/razorwire
- progression_minimum = 15 MINUTES
- cost = 12
- surplus = 20
-
-/datum/uplink_item/dangerous/cat
- name = "Feral cat grenade"
- desc = "This grenade is filled with 5 feral cats in stasis. Upon activation, the feral cats are awoken and unleashed unto unlucky bystanders. WARNING: The cats are not trained to discern friend from foe!"
- cost = 5
- item = /obj/item/grenade/spawnergrenade/cat
- surplus = 30
-
-/datum/uplink_item/dangerous/rebarxbowsyndie
- name = "Syndicate Rebar Crossbow"
- desc = "A much more proffessional version of the engineer's bootleg rebar crossbow. 3 shot mag, quicker loading, and better ammo. Owners manual included."
- item = /obj/item/storage/box/syndie_kit/rebarxbowsyndie
- cost = 10
-
-/datum/uplink_item/dangerous/minipea
- name = "5 peashooters strapped together"
- desc = "For use in a trash tank, 5 small machineguns strapped together using syndicate technology. It burns through ammo like no other."
- item = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minipea
- cost = 8
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/dangerous/devitt
- name = "Devitt Mk3 Light Tank"
- desc = "An ancient tank teleported in for your machinations, comes prepared with a cannon and machinegun. REQUIRES TWO CREWMEMBERS TO OPPERATE EFFECTIVELY."
- item = /obj/vehicle/sealed/mecha/devitt
- cost = 40
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/dangerous/laser_musket
- name = "Syndicate Laser Musket"
- desc = "An exprimental 'rifle' designed by Aetherofusion. This laser(probably) uses alien technology to fit 4 high energy capacitors \
- into a small rifle which can be stored safely(?) in any backpack. To charge, simply press down on the main control panel. \
- Rumors of this 'siphoning power off your lifeforce' are greatly exaggerated, and Aetherofusion assures safety for up to 2 years of use."
- item = /obj/item/gun/energy/laser/musket/syndicate
- progression_minimum = 30 MINUTES
- cost = 10
- surplus = 40
- purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/dangerous/venom_knife
- name = "Poisoned Knife"
- desc = "A knife that is made of two razor sharp blades, it has a secret compartment in the handle to store liquids which are injected when stabbing something. Can hold up to forty units of reagents but comes empty."
- item = /obj/item/knife/venom
- cost = 6 // all in all it's not super stealthy and you have to get some chemicals yourself
-
-/datum/uplink_item/dangerous/renoster
- name = "Renoster Shotgun Case"
- desc = "A twelve gauge shotgun with an eight shell capacity underneath. Comes with two boxes of buckshot."
- item = /obj/item/storage/toolbox/guncase/nova/opfor/renoster
- cost = 10
-
-/datum/uplink_item/dangerous/infanteria
- name = "Carwo-Cawil Battle Rifle Case"
- desc = "A heavy battle rifle, this one seems to be painted tacticool black. Accepts any standard SolFed rifle magazine. Comes with two mags. This will NOT fit in a backpack... "
- progression_minimum = 10 MINUTES
- item = /obj/item/storage/toolbox/guncase/nova/opfor/infanteria
- cost = 12
-
-/datum/uplink_item/dangerous/miecz
- name = "'Miecz' Submachinegun Case"
- desc = "A short barrel, further compacted conversion of the 'Lanca' rifle to fire pistol caliber cartridges. Comes with two magazines."
- progression_minimum = 10 MINUTES
- item = /obj/item/storage/toolbox/guncase/nova/opfor/miecz
- cost = 9
-
-/datum/uplink_item/dangerous/kiboko
- name = "Kiboko Grenade Launcher Case"
- desc = "A unique grenade launcher firing .980 grenades. A laser sight system allows its user to specify a range for the grenades it fires to detonate at. Comes with two C980 Grenade Drums."
- progression_minimum = 10 MINUTES
- item = /obj/item/storage/toolbox/guncase/nova/opfor/kiboko
- cost = 14
-
-/datum/uplink_item/dangerous/sidano
- name = "Sindano SMG"
- desc = "A small submachinegun, this one is painted in tacticool black. Accepts any standard Sol pistol magazine."
- progression_minimum = 10 MINUTES
- item = /obj/item/storage/toolbox/guncase/nova/pistol/opfor/sindano
- cost = 12
-
-/datum/uplink_item/dangerous/wespe
- name = "Wespe Pistol"
- desc = "The standard issue service pistol of SolFed's various military branches. Comes with attached light."
- progression_minimum = 5 MINUTES
- item = /obj/item/storage/toolbox/guncase/nova/pistol/opfor/wespe
- cost = 6
-
-/datum/uplink_item/dangerous/shotgun_revolver
- name = "\improper Bóbr 12 GA revolver"
- desc = "An outdated sidearm rarely seen in use by some members of the CIN. A revolver type design with a four shell cylinder. That's right, shell, this one shoots twelve guage."
- item = /obj/item/storage/box/syndie_kit/shotgun_revolver
- cost = 8
-
-/datum/uplink_item/dangerous/shit_smg
- name = "Surplus Smg Bundle"
- desc = "A single surplus Plastikov SMG and two extra magazines. A terrible weapon, perfect for henchmen."
- item = /obj/item/storage/box/syndie_kit/shit_smg_bundle
- cost = 4
-
-/datum/uplink_item/dangerous/fss_disk
- name = "FSS-550 disk"
- desc = "A disk that allows an autolathe to print the FSS-550 and associated ammo. \
- The FSS-550 is a modified version of the WT-550 autorifle, it's good for arming a large group, but is weaker compared to 'proper' guns."
- item = /obj/item/disk/design_disk/fss
- progression_minimum = 15 MINUTES
- cost = 5
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Because I don't think they get an autolathe or the resources to use the disk.
-
-/datum/uplink_item/dangerous/efireaxe
- name = "Syndicate Fire Axe"
- desc = "A modernised version of the infamous fire axe, courtesy of the Gorlex Marauders. Capable of breaching almost anything, and cleaving through almost any armour, it is to be handled with care."
- item = /obj/item/fireaxe/energy
- cost = 12
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index 0815cd7a735a7..38815a661a0d2 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -1,6 +1,6 @@
/datum/uplink_category/device_tools
name = "Misc. Gadgets"
- weight = 3
+ weight = 6
/datum/uplink_item/device_tools
category = /datum/uplink_category/device_tools
@@ -278,15 +278,6 @@
/datum/uplink_item/device_tools/rad_laser
surplus = 40
-/datum/uplink_item/device_tools/hacked_linked_surgery
- name = "Syndicate Surgery Implant"
- desc = "A powerful brain implant, capable of uploading perfect, forbidden surgical knowledge to its users mind, \
- allowing them to do just about any surgery, anywhere, without making any (unintentional) mistakes. \
- Comes with a syndicate autosurgeon for immediate self-application."
- cost = 12
- item = /obj/item/autosurgeon/syndicate/hacked_linked_surgery
- surplus = 50
-
/datum/uplink_item/device_tools/compressionkit
name = "Bluespace Compression Kit"
desc = "A modified version of a BSRPED that can be used to reduce the size of most items while retaining their original functions! \
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index 56c0f1d249dd6..fa4e8100f6e2d 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -1,6 +1,6 @@
/datum/uplink_category/explosives
name = "Explosives"
- weight = 6
+ weight = 3
/datum/uplink_item/explosives
category = /datum/uplink_category/explosives
@@ -10,6 +10,7 @@
desc = "A traditional clusterbang grenade with a payload consisting entirely of Syndicate soap. Useful in any scenario!"
item = /obj/item/grenade/clusterbuster/soap
cost = 3
+ surplus = 60
/datum/uplink_item/explosives/c4
name = "Composition C-4"
@@ -50,7 +51,7 @@
/datum/uplink_item/explosives/emp
name = "EMP Grenades and Implanter Kit"
- desc = "A box that contains five EMP grenades and an EMP implant with three uses. Useful to disrupt communications, \
+ desc = "A box that contains five EMP grenades. Useful to disrupt communications, \
security's energy weapons and silicon lifeforms when you're in a tight spot."
item = /obj/item/storage/box/syndie_kit/emp
cost = 2
@@ -107,8 +108,12 @@
. = ..()
desc = replacetext(desc, "%MIN_BOMB_TIMER", SYNDIEBOMB_MIN_TIMER_SECONDS)
-/datum/uplink_item/explosives/soap_clusterbang
- surplus = 60
+/datum/uplink_item/explosives/cat
+ name = "Feral cat grenade"
+ desc = "This grenade is filled with 5 feral cats in stasis. Upon activation, the feral cats are awoken and unleashed unto unlucky bystanders. WARNING: The cats are not trained to discern friend from foe!"
+ cost = 5
+ item = /obj/item/grenade/spawnergrenade/cat
+ surplus = 30
/datum/uplink_item/explosives/explosive_flash
name = "Explosive Flash"
diff --git a/code/modules/uplink/uplink_items/firearms.dm b/code/modules/uplink/uplink_items/firearms.dm
new file mode 100644
index 0000000000000..a52fd1a0b1e15
--- /dev/null
+++ b/code/modules/uplink/uplink_items/firearms.dm
@@ -0,0 +1,156 @@
+/datum/uplink_category/firearms
+ name = "Firearms"
+ weight = 9
+
+/datum/uplink_item/firearms
+ category = /datum/uplink_category/firearms
+
+/datum/uplink_item/firearms/foampistol
+ name = "Donksoft Riot Pistol Case"
+ desc = "A case containing an innocent-looking toy pistol designed to fire foam darts at higher than normal velocity. \
+ Comes loaded with riot-grade darts effective at incapacitating a target, two spare magazines and a box of loose \
+ riot darts. Perfect for nonlethal takedowns at range, as well as deniability. While not included in the kit, the \
+ pistol is compatible with suppressors, which can be purchased separately."
+ item = /obj/item/storage/toolbox/guncase/traitor/donksoft
+ cost = 2
+ surplus = 50
+ purchasable_from = ~UPLINK_NUKE_OPS
+
+/datum/uplink_item/firearms/pistol
+ name = "Makarov Pistol Case"
+ desc = "A weapon case containing an unknown variant of the Makarov pistol, along with two spare magazines and a box of loose 9mm ammunition. \
+ Chambered in 9mm. Perfect for frequent skirmishes with security, as well as ensuring you have enough firepower to outlast the competition. \
+ While not included in the kit, the pistol is compatible with suppressors, which can be purchased seperately."
+ item = /obj/item/storage/toolbox/guncase/traitor
+ cost = 7
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/firearms/whispering_jester_45
+ name = "Whispering-Jester .45 ACP Handgun"
+ desc = "A .45 handgun that is designed by Rayne Corp. The handgun has a built in suppressor. It's magazines contain 18 rounds."
+ item = /obj/item/gun/ballistic/automatic/pistol/whispering_jester_45
+ cost = 10
+ surplus = 50
+
+/datum/uplink_item/firearms/throwingweapons
+ name = "Box of Throwing Weapons"
+ desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \
+ throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs."
+ progression_minimum = 10 MINUTES
+ item = /obj/item/storage/box/syndie_kit/throwing_weapons
+ cost = 3
+ illegal_tech = FALSE
+
+/datum/uplink_item/firearms/crossbow
+ name = "Miniature Energy Crossbow"
+ desc = "A short bow mounted across a tiller in miniature. \
+ Small enough to fit into a pocket or slip into a bag unnoticed. \
+ It will synthesize and fire bolts tipped with a debilitating \
+ toxin that will damage and disorient targets, causing them to \
+ slur as if inebriated. It can produce an infinite number \
+ of bolts, but takes time to automatically recharge after each shot."
+ item = /obj/item/gun/energy/recharge/ebow
+ cost = 10
+ surplus = 50
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+
+/datum/uplink_item/firearms/guardian
+ name = "Holoparasites"
+ desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
+ organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
+ progression_minimum = 30 MINUTES
+ item = /obj/item/guardian_creator/tech
+ cost = 15
+ surplus = 40
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ restricted = TRUE
+ refundable = TRUE
+
+/datum/uplink_item/firearms/revolver
+ name = "Syndicate Revolver"
+ desc = "Waffle Co.'s modernized Syndicate revolver. Fires 7 brutal rounds of .357 Magnum."
+ item = /obj/item/gun/ballistic/revolver/syndicate
+ progression_minimum = 30 MINUTES
+ cost = 13
+ surplus = 50
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/firearms/rebarxbowsyndie
+ name = "Syndicate Rebar Crossbow"
+ desc = "A much more proffessional version of the engineer's bootleg rebar crossbow. 3 shot mag, quicker loading, and better ammo. Owners manual included."
+ item = /obj/item/storage/box/syndie_kit/rebarxbowsyndie
+ cost = 10
+
+/datum/uplink_item/firearms/laser_musket
+ name = "Syndicate Laser Musket"
+ desc = "An exprimental 'rifle' designed by Aetherofusion. This laser(probably) uses alien technology to fit 4 high energy capacitors \
+ into a small rifle which can be stored safely(?) in any backpack. To charge, simply press down on the main control panel. \
+ Rumors of this 'siphoning power off your lifeforce' are greatly exaggerated, and Aetherofusion assures safety for up to 2 years of use."
+ item = /obj/item/gun/energy/laser/musket/syndicate
+ progression_minimum = 30 MINUTES
+ cost = 10
+ surplus = 40
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/firearms/renoster
+ name = "Renoster Shotgun Case"
+ desc = "A twelve gauge shotgun with an eight shell capacity underneath. Comes with two boxes of buckshot."
+ item = /obj/item/storage/toolbox/guncase/nova/opfor/renoster
+ cost = 10
+
+/datum/uplink_item/firearms/shotgun_revolver
+ name = "\improper Bóbr 12 GA revolver"
+ desc = "An outdated sidearm rarely seen in use by some members of the CIN. A revolver type design with a four shell cylinder. That's right, shell, this one shoots twelve guage."
+ item = /obj/item/storage/box/syndie_kit/shotgun_revolver
+ cost = 8
+
+/datum/uplink_item/firearms/shit_smg
+ name = "Surplus Smg Bundle"
+ desc = "A single surplus Plastikov SMG and two extra magazines. A terrible weapon, perfect for henchmen."
+ item = /obj/item/storage/box/syndie_kit/shit_smg_bundle
+ cost = 4
+
+/datum/uplink_item/firearms/renoster
+ name = "Renoster Shotgun Case"
+ desc = "A twelve gauge shotgun with an eight shell capacity underneath. Comes with two boxes of buckshot."
+ item = /obj/item/storage/toolbox/guncase/nova/opfor/renoster
+ cost = 10
+
+/datum/uplink_item/firearms/slipstick
+ name = "Syndie Lipstick"
+ desc = "Stylish way to kiss to death, isn't it syndiekisser?"
+ item = /obj/item/lipstick/syndie
+ cost = 12
+
+/datum/uplink_item/firearms/dart_pistol
+ name = "Dart Pistol"
+ desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any \
+ space a small item can."
+ item = /obj/item/gun/syringe/syndicate
+ cost = 4
+ surplus = 50
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/firearms/fss_disk
+ name = "FSS-550 disk"
+ desc = "A disk that allows an autolathe to print the FSS-550 and associated ammo. \
+ The FSS-550 is a modified version of the WT-550 autorifle, it's good for arming a large group, but is weaker compared to 'proper' guns."
+ item = /obj/item/disk/design_disk/fss
+ progression_minimum = 15 MINUTES
+ cost = 5
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Because I don't think they get an autolathe or the resources to use the disk.
+
+/datum/uplink_item/firearms/minipea
+ name = "5 peashooters strapped together"
+ desc = "For use in a trash tank, 5 small machineguns strapped together using syndicate technology. It burns through ammo like no other."
+ item = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minipea
+ cost = 8
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/firearms/devitt
+ name = "Devitt Mk3 Light Tank"
+ desc = "An ancient tank teleported in for your machinations, comes prepared with a cannon and machinegun. REQUIRES TWO CREWMEMBERS TO OPPERATE EFFECTIVELY."
+ item = /obj/vehicle/sealed/mecha/devitt
+ cost = 40
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/code/modules/uplink/uplink_items/gadgets.dm b/code/modules/uplink/uplink_items/gadgets.dm
index a6229d72a61c8..4da1da147f817 100644
--- a/code/modules/uplink/uplink_items/gadgets.dm
+++ b/code/modules/uplink/uplink_items/gadgets.dm
@@ -64,9 +64,3 @@
item = /obj/item/tank/jetpack/harness
cost = 1
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/device_tools/hivenode_implanter
- name = "Hive Node Implanter"
- desc = "A Xenomorph hive node. When implanted, allows connection to any Xenomorphs in nearby psionic networks."
- cost = 5 //similar price to binary translator
- item = /obj/item/autosurgeon/syndicate/organ/hivenode
diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm
index 37fa3b697c8a1..e3b796a0af2bc 100644
--- a/code/modules/uplink/uplink_items/implant.dm
+++ b/code/modules/uplink/uplink_items/implant.dm
@@ -25,6 +25,11 @@
cost = 4
restricted = TRUE
+/datum/uplink_item/implants/emp
+ name = "EMP Implant"
+ desc = "An EMP implant with 3 uses. Releases a EMP wave that disrupts silicons, energy weapons, and communications among other technology."
+ item = /obj/item/implanter/emp
+ cost = 2
/datum/uplink_item/implants/stealthimplant
name = "Stealth Implant"
@@ -50,20 +55,6 @@
surplus = 0
restricted = TRUE
-/datum/uplink_item/implants/thermals
- name = "Thermal Eyes"
- desc = "These cybernetic eyes will give you thermal vision. Comes with only a single-use autosurgeon, a corner cut to achieve a lower price point."
- item = /obj/item/autosurgeon/syndicate/thermal_eyes
- cost = 5
- surplus = 40 //monkestation edit: from 0 to 40
-
-/datum/uplink_item/implants/xray
- name = "X-ray Vision Implant"
- desc = "These cybernetic eyes will give you X-ray vision. Comes with an autosurgeon."
- item = /obj/item/autosurgeon/syndicate/xray_eyes
- cost = 10
- surplus = 30 //monkestation edit: from 0 to 30
-
/datum/uplink_item/implants/hardlight
name = "Hardlight Spear Implant"
desc = "An implant that allows you to summon and control a hardlight spear. \
diff --git a/code/modules/uplink/uplink_items/melees.dm b/code/modules/uplink/uplink_items/melees.dm
new file mode 100644
index 0000000000000..23377d8cf0040
--- /dev/null
+++ b/code/modules/uplink/uplink_items/melees.dm
@@ -0,0 +1,99 @@
+/datum/uplink_category/melees
+ name = "Melees"
+ weight = 7
+
+/datum/uplink_item/melees
+ category = /datum/uplink_category/melees
+
+/datum/uplink_item/melees/efireaxe
+ name = "Syndicate Fire Axe"
+ desc = "A modernised version of the infamous fire axe, courtesy of the Gorlex Marauders. Capable of breaching almost anything, and cleaving through almost any armour, it is to be handled with care."
+ item = /obj/item/fireaxe/energy
+ cost = 12
+
+/datum/uplink_item/melees/sword
+ name = "Energy Sword"
+ desc = "The energy sword is an edged weapon with a blade of pure energy. The sword is small enough to be \
+ pocketed when inactive. Activating it produces a loud, distinctive noise."
+ progression_minimum = 20 MINUTES
+ item = /obj/item/melee/energy/sword/saber
+ cost = 8
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/melees/powerfist
+ name = "Power Fist"
+ desc = "The power-fist is a metal gauntlet with a built-in piston-ram powered by an external gas supply.\
+ Upon hitting a target, the piston-ram will extend forward to make contact for some serious damage. \
+ Using a wrench on the piston valve will allow you to tweak the amount of gas used per punch to \
+ deal extra damage and hit targets further. Use a screwdriver to take out any attached tanks."
+ progression_minimum = 20 MINUTES
+ item = /obj/item/melee/powerfist
+ cost = 18
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/melees/rapid
+ name = "Gloves of the North Star"
+ desc = "These gloves let the user punch people very fast. Does not improve weapon attack speed or the meaty fists of a hulk."
+ progression_minimum = 20 MINUTES
+ item = /obj/item/clothing/gloves/rapid
+ cost = 8
+
+/datum/uplink_item/melees/doublesword
+ name = "Double-Bladed Energy Sword"
+ desc = "The double-bladed energy sword does slightly more damage than a standard energy sword and will deflect \
+ all energy projectiles, but requires two hands to wield. It also struggles to protect you from tackles."
+ progression_minimum = 30 MINUTES
+ item = /obj/item/dualsaber
+ cost = 18
+ purchasable_from = ~UPLINK_CLOWN_OPS
+
+/datum/uplink_item/melees/doublesword/get_discount_value(discount_type)
+ switch(discount_type)
+ if(TRAITOR_DISCOUNT_BIG)
+ return 0.5
+ if(TRAITOR_DISCOUNT_AVERAGE)
+ return 0.35
+ else
+ return 0.2
+
+/datum/uplink_item/melees/venom_knife
+ name = "Poisoned Knife"
+ desc = "A knife that is made of two razor sharp blades, it has a secret compartment in the handle to store liquids which are injected when stabbing something.\
+ Can hold up to forty units of reagents but comes empty."
+ item = /obj/item/knife/venom
+ cost = 6 // all in all it's not super stealthy and you have to get some chemicals yourself
+
+/datum/uplink_item/melees/contrabaton
+ name = "Contractor Baton"
+ desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. \
+ These shocks are capable of affecting the inner circuitry of most robots as well, applying a short stun. \
+ Has the added benefit of affecting the vocal cords of your victim, causing them to slur as if inebriated."
+ item = /obj/item/melee/baton/telescopic/contractor_baton
+ cost = 12
+ surplus = 50
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/melees/martialarts
+ name = "Martial Arts Scroll"
+ desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat \
+ and gain the ability to swat bullets from the air, but you will also refuse to use dishonorable ranged weaponry."
+ item = /obj/item/book/granter/martial/carp
+ progression_minimum = 30 MINUTES
+ cost = 12 //monke edit
+ surplus = 30 //monkestation edit: from 0 to 30
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/melees/martialarts/advanced
+ name = "Blood-stained Martial Arts Scroll"
+ desc = "A scroll penned by the infamous Awakened Dragon, penned with the blood of their \
+ disciples, it appears to have clues towards true enlightenment in the path of the Sleeping Carp."
+ cost = 20
+ item = /obj/item/book/granter/martial/carp/true
+ lock_other_purchases = TRUE
+ purchasable_from = ~(UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS)
+
+/datum/uplink_item/melees/edagger
+ name = "Energy Dagger"
+ desc = "A dagger made of energy that looks and functions as a pen when off."
+ item = /obj/item/pen/edagger
+ cost = 2
diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm
index f5f9894f29aff..48d87a2c965ce 100644
--- a/code/modules/uplink/uplink_items/stealthy.dm
+++ b/code/modules/uplink/uplink_items/stealthy.dm
@@ -5,35 +5,13 @@
/datum/uplink_item/stealthy_weapons
category = /datum/uplink_category/stealthy
-
-/datum/uplink_item/stealthy_weapons/dart_pistol
- name = "Dart Pistol"
- desc = "A miniaturized version of a normal syringe gun. It is very quiet when fired and can fit into any \
- space a small item can."
- item = /obj/item/gun/syringe/syndicate
- cost = 4
- surplus = 50
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
/datum/uplink_item/stealthy_weapons/dehy_carp
name = "Dehydrated Space Carp"
- desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Activate in \
+ desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Squeeze in \
your hand before use so it knows not to kill you."
item = /obj/item/toy/plush/carpplushie/dehy_carp
cost = 1
-/datum/uplink_item/stealthy_weapons/edagger
- name = "Energy Dagger"
- desc = "A dagger made of energy that looks and functions as a pen when off."
- item = /obj/item/pen/edagger
- cost = 2
-
-/datum/uplink_item/stealthy_weapons/slipstick
- name = "Syndie Lipstick"
- desc = "Stylish way to kiss to death, isn't it syndiekisser?"
- item = /obj/item/lipstick/syndie
- cost = 12
-
/datum/uplink_item/stealthy_weapons/traitor_chem_bottle
name = "Poison Kit"
desc = "An assortment of deadly chemicals packed into a compact box. Comes with a syringe for more precise application."
@@ -45,15 +23,10 @@
name = "Suppressor"
desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Makarov, Stechkin APS and C-20r, but not revolvers or energy guns."
item = /obj/item/suppressor
- cost = 3
+ cost = 1
surplus = 10
purchasable_from = ~UPLINK_CLOWN_OPS
-
-/datum/uplink_item/stealthy_weapons/holster
- name = "Syndicate Holster"
- desc = "A useful little device that allows for inconspicuous carrying of guns using chameleon technology. It also allows for badass gun-spinning."
- item = /obj/item/storage/belt/holster/chameleon
- cost = 1
+ illegal_tech = FALSE
/datum/uplink_item/stealthy_weapons/sleepy_pen
name = "Sleepy Pen"
@@ -75,46 +48,3 @@
cost = 4
surplus = 50 //monkestation edit: from 0 to 50
purchasable_from = ~UPLINK_NUKE_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans.
-
-
-/datum/uplink_item/stealthy_weapons/martialarts
- name = "Martial Arts Scroll"
- desc = "This scroll contains the secrets of an ancient martial arts technique. You will master unarmed combat \
- and gain the ability to swat bullets from the air, but you will also refuse to use dishonorable ranged weaponry."
- item = /obj/item/book/granter/martial/carp
- progression_minimum = 30 MINUTES
- cost = 12 //monke edit
- surplus = 30 //monkestation edit: from 0 to 30
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/stealthy_weapons/crossbow
- name = "Miniature Energy Crossbow"
- desc = "A short bow mounted across a tiller in miniature. \
- Small enough to fit into a pocket or slip into a bag unnoticed. \
- It will synthesize and fire bolts tipped with a debilitating \
- toxin that will damage and disorient targets, causing them to \
- slur as if inebriated. It can produce an infinite number \
- of bolts, but takes time to automatically recharge after each shot."
- item = /obj/item/gun/energy/recharge/ebow
- cost = 10
- surplus = 50
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/stealthy_weapons/contrabaton
- name = "Contractor Baton"
- desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets. \
- These shocks are capable of affecting the inner circuitry of most robots as well, applying a short stun. \
- Has the added benefit of affecting the vocal cords of your victim, causing them to slur as if inebriated."
- item = /obj/item/melee/baton/telescopic/contractor_baton
- cost = 12
- surplus = 50
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/stealthy_weapons/martialarts/advanced
- name = "Blood-stained Martial Arts Scroll"
- desc = "A scroll penned by the infamous Awakened Dragon, penned with the blood of their \
- disciples, it appears to have clues towards true enlightenment in the path of the Sleeping Carp."
- cost = 20
- item = /obj/item/book/granter/martial/carp/true
- lock_other_purchases = TRUE
- purchasable_from = ~(UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS)
diff --git a/code/modules/uplink/uplink_items/suits.dm b/code/modules/uplink/uplink_items/utility_clothing.dm
similarity index 74%
rename from code/modules/uplink/uplink_items/suits.dm
rename to code/modules/uplink/uplink_items/utility_clothing.dm
index 0575fb610633e..71f026e5eafc7 100644
--- a/code/modules/uplink/uplink_items/suits.dm
+++ b/code/modules/uplink/uplink_items/utility_clothing.dm
@@ -1,14 +1,14 @@
// File ordered by progression
-/datum/uplink_category/suits
- name = "Space Suits"
- weight = 3
+/datum/uplink_category/utility_clothing
+ name = "Utility Clothing"
+ weight = 4
-/datum/uplink_item/suits
- category = /datum/uplink_category/suits
+/datum/uplink_item/utility_clothing
+ category = /datum/uplink_category/utility_clothing
surplus = 40
-/datum/uplink_item/suits/infiltrator_bundle
+/datum/uplink_item/utility_clothing/infiltrator_bundle
name = "Infiltrator MODsuit"
desc = "Developed by the Roseus Galactic Actors Guild in conjunction with the Gorlex Marauders to produce a functional suit for urban operations, \
this suit proves to be cheaper than your standard issue MODsuit, with none of the movement restrictions of the space suits employed by the company. \
@@ -19,13 +19,13 @@
cost = 6
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-/datum/uplink_item/suits/noslip
+/datum/uplink_item/utility_clothing/noslip
name = "MODsuit Anti-Slip Module"
desc = "A MODsuit module preventing the user from slipping on water."
item = /obj/item/mod/module/noslip
cost = 2
-/datum/uplink_item/suits/space_suit
+/datum/uplink_item/utility_clothing/space_suit
name = "Syndicate Space Suit"
desc = "This red Syndicate space suit is less encumbering than Nanotrasen variants, \
fits inside bags, and has a weapon slot. Nanotrasen crew members are trained to report red space suit \
@@ -33,46 +33,45 @@
item = /obj/item/storage/box/syndie_kit/space
cost = 4
-
-/datum/uplink_item/suits/modsuit
+/datum/uplink_item/utility_clothing/modsuit
name = "Syndicate MODsuit"
desc = "The feared MODsuit of a Syndicate agent. Features armoring and a set of inbuilt modules."
item = /obj/item/mod/control/pre_equipped/traitor
cost = 8
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //you can't buy it in nuke, because the elite modsuit costs the same while being better
-/datum/uplink_item/suits/thermal
+/datum/uplink_item/utility_clothing/thermal
name = "MODsuit Thermal Visor Module"
desc = "A visor for a MODsuit. Lets you see living beings through walls."
item = /obj/item/mod/module/visor/thermal
cost = 3
-/datum/uplink_item/suits/night
+/datum/uplink_item/utility_clothing/night
name = "MODsuit Night Visor Module"
desc = "A visor for a MODsuit. Lets you see clearer in the dark."
item = /obj/item/mod/module/visor/night
cost = 2
-/datum/uplink_item/suits/chameleon
+/datum/uplink_item/utility_clothing/chameleon
name = "MODsuit Chameleon Module"
desc = "A MODsuit module that lets the suit disguise itself as other objects."
item = /obj/item/mod/module/chameleon
cost = 2
-/datum/uplink_item/suits/plate_compression
+/datum/uplink_item/utility_clothing/plate_compression
name = "MODsuit Plate Compression Module"
desc = "A MODsuit module that lets the suit compress into a smaller size. Not compatible with storage modules or the Infiltrator MODsuit."
item = /obj/item/mod/module/plate_compression
cost = 2
-/datum/uplink_item/suits/noslip
+/datum/uplink_item/utility_clothing/noslip
name = "MODsuit Anti-Slip Module"
desc = "A MODsuit module preventing the user from slipping on water."
item = /obj/item/mod/module/noslip
cost = 2
-/datum/uplink_item/suits/modsuit/elite_traitor
+/datum/uplink_item/utility_clothing/modsuit/elite_traitor
name = "Elite Syndicate MODsuit"
desc = "An upgraded, elite version of the Syndicate MODsuit. It features fireproofing, and also \
provides the user with superior armor and mobility compared to the standard Syndicate MODsuit."
@@ -83,16 +82,23 @@
cost = 16
cant_discount = TRUE
-/datum/uplink_item/suits/modsuit/Wraith
+/datum/uplink_item/utility_clothing/modsuit/Wraith
name = "MODsuit wraith cloaking module"
desc = "A MODsuit module that grants to the user Optical camouflage and the ability to overload light sources to recharge suit power."
item = /obj/item/mod/module/stealth/wraith
cost = 2
-/datum/uplink_item/suits/syndie_armor
+/datum/uplink_item/utility_clothing/syndie_armor
name = "Syndicate Body armor"
- desc = "A highly compact set of body armor with two inner slots for small items.\
- It comes with chameleon features."
+ desc = "A highly compact set of body armor with two inner slots for small items. \
+ It comes with chameleon features being able to appear as other outwears. This function be locked with a multitool"
item = /obj/item/clothing/suit/chameleon/syndie_armor
cost = 4
purchasable_from = ALL
+
+/datum/uplink_item/utility_clothing/holster
+ name = "Syndicate Holster"
+ desc = "A useful little device that allows for inconspicuous carrying of guns using chameleon technology. It also allows for badass gun-spinning."
+ item = /obj/item/storage/belt/holster/chameleon
+ cost = 1
+
diff --git a/monkestation/code/modules/cybernetics/augments/uplink/uplink.dm b/monkestation/code/modules/cybernetics/augments/uplink/uplink.dm
deleted file mode 100644
index 56729ef34c2d6..0000000000000
--- a/monkestation/code/modules/cybernetics/augments/uplink/uplink.dm
+++ /dev/null
@@ -1,31 +0,0 @@
-/datum/uplink_item/bundles_tc/sandy
- name = "Sandevistan Bundle"
- desc = "A box containing an autosurgeon for a sandevistan, allowing you to outspeed targets."
- item = /obj/item/storage/box/syndie_kit/sandy
- cost = 12
- purchasable_from = UPLINK_TRAITORS
-
-/obj/item/storage/box/syndie_kit/sandy/PopulateContents()
- new /obj/item/autosurgeon/organ/syndicate/sandy(src)
-
-
-/datum/uplink_item/bundles_tc/mantis
- name = "Mantis Blade Bundle"
- desc = "A box containing autosurgeons for two mantis blade implants, one for each arm."
- item = /obj/item/storage/box/syndie_kit/mantis
- cost = 12
- purchasable_from = UPLINK_TRAITORS
-
-/obj/item/storage/box/syndie_kit/mantis/PopulateContents()
- new /obj/item/autosurgeon/organ/syndicate/syndie_mantis(src)
- new /obj/item/autosurgeon/organ/syndicate/syndie_mantis/l(src)
-
-/datum/uplink_item/bundles_tc/dualwield
- name = "C.C.M.S Bundle"
- desc = "A box containing an autosurgeon a C.C.M.S implant that lets you dual wield melee weapons."
- item = /obj/item/storage/box/syndie_kit/dualwield
- cost = 12
- purchasable_from = UPLINK_TRAITORS
-
-/obj/item/storage/box/syndie_kit/dualwield/PopulateContents()
- new /obj/item/autosurgeon/organ/syndicate/dualwield(src)
diff --git a/tgstation.dme b/tgstation.dme
index 526f070ffb083..f1f7817d863ca 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6202,17 +6202,19 @@
#include "code\modules\uplink\uplink_items\ammunition.dm"
#include "code\modules\uplink\uplink_items\badass.dm"
#include "code\modules\uplink\uplink_items\bundle.dm"
-#include "code\modules\uplink\uplink_items\dangerous.dm"
+#include "code\modules\uplink\uplink_items\cybernetics.dm"
#include "code\modules\uplink\uplink_items\device_tools.dm"
#include "code\modules\uplink\uplink_items\explosive.dm"
+#include "code\modules\uplink\uplink_items\firearms.dm"
#include "code\modules\uplink\uplink_items\gadgets.dm"
#include "code\modules\uplink\uplink_items\implant.dm"
#include "code\modules\uplink\uplink_items\job.dm"
+#include "code\modules\uplink\uplink_items\melees.dm"
#include "code\modules\uplink\uplink_items\nukeops.dm"
#include "code\modules\uplink\uplink_items\species.dm"
#include "code\modules\uplink\uplink_items\stealthy.dm"
#include "code\modules\uplink\uplink_items\stealthy_tools.dm"
-#include "code\modules\uplink\uplink_items\suits.dm"
+#include "code\modules\uplink\uplink_items\utility_clothing.dm"
#include "code\modules\vehicles\_vehicle.dm"
#include "code\modules\vehicles\artillery.dm"
#include "code\modules\vehicles\atv.dm"
@@ -7745,7 +7747,6 @@
#include "monkestation\code\modules\cybernetics\augments\leg_augments\_base.dm"
#include "monkestation\code\modules\cybernetics\augments\leg_augments\chemplants.dm"
#include "monkestation\code\modules\cybernetics\augments\leg_augments\traits.dm"
-#include "monkestation\code\modules\cybernetics\augments\uplink\uplink.dm"
#include "monkestation\code\modules\cybernetics\black_markets\aftermarket_implants.dm"
#include "monkestation\code\modules\cybernetics\clothing\suits.dm"
#include "monkestation\code\modules\cybernetics\components\slowing_field.dm"
From ee58aaadb7fd9335981945326850dc1c2b222617 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 17:58:27 -0400
Subject: [PATCH 12/29] finishes up cybernetics, ulti, and implants
---
.../projectiles/guns/ballistic/shotgun.dm | 1 -
.../uplink/uplink_items/cybernetics.dm | 8 +-
.../uplink/uplink_items/device_tools.dm | 85 +++++++++++++++++--
code/modules/uplink/uplink_items/firearms.dm | 13 ---
code/modules/uplink/uplink_items/gadgets.dm | 66 --------------
code/modules/uplink/uplink_items/implant.dm | 26 +++---
.../uplink/uplink_items/stealthy_tools.dm | 19 -----
.../uplink/uplink_items/utility_clothing.dm | 23 ++++-
.../objects/items/implants/implant_misc.dm | 1 +
tgstation.dme | 1 -
10 files changed, 120 insertions(+), 123 deletions(-)
delete mode 100644 code/modules/uplink/uplink_items/gadgets.dm
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index dfcb354614bd3..c21bcf3e8269e 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -129,7 +129,6 @@
pin = /obj/item/firing_pin/implant/pindicate
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/riot/evil
/obj/item/gun/ballistic/shotgun/riot/sol/evil/unrestricted
- pin = /obj/item/firing_pin
// Automatic Shotguns//
diff --git a/code/modules/uplink/uplink_items/cybernetics.dm b/code/modules/uplink/uplink_items/cybernetics.dm
index f8659d348026d..7121f4d7e245c 100644
--- a/code/modules/uplink/uplink_items/cybernetics.dm
+++ b/code/modules/uplink/uplink_items/cybernetics.dm
@@ -29,7 +29,7 @@
name = "C.C.M.S Bundle"
desc = "A box containing an autosurgeon a C.C.M.S implant that lets you dual wield melee weapons."
item = /obj/item/autosurgeon/organ/syndicate/dualwield
- cost = 10
+ cost = 8
purchasable_from = UPLINK_TRAITORS
/datum/uplink_item/cybernetics/razorwire
@@ -70,3 +70,9 @@
item = /obj/item/autosurgeon/syndicate/xray_eyes
cost = 10
surplus = 30
+
+/datum/uplink_item/cybernetics/autosurgeon
+ name = "Syndicate Autosurgeon"
+ desc = "A multi-use autosurgeon for implanting whatever you want into yourself. Rip that station apart and make it part of you."
+ item = /obj/item/autosurgeon/syndicate
+ cost = 5
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index 38815a661a0d2..dc5f3ec2870a2 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -28,7 +28,7 @@
as well as talk on an encrypted Syndicate channel with other agents that have the same key. In addition, this key also protects \
your headset from radio jammers."
item = /obj/item/encryptionkey/syndicate
- cost = 2
+ cost = 1
surplus = 75
restricted = TRUE
@@ -296,8 +296,81 @@
item = /obj/item/autosurgeon/syndicate/polyglot_voicebox
surplus = 25
-/datum/uplink_item/device_tools/autosurgeon
- name = "Syndicate Autosurgeon"
- desc = "A multi-use autosurgeon for implanting whatever you want into yourself. Rip that station apart and make it part of you."
- item = /obj/item/autosurgeon/syndicate
- cost = 5
+/datum/uplink_item/device_tools/guardian
+ name = "Holoparasites"
+ desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
+ organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
+ progression_minimum = 30 MINUTES
+ item = /obj/item/guardian_creator/tech
+ cost = 15
+ surplus = 40
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ restricted = TRUE
+ refundable = TRUE
+
+/datum/uplink_item/device_tools/syndie_glue
+ name = "Glue"
+ desc = "A cheap bottle of one use syndicate brand super glue. \
+ Use on any item to make it undroppable. \
+ Be careful not to glue an item you're already holding!"
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/syndie_glue
+ cost = 2
+
+/datum/uplink_item/device_tools/neutered_borer_egg
+ name = "Neutered borer egg"
+ desc = "A borer egg specifically bred to aid operatives. \
+ It will obey every command and protect whatever operative they first see when hatched. \
+ Unfortunately due to extreme radiation exposure, they cannot reproduce. \
+ It was put into a cage for easy tranportation"
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/neutered_borer_spawner
+ cost = 20
+ surplus = 40
+ refundable = TRUE
+
+/datum/uplink_item/stealthy_tools/chameleonheadsetdeluxe
+ name = "Advanced Chameleon Headset"
+ desc = "A premium model Chameleon Headset. All the features you love of the original, but now with flashbang \
+ protection, voice amplification, memory-foam, HD Sound Quality, and extra-wide spectrum dial. Usually reserved \
+ for high-ranking Cybersun officers, a few spares have been reserved for field agents."
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/radio/headset/chameleon/advanced
+ cost = 2
+
+/datum/uplink_item/device_tools/plasma_license
+ name = "License to Plasmaflood"
+ desc = "A contract abusing a loophole found by plasmamen to invade halls with harmful gases \
+ without repercussion or warning, garnering no attention from any higher powers. \
+ Has to be signed by purchaser to be considered valid."
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/card/plasma_license
+ cost = 20
+
+/datum/uplink_item/device_tools/super_kitty_ears
+ name = "Super Syndie-Kitty Ears"
+ desc = "Developed by several Interdyne Pharmaceutics scientists and Wizard Federation archmages during a record-breaking rager, \
+ this set of feline ears combines the finest of bio-engineering and thamaturgy to allow the user to transform to and from a cat at will, \
+ granting them all the benefits (and downsides) of being a true feline, such as ventcrawling. \
+ However, this form will be clad in blood-red Syndicate armor, making its origin somewhat obvious."
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/organ/internal/ears/cat/super/syndie
+ cost = 16 // double the price of stealth implant
+ surplus = 5
+ limited_stock = 1
+ lock_secondary_objectives = TRUE // no you can't cheese progtot with ventcrawling
+
+/datum/uplink_item/device_tools/magboots
+ name = "Blood-Red Magboots"
+ desc = "A pair of magnetic boots with a Syndicate paintjob that assist with freer movement in space or on-station \
+ during gravitational generator failures."
+ item = /obj/item/clothing/shoes/magboots/syndie
+ cost = 1
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/device_tools/jetpack_harness
+ name = "Jet Harness"
+ desc = "A lightweight tactical jetpack harness, used by those who don't want to be weighed down by traditional jetpacks."
+ item = /obj/item/tank/jetpack/harness
+ cost = 1
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/code/modules/uplink/uplink_items/firearms.dm b/code/modules/uplink/uplink_items/firearms.dm
index a52fd1a0b1e15..ec9307d0bf456 100644
--- a/code/modules/uplink/uplink_items/firearms.dm
+++ b/code/modules/uplink/uplink_items/firearms.dm
@@ -54,19 +54,6 @@
surplus = 50
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/firearms/guardian
- name = "Holoparasites"
- desc = "Though capable of near sorcerous feats via use of hardlight holograms and nanomachines, they require an \
- organic host as a home base and source of fuel. Holoparasites come in various types and share damage with their host."
- progression_minimum = 30 MINUTES
- item = /obj/item/guardian_creator/tech
- cost = 15
- surplus = 40
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- restricted = TRUE
- refundable = TRUE
-
/datum/uplink_item/firearms/revolver
name = "Syndicate Revolver"
desc = "Waffle Co.'s modernized Syndicate revolver. Fires 7 brutal rounds of .357 Magnum."
diff --git a/code/modules/uplink/uplink_items/gadgets.dm b/code/modules/uplink/uplink_items/gadgets.dm
deleted file mode 100644
index 4da1da147f817..0000000000000
--- a/code/modules/uplink/uplink_items/gadgets.dm
+++ /dev/null
@@ -1,66 +0,0 @@
-/datum/uplink_item/device_tools/syndie_glue
- name = "Glue"
- desc = "A cheap bottle of one use syndicate brand super glue. \
- Use on any item to make it undroppable. \
- Be careful not to glue an item you're already holding!"
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/syndie_glue
- cost = 2
-
-/datum/uplink_item/device_tools/neutered_borer_egg
- name = "Neutered borer egg"
- desc = "A borer egg specifically bred to aid operatives. \
- It will obey every command and protect whatever operative they first see when hatched. \
- Unfortunately due to extreme radiation exposure, they cannot reproduce. \
- It was put into a cage for easy tranportation"
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/neutered_borer_spawner
- cost = 20
- surplus = 40
- refundable = TRUE
-
-/datum/uplink_item/stealthy_tools/chameleonheadsetdeluxe
- name = "Advanced Chameleon Headset"
- desc = "A premium model Chameleon Headset. All the features you love of the original, but now with flashbang \
- protection, voice amplification, memory-foam, HD Sound Quality, and extra-wide spectrum dial. Usually reserved \
- for high-ranking Cybersun officers, a few spares have been reserved for field agents."
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/radio/headset/chameleon/advanced
- cost = 2
-
-/datum/uplink_item/device_tools/plasma_license
- name = "License to Plasmaflood"
- desc = "A contract abusing a loophole found by plasmamen to invade halls with harmful gases \
- without repercussion or warning, garnering no attention from any higher powers. \
- Has to be signed by purchaser to be considered valid."
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/card/plasma_license
- cost = 20
-
-/datum/uplink_item/device_tools/super_kitty_ears
- name = "Super Syndie-Kitty Ears"
- desc = "Developed by several Interdyne Pharmaceutics scientists and Wizard Federation archmages during a record-breaking rager, \
- this set of feline ears combines the finest of bio-engineering and thamaturgy to allow the user to transform to and from a cat at will, \
- granting them all the benefits (and downsides) of being a true feline, such as ventcrawling. \
- However, this form will be clad in blood-red Syndicate armor, making its origin somewhat obvious."
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/organ/internal/ears/cat/super/syndie
- cost = 16 // double the price of stealth implant
- surplus = 5
- limited_stock = 1
- lock_secondary_objectives = TRUE // no you can't cheese progtot with ventcrawling
-
-/datum/uplink_item/device_tools/magboots
- name = "Blood-Red Magboots"
- desc = "A pair of magnetic boots with a Syndicate paintjob that assist with freer movement in space or on-station \
- during gravitational generator failures."
- item = /obj/item/clothing/shoes/magboots/syndie
- cost = 1
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/device_tools/jetpack_harness
- name = "Jet Harness"
- desc = "A lightweight tactical jetpack harness, used by those who don't want to be weighed down by traditional jetpacks."
- item = /obj/item/tank/jetpack/harness
- cost = 1
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm
index e3b796a0af2bc..2d07db1660964 100644
--- a/code/modules/uplink/uplink_items/implant.dm
+++ b/code/modules/uplink/uplink_items/implant.dm
@@ -11,7 +11,7 @@
name = "Freedom Implant"
desc = "Can be activated to release common restraints such as handcuffs, legcuffs, and even bolas tethered around the legs."
item = /obj/item/storage/box/syndie_kit/imp_freedom
- cost = 5
+ cost = 4
/datum/uplink_item/implants/freedom/New()
. = ..()
@@ -22,7 +22,7 @@
desc = "An implant injected into the body, allowing the use of an internal Syndicate radio. \
Used just like a regular headset, but can be disabled to use external headsets normally and to avoid detection."
item = /obj/item/storage/box/syndie_kit/imp_radio
- cost = 4
+ cost = 2
restricted = TRUE
/datum/uplink_item/implants/emp
@@ -36,14 +36,14 @@
desc = "This one-of-a-kind implant will make you almost invisible if you play your cards right. \
On activation, it will conceal you inside a chameleon cardboard box that is only revealed once someone bumps into it."
item = /obj/item/storage/box/syndie_kit/imp_stealth
- cost = 8
+ cost = 5
/datum/uplink_item/implants/storage
name = "Storage Implant"
desc = "An implant injected into the body, and later activated at the user's will. It will open a small bluespace \
pocket capable of storing two regular-sized items."
item = /obj/item/storage/box/syndie_kit/imp_storage
- cost = 8
+ cost = 6
/datum/uplink_item/implants/uplink
name = "Uplink Implant"
@@ -55,6 +55,12 @@
surplus = 0
restricted = TRUE
+/datum/uplink_item/implants/uplink/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
+ var/obj/item/storage/box/syndie_kit/uplink_box = ..()
+ uplink_box.name = "Uplink Implant Box"
+ new /obj/item/implanter/uplink(uplink_box, uplink_handler)
+ return uplink_box
+
/datum/uplink_item/implants/hardlight
name = "Hardlight Spear Implant"
desc = "An implant that allows you to summon and control a hardlight spear. \
@@ -64,13 +70,7 @@
cost = 7
/datum/uplink_item/implants/weapons_auth
- name = "Weapon Authorization Implant"
- desc = "An implant that allows you to use any pin restricted weapon."
+ name = "Weapon Authorization Kit"
+ desc = "An implant and firing pin that allows you restrict any pin weapon to those with the implant."
item = /obj/item/storage/box/syndie_kit/weapons_auth
- cost = 5
-
-/datum/uplink_item/implants/uplink/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
- var/obj/item/storage/box/syndie_kit/uplink_box = ..()
- uplink_box.name = "Uplink Implant Box"
- new /obj/item/implanter/uplink(uplink_box, uplink_handler)
- return uplink_box
+ cost = 2
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index 9737aeef164b9..ef6f3573ac54c 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -5,16 +5,6 @@
/datum/uplink_item/stealthy_tools
category = /datum/uplink_category/stealthy_tools
-
-/datum/uplink_item/stealthy_tools/agent_card
- name = "Agent Identification Card"
- desc = "Agent cards prevent artificial intelligences from tracking the wearer, and hold up to 5 wildcards \
- from other identification cards. In addition, they can be forged to display a new assignment, name and trim. \
- This can be done an unlimited amount of times. Some Syndicate areas and devices can only be accessed \
- with these cards."
- item = /obj/item/card/id/advanced/chameleon
- cost = 2
-
/datum/uplink_item/stealthy_tools/ai_detector
name = "Artificial Intelligence Detector"
desc = "A functional multitool that turns red when it detects an artificial intelligence watching it, and can be \
@@ -25,15 +15,6 @@
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
cost = 1
-/datum/uplink_item/stealthy_tools/chameleon
- name = "Chameleon Kit"
- desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
- Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately. \
- The chameleon technology can be locked and unlocked using a multitool, hiding it from others."
- item = /obj/item/storage/box/syndie_kit/chameleon
- cost = 2
- purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume
-
/datum/uplink_item/stealthy_tools/syndigaloshes
name = "No-Slip Chameleon Shoes"
desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
diff --git a/code/modules/uplink/uplink_items/utility_clothing.dm b/code/modules/uplink/uplink_items/utility_clothing.dm
index 71f026e5eafc7..e43e8fb8a2cfd 100644
--- a/code/modules/uplink/uplink_items/utility_clothing.dm
+++ b/code/modules/uplink/uplink_items/utility_clothing.dm
@@ -31,7 +31,7 @@
fits inside bags, and has a weapon slot. Nanotrasen crew members are trained to report red space suit \
sightings, however." //monkestation edit
item = /obj/item/storage/box/syndie_kit/space
- cost = 4
+ cost = 2
/datum/uplink_item/utility_clothing/modsuit
name = "Syndicate MODsuit"
@@ -86,12 +86,12 @@
name = "MODsuit wraith cloaking module"
desc = "A MODsuit module that grants to the user Optical camouflage and the ability to overload light sources to recharge suit power."
item = /obj/item/mod/module/stealth/wraith
- cost = 2
+ cost = 4
/datum/uplink_item/utility_clothing/syndie_armor
name = "Syndicate Body armor"
desc = "A highly compact set of body armor with two inner slots for small items. \
- It comes with chameleon features being able to appear as other outwears. This function be locked with a multitool"
+ It comes with chameleon features being able to appear as other outwears. This function be locked and unlocked with a multitool"
item = /obj/item/clothing/suit/chameleon/syndie_armor
cost = 4
purchasable_from = ALL
@@ -102,3 +102,20 @@
item = /obj/item/storage/belt/holster/chameleon
cost = 1
+/datum/uplink_item/utility_clothing/agent_card
+ name = "Agent Identification Card"
+ desc = "Agent cards prevent artificial intelligences from tracking the wearer, and hold up to 5 wildcards \
+ from other identification cards. In addition, they can be forged to display a new assignment, name and trim. \
+ This can be done an unlimited amount of times. Some Syndicate areas and devices can only be accessed \
+ with these cards."
+ item = /obj/item/card/id/advanced/chameleon
+ cost = 4
+
+/datum/uplink_item/stealthy_tools/chameleon
+ name = "Chameleon Kit"
+ desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
+ Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately. \
+ The chameleon technology can be locked and unlocked using a multitool, hiding it from others."
+ item = /obj/item/storage/box/syndie_kit/chameleon
+ cost = 2
+ purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume
diff --git a/monkestation/code/game/objects/items/implants/implant_misc.dm b/monkestation/code/game/objects/items/implants/implant_misc.dm
index ca68a679859ca..05eb6ca615ba3 100644
--- a/monkestation/code/game/objects/items/implants/implant_misc.dm
+++ b/monkestation/code/game/objects/items/implants/implant_misc.dm
@@ -7,3 +7,4 @@
/obj/item/storage/box/syndie_kit/weapons_auth/PopulateContents()
new /obj/item/implanter/weapons_auth(src)
+ new /obj/item/firing_pin/implant/pindicate(src)
diff --git a/tgstation.dme b/tgstation.dme
index f1f7817d863ca..e8e194ebf9d0a 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6206,7 +6206,6 @@
#include "code\modules\uplink\uplink_items\device_tools.dm"
#include "code\modules\uplink\uplink_items\explosive.dm"
#include "code\modules\uplink\uplink_items\firearms.dm"
-#include "code\modules\uplink\uplink_items\gadgets.dm"
#include "code\modules\uplink\uplink_items\implant.dm"
#include "code\modules\uplink\uplink_items\job.dm"
#include "code\modules\uplink\uplink_items\melees.dm"
From bf4879145ef70c63f14cdea0dafc8f54f2f7a686 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 18:33:53 -0400
Subject: [PATCH 13/29] even more general stuff, shotgun ammo
---
.../projectiles/boxes_magazines/ammo_boxes.dm | 2 +-
.../modules/uplink/uplink_items/ammunition.dm | 18 ++++-
.../uplink/uplink_items/device_tools.dm | 45 +++++++------
code/modules/uplink/uplink_items/explosive.dm | 2 +-
code/modules/uplink/uplink_items/firearms.dm | 29 +-------
code/modules/uplink/uplink_items/melees.dm | 6 +-
code/modules/uplink/uplink_items/stealthy.dm | 50 --------------
.../uplink/uplink_items/stealthy_tools.dm | 67 ++++++++++++++++---
.../uplink/uplink_items/utility_clothing.dm | 20 +++++-
tgstation.dme | 1 -
10 files changed, 122 insertions(+), 118 deletions(-)
delete mode 100644 code/modules/uplink/uplink_items/stealthy.dm
diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
index e03c66e9cfb0e..f83406b1e0bd0 100644
--- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
+++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm
@@ -490,7 +490,7 @@
max_ammo = 16
/obj/item/ammo_box/advanced/s12gauge/bean
- name = "beanbag Slug ammo box"
+ name = "beanbag slug ammo box"
desc = "A box of beanbag slug shells. These are large, singular beanbags that pack a less-lethal punch."
icon_state = "bean"
ammo_type = /obj/item/ammo_casing/shotgun/beanbag
diff --git a/code/modules/uplink/uplink_items/ammunition.dm b/code/modules/uplink/uplink_items/ammunition.dm
index 5ecf973207cba..8712642954d69 100644
--- a/code/modules/uplink/uplink_items/ammunition.dm
+++ b/code/modules/uplink/uplink_items/ammunition.dm
@@ -88,13 +88,25 @@
item = /obj/item/storage/box/trickshot
/datum/uplink_item/ammo/uraniumpen
- name = "Uranium Penetrator Box"
- desc = "A box with 10 uranium penetrators, capable to penetrating walls and objects, but not people. Works best with thermals!"
+ name = "Uranium Penetrator Shell Box"
+ desc = "A box with 10 uranium penetrator shells, capable to penetrating walls and objects, but not people. Works best with thermals!"
cost = 3
item = /obj/item/storage/box/uraniumpen
/datum/uplink_item/ammo/beeshot
- name = "Beeshot Box"
+ name = "Beeshot Shell Box"
desc = "A box with 10 Beeshot shells. Creates very angry bees upon impact. Not as strong as buckshot."
cost = 3
item = /obj/item/storage/box/beeshot
+
+/datum/uplink_item/ammo/buckshot
+ name = "Buckshot Ammo Box"
+ desc = "A box with 16 buckshot shells. A lethal high damage spread of pellets."
+ cost = 3
+ item = /obj/item/ammo_box/advanced/s12gauge/buckshot
+
+/datum/uplink_item/ammo/rubber
+ name = "Rubber Ammo Box"
+ desc = "A box with 16 rubber shells. A less-lethal high stamina damage spread of rubber pellets."
+ cost = 3
+ item = /obj/item/ammo_box/advanced/s12gauge/rubber
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index dc5f3ec2870a2..f428fff5e7de0 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -329,15 +329,6 @@
surplus = 40
refundable = TRUE
-/datum/uplink_item/stealthy_tools/chameleonheadsetdeluxe
- name = "Advanced Chameleon Headset"
- desc = "A premium model Chameleon Headset. All the features you love of the original, but now with flashbang \
- protection, voice amplification, memory-foam, HD Sound Quality, and extra-wide spectrum dial. Usually reserved \
- for high-ranking Cybersun officers, a few spares have been reserved for field agents."
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/radio/headset/chameleon/advanced
- cost = 2
-
/datum/uplink_item/device_tools/plasma_license
name = "License to Plasmaflood"
desc = "A contract abusing a loophole found by plasmamen to invade halls with harmful gases \
@@ -347,19 +338,6 @@
item = /obj/item/card/plasma_license
cost = 20
-/datum/uplink_item/device_tools/super_kitty_ears
- name = "Super Syndie-Kitty Ears"
- desc = "Developed by several Interdyne Pharmaceutics scientists and Wizard Federation archmages during a record-breaking rager, \
- this set of feline ears combines the finest of bio-engineering and thamaturgy to allow the user to transform to and from a cat at will, \
- granting them all the benefits (and downsides) of being a true feline, such as ventcrawling. \
- However, this form will be clad in blood-red Syndicate armor, making its origin somewhat obvious."
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
- item = /obj/item/organ/internal/ears/cat/super/syndie
- cost = 16 // double the price of stealth implant
- surplus = 5
- limited_stock = 1
- lock_secondary_objectives = TRUE // no you can't cheese progtot with ventcrawling
-
/datum/uplink_item/device_tools/magboots
name = "Blood-Red Magboots"
desc = "A pair of magnetic boots with a Syndicate paintjob that assist with freer movement in space or on-station \
@@ -374,3 +352,26 @@
item = /obj/item/tank/jetpack/harness
cost = 1
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/device_tools/throwingweapons
+ name = "Box of Throwing Weapons"
+ desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \
+ throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs."
+ progression_minimum = 10 MINUTES
+ item = /obj/item/storage/box/syndie_kit/throwing_weapons
+ cost = 3
+ illegal_tech = FALSE
+
+/datum/uplink_item/device_tools/minipea
+ name = "5 peashooters strapped together"
+ desc = "For use in a trash tank, 5 small machineguns strapped together using syndicate technology. It burns through ammo like no other."
+ item = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minipea
+ cost = 8
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/device_tools/devitt
+ name = "Devitt Mk3 Light Tank"
+ desc = "An ancient tank teleported in for your machinations, comes prepared with a cannon and machinegun. REQUIRES TWO CREWMEMBERS TO OPPERATE EFFECTIVELY."
+ item = /obj/vehicle/sealed/mecha/devitt
+ cost = 40
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index fa4e8100f6e2d..c0b1fe2bfe5a6 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -111,7 +111,7 @@
/datum/uplink_item/explosives/cat
name = "Feral cat grenade"
desc = "This grenade is filled with 5 feral cats in stasis. Upon activation, the feral cats are awoken and unleashed unto unlucky bystanders. WARNING: The cats are not trained to discern friend from foe!"
- cost = 5
+ cost = 4
item = /obj/item/grenade/spawnergrenade/cat
surplus = 30
diff --git a/code/modules/uplink/uplink_items/firearms.dm b/code/modules/uplink/uplink_items/firearms.dm
index ec9307d0bf456..989bdc2f611e5 100644
--- a/code/modules/uplink/uplink_items/firearms.dm
+++ b/code/modules/uplink/uplink_items/firearms.dm
@@ -32,15 +32,6 @@
cost = 10
surplus = 50
-/datum/uplink_item/firearms/throwingweapons
- name = "Box of Throwing Weapons"
- desc = "A box of shurikens and reinforced bolas from ancient Earth martial arts. They are highly effective \
- throwing weapons. The bolas can knock a target down and the shurikens will embed into limbs."
- progression_minimum = 10 MINUTES
- item = /obj/item/storage/box/syndie_kit/throwing_weapons
- cost = 3
- illegal_tech = FALSE
-
/datum/uplink_item/firearms/crossbow
name = "Miniature Energy Crossbow"
desc = "A short bow mounted across a tiller in miniature. \
@@ -59,7 +50,7 @@
desc = "Waffle Co.'s modernized Syndicate revolver. Fires 7 brutal rounds of .357 Magnum."
item = /obj/item/gun/ballistic/revolver/syndicate
progression_minimum = 30 MINUTES
- cost = 13
+ cost = 10
surplus = 50
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -76,7 +67,7 @@
Rumors of this 'siphoning power off your lifeforce' are greatly exaggerated, and Aetherofusion assures safety for up to 2 years of use."
item = /obj/item/gun/energy/laser/musket/syndicate
progression_minimum = 30 MINUTES
- cost = 10
+ cost = 12
surplus = 40
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -90,7 +81,7 @@
name = "\improper Bóbr 12 GA revolver"
desc = "An outdated sidearm rarely seen in use by some members of the CIN. A revolver type design with a four shell cylinder. That's right, shell, this one shoots twelve guage."
item = /obj/item/storage/box/syndie_kit/shotgun_revolver
- cost = 8
+ cost = 5
/datum/uplink_item/firearms/shit_smg
name = "Surplus Smg Bundle"
@@ -127,17 +118,3 @@
progression_minimum = 15 MINUTES
cost = 5
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS) //Because I don't think they get an autolathe or the resources to use the disk.
-
-/datum/uplink_item/firearms/minipea
- name = "5 peashooters strapped together"
- desc = "For use in a trash tank, 5 small machineguns strapped together using syndicate technology. It burns through ammo like no other."
- item = /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/minipea
- cost = 8
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-/datum/uplink_item/firearms/devitt
- name = "Devitt Mk3 Light Tank"
- desc = "An ancient tank teleported in for your machinations, comes prepared with a cannon and machinegun. REQUIRES TWO CREWMEMBERS TO OPPERATE EFFECTIVELY."
- item = /obj/vehicle/sealed/mecha/devitt
- cost = 40
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/code/modules/uplink/uplink_items/melees.dm b/code/modules/uplink/uplink_items/melees.dm
index 23377d8cf0040..f28791fddb651 100644
--- a/code/modules/uplink/uplink_items/melees.dm
+++ b/code/modules/uplink/uplink_items/melees.dm
@@ -79,15 +79,15 @@
and gain the ability to swat bullets from the air, but you will also refuse to use dishonorable ranged weaponry."
item = /obj/item/book/granter/martial/carp
progression_minimum = 30 MINUTES
- cost = 12 //monke edit
- surplus = 30 //monkestation edit: from 0 to 30
+ cost = 16 // No free northstar gloves
+ surplus = 30
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
/datum/uplink_item/melees/martialarts/advanced
name = "Blood-stained Martial Arts Scroll"
desc = "A scroll penned by the infamous Awakened Dragon, penned with the blood of their \
disciples, it appears to have clues towards true enlightenment in the path of the Sleeping Carp."
- cost = 20
+ cost = 25
item = /obj/item/book/granter/martial/carp/true
lock_other_purchases = TRUE
purchasable_from = ~(UPLINK_CLOWN_OPS | UPLINK_NUKE_OPS)
diff --git a/code/modules/uplink/uplink_items/stealthy.dm b/code/modules/uplink/uplink_items/stealthy.dm
deleted file mode 100644
index 48d87a2c965ce..0000000000000
--- a/code/modules/uplink/uplink_items/stealthy.dm
+++ /dev/null
@@ -1,50 +0,0 @@
-/datum/uplink_category/stealthy
- name = "Stealthy Weapons"
- weight = 8
-
-/datum/uplink_item/stealthy_weapons
- category = /datum/uplink_category/stealthy
-
-/datum/uplink_item/stealthy_weapons/dehy_carp
- name = "Dehydrated Space Carp"
- desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Squeeze in \
- your hand before use so it knows not to kill you."
- item = /obj/item/toy/plush/carpplushie/dehy_carp
- cost = 1
-
-/datum/uplink_item/stealthy_weapons/traitor_chem_bottle
- name = "Poison Kit"
- desc = "An assortment of deadly chemicals packed into a compact box. Comes with a syringe for more precise application."
- item = /obj/item/storage/box/syndie_kit/chemical
- cost = 6
- surplus = 50
-
-/datum/uplink_item/stealthy_weapons/suppressor
- name = "Suppressor"
- desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Makarov, Stechkin APS and C-20r, but not revolvers or energy guns."
- item = /obj/item/suppressor
- cost = 1
- surplus = 10
- purchasable_from = ~UPLINK_CLOWN_OPS
- illegal_tech = FALSE
-
-/datum/uplink_item/stealthy_weapons/sleepy_pen
- name = "Sleepy Pen"
- desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a \
- strong anesthetic and a chemical that prevents the target from speaking. \
- The pen holds one dose of the mixture, and can be refilled with any chemicals. Note that before the target \
- falls asleep, they will be able to move and act."
- item = /obj/item/pen/sleepy
- cost = 4
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
-
-/datum/uplink_item/stealthy_weapons/origami_kit
- name = "Boxed Origami Kit"
- desc = "This box contains a guide on how to craft masterful works of origami, allowing you to transform normal pieces of paper into \
- perfectly aerodynamic (and potentially lethal) paper airplanes."
- item = /obj/item/storage/box/syndie_kit/origami_bundle
- progression_minimum = 10 MINUTES
- cost = 4
- surplus = 50 //monkestation edit: from 0 to 50
- purchasable_from = ~UPLINK_NUKE_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans.
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index ef6f3573ac54c..cd33df472530a 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -66,15 +66,6 @@
item = /obj/item/jammer
cost = 1
-/datum/uplink_item/stealthy_tools/smugglersatchel
- name = "Smuggler's Satchel"
- desc = "This satchel is thin enough to be hidden in the gap between plating and tiling; great for stashing \
- your stolen goods. Comes with a crowbar, a floor tile and some contraband inside."
- item = /obj/item/storage/backpack/satchel/flat/with_tools
- cost = 1
- surplus = 30
- illegal_tech = FALSE
-
/datum/uplink_item/stealthy_tools/telecomm_blackout
name = "Disable Telecomms"
desc = "When purchased, a virus will be uploaded to the telecommunication processing servers to temporarily disable themselves."
@@ -98,7 +89,7 @@
surplus = 0
progression_minimum = 20 MINUTES
limited_stock = 1
- cost = 6
+ cost = 5
restricted = TRUE
cant_discount = TRUE
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
@@ -106,3 +97,59 @@
/datum/uplink_item/stealthy_tools/blackout/spawn_item(spawn_path, mob/user, datum/uplink_handler/uplink_handler, atom/movable/source)
force_event(/datum/round_event_control/grid_check, "a syndicate virus")
return source //For log icon
+
+/datum/uplink_item/stealthy_tools/super_kitty_ears
+ name = "Super Syndie-Kitty Ears"
+ desc = "Developed by several Interdyne Pharmaceutics scientists and Wizard Federation archmages during a record-breaking rager, \
+ this set of feline ears combines the finest of bio-engineering and thamaturgy to allow the user to transform to and from a cat at will, \
+ granting them all the benefits (and downsides) of being a true feline, such as ventcrawling. \
+ However, this form will be clad in blood-red Syndicate armor, making its origin somewhat obvious."
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/organ/internal/ears/cat/super/syndie
+ cost = 16 // double the price of stealth implant
+ surplus = 5
+ limited_stock = 1
+ lock_secondary_objectives = TRUE // no you can't cheese progtot with ventcrawling
+
+/datum/uplink_item/stealthy_tools/sleepy_pen
+ name = "Sleepy Pen"
+ desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a \
+ strong anesthetic and a chemical that prevents the target from speaking. \
+ The pen holds one dose of the mixture, and can be refilled with any chemicals. Note that before the target \
+ falls asleep, they will be able to move and act."
+ item = /obj/item/pen/sleepy
+ cost = 4
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/stealthy_tools/origami_kit
+ name = "Boxed Origami Kit"
+ desc = "This box contains a guide on how to craft masterful works of origami, allowing you to transform normal pieces of paper into \
+ perfectly aerodynamic (and potentially lethal) paper airplanes."
+ item = /obj/item/storage/box/syndie_kit/origami_bundle
+ progression_minimum = 10 MINUTES
+ cost = 2
+ surplus = 50 //monkestation edit: from 0 to 50
+ purchasable_from = ~UPLINK_NUKE_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans.
+
+/datum/uplink_item/stealthy_tools/dehy_carp
+ name = "Dehydrated Space Carp"
+ desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Squeeze in \
+ your hand before use so it knows not to kill you."
+ item = /obj/item/toy/plush/carpplushie/dehy_carp
+ cost = 1
+
+/datum/uplink_item/stealthy_tools/traitor_chem_bottle
+ name = "Poison Kit"
+ desc = "An assortment of deadly chemicals packed into a compact box. Comes with a syringe for more precise application."
+ item = /obj/item/storage/box/syndie_kit/chemical
+ cost = 6
+ surplus = 50
+
+/datum/uplink_item/stealthy_tools/suppressor
+ name = "Suppressor"
+ desc = "This suppressor will silence the shots of the weapon it is attached to for increased stealth and superior ambushing capability. It is compatible with many small ballistic guns including the Makarov, Stechkin APS and C-20r, but not revolvers or energy guns."
+ item = /obj/item/suppressor
+ cost = 1
+ surplus = 10
+ purchasable_from = ~UPLINK_CLOWN_OPS
+ illegal_tech = FALSE
diff --git a/code/modules/uplink/uplink_items/utility_clothing.dm b/code/modules/uplink/uplink_items/utility_clothing.dm
index e43e8fb8a2cfd..cb7b9095f88c6 100644
--- a/code/modules/uplink/uplink_items/utility_clothing.dm
+++ b/code/modules/uplink/uplink_items/utility_clothing.dm
@@ -111,7 +111,7 @@
item = /obj/item/card/id/advanced/chameleon
cost = 4
-/datum/uplink_item/stealthy_tools/chameleon
+/datum/uplink_item/utility_clothing/chameleon
name = "Chameleon Kit"
desc = "A set of items that contain chameleon technology allowing you to disguise as pretty much anything on the station, and more! \
Due to budget cuts, the shoes don't provide protection against slipping and skillchips are sold separately. \
@@ -119,3 +119,21 @@
item = /obj/item/storage/box/syndie_kit/chameleon
cost = 2
purchasable_from = ~UPLINK_NUKE_OPS //clown ops are allowed to buy this kit, since it's basically a costume
+
+/datum/uplink_item/utility_clothing/smugglersatchel
+ name = "Smuggler's Satchel"
+ desc = "This satchel is thin enough to be hidden in the gap between plating and tiling; great for stashing \
+ your stolen goods. Comes with a crowbar, a floor tile and some contraband inside."
+ item = /obj/item/storage/backpack/satchel/flat/with_tools
+ cost = 1
+ surplus = 30
+ illegal_tech = FALSE
+
+/datum/uplink_item/utility_clothing/chameleonheadsetdeluxe
+ name = "Advanced Chameleon Headset"
+ desc = "A premium model Chameleon Headset. All the features you love of the original, but now with flashbang \
+ protection, voice amplification, memory-foam, HD Sound Quality, and extra-wide spectrum dial. Usually reserved \
+ for high-ranking Cybersun officers, a few spares have been reserved for field agents."
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+ item = /obj/item/radio/headset/chameleon/advanced
+ cost = 2
diff --git a/tgstation.dme b/tgstation.dme
index e8e194ebf9d0a..63a202aea2415 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -6211,7 +6211,6 @@
#include "code\modules\uplink\uplink_items\melees.dm"
#include "code\modules\uplink\uplink_items\nukeops.dm"
#include "code\modules\uplink\uplink_items\species.dm"
-#include "code\modules\uplink\uplink_items\stealthy.dm"
#include "code\modules\uplink\uplink_items\stealthy_tools.dm"
#include "code\modules\uplink\uplink_items\utility_clothing.dm"
#include "code\modules\vehicles\_vehicle.dm"
From cf6de0dc4a3155bd68b25d872069e7f7d8e4d820 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 19:20:42 -0400
Subject: [PATCH 14/29] repricing recat complete
---
code/modules/modular_implants/misc_devices.dm | 6 ---
.../reagent_containers/cups/bottle.dm | 2 +-
code/modules/uplink/uplink_items/badass.dm | 11 ++++-
.../uplink/uplink_items/device_tools.dm | 48 ++++++++-----------
code/modules/uplink/uplink_items/explosive.dm | 20 ++++----
.../uplink/uplink_items/stealthy_tools.dm | 18 +------
.../uplink/uplink_items/utility_clothing.dm | 25 +++++++++-
7 files changed, 65 insertions(+), 65 deletions(-)
diff --git a/code/modules/modular_implants/misc_devices.dm b/code/modules/modular_implants/misc_devices.dm
index 787fac342ccc7..6ff72ba250953 100644
--- a/code/modules/modular_implants/misc_devices.dm
+++ b/code/modules/modular_implants/misc_devices.dm
@@ -55,12 +55,6 @@
icon_state = "nifsoft_remover_syndie"
create_disk = TRUE
-/datum/uplink_item/device_tools/nifsoft_remover
- name = "Cybersun 'Scalpel' NIF-Cutter"
- desc = "A modified version of a NIFSoft remover that allows the user to remove a NIFSoft and have a blank copy of the removed NIFSoft saved to a disk."
- item = /obj/item/nifsoft_remover/syndie
- cost = 3
-
///NIF Repair Kit.
/obj/item/nif_repair_kit
name = "Cerulean NIF Regenerator"
diff --git a/code/modules/reagents/reagent_containers/cups/bottle.dm b/code/modules/reagents/reagent_containers/cups/bottle.dm
index 656395e29d5d5..8596839c5b651 100644
--- a/code/modules/reagents/reagent_containers/cups/bottle.dm
+++ b/code/modules/reagents/reagent_containers/cups/bottle.dm
@@ -167,7 +167,7 @@
/obj/item/reagent_containers/cup/bottle/pancuronium
name = "pancuronium bottle"
- desc = "A small bottle. Contains pancuronium."
+ desc = "A small bottle. Contains pancuronium. Quickly incapacitates victims, causes slight oxygen loss."
list_reagents = list(/datum/reagent/toxin/pancuronium = 50)
/obj/item/reagent_containers/cup/bottle/sodium_thiopental
diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm
index 83102e2f425e1..c1e6721b3c261 100644
--- a/code/modules/uplink/uplink_items/badass.dm
+++ b/code/modules/uplink/uplink_items/badass.dm
@@ -1,5 +1,5 @@
/datum/uplink_category/badassery
- name = "(Pointless) Badassery"
+ name = "Badassery" // Being a badass is not pointless
weight = 0
/datum/uplink_item/badass
@@ -39,6 +39,15 @@
surplus = 40
illegal_tech = FALSE
+/datum/uplink_item/device_tools/fakenucleardisk
+ name = "Decoy Nuclear Authentication Disk"
+ desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \
+ Don't try to give this to us to complete your objective, we know better!"
+ item = /obj/item/disk/nuclear/fake
+ cost = 1
+ surplus = 1
+ illegal_tech = FALSE
+
/datum/uplink_item/badass/syndiecigs
name = "Syndicate Smokes"
desc = "Strong flavor, dense smoke, infused with omnizine."
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index f428fff5e7de0..d37f8532bc9ce 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -49,16 +49,7 @@
Includes direction toggle and a rapid mode to bypass door safety checks and crossing signals. \
Perfect for running someone over in the name of a tram malfunction!"
item = /obj/item/tram_remote
- cost = 2
-
-/datum/uplink_item/device_tools/thermal
- name = "Thermal Imaging Glasses"
- desc = "These goggles can be turned to resemble common eyewear found throughout the station. \
- They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, \
- emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms \
- and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
- item = /obj/item/clothing/glasses/thermal/syndi
- cost = 4
+ cost = 1
/datum/uplink_item/device_tools/cutouts
name = "Adaptive Cardboard Cutouts"
@@ -81,9 +72,10 @@
desc = "A handheld device that teleports the user 4-8 meters forward. \
Beware, teleporting into a wall will trigger a parallel emergency teleport; \
however if that fails, you may need to be stitched back together. \
- Comes with 4 charges, recharges randomly. Warranty null and void if exposed to an electromagnetic pulse."
+ Comes with 4 charges, recharges randomly. Warranty null and void if exposed to an electromagnetic pulse.\
+ Each use drains a small amount of blood."
item = /obj/item/storage/box/syndie_kit/syndicate_teleporter
- cost = 8
+ cost = 5
/datum/uplink_item/device_tools/camera_app
name = "SyndEye Program"
@@ -93,12 +85,6 @@
surplus = 90
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-/datum/uplink_item/device_tools/military_belt
- name = "Chest Rig"
- desc = "A robust seven-slot set of webbing that is capable of holding all manner of tactical equipment."
- item = /obj/item/storage/belt/military
- cost = 1
-
/datum/uplink_item/device_tools/doorjack
name = "Airlock Authentication Override Card"
desc = "A specialized cryptographic sequencer specifically designed to override station airlock access codes. \
@@ -106,15 +92,6 @@
item = /obj/item/card/emag/doorjack
cost = 3
-/datum/uplink_item/device_tools/fakenucleardisk
- name = "Decoy Nuclear Authentication Disk"
- desc = "It's just a normal disk. Visually it's identical to the real deal, but it won't hold up under closer scrutiny by the Captain. \
- Don't try to give this to us to complete your objective, we know better!"
- item = /obj/item/disk/nuclear/fake
- cost = 1
- surplus = 1
- illegal_tech = FALSE
-
/datum/uplink_item/device_tools/frame
name = "F.R.A.M.E. disk"
desc = "When inserted into a tablet, this cartridge gives you five messenger viruses which \
@@ -285,14 +262,14 @@
Recharge using bluespace crystals. \
Comes with 5 charges."
item = /obj/item/compression_kit
- cost = 4
+ cost = 6
/datum/uplink_item/device_tools/polyglot_voicebox
name = "Syndicate Polyglot Voicebox"
desc = "A polyglot voicebox which, after replacing the user's tongue will allow them to emulate \
the tongue of any species. \
WARNING: The polyglot voicebox does not allow you to speak additional languages"
- cost = 2
+ cost = 1
item = /obj/item/autosurgeon/syndicate/polyglot_voicebox
surplus = 25
@@ -375,3 +352,16 @@
item = /obj/vehicle/sealed/mecha/devitt
cost = 40
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/device_tools/dehy_carp
+ name = "Dehydrated Space Carp"
+ desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Squeeze in \
+ your hand before use so it knows not to kill you."
+ item = /obj/item/toy/plush/carpplushie/dehy_carp
+ cost = 1
+
+/datum/uplink_item/device_tools/nifsoft_remover
+ name = "Cybersun 'Scalpel' NIF-Cutter"
+ desc = "A modified version of a NIFSoft remover that allows the user to remove a NIFSoft and have a blank copy of the removed NIFSoft saved to a disk."
+ item = /obj/item/nifsoft_remover/syndie
+ cost = 1
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index c0b1fe2bfe5a6..5ebc9565f15ca 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -26,7 +26,7 @@
desc = "Because sometimes quantity is quality. Contains 10 C-4 plastic explosives."
item = /obj/item/storage/backpack/duffelbag/syndie/c4
progression_minimum = 10 MINUTES
- cost = 8 //20% discount!
+ cost = 5
cant_discount = TRUE
/datum/uplink_item/explosives/x4bag
@@ -46,11 +46,11 @@
The concussive effect from the explosion will knock the recipient out for a short period, and deafen them for longer."
progression_minimum = 20 MINUTES
item = /obj/item/computer_disk/virus/detomatix
- cost = 6
+ cost = 5
restricted = TRUE
/datum/uplink_item/explosives/emp
- name = "EMP Grenades and Implanter Kit"
+ name = "EMP Grenades"
desc = "A box that contains five EMP grenades. Useful to disrupt communications, \
security's energy weapons and silicon lifeforms when you're in a tight spot."
item = /obj/item/storage/box/syndie_kit/emp
@@ -67,7 +67,7 @@
opening the box again will trigger the detonation after the timer has elapsed. Comes with free pizza, for you or your target!"
progression_minimum = 30 MINUTES
item = /obj/item/pizzabox/bomb
- cost = 6
+ cost = 5
surplus = 30 //monkestation edit: from 8 to 30
/datum/uplink_item/explosives/syndicate_minibomb
@@ -124,13 +124,13 @@
/datum/uplink_item/explosives/door_charge
name = "Door Charge"
desc = "A small charge that can be rigged to a door, causing it to explode when the handle is moved. Tiny OS and microphone installed for taunting your victims."
- cost = 5
+ cost = 3
item = /obj/item/traitor_machine_trapper/door_charge
/datum/uplink_item/explosives/china_lake
name = "China Lake 40mm Grenade Launcher"
desc = "A robust, 4 round pump-action grenade launcher. Comes preloaded with three 40mm HE shells."
- cost = 10
+ cost = 7
item = /obj/item/gun/ballistic/shotgun/china_lake
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -144,7 +144,7 @@
/datum/uplink_item/explosives/a40mm
name = "Box of 40mm HE Grenades"
desc = "A box of four 40mm HE grenades. For use with a grenade launcher."
- cost = 5
+ cost = 4
item = /obj/item/storage/fancy/a40mm_box
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -158,7 +158,7 @@
/datum/uplink_item/explosives/a40mm/incendiary
name = "Box of 40mm Incendiary Grenades"
desc = "A box of four 40mm incendiary grenades. For use with a grenade launcher."
- cost = 5
+ cost = 4
item = /obj/item/storage/fancy/a40mm_box/incendiary
purchasable_from = ~UPLINK_CLOWN_OPS
@@ -179,13 +179,13 @@
/datum/uplink_item/explosives/a40mm/hedp
name = "Box of 40mm HEDP Grenades"
desc = "A box of four 40mm HEDP grenades. For use with a grenade launcher."
- cost = 5
+ cost = 4
item = /obj/item/storage/fancy/a40mm_box/hedp
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/explosives/a40mm/frag
name = "Box of 40mm Fragmentation Grenades"
desc = "A box of four 40mm fragmentation grenades. For use with a grenade launcher."
- cost = 5
+ cost = 4
item = /obj/item/storage/fancy/a40mm_box/frag
purchasable_from = ~UPLINK_CLOWN_OPS
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index cd33df472530a..45fbbcb5afe47 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -15,14 +15,6 @@
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
cost = 1
-/datum/uplink_item/stealthy_tools/syndigaloshes
- name = "No-Slip Chameleon Shoes"
- desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
- They do not work on heavily lubricated surfaces."
- item = /obj/item/clothing/shoes/chameleon/noslip
- cost = 2
- purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
-
/datum/uplink_item/stealthy_tools/chameleon_proj
name = "Chameleon Projector"
desc = "Projects an image across a user, disguising them as an object scanned with it, as long as they don't \
@@ -106,10 +98,9 @@
However, this form will be clad in blood-red Syndicate armor, making its origin somewhat obvious."
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
item = /obj/item/organ/internal/ears/cat/super/syndie
- cost = 16 // double the price of stealth implant
+ cost = 14
surplus = 5
limited_stock = 1
- lock_secondary_objectives = TRUE // no you can't cheese progtot with ventcrawling
/datum/uplink_item/stealthy_tools/sleepy_pen
name = "Sleepy Pen"
@@ -131,13 +122,6 @@
surplus = 50 //monkestation edit: from 0 to 50
purchasable_from = ~UPLINK_NUKE_OPS //clown ops intentionally left in, because that seems like some s-tier shenanigans.
-/datum/uplink_item/stealthy_tools/dehy_carp
- name = "Dehydrated Space Carp"
- desc = "Looks like a plush toy carp, but just add water and it becomes a real-life space carp! Squeeze in \
- your hand before use so it knows not to kill you."
- item = /obj/item/toy/plush/carpplushie/dehy_carp
- cost = 1
-
/datum/uplink_item/stealthy_tools/traitor_chem_bottle
name = "Poison Kit"
desc = "An assortment of deadly chemicals packed into a compact box. Comes with a syringe for more precise application."
diff --git a/code/modules/uplink/uplink_items/utility_clothing.dm b/code/modules/uplink/uplink_items/utility_clothing.dm
index cb7b9095f88c6..4b5eac98db066 100644
--- a/code/modules/uplink/uplink_items/utility_clothing.dm
+++ b/code/modules/uplink/uplink_items/utility_clothing.dm
@@ -79,7 +79,7 @@
// This one costs more than the nuke op counterpart
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
progression_minimum = 90 MINUTES
- cost = 16
+ cost = 18
cant_discount = TRUE
/datum/uplink_item/utility_clothing/modsuit/Wraith
@@ -137,3 +137,26 @@
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
item = /obj/item/radio/headset/chameleon/advanced
cost = 2
+
+/datum/uplink_item/stealthy_tools/syndigaloshes
+ name = "No-Slip Chameleon Shoes"
+ desc = "These shoes will allow the wearer to run on wet floors and slippery objects without falling down. \
+ They do not work on heavily lubricated surfaces."
+ item = /obj/item/clothing/shoes/chameleon/noslip
+ cost = 2
+ purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
+
+/datum/uplink_item/stealthy_tools/thermal
+ name = "Thermal Imaging Glasses"
+ desc = "These goggles can be turned to resemble common eyewear found throughout the station. \
+ They allow you to see organisms through walls by capturing the upper portion of the infrared light spectrum, \
+ emitted as heat and light by objects. Hotter objects, such as warm bodies, cybernetic organisms \
+ and artificial intelligence cores emit more of this light than cooler objects like walls and airlocks."
+ item = /obj/item/clothing/glasses/thermal/syndi
+ cost = 4
+
+/datum/uplink_item/stealthy_tools/military_belt
+ name = "Chest Rig"
+ desc = "A robust seven-slot set of webbing that is capable of holding all manner of tactical equipment."
+ item = /obj/item/storage/belt/military
+ cost = 1
From 8e6c146154d33f966a97d8f03e0191dbbb756228 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 19:21:14 -0400
Subject: [PATCH 15/29] deeply disturbing
---
code/modules/uplink/uplink_items/device_tools.dm | 2 +-
code/modules/uplink/uplink_items/stealthy_tools.dm | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index d37f8532bc9ce..7733b33978b28 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -1,6 +1,6 @@
/datum/uplink_category/device_tools
name = "Misc. Gadgets"
- weight = 6
+ weight = 5
/datum/uplink_item/device_tools
category = /datum/uplink_category/device_tools
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index 45fbbcb5afe47..6475380f8606c 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -1,6 +1,6 @@
/datum/uplink_category/stealthy_tools
name = "Stealth Gadgets"
- weight = 4
+ weight = 6
/datum/uplink_item/stealthy_tools
category = /datum/uplink_category/stealthy_tools
From f35674e6c4a2475deff3e30b73c15ed0f5360a95 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 19:24:28 -0400
Subject: [PATCH 16/29] I heart merge conflict
---
code/game/objects/items/storage/uplink_kits.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index e128440f46684..7fb485bd45f8d 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -362,7 +362,7 @@
new /obj/item/gun/ballistic/automatic/pistol/sol/evil(src)
new /obj/item/storage/box/syndie_kit/weapons_auth(src)
new /obj/item/ammo_box/magazine/c35sol_pistol(src)
- new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
+ new /obj/item/reagent_containers/medipen/stimulants(src)
new /obj/item/clothing/shoes/chameleon/noslip(src)
new /obj/item/clothing/suit/armor/vest(src)
new /obj/item/ammo_box/c35sol(src)
From 9f00b3a00d5efd64ec30acf60a2af0e0a4fefef9 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sat, 14 Mar 2026 21:13:05 -0400
Subject: [PATCH 17/29] divider
---
tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx | 2 ++
1 file changed, 2 insertions(+)
diff --git a/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx b/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx
index 336b57b12ad69..da0b781d90dfb 100644
--- a/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/GenericUplink.tsx
@@ -5,6 +5,7 @@ import { useBackend, useLocalState, useSharedState } from '../../backend';
import {
Box,
Button,
+ Divider,
DmIcon,
Icon,
Input,
@@ -235,6 +236,7 @@ const ItemList = (props: ItemListProps) => {
+
))}
From 99d9a71461613272c8b254c18b9cc2fe19d100a3 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Sun, 15 Mar 2026 11:41:39 -0400
Subject: [PATCH 18/29] aa
---
code/modules/projectiles/guns/ballistic/shotgun.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm
index c21bcf3e8269e..1c89f09f7665d 100644
--- a/code/modules/projectiles/guns/ballistic/shotgun.dm
+++ b/code/modules/projectiles/guns/ballistic/shotgun.dm
@@ -128,8 +128,9 @@
projectile_wound_bonus = 15
pin = /obj/item/firing_pin/implant/pindicate
accepted_magazine_type = /obj/item/ammo_box/magazine/internal/shot/riot/evil
-/obj/item/gun/ballistic/shotgun/riot/sol/evil/unrestricted
+/obj/item/gun/ballistic/shotgun/riot/sol/evil/unrestricted
+ pin = /obj/item/firing_pin
// Automatic Shotguns//
/obj/item/gun/ballistic/shotgun/automatic/shoot_live_shot(mob/living/user)
From 0d06216d13431bc1d3c685d55ace7a1ce2b04566 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Mon, 16 Mar 2026 10:11:35 -0400
Subject: [PATCH 19/29] forgor to commit
---
code/modules/uplink/uplink_items/melees.dm | 2 +-
code/modules/uplink/uplink_items/utility_clothing.dm | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/uplink/uplink_items/melees.dm b/code/modules/uplink/uplink_items/melees.dm
index f28791fddb651..28f07c8b37524 100644
--- a/code/modules/uplink/uplink_items/melees.dm
+++ b/code/modules/uplink/uplink_items/melees.dm
@@ -44,7 +44,7 @@
all energy projectiles, but requires two hands to wield. It also struggles to protect you from tackles."
progression_minimum = 30 MINUTES
item = /obj/item/dualsaber
- cost = 18
+ cost = 16
purchasable_from = ~UPLINK_CLOWN_OPS
/datum/uplink_item/melees/doublesword/get_discount_value(discount_type)
diff --git a/code/modules/uplink/uplink_items/utility_clothing.dm b/code/modules/uplink/uplink_items/utility_clothing.dm
index 4b5eac98db066..7e25e34b3b00b 100644
--- a/code/modules/uplink/uplink_items/utility_clothing.dm
+++ b/code/modules/uplink/uplink_items/utility_clothing.dm
@@ -79,7 +79,7 @@
// This one costs more than the nuke op counterpart
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
progression_minimum = 90 MINUTES
- cost = 18
+ cost = 16
cant_discount = TRUE
/datum/uplink_item/utility_clothing/modsuit/Wraith
From ef56db19e9d46755b5ca2cc81e26e8f5f8d755ac Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Tue, 17 Mar 2026 19:38:14 -0400
Subject: [PATCH 20/29] aa
---
code/modules/antagonists/traitor/uplink_handler.dm | 2 +-
.../modular_computers/computers/item/disks/virus_disk.dm | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/antagonists/traitor/uplink_handler.dm b/code/modules/antagonists/traitor/uplink_handler.dm
index 9cd4df4f61027..c54627a2bcd46 100644
--- a/code/modules/antagonists/traitor/uplink_handler.dm
+++ b/code/modules/antagonists/traitor/uplink_handler.dm
@@ -11,7 +11,7 @@
/// The current uplink flag of this uplink
var/uplink_flag = NONE
/// This uplink has progression
- var/has_progression = TRUE
+ var/has_progression = FALSE
/// The amount of experience points this traitor has
var/progression_points = 0
/// The purchase log of this uplink handler
diff --git a/code/modules/modular_computers/computers/item/disks/virus_disk.dm b/code/modules/modular_computers/computers/item/disks/virus_disk.dm
index 4a685b2a4cded..f93835a7b2178 100644
--- a/code/modules/modular_computers/computers/item/disks/virus_disk.dm
+++ b/code/modules/modular_computers/computers/item/disks/virus_disk.dm
@@ -145,7 +145,7 @@
target_mind = user.mind
else
target_mind = pick(backup_players)
- hidden_uplink = target.AddComponent(/datum/component/uplink, target_mind, enabled = TRUE, starting_tc = telecrystals, has_progression = TRUE)
+ hidden_uplink = target.AddComponent(/datum/component/uplink, target_mind, enabled = TRUE, starting_tc = telecrystals, has_progression = FALSE)
hidden_uplink.unlock_code = unlock_code
hidden_uplink.uplink_handler.has_objectives = TRUE
hidden_uplink.uplink_handler.owner = target_mind
From d75fdd5dc29261f92274b0feacf2483852d685ef Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Tue, 17 Mar 2026 20:03:27 -0400
Subject: [PATCH 21/29] aaa
---
code/modules/antagonists/traitor/datum_traitor.dm | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index f4c32270eca28..3c0aef847d4dd 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -55,7 +55,6 @@
// Progression elements are best left to the roundstart antagonists
// There will still be a timelock on uplink items
name = "\improper Infiltrator"
- give_secondary_objectives = TRUE // Changed from FALSE to TRUE - MONKEYSTATION EDIT CHANGE
/datum/antagonist/traitor/infiltrator/sleeper_agent
name = "\improper Syndicate Sleeper Agent"
@@ -79,7 +78,7 @@
else
uplink_handler = uplink.uplink_handler
uplink_handler.primary_objectives = objectives
- uplink_handler.has_progression = TRUE
+ uplink_handler.has_progression = uplink_handler.has_progression
SStraitor.register_uplink_handler(uplink_handler)
if(give_secondary_objectives)
From 2a220be6ef87a8c6734587eed2e1387cb2739626 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Tue, 17 Mar 2026 20:05:41 -0400
Subject: [PATCH 22/29] aaa
---
code/modules/antagonists/traitor/datum_traitor.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index 3c0aef847d4dd..cde135bc0e509 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -21,7 +21,7 @@
antag_count_points = 8 //gains more points the more objectives they complete, should also add this to things like heretics
var/give_objectives = TRUE
/// Whether to give secondary objectives to the traitor, which aren't necessary but can be completed for a progression and TC boost.
- var/give_secondary_objectives = FALSE // Planning proper secondary kill later but april 1st almost here and just for now.
+ var/give_secondary_objectives = FALSE
var/should_give_codewords = TRUE
///give this traitor an uplink?
var/give_uplink = TRUE
From 3d5f49226f58e0788560924fa42d8c8f903cb1b3 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Tue, 17 Mar 2026 21:12:30 -0400
Subject: [PATCH 23/29] I HATE TGUI
---
code/modules/antagonists/traitor/datum_traitor.dm | 2 +-
tgui/packages/tgui/interfaces/Uplink/index.tsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm
index cde135bc0e509..8e9a2e7672588 100644
--- a/code/modules/antagonists/traitor/datum_traitor.dm
+++ b/code/modules/antagonists/traitor/datum_traitor.dm
@@ -21,7 +21,7 @@
antag_count_points = 8 //gains more points the more objectives they complete, should also add this to things like heretics
var/give_objectives = TRUE
/// Whether to give secondary objectives to the traitor, which aren't necessary but can be completed for a progression and TC boost.
- var/give_secondary_objectives = FALSE
+ var/give_secondary_objectives = TRUE
var/should_give_codewords = TRUE
///give this traitor an uplink?
var/give_uplink = TRUE
diff --git a/tgui/packages/tgui/interfaces/Uplink/index.tsx b/tgui/packages/tgui/interfaces/Uplink/index.tsx
index 4ef75fa6903fe..f673ea643076e 100644
--- a/tgui/packages/tgui/interfaces/Uplink/index.tsx
+++ b/tgui/packages/tgui/interfaces/Uplink/index.tsx
@@ -372,7 +372,7 @@ export class Uplink extends Component {
Primary Objectives
)}
- {!!has_objectives && (
+ {!!has_objectives && !!is_contractor && (
Date: Tue, 17 Mar 2026 21:39:15 -0400
Subject: [PATCH 24/29] Mulligan Kit
---
code/__DEFINES/inventory.dm | 2 +
code/__HELPERS/game.dm | 8 +-
code/datums/records/manifest.dm | 4 +-
.../objects/items/devices/mulligan_kit.dm | 122 ++++++++++++++++++
.../game/objects/items/storage/uplink_kits.dm | 7 +-
.../uplink/uplink_items/stealthy_tools.dm | 8 +-
tgstation.dme | 1 +
7 files changed, 142 insertions(+), 10 deletions(-)
create mode 100644 code/game/objects/items/devices/mulligan_kit.dm
diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm
index b9afe895f71b2..7a433e8cd21f9 100644
--- a/code/__DEFINES/inventory.dm
+++ b/code/__DEFINES/inventory.dm
@@ -313,3 +313,5 @@ GLOBAL_LIST_INIT(mining_suit_allowed, list(
#define LOCATION_HEAD "on your head"
/// String for items placed in the neck slot.
#define LOCATION_NECK "around your neck"
+/// String for items placed in the id slot
+#define LOCATION_ID "in your ID slot"
diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm
index e84fd7d2a447b..ed6bd8941d748 100644
--- a/code/__HELPERS/game.dm
+++ b/code/__HELPERS/game.dm
@@ -257,11 +257,13 @@
return atom_to_find.loc
///Send a message in common radio when a player arrives
-/proc/announce_arrival(mob/living/carbon/human/character, rank)
+/proc/announce_arrival(mob/living/carbon/human/character, rank, announce_to_ghosts = TRUE)
if(!SSticker.IsRoundInProgress() || QDELETED(character))
return
- var/area/player_area = get_area(character)
- deadchat_broadcast(" has arrived at the station at [player_area.name].", "[character.real_name] ([rank])", follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
+ if (announce_to_ghosts)
+ var/area/player_area = get_area(character)
+
+ deadchat_broadcast(" has arrived at the station at [player_area.name].", "[character.real_name] ([rank])", follow_target = character, message_type=DEADCHAT_ARRIVALRATTLE)
if(!character.mind)
return
if(!GLOB.announcement_systems.len)
diff --git a/code/datums/records/manifest.dm b/code/datums/records/manifest.dm
index 9782b1cb5fef9..2ab94f82d5d53 100644
--- a/code/datums/records/manifest.dm
+++ b/code/datums/records/manifest.dm
@@ -96,7 +96,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
/// Injects a record into the manifest.
-/datum/manifest/proc/inject(mob/living/carbon/human/person, client/person_client)
+/datum/manifest/proc/inject(mob/living/carbon/human/person, client/person_client, atom/appearance_proxy)
set waitfor = FALSE
if(!(person.mind?.assigned_role.job_flags & JOB_CREW_MANIFEST))
return
@@ -108,7 +108,7 @@ GLOBAL_DATUM_INIT(manifest, /datum/manifest, new)
))
var/assignment = person.mind.assigned_role.title
- var/mutable_appearance/character_appearance = new(person.appearance)
+ var/mutable_appearance/character_appearance = new(appearance_proxy?.appearance || person.appearance)
var/person_gender = "Other"
if(person.gender == "male")
person_gender = "Male"
diff --git a/code/game/objects/items/devices/mulligan_kit.dm b/code/game/objects/items/devices/mulligan_kit.dm
new file mode 100644
index 0000000000000..ea8d169fbea40
--- /dev/null
+++ b/code/game/objects/items/devices/mulligan_kit.dm
@@ -0,0 +1,122 @@
+/obj/item/fake_identity_kit
+ name = "fake identity kit"
+ desc = "All of the paperwork you need to get a fresh start and a perfect alibi, plus a little digital assistance to insert you into crew records."
+ icon = 'icons/obj/service/bureaucracy.dmi'
+ icon_state = "docs_mulligan"
+ w_class = WEIGHT_CLASS_TINY
+ interaction_flags_click = NEED_LITERACY|NEED_LIGHT|NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING
+ /// What do we set up our "new arrival" as?
+ var/assigned_job = JOB_ASSISTANT
+
+/obj/item/fake_identity_kit/examine_more(mob/user)
+ . = ..()
+ . += span_info("Using this kit after exposure to Mulligan serum will create a fake identity for your new appearance.")
+ . += span_info("This will add you to various station manifests, create an Assistant-level ID card, and announce your arrival over the radio.")
+
+/obj/item/fake_identity_kit/attack_self(mob/living/carbon/human/user, modifiers)
+ . = ..()
+ if (!ishuman(user))
+ balloon_alert(user, "can't pass as employee!")
+ return
+ if (find_record(user.real_name))
+ balloon_alert(user, "records already exist!")
+ return
+
+ user.temporarilyRemoveItemFromInventory(src)
+ user.playsound_local(user, 'sound/items/cardshuffle.ogg', 50, TRUE)
+
+ var/obj/item/card/id/advanced/original_id = user.get_idcard(hand_first = FALSE)
+ if (original_id)
+ user.temporarilyRemoveItemFromInventory(original_id)
+
+ var/datum/job/job = SSjob.GetJob(assigned_job)
+ user.mind.set_assigned_role(job)
+
+ var/datum/outfit/job_outfit = job.outfit
+ var/id_trim = job_outfit::id_trim
+ var/obj/item/card/id/advanced/fake_id = new()
+
+ if (id_trim)
+ SSid_access.apply_trim_to_card(fake_id, id_trim)
+ shuffle_inplace(fake_id.access)
+
+ fake_id.registered_name = user.real_name
+ if(user.age)
+ fake_id.registered_age = user.age
+ fake_id.update_label()
+ fake_id.update_icon()
+
+ var/placed_in = user.equip_in_one_of_slots(fake_id, list(
+ LOCATION_ID = ITEM_SLOT_ID,
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ ), qdel_on_fail = FALSE)
+ if (isnull(placed_in))
+ fake_id.forceMove(user.drop_location())
+ to_chat(user, span_warning("You drop your new ID card on the ground."))
+ else
+ to_chat(user, span_notice("You quickly put your new ID card [placed_in]."))
+
+ user.sec_hud_set_ID()
+
+ var/mob/living/carbon/human/dummy/consistent/dummy = new() // For manifest rendering, unfortunately
+ dummy.physique = user.physique
+ user.dna.copy_dna(dummy.dna, COPY_DNA_SE|COPY_DNA_SPECIES)
+ user.copy_clothing_prefs(dummy)
+ dummy.updateappearance(icon_update = TRUE, mutcolor_update = TRUE, mutations_overlay_update = TRUE)
+ dummy.dress_up_as_job(job, visual_only = TRUE)
+
+ GLOB.manifest.inject(user, appearance_proxy = dummy)
+ QDEL_NULL(dummy)
+
+ if (original_id)
+ var/returned_to = user.equip_in_one_of_slots(original_id, list(
+ LOCATION_BACKPACK = ITEM_SLOT_BACKPACK,
+ LOCATION_LPOCKET = ITEM_SLOT_LPOCKET,
+ LOCATION_RPOCKET = ITEM_SLOT_RPOCKET,
+ LOCATION_HANDS = ITEM_SLOT_HANDS,
+ ), qdel_on_fail = FALSE)
+ if (isnull(returned_to))
+ fake_id.forceMove(user.drop_location())
+ to_chat(user, span_warning("You drop your old ID card on the ground."))
+ else
+ to_chat(user, span_notice("You stash your old ID card [returned_to]."))
+
+ var/obj/item/arrival_announcer/announcer = new(user.drop_location())
+ user.put_in_hands(announcer)
+ to_chat(user, span_notice("You quickly eat the leftover paperwork, leaving only the signaller used to announce your arrival on the station."))
+ qdel(src)
+
+/obj/item/arrival_announcer
+ name = "arrivals announcement signaller"
+ desc = "A radio signaller which uses a backdoor in the NT announcement system to trigger a fake announcement that you have just arrived there, then self-destructs."
+ icon_state = "signaller"
+ inhand_icon_state = "signaler"
+ icon = 'icons/obj/assemblies/new_assemblies.dmi'
+ lefthand_file = 'icons/mob/inhands/items/devices_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/items/devices_righthand.dmi'
+ interaction_flags_click = NEED_DEXTERITY|NEED_HANDS|ALLOW_RESTING
+
+/obj/item/arrival_announcer/attack_self(mob/living/user, modifiers)
+ . = ..()
+ if (!isliving(user))
+ return
+
+ var/name = user.real_name
+ var/datum/record/manifest_data = find_record(name)
+ if (isnull(manifest_data))
+ balloon_alert(user, "no records found!")
+ return
+ var/job = manifest_data.rank
+ if (tgui_alert(user, "Announce arrival of [name] as [job]?", "Are you ready?", list("Yes", "No"), timeout = 30 SECONDS) != "Yes")
+ return
+ if (QDELETED(src) || !user.can_perform_action(src, interaction_flags_click))
+ return
+
+ announce_arrival(user, job, announce_to_ghosts = FALSE)
+ do_sparks(1, FALSE, user)
+ new /obj/effect/decal/cleanable/ash(user.drop_location())
+ user.temporarilyRemoveItemFromInventory(src)
+ qdel(src)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 7fb485bd45f8d..6f0ab435c7eb5 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -61,7 +61,7 @@
new /obj/item/computer_disk/syndicate/camera_app(src) // 1 tc
new /obj/item/multitool/ai_detect(src) // 1 tc
new /obj/item/encryptionkey/syndicate(src) // 2 tc
- new /obj/item/reagent_containers/syringe/mulligan(src) // 4 tc
+ new /obj/item/storage/box/syndie_kit/mulligan(src) // 4 tc
new /obj/item/switchblade(src) //I'll count this as 2 tc
new /obj/item/storage/fancy/cigarettes/cigpack_syndicate (src) // 2 tc this shit heals
new /obj/item/flashlight/emp(src) // 2 tc
@@ -629,6 +629,11 @@
for(var/i in 1 to 3)
new/obj/item/grenade/chem_grenade/ez_clean(src)
+/obj/item/storage/box/syndie_kit/mulligan/PopulateContents()
+ . = ..()
+ new /obj/item/reagent_containers/syringe/mulligan(src)
+ new /obj/item/fake_identity_kit(src)
+
/obj/item/storage/box/hug/reverse_revolver/PopulateContents()
new /obj/item/gun/ballistic/revolver/reverse(src)
diff --git a/code/modules/uplink/uplink_items/stealthy_tools.dm b/code/modules/uplink/uplink_items/stealthy_tools.dm
index 6475380f8606c..6afa3e3431d20 100644
--- a/code/modules/uplink/uplink_items/stealthy_tools.dm
+++ b/code/modules/uplink/uplink_items/stealthy_tools.dm
@@ -44,10 +44,10 @@
cost *= 3
/datum/uplink_item/stealthy_tools/mulligan
- name = "Mulligan"
- desc = "Screwed up and have security on your tail? This handy syringe will give you a completely new identity \
- and appearance."
- item = /obj/item/reagent_containers/syringe/mulligan
+ name = "Mulligan Kit"
+ desc = "Screwed up and have security on your tail? This handy syringe and set of documents will give you a completely new identity \
+ and appearance, intercepting Nanotrasen communications to announce you as a freshly recruited Assistant."
+ item = /obj/item/storage/box/syndie_kit/mulligan
cost = 4
surplus = 30
purchasable_from = ~(UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS)
diff --git a/tgstation.dme b/tgstation.dme
index cca7551d7aac7..ed567e4b80f36 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -2467,6 +2467,7 @@
#include "code\game\objects\items\devices\laserpointer.dm"
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\megaphone.dm"
+#include "code\game\objects\items\devices\mulligan_kit.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\ocd.dm"
#include "code\game\objects\items\devices\pipe_painter.dm"
From 06fda7d7a95c52685b1751b1ca248fbf4ab41b4b Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Tue, 17 Mar 2026 21:55:10 -0400
Subject: [PATCH 25/29] https://github.com/tgstation/tgstation/pull/91107
---
code/game/objects/items/storage/medkit.dm | 29 +++++++++++++++++++
.../uplink/uplink_items/device_tools.dm | 13 ++++-----
.../uplink/uplink_items/utility_clothing.dm | 7 +++++
3 files changed, 42 insertions(+), 7 deletions(-)
diff --git a/code/game/objects/items/storage/medkit.dm b/code/game/objects/items/storage/medkit.dm
index 8e1b1131f9fb8..6316b0006a2ce 100644
--- a/code/game/objects/items/storage/medkit.dm
+++ b/code/game/objects/items/storage/medkit.dm
@@ -151,6 +151,35 @@
)
generate_items_inside(items_inside, src)
+/obj/item/storage/medkit/surgery_syndie
+ name = "suspicous surgical medkit"
+ desc = "An suspicous coloured medkit full of advanced medical equipment."
+ icon_state = "medkit_tactical_lite"
+ inhand_icon_state = "medkit-tactical-lite"
+ damagetype_healed = HEAL_ALL_DAMAGE
+
+/obj/item/storage/medkit/surgery_syndie/PopulateContents()
+ if(empty)
+ return
+ var/static/items_inside = list(
+ /obj/item/scalpel/advanced = 1,
+ /obj/item/retractor/advanced = 1,
+ /obj/item/cautery/advanced = 1,
+ /obj/item/surgical_drapes = 1,
+ /obj/item/stack/medical/gauze/twelve = 1,
+ /obj/item/reagent_containers/medigel/sterilizine = 1,
+ /obj/item/bonesetter = 1,
+ /obj/item/blood_filter = 1,
+ /obj/item/stack/medical/bone_gel = 1,
+ /obj/item/stack/sticky_tape/surgical = 1,
+ /obj/item/reagent_containers/syringe = 1,
+ /obj/item/reagent_containers/cup/bottle/sodium_thiopental = 1,
+ )
+ generate_items_inside(items_inside,src)
+
+/obj/item/storage/medkit/surgery_syndie/get_medbot_skin()
+ return "bezerk"
+
/obj/item/storage/medkit/ancient
icon_state = "oldfirstaid"
desc = "A first aid kit with the ability to heal common types of injuries."
diff --git a/code/modules/uplink/uplink_items/device_tools.dm b/code/modules/uplink/uplink_items/device_tools.dm
index 5fe78c0b5de45..b2d7d6bee6b69 100644
--- a/code/modules/uplink/uplink_items/device_tools.dm
+++ b/code/modules/uplink/uplink_items/device_tools.dm
@@ -14,13 +14,12 @@
surplus = 50
illegal_tech = FALSE
-/datum/uplink_item/device_tools/surgerybag
- name = "Syndicate Surgery Duffel Bag"
- desc = "The Syndicate surgery duffel bag is a toolkit containing all surgery tools, surgical drapes, \
- a Syndicate brand MMI, a straitjacket, and a muzzle."
- item = /obj/item/storage/backpack/duffelbag/syndie/surgery
- cost = 4
- surplus = 66
+/datum/uplink_item/device_tools/surgery_syndie
+ name = "Full Syndicate Surgery Medkit"
+ desc = "The Syndicate surgery medkit is a toolkit containing all surgery tools, surgical drapes, \
+ a syringe, and some sedatives."
+ item = /obj/item/storage/medkit/surgery_syndie
+ cost = 3
/datum/uplink_item/device_tools/encryptionkey
name = "Syndicate Encryption Key"
diff --git a/code/modules/uplink/uplink_items/utility_clothing.dm b/code/modules/uplink/uplink_items/utility_clothing.dm
index 7e25e34b3b00b..bf688b254635e 100644
--- a/code/modules/uplink/uplink_items/utility_clothing.dm
+++ b/code/modules/uplink/uplink_items/utility_clothing.dm
@@ -160,3 +160,10 @@
desc = "A robust seven-slot set of webbing that is capable of holding all manner of tactical equipment."
item = /obj/item/storage/belt/military
cost = 1
+
+/datum/uplink_item/device_tools/duffelbag
+ name = "Suspicous Duffel Bag"
+ desc = "A large duffel bag for holding extra tactical supplies, it is better balanced on your back than an average duffelbag."
+ item = /obj/item/storage/backpack/duffelbag/syndie
+ cost = 2
+ surplus = 50
From b2ff2558767ee678bba79b2321c64a4883ced62c Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Tue, 17 Mar 2026 22:32:32 -0400
Subject: [PATCH 26/29] smoke kit and implant
---
.../objects/items/implants/implant_misc.dm | 19 ++++++++++++++++++
.../game/objects/items/storage/uplink_kits.dm | 19 ++++++++++++++++++
code/modules/uplink/uplink_items/explosive.dm | 6 ++++++
code/modules/uplink/uplink_items/implant.dm | 8 +++++++-
icons/obj/implants.dmi | Bin 7738 -> 8488 bytes
5 files changed, 51 insertions(+), 1 deletion(-)
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 6a5f9c02a2849..2f682fa725109 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -29,6 +29,25 @@
name = "implanter (EMP)"
imp_type = /obj/item/implant/emp
+/obj/item/implant/smoke
+ name = "smoke implant"
+ desc = "Releases a plume of smoke."
+ icon_state = "smoke"
+ uses = 3
+
+/obj/item/implant/smoke/activate()
+ . = ..()
+ uses--
+ var/datum/effect_system/fluid_spread/smoke/bad/smoke = new
+ smoke.set_up(6, holder = imp_in, location = imp_in)
+ smoke.start()
+ if(!uses)
+ qdel(src)
+
+/obj/item/implanter/smoke
+ name = "implanter (Smoke)"
+ imp_type = /obj/item/implant/smoke
+
/obj/item/implant/radio
name = "internal radio implant"
var/obj/item/radio/radio
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 6f0ab435c7eb5..300d3cefc1410 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -500,6 +500,18 @@
/obj/item/storage/box/syndie_kit/imp_stealth/PopulateContents()
new /obj/item/implanter/stealth(src)
+/obj/item/storage/box/syndie_kit/imp_emp
+ name = "emp implant box"
+
+/obj/item/storage/box/syndie_kit/imp_emp/PopulateContents()
+ new /obj/item/implanter/emp(src)
+
+/obj/item/storage/box/syndie_kit/imp_smoke
+ name = "smoke implant box"
+
+/obj/item/storage/box/syndie_kit/imp_smoke/PopulateContents()
+ new /obj/item/implanter/smoke(src)
+
/obj/item/storage/box/syndie_kit/imp_radio
name = "syndicate radio implant box"
@@ -534,6 +546,13 @@
for(var/i in 1 to 5)
new /obj/item/grenade/empgrenade(src)
+/obj/item/storage/box/syndie_kit/smoke
+ name = "smoke kit"
+
+/obj/item/storage/box/syndie_kit/smoke/PopulateContents()
+ for(var/i in 1 to 5)
+ new /obj/item/grenade/smokebomb(src)
+
/obj/item/storage/box/syndie_kit/chemical
name = "chemical kit"
diff --git a/code/modules/uplink/uplink_items/explosive.dm b/code/modules/uplink/uplink_items/explosive.dm
index 5ebc9565f15ca..38a23a46e468b 100644
--- a/code/modules/uplink/uplink_items/explosive.dm
+++ b/code/modules/uplink/uplink_items/explosive.dm
@@ -61,6 +61,12 @@
if(HAS_TRAIT(SSstation, STATION_TRAIT_CYBERNETIC_REVOLUTION))
cost *= 3
+/datum/uplink_item/explosives/smoke
+ name = "Smoke Grenades"
+ desc = "A box that contains five smoke grenades. Useful for vanishing and ninja fans with katana."
+ item = /obj/item/storage/box/syndie_kit/smoke
+ cost = 2
+
/datum/uplink_item/explosives/pizza_bomb
name = "Pizza Bomb"
desc = "A pizza box with a bomb cunningly attached to the lid. The timer needs to be set by opening the box; afterwards, \
diff --git a/code/modules/uplink/uplink_items/implant.dm b/code/modules/uplink/uplink_items/implant.dm
index 2d07db1660964..ec4ad18397d0b 100644
--- a/code/modules/uplink/uplink_items/implant.dm
+++ b/code/modules/uplink/uplink_items/implant.dm
@@ -28,7 +28,13 @@
/datum/uplink_item/implants/emp
name = "EMP Implant"
desc = "An EMP implant with 3 uses. Releases a EMP wave that disrupts silicons, energy weapons, and communications among other technology."
- item = /obj/item/implanter/emp
+ item = /obj/item/storage/box/syndie_kit/imp_emp
+ cost = 2
+
+/datum/uplink_item/implants/smoke
+ name = "Smoke Implant"
+ desc = "An Smoke implant with 3 uses. Releases a smoke cloud that causes anyone without internals to cough and drop what they are holding."
+ item = /obj/item/storage/box/syndie_kit/imp_smoke
cost = 2
/datum/uplink_item/implants/stealthimplant
diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi
index f7821c401171cb84533c7ae59a964646f34d9148..b85ab4573ff2ae02a4b2b1265f03121d59433d42 100644
GIT binary patch
literal 8488
zcma)icQ~8j_jf{-DpISqXi=>_LaS70jZ$jwmKZIHqSVf?H*M`1HDcB-YEx>}jJ=f_
zRa-<5e(CqU-s}D6`@639k33JV`^k0g^W5j0&pGFF5~1^4jh3378UO&$sy|iMBi)z&
zeW|Tn|BVb9u6*V0RZoe#82&!-+69?4xKVR@nhEIXxwb?
z|5UX)+|u#ulf!K-Yn{!V79zJsdLZqq)S#37A?SgeqxT|mOs$Ykx)~Ne7zfK<3jE|U
znMX(C#Kh0lQ2T81nWoGwR+CIJ>yr#4M@|%QkJB
z*Yk9zX`shkwJ-Yb0ZSxjuWUA|wo9Tb#Q*hYXR_E@WYKpk-?HgP5e>G1B?1LmMBhoz
z-k9z6hfTDjFR}HZ#LB=wI#{T4d)Mk`u%ssd0Pa&)Rx>o-|Y73Mo+4YWWG0|E_0mkPpzi)l=VHY0P&S#_X9cdj;Y#3o>wq_z)~ktshsOZ
zU9aL$t7MGINW2ITCZpGIR?={NOzrv2;C6&8`nl(}oXy`7v0uslC*Im)($0zTyQ_LG
zms5VnS(%yhnW;pH-MDq$=D=Amua@e=K`-=l>U3sDs+1kdidAmTR*sxTf2ab;_T#pb
zVrV55#|JCnj;pq;QU7J>=SSzc!%qF!dgtA0Z59uP=bx@_RU?`=SUQXB{j$9Krg7fd
zJneAk-|>e)EW`wj+frY&QCTa}s`F(iWYO`s*vAZi~kbbd>
zbEGgsU|Nv|>~7tv&O;>^ufFWE?LFx=yhU9p!kKuBKGi4%(LLHFe$L%_d^h5>I&n9x
zQb9W48v?nMrDSaBNhkOlZGg6D(meV;I!qwO|LHH}gD*Z<>KdU>L8>|OR6f#{|NRr~
zwmX78f9lKIfS)e7u7*6|1)zE$;>!IWHt~2o%flqmt1sb|2mB-5koQNMmFhUHekd)R
zo*B+Io(B#oQb3(GhM%@r41aZ;e2By)e$nA>Wq43ORRvh^g#+lo2#G2d``Oy=3`3Ad
z2xh-OIrhp-x8P|x==ggeg_q!_<+lT%{IIEp;U$5ba#`&D`L|COQ1q$s$=ZF-ykeKe
z^ZgbT6)+%=+0+f?m-o6E#K8W8}vCNY86F)a=oVZ>1uP@buqEH;*fx+jC`ktuB|h
z>~zijtcjD)@jkQhG{NPji(m5MX38^nuoL>dLut7A0QoC4;cWDEMHeRydGwx6V{m4a
zW6LrgK^Z?;&iqCfES+<--&lil=F}FuqAm((UYyS@)z%76Nz-kj>JbI#ksC=`4`Kdz
zIsEC@d^%v>y`_7
zR@R9t)2PrfUkclU0I-^5FnjDkcgp`3FaITk{{NQtPEn;pr#EpvaK#Bbc+_c=0?$@;
ziwfKV`~hdWn4?e*>NzcS(QW-TNofn8D1SwawEXv^H3^r$MXvhs_|(4C(&w~xa=ipX
z6rSu(h$RoDuTz*`{w{XY6<#9@BmO-a%8=F1c3j=|`E^gN)E;vxxOLcj)CKoAdetp3
zVr+`0$GO2(P1$o=hEP#6GxRLK%L+X74l0GnA1C3
zhY_btc)z6Z}xISVE
zG)5m3Mmrt4tYTWJ?Mvi@taoUlF=$tC>k4j8J_PZ!L&X9
zZHfM<`Be4wkQZ46uq0IPjD9;3_AWX)sXgY$CZFuhX_DS<>#P(ScGI28k^(+IVwWG?O&kwD_OsNQbzNQh((m8s7{&F*}mZ9+E*!k
zDObnxDWzg}{C-B^3c*K_R%2T&ab%m@
zi1upHyMZT1^{CbQ4mwNr212xR=%gLyY-}7_mQm~pY0rL=r-=!=Z~~nGQDB8Z#!VZb|f9z==oM`xOL^WS>-Dw7{{93;>8oX
zG)Ykq6GRi=Fs|_`>~hzlu3;GehlB3XbEhQsMRJ*e#(BJrrbTPgR`W+%V*3!?O^u~A
zVa>%D19K@XWs3A|3mO36;i6YvFHI7kplb7t;;$uC0DukoD*)g@)v_=kgMw9lGm)0P
z?3HUS*8MHx-#^ilFREK+{e(DU?%FF%&(KK@N2@>d@c60r?ZHE`inm{rucqlbCEa-w
znAPffZP2nlfiFUNYPeuPrx-m>G&N}$^RH@MiH*zgoBz|1Q|q}QTX)Sj868aWt5{az
zu>T42JbbD0(YlOEOT1xl%Lr|Z2kv{N$>9jR6H~N9u_W2MoA)
zTDQ|CkMAePE+CSTGfPBE$nuopbfLh}S1kOa)}SG%r(aPS^7+l7)SDBYpTX8~_H#F`
zD3X!iba56;fM$8@U1By3;#+1D+=Y&E`BAw<5D?Ioo6iUkw~3~&i%1Ejr-aIxv|(Nq
zas6{=iaNq(xj#fO*J{(N!DnBPjxBO86*Pwf&D{}bOBue;pH@L~tCRf#ZNbGSBgqWB
ztm6hTYD&CYDPn)+Od$!hDob8&nL0C9kLJ((<=Li^aLp;S@EL-noqDqIGFT*YPxC2W
zOW$v=I*39uevSN4+)kZk*qK#&e>aaMaH1^7D=sV%%-c7ik8l4-Ye!DMV=`$TuyT3q
zz8L1_tzv5YS93&yd#!w`s_mKDge-4Rnv1S^qYKQU3FVC(n%jyfeBoN-tMsqz=$v<-
z_Z#Z?scEl|HbS7L*Oo^v!kVbUXS=WVWslAlM6!-3+Y-pcw_@@KFr;`P=Mu3R=(Sn&
z@5ke(6lGn7xxviL_HhCzN6dr6jpJz5%`j=9{R_i7sXM}OO*J91!8u1}0HA^pwsd^R
zA}VV-A2&TwkjOzlkStT2c{iDkJ19i1)|)`psBI8nfx?E?tn)M{l<=3#+(%7RfS);8YaJp!nEIjQM%=KLykX8bQ;vCJrl@A
z@}-v{l}k0PnEjoyX!?BmY<_B{ndst
zLJqr1w66y=(H=u4%6t_NfMe>i(2Mu`@ef6~Xa9l2F$uQ5(hY|*rQTb~${Xemy}=tt
zO2|smE&j7Bd-j{b#>-V>NcVkRR*t)VcvHz*`Bv(M7yb}wt>S;!SMRZBvU7jG#!S1v)o*k4*ihmO{UB}p9+MyOovJE4>_>+crCYf5IQdJ|){*XTy`;Szb>^GU
zYMATV_2s`}uh;`0@V4U+Kjc{!G4Emuvt4=h>R#(!zC^
z;hN8l^t9XR>F6Gkvsi82LmoQ!AMOyA_mr7(2p-)_!#r(we>X~SD}->wI#awV!LtS^rIiL(85X_%Ja
z@q=djr*5WFQ24;}RQfKP&PwRC@>`8@RmI9PsCHzX3^Vt_LHOZe9QS_h_DpIEVe`fn
zRlm|P5~ct%+=XP>bH0{rI3i+c6M#$@gv!W_VKDC!JAF6M_|Y))%;&(@emIWF&mG-4?r^$7ErssYp)$(La!;S@L%`TYFUPq0{|N>HVDkZ{Hafhpd^HlNd8B6p5ZK7q
zOuV@%pog!E-l#@gC>8=(2;+R4T8CU4olyl$xYRqTsS&?6>K%kVR?GJs2tCpNx0SW+t%@j2Ck2u~$
z5^&jH>G6AL*1Wl5yHWA^28289R7jJAVX_#kn=);Ui0*B)7O
za?}$Dx7M>)57}c0y=k8sI`dyCFgw3yPpN-YS7iSl16?3!d?uxbm6E^Y2UZbz)vixf
z+(ctzPeREm1QG)ApTnof9Y$qUw3O2;teVrRsD#pt-izMd_Mg80km2+}QuyD>f_eeP
z8eX2}#gFskueh$6KrP{J!q1`=t0J|9UVfsw?T6RM*i44;;sY@qF|DwX8
z@WDzaPfXTc40&Yv$aBWTn(8sT6phXe2dZ)Woj*D5r6+WVMB?dn`kY3+muOkLe!nDR3Y3&QO<)SbMT^s~Xw(!{2X@(VK0ClbP{UF9)N$+1q*9
zKcUH3x9-sC8(!(Fiw3%}!~h
zSGxQ8D+2mNxGg=sIi-o{9eT!(D$o)Cr$q+u5PrB&BYj8>i^2Pgg11(8GL6$-TNKm3
z5q}ZtOzM-zMhk>)@x!|dS&5&NZ<%I(oWK6-vLCGd(7~%GTx+NTK4@vAt-t9&gv)1DmbJm5
z@}3>N5HqpoSc2bayOl3R73$9!i!j*T?5t9!KK8sbANDH>RW-=;rlWL#$1&^mwCxue
z`=^rJ`XLWtmWR>HVBXMFok?I&`ePU@$#3J1;<=w
zwz}R+P8DAl(*~ku>3OAYdA4mV;R5>_cCZ_UG*R}onubD8m`v&9(F;w}&(6v(cd$Kh
zIVlh;znKG`}G=u^uRc|VIv3O;OkdJ-8p>k74s*jae
z-5M^x(CHy4WvP4sxuvM8Ka%tFR+O#onVZVc&DoMCzeDW)Pk_h
zVtn4@JM{2TZhh8R?Z^5j)Nrd&YyKGY#ZW^F)9Jo)1BFBmUa7!%6rw7j<44{-N||ri
z>}6ECOvc|Tpiz)xzAXi#G%pwpEN%+PJhK&^u|aZ{Uf
zy*rr!?|B25U@H=dbYjE3BwXn-W&N+zQOi0I#NFzS;LeegLAn~&5|{Snf=|<8UK4TvG|LO4Y`aL
zBo^B$5L#fSiM{PmnrBQcAJO}6kNUQ1XT+uz*T2gXNqooUJOfwO^B~0!fGE&9~Esx!LI02@P;|bIX^GXfTGM}$6s6o
zUg%`Bus*1uU=N7$NZtuVh$&rcq?rf&)siMY1%vmghGeVrJw*h>-#<(cqzh
z=23i#_@KW}7BVEE)sv_%{n>~S5``Q2M^ljP76;-WhR*PBmS
zHw4%NQ$}{5Wuv`iD7VZfhiWbyXgf>F;*yw249!=JrJIx$D<*4L5_WSdw^CtivKmne
z{Ety5)t)(eYLXE(5_1V#Ie;w!9~5ZlR5Wr2p^6mc1y_Q;`9#n3ZbdfD_!v
zXxb;4+}5gZxo%JOpkzNirEwt4#T~_%Z#W1Y=+iz7eE44P;)w@?w8GtN
zlZ!qUMBR9!`<2m2ktMG)6opzN5?civmhKhn~27;e9OPD+D`TZU%<#%BFW(_>h
z7#(TUV?r2)S0SoUgCY^R6mc~I@s|RfaM_2k{{F!UVXyLt9<+qqlW|a^76EuY^S~OM
zw~q#@=BCy>VTrmHWo8w3O~s+%vH@9=7Vw78c`#x`sLa9a)^9M!S0-t=_Hu9{vWxA8
zRN3j(>Us|ka8RnO3@-A6>Z)#YSp2qt!Zx>;)2RD>IL*BQc^!j(u%Eov0atQa>2u=@
z;78#F#r*WwX1jJHVbLO;bVI(?_HOlqMe`ntf
z#!gWfQq6mWVI@&L3=jJQtOR3<<4__&9GRrvudRd2+{rG)szw(f;W80luBCVg1k8CO
zc~}PEXCRg5Omkn|{V?B04P#VS^nj6#^Ey8!Es_p!Q=)G?sHB}8aCYRqZfY*
zR|McD8UCm$a;(jg<`IKs-F{6SBDKN*0LmQ=rR=}7^T~!qiCka$;fHR^$lnPml1ETX
zl`@g8ZyV;|s^%$+)d2t+yvB^QOeXkFO(j&E)`q3?X!oiu3l~CitAzf9DcG
zItk}i0`vLq>D!ZeKNsIKpyE<7iF*~(8`&b)BOP!wsgi7Y4oFEQe8QC`|6{GSB1pS5
zzqRWW`n!1ER|oH^^4vY+OGM!uEnBT8DV<16U5zL6@{cp}1s=IU?{@9}CDky5=2zR{
zJLESD>5f?E*Fam7aV0RZHK-K`e*<=N@=J+S*FV`N2}+-s8JVzi7Vt;e{M*YLJk
zUyFOgLlModvcXQpky;ZIW!AS}3ZIjD`n|m*H9(ul`8TgeRE;2~AbyYwiu8Sh$OCfm
z>1?Eq#M3xziTQX38Nz4RUCfca-#K9T0OyD!Aq2clyn{woMkkc?QUF-(B*Z~K;U=Q;
z74T>CmeSP47lP}bNm6r|{VkV%Z2^}(X{dz^hJ4t(?*;K)bh(^3pTlhuW`|vN?1S}N
zTj)4i#D{zd0wa@=C{mT?LtkbfD0@Wyfq3eqJ2!EtL9!F7G*q~=gw3dh)-r{X^mDOy
zi^4}mqHFxxa9t@EIG~Qkme5mj4qW}6om+0J$WAd5TvHT*wEL=%P3;rS(sH;%CH%%Q
z3}a2MNz=%Z_HWZLgex^;%N>>Z
z=XhePI-Y#A;j{|jyk$Hubk9kFDTt19Y6(6ybWqHgxBl)=6Mx5W@=AVu&9uMf
z*Y8{Zc=O_mfhijOf&Yv*481@-V>cZq%f4n(l>BdK<|<|%v;R|S$or6~mALIzs-+&Zw6v*z
zx_$!>t)xKq3Mi+3i?MEy8uUGbv{F|jB~R;t9ga8Hu%YP#TigLjw5+L-qA6kBlumaY
zjr%r9{o`tM!>=`~2a%(d7RWeEj`uDf`!tjPwyE=ZpzB5APW;aRF
zK6Y=d2D~XA1CIS@J!}yuyJ=0!YDCzKL-V^CTbQb}QQz~V%KHK~+V7I*lLnxge(A&a
z&o(z57G<#SbiSRy6gsQ28ydZKMJuia+2aHI5Jwe#$%X+@(E3vKr$RQPeF9PsAK9f!
zbna>%-0<4Je#S8%@M#rK)i^w|TPYg;oBlqN?vOp3j?wbI%k(&iXF5()l`fTFc#zBo
zhKQJs#q|Z18jtaTbP0Wj7g0&A!eY@1AFt+J4R?H_$B5D0cUtg@I8C^F*yVhGXD}nR`mEPJ}6t4{?ZQf#eo{vC1kb7
z<(DX)<~M>58Ir;ChwJvqpn!mrLO;+8s7>MECDkAtP{@20J{~Hf|yrfJ%Ou&d(=_ir?0Rd1~d9Gac7#8?Hu?efL
literal 7738
zcmbt(XH-)`*KX(_U79pQlO_mCC{hwS(mT?t^r|!w2u115MiG!6dJ{qs1R_WgrH0;%
zQU#O{N+56#?^^f%x$pY^d_PWRt(h}t&&=L=_I{p8FwoPWzQJ|_1OicOK2kLT+7;kI
zk&^{t3k%3$M-0=+fF|
zyuTB7%*33j!@!-OglIoM4i)rf))DfjgTXuBJZ=69zi=Bi$Y%>e(0$BDDGKr3?X<~x
zAzp7>z4bjXyv@e3ApwQjxEXH=^D!T5qx%YKSiAY>5j~at_rwg+b4pT!XJPLdv$YFD
zzE5^A-@*TUnYOQ`U()(0J*>Q>T;>^LV(}=4TJK~H{oNP&YkwGSp%kV$B#It1{CM=?
z&BB+F0W0;&WR63YL5|f21&YnZLcIbQi|A%*$n2_fYF~(gzd37QFT&t%nQhq1UEHtI
zeasKqZReA$u=>S!%TrfUTb)oZ%6@-pY=uKaGimd3u~T~o2*mMAQ&q|2dG6jvZ!b>M
z7ybF#yo|iX-pWFUDG5=pAbKCAa~~;X_*2|5+Vzq`I#B%KceGNYPBefr)<{R+K)NY?
zy@{tQ^or)Wq1DX&$0bM6NjS#FQG`;q{x83-qmnTm_)ibk7Ixm0{Z=zy61q^gmob#{eF+3LA)H(WR&VbL$%d;*t@FRuBsN!mpSd{hk^=rqE1Zr)E$1WuB
z_~P++IVq3Oib1<6TpmH!`vs;Vy4`L=0X`n|4YaS#7dl|#4D%hsh_=5rQd4F8;?oBd
z@)BD+KWdfkT)o>t=VT_p&DmtTB8%SoY(ioSjpu)izxYx?J~9N`!(Q
zQ8v^FUD+&_*w=y=(w
zryTC-iAI1^tnZOoY@OtDCRS$A$P~**60_jA@Rh-e!>M91^W^zS6Q-ml9QARx6T7OtzE94V~;HPG&;us-?
zl+00b8M8f?eak)J=LPL!l;Y|!e?>hY&g?++AX#lDlFEtxf7dll_9T3&rF>+Ur~$fb
zHL-~$u*k=X?qG0{)gw4&Y)H7`lxuhr&bbT9wc7}n+|9)QXJoQk%myr;h@94N!XKhr
zI-qu+w_QI&OOaslmx}Ed
z7mLY36FLWR$>nLg5`*J(*l^O^qXk?FLnyx&S-4TSLSuZ$N_%33wMNt=;RK0|G09)e~p
z^3!&bX5?+L=8F)QcsbR@7+pirux6pS-OR<9;DgzNtZMzZH)M*wF*XbOBC2xDzNX`s
zdpTr??TWX^xsWnojZ??6nvl~_3X%%Ghsi-WiLlW)gUS(gb|#!!<@6iisJJuEmY8cyLY;D2h`E>Z<=u1qgV0G50(
z+AWr3)_(FQ_-|{8zi=-({|?%_b&(IZ`Zi
z1JW$YCl^&jYRxts-3ky@AO#R-i5>Ngu+`~&%GwAsHlRiw+jgXK(i8rlgrU>(OCC7A
zQF?aczqk$Q77*N|=z(q=u)Wcs9x2zpq973HwW-<|hr6k9udwet^}I5re(q{Oa)N1D
zEuuftOm01ITMBGPbJq8{kVM}sC0)tR>Dm?tUhZDeZ}v^n=GC)5OO4A)#(f`&NT|`D
zT+)q}R2#YB!0Tgr3dPjLm#$@
zblB;Afr`dE|MUD4Qtg{e#kS;=6M1By$gw3JAc-BXtw_|5(1DvOPO?|LrP>Gjb#@&aV6?==OvY
z6B90w6x&csesQmsUTZ$G(>4DtLzK4#ENOPMEJaL$xha(7a;)2Me>R>j4=xP8RKJeC_?g!Pt`H
zin%;gSa_6KA2hA=bYsk$HD#Q(%4`i&<>RDdj>}3lBhGy>HAn!m$I^b?142m7LLqH-
zsw{?`ekfC_GDUFngfli|UMggh{y4XsQ1r-+4`R&1@p7m?^ZXbF?5u!ID^1NLk3=l|
z;SGNu-@{=g7wBXkV|8=3D(nf|pE97@BE2VL!Ut4rW_ZJ!yC$*FEsZ%v#KT6?qSFq!_^jQ9=+3r|PGVvC6
z3obmSLt-sV1tQ!PN~|g2A4vw%d=&FM=X}e?HRepxjK(v55L$OJatl_8f1`nIM;5Tb
zzF;+hc$v8CXR#B3{7aX7%-pdl!kS}iO92*@f1k}i`T5d9EO$9r=2=9t_?mwa4G`?V
z>z|UK|HwCT+sn*hxq?&%Dyw9B#=rRxTYOV-a%g!uqxR`=DF_va6Lhm?Mc$90k?b)P
zmpLSfs~XdPf959rs#U*N9R*&(m9S95@srxGyY7Szr7_=*9?o0_fg*eKk4W=6KxQs*
z8b?!OK6fm`!`6L>7j(a_)BDA22lP)~yfP%;2h5R8!J8}cLS0RIj*izS>1Aqe;n-_v
zR|QmK?cYS$k+~>QpX7<_BBvs{pOh|=46*Er=m4r7LE8_0QXPM?>1K}(2Pc@{6&k2W
zHf`E4cy%$maedYEe^hvw7Q#93&EbZa-mY@ymaBPq*_C|D_#5OH(!by!xN>chtX1O}vO1bFQ>CFEelpDmk~G0=wf~YUZ3rOT+e}QEq85
zZJ3{=krF=K8Y+;c&G5+)0OBIMN9zQ$=P-VB*1V3emBG+?6?T(RuLA`*({=B3T3twg
zdGz^UWm1DH%;G&-l07DMnX$N#b{x+YWEa0dWz{78hM>oiPg|{K%ZV}fQ#ofgN;J|&
zoHMHXr|URVG)V!iFS~^9X
zdZZDpMwMhZ2NmZOQ*@t-1RpDTq~U8C3Kf-j&V3VxuRB8CmNR5&wTBb@3CC$nU1d>h`e?^-ukmI2y3Ayk7e2|?w~#GypsSFnZy3flK(xMIAu>g#a%Lw
zHnQN@t_?qA3wd4GIYj=;{fl&r@9hup5R>s(=~wEVt%w`rghRpl^SbpbwXz^kYecG5
z)CC@~3j&FUIoyQqpR50P6(wA*rP1nDEpglRt$xwj=<|W2<=XqO{d3Z#Xcvv%SDo+6-AybX{JUz9
zM1R{uKpaI?=Z!jEX`P79yQ!)|O71x-nm2#@_*Ad13x4dK`iE1&T=cPpsWyp6XI|cI
zyGxcEB>ni>;i}Y1x?2=P;@*lE5hjEU@fD5>B6jQsLmR~-aO7uB%|j7E^{!S){jin{trQX%WSPRp8
zh+D^c1MF&IyzDObo$&thTllxC+!i0+C{V6lB|YZPMY2EnR_Qte?O~Zfn`BcL=H;?I
zEq1&0@aS{hbLZ|t@GP_~?9f-5U!m80ZAyohNPuKT;AdF8+aok)h;1a&(DXYbr7(v%
z=Na24gRwL(uyOa)rFOLYQO~yDQ87+OU_;lazDZ&m%4kRYUb57H!Nr@@0t@*e?1@k+
z{wPA2IA)O9q>=jT@*j9X5GYu5dgFl{8M<*kv?`6X8)s)aqx+-}(S`f<8|-hy=GHkN
z3
zPCj0TSTP;K$ay+m32rIW)=E?KVD>)R&6Fz1ty#xZ)P~U_NIrk2bxixb?rML2Alwcp
zTR3^RJ{wLb~Ly#|)5y{sTM~6L9O%#@^!{1B5a#w7qqUp_|lcd0}OcpDo!NEk9`_
z`Q+`(-v)OM)5pW!BTIQnNS$02jA8_KN>!RPP|uRWEa
zH$&vma=Adc6b~P{jmN(;<*SY*_Y4hJ=C|Ro({z~I6p%A(St(QCp83Ubi{CTZZmZ~2Yf#(U*}`986G-6~`Ty
zm0i*7W+LF$=auc(XRHg<*$yIVHP-DT9N0%y}w4NbI
zlZWfAb)t8irS$eY9LQAd7yarw!w+9x9Dp8~rHce!zFSW&UR3=zcVp5r=hO9S`nHyV
z_ftyU-$2Ypz}Bnsy3nT
zJAcNPo*B@bfz3!w2fkMk<>MTPEW-U?rt^g+K$R!{0ExRJ5OH0VMDL3UA65>
zkHx%JkRDZ!A;O~s#Gzh5$lC2Bo0|9&R6b<)3`6h-9e
z=OD;VH^g#m*-R2V8B*u0?V&9HRH@5O1vZMSU?+GY`m_><{JRpuS3|SCmBcTu#2gZE
z)H^kzH4?FS$a4IMujq;5SeWo`@tyk)xo0LvW!be1((KoP5+9?l0!t@lV!-q9Crj7~
z)ph9{+O=O)WE)i7$nM3t0fI_XHF%!(Q8Adu3Y_B8Ube^YC3B161Rb*!PIbf(sHC$U
zEHJ7spZyYBv+HVkiIiP4o!0nq1JE%&&|>Xx#Hoz6-B`twuw&-=SWgSsROElWx?7Bp
zl;w|tubGYhi~62Qj7zXuHD7Lnm;TnT>i&O*>z<&1(Z1NJwolvbiWfLHcWTX?aXTRD
zrt2#5=O*Ym3=1o1K~eM;
zt2aI^Y@a_
zJWqMIij(<o}_1%S?VSfIs7(3X~Ok$1Tg2DHlRLLlnUyJHv-CnSWs2e0(OD^D3R(&~>
zl&+u_8b6J3*FKyG?1SG9x^yBl87%ts?UNcPX)?dWsB!0AwcVZ}x!BGipdf
zW$a@TM(hRDm_O&6DK@<4pPZZAQfL3of^kteog;>TK`1~b(k}WOI&wJ>6%FWTLlDA7
zc;I&Co&i!u6~nn``pQbKu?p_k2g9D|6M;~GEb;gIEWp^!n@dQT7ZhkgAluVk42>d=
zBnn$)yexgQ)F_X@JBwE0Hfksg^!I_y1v_XZ#!f!plG`4?Gbt@qu=C1#w!vAG$_*U`
zWZ?4$7Nm;;Dat6^WKEqnsvb)aXshYqp=h);~T61kW?BaNFPWo%dpf&;HZC^|5?gPbYgJ;WaR5j1$9l3wA(({+YPhmk~;eF
zEL<^>8p932Yyx5w2=!r&HEVf+aQX7L5uTKQSZKK4R^YOvbKX1F{lHPNu=JnxB
zi_K#R*a5<#yBE@WX;C-*J(bt?FB;H~3c<#rtjNJg)=DA;^%h(YuBo_=i2y*DVqYq$
z-vMCMcIS3xv3x5UHtyV4biDGnF&xfNO3!_t7xqw&9N^TT<(^74=`S$ZCUpLV5Gujv
z)ajHrIKN^&LsT<}%;i6}-vC^BY0L)hzs)xOEjhC@z(31O!3Te00RsJvYm8W%Kk2IL
zB)z)73*)Bs?{LZxb^kXm4mjPe%W;bAOA}^~1JAK&N{stjS!wRx5?=5NM)YpH(b=_@bE>odgK)1H;
zvc6VVf^gS(tSwvA(3UF;;V7>U8xVgApfH9$vIX{`YonJeVoKp~{-3@yQl_qmuB%>c
zTjE>bERoNbKnj0M?rnW_-JSyNCClO`K240Br%3sr0fY(Te4iJ37vnv9nAHeK6F}6h
z?NZ|EKEVF%N$<{i0>@zoc>p0VgKotTk=g18+^)7;#1+;QG+0m}Y{3RGMyc<=W{93#
z)tz+~4^3Kp#Z8vwp9S!>iS55LBNj
Date: Wed, 18 Mar 2026 13:29:27 -0400
Subject: [PATCH 27/29] hello everypony
---
code/__DEFINES/mobs.dm | 1 +
code/game/objects/items/food/monkeycube.dm | 11 ++++++++
.../game/objects/items/storage/uplink_kits.dm | 11 ++++++++
.../mob/living/basic/farm_animals/pony.dm | 25 +++++++++++++++++++
.../research/xenobiology/xenobiology.dm | 5 ++++
code/modules/uplink/uplink_items/badass.dm | 6 +++++
6 files changed, 59 insertions(+)
diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm
index 100527800cc68..2acd09f42ea28 100644
--- a/code/__DEFINES/mobs.dm
+++ b/code/__DEFINES/mobs.dm
@@ -354,6 +354,7 @@
#define SENTIENCE_HUMANOID 3
#define SENTIENCE_MINEBOT 4
#define SENTIENCE_BOSS 5
+#define SENTIENCE_PONY 6
//Mob AI Status
#define POWER_RESTORATION_OFF 0
diff --git a/code/game/objects/items/food/monkeycube.dm b/code/game/objects/items/food/monkeycube.dm
index 25de61d21dc8f..c6852099c8a5f 100644
--- a/code/game/objects/items/food/monkeycube.dm
+++ b/code/game/objects/items/food/monkeycube.dm
@@ -128,6 +128,17 @@
tastes = list("buzzing" = 1, "honey" = 1, "regret" = 1)
spawned_mob = /mob/living/basic/bee
+/obj/item/food/monkeycube/dangerous_horse
+ name = "a pony cube"
+ desc = "This is a cube that, when water is added, creates a syndicate pony powerful enough to break the enemy's face!"
+ bite_consumption = 10
+ food_reagents = list(
+ /datum/reagent/toxin = 15,
+ /datum/reagent/medicine/strange_reagent = 1,
+ )
+ tastes = list("the loss of 5 TC" = 1, "eaten friend" = 1)
+ spawned_mob = /mob/living/basic/pony/dangerous
+
/obj/item/food/monkeycube/cow
name = "Cow cube"
desc = "Because not all ethical committees agree with eating chimpanzee."
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 300d3cefc1410..676a18d093951 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -910,6 +910,17 @@
/obj/item/food/grown/apple = 1,
), src)
+/obj/item/storage/box/syndicate/horse_box
+ name = "A pony box"
+ desc = "This is a set containing a syndicate pony cube and an apple, for the best cowboys in the wild station! Don't make an apple pie!"
+ icon_state = "syndiebox"
+ illustration = "writing_syndie"
+
+/obj/item/storage/box/syndicate/horse_box/PopulateContents()
+ new /obj/item/food/monkeycube/dangerous_horse(src)
+ new /obj/item/slimepotion/slime/sentience/nuclear/dangerous_horse(src)
+ new /obj/item/food/grown/apple(src)
+
#undef KIT_RECON
#undef KIT_BLOODY_SPAI
#undef KIT_STEALTHY
diff --git a/code/modules/mob/living/basic/farm_animals/pony.dm b/code/modules/mob/living/basic/farm_animals/pony.dm
index fbd3a4f5611f3..57ceed773856f 100644
--- a/code/modules/mob/living/basic/farm_animals/pony.dm
+++ b/code/modules/mob/living/basic/farm_animals/pony.dm
@@ -152,3 +152,28 @@
name = pick("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")
// Only one person can tame these fellas, and they only need one apple
AddComponent(/datum/component/tameable, food_types = list(/obj/item/food/grown/apple), tame_chance = 100, bonus_tame_chance = 15, unique = unique_tamer)
+
+/mob/living/basic/pony/dangerous
+ health = 300
+ maxHealth = 300
+ desc = "A special breed of horse engineered by the syndicate to be capable of surviving in the deep reaches of space. A modern outlaw's best friend."
+ faction = list(ROLE_SYNDICATE)
+ ponycolors = list("#666666", COLOR_ORANGE)
+ pressure_resistance = 200
+ habitable_atmos = null
+ bodytemp_cold_damage_limit = -1
+ bodytemp_heat_damage_limit = 1500
+ unique_tamer = TRUE
+ melee_damage_lower = 10
+ melee_damage_upper = 10
+ armour_penetration = 100
+ sentience_type = SENTIENCE_PONY
+ gold_core_spawnable = NO_SPAWN
+
+/mob/living/basic/pony/dangerous/Initialize(mapload)
+ . = ..()
+ var/mane_colors = list(COLOR_RED, COLOR_ORANGE, COLOR_YELLOW)
+ ponycolors = list("#666666", pick(mane_colors))
+ name = pick("S-Horse", "Plotva", "Horsekk", "Agro", "Hons")
+ var/static/list/food_types = list(/obj/item/food/grown/apple)
+ AddComponent(/datum/component/tameable, food_types = food_types, tame_chance = 100, bonus_tame_chance = 15, unique = unique_tamer)
diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm
index 0accdf8dc3c01..58c9739e60746 100644
--- a/code/modules/research/xenobiology/xenobiology.dm
+++ b/code/modules/research/xenobiology/xenobiology.dm
@@ -735,6 +735,11 @@
imp.implant(smart_mob, user)
smart_mob.AddComponent(/datum/component/simple_access, list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS))
+/obj/item/slimepotion/slime/sentience/nuclear/dangerous_horse
+ name = "dangerous pony potion"
+ desc = "A miraculous chemical mix that grants human like intelligence to pony beings. It has been modified with Syndicate technology to also grant an internal radio implant to the pony and authenticate with identification systems"
+ sentience_type = SENTIENCE_PONY
+
/obj/item/slimepotion/transference
name = "consciousness transference potion"
desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being."
diff --git a/code/modules/uplink/uplink_items/badass.dm b/code/modules/uplink/uplink_items/badass.dm
index c1e6721b3c261..7652659d5fc18 100644
--- a/code/modules/uplink/uplink_items/badass.dm
+++ b/code/modules/uplink/uplink_items/badass.dm
@@ -149,3 +149,9 @@
cost = 1
purchasable_from = ALL
cant_discount = TRUE
+
+/datum/uplink_item/badass/dangerous_horse
+ name = "a boxed syndicate pony"
+ desc = "This box contains everything for a better life. Pony, a mind potion for this pony, an apple for this pony. For God's sake, don't make apple pie!"
+ item = /obj/item/storage/box/syndicate/horse_box
+ cost = 10
From 8940d53cefb78600807875a8c4d8d333e50a2358 Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Wed, 18 Mar 2026 13:30:56 -0400
Subject: [PATCH 28/29] job items
---
code/modules/uplink/uplink_items/job.dm | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/code/modules/uplink/uplink_items/job.dm b/code/modules/uplink/uplink_items/job.dm
index d69871b27f33a..9733d46938f24 100644
--- a/code/modules/uplink/uplink_items/job.dm
+++ b/code/modules/uplink/uplink_items/job.dm
@@ -38,7 +38,7 @@
name = "Ancient Jumpsuit"
desc = "A tattered old jumpsuit that will provide absolutely no benefit to you."
item = /obj/item/clothing/under/color/grey/ancient
- cost = 20
+ cost = 25
restricted_roles = list(JOB_ASSISTANT)
surplus = 0
@@ -263,7 +263,7 @@
// Plus, it costs all your TC, and it's not an instant kill tool.
progression_minimum = 5 MINUTES
item = /obj/vehicle/sealed/car/clowncar
- cost = 20
+ cost = 25
restricted_roles = list(JOB_CLOWN)
surplus = 10
@@ -279,7 +279,7 @@
lock_other_purchases = TRUE
cant_discount = TRUE
item = /obj/item/his_grace
- cost = 20
+ cost = 25
surplus = 0
restricted_roles = list(JOB_CHAPLAIN)
@@ -334,7 +334,7 @@
to remove these from your person will be in for an explosive surprise, to boot. \
Remember to activate them for the fun to begin. "
item = /obj/item/clothing/shoes/magboots/boomboots
- cost = 20
+ cost = 25
restricted_roles = list(JOB_CLOWN)
/datum/uplink_item/role_restricted/monkey_agent
@@ -375,7 +375,7 @@
name = "Clone Army Kit"
desc = "Everything you need for a clone army, armaments not included."
progression_minimum = 5 MINUTES
- cost = 20
+ cost = 25
item = /obj/item/storage/box/clonearmy
restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) // Experimental cloners were traditionally bought by cargo.
From 38a04987a2ba788f81d443852fe462e8ad4e26ed Mon Sep 17 00:00:00 2001
From: Shoddd <148718717+Shoddd@users.noreply.github.com>
Date: Wed, 18 Mar 2026 13:36:44 -0400
Subject: [PATCH 29/29] https://github.com/tgstation/tgstation/pull/75696
---
code/game/objects/items/storage/uplink_kits.dm | 2 +-
code/modules/mod/mod_types.dm | 3 +++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index 676a18d093951..bc04f4b618749 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -159,7 +159,7 @@
new /obj/item/clothing/neck/tie/red/hitman(src)
if(KIT_NUKEOPS_METAGAME)
- new /obj/item/mod/control/pre_equipped/nuclear(src) // 8 tc
+ new /obj/item/mod/control/pre_equipped/nuclear/unrestricted(src) // 8 tc
new /obj/item/gun/ballistic/shotgun/bulldog/unrestricted(src) // 8 tc
new /obj/item/implanter/explosive(src) // 2 tc
new /obj/item/ammo_box/magazine/m12g(src) // 2 tc
diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm
index 5463a7a31c2f0..53ab1cf33e471 100644
--- a/code/modules/mod/mod_types.dm
+++ b/code/modules/mod/mod_types.dm
@@ -284,6 +284,9 @@
/obj/item/mod/module/jump_jet,
)
+/obj/item/mod/control/pre_equipped/nuclear/unrestricted
+ req_access = null
+
/obj/item/mod/control/pre_equipped/nuclear/no_jetpack
/obj/item/mod/control/pre_equipped/nuclear/no_jetpack/Initialize(mapload, new_theme, new_skin, new_core)