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
This commit is contained in:
Yoshax
2016-05-15 18:31:34 -04:00
committed by Neerti
parent b2eb3211a2
commit 718b249b1d
22 changed files with 1177 additions and 1180 deletions
+67
View File
@@ -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
+109
View File
@@ -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
+15
View File
@@ -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
+78
View File
@@ -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]"
+35
View File
@@ -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
+40
View File
@@ -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
+25
View File
@@ -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
+36
View File
@@ -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
+45
View File
@@ -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
+35
View File
@@ -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
+85
View File
@@ -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."
@@ -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"
+174
View File
@@ -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
+91
View File
@@ -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
+2 -3
View File
@@ -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()
+26 -10
View File
@@ -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", "<br>"), "can_buy" = item.can_buy(src), "cost" = cost, "ref" = "\ref[item]")
nanoui_data["items"] = items
@@ -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
@@ -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
+197 -327
View File
@@ -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.<br>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 = "<B>WARNING: These devices are extremely dangerous and can cause blindness or deafness in repeated use.</B>"
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.<br> 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.<br> 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.<br> 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 = "<B>Instructions:</B> <I>Heat in microwave. Product will cool if not eaten within seven minutes.</I>"
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 = "<B>Instructions:</B> <I>Crush bottom of package to initiate chemical heating. Wait for 20 seconds before consumption. Product will cool if not eaten within seven minutes.</I>"
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 = "<B><FONT color='red'>WARNING:</FONT></B> <I>Keep out of reach of children</I>."
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)
@@ -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."
+14 -6
View File
@@ -29,6 +29,17 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
</div>
{{if data.menu == 0}}
{{if data.discount_amount < 100}}
<div class="item">
<div class="itemLabel">
<b>Currently discounted</b>:
</div>
<div class="itemContent">
{{:data.discount_name}} - {{:data.discount_amount}}% off. Offer will expire at: {{:data.offer_expiry}}
</div>
</div>
{{/if}}
<H2>Categories:</H2>
{{for data.categories}}
<div class="item">
@@ -43,12 +54,9 @@ Used In File(s): \code\game\objects\items\devices\uplinks.dm
<div class="item">
{{:helper.link(value.name, 'gear', {'buy_item' : value.ref}, value.can_buy ? null : 'disabled')}} - <span class="white">{{:value.cost}}</span>
</div>
{{if value.can_buy}}
<div class="item">
{{:value.description}}
</div>
{{/if}}
<div class="item">
{{:value.description}}
</div>
{{/for}}
{{else data.menu == 2}}
<H2><span class="white">Information Record List:</span></H2>
+14 -2
View File
@@ -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"