From 718b249b1d8ef8ee3a5acef85419d65dcd0ae041 Mon Sep 17 00:00:00 2001 From: Yoshax Date: Sun, 15 May 2016 23:31:34 +0100 Subject: [PATCH] Uplink changes and additions (#1645) * Splits uplink categories into separate files and moves other files around * Corrects an incorrect description * Puts uplink categories in uplink_categories into the same order as they are individual files * Mercenaries now spawn with their own private uplink. * Adds a random discount to uplink items that is applied every 15 minutes no message no message * Adds changelog * Fakes announcements are now once again purchasable from the uplink and actually work * Removes a debug line * Adds several existing items to the antag uplink including stun rounds for shotguns, metal foam grenades and more * Refactors boxes.dm to use absolute pathing and for loops for contents Adds changelog --- code/datums/uplink/ammunition.dm | 67 ++ code/datums/uplink/announcements.dm | 109 +++ code/datums/uplink/armor.dm | 15 + code/datums/uplink/badassery.dm | 78 ++ code/datums/uplink/grenades.dm | 35 + code/datums/uplink/hardsuit_modules.dm | 40 + code/datums/uplink/implants.dm | 25 + code/datums/uplink/medical.dm | 36 + code/datums/uplink/stealth_items.dm | 45 + code/datums/uplink/stealthy_weapons.dm | 35 + code/datums/uplink/tools.dm | 85 ++ .../uplink}/uplink_categories.dm | 98 +-- code/datums/uplink/uplink_items.dm | 174 ++++ code/datums/uplink/visible_weapons.dm | 91 ++ code/game/antagonist/outsider/mercenary.dm | 5 +- code/game/objects/items/devices/uplink.dm | 36 +- .../objects/items/devices/uplink_items.dm | 782 ------------------ .../items/devices/uplink_random_lists.dm | 2 +- .../objects/items/weapons/storage/boxes.dm | 524 +++++------- html/changelogs/yoshax - uplinkchanges.yml | 39 + nano/templates/uplink.tmpl | 20 +- polaris.dme | 16 +- 22 files changed, 1177 insertions(+), 1180 deletions(-) create mode 100644 code/datums/uplink/ammunition.dm create mode 100644 code/datums/uplink/announcements.dm create mode 100644 code/datums/uplink/armor.dm create mode 100644 code/datums/uplink/badassery.dm create mode 100644 code/datums/uplink/grenades.dm create mode 100644 code/datums/uplink/hardsuit_modules.dm create mode 100644 code/datums/uplink/implants.dm create mode 100644 code/datums/uplink/medical.dm create mode 100644 code/datums/uplink/stealth_items.dm create mode 100644 code/datums/uplink/stealthy_weapons.dm create mode 100644 code/datums/uplink/tools.dm rename code/{game/objects/items/devices => datums/uplink}/uplink_categories.dm (87%) create mode 100644 code/datums/uplink/uplink_items.dm create mode 100644 code/datums/uplink/visible_weapons.dm delete mode 100644 code/game/objects/items/devices/uplink_items.dm create mode 100644 html/changelogs/yoshax - uplinkchanges.yml 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}} +
+
+ Currently discounted: +
+
+ {{:data.discount_name}} - {{:data.discount_amount}}% off. Offer will expire at: {{:data.offer_expiry}} +
+
+ {{/if}} +

Categories:

{{for data.categories}}
@@ -43,12 +54,9 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
{{:helper.link(value.name, 'gear', {'buy_item' : value.ref}, value.can_buy ? null : 'disabled')}} - {{:value.cost}}
- - {{if value.can_buy}} -
- {{:value.description}} -
- {{/if}} +
+ {{:value.description}} +
{{/for}} {{else data.menu == 2}}

Information Record List:

diff --git a/polaris.dme b/polaris.dme index fa499816997..1ab16549c53 100644 --- a/polaris.dme +++ b/polaris.dme @@ -186,6 +186,20 @@ #include "code\datums\repositories\cameras.dm" #include "code\datums\repositories\crew.dm" #include "code\datums\repositories\repository.dm" +#include "code\datums\uplink\ammunition.dm" +#include "code\datums\uplink\announcements.dm" +#include "code\datums\uplink\armor.dm" +#include "code\datums\uplink\badassery.dm" +#include "code\datums\uplink\grenades.dm" +#include "code\datums\uplink\hardsuit_modules.dm" +#include "code\datums\uplink\implants.dm" +#include "code\datums\uplink\medical.dm" +#include "code\datums\uplink\stealth_items.dm" +#include "code\datums\uplink\stealthy_weapons.dm" +#include "code\datums\uplink\tools.dm" +#include "code\datums\uplink\uplink_categories.dm" +#include "code\datums\uplink\uplink_items.dm" +#include "code\datums\uplink\visible_weapons.dm" #include "code\datums\wires\airlock.dm" #include "code\datums\wires\alarm.dm" #include "code\datums\wires\apc.dm" @@ -632,8 +646,6 @@ #include "code\game\objects\items\devices\traitordevices.dm" #include "code\game\objects\items\devices\transfer_valve.dm" #include "code\game\objects\items\devices\uplink.dm" -#include "code\game\objects\items\devices\uplink_categories.dm" -#include "code\game\objects\items\devices\uplink_items.dm" #include "code\game\objects\items\devices\uplink_random_lists.dm" #include "code\game\objects\items\devices\violin.dm" #include "code\game\objects\items\devices\whistle.dm"