From 261157cb58677c95f7cb3c378bbb010e73047cab Mon Sep 17 00:00:00 2001 From: Fox-McCloud Date: Wed, 26 Nov 2014 01:18:49 -0500 Subject: [PATCH] AI, PDA, and Other changes --- code/datums/uplink_item.dm | 24 ++-- code/game/jobs/job/science.dm | 4 +- code/game/machinery/autolathe.dm | 46 ++++--- code/game/objects/items/devices/PDA/PDA.dm | 12 +- code/game/objects/items/devices/flashlight.dm | 45 ++++++- code/game/objects/items/toys.dm | 4 +- .../objects/items/weapons/cigs_lighters.dm | 12 ++ .../objects/items/weapons/dna_injector.dm | 5 + .../objects/items/weapons/implants/implant.dm | 25 ++++ .../items/weapons/implants/implanter.dm | 9 ++ .../objects/items/weapons/storage/fancy.dm | 11 ++ .../items/weapons/storage/uplink_kits.dm | 59 +++++--- code/modules/events/tgevents/vent_clog.dm | 2 +- .../living/simple_animal/hostile/mushroom.dm | 2 +- code/modules/reagents/Chemistry-Reagents.dm | 127 ++++++++++++++---- code/modules/reagents/Chemistry-Recipes.dm | 9 +- .../reagents/reagent_containers/borghydro.dm | 4 +- .../reagent_containers/food/snacks.dm | 4 +- .../reagents/reagent_containers/hypospray.dm | 19 ++- code/modules/research/research.dm | 2 +- icons/obj/cigarettes.dmi | Bin 2816 -> 3109 bytes 21 files changed, 325 insertions(+), 100 deletions(-) diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index af75bdb538e..7e80ebcc381 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -260,9 +260,9 @@ var/list/uplink_items = list() gamemodes = list("nuclear emergency") /datum/uplink_item/dangerous/emp - name = "5 EMP Grenades" - desc = "A box that contains 5 EMP grenades. Useful to disrupt communication and silicon lifeforms." - item = /obj/item/weapon/storage/box/emps + name = "EMP Kit" + desc = "A box that contains two EMP grenades, an EMP implant and a short ranged recharging device disguised as a flashlight. Useful to disrupt communication and silicon lifeforms." + item = /obj/item/weapon/storage/box/syndie_kit/emp cost = 5 /datum/uplink_item/dangerous/syndicate_minibomb @@ -473,6 +473,12 @@ var/list/uplink_items = list() cost = 9 gamemodes = list("nuclear emergency") +/datum/uplink_item/badass/syndiecigs + name = "Syndicate Smokes" + desc = "Strong flavor, dense smoke, infused with Doctor's Delight." + item = /obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate + cost = 4 + /datum/uplink_item/device_tools/space_suit name = "Space Suit" desc = "The red and black syndicate space suit is less encumbering than Nanotrasen variants, fits inside bags, and has a weapon slot. Nanotrasen crewmembers are trained to report red space suit sightings." @@ -485,6 +491,7 @@ var/list/uplink_items = list() item = /obj/item/clothing/glasses/thermal/syndi cost = 6 +/* /datum/uplink_item/device_tools/surveillance name = "Camera Surveillance Kit" desc = "This kit contains 5 Camera bugs and one mobile receiver. Attach camera bugs to a camera to enable remote viewing." @@ -496,6 +503,7 @@ var/list/uplink_items = list() desc = "This is a Camera bug resupply giving you 5 more camera bugs." item = /obj/item/weapon/storage/box/surveillance cost = 4 +*/ //commented out until porting over TG's camera bug /datum/uplink_item/device_tools/binary name = "Binary Translator Key" @@ -504,10 +512,10 @@ var/list/uplink_items = list() cost = 5 /datum/uplink_item/device_tools/cipherkey - name = "Centcomm Encryption Key" - desc = "A key, that when inserted into a radio headset, allows you to listen to and talk on all known radio channels." - item = /obj/item/device/encryptionkey/syndicate/hacked - cost = 4 + name = "Syndicate Encryption Key" + desc = "A key, that when inserted into a radio headset, allows you to listen to all station department channels as well as talk on an encrypted Syndicate channel." + item = /obj/item/device/encryptionkey/syndicate + cost = 5 /datum/uplink_item/device_tools/hacked_module name = "Hacked AI Upload Module" @@ -622,7 +630,7 @@ var/list/uplink_items = list() /datum/uplink_item/badass/bundle name = "Syndicate Bundle" - desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 10 telecrystals, but you do not know which specialisation you will receive." + desc = "Syndicate Bundles are specialised groups of items that arrive in a plain box. These items are collectively worth more than 20 telecrystals, but you do not know which specialisation you will receive." item = /obj/item/weapon/storage/box/syndicate cost = 20 excludefrom = list("nuclear emergency") diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 8c4b6c47ab0..ae02acbf195 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -9,11 +9,11 @@ idtype = /obj/item/weapon/card/id/silver req_admin_notify = 1 access = list(access_rd, access_heads, access_tox, access_genetics, access_morgue, - access_tox_storage, access_teleporter, access_sec_doors, + access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) minimal_access = list(access_eva, access_rd, access_heads, access_tox, access_genetics, access_morgue, - access_tox_storage, access_teleporter, access_sec_doors, + access_tox_storage, access_tech_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch, access_maint_tunnels) minimal_player_age = 21 diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 6f302888a5d..103ec0d7d0d 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -38,6 +38,7 @@ var/global/list/autolathe_recipes = list( \ new /obj/item/device/radio/off(), \ new /obj/item/device/assembly/infra(), \ new /obj/item/device/assembly/timer(), \ + new /obj/item/device/assembly/prox_sensor(), \ new /obj/item/device/assembly/voice(), \ new /obj/item/weapon/light/tube(), \ new /obj/item/weapon/light/bulb(), \ @@ -45,10 +46,7 @@ var/global/list/autolathe_recipes = list( \ new /obj/item/weapon/rcd_ammo(), \ new /obj/item/ammo_casing/shotgun/beanbag(), \ new /obj/item/weapon/storage/box/blanks(), \ - new /obj/item/weapon/storage/box/gauge(), \ - new /obj/item/ammo_casing/shotgun/incendiary(), \ new /obj/item/ammo_box/c38(), \ - new /obj/item/ammo_box/a357(), \ new /obj/item/clothing/ears/earmuffs/tribblemuffs(), \ new /obj/item/clothing/gloves/furgloves(), \ new /obj/item/clothing/head/furcap(), \ @@ -64,6 +62,10 @@ var/global/list/autolathe_recipes_hidden = list( \ new /obj/item/weapon/weldingtool/largetank(), \ new /obj/item/weapon/handcuffs(), \ new /obj/item/weapon/hatchet(), \ + new /obj/item/ammo_box/a357(), \ + new /obj/item/ammo_casing/shotgun(), \ + new /obj/item/ammo_casing/shotgun/buck(), \ + new /obj/item/ammo_casing/shotgun/incendiary(), \ /*new /obj/item/ammo_casing/shotgun/dart(), \ new /obj/item/weapon/shield/riot(), */ \ ) @@ -107,7 +109,7 @@ var/global/list/autolathe_recipes_hidden = list( \ SetLuminosity(2) else SetLuminosity(0) - + /obj/machinery/autolathe/New() ..() component_parts = list() @@ -122,7 +124,7 @@ var/global/list/autolathe_recipes_hidden = list( \ wires = new(src) src.L = autolathe_recipes src.LL = autolathe_recipes_hidden - + /obj/machinery/autolathe/proc/wires_win(mob/user as mob) var/dat as text dat += "Autolathe Wires:
" @@ -180,36 +182,36 @@ var/global/list/autolathe_recipes_hidden = list( \ /obj/machinery/autolathe/interact(mob/user as mob) if(..()) return - + if (src.shocked) src.shock(user,50) - + if (src.panel_open) wires_win(user,50) return - + if (src.disabled) user << "\red You press the button, but nothing happens." return - + regular_win(user) return /obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) if (stat) return 1 - + if (busy) user << "\red The autolathe is busy. Please wait for completion of previous operation." return 1 - + if (istype(O, /obj/item/weapon/screwdriver)) default_deconstruction_screwdriver(user, "autolathe_t", "autolathe", O) return 1 - + if(exchange_parts(user, O)) - return - + return + if (panel_open) //Don't eat multitools or wirecutters used on an open lathe. if(istype(O, /obj/item/device/multitool) || istype(O, /obj/item/weapon/wirecutters)) @@ -304,7 +306,7 @@ var/global/list/autolathe_recipes_hidden = list( \ usr.set_machine(src) src.add_fingerprint(usr) if (!busy) - if(href_list["make"]) + if(href_list["make"]) var/coeff = 2 ** prod_coeff var/turf/T = get_step(src.loc, get_dir(src,usr)) @@ -355,7 +357,7 @@ var/global/list/autolathe_recipes_hidden = list( \ src.m_amount -= template.m_amt*multiplier src.g_amount -= template.g_amt*multiplier src.f_amount -= template.f_amt*multiplier - var/obj/new_item = new template.type(T) + var/obj/new_item = new template.type(T) var/obj/item/stack/S = new_item S.amount = multiplier else @@ -364,16 +366,16 @@ var/global/list/autolathe_recipes_hidden = list( \ src.f_amount -= template.f_amt/coeff var/obj/item/new_item = new template.type(T) new_item.m_amt /= coeff - new_item.g_amt /= coeff - new_item.f_amt /= coeff + new_item.g_amt /= coeff + new_item.f_amt /= coeff if(src.m_amount < 0) src.m_amount = 0 if(src.g_amount < 0) src.g_amount = 0 if(src.f_amount < 0) src.f_amount = 0 - busy = 0 - + busy = 0 + if(href_list["act"]) var/temp_wire = href_list["wire"] if(href_list["act"] == "pulse") @@ -422,8 +424,8 @@ var/global/list/autolathe_recipes_hidden = list( \ max_g_amount = tot_rating max_f_amount = tot_rating for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) - prod_coeff += M.rating - 1 - + prod_coeff += M.rating - 1 + /obj/machinery/autolathe/RefreshParts() ..() var/tot_rating = 0 diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index ec22d2312c8..fb960fa6021 100755 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -219,7 +219,7 @@ var/global/list/obj/item/device/pda/PDAs = list() return var/selected = plist[c] aiPDA.create_message(user, selected) - + /mob/living/silicon/ai/proc/cmd_show_message_log(mob/user as mob) if(user.stat == 2) user << "You can't do that because you are dead!" @@ -247,7 +247,7 @@ var/global/list/obj/item/device/pda/PDAs = list() return var/selected = plist[c] create_message(usr, selected) - + /obj/item/device/pda/ai/verb/cmd_show_message_log() set category = "AI IM" set name = "Show Message Log" @@ -918,18 +918,18 @@ var/global/list/obj/item/device/pda/PDAs = list() useMS.send_pda_message("[P.owner]","[owner]","[t]") tnote.Add(list(list("sent" = 1, "owner" = "[P.owner]", "job" = "[P.ownjob]", "message" = "[t]", "target" = "\ref[P]"))) P.tnote.Add(list(list("sent" = 0, "owner" = "[owner]", "job" = "[ownjob]", "message" = "[t]", "target" = "\ref[src]"))) - for(var/mob/M in player_list) +/* for(var/mob/M in player_list) if(M.stat == DEAD && M.client && (M.client.prefs.toggles & CHAT_GHOSTEARS)) // src.client is so that ghosts don't have to listen to mice if(istype(M, /mob/new_player)) continue - M.show_message("PDA Message - [owner] -> [P.owner]: [t]") + M.show_message("PDA Message - [owner] -> [P.owner]: [t]") */ investigate_log("PDA Message - [U.key] - [owner] -> [P.owner]: [t]", "pda") if(!conversations.Find("\ref[P]")) conversations.Add("\ref[P]") if(!P.conversations.Find("\ref[src]")) P.conversations.Add("\ref[src]") - +/* if (prob(15)) //Give the AI a chance of intercepting the message var/who = src.owner if(prob(50)) @@ -938,7 +938,7 @@ var/global/list/obj/item/device/pda/PDAs = list() // Allows other AIs to intercept the message but the AI won't intercept their own message. if(ai.aiPDA != P && ai.aiPDA != src) ai.show_message("Intercepted message from [who]: [t]") - +*/ if (!P.silent) playsound(P.loc, 'sound/machines/twobeep.ogg', 50, 1) diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 74b7913bc1f..00d8bb8f9f2 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -193,4 +193,47 @@ icon_state = initial(icon_state) /obj/item/device/flashlight/slime/attack_self(mob/user) - return //Bio-luminescence does not toggle. \ No newline at end of file + return //Bio-luminescence does not toggle. + +/obj/item/device/flashlight/emp + origin_tech = "magnets=4;syndicate=5" + + var/emp_max_charges = 4 + var/emp_cur_charges = 4 + var/charge_tick = 0 + + +/obj/item/device/flashlight/emp/New() + ..() + processing_objects.Add(src) + +/obj/item/device/flashlight/emp/Destroy() + processing_objects.Remove(src) + ..() + +/obj/item/device/flashlight/emp/process() + charge_tick++ + if(charge_tick < 10) return 0 + charge_tick = 0 + emp_cur_charges = min(emp_cur_charges+1, emp_max_charges) + return 1 + +/obj/item/device/flashlight/emp/attack(mob/living/M as mob, mob/living/user as mob) + if(on && user.zone_sel.selecting == "eyes") // call original attack proc only if aiming at the eyes + ..() + return + +/obj/item/device/flashlight/emp/afterattack(atom/A as mob|obj, mob/user, proximity) + if(!proximity) return + if (emp_cur_charges > 0) + emp_cur_charges -= 1 + A.visible_message("[user] blinks \the [src] at \the [A].", \ + "[user] blinks \the [src] at \the [A].") + if(ismob(A)) + var/mob/M = A + add_logs(user, M, "attacked", object="EMP-light") + user << "\The [src] now has [emp_cur_charges] charge\s." + A.emp_act(1) + else + user << "\The [src] needs time to recharge!" + return \ No newline at end of file diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index a8e4df397af..a6f18c378e7 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -409,9 +409,9 @@ /obj/item/weapon/twohanded/dualsaber/toy/IsShield() return 0 -/* + /obj/item/weapon/twohanded/dualsaber/toy/IsReflect()//Stops Toy Dualsabers from reflecting energy projectiles - return 0 */ //uncomment this once reflecting is ported + return 0 /obj/item/toy/katana name = "replica katana" diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 57c4217568e..c0b22fb4ede 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -326,6 +326,18 @@ CIGARETTE PACKETS ARE IN FANCY.DM return if(location) location.hotspot_expose(700, 5) + if(reagents && reagents.total_volume) // check if it has any reagents at all + if(iscarbon(loc) && (src == loc:wear_mask)) // if it's in the human/monkey mouth, transfer reagents to the mob + if(istype(loc, /mob/living/carbon/human)) + var/mob/living/carbon/human/H = loc + if(H.species.flags & IS_SYNTHETIC) + return + var/mob/living/carbon/C = loc + if(prob(15)) // so it's not an instarape in case of acid + reagents.reaction(C, INGEST) + reagents.trans_to(C, REAGENTS_METABOLISM) + else // else just remove some of the reagents + reagents.remove_any(REAGENTS_METABOLISM) return /obj/item/clothing/mask/cigarette/pipe/attack_self(mob/user as mob) //Refills the pipe. Can be changed to an attackby later, if loose tobacco is added to vendors or something. diff --git a/code/game/objects/items/weapons/dna_injector.dm b/code/game/objects/items/weapons/dna_injector.dm index cfa5372ea6e..b15f656a69d 100644 --- a/code/game/objects/items/weapons/dna_injector.dm +++ b/code/game/objects/items/weapons/dna_injector.dm @@ -267,6 +267,11 @@ block = TELEBLOCK ..() +/obj/item/weapon/dnainjector/telemut/darkbundle + name = "DNA injector" + desc = "Good. Let the hate flow through you." + + /obj/item/weapon/dnainjector/antitele name = "DNA-Injector (Anti-Tele.)" desc = "Will make you not able to control your mind." diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index cb07e4acd89..e7a2a10575d 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -567,3 +567,28 @@ the implant may become unstable and either pre-maturely inject the subject or si name = "cortical stack" desc = "A fist-sized mass of biocircuits and chips." icon_state = "implant_evil" + + +/obj/item/weapon/implant/emp + name = "emp implant" + desc = "Triggers an EMP." + + var/activation_emote = "chuckle" + var/uses = 2 + +/obj/item/weapon/implant/emp/New() + activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "smile", "pale", "sniff", "whimper", "wink") + ..() + return + +/obj/item/weapon/implant/emp/trigger(emote, mob/living/carbon/source as mob) + if (src.uses < 1) return 0 + if (emote == src.activation_emote) + src.uses-- + empulse(source, 3, 5) + return + +/obj/item/weapon/implant/emp/implanted(mob/living/carbon/source) + source.mind.store_memory("EMP implant can be activated [uses] time\s by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) + source << "The implanted EMP implant can be activated [uses] time\s by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." + return 1 \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm index 9a36fe31b83..22041ccd51b 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -170,3 +170,12 @@ ..() update() return + +/obj/item/weapon/implanter/emp + name = "implanter-EMP" + + New() + src.imp = new /obj/item/weapon/implant/emp(src) + ..() + update() + return \ No newline at end of file diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index e3ea4d5481f..a2eb8018ab0 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -214,6 +214,17 @@ var/new_name = pick("evil", "suspicious", "ominous", "donk-flavored", "robust", "sneaky") name = "[new_name] cigarette packet" +/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate + name = "cigarette packet" + desc = "An obscure brand of cigarettes." + icon_state = "syndiepacket" + item_state = "syndiepacket" + +/obj/item/weapon/storage/fancy/cigarettes/cigpack_syndicate/New() + ..() + for(var/i = 1 to storage_slots) + reagents.add_reagent("doctorsdelight",15) + /* * Vial Box */ diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm index ccbafe8f8bd..439f27c1135 100644 --- a/code/game/objects/items/weapons/storage/uplink_kits.dm +++ b/code/game/objects/items/weapons/storage/uplink_kits.dm @@ -1,11 +1,12 @@ /obj/item/weapon/storage/box/syndicate/ New() ..() - switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "freedom" = 1, "hacker" = 1, "lordsingulo" = 1, "smoothoperator" = 1))) + switch (pickweight(list("bloodyspai" = 1, "stealth" = 1, "bond" = 1, "screwed" = 1, "guns" = 1, "murder" = 1, "implant" = 1, "hacker" = 1, "lordsingulo" = 1, "darklord" = 1))) if("bloodyspai") new /obj/item/clothing/under/chameleon(src) new /obj/item/clothing/mask/gas/voice(src) new /obj/item/weapon/card/id/syndicate(src) + new /obj/item/weapon/card/id/syndicate(src) new /obj/item/clothing/shoes/syndigaloshes(src) return @@ -15,12 +16,20 @@ new /obj/item/device/chameleon(src) return + if("bond") + new /obj/item/weapon/gun/projectile/automatic/pistol(src) + new /obj/item/weapon/silencer(src) + new /obj/item/ammo_box/magazine/m10mm(src) + new /obj/item/ammo_box/magazine/m10mm(src) + new /obj/item/clothing/under/chameleon(src) + new /obj/item/weapon/card/id/syndicate(src) + if("screwed") - new /obj/effect/spawner/newbomb/timer/syndicate(src) - new /obj/effect/spawner/newbomb/timer/syndicate(src) + new /obj/item/device/radio/beacon/syndicate/bomb(src) + new /obj/item/weapon/grenade/syndieminibomb(src) new /obj/item/device/powersink(src) - new /obj/item/clothing/suit/space/syndicate(src) - new /obj/item/clothing/head/helmet/space/syndicate(src) + new /obj/item/clothing/suit/space/syndicate/black/red(src) + new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) return if("guns") @@ -37,11 +46,18 @@ new /obj/item/clothing/shoes/syndigaloshes(src) return - if("freedom") + if("implant") var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) O.imp = new /obj/item/weapon/implant/freedom(O) var/obj/item/weapon/implanter/U = new /obj/item/weapon/implanter(src) U.imp = new /obj/item/weapon/implant/uplink(U) + var/obj/item/weapon/implanter/C = new /obj/item/weapon/implanter(src) + C.imp = new /obj/item/weapon/implant/emp(C) + var/obj/item/weapon/implanter/K = new /obj/item/weapon/implanter(src) + K.imp = new /obj/item/weapon/implant/adrenalin(K) + var/obj/item/weapon/implanter/S = new /obj/item/weapon/implanter(src) + S.imp = new /obj/item/weapon/implant/explosive(S) + S.name += " (explosive)" return if("hacker") @@ -52,19 +68,18 @@ if("lordsingulo") new /obj/item/device/radio/beacon/syndicate(src) - new /obj/item/clothing/suit/space/syndicate(src) - new /obj/item/clothing/head/helmet/space/syndicate(src) + new /obj/item/clothing/suit/space/syndicate/black/red(src) + new /obj/item/clothing/head/helmet/space/syndicate/black/red(src) new /obj/item/weapon/card/emag(src) return - if("smoothoperator") - new /obj/item/weapon/gun/projectile/automatic/pistol(src) - new /obj/item/weapon/silencer(src) - new /obj/item/weapon/soap/syndie(src) - new /obj/item/weapon/storage/bag/trash(src) - new /obj/item/bodybag(src) - new /obj/item/clothing/under/suit_jacket(src) - new /obj/item/clothing/shoes/laceup(src) + if("darklord") + new /obj/item/weapon/melee/energy/sword(src) + new /obj/item/weapon/melee/energy/sword(src) + new /obj/item/weapon/dnainjector/telemut/darkbundle(src) + new /obj/item/clothing/head/chaplain_hood(src) + new /obj/item/clothing/suit/chaplain_hoodie(src) + new /obj/item/weapon/card/id/syndicate(src) return /obj/item/weapon/storage/box/syndie_kit @@ -165,4 +180,14 @@ new /obj/item/ammo_casing/shotgun/fakebeanbag(src) new /obj/item/ammo_casing/shotgun/fakebeanbag(src) new /obj/item/ammo_casing/shotgun/fakebeanbag(src) - new /obj/item/ammo_casing/shotgun/fakebeanbag(src) \ No newline at end of file + new /obj/item/ammo_casing/shotgun/fakebeanbag(src) + +/obj/item/weapon/storage/box/syndie_kit/emp + name = "boxed EMP kit" + + New() + ..() + new /obj/item/weapon/grenade/empgrenade(src) + new /obj/item/weapon/grenade/empgrenade(src) + new /obj/item/weapon/implanter/emp/(src) + new /obj/item/device/flashlight/emp/(src) \ No newline at end of file diff --git a/code/modules/events/tgevents/vent_clog.dm b/code/modules/events/tgevents/vent_clog.dm index d12631be36a..e1b908cc844 100755 --- a/code/modules/events/tgevents/vent_clog.dm +++ b/code/modules/events/tgevents/vent_clog.dm @@ -24,7 +24,7 @@ var/list/gunk = list("water","carbon","flour","radium","toxin","cleaner","nutriment","condensedcapsaicin","psilocybin","lube", "plantbgone","banana","anti_toxin","space_drugs","hyperzine","holywater","ethanol","hot_coco","pacid", "blood","stoxin","fluorine","ryetalyn","mutagen","oxycodone","fuel","cryptobiolin", - "impedrezene","mindbreaker","nanites","xenomicrobes","lipozine","frostoil","alchdranine","beepskysmash", + "impedrezene","mindbreaker","nanites","xenomicrobes","lipozine","frostoil","doctorsdelight","beepskysmash", "tricordrazine", "amatoxin", "adminordrazine", "neurotoxin", "zombiepowder", "synaptizine") var/datum/reagents/R = new/datum/reagents(50) R.my_atom = vent diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 3a0ea6876e8..e2d8bcd485c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -153,6 +153,6 @@ for(counter=0, counter<=powerlevel, counter++) var/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice/S = new /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice(src.loc) S.reagents.add_reagent("mushroomhallucinogen", powerlevel) - S.reagents.add_reagent("alchdranine", powerlevel) + S.reagents.add_reagent("doctorsdelight", powerlevel) S.reagents.add_reagent("synaptizine", powerlevel) del(src) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index e5b5d921d4f..78d402b6360 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -1717,8 +1717,6 @@ datum description = "Alchdranine is an extremely strange chemical substance that can be used to treat almost any injury with a high level of effectiveness " reagent_state = LIQUID color = "#07a4d1" // rgb: 7, 164, 209 - toxod = OVERDOSE/3 - burnod = OVERDOSE/3 on_mob_life(var/mob/living/M as mob, var/alien) if(M.stat == 2.0) @@ -1913,6 +1911,21 @@ datum ..() return + inacusiate + name = "Inacusiate" + id = "inacusiate" + description = "Heals ear damage." + reagent_state = LIQUID + color = "#6600FF" // rgb: 100, 165, 255 + toxod = OVERDOSE + scannable = 1 + + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + M.ear_damage = 0 + M.ear_deaf = 0 + ..() + return peridaxon name = "Peridaxon" @@ -1986,9 +1999,9 @@ datum if(!M) M = holder.my_atom if(M.bodytemperature < 170) M.adjustCloneLoss(-1) - M.adjustOxyLoss(-2) - M.heal_organ_damage(2,2) - M.adjustToxLoss(-2) + M.adjustOxyLoss(-3) + M.heal_organ_damage(3,3) + M.adjustToxLoss(-3) ..() return @@ -2003,7 +2016,11 @@ datum on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom if(M.bodytemperature < 170) - M.adjustCloneLoss(-4) + M.adjustCloneLoss(-3) + M.adjustOxyLoss(-3) + M.heal_organ_damage(3,3) + M.adjustToxLoss(-3) + M.status_flags &= ~DISFIGURED ..() return @@ -2272,6 +2289,7 @@ datum M.drowsyness = 0 M.stuttering = 0 M.confused = 0 + M.reagents.remove_all_type(/datum/reagent/ethanol, 1*REM, 0, 1) ..() return @@ -2309,9 +2327,9 @@ datum M.sleeping += 1 if(51 to INFINITY) M.sleeping += 1 - M:toxloss += (data - 50) + M.adjustToxLoss((data - 50)*REM) + holder.remove_reagent(src.id, 0.5 * REAGENTS_METABOLISM) ..() - return beer2 //copypasta of chloral hydrate, disguised as normal beer for use by emagged brobots @@ -2515,27 +2533,37 @@ datum return else if ( mouth_covered ) // Reduced effects if partially protected victim << "\red Your [safe_thing] protect you from most of the pepperspray!" - victim.eye_blurry = max(M.eye_blurry, 15) - victim.eye_blind = max(M.eye_blind, 5) - victim.Stun(5) - victim.Weaken(5) - //victim.Paralyse(10) - //victim.drop_item() + if(prob(5)) + victim.emote("scream") + victim.eye_blurry = max(M.eye_blurry, 3) + victim.eye_blind = max(M.eye_blind, 1) + victim.confused = max(M.confused, 3) + victim.damageoverlaytemp = 60 + victim.Weaken(3) + victim.drop_item() return else if ( eyes_covered ) // Eye cover is better than mouth cover victim << "\red Your [safe_thing] protects your eyes from the pepperspray!" - victim.emote("scream") - victim.eye_blurry = max(M.eye_blurry, 5) + victim.eye_blurry = max(M.eye_blurry, 3) + victim.damageoverlaytemp = 30 return else // Oh dear :D - victim.emote("scream") + if(prob(5)) + victim.emote("scream") victim << "\red You're sprayed directly in the eyes with pepperspray!" - victim.eye_blurry = max(M.eye_blurry, 25) - victim.eye_blind = max(M.eye_blind, 10) - victim.Stun(5) + victim.eye_blurry = max(M.eye_blurry, 5) + victim.eye_blind = max(M.eye_blind, 2) + victim.confused = max(M.confused, 6) + victim.damageoverlaytemp = 75 victim.Weaken(5) - //victim.Paralyse(10) - //victim.drop_item() + victim.drop_item() + + on_mob_life(var/mob/living/M as mob) + if(!M) M = holder.my_atom + if(prob(5)) + M.visible_message("[M] [pick("dry heaves!","coughs!","splutters!")]") + ..() + return frostoil name = "Frost Oil" @@ -2917,7 +2945,7 @@ datum on_mob_life(var/mob/living/M as mob) ..() - if(M.getToxLoss() && prob(20)) M.adjustToxLoss(-1*REM) + if(M.getOxyLoss() && prob(30)) M.adjustOxyLoss(-1*REM) return tomatojuice @@ -2967,15 +2995,16 @@ datum id = "doctorsdelight" description = "A gulp a day keeps the MediBot away. That's probably for the best." reagent_state = LIQUID - nutriment_factor = 1 * FOOD_METABOLISM - color = "#664300" // rgb: 102, 67, 0 + color = "#FF8CFF" // rgb: 255, 140, 255 on_mob_life(var/mob/living/M as mob) - M:nutrition += nutriment_factor - holder.remove_reagent(src.id, FOOD_METABOLISM) if(!M) M = holder.my_atom - if(M:getToxLoss() && prob(80)) M:adjustToxLoss(-1) - + if(M.getOxyLoss() && prob(80)) M.adjustOxyLoss(-2) + if(M.getBruteLoss() && prob(80)) M.heal_organ_damage(2,0) + if(M.getFireLoss() && prob(80)) M.heal_organ_damage(0,2) + if(M.getToxLoss() && prob(80)) M.adjustToxLoss(-2) + if(M.dizziness !=0) M.dizziness = max(0,M.dizziness-15) + if(M.confused !=0) M.confused = max(0,M.confused - 5) ..() return @@ -3014,11 +3043,31 @@ datum description = "The raw essence of a banana." color = "#863333" // rgb: 175, 175, 0 + on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + nothing name = "Nothing" id = "nothing" description = "Absolutely nothing." + on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + potato_juice name = "Potato Juice" id = "potato" @@ -3938,6 +3987,16 @@ datum nutriment_factor = 1 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Clown")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + silencer name = "Silencer" id = "silencer" @@ -3945,6 +4004,16 @@ datum nutriment_factor = 1 * FOOD_METABOLISM color = "#664300" // rgb: 102, 67, 0 + on_mob_life(var/mob/living/M as mob) + M.nutrition += nutriment_factor + if(istype(M, /mob/living/carbon/human) && M.job in list("Mime")) + if(!M) M = holder.my_atom + M.heal_organ_damage(1,1) + M.nutrition += nutriment_factor + ..() + return + ..() + changelingsting name = "Changeling Sting" id = "changelingsting" diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index a5e0dd5c9dd..42578ff4704 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -319,6 +319,13 @@ datum required_reagents = list("carbon" = 1, "hydrogen" = 1, "anti_toxin" = 1) result_amount = 2 + inacusiate + name = "inacusiate" + id = "inacusiate" + result = "inacusiate" + required_reagents = list("water" = 1, "carbon" = 1, "anti_toxin" = 1) + result_amount = 2 + ethylredoxrazine name = "Ethylredoxrazine" id = "ethylredoxrazine" @@ -1769,7 +1776,7 @@ datum name = "The Doctor's Delight" id = "doctordelight" result = "doctorsdelight" - required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1) + required_reagents = list("limejuice" = 1, "tomatojuice" = 1, "orangejuice" = 1, "cream" = 1, "tricordrazine" = 1) result_amount = 5 irish_cream diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 8ce9b636b01..31d68ef7b15 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -15,14 +15,14 @@ var/recharge_time = 5 //Time it takes for shots to recharge (in seconds) var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin") + var/list/reagent_ids = list("doctorsdelight", "inaprovaline", "spaceacillin") //var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "anti_toxin", "inaprovaline", "spaceacillin") /obj/item/weapon/reagent_containers/borghypo/surgeon reagent_ids = list("bicaridine", "inaprovaline", "dexalin") /obj/item/weapon/reagent_containers/borghypo/crisis - reagent_ids = list("tricordrazine", "inaprovaline", "tramadol") + reagent_ids = list("doctorsdelight", "inaprovaline", "tramadol") /obj/item/weapon/reagent_containers/borghypo/New() ..() diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 8aef347ed27..4709ada53d8 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -1276,7 +1276,7 @@ New() ..() reagents.add_reagent("nutriment", 4) - reagents.add_reagent("alchdranine", 5) + reagents.add_reagent("doctorsdelight", 5) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/loadedbakedpotato @@ -2205,7 +2205,7 @@ New() ..() reagents.add_reagent("nutriment", 8) - reagents.add_reagent("alchdranine", 5) + reagents.add_reagent("doctorsdelight", 5) bitesize = 3 /obj/item/weapon/reagent_containers/food/snacks/appletart diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm index f6d26605818..b2147e6a047 100644 --- a/code/modules/reagents/reagent_containers/hypospray.dm +++ b/code/modules/reagents/reagent_containers/hypospray.dm @@ -20,7 +20,7 @@ /obj/item/weapon/reagent_containers/hypospray/New() //comment this to make hypos start off empty ..() - reagents.add_reagent("tricordrazine", 30) + reagents.add_reagent("doctorsdelight", 30) return /obj/item/weapon/reagent_containers/hypospray/attack(mob/M as mob, mob/user as mob) @@ -64,7 +64,7 @@ /obj/item/weapon/reagent_containers/hypospray/combat/New() ..() - reagents.remove_reagent("tricordrazine", 30) + reagents.remove_reagent("doctorsdelight", 30) reagents.add_reagent("synaptizine", 30) @@ -76,10 +76,11 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = list(5) volume = 5 + var/emagged = 0 /obj/item/weapon/reagent_containers/hypospray/autoinjector/New() ..() - reagents.remove_reagent("tricordrazine", 30) + reagents.remove_reagent("doctorsdelight", 30) reagents.add_reagent("tramadol", 4) reagents.add_reagent("hyperzine", 1) update_icon() @@ -87,8 +88,9 @@ /obj/item/weapon/reagent_containers/hypospray/autoinjector/attack(mob/M as mob, mob/user as mob) ..() - if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled. - flags &= ~OPENCONTAINER + if(!emagged) + if(reagents.total_volume <= 0) //Prevents autoinjectors to be refilled. + flags &= ~OPENCONTAINER update_icon() return @@ -105,6 +107,13 @@ else usr << "\blue It is spent." +/obj/item/weapon/reagent_containers/hypospray/autoinjector/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) + if(istype(D, /obj/item/weapon/card/emag) && !emagged) + emagged = 1 + user << "You bypass the electronic child-safety lock on the reagent storage." + else + ..() + return /obj/item/weapon/reagent_containers/hypospray/hyperzine name = "emergency stimulant autoinjector" diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index b09f6f154f1..46fec8bde4c 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -207,7 +207,7 @@ datum/tech/bluespace name = "'Blue-space' Research" desc = "Research into the sub-reality known as 'blue-space'" id = "bluespace" - max_level=4 + max_level=6 datum/tech/biotech name = "Biological Technology" diff --git a/icons/obj/cigarettes.dmi b/icons/obj/cigarettes.dmi index a2b7d416055ba5401cd2212de5800ce50f5a6a75..406085c01e7300b5b5fdd478cbf7e7705ece25e8 100644 GIT binary patch delta 2707 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 q70(}y-_Hq=$M9x_Rthfbi?XAhG5-M^$2h?N delta 2429 zcmV-@34->e7=RWfiBL{Q4GJ0x0000DNk~Le0002M0002M2m=5B0A&K4H2?qt(2*s1 zf0&z=)Bpgm0032(bLE&cnU9QkZ)UG8GF~1WmW_#ufq9#%ua=^skcNSYfq0yoqI`UO zkcWhZes-Rog`l9Km5hm&mX@8Jpp}h@hkkaGiGz!SdYqi1nVFiAhlHA$oSU4S0RaR0 z^y&Zk?)C5F@ao{}<=olT%;DYC=Hb|Ok)JFE$;G_U&BT$^Arf>?Ekh;>b4@F`wXMOu zw8g==lMMkR46&}Ky}7W}(a7D|(33p@ClZKxU5tHUs~8KSpO~nnp0%;6lW+ko37nad znU;^PtE7{r0V)ZKhk%oiiJzR6li2|$1BZltlLi7af0mY)#&K~=I5?(RSve~!|G)q! z9v=0$0PC>;;;I1Epa9;d0L_{J#gqVMGXSD1D`o%yGXMYp0A`s005dbp0000h0IF?m zZ3;FI3jhEB0d!JMQvg8b*k%9#0V8@;Sad{Xb7OL8aCB*JZU6vyoRyV9Zo?oDMb~f& zlx(dkf40+fl}$wyWzk&0!VV6o*dQ3E&FxE)4Qk{v6`Nu7K1lPwV9DNh`@@m(j|06( zAG96WmaSh_lzizEsJN*sN|e-R1&>Vt0Wy}0PM@9VJ|!$DIcXnaucV~+VvvvenJn>W zg-2^Vy2higcyxnDS6Orr(5c4gnX%TfD~-6uf3hm#`YoKsS?SXy?c_%!+uCn5*a$P& z0R3bPUL*f|yc`@{F@tALIO$PjuMHqjj?6vBrk-On&#{T;*t~OW+Br7s9Gmnw@#gML zb5mq-Z`&!r-=inWLU8u>RJ|4DrkIiE9ZBiDEh(M%CZ+QRrF7n_j^-S7{_m0Vn`ZuV|yD+Xl+s-zu-AHiTGg8`%QC_-h}7<@RT3;T+V&J zdC$E`-tYv&U>JsBnB1taDP51KsI;jne^qZ7BhsjJrE48YrP{lZcOmaa-mUh=$PCH_ zJaz!(BT(t_BJV-oi@aCuvjM7AzRI_*M7cnf&yTzhc|Y<#wKq(=ep4ABu%0APQ>xxD zWdiY=%GX+T!8*$dmZ~>KjT$vl{3tuHekfEI3Wb!9fYaVE!=p!s!|E+mTOSD2f7e^e z1)TO`3)v7`$cAXKvmV}sD(Y;MkATx2251P{C>LP+fw~|H zfC|`lJ3YVs4z#Bb0dNOU0Xy!b=O^q;dkVRQEDHoc1?-~fcioNlBsEq|u%?QBzkmwZ zeGfgavxP(gd< zpGe3@eRYEJs^5sWwx$zgBa~VFBEiIonG9tbK)ec?G#|bB%bn+>uo;G3pf9aH;Hf`D&1@-ai zoiiqhK1{*&pE>v+pLKTfoMiIc^JdOWo`1oG7sX~x)$pReA^Q02Ih~!IGcLXa1h`Z( zn7FJxdHEGrUKP0dnrpAS{)P!-XSLm^_BY*p3+ZKjL;U;kTj$QcZTg%Uu>SPV|GE8+ zJMX&to_p`R|A7Y|f0{RM-otHe^M}fd;MJ=J5qjJh||xMT-_a{mjB= zpL_m=7v~SJ7YSZ^`4xBpys9*>z5d3VZ@s->!Qv&0m%Q`td+)EgezCm>@IekQLO)cR zk3Rn7)6YKt;>)kT{^r~7zW?FJ;r22CEZ;DG%Hf!jrq~}Ke=rQgFbu=2rKD_}^SY## z+H^VPFSjZr#-_k48t%C!!QiPv>!F=B9Em{ZCJ0zwK-~j>b`MVFy=Y4+1e*(mOe@KV`1)0wePQML(j40ls z0<2oKs$KjL0SYmnSJD5cfQ}&Qw=Ajyz!zjbuckj8fjA;&f4NSqBVS*L`8+{?qF??O zD?}44Ye4+6lm#MRi21yl{zSqOJs3eW!5WYd0e~;ad|rj9T_zx#U_ZbEmU53HU)=e; zxCBH3f6KlQ6ivw7M%C8<@cQ%nlp#MyRy|W^o1nZMrN1G|Qm&7@HsTiBBkr=wS9{qe zRHv%Ds=MI(g_5mbByhR_hG7_ne_{#cJYEm-UgW*Nd%PL}Y v