diff --git a/baystation12.dme b/baystation12.dme index c7b1de5ca8e..83d91e79bb7 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -34,6 +34,7 @@ #define FILE_DIR "code/game/events/EventProcs" #define FILE_DIR "code/game/events/Events" #define FILE_DIR "code/game/gamemodes" +#define FILE_DIR "code/game/gamemodes/autotraitor" #define FILE_DIR "code/game/gamemodes/blob" #define FILE_DIR "code/game/gamemodes/changeling" #define FILE_DIR "code/game/gamemodes/cult" @@ -145,6 +146,11 @@ #define FILE_DIR "code/WorkInProgress/mapload" #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" #define FILE_DIR "code/WorkInProgress/virus2" @@ -362,7 +368,6 @@ #include "code\game\syndicate_shuttle.dm" #include "code\game\syndicate_specops_shuttle.dm" #include "code\game\throwing.dm" -#include "code\game\topic.dm" #include "code\game\turf.dm" #include "code\game\vials.dm" #include "code\game\vote.dm" @@ -401,6 +406,7 @@ #include "code\game\gamemodes\intercept_report.dm" #include "code\game\gamemodes\objective.dm" #include "code\game\gamemodes\setupgame.dm" +#include "code\game\gamemodes\autotraitor\autotraitor.dm" #include "code\game\gamemodes\blob\blob.dm" #include "code\game\gamemodes\blob\theblob.dm" #include "code\game\gamemodes\changeling\changeling.dm" @@ -417,6 +423,7 @@ #include "code\game\gamemodes\nuclear\nuclearbomb.dm" #include "code\game\gamemodes\nuclear\pinpointer.dm" #include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\revolution\rp-revolution.dm" #include "code\game\gamemodes\sandbox\h_sandbox.dm" #include "code\game\gamemodes\sandbox\sandbox.dm" #include "code\game\gamemodes\traitor\traitor.dm" @@ -634,7 +641,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" @@ -680,7 +686,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" @@ -1009,17 +1014,24 @@ #include "code\modules\security levels\security levels.dm" #include "code\WorkInProgress\AI_Visibility.dm" #include "code\WorkInProgress\buildmode.dm" -#include "code\WorkInProgress\copier.dm" #include "code\WorkInProgress\detective_work.dm" #include "code\WorkInProgress\explosion_particles.dm" -#include "code\WorkInProgress\filing.dm" #include "code\WorkInProgress\mapload\dmm_suite.dm" #include "code\WorkInProgress\mapload\reader.dm" #include "code\WorkInProgress\Mini\atmos_control.dm" #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" +#include "code\WorkInProgress\Ported\ZeroPoint\LaserComputer.dm" +#include "code\WorkInProgress\Ported\ZeroPoint\SuperMatter.dm" #include "code\WorkInProgress\SkyMarshal\coatrack.dm" -#include "code\WorkInProgress\SkyMarshal\policetape.dm" #include "code\WorkInProgress\SkyMarshal\traitoritems.dm" +#include "code\WorkInProgress\SkyMarshal\wardrobes.dm" #include "code\WorkInProgress\Tastyfish\Eliza.dm" #include "code\WorkInProgress\Tastyfish\Eliza_Data.dm" #include "code\WorkInProgress\Tastyfish\livestock.dm" diff --git a/code/WorkInProgress/AI_Visibility.dm b/code/WorkInProgress/AI_Visibility.dm index 100fa36fea2..3d23f7c5026 100644 --- a/code/WorkInProgress/AI_Visibility.dm +++ b/code/WorkInProgress/AI_Visibility.dm @@ -309,6 +309,7 @@ var/datum/cameranet/cameranet = new() return return ..() + /obj/machinery/door/update_nearby_tiles(need_rebuild) . = ..(need_rebuild) cameranet.updateVisibility(loc) diff --git a/code/WorkInProgress/Ported/Abi79/uplink_kits.dm b/code/WorkInProgress/Ported/Abi79/uplink_kits.dm new file mode 100644 index 00000000000..b7b053135ec --- /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 00000000000..8d2213333c9 --- /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 = 'radio.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/device/uplink/radio/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/copier.dm b/code/WorkInProgress/Ported/Bureaucracy/copier.dm similarity index 100% rename from code/WorkInProgress/copier.dm rename to code/WorkInProgress/Ported/Bureaucracy/copier.dm diff --git a/code/WorkInProgress/filing.dm b/code/WorkInProgress/Ported/Bureaucracy/filing.dm similarity index 100% rename from code/WorkInProgress/filing.dm rename to code/WorkInProgress/Ported/Bureaucracy/filing.dm diff --git a/code/WorkInProgress/Ported/Spawners/spawner.dm b/code/WorkInProgress/Ported/Spawners/spawner.dm new file mode 100644 index 00000000000..097d8f3c410 --- /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 00000000000..8b764b91be4 --- /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 00000000000..fe33d3ca04d --- /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 00000000000..75d236f10ee --- /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 00000000000..d1cac9bc30d --- /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/SkyMarshal/policetape.dm b/code/WorkInProgress/Ported/policetape.dm similarity index 100% rename from code/WorkInProgress/SkyMarshal/policetape.dm rename to code/WorkInProgress/Ported/policetape.dm diff --git a/code/WorkInProgress/SkyMarshal/wardrobes.dm b/code/WorkInProgress/SkyMarshal/wardrobes.dm new file mode 100644 index 00000000000..80c0c6c310f --- /dev/null +++ b/code/WorkInProgress/SkyMarshal/wardrobes.dm @@ -0,0 +1,572 @@ +/obj/item/wardrobe + name = "wardrobe" + desc = "Seems to have everything I need for my job in it, sweet." + icon = 'suits.dmi' + icon_state = "wardrobe" + item_state = "wardrobe" + w_class = 4 + var + descriptor = "various clothing." + + attack_self(mob/user) + if(!contents.len) + user << "It's empty!" + else + user.visible_message("\blue [user] unwraps the clothing from the [src]") + for(var/obj/item/I in src) + I.loc = get_turf(src) + update_icon() + return + + attackby(var/obj/item/I as obj, var/mob/user as mob) + if(istype(I, /obj/item/wardrobe)) + return + if(contents.len < 20) + if(istype(I, /obj/item/weapon/grab)) + return + user.drop_item() + if(I) + I.loc = src.loc + else + user << "\red There's not enough space to fit that!" + return + + examine() + set src in usr + ..() + usr << "It claims to contain [contents.len ? descriptor : descriptor + "...but it looks empty"]" + return + + update_icon() + if(contents.len) + icon_state = "wardrobe" + else + icon_state = "wardrobe_empty" + return + + New() + ..() + pixel_x = rand(0,4) -2 + pixel_y = rand(0,4) -2 + +/obj/item/wardrobe/assistant + name = "assistant wardrobe" + descriptor = "clothing for an assistant" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda(src) + new /obj/item/device/radio/headset(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/color/grey(src) + +/obj/item/wardrobe/chief_engineer + name = "Chief Engineer wardrobe" + descriptor = "clothing for a Chief Engineer" + + New() + ..() + var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/heads/ce(src) + new /obj/item/device/multitool(src) + new /obj/item/device/flash(src) + new /obj/item/clothing/head/helmet/hardhat/white(src) + new /obj/item/clothing/head/helmet/welding(src) + new /obj/item/weapon/storage/belt/utility/full(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/clothing/gloves/yellow(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/device/radio/headset/heads/ce(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/clothing/under/rank/chief_engineer(src) + +/obj/item/wardrobe/engineer + name = "Station Engineer wardrobe" + descriptor = "clothing for a Station Engineer" + + New() + ..() + var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/engineering(src) + new /obj/item/device/t_scanner(src) + new /obj/item/clothing/suit/hazardvest(src) + new /obj/item/weapon/storage/belt/utility/full(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/head/helmet/hardhat(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/clothing/shoes/orange(src) + new /obj/item/clothing/under/rank/engineer(src) + +/obj/item/wardrobe/atmos + name = "Atmospheric Technician wardrobe" + descriptor = "clothing for an Atmospheric Technician" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/engineering(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/atmospheric_technician(src) + +/obj/item/wardrobe/roboticist + name = "Roboticist wardrobe" + descriptor = "clothing for a Roboticist" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/engineering(src) + new /obj/item/weapon/storage/toolbox/mechanical(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/gloves/black(src) + new /obj/item/device/radio/headset/headset_eng(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/roboticist(src) + +/obj/item/wardrobe/chaplain + name = "Chaplain wardrobe" + descriptor = "clothing for a Chaplain" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/weapon/storage/bible/booze(src) + new /obj/item/device/pda/chaplain(src) + new /obj/item/device/radio/headset(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/chaplain(src) + +/obj/item/wardrobe/captain + name = "Captain wardrobe" + descriptor = "clothing for a Captain" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/captain(src) + new /obj/item/weapon/storage/id_kit(src) + new /obj/item/weapon/reagent_containers/food/drinks/flask(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/suit/storage/captunic(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/head/caphat(src) + new /obj/item/clothing/gloves/captain(src) + new /obj/item/clothing/head/helmet/swat(src) + new /obj/item/device/radio/headset/heads/captain(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/clothing/under/rank/captain(src) + +/obj/item/wardrobe/hop + name = "Head of Personnel wardrobe" + descriptor = "clothing for a Head of Personnel" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/heads/hop(src) + new /obj/item/weapon/storage/id_kit(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/device/flash(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/head/helmet(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/clothing/gloves/blue(src) + new /obj/item/device/radio/headset/heads/hop(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/clothing/under/rank/head_of_personnel(src) + +/obj/item/wardrobe/cmo + name = "Chief Medical Officer wardrobe" + descriptor = "clothing for a Chief Medical Officer" + + New() + ..() + var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/heads/cmo(src) + new /obj/item/weapon/storage/firstaid/regular(src) + new /obj/item/device/flashlight/pen(src) + new /obj/item/clothing/gloves/latex(src) + new /obj/item/clothing/suit/bio_suit/cmo(src) + new /obj/item/clothing/head/bio_hood/general(src) + new /obj/item/clothing/suit/storage/labcoat/cmo(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/device/radio/headset/heads/cmo(src) + new /obj/item/clothing/under/rank/chief_medical_officer(src) + +/obj/item/wardrobe/doctor + name = "Medical Doctor wardrobe" + descriptor = "clothing for a Medical Doctor" + + New() + ..() + var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/medical(src) + new /obj/item/weapon/storage/firstaid/regular(src) + new /obj/item/device/flashlight/pen(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/head/nursehat (src) + new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/clothing/under/rank/nursesuit (src) + new /obj/item/clothing/under/rank/medical(src) + +/obj/item/wardrobe/geneticist + name = "Geneticist wardrobe" + descriptor = "clothing for a Geneticist" + + New() + ..() + var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/medical(src) + new /obj/item/device/flashlight/pen(src) + new /obj/item/clothing/suit/storage/labcoat/genetics(src) + new /obj/item/device/radio/headset/headset_medsci(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/under/rank/geneticist(src) + +/obj/item/wardrobe/virologist + name = "Virologist wardrobe" + descriptor = "clothing for a Virologist" + + New() + ..() + var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/flashlight/pen(src) + new /obj/item/device/pda/medical(src) + new /obj/item/clothing/mask/surgical(src) + new /obj/item/clothing/suit/storage/labcoat/virologist(src) + new /obj/item/device/radio/headset/headset_med(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/under/rank/medical(src) + +/obj/item/wardrobe/rd + name = "Research Director wardrobe" + descriptor = "clothing for a Research Director" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/device/pda/heads/rd(src) + new /obj/item/weapon/clipboard(src) + new /obj/item/weapon/tank/air(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/device/flash(src) + new /obj/item/clothing/suit/bio_suit/scientist(src) + new /obj/item/clothing/head/bio_hood/scientist(src) + new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/clothing/gloves/latex(src) + new /obj/item/device/radio/headset/heads/rd(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/under/rank/research_director(src) + +/obj/item/wardrobe/scientist + name = "Scientist wardrobe" + descriptor = "clothing for a Scientist" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/toxins(src) + new /obj/item/weapon/tank/oxygen(src) + new /obj/item/clothing/mask/gas(src) + new /obj/item/clothing/suit/storage/labcoat/science(src) + new /obj/item/device/radio/headset/headset_sci(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/clothing/under/rank/scientist(src) + +/obj/item/wardrobe/chemist + name = "Chemist wardrobe" + descriptor = "clothing for a Chemist" + + New() + ..() + var/obj/item/weapon/storage/backpack/medic/BPK = new /obj/item/weapon/storage/backpack/medic(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/radio/headset/headset_medsci(src) + new /obj/item/clothing/under/rank/chemist(src) + new /obj/item/clothing/shoes/white(src) + new /obj/item/device/pda/toxins(src) + new /obj/item/clothing/suit/storage/labcoat/chemist(src) + +/obj/item/wardrobe/hos + name = "Head of Security wardrobe" + descriptor = "clothing for a Head of Security" + + New() + ..() + var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/weapon/melee/baton(src) + new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/device/flash(src) + new /obj/item/device/pda/heads/hos(src) + new /obj/item/clothing/suit/storage/armourrigvest(src) + new /obj/item/clothing/suit/armor/hos(src) + new /obj/item/clothing/head/helmet/HoS(src) + new /obj/item/weapon/storage/belt/security(src) + new /obj/item/clothing/gloves/hos(src) + new /obj/item/clothing/glasses/sunglasses/sechud(src) + new /obj/item/device/radio/headset/heads/hos(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/under/rank/head_of_security(src) + +/obj/item/wardrobe/warden + name = "Warden wardrobe" + descriptor = "clothing for a Warden" + + New() + ..() + var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/melee/baton(src) + new /obj/item/weapon/gun/energy/taser(src) + new /obj/item/device/pda/security(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/suit/storage/gearharness(src) + new /obj/item/clothing/head/helmet/warden(src) + new /obj/item/clothing/gloves/red(src) + new /obj/item/weapon/storage/belt/security(src) + new /obj/item/clothing/glasses/sunglasses/sechud(src) + new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/under/rank/warden(src) + +/obj/item/wardrobe/detective + name = "Detective wardrobe" + descriptor = "clothing for a Detective" + + New() + ..() + var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/fcardholder(src) + new /obj/item/weapon/clipboard(src) + new /obj/item/device/detective_scanner(src) + new /obj/item/policetaperoll(src) + new /obj/item/weapon/storage/box/evidence(src) + new /obj/item/device/pda/detective(src) + new /obj/item/clothing/suit/det_suit/armor(src) + new /obj/item/clothing/suit/storage/det_suit(src) + new /obj/item/clothing/gloves/detective(src) + new /obj/item/clothing/head/det_hat(src) + new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/clothing/shoes/brown(src) + new /obj/item/clothing/under/det(src) + +/obj/item/wardrobe/officer + name = "Security Officer wardrobe" + descriptor = "clothing for a Security Officer" + + New() + ..() + var/obj/item/weapon/storage/backpack/security/BPK = new /obj/item/weapon/storage/backpack/security(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/weapon/pepperspray(src) + new /obj/item/device/flash(src) + new /obj/item/weapon/melee/baton(src) + new /obj/item/policetaperoll(src) + new /obj/item/weapon/flashbang(src) + new /obj/item/device/pda/security(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/suit/storage/gearharness(src) + new /obj/item/clothing/glasses/sunglasses/sechud(src) + new /obj/item/weapon/storage/belt/security(src) + new /obj/item/clothing/head/helmet(src) + new /obj/item/clothing/head/secsoft(src) + new /obj/item/clothing/gloves/red(src) + new /obj/item/device/radio/headset/headset_sec(src) + new /obj/item/clothing/shoes/jackboots(src) + new /obj/item/clothing/under/rank/security(src) + + + +/obj/item/wardrobe/bartender + name = "Bartender wardrobe" + descriptor = "clothing for a Bartender" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/ammo_casing/shotgun/beanbag(BPK) + new /obj/item/ammo_casing/shotgun/beanbag(BPK) + new /obj/item/ammo_casing/shotgun/beanbag(BPK) + new /obj/item/ammo_casing/shotgun/beanbag(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/radio/headset(src) + new /obj/item/clothing/suit/armor/vest(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/bartender(src) + +/obj/item/wardrobe/chef + name = "Chef wardrobe" + descriptor = "clothing for a Chef" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/clothing/suit/storage/chef(src) + new /obj/item/clothing/head/chefhat(src) + new /obj/item/device/radio/headset(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/chef(src) + +/obj/item/wardrobe/hydro + name = "Botanist wardrobe" + descriptor = "clothing for a Botanist" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/analyzer/plant_analyzer(src) + new /obj/item/clothing/suit/storage/apron(src) + new /obj/item/clothing/gloves/botanic_leather(src) + new /obj/item/device/radio/headset(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/hydroponics(src) + +/obj/item/wardrobe/qm + name = "Quartermaster wardrobe" + descriptor = "clothing for a Quartermaster" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/weapon/clipboard(src) + new /obj/item/device/pda/quartermaster(src) + new /obj/item/clothing/gloves/black(src) + new /obj/item/clothing/glasses/sunglasses(src) + new /obj/item/device/radio/headset/heads/qm(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/cargo(src) + +/obj/item/wardrobe/cargo_tech + name = "Cargo Technician wardrobe" + descriptor = "clothing for a Cargo Technician" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/quartermaster(src) + new /obj/item/clothing/gloves/black(src) + new /obj/item/device/radio/headset/headset_cargo(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/cargo(src) + +/obj/item/wardrobe/mining + name = "Shaft Miner wardrobe" + descriptor = "clothing for a Shaft Miner" + + New() + ..() + var/obj/item/weapon/storage/backpack/industrial/BPK = new /obj/item/weapon/storage/backpack/industrial(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/analyzer(src) + new /obj/item/weapon/satchel(src) + new /obj/item/device/flashlight/lantern(src) + new /obj/item/weapon/shovel(src) + new /obj/item/weapon/pickaxe(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/clothing/glasses/meson(src) + new /obj/item/clothing/gloves/black(src) + new /obj/item/device/radio/headset/headset_mine(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/miner(src) + +/obj/item/wardrobe/janitor + name = "Janitor wardrobe" + descriptor = "clothing for a Janitor" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/janitor(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/rank/janitor(src) + +/obj/item/wardrobe/librarian + name = "Librarian wardrobe" + descriptor = "clothing for a Librarian" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/weapon/barcodescanner(src) + new /obj/item/clothing/shoes/black(src) + new /obj/item/clothing/under/suit_jacket/red(src) + +/obj/item/wardrobe/lawyer + name = "Lawyer wardrobe" + descriptor = "clothing for a Lawyer" + + New() + ..() + var/obj/item/weapon/storage/backpack/BPK = new /obj/item/weapon/storage/backpack(src) + new /obj/item/weapon/storage/box(BPK) + new /obj/item/weapon/pen(src) + new /obj/item/device/pda/lawyer(src) + new /obj/item/device/detective_scanner(src) + new /obj/item/weapon/storage/briefcase(src) + new /obj/item/clothing/shoes/brown(src) + if(prob(50)) + new /obj/item/clothing/under/lawyer/bluesuit(src) + new /obj/item/clothing/suit/lawyer/bluejacket(src) + else + new /obj/item/clothing/under/lawyer/purpsuit(src) + new /obj/item/clothing/suit/lawyer/purpjacket(src) + + diff --git a/code/datums/mind.dm b/code/datums/mind.dm index ea080c637bc..8d573b32424 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -15,6 +15,7 @@ datum/mind var/list/datum/objective/special_verbs = list() var/has_been_rev = 0//Tracks if this mind has been a rev or not + var/rev_cooldown = 0 proc/transfer_to(mob/new_character) if(current) @@ -245,8 +246,8 @@ datum/mind istype(current,/mob/living/carbon/human) ) 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/radio/suplink = find_syndicate_uplink() + var/obj/item/device/uplink/iuplink = find_integrated_uplink() var/crystals if (suplink) crystals = suplink.uses @@ -798,8 +799,8 @@ datum/mind memory = null//Remove any memory they may have had. 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/radio/suplink = find_syndicate_uplink() + var/obj/item/device/uplink/iuplink = find_integrated_uplink() var/crystals if (suplink) crystals = suplink.uses @@ -837,7 +838,7 @@ datum/mind if (t:traitorradio) del(t:traitorradio) t:traitorradio = null t:traitor_frequency = 0.0 - else if (istype(t, /obj/item/weapon/SWF_uplink) || istype(t, /obj/item/weapon/syndicate_uplink)) + else if (istype(t, /obj/item/weapon/SWF_uplink) || istype(t, /obj/item/device/uplink/radio)) if (t:origradio) var/obj/item/device/radio/R = t:origradio R.loc = current.loc @@ -856,7 +857,7 @@ datum/mind */ proc/find_syndicate_uplink() - var/obj/item/weapon/syndicate_uplink/uplink = null + var/obj/item/device/uplink/radio/uplink = null var/list/L = current.get_contents() for (var/obj/item/device/radio/radio in L) uplink = radio.traitorradio @@ -867,7 +868,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 +878,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/datums/shuttle_controller.dm b/code/datums/shuttle_controller.dm index 8ea4c2d0ccc..c75f262eb73 100644 --- a/code/datums/shuttle_controller.dm +++ b/code/datums/shuttle_controller.dm @@ -19,6 +19,7 @@ datum/shuttle_controller //timeleft = 360 //600 fake_recall = 0 //Used in rounds to prevent "ON NOES, IT MUST [INSERT ROUND] BECAUSE SHUTTLE CAN'T BE CALLED" deny_shuttle = 0 //for admins not allowing it to be called. + departed = 0 // call the shuttle // if not called before, set the endtime to T+600 seconds @@ -137,6 +138,7 @@ datum/shuttle_controller return 0 else + departed = 1 location = 2 var/area/start_location = locate(/area/shuttle/escape/station) var/area/end_location = locate(/area/shuttle/escape/centcom) diff --git a/code/datums/sun.dm b/code/datums/sun.dm index 693cd69c156..d701ad4c5e7 100644 --- a/code/datums/sun.dm +++ b/code/datums/sun.dm @@ -42,7 +42,7 @@ for(var/obj/machinery/power/tracker/T in machines) - T.set_angle(angle) + T.set_angle() for(var/obj/machinery/power/solar/S in machines) if(S.control) diff --git a/code/defines/mob/mob.dm b/code/defines/mob/mob.dm index c73b44236ab..47daf9254fa 100644 --- a/code/defines/mob/mob.dm +++ b/code/defines/mob/mob.dm @@ -245,6 +245,7 @@ the mob is also allowed to move without any sort of restriction. For instance, i var/UI = 'screen1_old.dmi' // For changing the UI from preferences // var/obj/effect/organstructure/organStructure = null //for dem organs + var/list/organs = list( ) //List of organs. /mob/proc/contract_disease(var/datum/disease/virus, var/skip_this = 0, var/force_species_check=1) diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 66b16cbf4b9..fee7d93abe2 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/closet.dm b/code/defines/obj/closet.dm index 579c9a397dd..5ff8567d826 100644 --- a/code/defines/obj/closet.dm +++ b/code/defines/obj/closet.dm @@ -557,6 +557,12 @@ icon_state = "white" icon_closed = "white" +/obj/structure/closet/wardrobe/medic_white + name = "Doctor's Wardrobe" + desc = "Contains medical jumpsuits." + icon_state = "white" + icon_closed = "white" + /obj/structure/closet/wardrobe/yellow name = "Yellow Wardrobe" desc = "Contains yellow jumpsuits." @@ -569,6 +575,12 @@ icon_state = "yellow" icon_closed = "yellow" +/obj/structure/closet/wardrobe/robotics_yellow + name = "Robotics Wardrobe" + desc = "Contains robotics jumpsuits." + icon_state = "yellow" + icon_closed = "yellow" + /obj/structure/closet/wardrobe/atmospherics_yellow name = "Atmospherics Wardrobe" desc = "Contains atmospheric jumpsuits." @@ -581,6 +593,48 @@ icon_state = "grey" icon_closed = "grey" +/obj/structure/closet/wardrobe/bartender_black + name = "Bartender Wardrobe" + desc = "Closet of basic bartending clothes." + icon_state = "black" + icon_closed = "black" + +/obj/structure/closet/wardrobe/chef_white + name = "Chef's Wardrobe" + desc = "Contains chef jumpsuits." + icon_state = "white" + icon_closed = "white" + +/obj/structure/closet/wardrobe/hydro_green + name = "Hydroponics Wardrobe" + desc = "Contains botanist jumpsuits." + icon_state = "green" + icon_closed = "green" + +/obj/structure/closet/wardrobe/librarian_red + name = "Librarian Wardrobe" + desc = "Contains librarian jumpsuits." + icon_state = "red" + icon_closed = "red" + +/obj/structure/closet/wardrobe/cargo_yellow + name = "Cargo Tech Wardrobe" + desc = "Contains cargo tech jumpsuits." + icon_state = "yellow" + icon_closed = "yellow" + +/obj/structure/closet/wardrobe/qm_yellow + name = "Quartermaster Wardrobe" + desc = "Contains quartermaster jumpsuits." + icon_state = "yellow" + icon_closed = "yellow" + +/obj/structure/closet/wardrobe/virology_white + name = "Virology Wardrobe" + desc = "Contains virologist jumpsuits." + icon_state = "white" + icon_closed = "white" + /obj/structure/closet/secure_closet diff --git a/code/defines/obj/door.dm b/code/defines/obj/door.dm index 4b8d10feafb..5272dd3cc0c 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 725ed11dae4..432954fd460 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/obj/weapon.dm b/code/defines/obj/weapon.dm index a2b48e3ae79..7454a8a7057 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -846,6 +846,7 @@ var/gas_transfer_coefficient = 1 var/permeability_coefficient = 0.99 var/siemens_coefficient = 0.80 + var/iteration /obj/item/weapon/directions name = "Crumpled Paper" @@ -989,25 +990,6 @@ item_state = "shard-glass" g_amt = 3750 -/obj/item/weapon/syndicate_uplink - name = "station bounced radio" - desc = "Remain silent about this..." - icon = 'radio.dmi' - icon_state = "radio" - var/temp = null - var/uses = 10.0 - var/selfdestruct = 0.0 - var/traitor_frequency = 0.0 - var/mob/currentUser = null - var/obj/item/device/radio/origradio = null - flags = FPRINT | TABLEPASS | CONDUCT | ONBELT - w_class = 2.0 - item_state = "radio" - throw_speed = 4 - throw_range = 20 - m_amt = 100 - origin_tech = "magnets=2;syndicate=3" - /obj/item/weapon/SWF_uplink name = "station bounced radio" desc = "used to comunicate it appears." diff --git a/code/defines/procs/gamehelpers.dm b/code/defines/procs/gamehelpers.dm index 5a39dc37dbe..587d98969fc 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 b8797da8376..a30f6fa1725 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/communications.dm b/code/game/communications.dm index 3db0bca16c6..fcf45c668eb 100644 --- a/code/game/communications.dm +++ b/code/game/communications.dm @@ -97,6 +97,10 @@ On the map: 1455 for AI access */ +/proc/radioalert(var/message,var/from) + var/obj/item/device/radio/intercom/a = new /obj/item/device/radio/intercom(null) + a.autosay(message,from) + var/list/radiochannels = list( "Common" = 1459, "Science" = 1351, diff --git a/code/game/events/Events/ElectricalStorm.dm b/code/game/events/Events/ElectricalStorm.dm index 24b29a1f8ca..08bc5cbbb5e 100644 --- a/code/game/events/Events/ElectricalStorm.dm +++ b/code/game/events/Events/ElectricalStorm.dm @@ -5,11 +5,10 @@ list/obj/machinery/light/Doors = list( ) Announce() - Lifetime = rand(90, 300) command_alert("The station is flying through an electrical storm. Radio communications may be disrupted", "Anomaly Alert") for(var/obj/machinery/light/Light in world) - if(Light.z == 1) + if(Light.z == 1 && Light.status != 0) Lights += Light for(var/obj/machinery/power/apc/APC in world) @@ -48,6 +47,7 @@ //sleep(2) Light.on = 1 Light.broken() + Lights -= Light DisruptAPC() var/failed_attempts = 0 @@ -62,6 +62,7 @@ APC.operating = 0 //Blow its breaker if (prob(8)) APC.set_broken() + APCs -= APC DisableDoor() var/obj/machinery/door/airlock/Airlock @@ -74,3 +75,4 @@ Wire = rand(1, 9) Airlock.pulse(airlockIndexToWireColor[Wire]) Airlock.update_icon() + Doors -= Airlock diff --git a/code/game/gamemodes/autotraitor/autotraitor.dm b/code/game/gamemodes/autotraitor/autotraitor.dm new file mode 100644 index 00000000000..c163c809d0e --- /dev/null +++ b/code/game/gamemodes/autotraitor/autotraitor.dm @@ -0,0 +1,211 @@ +//This is a beta game mode to test ways to implement an "infinite" traitor round in which more traitors are automatically added in as needed. +//Automatic traitor adding is complete pending the inevitable bug fixes. Need to add a respawn system to let dead people respawn after 30 minutes or so. + + +/datum/game_mode/traitor/autotraitor + name = "AutoTraitor" + config_tag = "Extend-A-Traitormongous" + + var/list/possible_traitors + +/datum/game_mode/traitor/autotraitor/announce() + ..() + world << "This is a test bed for theories and methods to implement an infinite traitor round. Traitors will be added to the round automagically as needed.
Expect bugs.
" + +/datum/game_mode/traitor/autotraitor/pre_setup() + possible_traitors = get_players_for_role(BE_TRAITOR) + + for(var/mob/new_player/P in world) + if(P.client && P.ready) + num_players++ + + //var/r = rand(5) + var/num_traitors = 1 + var/max_traitors = 1 + var/traitor_prob = 0 + max_traitors = round(num_players / 10) + 1 + traitor_prob = (num_players - (max_traitors - 1) * 10) * 10 + + // Stop setup if no possible traitors + if(!possible_traitors.len) + return 0 + + if(config.traitor_scaling) + num_traitors = max_traitors - 1 + prob(traitor_prob) + log_game("Number of traitors: [num_traitors]") + message_admins("Players counted: [num_players] Number of traitors chosen: [num_traitors]") + else + num_traitors = max(1, min(num_players(), traitors_possible)) + + + for(var/i = 0, i < num_traitors, i++) + var/datum/mind/traitor = pick(possible_traitors) + traitors += traitor + possible_traitors.Remove(traitor) + + for(var/datum/mind/traitor in traitors) + if(!traitor || !istype(traitor)) + traitors.Remove(traitor) + continue + if(istype(traitor)) + traitor.special_role = "traitor" + +// if(!traitors.len) +// return 0 + return 1 + + + + +/datum/game_mode/traitor/autotraitor/post_setup() + ..() + for(var/mob/T in world) + if(T.mind in possible_traitors) + T.be_syndicate = 1 + abandon_allowed = 1 + traitorcheckloop() + +/datum/game_mode/traitor/autotraitor/proc/traitorcheckloop() + spawn(9000) + if(emergency_shuttle.departed) + return + //message_admins("Performing AutoTraitor Check") + var/playercount = 0 + var/traitorcount = 0 + var/possible_traitors[0] + for(var/mob/living/player in world) + + if (player.client && player.stat != 2) + playercount += 1 + if (player.client && player.mind && player.mind.special_role && player.stat != 2) + traitorcount += 1 + if (player.client && player.mind && !player.mind.special_role && player.stat != 2 && player.be_syndicate && !jobban_isbanned(player, "Syndicate")) + possible_traitors += player + //message_admins("Live Players: [playercount]") + //message_admins("Live Traitors: [traitorcount]") +// message_admins("Potential Traitors:") +// for(var/mob/living/traitorlist in possible_traitors) +// message_admins("[traitorlist.real_name]") + +// var/r = rand(5) +// var/target_traitors = 1 + var/max_traitors = 1 + var/traitor_prob = 0 + max_traitors = round(playercount / 10) + 1 + traitor_prob = (playercount - (max_traitors - 1) * 10) * 5 + if(traitorcount < max_traitors - 1) + traitor_prob += 50 + + + if(traitorcount < max_traitors) + //message_admins("Number of Traitors is below maximum. Rolling for new Traitor.") + //message_admins("The probability of a new traitor is [traitor_prob]%") + + if(prob(traitor_prob)) + message_admins("Making a new Traitor.") + if(!possible_traitors.len) + message_admins("No potential traitors. Cancelling new traitor.") + traitorcheckloop() + return + var/mob/living/newtraitor = pick(possible_traitors) + //message_admins("[newtraitor.real_name] is the new Traitor.") + + forge_traitor_objectives(newtraitor.mind) + equip_traitor(newtraitor) + traitors += newtraitor.mind + newtraitor << "\red ATTENTION: \black It is time to pay your debt to the Syndicate..." + newtraitor << "You are now a traitor." + newtraitor.mind.special_role = "traitor" + var/obj_count = 1 + newtraitor << "\blue Your current objectives:" + for(var/datum/objective/objective in newtraitor.mind.objectives) + newtraitor << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + //else + //message_admins("No new traitor being added.") + //else + //message_admins("Number of Traitors is at maximum. Not making a new Traitor.") + + +/* Old equation. Commenting out. + target_traitors = max(1, min(round((playercount + r) / 10, 1), traitors_possible)) + message_admins("Target Traitor Count is: [target_traitors]") + + if (traitorcount < target_traitors) + message_admins("Number of Traitors is below Target. Making a new Traitor.") + var/mob/living/newtraitor = pick(possible_traitors) + message_admins("[newtraitor.real_name] is the new Traitor.") + + for(var/datum/objective/o in SelectObjectives(newtraitor.mind.assigned_role, newtraitor.mind)) + o.owner = newtraitor.mind + newtraitor.mind.objectives += o + + equip_traitor(newtraitor) + traitors += newtraitor.mind + newtraitor << "\red ATTENTION: \black It is time to pay your debt to the Syndicate..." + newtraitor << "You are now a traitor." + newtraitor.mind.special_role = "traitor" + var/obj_count = 1 + newtraitor << "\blue Your current objectives:" + for(var/datum/objective/objective in newtraitor.mind.objectives) + newtraitor << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + else + message_admins("Number of Traitors is at Target. No new Traitor.") +*/ + traitorcheckloop() + + + +/datum/game_mode/traitor/autotraitor/latespawn(mob/living/carbon/human/character) + ..() + if(emergency_shuttle.departed) + return + //message_admins("Late Join Check") + if(character.be_syndicate == 1 && !jobban_isbanned(character, "Syndicate")) + //message_admins("Late Joiner has Be Syndicate") + //message_admins("Checking number of players") + var/playercount = 0 + var/traitorcount = 0 + for(var/mob/living/player in world) + + if (player.client && player.stat != 2) + playercount += 1 + if (player.client && player.mind && player.mind.special_role && player.stat != 2) + traitorcount += 1 + //message_admins("Live Players: [playercount]") + //message_admins("Live Traitors: [traitorcount]") + + //var/r = rand(5) + //var/target_traitors = 1 + var/max_traitors = 2 + var/traitor_prob = 0 + max_traitors = round(playercount / 10) + 1 + traitor_prob = (playercount - (max_traitors - 1) * 10) * 5 + if(traitorcount < max_traitors - 1) + traitor_prob += 50 + + //target_traitors = max(1, min(round((playercount + r) / 10, 1), traitors_possible)) + //message_admins("Target Traitor Count is: [target_traitors]") + if (traitorcount < max_traitors) + //message_admins("Number of Traitors is below maximum. Rolling for New Arrival Traitor.") + //message_admins("The probability of a new traitor is [traitor_prob]%") + if(prob(traitor_prob)) + message_admins("New traitor roll passed. Making a new Traitor.") + forge_traitor_objectives(character.mind) + equip_traitor(character) + traitors += character.mind + character << "\red You are the traitor." + character.mind.special_role = "traitor" + var/obj_count = 1 + character << "\blue Your current objectives:" + for(var/datum/objective/objective in character.mind.objectives) + character << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + //else + //message_admins("New traitor roll failed. No new traitor.") + //else + //message_admins("Late Joiner does not have Be Syndicate") + + + diff --git a/code/game/gamemodes/blob/blob.dm b/code/game/gamemodes/blob/blob.dm index af87271db81..99ac2237e7d 100644 --- a/code/game/gamemodes/blob/blob.dm +++ b/code/game/gamemodes/blob/blob.dm @@ -3,6 +3,9 @@ config_tag = "blob" required_players = 0 + uplink_welcome = "Syndicate Uplink Console:" + 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 907de549c2c..b8f97d37ce1 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -9,6 +9,9 @@ required_players = 1 required_enemies = 1 + uplink_welcome = "Syndicate Uplink Console:" + 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 7a4d64d0c0e..3ed828f6a7e 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -5,6 +5,9 @@ required_players = 20 required_enemies = 2 + uplink_welcome = "Syndicate Uplink Console:" + 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 b94c3cab429..f5162478508 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -39,6 +39,9 @@ var/const/max_cultists_to_start = 4 var/acolytes_survived = 0 + uplink_welcome = "Nar-Sie Uplink Console:" + 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 cfe2d183045..c5a4bed773c 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -3,6 +3,9 @@ config_tag = "extended" required_players = 0 + uplink_welcome = "Syndicate Uplink Console:" + 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 897ab9a9817..0b7c6552303 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -23,6 +23,48 @@ list/restricted_jobs = list() required_players = 0 required_enemies = 0 + uplink_welcome + uplink_uses + 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:3: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);"} /datum/game_mode/proc/announce() //to be calles when round starts world << "Notice: [src] did not define announce()" @@ -77,6 +119,7 @@ /datum/game_mode/proc/check_win() //universal trigger to be called at mob death, nuke explosion, etc. To be called from everywhere. return 0 +/datum/game_mode/proc/latespawn(var/mob) /datum/game_mode/proc/send_intercept() var/intercepttext = "Cent. Com. Update Requested staus information:
" diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index efd4167b15e..9cef526ae52 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -1,5 +1,5 @@ var/global/datum/controller/gameticker/ticker - +var/datum/roundinfo/roundinfo = new() #define GAME_STATE_PREGAME 1 #define GAME_STATE_SETTING_UP 2 #define GAME_STATE_PLAYING 3 diff --git a/code/game/gamemodes/malfunction/Malf_Modules.dm b/code/game/gamemodes/malfunction/Malf_Modules.dm index 1fe28172088..ebaaccf0445 100644 --- a/code/game/gamemodes/malfunction/Malf_Modules.dm +++ b/code/game/gamemodes/malfunction/Malf_Modules.dm @@ -152,6 +152,7 @@ rcd light flash thingy on matter drain src.possible_modules += new /datum/AI_Module/small/interhack src.possible_modules += new /datum/AI_Module/small/blackout src.possible_modules += new /datum/AI_Module/small/reactivate_camera + return /datum/AI_Module/module_picker/proc/use(user as mob) var/dat diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index deff8194d9d..46f52e65753 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -15,6 +15,9 @@ 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_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 cd5dca83d6b..a91ce6414d6 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -7,6 +7,8 @@ var/nometeors = 1 required_players = 0 + uplink_welcome = "EVIL METEOR Uplink Console:" + 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 fbd7c5ff477..f077dc9b5a1 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -8,6 +8,9 @@ required_players = 3 required_enemies = 2 + uplink_welcome = "Corporate Backed Uplink Console:" + 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 750537d11e1..f14d8130227 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -18,6 +18,9 @@ required_players = 3 required_enemies = 3 + uplink_welcome = "Revolutionary Uplink Console:" + uplink_uses = 10 + var/finished = 0 var/checkwin_counter = 0 var/const/max_headrevs = 3 @@ -130,7 +133,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 ////////////////////////////////////// @@ -164,6 +167,8 @@ rev_mind.current << "\red You are now a revolutionary! Help your cause. Do not harm your fellow freedom fighters. You can identify your comrades by the red \"R\" icons, and your leaders by the blue \"R\" icons. Help them kill the heads to win the revolution!" rev_mind.special_role = "Revolutionary" update_rev_icons_added(rev_mind) + if(ticker.mode.name == "rp-revolution") + rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert return 1 ////////////////////////////////////////////////////////////////////////////// //Deals with players being converted from the revolution (Not a rev anymore)// // Modified to handle borged MMIs. Accepts another var if the target is being borged at the time -- Polymorph. @@ -186,6 +191,8 @@ else M << "[rev_mind.current] looks like they just remembered their real allegiance!" + if(ticker.mode.name == "rp-revolution") + rev_mind.current.verbs -= /mob/living/carbon/human/proc/RevConvert ///////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/code/game/gamemodes/revolution/rp-revolution.dm b/code/game/gamemodes/revolution/rp-revolution.dm new file mode 100644 index 00000000000..ce0ade235c9 --- /dev/null +++ b/code/game/gamemodes/revolution/rp-revolution.dm @@ -0,0 +1,349 @@ +// To add a rev to the list of revolutionaries, make sure it's rev (with if(ticker.mode.name == "revolution)), +// then call ticker.mode:add_revolutionary(_THE_PLAYERS_MIND_) +// nothing else needs to be done, as that proc will check if they are a valid target. +// Just make sure the converter is a head before you call it! +// To remove a rev (from brainwashing or w/e), call ticker.mode:remove_revolutionary(_THE_PLAYERS_MIND_), +// this will also check they're not a head, so it can just be called freely +// If the rev icons start going wrong for some reason, ticker.mode:update_all_rev_icons() can be called to correct them. +// If the game somtimes isn't registering a win properly, then ticker.mode.check_win() isn't being called somewhere. +#define RPREV_REQUIRE_REVS_ALIVE 0 +#define RPREV_REQUIRE_HEADS_ALIVE 0 + +/datum/game_mode/rp_revolution + name = "rp-revolution" + config_tag = "rp-revolution" + + var/finished = 0 + 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) + var/all_brigged = 0 + var/brigged_time = 0 + + uplink_welcome = "Syndicate Uplink Console:" + uplink_uses = 10 + + +/datum/game_mode/rp_revolution/announce() + world << "The current game mode is - Revolution RP!" +// world << "Some crewmembers are attempting to start a revolution!
\nRevolutionaries - Kill the Captain, HoP, and HoS. Convert other crewmembers (excluding the Captain, HoP, HoS, and security officers) to your cause. Protect your leaders.
\nPersonnel - Protect the Captain, HoP, and HoR. Kill the leaders of the revolution, and brainwash the other revolutionaries (by beating them in the head).
" + +/datum/game_mode/rp_revolution/send_intercept() + var/intercepttext = "Cent. Com. Update Requested staus information:
" + intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" + + var/list/possible_modes = list() + possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf") + possible_modes -= "nuke" + var/number = pick(2, 3) + var/i = 0 + for(i = 0, i < number, i++) + possible_modes.Remove(pick(possible_modes)) + possible_modes.Insert(rand(possible_modes.len), "nuke") + + var/datum/intercept_text/i_text = new /datum/intercept_text + for(var/A in possible_modes) + intercepttext += i_text.build(A, pick(head_revolutionaries)) + + for (var/obj/machinery/computer/communications/comm in world) + if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) + var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) + intercept.name = "paper- 'Cent. Com. Status Summary'" + intercept.info = intercepttext + + comm.messagetitle.Add("Cent. Com. Status Summary") + comm.messagetext.Add(intercepttext) + + command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") + +/datum/game_mode/rp_revolution/post_setup() + + var/list/revs_possible = list() + revs_possible = get_possible_revolutionaries() + var/list/heads = list() + heads = get_living_heads() + var/rev_number = 0 + + if(!revs_possible || !heads) + world << " \red Not enough players for RP revolution game mode. Restarting world in 5 seconds." + sleep(50) + world.Reboot() + return + + if(revs_possible.len >= 3) + rev_number = 3 + else + rev_number = revs_possible.len + + while(rev_number > 0) + head_revolutionaries += pick(revs_possible - head_revolutionaries) + rev_number-- + + for(var/datum/mind/rev_mind in head_revolutionaries) + for(var/datum/mind/head_mind in heads) + var/datum/objective/capture/rev_obj = new + rev_obj.owner = rev_mind + rev_obj.find_target_by_role(head_mind.assigned_role) + rev_mind.objectives += rev_obj + equip_revolutionary(rev_mind.current) + rev_mind.current.verbs += /mob/living/carbon/human/proc/RevConvert + update_rev_icons_added(rev_mind) + + for(var/datum/mind/rev_mind in head_revolutionaries) + var/obj_count = 1 + rev_mind.current << "\blue You are a member of the revolutionaries' leadership!" + for(var/datum/objective/objective in rev_mind.objectives) + rev_mind.current << "Objective #[obj_count]: [objective.explanation_text]" + obj_count++ + + spawn (rand(waittime_l, waittime_h)) + send_intercept() + +/datum/game_mode/rp_revolution/send_intercept() + var/intercepttext = "Cent. Com. Update Requested staus information:
" + intercepttext += " Cent. Com has recently been contacted by the following syndicate affiliated organisations in your area, please investigate any information you may have:" + + var/list/possible_modes = list() + possible_modes.Add("revolution", "wizard", "nuke", "traitor", "malf") + possible_modes -= "[ticker.mode]" + var/number = pick(2, 3) + var/i = 0 + for(i = 0, i < number, i++) + possible_modes.Remove(pick(possible_modes)) + possible_modes.Insert(rand(possible_modes.len), "[ticker.mode]") + + var/datum/intercept_text/i_text = new /datum/intercept_text + for(var/A in possible_modes) + intercepttext += i_text.build(A, pick(head_revolutionaries)) + + for (var/obj/machinery/computer/communications/comm in world) + if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) + var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) + intercept.name = "paper- 'Cent. Com. Status Summary'" + intercept.info = intercepttext + + comm.messagetitle.Add("Cent. Com. Status Summary") + comm.messagetext.Add(intercepttext) + + command_alert("Summary downloaded and printed out at all communications consoles.", "Enemy communication intercept. Security Level Elevated.") + + spawn(54000) + command_alert("Summary downloaded and printed out at all communications consoles.", "The revolution leaders have been determined.") + intercepttext = "Cent. Com. Update Requested status information:
" + intercepttext += "We have determined the revolution leaders to be:" + for(var/datum/mind/revmind in head_revolutionaries) + intercepttext += "
[revmind.current.real_name]" + intercepttext += "
Please arrest them at once." + for (var/obj/machinery/computer/communications/comm in world) + if (!(comm.stat & (BROKEN | NOPOWER)) && comm.prints_intercept) + var/obj/item/weapon/paper/intercept = new /obj/item/weapon/paper( comm.loc ) + intercept.name = "paper- 'Cent. Com. Status Summary'" + intercept.info = intercepttext + + comm.messagetitle.Add("Cent. Com. Status Summary") + comm.messagetext.Add(intercepttext) + spawn(12000) + command_alert("Repeating the previous message over intercoms due to urgency. The station has enemy operatives onboard by the names of [reveal_rev_heads()], please arrest them at once.", "The revolution leaders have been determined.") + + +/datum/game_mode/rp_revolution/proc/reveal_rev_heads() + . = "" + for(var/i = 1, i <= head_revolutionaries.len,i++) + var/datum/mind/revmind = head_revolutionaries[i] + if(i < head_revolutionaries.len) + . += "[revmind.current.real_name]," + else + . += "and [revmind.current.real_name]" + +///datum/game_mode/rp_revolution/proc/equip_revolutionary(mob/living/carbon/human/rev_mob) +// if(!istype(rev_mob)) +// return + +// spawn (100) +// if (rev_mob.r_store) +// rev_mob.equip_if_possible(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_l_store) +// if (rev_mob.l_store) +// rev_mob.equip_if_possible(new /obj/item/weapon/paper/communist_manifesto(rev_mob), rev_mob.slot_r_store) + + +/datum/game_mode/rp_revolution/check_win() + if(check_rev_victory()) + finished = 1 + else if(check_heads_victory()) + finished = 2 + return + +/datum/game_mode/rp_revolution/check_finished() + if(finished != 0) + return 1 + else + return 0 + +/datum/game_mode/rp_revolution/proc/get_possible_revolutionaries() + var/list/candidates = list() + + for(var/mob/living/carbon/human/player in world) + if(player.client) + if(player.be_syndicate) + candidates += player.mind + + if(candidates.len < 1) + for(var/mob/living/carbon/human/player in world) + if(player.client) + candidates += player.mind + + var/list/uncons = get_unconvertables() + for(var/datum/mind/mind in uncons) + candidates -= mind + + if(candidates.len < 1) + return null + else + return candidates + +/datum/game_mode/rp_revolution/proc/get_unconvertables() + var/list/ucs = list() + for(var/mob/living/carbon/human/player in world) + if(player.mind) + var/role = player.mind.assigned_role + if(role in list("Captain", "Head of Security", "Head of Personnel", "Chief Engineer", "Research Director", "Security Officer", "Forensic Technician", "AI")) + ucs += player.mind + + return ucs + +/datum/game_mode/rp_revolution/proc/check_rev_victory() + for(var/datum/mind/rev_mind in head_revolutionaries) + for(var/datum/objective/objective in rev_mind.objectives) + if(!(objective.check_completion())) + return 0 + + return 1 + +/datum/game_mode/rp_revolution/proc/check_heads_victory() + for(var/datum/mind/rev_mind in head_revolutionaries) + if(rev_mind.current.stat != 2) + var/turf/revloc = rev_mind.current.loc + if(!istype(revloc.loc,/area/security/brig) && !rev_mind.current.handcuffed) + return 0 + else if(RPREV_REQUIRE_REVS_ALIVE) return 0 + return 1 + +/datum/game_mode/rp_revolution/declare_completion() + + var/text = "" + if(finished == 1) + world << "\red The heads of staff were relieved of their posts! The revolutionaries win!" + else if(finished == 2) + world << "\red The heads of staff managed to stop the revolution!" + + world << "The head revolutionaries were: " + for(var/datum/mind/rev_mind in head_revolutionaries) + text = "" + if(rev_mind.current) + text += "[rev_mind.current.real_name]" + if(rev_mind.current.stat == 2) + text += " (Dead)" + else + text += " (Survived!)" + else + text += "[rev_mind.key] (character destroyed)" + + world << text + + text = "" + world << "The converted revolutionaries were: " + for(var/datum/mind/rev_nh_mind in revolutionaries) + if(rev_nh_mind.current) + text += "[rev_nh_mind.current.real_name]" + if(rev_nh_mind.current.stat == 2) + text += " (Dead)" + else + text += " (Survived!)" + else + text += "[rev_nh_mind.key] (character destroyed)" + text += ", " + + world << text + + world << "The heads of staff were: " + var/list/heads = list() + heads = get_all_heads() + for(var/datum/mind/head_mind in heads) + text = "" + if(head_mind.current) + text += "[head_mind.current.real_name]" + if(head_mind.current.stat == 2) + text += " (Dead)" + else + text += " (Survived!)" + else + text += "[head_mind.key] (character destroyed)" + + world << text + return 1 + + +/*obj/item/weapon/paper/communist_manifesto + name = "Communist Manifesto" + icon = 'books.dmi' + icon_state = "redcommunist" + info = "Supporters of the Revolution:

" + attack(mob/living/carbon/M as mob, mob/user as mob) + if(user.mind in ticker.mode:head_revolutionaries) + if(RevConvert(M,user)) + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] converts [] with the Communist Manifesto!", user, M)) + info += "[M.real_name]
" + else + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] fails to convert [] with the Communist Manifesto!", user, M)) + else + usr << "\red You are completely confounded as to the operation of this tome." + return + +proc/RevConvert(mob/living/carbon/M,mob/user) + if(!istype(M)) return 0 + if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) + user << "\red [M] is already a revolutionary!" + return 0 + else if(M.mind in ticker.mode:get_unconvertables()) + user << "\red [M] cannot be a revolutionary!" + return 0 + else + if(world.time < M.mind.rev_cooldown) + user << "\red Wait five seconds before reconversion attempt." + return 0 + user << "\red Attempting to convert [M]..." + var/choice = alert(M,"Asked by [user]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") + if(choice == "Yes!") + ticker.mode:add_revolutionary(M.mind) + user << "\blue [M] joins the revolution!" + . = 1 + else if(choice == "No!") + user << "\red [M] does not support the revolution!" + . = 0 + M.mind.rev_cooldown = world.time+50*/ + +mob/living/carbon/human/proc + RevConvert(mob/M as mob in oview(src)) + set name = "Rev-Convert" + if(((src.mind in ticker.mode:head_revolutionaries) || (src.mind in ticker.mode:revolutionaries))) + if((M.mind in ticker.mode:head_revolutionaries) || (M.mind in ticker.mode:revolutionaries)) + src << "\red [M] is already be a revolutionary!" + else if(src.mind in ticker.mode:get_unconvertables()) + src << "\red [M] cannot be a revolutionary!" + else + if(world.time < M.mind.rev_cooldown) + src << "\red Wait five seconds before reconversion attempt." + return + src << "\red Attempting to convert [M]..." + log_admin("[src]([src.ckey]) attempted to convert [M].") + message_admins("\red [src]([src.ckey]) attempted to convert [M].") + var/choice = alert(M,"Asked by [src]: Do you want to join the revolution?","Align Thyself with the Revolution!","No!","Yes!") + if(choice == "Yes!") + ticker.mode:add_revolutionary(M.mind) + M << "\blue You join the revolution!" + src << "\blue [M] joins the revolution!" + else if(choice == "No!") + M << "\red You reject this traitorous cause!" + src << "\red [M] does not support the revolution!" + M.mind.rev_cooldown = world.time+50 \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 6926d196ad2..5e69cb55c3c 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -9,12 +9,17 @@ required_players = 0 required_enemies = 1 + uplink_welcome = "Syndicate Uplink Console:" + 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) var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/const/traitor_scaling_coeff = 10.0 //how much does the amount of players get divided by to determine traitors + var/num_players = 0 + /datum/game_mode/traitor/announce() world << "The current game mode is - Traitor!" @@ -163,12 +168,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 +220,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,17 +253,23 @@ R = foo loc = "in the [S.name] on your back" break + 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.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 loc = "on your belt" - if (!R && istype(traitor_mob.l_ear, /obj/item/device/radio)) + if (!R && istype(traitor_mob.l_ear, /obj/item/device/radio) || prob(10)) R = traitor_mob.l_ear loc = "on your head" if (!R && istype(traitor_mob.r_ear, /obj/item/device/radio)) 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)) @@ -273,10 +284,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." @@ -285,7 +298,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 @@ -298,11 +311,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/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 1d6b3dcea03..08c6654f2d9 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -8,6 +8,9 @@ required_players = 0 required_enemies = 1 + uplink_welcome = "Wizardly Uplink Console:" + 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 0c205ac7fce..5389935bd46 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, 12) + if (wires[colorIndex] == 0) valid = 1 wires[colorIndex] = flag airlockIndexToFlag[flagIndex] = flag @@ -61,23 +64,27 @@ 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 var/obj/machinery/door/airlock/closeOther = null var/closeOtherId = null - var/list/signalers[9] + var/list/signalers[12] var/lockdownbyai = 0 autoclose = 1 var/doortype = 0 var/justzap = 0 + var/safetylight = 1 var/obj/item/weapon/airlock_electronics/electronics = null + holdopen = 1 /obj/machinery/door/airlock/command name = "Airlock" @@ -266,6 +273,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 +363,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 +441,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 +525,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 +659,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 +685,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 +773,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 +792,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 +864,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 +918,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 = 0 else if (href_list["aiEnable"]) var/code = text2num(href_list["aiEnable"]) @@ -834,9 +996,26 @@ 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 = 1 src.update_icon() src.updateUsrDialog() + if((istype(usr.equipped(), /obj/item/device/hacktool))) + attack_hack(usr, usr.equipped()) return @@ -866,6 +1045,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 +1161,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 @@ -992,12 +1252,12 @@ About the new airlock wires panel: /obj/machinery/door/airlock/close() if (src.welded || src.locked || (!src.arePowerSystemsOn()) || (stat & NOPOWER) || src.isWireCut(AIRLOCK_WIRE_DOOR_BOLTS)) return + ..() use_power(50) playsound(src.loc, 'airlock.ogg', 30, 1) var/obj/structure/window/killthis = (locate(/obj/structure/window) in get_turf(src)) if(killthis) killthis.ex_act(2)//Smashin windows - ..() return /obj/machinery/door/airlock/New() diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2ba7288c837..ee24359aeea 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -289,14 +289,62 @@ /obj/machinery/door/proc/close() if(density) return 1 - if(src.operating) + if (src.operating) return src.operating = 1 + var/held = 1 + + if(src.holdopen) + while(held == 1) + held = 0 + var/list/objects = locate() in get_turf(src) + for(var/obj/T in objects) + if(T != src) + held = 1 + for(var/mob/T in objects) + held = 1 + sleep(10) 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(rand(50,80), 0) //OH GOD IT HURTS + break + + L << "\red The airlock crushes your [limbdisplay]!" + for(var/mob/O in viewers(L, null)) + if(O == L) + continue + O.show_message("\red The airlock crushes [L.name]'s [limbdisplay]!", 1) + sleep(rand(2,8)) + + 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/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm index e7b92b54e80..277d6574b7e 100644 --- a/code/game/machinery/telecomms/broadcaster.dm +++ b/code/game/machinery/telecomms/broadcaster.dm @@ -72,7 +72,8 @@ var machinetype = 6 heatgen = 0 var/intercept = 0 // if nonzero, broadcasts all messages to syndicate channel - var/syndi = 1 //If 1, it goes to syndicate frequency. Else, goes to deathsquad/Response Team + var/frequency = 1439 + var/nuke = 0 receive_signal(datum/signal/signal) @@ -96,20 +97,21 @@ var var/datum/radio_frequency/connection = signal.data["connection"] - if(connection.frequency == NUKE_FREQ && syndi) // if syndicate broadcast, just - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"]) - else if(connection.frequency == 1439 && !syndi) - Broadcast_Message(signal.data["connection"], signal.data["mob"], - signal.data["vmask"], signal.data["vmessage"], - signal.data["radio"], signal.data["message"], - signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"],, signal.data["compression"]) - else if (intercept) - if(syndi) + if(!intercept) // if syndicate broadcast, just + if(connection.frequency == frequency && !nuke) + Broadcast_Message(signal.data["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"],, signal.data["compression"]) + else if(connection.frequency == NUKE_FREQ && !nuke) + Broadcast_Message(signal.data["connection"], signal.data["mob"], + signal.data["vmask"], signal.data["vmessage"], + signal.data["radio"], signal.data["message"], + signal.data["name"], signal.data["job"], + signal.data["realname"], signal.data["vname"],, signal.data["compression"]) + else + if(nuke) Broadcast_Message(signal.data["connection"], signal.data["mob"], signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], @@ -120,7 +122,7 @@ var signal.data["vmask"], signal.data["vmessage"], signal.data["radio"], signal.data["message"], signal.data["name"], signal.data["job"], - signal.data["realname"], signal.data["vname"], 4, signal.data["compression"]) + signal.data["realname"], signal.data["vname"], 4, signal.data["compression"], frequency) @@ -177,7 +179,7 @@ var /proc/Broadcast_Message(var/datum/radio_frequency/connection, var/mob/M, var/vmask, var/vmessage, var/obj/item/device/radio/radio, var/message, var/name, var/job, var/realname, var/vname, - var/data, var/compression) + var/data, var/compression, var/intercept_frequency) /* ###### Prepare the radio connection ###### */ @@ -219,11 +221,11 @@ var // --- Broadcast to response team radio! --- else if(data == 4) - var/datum/radio_frequency/syndicateconnection = radio_controller.return_frequency(1439) + var/datum/radio_frequency/interceptconnection = radio_controller.return_frequency(intercept_frequency) - for (var/obj/item/device/radio/R in syndicateconnection.devices["[RADIO_CHAT]"]) + for (var/obj/item/device/radio/R in interceptconnection.devices["[RADIO_CHAT]"]) - receive |= R.send_hear(1439) + receive |= R.send_hear(intercept_frequency) // --- Broadcast to ALL radio devices --- diff --git a/code/game/magic/library.dm b/code/game/magic/library.dm index fd0998e0c54..82378071c9e 100644 --- a/code/game/magic/library.dm +++ b/code/game/magic/library.dm @@ -118,7 +118,7 @@ for(var/obj/item/weapon/book/b in src.contents) books.Add(b) if(books.len) - var/obj/item/weapon/book/choice = input("Which book would you like to remove from the shelf?") in books as obj|null + var/obj/item/weapon/book/choice = input("Which book would you like to remove from the shelf?") in books|null as obj|null if(choice) choice.loc = src.loc else @@ -768,7 +768,10 @@ datum/borrowbook // Datum used to keep track of who has borrowed what when and f var/title = query.item[3] var/content = query.item[4] var/obj/item/weapon/book/B = new(src.loc) - B.name = "Book: [title]" + if(title) + B.name = "[title]" + else + B.name = "Untitled book" B.title = title B.author = author B.dat = content diff --git a/code/game/objects/closets/janitor.dm b/code/game/objects/closets/janitor.dm index 8c9c170df72..79db7c198f9 100644 --- a/code/game/objects/closets/janitor.dm +++ b/code/game/objects/closets/janitor.dm @@ -1,7 +1,9 @@ /obj/structure/closet/jcloset/New() ..() sleep(2) - new /obj/item/clothing/under/rank/janitor(src) + new /obj/item/wardrobe/janitor(src) + new /obj/item/wardrobe/janitor(src) + new /obj/item/wardrobe/janitor(src) new /obj/item/device/flashlight(src) new /obj/item/clothing/shoes/galoshes(src) new /obj/item/weapon/caution(src) diff --git a/code/game/objects/closets/nuclear.dm b/code/game/objects/closets/nuclear.dm index 78472fd4578..82bdff4bab3 100644 --- a/code/game/objects/closets/nuclear.dm +++ b/code/game/objects/closets/nuclear.dm @@ -19,6 +19,6 @@ new /obj/item/weapon/pinpointer(src) new /obj/item/weapon/pinpointer(src) new /obj/item/device/pda/syndicate(src) - var/obj/item/weapon/syndicate_uplink/U = new /obj/item/weapon/syndicate_uplink(src) + var/obj/item/device/uplink/radio/U = new /obj/item/device/uplink/radio(src) U.uses = 40 return diff --git a/code/game/objects/closets/secure/engineering.dm b/code/game/objects/closets/secure/engineering.dm index 08a61ad98a9..f5bb2fefd07 100644 --- a/code/game/objects/closets/secure/engineering.dm +++ b/code/game/objects/closets/secure/engineering.dm @@ -6,18 +6,9 @@ New() ..() sleep(2) + new /obj/item/wardrobe/chief_engineer(src) + new /obj/item/wardrobe/chief_engineer(src) new /obj/item/blueprints(src) - new /obj/item/clothing/under/rank/chief_engineer(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/clothing/head/helmet/hardhat/white(src) - new /obj/item/clothing/head/helmet/welding(src) - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/device/radio/headset/heads/ce(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/multitool(src) - new /obj/item/device/flash(src) return @@ -68,11 +59,10 @@ New() ..() sleep(2) - new /obj/item/clothing/under/rank/engineer(src) - new /obj/item/clothing/suit/hazardvest(src) - new /obj/item/clothing/shoes/orange(src) - new /obj/item/device/radio/headset/headset_eng(src) - new /obj/item/weapon/storage/toolbox/mechanical(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/clothing/glasses/meson(src) + new /obj/item/wardrobe/engineer(src) + new /obj/item/wardrobe/engineer(src) + new /obj/item/wardrobe/engineer(src) + new /obj/item/wardrobe/engineer(src) + new /obj/item/wardrobe/engineer(src) + new /obj/item/wardrobe/engineer(src) return diff --git a/code/game/objects/closets/secure/medical.dm b/code/game/objects/closets/secure/medical.dm index 43fa5f4616b..6b7a253d917 100644 --- a/code/game/objects/closets/secure/medical.dm +++ b/code/game/objects/closets/secure/medical.dm @@ -28,7 +28,7 @@ /obj/structure/closet/secure_closet/medical2 name = "Anesthetic" - desc = "Used to knock people out." + desc = "Used to knock people out, either by sleeping gas or brute force." icon_state = "medical1" icon_closed = "medical" icon_locked = "medical1" @@ -52,25 +52,19 @@ /obj/structure/closet/secure_closet/medical3 - name = "Medical Doctor's Locker" - req_access = list(access_medical) + name = "Chemist's Locker" + req_access = list(access_chemistry) New() ..() sleep(2) - new /obj/item/weapon/storage/backpack/medic(src) - new /obj/item/clothing/under/rank/nursesuit (src) - new /obj/item/clothing/head/nursehat (src) - new /obj/item/clothing/under/rank/medical(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/device/radio/headset/headset_med(src) - new /obj/item/weapon/storage/belt/medical(src) + new /obj/item/wardrobe/chemist(src) + new /obj/item/wardrobe/chemist(src) + new /obj/item/wardrobe/chemist(src) + new /obj/item/wardrobe/chemist(src) return - - /obj/structure/closet/secure_closet/CMO name = "Chief Medical Officer" req_access = list(access_cmo) @@ -79,13 +73,9 @@ New() ..() sleep(2) - new /obj/item/clothing/suit/bio_suit/cmo(src) - new /obj/item/clothing/head/bio_hood/general(src) - new /obj/item/clothing/under/rank/chief_medical_officer(src) - new /obj/item/clothing/suit/storage/labcoat/cmo(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/clothing/shoes/brown (src) - new /obj/item/device/radio/headset/heads/cmo(src) + new /obj/item/wardrobe/cmo(src) + new /obj/item/wardrobe/cmo(src) + new /obj/item/wardrobe/cmo(src) return diff --git a/code/game/objects/closets/secure/personal.dm b/code/game/objects/closets/secure/personal.dm index e072709db43..c3d09c48bcc 100644 --- a/code/game/objects/closets/secure/personal.dm +++ b/code/game/objects/closets/secure/personal.dm @@ -4,8 +4,8 @@ /obj/structure/closet/secure_closet/personal/New() ..() spawn(2) - new /obj/item/weapon/storage/backpack( src ) - new /obj/item/device/radio/headset( src ) + new /obj/item/device/assembly/signaler(src) + new /obj/item/wardrobe/assistant(src) return /obj/structure/closet/secure_closet/personal/patient/New() @@ -37,6 +37,7 @@ if(!src.registered) src.registered = I.registered src.desc = "Owned by [I.registered]." + src.name = "Personal Closet - [I.registered]" else user << "\red Access Denied" else if( (istype(W, /obj/item/weapon/card/emag)||istype(W, /obj/item/weapon/melee/energy/blade)) && !src.broken) @@ -54,4 +55,4 @@ O.show_message(text("\blue The locker has been sliced open by [] with an energy blade!", user), 1, text("\red You hear metal being sliced and sparks flying."), 2) else user << "\red Access Denied" - return + return \ No newline at end of file diff --git a/code/game/objects/closets/secure/scientist.dm b/code/game/objects/closets/secure/scientist.dm index 52461d4ccac..008834ecbe8 100644 --- a/code/game/objects/closets/secure/scientist.dm +++ b/code/game/objects/closets/secure/scientist.dm @@ -1,21 +1,3 @@ -/obj/structure/closet/secure_closet/scientist - name = "Scientist Locker" - req_access = list(access_tox_storage) - - - New() - ..() - sleep(2) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/device/radio/headset/headset_sci(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - return - - - /obj/structure/closet/secure_closet/RD name = "Research Director" req_access = list(access_rd) @@ -24,14 +6,6 @@ New() ..() sleep(2) - new /obj/item/clothing/suit/bio_suit/scientist(src) - new /obj/item/clothing/head/bio_hood/scientist(src) - new /obj/item/clothing/under/rank/research_director(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/gloves/latex(src) - new /obj/item/device/radio/headset/heads/rd(src) - new /obj/item/weapon/tank/air(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/device/flash(src) + new /obj/item/wardrobe/rd(src) + new /obj/item/wardrobe/rd(src) return \ No newline at end of file diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm index c3b6739a94f..fb964a64f95 100644 --- a/code/game/objects/closets/secure/security.dm +++ b/code/game/objects/closets/secure/security.dm @@ -6,17 +6,10 @@ New() ..() sleep(2) - new /obj/item/clothing/suit/storage/captunic(src) new /obj/item/clothing/suit/armor/captain(src) new /obj/item/clothing/head/helmet/cap(src) - new /obj/item/clothing/under/rank/captain(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/gloves/captain(src) - new /obj/item/clothing/head/helmet/swat(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/device/radio/headset/heads/captain(src) - new /obj/item/weapon/reagent_containers/food/drinks/flask(src) - new /obj/item/weapon/gun/energy/gun(src) + new /obj/item/wardrobe/captain(src) + new /obj/item/wardrobe/captain(src) return @@ -29,17 +22,8 @@ New() ..() sleep(2) - new /obj/item/clothing/under/rank/head_of_personnel(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/head/helmet(src) - new /obj/item/device/radio/headset/heads/hop(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/weapon/storage/id_kit(src) - new /obj/item/weapon/storage/id_kit( src ) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/glasses/sunglasses(src) - new /obj/item/clothing/gloves/blue(src) + new /obj/item/wardrobe/hop(src) + new /obj/item/wardrobe/hop(src) return @@ -52,19 +36,13 @@ New() ..() sleep(2) - new /obj/item/clothing/under/jensen(src) - new /obj/item/clothing/suit/armor/hos/jensen(src) - new /obj/item/clothing/suit/armor/hos(src) - new /obj/item/clothing/gloves/hos(src) - new /obj/item/clothing/head/helmet/HoS/dermal(src) - new /obj/item/device/radio/headset/heads/hos(src) new /obj/item/weapon/storage/lockbox/loyalty(src) new /obj/item/weapon/storage/flashbang_kit(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/weapon/gun/energy/gun(src) - new /obj/item/device/flash(src) - new /obj/item/clothing/glasses/sunglasses/sechud(src) + new /obj/item/clothing/under/jensen(src) + new /obj/item/clothing/suit/armor/hos/jensen(src) + new /obj/item/clothing/head/helmet/HoS/dermal(src) + new /obj/item/wardrobe/hos(src) + new /obj/item/wardrobe/hos(src) return @@ -77,17 +55,11 @@ New() ..() sleep(2) - new /obj/item/clothing/under/rank/warden(src) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/storage/gearharness(src) - new /obj/item/clothing/head/helmet/warden(src) - new /obj/item/clothing/gloves/red(src) - new /obj/item/device/radio/headset/headset_sec(src) new /obj/item/weapon/storage/flashbang_kit(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/weapon/gun/energy/taser(src) - new /obj/item/clothing/glasses/sunglasses/sechud(src) + new /obj/item/wardrobe/warden(src) + new /obj/item/wardrobe/warden(src) + new /obj/item/wardrobe/warden(src) + new /obj/item/wardrobe/warden(src) return @@ -100,18 +72,12 @@ New() ..() sleep(2) - new /obj/item/clothing/suit/armor/vest(src) - new /obj/item/clothing/suit/storage/gearharness(src) - new /obj/item/clothing/head/helmet(src) - new /obj/item/clothing/gloves/red(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/weapon/storage/belt/security(src) - new /obj/item/policetaperoll(src) - new /obj/item/weapon/flashbang(src) - new /obj/item/weapon/pepperspray(src) - new /obj/item/device/flash(src) - new /obj/item/weapon/melee/baton(src) - new /obj/item/clothing/glasses/sunglasses/sechud(src) + new /obj/item/wardrobe/officer(src) + new /obj/item/wardrobe/officer(src) + new /obj/item/wardrobe/officer(src) + new /obj/item/wardrobe/officer(src) + new /obj/item/wardrobe/officer(src) + new /obj/item/wardrobe/officer(src) return @@ -130,21 +96,12 @@ New() ..() sleep(2) - new /obj/item/clothing/under/det(src) - new /obj/item/clothing/suit/det_suit/armor(src) - new /obj/item/clothing/suit/storage/det_suit(src) - new /obj/item/clothing/gloves/detective(src) - new /obj/item/clothing/head/det_hat(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/device/radio/headset/headset_sec(src) - new /obj/item/weapon/storage/fcard_kit(src) - new /obj/item/weapon/fcardholder(src) - new /obj/item/weapon/clipboard(src) - new /obj/item/device/detective_scanner(src) - new /obj/item/weapon/pepperspray/small(src) - new /obj/item/policetaperoll(src) - new /obj/item/weapon/storage/box/evidence(src) new /obj/item/weapon/reagent_containers/food/drinks/dflask(src) + new /obj/item/weapon/zippo(src) + new /obj/item/weapon/pepperspray/small(src) + new /obj/item/wardrobe/detective(src) + new /obj/item/wardrobe/detective(src) + new /obj/item/wardrobe/detective(src) return diff --git a/code/game/objects/closets/wardrobe.dm b/code/game/objects/closets/wardrobe.dm index 199733359a4..f21ea77bd38 100644 --- a/code/game/objects/closets/wardrobe.dm +++ b/code/game/objects/closets/wardrobe.dm @@ -45,8 +45,6 @@ /obj/structure/closet/wardrobe/chaplain_black/New() //new /obj/item/clothing/suit/imperium_monk(src) //No. -- Urist - new /obj/item/clothing/under/rank/chaplain(src) - new /obj/item/clothing/shoes/black(src) new /obj/item/clothing/suit/nun(src) new /obj/item/clothing/suit/storage/chaplain_hoodie(src) new /obj/item/clothing/head/chaplain_hood(src) @@ -56,6 +54,7 @@ new /obj/item/weapon/storage/backpack/cultpack (src) new /obj/item/weapon/candlepack(src) new /obj/item/weapon/candlepack(src) + new /obj/item/wardrobe/chaplain(src) return /obj/structure/closet/wardrobe/green/New() @@ -86,12 +85,10 @@ return /obj/structure/closet/wardrobe/atmospherics_yellow/New() - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/under/rank/atmospheric_technician(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/clothing/shoes/black(src) + new /obj/item/wardrobe/atmos(src) + new /obj/item/wardrobe/atmos(src) + new /obj/item/wardrobe/atmos(src) + new /obj/item/wardrobe/atmos(src) return /obj/structure/closet/wardrobe/engineering_yellow/New() @@ -113,29 +110,19 @@ return /obj/structure/closet/wardrobe/toxins_white/New() - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/under/rank/scientist(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/shoes/white(src) + new /obj/item/wardrobe/scientist(src) + new /obj/item/wardrobe/scientist(src) + new /obj/item/wardrobe/scientist(src) + new /obj/item/wardrobe/scientist(src) return /obj/structure/closet/wardrobe/genetics_white/New() - new /obj/item/clothing/under/rank/geneticist(src) - new /obj/item/clothing/under/rank/geneticist(src) - new /obj/item/clothing/under/rank/geneticist(src) - new /obj/item/clothing/under/rank/geneticist(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/shoes/white(src) - new /obj/item/clothing/shoes/white(src) new /obj/item/weapon/storage/stma_kit(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/suit/storage/labcoat(src) - new /obj/item/clothing/suit/storage/labcoat(src) + new /obj/item/wardrobe/geneticist(src) + new /obj/item/wardrobe/geneticist(src) + new /obj/item/wardrobe/geneticist(src) + new /obj/item/wardrobe/geneticist(src) + new /obj/item/wardrobe/geneticist(src) return /obj/structure/closet/wardrobe/grey/New() @@ -160,11 +147,71 @@ return /obj/structure/closet/lawcloset/New() - new /obj/item/clothing/under/lawyer/black(src) - new /obj/item/clothing/under/lawyer/red(src) - new /obj/item/clothing/under/lawyer/bluesuit(src) - new /obj/item/clothing/suit/lawyer/bluejacket(src) - new /obj/item/clothing/under/lawyer/purpsuit(src) - new /obj/item/clothing/suit/lawyer/purpjacket(src) - new /obj/item/clothing/shoes/brown(src) - new /obj/item/clothing/shoes/black(src) + new /obj/item/wardrobe/lawyer(src) + new /obj/item/wardrobe/lawyer(src) + new /obj/item/wardrobe/lawyer(src) + new /obj/item/wardrobe/lawyer(src) + +/obj/structure/closet/wardrobe/medic_white/New() + new /obj/item/wardrobe/doctor(src) + new /obj/item/wardrobe/doctor(src) + new /obj/item/wardrobe/doctor(src) + new /obj/item/wardrobe/doctor(src) + new /obj/item/wardrobe/doctor(src) + new /obj/item/wardrobe/doctor(src) + return + +/obj/structure/closet/wardrobe/robotics_yellow/New() + new /obj/item/wardrobe/roboticist(src) + new /obj/item/wardrobe/roboticist(src) + new /obj/item/wardrobe/roboticist(src) + new /obj/item/wardrobe/roboticist(src) + return + + +/obj/structure/closet/wardrobe/bartender_black/New() + new /obj/item/wardrobe/bartender(src) + new /obj/item/wardrobe/bartender(src) + new /obj/item/wardrobe/bartender(src) + new /obj/item/wardrobe/bartender(src) + return + +/obj/structure/closet/wardrobe/chef_white/New() + new /obj/item/weapon/storage/lglo_kit(src) + new /obj/item/wardrobe/chef(src) + new /obj/item/wardrobe/chef(src) + new /obj/item/wardrobe/chef(src) + return + +/obj/structure/closet/wardrobe/hydro_green/New() + new /obj/item/wardrobe/hydro(src) + new /obj/item/wardrobe/hydro(src) + new /obj/item/wardrobe/hydro(src) + new /obj/item/wardrobe/hydro(src) + return + +/obj/structure/closet/wardrobe/librarian_red/New() + new /obj/item/wardrobe/librarian(src) + new /obj/item/wardrobe/librarian(src) + new /obj/item/wardrobe/librarian(src) + return + +/obj/structure/closet/wardrobe/cargo_yellow/New() + new /obj/item/wardrobe/cargo_tech(src) + new /obj/item/wardrobe/cargo_tech(src) + new /obj/item/wardrobe/cargo_tech(src) + new /obj/item/wardrobe/cargo_tech(src) + return + +/obj/structure/closet/wardrobe/qm_yellow/New() + new /obj/item/wardrobe/qm(src) + new /obj/item/wardrobe/qm(src) + new /obj/item/wardrobe/qm(src) + return + +/obj/structure/closet/wardrobe/virology_white/New() + new /obj/item/wardrobe/virologist(src) + new /obj/item/wardrobe/virologist(src) + new /obj/item/wardrobe/virologist(src) + new /obj/item/wardrobe/virologist(src) + return \ No newline at end of file diff --git a/code/game/objects/devices/PDA/PDA.dm b/code/game/objects/devices/PDA/PDA.dm index 5ea474c7229..7bcda1ad743 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 bca3ca79c15..00000000000 --- 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.dm b/code/game/objects/items.dm index db9d286fa89..96cdcdd3626 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -244,7 +244,7 @@ return -//What the fuck is this code +//What the fuck is this code Looks to be the parrying code. If you're grabbing someone, it might hit them instead... or something.--SkyMarshal /mob/attackby(obj/item/weapon/W as obj, mob/user as mob) if (user.intent != "harm") if (istype(src.l_hand,/obj/item/latexballon) && src.l_hand:air_contents && is_sharp(W)) @@ -494,4 +494,10 @@ istype(W, /obj/item/weapon/zippo) && W:lit || \ istype(W, /obj/item/weapon/match) && W:lit || \ istype(W, /obj/item/clothing/mask/cigarette) && W:lit \ - ) \ No newline at end of file + ) + +/obj/item/weapon/paper/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) + if(exposed_temperature >= 373.15) + for(var/mob/M in viewers(5, src)) + M << "\red \the [src] burns up." + del(src) \ No newline at end of file diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm index e57fada6147..e2233f9f8e9 100644 --- a/code/game/objects/items/item.dm +++ b/code/game/objects/items/item.dm @@ -194,7 +194,7 @@ user.update_clothing() return -/obj/item/attackby(obj/item/weapon/W as obj, mob/user as mob) +/obj/item/attackby(obj/item/W as obj, mob/user as mob) if (istype(W, /obj/item/weapon/packageWrap)) if(istype(src,/obj/item/weapon/storage) && istype(src.loc, /mob)) //Put it into the bag return @@ -212,6 +212,20 @@ src.loc = P O.amount -= 1 + else if(istype(W,/obj/item/wardrobe)) + var/obj/item/wardrobe/I = W + for (var/obj/O in locate(src.x,src.y,src.z)) + if (I.contents.len < 20) + if(istype(O,/obj/item/wardrobe)) + continue + if(O.anchored) + continue + I.contents += O; + else + user << "\blue The wardrobe is full." + return + user << "\blue You pick up all the items." + I.update_icon() /obj/item/attack_self(mob/user as mob) ..() diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 3505e3c2cae..08c45e86efd 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -22,7 +22,10 @@ ZIPPO process() - while(src.lit == 1) + var/turf/location = get_turf(src) + if(src.lit == 1) + if(location) + location.hotspot_expose(700, 5) src.smoketime-- sleep(10) if(src.smoketime < 1) @@ -31,15 +34,18 @@ ZIPPO processing_objects.Remove(src) return - dropped(mob/user as mob) if(src.lit == 1) - src.lit = -1 - src.damtype = "brute" - src.icon_state = "match_burnt" - src.item_state = "cigoff" - src.name = "Burnt match" - src.desc = "A match that has been burnt" + spawn(10) + var/turf/location = get_turf(src) + location.hotspot_expose(700, 5) + src.lit = -1 + src.damtype = "brute" + src.icon_state = "match_burnt" + src.item_state = "cigoff" + src.name = "Burnt match" + src.desc = "A match that has been burnt" + processing_objects.Remove(src) return ..() diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm index 9283f50e04c..605ae867b53 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 0d4d7543e7c..90dff280ec1 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/papers_bins.dm b/code/game/objects/items/weapons/papers_bins.dm index b13d61ad343..df8e5b532d6 100644 --- a/code/game/objects/items/weapons/papers_bins.dm +++ b/code/game/objects/items/weapons/papers_bins.dm @@ -21,11 +21,45 @@ CLIPBOARDS src.overlays += "paper_words" return +/obj/item/weapon/paper/process() + if(iteration < 5) + var/turf/location = src.loc + if(istype(location, /mob/)) + var/mob/M = location + if(M.l_hand == src || M.r_hand == src) + location = get_turf(M) + if (istype(location, /turf)) + location.hotspot_expose(700, 5) + iteration++ + else + for(var/mob/M in viewers(5, get_turf(src))) + M << "\red \the [src] burns up." + if(istype(src.loc,/mob)) + var/mob/M = src.loc + M.total_luminosity -= 8 + else + src.sd_SetLuminosity(0) + processing_objects.Remove(src) + del(src) + /obj/item/weapon/paper/update_icon() //derp. if(src.info) src.overlays += "paper_words" + if(src.burning) + src.overlays += "paper_fire" return + +/obj/item/weapon/paper/pickup(mob/user) + if(burning) + src.sd_SetLuminosity(0) + user.total_luminosity += 8 + +/obj/item/weapon/paper/dropped(mob/user) + if(burning) + user.total_luminosity -= 8 + src.sd_SetLuminosity(8) + /obj/item/weapon/paper/examine() set src in view() @@ -125,6 +159,14 @@ CLIPBOARDS src.info = t else + if(is_burn(P)) + for(var/mob/M in viewers(5, get_turf(src))) + M << "\red [user] sets \the [src] on fire." + user.total_luminosity += 8 + burning = 1 + processing_objects.Add(src) + update_icon() + return if(istype(P, /obj/item/weapon/stamp)) if ((!in_range(src, usr) && src.loc != user && !( istype(src.loc, /obj/item/weapon/clipboard) ) && src.loc.loc != user && user.equipped() != P)) return diff --git a/code/game/objects/items/weapons/uplinks.dm b/code/game/objects/items/weapons/uplinks.dm deleted file mode 100644 index 7d6d03fa972..00000000000 --- 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/game/objects/radio/radio.dm b/code/game/objects/radio/radio.dm index 37d459777d7..ed3bbe0d647 100644 --- a/code/game/objects/radio/radio.dm +++ b/code/game/objects/radio/radio.dm @@ -14,7 +14,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use frequency = 1459 //common chat traitor_frequency = 0 //tune to frequency to unlock traitor supplies obj/item/device/radio/patch_link = null - obj/item/weapon/syndicate_uplink/traitorradio = null + obj/item/device/uplink/radio/traitorradio = null wires = WIRE_SIGNAL | WIRE_RECEIVE | WIRE_TRANSMIT b_stat = 0 broadcasting = 0 @@ -135,7 +135,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use usr.machine = null usr << browse(null, "window=radio") // now transform the regular radio, into a (disguised)syndicate uplink! - var/obj/item/weapon/syndicate_uplink/T = traitorradio + var/obj/item/device/uplink/radio/T = traitorradio var/obj/item/device/radio/R = src R.loc = T T.loc = usr diff --git a/code/game/response_team.dm b/code/game/response_team.dm index c1c92d32e5f..47460b894f6 100644 --- a/code/game/response_team.dm +++ b/code/game/response_team.dm @@ -230,15 +230,17 @@ proc/trigger_armed_response_team() equip_if_possible(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack) var/obj/item/weapon/card/id/W = new(src) - W.name = "[real_name]'s ID Card" + W.name = "[real_name]'s ID Card (Emergency Response Team)" W.icon_state = "centcom" if(leader_selected) + W.name = "[real_name]'s ID Card (Emergency Response Team Leader)" W.access = get_access("Captain") W.access += list(access_cent_teleporter) + W.assignment = "Emergency Response Team Leader" else W.access = get_access("Head of Personnel") + W.assignment = "Emergency Response Team" W.access += list(access_cent_general, access_cent_specops, access_cent_living, access_cent_storage)//Let's add their alloted CentCom access. - W.assignment = "Emergency Response Team" W.registered = real_name equip_if_possible(W, slot_wear_id) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index a49b639c21d..48c81b65c3a 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -21,16 +21,9 @@ /obj/structure/closet/secure_closet/miner/New() ..() sleep(2) - new /obj/item/device/analyzer(src) - new /obj/item/device/radio/headset/headset_mine(src) - new /obj/item/clothing/under/rank/miner(src) - new /obj/item/clothing/gloves/black(src) - new /obj/item/clothing/shoes/black(src) - new /obj/item/weapon/satchel(src) - new /obj/item/device/flashlight/lantern(src) - new /obj/item/weapon/shovel(src) - new /obj/item/weapon/pickaxe(src) - new /obj/item/clothing/glasses/meson(src) + new /obj/item/wardrobe/mining(src) + new /obj/item/wardrobe/mining(src) + new /obj/item/wardrobe/mining(src) /**********************Shuttle Computer**************************/ diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 94e5d0dc42e..772988fdc82 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -201,4 +201,19 @@ for(var/t in organs) if (istype(organs[text("[]", t)], /datum/organ/external)) L += organs[text("[]", t)] - return L \ No newline at end of file + return L + +/mob/living/carbon/proc/UpdateDamage() + + if (!(istype(src, /mob/living/carbon/human))) //Added by Strumpetplaya - Invincible Monkey Fix + return //Possibly helps with other invincible mobs like Aliens? + var/list/L = list( ) + for(var/t in organs) + if (istype(organs[text("[]", t)], /datum/organ/external)) + L += organs[text("[]", t)] + bruteloss = 0 + fireloss = 0 + for(var/datum/organ/external/O in L) + bruteloss += O.get_damage_brute() + fireloss += O.get_damage_fire() + return \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 234ef722205..fbf09e9b1e1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -54,7 +54,6 @@ var/mutantrace = null - var/list/organs = list() var/bloodloss = 0 var/debug_leftarm var/debug_lefthand diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 74f4d9fe0bb..1058eb93ed5 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -253,10 +253,10 @@ var/datum/gas_mixture/environment = loc.return_air() var/datum/air_group/breath // HACK NEED CHANGING LATER - if(health < config.health_threshold_dead) + if(health < (config.health_threshold_dead + 50)) //PEOPLE ARE NOT DYING, DAMMIT losebreath++ - if(losebreath>0) //Suffocating so do not take a breath + if(losebreath>0 && prob(90)) //Suffocating so do not take a breath losebreath-- if (prob(75)) //High chance of gasping for air spawn emote("gasp") diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 40bac18b91c..cbde6f02a06 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -22,6 +22,40 @@ if(name == "monkey") name = text("monkey ([rand(1, 1000)])") real_name = name + var/datum/organ/external/chest/chest = new /datum/organ/external/chest( src ) + chest.owner = src + var/datum/organ/external/groin/groin = new /datum/organ/external/groin( src ) + groin.owner = src + var/datum/organ/external/head/head = new /datum/organ/external/head( src ) + head.owner = src + var/datum/organ/external/l_arm/l_arm = new /datum/organ/external/l_arm( src ) + l_arm.owner = src + var/datum/organ/external/r_arm/r_arm = new /datum/organ/external/r_arm( src ) + r_arm.owner = src + var/datum/organ/external/l_hand/l_hand = new /datum/organ/external/l_hand( src ) + l_hand.owner = src + var/datum/organ/external/r_hand/r_hand = new /datum/organ/external/r_hand( src ) + r_hand.owner = src + var/datum/organ/external/l_leg/l_leg = new /datum/organ/external/l_leg( src ) + l_leg.owner = src + var/datum/organ/external/r_leg/r_leg = new /datum/organ/external/r_leg( src ) + r_leg.owner = src + var/datum/organ/external/l_foot/l_foot = new /datum/organ/external/l_foot( src ) + l_foot.owner = src + var/datum/organ/external/r_foot/r_foot = new /datum/organ/external/r_foot( src ) + r_foot.owner = src + + organs["chest"] = chest + organs["groin"] = groin + organs["head"] = head + organs["l_arm"] = l_arm + organs["r_arm"] = r_arm + organs["l_hand"] = l_hand + organs["r_hand"] = r_hand + organs["l_leg"] = l_leg + organs["r_leg"] = r_leg + organs["l_foot"] = l_foot + organs["r_foot"] = r_foot ..() return diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 56b126aa78a..7f7d75a6cf2 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 2f683a56bba..62331f82765 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/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 6d3ac0648ee..5c8d1cce350 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -258,6 +258,8 @@ job_master.EquipRank(character, rank, 1) EquipCustomItems(character) character.loc = pick(latejoin) + character.be_syndicate = src.preferences.be_special & BE_TRAITOR + ticker.mode.latespawn(character) AnnounceArrival(character, rank) if(character.mind.assigned_role != "Cyborg") diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 86d4493df80..5c36584c435 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -232,9 +232,7 @@ var/global/list/uneatable = list( if (istype(A,/mob/living))//Mobs get gibbed gain = 20 if(istype(A,/mob/living/carbon/human)) - if(A:mind) - if((A:mind:assigned_role == "Station Engineer") || (A:mind:assigned_role == "Chief Engineer") ) - gain = 100 + gain = 100 spawn() A:gib() sleep(1) diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 9fc73c98b35..efaac149680 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -16,8 +16,8 @@ // called by datum/sun/calc_position() as sun's angle changes - proc/set_angle(var/angle) - sun_angle = angle + proc/set_angle() + var/angle = sun.angle //set icon dir to show sun illumination dir = turn(NORTH, -angle - 22.5) // 22.5 deg bias ensures, e.g. 67.5-112.5 is EAST diff --git a/data/mode.txt b/data/mode.txt index bd81a61cbfd..e8ce87d6d4c 100644 --- a/data/mode.txt +++ b/data/mode.txt @@ -1 +1 @@ -traitor +Extend-A-Traitormongous diff --git a/icons/mob/items_lefthand.dmi b/icons/mob/items_lefthand.dmi index d0ca90f9951..fc8bfaa4f71 100644 Binary files a/icons/mob/items_lefthand.dmi and b/icons/mob/items_lefthand.dmi differ diff --git a/icons/mob/items_righthand.dmi b/icons/mob/items_righthand.dmi index 66c6559e8c4..9d3778ef16b 100644 Binary files a/icons/mob/items_righthand.dmi and b/icons/mob/items_righthand.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 1a72aa53ca7..36b5b03632d 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 7f568e027a8..64d4b0adc04 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/paper.dmi b/icons/obj/paper.dmi index cbd91fb74c9..cb5f7c6e83d 100644 Binary files a/icons/obj/paper.dmi and b/icons/obj/paper.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index fdcfb9c2057..31cfc9428d2 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/maps/tgstation.2.0.8.dmm b/maps/tgstation.2.0.8.dmm index 7ce2495155e..b03a16566a8 100644 --- a/maps/tgstation.2.0.8.dmm +++ b/maps/tgstation.2.0.8.dmm @@ -5623,7 +5623,7 @@ "ceg" = (/obj/structure/table,/obj/machinery/light/lamp{pixel_x = 4; pixel_y = 1},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "ceh" = (/obj/machinery/computer/syndicate_station,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "cei" = (/obj/structure/table,/obj/item/weapon/pen/sleepypen,/obj/item/weapon/paper,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) -"cej" = (/obj/machinery/telecomms/allinone{intercept = 1},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) +"cej" = (/obj/machinery/telecomms/allinone{intercept = 1; nuke = 1},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "cek" = (/obj/machinery/vending/cigarette,/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "cel" = (/obj/structure/table,/obj/item/weapon/storage/donkpocket_kit{pixel_x = 3; pixel_y = 3},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) "cem" = (/obj/structure/stool{pixel_y = 8},/turf/unsimulated/floor{icon = 'shuttle.dmi'; icon_state = "floor4"},/area/syndicate_station/start) @@ -9588,4 +9588,4 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -"} +"} \ No newline at end of file diff --git a/maps/uterus.dmm b/maps/uterus.dmm index 700936e73b6..cdd4075fc42 100644 --- a/maps/uterus.dmm +++ b/maps/uterus.dmm @@ -304,7 +304,7 @@ "afR" = (/obj/item/weapon/hand_tele,/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) "afS" = (/obj/item/weapon/soap/deluxe,/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) "afT" = (/obj/item/weapon/camera_test,/obj/item/weapon/storage/photo_album{pixel_y = -10},/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) -"afU" = (/obj/machinery/recharger{pixel_y = 4},/obj/item/weapon/melee/chainofcommand,/obj/machinery/light_switch{pixel_y = 24},/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) +"afU" = (/obj/machinery/recharger{pixel_y = 4},/obj/machinery/light_switch{pixel_y = 24},/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) "afV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = "Streight"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) "afW" = (/obj/machinery/light/lamp{pixel_x = 4; pixel_y = 1},/obj/structure/table/woodentable,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) "afX" = (/obj/machinery/computer/card,/obj/item/weapon/card/id/captains_spare,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/captain) @@ -4466,7 +4466,7 @@ "bHT" = (/obj/machinery/door/airlock/centcom{name = "General Access"; opacity = 1; req_access_txt = "101"},/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "bHU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) "bHV" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 5; health = 1e+007},/turf/unsimulated/floor{name = "plating"},/area/tdome) -"bHW" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/suit/wcoat,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) +"bHW" = (/obj/structure/rack,/obj/item/clothing/head/that,/obj/item/clothing/under/suit_jacket,/obj/item/clothing/suit/storage/wcoat,/turf/unsimulated/floor{icon_state = "cafeteria"; dir = 2},/area/centcom/holding) "bHX" = (/turf/unsimulated/floor{icon_state = "floor"},/area/centcom/holding) "bHY" = (/obj/structure/table,/turf/unsimulated/floor{icon_state = "floor"},/area/tdome) "bHZ" = (/turf/unsimulated/floor{icon_state = "floor"},/area/tdome)