diff --git a/code/__defines/species_languages.dm b/code/__defines/species_languages.dm index 27fc17055c..143c7aa251 100644 --- a/code/__defines/species_languages.dm +++ b/code/__defines/species_languages.dm @@ -31,6 +31,7 @@ #define LANGUAGE_TRADEBAND "Tradeband" #define LANGUAGE_GUTTER "Gutter" #define LANGUAGE_SCHECHI "Schechi" +#define LANGUAGE_CULT "Cult" // Language flags. #define WHITELISTED 1 // Language is available if the speaker is whitelisted. diff --git a/code/datums/uplink/ammunition.dm b/code/datums/uplink/ammunition.dm new file mode 100644 index 0000000000..b45cf3be3c --- /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 0000000000..1b3cf75462 --- /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 0000000000..30a41d8edb --- /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 0000000000..b837625c8a --- /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 0000000000..f7c6d1a072 --- /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 0000000000..66ecfb6bf9 --- /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 0000000000..c4302464b6 --- /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 0000000000..8e3f534004 --- /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 0000000000..31364a0953 --- /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 0000000000..ead34c5646 --- /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 0000000000..fb1b52c068 --- /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 68ed72a6fb..6e222b764b 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 0000000000..32a7d0cffb --- /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 0000000000..4c9ac49ee1 --- /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 8e460d38b6..c27d510d8b 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/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index aba2115d15..6bb049dcb0 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -110,6 +110,13 @@ var/datum/antagonist/cultist/cult . = ..() if(.) player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back." + if(player.current && !istype(player.current, /mob/living/simple_animal/construct)) + player.current.add_language(LANGUAGE_CULT) + +/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted) + . = ..() + if(. && player.current && !istype(player.current, /mob/living/simple_animal/construct)) + player.current.remove_language(LANGUAGE_CULT) /datum/antagonist/cultist/can_become_antag(var/datum/mind/player) if(!..()) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 15d2848cd2..51af8837a8 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1019,6 +1019,9 @@ About the new airlock wires panel: else name = "[istext(assembly.glass) ? "[assembly.glass] airlock" : assembly.base_name]" + //get the dir from the assembly + set_dir(assembly.dir) + //wires var/turf/T = get_turf(newloc) if(T && (T.z in config.admin_levels)) diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index a2d599fa00..4fc4b2fad7 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -4,17 +4,23 @@ /obj/machinery/door/airlock/multi_tile/New() ..() - switch(dir) - if(EAST, WEST) - bound_width = width * world.icon_size - bound_height = world.icon_size - else - bound_width = world.icon_size - bound_height = width * world.icon_size + SetBounds() + +/obj/machinery/door/airlock/multi_tile/Move() + . = ..() + SetBounds() + +/obj/machinery/door/airlock/multi_tile/proc/SetBounds() + if(dir in list(EAST, WEST)) + bound_width = width * world.icon_size + bound_height = world.icon_size + else + bound_width = world.icon_size + bound_height = width * world.icon_size /obj/machinery/door/airlock/multi_tile/glass name = "Glass Airlock" icon = 'icons/obj/doors/Door2x1glass.dmi' opacity = 0 glass = 1 - assembly_type = /obj/structure/door_assembly/multi_tile \ No newline at end of file + assembly_type = /obj/structure/door_assembly/multi_tile diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index 30c92af922..7d27c94b65 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -390,33 +390,33 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept if (length(heard_masked)) for (var/mob/R in heard_masked) - R.hear_radio(message,verbage, speaking, part_a, part_b, M, 0, name) + R.hear_radio(message,verbage, speaking, part_a, part_b, part_c, M, 0, name) /* --- Process all the mobs that heard the voice normally (understood) --- */ if (length(heard_normal)) for (var/mob/R in heard_normal) - R.hear_radio(message, verbage, speaking, part_a, part_b, M, 0, realname) + R.hear_radio(message, verbage, speaking, part_a, part_b, part_c, M, 0, realname) /* --- Process all the mobs that heard the voice normally (did not understand) --- */ if (length(heard_voice)) for (var/mob/R in heard_voice) - R.hear_radio(message,verbage, speaking, part_a, part_b, M,0, vname) + R.hear_radio(message,verbage, speaking, part_a, part_b, part_c, M,0, vname) /* --- Process all the mobs that heard a garbled voice (did not understand) --- */ // Displays garbled message (ie "f*c* **u, **i*er!") if (length(heard_garbled)) for (var/mob/R in heard_garbled) - R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1, vname) + R.hear_radio(message, verbage, speaking, part_a, part_b, part_c, M, 1, vname) /* --- Complete gibberish. Usually happens when there's a compressed message --- */ if (length(heard_gibberish)) for (var/mob/R in heard_gibberish) - R.hear_radio(message, verbage, speaking, part_a, part_b, M, 1) + R.hear_radio(message, verbage, speaking, part_a, part_b, part_c, M, 1) return 1 diff --git a/code/game/objects/items/devices/uplink.dm b/code/game/objects/items/devices/uplink.dm index df28d4d3d7..571b0462df 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,15 @@ 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/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! @@ -52,7 +53,6 @@ A list of items and costs is stored under the datum of every game mode, alongsid var/datum/uplink_category/category = 0 // The current category we are in var/exploit_id // Id of the current exploit record we are viewing - // The hidden uplink MUST be inside an obj/item's contents. /obj/item/device/uplink/hidden/New() spawn(2) @@ -62,6 +62,14 @@ A list of items and costs is stored under the datum of every game mode, alongsid nanoui_data = list() update_nano_data() +/obj/item/device/uplink/hidden/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 + update_nano_data() + nanomanager.update_uis(src) + // Toggles the uplink on and off. Normally this will bypass the item's normal functions and go to the uplink menu, if activated. /obj/item/device/uplink/hidden/proc/toggle() active = !active @@ -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) 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 b0ee3689a1..0000000000 --- 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 70cca95105..00860eb30c 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/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 783a2088da..69f14d7c2b 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -417,22 +417,26 @@ the implant may become unstable and either pre-maturely inject the subject or si var/area/t = get_area(M) switch (cause) if("death") - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) if(istype(t, /area/syndicate_station) || istype(t, /area/syndicate_mothership) || istype(t, /area/shuttle/syndicate_elite) ) //give the syndies a bit of stealth - a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm") + a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Security") + a.autosay("[mobname] has died in Space!", "[mobname]'s Death Alarm", "Medical") else - a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm") + a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Security") + a.autosay("[mobname] has died in [t.name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) processing_objects.Remove(src) if ("emp") - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) var/name = prob(50) ? t.name : pick(teleportlocs) - a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm") + a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Security") + a.autosay("[mobname] has died in [name]!", "[mobname]'s Death Alarm", "Medical") qdel(a) else - var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset(null) - a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm") + var/obj/item/device/radio/headset/a = new /obj/item/device/radio/headset/heads/captain(null) + a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Security") + a.autosay("[mobname] has died-zzzzt in-in-in...", "[mobname]'s Death Alarm", "Medical") qdel(a) processing_objects.Remove(src) diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 47a2f00b21..f8b21af190 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/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 7dcc429d27..2df9701436 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -45,7 +45,6 @@ ..() /obj/item/weapon/storage/MouseDrop(obj/over_object as obj) - if(!canremove) return @@ -69,7 +68,7 @@ if (( usr.restrained() ) || ( usr.stat )) return - if ((src.loc == usr) && !usr.unEquip(src)) + if ((src.loc == usr) && !(istype(over_object, /obj/screen)) && !usr.unEquip(src)) return switch(over_object.name) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index cd859b1489..89e841bc58 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -282,8 +282,7 @@ else path = text2path("/obj/machinery/door/airlock[airlock_type]") - var/obj/machinery/door/new_airlock = new path(src.loc, src) - new_airlock.dir = src.dir + new path(src.loc, src) qdel(src) else ..() diff --git a/code/modules/client/preference_setup/loadout/loadout.dm b/code/modules/client/preference_setup/loadout/loadout.dm index cd1e3eff4c..e2d73ff8b3 100644 --- a/code/modules/client/preference_setup/loadout/loadout.dm +++ b/code/modules/client/preference_setup/loadout/loadout.dm @@ -105,19 +105,21 @@ var/list/gear_datums = list() firstcat = 0 else . += " |" + + var/datum/loadout_category/LC = loadout_categories[category] + var/category_cost = 0 + for(var/gear in LC.gear) + if(gear in pref.gear) + var/datum/gear/G = LC.gear[gear] + category_cost += G.cost + if(category == current_tab) - . += " [category] " + . += " [category] - [category_cost] " else - var/datum/loadout_category/LC = loadout_categories[category] - var/make_orange = FALSE - for(var/thing in LC.gear) - if(thing in pref.gear) - make_orange = TRUE - break - if(make_orange) - . += " [category] " + if(category_cost) + . += " [category] - [category_cost] " else - . += " [category] " + . += " [category] - 0 " . += "" var/datum/loadout_category/LC = loadout_categories[current_tab] diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 494f5d9a84..a86f0e214f 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -244,3 +244,15 @@ display_name = "winter coat, mining" path = /obj/item/clothing/suit/storage/hooded/wintercoat/miner allowed_roles = list("Shaft Miner") + +/datum/gear/suit/varsity + display_name = "varsity jacket selection" + path = /obj/item/clothing/suit/varsity + +/datum/gear/suit/varsity/New() + ..() + var/list/varsities = list() + for(var/varsity_style in typesof(/obj/item/clothing/suit/varsity)) + var/obj/item/clothing/suit/varsity/varsity = varsity_style + varsities[initial(varsity.name)] = varsity + gear_tweaks += new/datum/gear_tweak/path(sortAssoc(varsities)) \ No newline at end of file diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index a260d83513..ed80f4dd61 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -656,3 +656,29 @@ name = "mining winter coat" icon_state = "coatminer" armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) + +/obj/item/clothing/suit/varsity + name = "black varsity jacket" + desc = "A favorite of jocks everywhere from Sol to Nyx." + icon_state = "varsity" + item_state = "leather_jacket" + +/obj/item/clothing/suit/varsity/red + name = "red varsity jacket" + icon_state = "varsity_red" + +/obj/item/clothing/suit/varsity/purple + name = "purple varsity jacket" + icon_state = "varsity_purple" + +/obj/item/clothing/suit/varsity/green + name = "green varsity jacket" + icon_state = "varsity_green" + +/obj/item/clothing/suit/varsity/blue + name = "blue varsity jacket" + icon_state = "varsity_blue" + +/obj/item/clothing/suit/varsity/brown + name = "brown varsity jacket" + icon_state = "varsity_brown" \ No newline at end of file diff --git a/code/modules/mob/hear_say.dm b/code/modules/mob/hear_say.dm index 375b1e1e13..4f14216747 100644 --- a/code/modules/mob/hear_say.dm +++ b/code/modules/mob/hear_say.dm @@ -81,7 +81,7 @@ var/time = say_timestamp() src << "[time] [message]" -/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") +/mob/proc/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") if(!client) return @@ -184,9 +184,9 @@ var/formatted if(language) - formatted = language.format_message_radio(message, verb) + formatted = "[language.format_message_radio(message, verb)][part_c]" else - formatted = "[verb], \"[message]\"" + formatted = "[verb], \"[message]\"[part_c]" if((sdisabilities & DEAF) || ear_deaf) if(prob(20)) src << "You feel your headset vibrate but can hear nothing from it!" diff --git a/code/modules/mob/language/outsider.dm b/code/modules/mob/language/outsider.dm index 562c578986..d427dcbfb6 100644 --- a/code/modules/mob/language/outsider.dm +++ b/code/modules/mob/language/outsider.dm @@ -38,7 +38,7 @@ ..(speaker,message,speaker_mask) /datum/language/cultcommon - name = "Cult" + name = LANGUAGE_CULT desc = "The chants of the occult, the incomprehensible." speech_verb = "intones" ask_verb = "intones" @@ -52,8 +52,8 @@ "mah'weyh", "pleggh", "at", "e'ntrath", "tok-lyr", "rqa'nap", "g'lt-ulotf", "ta'gh", "fara'qha", "fel", "d'amar det", \ "yu'gular", "faras", "desdae", "havas", "mithum", "javara", "umathar", "uf'kal", "thenar", "rash'tla", \ "sektath", "mal'zua", "zasan", "therium", "viortia", "kla'atu", "barada", "nikt'o", "fwe'sh", "mah", "erl", "nyag", "r'ya", \ - "gal'h'rfikk", "harfrandid", "mud'gib", "fuu", "ma'jin", "dedo", "ol'btoh", "n'ath", "reth", "sh'yro", "eth", \ - "d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis") + "gal'h'rfikk", "harfrandid", "mud'gib", "il", "fuu", "ma'jin", "dedo", "ol'btoh", "n'ath", "reth", "sh'yro", "eth", \ + "d'rekkathnor", "khari'd", "gual'te", "nikka", "nikt'o", "barada", "kla'atu", "barhah", "hra" ,"zar'garis", "spiri", "malum") /datum/language/cult name = "Occult" diff --git a/code/modules/mob/language/station.dm b/code/modules/mob/language/station.dm index 438b680f67..0e20458291 100644 --- a/code/modules/mob/language/station.dm +++ b/code/modules/mob/language/station.dm @@ -23,7 +23,16 @@ colour = "soghun" key = "o" flags = WHITELISTED - syllables = list("ss","ss","ss","ss","skak","seeki","resh","las","esi","kor","sh") + space_chance = 40 + syllables = list( + "za", "az", "ze", "ez", "zi", "iz", "zo", "oz", "zu", "uz", "zs", "sz", + "ha", "ah", "he", "eh", "hi", "ih", "ho", "oh", "hu", "uh", "hs", "sh", + "la", "al", "le", "el", "li", "il", "lo", "ol", "lu", "ul", "ls", "sl", + "ka", "ak", "ke", "ek", "ki", "ik", "ko", "ok", "ku", "uk", "ks", "sk", + "sa", "as", "se", "es", "si", "is", "so", "os", "su", "us", "ss", "ss", + "ra", "ar", "re", "er", "ri", "ir", "ro", "or", "ru", "ur", "rs", "sr", + "a", "a", "e", "e", "i", "i", "o", "o", "u", "u", "s", "s" + ) /datum/language/unathi/get_random_name() diff --git a/code/modules/mob/living/carbon/metroid/say.dm b/code/modules/mob/living/carbon/metroid/say.dm index cd07f6bf3b..7c7ad76240 100644 --- a/code/modules/mob/living/carbon/metroid/say.dm +++ b/code/modules/mob/living/carbon/metroid/say.dm @@ -31,7 +31,7 @@ speech_buffer.Add(lowertext(html_decode(message))) ..() -/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") +/mob/living/carbon/slime/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0, var/vname ="") if (speaker in Friends) speech_buffer = list() speech_buffer.Add(speaker) diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 8b9271a40c..1e6752ab77 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -727,7 +727,7 @@ -/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0) +/mob/living/simple_animal/parrot/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/part_c, var/mob/speaker = null, var/hard_to_hear = 0) if(prob(50)) parrot_hear("[pick(available_channels)] [message]") ..(message,verb,language,part_a,part_b,speaker,hard_to_hear) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0052b77578..4185417c96 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -507,7 +507,7 @@ /mob/new_player/hear_say(var/message, var/verb = "says", var/datum/language/language = null, var/alt_name = "",var/italics = 0, var/mob/speaker = null) return -/mob/new_player/hear_radio(var/message, var/verb="says", var/datum/language/language=null, var/part_a, var/part_b, var/mob/speaker = null, var/hard_to_hear = 0) +/mob/new_player/hear_radio() return /mob/new_player/MayRespawn() diff --git a/html/changelog.html b/html/changelog.html index 3ef596ac8c..f164041dd8 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,31 @@ -->
+

16 May 2016

+

Yoshax updated:

+ + +

13 May 2016

+

HarpyEagle updated:

+ +

Yoshax updated:

+ +

12 May 2016

Yoshax updated:

{{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/vorestation.dme b/vorestation.dme index 00816b3a49..358c0bad9e 100644 --- a/vorestation.dme +++ b/vorestation.dme @@ -193,6 +193,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" @@ -646,8 +660,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"