From 12afd61ffcbcefdbf31e253413da1e6b0a701864 Mon Sep 17 00:00:00 2001 From: SkyMarshal Date: Fri, 27 Jan 2012 20:15:06 -0700 Subject: [PATCH] Ported Uplinks, Door stuff, Hacktools, Compressed Matter implant. --- baystation12.dme | 7 +- .../Ported/Abi79/uplink_kits.dm | 53 +++ code/WorkInProgress/Ported/Abi79/uplinks.dm | 337 ++++++++++++++++++ .../Ported/Bureaucracy/copier.dm | 156 ++++++++ .../Ported/Bureaucracy/filing.dm | 23 ++ .../WorkInProgress/Ported/Spawners/spawner.dm | 208 +++++++++++ .../WorkInProgress/Ported/ZeroPoint/Laser2.dm | 128 +++++++ .../Ported/ZeroPoint/LaserComputer.dm | 130 +++++++ .../Ported/ZeroPoint/SuperMatter.dm | 120 +++++++ code/WorkInProgress/Ported/head.dm | 54 +++ code/WorkInProgress/Ported/policetape.dm | 167 +++++++++ code/datums/mind.dm | 10 +- code/defines/obj.dm | 14 + code/defines/obj/door.dm | 4 +- code/defines/obj/storage.dm | 1 + code/defines/procs/gamehelpers.dm | 34 +- code/defines/procs/helpers.dm | 22 +- code/game/gamemodes/blob/blob.dm | 43 +++ code/game/gamemodes/changeling/changeling.dm | 43 +++ .../game/gamemodes/changeling/traitor_chan.dm | 43 +++ code/game/gamemodes/cult/cult.dm | 43 +++ code/game/gamemodes/extended/extended.dm | 43 +++ code/game/gamemodes/game_mode.dm | 3 + .../game/gamemodes/malfunction/malfunction.dm | 43 +++ code/game/gamemodes/meteor/meteor.dm | 42 +++ code/game/gamemodes/nuclear/nuclear.dm | 43 +++ code/game/gamemodes/revolution/revolution.dm | 45 ++- code/game/gamemodes/traitor/traitor.dm | 71 +++- code/game/gamemodes/traitor/traitorinfo.dm | 6 + code/game/gamemodes/wizard/wizard.dm | 43 +++ code/game/machinery/doors/airlock.dm | 297 ++++++++++++++- code/game/machinery/doors/door.dm | 55 ++- code/game/objects/devices/PDA/PDA.dm | 2 +- code/game/objects/devices/PDA/uplink.dm | 245 ------------- .../objects/items/weapons/implants/implant.dm | 40 ++- .../items/weapons/implants/implanter.dm | 37 +- code/game/objects/items/weapons/uplinks.dm | 255 ------------- code/modules/mob/living/silicon/ai/ai.dm | 35 ++ .../modules/mob/living/silicon/robot/robot.dm | 11 + icons/mob/items_lefthand.dmi | Bin 103209 -> 103393 bytes icons/mob/items_righthand.dmi | Bin 102469 -> 102332 bytes icons/obj/device.dmi | Bin 18431 -> 18756 bytes icons/obj/storage.dmi | Bin 42538 -> 42862 bytes 43 files changed, 2399 insertions(+), 557 deletions(-) create mode 100644 code/WorkInProgress/Ported/Abi79/uplink_kits.dm create mode 100644 code/WorkInProgress/Ported/Abi79/uplinks.dm create mode 100644 code/WorkInProgress/Ported/Bureaucracy/copier.dm create mode 100644 code/WorkInProgress/Ported/Bureaucracy/filing.dm create mode 100644 code/WorkInProgress/Ported/Spawners/spawner.dm create mode 100644 code/WorkInProgress/Ported/ZeroPoint/Laser2.dm create mode 100644 code/WorkInProgress/Ported/ZeroPoint/LaserComputer.dm create mode 100644 code/WorkInProgress/Ported/ZeroPoint/SuperMatter.dm create mode 100644 code/WorkInProgress/Ported/head.dm create mode 100644 code/WorkInProgress/Ported/policetape.dm create mode 100644 code/game/gamemodes/traitor/traitorinfo.dm delete mode 100644 code/game/objects/devices/PDA/uplink.dm delete mode 100644 code/game/objects/items/weapons/uplinks.dm diff --git a/baystation12.dme b/baystation12.dme index b215b4ab32..e62c74269c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -151,7 +151,9 @@ #define FILE_DIR "code/WorkInProgress/Mini" #define FILE_DIR "code/WorkInProgress/organs" #define FILE_DIR "code/WorkInProgress/Ported" +#define FILE_DIR "code/WorkInProgress/Ported/Abi79" #define FILE_DIR "code/WorkInProgress/Ported/Bureaucracy" +#define FILE_DIR "code/WorkInProgress/Ported/Spawners" #define FILE_DIR "code/WorkInProgress/Ported/ZeroPoint" #define FILE_DIR "code/WorkInProgress/SkyMarshal" #define FILE_DIR "code/WorkInProgress/Tastyfish" @@ -430,6 +432,7 @@ #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" #include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\traitor\traitorinfo.dm" #include "code\game\gamemodes\wizard\spellbook.dm" #include "code\game\gamemodes\wizard\spells.dm" #include "code\game\gamemodes\wizard\wizard.dm" @@ -644,7 +647,6 @@ #include "code\game\objects\devices\PDA\cart.dm" #include "code\game\objects\devices\PDA\PDA.dm" #include "code\game\objects\devices\PDA\radio.dm" -#include "code\game\objects\devices\PDA\uplink.dm" #include "code\game\objects\items\apc_frame.dm" #include "code\game\objects\items\blueprints.dm" #include "code\game\objects\items\candle.dm" @@ -690,7 +692,6 @@ #include "code\game\objects\items\weapons\toilets.dm" #include "code\game\objects\items\weapons\tools.dm" #include "code\game\objects\items\weapons\twohanded.dm" -#include "code\game\objects\items\weapons\uplinks.dm" #include "code\game\objects\items\weapons\implants\implant.dm" #include "code\game\objects\items\weapons\implants\implantcase.dm" #include "code\game\objects\items\weapons\implants\implantchair.dm" @@ -1045,6 +1046,8 @@ #include "code\WorkInProgress\Mini\customitems.dm" #include "code\WorkInProgress\Ported\head.dm" #include "code\WorkInProgress\Ported\policetape.dm" +#include "code\WorkInProgress\Ported\Abi79\uplink_kits.dm" +#include "code\WorkInProgress\Ported\Abi79\uplinks.dm" #include "code\WorkInProgress\Ported\Bureaucracy\copier.dm" #include "code\WorkInProgress\Ported\Bureaucracy\filing.dm" #include "code\WorkInProgress\Ported\ZeroPoint\Laser2.dm" diff --git a/code/WorkInProgress/Ported/Abi79/uplink_kits.dm b/code/WorkInProgress/Ported/Abi79/uplink_kits.dm new file mode 100644 index 0000000000..b7b053135e --- /dev/null +++ b/code/WorkInProgress/Ported/Abi79/uplink_kits.dm @@ -0,0 +1,53 @@ +/obj/item/weapon/storage/syndie_kit + name = "Box" + desc = "A sleek, sturdy box" + icon_state = "box_of_doom" + item_state = "syringe_kit" + +/obj/item/weapon/storage/syndie_kit/imp_freedom + name = "Freedom Implant (with injector)" + +/obj/item/weapon/storage/syndie_kit/imp_freedom/New() + var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) + O.imp = new /obj/item/weapon/implant/freedom(O) + O.update() + ..() + return + +/obj/item/weapon/storage/syndie_kit/imp_compress + name = "Compressed Matter Implant (with injector)" + +/obj/item/weapon/storage/syndie_kit/imp_compress/New() + new /obj/item/weapon/implanter/compressed(src) + ..() + return + +/obj/item/weapon/storage/syndie_kit/imp_explosive + name = "Explosive Implant (with injector)" + +/obj/item/weapon/storage/syndie_kit/imp_explosive/New() + var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) + O.imp = new /obj/item/weapon/implant/explosive(O) + O.name = "(BIO-HAZARD) BIO-detpack" + O.update() + ..() + return + +/obj/item/weapon/storage/syndie_kit/imp_uplink + name = "Uplink Implant (with injector)" + +/obj/item/weapon/storage/syndie_kit/imp_uplink/New() + var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(src) + O.imp = new /obj/item/weapon/implant/uplink(O) + O.update() + ..() + return + +/obj/item/weapon/storage/syndie_kit/space + name = "Space Suit and Helmet" + +/obj/item/weapon/storage/syndie_kit/space/New() + new /obj/item/clothing/suit/space/syndicate(src) + new /obj/item/clothing/head/helmet/space/syndicate(src) + ..() + return \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Abi79/uplinks.dm b/code/WorkInProgress/Ported/Abi79/uplinks.dm new file mode 100644 index 0000000000..2c00b22450 --- /dev/null +++ b/code/WorkInProgress/Ported/Abi79/uplinks.dm @@ -0,0 +1,337 @@ +/* + +SYNDICATE UPLINKS + +TO-DO: + Once wizard is fixed, make sure the uplinks work correctly for it. wizard.dm is right now uncompiled and with broken code in it. + + Clean the code up and comment it. Part of it is right now copy-pasted, with the general Topic() and modifications by Abi79. + + I should take a more in-depth look at both the copy-pasted code for the individual uplinks below, and at each gamemode's code + to see how uplinks are assigned and if there are any bugs with those. + + +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 // Welcoming menu message + var/menu_message = "" // The actual menu text + var/items // List of items + var/list/ItemList // Parsed list of items + var/uses // Numbers of crystals + + New() + welcome = ticker.mode.uplink_welcome + items = dd_replacetext(ticker.mode.uplink_items, "\n", "") // Getting the text string of items + ItemList = dd_text2list(src.items, ";") // Parsing the items text string + uses = ticker.mode.uplink_uses + +//Let's build a menu! + proc/generate_menu() + src.menu_message = "[src.welcome]
" + src.menu_message += "Tele-Crystals left: [src.uses]
" + src.menu_message += "
" + src.menu_message += "Request item:
" + src.menu_message += "Each item costs a number of tele-crystals as indicated by the number following their name.
" + + var/cost + var/item + var/name + var/path_obj + var/path_text + var/category_items = 1 //To prevent stupid :P + + for(var/D in ItemList) + var/list/O = stringsplit(D, ":") + if(O.len != 3) //If it is not an actual item, make a break in the menu. + if(category_items < 1) //If there were no itens in the last category... + src.menu_message += "We apologize, as you could not afford anything from this category.
" + if(O.len == 1) //If there is one item, it's probably a title + src.menu_message += "[O[1]]
" + category_items = 0 + else //Else, it's a white space. + src.menu_message += "
" + continue + + path_text = O[1] + cost = text2num(O[2]) + + if(cost>uses) + continue + + path_obj = text2path(path_text) + item = new path_obj() + name = O[3] + del item + + src.menu_message += "[name] ([cost])
" + category_items++ + + src.menu_message += "
" + return + + Topic(href, href_list) + if (href_list["buy_item"]) + if(text2num(href_list["cost"]) > uses) // Not enough crystals for the item + return 0 + + if(usr:mind && ticker.mode.traitors[usr:mind]) + var/datum/traitorinfo/info = ticker.mode.traitors[usr:mind] + info.spawnlist += href_list["buy_item"] + + uses -= text2num(href_list["cost"]) + + return 1 + + +/* + *PDA uplink + */ + +//Syndicate uplink hidden inside a traitor PDA +//Communicate with traitor through the PDA's note function. + +/obj/item/device/uplink/pda + name = "uplink module" + desc = "An electronic uplink system of unknown origin." + icon = 'module.dmi' + icon_state = "power_mod" + var/obj/item/device/pda/hostpda = null + + var/orignote = null //Restore original notes when locked. + var/active = 0 //Are we currently active? + var/lock_code = "" //The unlocking password. + + proc + unlock() + if ((isnull(src.hostpda)) || (src.active)) + return + + src.orignote = src.hostpda.note + src.active = 1 + src.hostpda.mode = 1 //Switch right to the notes program + + src.generate_menu() + print_to_host(menu_message) + + for (var/mob/M in viewers(1, src.hostpda.loc)) + if (M.client && M.machine == src.hostpda) + src.hostpda.attack_self(M) + + return + + print_to_host(var/text) + if (isnull(hostpda)) + return + hostpda.note = text + + for (var/mob/M in viewers(1, hostpda.loc)) + if (M.client && M.machine == hostpda) + hostpda.attack_self(M) + return + + shutdown_uplink() + if (isnull(src.hostpda)) + return + active = 0 + hostpda.note = orignote + if (hostpda.mode==1) + hostpda.mode = 0 + hostpda.updateDialog() + return + + attack_self(mob/user as mob) + src.generate_menu() + src.hostpda.note = src.menu_message + + + Topic(href, href_list) + if ((isnull(src.hostpda)) || (!src.active)) + return + + if (usr.stat || usr.restrained() || !in_range(src.hostpda, usr)) + return + + if(..() == 1) // We can afford the item + var/path_obj = text2path(href_list["buy_item"]) + var/mob/A = src.hostpda.loc + var/item = new path_obj(get_turf(src.hostpda)) + if(ismob(A)) //&& !istype(item, /obj/spawner)) + if(!A.r_hand) + item:loc = A + A.r_hand = item + item:layer = 20 + else if(!A.l_hand) + item:loc = A + A.l_hand = item + item:layer = 20 + usr.update_clothing() + // usr.client.onBought("[item:name]") When we have the stats again, uncomment. + /* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind + del item*/ + //HEADFINDBACK + src.attack_self(usr) + src.hostpda.attack_self(usr) + return + + +/* + *Portable radio uplink + */ + +//A Syndicate uplink disguised as a portable radio +/obj/item/device/uplink/radio/implanted + uses = 5 + +/obj/item/device/uplink/radio + name = "ship bounced radio" + icon = 'device.dmi' + icon_state = "radio" + var/temp = null //Temporary storage area for a message offering the option to destroy the radio + var/selfdestruct = 0 //Set to 1 while the radio is self destructing itself. + var/obj/item/device/radio/origradio = null + flags = FPRINT | TABLEPASS | CONDUCT | ONBELT + w_class = 2.0 + item_state = "radio" + throwforce = 5 + throw_speed = 4 + throw_range = 20 + m_amt = 100 + + attack_self(mob/user as mob) + var/dat + + if (src.selfdestruct) + dat = "Self Destructing..." + else + if (src.temp) + dat = "[src.temp]

Clear" + else + src.generate_menu() + dat = src.menu_message + if (src.origradio) // Checking because sometimes the radio uplink may be spawned by itself, not as a normal unlockable radio + dat += "Lock
" + dat += "
" + dat += "Self-Destruct" + + user << browse(dat, "window=radio") + onclose(user, "radio") + return + + Topic(href, href_list) + if (usr.stat || usr.restrained()) + return + + var/mob/living/carbon/human/H = usr + + if (!( istype(H, /mob/living/carbon/human))) + return 1 + + if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf)))) + usr.machine = src + + if(href_list["buy_item"]) + if(..() == 1) // We can afford the item + var/path_obj = text2path(href_list["buy_item"]) + var/item = new path_obj(get_turf(src.loc)) + var/mob/A = src.loc + if(ismob(A)) //&& !istype(item, /obj/spawner)) + if(!A.r_hand) + item:loc = A + A.r_hand = item + item:layer = 20 + else if(!A.l_hand) + item:loc = A + A.l_hand = item + item:layer = 20 + /* if(istype(item, /obj/spawner)) // Spawners need to have del called on them to avoid leaving a marker behind + del item*/ + // usr.client.onBought("[item:name]") When we have the stats again, uncomment. + src.attack_self(usr) + return + + else if (href_list["lock"] && src.origradio) + // presto chango, a regular radio again! (reset the freq too...) + usr.machine = null + usr << browse(null, "window=radio") + var/obj/item/device/radio/T = src.origradio + var/obj/item/device/uplink/radio/R = src + R.loc = T + T.loc = usr + // R.layer = initial(R.layer) + R.layer = 0 + if (usr.client) + usr.client.screen -= R + if (usr.r_hand == R) + usr.u_equip(R) + usr.r_hand = T + + else + usr.u_equip(R) + usr.l_hand = T + R.loc = T + T.layer = 20 + T.set_frequency(initial(T.frequency)) + T.attack_self(usr) + return + + else if (href_list["selfdestruct"]) + src.temp = "Self-Destruct" + + else if (href_list["selfdestruct2"]) + src.selfdestruct = 1 + spawn (100) + explode() + return + + else if (href_list["clear_selfdestruct"]) + src.temp = null + + if (istype(src.loc, /mob)) + attack_self(src.loc) + else + for(var/mob/M in viewers(1, src)) + if (M.client) + src.attack_self(M) + return + + proc/explode() + var/turf/location = get_turf(src.loc) + if(location) + location.hotspot_expose(700,125) + explosion(location, 0, 0, 2, 4, 1) + + del(src.master) + del(src) + return + + proc/shutdown_uplink() + if (!src.origradio) + return + var/list/nearby = viewers(1, src) + for(var/mob/M in nearby) + if (M.client && M.machine == src) + M << browse(null, "window=radio") + M.machine = null + + var/obj/item/device/radio/T = src.origradio + var/obj/item/weapon/syndicate_uplink/R = src + var/mob/L = src.loc + R.loc = T + T.loc = L + // R.layer = initial(R.layer) + R.layer = 0 + if (istype(L)) + if (L.client) + L.client.screen -= R + if (L.r_hand == R) + L.u_equip(R) + L.r_hand = T + else + L.u_equip(R) + L.l_hand = T + T.layer = 20 + T.set_frequency(initial(T.frequency)) + return \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Bureaucracy/copier.dm b/code/WorkInProgress/Ported/Bureaucracy/copier.dm new file mode 100644 index 0000000000..9f933b822d --- /dev/null +++ b/code/WorkInProgress/Ported/Bureaucracy/copier.dm @@ -0,0 +1,156 @@ +// Contains: copy machine + +/obj/machinery/copier + name = "Copy Machine" + icon = 'bureaucracy.dmi' + icon_state = "copier" + density = 1 + anchored = 1 + var/num_copies = 1 // number of copies selected, will be maintained between jobs + var/copying = 0 // are we copying + var/job_num_copies = 0 // number of copies remaining + var/top_open = 1 // the top is open + var/obj/item/weapon/template // the paper OR photo being scanned + var/copy_wait = 0 // wait for current page to finish + var/max_copies = 10 // MAP EDITOR: can set the number of max copies, possibly to 5 or something for public, more for QM, robutist, etc. + +/obj/machinery/copier/New() + ..() + update() + +/obj/machinery/copier/attackby(obj/item/weapon/O as obj, mob/user as mob) + if(!top_open) + return + + if (istype(O, /obj/item/weapon/paper) || istype(O, /obj/item/weapon/photo)) + // put it inside + template = O + usr.drop_item() + O.loc = src + top_open = 0 + update() + updateDialog() + +/obj/machinery/copier/attack_paw(user as mob) + return src.attack_hand(user) + +/obj/machinery/copier/attack_ai(user as mob) + return src.attack_hand(user) + +/obj/machinery/copier/attack_hand(user as mob) + // da UI + var/dat + if(..()) + return + + if(src.stat) + user << "[name] does not seem to be responding to your button mashing." + return + + /* + if(top_open) + user << "[name] beeps, \"Please place a paper on top and close the lid.\"" + return + */ + + dat = "Copy MachineXeno Corp. Copying Machine
" + + if(copying) + dat += "[job_num_copies] copies remaining.

" + dat += "Cancel" + else + if(!top_open) + dat += "Open Top

" + + dat += "Number of Copies: " + + dat += "-" + dat += "-" + dat += " [num_copies] " + dat += "+" + dat += "+

" + + if(template) + dat += "Copy" + else + dat += "No paper to be copied.
" + dat += "Please place a paper or photograph on top and close the lid.
" + + dat += "
" + + user << browse(dat, "window=copy_machine") + onclose(user, "copy_machine") + +/obj/machinery/copier/proc/update() + if(top_open) + icon_state = "copier_o" + else if(copying) + icon_state = "copier_s" + else + icon_state = "copier" + +/obj/machinery/copier/Topic(href, href_list) + if(..()) + return + usr.machine = src + src.add_fingerprint(usr) + + if(href_list["num"]) + num_copies += text2num(href_list["num"]) + if(num_copies < 1) + num_copies = 1 + else if(num_copies > max_copies) + num_copies = max_copies + updateDialog() + if(href_list["open"]) + template.loc = src.loc + template = null + top_open = 1 + updateDialog() + update() + if(href_list["copy"]) + copying = 1 + job_num_copies = num_copies + update() + updateDialog() + if(href_list["cancel"]) + copying = 0 + job_num_copies = 0 + update() + updateDialog() + +/obj/machinery/copier/process() + if(src.stat) + usr << "[name] does not seem to be responding to your button mashing." + return + + if(copying && !copy_wait) + copy_wait = 1 + // make noise + playsound(src, 'polaroid1.ogg', 50, 1) + spawn(5) + if(!copying) + return // user cancelled + + if(istype(template, /obj/item/weapon/paper)) + // make duplicate paper + var/obj/item/weapon/paper/P = new(src.loc) + P.name = template.name + P.info = template:info + P.stamped = template:stamped + P.icon_state = template.icon_state + else if(istype(template, /obj/item/weapon/photo)) + // make duplicate photo + var/obj/item/weapon/photo/P = new(src.loc) + P.name = template.name + P.desc = template.desc + P.icon = template.icon + + // copy counting stuff + job_num_copies -= 1 + if(job_num_copies == 0) + usr << "[name] beeps happily." + copying = 0 + update() + updateDialog() + copy_wait = 0 \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Bureaucracy/filing.dm b/code/WorkInProgress/Ported/Bureaucracy/filing.dm new file mode 100644 index 0000000000..5f6363dadc --- /dev/null +++ b/code/WorkInProgress/Ported/Bureaucracy/filing.dm @@ -0,0 +1,23 @@ +/obj/structure/filingcabinet + name = "Filing Cabinet" + desc = "A large cabinet with drawers." + icon = 'computer.dmi' + icon_state = "messyfiles" + density = 1 + anchored = 1 + +/obj/structure/filingcabinet/attackby(obj/item/weapon/paper/P,mob/M) + if(istype(P)) + M << "You put the [P] in the [src]." + M.drop_item() + P.loc = src + else + M << "You can't put a [P] in the [src]!" + +/obj/structure/filingcabinet/attack_hand(mob/user) + if(src.contents.len <= 0) + user << "The [src] is empty." + return + var/obj/item/weapon/paper/P = input(user,"Choose a sheet to take out.","[src]", "Cancel") as null|obj in src.contents + if(in_range(src,user)) + P.loc = user.loc \ No newline at end of file diff --git a/code/WorkInProgress/Ported/Spawners/spawner.dm b/code/WorkInProgress/Ported/Spawners/spawner.dm new file mode 100644 index 0000000000..097d8f3c41 --- /dev/null +++ b/code/WorkInProgress/Ported/Spawners/spawner.dm @@ -0,0 +1,208 @@ +/obj/spawner + name = "object spawner" + +/obj/spawner/bomb + name = "bomb" + icon = 'screen1.dmi' + icon_state = "x" + var/btype = 0 //0 = radio, 1= prox, 2=time + var/explosive = 1 // 0= firebomb + var/btemp = 500 // bomb temperature (degC) + var/active = 0 + +/obj/spawner/bomb/radio + btype = 0 + +/obj/spawner/bomb/proximity + btype = 1 + +/obj/spawner/bomb/timer + btype = 2 + +/obj/spawner/bomb/timer/syndicate + btemp = 450 + +/obj/spawner/bomb/suicide + btype = 3 + +/obj/spawner/newbomb + // Remember to delete it if you use it for anything else other than uplinks. See the commented line in its New() - Abi + // Going in depth: the reason we do not do a Del() in its New()is because then we cannot access its properties. + // I might be doing this wrong / not knowing of a Byond function. If I'm doing it wrong, let me know please. + name = "bomb" + icon = 'screen1.dmi' + icon_state = "x" + var/btype = 0 // 0=radio, 1=prox, 2=time + var/btemp1 = 1500 + var/btemp2 = 1000 // tank temperatures + +/obj/spawner/newbomb/timer + btype = 2 + +/obj/spawner/newbomb/timer/syndicate + name = "Low-Yield Bomb" + btemp1 = 1500 + btemp2 = 1000 + +/obj/spawner/newbomb/proximity + btype = 1 + +/obj/spawner/newbomb/radio + btype = 0 + +/obj/spawner/bomb/New() + ..() + + switch (src.btype) + // radio + if (0) + var/obj/item/assembly/r_i_ptank/R = new /obj/item/assembly/r_i_ptank(src.loc) + var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/tank/plasma(R) + var/obj/item/device/radio/signaler/p1 = new /obj/item/device/radio/signaler(R) + var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) + R.part1 = p1 + R.part2 = p2 + R.part3 = p3 + p1.master = R + p2.master = R + p3.master = R + R.status = explosive + p1.b_stat = 0 + p2.status = 1 + p3.air_contents.temperature = btemp + T0C + + // proximity + if (1) + var/obj/item/assembly/m_i_ptank/R = new /obj/item/assembly/m_i_ptank(src.loc) + var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/tank/plasma(R) + var/obj/item/device/prox_sensor/p1 = new /obj/item/device/prox_sensor(R) + var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) + R.part1 = p1 + R.part2 = p2 + R.part3 = p3 + p1.master = R + p2.master = R + p3.master = R + R.status = explosive + + p3.air_contents.temperature = btemp + T0C + p2.status = 1 + + if(src.active) + R.part1.state = 1 + R.part1.icon_state = text("motion[]", 1) + R.c_state(1, src) + + // timer + if (2) + var/obj/item/assembly/t_i_ptank/R = new /obj/item/assembly/t_i_ptank(src.loc) + var/obj/item/weapon/tank/plasma/p3 = new /obj/item/weapon/tank/plasma(R) + var/obj/item/device/timer/p1 = new /obj/item/device/timer(R) + var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) + R.part1 = p1 + R.part2 = p2 + R.part3 = p3 + p1.master = R + p2.master = R + p3.master = R + R.status = explosive + + p3.air_contents.temperature = btemp + T0C + p2.status = 1 + //bombvest + if(3) + var/obj/item/clothing/suit/armor/a_i_a_ptank/R = new /obj/item/clothing/suit/armor/a_i_a_ptank(src.loc) + var/obj/item/weapon/tank/plasma/p4 = new /obj/item/weapon/tank/plasma(R) + var/obj/item/device/healthanalyzer/p1 = new /obj/item/device/healthanalyzer(R) + var/obj/item/device/igniter/p2 = new /obj/item/device/igniter(R) + var/obj/item/clothing/suit/armor/vest/p3 = new /obj/item/clothing/suit/armor/vest(R) + R.part1 = p1 + R.part2 = p2 + R.part3 = p3 + R.part4 = p4 + p1.master = R + p2.master = R + p3.master = R + p4.master = R + R.status = explosive + + p4.air_contents.temperature = btemp + T0C + p2.status = 1 + + del(src) + + +/obj/spawner/newbomb/New() + ..() + + switch (src.btype) + // radio + if (0) + + var/obj/item/device/transfer_valve/V = new(src.loc) + var/obj/item/weapon/tank/plasma/PT = new(V) + var/obj/item/weapon/tank/oxygen/OT = new(V) + + var/obj/item/device/radio/signaler/S = new(V) + + V.tank_one = PT + V.tank_two = OT + V.attached_device = S + + S.master = V + PT.master = V + OT.master = V + + S.b_stat = 0 + + PT.air_contents.temperature = btemp1 + T0C + OT.air_contents.temperature = btemp2 + T0C + + V.update_icon() + + // proximity + if (1) + + var/obj/item/device/transfer_valve/V = new(src.loc) + var/obj/item/weapon/tank/plasma/PT = new(V) + var/obj/item/weapon/tank/oxygen/OT = new(V) + + var/obj/item/device/prox_sensor/P = new(V) + + V.tank_one = PT + V.tank_two = OT + V.attached_device = P + + P.master = V + PT.master = V + OT.master = V + + + PT.air_contents.temperature = btemp1 + T0C + OT.air_contents.temperature = btemp2 + T0C + + V.update_icon() + + + // timer + if (2) + var/obj/item/device/transfer_valve/V = new(src.loc) + var/obj/item/weapon/tank/plasma/PT = new(V) + var/obj/item/weapon/tank/oxygen/OT = new(V) + + var/obj/item/device/timer/T = new(V) + + V.tank_one = PT + V.tank_two = OT + V.attached_device = T + + T.master = V + PT.master = V + OT.master = V + T.time = 30 + + PT.air_contents.temperature = btemp1 + T0C + OT.air_contents.temperature = btemp2 + T0C + + V.update_icon() + //del(src) \ No newline at end of file diff --git a/code/WorkInProgress/Ported/ZeroPoint/Laser2.dm b/code/WorkInProgress/Ported/ZeroPoint/Laser2.dm new file mode 100644 index 0000000000..8b764b91be --- /dev/null +++ b/code/WorkInProgress/Ported/ZeroPoint/Laser2.dm @@ -0,0 +1,128 @@ +/obj/machinery/engine/laser + name = "Zero-point laser" + desc = "A super-powerful laser" + var/visible = 1 + var/state = 1.0 + var/obj/beam/e_beam/first + var/power = 500 + icon = 'engine.dmi' + icon_state = "laser" + anchored = 1 + var/id + var/on = 0 + var/freq = 50000 + var/phase = 0 + var/phase_variance = 0 + +/obj/machinery/engine/laser/process() + if(on) + if(!first) + src.first = new /obj/beam/e_beam(src.loc) + src.first.master = src + src.first.dir = src.dir + src.first.power = src.power + src.first.freq = src.freq + src.first.phase = src.phase + src.first.phase_variance = src.phase_variance + step(first, dir) + if(first) + src.first.updatebeam() + else + src.first.updatebeam() + else + if(first) + del first + +/obj/machinery/engine/laser/proc/setpower(var/powera) + src.power = powera + if(first) + first.setpower(src.power) + + +/obj/beam/e_beam + name = "Laser beam" + icon = 'projectiles.dmi' + icon_state = "u_laser" + var/obj/machinery/engine/laser/master = null + var/obj/beam/e_beam/next = null + var/power + var/freq = 50000 + var/phase = 0 + var/phase_variance = 0 + anchored = 1 + +/obj/beam/e_beam/New() + src.sd_SetLuminosity(4) + +/obj/beam/e_beam/proc/updatebeam() + if(!next) + if(get_step(src.loc,src.dir)) + var/obj/beam/e_beam/e = new /obj/beam/e_beam(src.loc) + e.dir = src.dir + src.next = e + e.master = src.master + e.power = src.power + e.phase = src.phase + src.phase+=src.phase_variance + e.freq = src.freq + e.phase_variance = src.phase_variance + if(src.loc.density == 0) + for(var/atom/o in src.loc.contents) + if(o.density || o == src.master || (ismob(o) && !istype(o, /mob/dead)) ) + o.laser_act(src) + del src + return + else + src.loc.laser_act(src) + del e + return + step(e,e.dir) + if(e) + e.updatebeam() + else + next.updatebeam() + +/atom/proc/laser_act(var/obj/beam/e_beam/b) + return + +/mob/living/carbon/laser_act(var/obj/beam/e_beam/b) + for(var/t in organs) + var/datum/organ/external/affecting = organs["[t]"] + if (affecting.take_damage(0, b.power/400,0,0)) + UpdateDamageIcon() + else + UpdateDamage() + +/obj/beam/e_beam/Bump(atom/Obstacle) + Obstacle.laser_act(src) + del(src) + return + + +/obj/beam/e_beam/proc/setpower(var/powera) + src.power = powera + if(src.next) + src.next.setpower(powera) + +/obj/beam/e_beam/Bumped() + src.hit() + return + +/obj/beam/e_beam/HasEntered(atom/movable/AM as mob|obj) + if (istype(AM, /obj/beam)) + return + spawn( 0 ) + AM.laser_act(src) + src.hit() + return + return + +/obj/beam/e_beam/Del() + if(next) + del(next) + ..() + return + +/obj/beam/e_beam/proc/hit() + del src + return \ No newline at end of file diff --git a/code/WorkInProgress/Ported/ZeroPoint/LaserComputer.dm b/code/WorkInProgress/Ported/ZeroPoint/LaserComputer.dm new file mode 100644 index 0000000000..fe33d3ca04 --- /dev/null +++ b/code/WorkInProgress/Ported/ZeroPoint/LaserComputer.dm @@ -0,0 +1,130 @@ +//The laser control computer +//Used to control the lasers +/obj/machinery/computer/lasercon + name = "Laser control computer" + var/obj/machinery/engine/laser/laser = null + icon_state = "atmos" + var/id + var/advanced = 0 + +/obj/machinery/computer/lasercon/New() + spawn(1) + if(istype(src.id,/list)) + laser = list() + for(var/obj/machinery/engine/laser/las in world) + if(las.id in src.id) + laser += las + else + for(var/obj/machinery/engine/laser/las in world) + if(las.id == src.id) + laser = list(las) + + + +/obj/machinery/computer/lasercon/attack_ai(mob/user) + add_fingerprint(user) + + if(stat & (BROKEN|NOPOWER)) + return + interact(user) + +/obj/machinery/computer/lasercon/attack_hand(mob/user) + add_fingerprint(user) + + if(stat & (BROKEN|NOPOWER)) + return + interact(user) + + +/obj/machinery/computer/lasercon/proc/interact(mob/user) + + if ( (get_dist(src, user) > 1 ) || (stat & (BROKEN|NOPOWER)) ) + if (!istype(user, /mob/living/silicon)) + user.machine = null + user << browse(null, "window=powcomp") + return + + + user.machine = src + var/t = "Laser status monitor
" + + var/obj/machinery/engine/laser/laser = src.laser[1] + + if(!laser) + t += "\red No laser found" + else + + + t += "Power level: - - - - [add_lspace(laser.power,5)] + + + +
" + if(advanced) + t += "Frequency: - - [add_lspace(laser.freq,5)] + +
" + + t += "Output: [laser.on ? "Online Offline" : "Online Offline "]
" + + t += "

Close
" + + user << browse(t, "window=lascomp;size=420x700") + onclose(user, "lascomp") + + +/obj/machinery/computer/lasercon/Topic(href, href_list) + ..() + if( href_list["close"] ) + usr << browse(null, "window=lascomp") + usr.machine = null + return + + else if( href_list["input"] ) + var/i = text2num(href_list["input"]) + var/d = 0 + switch(i) + if(-4) + d = -1000 + if(4) + d = 1000 + if(1) + d = 1 + if(-1) + d = -1 + if(2) + d = 10 + if(-2) + d = -10 + if(3) + d = 100 + if(-3) + d = -100 + for(var/obj/machinery/engine/laser/laser in src.laser) + laser.power += d + laser.setpower(max(1, min(3000, laser.power)))// clamp to range + src.updateDialog() + else if( href_list["online"] ) + for(var/obj/machinery/engine/laser/laser in src.laser) + laser.on = !laser.on + src.updateDialog() + else if( href_list["freq"] ) + var/amt = text2num(href_list["freq"]) + for(var/obj/machinery/engine/laser/laser in src.laser) + if(laser.freq+amt>0) + laser.freq+=amt + src.updateDialog() +/obj/machinery/computer/lasercon/process() + if(!(stat & (NOPOWER|BROKEN)) ) + use_power(250) + + //src.updateDialog() + + +/obj/machinery/computer/lasercon/power_change() + + if(stat & BROKEN) + icon_state = "broken" + else + if( powered() ) + icon_state = initial(icon_state) + stat &= ~NOPOWER + else + spawn(rand(0, 15)) + src.icon_state = "c_unpowered" + stat |= NOPOWER + diff --git a/code/WorkInProgress/Ported/ZeroPoint/SuperMatter.dm b/code/WorkInProgress/Ported/ZeroPoint/SuperMatter.dm new file mode 100644 index 0000000000..75d236f10e --- /dev/null +++ b/code/WorkInProgress/Ported/ZeroPoint/SuperMatter.dm @@ -0,0 +1,120 @@ +#define NITROGEN_RETARDATION_FACTOR 4 //Higher == N2 slows reaction more +#define THERMAL_RELEASE_MODIFIER 50 //Higher == less heat released during reaction +#define PLASMA_RELEASE_MODIFIER 750 //Higher == less plasma released by reaction +#define OXYGEN_RELEASE_MODIFIER 1500 //Higher == less oxygen released at high temperature/power +#define REACTION_POWER_MODIFIER 1.1 //Higher == more overall power + +/obj/machinery/engine/supermatter + name = "Supermatter" + desc = "A strangely translucent and iridescent crystal. \red You get headaches just from looking at it." + icon = 'engine.dmi' + icon_state = "darkmatter" + density = 1 + anchored = 1 + + var/gasefficency = 0.25 + + var/det = 0 + var/previousdet = 0 + var/const/explosiondet = 3500 + + var/const/warningtime = 50 // Make the CORE OVERLOAD message repeat only every aprox. ?? seconds + var/lastwarning = 0 // Time in 1/10th of seconds since the last sent warning + +/obj/machinery/engine/klaxon + name = "Emergency Klaxon" + icon = 'engine.dmi' + icon_state = "darkmatter" + density = 1 + anchored = 1 + var/obj/machinery/engine/supermatter/sup + +/obj/machinery/engine/klaxon/process() + if(!sup) + for(var/obj/machinery/engine/supermatter/T in world) + sup = T + break + if(sup.det >= 1) + return + +/obj/machinery/engine/supermatter/process() + + var/turf/simulated/L = loc + + //Ok, get the air from the turf + var/datum/gas_mixture/env = L.return_air() + + //Remove gas from surrounding area + var/transfer_moles = gasefficency * env.total_moles() + var/datum/gas_mixture/removed = env.remove(transfer_moles) + + previousdet = det + det += (removed.temperature - 1000) / 150 + det = max(det, 0) + + if(det > 0 && removed.temperature > 1000) // while the core is still damaged and it's still worth noting its status + if((world.realtime - lastwarning) / 10 >= warningtime) + lastwarning = world.realtime + if(explosiondet - det <= 300) + radioalert("CORE EXPLOSION IMMINENT","Core control computer") + else if(det >= previousdet) // The damage is still going up + radioalert("CORE OVERLOAD","Core control computer") + else // Phew, we're safe + radioalert("Core returning to safe operating levels.","Core control computer") + + if(det > explosiondet) + roundinfo.core = 1 + //proc/explosion(turf/epicenter, devastation_range, heavy_impact_range, light_impact_range, flash_range, force = 0) + explosion(src.loc,8,15,20,30,1) + det = 0 + + if (!removed) + return 1 + + var/power = max(round((removed.temperature - T0C) / 20), 0) //Total laser power plus an overload factor + + //Get the collective laser power + for(var/dir in cardinal) + var/turf/T = get_step(L, dir) + for(var/obj/beam/e_beam/item in T) + power += item.power + + //Ok, 100% oxygen atmosphere = best reaction + //Maxes out at 100% oxygen pressure + var/oxygen = max(min((removed.oxygen - (removed.nitrogen * NITROGEN_RETARDATION_FACTOR)) / MOLES_CELLSTANDARD, 1), 0) + + var/device_energy = oxygen * power + + device_energy *= removed.temperature / T0C + + device_energy = round(device_energy * REACTION_POWER_MODIFIER) + + //To figure out how much temperature to add each tick, consider that at one atmosphere's worth + //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature + //that the device energy is around 2140. At that stage, we don't want too much heat to be put out + //Since the core is effectively "cold" + + //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock + //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. + removed.temperature += max((device_energy / THERMAL_RELEASE_MODIFIER), 0) + + removed.temperature = min(removed.temperature, 1500) + + //Calculate how much gas to release + removed.toxins += max(round(device_energy / PLASMA_RELEASE_MODIFIER), 0) + + removed.oxygen += max(round((device_energy + removed.temperature - T0C) / OXYGEN_RELEASE_MODIFIER), 0) + + env.merge(removed) + +//Not functional currently. -- SkyMarshal +/* + for(var/mob/living/carbon/l in view(src, 6)) // you have to be seeing the core to get hallucinations + if(prob(10) && !(l.glasses && istype(l.glasses, /obj/item/clothing/glasses/meson))) + l.hallucination = 50 +*/ + for(var/mob/living/l in view(src,3)) + l.bruteloss += 50 + l.updatehealth() + + return 1 \ No newline at end of file diff --git a/code/WorkInProgress/Ported/head.dm b/code/WorkInProgress/Ported/head.dm new file mode 100644 index 0000000000..d1cac9bc30 --- /dev/null +++ b/code/WorkInProgress/Ported/head.dm @@ -0,0 +1,54 @@ +//This looks to be the traitor win tracker code. Gonna comment it out as we lack it currently. +/* +client/proc/add_roundsjoined() + if(!makejson) + return + var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `roundsjoined` (`ckey`) VALUES ('[ckey(src.key)]')") + if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) +client/proc/add_roundssurvived() + if(!makejson) + return + var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `roundsurvived` (`ckey`) VALUES ('[ckey(src.key)]')") + if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) +client/proc/onDeath(var/mob/A = src.mob) + if(!makejson) + return + roundinfo.deaths++ + if(!ismob(A)) + return + var/ckey = src.ckey + var/area + var/attacker + var/tod = time2text(world.realtime) + var/health + var/last + if(isturf(A.loc)) + area = A.loc:loc:name + else + area = A.loc:name + if(ishuman(A.lastattacker)) + attacker = A.lastattacker:name + else + attacker = "None" + health = "Oxy:[A.oxyloss]Brute:[A.bruteloss]Burn:[A.fireloss]Toxins:[A.toxloss]" + if(A.logs.len >= 1) + last = A.logs[A.logs.len] + else + last = "None" + var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `deathlog` (`ckey`,`location`,`lastattacker`,`ToD`,`health`,`lasthit`) VALUES ('[ckey]',[dbcon.Quote(area)],[dbcon.Quote(attacker)],'[tod]','[health]',[dbcon.Quote(last)])") + if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) +client/proc/onBought(names) + if(!makejson) return + if(!names) return + var/DBQuery/cquery = dbcon.NewQuery("INSERT INTO `traitorbuy` (`type`) VALUES ([dbcon.Quote(names)])") + if(!cquery.Execute()) message_admins(cquery.ErrorMsg()) +*/ + +datum/roundinfo + var/core = 0 + var/deaths = 0 + var/revies = 0 + var/starttime = 0 + var/endtime = 0 + var/lenght = 0 + var/mode = 0 \ No newline at end of file diff --git a/code/WorkInProgress/Ported/policetape.dm b/code/WorkInProgress/Ported/policetape.dm new file mode 100644 index 0000000000..8e0e1e094b --- /dev/null +++ b/code/WorkInProgress/Ported/policetape.dm @@ -0,0 +1,167 @@ +/obj/item/policetaperoll/attack_self(mob/user as mob) + if(icon_state == "rollstart") + tapestartx = src.loc.x + tapestarty = src.loc.y + tapestartz = src.loc.z + usr << "\blue You place the first end of the police tape." + icon_state = "rollstop" + else + tapeendx = src.loc.x + tapeendy = src.loc.y + tapeendz = src.loc.z + var/tapetest = 0 + if(tapestartx == tapeendx && tapestarty > tapeendy && tapestartz == tapeendz) + for(var/Y=tapestarty,Y>=tapeendy,Y--) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/Y=tapestarty,Y>=tapeendy,Y--) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "vertical") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(tapestartx,Y,tapestartz) + P.loc = locate(tapestartx,Y,tapestartz) + P.icon_state = "vertical" + usr << "\blue You finish placing the police tape." //Git Test + + if(tapestartx == tapeendx && tapestarty < tapeendy && tapestartz == tapeendz) + for(var/Y=tapestarty,Y<=tapeendy,Y++) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/Y=tapestarty,Y<=tapeendy,Y++) + var/turf/T = get_turf(locate(tapestartx,Y,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "vertical") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(tapestartx,Y,tapestartz) + P.loc = locate(tapestartx,Y,tapestartz) + P.icon_state = "vertical" + usr << "\blue You finish placing the police tape." + + if(tapestarty == tapeendy && tapestartx > tapeendx && tapestartz == tapeendz) + for(var/X=tapestartx,X>=tapeendx,X--) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/X=tapestartx,X>=tapeendx,X--) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "horizontal") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(X,tapestarty,tapestartz) + P.loc = locate(X,tapestarty,tapestartz) + P.icon_state = "horizontal" + usr << "\blue You finish placing the police tape." + + if(tapestarty == tapeendy && tapestartx < tapeendx && tapestartz == tapeendz) + for(var/X=tapestartx,X<=tapeendx,X++) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + if(T.density == 1) + usr << "\blue You can't run police tape through a wall!" + icon_state = "rollstart" + return + for(var/X=tapestartx,X<=tapeendx,X++) + var/turf/T = get_turf(locate(X,tapestarty,tapestartz)) + for(var/obj/item/policetape/Ptest in T) + if(Ptest.icon_state == "horizontal") + tapetest = 1 + if(tapetest != 1) + var/obj/item/policetape/P = new/obj/item/policetape(X,tapestarty,tapestartz) + P.loc = locate(X,tapestarty,tapestartz) + P.icon_state = "horizontal" + usr << "\blue You finish placing the police tape." + + if(tapestarty != tapeendy && tapestartx != tapeendx) + usr << "\blue Police tape can only be laid horizontally or vertically." + icon_state = "rollstart" + +/obj/item/policetape/Bumped(M as mob) + if(src.allowed(M)) + var/turf/T = get_turf(src) + M:loc = T + +/obj/item/policetape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) + if(air_group || (height==0)) return 1 + + if ((mover.flags & 2 || istype(mover, /obj/effect/meteor) || mover.throwing == 1) ) + return 1 + else + return 0 + +/obj/item/policetape/attackby(obj/item/weapon/W as obj, mob/user as mob) + breaktape(W, user) + +/obj/item/policetape/attack_hand(mob/user as mob) + breaktape(null, user) + +/obj/item/policetape/attack_paw(mob/user as mob) + breaktape(/obj/item/weapon/wirecutters,user) + +/obj/item/policetape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob) + if(user.a_intent == "help" && ((!is_sharp(W) && src.allowed(user)) ||(!is_cut(W) && !src.allowed(user)))) + user << "You can't break the tape with that!" + return + user.show_viewers(text("\blue [] breaks the police tape!", user)) + var/OX = src.x + var/OY = src.y + if(src.icon_state == "horizontal") + var/N = 0 + var/X = OX + 1 + var/turf/T = src.loc + while(N != 1) + N = 1 + T = locate(X,T.y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "horizontal") + del(P) + X += 1 + + X = OX - 1 + N = 0 + while(N != 1) + N = 1 + T = locate(X,T.y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "horizontal") + del(P) + X -= 1 + + if(src.icon_state == "vertical") + var/N = 0 + var/Y = OY + 1 + var/turf/T = src.loc + while(N != 1) + N = 1 + T = locate(T.x,Y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "vertical") + del(P) + Y += 1 + + Y = OY - 1 + N = 0 + while(N != 1) + N = 1 + T = locate(T.x,Y,T.z) + for (var/obj/item/policetape/P in T) + N = 0 + if(P.icon_state == "vertical") + del(P) + Y -= 1 + + del(src) + return diff --git a/code/datums/mind.dm b/code/datums/mind.dm index ea080c637b..cf5e242af0 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -246,7 +246,7 @@ datum/mind text = "Uplink: give" var/obj/item/weapon/syndicate_uplink/suplink = find_syndicate_uplink() - var/obj/item/weapon/integrated_uplink/iuplink = find_integrated_uplink() + var/obj/item/device/uplink/iuplink = find_integrated_uplink() var/crystals if (suplink) crystals = suplink.uses @@ -799,7 +799,7 @@ datum/mind if("crystals") if (usr.client.holder.level >= 3) var/obj/item/weapon/syndicate_uplink/suplink = find_syndicate_uplink() - var/obj/item/weapon/integrated_uplink/iuplink = find_integrated_uplink() + var/obj/item/device/uplink/iuplink = find_integrated_uplink() var/crystals if (suplink) crystals = suplink.uses @@ -867,7 +867,7 @@ datum/mind proc/find_integrated_uplink() //world << "DEBUG: find_integrated_uplink()" - var/obj/item/weapon/integrated_uplink/uplink = null + var/obj/item/device/uplink/uplink = null var/list/L = current.get_contents() for (var/obj/item/device/pda/pda in L) uplink = pda.uplink @@ -877,8 +877,8 @@ datum/mind proc/take_uplink() //assuming only one uplink because I am tired of all this uplink shit --rastaf0 var/list/L = current.get_contents() - var/obj/item/weapon/syndicate_uplink/suplink = null - var/obj/item/weapon/integrated_uplink/iuplink = null + var/obj/item/device/uplink/radio/suplink = null + var/obj/item/device/uplink/pda/iuplink = null for (var/obj/item/device/radio/radio in L) suplink = radio.traitorradio if (suplink) diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 66b16cbf4b..fee7d93abe 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -342,6 +342,20 @@ origin_tech = "magnets=1;engineering=1" var/obj/machinery/telecomms/buffer // simple machine buffer for device linkage +/obj/item/device/hacktool + name = "hacktool" + icon_state = "hacktool" + flags = FPRINT | TABLEPASS | CONDUCT + var/in_use = 0 + force = 5.0 + w_class = 2.0 + throwforce = 5.0 + throw_range = 15 + throw_speed = 3 + desc = "An item of dubious origins, with wires and antennas protruding out of it." + m_amt = 60 + g_amt = 20 + /obj/item/blueprints name = "station blueprints" desc = "Blueprints of the station. There's stamp \"Classified\" and several coffee stains on it." diff --git a/code/defines/obj/door.dm b/code/defines/obj/door.dm index 4b8d10feaf..5272dd3cc0 100644 --- a/code/defines/obj/door.dm +++ b/code/defines/obj/door.dm @@ -6,13 +6,15 @@ opacity = 1 density = 1 layer = 2.7 + anchored = 1 var/secondsElectrified = 0 var/visible = 1 var/p_open = 0 var/operating = 0 - anchored = 1 var/autoclose = 0 var/glass = 0 + var/forcecrush = 0 + var/holdopen = 0 /obj/machinery/door/firedoor diff --git a/code/defines/obj/storage.dm b/code/defines/obj/storage.dm index 725ed11dae..432954fd46 100644 --- a/code/defines/obj/storage.dm +++ b/code/defines/obj/storage.dm @@ -59,6 +59,7 @@ desc = "Full of masks and emergency anesthetic tanks." /obj/item/weapon/storage/box/syndicate + icon_state = "box_of_doom" /obj/item/weapon/storage/box/ert name = "medical box" diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm index 5a39dc37db..587d98969f 100644 --- a/code/defines/procs/gamehelpers.dm +++ b/code/defines/procs/gamehelpers.dm @@ -25,20 +25,36 @@ return A return 0 -/proc/in_range(source, user) +/proc/get_random_turf(var/atom/A, var/list/L) + while(L.len > 0) + var/dir = pick(L) + L -= dir + var/turf/T = get_step(A,dir) + var/possible = 1 + + if(T.density == 0) + for(var/obj/I in T) + if(I.density == 1) + possible = 0 + break + + if(possible) + return T + + return + +/proc/in_range(source, user, telepathy=1) if(get_dist(source, user) <= 1) return 1 - /* - else//TK TODO: remove this - if(istype(user, /mob/living/carbon)) - if(user:mutations & TK && get_dist(source, user) <= 7) - if(user:equipped()) return 0 + else + if (istype(user, /mob/living/carbon)) + if (user:mutations & telepathy) var/X = source:x var/Y = source:y var/Z = source:z spawn(0) //I really shouldnt put this here but i dont have a better idea - var/obj/effect/overlay/O = new /obj/effect/overlay ( locate(X,Y,Z) ) + var/obj/effect/overlay/O = new /obj/effect/overlay( locate(X,Y,Z) ) O.name = "sparkles" O.anchored = 1 O.density = 0 @@ -49,7 +65,9 @@ flick("empdisable",O) spawn(5) del(O) - return 1*/ + + + return 1 return 0 //not in range and not telekinetic diff --git a/code/defines/procs/helpers.dm b/code/defines/procs/helpers.dm index b8797da837..a30f6fa172 100644 --- a/code/defines/procs/helpers.dm +++ b/code/defines/procs/helpers.dm @@ -1470,4 +1470,24 @@ proc/get_opposite(var/checkdir) if(SOUTHEAST) return NORTHWEST if(SOUTHWEST) - return NORTHEAST \ No newline at end of file + return NORTHEAST + +/proc/stringsplit(txt, character) + var + cur_text = txt + last_found = 1 + found_char = findtext(cur_text,character) + list/list = list() + if(found_char) + var/fs = copytext(cur_text,last_found,found_char) + list += fs + last_found = found_char+length(character) + found_char = findtext(cur_text,character,last_found) + while(found_char) + var + found_string = copytext(cur_text,last_found,found_char) + last_found = found_char+length(character) + list += found_string + found_char = findtext(cur_text,character,last_found) + list += copytext(cur_text,last_found,length(cur_text)+1) + return list \ No newline at end of file diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index af87271db8..8b6d29b6b7 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -3,6 +3,49 @@ config_tag = "blob" required_players = 0 + uplink_welcome = "Syndicate Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + var/const/waittime_l = 2000 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 3000 //upper bound on time before intercept arrives (in tenths of seconds) diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 907de549c2..19ceefe907 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -9,6 +9,49 @@ required_players = 1 required_enemies = 1 + uplink_welcome = "Syndicate Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + var changeling_amount const diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 7a4d64d0c0..b4b4f3efce 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -5,6 +5,49 @@ required_players = 20 required_enemies = 2 + uplink_welcome = "Syndicate Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + /datum/game_mode/traitor/changeling/announce() world << "The current game mode is - Traitor+Changeling!" world << "There is an alien creature on the station along with some syndicate operatives out for their own gain! Do not let the changeling and the traitors succeed!" diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index b94c3cab42..2617c957b0 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -39,6 +39,49 @@ var/const/max_cultists_to_start = 4 var/acolytes_survived = 0 + uplink_welcome = "Nar-Sie Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + /datum/game_mode/cult/announce() world << "The current game mode is - Cult!" diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index cfe2d18304..e295150c8a 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -3,6 +3,49 @@ config_tag = "extended" required_players = 0 + uplink_welcome = "Syndicate Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + /datum/game_mode/announce() world << "The current game mode is - Extended Role-Playing!" world << "Just have fun and role-play!" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index 897ab9a981..3fb66ef2b7 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -23,6 +23,9 @@ list/restricted_jobs = list() required_players = 0 required_enemies = 0 + uplink_welcome + uplink_items + uplink_uses /datum/game_mode/proc/announce() //to be calles when round starts world << "Notice: [src] did not define announce()" diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index deff8194d9..c9112b9537 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -15,6 +15,49 @@ var/to_nuke_or_not_to_nuke = 0 var/apcs = 0 //Adding dis to track how many APCs the AI hacks. --NeoFite + uplink_welcome = "Crazy AI Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + /datum/game_mode/malfunction/announce() world << "The current game mode is - AI Malfunction!" diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index cd5dca83d6..a83c13c834 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -7,6 +7,48 @@ var/nometeors = 1 required_players = 0 + uplink_welcome = "EVIL METEOR Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 /datum/game_mode/meteor/announce() world << "The current game mode is - Meteor!" diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index fbd7c5ff47..2629442706 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -8,6 +8,49 @@ required_players = 3 required_enemies = 2 + uplink_welcome = "Corporate Backed Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 40 + var/const/agents_possible = 5 //If we ever need more syndicate agents. var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 750537d11e..57f7e3f642 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -18,6 +18,49 @@ required_players = 3 required_enemies = 3 + uplink_welcome = "Revolutionary Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + var/finished = 0 var/checkwin_counter = 0 var/const/max_headrevs = 3 @@ -130,7 +173,7 @@ if (!where) mob << "The Syndicate were unfortunately unable to get you a flash." else - mob << "The flash in your [where] would help you to use your extremal persuade skill." + mob << "The flash in your [where] would help you to use your extreme persuasion skills." return 1 ////////////////////////////////////// diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 34d4c13f2d..9dff9159ac 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -9,6 +9,49 @@ required_players = 0 required_enemies = 1 + uplink_welcome = "Syndicate Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) var/const/waittime_h = 1800 //upper bound on time before intercept arrives (in tenths of seconds) @@ -163,12 +206,12 @@ killer << "\red Code Phrase: \black [syndicate_code_phrase]" killer.mind.store_memory("Code Phrase: [syndicate_code_phrase]") else - killer << "Unfortunetly, the Syndicate did not provide you with a code phrase." + killer << "Unfortunately, the Syndicate did not provide you with a code phrase." if(prob(80)) killer << "\red Code Response: \black [syndicate_code_response]" killer.mind.store_memory("Code Response: [syndicate_code_response]") else - killer << "Unfortunetly, the Syndicate did not provide you with a code response." + killer << "Unfortunately, the Syndicate did not provide you with a code response." killer << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe." //End code phrase. @@ -215,7 +258,7 @@ traitor_mob << "Your training has allowed you to overcome your clownish nature, allowing you to wield weapons without harming yourself." traitor_mob.mutations &= ~CLUMSY - // find a radio! toolbox(es), backpack, belt, headset + // find a radio! toolbox(es), backpack, belt, headset, pockets var/loc = "" var/obj/item/device/R = null //Hide the uplink in a PDA if available, otherwise radio if (!R && istype(traitor_mob.belt, /obj/item/device/pda)) @@ -248,11 +291,11 @@ R = foo loc = "in the [S.name] on your back" break - if (!R && istype(traitor_mob.slot_l_store, /obj/item/device/pda)) - R = traitor_mob.slot_l_store + if (!R && istype(traitor_mob.l_store, /obj/item/device/pda)) + R = traitor_mob.l_store loc = "in your pocket" - if (!R && istype(traitor_mob.slot_r_store, /obj/item/device/pda)) - R = traitor_mob.slot_r_store + if (!R && istype(traitor_mob.r_store, /obj/item/device/pda)) + R = traitor_mob.r_store loc = "in your pocket" if (!R && traitor_mob.w_uniform && istype(traitor_mob.belt, /obj/item/device/radio)) R = traitor_mob.belt @@ -264,10 +307,10 @@ R = traitor_mob.r_ear loc = "on your head" if (!R) - traitor_mob << "Unfortunately, the Syndicate wasn't able to get you a radio." + traitor_mob << "Unfortunately, the Syndicate wasn't able to get you an uplink." . = 0 else - if (istype(R, /obj/item/device/radio)) + if (istype(R, /obj/item/device/radio) || prob(10)) // generate list of radio freqs var/freq = 1441 var/list/freqlist = list() @@ -279,10 +322,12 @@ freq += 1 freq = freqlist[rand(1, freqlist.len)] - var/obj/item/weapon/syndicate_uplink/T = new /obj/item/weapon/syndicate_uplink(R) + var/obj/item/device/uplink/radio/T = new /obj/item/device/uplink/radio(R) R:traitorradio = T R:traitor_frequency = freq T.name = R.name + T.icon = R.icon + T.w_class = R.w_class T.icon_state = R.icon_state T.origradio = R traitor_mob << "The Syndicate have cunningly disguised a Syndicate Uplink as your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features." @@ -291,7 +336,7 @@ // generate a passcode if the uplink is hidden in a PDA var/pda_pass = "[rand(100,999)] [pick("Alpha","Bravo","Delta","Omega")]" - var/obj/item/weapon/integrated_uplink/T = new /obj/item/weapon/integrated_uplink(R) + var/obj/item/device/uplink/pda/T = new /obj/item/device/uplink/pda(R) R:uplink = T T.lock_code = pda_pass T.hostpda = R @@ -304,11 +349,11 @@ traitor_mob << "\red Code Phrase: \black [syndicate_code_phrase]" traitor_mob.mind.store_memory("Code Phrase: [syndicate_code_phrase]") else - traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code phrase." + traitor_mob << "Unfortunately, the Syndicate did not provide you with a code phrase." if(prob(80)) traitor_mob << "\red Code Response: \black [syndicate_code_response]" traitor_mob.mind.store_memory("Code Response: [syndicate_code_response]") else - traitor_mob << "Unfortunetly, the Syndicate did not provide you with a code response." + traitor_mob << "Unfortunately, the Syndicate did not provide you with a code response." traitor_mob << "Use the code words in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe." //End code phrase. diff --git a/code/game/gamemodes/traitor/traitorinfo.dm b/code/game/gamemodes/traitor/traitorinfo.dm new file mode 100644 index 0000000000..e3f18712e7 --- /dev/null +++ b/code/game/gamemodes/traitor/traitorinfo.dm @@ -0,0 +1,6 @@ +/datum/traitorinfo + var/starting_objective = "" + var/starting_player_count = 0 + var/starting_occupation = "" + var/ckey = "" + var/list/spawnlist = list( ) \ No newline at end of file diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 1d6b3dcea0..04e6726c59 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -8,6 +8,49 @@ required_players = 0 required_enemies = 1 + uplink_welcome = "Wizardly Uplink Console:" + uplink_items = {"Highly Visible and Dangerous Weapons; +/obj/item/weapon/gun/projectile:6:Revolver; +/obj/item/ammo_magazine/a357:2:Ammo-357; +/obj/item/weapon/gun/energy/crossbow:5:Energy Crossbow; +/obj/item/weapon/melee/energy/sword:4:Energy Sword; +/obj/item/weapon/storage/box/syndicate:10:Syndicate Bundle; +/obj/item/weapon/storage/emp_kit:4:5 EMP Grenades; +Whitespace:Seperator; +Stealthy and Inconspicuous Weapons; +/obj/item/weapon/pen/sleepypen:3:Sleepy Pen; +/obj/item/weapon/soap/syndie:1:Syndicate Soap; +/obj/item/weapon/cartridge/syndicate:3:Detomatix PDA Cartridge; +Whitespace:Seperator; +Stealth and Camouflage Items; +/obj/item/clothing/under/chameleon:3:Chameleon Jumpsuit; +/obj/item/clothing/shoes/syndigaloshes:2:No-Slip Syndicate Shoes; +/obj/item/weapon/card/id/syndicate:3:Agent ID card; +/obj/item/clothing/mask/gas/voice:4:Voice Changer; +/obj/item/clothing/glasses/thermal:4:Thermal Imaging Glasses; +/obj/item/device/chameleon:4:Chameleon-Projector; +/obj/item/weapon/stamperaser:1:Stamp Remover; +Whitespace:Seperator; +Devices and Tools; +/obj/item/weapon/card/emag:3:Cryptographic Sequencer; +/obj/item/device/hacktool:4:Hacktool; +/obj/item/weapon/storage/toolbox/syndicate:1:Fully Loaded Toolbox; +/obj/item/weapon/aiModule/syndicate:7:Hacked AI Upload Module; +/obj/item/device/radio/headset/traitor:3:Headset with Binary Translator; +/obj/item/weapon/plastique:2:C-4; +/obj/item/device/powersink:5:Powersink (DANGER!); +/obj/machinery/singularity_beacon/syndicate:7:Singularity Beacon (DANGER!); +Whitespace:Seperator; +Implants; +/obj/item/weapon/storage/syndie_kit/imp_freedom:3:Freedom Implant; +/obj/item/weapon/storage/syndie_kit/imp_compress:5:Compressed Matter Implant; +/obj/item/weapon/storage/syndie_kit/imp_explosive:6:Explosive Implant; +/obj/item/weapon/storage/syndie_kit/imp_uplink:10:Uplink Implant (Contains 5 Telecrystals); +Whitespace:Seperator; +Badassery; +/obj/item/toy/syndicateballoon:10:For showing that You Are The BOSS (Useless Balloon);"} + uplink_uses = 10 + var/finished = 0 var/const/waittime_l = 600 //lower bound on time before intercept arrives (in tenths of seconds) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 0c205ac7fc..685f1eb085 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -7,6 +7,9 @@ #define AIRLOCK_WIRE_OPEN_DOOR 7 #define AIRLOCK_WIRE_AI_CONTROL 8 #define AIRLOCK_WIRE_ELECTRIFY 9 +#define AIRLOCK_WIRE_CRUSH 10 +#define AIRLOCK_WIRE_LIGHT 11 +#define AIRLOCK_WIRE_HOLDOPEN 12 /* New methods: @@ -30,16 +33,16 @@ //This generates the randomized airlock wire assignments for the game. /proc/RandomAirlockWires() //to make this not randomize the wires, just set index to 1 and increment it in the flag for loop (after doing everything else). - var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0) - airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0) - airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0) - airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0) + var/list/wires = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + airlockIndexToFlag = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + airlockIndexToWireColor = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) + airlockWireColorToIndex = list(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0) var/flagIndex = 1 - for (var/flag=1, flag<512, flag+=flag) + for (var/flag=1, flag<4096, flag+=flag) var/valid = 0 while (!valid) - var/colorIndex = rand(1, 9) - if (wires[colorIndex]==0) + var/colorIndex = rand(1, 11) + if (wires[colorIndex] == 0) valid = 1 wires[colorIndex] = flag airlockIndexToFlag[flagIndex] = flag @@ -61,12 +64,14 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. icon_state = "door_closed" var/aiControlDisabled = 0 //If 1, AI control is disabled until the AI hacks back in and disables the lock. If 2, the AI has bypassed the lock. If -1, the control is enabled but the AI had bypassed it earlier, so if it is disabled again the AI would have no trouble getting back in. + var/synDoorHacked = 0 // Has it been hacked? bool 1 = yes / 0 = no + var/synHacking = 0 // Is hack in process y/n? var/secondsMainPowerLost = 0 //The number of seconds until power is restored. var/secondsBackupPowerLost = 0 //The number of seconds until power is restored. var/spawnPowerRestoreRunning = 0 var/welded = null var/locked = 0 - var/wires = 511 + var/wires = 4095 secondsElectrified = 0 //How many seconds remain until the door is no longer electrified. -1 if it is permanently electrified until someone fixes it. var/aiDisabledIdScanner = 0 var/aiHacking = 0 @@ -77,8 +82,11 @@ Airlock index -> wire color are { 9, 4, 6, 7, 5, 8, 1, 2, 3 }. autoclose = 1 var/doortype = 0 var/justzap = 0 + var/safetylight = 1 var/obj/item/weapon/airlock_electronics/electronics = null +/obj/machinery/door/airlock/New() + /obj/machinery/door/airlock/command name = "Airlock" icon = 'Doorcom.dmi' @@ -266,6 +274,12 @@ About the new airlock wires panel: open() else close() + if(AIRLOCK_WIRE_CRUSH) + src.forcecrush = !src.forcecrush + if(AIRLOCK_WIRE_LIGHT) + src.safetylight = !src.safetylight + if(AIRLOCK_WIRE_HOLDOPEN) + src.holdopen = !src.holdopen @@ -350,6 +364,13 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/canAIHack() return ((src.aiControlDisabled==1) && (!src.isAllPowerCut())); +/obj/machinery/door/airlock/proc/canSynControl() + return (src.synDoorHacked && (!src.isAllPowerCut())); + +/obj/machinery/door/airlock/proc/canSynHack(obj/item/device/hacktool/H) + if(in_range(src, usr) && get_dist(src, H) <= 1 && src.synDoorHacked==0 && !src.isAllPowerCut()) + return 1 + /obj/machinery/door/airlock/proc/arePowerSystemsOn() return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) @@ -421,7 +442,7 @@ About the new airlock wires panel: /obj/machinery/door/airlock/update_icon() if(overlays) overlays = null if(density) - if(locked) + if(locked && safetylight) icon_state = "door_locked" else icon_state = "door_closed" @@ -505,6 +526,121 @@ About the new airlock wires panel: if (src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2)) t1 += text("Backup Power Output wire is cut.
\n") + if (src.isWireCut(AIRLOCK_WIRE_CRUSH)) + t1 += text("Airlock extra force wire is cut.
\n") + else if(!src.forcecrush) + t1 += text("Airlock extra force disabled Enable it?
\n") + else + t1 += text("Airlock extra force enabled Disable it?
\n") + + if (src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) + t1 += text("Door bolt drop wire is cut.
\n") + else if (!src.locked) + t1 += text("Door bolts are up. Drop them?
\n", src) + else + t1 += text("Door bolts are down.") + if (src.arePowerSystemsOn()) + t1 += text(" Raise?
\n", src) + else + t1 += text(" Cannot raise door bolts due to power failure.
\n") + + if (src.isWireCut(AIRLOCK_WIRE_ELECTRIFY)) + t1 += text("Electrification wire is cut.
\n") + if (src.secondsElectrified==-1) + t1 += text("Door is electrified indefinitely. Un-electrify it?
\n", src) + else if (src.secondsElectrified>0) + t1 += text("Door is electrified temporarily ([] seconds). Un-electrify it?
\n", src.secondsElectrified, src) + else + t1 += text("Door is not electrified. Electrify it for 30 seconds? Or, Electrify it indefinitely until someone cancels the electrification?
\n", src, src) + + if(src.isWireCut(AIRLOCK_WIRE_LIGHT)) + t1 += "Bolt indication light wire is cut.
\n" + else if(!src.safetylight) + t1 += text("Bolt Indication light is disabled Enable it?
\n") + else + t1 += text("Bolt Indication light is enabled Disable it?
\n") + + if(src.isWireCut(AIRLOCK_WIRE_HOLDOPEN)) + t1 += "Behavior Control light wire is cut.
\n" + else if(!src.holdopen) + t1 += text("Door behavior is set to: Automatically close Toggle?
\n") + else + t1 += text("Door behavior is set to: Wait for clearance to close Toggle?
\n") + + if (src.welded) + t1 += text("Door appears to have been welded shut.
\n") + else if (!src.locked) + if (src.density) + t1 += text("Open door
\n", src) + else + t1 += text("Close door
\n", src) + + t1 += text("

Close

\n", src) + user << browse(t1, "window=airlock") + onclose(user, "airlock") + +//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door +//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door + +/obj/machinery/door/airlock/proc/attack_hack(mob/user as mob, obj/item/device/hacktool/C) + if(!C) + return + if(C.in_use) + user << "We are already hacking another airlock." + return + if (!src.canSynControl() && src.canSynHack(C)) + src.synhack(user, C) + return + + //Separate interface for the hacker. + var/t1 = text("Airlock Control
\n") + if (src.secondsMainPowerLost > 0) + if ((!src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1)) && (!src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2))) + t1 += text("Main power is offline for [] seconds.
\n", src.secondsMainPowerLost) + else + t1 += text("Main power is offline indefinitely.
\n") + else + t1 += text("Main power is online.") + + if (src.secondsBackupPowerLost > 0) + if ((!src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)) && (!src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2))) + t1 += text("Backup power is offline for [] seconds.
\n", src.secondsBackupPowerLost) + else + t1 += text("Backup power is offline indefinitely.
\n") + else if (src.secondsMainPowerLost > 0) + t1 += text("Backup power is online.") + else + t1 += text("Backup power is offline, but will turn on if main power fails.") + t1 += "
\n" + + if (src.isWireCut(AIRLOCK_WIRE_IDSCAN)) + t1 += text("IdScan wire is cut.
\n") + else if (src.aiDisabledIdScanner) + t1 += text("IdScan disabled. Enable?
\n", src) + else + t1 += text("IdScan enabled. Disable?
\n", src) + + if (src.isWireCut(AIRLOCK_WIRE_MAIN_POWER1)) + t1 += text("Main Power Input wire is cut.
\n") + if (src.isWireCut(AIRLOCK_WIRE_MAIN_POWER2)) + t1 += text("Main Power Output wire is cut.
\n") + if (src.secondsMainPowerLost == 0) + t1 += text("Temporarily disrupt main power?.
\n", src) + if (src.secondsBackupPowerLost == 0) + t1 += text("Temporarily disrupt backup power?.
\n", src) + + if (src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER1)) + t1 += text("Backup Power Input wire is cut.
\n") + if (src.isWireCut(AIRLOCK_WIRE_BACKUP_POWER2)) + t1 += text("Backup Power Output wire is cut.
\n") + + if (src.isWireCut(AIRLOCK_WIRE_CRUSH)) + t1 += text("Airlock extra force wire is cut.
\n") + else if(!src.forcecrush) + t1 += text("Airlock extra force disabled Enable it?
\n") + else + t1 += text("Airlock extra force enabled Disable it?
\n") + if (src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) t1 += text("Door bolt drop wire is cut.
\n") else if (!src.locked) @@ -524,6 +660,20 @@ About the new airlock wires panel: else t1 += text("Door is not electrified. Electrify it for 30 seconds? Or, Electrify it indefinitely until someone cancels the electrification?
\n", src, src) + if(src.isWireCut(AIRLOCK_WIRE_LIGHT)) + t1 += "Bolt indication light wire is cut.
\n" + else if(!src.safetylight) + t1 += text("Bolt indication light is disabled Enable it?
\n") + else + t1 += text("Bolt indication light is enabled Disable it?
\n") + + if(src.isWireCut(AIRLOCK_WIRE_HOLDOPEN)) + t1 += "Behavior Control light wire is cut.
\n" + else if(!src.holdopen) + t1 += text("Door behavior is set to: Automatically close Toggle?
\n") + else + t1 += text("Door behavior is set to: Wait for clearance to close Toggle?
\n") + if (src.welded) t1 += text("Door appears to have been welded shut.
\n") else if (!src.locked) @@ -536,10 +686,6 @@ About the new airlock wires panel: user << browse(t1, "window=airlock") onclose(user, "airlock") -//aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door -//aiEnable - 1 idscan, 4 raise door bolts, 5 electrify door for 30 seconds, 6 electrify door indefinitely, 7 open door - - /obj/machinery/door/airlock/proc/hack(mob/user as mob) if (src.aiHacking==0) src.aiHacking=1 @@ -628,7 +774,10 @@ About the new airlock wires panel: "Blue" = 6, "Green" = 7, "Grey" = 8, - "Black" = 9 + "Black" = 9, + "Pink" = 10, + "Brown" = 11, + "Maroon" = 12 ) for(var/wiredesc in wires) var/is_uncut = src.wires & airlockWireColorToFlag[wires[wiredesc]] @@ -644,7 +793,7 @@ About the new airlock wires panel: t1 += "Attach signaler" t1 += "
" - t1 += text("
\n[]
\n[]
\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off.")) + t1 += text("
\n[]
\n[]
\n[]
\n[]
\n[]", (src.locked ? "The door bolts have fallen!" : "The door bolts look up."), ((src.arePowerSystemsOn() && !(stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), (src.aiControlDisabled==0 ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (src.secondsElectrified!=0 ? "The safety light is flashing!" : "The safety light is on."), (src.forcecrush==0 ? "The hydraulics control light is a solid green." : "The hydraulics control light is flashing red.")) t1 += text("

Close

\n", src) @@ -716,9 +865,8 @@ About the new airlock wires panel: src.update_icon() add_fingerprint(usr) src.updateUsrDialog() - else if(istype(usr, /mob/living/silicon)) // unranged silicon interface - //AI - if (!src.canAIControl()) + else //AI or Syndicate using hacktool + if (!src.canAIControl() || (istype(usr.equipped(), /obj/item/device/hacktool/) && (!src.canSynControl() || !in_range(src, usr)))) usr << "Airlock control connection lost!" return //aiDisable - 1 idscan, 2 disrupt main power, 3 disrupt backup power, 4 drop door bolts, 5 un-electrify door, 7 close door @@ -771,6 +919,21 @@ About the new airlock wires panel: close() else usr << text("The airlock is already closed.
\n") + if (8) + if(!src.forcecrush) + usr << text("Door extra force not enabled!
\n") + else + src.forcecrush = 0 + if (9) + if(!src.safetylight) + usr << text("Bolt indication light not enabled!
\n") + else + src.safetylight = 0 + if (10) + if(!src.holdopen) + usr << text("Door Behavior already set to: Wait for clearance to close
\n") + else + src.holdopen = 1 else if (href_list["aiEnable"]) var/code = text2num(href_list["aiEnable"]) @@ -834,6 +997,21 @@ About the new airlock wires panel: // close() else usr << text("The airlock is already opened.
\n") + if (8) + if(src.forcecrush) + usr << text("Door extra force already enabled!
\n") + else + src.forcecrush = 1 + if (9) + if(src.safetylight) + usr << text("Bolt indication light already enabled!
\n") + else + src.safetylight = 1 + if (10) + if(src.holdopen) + usr << text("Door Behavior already set to: Automatically close
\n") + else + src.holdopen = 0 src.update_icon() src.updateUsrDialog() @@ -866,6 +1044,8 @@ About the new airlock wires panel: return src.attack_hand(user) else if (istype(C, /obj/item/device/multitool)) return src.attack_hand(user) + else if (istype(C, /obj/item/device/hacktool)) + return src.attack_hack(user, C) else if (istype(C, /obj/item/device/assembly/signaler)) return src.attack_hand(user) else if (istype(C, /obj/item/weapon/pai_cable)) // -- TLE @@ -980,6 +1160,85 @@ About the new airlock wires panel: ..() return +/obj/machinery/door/airlock/proc/synhack(mob/user as mob, obj/item/device/hacktool/I) + if (src.synHacking==0) + src.synHacking=1 + I.in_use = 1 + spawn(20 ) + user << "Jacking in. Stay close to the airlock or you'll rip the cables out and we'll have to start over." + sleep(25 ) + if (src.canSynControl()) + user << "Hack cancelled, control already possible." + src.synHacking=0 + I.in_use = 0 + return + else if (!src.canSynHack(I)) + user << "\red Connection lost. Stand still and stay near the airlock!" + src.synHacking=0 + I.in_use = 0 + return + user << "Connection established." + sleep(10 ) + user << "Attempting to hack into airlock. This may take some time." + sleep(100 ) + // Alerting the AIs + var/list/cameras = list() + for (var/obj/machinery/camera/C in src.loc.loc.contents) // getting all cameras in the area + cameras += C + + var/alertoption = prob(50) // 50% chance of warning the AI + if(prob(15)) //15% chance of sending the AI all the details (camera, area, warning) + alertoption = 3 + else if (prob(18)) //18% chance of sending the AI just the area + alertoption = 2 + + for (var/mob/living/silicon/ai/aiPlayer in world) + if (aiPlayer.stat != 2) + switch(alertoption) + if(3) aiPlayer.triggerUnmarkedAlarm("AirlockHacking", src.loc.loc, cameras) + if(2) aiPlayer.triggerUnmarkedAlarm("AirlockHacking", src.loc.loc) + if(1) aiPlayer.triggerUnmarkedAlarm("AirlockHacking") + for (var/mob/living/silicon/robot/robotPlayer in world) + if (robotPlayer.stat != 2) + switch(alertoption) + if(2,3) robotPlayer.triggerUnmarkedAlarm("AirlockHacking", src.loc.loc) + if(1) robotPlayer.triggerUnmarkedAlarm("AirlockHacking") + + // ...And done + + if (!src.canSynHack(I)) + user << "\red Hack aborted: landline connection lost. Stay closer to the airlock." + src.synHacking=0 + I.in_use = 0 + return + else if (src.canSynControl()) + user << "Local override already in place, hack aborted." + src.synHacking=0 + I.in_use = 0 + return + user << "Upload access confirmed. Loading control program into airlock software." + sleep(85 ) + if (!src.canSynHack(I)) + user << "\red Hack aborted: cable connection lost. Do not move away from the airlock." + src.synHacking=0 + I.in_use = 0 + return + else if (src.canSynControl()) + user << "Upload access aborted, local override already in place." + src.synHacking=0 + I.in_use = 0 + return + user << "Transfer complete. Forcing airlock to execute program." + sleep(25 ) + //disable blocked control + src.synDoorHacked = 1 + user << "Bingo! We're in. Airlock control panel coming right up." + sleep(5 ) + //bring up airlock dialog + src.synHacking = 0 + I.in_use = 0 + src.attack_hack(user, I) + /obj/machinery/door/airlock/open() if (src.welded || src.locked || (!src.arePowerSystemsOn()) || (stat & NOPOWER) || src.isWireCut(AIRLOCK_WIRE_OPEN_DOOR)) return 0 @@ -1002,6 +1261,8 @@ About the new airlock wires panel: /obj/machinery/door/airlock/New() ..() + if(src.holdopen) + wires -= 2^11 if (src.closeOtherId != null) spawn (5) for (var/obj/machinery/door/airlock/A in machines) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2ba7288c83..b0d76edb76 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -289,14 +289,63 @@ /obj/machinery/door/proc/close() if(density) return 1 - if(src.operating) + if (src.operating) return src.operating = 1 + var/held = 0 + + if(src.holdopen) + while(held == 0) + var/list/objects = locate() in get_turf(src) + for(var/obj/T in objects) + if(T.anchored) + held = 1 + break + for(var/mob/T in objects) + held = 1 + break + sleep(150) animate("closing") src.density = 1 - src.layer = 3.1 - sleep(10) + spawn(4) + if(!istype(src, /obj/machinery/door/window)) + for(var/mob/living/L in src.loc) // Crush mobs and move them out of the way + + if(src.forcecrush) // Save an AI, crush a limb + var/limbname = pick("l arm", "r arm", "l hand","r hand", "l foot", "r foot") + var/limbdisplay + + for(var/organ in L:organs) + var/datum/organ/external/temp = L:organs["[organ]"] + if (istype(temp, /datum/organ/external) && temp.name == limbname) + limbdisplay = temp.display_name // Take the name for down below + temp.take_damage(60, 0) //OH GOD IT HURTS + break + + L << "\red The airlock crushes your [limbdisplay]!" + for(var/mob/O in viewers(L, null)) + O.show_message("\red The airlock crushes [L.name]'s [limbdisplay]!", 1) + + + else + L << "\red The airlock forces you out of the way!" //Lucky you + for(var/mob/O in viewers(L, null)) + O.show_message("\red The airlock pushes [L.name] out of the way!", 1) + + var/list/lst = list(NORTH,SOUTH,EAST,WEST) + var/turf/T = get_random_turf(L, lst) + if(T) + L.loc = T + + for(var/obj/item/I in src.loc) // Move items out of the way + if(!I.anchored) + var/list/lst = list(NORTH,SOUTH,EAST,WEST) + var/turf/T = get_random_turf(I, lst) + if(T) + I.loc = T + + sleep(6) update_icon() if(src.visible && (!src.glass)) diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index d6197dd8a0..efb4bdd0c4 100644 --- a/code/game/objects/devices/PDA/PDA.dm +++ b/code/game/objects/devices/PDA/PDA.dm @@ -32,7 +32,7 @@ var/cart = "" //A place to stick cartridge menu information var/over_jumpsuit = 1 // If set to 0, it won't display on top of the mob's jumpsuit - var/obj/item/weapon/integrated_uplink/uplink = null + var/obj/item/device/uplink/pda/uplink = null var/obj/item/weapon/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both. var/ownjob = null //related to above diff --git a/code/game/objects/devices/PDA/uplink.dm b/code/game/objects/devices/PDA/uplink.dm deleted file mode 100644 index bca3ca79c1..0000000000 --- a/code/game/objects/devices/PDA/uplink.dm +++ /dev/null @@ -1,245 +0,0 @@ -/obj/item/weapon/integrated_uplink - name = "uplink module" - desc = "An electronic uplink system of unknown origin." - icon = 'module.dmi' - icon_state = "power_mod" - var/uses = 10 - var/obj/item/device/pda/hostpda = null - var/orignote = null //Restore original notes when locked. - var/active = 0 //Are we currently active?? - var/menu_message = "" - var/lock_code = "password" //What's the password? - -//Communicate with traitor through the PDA's note function. -/obj/item/weapon/integrated_uplink/proc/print_to_host(var/text) - if (isnull(hostpda)) - return - hostpda.note = text - - for (var/mob/M in viewers(1, hostpda.loc)) - if (M.client && M.machine == hostpda) - hostpda.attack_self(M) - - return - -//Let's build a menu! -/obj/item/weapon/integrated_uplink/proc/generate_menu() - menu_message = "Syndicate Uplink Console:
" - menu_message += "Tele-Crystals left: [uses]
" - menu_message += "
" - menu_message += "Request item:
" - menu_message += "Each item costs a number of tele-crystals as indicated by the number following their name.
" - menu_message += "
" - menu_message += "Revolver (6)
" - menu_message += "Ammo-357 for use with Revolver (2)
" - menu_message += "Ammo-418 for use with Revolver (3)
" - menu_message += "Energy Crossbow (5)
" - menu_message += "Energy Sword (4)
" - menu_message += "
" - menu_message += "Chameleon Jumpsuit (3)
" - menu_message += "Syndicate Shoes (2)
" - menu_message += "Syndicate Card (3)
" - menu_message += "Voice-Changer (4)
" - menu_message += "Thermal Glasses (4)
" - menu_message += "Stamp Remover (1)
" //Allows doccuments to be de-stamped - menu_message += "
" - menu_message += "Freedom Implant (with injector) (3)
" - menu_message += "Uplink Implant (5 crystals inside) (10)
" -// menu_message += "Paralysis Pen (3)
" -//When given the choice, people have been P2W - menu_message += "Sleepy Pen (4)
" //Terrible -Pete. - menu_message += "
" - menu_message += "Explosive Implant (with injector) (6)
" - menu_message += "Detomatix Cartridge (3)
" - menu_message += "Plastic Explosives (2)
" - menu_message += "Power Sink (5)
" - menu_message += "Syndicate-made Space Suit (inludes a helmet) (3)
" - menu_message += "
" - menu_message += "Chameleon-projector (4)
" -// menu_message += "Cloaking Device (4)
" - menu_message += "Electromagnet Card (3)
" - menu_message += "5 EMP Grenades (4)
" - menu_message += "
" - menu_message += "Binary Translator (3)
" - menu_message += "Hacked AI Module (7)
" - menu_message += "
" - menu_message += "Singularity Beacon (does not include a screwdriver) (7)
" - menu_message += "
" - menu_message += "Syndicate Toolbox (Includes various tools) (1)
" - menu_message += "Syndicate Soap (1)
" - menu_message += "Syndicate Balloon (Useless) (10)
" - menu_message += "
" - menu_message += "Syndicate Bundle (Contains an assorted selection of syndicate items)(10)
" - - menu_message += "
" - return - -/obj/item/weapon/integrated_uplink/proc/unlock() - if ((isnull(hostpda)) || (active)) - return - - orignote = hostpda.note - active = 1 - hostpda.mode = 1 //Switch right to the notes program - - generate_menu() - print_to_host(menu_message) - return - -/obj/item/weapon/integrated_uplink/Topic(href, href_list) - if ((isnull(hostpda)) || (!active)) - return - - if (usr.stat || usr.restrained() || !in_range(hostpda, usr)) - return - - if (href_list["buy_item"]) - switch(href_list["buy_item"]) - if("revolver") - if (uses >= 6) - uses -= 6 - new /obj/item/weapon/gun/projectile(get_turf(hostpda)) - if("revolver_ammo") - if (uses >= 2) - uses -= 2 - new /obj/item/ammo_magazine/a357(get_turf(hostpda)) - if("suffocation_revolver_ammo") - if (uses >= 3) - uses -= 3 - new /obj/item/ammo_magazine/a418(get_turf(hostpda)) - if("xbow") - if (uses >= 5) - uses -= 5 - new /obj/item/weapon/gun/energy/crossbow(get_turf(hostpda)) - if("empbox") - if (uses >= 4) - uses -= 4 - new /obj/item/weapon/storage/emp_kit(get_turf(hostpda)) - if("voice") - if (uses >= 4) - uses -= 4 - new /obj/item/clothing/mask/gas/voice(get_turf(hostpda)) - if("jump") - if (uses >= 3) - uses -= 3 - new /obj/item/clothing/under/chameleon(get_turf(hostpda)) - if("shoes") - if (uses >= 2) - uses -= 2 - new /obj/item/clothing/shoes/syndigaloshes(get_turf(hostpda)) - if("card") - if (uses >= 3) - uses -= 3 - new /obj/item/weapon/card/id/syndicate(get_turf(hostpda)) - if("emag") - if (uses >= 3) - uses -= 3 - new /obj/item/weapon/card/emag(get_turf(hostpda)) - if("imp_freedom") - if (uses >= 3) - uses -= 3 - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(hostpda)) - O.imp = new /obj/item/weapon/implant/freedom(O) - O.update() - if("imp_uplink") - if (uses >= 10) - uses -= 10 - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(hostpda)) - O.imp = new /obj/item/weapon/implant/uplink(O) - O.update() - if("imp_exp") - if (src.uses >= 6) - src.uses -= 6 - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(hostpda)) - O.imp = new /obj/item/weapon/implant/explosive(O) - O.name = "(BIO-HAZARD) BIO-detpack" - O.update() - if("sleepypen") - if (uses >= 4) - uses -= 4 - new /obj/item/weapon/pen/sleepypen(get_turf(hostpda)) - if("paralysispen") - if (uses >= 3) - uses -= 3 - new /obj/item/weapon/pen/paralysis(get_turf(src)) - if("projector") - if (uses >= 4) - uses -= 4 - new /obj/item/device/chameleon(get_turf(hostpda)) - /*if("cloak") - if (uses >= 4) - uses -= 4 - new /obj/item/weapon/cloaking_device(get_turf(hostpda))*/ - if("thermal") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/clothing/glasses/thermal(get_turf(src)) - if("sword") - if (uses >= 4) - uses -= 4 - new /obj/item/weapon/melee/energy/sword(get_turf(hostpda)) - if("bomb") - if (uses >= 2) - uses -= 2 - new /obj/item/weapon/plastique(get_turf(hostpda)) - if("powersink") - if (uses >= 5) - uses -= 5 - new /obj/item/device/powersink(get_turf(hostpda)) - if("detomatix") - if (uses >= 3) - uses -= 3 - new /obj/item/weapon/cartridge/syndicate(get_turf(hostpda)) - if("space") - if (uses >= 3) - uses -= 3 - new /obj/item/clothing/suit/space/syndicate(get_turf(hostpda)) - new /obj/item/clothing/head/helmet/space/syndicate(get_turf(hostpda)) - if("lawmod") - if (uses >= 7) - uses -= 7 - new /obj/item/weapon/aiModule/syndicate(get_turf(hostpda)) - if("botchat") - if (uses >= 3) - uses -= 3 - new /obj/item/device/radio/headset/traitor(get_turf(hostpda)) - if("singubeacon") - if(uses >= 7) - uses -= 7 - new /obj/machinery/singularity_beacon/syndicate(get_turf(hostpda)) - if("toolbox") - if(uses) - uses-- - new /obj/item/weapon/storage/toolbox/syndicate(get_turf(hostpda)) - if("soap") - if(uses) - uses-- - new /obj/item/weapon/soap/syndie(get_turf(src)) - if("balloon") - if(uses >= 10) - uses -= 10 - new /obj/item/toy/syndicateballoon(get_turf(hostpda)) - if("bundle") - if(uses >= 10) - uses -= 10 - new /obj/item/weapon/storage/box/syndicate(get_turf(hostpda)) - if("eraser") - if(uses >= 1) - uses -= 1 - new /obj/item/weapon/stamperaser(get_turf(hostpda)) - - generate_menu() - print_to_host(menu_message) - return - - return - -/obj/item/weapon/integrated_uplink/proc/shutdown_uplink() - if (isnull(src.hostpda)) - return - active = 0 - hostpda.note = orignote - if (hostpda.mode==1) - hostpda.mode = 0 - hostpda.updateDialog() - return \ No newline at end of file diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 9283f50e04..605ae867b5 100644 --- a/code/game/objects/items/weapons/implants/implant.dm +++ b/code/game/objects/items/weapons/implants/implant.dm @@ -38,12 +38,12 @@ desc = "Summon things." var activation_emote = "chuckle" - obj/item/weapon/syndicate_uplink/uplink = null + obj/item/device/uplink/radio/uplink = null New() activation_emote = pick("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") - uplink = new /obj/item/weapon/syndicate_uplink/implanted(src) + uplink = new /obj/item/device/uplink/radio/implanted(src) ..() return @@ -290,4 +290,38 @@ the implant may become unstable and either pre-maturely inject the subject or si implanted(mob/source as mob) mobname = source.real_name - processing_objects.Add(src) \ No newline at end of file + processing_objects.Add(src) + +/obj/item/weapon/implant/compressed + name = "compressed matter implant" + desc = "*fwooomp*" + var/activation_emote = "sigh" + var/obj/item/scanned = null + + get_data() + var/dat = {" +Implant Specifications:
+Name: NanoTrasen \"Profit Margin\" Class Employee Lifesign Sensor
+Life: Activates upon death.
+Important Notes: Alerts crew to crewmember death.
+
+Implant Details:
+Function: Contains a compact radio signaler that triggers when the host's lifesigns cease.
+Special Features: Alerts crew to crewmember death.
+Integrity: Implant will occasionally be degraded by the body's immune system and thus will occasionally malfunction."} + return dat + + trigger(emote, mob/source as mob) + if (src.scanned == null) + return 0 + + if (emote == src.activation_emote) + source << "The air glows as \the [src.scanned.name] uncompresses." + var/turf/t = get_turf(source) + src.scanned.loc = t + del src + + implanted(mob/source as mob) + src.activation_emote = input("Choose activation emote:") in list("blink", "blink_r", "eyebrow", "chuckle", "twitch_s", "frown", "nod", "blush", "giggle", "grin", "groan", "shrug", "smile", "pale", "sniff", "whimper", "wink") + source.mind.store_memory("Freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate.", 0, 0) + source << "The implanted freedom implant can be activated by using the [src.activation_emote] emote, say *[src.activation_emote] to attempt to activate." \ 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 0d4d7543e7..90dff280ec 100644 --- a/code/game/objects/items/weapons/implants/implanter.dm +++ b/code/game/objects/items/weapons/implants/implanter.dm @@ -80,4 +80,39 @@ src.imp = new /obj/item/weapon/implant/explosive( src ) ..() update() - return \ No newline at end of file + return + +/obj/item/weapon/implanter/compressed + name = "implanter-compressed" + icon_state = "cimplanter0" + + New() + src.imp = new /obj/item/weapon/implant/compressed( src ) + ..() + update() + return + + update() + if (src.imp) + var/obj/item/weapon/implant/compressed/c = src.imp + if(!c.scanned) + src.icon_state = "cimplanter0" + else + src.icon_state = "cimplanter1" + else + src.icon_state = "cimplanter2" + return + + attack(mob/M as mob, mob/user as mob) + var/obj/item/weapon/implant/compressed/c = src.imp + if (c.scanned == null) + user << "Please scan an object with the implanter first." + return + ..() + + afterattack(atom/A, mob/user as mob) + if(istype(A,/obj/item)) + var/obj/item/weapon/implant/compressed/c = src.imp + c.scanned = A + A.loc.contents.Remove(A) + src.update() \ No newline at end of file diff --git a/code/game/objects/items/weapons/uplinks.dm b/code/game/objects/items/weapons/uplinks.dm deleted file mode 100644 index 7d6d03fa97..0000000000 --- a/code/game/objects/items/weapons/uplinks.dm +++ /dev/null @@ -1,255 +0,0 @@ -/* -CONTAINS: -SYNDICATE UPLINK -*/ - -/obj/item/weapon/syndicate_uplink/implanted - uses = 5 - -/obj/item/weapon/syndicate_uplink/proc/explode() - var/turf/location = get_turf(src.loc) - if(location) - location.hotspot_expose(700,125) - - explosion(location, 0, 0, 2, 4) - - del(src.master) - del(src) - return - -/obj/item/weapon/syndicate_uplink/attack_self(mob/user as mob) - interact(user) - -/obj/item/weapon/syndicate_uplink/proc/interact(mob/user as mob) - currentUser = user - user.machine = src - var/dat - if (src.selfdestruct) - dat = "Self Destructing..." - else - if (src.temp) - dat = "[src.temp]

Clear" - else - dat = "Syndicate Uplink Access:
" - dat += "Tele-Crystals left: [src.uses]
" - dat += "
" - dat += "Request item:
" - dat += "Each item costs a number of tele-crystals as indicated by the number following their name.
" - dat += "
" - dat += "Revolver (6)
" - dat += "Ammo-357 for use with Revolver (2)
" - dat += "Energy Crossbow (5)
" - dat += "Energy Sword (4)
" - dat += "
" - dat += "Chameleon Jumpsuit (3)
" - dat += "Syndicate Shoes (2)
" - dat += "Syndicate Card (3)
" - dat += "Voice-Changer (4)
" - dat += "Thermal Glasses (4)
" - dat += "Stamp Remover (1)
" - dat += "
" - dat += "Freedom Implant (with injector) (3)
" -// dat += "Paralysis Pen (3)
" //Note that this goes to the updated sleepypen now. - dat += "Sleepy Pen (4)
" //Terrible -Pete. //Reinstated -Skymarshal - dat += "
" - dat += "Explosive Implant (with injector) (6)
" - dat += "Detomatix Cartridge (3)
" - dat += "Plastic Explosives (2)
" - dat += "Power Sink (5)
" - dat += "Syndicate-made Space Suit (inludes a helmet) (3)
" - dat += "
" - dat += "Chameleon-projector (4)
" -// dat += "Cloaking Device (4)
" - dat += "Electromagnet Card (3)
" - dat += "5 EMP Grenades (4)
" - dat += "
" - dat += "Binary Translator (3)
" - dat += "Hacked AI Module (7)
" - dat += "
" - dat += "Syndicate Toolbox (Includes various tools) (1)
" - dat += "Syndicate Soap (1)
" - dat += "Syndicate Balloon (Useless) (10)
" - dat += "
" - if (src.origradio) - dat += "Lock
" - dat += "
" - dat += "Self-Destruct" - user << browse(dat, "window=radio") - onclose(user, "radio") - return - -/obj/item/weapon/syndicate_uplink/Topic(href, href_list) - ..() - if(!currentUser) - return - if (currentUser.stat || currentUser.restrained()) - return - if (!( istype(currentUser, /mob/living/carbon/human))) - return - if ((currentUser.contents.Find(src) || (in_range(src, currentUser) && istype(src.loc, /turf))) || istype(src,/obj/item/weapon/syndicate_uplink/implanted)) - currentUser.machine = src - if (href_list["buy_item"]) - switch(href_list["buy_item"]) - if("revolver") - if (src.uses >= 6) - src.uses -= 6 - new /obj/item/weapon/gun/projectile(get_turf(src)) - if("revolver_ammo") - if (src.uses >= 2) - src.uses -= 2 - new /obj/item/ammo_magazine/a357(get_turf(src)) - if("xbow") - if (src.uses >= 5) - src.uses -= 5 - new /obj/item/weapon/gun/energy/crossbow(get_turf(src)) - if("empbox") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/weapon/storage/emp_kit(get_turf(src)) - if("voice") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/clothing/mask/gas/voice(get_turf(src)) - if("jump") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/clothing/under/chameleon(get_turf(src)) - if("shoes") - if (uses >= 2) - uses -= 2 - new /obj/item/clothing/shoes/syndigaloshes(get_turf(src)) - if("card") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/weapon/card/id/syndicate(get_turf(src)) - if("emag") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/weapon/card/emag(get_turf(src)) - if("imp_freedom") - if (src.uses >= 3) - src.uses -= 3 - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(src)) - O.imp = new /obj/item/weapon/implant/freedom(O) - if("imp_exp") - if (src.uses >= 6) - src.uses -= 6 - var/obj/item/weapon/implanter/O = new /obj/item/weapon/implanter(get_turf(src)) - O.imp = new /obj/item/weapon/implant/explosive(O) - O.name = "(BIO-HAZARD) BIO-detpack" - O.update() - if("sleepypen") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/weapon/pen/sleepypen(get_turf(src)) - if("paralysispen") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/weapon/pen/paralysis(get_turf(src)) - if("projector") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/device/chameleon(get_turf(src)) - if("lawmod") - if (src.uses >= 7) - src.uses -= 7 - new /obj/item/weapon/aiModule/syndicate(get_turf(src)) -/* if("cloak") - if (src.uses >= 4) - if (ticker.mode.config_tag!="nuclear" || \ - (input(currentUser,"Spawning a cloak in nuke is generally regarded as entirely dumb, are you sure?") in list("Confirm", "Abort")) == "Confirm" \ - ) - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/weapon/cloaking_device(get_turf(src)) */ - if("sword") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/weapon/melee/energy/sword(get_turf(src)) - if("thermal") - if (src.uses >= 4) - src.uses -= 4 - new /obj/item/clothing/glasses/thermal(get_turf(src)) - if("bomb") - if (src.uses >= 2) - src.uses -= 2 - new /obj/item/weapon/plastique(get_turf(src)) - if("powersink") - if (src.uses >= 5) - src.uses -= 5 - new /obj/item/device/powersink(get_turf(src)) - if("detomatix") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/weapon/cartridge/syndicate(get_turf(src)) - if("space") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/clothing/suit/space/syndicate(get_turf(src)) - new /obj/item/clothing/head/helmet/space/syndicate(get_turf(src)) - if("botchat") - if (src.uses >= 3) - src.uses -= 3 - new /obj/item/device/radio/headset/traitor(get_turf(src)) - if("toolbox") - if(uses) - uses-- - new /obj/item/weapon/storage/toolbox/syndicate(get_turf(src)) - if("soap") - if(uses) - uses-- - new /obj/item/weapon/soap/syndie(get_turf(src)) - if("balloon") - if (src.uses >= 10) - uses -= 10 - new /obj/item/toy/syndicateballoon(get_turf(src)) - else if (href_list["lock"] && src.origradio) - // presto chango, a regular radio again! (reset the freq too...) - shutdown_uplink() - return - else if (href_list["selfdestruct"]) - src.temp = "Self-Destruct" - else if (href_list["selfdestruct2"]) - src.selfdestruct = 1 - spawn (100) - explode() - return - else - if (href_list["temp"]) - src.temp = null - if (istype(src.loc, /mob)) - interact(src.loc) - else - for(var/mob/M in viewers(1, src)) - if (M.client) - interact(M) - return - -/obj/item/weapon/syndicate_uplink/proc/shutdown_uplink() - if (!src.origradio) - return - var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) - if (M.client && M.machine == src) - M << browse(null, "window=radio") - M.machine = null - - var/obj/item/device/radio/T = src.origradio - var/obj/item/weapon/syndicate_uplink/R = src - var/mob/L = src.loc - R.loc = T - T.loc = L - // R.layer = initial(R.layer) - R.layer = 0 - if (istype(L)) - if (L.client) - L.client.screen -= R - if (L.r_hand == R) - L.u_equip(R) - L.r_hand = T - else - L.u_equip(R) - L.l_hand = T - T.layer = 20 - T.set_frequency(initial(T.frequency)) - return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 56b126aa78..7f7d75a6cf 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -354,6 +354,41 @@ reset_view(C) return 1 +/mob/living/silicon/ai/proc/triggerUnmarkedAlarm(var/class, area/A, var/O) + if(stat == 2) // stat = 2 = dead AI + return 1 + var/obj/machinery/camera/C = null + var/list/CL = null + var/alarmtext = "" + if(class == "AirlockHacking") // In case more unmarked alerts would be added eventually; + alarmtext = "--- Unauthorized remote access detected" + if (O && istype(O, /list)) + CL = O + if (CL.len == 1) + C = CL[1] + else if (O && istype(O, /obj/machinery/camera)) + C = O + if (A) + alarmtext += " in " + A.name + if (O) + if (C && C.status) + alarmtext += text("! ([])", src, C, C.c_tag) + else if (CL && CL.len) + var/foo = 0 + var/dat2 = "" + for (var/obj/machinery/camera/I in CL) + dat2 += text("[][]", (!foo) ? "" : " | ", src, I, I.c_tag) + foo = 1 + alarmtext += text("! ([])", dat2) + else + alarmtext += "! (No Camera)" + else + alarmtext += "! (No Camera)" + else + alarmtext += "!" + src << alarmtext + return 1 + /mob/living/silicon/ai/triggerAlarm(var/class, area/A, var/O, var/alarmsource) if (stat == 2) return 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 2f683a56bb..62331f8276 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -293,6 +293,17 @@ return return +/mob/living/silicon/robot/proc/triggerUnmarkedAlarm(var/class, area/A) + if(stat == 2) // stat = 2 = dead Cyborg + return 1 + var/alarmtext = "" + if(class == "AirlockHacking") // In case more unmarked alerts would be added eventually; + alarmtext = "--- Unauthorized remote access detected" + if (A) + alarmtext += " in " + A.name + alarmtext += "!" + src << alarmtext + return 1 /mob/living/silicon/robot/triggerAlarm(var/class, area/A, var/O, var/alarmsource) if (stat == 2) diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index f02a7f7ac26bb9b86931f46b96be18a6d0b5f907..fc8bfaa4f71fef720bc4fb50547ee851197fc6bc 100644 GIT binary patch delta 5122 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 SHVeT9qMu@K><1d delta 4936 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 diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 9c324cb55c400ffc920227bc5b644c2c54c2c72b..9d3778ef16b89cb0c36d3bbb443347e3fc8e896b 100644 GIT binary patch delta 41848 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 delta 41958 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

L0Gax;0U9%P;$eg*6}NoBro}9-a*dDyN18pA>L% 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 delta 17383 zcmc$__dnI)8$bR!_KXlBdykBSvJMg=NeNlUNJRF^I)2Hu2XA|?XC6M! z+}!}+#m9`~Hn)#5jFJ7jEGAw;qd(jVt?P_A9|h@J!wh!I-i%E+ZOum4qCcbzUKyR=X6PLhc^ID0%z zJm^-^aWs&{U#EF~!y>1(rc!`_AZ-OO#TQ>7CX!$ijb zh0V~uVp@wgAG__8qz5Xz3Oq7YaLiAyU73}U(LTi9iCn&y;KnZgdMa&qM0xq=S{eRl zz@OKTqx9dd*8I`x*B?ZtKeT7B&Qr200Dtb@Y!Hd$vm8*Br8A zMhW9V;Q$EvWMr)Vd3u5;e3VPU z;er`8sbqP^*+YN`kWuqZTRvGrN{XP3!)9gDo>7U&Q<5&E)5Yjq~_>07@DC{b8UK)p0fQb!S-ZT%dl^ zgY1cp`;U!6-%ps;_R^o8o_;xez1co$NHs`NYM^e{2!g@E-)GO>zh?*39UStib~<91 z3q@eEnCJ7&vu+`)({7|daM0HKDz{b?tdP?7EcS?5v#Q;mIY9-}-O(|DkLl>>$bM90 zaswo&DEX}Mjxvs@a|bKU`=!rj=|Yd+8vbJ7`Sfy4;1WdUd0Bc|B)EQAEMVLTVAev zMPvaXojEeH{2I}J(BIcb0elpds8k)BAfiV2)1Fr|kI-g%no=RRu#uy~dIXb-~7%|9RIdrH++0`{LQ zZpI);Zv#xsZ;wi&SWe{}g8`OHut}<)3=_z$b?+|$!Ly@hGc%Tt5*hG|=#w-+TtZ^I z3%}W0+Z{I<3o0v4Nv9xTx_JxUrOkyO;1ka3fgf9n7P4--q>P{7T~Ee;TGTT=v+uIO zpB(`xwU9F^S~jV}bxJXEP@RU5Wlo?ozUhvg^pEXlizm`N<{|lT3w5%m1}ywpsZ_&q zJ$_eBwYRq?Dj|`?&C?%D0W65C=jP|rI+OFAwNIl#Pj)A3>&(1w-~PDOlxD81u3Avg zvD+w4kK9GJnvf`pV>q|LkUcvfL2qtwbTqo8#BZwPSA_%cTp+Q-b@fjsR~Zp)N)SGU zr+*MFPKCFe{OjsIB5nwrR*Dl5t;n|+%nOyXwVe0Y9B8;h4vq33pOP*$+yQ}suMb5= zXS_gSR$(FC5oZWtaqYyM^k+{`Wo}*`we~0pM_Ady4ZdHZV2f4b^SlL$v+b$8b(xb{f|s*JwU@aF1yQ&sWpN*~msXDs`Kn8UJ83q4a+2oon19F9ET1*#WaswdTg2|} z4@+@O#F<(!Qt`_(ewEEEgZZrlZ#~)oc;E=@a&Qmy>Z_p52%&C8H`MK2H*Fh z%}8aFi0gNfJeE4BAycDm^`!@#=m_96zPf6gjy!~74s&aT2PXJ=W9xCSf`pOyDX1Vf zSi(B+Wbz?^(uoXyS;znffG1tJn>H=F1_tyd-^@bO#)=1nJ84EnMkbn&-2x}ms)dh9 zst?9TvI7qO9dfRt2Q(hF7`A{bQdSMEY46vrAJponN;PkFxd-}eMwZsNw&zQY4fCiG zUedCepB=6X2nq`FDl2nBmIzcjN^rbPQg})SEWFj>*6{R{#jT^P>O4LBer75(lYE*fQ5c6xqUDD|qfO~GgY#yl-2+}upFK;4B=U*vv z*CPTU&FO)dvr8gCIpvg98Qg1y%Dm=zjQ47vSPJ&Xt@fzpaC*)eigY|B!_t&X>1c;R z3jrzX0eLT~2Tb>MwY4LMg*b3W_HnMlW$Y90c6UEwPip(0h5Czn&thj)MnR;(%r3|lpky#Ro^#3*W(cP_1ebS%afLUH% z9tw_WmhqWLdwg?W)#!n_x;YkKPga(8i*cR7y=5tgB&d<^dx}39Y4Yp~%bxVN1Mc6l z7(c72&9Y=NYU*NIZL=d7?H;@bsQ5Z^Wnhe&(RXY~lB^jelGMd$l923FAaBH;UyPe3 z)n0@lb!%2Sb3x1`9+2@`(bb^C1q1}J3d1y`TgoUHmt?3J{9(KAoS6*i#LK zpU0KpD=II_cKngo8hOfEBvMD6FYO;3TourXV*#ew1f`|p{a5&HHS~6hNPy>ez&?^2 zivCFUi=mX8o4yD7_rR#-fepp{)cJhnu)K2@F^3*9{j*`Huh0DZ_iq`G1@#Vvnb)x}(N!L+skFaciWGXYGt1d%9Wt6gq{J_78vY7-#7K&OzV#!P94kZL zii)NJT8|@J;r+c>QapX#K51)JGLkk0~@17 zFCiaq0W36~%q6A4S2n9Vwg_Jg()s!LG{jFEp?evRI80(-)2W^V*&0J$0Ri<@*73Yr zU`svDZdd=_z2mwJGupW_TT-=~$5NjMLy<3E7yuTvZk=Pr7I~6_Jk)Yf1ncAnWgB?_ zZntJ;aLolP;tuz^a3cAt4b1%7fs(qK=jtXg(hMi=|LvKmdd4iQiodRB_;FxHr{xr9 zF_cvq-OGIv!X9eK^IUR-g_RYOtqpX;E-l$XqtVxpIW`^7KD&DMZb=q)?ydh9M*^#- ze)aD7Yta!f6jDj3ls6pmdW;Hh06>zPpagxQ%9!N(Yk1I~XMlRwW*3HmTZIZ(8!Jxd zL(1+-k701Nxp2oj5@qgZqLPwYN8WN}wR!jxe7E=NeayxcI*>>0O0}$r$NW!=^7Z*{ z`MvQ!0hgpz)M$n`LIY}^zIbC@P4QALbGQ>xYb)31i;fGpm=L!Zqe^-IhRUdW%V#6? zq6$_%H8pMr2Zy2ML%9_Wf67K$$>gI?Vz;|JQA7)5KWV2DqawPm z-ZPkOTk7Zb<^XfFEnUsL&GkqEPa)BxC47AW6qMoU-BFh&=H_R0y_&HE)aRQ+@&vP^ z5GxI@yt03&t^Xu7^KqbLDZZ-Vlc!`LbC1B?l-nwyW<8#h>PFx>L3e(io84v_h{v8# zte7SPOUui7eTJ=Lm&F~`Efv>KkN3mZM!qI3k?xLy=N{T@xUqJJU=(z`&^=iRTLTGx zf21gmud9^k?>5w%N4J>vKX+u@V zxwWZoGL^aX!v{)Fm>U#e@3vHj%t+>g$O7Y4uTQl+ovnVrWLCLjp0Ta|#5kD+Barji z=Y)adIu#FylLfMM;<+c9f@=TW>%IfVl_=e^x3}Mp)YLKcyYFh8cp3M~8GyoDw{PWB z+xsRdRg$ZlM;4w?IMI)HPDS0$x{ObivigCQzk>;`b!8cNHBYLpfI`;%on7*?FtW7# z_A8-P-et^8o1RA~`Fd5GMP%u4^%)Nf!6=6;`xArBU-|}YqwnUw5z6e7(-Uxenhhum zI&quDHTU_LVzE3s$lKJ}U%pW2EBUDRhLJnXeZT4K?7U^&viugi%{?jw8y^|5>3nsm z;Oke}3~+m@I;E=W`lq_OiDf@?LlWk28DMrA8Qul|Z3fo5&E5?lX!mmpMN@-W=}e*p#K3=V&zx5s;T%C$O~$|mt` zk-SvVuV3E^2)Nnz%|K)Nt;L$+SCB}+uMOrzl^{P$aWkvCxs`NI3nl0iYPP&=ed&1!=m?ycK-L_}b#oz@uK;6`l1091^LednX&OY&l5`(G?zO_CO4 z2W{I)4euHUqm8ewA;+cZj?(eC7&H_)J~Me*1zirIinKdEV7Sd9f`UffmfAR66g!FU zP<~78Kj3Z$-{Y#SjkpVWVE}b?z5k9s_Ed(Sgh7c+qj-nni649~qad>-cb<&U31ZU$ zAc=s{xrGeU#)ufC2})XjH}lQv0m%{)v4y-8&B-&SFF9$CVL;9JxIG67cJbm+1#4}z zTw@kSXSUh3)qZx3;bF_NyFqg>TJ>b%m#qDD{OslJaguy8UIrwQr_H_qC6 zd0iVC8X^P3vmsHzKMzP0a^P358nFAIo7@mYOl3cyJ|IrTx$QpuB^G3D^qnUoyZ*Fp zW#vh{^0V<0F2JTek{+`%(HN~w`RGF57IGKwvuI32WiT%%S4nK}MmGh2@ zh~*ECcm(lXr|z3mmjK37+(F&`ZwUZpAH`7g_5Mo#&k)$;y7cCbDQ7-enGpWw>xnJT z`KXJS!?vy=H(OgiCMJ++t43N%O54k;f`!Z;^rbJH-zTE}?1*Gu#&@uPI$8K6g_tHB znb56`U08b>q?$*xVuvnh^zuIOBf5*IxE9Pmhl*!v(-Ozu!qjzj;$-k^14o z`d+2~W73I4!bhRv*5;-nC?xrEDlGG&CU$0JrAgkKFno&!z)Zb5^7beO9oIk9Gm85r z&(BUg$@Bkl`x6v&^!7B#b~`dj)!RMS))7XQubv&Xszlj~ZhbD9=e*VRUEr|ZzhU^y z-M{Ij{N#xD}$zkQQzd&smqLALS}@~I@izoQ)~a?P8A z@3`())sPLoo4Otvt=7Ff&?60ZJe5_+OX4YGAk3#C#fn?jQK&=Hf=i8J7aS%-In2I zF{0A*wG>jI4>5NvEwv2(5|OXCDd3J}OU*j%L|^xOmz-=f_dQ@vF?kTGp020{vOxJ) z`(&kKlN-96A|W-^@hyX|*XU&qPELtxkhJDOnYnCx4VR4>qTl&-`XX&%|d~ zrl}1bxZcHWf0?*f_@VHw>0M2u*de$OKiLT;5+mP};c|ap6kYw& zP&0wS!86AEn?Dsv5uOT-+u&zTK8|&NQqAt>3r2FgKT^i#TtJW`^P1+O4_ct5R+G)} z_}V}@vw||-;mJxfpq@f^eP4olAr2DUIM5x+y2iJg6ks9;D=^rP>Ji-J z^HDF}^VXY?D2%*mQMQg;g6=qiepslFqH*#>flVHb`Fiv);b(ds64aJ(Anrgqh z(1vXBhtdgxFNw0<;d{Tzv(AOAM7vF^AnbPS-t;_3V0CvVzrT+FT2H;3Q<+pe$1}oq zJ5yO37o@LAc*~)Tam#YR{5AlLd@MB?Mbkce*aZXjStV1)wk-}Q0^`n9@wOXqKa7mq z=G15cU$$4v*e!KAIk~HI+IZ2)s9M+H4Km>~J_drPrze0)PG-Rh0@(zeaeC=^oNZAV zNI;)pKh~|Z5g*J#o@0v|s5_ogt@Fxbs=UT_OOFKDC~Y_b4|Q4=$W%g%5U9;k8X;3`cN6go&#? z7u0tD&;!D>Z*fom{e9*Mn*;=B(YiCE5`Y0r36daoWVO3$m? zo7O7?S9`pi_3Afj8LuY0+tQ4ztRZuvW>!ylXl*S;j_kh2C5ypwY*{U`P_P~~?uP&jZlk}z<@>{||j51b)%9rO_XQh49kSP(pdJ)f)~kBNy9 z6-P&<9f){7jGDs`I=E*>KGn`*o8je@MDtV57Ci}QO21!T+ZY7}uGz_EVyr~AR0esf z*$h9sVy$m@dr42#)Jm^s-K=LTA}j?RBr#c9MYb|K_iN_Oo1I5s6tB)*5+LFI`{=N6 zPwP2YRyeUWl=LMcEQ}--{nnohzSnpUvvpsm6gw=AVb&aZNzF@^UQqSK^1h+-RL_u&_P*;VRV2^ zk`<%mdAtXIkf~EqixIB7d`&nZ*e)7Yrf_&oCVK2+L*xfym_=v|(iLtW{OgqsI(|MY z%_C#`gN#pHoW{t==)JPP6#g*%x4X$J%2-w=HEY+?;ct0AAe`TFm; zI{o6!F=4&vpVIlOH^>_!;!Q1(H&t~~m#KAH`l;3F2*nn)U0)yO1M1^~yabGSwe!o3 z4d-8_ri|HHknQ!r-jK>%*c>ZvkG?37t7Bnfows)r3hcQr2ApiCXUe7Y8>auoRkJW~ zfW_A8xMKniq$eZPbukwwj1jK5u&r#<_+d3Cp(2{wt8`Y2em3wyFpXtX6wdThwW_ z?NK>ICB*!FYwMkO9eD`6ThE^tBzT(Dx&_=C)?ZfQj0>GOcB+v&4BWU#s-cuXXD?oY*6j%inec+=Ai)IoE;HQw@<`il8-Ao_>W=W^Y4Fqy24%d zIk#r&A07;6xr-JTgj<8`@Uxu-Ch2qabveZJZ?@R00Q_q+jm_;JlqqNM*?oM@GGT9X8+vVNb>aIh! zUISRWIYL>_g$+VCfhP^YA#Gvg&R@gETK>(pWP7h>0?(<{gPWlPn~_pte<}XVk`zG2 z8W1RZc$jkkjw>`p!J-c~0i0bs#oZKXDN8Crq4m|$In*!d-#D}sS#}n9YXhsBJla~6 z+D}?@G~VCBcZq%c1#r8Rj|z|Djh8d7k6Jk&fV% zIGq-t0%MIP?L3=eIS5^eE!;?cM{LbWc}V)UKM{NQ;f26S9_nQMAxVNi3H+7Lw)N&{ z5gW9Mgx1EWRf6kgUHoS}DZdzINv(}jJ5>>jyVx51bxw9>kB+7@nqkOxI2crQpq!Fx z^{%Fxu0b0c3PHiQb1b~PyJLW^dHWKHX-mjE+J;%S%4Uore@4uiL!0)Qr6MZ>-YGj*TD0((#bU{$-;4W zDzCcJ4*(T4-~Itl?Zni4>}5yyD$swl_l1lAC9r$9Vlb@LMuLlyxz9G)$<)4UUpJnP*W=Nto~xu7CrXsCX< z*J)Hm@11l}DK;kyDTh6Z94F!TW49vte14=_eoaJY0$czBeb8~T_T7bvci#gzUa06f z%m4TH?|SBF^>KgN&4)L9&#ot;n=Rhqxo-N=<%9RKOoByjo~q1~s`B+QL18M;ck4KcSvU z1GA*nt*>El-YXWx4P4@;}*C5=k@}4y5o7ezkQG! z{97|kA|5)(6HG|CTDvq;57p=}2vWuR?n&?^Q8mA>u`&Qg` zJoTD82?b$CcCC1SA}Bzx`97SZ!b=KHQ8;unc|b!w&uhyem;E+Fa&aj&73DP-%uIq} zE(`hOzcWJ(=<4YuW(HXh#`DS5xCHPT|9JeB`xGR8tPkh!5wMOBYbE}k>T_S{yGn+Dv)0H?b6S^ zG+?Dol@R+PHQuYiXPuwiAuG-dwp4!ZyPt(1kqW(W6<3 z>m3}&sIXdEJI^fl^w0gO*^f89b64lm;#fw3#H1wE=D89pWuP^Zo-=t%ig$m1zs$b- z!t?1G1M^yti0o~8dcbpoJ(eGMNJ-Z^O~09#n3yZ=4?@X8BF(-hRmERiaHDj~7$FQN zsNQUuK!!qAx~KXw_OOw@wR35_qdpz;mS? z&3O$}KWgxOH8=0vLFJ3n&T7#>sv3O+ptlTq92s^sw% zAf|aHaI^SFOvSYss)gF__+>?VZTpRpuXTc+;#3!A0Q`xwIHqSDp2|90OsjHR0* z@Ifbb<0V!%j%SS;FH|je$I}8TCgEVyX$zupEC*cL7)?7HX1%(I+U{fz9tVlmmEORvPmyRp$#$8 z9w1@uU+nG0)hwJ3{LPh{B>9F}+SQgTOw*yAU7eqH_Ago1d8pa646eFIAPgZm2!cyk z;;f(5x_#P`Z^9@X2_)bA(;p2kv(Dnu(aoGM{(b1Wlm*5?qz79Ae7_25w{7;`a<|Jr z<#QDVTjgw@d= z?jI8&sGj|ra!NsXa2+QKoD(t3o&%^G3c%1jvczFkU1yMzXm6zNjExVhp zX2q!7MsgL_g#VXrw)Zbxl;nQSbM`BEjTLuhY`7H?o<) z*~mV%d!7047dQ}B=I`!e*>ETXKzxh9cywur+eeYz)bYrrT|&*dsbjg`rY;0&D;OPe z%kBnA;7R%XZaNue3b931?=4=IRA`{25l*pe;VD3C@DUC=&7-~wvfbTr06zbMBi={yxb3!PoX_NW= zU5vN(Y12h#WE1tT^dGAbMAQLqn%#5%9%|Z5;IN+$V)*)+ReN2DmK|8?j_;Q6UbWkL zXvpWgYcuKy;|zKD{Onc_S`4$fXc`1+V~>OdT>x$7z7sNq1~M%;{^{{1{eLovxW z{7HCGc~EVZ!N%cUTp6(ycDOdjW#1Jy8loqMKO8oM<2O!23SrR?1ny-b&(`y^kiPg= zCFD=4&0oR>d%wG_Zd|zTY>A8h@3o`zF2SF+TM?8w=|S&w%(hgI!cYt@E@e%}cIrGN z|9#;U=F$mltGU0>=ixd<7Zk-r!3Jre|6V(TiX^g3IM_Vy`sH4RbM3d>jipk!!VaHt zGHCOD{?cK34-e-_!t8#jj_=SP;!awQUr*e8NNaEw93Ogm%a6SP)9#IfF?|*(3G=uS zbmzszMCw-AHO>sO!(+~nW~k`p6=YVweMUH^rRt{!jW1$I?jxhKP92*v)YIflzh8zdY~pJ@Eba#{5Exg0{s%!Xgbr9s?~ zhYzc#sw46rq*^2WVd}IkITGxB^HwAyKhSG5kq74q(qUBOe7=!7e+lw14$(Dq=Q3f- zT>kKQ)0d!EL<9pfS{j!Jf1`J>Us4fbP)1FIY;gwS;LSEp;fhR6{qtK{ihNpJI5(0+ z{~rzf##60p40Qh07mM+8&KgfoaqIbT#uh^Z^|&NDnL_4;x{}b55o4C;Gr3cDZ=@m_ z21=9WZI_Z#kllAocAA6CPs8^QpmG|(y<$e)XfhMy%uBjfhW_o4HFpbsJ`XKOWGS_J zrbZyNR+2tSi&E?8TGNC#(Xx3Jf8;?$5!=Q!$E71TR2-E??=nS ze#+_g{}fL0xeC&+P+=LasK-P7f~Q*(iBf!|sI{j_p<{wGlc%vi@4%mVFAB+$43oceMpxx-x?U#OAG(c8U26#1JmzwHEgBm6m#c& z0DITu{d)fTrzpGH*YuxDbu!;?n+;nMr;4gfWn@x=np5C^cnwqu|5Kiukk{bfi9;vz}?+{KdW0dX3-1Qm#Dkzm!>G5GiE zNb$@0i-A^G^mKM}0V4nlM zER2s%*}I!Je-KD12Xcb^-&|H!Sm^n9MuYDst|Mlt{hI^NQNdYQ5ie5Eln zwudKNiHe3OB$>hccT!8C-h*zxv}GOY^XJd%#*jiepv5ZVy~}6|&e1Cd%o;^>hDD`U zC!}ot#}BnSSJQ-&X`CG$yl%6w+?j8I`)y4uvV89pl=*U!WERr|0nh@%q21g;bVS@L zd{!y=6V&HrleX^2(@(_(1hozrf_10=i)1hIm;SH&+FUi|$nF#zVDq3MWFBu1w}Ex% zIFcVWjoZIA2h!0#c7$35Bm|dE-_1}Ob$k50;eNQyez)3T!r}L&a0Z`~##{Pun<6(z zph36UUr8c^%^^Ws6Xmxau>o|+)j`(Zo%Ekd_@n)%-0sdd7dCRmhawLk#ES52dsXH> zJb@B4?fLY|Z2!dg0eYfbKo8W@yZ_)p7}WjGfm*?$Vq$G^T*@kAWFzcif~9BBZ&o2r zMLXyNgdM3B{E{sDy5a_|vw!Xz5v=ZmXOl6qv9TqnjJ!?7wO{Uz;2i@X!T8>tafP>F zG9fU=$EoIhM-1xxE94$zl)5_CokeYG{+Cy}gX*9SbmW zQ5QPPY}@G$99^d(Y}+F*r=S3vi89+rA>LLDI*Vf!{g4M0Z9f1-2dMX5Kifch>j7ia zV4ZZ-7}6gM0Rm5(KGh)T{_RYiT8)xHJX}T(`fOhK{I!8j%<9LFS60>zNhN>w*S0RQ zzd80Fk;ODB6K!@~Lau0oM3vLO@q{H)5>aXCT78nZHlFi%Z)9TwjP#&Ogc&zhK?taB zw3NO;?|YIKt%8x@5?Z;?4J_QC)No%@Or2i?(OD_T7A9ceJ((pr2#97RFP><84IM+e z8>oK@CO|MbfP#?GD!19Gbzjpvtrou!vCXI=(^8T$110ZV_jb`}sOY2If`U*bhIE6> zj}6zWzIBV?W$zl#O9i2cZEG)DH?}|6V4mXd8{;Q^&IC)NrKqxkt zG=4!)f>u@;!%9Mk5@@n@m*0*4`|*<2uO~462bDt0Tn=glDWDDeh1Y&VLi6Q66a0`l zVOdbXFxqv%xi^Ad2?X=+E$P|gtf@w%6-Z+&>%BVv`rVGX-D((;>rfolBGLTkS2-;z zup#!ik>-2gnN=*w5cYsgr!AW6)6+8|>Bh%%cV}&_F804P1rZ-b;N5*azUMi9k#1rN zm*u=hv3tG48>*2Dii?keNX#JA`0U@ z>`~sgvZ8OrSDobO#8a$56Ji*V^B<9f;qDXwr|S*`RjFY-s_tZc*d3=u5~+0*se0$4Ho#=-z29f4X3HhHx&{U>p5V83Y2&|u>E^zBqar?8O8&ljrx4S zTcS_g`g|8?MP&U-wC4G+2P7e>+V0tCM)Qw71^Ff2>QqK@Z>ekET_z_bj+gUMKXIhF zOY$lFX==D|L`{?>3J6w>Ss=nfVZhiQ6U* zs7#PB)2F%srU~1GCHMB_(}}X6V}cg zfqq6`tmNJXPgfs!Pa3n3K||0?m@99Z9zTEhU!UC*At7D~;kFbO%kK!f;}6QO2c4Z8 zpl%a3mOtT3vCSQu(2wE$)UD!;%1t6w4g8sdNXts;4huX#vwQ`T_aR7{wwKL zSve*vGre%;qGUC@VYQ+VCK*VkKorYN8Ae}*T;q3>h4*wF+cS%pIUh22rroH+xb3&f z^0Nbiyc8gGzq{x?00K#0?Eez6Y8K8Cg6eH@mP?mTL)6$OT~ObEZWqCWCohKjvc?e3Tu7Ot-9xnk_@vt;#zH@s);_$LXbn;&Yjzn0BHfpb`MYzJ84qe4K+LD9pZa=JygzcuEH{hU0R(ugxBl>dJ@T z{xGx`ld;&Q3(b9Fe|aEMO67>*ZlL6F5DB}ei$9w*zR~N%Eq{Avw&2G7H^<6L;u!IO ztCqN@x4DCBpU+9IaYe-L2hkAhK$L&2f#%(0!#lha9*X8)>nfzy&g5o7`sSF54CO-q z8c5rB$GsyQ{&?5&WLev4W*MNGd+yyjBFlRAMjC zTzVz3DYIUF7m|k=GDWMnFcOY*lQ4Qyyu#Ai(r=|FJCZ4VhMAJMOv(iCrjO{(6=hb$ zzZG5)k?#3fvJUNxF!#56DGwewC)kkaz&wPI>>qc zguF>_G%n8}pv+xfezt^1{W*7Hi%#*uBj#>odc=ECNrEG*uxg4}#_JbuO9hg=D6)j= zXUq_m8~M#3okYn4`~_Z78euHG@uQ%i;HMPTO{u6N9^e9xnxxP6)Tq?%n(V&bj+ct5 zX?LyyG$kpk`G#!PAC%dE-QV8>UT_b{Q?sw99zb5>8OuPWnh%A zF+D(Tx5puAjXLf1IBkf*{o#w6p`=9(9TaHU0E<|tV=Uv&4Ui_Gx{&?`H2ikd57(Q6 zHRuRSR3FuqK6&fkTY}t3z+IBj18+X7za#Bb1^0DHGS!NpMKkos0#uv#i-VYnM{)z^K8WQoo(9=SqqpF3{_{&;g)Zi^{lP9A7w zJxsl7AsmNp#4+EIa*rG0te2COy|_7E>K|xum&Tlzd@<5N;Eb$lU!+6p z&K>pGn0s?+HkOO7hp)cJ{G28>4M~}$8X4J4yVpr{QVdw`Dvm9@c0xi#XKmN9LKiZwHaCluP zWGH~YeEBk~XX1zVR4VmH9T^BZoOyqghjWr5Kef}!NnT7hRfl;PMkT@C0CM6S2htS3 zO)kh~+z#_3ONb7xsV-Uu{oaDEED6Cim4@;VdM%~fAInZIctUy>N5T|d_Tm?*q0_|| zZw_B$nVCZ~-MT{>ofEybP6oXBKiV@=JhwlN)guYTgg1p)#HmF8rMU5WV$^}FB9X~5 z?(m|BDLLm770=##u6P8Y<(*>jS0x(Vj|F*@CEBoO+iZ>*CFa$79#=v^?~M_$UefqM zq$g4PwA21)UmxpKwae;tn%@O3q%j&3RJ9UB34z+r*}|g*?Sn7B<&udNe3g|my~F%& zZ8&JGf~n)Flu**hN~uH|m9VvWeRH$5dFt@}{qdYb^zV7k37J`3iA>;F@g&|WY|-ou zM?88BbXYNI#l+u|R~gjmYkJ3*x47o@c8{)HuNTT4^k2R82~dQ!dc= z*kdLN*VH!Q#zO~1$|`od%X-i*w_{!Ay6@NZ0~)`FN9R*J5EP`zA3pH>PFE!jg-7kw z!q{VG%|ih`VZ8O-hJh6TKJ>o8)rnR@3o47STlPIj6*doPR2OsZ4n)W_Jds30mBB z=B#GJ6;XqC&2zfeu0n~G<`0^@wk&{E)oq14?uK=ecK>Gofcy6>_V%eQ!(3uxFna-2 zc#Aufk=XH?6pgOk;uVez0k|P@O^G-gCQU6Qa3WdnUtfj<+2$$PLHR|dH)RwHk>d!^ zYP3jM4G$g;^YOetzitWQkD!f+!2?3oHfjonWfbafBIE(K=(b$m7GTgIhjhwxJI|c1 z>cW%tWJV^Rh$keXSGlBvaXb>pv27VB{NC;jbAG*PvGn8A+sQLTzwzke#fwt4sfZE| zRL=>MrfwOdSG&5tem8AHk|9}edeoS^>7 zfnvw8NzKIcarxUVYTE3t2ufNUf6jhnz{}51a<#-g#>91Ms@OZqj283NR=L|8#uq_G z%l8h@5;nY7VbSa(hIp98zRN`l8Z%>Q4Mwd>yc@4Vw{Y?$0UblcaYTQo-lQup*!_m< zb#n6FL`5gW9NIw0Ugzg$Iyy4VMeVR3{*5k$o=a*g010oe-7)x5UJC?& z)ZvfE(v;F)P@Oq9N0BKe2^(D7>Ox02Y5Wud1Uw&|#h=$$Dy}-3SqH2AoFP;Z1+ShO zs4sUD+rCy+J)fL^^z8GqCa_dHc2@M?{$Hi4M+4N7erMWRS_{yTmX_9rZ?u;Ed3$@Y zJxT!T(n8zImV+-au{tFJUGc>5`>9@Xeev7QEyxa@2=&C)uGmLEt%F(KkK8d&ZNi8u zxQ(Dq-ZH>(?0`*o+;+h?mG!EfKOcr0xM&BX&MDW!6#{n|1wrHcS7DMC4O(@@4@G7` zaCsC{7^tB0XUiP`-c=$aIY}poS8F9JlT+f@po(3Wg#L<>@yn&9_JPl&W?EZ6W22*6 zH~bF7@R4g zF8Fn}>@;R7?sh|Jur6G% z1Jp6T1K3sej}^x%x;WJrvZo|3*Zqy*D$Bj1)AOj)xc~qp<}73LGq1#6axXD)&Dt@; z_hA9l_Vj@#W>>@5#3Z|-f+SUX{8LR0E8x*^mRLpDT@0USR-NBz5OA=Q_Chh-ZWrA6H3&oZTv~dhY}#_5cDyqk4grgb!1M(2bbegf#7z|l zK3i`o_n+q$qmJl#r!G+9@~T_=%Oa+n=F{V0zk6V<5bn>8^!==5g5^yxo~MYBoAX0t z^k!P2=PM~O35i<}32b-N6!FP0OYMBmRMkweg(9FHjAOM4_>a(qIVgU$7o6-4K?L7z zHYaaS(WP``JfeFB^1o>HW1p)Iablc&);7WSCyDs=Yf4C$exrz$6iE z21rj94%Z(JHAt9#R37hKZn&S*o3H?F^gCQ1rbM~sG62sW2a`R|1LFYxPhrl~+0)y# z{9iC1tFG|4W7|^Rky~%D)&EU#NNJDio|czzk|!InSa>#B@ox5bweOLBe>GJ^TPyUg ztKJphKbqQ^#0Aer2$)!0HY9`#=@U41i4MOKTg-*;1)H!RwyM^>*y9JXzow@jCa194 zYkz4la6RA9=e|tfsx=)pj7}*?0lEy|J3X%Pi5b}Z!8#M@atV1{DT~>vB=V~@v)sN7 zpLC`Y_vpFWBYE6YxHU%Y9;(B=3tNo<3P4V(@R#V{hKr5+UAgR>L2}~a&E8Y@dc9eR zY;l{j^`ns*84(hN^UOD{dA;8q((m=yv2>gXLQC)VDx!6%&u#Xbg=yUVG|C0>T|pvF zDs`HbfTqp&U1Y)C{@1*pcKD&nHHb8mL$NEt+p;`3k2fno6@LnUIpf$HM8Yfp8a4HN zyG=_Q$KxJbVx_;=tC&Y`pgvzzJV&?w`lSoed2`Sl-06>%q~_F^u2EzUp<-(Dk&K97 zN)tqVeJFiC)b-MU1J*j9udEOAtp_w6srC~^^gl%;+}Ao1&X#jjFhdd!7Ju}EI}KI} z$x0|{KEaQJxeO=`Xa{E)&m2?Ye_(wS4@;`CsJSD>8x{9Tr0&0nf|pO*)!RROkjpo- z4ty4R|Fp?f!Q*zP|Ccn<`{pJwLlt^J*FB%~o8GT_F8_#Nbijd{|7Uvd69rvoA7=mp MPgg&ebxsLQ04yh=Y5)KL diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index fdcfb9c205770f9f76dcd1f6db54defec6286206..31cfc9428d2a99a52eac404e7b17819989df8866 100644 GIT binary patch delta 3487 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 N002ovPDHLkV1oM7t$P3f delta 3146 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 kJNx&`Tg#b;M1&07*qoM6N<$f?eGmrT_o{