diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm
new file mode 100644
index 00000000000..b45cf3be3c5
--- /dev/null
+++ b/code/datums/uplink/ammunition.dm
@@ -0,0 +1,67 @@
+/*************
+* Ammunition *
+*************/
+/datum/uplink_item/item/ammo
+ item_cost = 2
+ category = /datum/uplink_category/ammunition
+
+/datum/uplink_item/item/ammo/a357
+ name = ".357"
+ path = /obj/item/ammo_magazine/a357
+
+/datum/uplink_item/item/ammo/mc9mm
+ name = "9mm"
+ path = /obj/item/ammo_magazine/mc9mm
+
+/datum/uplink_item/item/ammo/c45m
+ name = ".45"
+ path = /obj/item/ammo_magazine/c45m
+
+/datum/uplink_item/item/ammo/darts
+ name = "Darts"
+ path = /obj/item/ammo_magazine/chemdart
+
+/datum/uplink_item/item/ammo/sniperammo
+ name = "14.5mm"
+ path = /obj/item/weapon/storage/box/sniperammo
+
+/datum/uplink_item/item/ammo/a556
+ name = "5.56mm"
+ path = /obj/item/ammo_magazine/a556
+
+/datum/uplink_item/item/ammo/a556/ap
+ name = "5.56mm AP"
+ path = /obj/item/ammo_magazine/a556/ap
+
+/datum/uplink_item/item/ammo/a10mm
+ name = "10mm"
+ path = /obj/item/ammo_magazine/a10mm
+
+/datum/uplink_item/item/ammo/a762
+ name = "7.62mm"
+ path = /obj/item/ammo_magazine/a762
+
+/datum/uplink_item/item/ammo/a762/ap
+ name = "7.62mm AP"
+ path = /obj/item/ammo_magazine/a762/ap
+
+/datum/uplink_item/item/ammo/g12
+ name = "12 gauge"
+ path = /obj/item/ammo_magazine/g12
+
+/datum/uplink_item/item/ammo/g12/beanbag
+ name = "12 gauge beanbag"
+ path = /obj/item/ammo_magazine/g12/beanbag
+ item_cost = 1 // Discount due to it being LTL.
+
+/datum/uplink_item/item/ammo/g12/pellet
+ name = "12 gauge pellet"
+ path = /obj/item/ammo_magazine/g12/pellet
+
+/datum/uplink_item/item/ammo/g12/stun
+ name = "12 gauge stun"
+ path = /obj/item/weapon/storage/box/stunshells
+
+/datum/uplink_item/item/ammo/g12/flash
+ name = "12 gauge flash"
+ path = /obj/item/weapon/storage/box/flashshells
\ No newline at end of file
diff --git a/code/datums/uplink/announcements.dm b/code/datums/uplink/announcements.dm
new file mode 100644
index 00000000000..1b3cf75462c
--- /dev/null
+++ b/code/datums/uplink/announcements.dm
@@ -0,0 +1,109 @@
+/****************
+* Announcements *
+*****************/
+/datum/uplink_item/abstract/announcements
+ category = /datum/uplink_category/services
+
+/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user)
+ . = ..()
+ if(.)
+ log_and_message_admins("has triggered a falsified [src]", user)
+
+/datum/uplink_item/abstract/announcements/fake_centcom
+ item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2
+
+/datum/uplink_item/abstract/announcements/fake_centcom/New()
+ ..()
+ name = "[command_name()] Update Announcement"
+ desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data."
+
+/datum/uplink_item/abstract/announcements/fake_centcom/extra_args(var/mob/user)
+ var/title = sanitize(input("Enter your announcement title.", "Announcement Title") as null|text)
+ if(!title)
+ return
+ var/message = sanitize(input("Enter your announcement message.", "Announcement Title") as null|text)
+ if(!message)
+ return
+ return list("title" = title, "message" = message)
+
+/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
+ command_announcement.Announce(args["message"], args["title"])
+ return 1
+
+/datum/uplink_item/abstract/announcements/fake_crew_arrival
+ name = "Crew Arrival Announcement/Records"
+ desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!"
+ item_cost = 4
+
+/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
+ if(!user)
+ return 0
+
+ var/obj/item/weapon/card/id/I = user.GetIdCard()
+ var/datum/data/record/random_general_record
+ var/datum/data/record/random_medical_record
+ if(data_core.general.len)
+ random_general_record = pick(data_core.general)
+ random_medical_record = find_medical_record("id", random_general_record.fields["id"])
+
+ var/datum/data/record/general = data_core.CreateGeneralRecord(user)
+ if(I)
+ general.fields["age"] = I.age
+ general.fields["rank"] = I.assignment
+ general.fields["real_rank"] = I.assignment
+ general.fields["name"] = I.registered_name
+ general.fields["sex"] = I.sex
+ else
+ var/mob/living/carbon/human/H
+ if(istype(user,/mob/living/carbon/human))
+ H = user
+ general.fields["age"] = H.age
+ else
+ general.fields["age"] = initial(H.age)
+ var/assignment = GetAssignment(user)
+ general.fields["rank"] = assignment
+ general.fields["real_rank"] = assignment
+ general.fields["name"] = user.real_name
+ general.fields["sex"] = capitalize(user.gender)
+
+ general.fields["species"] = user.get_species()
+ var/datum/data/record/medical = data_core.CreateMedicalRecord(general.fields["name"], general.fields["id"])
+ data_core.CreateSecurityRecord(general.fields["name"], general.fields["id"])
+
+ if(!random_general_record)
+ general.fields["citizenship"] = random_general_record.fields["citizenship"]
+ general.fields["faction"] = random_general_record.fields["faction"]
+ general.fields["fingerprint"] = random_general_record.fields["fingerprint"]
+ general.fields["home_system"] = random_general_record.fields["home_system"]
+ general.fields["religion"] = random_general_record.fields["religion"]
+ if(random_medical_record)
+ medical.fields["b_type"] = random_medical_record.fields["b_type"]
+ medical.fields["b_dna"] = random_medical_record.fields["b_type"]
+
+ if(I)
+ general.fields["fingerprint"] = I.fingerprint_hash
+ medical.fields["b_type"] = I.blood_type
+ medical.fields["b_dna"] = I.dna_hash
+
+ AnnounceArrivalSimple(general.fields["name"], general.fields["rank"])
+ return 1
+
+/datum/uplink_item/abstract/announcements/fake_ion_storm
+ name = "Ion Storm Announcement"
+ desc = "Interferes with the station's ion sensors. Triggers immediately upon investment."
+ item_cost = 1
+
+/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc)
+ ion_storm_announcement()
+ return 1
+
+/datum/uplink_item/abstract/announcements/fake_radiation
+ name = "Radiation Storm Announcement"
+ desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment."
+ item_cost = 3
+
+/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc)
+ var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0)
+ new/datum/event/radiation_storm/syndicate(EM)
+ return 1
+
diff --git a/code/datums/uplink/armor.dm b/code/datums/uplink/armor.dm
new file mode 100644
index 00000000000..30a41d8edb8
--- /dev/null
+++ b/code/datums/uplink/armor.dm
@@ -0,0 +1,15 @@
+/********
+* Armor *
+********/
+/datum/uplink_item/item/armor
+ category = /datum/uplink_category/armor
+
+/datum/uplink_item/item/armor/combat
+ name = "Combat Armor Set"
+ item_cost = 5
+ path = /obj/item/weapon/storage/box/syndie_kit/combat_armor
+
+/datum/uplink_item/item/armor/heavy_vest
+ name = "Heavy Armor Vest"
+ item_cost = 4
+ path = /obj/item/clothing/suit/storage/vest/heavy/merc
diff --git a/code/datums/uplink/badassery.dm b/code/datums/uplink/badassery.dm
new file mode 100644
index 00000000000..b837625c8ab
--- /dev/null
+++ b/code/datums/uplink/badassery.dm
@@ -0,0 +1,78 @@
+/************
+* Badassery *
+************/
+/datum/uplink_item/item/badassery
+ category = /datum/uplink_category/badassery
+
+/datum/uplink_item/item/badassery/balloon
+ name = "For showing that You Are The BOSS (Useless Balloon)"
+ item_cost = DEFAULT_TELECRYSTAL_AMOUNT
+ path = /obj/item/toy/syndicateballoon
+
+/datum/uplink_item/item/badassery/balloon/NT
+ name = "For showing that you love NT SOO much (Useless Balloon)"
+ path = /obj/item/toy/nanotrasenballoon
+
+/**************
+* Random Item *
+**************/
+/datum/uplink_item/item/badassery/random_one
+ name = "Random Item"
+ desc = "Buys you one random item."
+
+/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user)
+ var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses)
+ return item.buy(U, user)
+
+/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U)
+ return default_uplink_selection.get_random_item(U.uses, U) != null
+
+/datum/uplink_item/item/badassery/random_many
+ name = "Random Items"
+ desc = "Buys you as many random items you can afford. Convenient packaging NOT included."
+
+/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals)
+ return max(1, telecrystals)
+
+/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc)
+ var/list/bought_items = list()
+ for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc))
+ UI.purchase_log(U)
+ var/obj/item/I = UI.get_goods(U, loc)
+ if(istype(I))
+ bought_items += I
+
+ return bought_items
+
+/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U)
+ feedback_add_details("traitor_uplink_items_bought", "[src]")
+ log_and_message_admins("used \the [U.loc] to buy \a [src]")
+
+/****************
+* Surplus Crate *
+****************/
+/datum/uplink_item/item/badassery/surplus
+ name = "Surplus Crate"
+ item_cost = 40
+ var/item_worth = 60
+ var/icon
+
+/datum/uplink_item/item/badassery/surplus/New()
+ ..()
+ desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers."
+
+/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc)
+ var/obj/structure/largecrate/C = new(loc)
+ var/random_items = get_random_uplink_items(null, item_worth, C)
+ for(var/datum/uplink_item/I in random_items)
+ I.purchase_log(U)
+ I.get_goods(U, C)
+
+ return C
+
+/datum/uplink_item/item/badassery/surplus/log_icon()
+ if(!icon)
+ var/obj/structure/largecrate/C = /obj/structure/largecrate
+ icon = image(initial(C.icon), initial(C.icon_state))
+
+ return "\icon[icon]"
\ No newline at end of file
diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm
new file mode 100644
index 00000000000..f7c6d1a0727
--- /dev/null
+++ b/code/datums/uplink/grenades.dm
@@ -0,0 +1,35 @@
+/***********
+* Grenades *
+************/
+/datum/uplink_item/item/grenades
+ category = /datum/uplink_category/grenades
+
+/datum/uplink_item/item/grenades/anti_photon
+ name = "5xPhoton Disruption Grenades"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/anti_photons
+
+/datum/uplink_item/item/grenades/emp
+ name = "5xEMP Grenades"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/emps
+
+/datum/uplink_item/item/grenades/smoke
+ name = "7xSmoke Grenades"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/smokes
+
+/datum/uplink_item/item/grenades/frags
+ name = "5xFrag Grenades"
+ item_cost = 6
+ path = /obj/item/weapon/storage/box/frags
+
+/datum/uplink_item/item/grenades/flashbnags
+ name = "7xFlashbangs"
+ item_cost = 4
+ path = /obj/item/weapon/storage/box/flashbangs
+
+/datum/uplink_item/item/grenades/metalfoam
+ name = "7xMetal Foam Grenades"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/metalfoam
\ No newline at end of file
diff --git a/code/datums/uplink/hardsuit_modules.dm b/code/datums/uplink/hardsuit_modules.dm
new file mode 100644
index 00000000000..66ecfb6bf9f
--- /dev/null
+++ b/code/datums/uplink/hardsuit_modules.dm
@@ -0,0 +1,40 @@
+/*******************
+* Hardsuit Modules *
+*******************/
+/datum/uplink_item/item/hardsuit_modules
+ category = /datum/uplink_category/hardsuit_modules
+
+/datum/uplink_item/item/hardsuit_modules/thermal
+ name = "Thermal Scanner"
+ item_cost = 2
+ path = /obj/item/rig_module/vision/thermal
+
+/datum/uplink_item/item/hardsuit_modules/energy_net
+ name = "Net Projector"
+ item_cost = 3
+ path = /obj/item/rig_module/fabricator/energy_net
+
+/datum/uplink_item/item/ewar_voice
+ name = "Electrowarfare Suite and Voice Synthesiser"
+ item_cost = 4
+ path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice
+
+/datum/uplink_item/item/hardsuit_modules/maneuvering_jets
+ name = "Maneuvering Jets"
+ item_cost = 4
+ path = /obj/item/rig_module/maneuvering_jets
+
+/datum/uplink_item/item/hardsuit_modules/egun
+ name = "Mounted Energy Gun"
+ item_cost = 6
+ path = /obj/item/rig_module/mounted/egun
+
+/datum/uplink_item/item/hardsuit_modules/power_sink
+ name = "Power Sink"
+ item_cost = 6
+ path = /obj/item/rig_module/power_sink
+
+/datum/uplink_item/item/hardsuit_modules/laser_canon
+ name = "Mounted Laser Cannon"
+ item_cost = 8
+ path = /obj/item/rig_module/mounted
diff --git a/code/datums/uplink/implants.dm b/code/datums/uplink/implants.dm
new file mode 100644
index 00000000000..c4302464b63
--- /dev/null
+++ b/code/datums/uplink/implants.dm
@@ -0,0 +1,25 @@
+/***********
+* Implants *
+***********/
+/datum/uplink_item/item/implants
+ category = /datum/uplink_category/implants
+
+/datum/uplink_item/item/implants/imp_freedom
+ name = "Freedom Implant"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom
+
+/datum/uplink_item/item/implants/imp_compress
+ name = "Compressed Matter Implant"
+ item_cost = 4
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_compress
+
+/datum/uplink_item/item/implants/imp_explosive
+ name = "Explosive Implant (DANGER!)"
+ item_cost = 6
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
+
+/datum/uplink_item/item/implants/imp_uplink
+ name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
+ item_cost = 5 //Original cost: 10
+ path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
diff --git a/code/datums/uplink/medical.dm b/code/datums/uplink/medical.dm
new file mode 100644
index 00000000000..8e3f534004b
--- /dev/null
+++ b/code/datums/uplink/medical.dm
@@ -0,0 +1,36 @@
+/**********
+* Medical *
+**********/
+/datum/uplink_item/item/medical
+ category = /datum/uplink_category/medical
+
+/datum/uplink_item/item/medical/sinpockets
+ name = "Box of Sin-Pockets"
+ item_cost = 1
+ path = /obj/item/weapon/storage/box/sinpockets
+
+/datum/uplink_item/item/medical/surgery
+ name = "Surgery kit"
+ item_cost = 6
+ path = /obj/item/weapon/storage/firstaid/surgery
+
+/datum/uplink_item/item/medical/combat
+ name = "Combat medical kit"
+ item_cost = 6
+ path = /obj/item/weapon/storage/firstaid/combat
+
+/datum/uplink_item/item/medical/combat
+ name = "Portable Freezer"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/freezer
+
+/datum/uplink_item/item/medical/ambrosiaseeds
+ name = "Box of 7x ambrosia seed packets"
+ item_cost = 1
+ path = /obj/item/weapon/storage/box/ambrosia
+
+/datum/uplink_item/item/medical/ambrosiadeusseeds
+ name = "Box of 7x ambrosia deus seed packets"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/ambrosiadeus
+
diff --git a/code/datums/uplink/stealth_items.dm b/code/datums/uplink/stealth_items.dm
new file mode 100644
index 00000000000..31364a09539
--- /dev/null
+++ b/code/datums/uplink/stealth_items.dm
@@ -0,0 +1,45 @@
+/*******************************
+* Stealth and Camouflage Items *
+*******************************/
+/datum/uplink_item/item/stealth_items
+ category = /datum/uplink_category/stealth_items
+
+/datum/uplink_item/item/stealth_items/id
+ name = "Agent ID card"
+ item_cost = 2
+ path = /obj/item/weapon/card/id/syndicate
+
+/datum/uplink_item/item/stealth_items/syndigaloshes
+ name = "No-Slip Shoes"
+ item_cost = 2
+ path = /obj/item/clothing/shoes/syndigaloshes
+
+/datum/uplink_item/item/stealth_items/spy
+ name = "Bug Kit"
+ item_cost = 2
+ path = /obj/item/weapon/storage/box/syndie_kit/spy
+
+/datum/uplink_item/item/stealth_items/chameleon_kit
+ name = "Chameleon Kit"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/syndie_kit/chameleon
+
+/datum/uplink_item/item/stealth_items/chameleon_projector
+ name = "Chameleon-Projector"
+ item_cost = 4
+ path = /obj/item/device/chameleon
+
+/datum/uplink_item/item/stealth_items/chameleon_projector
+ name = "Chameleon-Projector"
+ item_cost = 4
+ path = /obj/item/device/chameleon
+
+/datum/uplink_item/item/stealth_items/voice
+ name = "Voice Changer"
+ item_cost = 4
+ path = /obj/item/clothing/mask/gas/voice
+
+/datum/uplink_item/item/stealth_items/camera_floppy
+ name = "Camera Network Access - Floppy"
+ item_cost = 6
+ path = /obj/item/weapon/disk/file/cameras/syndicate
diff --git a/code/datums/uplink/stealthy_weapons.dm b/code/datums/uplink/stealthy_weapons.dm
new file mode 100644
index 00000000000..ead34c56461
--- /dev/null
+++ b/code/datums/uplink/stealthy_weapons.dm
@@ -0,0 +1,35 @@
+/*************************************
+* Stealthy and Inconspicuous Weapons *
+*************************************/
+/datum/uplink_item/item/stealthy_weapons
+ category = /datum/uplink_category/stealthy_weapons
+
+/datum/uplink_item/item/stealthy_weapons/soap
+ name = "Subversive Soap"
+ item_cost = 1
+ path = /obj/item/weapon/soap/syndie
+
+/datum/uplink_item/item/stealthy_weapons/concealed_cane
+ name = "Concealed Cane Sword"
+ item_cost = 1
+ path = /obj/item/weapon/cane/concealed
+
+/datum/uplink_item/item/stealthy_weapons/detomatix
+ name = "Detomatix PDA Cartridge"
+ item_cost = 3
+ path = /obj/item/weapon/cartridge/syndicate
+
+/datum/uplink_item/item/stealthy_weapons/parapen
+ name = "Paralysis Pen"
+ item_cost = 3
+ path = /obj/item/weapon/pen/reagent/paralysis
+
+/datum/uplink_item/item/stealthy_weapons/cigarette_kit
+ name = "Cigarette Kit"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/syndie_kit/cigarette
+
+/datum/uplink_item/item/stealthy_weapons/random_toxin
+ name = "Random Toxin - Beaker"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/syndie_kit/toxin
diff --git a/code/datums/uplink/tools.dm b/code/datums/uplink/tools.dm
new file mode 100644
index 00000000000..fb1b52c0681
--- /dev/null
+++ b/code/datums/uplink/tools.dm
@@ -0,0 +1,85 @@
+/********************
+* Devices and Tools *
+********************/
+/datum/uplink_item/item/tools
+ category = /datum/uplink_category/tools
+
+/datum/uplink_item/item/tools/toolbox
+ name = "Fully Loaded Toolbox"
+ item_cost = 1
+ path = /obj/item/weapon/storage/toolbox/syndicate
+
+/datum/uplink_item/item/tools/plastique
+ name = "C-4 (Destroys walls)"
+ item_cost = 2
+ path = /obj/item/weapon/plastique
+
+/datum/uplink_item/item/tools/encryptionkey_radio
+ name = "Encrypted Radio Channel Key"
+ item_cost = 2
+ path = /obj/item/device/encryptionkey/syndicate
+
+/datum/uplink_item/item/tools/encryptionkey_binary
+ name = "Binary Translator Key"
+ item_cost = 3
+ path = /obj/item/device/encryptionkey/binary
+
+/datum/uplink_item/item/tools/emag
+ name = "Cryptographic Sequencer"
+ item_cost = 3
+ path = /obj/item/weapon/card/emag
+
+/datum/uplink_item/item/tools/clerical
+ name = "Morphic Clerical Kit"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/syndie_kit/clerical
+
+/datum/uplink_item/item/tools/space_suit
+ name = "Space Suit"
+ item_cost = 3
+ path = /obj/item/weapon/storage/box/syndie_kit/space
+
+/datum/uplink_item/item/tools/thermal
+ name = "Thermal Imaging Glasses"
+ item_cost = 3
+ path = /obj/item/clothing/glasses/thermal/syndi
+
+/datum/uplink_item/item/tools/powersink
+ name = "Powersink (DANGER!)"
+ item_cost = 5
+ path = /obj/item/device/powersink
+
+/datum/uplink_item/item/tools/ai_module
+ name = "Hacked AI Upload Module"
+ item_cost = 7
+ path = /obj/item/weapon/aiModule/syndicate
+
+/datum/uplink_item/item/tools/supply_beacon
+ name = "Hacked Supply Beacon (DANGER!)"
+ item_cost = 7
+ path = /obj/item/supply_beacon
+
+/datum/uplink_item/item/tools/teleporter
+ name = "Teleporter Circuit Board"
+ item_cost = 20
+ path = /obj/item/weapon/circuitboard/teleporter
+
+/datum/uplink_item/item/tools/money
+ name = "Operations Funding"
+ item_cost = 3
+ path = /obj/item/weapon/storage/secure/briefcase/money
+ desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
+
+/datum/uplink_item/item/tools/crystal
+ name = "Tradable Crystal"
+ item_cost = 1
+ path = /obj/item/device/telecrystal
+ desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone."
+
+/datum/uplink_item/item/tools/hacking_tool
+ name = "Door Hacking Tool"
+ item_cost = 2
+ path = /obj/item/device/multitool/hacktool
+ desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \
+ When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
+ This device will also be able to immediately access the last 6 to 8 hacked airlocks."
\ No newline at end of file
diff --git a/code/game/objects/items/devices/uplink_categories.dm b/code/datums/uplink/uplink_categories.dm
similarity index 87%
rename from code/game/objects/items/devices/uplink_categories.dm
rename to code/datums/uplink/uplink_categories.dm
index 68ed72a6fb9..6e222b764b2 100644
--- a/code/game/objects/items/devices/uplink_categories.dm
+++ b/code/datums/uplink/uplink_categories.dm
@@ -1,49 +1,49 @@
-/datum/uplink_category
- var/name = ""
- var/list/datum/uplink_item/items
-
-/datum/uplink_category/New()
- ..()
- items = list()
-
-/datum/uplink_category/proc/can_view(obj/item/device/uplink/U)
- for(var/datum/uplink_item/item in items)
- if(item.can_view(U))
- return 1
- return 0
-
-/datum/uplink_category/ammunition
- name = "Ammunition"
-
-/datum/uplink_category/grenades
- name = "Grenades and Thrown Objects"
-
-/datum/uplink_category/visible_weapons
- name = "Highly Visible and Dangerous Weapons"
-
-/datum/uplink_category/stealthy_weapons
- name = "Stealthy and Inconspicuous Weapons"
-
-/datum/uplink_category/stealth_items
- name = "Stealth and Camouflage Items"
-
-/datum/uplink_category/armor
- name = "Armor"
-
-/datum/uplink_category/tools
- name = "Devices and Tools"
-
-/datum/uplink_category/implants
- name = "Implants"
-
-/datum/uplink_category/medical
- name = "Medical"
-
-/datum/uplink_category/hardsuit_modules
- name = "Hardsuit Modules"
-
-/datum/uplink_category/services
- name = "Services"
-
-/datum/uplink_category/badassery
- name = "Badassery"
+/datum/uplink_category
+ var/name = ""
+ var/list/datum/uplink_item/items
+
+/datum/uplink_category/New()
+ ..()
+ items = list()
+
+/datum/uplink_category/proc/can_view(obj/item/device/uplink/U)
+ for(var/datum/uplink_item/item in items)
+ if(item.can_view(U))
+ return 1
+ return 0
+
+datum/uplink_category/ammunition
+ name = "Ammunition"
+
+/datum/uplink_category/services
+ name = "Services"
+
+/datum/uplink_category/armor
+ name = "Armor"
+
+/datum/uplink_category/badassery
+ name = "Badassery"
+
+/datum/uplink_category/grenades
+ name = "Grenades and Thrown Objects"
+
+/datum/uplink_category/hardsuit_modules
+ name = "Hardsuit Modules"
+
+/datum/uplink_category/implants
+ name = "Implants"
+
+/datum/uplink_category/medical
+ name = "Medical"
+
+/datum/uplink_category/stealth_items
+ name = "Stealth and Camouflage Items"
+
+/datum/uplink_category/stealthy_weapons
+ name = "Stealthy and Inconspicuous Weapons"
+
+/datum/uplink_category/tools
+ name = "Devices and Tools"
+
+/datum/uplink_category/visible_weapons
+ name = "Highly Visible and Dangerous Weapons"
\ No newline at end of file
diff --git a/code/datums/uplink/uplink_items.dm b/code/datums/uplink/uplink_items.dm
new file mode 100644
index 00000000000..32a7d0cffb5
--- /dev/null
+++ b/code/datums/uplink/uplink_items.dm
@@ -0,0 +1,174 @@
+var/datum/uplink/uplink = new()
+
+/datum/uplink
+ var/list/items_assoc
+ var/list/datum/uplink_item/items
+ var/list/datum/uplink_category/categories
+
+/datum/uplink/New()
+ items_assoc = list()
+ items = init_subtypes(/datum/uplink_item)
+ categories = init_subtypes(/datum/uplink_category)
+ categories = dd_sortedObjectList(categories)
+
+ for(var/datum/uplink_item/item in items)
+ if(!item.name)
+ items -= item
+ continue
+
+ items_assoc[item.type] = item
+
+ for(var/datum/uplink_category/category in categories)
+ if(item.category == category.type)
+ category.items += item
+
+ for(var/datum/uplink_category/category in categories)
+ category.items = dd_sortedObjectList(category.items)
+
+/datum/uplink_item
+ var/name
+ var/desc
+ var/item_cost = 0
+ var/datum/uplink_category/category // Item category
+ var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all.
+
+/datum/uplink_item/item
+ var/path = null
+
+/datum/uplink_item/New()
+ ..()
+ antag_roles = list()
+
+
+
+/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user)
+ var/extra_args = extra_args(user)
+ if(!extra_args)
+ return
+
+ if(!can_buy(U))
+ return
+
+ if(U.CanUseTopic(user, inventory_state) != STATUS_INTERACTIVE)
+ return
+
+ var/cost = cost(U.uses, U)
+
+ var/goods = get_goods(U, get_turf(user), user, extra_args)
+ if(!goods)
+ return
+
+ purchase_log(U)
+ user.mind.tcrystals -= cost
+ U.used_TC += cost
+ return goods
+
+// Any additional arguments you wish to send to the get_goods
+/datum/uplink_item/proc/extra_args(var/mob/user)
+ return 1
+
+/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U)
+ if(cost(U.uses, U) > U.uses)
+ return 0
+
+ return can_view(U)
+
+/datum/uplink_item/proc/can_view(obj/item/device/uplink/U)
+ // Making the assumption that if no uplink was supplied, then we don't care about antag roles
+ if(!U || !antag_roles.len)
+ return 1
+
+ // With no owner, there's no need to check antag status.
+ if(!U.uplink_owner)
+ return 0
+
+ for(var/antag_role in antag_roles)
+ var/datum/antagonist/antag = all_antag_types[antag_role]
+ if(antag.is_antagonist(U.uplink_owner))
+ return 1
+ return 0
+
+/datum/uplink_item/proc/cost(var/telecrystals, obj/item/device/uplink/U)
+ . = item_cost
+ if(U)
+ . = U.get_item_cost(src, .)
+
+/datum/uplink_item/proc/description()
+ return desc
+
+// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying
+/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc)
+ return 0
+
+/datum/uplink_item/proc/log_icon()
+ return
+
+/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U)
+ feedback_add_details("traitor_uplink_items_bought", "[src]")
+ log_and_message_admins("used \the [U.loc] to buy \a [src]")
+ U.purchase_log[src] = U.purchase_log[src] + 1
+
+datum/uplink_item/dd_SortValue()
+ return cost(INFINITY)
+
+/********************************
+* *
+* Physical Uplink Entries *
+* *
+********************************/
+/datum/uplink_item/item/buy(var/obj/item/device/uplink/U, var/mob/user)
+ var/obj/item/I = ..()
+ if(!I)
+ return
+
+ if(istype(I, /list))
+ var/list/L = I
+ if(L.len) I = L[1]
+
+ if(istype(I) && ishuman(user))
+ var/mob/living/carbon/human/A = user
+ A.put_in_any_hand_if_possible(I)
+ return I
+
+/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc)
+ var/obj/item/I = new path(loc)
+ return I
+
+/datum/uplink_item/item/description()
+ if(!desc)
+ // Fallback description
+ var/obj/temp = src.path
+ desc = initial(temp.desc)
+ return ..()
+
+/datum/uplink_item/item/log_icon()
+ var/obj/I = path
+ return "\icon[I]"
+
+/********************************
+* *
+* Abstract Uplink Entries *
+* *
+********************************/
+/datum/uplink_item/abstract
+ var/static/image/default_abstract_uplink_icon
+
+/datum/uplink_item/abstract/log_icon()
+ if(!default_abstract_uplink_icon)
+ default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn")
+
+ return "\icon[default_abstract_uplink_icon]"
+
+/****************
+* Support procs *
+****************/
+/proc/get_random_uplink_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc)
+ var/list/bought_items = list()
+ while(remaining_TC)
+ var/datum/uplink_item/I = default_uplink_selection.get_random_item(remaining_TC, U, bought_items)
+ if(!I)
+ break
+ bought_items += I
+ remaining_TC -= I.cost(remaining_TC, U)
+
+ return bought_items
diff --git a/code/datums/uplink/visible_weapons.dm b/code/datums/uplink/visible_weapons.dm
new file mode 100644
index 00000000000..4c9ac49ee12
--- /dev/null
+++ b/code/datums/uplink/visible_weapons.dm
@@ -0,0 +1,91 @@
+/***************************************
+* Highly Visible and Dangerous Weapons *
+***************************************/
+/datum/uplink_item/item/visible_weapons
+ category = /datum/uplink_category/visible_weapons
+
+/datum/uplink_item/item/visible_weapons/energy_sword
+ name = "Energy Sword"
+ item_cost = 4
+ path = /obj/item/weapon/melee/energy/sword
+
+/datum/uplink_item/item/visible_weapons/dartgun
+ name = "Dart Gun"
+ item_cost = 5
+ path = /obj/item/weapon/gun/projectile/dartgun
+
+/datum/uplink_item/item/visible_weapons/crossbow
+ name = "Energy Crossbow"
+ item_cost = 5
+ path = /obj/item/weapon/gun/energy/crossbow
+
+/datum/uplink_item/item/visible_weapons/silenced_45
+ name = "Silenced .45"
+ item_cost = 5
+ path = /obj/item/weapon/gun/projectile/silenced
+
+/datum/uplink_item/item/visible_weapons/riggedlaser
+ name = "Exosuit Rigged Laser"
+ item_cost = 6
+ path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
+
+/datum/uplink_item/item/visible_weapons/revolver
+ name = "Revolver"
+ item_cost = 6
+ path = /obj/item/weapon/gun/projectile/revolver
+
+/datum/uplink_item/item/visible_weapons/heavysniper
+ name = "Anti-materiel Rifle"
+ item_cost = DEFAULT_TELECRYSTAL_AMOUNT
+ path = /obj/item/weapon/gun/projectile/heavysniper
+
+//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
+/datum/uplink_item/item/visible_weapons/submachinegun
+ name = "Submachine Gun"
+ item_cost = 6
+ path = /obj/item/weapon/gun/projectile/automatic/c20r
+
+/datum/uplink_item/item/visible_weapons/assaultrifle
+ name = "Assault Rifle"
+ item_cost = 7
+ path = /obj/item/weapon/gun/projectile/automatic/sts35
+
+/datum/uplink_item/item/visible_weapons/combatshotgun
+ name = "Combat Shotgun"
+ item_cost = 7
+ path = /obj/item/weapon/gun/projectile/shotgun/pump/combat
+
+/datum/uplink_item/item/visible_weapons/egun
+ name = "Energy Gun"
+ item_cost = 5
+ path = /obj/item/weapon/gun/energy/gun
+
+/datum/uplink_item/item/visible_weapons/lasercannon
+ name = "Laser Cannon"
+ item_cost = 6
+ path = /obj/item/weapon/gun/energy/lasercannon
+
+/datum/uplink_item/item/visible_weapons/lasercarbine
+ name = "Laser Carbine"
+ item_cost = 7
+ path = /obj/item/weapon/gun/energy/laser
+
+/datum/uplink_item/item/visible_weapons/ionrifle
+ name = "Ion Rifle"
+ item_cost = 5
+ path = /obj/item/weapon/gun/energy/ionrifle
+
+/datum/uplink_item/item/visible_weapons/xray
+ name = "Xray Gun"
+ item_cost = 7
+ path = /obj/item/weapon/gun/energy/xray
+
+/datum/uplink_item/item/visible_weapons/tactknife
+ name = "Tactical Knife"
+ item_cost = 1
+ path = /obj/item/weapon/material/hatchet/tacknife
+
+/datum/uplink_item/item/visible_weapons/combatknife
+ name = "Combat Knife"
+ item_cost = 3
+ path = /obj/item/weapon/material/hatchet/tacknife/combatknife
\ No newline at end of file
diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm
index 8e460d38b6a..c27d510d8be 100644
--- a/code/game/antagonist/outsider/mercenary.dm
+++ b/code/game/antagonist/outsider/mercenary.dm
@@ -46,9 +46,8 @@ var/datum/antagonist/mercenary/mercs
player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT
player.mind.accept_tcrystals = 1
- if (player.mind == leader)
- var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT)
- player.put_in_hands(U)
+ var/obj/item/device/radio/uplink/U = new(player.loc, player.mind, DEFAULT_TELECRYSTAL_AMOUNT)
+ player.put_in_hands(U)
player.update_icons()
diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm
index df28d4d3d78..54628682565 100644
--- a/code/game/objects/items/devices/uplink.dm
+++ b/code/game/objects/items/devices/uplink.dm
@@ -1,11 +1,3 @@
-//This could either be split into the proper DM files or placed somewhere else all together, but it'll do for now -Nodrak
-
-/*
-
-A list of items and costs is stored under the datum of every game mode, alongside the number of crystals, and the welcoming message.
-
-*/
-
/obj/item/device/uplink
var/welcome = "Welcome, Operative" // Welcoming menu message
var/uses // Numbers of crystals
@@ -18,6 +10,10 @@ A list of items and costs is stored under the datum of every game mode, alongsid
var/list/purchase_log = new
var/datum/mind/uplink_owner = null
var/used_TC = 0
+ var/offer_time = 15 MINUTES //The time increment per discount offered
+ var/next_offer_time //The time a discount will next be offered
+ var/datum/uplink_item/discount_item //The item to be discounted
+ var/discount_amount //The amount as a percent the item will be discounted by
/obj/item/device/uplink/nano_host()
return loc
@@ -28,10 +24,22 @@ A list of items and costs is stored under the datum of every game mode, alongsid
purchase_log = list()
world_uplinks += src
uses = owner.tcrystals
+ processing_objects += src
/obj/item/device/uplink/Destroy()
world_uplinks -= src
- ..()
+ processing_objects -= src
+ return ..()
+
+/obj/item/device/uplink/process()
+ if(world.time > next_offer_time)
+ discount_item = default_uplink_selection.get_random_item(INFINITY)
+ discount_amount = pick(90;0.9, 80;0.8, 70;0.7, 60;0.6, 50;0.5, 40;0.4, 30;0.3, 20;0.2, 10;0.1)
+ next_offer_time = world.time + offer_time
+ nanomanager.update_uis(src)
+
+/obj/item/device/uplink/get_item_cost(var/item_type, var/item_cost)
+ return (discount_item && (item_type == discount_item)) ? max(1, round(item_cost*discount_amount)) : item_cost
// HIDDEN UPLINK - Can be stored in anything but the host item has to have a trigger for it.
/* How to create an uplink in 3 easy steps!
@@ -107,6 +115,11 @@ A list of items and costs is stored under the datum of every game mode, alongsid
/obj/item/device/uplink/hidden/interact(mob/user)
ui_interact(user)
+/obj/item/device/uplink/hidden/CanUseTopic()
+ if(!active)
+ return STATUS_CLOSE
+ return ..()
+
// The purchasing code.
/obj/item/device/uplink/hidden/Topic(href, href_list)
if(..())
@@ -139,11 +152,14 @@ A list of items and costs is stored under the datum of every game mode, alongsid
if(category.can_view(src))
categories[++categories.len] = list("name" = category.name, "ref" = "\ref[category]")
nanoui_data["categories"] = categories
+ nanoui_data["discount_name"] = discount_item ? discount_item.name : ""
+ nanoui_data["discount_amount"] = (1-discount_amount)*100
+ nanoui_data["offer_expiry"] = worldtime2text(next_offer_time - world.time)
else if(nanoui_menu == 1)
var/items[0]
for(var/datum/uplink_item/item in category.items)
if(item.can_view(src))
- var/cost = item.cost(uses)
+ var/cost = item.cost(uses, src)
if(!cost) cost = "???"
items[++items.len] = list("name" = item.name, "description" = replacetext(item.description(), "\n", "
"), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]")
nanoui_data["items"] = items
diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm
deleted file mode 100644
index b0ee3689a1d..00000000000
--- a/code/game/objects/items/devices/uplink_items.dm
+++ /dev/null
@@ -1,782 +0,0 @@
-var/datum/uplink/uplink = new()
-
-/datum/uplink
- var/list/items_assoc
- var/list/datum/uplink_item/items
- var/list/datum/uplink_category/categories
-
-/datum/uplink/New()
- items_assoc = list()
- items = init_subtypes(/datum/uplink_item)
- categories = init_subtypes(/datum/uplink_category)
- categories = dd_sortedObjectList(categories)
-
- for(var/datum/uplink_item/item in items)
- if(!item.name)
- items -= item
- continue
-
- items_assoc[item.type] = item
-
- for(var/datum/uplink_category/category in categories)
- if(item.category == category.type)
- category.items += item
-
- for(var/datum/uplink_category/category in categories)
- category.items = dd_sortedObjectList(category.items)
-
-/datum/uplink_item
- var/name
- var/desc
- var/item_cost = 0
- var/datum/uplink_category/category // Item category
- var/list/datum/antagonist/antag_roles // Antag roles this item is displayed to. If empty, display to all.
-
-/datum/uplink_item/item
- var/path = null
-
-/datum/uplink_item/New()
- ..()
- antag_roles = list()
-
-
-
-/datum/uplink_item/proc/buy(var/obj/item/device/uplink/U, var/mob/user)
- var/extra_args = extra_args(user)
- if(!extra_args)
- return
-
- if(!can_buy(U))
- return
-
- var/cost = cost(U.uses)
-
- var/goods = get_goods(U, get_turf(user), user, extra_args)
- if(!goods)
- return
-
- purchase_log(U)
- user.mind.tcrystals -= cost
- U.used_TC += cost
- return goods
-
-// Any additional arguments you wish to send to the get_goods
-/datum/uplink_item/proc/extra_args(var/mob/user)
- return 1
-
-/datum/uplink_item/proc/can_buy(obj/item/device/uplink/U)
- if(cost(U.uses) > U.uses)
- return 0
-
- return can_view(U)
-
-/datum/uplink_item/proc/can_view(obj/item/device/uplink/U)
- // Making the assumption that if no uplink was supplied, then we don't care about antag roles
- if(!U || !antag_roles.len)
- return 1
-
- // With no owner, there's no need to check antag status.
- if(!U.uplink_owner)
- return 0
-
- for(var/antag_role in antag_roles)
- var/datum/antagonist/antag = all_antag_types[antag_role]
- if(antag.is_antagonist(U.uplink_owner))
- return 1
- return 0
-
-/datum/uplink_item/proc/cost(var/telecrystals)
- return item_cost
-
-/datum/uplink_item/proc/description()
- return desc
-
-// get_goods does not necessarily return physical objects, it is simply a way to acquire the uplink item without paying
-/datum/uplink_item/proc/get_goods(var/obj/item/device/uplink/U, var/loc)
- return 0
-
-/datum/uplink_item/proc/log_icon()
- return
-
-/datum/uplink_item/proc/purchase_log(obj/item/device/uplink/U)
- feedback_add_details("traitor_uplink_items_bought", "[src]")
- log_and_message_admins("used \the [U.loc] to buy \a [src]")
- U.purchase_log[src] = U.purchase_log[src] + 1
-
-datum/uplink_item/dd_SortValue()
- return cost(INFINITY)
-
-/********************************
-* *
-* Physical Uplink Entries *
-* *
-********************************/
-/datum/uplink_item/item/buy(var/obj/item/device/uplink/U, var/mob/user)
- var/obj/item/I = ..()
- if(!I)
- return
-
- if(istype(I, /list))
- var/list/L = I
- if(L.len) I = L[1]
-
- if(istype(I) && ishuman(user))
- var/mob/living/carbon/human/A = user
- A.put_in_any_hand_if_possible(I)
- return I
-
-/datum/uplink_item/item/get_goods(var/obj/item/device/uplink/U, var/loc)
- var/obj/item/I = new path(loc)
- return I
-
-/datum/uplink_item/item/description()
- if(!desc)
- // Fallback description
- var/obj/temp = src.path
- desc = initial(temp.desc)
- return ..()
-
-/datum/uplink_item/item/log_icon()
- var/obj/I = path
- return "\icon[I]"
-
-/*************
-* Ammunition *
-*************/
-/datum/uplink_item/item/ammo
- item_cost = 2
- category = /datum/uplink_category/ammunition
-
-/datum/uplink_item/item/ammo/a357
- name = ".357"
- path = /obj/item/ammo_magazine/a357
-
-/datum/uplink_item/item/ammo/mc9mm
- name = "9mm"
- path = /obj/item/ammo_magazine/mc9mm
-
-/datum/uplink_item/item/ammo/c45m
- name = ".45"
- path = /obj/item/ammo_magazine/c45m
-
-/datum/uplink_item/item/ammo/darts
- name = "Darts"
- path = /obj/item/ammo_magazine/chemdart
-
-/datum/uplink_item/item/ammo/sniperammo
- name = "14.5mm"
- path = /obj/item/weapon/storage/box/sniperammo
-
-/datum/uplink_item/item/ammo/a556
- name = "5.56mm"
- path = /obj/item/ammo_magazine/a556
-
-/datum/uplink_item/item/ammo/a556/ap
- name = "5.56mm AP"
- path = /obj/item/ammo_magazine/a556/ap
-
-/datum/uplink_item/item/ammo/a10mm
- name = "10mm"
- path = /obj/item/ammo_magazine/a10mm
-
-/datum/uplink_item/item/ammo/a762
- name = "7.62mm"
- path = /obj/item/ammo_magazine/a762
-
-/datum/uplink_item/item/ammo/a762/ap
- name = "7.62mm AP"
- path = /obj/item/ammo_magazine/a762/ap
-
-/datum/uplink_item/item/ammo/g12
- name = "12 gauge"
- path = /obj/item/ammo_magazine/g12
-
-/datum/uplink_item/item/ammo/g12/beanbag
- name = "12 gauge beanbag"
- path = /obj/item/ammo_magazine/g12/beanbag
- item_cost = 1 // Discount due to it being LTL.
-
-/datum/uplink_item/item/ammo/g12/pellet
- name = "12 gauge pellet"
- path = /obj/item/ammo_magazine/g12/pellet
-
-/***************************************
-* Highly Visible and Dangerous Weapons *
-***************************************/
-/datum/uplink_item/item/visible_weapons
- category = /datum/uplink_category/visible_weapons
-
-/datum/uplink_item/item/visible_weapons/energy_sword
- name = "Energy Sword"
- item_cost = 4
- path = /obj/item/weapon/melee/energy/sword
-
-/datum/uplink_item/item/visible_weapons/dartgun
- name = "Dart Gun"
- item_cost = 5
- path = /obj/item/weapon/gun/projectile/dartgun
-
-/datum/uplink_item/item/visible_weapons/crossbow
- name = "Energy Crossbow"
- item_cost = 5
- path = /obj/item/weapon/gun/energy/crossbow
-
-/datum/uplink_item/item/visible_weapons/silenced_45
- name = "Silenced .45"
- item_cost = 5
- path = /obj/item/weapon/gun/projectile/silenced
-
-/datum/uplink_item/item/visible_weapons/riggedlaser
- name = "Exosuit Rigged Laser"
- item_cost = 6
- path = /obj/item/mecha_parts/mecha_equipment/weapon/energy/riggedlaser
-
-/datum/uplink_item/item/visible_weapons/revolver
- name = "Revolver"
- item_cost = 6
- path = /obj/item/weapon/gun/projectile/revolver
-
-/datum/uplink_item/item/visible_weapons/heavysniper
- name = "Anti-materiel Rifle"
- item_cost = DEFAULT_TELECRYSTAL_AMOUNT
- path = /obj/item/weapon/gun/projectile/heavysniper
-
-//These are for traitors (or other antags, perhaps) to have the option of purchasing some merc gear.
-/datum/uplink_item/item/visible_weapons/submachinegun
- name = "Submachine Gun"
- item_cost = 6
- path = /obj/item/weapon/gun/projectile/automatic/c20r
-
-/datum/uplink_item/item/visible_weapons/assaultrifle
- name = "Assault Rifle"
- item_cost = 7
- path = /obj/item/weapon/gun/projectile/automatic/sts35
-
-/datum/uplink_item/item/visible_weapons/combatshotgun
- name = "Combat Shotgun"
- item_cost = 7
- path = /obj/item/weapon/gun/projectile/shotgun/pump/combat
-
-/datum/uplink_item/item/visible_weapons/egun
- name = "Energy Gun"
- item_cost = 5
- path = /obj/item/weapon/gun/energy/gun
-
-/datum/uplink_item/item/visible_weapons/lasercannon
- name = "Laser Cannon"
- item_cost = 6
- path = /obj/item/weapon/gun/energy/lasercannon
-
-/datum/uplink_item/item/visible_weapons/lasercarbine
- name = "Laser Carbine"
- item_cost = 7
- path = /obj/item/weapon/gun/energy/laser
-
-/datum/uplink_item/item/visible_weapons/ionrifle
- name = "Ion Rifle"
- item_cost = 5
- path = /obj/item/weapon/gun/energy/ionrifle
-
-/datum/uplink_item/item/visible_weapons/xray
- name = "Xray Gun"
- item_cost = 7
- path = /obj/item/weapon/gun/energy/xray
-
-/*************************************
-* Stealthy and Inconspicuous Weapons *
-*************************************/
-/datum/uplink_item/item/stealthy_weapons
- category = /datum/uplink_category/stealthy_weapons
-
-/datum/uplink_item/item/stealthy_weapons/soap
- name = "Subversive Soap"
- item_cost = 1
- path = /obj/item/weapon/soap/syndie
-
-/datum/uplink_item/item/stealthy_weapons/concealed_cane
- name = "Concealed Cane Sword"
- item_cost = 1
- path = /obj/item/weapon/cane/concealed
-
-/datum/uplink_item/item/stealthy_weapons/detomatix
- name = "Detomatix PDA Cartridge"
- item_cost = 3
- path = /obj/item/weapon/cartridge/syndicate
-
-/datum/uplink_item/item/stealthy_weapons/parapen
- name = "Paralysis Pen"
- item_cost = 3
- path = /obj/item/weapon/pen/reagent/paralysis
-
-/datum/uplink_item/item/stealthy_weapons/cigarette_kit
- name = "Cigarette Kit"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/cigarette
-
-/datum/uplink_item/item/stealthy_weapons/random_toxin
- name = "Random Toxin - Beaker"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/toxin
-
-/*******************************
-* Stealth and Camouflage Items *
-*******************************/
-/datum/uplink_item/item/stealth_items
- category = /datum/uplink_category/stealth_items
-
-/datum/uplink_item/item/stealth_items/id
- name = "Agent ID card"
- item_cost = 2
- path = /obj/item/weapon/card/id/syndicate
-
-/datum/uplink_item/item/stealth_items/syndigaloshes
- name = "No-Slip Shoes"
- item_cost = 2
- path = /obj/item/clothing/shoes/syndigaloshes
-
-/datum/uplink_item/item/stealth_items/spy
- name = "Bug Kit"
- item_cost = 2
- path = /obj/item/weapon/storage/box/syndie_kit/spy
-
-/datum/uplink_item/item/stealth_items/chameleon_kit
- name = "Chameleon Kit"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/chameleon
-
-/datum/uplink_item/item/stealth_items/chameleon_projector
- name = "Chameleon-Projector"
- item_cost = 4
- path = /obj/item/device/chameleon
-
-/datum/uplink_item/item/stealth_items/chameleon_projector
- name = "Chameleon-Projector"
- item_cost = 4
- path = /obj/item/device/chameleon
-
-/datum/uplink_item/item/stealth_items/voice
- name = "Voice Changer"
- item_cost = 4
- path = /obj/item/clothing/mask/gas/voice
-
-/datum/uplink_item/item/stealth_items/camera_floppy
- name = "Camera Network Access - Floppy"
- item_cost = 6
- path = /obj/item/weapon/disk/file/cameras/syndicate
-
-/********
-* Armor *
-********/
-/datum/uplink_item/item/armor
- category = /datum/uplink_category/armor
-
-/datum/uplink_item/item/armor/combat
- name = "Combat Armor Set"
- item_cost = 5
- path = /obj/item/weapon/storage/box/syndie_kit/combat_armor
-
-/datum/uplink_item/item/armor/heavy_vest
- name = "Heavy Armor Vest"
- item_cost = 4
- path = /obj/item/clothing/suit/storage/vest/heavy/merc
-
-/********************
-* Devices and Tools *
-********************/
-/datum/uplink_item/item/tools
- category = /datum/uplink_category/tools
-
-/datum/uplink_item/item/tools/toolbox
- name = "Fully Loaded Toolbox"
- item_cost = 1
- path = /obj/item/weapon/storage/toolbox/syndicate
-
-/datum/uplink_item/item/tools/plastique
- name = "C-4 (Destroys walls)"
- item_cost = 2
- path = /obj/item/weapon/plastique
-
-/datum/uplink_item/item/tools/encryptionkey_radio
- name = "Encrypted Radio Channel Key"
- item_cost = 2
- path = /obj/item/device/encryptionkey/syndicate
-
-/datum/uplink_item/item/tools/encryptionkey_binary
- name = "Binary Translator Key"
- item_cost = 3
- path = /obj/item/device/encryptionkey/binary
-
-/datum/uplink_item/item/tools/emag
- name = "Cryptographic Sequencer"
- item_cost = 3
- path = /obj/item/weapon/card/emag
-
-/datum/uplink_item/item/tools/hacking_tool
- name = "Door Hacking Tool"
- item_cost = 2
- path = /obj/item/device/multitool/hacktool
- desc = "Appears and functions as a standard multitool until the mode is toggled by applying a screwdriver appropriately. \
- When in hacking mode this device will grant full access to any standard airlock within 20 to 40 seconds. \
- This device will also be able to immediately access the last 6 to 8 hacked airlocks."
-
-/datum/uplink_item/item/tools/clerical
- name = "Morphic Clerical Kit"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/clerical
-
-/datum/uplink_item/item/tools/space_suit
- name = "Space Suit"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/space
-
-/datum/uplink_item/item/tools/thermal
- name = "Thermal Imaging Glasses"
- item_cost = 3
- path = /obj/item/clothing/glasses/thermal/syndi
-
-/datum/uplink_item/item/tools/powersink
- name = "Powersink (DANGER!)"
- item_cost = 5
- path = /obj/item/device/powersink
-
-/datum/uplink_item/item/tools/ai_module
- name = "Hacked AI Upload Module"
- item_cost = 7
- path = /obj/item/weapon/aiModule/syndicate
-
-/datum/uplink_item/item/tools/supply_beacon
- name = "Hacked Supply Beacon (DANGER!)"
- item_cost = 7
- path = /obj/item/supply_beacon
-
-/datum/uplink_item/item/tools/teleporter
- name = "Teleporter Circuit Board"
- item_cost = 20
- path = /obj/item/weapon/circuitboard/teleporter
-
-/datum/uplink_item/item/tools/money
- name = "Operations Funding"
- item_cost = 3
- path = /obj/item/weapon/storage/secure/briefcase/money
- desc = "A briefcase with 10,000 untraceable thalers for funding your sneaky activities."
-
-/datum/uplink_item/item/tools/crystal
- name = "Tradable Crystal"
- item_cost = 1
- path = /obj/item/device/telecrystal
- desc = "A telecrystal that can be transferred from one user to another. Be sure not to give it to just anyone."
-
-/***********
-* Implants *
-***********/
-/datum/uplink_item/item/implants
- category = /datum/uplink_category/implants
-
-/datum/uplink_item/item/implants/imp_freedom
- name = "Freedom Implant"
- item_cost = 3
- path = /obj/item/weapon/storage/box/syndie_kit/imp_freedom
-
-/datum/uplink_item/item/implants/imp_compress
- name = "Compressed Matter Implant"
- item_cost = 4
- path = /obj/item/weapon/storage/box/syndie_kit/imp_compress
-
-/datum/uplink_item/item/implants/imp_explosive
- name = "Explosive Implant (DANGER!)"
- item_cost = 6
- path = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
-
-/datum/uplink_item/item/implants/imp_uplink
- name = "Uplink Implant" //Original name: "Uplink Implant (Contains 5 Telecrystals)"
- item_cost = 5 //Original cost: 10
- path = /obj/item/weapon/storage/box/syndie_kit/imp_uplink
-
-/**********
-* Medical *
-**********/
-/datum/uplink_item/item/medical
- category = /datum/uplink_category/medical
-
-/datum/uplink_item/item/medical/sinpockets
- name = "Box of Sin-Pockets"
- item_cost = 1
- path = /obj/item/weapon/storage/box/sinpockets
-
-/datum/uplink_item/item/medical/surgery
- name = "Surgery kit"
- item_cost = 6
- path = /obj/item/weapon/storage/firstaid/surgery
-
-/datum/uplink_item/item/medical/combat
- name = "Combat medical kit"
- item_cost = 6
- path = /obj/item/weapon/storage/firstaid/combat
-
-/*******************
-* Hardsuit Modules *
-*******************/
-/datum/uplink_item/item/hardsuit_modules
- category = /datum/uplink_category/hardsuit_modules
-
-/datum/uplink_item/item/hardsuit_modules/thermal
- name = "Thermal Scanner"
- item_cost = 2
- path = /obj/item/rig_module/vision/thermal
-
-/datum/uplink_item/item/hardsuit_modules/energy_net
- name = "Net Projector"
- item_cost = 3
- path = /obj/item/rig_module/fabricator/energy_net
-
-/datum/uplink_item/item/ewar_voice
- name = "Electrowarfare Suite and Voice Synthesiser"
- item_cost = 4
- path = /obj/item/weapon/storage/box/syndie_kit/ewar_voice
-
-/datum/uplink_item/item/hardsuit_modules/maneuvering_jets
- name = "Maneuvering Jets"
- item_cost = 4
- path = /obj/item/rig_module/maneuvering_jets
-
-/datum/uplink_item/item/hardsuit_modules/egun
- name = "Mounted Energy Gun"
- item_cost = 6
- path = /obj/item/rig_module/mounted/egun
-
-/datum/uplink_item/item/hardsuit_modules/power_sink
- name = "Power Sink"
- item_cost = 6
- path = /obj/item/rig_module/power_sink
-
-/datum/uplink_item/item/hardsuit_modules/laser_canon
- name = "Mounted Laser Cannon"
- item_cost = 8
- path = /obj/item/rig_module/mounted
-
-/***********
-* Grenades *
-************/
-/datum/uplink_item/item/grenades
- category = /datum/uplink_category/grenades
-
-/datum/uplink_item/item/grenades/anti_photon
- name = "5xPhoton Disruption Grenades"
- item_cost = 2
- path = /obj/item/weapon/storage/box/anti_photons
-
-/datum/uplink_item/item/grenades/emp
- name = "5xEMP Grenades"
- item_cost = 3
- path = /obj/item/weapon/storage/box/emps
-
-/datum/uplink_item/item/grenades/smoke
- name = "5xSmoke Grenades"
- item_cost = 2
- path = /obj/item/weapon/storage/box/smokes
-
-/************
-* Badassery *
-************/
-/datum/uplink_item/item/badassery
- category = /datum/uplink_category/badassery
-
-/datum/uplink_item/item/badassery/balloon
- name = "For showing that You Are The BOSS (Useless Balloon)"
- item_cost = DEFAULT_TELECRYSTAL_AMOUNT
- path = /obj/item/toy/syndicateballoon
-
-/datum/uplink_item/item/badassery/balloon/NT
- name = "For showing that you love NT SOO much (Useless Balloon)"
- path = /obj/item/toy/nanotrasenballoon
-
-/**************
-* Random Item *
-**************/
-/datum/uplink_item/item/badassery/random_one
- name = "Random Item"
- desc = "Buys you one random item."
-
-/datum/uplink_item/item/badassery/random_one/buy(var/obj/item/device/uplink/U, var/mob/user)
- var/datum/uplink_item/item = default_uplink_selection.get_random_item(U.uses)
- return item.buy(U, user)
-
-/datum/uplink_item/item/badassery/random_one/can_buy(obj/item/device/uplink/U)
- return default_uplink_selection.get_random_item(U.uses, U) != null
-
-/datum/uplink_item/item/badassery/random_many
- name = "Random Items"
- desc = "Buys you as many random items you can afford. Convenient packaging NOT included."
-
-/datum/uplink_item/item/badassery/random_many/cost(var/telecrystals)
- return max(1, telecrystals)
-
-/datum/uplink_item/item/badassery/random_many/get_goods(var/obj/item/device/uplink/U, var/loc)
- var/list/bought_items = list()
- for(var/datum/uplink_item/UI in get_random_uplink_items(U, U.uses, loc))
- UI.purchase_log(U)
- var/obj/item/I = UI.get_goods(U, loc)
- if(istype(I))
- bought_items += I
-
- return bought_items
-
-/datum/uplink_item/item/badassery/random_many/purchase_log(obj/item/device/uplink/U)
- feedback_add_details("traitor_uplink_items_bought", "[src]")
- log_and_message_admins("used \the [U.loc] to buy \a [src]")
-
-/****************
-* Surplus Crate *
-****************/
-/datum/uplink_item/item/badassery/surplus
- name = "Surplus Crate"
- item_cost = 40
- var/item_worth = 60
- var/icon
-
-/datum/uplink_item/item/badassery/surplus/New()
- ..()
- desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers."
-
-/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc)
- var/obj/structure/largecrate/C = new(loc)
- var/random_items = get_random_uplink_items(null, item_worth, C)
- for(var/datum/uplink_item/I in random_items)
- I.purchase_log(U)
- I.get_goods(U, C)
-
- return C
-
-/datum/uplink_item/item/badassery/surplus/log_icon()
- if(!icon)
- var/obj/structure/largecrate/C = /obj/structure/largecrate
- icon = image(initial(C.icon), initial(C.icon_state))
-
- return "\icon[icon]"
-
-/********************************
-* *
-* Abstract Uplink Entries *
-* *
-********************************/
-var/image/default_abstract_uplink_icon
-/datum/uplink_item/abstract/log_icon()
- if(!default_abstract_uplink_icon)
- default_abstract_uplink_icon = image('icons/obj/pda.dmi', "pda-syn")
-
- return "\icon[default_abstract_uplink_icon]"
-
-/****************
-* Announcements *
-*****************/
-/datum/uplink_item/abstract/announcements
- category = /datum/uplink_category/services
-
-/datum/uplink_item/abstract/announcements/buy(var/obj/item/device/uplink/U, var/mob/user)
- . = ..()
- if(.)
- log_and_message_admins("has triggered a falsified [src]", user)
-
-/datum/uplink_item/abstract/announcements/fake_centcom
- item_cost = DEFAULT_TELECRYSTAL_AMOUNT / 2
-
-/datum/uplink_item/abstract/announcements/fake_centcom/New()
- ..()
- name = "[command_name()] Update Announcement"
- desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data."
-
-/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
- command_announcement.Announce(args.["message"], args.["title"])
- return 1
-
-/datum/uplink_item/abstract/announcements/fake_crew_arrival
- name = "Crew Arrival Announcement/Records"
- desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!"
- item_cost = 4
-
-/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
- if(!user)
- return 0
-
- var/obj/item/weapon/card/id/I = user.GetIdCard()
- var/datum/data/record/random_general_record
- var/datum/data/record/random_medical_record
- if(data_core.general.len)
- random_general_record = pick(data_core.general)
- random_medical_record = find_medical_record("id", random_general_record.fields["id"])
-
- var/datum/data/record/general = data_core.CreateGeneralRecord(user)
- if(I)
- general.fields["age"] = I.age
- general.fields["rank"] = I.assignment
- general.fields["real_rank"] = I.assignment
- general.fields["name"] = I.registered_name
- general.fields["sex"] = I.sex
- else
- var/mob/living/carbon/human/H
- if(istype(user,/mob/living/carbon/human))
- H = user
- general.fields["age"] = H.age
- else
- general.fields["age"] = initial(H.age)
- var/assignment = GetAssignment(user)
- general.fields["rank"] = assignment
- general.fields["real_rank"] = assignment
- general.fields["name"] = user.real_name
- general.fields["sex"] = capitalize(user.gender)
-
- general.fields["species"] = user.get_species()
- var/datum/data/record/medical = data_core.CreateMedicalRecord(general.fields["name"], general.fields["id"])
- data_core.CreateSecurityRecord(general.fields["name"], general.fields["id"])
-
- if(!random_general_record)
- general.fields["citizenship"] = random_general_record.fields["citizenship"]
- general.fields["faction"] = random_general_record.fields["faction"]
- general.fields["fingerprint"] = random_general_record.fields["fingerprint"]
- general.fields["home_system"] = random_general_record.fields["home_system"]
- general.fields["religion"] = random_general_record.fields["religion"]
- if(random_medical_record)
- medical.fields["b_type"] = random_medical_record.fields["b_type"]
- medical.fields["b_dna"] = random_medical_record.fields["b_type"]
-
- if(I)
- general.fields["fingerprint"] = I.fingerprint_hash
- medical.fields["b_type"] = I.blood_type
- medical.fields["b_dna"] = I.dna_hash
-
- AnnounceArrivalSimple(general.fields["name"], general.fields["rank"])
- return 1
-
-/datum/uplink_item/abstract/announcements/fake_ion_storm
- name = "Ion Storm Announcement"
- desc = "Interferes with the station's ion sensors. Triggers immediately upon investment."
- item_cost = 1
-
-/datum/uplink_item/abstract/announcements/fake_ion_storm/get_goods(var/obj/item/device/uplink/U, var/loc)
- ion_storm_announcement()
- return 1
-
-/datum/uplink_item/abstract/announcements/fake_radiation
- name = "Radiation Storm Announcement"
- desc = "Interferes with the station's radiation sensors. Triggers immediately upon investment."
- item_cost = 3
-
-/datum/uplink_item/abstract/announcements/fake_radiation/get_goods(var/obj/item/device/uplink/U, var/loc)
- var/datum/event_meta/EM = new(EVENT_LEVEL_MUNDANE, "Fake Radiation Storm", add_to_queue = 0)
- new/datum/event/radiation_storm/syndicate(EM)
- return 1
-
-
-/****************
-* Support procs *
-****************/
-/proc/get_random_uplink_items(var/obj/item/device/uplink/U, var/remaining_TC, var/loc)
- var/list/bought_items = list()
- while(remaining_TC)
- var/datum/uplink_item/I = default_uplink_selection.get_random_item(remaining_TC, U, bought_items)
- if(!I)
- break
- bought_items += I
- remaining_TC -= I.cost(remaining_TC)
-
- return bought_items
diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm
index 70cca951051..00860eb30c3 100644
--- a/code/game/objects/items/devices/uplink_random_lists.dm
+++ b/code/game/objects/items/devices/uplink_random_lists.dm
@@ -27,7 +27,7 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
if(!prob(RI.keep_probability))
continue
var/datum/uplink_item/I = uplink.items_assoc[RI.uplink_item]
- if(I.cost(telecrystals) > telecrystals)
+ if(I.cost(telecrystals, U) > telecrystals)
continue
if(bought_items && (I in bought_items) && !prob(RI.reselect_probability))
continue
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 47a2f00b213..f8b21af1903 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -51,31 +51,24 @@
new src.foldable(get_turf(src))
qdel(src)
-/obj/item/weapon/storage/box/survival/
- New()
- ..()
- new /obj/item/clothing/mask/breath( src )
- new /obj/item/weapon/tank/emergency_oxygen( src )
+/obj/item/weapon/storage/box/survival/New()
+ ..()
+ new /obj/item/clothing/mask/breath(src)
+ new /obj/item/weapon/tank/emergency_oxygen(src)
-/obj/item/weapon/storage/box/engineer/
- New()
- ..()
- new /obj/item/clothing/mask/breath( src )
- new /obj/item/weapon/tank/emergency_oxygen/engi( src )
+/obj/item/weapon/storage/box/engineer/New()
+ ..()
+ new /obj/item/clothing/mask/breath(src)
+ new /obj/item/weapon/tank/emergency_oxygen/engi(src)
/obj/item/weapon/storage/box/gloves
name = "box of latex gloves"
desc = "Contains white gloves."
icon_state = "latex"
- New()
- ..()
- new /obj/item/clothing/gloves/latex(src)
- new /obj/item/clothing/gloves/latex(src)
- new /obj/item/clothing/gloves/latex(src)
- new /obj/item/clothing/gloves/latex(src)
- new /obj/item/clothing/gloves/latex(src)
- new /obj/item/clothing/gloves/latex(src)
+/obj/item/weapon/storage/box/gloves/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/clothing/gloves/latex(src)
/obj/item/weapon/storage/box/masks
@@ -83,75 +76,50 @@
desc = "This box contains masks of sterility."
icon_state = "sterile"
- New()
- ..()
+/obj/item/weapon/storage/box/masks/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
- new /obj/item/clothing/mask/surgical(src)
-
/obj/item/weapon/storage/box/syringes
name = "box of syringes"
desc = "A box full of syringes."
icon_state = "syringe"
- New()
- ..()
- new /obj/item/weapon/reagent_containers/syringe( src )
- new /obj/item/weapon/reagent_containers/syringe( src )
- new /obj/item/weapon/reagent_containers/syringe( src )
- new /obj/item/weapon/reagent_containers/syringe( src )
- new /obj/item/weapon/reagent_containers/syringe( src )
- new /obj/item/weapon/reagent_containers/syringe( src )
- new /obj/item/weapon/reagent_containers/syringe( src )
+/obj/item/weapon/storage/box/syringes/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/weapon/reagent_containers/syringe(src)
/obj/item/weapon/storage/box/syringegun
name = "box of syringe gun cartridges"
desc = "A box full of compressed gas cartridges."
icon_state = "syringe"
- New()
- ..()
- new /obj/item/weapon/syringe_cartridge( src )
- new /obj/item/weapon/syringe_cartridge( src )
- new /obj/item/weapon/syringe_cartridge( src )
- new /obj/item/weapon/syringe_cartridge( src )
- new /obj/item/weapon/syringe_cartridge( src )
- new /obj/item/weapon/syringe_cartridge( src )
- new /obj/item/weapon/syringe_cartridge( src )
-
+/obj/item/weapon/storage/box/syringegun/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/weapon/syringe_cartridge(src)
/obj/item/weapon/storage/box/beakers
name = "box of beakers"
icon_state = "beaker"
- New()
- ..()
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
- new /obj/item/weapon/reagent_containers/glass/beaker( src )
+/obj/item/weapon/storage/box/beakers/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/weapon/reagent_containers/glass/beaker(src)
/obj/item/weapon/storage/box/injectors
name = "box of DNA injectors"
desc = "This box contains injectors it seems."
- New()
- ..()
- new /obj/item/weapon/dnainjector/h2m(src)
- new /obj/item/weapon/dnainjector/h2m(src)
+/obj/item/weapon/storage/box/injectors/New()
+ ..()
+ for(var/i = 1 to 3)
new /obj/item/weapon/dnainjector/h2m(src)
+ for(var/i = 1 to 3)
new /obj/item/weapon/dnainjector/m2h(src)
- new /obj/item/weapon/dnainjector/m2h(src)
- new /obj/item/weapon/dnainjector/m2h(src)
-
/obj/item/weapon/storage/box/blanks
name = "box of blank shells"
@@ -159,14 +127,9 @@
icon_state = "blankshot_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun/blank(src)
- new /obj/item/ammo_casing/shotgun/blank(src)
- new /obj/item/ammo_casing/shotgun/blank(src)
- new /obj/item/ammo_casing/shotgun/blank(src)
- new /obj/item/ammo_casing/shotgun/blank(src)
- new /obj/item/ammo_casing/shotgun/blank(src)
+/obj/item/weapon/storage/box/blanks/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun/blank(src)
/obj/item/weapon/storage/box/beanbags
@@ -175,14 +138,9 @@
icon_state = "beanshot_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun/beanbag(src)
- new /obj/item/ammo_casing/shotgun/beanbag(src)
- new /obj/item/ammo_casing/shotgun/beanbag(src)
- new /obj/item/ammo_casing/shotgun/beanbag(src)
- new /obj/item/ammo_casing/shotgun/beanbag(src)
- new /obj/item/ammo_casing/shotgun/beanbag(src)
+/obj/item/weapon/storage/box/beanbags/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun/beanbag(src)
/obj/item/weapon/storage/box/shotgunammo
@@ -191,14 +149,9 @@
icon_state = "lethalshellshot_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
- new /obj/item/ammo_casing/shotgun(src)
+/obj/item/weapon/storage/box/shotgunammo/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun(src)
/obj/item/weapon/storage/box/shotgunshells
@@ -207,14 +160,9 @@
icon_state = "lethalslug_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun/pellet(src)
- new /obj/item/ammo_casing/shotgun/pellet(src)
- new /obj/item/ammo_casing/shotgun/pellet(src)
- new /obj/item/ammo_casing/shotgun/pellet(src)
- new /obj/item/ammo_casing/shotgun/pellet(src)
- new /obj/item/ammo_casing/shotgun/pellet(src)
+/obj/item/weapon/storage/box/shotgunshells/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun/pellet(src)
/obj/item/weapon/storage/box/flashshells
@@ -223,14 +171,9 @@
icon_state = "illumshot_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun/flash(src)
- new /obj/item/ammo_casing/shotgun/flash(src)
- new /obj/item/ammo_casing/shotgun/flash(src)
- new /obj/item/ammo_casing/shotgun/flash(src)
- new /obj/item/ammo_casing/shotgun/flash(src)
- new /obj/item/ammo_casing/shotgun/flash(src)
+/obj/item/weapon/storage/box/flashshells/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun/flash(src)
/obj/item/weapon/storage/box/stunshells
@@ -239,14 +182,9 @@
icon_state = "stunshot_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun/stunshell(src)
- new /obj/item/ammo_casing/shotgun/stunshell(src)
- new /obj/item/ammo_casing/shotgun/stunshell(src)
- new /obj/item/ammo_casing/shotgun/stunshell(src)
- new /obj/item/ammo_casing/shotgun/stunshell(src)
- new /obj/item/ammo_casing/shotgun/stunshell(src)
+/obj/item/weapon/storage/box/stunshells/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun/stunshell(src)
/obj/item/weapon/storage/box/practiceshells
@@ -255,28 +193,18 @@
icon_state = "blankshot_box"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/ammo_casing/shotgun/practice(src)
- new /obj/item/ammo_casing/shotgun/practice(src)
- new /obj/item/ammo_casing/shotgun/practice(src)
- new /obj/item/ammo_casing/shotgun/practice(src)
- new /obj/item/ammo_casing/shotgun/practice(src)
- new /obj/item/ammo_casing/shotgun/practice(src)
+/obj/item/weapon/storage/box/practiceshells/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/shotgun/practice(src)
/obj/item/weapon/storage/box/sniperammo
name = "box of 14.5mm shells"
desc = "It has a picture of a gun and several warning symbols on the front.
WARNING: Live ammunition. Misuse may result in serious injury or death."
- New()
- ..()
- new /obj/item/ammo_casing/a145(src)
- new /obj/item/ammo_casing/a145(src)
- new /obj/item/ammo_casing/a145(src)
- new /obj/item/ammo_casing/a145(src)
- new /obj/item/ammo_casing/a145(src)
- new /obj/item/ammo_casing/a145(src)
+/obj/item/weapon/storage/box/sniperammo/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/ammo_casing/a145(src)
/obj/item/weapon/storage/box/flashbangs
@@ -284,14 +212,9 @@
desc = "WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use."
icon_state = "flashbang"
- New()
- ..()
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/grenade/flashbang(src)
- new /obj/item/weapon/grenade/flashbang(src)
+/obj/item/weapon/storage/box/flashbangs/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/grenade/flashbang(src)
/obj/item/weapon/storage/box/emps
@@ -299,41 +222,29 @@
desc = "A box containing 5 military grade EMP grenades.
WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur."
icon_state = "emp"
- New()
- ..()
- new /obj/item/weapon/grenade/empgrenade(src)
- new /obj/item/weapon/grenade/empgrenade(src)
- new /obj/item/weapon/grenade/empgrenade(src)
- new /obj/item/weapon/grenade/empgrenade(src)
- new /obj/item/weapon/grenade/empgrenade(src)
+/obj/item/weapon/storage/box/emps/New()
+ ..()
+ for(var/i = 1 to 5)
+ new /obj/item/weapon/grenade/empgrenade(src)
/obj/item/weapon/storage/box/empslite
name = "box of low yield emp grenades"
desc = "A box containing 5 low yield EMP grenades.
WARNING: Do not use near unshielded electronics or biomechanical augmentations, death or permanent paralysis may occur."
icon_state = "emp"
- New()
- ..()
- new /obj/item/weapon/grenade/empgrenade/low_yield(src)
- new /obj/item/weapon/grenade/empgrenade/low_yield(src)
- new /obj/item/weapon/grenade/empgrenade/low_yield(src)
- new /obj/item/weapon/grenade/empgrenade/low_yield(src)
+/obj/item/weapon/storage/box/empslite/New()
+ ..()
+ for(var/i = 1 to 5)
new /obj/item/weapon/grenade/empgrenade/low_yield(src)
/obj/item/weapon/storage/box/smokes
name = "box of smoke bombs"
- desc = "A box containing 5 smoke bombs."
+ desc = "A box containing 7 smoke bombs."
icon_state = "flashbang"
-
/obj/item/weapon/storage/box/smokes/New()
- ..()
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
- new /obj/item/weapon/grenade/smokebomb(src)
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/grenade/smokebomb(src)
/obj/item/weapon/storage/box/anti_photons
@@ -342,11 +253,8 @@
icon_state = "flashbang"
/obj/item/weapon/storage/box/anti_photons/New()
- ..()
- new /obj/item/weapon/grenade/anti_photon(src)
- new /obj/item/weapon/grenade/anti_photon(src)
- new /obj/item/weapon/grenade/anti_photon(src)
- new /obj/item/weapon/grenade/anti_photon(src)
+ ..()
+ for(var/i = 1 to 5)
new /obj/item/weapon/grenade/anti_photon(src)
/obj/item/weapon/storage/box/frags
@@ -354,73 +262,63 @@
desc = "A box containing 5 military grade fragmentation grenades.
WARNING: These devices are extremely dangerous and can cause limb loss or death in repeated use."
icon_state = "frag"
+/obj/item/weapon/storage/box/frags/New()
+ ..()
+ for(var/i = 1 to 5)
+ new /obj/item/weapon/grenade/explosive(src)
- New()
- ..()
- new /obj/item/weapon/grenade/explosive(src)
- new /obj/item/weapon/grenade/explosive(src)
- new /obj/item/weapon/grenade/explosive(src)
- new /obj/item/weapon/grenade/explosive(src)
- new /obj/item/weapon/grenade/explosive(src)
+/obj/item/weapon/storage/box/metalfoam
+ name = "box of metal foam grenades."
+ desc = "A box containing 7 metal foam grenades."
+ icon_state = "flashbang"
+
+/obj/item/weapon/storage/box/metalfoam/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/weapon/grenade/chem_grenade/metalfoam
/obj/item/weapon/storage/box/trackimp
name = "boxed tracking implant kit"
desc = "Box full of scum-bag tracking utensils."
icon_state = "implant"
- New()
- ..()
+/obj/item/weapon/storage/box/trackimp/New()
+ ..()
+ for(var/i = 1 to 4)
new /obj/item/weapon/implantcase/tracking(src)
- new /obj/item/weapon/implantcase/tracking(src)
- new /obj/item/weapon/implantcase/tracking(src)
- new /obj/item/weapon/implantcase/tracking(src)
- new /obj/item/weapon/implanter(src)
- new /obj/item/weapon/implantpad(src)
- new /obj/item/weapon/locator(src)
+ new /obj/item/weapon/implanter(src)
+ new /obj/item/weapon/implantpad(src)
+ new /obj/item/weapon/locator(src)
/obj/item/weapon/storage/box/chemimp
name = "boxed chemical implant kit"
desc = "Box of stuff used to implant chemicals."
icon_state = "implant"
- New()
- ..()
+/obj/item/weapon/storage/box/chemimp/New()
+ ..()
+ for(var/i = 1 to 5)
new /obj/item/weapon/implantcase/chem(src)
- new /obj/item/weapon/implantcase/chem(src)
- new /obj/item/weapon/implantcase/chem(src)
- new /obj/item/weapon/implantcase/chem(src)
- new /obj/item/weapon/implantcase/chem(src)
- new /obj/item/weapon/implanter(src)
- new /obj/item/weapon/implantpad(src)
-
-
+ new /obj/item/weapon/implanter(src)
+ new /obj/item/weapon/implantpad(src)
/obj/item/weapon/storage/box/rxglasses
name = "box of prescription glasses"
desc = "This box contains nerd glasses."
icon_state = "glasses"
- New()
- ..()
- new /obj/item/clothing/glasses/regular(src)
- new /obj/item/clothing/glasses/regular(src)
- new /obj/item/clothing/glasses/regular(src)
- new /obj/item/clothing/glasses/regular(src)
- new /obj/item/clothing/glasses/regular(src)
- new /obj/item/clothing/glasses/regular(src)
+/obj/item/weapon/storage/box/rxglasses/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/clothing/glasses/regular(src)
/obj/item/weapon/storage/box/drinkingglasses
name = "box of drinking glasses"
desc = "It has a picture of drinking glasses on it."
- New()
- ..()
- new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
- new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
- new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
- new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
- new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
+/obj/item/weapon/storage/box/drinkingglasses/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/food/drinks/drinkingglass(src)
/obj/item/weapon/storage/box/cdeathalarm_kit
@@ -429,57 +327,38 @@
icon_state = "implant"
item_state = "syringe_kit"
- New()
- ..()
- new /obj/item/weapon/implanter(src)
- new /obj/item/weapon/implantcase/death_alarm(src)
- new /obj/item/weapon/implantcase/death_alarm(src)
- new /obj/item/weapon/implantcase/death_alarm(src)
- new /obj/item/weapon/implantcase/death_alarm(src)
- new /obj/item/weapon/implantcase/death_alarm(src)
+/obj/item/weapon/storage/box/cdeathalarm_kit/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/implantcase/death_alarm(src)
+ new /obj/item/weapon/implanter(src)
/obj/item/weapon/storage/box/condimentbottles
name = "box of condiment bottles"
desc = "It has a large ketchup smear on it."
- New()
- ..()
+/obj/item/weapon/storage/box/condimentbottles/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/food/condiment(src)
- new /obj/item/weapon/reagent_containers/food/condiment(src)
- new /obj/item/weapon/reagent_containers/food/condiment(src)
- new /obj/item/weapon/reagent_containers/food/condiment(src)
- new /obj/item/weapon/reagent_containers/food/condiment(src)
- new /obj/item/weapon/reagent_containers/food/condiment(src)
-
-
/obj/item/weapon/storage/box/cups
name = "box of paper cups"
desc = "It has pictures of paper cups on the front."
- New()
- ..()
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
- new /obj/item/weapon/reagent_containers/food/drinks/sillycup( src )
+/obj/item/weapon/storage/box/cups/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/weapon/reagent_containers/food/drinks/sillycup(src)
/obj/item/weapon/storage/box/donkpockets
name = "box of donk-pockets"
desc = "Instructions: Heat in microwave. Product will cool if not eaten within seven minutes."
icon_state = "donk_kit"
- New()
- ..()
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
+/obj/item/weapon/storage/box/donkpockets/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/food/snacks/donkpocket(src)
/obj/item/weapon/storage/box/sinpockets
@@ -487,13 +366,9 @@
desc = "Instructions: Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes."
icon_state = "donk_kit"
- New()
- ..()
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src)
- new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src)
+/obj/item/weapon/storage/box/sinpockets/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/food/snacks/donkpocket/sinpocket(src)
/obj/item/weapon/storage/box/monkeycubes
@@ -502,112 +377,88 @@
icon = 'icons/obj/food.dmi'
icon_state = "monkeycubebox"
can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube)
- New()
- ..()
- if(src.type == /obj/item/weapon/storage/box/monkeycubes)
- for(var/i = 1 to 5)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
+
+/obj/item/weapon/storage/box/monkeycubes/New()
+ ..()
+ if(src.type == /obj/item/weapon/storage/box/monkeycubes)
+ for(var/i = 1 to 4)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src)
/obj/item/weapon/storage/box/monkeycubes/farwacubes
name = "farwa cube box"
desc = "Drymate brand farwa cubes, shipped from Ahdomai. Just add water!"
- New()
- ..()
- for(var/i = 1 to 5)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube(src)
+
+/obj/item/weapon/storage/box/monkeycubes/farwacubes/New()
+ ..()
+ for(var/i = 1 to 4)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube(src)
/obj/item/weapon/storage/box/monkeycubes/stokcubes
name = "stok cube box"
desc = "Drymate brand stok cubes, shipped from Moghes. Just add water!"
- New()
- ..()
- for(var/i = 1 to 5)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube(src)
+
+/obj/item/weapon/storage/box/monkeycubes/stokcubes/New()
+ ..()
+ for(var/i = 1 to 4)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube(src)
/obj/item/weapon/storage/box/monkeycubes/neaeracubes
name = "neaera cube box"
desc = "Drymate brand neaera cubes, shipped from Jargon 4. Just add water!"
- New()
- ..()
- for(var/i = 1 to 5)
- new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src)
+
+/obj/item/weapon/storage/box/monkeycubes/neaeracubes/New()
+ ..()
+ for(var/i = 1 to 4)
+ new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube(src)
/obj/item/weapon/storage/box/ids
name = "box of spare IDs"
desc = "Has so many empty IDs."
icon_state = "id"
- New()
- ..()
+/obj/item/weapon/storage/box/ids/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/card/id(src)
- new /obj/item/weapon/card/id(src)
- new /obj/item/weapon/card/id(src)
- new /obj/item/weapon/card/id(src)
- new /obj/item/weapon/card/id(src)
- new /obj/item/weapon/card/id(src)
- new /obj/item/weapon/card/id(src)
-
/obj/item/weapon/storage/box/seccarts
name = "box of spare R.O.B.U.S.T. Cartridges"
desc = "A box full of R.O.B.U.S.T. Cartridges, used by Security."
icon_state = "pda"
- New()
- ..()
+/obj/item/weapon/storage/box/seccarts/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/cartridge/security(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/weapon/cartridge/security(src)
- new /obj/item/weapon/cartridge/security(src)
-
/obj/item/weapon/storage/box/handcuffs
name = "box of spare handcuffs"
desc = "A box full of handcuffs."
icon_state = "handcuff"
- New()
- ..()
+/obj/item/weapon/storage/box/handcuffs/New()
+ ..()
+ for(var/i = 1 to 7)
new /obj/item/weapon/handcuffs(src)
- new /obj/item/weapon/handcuffs(src)
- new /obj/item/weapon/handcuffs(src)
- new /obj/item/weapon/handcuffs(src)
- new /obj/item/weapon/handcuffs(src)
- new /obj/item/weapon/handcuffs(src)
- new /obj/item/weapon/handcuffs(src)
-
/obj/item/weapon/storage/box/mousetraps
name = "box of Pest-B-Gon mousetraps"
desc = "WARNING: Keep out of reach of children."
icon_state = "mousetraps"
- New()
- ..()
- new /obj/item/device/assembly/mousetrap( src )
- new /obj/item/device/assembly/mousetrap( src )
- new /obj/item/device/assembly/mousetrap( src )
- new /obj/item/device/assembly/mousetrap( src )
- new /obj/item/device/assembly/mousetrap( src )
- new /obj/item/device/assembly/mousetrap( src )
+/obj/item/weapon/storage/box/mousetraps/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/device/assembly/mousetrap(src)
/obj/item/weapon/storage/box/pillbottles
name = "box of pill bottles"
desc = "It has pictures of pill bottles on its front."
- New()
- ..()
- new /obj/item/weapon/storage/pill_bottle( src )
- new /obj/item/weapon/storage/pill_bottle( src )
- new /obj/item/weapon/storage/pill_bottle( src )
- new /obj/item/weapon/storage/pill_bottle( src )
- new /obj/item/weapon/storage/pill_bottle( src )
- new /obj/item/weapon/storage/pill_bottle( src )
- new /obj/item/weapon/storage/pill_bottle( src )
-
+/obj/item/weapon/storage/box/pillbottles/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/weapon/storage/pill_bottle(src)
/obj/item/weapon/storage/box/snappops
name = "snap pop box"
@@ -615,10 +466,11 @@
icon = 'icons/obj/toy.dmi'
icon_state = "spbox"
can_hold = list(/obj/item/toy/snappop)
- New()
- ..()
- for(var/i = 1 to 8)
- new /obj/item/toy/snappop(src)
+
+/obj/item/weapon/storage/box/snappops/New()
+ ..()
+ for(var/i = 1 to 8)
+ new /obj/item/toy/snappop(src)
/obj/item/weapon/storage/box/matches
name = "matchbox"
@@ -630,28 +482,29 @@
slot_flags = SLOT_BELT
can_hold = list(/obj/item/weapon/flame/match)
- New()
- ..()
- for(var/i=1 to 10)
- new /obj/item/weapon/flame/match(src)
+/obj/item/weapon/storage/box/matches/New()
+ ..()
+ for(var/i=1 to 10)
+ new /obj/item/weapon/flame/match(src)
- attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob)
- if(istype(W) && !W.lit && !W.burnt)
- W.lit = 1
- W.damtype = "burn"
- W.icon_state = "match_lit"
- processing_objects.Add(W)
- W.update_icon()
- return
+/obj/item/weapon/storage/box/matches/attackby(obj/item/weapon/flame/match/W as obj, mob/user as mob)
+ if(istype(W) && !W.lit && !W.burnt)
+ W.lit = 1
+ W.damtype = "burn"
+ W.icon_state = "match_lit"
+ processing_objects.Add(W)
+ W.update_icon()
+ return
/obj/item/weapon/storage/box/autoinjectors
name = "box of injectors"
desc = "Contains autoinjectors."
icon_state = "syringe"
- New()
- ..()
- for (var/i = 1 to 7)
- new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
+
+/obj/item/weapon/storage/box/autoinjectors/New()
+ ..()
+ for (var/i = 1 to 7)
+ new /obj/item/weapon/reagent_containers/hypospray/autoinjector(src)
/obj/item/weapon/storage/box/lights
name = "box of replacement bulbs"
@@ -666,7 +519,7 @@
/obj/item/weapon/storage/box/lights/bulbs/New()
..()
- for(var/i = 0; i < 21; i++)
+ for(var/i = 1 to 24)
new /obj/item/weapon/light/bulb(src)
/obj/item/weapon/storage/box/lights/tubes
@@ -675,7 +528,7 @@
/obj/item/weapon/storage/box/lights/tubes/New()
..()
- for(var/i = 0; i < 21; i++)
+ for(var/i = 1 to 24)
new /obj/item/weapon/light/tube(src)
/obj/item/weapon/storage/box/lights/mixed
@@ -684,9 +537,9 @@
/obj/item/weapon/storage/box/lights/mixed/New()
..()
- for(var/i = 0; i < 14; i++)
+ for(var/i = 1 to 16)
new /obj/item/weapon/light/tube(src)
- for(var/i = 0; i < 7; i++)
+ for(var/i = 1 to 8)
new /obj/item/weapon/light/bulb(src)
/obj/item/weapon/storage/box/freezer
@@ -701,3 +554,20 @@
max_storage_space = 21
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
+/obj/item/weapon/storage/box/ambrosia
+ name = "ambrosia seeds box"
+ desc = "Contains the seeds you need to get a little high."
+
+/obj/item/weapon/storage/box/ambrosia/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/seeds/ambrosiavulgarisseed(src)
+
+/obj/item/weapon/storage/box/ambrosiadeus
+ name = "ambrosia deus seeds box"
+ desc = "Contains the seeds you need to get a proper healthy high."
+
+/obj/item/weapon/storage/box/ambrosiadeus/New()
+ ..()
+ for(var/i = 1 to 7)
+ new /obj/item/seeds/ambrosiadeusseed(src)
\ No newline at end of file
diff --git a/html/changelogs/yoshax - uplinkchanges.yml b/html/changelogs/yoshax - uplinkchanges.yml
new file mode 100644
index 00000000000..6ad0968665c
--- /dev/null
+++ b/html/changelogs/yoshax - uplinkchanges.yml
@@ -0,0 +1,39 @@
+################################
+# Example Changelog File
+#
+# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
+#
+# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
+# When it is, any changes listed below will disappear.
+#
+# Valid Prefixes:
+# bugfix
+# wip (For works in progress)
+# tweak
+# soundadd
+# sounddel
+# rscadd (general adding of nice things)
+# rscdel (general deleting of nice things)
+# imageadd
+# imagedel
+# maptweak
+# spellcheck (typo fixes)
+# experiment
+#################################
+
+# Your name.
+author: Yoshax
+
+# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
+delete-after: True
+
+# Any changes you've made. See valid prefix list above.
+# INDENT WITH TWO SPACES. NOT TABS. SPACES.
+# SCREW THIS UP AND IT WON'T WORK.
+# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries.
+# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog.
+changes:
+ - rscadd: "Uplinks now have a discounted item every 15 minutes. This is per uplink, and random, the discount is also random, but weighted as such that a low discount such as 10% off, or 20% off has a higher chance of happening than a high discount such as 90% of. An item will never cost less than 1."
+ - tweak: "Mercenaries now spawn with their own, personal uplinks."
+ - bugfix: "Faked announcements are now once again purchasable from the uplink, and actually work."
+ - rscadd: "Adds several new items to the uplink including tactical knives, metal foam grenades, ambrosia seeds and much more."
\ No newline at end of file
diff --git a/nano/templates/uplink.tmpl b/nano/templates/uplink.tmpl
index a92fe95c6ee..ed799677bc0 100644
--- a/nano/templates/uplink.tmpl
+++ b/nano/templates/uplink.tmpl
@@ -29,6 +29,17 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
{{if data.menu == 0}}
+ {{if data.discount_amount < 100}}
+