diff --git a/baystation12.dme b/baystation12.dme
index ca07b9249fc..c7929f31df1 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -248,6 +248,7 @@
#include "code\game\gamemodes\events\holidays\Holidays.dm"
#include "code\game\gamemodes\events\holidays\Other.dm"
#include "code\game\gamemodes\extended\extended.dm"
+#include "code\game\gamemodes\heist\heist.dm"
#include "code\game\gamemodes\malfunction\Malf_Modules.dm"
#include "code\game\gamemodes\malfunction\malfunction.dm"
#include "code\game\gamemodes\meteor\meteor.dm"
@@ -313,6 +314,7 @@
#include "code\game\machinery\newscaster.dm"
#include "code\game\machinery\OpTable.dm"
#include "code\game\machinery\overview.dm"
+#include "code\game\machinery\podmen.dm"
#include "code\game\machinery\portable_turret.dm"
#include "code\game\machinery\recharger.dm"
#include "code\game\machinery\rechargestation.dm"
@@ -375,10 +377,12 @@
#include "code\game\machinery\computer\robot.dm"
#include "code\game\machinery\computer\security.dm"
#include "code\game\machinery\computer\shuttle.dm"
+#include "code\game\machinery\computer\skills.dm"
#include "code\game\machinery\computer\specops_shuttle.dm"
#include "code\game\machinery\computer\station_alert.dm"
#include "code\game\machinery\computer\syndicate_shuttle.dm"
#include "code\game\machinery\computer\syndicate_specops_shuttle.dm"
+#include "code\game\machinery\computer\vox_shuttle.dm"
#include "code\game\machinery\doors\airlock.dm"
#include "code\game\machinery\doors\airlock_electronics.dm"
#include "code\game\machinery\doors\alarmlock.dm"
@@ -486,6 +490,7 @@
#include "code\game\objects\items\devices\lightreplacer.dm"
#include "code\game\objects\items\devices\multitool.dm"
#include "code\game\objects\items\devices\paicard.dm"
+#include "code\game\objects\items\devices\pipe_painter.dm"
#include "code\game\objects\items\devices\powersink.dm"
#include "code\game\objects\items\devices\scanners.dm"
#include "code\game\objects\items\devices\taperecorder.dm"
@@ -1260,6 +1265,17 @@
#include "code\modules\surgery\ribcage.dm"
#include "code\modules\surgery\robolimbs.dm"
#include "code\modules\surgery\surgery.dm"
+#include "code\modules\virus2\analyser.dm"
+#include "code\modules\virus2\antibodies.dm"
+#include "code\modules\virus2\centrifuge.dm"
+#include "code\modules\virus2\curer.dm"
+#include "code\modules\virus2\disease2.dm"
+#include "code\modules\virus2\diseasesplicer.dm"
+#include "code\modules\virus2\dishincubator.dm"
+#include "code\modules\virus2\effect.dm"
+#include "code\modules\virus2\helpers.dm"
+#include "code\modules\virus2\isolator.dm"
+#include "code\modules\virus2\items_devices.dm"
#include "code\WorkInProgress\autopsy.dm"
#include "code\WorkInProgress\buildmode.dm"
#include "code\WorkInProgress\explosion_particles.dm"
@@ -1316,13 +1332,6 @@
#include "code\WorkInProgress\SkyMarshal\officer_stuff.dm"
#include "code\WorkInProgress\SkyMarshal\Ultralight_procs.dm"
#include "code\WorkInProgress\Susan\susan_desert_turfs.dm"
-#include "code\WorkInProgress\virus2\analyser.dm"
-#include "code\WorkInProgress\virus2\antibodies.dm"
-#include "code\WorkInProgress\virus2\base.dm"
-#include "code\WorkInProgress\virus2\curer.dm"
-#include "code\WorkInProgress\virus2\diseasesplicer.dm"
-#include "code\WorkInProgress\virus2\dishincubator.dm"
-#include "code\WorkInProgress\virus2\isolator.dm"
#include "code\ZAS\Airflow.dm"
#include "code\ZAS\Connection.dm"
#include "code\ZAS\Debug.dm"
diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm
index c9e763e8390..5baffbcb615 100644
--- a/code/ATMOSPHERICS/pipes.dm
+++ b/code/ATMOSPHERICS/pipes.dm
@@ -527,7 +527,7 @@ obj/machinery/atmospherics/pipe
var/build_killswitch = 1
var/obj/machinery/atmospherics/node1
- New()
+ New()
initialize_directions = dir
..()
@@ -722,7 +722,7 @@ obj/machinery/atmospherics/pipe
icon_state = "manifold_[connected]_[unconnected]"
- if(!connected)
+ if(!connected)
del(src)
return
@@ -951,7 +951,7 @@ obj/machinery/atmospherics/pipe
return
initialize()
-
+
for(var/obj/machinery/atmospherics/target in get_step(src,1))
if(target.initialize_directions & 2)
node1 = target
@@ -1028,7 +1028,7 @@ obj/machinery/atmospherics/pipe
manifold4w/general/hidden
level = 1
icon_state = "manifold4w-f"
-
+
cap
name = "pipe endcap"
desc = "An endcap for pipes"
@@ -1117,28 +1117,9 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u
if (istype(src, /obj/machinery/atmospherics/pipe/vent))
return ..()
- // ===== Handle paints =====
- if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/red))
- src.color = "red"
- user << "\red You paint the pipe red."
- update_icon()
+ if(istype(W,/obj/item/device/pipe_painter))
return 1
- if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/blue))
- src.color = "blue"
- user << "\red You paint the pipe blue."
- update_icon()
- return 1
- if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/green))
- src.color = "green"
- user << "\red You paint the pipe green."
- update_icon()
- return 1
- if(istype(W, /obj/item/weapon/reagent_containers/glass/paint/yellow))
- src.color = "yellow"
- user << "\red You paint the pipe yellow."
- update_icon()
- return 1
-
+
if (!istype(W, /obj/item/weapon/wrench))
return ..()
var/turf/T = src.loc
diff --git a/code/WorkInProgress/kilakk/responseteam.dm b/code/WorkInProgress/kilakk/responseteam.dm
index 575e5ab6fd0..6faafad342f 100644
--- a/code/WorkInProgress/kilakk/responseteam.dm
+++ b/code/WorkInProgress/kilakk/responseteam.dm
@@ -2,7 +2,9 @@
// work in progress
var/const/members_possible = 5
-var/sent_emergency_team = 0
+var/const/members_required = 1 // We need at least *one* person ;_;
+var/global/admin_emergency_team = 0 // Used for admin-spawned response teams
+// 'sent_response_team' for automagic response teams
/client/proc/response_team()
set name = "Dispatch Emergency Response Team"
@@ -18,7 +20,7 @@ var/sent_emergency_team = 0
if(ticker.current_state == GAME_STATE_PREGAME)
usr << "\red The round hasn't started yet!"
return
- if(sent_emergency_team == 1)
+ if(admin_emergency_team || send_emergency_team)
usr << "\red Central Command has already dispatched an emergency response team!"
return
if(alert("Do you want to dispatch an Emergency Response Team?",,"Yes","No") != "Yes")
@@ -35,11 +37,11 @@ var/sent_emergency_team = 0
if(alert("You haven't specified a mission. Exit the setup process?",,"No","Yes")=="Yes")
return
- if(sent_emergency_team)
+ if(admin_emergency_team || send_emergency_team)
usr << "\red Looks like somebody beat you to it!"
return
- sent_emergency_team = 1
+ admin_emergency_team = 1
message_admins("[key_name_admin(usr)] is dispatching an Emergency Response Team.", 1)
log_admin("[key_name(usr)] used Dispatch Response Team.")
@@ -87,6 +89,12 @@ var/sent_emergency_team = 0
sleep(300)
+ if(candidates.len < members_required)
+ message_admins("Not enough people signed up for [key_name_admin(usr)]'s response team! Aborting.")
+ log_admin("Response Team aborted: Not Enough Signups.")
+ admin_emergency_team = 0
+ return
+
for(var/i=members_possible,(i>0&&candidates.len), i--) // The rest of the choosing process is just an input with a list of candidates on it
var/chosen = input("Time's up! Choose characters to spawn as reponse team members. This will go on until there are no more ghosts to pick from or until all slots are full.", "Considered Players") as null|anything in candidates
candidates -= chosen
@@ -111,6 +119,7 @@ var/sent_emergency_team = 0
break
spawn(0)
+
switch(alert(new_member, "You are an Emergency Response Team member! Are you a boy or a girl?",,"Male","Female"))
if("Male")
new_member.gender = MALE
@@ -122,9 +131,12 @@ var/sent_emergency_team = 0
if(!new_name)
new_member.real_name = "Agent [pick("Red","Yellow","Orange","Silver","Gold", "Pink", "Purple", "Rainbow")]" // Choose a "random" agent name
new_member.name = usr.real_name
+ new_member.mind.name = usr.real_name
+
else
new_member.real_name = new_name
new_member.name = new_name
+ new_member.mind.name = new_name
// -- CHANGE APPEARANCE --
var/new_tone = input(new_member, "Please select your new skin tone: 1-220 (1=albino, 35=caucasian, 150=black, 220='very' black)", "Character Generation") as num
@@ -171,13 +183,16 @@ var/sent_emergency_team = 0
new_member.update_hair(1)
new_member.mind_initialize()
+
new_member.mind.assigned_role = "Emergency Response Team"
new_member.mind.special_role = "Emergency Response Team"
- ticker.mode.traitors += new_member.mind // ERTs will show up at the end of the round on the "traitor" list
+ ticker.mode.traitors |= new_member.mind // ERTs will show up at the end of the round on the "traitor" list
+ // Join message
new_member << "\blue You are the Emergency Response Team[!leader_selected?"!":" Leader!"] \nAs a response team [!leader_selected?"member":"leader"] you answer directly to [!leader_selected?"your team leader.":"Central Command."] \nYou have been deployed by NanoTrasen Central Command in Tau Ceti to resolve a Code Red alert aboard [station_name()], and have been provided with the following instructions and information regarding your mission: \red [situation]"
new_member.mind.store_memory("Mission Parameters: \red [situation].")
+ // Leader join message
if(leader_selected)
new_member << "\red The Nuclear Authentication Code is: [nuke_code]. You are instructed not to detonate the nuclear device aboard [station_name()] unless absolutely necessary."
new_member.mind.store_memory("Nuclear Authentication Code: \red [nuke_code]")
@@ -213,7 +228,7 @@ var/sent_emergency_team = 0
// Put stuff into their backpacks
equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(src), slot_in_backpack)
- equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid(src), slot_in_backpack) // Not sure about this
+ // equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(src), slot_in_backpack) // Regular medkit
// Loyalty implants
var/obj/item/weapon/implant/loyalty/L = new/obj/item/weapon/implant/loyalty(src)
@@ -235,5 +250,7 @@ var/sent_emergency_team = 0
E.registered_name = real_name
equip_to_slot_or_del(E, slot_wear_id)
+ update_icons()
+
return 1
diff --git a/code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm b/code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm
deleted file mode 100644
index 1f390433269..00000000000
--- a/code/WorkInProgress/virus2/Disease2/biohazard destroyer.dm
+++ /dev/null
@@ -1,20 +0,0 @@
-/obj/machinery/disease2/biodestroyer
- name = "Biohazard destroyer"
- icon = 'icons/obj/pipes/disposal.dmi'
- icon_state = "disposal"
- var/list/accepts = list(/obj/item/clothing,/obj/item/weapon/virusdish/,/obj/item/weapon/cureimplanter,/obj/item/weapon/diseasedisk)
- density = 1
- anchored = 1
-
-/obj/machinery/disease2/biodestroyer/attackby(var/obj/I as obj, var/mob/user as mob)
- for(var/path in accepts)
- if(I.type in typesof(path))
- user.drop_item()
- del(I)
- overlays += image('icons/obj/pipes/disposal.dmi', "dispover-handle")
- return
- user.drop_item()
- I.loc = src.loc
-
- for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] \blue The [src.name] beeps", 2)
diff --git a/code/WorkInProgress/virus2/Disease2/cureimplanter.dm b/code/WorkInProgress/virus2/Disease2/cureimplanter.dm
deleted file mode 100644
index 45064954561..00000000000
--- a/code/WorkInProgress/virus2/Disease2/cureimplanter.dm
+++ /dev/null
@@ -1,42 +0,0 @@
-/obj/item/weapon/cureimplanter
- name = "Hypospray injector"
- icon = 'icons/obj/items.dmi'
- icon_state = "implanter1"
- var/datum/disease2/resistance/resistance = null
- var/works = 0
- var/datum/disease2/disease/virus2 = null
- item_state = "syringe_0"
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
-
-
-/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob)
- if(ismob(target))
- for(var/mob/O in viewers(world.view, user))
- if (target != user)
- O.show_message(text("\red [] is trying to inject [] with [src.name]!", user, target), 1)
- else
- O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1)
- if(!do_mob(user, target,60)) return
-
-
- for(var/mob/O in viewers(world.view, user))
- if (target != user)
- O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1)
- else
- O.show_message("\red [user] injects themself with [src.name]!", 1)
-
-
- var/mob/living/carbon/M = target
-
- if(works == 0 && prob(25))
- M.resistances2 += resistance
- if(M.virus2)
- M.virus2.cure_added(resistance)
- else if(works == 1)
- M.adjustToxLoss(rand(20,50))
- else if(works == 2)
- M.adjustToxLoss(rand(50,100))
- else if(works == 3)
- infect_virus2(M,virus2,1)
diff --git a/code/WorkInProgress/virus2/Disease2/diseasesplicer.dm b/code/WorkInProgress/virus2/Disease2/diseasesplicer.dm
deleted file mode 100644
index 958a14b1f11..00000000000
--- a/code/WorkInProgress/virus2/Disease2/diseasesplicer.dm
+++ /dev/null
@@ -1,202 +0,0 @@
-/obj/machinery/computer/diseasesplicer
- name = "Disease Splicer"
- icon = 'icons/obj/computer.dmi'
- icon_state = "crew"
- //brightnessred = 0
-// brightnessgreen = 2
-// brightnessblue = 2
-// broken_icon
-
- var/datum/disease2/effectholder/memorybank = null
- var/analysed = 0
- var/obj/item/weapon/virusdish/dish = null
- var/burning = 0
-
- var/splicing = 0
- var/scanning = 0
-
-/obj/machinery/computer/diseasesplicer/attackby(var/obj/I as obj, var/mob/user as mob)
-/*
- if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20))
- if (src.stat & BROKEN)
- user << "\blue The broken glass falls out."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- new /obj/item/weapon/shard( src.loc )
- var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 3
- A.icon_state = "3"
- A.anchored = 1
- del(src)
- else
- user << "\blue You disconnect the monitor."
- var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
- var/obj/item/weapon/circuitboard/diseasesplicer/M = new /obj/item/weapon/circuitboard/diseasesplicer( A )
- for (var/obj/C in src)
- C.loc = src.loc
- A.circuit = M
- A.state = 4
- A.icon_state = "4"
- A.anchored = 1
- del(src)*/
- if(istype(I,/obj/item/weapon/virusdish))
- var/mob/living/carbon/c = user
- if(!dish)
-
- dish = I
- c.drop_item()
- I.loc = src
- if(istype(I,/obj/item/weapon/diseasedisk))
- user << "You upload the contents of the disk into the buffer"
- memorybank = I:effect
-
-
- //else
- src.attack_hand(user)
- return
-
-/obj/machinery/computer/diseasesplicer/attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
-
-/obj/machinery/computer/diseasesplicer/attack_paw(var/mob/user as mob)
-
- return src.attack_hand(user)
- return
-
-/obj/machinery/computer/diseasesplicer/attack_hand(var/mob/user as mob)
- if(..())
- return
- user.machine = src
- var/dat
- if(splicing)
- dat = "Splicing in progress"
- else if(scanning)
- dat = "Splicing in progress"
- else if(burning)
- dat = "Data disk burning in progress"
- else
- if(dish)
- dat = "Virus dish inserted"
-
- dat += "
Current DNA strand : "
- if(memorybank)
- dat += ""
- if(analysed)
- dat += "[memorybank.effect.name] ([5-memorybank.effect.stage])"
- else
- dat += "Unknown DNA strand ([5-memorybank.effect.stage])"
- dat += ""
-
- dat += "
Burn DNA Sequence to data storage disk"
- else
- dat += "Empty"
-
- dat += "
"
-
- if(dish)
- if(dish.virus2)
- if(dish.growth >= 50)
- for(var/datum/disease2/effectholder/e in dish.virus2.effects)
- dat += "
DNA strand"
- if(dish.analysed)
- dat += ": [e.effect.name]"
- dat += " (5-[e.effect.stage])"
- else
- dat += "
Insufficent cells to attempt gene splicing"
- else
- dat += "
No virus found in dish"
-
- dat += "
Eject disk"
- else
- dat += "
Please insert dish"
-
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
- return
-
-/obj/machinery/computer/diseasesplicer/process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(500)
- src.updateDialog()
-
- if(scanning)
- scanning -= 1
- if(!scanning)
- state("The [src.name] beeps")
- icon_state = "crew"
- if(splicing)
- splicing -= 1
- if(!splicing)
- state("The [src.name] pings")
- icon_state = "crew"
- if(burning)
- burning -= 1
- if(!burning)
- var/obj/item/weapon/diseasedisk/d = new /obj/item/weapon/diseasedisk(src.loc)
- if(analysed)
- d.name = "[memorybank.effect.name] GNA disk (Stage: [5-memorybank.effect.stage])"
- else
- d.name = "Unknown GNA disk (Stage: [5-memorybank.effect.stage])"
- d.effect = memorybank
- state("The [src.name] zings")
- icon_state = "crew"
-
-
- return
-
-/obj/machinery/computer/diseasesplicer/Topic(href, href_list)
- if(..())
- return
- if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
- usr.machine = src
-
- if (href_list["grab"])
- memorybank = locate(href_list["grab"])
- analysed = dish.analysed
- del(dish)
- dish = null
- scanning = 30
- icon_state = "crew"
-
- else if(href_list["eject"])
- dish.loc = src.loc
- dish = null
-
- else if(href_list["splice"])
- for(var/datum/disease2/effectholder/e in dish.virus2.effects)
- if(e.stage == memorybank.stage)
- e.effect = memorybank.effect
- splicing = 50
- dish.virus2.spreadtype = "Blood"
- icon_state = "crew"
-
- else if(href_list["disk"])
- burning = 20
- icon_state = "crew"
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- return
-
-/obj/machinery/computer/diseasesplicer/proc/state(var/msg)
- for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] \blue [msg]", 2)
-
-
-/obj/item/weapon/diseasedisk
- name = "Blank GNA disk"
- icon = 'icons/obj/cloning.dmi'
- icon_state = "datadisk2"
- var/datum/disease2/effectholder/effect = null
- var/stage = 1
-
-/obj/item/weapon/diseasedisk/premade/New()
- name = "Blank GNA disk (stage: [5-stage])"
- effect = new /datum/disease2/effectholder
- effect.effect = new /datum/disease2/effect/invisible
- effect.stage = stage
diff --git a/code/WorkInProgress/virus2/Disease2/dishincubator.dm b/code/WorkInProgress/virus2/Disease2/dishincubator.dm
deleted file mode 100644
index 921ed21574d..00000000000
--- a/code/WorkInProgress/virus2/Disease2/dishincubator.dm
+++ /dev/null
@@ -1,176 +0,0 @@
-/obj/machinery/disease2/incubator/
- name = "Pathogenic incubator"
- density = 1
- anchored = 1
- icon = 'icons/obj/virology.dmi'
- icon_state = "incubator"
- var/obj/item/weapon/virusdish/dish
- var/obj/item/weapon/reagent_containers/glass/beaker = null
- var/radiation = 0
-
- var/on = 0
- var/power = 0
-
- var/foodsupply = 0
- var/toxins = 0
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(50))
- del(src)
- return
-
- blob_act()
- if (prob(25))
- del(src)
-
- meteorhit()
- del(src)
- return
-
- attackby(var/obj/B as obj, var/mob/user as mob)
- if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe))
-
- if(src.beaker)
- if(istype(beaker,/obj/item/weapon/reagent_containers/syringe))
- user << "A syringe is already loaded into the machine."
- else
- user << "A beaker is already loaded into the machine."
- return
-
- src.beaker = B
- user.drop_item()
- B.loc = src
- if(istype(B,/obj/item/weapon/reagent_containers/syringe))
- user << "You add the syringe to the machine!"
- src.updateUsrDialog()
- else
- user << "You add the beaker to the machine!"
- src.updateUsrDialog()
- else
- if(istype(B,/obj/item/weapon/virusdish))
- if(src.dish)
- user << "A dish is already loaded into the machine."
- return
-
- src.dish = B
- user.drop_item()
- B.loc = src
- if(istype(B,/obj/item/weapon/virusdish))
- user << "You add the dish to the machine!"
- src.updateUsrDialog()
-
- Topic(href, href_list)
- if(stat & BROKEN) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
-
- usr.machine = src
- if(!dish) return
-
- if (href_list["power"])
- on = !on
- if(on)
- icon_state = "incubator_on"
- else
- icon_state = "incubator"
- if (href_list["ejectchem"])
- if(beaker)
- beaker.loc = src.loc
- beaker = null
- if (href_list["ejectdish"])
- if(dish)
- dish.loc = src.loc
- dish = null
- if (href_list["rad"])
- radiation += 10
- if (href_list["flush"])
- radiation = 0
- toxins = 0
- foodsupply = 0
-
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
-
- attack_hand(mob/user as mob)
- if(stat & BROKEN)
- return
- user.machine = src
- var/dat = ""
- if(!dish)
- dat = "Please insert dish into the incubator.
"
- dat += "Close"
- var/string = "Off"
- if(on)
- string = "On"
- dat += "Power status : [string]"
- dat += "
"
- dat += "Food supply : [foodsupply]"
- dat += "
"
- dat += "Radiation Levels : [radiation] RADS : Radiate"
- dat += "
"
- dat += "Toxins : [toxins]"
- dat += "
"
- if(beaker)
- dat += "Eject chemicals : Eject"
- dat += "
"
- if(dish)
- dat += "Eject Virus dish : Eject"
- dat += "
"
- dat += "
"
- dat += "Flush system"
-
-
- user << browse("
Pathogenic incubatorincubator menu:
[dat]", "window=incubator;size=575x400")
- onclose(user, "incubator")
- return
-
-
-
-
- process()
-
- if(dish && on && dish.virus2)
- use_power(50,EQUIP)
- if(!powered(EQUIP))
- on = 0
- icon_state = "incubator"
- if(foodsupply)
- foodsupply -= 1
- dish.growth += 1
- if(dish.growth == 100)
- state("The [src.name] pings")
- if(radiation)
- if(radiation > 50 & prob(5))
- dish.virus2.majormutate()
- if(dish.info)
- dish.info = "OUTDATED : [dish.info]"
- dish.analysed = 0
- state("The [src.name] beeps")
-
- else if(prob(5))
- dish.virus2.minormutate()
- radiation -= 1
- if(toxins && prob(5))
- dish.virus2.infectionchance -= 1
- if(toxins > 50)
- dish.virus2 = null
- else if(!dish)
- on = 0
- icon_state = "incubator"
-
-
- if(beaker)
- if(!beaker.reagents.remove_reagent("virusfood",5))
- foodsupply += 20
- if(!beaker.reagents.remove_reagent("toxins",1))
- toxins += 1
-
- proc/state(var/msg)
- for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] \blue [msg]", 2)
diff --git a/code/WorkInProgress/virus2/Disease2/isolator.dm b/code/WorkInProgress/virus2/Disease2/isolator.dm
deleted file mode 100644
index a8b4f0e8320..00000000000
--- a/code/WorkInProgress/virus2/Disease2/isolator.dm
+++ /dev/null
@@ -1,139 +0,0 @@
-/obj/machinery/disease2/isolator/
- name = "Pathogenic Isolator"
- density = 1
- anchored = 1
- icon = 'icons/obj/virology.dmi'
- icon_state = "isolator"
- var/datum/disease2/disease/virus2 = null
- var/isolating = 0
- var/beaker = null
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(50))
- del(src)
- return
-
- blob_act()
- if (prob(25))
- del(src)
-
- meteorhit()
- del(src)
- return
-
- attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
- if(!istype(B,/obj/item/weapon/reagent_containers/syringe))
- return
-
- if(src.beaker)
- user << "A syringe is already loaded into the machine."
- return
-
- src.beaker = B
- user.drop_item()
- B.loc = src
- if(istype(B,/obj/item/weapon/reagent_containers/syringe))
- user << "You add the syringe to the machine!"
- src.updateUsrDialog()
- icon_state = "isolator_in"
-
- Topic(href, href_list)
- if(stat & BROKEN) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
-
- usr.machine = src
- if(!beaker) return
- var/datum/reagents/R = beaker:reagents
-
- if (href_list["isolate"])
- var/datum/reagent/blood/Blood
- for(var/datum/reagent/blood/B in R.reagent_list)
- if(B)
- Blood = B
- break
-
- if(Blood.data["virus2"])
- virus2 = Blood.data["virus2"]
- isolating = 40
- icon_state = "isolator_processing"
- src.updateUsrDialog()
- return
-
- else if (href_list["main"])
- attack_hand(usr)
- return
- else if (href_list["eject"])
- beaker:loc = src.loc
- beaker = null
- icon_state = "isolator"
- src.updateUsrDialog()
- return
-
- attack_hand(mob/user as mob)
- if(stat & BROKEN)
- return
- user.machine = src
- var/dat = ""
- if(!beaker)
- dat = "Please insert sample into the isolator.
"
- dat += "Close"
- else if(isolating)
- dat = "Isolating"
- else
- var/datum/reagents/R = beaker:reagents
- dat += "Eject
"
- if(!R.total_volume)
- dat += "[beaker] is empty."
- else
- dat += "Contained reagents:
"
- for(var/datum/reagent/blood/G in R.reagent_list)
- dat += " [G.name]: Isolate"
- user << browse("Pathogenic IsolatorIsolator menu:
[dat]", "window=isolator;size=575x400")
- onclose(user, "isolator")
- return
-
-
-
-
- process()
- if(isolating > 0)
- isolating -= 1
- if(isolating == 0)
- var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc)
- d.virus2 = virus2.getcopy()
- virus2 = null
- icon_state = "isolator_in"
-
-
-
-
-/obj/item/weapon/virusdish
- name = "Virus containment/growth dish"
- icon = 'icons/obj/items.dmi'
- icon_state = "implantcase-b"
- var/datum/disease2/disease/virus2 = null
- var/growth = 0
- var/info = 0
- var/analysed = 0
-
-/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob)
- if(istype(W,/obj/item/weapon/hand_labeler))
- return
- ..()
- if(prob(50))
- user << "The dish shatters"
- if(virus2.infectionchance > 0)
- infect_virus2(user,virus2)
- del src
-
-/obj/item/weapon/virusdish/examine()
- usr << "This is a virus containment dish"
- if(src.info)
- usr << "It has the following information about its contents"
- usr << src.info
diff --git a/code/WorkInProgress/virus2/Disease2/monkeydispensor.dm b/code/WorkInProgress/virus2/Disease2/monkeydispensor.dm
deleted file mode 100644
index 13d1b9806f6..00000000000
--- a/code/WorkInProgress/virus2/Disease2/monkeydispensor.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/obj/machinery/disease2/monkeycloner
- name = "Monkey dispensor"
- icon = 'icons/obj/cloning.dmi'
- icon_state = "pod_0"
- density = 1
- anchored = 1
-
- var/cloning = 0
-
-/obj/machinery/disease2/monkeycloner/attack_hand()
- if(!cloning)
- cloning = 150
-
- icon_state = "pod_g"
-
-/obj/machinery/disease2/monkeycloner/process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(500)
- src.updateDialog()
-
- if(cloning)
- cloning -= 1
- if(!cloning)
- new /mob/living/carbon/monkey(src.loc)
- icon_state = "pod_0"
-
-
-
- return
diff --git a/code/WorkInProgress/virus2/analyser.dm b/code/WorkInProgress/virus2/analyser.dm
deleted file mode 100644
index 3604d7955f7..00000000000
--- a/code/WorkInProgress/virus2/analyser.dm
+++ /dev/null
@@ -1,78 +0,0 @@
-/obj/machinery/disease2/diseaseanalyser
- name = "Disease Analyser"
- icon = 'virology.dmi'
- icon_state = "analyser"
- anchored = 1
- density = 1
-
- var/scanning = 0
- var/pause = 0
-
- var/obj/item/weapon/virusdish/dish = null
-
-/obj/machinery/disease2/diseaseanalyser/attackby(var/obj/I as obj, var/mob/user as mob)
- if(istype(I,/obj/item/weapon/virusdish))
- var/mob/living/carbon/c = user
- if(!dish)
-
- dish = I
- c.drop_item()
- I.loc = src
- for(var/mob/M in viewers(src))
- if(M == user) continue
- M.show_message("\blue [user.name] inserts the [dish.name] in the [src.name]", 3)
-
-
- else
- user << "There is already a dish inserted"
-
- //else
- return
-
-
-/obj/machinery/disease2/diseaseanalyser/process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(500)
- //src.updateDialog()
-
-
- if(scanning)
- scanning -= 1
- if(scanning == 0)
- var/r = "GNAv2 based virus lifeform"
- r += "
Infection rate : [dish.virus2.infectionchance * 10]"
- r += "
Spread form : [dish.virus2.spreadtype]"
- r += "
Progress Speed : [dish.virus2.stageprob * 10]"
- for(var/datum/disease2/effectholder/E in dish.virus2.effects)
- r += "
Effect:[E.effect.name]. Strength : [E.multiplier * 8]. Verosity : [E.chance * 15]. Type : [5-E.stage]."
- // display the antigens
- var/code = ""
- for(var/V in ANTIGENS) if(text2num(V) & dish.virus2.antigen) code += ANTIGENS[V]
- r += "
Antigen pattern: [code]"
-
- var/obj/item/weapon/paper/P = new /obj/item/weapon/paper(src.loc)
- P.info = r
- dish.info = r
- dish.analysed = 1
- dish.loc = src.loc
- dish = null
- icon_state = "analyser"
-
- for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] \blue The [src.name] prints a sheet of paper", 3)
- else if(dish && !scanning && !pause)
- if(dish.virus2 && dish.growth > 50)
- dish.growth -= 10
- scanning = 5
- icon_state = "analyser_processing"
- else
- pause = 1
- spawn(25)
- dish.loc = src.loc
- dish = null
- for(var/mob/M in viewers(src))
- M.show_message("\icon[src] \blue The [src.name] buzzes", 2)
- pause = 0
-
- return
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/antibodies.dm b/code/WorkInProgress/virus2/antibodies.dm
deleted file mode 100644
index b8810e322da..00000000000
--- a/code/WorkInProgress/virus2/antibodies.dm
+++ /dev/null
@@ -1,58 +0,0 @@
-//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
-
-// pure concentrated antibodies
-datum/reagent/antibodies
- data = new/list("antibodies"=0)
- name = "Antibodies"
- id = "antibodies"
- reagent_state = LIQUID
- color = "#0050F0"
-
- reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
- if(istype(M,/mob/living/carbon))
- if(src.data && method == INGEST)
- if(M:virus2) if(src.data["antibodies"] & M:virus2.antigen)
- M:virus2.dead = 1
- // if the virus is killed this way it immunizes
- // M:antibodies |= M:virus2.antigen
- M:antibodies |= src.data["antibodies"]
- return
-
-// reserving some numbers for later special antigens
-var/global/const/ANTIGEN_A = 1
-var/global/const/ANTIGEN_B = 2
-var/global/const/ANTIGEN_RH = 4
-var/global/const/ANTIGEN_Q = 8
-var/global/const/ANTIGEN_U = 16
-var/global/const/ANTIGEN_V = 32
-var/global/const/ANTIGEN_X = 64
-var/global/const/ANTIGEN_Y = 128
-var/global/const/ANTIGEN_Z = 256
-var/global/const/ANTIGEN_M = 512
-var/global/const/ANTIGEN_N = 1024
-var/global/const/ANTIGEN_P = 2048
-var/global/const/ANTIGEN_O = 4096
-
-var/global/list/ANTIGENS = list("[ANTIGEN_A]" = "A", "[ANTIGEN_B]" = "B", "[ANTIGEN_RH]" = "RH", "[ANTIGEN_Q]" = "Q",
- "[ANTIGEN_U]" = "U", "[ANTIGEN_V]" = "V", "[ANTIGEN_Z]" = "Z", "[ANTIGEN_M]" = "M",
- "[ANTIGEN_N]" = "N", "[ANTIGEN_P]" = "P", "[ANTIGEN_O]" = "O")
-
-
-
-/obj/item/device/antibody_scanner
- name = "Antibody Scanner"
- desc = "Used to scan living beings for antibodies in their blood."
- icon_state = "health"
- w_class = 2.0
- item_state = "electronic"
- flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
-
-
-/obj/item/device/antibody_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
- if(! istype(M, /mob/living/carbon) || !M:antibodies)
- user << "Unable to detect antibodies.."
- else
- // iterate over the list of antigens and see what matches
- var/code = ""
- for(var/V in ANTIGENS) if(text2num(V) & M.antibodies) code += ANTIGENS[V]
- user << text("\blue [src] The antibody scanner displays a cryptic set of data: [code]")
diff --git a/code/WorkInProgress/virus2/base.dm b/code/WorkInProgress/virus2/base.dm
deleted file mode 100644
index 3d8954fc996..00000000000
--- a/code/WorkInProgress/virus2/base.dm
+++ /dev/null
@@ -1,601 +0,0 @@
-/obj/virus
- // a virus instance that is placed on the map, moves, and infects
- invisibility = INVISIBILITY_MAXIMUM
-
- var/datum/disease2/disease
-
- New()
- ..()
- step_rand(src)
- step_rand(src)
- anchored = 1
- spawn(300) del(src)
-
-/mob/living/carbon/proc/get_infection_chance()
- var/score = 0
- var/mob/living/carbon/M = src
- if(istype(M, /mob/living/carbon/human))
- if(M:gloves)
- score += 5
- if(istype(M:wear_suit, /obj/item/clothing/suit/space)) score += 10
- if(istype(M:wear_suit, /obj/item/clothing/suit/bio_suit)) score += 10
- if(istype(M:head, /obj/item/clothing/head/helmet/space)) score += 5
- if(istype(M:head, /obj/item/clothing/head/bio_hood)) score += 5
- if(M.wear_mask)
- score += 5
- if(istype(M:wear_mask, /obj/item/clothing/mask/surgical) && !M.internal)
- score += 10
- if(M.internal)
- score += 10
-
- if(score >= 30)
- return 0
- else if(score == 25 && prob(99))
- return 0
- else if(score == 20 && prob(95))
- return 0
- else if(score == 15 && prob(75))
- return 0
- else if(score == 10 && prob(55))
- return 0
- else if(score == 5 && prob(35))
- return 0
-
- return 1
-
-
-proc/airborne_can_reach(turf/source, turf/target)
- var/obj/dummy = new(source)
- dummy.flags = FPRINT | TABLEPASS
- dummy.pass_flags = PASSTABLE
-
- for(var/i=0, i<5, i++) if(!step_towards(dummy, target)) break
-
- var/rval = (dummy.loc in range(1,target))
- del dummy
- return rval
-
-/proc/infect_virus2(var/mob/living/carbon/M,var/datum/disease2/disease/disease,var/forced = 0)
- if(M.virus2)
- return
- if(!disease)
- return
- //immunity
- /*for(var/iii = 1, iii <= M.immunevirus2.len, iii++)
- if(disease.issame(M.immunevirus2[iii]))
- return*/
-
- // if one of the antibodies in the mob's body matches one of the disease's antigens, don't infect
- if(M.antibodies & disease.antigen != 0) return
-
- for(var/datum/disease2/resistance/res in M.resistances)
- if(res.resistsdisease(disease))
- return
- if(prob(disease.infectionchance) || forced)
- if(M.virus2)
- return
- else
- // certain clothes can prevent an infection
- if(!forced && !M.get_infection_chance())
- return
-
- M.virus2 = disease.getcopy()
- M.virus2.minormutate()
-
- for(var/datum/disease2/resistance/res in M.resistances)
- if(res.resistsdisease(M.virus2))
- M.virus2 = null
-
-
-
-/datum/disease2/resistance
- var/list/datum/disease2/effect/resistances = list()
-
- proc/resistsdisease(var/datum/disease2/disease/virus2)
- var/list/res2 = list()
- for(var/datum/disease2/effect/e in resistances)
- res2 += e.type
- for(var/datum/disease2/effectholder/holder in virus2)
- if(!(holder.effect.type in res2))
- return 0
- else
- res2 -= holder.effect.type
- if(res2.len > 0)
- return 0
- else
- return 1
-
- New(var/datum/disease2/disease/virus2)
- for(var/datum/disease2/effectholder/h in virus2.effects)
- resistances += h.effect.type
-
-
-/proc/infect_mob_random_lesser(var/mob/living/carbon/M)
- if(!M.virus2)
- M.virus2 = new /datum/disease2/disease
- M.virus2.makerandom()
- M.virus2.infectionchance = 1
-
-/proc/infect_mob_random_greater(var/mob/living/carbon/M)
- if(!M.virus2)
- M.virus2 = new /datum/disease2/disease
- M.virus2.makerandom(1)
-
-/datum/disease2/var/antigen = 0 // 16 bits describing the antigens, when one bit is set, a cure with that bit can dock here
-
-/datum/disease2/disease
- var/infectionchance = 10
- var/speed = 1
- var/spreadtype = "Blood" // Can also be "Airborne"
- var/stage = 1
- var/stageprob = 10
- var/dead = 0
- var/clicks = 0
-
- var/uniqueID = 0
- var/list/datum/disease2/effectholder/effects = list()
- proc/makerandom(var/greater=0)
- var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
- holder.stage = 1
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- holder = new /datum/disease2/effectholder
- holder.stage = 2
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- holder = new /datum/disease2/effectholder
- holder.stage = 3
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- holder = new /datum/disease2/effectholder
- holder.stage = 4
- if(greater)
- holder.getrandomeffect_greater()
- else
- holder.getrandomeffect_lesser()
- effects += holder
- uniqueID = rand(0,10000)
- infectionchance = rand(1,10)
- // pick 2 antigens
- antigen |= text2num(pick(ANTIGENS))
- antigen |= text2num(pick(ANTIGENS))
- spreadtype = "Airborne"
-
- proc/makealien()
- var/datum/disease2/effectholder/holder = new /datum/disease2/effectholder
- holder.stage = 1
- holder.chance = 10
- holder.effect = new/datum/disease2/effect/lesser/gunck()
- effects += holder
-
- holder = new /datum/disease2/effectholder
- holder.stage = 2
- holder.chance = 10
- holder.effect = new/datum/disease2/effect/lesser/cough()
- effects += holder
-
- holder = new /datum/disease2/effectholder
- holder.stage = 3
- holder.chance = 10
- holder.effect = new/datum/disease2/effect/greater/toxins()
- effects += holder
-
- holder = new /datum/disease2/effectholder
- holder.stage = 4
- holder.chance = 10
- holder.effect = new/datum/disease2/effect/alien()
- effects += holder
-
- uniqueID = 896 // all alien diseases have the same ID
- infectionchance = 0
- spreadtype = "Airborne"
-
- proc/minormutate()
- var/datum/disease2/effectholder/holder = pick(effects)
- holder.minormutate()
- infectionchance = min(10,infectionchance + rand(0,1))
-
- proc/issame(var/datum/disease2/disease/disease)
- var/list/types = list()
- var/list/types2 = list()
- for(var/datum/disease2/effectholder/d in effects)
- types += d.effect.type
- var/equal = 1
-
- for(var/datum/disease2/effectholder/d in disease.effects)
- types2 += d.effect.type
-
- for(var/type in types)
- if(!(type in types2))
- equal = 0
- return equal
-
- proc/activate(var/mob/living/carbon/mob)
- if(dead)
- cure(mob)
- mob.virus2 = null
- return
- if(mob.stat == 2)
- return
- // with a certain chance, the mob may become immune to the disease before it starts properly
- if(stage <= 1 && clicks == 0)
- if(prob(20))
- mob.antibodies |= antigen // 20% immunity is a good chance IMO, because it allows finding an immune person easily
- else
- if(mob.radiation > 50)
- if(prob(1))
- majormutate()
- if(mob.reagents.has_reagent("spaceacillin"))
- return
- if(mob.reagents.has_reagent("virusfood"))
- mob.reagents.remove_reagent("virusfood",0.1)
- clicks += 10
- if(clicks > stage*100 && prob(10))
- if(stage == 4)
- var/datum/disease2/resistance/res = new /datum/disease2/resistance(src)
- src.cure(mob)
- mob.resistances2 += res
- mob.antibodies |= src.antigen
- mob.virus2 = null
- del src
- stage++
- clicks = 0
- for(var/datum/disease2/effectholder/e in effects)
- e.runeffect(mob,stage)
- clicks+=speed
-
- proc/cure(var/mob/living/carbon/mob)
- var/datum/disease2/effectholder/E
- if(stage>1)
- E = effects[1]
- E.effect.deactivate(mob)
- if(stage>2)
- E = effects[2]
- E.effect.deactivate(mob)
- if(stage>3)
- E = effects[3]
- E.effect.deactivate(mob)
- if(stage>4)
- E = effects[4]
- E.effect.deactivate(mob)
-
- proc/cure_added(var/datum/disease2/resistance/res)
- if(res.resistsdisease(src))
- dead = 1
-
- proc/majormutate()
- var/datum/disease2/effectholder/holder = pick(effects)
- holder.majormutate()
-
-
- proc/getcopy()
-// world << "getting copy"
- var/datum/disease2/disease/disease = new /datum/disease2/disease
- disease.infectionchance = infectionchance
- disease.spreadtype = spreadtype
- disease.stageprob = stageprob
- disease.antigen = antigen
- for(var/datum/disease2/effectholder/holder in effects)
- // world << "adding effects"
- var/datum/disease2/effectholder/newholder = new /datum/disease2/effectholder
- newholder.effect = new holder.effect.type
- newholder.chance = holder.chance
- newholder.cure = holder.cure
- newholder.multiplier = holder.multiplier
- newholder.happensonce = holder.happensonce
- newholder.stage = holder.stage
- disease.effects += newholder
- // world << "[newholder.effect.name]"
- // world << "[disease]"
- return disease
-
-/datum/disease2/effect
- var/chance_maxm = 100
- var/name = "Blanking effect"
- var/stage = 4
- var/maxm = 1
- proc/activate(var/mob/living/carbon/mob,var/multiplier)
- proc/deactivate(var/mob/living/carbon/mob)
-
-/datum/disease2/effect/alien
- name = "Unidentified Foreign Body"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob << "\red You feel something tearing its way out of your stomach..."
- mob.adjustToxLoss(10)
- mob.updatehealth()
- if(prob(40))
- if(mob.client)
- mob.client.mob = new/mob/living/carbon/alien/larva(mob.loc)
- else
- new/mob/living/carbon/alien/larva(mob.loc)
- var/datum/disease2/disease/D = mob:virus2
- mob:gib()
- del D
-
-/datum/disease2/effect/greater/gibbingtons
- name = "Gibbingtons Syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.gib()
-
-/datum/disease2/effect/greater/radian
- name = "Radian's syndrome"
- stage = 4
- maxm = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.radiation += (2*multiplier)
-
-/datum/disease2/effect/greater/toxins
- name = "Hyperacid Syndrome"
- stage = 3
- maxm = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.adjustToxLoss((2*multiplier))
-
-/datum/disease2/effect/greater/scream
- name = "Random screaming syndrome"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*scream")
-
-/datum/disease2/effect/greater/drowsness
- name = "Automated sleeping syndrome"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.drowsyness += 10
-
-/datum/disease2/effect/greater/shakey
- name = "World Shaking syndrome"
- stage = 3
- maxm = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- shake_camera(mob,5*multiplier)
-
-/datum/disease2/effect/greater/deaf
- name = "Hard of hearing syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.ear_deaf += 20
-
-/datum/disease2/effect/invisible
- name = "Waiting Syndrome"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- return
-
-/datum/disease2/effect/greater/telepathic
- name = "Telepathy Syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.mutations |= 512
-
-/*/datum/disease2/effect/greater/noface
- name = "Identity Loss syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.face_dmg++
- deactivate(var/mob/living/carbon/mob)
- mob.face_dmg--*/
-
-/datum/disease2/effect/greater/monkey
- name = "Monkism syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- if(istype(mob,/mob/living/carbon/human))
- var/mob/living/carbon/human/h = mob
- h.monkeyize()
-
-/datum/disease2/effect/greater/sneeze
- name = "Coldingtons Effect"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*sneeze")
-
-/datum/disease2/effect/greater/gunck
- name = "Flemmingtons"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob << "\red Mucous runs down the back of your throat."
-
-/datum/disease2/effect/greater/killertoxins
- name = "Toxification syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.adjustToxLoss(15)
-
-/*/datum/disease2/effect/greater/hallucinations
- name = "Hallucinational Syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.hallucination += 25*/
-
-/datum/disease2/effect/greater/sleepy
- name = "Resting syndrome"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*collapse")
-
-/datum/disease2/effect/greater/mind
- name = "Lazy mind syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.setBrainLoss(50)
-
-/datum/disease2/effect/greater/suicide
- name = "Suicidal syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.suiciding = 1
- //instead of killing them instantly, just put them at -175 health and let 'em gasp for a while
- viewers(mob) << "\red [mob.name] is holding \his breath. It looks like \he's trying to commit suicide."
- mob.adjustOxyLoss(175 - mob.getToxLoss() - mob.getFireLoss() - mob.getBruteLoss() - mob.getOxyLoss())
- mob.updatehealth()
- spawn(200) //in case they get revived by cryo chamber or something stupid like that, let them suicide again in 20 seconds
- mob.suiciding = 0
-
-// lesser syndromes, partly just copypastes
-/datum/disease2/effect/lesser/mind
- name = "Lazy mind syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.setBrainLoss(20)
-
-/datum/disease2/effect/lesser/drowsy
- name = "Bedroom Syndrome"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.drowsyness = 5
-
-/datum/disease2/effect/lesser/deaf
- name = "Hard of hearing syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.ear_deaf = 5
-
-/datum/disease2/effect/lesser/gunck
- name = "Flemmingtons"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob << "\red Mucous runs down the back of your throat."
-
-/datum/disease2/effect/lesser/radian
- name = "Radian's syndrome"
- stage = 4
- maxm = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.radiation += 1
-
-/datum/disease2/effect/lesser/sneeze
- name = "Coldingtons Effect"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*sneeze")
-
-/datum/disease2/effect/lesser/cough
- name = "Anima Syndrome"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*cough")
-
-/*/datum/disease2/effect/lesser/hallucinations
- name = "Hallucinational Syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.hallucination += 5*/
-
-/*/datum/disease2/effect/lesser/arm
- name = "Disarming Syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- var/datum/organ/external/org = mob.organs["r_arm"]
- org.take_damage(3,0,0,0)
- mob << "\red You feel a sting in your right arm."*/
-
-/datum/disease2/effect/lesser/hungry
- name = "Appetiser Effect"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.nutrition = max(0, mob.nutrition - 200)
-
-/datum/disease2/effect/lesser/groan
- name = "Groaning Syndrome"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*groan")
-
-/datum/disease2/effect/lesser/scream
- name = "Loudness Syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*scream")
-
-/datum/disease2/effect/lesser/drool
- name = "Saliva Effect"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*drool")
-
-/datum/disease2/effect/lesser/fridge
- name = "Refridgerator Syndrome"
- stage = 2
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*shiver")
-
-/datum/disease2/effect/lesser/twitch
- name = "Twitcher"
- stage = 1
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*twitch")
-
-/*Removed on request by Spaceman, due to it being detrimental to RP. -CN
-/datum/disease2/effect/lesser/deathgasp
- name = "Zombie Syndrome"
- stage = 4
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*deathgasp")*/
-
-/datum/disease2/effect/lesser/giggle
- name = "Uncontrolled Laughter Effect"
- stage = 3
- activate(var/mob/living/carbon/mob,var/multiplier)
- mob.say("*giggle")
-
-
-/datum/disease2/effect/lesser
- chance_maxm = 10
-
-/datum/disease2/effectholder
- var/name = "Holder"
- var/datum/disease2/effect/effect
- var/chance = 0 //Chance in percentage each tick
- var/cure = "" //Type of cure it requires
- var/happensonce = 0
- var/multiplier = 1 //The chance the effects are WORSE
- var/stage = 0
-
- proc/runeffect(var/mob/living/carbon/human/mob,var/stage)
- if(happensonce > -1 && effect.stage <= stage && prob(chance))
- effect.activate(mob)
- if(happensonce == 1)
- happensonce = -1
-
- proc/getrandomeffect_greater()
- var/list/datum/disease2/effect/list = list()
- for(var/e in (typesof(/datum/disease2/effect/greater) - /datum/disease2/effect/greater))
- // world << "Making [e]"
- var/datum/disease2/effect/f = new e
- if(f.stage == src.stage)
- list += f
- effect = pick(list)
- chance = rand(1,6)
-
- proc/getrandomeffect_lesser()
- var/list/datum/disease2/effect/list = list()
- for(var/e in (typesof(/datum/disease2/effect/lesser) - /datum/disease2/effect/lesser))
- var/datum/disease2/effect/f = new e
- if(f.stage == src.stage)
- list += f
- effect = pick(list)
- chance = rand(1,6)
-
- proc/minormutate()
- switch(pick(1,2,3,4,5))
- if(1)
- chance = rand(0,effect.chance_maxm)
- if(2)
- multiplier = rand(1,effect.maxm)
- proc/majormutate()
- getrandomeffect_greater()
-
-/proc/dprob(var/p)
- return(prob(sqrt(p)) && prob(sqrt(p)))
diff --git a/code/WorkInProgress/virus2/cureimplanter.dm b/code/WorkInProgress/virus2/cureimplanter.dm
deleted file mode 100644
index 80354e5765b..00000000000
--- a/code/WorkInProgress/virus2/cureimplanter.dm
+++ /dev/null
@@ -1,43 +0,0 @@
-/obj/item/weapon/cureimplanter
- name = "Hypospray injector"
- icon = 'items.dmi'
- icon_state = "implanter1"
- var/datum/disease2/resistance/resistance = null
- var/works = 0
- var/datum/disease2/disease/virus2 = null
- item_state = "syringe_0"
- throw_speed = 1
- throw_range = 5
- w_class = 2.0
-
-
-/obj/item/weapon/cureimplanter/attack(mob/target as mob, mob/user as mob)
- if(ismob(target))
- for(var/mob/O in viewers(world.view, user))
- if (target != user)
- O.show_message(text("\red [] is trying to inject [] with [src.name]!", user, target), 1)
- else
- O.show_message("\red [user] is trying to inject themselves with [src.name]!", 1)
- if(!do_mob(user, target,60)) return
-
-
- for(var/mob/O in viewers(world.view, user))
- if (target != user)
- O.show_message(text("\red [] injects [] with [src.name]!", user, target), 1)
- else
- O.show_message("\red [user] injects themself with [src.name]!", 1)
-
-
- var/mob/living/carbon/M = target
-
- if(works == 0)
- M.resistances2 += resistance
- //M.immunevirus2 += M.virus2.getcopy()
- if(M.virus2)
- M.virus2.cure_added(resistance)
- else if(works == 1)
- M.adjustToxLoss(60)
- else if(works == 2)
- M.gib()
- else if(works == 3)
- infect_virus2(M,virus2,1)
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/dishincubator.dm b/code/WorkInProgress/virus2/dishincubator.dm
deleted file mode 100644
index 93b475f4c6c..00000000000
--- a/code/WorkInProgress/virus2/dishincubator.dm
+++ /dev/null
@@ -1,169 +0,0 @@
-/obj/machinery/disease2/incubator/
- name = "Pathogenic incubator"
- density = 1
- anchored = 1
- icon = 'virology.dmi'
- icon_state = "incubator"
- var/obj/item/weapon/virusdish/dish
- var/obj/item/weapon/reagent_containers/glass/beaker = null
- var/radiation = 0
-
- var/on = 0
- var/power = 0
-
- var/foodsupply = 0
- var/toxins = 0
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(50))
- del(src)
- return
-
- blob_act()
- if (prob(25))
- del(src)
-
- meteorhit()
- del(src)
- return
-
- attackby(var/obj/B as obj, var/mob/user as mob)
- if(istype(B, /obj/item/weapon/reagent_containers/glass) || istype(B,/obj/item/weapon/reagent_containers/syringe))
-
- if(src.beaker)
- if(istype(beaker,/obj/item/weapon/reagent_containers/syringe))
- user << "A syringe is already loaded into the machine."
- else
- user << "A beaker is already loaded into the machine."
- return
-
- src.beaker = B
- user.drop_item()
- B.loc = src
- if(istype(B,/obj/item/weapon/reagent_containers/syringe))
- user << "You add the syringe to the machine!"
- src.updateUsrDialog()
- else
- user << "You add the beaker to the machine!"
- src.updateUsrDialog()
- else
- if(istype(B,/obj/item/weapon/virusdish))
- if(src.dish)
- user << "A dish is already loaded into the machine."
- return
-
- src.dish = B
- user.drop_item()
- B.loc = src
- if(istype(B,/obj/item/weapon/virusdish))
- user << "You add the dish to the machine!"
- src.updateUsrDialog()
-
- Topic(href, href_list)
- if(stat & BROKEN) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
- if (href_list["ejectchem"])
- if(beaker)
- beaker.loc = src.loc
- beaker = null
- if(!dish)
- return
- usr.machine = src
- if (href_list["power"])
- on = !on
- if(on)
- icon_state = "incubator_on"
- else
- icon_state = "incubator"
- if (href_list["ejectdish"])
- if(dish)
- dish.loc = src.loc
- dish = null
- if (href_list["rad"])
- radiation += 10
- if (href_list["flush"])
- radiation = 0
- toxins = 0
- foodsupply = 0
-
-
- src.add_fingerprint(usr)
- src.updateUsrDialog()
-
- attack_hand(mob/user as mob)
- if(stat & BROKEN)
- return
- user.machine = src
- var/dat = ""
- if(!dish)
- dat = "Please insert dish into the incubator.
"
- var/string = "Off"
- if(on)
- string = "On"
- dat += "Power status : [string]"
- dat += "
"
- dat += "Food supply : [foodsupply]"
- dat += "
"
- dat += "Radiation Levels : [radiation] RADS : Radiate"
- dat += "
"
- dat += "Toxins : [toxins]"
- dat += "
"
- if(beaker)
- dat += "Eject chemicals : Eject"
- dat += "
"
- if(dish)
- dat += "Eject Virus dish : Eject"
- dat += "
"
- dat += "
"
- dat += "Flush system
"
- dat += "Close
"
- user << browse("Pathogenic incubatorincubator menu:
[dat]", "window=incubator;size=575x400")
- onclose(user, "incubator")
- return
-
-
-
-
- process()
-
- if(dish && on && dish.virus2)
- use_power(50,EQUIP)
- if(!powered(EQUIP))
- on = 0
- icon_state = "incubator"
- if(foodsupply)
- foodsupply -= 1
- dish.growth += 3
- if(dish.growth >= 100)
- state("The [src.name] pings", "blue")
- if(radiation)
- if(radiation > 50 & prob(5))
- dish.virus2.majormutate()
- if(dish.info)
- dish.info = "OUTDATED : [dish.info]"
- dish.analysed = 0
- state("The [src.name] beeps", "blue")
-
- else if(prob(5))
- dish.virus2.minormutate()
- radiation -= 1
- if(toxins && prob(5))
- dish.virus2.infectionchance -= 1
- if(toxins > 50)
- dish.virus2 = null
- else if(!dish)
- on = 0
- icon_state = "incubator"
-
-
- if(beaker)
- if(!beaker.reagents.remove_reagent("virusfood",5))
- foodsupply += 10
- if(!beaker.reagents.remove_reagent("toxin",1))
- toxins += 1
\ No newline at end of file
diff --git a/code/WorkInProgress/virus2/isolator.dm b/code/WorkInProgress/virus2/isolator.dm
deleted file mode 100644
index d337959fd6a..00000000000
--- a/code/WorkInProgress/virus2/isolator.dm
+++ /dev/null
@@ -1,161 +0,0 @@
-/obj/machinery/disease2/isolator/
- name = "Pathogenic Isolator"
- density = 1
- anchored = 1
- icon = 'virology.dmi'
- icon_state = "isolator"
- var/datum/disease2/disease/virus2 = null
- var/isolating = 0
- var/beaker = null
-
- ex_act(severity)
- switch(severity)
- if(1.0)
- del(src)
- return
- if(2.0)
- if (prob(50))
- del(src)
- return
-
- blob_act()
- if (prob(25))
- del(src)
-
- meteorhit()
- del(src)
- return
-
- attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob)
- if(!istype(B,/obj/item/weapon/reagent_containers/syringe))
- return
-
- if(src.beaker)
- user << "A syringe is already loaded into the machine."
- return
-
- src.beaker = B
- user.drop_item()
- B.loc = src
- if(istype(B,/obj/item/weapon/reagent_containers/syringe))
- user << "You add the syringe to the machine!"
- src.updateUsrDialog()
- icon_state = "isolator_in"
-
- Topic(href, href_list)
- if(stat & BROKEN) return
- if(usr.stat || usr.restrained()) return
- if(!in_range(src, usr)) return
-
- usr.machine = src
- if(!beaker) return
- var/datum/reagents/R = beaker:reagents
-
- if (href_list["isolate"])
- var/datum/reagent/blood/Blood
- for(var/datum/reagent/blood/B in R.reagent_list)
- if(B)
- Blood = B
- break
-
- if(Blood.data["virus2"])
- virus2 = Blood.data["virus2"]
- isolating = 40
- icon_state = "isolator_processing"
- src.updateUsrDialog()
- return
-
- else if (href_list["main"])
- attack_hand(usr)
- return
- else if (href_list["eject"])
- beaker:loc = src.loc
- beaker = null
- icon_state = "isolator"
- src.updateUsrDialog()
- return
-
- attack_hand(mob/user as mob)
- if(stat & BROKEN)
- return
- user.machine = src
- var/dat = ""
- if(!beaker)
- dat = "Please insert sample into the isolator.
"
- dat += "Close"
- else if(isolating)
- dat = "Isolating"
- else
- var/datum/reagents/R = beaker:reagents
- dat += "Eject
"
- if(!R.total_volume)
- dat += "[beaker] is empty."
- else
- dat += "Contained reagents:
"
- for(var/datum/reagent/blood/G in R.reagent_list)
- if(G.data["virus2"])
- dat += " [G.name]: Isolate"
- else
- dat += " No pathogen"
- user << browse("Pathogenic IsolatorIsolator menu:
[dat]", "window=isolator;size=575x400")
- onclose(user, "isolator")
- return
-
-
-
-
- process()
- if(isolating > 0)
- isolating -= 1
- if(isolating == 0)
- var/obj/item/weapon/virusdish/d = new /obj/item/weapon/virusdish(src.loc)
- d.virus2 = virus2.getcopy()
- virus2 = null
- icon_state = "isolator_in"
-
-
-
-
-/obj/item/weapon/virusdish
- name = "Virus containment/growth dish"
- icon = 'items.dmi'
- icon_state = "implantcase-b"
- var/datum/disease2/disease/virus2 = null
- var/growth = 0
- var/info = 0
- var/analysed = 0
-
- reagents = list()
-
-/obj/item/weapon/virusdish/random
- name = "Virus Sample"
-
-/obj/item/weapon/virusdish/random/New()
- ..()
- // add a random virus to this dish
- src.virus2 = new /datum/disease2/disease
- src.virus2.makerandom()
- growth = rand(5, 50)
-
-/obj/item/weapon/virusdish/attackby(var/obj/item/weapon/W as obj,var/mob/living/carbon/user as mob)
- if(istype(W,/obj/item/weapon/hand_labeler) || istype(W,/obj/item/weapon/reagent_containers/syringe))
- return
- ..()
- if(prob(50))
- user << "The dish shatters"
- if(virus2.infectionchance > 0)
- for(var/mob/living/carbon/target in view(null, src)) if(!target.virus2)
- if(airborne_can_reach(src.loc, target.loc))
- if(target.get_infection_chance())
- infect_virus2(target,src.virus2)
- del src
-
-/obj/item/weapon/virusdish/examine()
- usr << "This is a virus containment dish"
- if(src.info)
- usr << "It has the following information about its contents"
- usr << src.info
-
-/obj/machinery/proc/state(var/msg)
- for(var/mob/O in hearers(src, null))
- O.show_message("\icon[src] \blue [msg]", 2)
diff --git a/code/WorkInProgress/virus2/monkeydispensor.dm b/code/WorkInProgress/virus2/monkeydispensor.dm
deleted file mode 100644
index aee24b0d4a1..00000000000
--- a/code/WorkInProgress/virus2/monkeydispensor.dm
+++ /dev/null
@@ -1,30 +0,0 @@
-/obj/machinery/disease2/monkeycloner
- name = "Monkey dispensor"
- icon = 'cloning.dmi'
- icon_state = "pod_0"
- density = 1
- anchored = 1
-
- var/cloning = 0
-
-/obj/machinery/disease2/monkeycloner/attack_hand()
- if(!cloning)
- cloning = 150
-
- icon_state = "pod_g"
-
-/obj/machinery/disease2/monkeycloner/process()
- if(stat & (NOPOWER|BROKEN))
- return
- use_power(500)
- //src.updateDialog()
-
- if(cloning)
- cloning -= 1
- if(!cloning)
- new /mob/living/carbon/monkey(src.loc)
- icon_state = "pod_0"
-
-
-
- return
\ No newline at end of file
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 904761eba83..76cab54fd93 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -58,6 +58,10 @@
G.fields["sex"] = H.gender
G.fields["species"] = H.get_species()
G.fields["photo"] = get_id_photo(H)
+ if(H.gen_record && !jobban_isbanned(H, "Records"))
+ G.fields["notes"] = H.gen_record
+ else
+ G.fields["notes"] = "No notes found."
general += G
//Medical Record
diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm
index 57ddf7817e5..b3b03e6ac26 100755
--- a/code/datums/supplypacks.dm
+++ b/code/datums/supplypacks.dm
@@ -356,10 +356,12 @@ var/list/all_supply_groups = list("Operations","Security","Hospitality","Enginee
/obj/item/weapon/storage/firstaid/fire,
/obj/item/weapon/storage/firstaid/toxin,
/obj/item/weapon/storage/firstaid/o2,
+ /obj/item/weapon/storage/firstaid/adv,
/obj/item/weapon/reagent_containers/glass/bottle/antitoxin,
/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin,
- /obj/item/weapon/storage/box/syringes)
+ /obj/item/weapon/storage/box/syringes,
+ /obj/item/weapon/storage/box/autoinjectors)
cost = 10
containertype = /obj/structure/closet/crate/medical
containername = "Medical crate"
diff --git a/code/defines/obj/hydro.dm b/code/defines/obj/hydro.dm
index 9e26cb48fdb..bfea9a3b22b 100644
--- a/code/defines/obj/hydro.dm
+++ b/code/defines/obj/hydro.dm
@@ -81,30 +81,6 @@
plant_type = 2
growthstages = 3
-/obj/item/seeds/replicapod
- name = "pack of replica pod seeds"
- desc = "These seeds grow into replica pods. They say these are used to harvest humans."
- icon_state = "seed-replicapod"
- mypath = "/obj/item/seeds/replicapod"
- species = "replicapod"
- plantname = "Replica Pod"
- productname = "/mob/living/carbon/human" //verrry special -- Urist
- lifespan = 50 //no idea what those do
- endurance = 8
- maturation = 10
- production = 10
- yield = 1 //seeds if there isn't a dna inside
- oneharvest = 1
- potency = 30
- plant_type = 0
- growthstages = 6
- var/ui = null //for storing the guy
- var/se = null
- var/ckey = null
- var/realName = null
- var/datum/mind/mind = null
- gender = MALE
-
/obj/item/seeds/grapeseed
name = "pack of grape seeds"
desc = "These seeds grow into grape vines."
diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm
index 049d7f0cd70..fd034fbf5ae 100755
--- a/code/game/area/Space Station 13 areas.dm
+++ b/code/game/area/Space Station 13 areas.dm
@@ -309,6 +309,11 @@ proc/process_ghost_teleport_locs()
/area/shuttle/research/outpost
icon_state = "shuttle"
+/area/shuttle/vox/station
+ name = "\improper Vox Skipjack"
+ icon_state = "yellow"
+ requires_power = 0
+
/area/airtunnel1/ // referenced in airtunnel.dm:759
/area/dummy/ // Referenced in engine.dm:261
@@ -489,10 +494,29 @@ proc/process_ghost_teleport_locs()
icon_state = "yellow"
requires_power = 0
+/area/vox_station/transit
+ name = "\improper hyperspace"
+ icon_state = "shuttle"
+/area/vox_station/southwest_solars
+ name = "\improper aft port solars"
+ icon_state = "southwest"
+/area/vox_station/northwest_solars
+ name = "\improper fore port solars"
+ icon_state = "northwest"
+/area/vox_station/northeast_solars
+ name = "\improper fore starboard solars"
+ icon_state = "northeast"
+/area/vox_station/southeast_solars
+ name = "\improper aft starboard solars"
+ icon_state = "southeast"
+
+/area/vox_station/mining
+ name = "\improper nearby mining asteroid"
+ icon_state = "north"
//PRISON
/area/prison
diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm
index c0921cd54a1..1c9d5373300 100644
--- a/code/game/area/areas.dm
+++ b/code/game/area/areas.dm
@@ -47,6 +47,10 @@
var/list/cameras = list()
for (var/obj/machinery/camera/C in src)
cameras += C
+ if(state == 1)
+ C.network.Remove("Power Alarms")
+ else
+ C.network.Add("Power Alarms")
for (var/mob/living/silicon/aiPlayer in player_list)
if(aiPlayer.z == source.z)
if (state == 1)
@@ -73,11 +77,15 @@
//updateicon()
for(var/obj/machinery/camera/C in RA)
cameras += C
+ C.network.Add("Atmosphere Alarms")
for(var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.triggerAlarm("Atmosphere", src, cameras, src)
for(var/obj/machinery/computer/station_alert/a in machines)
a.triggerAlarm("Atmosphere", src, cameras, src)
else if (atmosalm == 2)
+ for(var/area/RA in related)
+ for(var/obj/machinery/camera/C in RA)
+ C.network.Remove("Atmosphere Alarms")
for(var/mob/living/silicon/aiPlayer in player_list)
aiPlayer.cancelAlarm("Atmosphere", src, src)
for(var/obj/machinery/computer/station_alert/a in machines)
@@ -101,8 +109,10 @@
spawn()
D.close()
var/list/cameras = list()
- for (var/obj/machinery/camera/C in src)
- cameras += C
+ for(var/area/RA in related)
+ for (var/obj/machinery/camera/C in RA)
+ cameras.Add(C)
+ C.network.Add("Fire Alarms")
for (var/mob/living/silicon/ai/aiPlayer in player_list)
aiPlayer.triggerAlarm("Fire", src, cameras, src)
for (var/obj/machinery/computer/station_alert/a in machines)
@@ -120,6 +130,9 @@
else if(D.density)
spawn(0)
D.open()
+ for(var/area/RA in related)
+ for (var/obj/machinery/camera/C in RA)
+ C.network.Remove("Fire Alarms")
for (var/mob/living/silicon/ai/aiPlayer in player_list)
aiPlayer.cancelAlarm("Fire", src, src)
for (var/obj/machinery/computer/station_alert/a in machines)
diff --git a/code/game/atoms.dm b/code/game/atoms.dm
index 784ba44c188..d160e662e84 100644
--- a/code/game/atoms.dm
+++ b/code/game/atoms.dm
@@ -490,7 +490,7 @@ its easier to just keep the beam vertical.
var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblClickNew() proc is being tested)
-/atom/proc/DblClickNew()
+/*/atom/proc/DblClickNew()
if(!usr) return
// TODO DOOHL: Intergrate params to new proc. Saved for another time because var/valid_place is a fucking brainfuck
@@ -792,7 +792,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
if (in_range)
if ( !animal.restrained() )
- attack_animal(animal)
+ attack_animal(animal)*/
/atom/DblClick(location, control, params) //TODO: DEFERRED: REWRITE
if(!usr) return
@@ -943,9 +943,9 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- ( CAN USE ITEM OR HAS 1 SECOND USE DELAY ) AND NOT CLICKING ON SCREEN -------
- if (usr.next_move < world.time)
- usr.prev_move = usr.next_move
- usr.next_move = world.time + 10
+ if (usr.last_click + usr.click_delay < world.time)
+ usr.last_click = world.time
+ usr.click_delay = 0
else
// ------- ALREADY USED ONE ITEM WITH USE DELAY IN THE PREVIOUS SECOND -------
return
@@ -1109,10 +1109,9 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
// ------- ITEM INACESSIBLE OR CLICKING ON SCREEN -------
if (istype(src, /obj/screen))
// ------- IT'S THE HUD YOU'RE CLICKING ON -------
- usr.prev_move = usr.next_move
- usr:lastDblClick = world.time + 2
- if (usr.next_move < world.time)
- usr.next_move = world.time + 2
+ usr.delay_click(2)
+ if (usr.last_click + usr.click_delay < world.time)
+ usr.last_click = world.time
else
return
@@ -1144,7 +1143,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
src.hand_al(usr, usr.hand)
else
// ------- YOU ARE CLICKING ON AN OBJECT THAT'S INACCESSIBLE TO YOU AND IS NOT YOUR HUD -------
- if((LASER in usr:mutations) && usr:a_intent == "hurt" && world.time >= usr.next_move)
+ if((LASER in usr:mutations) && usr:a_intent == "hurt" && usr.last_click + usr.click_delay < world.time)
// ------- YOU HAVE THE LASER MUTATION, YOUR INTENT SET TO HURT AND IT'S BEEN MORE THAN A DECISECOND SINCE YOU LAS TATTACKED -------
var/turf/T = get_turf(usr)
@@ -1169,7 +1168,7 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
spawn( 1 )
A.process()
- usr.next_move = world.time + 6
+ usr.delay_click(6)
return
/atom/proc/ShiftClick(var/mob/M as mob)
diff --git a/code/game/communications.dm b/code/game/communications.dm
index 94d53f6bf52..32d8ca69348 100644
--- a/code/game/communications.dm
+++ b/code/game/communications.dm
@@ -74,7 +74,6 @@ Radio:
1359 - Security
1441 - death squad
1443 - Confession Intercom
-1349 - Miners
1347 - Cargo techs
Devices:
@@ -110,10 +109,21 @@ var/list/radiochannels = list(
"Supply" = 1347,
)
//depenging helpers
-var/list/DEPT_FREQS = list(1351,1355,1357,1359,1213, 1443, 1441,1347)
+var/list/DEPT_FREQS = list(1351, 1355, 1357, 1359, 1213, 1443, 1441, 1347)
+
+// central command channels, i.e deathsquid & response teams
+var/list/CENT_FREQS = list(1441, 1443)
+
var/const/COMM_FREQ = 1353 //command, colored gold in chat window
var/const/SYND_FREQ = 1213
+// department channels
+var/const/SEC_FREQ = 1359
+var/const/ENG_FREQ = 1357
+var/const/SCI_FREQ = 1351
+var/const/MED_FREQ = 1355
+var/const/SUP_FREQ = 1347
+
#define TRANSMISSION_WIRE 0
#define TRANSMISSION_RADIO 1
diff --git a/code/game/gamemodes/epidemic/epidemic.dm b/code/game/gamemodes/epidemic/epidemic.dm
index 0d4a20ff2fe..60701479e1a 100644
--- a/code/game/gamemodes/epidemic/epidemic.dm
+++ b/code/game/gamemodes/epidemic/epidemic.dm
@@ -124,14 +124,15 @@
for(var/i = 0, i < lethal_amount, i++)
var/mob/living/carbon/human/H = pick(crew)
- if(H.virus2)
+ if(lethal.uniqueID in H.virus2)
i--
continue
- H.virus2 = lethal.getcopy()
+ H.virus2["[lethal.uniqueID]"] = lethal.getcopy()
infectees += H
var/mob/living/carbon/human/patient_zero = pick(infectees)
- patient_zero.virus2.stage = 3
+ var/datum/disease2/disease/V = patient_zero.virus2["[lethal.uniqueID]"]
+ V.stage = 3
cruiser_arrival = world.time + (10 * 90 * 60)
stage = 1
@@ -169,7 +170,7 @@
var/sick = 0
for(var/mob/living/carbon/human/H in world)
if(H.key && H.stat != 2) alive++
- if(H.virus2 && H.stat != 2) sick++
+ if(H.virus2.len && H.stat != 2) sick++
if(alive == 0)
finished = 2
diff --git a/code/game/gamemodes/events/VirusEpidemic.dm b/code/game/gamemodes/events/VirusEpidemic.dm
index 72c7b912039..f44b631a207 100644
--- a/code/game/gamemodes/events/VirusEpidemic.dm
+++ b/code/game/gamemodes/events/VirusEpidemic.dm
@@ -8,7 +8,7 @@
Announce()
if(!virus)
for(var/mob/living/carbon/human/H in world)
- if((H.virus2) || (H.stat == 2) || prob(30))
+ if((H.virus2.len) || (H.stat == 2) || prob(30))
continue
if(prob(100)) // no lethal diseases outside virus mode!
infect_mob_random_lesser(H)
diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm
index 85fdca943e9..bb627fd3bcf 100644
--- a/code/game/gamemodes/game_mode.dm
+++ b/code/game/gamemodes/game_mode.dm
@@ -278,6 +278,7 @@ Implants;
if(BE_REV) roletext="revolutionary"
if(BE_CULTIST) roletext="cultist"
if(BE_NINJA) roletext="ninja"
+ if(BE_RAIDER) roletext="raider"
// Assemble a list of active players without jobbans.
for(var/mob/new_player/player in player_list)
diff --git a/code/game/gamemodes/heist/heist.dm b/code/game/gamemodes/heist/heist.dm
new file mode 100644
index 00000000000..6daacd3ffe4
--- /dev/null
+++ b/code/game/gamemodes/heist/heist.dm
@@ -0,0 +1,251 @@
+/*
+VOX HEIST ROUNDTYPE
+*/
+
+#define MAX_VOX_KILLS 10 //Number of kills during the round before the Inviolate is broken.
+ //Would be nice to use vox-specific kills but is currently not feasible.
+
+var/global/vox_kills = 0 //Used to check the Inviolate.
+
+/datum/game_mode/heist
+ name = "heist"
+ config_tag = "heist"
+ required_players = 15
+ required_players_secret = 25
+ required_enemies = 4
+ recommended_enemies = 6
+
+ 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/list/raid_objectives = list() //Raid objectives.
+ var/list/datum/mind/raiders = list() //Antags.
+ var/list/obj/cortical_stacks = list() //Stacks for 'leave nobody behind' objective.
+
+/datum/game_mode/heist/announce()
+ world << "The current game mode is - Heist!"
+ world << "An unidentified bluespace signature has slipped past the Icarus and is approaching [station_name()]!"
+ world << "Whoever they are, they're likely up to no good. Protect the crew and station resources against this dastardly threat!"
+ world << "Raiders: Loot [station_name()] for anything and everything you need."
+ world << "Personnel: Repel the raiders and their low, low prices and/or crossbows."
+
+/datum/game_mode/heist/can_start()
+
+ if(!..())
+ return 0
+
+ var/list/candidates = get_players_for_role(BE_RAIDER)
+ var/raider_num = 0
+
+ //Check that we have enough vox.
+ if(candidates.len < required_enemies)
+ return 0
+ else if(candidates.len < recommended_enemies)
+ raider_num = candidates.len
+ else
+ raider_num = recommended_enemies
+
+ //Grab candidates randomly until we have enough.
+ while(raider_num > 0)
+ var/datum/mind/new_raider = pick(candidates)
+ raiders += new_raider
+ candidates -= new_raider
+ raider_num--
+
+ for(var/datum/mind/raider in raiders)
+ raider.assigned_role = "MODE"
+ raider.special_role = "Vox Raider"
+ return 1
+
+/datum/game_mode/heist/pre_setup()
+ return 1
+
+/datum/game_mode/heist/post_setup()
+
+ //Build a list of spawn points.
+ var/list/turf/raider_spawn = list()
+
+ for(var/obj/effect/landmark/L in landmarks_list)
+ if(L.name == "voxstart")
+ raider_spawn += get_turf(L)
+ del(L)
+ continue
+
+ //Generate objectives for the group.
+ raid_objectives = forge_vox_objectives()
+
+ var/index = 1
+
+ //Spawn the vox!
+ for(var/datum/mind/raider in raiders)
+
+ if(index > raider_spawn.len)
+ index = 1
+
+ raider.current.loc = raider_spawn[index]
+ index++
+
+ var/sounds = rand(2,8)
+ var/i = 0
+ var/newname = ""
+
+ while(i<=sounds)
+ i++
+ newname += pick(list("ti","hi","ki","ya","ta","ha","ka","ya","chi","cha","kah"))
+
+ var/mob/living/carbon/human/vox = raider.current
+
+ vox.vox_talk_understand = 1
+ vox.real_name = capitalize(newname)
+ vox.name = vox.real_name
+ vox.age = rand(12,20)
+ vox.dna.mutantrace = "vox"
+ vox.h_style = "Short Vox Quills"
+ vox.equip_vox_raider()
+ vox.regenerate_icons()
+
+ raider.objectives = raid_objectives
+ greet_vox(raider)
+
+ spawn (rand(waittime_l, waittime_h))
+ send_intercept()
+
+/datum/game_mode/heist/proc/is_raider_crew_safe()
+
+ if(cortical_stacks.len == 0)
+ return 0
+
+ for(var/obj/stack in cortical_stacks)
+ if (get_area(stack) != locate(/area/shuttle/vox/station))
+ return 0
+ return 1
+
+/datum/game_mode/heist/proc/is_raider_crew_alive()
+
+ for(var/datum/mind/raider in raiders)
+ if(raider.current)
+ if(istype(raider.current,/mob/living/carbon/human) && raider.current.stat != 2)
+ return 1
+ return 0
+
+/datum/game_mode/heist/proc/forge_vox_objectives()
+
+
+ //Commented out for testing.
+ /* var/i = 1
+ var/max_objectives = pick(2,2,2,3,3)
+ var/list/objs = list()
+ while(i<= max_objectives)
+ var/list/goals = list("kidnap","loot","salvage")
+ var/goal = pick(goals)
+ var/datum/objective/heist/O
+
+ if(goal == "kidnap")
+ goals -= "kidnap"
+ O = new /datum/objective/heist/kidnap()
+ else if(goal == "loot")
+ O = new /datum/objective/heist/loot()
+ else
+ O = new /datum/objective/heist/salvage()
+ O.choose_target()
+ objs += O
+
+ i++
+
+ //-All- vox raids have these two objectives. Failing them loses the game.
+ objs += new /datum/objective/heist/inviolate_crew
+ objs += new /datum/objective/heist/inviolate_death */
+
+ raid_objectives += new /datum/objective/heist/kidnap
+ raid_objectives += new /datum/objective/heist/loot
+ raid_objectives += new /datum/objective/heist/salvage
+ raid_objectives += new /datum/objective/heist/inviolate_crew
+ raid_objectives += new /datum/objective/heist/inviolate_death
+
+ for(var/datum/objective/heist/O in raid_objectives)
+ O.choose_target()
+
+ return raid_objectives
+
+/datum/game_mode/heist/proc/greet_vox(var/datum/mind/raider)
+ raider.current << "\blue You are a Vox Raider, fresh from the Shoal!"
+ raider.current << "\blue The Vox are a race of cunning, sharp-eyed nomadic raiders and traders endemic to Tau Ceti and much of the unexplored galaxy. You and the crew have come to the Exodus for plunder, trade or both."
+ raider.current << "\blue Vox are cowardly and will flee from larger groups, but corner one or find them en masse and they are vicious."
+ raider.current << "\blue Use :V to voxtalk, :H to talk on your encrypted channel, and don't forget to turn on your nitrogen internals!"
+ var/obj_count = 1
+ for(var/datum/objective/objective in raider.objectives)
+ raider.current << "Objective #[obj_count]: [objective.explanation_text]"
+ obj_count++
+
+
+/datum/game_mode/heist/declare_completion()
+
+ //No objectives, go straight to the feedback.
+ if(!(raid_objectives.len)) return ..()
+
+ var/win_type = "Major"
+ var/win_group = "Crew"
+ var/win_msg = ""
+
+ var/success = raid_objectives.len
+
+ //Decrease success for failed objectives.
+ for(var/datum/objective/O in raid_objectives)
+ if(!(O.check_completion())) success--
+
+ //Set result by objectives.
+ if(success == raid_objectives.len)
+ win_type = "Major"
+ win_group = "Vox"
+ else if(success > 2)
+ win_type = "Minor"
+ win_group = "Vox"
+ else
+ win_type = "Minor"
+ win_group = "Crew"
+
+ //Now we modify that result by the state of the vox crew.
+ if(!is_raider_crew_alive())
+
+ win_type = "Major"
+ win_group = "Crew"
+ win_msg += "The Vox Raiders have been wiped out!"
+
+ else if(!is_raider_crew_safe())
+
+ if(win_group == "Crew" && win_type == "Minor")
+ win_type = "Major"
+
+ win_group = "Crew"
+ win_msg += "The Vox Raiders have left someone behind!"
+
+ else
+
+ if(win_group == "Vox")
+ if(win_type == "Minor")
+
+ win_type = "Major"
+ win_msg += "The Vox Raiders escaped the station!"
+ else
+ win_msg += "The Vox Raiders were repelled!"
+
+ world << "\red [win_type] [win_group] victory!"
+ world << "[win_msg]"
+ feedback_set_details("round_end_result","heist - [win_type] [win_group]")
+
+ var/count = 1
+ for(var/datum/objective/objective in raid_objectives)
+ if(objective.check_completion())
+ world << "
Objective #[count]: [objective.explanation_text] Success!"
+ feedback_add_details("traitor_objective","[objective.type]|SUCCESS")
+ else
+ world << "
Objective #[count]: [objective.explanation_text] Fail."
+ feedback_add_details("traitor_objective","[objective.type]|FAIL")
+ count++
+
+ ..()
+
+/datum/game_mode/heist/check_finished()
+ if (!(is_raider_crew_alive()) || (vox_shuttle_location && (vox_shuttle_location == "start")))
+ return 1
+ return ..()
\ No newline at end of file
diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm
index 1b3552408c5..3d154485133 100644
--- a/code/game/gamemodes/objective.dm
+++ b/code/game/gamemodes/objective.dm
@@ -742,3 +742,173 @@ datum/objective/absorb
/*-------ENDOF CULTIST------*/
*/
+
+//Vox heist objectives.
+
+datum/objective/heist
+ proc/choose_target()
+ return
+
+datum/objective/heist/kidnap
+ choose_target()
+ var/list/roles = list("Chief Engineer","Research Director","Roboticist","Chemist","Station Engineer")
+ var/list/possible_targets = list()
+ var/list/priority_targets = list()
+
+ for(var/datum/mind/possible_target in ticker.minds)
+ if(possible_target != owner && ishuman(possible_target.current) && (possible_target.current.stat != 2) && (possible_target.assigned_role != "MODE"))
+ possible_targets += possible_target
+ for(var/role in roles)
+ if(possible_target.assigned_role == role)
+ priority_targets += possible_target
+ continue
+
+ if(priority_targets.len > 0)
+ target = pick(priority_targets)
+ else if(possible_targets.len > 0)
+ target = pick(possible_targets)
+
+ if(target && target.current)
+ explanation_text = "The Shoal has a need for [target.current.real_name], the [target.assigned_role]. Take them alive."
+ else
+ explanation_text = "Free Objective"
+ return target
+
+ check_completion()
+ if(target && target.current)
+ if (target.current.stat == 2)
+ return 0 // They're dead. Fail.
+ //if (!target.current.restrained())
+ // return 0 // They're loose. Close but no cigar.
+
+ var/area/shuttle/vox/station/A = locate()
+ for(var/mob/living/carbon/human/M in A)
+ if(target.current == M)
+ return 1 //They're restrained on the shuttle. Success.
+ else
+ return 0
+
+datum/objective/heist/loot
+
+ choose_target()
+ var/loot = "an object"
+ switch(rand(1,8))
+ if(1)
+ target = /obj/structure/particle_accelerator
+ target_amount = 6
+ loot = "a complete particle accelerator"
+ if(2)
+ target = /obj/machinery/the_singularitygen
+ target_amount = 1
+ loot = "a gravitational generator"
+ if(3)
+ target = /obj/machinery/power/emitter
+ target_amount = 4
+ loot = "four emitters"
+ if(4)
+ target = /obj/machinery/nuclearbomb
+ target_amount = 1
+ loot = "a nuclear bomb"
+ if(5)
+ target = /obj/item/weapon/gun
+ target_amount = 6
+ loot = "six guns"
+ if(6)
+ target = /obj/item/weapon/gun/energy
+ target_amount = 4
+ loot = "four energy guns"
+ if(7)
+ target = /obj/item/weapon/gun/energy/laser
+ target_amount = 2
+ loot = "two laser guns"
+ if(8)
+ target = /obj/item/weapon/gun/energy/ionrifle
+ target_amount = 1
+ loot = "an ion gun"
+
+ explanation_text = "We are lacking in hardware. Steal [loot]."
+
+ check_completion()
+
+ var/total_amount = 0
+
+ for(var/obj/O in locate(/area/shuttle/vox/station))
+ if(istype(O,target)) total_amount++
+ if(total_amount >= target_amount) return 1
+
+ var/datum/game_mode/heist/H = ticker.mode
+ for(var/datum/mind/raider in H.raiders)
+ if(raider.current)
+ for(var/obj/O in raider.current.get_contents())
+ if(istype(O,target)) total_amount++
+ if(total_amount >= target_amount) return 1
+
+ return 0
+
+datum/objective/heist/salvage
+
+ choose_target()
+ switch(rand(1,8))
+ if(1)
+ target = "metal"
+ target_amount = 300
+ if(2)
+ target = "glass"
+ target_amount = 200
+ if(3)
+ target = "plasteel"
+ target_amount = 100
+ if(4)
+ target = "plasma"
+ target_amount = 100
+ if(5)
+ target = "silver"
+ target_amount = 50
+ if(6)
+ target = "gold"
+ target_amount = 20
+ if(7)
+ target = "uranium"
+ target_amount = 20
+ if(8)
+ target = "diamond"
+ target_amount = 20
+
+ explanation_text = "Ransack the station and escape with [target_amount] [target]."
+
+ check_completion()
+
+ var/total_amount = 0
+
+ for(var/obj/item/O in locate(/area/shuttle/vox/station))
+ if(istype(O,/obj/item/stack/sheet))
+ if(O.name == target)
+ var/obj/item/stack/sheet/S = O
+ total_amount += S.amount
+
+ var/datum/game_mode/heist/H = ticker.mode
+ for(var/datum/mind/raider in H.raiders)
+ if(raider.current)
+ for(var/obj/item/O in raider.current.get_contents())
+ if(istype(O,/obj/item/stack/sheet))
+ if(O.name == target)
+ var/obj/item/stack/sheet/S = O
+ total_amount += S.amount
+
+ if(total_amount >= target_amount) return 1
+ return 0
+
+
+datum/objective/heist/inviolate_crew
+ explanation_text = "Do not leave any Vox behind, alive or dead."
+
+ check_completion()
+ var/datum/game_mode/heist/H = ticker.mode
+ if(H.is_raider_crew_safe()) return 1
+ return 0
+
+datum/objective/heist/inviolate_death
+ explanation_text = "Follow the Inviolate. Minimise death and loss of resources."
+ check_completion()
+ if(vox_kills>5) return 0
+ return 1
\ No newline at end of file
diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm
index cacd825d017..22dd096bcca 100644
--- a/code/game/jobs/job/medical.dm
+++ b/code/game/jobs/job/medical.dm
@@ -28,7 +28,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt)
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat/cmo(H), slot_wear_suit)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
@@ -88,7 +88,7 @@
H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/labcoat(H), slot_wear_suit)
H.equip_to_slot_or_del(new /obj/item/clothing/shoes/white(H), slot_shoes)
H.equip_to_slot_or_del(new /obj/item/device/pda/medical(H), slot_belt)
- H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/regular(H), slot_l_hand)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/firstaid/adv(H), slot_l_hand)
H.equip_to_slot_or_del(new /obj/item/device/flashlight/pen(H), slot_s_store)
if(H.backbag == 1)
H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/survival(H), slot_r_hand)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 5c53d4ce8bb..a4158218a1e 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -61,18 +61,23 @@
t1 = "*dead*"
else
dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1)
+ if(iscarbon(occupant))
+ var/mob/living/carbon/C = occupant
+ dat += text("[]\t-Pulse, bpm: []
", (C.pulse == PULSE_NONE || C.pulse == PULSE_THREADY ? "" : ""), C.get_pulse(GETPULSE_TOOL))
dat += text("[]\t-Brute Damage %: []
", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss())
dat += text("[]\t-Respiratory Damage %: []
", (occupant.getOxyLoss() < 60 ? "" : ""), occupant.getOxyLoss())
dat += text("[]\t-Toxin Content %: []
", (occupant.getToxLoss() < 60 ? "" : ""), occupant.getToxLoss())
dat += text("[]\t-Burn Severity %: []
", (occupant.getFireLoss() < 60 ? "" : ""), occupant.getFireLoss())
dat += text("
Paralysis Summary %: [] ([] seconds left!)
", occupant.paralysis, round(occupant.paralysis / 4))
if(occupant.reagents)
- dat += text("Inaprovaline units: [] units
", occupant.reagents.get_reagent_amount("inaprovaline"))
- dat += text("Soporific: [] units
", occupant.reagents.get_reagent_amount("stoxin"))
- dat += text("Dermaline: [] units
", occupant.reagents.get_reagent_amount("dermaline"))
- dat += text("Bicaridine: [] units
", occupant.reagents.get_reagent_amount("bicaridine"))
- dat += text("Dexalin: [] units
", occupant.reagents.get_reagent_amount("dexalin"))
- dat += text("
Refresh meter readings each second
Inject Inaprovaline
Inject Soporific
Inject Dermaline
Inject Bicaridine
Inject Dexalin", src, src, src, src, src, src)
+ for(var/chemical in connected.available_chemicals)
+ dat += "[connected.available_chemicals[chemical]]: [occupant.reagents.get_reagent_amount(chemical)] units
"
+ dat += "
Refresh meter readings each second
"
+ for(var/chemical in connected.available_chemicals)
+ dat += "Inject [connected.available_chemicals[chemical]]: "
+ for(var/amount in connected.amounts)
+ dat += "[amount] units "
+ dat += "
"
else
dat += "The sleeper is empty."
dat += text("
Close", user)
@@ -85,27 +90,15 @@
return
if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon/ai)))
usr.set_machine(src)
- if (src.connected)
- if (src.connected.occupant)
- if(src.connected.occupant.health > 0)
- if (href_list["inap"])
- src.connected.inject_inap(usr)
- if (href_list["stox"])
- src.connected.inject_stox(usr)
- if (href_list["derm"])
- src.connected.inject_dermaline(usr)
- if (href_list["bic"])
- src.connected.inject_bicaridine(usr)
- if (href_list["dex"])
- src.connected.inject_dexalin(usr)
- else
- if(src.connected.occupant.health > -100)
- if (href_list["inap"])
- src.connected.inject_inap(usr)
- if (href_list["stox"] || href_list["derm"] || href_list["bic"] || href_list["dex"])
- usr << "\red \b this person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!"
- else
+ if (href_list["chemical"])
+ if (src.connected)
+ if (src.connected.occupant)
+ if (src.connected.occupant.stat == DEAD)
usr << "\red \b This person has no life for to preserve anymore. Take them to a department capable of reanimating them."
+ else if(src.connected.occupant.health > 0 || href_list["chemical"] == "inaprovaline")
+ src.connected.inject_chemical(usr,href_list["chemical"],text2num(href_list["amount"]))
+ else
+ usr << "\red \b This person is not in good enough condition for sleepers to be effective! Use another means of treatment, such as cryogenics!"
if (href_list["refresh"])
src.updateUsrDialog()
src.add_fingerprint(usr)
@@ -139,6 +132,8 @@
anchored = 1
var/orient = "LEFT" // "RIGHT" changes the dir suffix to "-r"
var/mob/living/occupant = null
+ var/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "dermaline" = "Dermaline", "bicaridine" = "Bicaridine", "dexalin" = "Dexalin")
+ var/amounts = list(10, 20)
New()
@@ -272,53 +267,13 @@
return
- proc/inject_inap(mob/living/user as mob)
+ proc/inject_chemical(mob/living/user as mob, chemical, amount)
if(src.occupant && src.occupant.reagents)
- if(src.occupant.reagents.get_reagent_amount("inaprovaline") + 30 <= 60)
- src.occupant.reagents.add_reagent("inaprovaline", 30)
- user << text("Occupant now has [] units of Inaprovaline in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("inaprovaline"))
- else
- user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
- return
-
-
- proc/inject_stox(mob/living/user as mob)
- if(src.occupant && src.occupant.reagents)
- if(src.occupant.reagents.get_reagent_amount("stoxin") + 20 <= 40)
- src.occupant.reagents.add_reagent("stoxin", 20)
- user << text("Occupant now has [] units of soporifics in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("stoxin"))
- else
- user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
- return
-
-
- proc/inject_dermaline(mob/living/user as mob)
- if(src.occupant && src.occupant.reagents)
- if(src.occupant.reagents.get_reagent_amount("dermaline") + 20 <= 40)
- src.occupant.reagents.add_reagent("dermaline", 20)
- user << text("Occupant now has [] units of Dermaline in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("dermaline"))
- else
- user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
- return
-
-
- proc/inject_bicaridine(mob/living/user as mob)
- if(src.occupant && src.occupant.reagents)
- if(src.occupant.reagents.get_reagent_amount("bicaridine") + 10 <= 20)
- src.occupant.reagents.add_reagent("bicaridine", 10)
- user << text("Occupant now has [] units of Bicaridine in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("bicaridine"))
- else
- user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
- return
-
-
- proc/inject_dexalin(mob/living/user as mob)
- if(src.occupant && src.occupant.reagents)
- if(src.occupant.reagents.get_reagent_amount("dexalin") + 20 <= 40)
- src.occupant.reagents.add_reagent("dexalin", 20)
- user << text("Occupant now has [] units of Dexalin in his/her bloodstream.", src.occupant.reagents.get_reagent_amount("dexalin"))
- else
- user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
+ if(src.occupant.reagents.get_reagent_amount(chemical) + amount <= 40)
+ src.occupant.reagents.add_reagent(chemical, amount)
+ user << "Occupant now has [src.occupant.reagents.get_reagent_amount(chemical)] units of [available_chemicals[chemical]] in his/her bloodstream."
+ return
+ user << "There's no occupant in the sleeper or the subject rejects the chemicals!"
return
@@ -395,4 +350,4 @@
del(O)
src.add_fingerprint(usr)
return
- return
+ return
\ No newline at end of file
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 72d00d89edc..f2ad62d05e4 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -235,7 +235,7 @@
else
dat += text("[]\tHealth %: [] ([])
", (occupant.health > 50 ? "" : ""), occupant.health, t1)
- if(occupant.virus2)
+ if(occupant.virus2.len)
dat += text("Viral pathogen detected in blood stream.
")
dat += text("[]\t-Brute Damage %: []
", (occupant.getBruteLoss() < 60 ? "" : ""), occupant.getBruteLoss())
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index ec48cf76cc4..ea2456cf977 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -1479,8 +1479,7 @@ FIRE ALARM
A = A.loc
if (!( istype(A, /area) ))
return
- for(var/area/RA in A.related)
- RA.firereset()
+ A.firereset()
update_icon()
return
@@ -1491,8 +1490,7 @@ FIRE ALARM
A = A.loc
if (!( istype(A, /area) ))
return
- for(var/area/RA in A.related)
- RA.firealert()
+ A.firealert()
update_icon()
//playsound(src.loc, 'sound/ambience/signal.ogg', 75, 0)
return
diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm
index 47b27ac54bd..d0345f60905 100644
--- a/code/game/machinery/bots/cleanbot.dm
+++ b/code/game/machinery/bots/cleanbot.dm
@@ -233,7 +233,8 @@ text("[src.oddbutton ? "Yes" : "No"
if(target && path.len == 0)
spawn(0)
if(!src || !target) return
- src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfs, /turf/proc/Distance, 0, 30)
+ src.path = AStar(src.loc, src.target.loc, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 30, id=botcard)
+ if (!path) path = list()
if(src.path.len == 0)
src.oldtarget = src.target
src.target = null
diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm
index 5e5ae744068..d71a43c083e 100644
--- a/code/game/machinery/bots/ed209bot.dm
+++ b/code/game/machinery/bots/ed209bot.dm
@@ -615,6 +615,7 @@ Auto Patrol: []"},
// given an optional turf to avoid
/obj/machinery/bot/ed209/proc/calc_path(var/turf/avoid = null)
src.path = AStar(src.loc, patrol_target, /turf/proc/CardinalTurfsWithAccess, /turf/proc/Distance, 0, 120, id=botcard, exclude=avoid)
+ if (!src.path) src.path = list()
// look for a criminal in view of the bot
diff --git a/code/game/machinery/bots/floorbot.dm b/code/game/machinery/bots/floorbot.dm
index bb984a1787b..69fc5afd3f3 100644
--- a/code/game/machinery/bots/floorbot.dm
+++ b/code/game/machinery/bots/floorbot.dm
@@ -241,9 +241,10 @@
if(src.target && (src.target != null) && src.path.len == 0)
spawn(0)
if(!istype(src.target, /turf/))
- src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30)
+ src.path = AStar(src.loc, src.target.loc, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard)
else
- src.path = AStar(src.loc, src.target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30)
+ src.path = AStar(src.loc, src.target, /turf/proc/AdjacentTurfsSpace, /turf/proc/Distance, 0, 30, id=botcard)
+ if (!src.path) src.path = list()
if(src.path.len == 0)
src.oldtarget = src.target
src.target = null
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index c67a5a77b19..d5408d33308 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -87,6 +87,9 @@
usr << "No network found please hang up and try your call again."
return
+ var/temptag = "[get_area(src)] ([rand(1, 999)])"
+ input = strip_html(input(usr, "How would you like to name the camera?", "Set Camera Name", temptag))
+
state = 4
var/obj/machinery/camera/C = new(src.loc)
src.loc = C
@@ -94,9 +97,12 @@
C.auto_turn()
- C.network = tempnetwork
+ C.network = uniquelist(tempnetwork)
+ tempnetwork = difflist(C.network,RESTRICTED_CAMERA_NETWORKS)
+ if(!tempnetwork.len)//Camera isn't on any open network - remove its chunk from AI visibility.
+ cameranet.removeCamera(C)
- C.c_tag = "[get_area_name(src)] ([rand(1, 999)]"
+ C.c_tag = input
for(var/i = 5; i >= 0; i -= 1)
var/direct = input(user, "Direction?", "Assembling Camera", null) in list("LEAVE IT", "NORTH", "EAST", "SOUTH", "WEST" )
diff --git a/code/game/machinery/computer/Operating.dm b/code/game/machinery/computer/Operating.dm
index 36d4c6ea701..f1a1f02db70 100644
--- a/code/game/machinery/computer/Operating.dm
+++ b/code/game/machinery/computer/Operating.dm
@@ -56,6 +56,7 @@
Fire Damage: [src.victim.getFireLoss()]
Suffocation Damage: [src.victim.getOxyLoss()]
Patient Status: [src.victim.stat ? "Non-Responsive" : "Stable"]
+Heartbeat rate: [victim.get_pulse(GETPULSE_TOOL)]
"}
else
src.victim = null
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index 2081a640d8e..7dca0ae01fb 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -37,6 +37,10 @@
/obj/item/weapon/circuitboard/security
name = "Circuit board (Security)"
build_path = "/obj/machinery/computer/security"
+ var/network = list("SS13")
+ req_access = list(access_security)
+ var/locked = 1
+ var/emagged = 0
/obj/item/weapon/circuitboard/aicore
name = "Circuit board (AI core)"
origin_tech = "programming=4;biotech=2"
@@ -80,6 +84,9 @@
/obj/item/weapon/circuitboard/secure_data
name = "Circuit board (Security Records)"
build_path = "/obj/machinery/computer/secure_data"
+/obj/item/weapon/circuitboard/skills
+ name = "Circuit board (Employment Records)"
+ build_path = "/obj/machinery/computer/skills"
/obj/item/weapon/circuitboard/stationalert
name = "Circuit board (Station Alerts)"
build_path = "/obj/machinery/computer/station_alert"
@@ -166,10 +173,6 @@
name = "Circuit board (Operating Computer)"
build_path = "/obj/machinery/computer/operating"
origin_tech = "programming=2;biotech=2"
-/obj/item/weapon/circuitboard/mining
- name = "Circuit board (Outpost Status Display)"
- build_path = "/obj/machinery/computer/security/mining"
- origin_tech = "programming=2"
/obj/item/weapon/circuitboard/comm_monitor
name = "Circuit board (Telecommunications Monitor)"
build_path = "/obj/machinery/computer/telecomms/monitor"
@@ -238,6 +241,40 @@
user << "DERP! BUG! Report this (And what you were doing to cause it) to Agouri"
return
+/obj/item/weapon/circuitboard/security/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/weapon/card/emag))
+ if(emagged)
+ user << "Circuit lock is already removed."
+ return
+ user << "\blue You override the circuit lock and open controls."
+ emagged = 1
+ locked = 0
+ else if(istype(I,/obj/item/weapon/card/id))
+ if(emagged)
+ user << "\red Circuit lock does not respond."
+ return
+ if(check_access(I))
+ locked = !locked
+ user << "\blue You [locked ? "" : "un"]lock the circuit controls."
+ else
+ user << "\red Access denied."
+ else if(istype(I,/obj/item/device/multitool))
+ if(locked)
+ user << "\red Circuit controls are locked."
+ return
+ var/existing_networks = dd_list2text(network,",")
+ var/input = strip_html(input(usr, "Which networks would you like to connect this camera console circuit to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Multitool-Circuitboard interface", existing_networks))
+ if(!input)
+ usr << "No input found please hang up and try your call again."
+ return
+ var/list/tempnetwork = text2list(input, ",")
+ tempnetwork = difflist(tempnetwork,RESTRICTED_CAMERA_NETWORKS,1)
+ if(tempnetwork.len < 1)
+ usr << "No network found please hang up and try your call again."
+ return
+ network = tempnetwork
+ return
+
/obj/item/weapon/circuitboard/rdconsole/attackby(obj/item/I as obj, mob/user as mob)
if(istype(I,/obj/item/weapon/screwdriver))
if(src.build_path == "/obj/machinery/computer/rdconsole/core")
@@ -353,4 +390,8 @@
var/obj/machinery/computer/supplycomp/SC = B
var/obj/item/weapon/circuitboard/supplycomp/C = circuit
SC.can_order_contraband = C.contraband_enabled
- del(src)
+ if(istype(circuit,/obj/item/weapon/circuitboard/security))
+ var/obj/machinery/computer/security/C = B
+ var/obj/item/weapon/circuitboard/security/CB = circuit
+ C.network = CB.network
+ del(src)
\ No newline at end of file
diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm
index 0e4caf97c3f..aeec294fa40 100644
--- a/code/game/machinery/computer/camera.dm
+++ b/code/game/machinery/computer/camera.dm
@@ -5,7 +5,6 @@
name = "Security Cameras"
desc = "Used to access the various cameras on the station."
icon_state = "cameras"
- circuit = "/obj/item/weapon/circuitboard/security"
var/obj/machinery/camera/current = null
var/last_pic = 1.0
var/list/network = list("SS13")
@@ -78,7 +77,38 @@
attack_hand(user)
return
-
+ attackby(I as obj, user as mob)
+ if(istype(I, /obj/item/weapon/screwdriver))
+ playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ if(do_after(user, 20))
+ if (stat & BROKEN)
+ user << "\blue The broken glass falls out."
+ var/obj/structure/computerframe/CF = new /obj/structure/computerframe(loc)
+ new /obj/item/weapon/shard(loc)
+ var/obj/item/weapon/circuitboard/security/CB = new /obj/item/weapon/circuitboard/security(CF)
+ CB.network = network
+ for (var/obj/C in src)
+ C.loc = loc
+ CF.circuit = CB
+ CF.state = 3
+ CF.icon_state = "3"
+ CF.anchored = 1
+ del(src)
+ else
+ user << "\blue You disconnect the monitor."
+ var/obj/structure/computerframe/CF = new /obj/structure/computerframe( loc )
+ var/obj/item/weapon/circuitboard/security/CB = new /obj/item/weapon/circuitboard/security(CF)
+ CB.network = network
+ for (var/obj/C in src)
+ C.loc = loc
+ CF.circuit = CB
+ CF.state = 4
+ CF.icon_state = "4"
+ CF.anchored = 1
+ del(src)
+ else
+ attack_hand(user)
+ return
/obj/machinery/computer/security/telescreen
name = "Telescreen"
@@ -87,7 +117,6 @@
icon_state = "telescreen"
network = list("thunder")
density = 0
- circuit = null
/obj/machinery/computer/security/telescreen/update_icon()
icon_state = initial(icon_state)
@@ -100,10 +129,6 @@
desc = "Damn, they better have /tg/thechannel on these things."
icon = 'icons/obj/status_display.dmi'
icon_state = "entertainment"
- network = list("thunder")
- density = 0
- circuit = null
-
/obj/machinery/computer/security/wooden_tv
name = "Security Cameras"
@@ -116,4 +141,9 @@
desc = "Used to access the various cameras on the outpost."
icon_state = "miningcameras"
network = list("MINE")
- circuit = "/obj/item/weapon/circuitboard/mining"
+
+/obj/machinery/computer/security/engineering
+ name = "Engineering Cameras"
+ desc = "Used to monitor fires and breaches."
+ icon_state = "engineeringcameras"
+ network = list("Power Alarms","Atmosphere Alarms","Fire Alarms")
\ No newline at end of file
diff --git a/code/game/machinery/computer/medical.dm b/code/game/machinery/computer/medical.dm
index 81f58d19d0c..c6f2f454567 100644
--- a/code/game/machinery/computer/medical.dm
+++ b/code/game/machinery/computer/medical.dm
@@ -83,6 +83,7 @@
dat += text("\nPrint Record
\nBack
", src, src)
if(5.0)
dat += "Virus Database"
+ /* Advanced diseases is weak! Feeble! Glory to virus2!
for(var/Dt in typesof(/datum/disease/))
var/datum/disease/Dis = new Dt(0)
if(istype(Dis, /datum/disease/advance))
@@ -90,6 +91,11 @@
if(!Dis.desc)
continue
dat += "
[Dis.name]"
+ */
+ for (var/ID in virusDB)
+ var/datum/data/record/v = virusDB[ID]
+ dat += "
[v.fields["name"]]"
+
dat += "
Back"
if(6.0)
dat += "Medical Robot Monitor"
@@ -121,36 +127,56 @@
/obj/machinery/computer/med_data/Topic(href, href_list)
if(..())
return
+
if (!( data_core.general.Find(src.active1) ))
src.active1 = null
+
if (!( data_core.medical.Find(src.active2) ))
src.active2 = null
+
if ((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon)))
usr.set_machine(src)
+
if (href_list["temp"])
src.temp = null
+
if (href_list["scan"])
if (src.scan)
- src.scan.loc = src.loc
- src.scan = null
+
+ if(ishuman(usr))
+ scan.loc = usr.loc
+
+ if(!usr.get_active_hand())
+ usr.put_in_hands(scan)
+
+ scan = null
+
+ else
+ src.scan.loc = src.loc
+ src.scan = null
+
else
var/obj/item/I = usr.get_active_hand()
if (istype(I, /obj/item/weapon/card/id))
usr.drop_item()
I.loc = src
src.scan = I
+
else if (href_list["logout"])
src.authenticated = null
src.screen = null
src.active1 = null
src.active2 = null
+
else if (href_list["login"])
+
if (istype(usr, /mob/living/silicon/ai))
src.active1 = null
src.active2 = null
src.authenticated = usr.name
src.rank = "AI"
src.screen = 1
+
else if (istype(usr, /mob/living/silicon/robot))
src.active1 = null
src.active2 = null
@@ -158,13 +184,16 @@
var/mob/living/silicon/robot/R = usr
src.rank = R.braintype
src.screen = 1
+
else if (istype(src.scan, /obj/item/weapon/card/id))
src.active1 = null
src.active2 = null
+
if (src.check_access(src.scan))
src.authenticated = src.scan.registered_name
src.rank = src.scan.assignment
src.screen = 1
+
if (src.authenticated)
if(href_list["screen"])
@@ -176,20 +205,12 @@
src.active2 = null
if(href_list["vir"])
- var/type = href_list["vir"]
- var/datum/disease/Dis = new type(0)
- var/AfS = ""
- for(var/Str in Dis.affected_species)
- AfS += " [Str];"
- src.temp = {"Name: [Dis.name]
-
Number of stages: [Dis.max_stages]
-
Spread: [Dis.spread] Transmission
-
Possible Cure: [(Dis.cure||"none")]
-
Affected Species:[AfS]
-
-
Notes: [Dis.desc]
-
-
Severity: [Dis.severity]"}
+ var/datum/data/record/v = locate(href_list["vir"])
+ src.temp = "GNAv2 based virus lifeform V-[v.fields["id"]]"
+ src.temp += "
Name: [v.fields["name"]]"
+ src.temp += "
Antigen: [v.fields["antigen"]]"
+ src.temp += "
Spread: [v.fields["spread type"]] "
+ src.temp += "
Details:
[v.fields["description"]]"
if (href_list["del_all"])
src.temp = text("Are you sure you wish to delete all records?
\n\tYes
\n\tNo
", src, src)
@@ -279,7 +300,7 @@
src.active2.fields["notes"] = t1
if("p_stat")
if (istype(src.active1, /datum/data/record))
- src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*Unconscious*
\n\tActive
\n\tPhysically Unfit
", src, src, src, src)
+ src.temp = text("Physical Condition:
\n\t*Deceased*
\n\t*SSD*
\n\tActive
\n\tPhysically Unfit
\n\tDisabled
", src, src, src, src, src)
if("m_stat")
if (istype(src.active1, /datum/data/record))
src.temp = text("Mental Condition:
\n\t*Insane*
\n\t*Unstable*
\n\t*Watch*
\n\tStable
", src, src, src, src)
@@ -292,6 +313,20 @@
if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
return
src.active1.fields["dna"] = t1
+ if("vir_name")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if (v)
+ var/t1 = copytext(sanitize(input("Please input pathogen name:", "VirusDB", v.fields["name"], null) as text),1,MAX_MESSAGE_LEN)
+ if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ return
+ v.fields["name"] = t1
+ if("vir_desc")
+ var/datum/data/record/v = locate(href_list["edit_vir"])
+ if (v)
+ var/t1 = copytext(sanitize(input("Please input information about pathogen:", "VirusDB", v.fields["description"], null) as message),1,MAX_MESSAGE_LEN)
+ if ((!( t1 ) || !( src.authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || src.active1 != a1))
+ return
+ v.fields["description"] = t1
else
if (href_list["p_stat"])
@@ -299,12 +334,14 @@
switch(href_list["p_stat"])
if("deceased")
src.active1.fields["p_stat"] = "*Deceased*"
- if("unconscious")
- src.active1.fields["p_stat"] = "*Unconscious*"
+ if("ssd")
+ src.active1.fields["p_stat"] = "*SSD*"
if("active")
src.active1.fields["p_stat"] = "Active"
if("unfit")
src.active1.fields["p_stat"] = "Physically Unfit"
+ if("disabled")
+ src.active1.fields["p_stat"] = "Disabled"
if (href_list["m_stat"])
if (src.active1)
@@ -466,7 +503,7 @@
if(4)
R.fields["b_type"] = pick("A-", "B-", "AB-", "O-", "A+", "B+", "AB+", "O+")
if(5)
- R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ R.fields["p_stat"] = pick("*SSD*", "Active", "Physically Unfit", "Disabled")
if(6)
R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
continue
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
new file mode 100644
index 00000000000..7613d711ce6
--- /dev/null
+++ b/code/game/machinery/computer/skills.dm
@@ -0,0 +1,419 @@
+//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
+
+/obj/machinery/computer/skills//TODO:SANITY
+ name = "Employment Records"
+ desc = "Used to view personnel's employment records"
+ icon_state = "medlaptop"
+ req_one_access = list(access_heads)
+ circuit = "/obj/item/weapon/circuitboard/skills"
+ var/obj/item/weapon/card/id/scan = null
+ var/authenticated = null
+ var/rank = null
+ var/screen = null
+ var/datum/data/record/active1 = null
+ var/a_id = null
+ var/temp = null
+ var/printing = null
+ var/can_change_id = 0
+ var/list/Perp
+ var/tempname = null
+ //Sorting Variables
+ var/sortBy = "name"
+ var/order = 1 // -1 = Descending - 1 = Ascending
+
+
+/obj/machinery/computer/skills/attackby(obj/item/O as obj, user as mob)
+ if(istype(O, /obj/item/weapon/card/id) && !scan)
+ usr.drop_item()
+ O.loc = src
+ scan = O
+ user << "You insert [O]."
+ ..()
+
+/obj/machinery/computer/skills/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/skills/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+//Someone needs to break down the dat += into chunks instead of long ass lines.
+/obj/machinery/computer/skills/attack_hand(mob/user as mob)
+ if(..())
+ return
+ if (src.z > 6)
+ user << "\red Unable to establish a connection: \black You're too far away from the station!"
+ return
+ var/dat
+
+ if (temp)
+ dat = text("[]
Clear Screen", temp, src)
+ else
+ dat = text("Confirm Identity: []
", src, (scan ? text("[]", scan.name) : "----------"))
+ if (authenticated)
+ switch(screen)
+ if(1.0)
+ dat += {"
+"}
+ dat += text("Search Records
", src)
+ dat += text("New Record
", src)
+ dat += {"
+
+
+
+
+| Name |
+ID |
+Rank |
+Fingerprints |
+
"}
+ if(!isnull(data_core.general))
+ for(var/datum/data/record/R in sortRecord(data_core.general, sortBy, order))
+ for(var/datum/data/record/E in data_core.security)
+ var/background
+ dat += text("| [] | ", background, src, R, R.fields["name"])
+ dat += text("[] | ", R.fields["id"])
+ dat += text("[] | ", R.fields["rank"])
+ dat += text("[] | ", R.fields["fingerprint"])
+ dat += "
"
+ dat += text("Record Maintenance
", src)
+ dat += text("{Log Out}",src)
+ if(2.0)
+ dat += "Records Maintenance
"
+ dat += "
Delete All Records
Back"
+ if(3.0)
+ dat += "Employment Record
"
+ if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
+ var/icon/front = new(active1.fields["photo"], dir = SOUTH)
+ var/icon/side = new(active1.fields["photo"], dir = WEST)
+ user << browse_rsc(front, "front.png")
+ user << browse_rsc(side, "side.png")
+ dat += text("")
+ else
+ dat += "General Record Lost!
"
+ dat += text("\nDelete Record (ALL)
\nPrint Record
\nBack
", src, src, src)
+ if(4.0)
+ if(!Perp.len)
+ dat += text("ERROR. String could not be located.
Back", src)
+ else
+ dat += {"
+
+ "}
+ dat += text("| Search Results for '[]': | ", tempname)
+ dat += {"
+
+
+
+
+| Name |
+ID |
+Rank |
+Fingerprints |
+
"}
+ for(var/i=1, i<=Perp.len, i += 2)
+ var/crimstat = ""
+ var/datum/data/record/R = Perp[i]
+ if(istype(Perp[i+1],/datum/data/record/))
+ var/datum/data/record/E = Perp[i+1]
+ crimstat = E.fields["criminal"]
+ var/background
+ background = "'background-color:#00FF7F;'"
+ dat += text("| [] | ", background, src, R, R.fields["name"])
+ dat += text("[] | ", R.fields["id"])
+ dat += text("[] | ", R.fields["rank"])
+ dat += text("[] | ", R.fields["fingerprint"])
+ dat += text("[] |
", crimstat)
+ dat += "
"
+ dat += text("
Return to index.", src)
+ else
+ else
+ dat += text("{Log In}", src)
+ user << browse(text("Employment Records[]", dat), "window=secure_rec;size=600x400")
+ onclose(user, "secure_rec")
+ return
+
+/*Revised /N
+I can't be bothered to look more of the actual code outside of switch but that probably needs revising too.
+What a mess.*/
+/obj/machinery/computer/skills/Topic(href, href_list)
+ if(..())
+ return
+ if (!( data_core.general.Find(active1) ))
+ active1 = null
+ if ((usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon)))
+ usr.set_machine(src)
+ switch(href_list["choice"])
+// SORTING!
+ if("Sorting")
+ // Reverse the order if clicked twice
+ if(sortBy == href_list["sort"])
+ if(order == 1)
+ order = -1
+ else
+ order = 1
+ else
+ // New sorting order!
+ sortBy = href_list["sort"]
+ order = initial(order)
+//BASIC FUNCTIONS
+ if("Clear Screen")
+ temp = null
+
+ if ("Return")
+ screen = 1
+ active1 = null
+
+ if("Confirm Identity")
+ if (scan)
+ if(istype(usr,/mob/living/carbon/human) && !usr.get_active_hand())
+ usr.put_in_hands(scan)
+ else
+ scan.loc = get_turf(src)
+ scan = null
+ else
+ var/obj/item/I = usr.get_active_hand()
+ if (istype(I, /obj/item/weapon/card/id))
+ usr.drop_item()
+ I.loc = src
+ scan = I
+
+ if("Log Out")
+ authenticated = null
+ screen = null
+ active1 = null
+
+ if("Log In")
+ if (istype(usr, /mob/living/silicon/ai))
+ src.active1 = null
+ src.authenticated = usr.name
+ src.rank = "AI"
+ src.screen = 1
+ else if (istype(usr, /mob/living/silicon/robot))
+ src.active1 = null
+ src.authenticated = usr.name
+ var/mob/living/silicon/robot/R = usr
+ src.rank = R.braintype
+ src.screen = 1
+ else if (istype(scan, /obj/item/weapon/card/id))
+ active1 = null
+ if(check_access(scan))
+ authenticated = scan.registered_name
+ rank = scan.assignment
+ screen = 1
+//RECORD FUNCTIONS
+ if("Search Records")
+ var/t1 = input("Search String: (Partial Name or ID or Fingerprints or Rank)", "Secure. records", null, null) as text
+ if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || !in_range(src, usr)))
+ return
+ Perp = new/list()
+ t1 = lowertext(t1)
+ var/list/components = text2list(t1, " ")
+ if(components.len > 5)
+ return //Lets not let them search too greedily.
+ for(var/datum/data/record/R in data_core.general)
+ var/temptext = R.fields["name"] + " " + R.fields["id"] + " " + R.fields["fingerprint"] + " " + R.fields["rank"]
+ for(var/i = 1, i<=components.len, i++)
+ if(findtext(temptext,components[i]))
+ var/prelist = new/list(2)
+ prelist[1] = R
+ Perp += prelist
+ for(var/i = 1, i<=Perp.len, i+=2)
+ for(var/datum/data/record/E in data_core.security)
+ var/datum/data/record/R = Perp[i]
+ if ((E.fields["name"] == R.fields["name"] && E.fields["id"] == R.fields["id"]))
+ Perp[i+1] = E
+ tempname = t1
+ screen = 4
+
+ if("Record Maintenance")
+ screen = 2
+ active1 = null
+
+ if ("Browse Record")
+ var/datum/data/record/R = locate(href_list["d_rec"])
+ if (!( data_core.general.Find(R) ))
+ temp = "Record Not Found!"
+ else
+ for(var/datum/data/record/E in data_core.security)
+ active1 = R
+ screen = 3
+
+/* if ("Search Fingerprints")
+ var/t1 = input("Search String: (Fingerprint)", "Secure. records", null, null) as text
+ if ((!( t1 ) || usr.stat || !( authenticated ) || usr.restrained() || (!in_range(src, usr)) && (!istype(usr, /mob/living/silicon))))
+ return
+ active1 = null
+ t1 = lowertext(t1)
+ for(var/datum/data/record/R in data_core.general)
+ if (lowertext(R.fields["fingerprint"]) == t1)
+ active1 = R
+ if (!( active1 ))
+ temp = text("Could not locate record [].", t1)
+ else
+ for(var/datum/data/record/E in data_core.security)
+ if ((E.fields["name"] == active1.fields["name"] || E.fields["id"] == active1.fields["id"]))
+ screen = 3 */
+
+ if ("Print Record")
+ if (!( printing ))
+ printing = 1
+ sleep(50)
+ var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
+ P.info = "Employment Record
"
+ if ((istype(active1, /datum/data/record) && data_core.general.Find(active1)))
+ P.info += text("Name: [] ID: []
\nSex: []
\nAge: []
\nFingerprint: []
\nPhysical Status: []
\nMental Status: []
\nEmployment/Skills Summary:[]
", active1.fields["name"], active1.fields["id"], active1.fields["sex"], active1.fields["age"], active1.fields["fingerprint"], active1.fields["p_stat"], active1.fields["m_stat"], active1.fields["notes"])
+ else
+ P.info += "General Record Lost!
"
+ P.info += ""
+ P.name = "paper - 'Employment Record'"
+ printing = null
+//RECORD DELETE
+ if ("Delete All Records")
+ temp = ""
+ temp += "Are you sure you wish to delete all Employment records?
"
+ temp += "Yes
"
+ temp += "No"
+
+ if ("Purge All Records")
+ for(var/datum/data/record/R in data_core.security)
+ del(R)
+ temp = "All Employment records deleted."
+
+ if ("Delete Record (ALL)")
+ if (active1)
+ temp = "Are you sure you wish to delete the record (ALL)?
"
+ temp += "Yes
"
+ temp += "No"
+//RECORD CREATE
+ if ("New Record (General)")
+ var/datum/data/record/G = new /datum/data/record()
+ G.fields["name"] = "New Record"
+ G.fields["id"] = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
+ G.fields["rank"] = "Unassigned"
+ G.fields["real_rank"] = "Unassigned"
+ G.fields["sex"] = "Male"
+ G.fields["age"] = "Unknown"
+ G.fields["fingerprint"] = "Unknown"
+ G.fields["p_stat"] = "Active"
+ G.fields["m_stat"] = "Stable"
+ G.fields["species"] = "Human"
+ data_core.general += G
+ active1 = G
+
+//FIELD FUNCTIONS
+ if ("Edit Field")
+ var/a1 = active1
+ switch(href_list["field"])
+ if("name")
+ if (istype(active1, /datum/data/record))
+ var/t1 = input("Please input name:", "Secure. records", active1.fields["name"], null) as text
+ if ((!( t1 ) || !length(trim(t1)) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon)))) || active1 != a1)
+ return
+ active1.fields["name"] = t1
+ if("id")
+ if (istype(active1, /datum/data/record))
+ var/t1 = copytext(sanitize(input("Please input id:", "Secure. records", active1.fields["id"], null) as text),1,MAX_MESSAGE_LEN)
+ if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ return
+ active1.fields["id"] = t1
+ if("fingerprint")
+ if (istype(active1, /datum/data/record))
+ var/t1 = copytext(sanitize(input("Please input fingerprint hash:", "Secure. records", active1.fields["fingerprint"], null) as text),1,MAX_MESSAGE_LEN)
+ if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ return
+ active1.fields["fingerprint"] = t1
+ if("sex")
+ if (istype(active1, /datum/data/record))
+ if (active1.fields["sex"] == "Male")
+ active1.fields["sex"] = "Female"
+ else
+ active1.fields["sex"] = "Male"
+ if("age")
+ if (istype(active1, /datum/data/record))
+ var/t1 = input("Please input age:", "Secure. records", active1.fields["age"], null) as num
+ if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ return
+ active1.fields["age"] = t1
+ if("rank")
+ var/list/L = list( "Head of Personnel", "Captain", "AI" )
+ //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N
+ if ((istype(active1, /datum/data/record) && L.Find(rank)))
+ temp = "Rank:
"
+ temp += ""
+ for(var/rank in get_all_jobs())
+ temp += "- [rank]
"
+ temp += "
"
+ else
+ alert(usr, "You do not have the required rank to do this!")
+ if("species")
+ if (istype(active1, /datum/data/record))
+ var/t1 = copytext(sanitize(input("Please enter race:", "General records", active1.fields["species"], null) as message),1,MAX_MESSAGE_LEN)
+ if ((!( t1 ) || !( authenticated ) || usr.stat || usr.restrained() || (!in_range(src, usr) && (!istype(usr, /mob/living/silicon))) || active1 != a1))
+ return
+ active1.fields["species"] = t1
+
+//TEMPORARY MENU FUNCTIONS
+ else//To properly clear as per clear screen.
+ temp=null
+ switch(href_list["choice"])
+ if ("Change Rank")
+ if (active1)
+ active1.fields["rank"] = href_list["rank"]
+ if(href_list["rank"] in get_all_jobs())
+ active1.fields["real_rank"] = href_list["real_rank"]
+
+ if ("Delete Record (ALL) Execute")
+ if (active1)
+ for(var/datum/data/record/R in data_core.medical)
+ if ((R.fields["name"] == active1.fields["name"] || R.fields["id"] == active1.fields["id"]))
+ del(R)
+ else
+ del(active1)
+ else
+ temp = "This function does not appear to be working at the moment. Our apologies."
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+
+/obj/machinery/computer/skills/emp_act(severity)
+ if(stat & (BROKEN|NOPOWER))
+ ..(severity)
+ return
+
+ for(var/datum/data/record/R in data_core.security)
+ if(prob(10/severity))
+ switch(rand(1,6))
+ if(1)
+ R.fields["name"] = "[pick(pick(first_names_male), pick(first_names_female))] [pick(last_names)]"
+ if(2)
+ R.fields["sex"] = pick("Male", "Female")
+ if(3)
+ R.fields["age"] = rand(5, 85)
+ if(4)
+ R.fields["criminal"] = pick("None", "*Arrest*", "Incarcerated", "Parolled", "Released")
+ if(5)
+ R.fields["p_stat"] = pick("*Unconcious*", "Active", "Physically Unfit")
+ if(6)
+ R.fields["m_stat"] = pick("*Insane*", "*Unstable*", "*Watch*", "Stable")
+ continue
+
+ else if(prob(1))
+ del(R)
+ continue
+
+ ..(severity)
\ No newline at end of file
diff --git a/code/game/machinery/computer/vox_shuttle.dm b/code/game/machinery/computer/vox_shuttle.dm
new file mode 100644
index 00000000000..fa9d05d7b90
--- /dev/null
+++ b/code/game/machinery/computer/vox_shuttle.dm
@@ -0,0 +1,106 @@
+#define VOX_SHUTTLE_MOVE_TIME 260
+#define VOX_SHUTTLE_COOLDOWN 460
+
+//Copied from Syndicate shuttle.
+var/global/vox_shuttle_location
+
+/obj/machinery/computer/vox_station
+ name = "vox skipjack terminal"
+ icon = 'icons/obj/computer.dmi'
+ icon_state = "syndishuttle"
+ req_access = list(access_syndicate)
+ var/area/curr_location
+ var/moving = 0
+ var/lastMove = 0
+ var/warning //Warning about the end of the round.
+
+/obj/machinery/computer/vox_station/New()
+ curr_location= locate(/area/shuttle/vox/station)
+
+
+/obj/machinery/computer/vox_station/proc/vox_move_to(area/destination as area)
+ if(moving) return
+ if(lastMove + VOX_SHUTTLE_COOLDOWN > world.time) return
+ var/area/dest_location = locate(destination)
+ if(curr_location == dest_location) return
+
+ moving = 1
+ lastMove = world.time
+
+ if(curr_location.z != dest_location.z)
+ var/area/transit_location = locate(/area/vox_station/transit)
+ curr_location.move_contents_to(transit_location)
+ curr_location = transit_location
+ sleep(VOX_SHUTTLE_MOVE_TIME)
+
+ curr_location.move_contents_to(dest_location)
+ curr_location = dest_location
+ moving = 0
+
+ return 1
+
+
+/obj/machinery/computer/vox_station/attackby(obj/item/I as obj, mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/vox_station/attack_ai(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/vox_station/attack_paw(mob/user as mob)
+ return attack_hand(user)
+
+/obj/machinery/computer/vox_station/attack_hand(mob/user as mob)
+ if(!allowed(user))
+ user << "\red Access Denied"
+ return
+
+ user.set_machine(src)
+
+ var/dat = {"Location: [curr_location]
+ Ready to move[max(lastMove + VOX_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + VOX_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
+ Return to dark space
+ Fore port solar |
+ Aft port solar |
+ Fore starboard solar
+ Aft starboard solar |
+ Mining Asteroid
+ Close"}
+
+ user << browse(dat, "window=computer;size=575x450")
+ onclose(user, "computer")
+ return
+
+
+/obj/machinery/computer/vox_station/Topic(href, href_list)
+ if(!isliving(usr)) return
+ var/mob/living/user = usr
+
+ if(in_range(src, user) || istype(user, /mob/living/silicon))
+ user.set_machine(src)
+
+ vox_shuttle_location = "station"
+ if(href_list["start"])
+ if(ticker && (istype(ticker.mode,/datum/game_mode/heist)))
+ if(!warning)
+ user << "\red Returning to dark space will end your raid and report your success or failure. If you are sure, press the button again."
+ warning = 1
+ return
+ vox_move_to(/area/shuttle/vox/station)
+ vox_shuttle_location = "start"
+ else if(href_list["solars_fore_starboard"])
+ vox_move_to(/area/vox_station/northeast_solars)
+ else if(href_list["solars_fore_port"])
+ vox_move_to(/area/vox_station/northwest_solars)
+ else if(href_list["solars_aft_starboard"])
+ vox_move_to(/area/vox_station/southeast_solars)
+ else if(href_list["solars_aft_port"])
+ vox_move_to(/area/vox_station/southwest_solars)
+ else if(href_list["mining"])
+ vox_move_to(/area/vox_station/mining)
+
+ add_fingerprint(usr)
+ updateUsrDialog()
+ return
+
+/obj/machinery/computer/vox_station/bullet_act(var/obj/item/projectile/Proj)
+ visible_message("[Proj] ricochets off [src]!")
\ No newline at end of file
diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm
index 4b095488f9d..abe63412304 100644
--- a/code/game/machinery/cryo.dm
+++ b/code/game/machinery/cryo.dm
@@ -87,7 +87,7 @@
Current cell temperature: [temp_text]K
Cryo status: [ on ? "Off On" : "Off On"]
[beaker_text]
- Current occupant: [occupant ? "
Name: [occupant]
Health: [health_text]
Oxygen deprivation: [round(occupant.getOxyLoss(),0.1)]
Brute damage: [round(occupant.getBruteLoss(),0.1)]
Fire damage: [round(occupant.getFireLoss(),0.1)]
Toxin damage: [round(occupant.getToxLoss(),0.1)]
Body temperature: [occupant.bodytemperature]" : "None"]
+ Current occupant: [occupant ? "
Name: [occupant]
Health: [health_text]
Oxygen deprivation: [round(occupant.getOxyLoss(),0.1)]
Brute damage: [round(occupant.getBruteLoss(),0.1)]
Fire damage: [round(occupant.getFireLoss(),0.1)]
Toxin damage: [round(occupant.getToxLoss(),0.1)]
Body temperature: [occupant.bodytemperature]
Heartbeat rate: [occupant.get_pulse(GETPULSE_TOOL)]" : "None"]
"}
user.set_machine(src)
user << browse(dat, "window=cryo")
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index 4d634d45895..a5eb560e3c1 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -17,222 +17,287 @@
anchored = 1.0 // can't pick it up
density = 0 // can walk through it.
var/id = null // id of door it controls.
- var/releasetime = 0 // when world.time reaches it - release the prisoneer
+ var/releasetime = 0 // when world.timeofday reaches it - release the prisoner
var/timing = 1 // boolean, true/1 timer is on, false/0 means it's not timing
var/picture_state // icon_state of alert picture, if not displaying text/numbers
var/list/obj/machinery/targets = list()
+ var/timetoset = 0 // Used to set releasetime upon starting the timer
- New()
- ..()
+/obj/machinery/door_timer/New()
+ ..()
- pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
- pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
+ pixel_x = ((src.dir & 3)? (0) : (src.dir == 4 ? 32 : -32))
+ pixel_y = ((src.dir & 3)? (src.dir ==1 ? 24 : -32) : (0))
- spawn(20)
- for(var/obj/machinery/door/window/brigdoor/M in world)
- if (M.id == src.id)
- targets += M
+ spawn(20)
+ for(var/obj/machinery/door/window/brigdoor/M in world)
+ if (M.id == src.id)
+ targets += M
- for(var/obj/machinery/flasher/F in world)
- if(F.id == src.id)
- targets += F
+ for(var/obj/machinery/flasher/F in world)
+ if(F.id == src.id)
+ targets += F
- for(var/obj/structure/closet/secure_closet/brig/C in world)
- if(C.id == src.id)
- targets += C
+ for(var/obj/structure/closet/secure_closet/brig/C in world)
+ if(C.id == src.id)
+ targets += C
- if(targets.len==0)
- stat |= BROKEN
- update_icon()
- return
+ if(targets.len==0)
+ stat |= BROKEN
+ update_icon()
return
+ return
//Main door timer loop, if it's timing and time is >0 reduce time by 1.
// if it's less than 0, open door, reset timer
// update the door_timer window and the icon
- process()
- if(stat & (NOPOWER|BROKEN)) return
- if(src.timing)
- if(world.time > src.releasetime)
- src.timer_end() // open doors, reset timer, clear status screen
- src.timing = 0
- src.updateUsrDialog()
- src.update_icon()
- else
- timer_end()
- return
+/obj/machinery/door_timer/process()
+
+ if(stat & (NOPOWER|BROKEN)) return
+ if(src.timing)
+
+ // poorly done midnight rollover
+ // (no seriously there's gotta be a better way to do this)
+ var/timeleft = timeleft()
+ if(timeleft > 1e5)
+ src.releasetime = 0
-// has the door power sitatuation changed, if so update icon.
- power_change()
- ..()
- update_icon()
- return
+ if(world.timeofday > src.releasetime)
+ src.timer_end() // open doors, reset timer, clear status screen
+ src.timing = 0
+
+ src.updateUsrDialog()
+ src.update_icon()
+
+ else
+ timer_end()
+
+ return
+
+
+// has the door power situation changed, if so update icon.
+/obj/machinery/door_timer/power_change()
+ ..()
+ update_icon()
+ return
// open/closedoor checks if door_timer has power, if so it checks if the
// linked door is open/closed (by density) then opens it/closes it.
- proc/timer_start()
- if(stat & (NOPOWER|BROKEN)) return 0
- for(var/obj/machinery/door/window/brigdoor/door in targets)
- if(door.density) continue
- spawn(0)
- door.close()
+// Closes and locks doors, power check
+/obj/machinery/door_timer/proc/timer_start()
+ if(stat & (NOPOWER|BROKEN)) return 0
- for(var/obj/structure/closet/secure_closet/brig/C in targets)
- if(C.broken) continue
- if(C.opened && !C.close()) continue
- C.locked = 1
- C.icon_state = C.icon_locked
- return 1
+ // Set releasetime
+ releasetime = world.timeofday + timetoset
+
+ for(var/obj/machinery/door/window/brigdoor/door in targets)
+ if(door.density) continue
+ spawn(0)
+ door.close()
+
+ for(var/obj/structure/closet/secure_closet/brig/C in targets)
+ if(C.broken) continue
+ if(C.opened && !C.close()) continue
+ C.locked = 1
+ C.icon_state = C.icon_locked
+ return 1
- proc/timer_end()
- if(stat & (NOPOWER|BROKEN)) return 0
+// Opens and unlocks doors, power check
+/obj/machinery/door_timer/proc/timer_end()
+ if(stat & (NOPOWER|BROKEN)) return 0
- for(var/obj/machinery/door/window/brigdoor/door in targets)
- if(!door.density) continue
- spawn(0)
- door.open()
+ // Reset releasetime
+ releasetime = 0
- for(var/obj/structure/closet/secure_closet/brig/C in targets)
- if(C.broken) continue
- if(C.opened) continue
- C.locked = 0
- C.icon_state = C.icon_closed
+ for(var/obj/machinery/door/window/brigdoor/door in targets)
+ if(!door.density) continue
+ spawn(0)
+ door.open()
- return 1
+ for(var/obj/structure/closet/secure_closet/brig/C in targets)
+ if(C.broken) continue
+ if(C.opened) continue
+ C.locked = 0
+ C.icon_state = C.icon_closed
+
+ return 1
- proc/timeleft()
- . = (releasetime-world.time)/10
- if(. < 0)
- . = 0
+// Check for releasetime timeleft
+/obj/machinery/door_timer/proc/timeleft()
+ . = (releasetime - world.timeofday)/10
+ if(. < 0)
+ . = 0
+// Set timetoset
+/obj/machinery/door_timer/proc/timeset(var/seconds)
+ timetoset = seconds * 10
- proc/timeset(var/seconds)
- releasetime=world.time+seconds*10
- return
+ if(timetoset <= 0)
+ timetoset = 0
+ return
//Allows AIs to use door_timer, see human attack_hand function below
- attack_ai(var/mob/user as mob)
- return src.attack_hand(user)
+/obj/machinery/door_timer/attack_ai(var/mob/user as mob)
+ return src.attack_hand(user)
//Allows humans to use door_timer
//Opens dialog window when someone clicks on door timer
// Allows altering timer and the timing boolean.
// Flasher activation limited to 150 seconds
- attack_hand(var/mob/user as mob)
- if(..())
- return
- var/second = round(timeleft() % 60)
- var/minute = round((timeleft() - second) / 60)
- user.set_machine(src)
- var/dat = ""
- dat += "
Timer System:"
- dat += "Door [src.id] controls
"
- if (src.timing)
- dat += "Stop Timer and open door
"
- else
- dat += "Activate Timer and close door
"
-
- dat += "Time Left: [(minute ? text("[minute]:") : null)][second]
"
- dat += "- - + +
"
-
- for(var/obj/machinery/flasher/F in targets)
- if(F.last_flash && (F.last_flash + 150) > world.time)
- dat += "
Flash Charging"
- else
- dat += "
Activate Flash"
-
- dat += "
Close"
- dat += ""
- user << browse(dat, "window=computer;size=400x500")
- onclose(user, "computer")
+/obj/machinery/door_timer/attack_hand(var/mob/user as mob)
+ if(..())
return
+ // Used for the 'time left' display
+ var/second = round(timeleft() % 60)
+ var/minute = round((timeleft() - second) / 60)
+
+ // Used for 'set timer'
+ var/setsecond = round((timetoset / 10) % 60)
+ var/setminute = round(((timetoset / 10) - setsecond) / 60)
+
+ user.set_machine(src)
+
+ // dat
+ var/dat = ""
+
+ dat += "
Timer System:"
+ dat += " Door [src.id] controls
"
+
+ // Start/Stop timer
+ if (src.timing)
+ dat += "Stop Timer and open door
"
+ else
+ dat += "Activate Timer and close door
"
+
+ // Time Left display (uses releasetime)
+ dat += "Time Left: [(minute ? text("[minute]:") : null)][second]
"
+ dat += "
"
+
+ // Set Timer display (uses timetoset)
+ if(src.timing)
+ dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond] Set
"
+ else
+ dat += "Set Timer: [(setminute ? text("[setminute]:") : null)][setsecond]
"
+
+ // Controls
+ dat += "- - + +
"
+
+ // Mounted flash controls
+ for(var/obj/machinery/flasher/F in targets)
+ if(F.last_flash && (F.last_flash + 150) > world.time)
+ dat += "
Flash Charging"
+ else
+ dat += "
Activate Flash"
+
+ dat += "
Close"
+ dat += ""
+
+ user << browse(dat, "window=computer;size=400x500")
+ onclose(user, "computer")
+ return
+
//Function for using door_timer dialog input, checks if user has permission
// href_list to
// "timing" turns on timer
// "tp" value to modify timer
// "fc" activates flasher
+// "change" resets the timer to the timetoset amount while the timer is counting down
// Also updates dialog window and timer icon
- Topic(href, href_list)
- if(..())
- return
- if(!src.allowed(usr))
- return
+/obj/machinery/door_timer/Topic(href, href_list)
+ if(..())
+ return
+ if(!src.allowed(usr))
+ return
+
+ usr.set_machine(src)
+
+ if(href_list["timing"])
+ src.timing = text2num(href_list["timing"])
- usr.set_machine(src)
- if(href_list["timing"])
- src.timing = text2num(href_list["timing"])
- else
- if(href_list["tp"]) //adjust timer, close door if not already closed
- var/tp = text2num(href_list["tp"])
- var/timeleft = timeleft()
- timeleft += tp
- timeleft = min(max(round(timeleft), 0), 3600)
- timeset(timeleft)
- //src.timing = 1
- //src.closedoor()
- if(href_list["fc"])
- for(var/obj/machinery/flasher/F in targets)
- F.flash()
- src.add_fingerprint(usr)
- src.updateUsrDialog()
- src.update_icon()
if(src.timing)
src.timer_start()
else
src.timer_end()
- return
+
+ else
+ if(href_list["tp"]) //adjust timer, close door if not already closed
+ var/tp = text2num(href_list["tp"])
+ var/addtime = (timetoset / 10)
+ addtime += tp
+ addtime = min(max(round(addtime), 0), 3600)
+
+ timeset(addtime)
+
+ if(href_list["fc"])
+ for(var/obj/machinery/flasher/F in targets)
+ F.flash()
+
+ if(href_list["change"])
+ src.timer_start()
+
+ src.add_fingerprint(usr)
+ src.updateUsrDialog()
+ src.update_icon()
+
+ /* if(src.timing)
+ src.timer_start()
+
+ else
+ src.timer_end() */
+
+ return
//icon update function
// if NOPOWER, display blank
// if BROKEN, display blue screen of death icon AI uses
// if timing=true, run update display function
- update_icon()
- if(stat & (NOPOWER))
- icon_state = "frame"
- return
- if(stat & (BROKEN))
- set_picture("ai_bsod")
- return
- if(src.timing)
- var/disp1 = uppertext(id)
- var/timeleft = timeleft()
- var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
- spawn( 5 )
- update_display(disp1, disp2)
- else
- update_display("SET","TIME")
+/obj/machinery/door_timer/update_icon()
+ if(stat & (NOPOWER))
+ icon_state = "frame"
return
+ if(stat & (BROKEN))
+ set_picture("ai_bsod")
+ return
+ if(src.timing)
+ var/disp1 = uppertext(id)
+ var/timeleft = timeleft()
+ var/disp2 = "[add_zero(num2text((timeleft / 60) % 60),2)]~[add_zero(num2text(timeleft % 60), 2)]"
+ spawn( 5 )
+ update_display(disp1, disp2)
+ else
+ update_display("SET","TIME")
+ return
// Adds an icon in case the screen is broken/off, stolen from status_display.dm
- proc/set_picture(var/state)
- picture_state = state
- overlays.Cut()
- overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
+/obj/machinery/door_timer/proc/set_picture(var/state)
+ picture_state = state
+ overlays.Cut()
+ overlays += image('icons/obj/status_display.dmi', icon_state=picture_state)
//Checks to see if there's 1 line or 2, adds text-icons-numbers/letters over display
// Stolen from status_display
- proc/update_display(var/line1, var/line2)
- if(line2 == null) // single line display
- overlays.Cut()
- overlays += texticon(line1, 23, -13)
- else // dual line display
- overlays.Cut()
- overlays += texticon(line1, 23, -9)
- overlays += texticon(line2, 23, -17)
+/obj/machinery/door_timer/proc/update_display(var/line1, var/line2)
+ if(line2 == null) // single line display
+ overlays.Cut()
+ overlays += texticon(line1, 23, -13)
+ else // dual line display
+ overlays.Cut()
+ overlays += texticon(line1, 23, -9)
+ overlays += texticon(line2, 23, -17)
// return an icon of a time text string (tn)
// valid characters are 0-9 and :
// px, py are pixel offsets
@@ -240,19 +305,19 @@
//Actual string input to icon display for loop, with 5 pixel x offsets for each letter.
//Stolen from status_display
- proc/texticon(var/tn, var/px = 0, var/py = 0)
- var/image/I = image('icons/obj/status_display.dmi', "blank")
- var/len = lentext(tn)
+/obj/machinery/door_timer/proc/texticon(var/tn, var/px = 0, var/py = 0)
+ var/image/I = image('icons/obj/status_display.dmi', "blank")
+ var/len = lentext(tn)
- for(var/d = 1 to len)
- var/char = copytext(tn, len-d+1, len-d+2)
- if(char == " ")
- continue
- var/image/ID = image('icons/obj/status_display.dmi', icon_state=char)
- ID.pixel_x = -(d-1)*5 + px
- ID.pixel_y = py
- I.overlays += ID
- return I
+ for(var/d = 1 to len)
+ var/char = copytext(tn, len-d+1, len-d+2)
+ if(char == " ")
+ continue
+ var/image/ID = image('icons/obj/status_display.dmi', icon_state=char)
+ ID.pixel_x = -(d-1)*5 + px
+ ID.pixel_y = py
+ I.overlays += ID
+ return I
/obj/machinery/door_timer/cell_1
diff --git a/code/game/machinery/hydroponics.dm b/code/game/machinery/hydroponics.dm
index 5d187b337c7..a0f8c371e41 100644
--- a/code/game/machinery/hydroponics.dm
+++ b/code/game/machinery/hydroponics.dm
@@ -915,115 +915,13 @@ obj/machinery/hydroponics/attackby(var/obj/item/O as obj, var/mob/user as mob)
parent.update_tray()
-/obj/item/seeds/replicapod/harvest(mob/user = usr) //now that one is fun -- Urist
- var/obj/machinery/hydroponics/parent = loc
- var/make_podman = 0
- var/mob/ghost
- if(ckey && config.revival_pod_plants)
- ghost = find_dead_player("[ckey]")
- if(ismob(ghost))
- if(istype(ghost,/mob/dead/observer))
- var/mob/dead/observer/O = ghost
- if(istype(mind,/datum/mind))
- if(O.can_reenter_corpse)
- make_podman = 1
- else
- make_podman = 1
-
- if(make_podman) //all conditions met!
- var/mob/living/carbon/human/podman = new /mob/living/carbon/human(parent.loc)
- if(realName)
- podman.real_name = realName
- else
- podman.real_name = "Pod Person [rand(0,999)]"
- var/oldactive = mind.active
- mind.active = 1
- mind.transfer_to(podman)
- mind.active = oldactive
- // -- Mode/mind specific stuff goes here. TODO! Broken :( Should be merged into mob/living/Login
- switch(ticker.mode.name)
- if ("revolution")
- if (podman.mind in ticker.mode:revolutionaries)
- ticker.mode:add_revolutionary(podman.mind)
- ticker.mode:update_all_rev_icons() //So the icon actually appears
- if (podman.mind in ticker.mode:head_revolutionaries)
- ticker.mode:update_all_rev_icons()
- if ("nuclear emergency")
- if (podman.mind in ticker.mode:syndicates)
- ticker.mode:update_all_synd_icons()
- if ("cult")
- if (podman.mind in ticker.mode:cult)
- ticker.mode:add_cultist(podman.mind)
- ticker.mode:update_all_cult_icons() //So the icon actually appears
-
- // -- End mode specific stuff
-
- podman.gender = ghost.gender
- if(podman.gender in list(NEUTER, PLURAL)) //Sanity check, which should never actually happen.
- podman.gender = pick(MALE,FEMALE)
-
- if(!podman.dna)
- podman.dna = new /datum/dna()
- podman.dna.real_name = podman.real_name
- if(ui)
- podman.dna.uni_identity = ui
- updateappearance(podman, ui)
- if(se)
- podman.dna.struc_enzymes = se
- if(!prob(potency)) //if it fails, plantman!
- if(podman)
-// podman.dna.mutantrace = "plant"
- podman.mutations.Add(PLANT)
- podman.update_mutantrace()
-
- else //else, one packet of seeds. maybe two
- var/seed_count = 1
- if(prob(yield * parent.yieldmod * 20))
- seed_count++
- for(var/i=0,iYour blood has been placed into a replica pod seed. Return to your body if you want to be returned to life as a pod person! (Verbs -> Ghost -> Re-enter corpse)"
+ break
+ else
+ user << "Nothing happens."
+ return
+
+ if (!istype(source))
+ return
+
+ if(source.ckey)
+ realName = source.real_name
+ ckey = source.ckey
+
+ W:reagents.clear_reagents()
+ return
+
+ return ..()
+
+/obj/item/seeds/replicapod/harvest(mob/user = usr)
+
+ var/obj/machinery/hydroponics/parent = loc
+ var/mob/ghost
+ var/list/candidates = list()
+
+ user.visible_message("\blue You carefully begin to open the pod...","[user] carefully begins to open the pod...")
+
+ //If a sample is injected (and revival is allowed) the plant will be controlled by the original donor.
+ if(source && source.mind && source.ckey && config.revival_pod_plants)
+ ghost = source
+ else // If no sample was injected or revival is not allowed, we grab an interested observer.
+ for(var/mob/dead/observer/O in player_list)
+ if(O.client)
+ var/response = alert(O, "Someone is harvesting a replica pod. Would you like to play as a Dionaea?", "Replica pod harvest", "Yes", "No")
+ if(response == "Yes")
+ candidates += O
+
+ if(!do_after(user, 100))
+ return
+
+ if(!src || !user)
+ return
+
+ if(candidates.len)
+ ghost = pick(candidates)
+
+ //If we don't have a ghost or the ghost is now unplayed, we just give the harvester some seeds.
+ if(!ghost || !(ghost.ckey))
+ user << "The pod has formed badly, and all you can do is salvage some of the seeds."
+ var/seed_count = 1
+
+ if(prob(yield * parent.yieldmod * 20))
+ seed_count++
+
+ for(var/i=0,iYou awaken slowly, feeling your sap stir into sluggish motion as the warm air caresses your bark."
+ if(source && ckey && podman.ckey == ckey)
+ podman << "Memories of a life as [source] drift oddly through a mind unsuited for them, like a skin of oil over a fathomless lake."
+ podman << "You are now one of the Dionaea, a race of drifting interstellar plantlike creatures that sometimes share their seeds with human traders."
+ podman << "Too much darkness will send you into shock and starve you, but light will help you heal."
+
+ if(!realName)
+ var/newname = input(podman,"Enter a name, or leave blank for the default name.", "Name change","") as text
+ if (newname != "")
+ podman.real_name = newname
+ parent.update_tray()
\ No newline at end of file
diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 4ab483076b7..7302ed81b6c 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -341,12 +341,10 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Engineering"
if(1359)
freq_text = "Security"
-// if(1349)
-// freq_text = "Mining"
if(1347)
freq_text = "Supply"
if(1441)
- freq_text = "Death Squad"
+ freq_text = "Special Ops"
if(1443)
freq_text = "Response Team"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -365,10 +363,35 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
var/part_b = " \icon[radio]\[[freq_text]\][part_b_extra] " // Tweaked for security headsets -- TLE
var/part_c = ""
- if (display_freq==SYND_FREQ)
+ // syndies!
+ if (display_freq == SYND_FREQ)
part_a = ""
- else if (display_freq==COMM_FREQ)
+
+ // centcomm channels (deathsquid and ert)
+ else if (display_freq in CENT_FREQS)
+ part_a = ""
+
+ // command channel
+ else if (display_freq == COMM_FREQ)
part_a = ""
+
+ // department radio formatting (poorly optimized, ugh)
+ else if (display_freq == SEC_FREQ)
+ part_a = ""
+
+ else if (display_freq == ENG_FREQ)
+ part_a = ""
+
+ else if (display_freq == SCI_FREQ)
+ part_a = ""
+
+ else if (display_freq == MED_FREQ)
+ part_a = ""
+
+ else if (display_freq == SUP_FREQ) // cargo
+ part_a = ""
+
+ // If all else fails and it's a dept_freq, color me purple!
else if (display_freq in DEPT_FREQS)
part_a = ""
@@ -406,8 +429,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(1213)
blackbox.msg_syndicate += blackbox_msg
-// if(1349)
-// blackbox.msg_mining += blackbox_msg
if(1347)
blackbox.msg_cargo += blackbox_msg
else
@@ -629,8 +650,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
freq_text = "Engineering"
if(1359)
freq_text = "Security"
-// if(1349)
-// freq_text = "Mining"
if(1347)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
@@ -685,8 +704,6 @@ var/message_delay = 0 // To make sure restarting the recentmessages list is kept
blackbox.msg_deathsquad += blackbox_msg
if(1213)
blackbox.msg_syndicate += blackbox_msg
-// if(1349)
-// blackbox.msg_mining += blackbox_msg
if(1347)
blackbox.msg_cargo += blackbox_msg
else
diff --git a/code/game/machinery/telecomms/presets.dm b/code/game/machinery/telecomms/presets.dm
index 2b708ded291..914bd8c9016 100644
--- a/code/game/machinery/telecomms/presets.dm
+++ b/code/game/machinery/telecomms/presets.dm
@@ -142,12 +142,7 @@
id = "Supply Server"
freq_listening = list(1347)
autolinkers = list("supply")
-/*
-/obj/machinery/telecomms/server/presets/mining
- id = "Mining Server"
- freq_listening = list(1349)
- autolinkers = list("mining")
-*/
+
/obj/machinery/telecomms/server/presets/common
id = "Common Server"
freq_listening = list()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index d98d57de30b..5e33df7f56f 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -707,7 +707,8 @@
products = list(/obj/item/weapon/reagent_containers/glass/bottle/antitoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/inaprovaline = 4,
/obj/item/weapon/reagent_containers/glass/bottle/stoxin = 4,/obj/item/weapon/reagent_containers/glass/bottle/toxin = 4,
/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/syringe = 12,
- /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2)
+ /obj/item/device/healthanalyzer = 5,/obj/item/weapon/reagent_containers/glass/beaker = 4, /obj/item/weapon/reagent_containers/dropper = 2,
+ /obj/item/stack/medical/advanced/bruise_pack = 3, /obj/item/stack/medical/advanced/ointment = 3, /obj/item/stack/medical/splint = 2)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3,/obj/item/weapon/reagent_containers/pill/stox = 4,/obj/item/weapon/reagent_containers/pill/antitox = 6)
@@ -727,7 +728,7 @@
icon_deny = "wallmed-deny"
req_access_txt = "5"
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
- products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/syringe/inaprovaline = 4,/obj/item/device/healthanalyzer = 1)
+ products = list(/obj/item/stack/medical/bruise_pack = 2,/obj/item/stack/medical/ointment = 2,/obj/item/weapon/reagent_containers/hypospray/autoinjector = 4,/obj/item/device/healthanalyzer = 1)
contraband = list(/obj/item/weapon/reagent_containers/syringe/antitoxin = 4,/obj/item/weapon/reagent_containers/syringe/antiviral = 4,/obj/item/weapon/reagent_containers/pill/tox = 1)
/obj/machinery/vending/wallmed2
@@ -737,7 +738,7 @@
icon_deny = "wallmed-deny"
req_access_txt = "5"
density = 0 //It is wall-mounted, and thus, not dense. --Superxpdude
- products = list(/obj/item/weapon/reagent_containers/syringe/inaprovaline = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3,
+ products = list(/obj/item/weapon/reagent_containers/hypospray/autoinjector = 5,/obj/item/weapon/reagent_containers/syringe/antitoxin = 3,/obj/item/stack/medical/bruise_pack = 3,
/obj/item/stack/medical/ointment =3,/obj/item/device/healthanalyzer = 3)
contraband = list(/obj/item/weapon/reagent_containers/pill/tox = 3)
diff --git a/code/game/mecha/medical/odysseus.dm b/code/game/mecha/medical/odysseus.dm
index 869ff5b2103..008b5d819ab 100644
--- a/code/game/mecha/medical/odysseus.dm
+++ b/code/game/mecha/medical/odysseus.dm
@@ -87,8 +87,11 @@
for(var/datum/disease/D in patient.viruses)
if(!D.hidden[SCANNER])
foundVirus++
- if(patient.virus2)
- foundVirus++
+
+ for (var/ID in patient.virus2)
+ if (ID in virusDB)
+ foundVirus = 1
+ break
holder = patient.hud_list[HEALTH_HUD]
if(patient.stat == 2)
diff --git a/code/game/objects/effects/barsign.dm b/code/game/objects/effects/barsign.dm
index fc6278187e9..c5cc2893567 100644
--- a/code/game/objects/effects/barsign.dm
+++ b/code/game/objects/effects/barsign.dm
@@ -1,4 +1,4 @@
-/obj/effect/sign/barsign
+/obj/effect/sign/double/barsign
icon = 'barsigns.dmi'
icon_state = "empty"
anchored = 1
diff --git a/code/game/objects/effects/decals/Cleanable/humans.dm b/code/game/objects/effects/decals/Cleanable/humans.dm
index 172eca9ae97..911a63c0e4c 100644
--- a/code/game/objects/effects/decals/Cleanable/humans.dm
+++ b/code/game/objects/effects/decals/Cleanable/humans.dm
@@ -11,7 +11,7 @@
random_icon_states = list("floor1", "floor2", "floor3", "floor4", "floor5", "floor6", "floor7")
var/list/viruses = list()
blood_DNA = list()
- var/datum/disease2/disease/virus2 = null
+ var/list/datum/disease2/disease/virus2 = list()
var/amount = 5
/obj/effect/decal/cleanable/blood/Del()
@@ -144,4 +144,4 @@
icon = 'blood.dmi'
icon_state = "mucus"
random_icon_states = list("mucus")
- var/datum/disease2/disease/virus2 = null
+ var/list/datum/disease2/disease/virus2 = list()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 78cf9617fd3..281c23f0fd0 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -113,9 +113,10 @@
var/datum/organ/external/temp = user:organs_by_name["r_hand"]
if (user.hand)
temp = user:organs_by_name["l_hand"]
- if(temp && temp.status & ORGAN_DESTROYED)
- user << " Yo- wait a minute."
+ if(temp && !temp.is_usable())
+ user << "You try to move your [temp.display_name], but cannot!"
return
+
if (istype(src.loc, /obj/item/weapon/storage))
var/obj/item/weapon/storage/S = src.loc
S.remove_from_storage(src)
@@ -130,8 +131,7 @@
else
if(isliving(src.loc))
return
- user.lastDblClick = world.time + 2
- user.next_move = world.time + 2
+ user.delay_click(2)
src.pickup(user)
add_fingerprint(user)
user.put_in_active_hand(src)
@@ -165,8 +165,7 @@
if(istype(src.loc, /mob/living))
return
src.pickup(user)
- user.lastDblClick = world.time + 2
- user.next_move = world.time + 2
+ user.delay_click(2)
user.put_in_active_hand(src)
return
@@ -228,6 +227,8 @@
log_attack("[user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(src.damtype)])" )
msg_admin_attack("ATTACK: [user.name] ([user.ckey]) attacked [M.name] ([M.ckey]) with [src.name] (INTENT: [uppertext(user.a_intent)])") //BS12 EDIT ALG
+ user.delay_click(10)
+
//spawn(1800) // this wont work right
// M.lastattacker = null
/////////////////////////
diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm
new file mode 100644
index 00000000000..da297fbb55b
--- /dev/null
+++ b/code/game/objects/items/devices/pipe_painter.dm
@@ -0,0 +1,22 @@
+/obj/item/device/pipe_painter
+ name = "pipe painter"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "labeler1"
+ item_state = "flight"
+ var/list/modes = list("grey","red","blue","cyan","green","yellow","purple")
+ var/mode = "grey"
+
+/obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob)
+ if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated))
+ return
+ var/obj/machinery/atmospherics/pipe/P = A
+ P.color = mode
+ user.visible_message("[user] paints \the [P] [mode].","You paint \the [P] [mode].")
+ P.update_icon()
+
+/obj/item/device/pipe_painter/attack_self(mob/user as mob)
+ mode = input("Which colour do you want to use?","Pipe painter") in modes
+
+/obj/item/device/pipe_painter/examine()
+ ..()
+ usr << "It is in [mode] mode."
\ No newline at end of file
diff --git a/code/game/objects/items/devices/radio/encryptionkey.dm b/code/game/objects/items/devices/radio/encryptionkey.dm
index 165f6748ec5..d2d5417d6c3 100644
--- a/code/game/objects/items/devices/radio/encryptionkey.dm
+++ b/code/game/objects/items/devices/radio/encryptionkey.dm
@@ -121,7 +121,8 @@
desc = "An encyption key for a radio headset. Contains cypherkeys."
icon_state = "cargo_cypherkey"
channels = list("Supply" = 1)
+
/obj/item/device/encryptionkey/ert
name = "NanoTrasen ERT Radio Encryption Key"
desc = "An encyption key for a radio headset. Contains cypherkeys."
- channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Mining" = 1, "Cargo" = 1,)
+ channels = list("Response Team" = 1, "Science" = 1, "Command" = 1, "Medical" = 1, "Engineering" = 1, "Security" = 1, "Supply" = 1)
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 0081954da84..422a27897c0 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -499,8 +499,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use
freq_text = "Engineering"
if(1359)
freq_text = "Security"
-// if(1349)
-// freq_text = "Mining"
if(1347)
freq_text = "Supply"
//There's probably a way to use the list var of channels in code\game\communications.dm to make the dept channels non-hardcoded, but I wasn't in an experimentive mood. --NEO
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index f86f38cc83a..bef800f0fa9 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -129,8 +129,13 @@ MASS SPECTROMETER
if (istype(M, /mob/living/carbon))
if(M:reagents.total_volume > 0)
user.show_message(text("\red Warning: Unknown substance detected in subject's blood."))
- if(M:virus2)
- user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood."))
+ if(M:virus2.len)
+ var/mob/living/carbon/C = M
+ for (var/ID in C.virus2)
+ if (ID in virusDB)
+ var/datum/data/record/V = virusDB[ID]
+ user.show_message(text("\red Warning: Pathogen [V.fields["name"]] detected in subject's blood. Known antigen : [V.fields["antigen"]]"))
+// user.show_message(text("\red Warning: Unknown pathogen detected in subject's blood."))
if (M.getCloneLoss())
user.show_message("\red Subject appears to have been imperfectly cloned.")
for(var/datum/disease/D in M.viruses)
@@ -174,6 +179,7 @@ MASS SPECTROMETER
user.show_message("\red Warning: Blood Level CRITICAL: [blood_percent]% [blood_volume]cl")
else
user.show_message("\blue Blood Level Normal: [blood_percent]% [blood_volume]cl")
+ user.show_message("\blue Subject's pulse: [H.get_pulse(GETPULSE_TOOL)] bpm.")
src.add_fingerprint(user)
return
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index 1e8bc3891b9..7a76812b34e 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -32,7 +32,7 @@
R.icon_state = "robot"
del(R.module)
R.module = null
- R.modtype = "robot"
+ R.camera.network.Remove(list("Medical","MINE"))
R.updatename("Default")
R.status_flags |= CANPUSH
R.updateicon()
@@ -52,6 +52,7 @@
/obj/item/borg/upgrade/rename/action(var/mob/living/silicon/robot/R)
if(..()) return 0
R.name = heldname
+ R.custom_name = heldname
R.real_name = heldname
return 1
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index ca538c254e2..4721bcc8fe6 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -11,15 +11,6 @@
var/heal_burn = 0
/obj/item/stack/medical/attack(mob/living/carbon/M as mob, mob/user as mob)
- if (M.stat == 2)
- var/t_him = "it"
- if (M.gender == MALE)
- t_him = "him"
- else if (M.gender == FEMALE)
- t_him = "her"
- user << "\red \The [M] is dead, you cannot help [t_him]!"
- return 1
-
if (!istype(M))
user << "\red \The [src] cannot be applied to [M]!"
return 1
@@ -47,42 +38,16 @@
user << "\red This isn't useful at all on a robotic limb.."
return 1
- if(src.heal_brute)
- if(!affecting.bandage())
- user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
- return 1
- else
- for (var/datum/wound/W in affecting.wounds)
- if (W.internal)
- continue
- if (W.current_stage <= W.max_bleeding_stage)
- user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
- "\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
- //H.add_side_effect("Itch")
- else if (istype(W,/datum/wound/bruise))
- user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
- "\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
- else
- user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
- "\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
-
- else if(src.heal_burn)
- if(!affecting.salve())
- user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
- return 1
- else
- user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
- "\blue You salve wounds on [M]'s [affecting.display_name]." )
-
H.UpdateDamageIcon()
+
else
+
M.heal_organ_damage((src.heal_brute/2), (src.heal_burn/2))
user.visible_message( \
"\blue [M] has been applied with [src] by [user].", \
"\blue You apply \the [src] to [M]." \
)
-
- use(1)
+ use(1)
M.updatehealth()
/obj/item/stack/medical/bruise_pack
@@ -90,18 +55,60 @@
singular_name = "gauze length"
desc = "Some sterile gauze to wrap around bloody stumps."
icon_state = "brutepack"
- heal_brute = 60
origin_tech = "biotech=1"
+/obj/item/stack/medical/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.bandage())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been bandaged."
+ return 1
+ else
+ for (var/datum/wound/W in affecting.wounds)
+ if (W.internal)
+ continue
+ if (W.current_stage <= W.max_bleeding_stage)
+ user.visible_message( "\blue [user] bandages [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You bandage [W.desc] on [M]'s [affecting.display_name]." )
+ //H.add_side_effect("Itch")
+ else if (istype(W,/datum/wound/bruise))
+ user.visible_message( "\blue [user] places bruise patch over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You place bruise patch over [W.desc] on [M]'s [affecting.display_name]." )
+ else
+ user.visible_message( "\blue [user] places bandaid over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You place bandaid over [W.desc] on [M]'s [affecting.display_name]." )
+ use(1)
+
/obj/item/stack/medical/ointment
name = "ointment"
desc = "Used to treat those nasty burns."
gender = PLURAL
singular_name = "ointment"
icon_state = "ointment"
- heal_burn = 40
+ heal_burn = 1
origin_tech = "biotech=1"
+/obj/item/stack/medical/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.salve())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
+ return 1
+ else
+ user.visible_message( "\blue [user] salves wounds on [M]'s [affecting.display_name].", \
+ "\blue You salve wounds on [M]'s [affecting.display_name]." )
+ use(1)
+
/obj/item/stack/medical/bruise_pack/tajaran
name = "\improper S'rendarr's Hand leaf"
singular_name = "S'rendarr's Hand leaf"
@@ -126,6 +133,34 @@
heal_brute = 12
origin_tech = "biotech=1"
+/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.bandage())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been treated."
+ return 1
+ else
+ for (var/datum/wound/W in affecting.wounds)
+ if (W.internal)
+ continue
+ if (W.current_stage <= W.max_bleeding_stage)
+ user.visible_message( "\blue [user] cleans [W.desc] on [M]'s [affecting.display_name] and seals edges with bioglue.", \
+ "\blue You clean and seal [W.desc] on [M]'s [affecting.display_name]." )
+ //H.add_side_effect("Itch")
+ else if (istype(W,/datum/wound/bruise))
+ user.visible_message( "\blue [user] places medicine patch over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You place medicine patch over [W.desc] on [M]'s [affecting.display_name]." )
+ else
+ user.visible_message( "\blue [user] smears some bioglue over [W.desc] on [M]'s [affecting.display_name].", \
+ "\blue You smear some bioglue over [W.desc] on [M]'s [affecting.display_name]." )
+ affecting.heal_damage(heal_brute,0)
+ use(1)
+
/obj/item/stack/medical/advanced/ointment
name = "advanced burn kit"
singular_name = "advanced burn kit"
@@ -134,8 +169,26 @@
heal_burn = 12
origin_tech = "biotech=1"
+
+/obj/item/stack/medical/advanced/ointment/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+
+ if(!affecting.salve())
+ user << "\red The wounds on [M]'s [affecting.display_name] have already been salved."
+ return 1
+ else
+ user.visible_message( "\blue [user] covers wounds on [M]'s [affecting.display_name] with regenerative membrane.", \
+ "\blue You cover wounds on [M]'s [affecting.display_name] with regenerative membrane." )
+ affecting.heal_damage(0,heal_burn)
+ use(1)
+
/obj/item/stack/medical/splint
- name = "medical splint"
+ name = "medical splints"
singular_name = "medical splint"
icon_state = "splint"
amount = 5
@@ -143,3 +196,38 @@
/obj/item/stack/medical/splint/single
amount = 1
+
+
+/obj/item/stack/medical/splint/attack(mob/living/carbon/M as mob, mob/user as mob)
+ if(..())
+ return 1
+
+ if (istype(M, /mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ var/datum/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
+ var/limb = affecting.display_name
+ if(!((affecting.name == "l_arm") || (affecting.name == "r_arm") || (affecting.name == "l_leg") || (affecting.name == "r_leg")))
+ user << "\red You can't apply a splint there!"
+ return
+ if(affecting.status & ORGAN_SPLINTED)
+ user << "\red [M]'s [limb] is already splinted!"
+ return
+ if (M != user)
+ user.visible_message("\red [user] starts to apply \the [src] to [M]'s [limb].", "\red You start to apply \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
+ else
+ if((!user.hand && affecting.name == "r_arm") || (user.hand && affecting.name == "l_arm"))
+ user << "\red You can't apply a splint to the arm you're using!"
+ return
+ user.visible_message("\red [user] starts to apply \the [src] to their [limb].", "\red You start to apply \the [src] to your [limb].", "\red You hear something being wrapped.")
+ if(do_after(user, 50))
+ if (M != user)
+ user.visible_message("\red [user] finishes applying \the [src] to [M]'s [limb].", "\red You finish applying \the [src] to [M]'s [limb].", "\red You hear something being wrapped.")
+ else
+ if(prob(25))
+ user.visible_message("\red [user] successfully applies \the [src] to their [limb].", "\red You successfully apply \the [src] to your [limb].", "\red You hear something being wrapped.")
+ else
+ user.visible_message("\red [user] fumbles \the [src].", "\red You fumble \the [src].", "\red You hear something being wrapped.")
+ return
+ affecting.status |= ORGAN_SPLINTED
+ use(1)
+ return
\ No newline at end of file
diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm
index 3671b6ce08e..42def9a2b70 100644
--- a/code/game/objects/items/stacks/sheets/mineral.dm
+++ b/code/game/objects/items/stacks/sheets/mineral.dm
@@ -253,4 +253,4 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \
throw_speed = 3
throw_range = 3
origin_tech = "materials=4"
- perunit = 2000
\ No newline at end of file
+ perunit = 2000
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 77cf343de21..6a26f70e1f5 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -14,7 +14,6 @@
m_amt = 90
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
- var/last_use = 1.0
var/safety = 1
var/sprite_name = "fire_extinguisher"
@@ -67,11 +66,6 @@
usr << "\red \The [src] is empty."
return
- if (world.time < src.last_use + 20)
- return
-
- src.last_use = world.time
-
playsound(src.loc, 'sound/effects/extinguish.ogg', 75, 1, -3)
var/direction = get_dir(src,target)
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index 903bb1b1bf9..a0c3be517b1 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -461,3 +461,7 @@ the implant may become unstable and either pre-maturely inject the subject or si
islegal()
return 0
+
+/obj/item/weapon/implant/cortical
+ name = "cortical stack"
+ desc = "A fist-sized mass of biocircuits and chips."
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/manuals.dm b/code/game/objects/items/weapons/manuals.dm
index f4b2a147620..cc2c284adce 100644
--- a/code/game/objects/items/weapons/manuals.dm
+++ b/code/game/objects/items/weapons/manuals.dm
@@ -12,7 +12,7 @@
icon_state ="bookEngineering"
author = "Engineering Encyclopedia" // Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
title = "Station Repairs and Construction"
- dat = {"
+ /*dat = {"
@@ -23,7 +23,7 @@
- "}
+ "}*/
/obj/item/weapon/book/manual/engineering_particle_accelerator
name = "Particle Accelerator User's Guide"
@@ -32,7 +32,7 @@
title = "Particle Accelerator User's Guide"
//big pile of shit below.
- dat = {"
+ /*dat = {"