diff --git a/baystation12.dme b/baystation12.dme
index 1aecb6137c..ee046e3842 100644
--- a/baystation12.dme
+++ b/baystation12.dme
@@ -218,7 +218,6 @@
#include "code\defines\procs\dbcore.dm"
#include "code\defines\procs\hud.dm"
#include "code\defines\procs\radio.dm"
-#include "code\defines\procs\records.dm"
#include "code\defines\procs\sd_Alert.dm"
#include "code\defines\procs\statistics.dm"
#include "code\game\asteroid.dm"
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 8bc6cc0580..0985472bb3 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -1,16 +1,136 @@
/hook/startup/proc/createDatacore()
- data_core = new /obj/effect/datacore()
+ data_core = new /datum/datacore()
return 1
-/obj/effect/datacore/proc/manifest()
+/datum/datacore
+ var/name = "datacore"
+ var/medical[] = list()
+ var/general[] = list()
+ var/security[] = list()
+ //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
+ var/locked[] = list()
+
+
+/datum/datacore/proc/get_manifest(monochrome, OOC)
+ var/list/heads = new()
+ var/list/sec = new()
+ var/list/eng = new()
+ var/list/med = new()
+ var/list/sci = new()
+ var/list/civ = new()
+ var/list/bot = new()
+ var/list/misc = new()
+ var/list/isactive = new()
+ var/dat = {"
+
+
+ | Name | Rank | Activity |
+ "}
+ var/even = 0
+ // sort mobs
+ for(var/datum/data/record/t in data_core.general)
+ var/name = t.fields["name"]
+ var/rank = t.fields["rank"]
+ var/real_rank = make_list_rank(t.fields["real_rank"])
+
+ if(OOC)
+ var/active = 0
+ for(var/mob/M in player_list)
+ if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
+ active = 1
+ break
+ isactive[name] = active ? "Active" : "Inactive"
+ else
+ isactive[name] = t.fields["p_stat"]
+ //world << "[name]: [rank]"
+ //cael - to prevent multiple appearances of a player/job combination, add a continue after each line
+ var/department = 0
+ if(real_rank in command_positions)
+ heads[name] = rank
+ department = 1
+ if(real_rank in security_positions)
+ sec[name] = rank
+ department = 1
+ if(real_rank in engineering_positions)
+ eng[name] = rank
+ department = 1
+ if(real_rank in medical_positions)
+ med[name] = rank
+ department = 1
+ if(real_rank in science_positions)
+ sci[name] = rank
+ department = 1
+ if(real_rank in civilian_positions)
+ civ[name] = rank
+ department = 1
+ if(real_rank in nonhuman_positions)
+ bot[name] = rank
+ department = 1
+ if(!department && !(name in heads))
+ misc[name] = rank
+ if(heads.len > 0)
+ dat += "| Heads |
"
+ for(name in heads)
+ dat += "| [name] | [heads[name]] | [isactive[name]] |
"
+ even = !even
+ if(sec.len > 0)
+ dat += "| Security |
"
+ for(name in sec)
+ dat += "| [name] | [sec[name]] | [isactive[name]] |
"
+ even = !even
+ if(eng.len > 0)
+ dat += "| Engineering |
"
+ for(name in eng)
+ dat += "| [name] | [eng[name]] | [isactive[name]] |
"
+ even = !even
+ if(med.len > 0)
+ dat += "| Medical |
"
+ for(name in med)
+ dat += "| [name] | [med[name]] | [isactive[name]] |
"
+ even = !even
+ if(sci.len > 0)
+ dat += "| Science |
"
+ for(name in sci)
+ dat += "| [name] | [sci[name]] | [isactive[name]] |
"
+ even = !even
+ if(civ.len > 0)
+ dat += "| Civilian |
"
+ for(name in civ)
+ dat += "| [name] | [civ[name]] | [isactive[name]] |
"
+ even = !even
+ // in case somebody is insane and added them to the manifest, why not
+ if(bot.len > 0)
+ dat += "| Silicon |
"
+ for(name in bot)
+ dat += "| [name] | [bot[name]] | [isactive[name]] |
"
+ even = !even
+ // misc guys
+ if(misc.len > 0)
+ dat += "| Miscellaneous |
"
+ for(name in misc)
+ dat += "| [name] | [misc[name]] | [isactive[name]] |
"
+ even = !even
+
+ dat += "
"
+ dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
+ dat = replacetext(dat, "\t", "")
+ return dat
+
+/datum/datacore/proc/manifest()
spawn()
for(var/mob/living/carbon/human/H in player_list)
manifest_inject(H)
return
-/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
+/datum/datacore/proc/manifest_modify(var/name, var/assignment)
+ ResetPDAManifest()
var/datum/data/record/foundrecord
var/real_title = assignment
@@ -33,10 +153,7 @@
foundrecord.fields["rank"] = assignment
foundrecord.fields["real_rank"] = real_title
-/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
- if(PDA_Manifest.len)
- PDA_Manifest.Cut()
-
+/datum/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
if(H.mind && (H.mind.assigned_role != "MODE"))
var/assignment
if(H.mind.role_alt_title)
@@ -49,11 +166,8 @@
assignment = "Unassigned"
var/id = add_zero(num2hex(rand(1, 1.6777215E7)), 6) //this was the best they could come up with? A large random number? *sigh*
- var/icon/front = new(get_id_photo(H), dir = SOUTH)
- var/icon/side = new(get_id_photo(H), dir = WEST)
//General Record
- var/datum/data/record/G = new()
- G.fields["id"] = id
+ var/datum/data/record/G = CreateGeneralRecord(H, id)
G.fields["name"] = H.real_name
G.fields["real_rank"] = H.mind.assigned_role
G.fields["rank"] = assignment
@@ -67,18 +181,11 @@
G.fields["citizenship"] = H.citizenship
G.fields["faction"] = H.personal_faction
G.fields["religion"] = H.religion
- G.fields["photo_front"] = front
- G.fields["photo_side"] = side
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
- var/datum/data/record/M = new()
- M.fields["id"] = id
- M.fields["name"] = H.real_name
+ var/datum/data/record/M = CreateMedicalRecord(H.real_name, id)
M.fields["b_type"] = H.b_type
M.fields["b_dna"] = H.dna.unique_enzymes
M.fields["mi_dis"] = "None"
@@ -91,14 +198,9 @@
M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
if(H.med_record && !jobban_isbanned(H, "Records"))
M.fields["notes"] = H.med_record
- else
- M.fields["notes"] = "No notes found."
- medical += M
//Security Record
- var/datum/data/record/S = new()
- S.fields["id"] = id
- S.fields["name"] = H.real_name
+ var/datum/data/record/S = CreateSecurityRecord(H.real_name, id)
S.fields["criminal"] = "None"
S.fields["mi_crim"] = "None"
S.fields["mi_crim_d"] = "No minor crime convictions."
@@ -107,9 +209,6 @@
S.fields["notes"] = "No notes."
if(H.sec_record && !jobban_isbanned(H, "Records"))
S.fields["notes"] = H.sec_record
- else
- S.fields["notes"] = "No notes."
- security += S
//Locked Record
var/datum/data/record/L = new()
@@ -136,7 +235,6 @@
locked += L
return
-
proc/get_id_photo(var/mob/living/carbon/human/H)
H.regenerate_icons()
var/icon/preview_icon = icon(H.icon)
@@ -144,3 +242,95 @@ proc/get_id_photo(var/mob/living/carbon/human/H)
if(I && I.icon)
preview_icon.Blend(icon(I.icon, I.icon_state), ICON_OVERLAY)
return preview_icon
+
+/datum/datacore/proc/CreateGeneralRecord(var/mob/living/carbon/human/H, var/id)
+ ResetPDAManifest()
+ var/icon/front
+ var/icon/side
+ if(H)
+ front = new(get_id_photo(H), dir = SOUTH)
+ side = new(get_id_photo(H), dir = SOUTH)
+ else
+ var/mob/living/carbon/human/dummy = new()
+ front = new(get_id_photo(dummy), dir = SOUTH)
+ side = new(get_id_photo(dummy), dir = WEST)
+ qdel(dummy)
+
+ if(!id) id = text("[]", add_zero(num2hex(rand(1, 1.6777215E7)), 6))
+ var/datum/data/record/G = new /datum/data/record()
+ G.name = "Employee Record #[id]"
+ G.fields["name"] = "New Record"
+ G.fields["id"] = id
+ 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"
+ G.fields["home_system"] = "Unknown"
+ G.fields["citizenship"] = "Unknown"
+ G.fields["faction"] = "Unknown"
+ G.fields["religion"] = "Unknown"
+ G.fields["photo_front"] = front
+ G.fields["photo_side"] = side
+ G.fields["notes"] = "No notes found."
+ general += G
+
+ return G
+
+/datum/datacore/proc/CreateSecurityRecord(var/name, var/id)
+ ResetPDAManifest()
+ var/datum/data/record/R = new /datum/data/record()
+ R.name = "Security Record #[id]"
+ R.fields["name"] = name
+ R.fields["id"] = id
+ R.fields["criminal"] = "None"
+ R.fields["mi_crim"] = "None"
+ R.fields["mi_crim_d"] = "No minor crime convictions."
+ R.fields["ma_crim"] = "None"
+ R.fields["ma_crim_d"] = "No major crime convictions."
+ R.fields["notes"] = "No notes."
+ data_core.security += R
+
+ return R
+
+/datum/datacore/proc/CreateMedicalRecord(var/name, var/id)
+ ResetPDAManifest()
+ var/datum/data/record/M = new()
+ M.name = "Medical Record #[id]"
+ M.fields["id"] = id
+ M.fields["name"] = name
+ M.fields["b_type"] = "AB+"
+ M.fields["b_dna"] = md5(name)
+ M.fields["mi_dis"] = "None"
+ M.fields["mi_dis_d"] = "No minor disabilities have been declared."
+ M.fields["ma_dis"] = "None"
+ M.fields["ma_dis_d"] = "No major disabilities have been diagnosed."
+ M.fields["alg"] = "None"
+ M.fields["alg_d"] = "No allergies have been detected in this patient."
+ M.fields["cdi"] = "None"
+ M.fields["cdi_d"] = "No diseases have been diagnosed at the moment."
+ M.fields["notes"] = "No notes found."
+ data_core.medical += M
+
+ return M
+
+/datum/datacore/proc/ResetPDAManifest()
+ if(PDA_Manifest.len)
+ PDA_Manifest.Cut()
+
+/proc/find_general_record(field, value)
+ return find_record(field, value, data_core.general)
+
+/proc/find_medical_record(field, value)
+ return find_record(field, value, data_core.medical)
+
+/proc/find_security_record(field, value)
+ return find_record(field, value, data_core.security)
+
+/proc/find_record(field, value, list/L)
+ for(var/datum/data/record/R in L)
+ if(R.fields[field] == value)
+ return R
diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index 65f34ed580..bf78dbe6f4 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -43,129 +43,6 @@
* This item is completely unused, but removing it will break something in R&D and Radio code causing PDA and Ninja code to fail on compile
*/
-/obj/effect/datacore
- name = "datacore"
- var/medical[] = list()
- var/general[] = list()
- var/security[] = list()
- //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
- var/locked[] = list()
-
-
-
-/obj/effect/datacore/proc/get_manifest(monochrome, OOC)
- var/list/heads = new()
- var/list/sec = new()
- var/list/eng = new()
- var/list/med = new()
- var/list/sci = new()
- var/list/civ = new()
- var/list/bot = new()
- var/list/misc = new()
- var/list/isactive = new()
- var/dat = {"
-
-
- | Name | Rank | Activity |
- "}
- var/even = 0
- // sort mobs
- for(var/datum/data/record/t in data_core.general)
- var/name = t.fields["name"]
- var/rank = t.fields["rank"]
- var/real_rank = make_list_rank(t.fields["real_rank"])
-
- if(OOC)
- var/active = 0
- for(var/mob/M in player_list)
- if(M.real_name == name && M.client && M.client.inactivity <= 10 * 60 * 10)
- active = 1
- break
- isactive[name] = active ? "Active" : "Inactive"
- else
- isactive[name] = t.fields["p_stat"]
- //world << "[name]: [rank]"
- //cael - to prevent multiple appearances of a player/job combination, add a continue after each line
- var/department = 0
- if(real_rank in command_positions)
- heads[name] = rank
- department = 1
- if(real_rank in security_positions)
- sec[name] = rank
- department = 1
- if(real_rank in engineering_positions)
- eng[name] = rank
- department = 1
- if(real_rank in medical_positions)
- med[name] = rank
- department = 1
- if(real_rank in science_positions)
- sci[name] = rank
- department = 1
- if(real_rank in civilian_positions)
- civ[name] = rank
- department = 1
- if(real_rank in nonhuman_positions)
- bot[name] = rank
- department = 1
- if(!department && !(name in heads))
- misc[name] = rank
- if(heads.len > 0)
- dat += "| Heads |
"
- for(name in heads)
- dat += "| [name] | [heads[name]] | [isactive[name]] |
"
- even = !even
- if(sec.len > 0)
- dat += "| Security |
"
- for(name in sec)
- dat += "| [name] | [sec[name]] | [isactive[name]] |
"
- even = !even
- if(eng.len > 0)
- dat += "| Engineering |
"
- for(name in eng)
- dat += "| [name] | [eng[name]] | [isactive[name]] |
"
- even = !even
- if(med.len > 0)
- dat += "| Medical |
"
- for(name in med)
- dat += "| [name] | [med[name]] | [isactive[name]] |
"
- even = !even
- if(sci.len > 0)
- dat += "| Science |
"
- for(name in sci)
- dat += "| [name] | [sci[name]] | [isactive[name]] |
"
- even = !even
- if(civ.len > 0)
- dat += "| Civilian |
"
- for(name in civ)
- dat += "| [name] | [civ[name]] | [isactive[name]] |
"
- even = !even
- // in case somebody is insane and added them to the manifest, why not
- if(bot.len > 0)
- dat += "| Silicon |
"
- for(name in bot)
- dat += "| [name] | [bot[name]] | [isactive[name]] |
"
- even = !even
- // misc guys
- if(misc.len > 0)
- dat += "| Miscellaneous |
"
- for(name in misc)
- dat += "| [name] | [misc[name]] | [isactive[name]] |
"
- even = !even
-
- dat += "
"
- dat = replacetext(dat, "\n", "") // so it can be placed on paper correctly
- dat = replacetext(dat, "\t", "")
- return dat
-
-
/var/list/acting_rank_prefixes = list("acting", "temporary", "interim")
/proc/make_list_rank(rank)
@@ -179,13 +56,13 @@
We can't just insert in HTML into the nanoUI so we need the raw data to play with.
Instead of creating this list over and over when someone leaves their PDA open to the page
we'll only update it when it changes. The PDA_Manifest global list is zeroed out upon any change
-using /obj/effect/datacore/proc/manifest_inject( ), or manifest_insert( )
+using /datum/datacore/proc/manifest_inject( ), or manifest_insert( )
*/
var/global/list/PDA_Manifest = list()
var/global/ManifestJSON
-/obj/effect/datacore/proc/get_manifest_json()
+/datum/datacore/proc/get_manifest_json()
if(PDA_Manifest.len)
return
var/heads[0]
diff --git a/code/defines/procs/announce.dm b/code/defines/procs/announce.dm
index be5b468c7f..df686a7105 100644
--- a/code/defines/procs/announce.dm
+++ b/code/defines/procs/announce.dm
@@ -123,3 +123,9 @@ datum/announcement/proc/Log(message as text, message_title as text)
/proc/ion_storm_announcement()
command_announcement.Announce("It has come to our attention that the station passed through an ion storm. Please monitor all electronic equipment for malfunctions.", "Anomaly Alert")
+
+proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message)
+ if (ticker.current_state == GAME_STATE_PLAYING)
+ if(character.mind.role_alt_title)
+ rank = character.mind.role_alt_title
+ global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
diff --git a/code/defines/procs/records.dm b/code/defines/procs/records.dm
deleted file mode 100644
index 256ae51dbf..0000000000
--- a/code/defines/procs/records.dm
+++ /dev/null
@@ -1,48 +0,0 @@
-/proc/CreateGeneralRecord()
- var/mob/living/carbon/human/dummy = new()
- dummy.mind = new()
- var/icon/front = new(get_id_photo(dummy), dir = SOUTH)
- var/icon/side = new(get_id_photo(dummy), dir = WEST)
- 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"
- G.fields["home_system"] = "Unknown"
- G.fields["citizenship"] = "Unknown"
- G.fields["faction"] = "Unknown"
- G.fields["religion"] = "Unknown"
- G.fields["photo_front"] = front
- G.fields["photo_side"] = side
- data_core.general += G
-
- qdel(dummy)
- return G
-
-/proc/CreateSecurityRecord(var/name as text, var/id as text)
- var/datum/data/record/R = new /datum/data/record()
- R.fields["name"] = name
- R.fields["id"] = id
- R.name = text("Security Record #[id]")
- R.fields["criminal"] = "None"
- R.fields["mi_crim"] = "None"
- R.fields["mi_crim_d"] = "No minor crime convictions."
- R.fields["ma_crim"] = "None"
- R.fields["ma_crim_d"] = "No major crime convictions."
- R.fields["notes"] = "No notes."
- data_core.security += R
- return R
-
-/proc/find_security_record(field, value)
- return find_record(field, value, data_core.security)
-
-/proc/find_record(field, value, list/L)
- for(var/datum/data/record/R in L)
- if(R.fields[field] == value)
- return R
diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm
index 8534128fb7..0f51a76bdf 100644
--- a/code/game/machinery/computer/security.dm
+++ b/code/game/machinery/computer/security.dm
@@ -411,11 +411,11 @@ What a mess.*/
//RECORD CREATE
if ("New Record (Security)")
if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
- active2 = CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
+ active2 = data_core.CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
screen = 3
if ("New Record (General)")
- active1 = CreateGeneralRecord()
+ active1 = data_core.CreateGeneralRecord()
active2 = null
//FIELD FUNCTIONS
diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm
index 422e397a0e..871c74b551 100644
--- a/code/game/machinery/computer/skills.dm
+++ b/code/game/machinery/computer/skills.dm
@@ -302,7 +302,7 @@ What a mess.*/
if ("New Record (General)")
if(PDA_Manifest.len)
PDA_Manifest.Cut()
- active1 = CreateGeneralRecord()
+ active1 = data_core.CreateGeneralRecord()
//FIELD FUNCTIONS
if ("Edit Field")
diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm
index c13dd9713e..a346c12fac 100644
--- a/code/game/machinery/computer3/computers/security.dm
+++ b/code/game/machinery/computer3/computers/security.dm
@@ -430,11 +430,11 @@ What a mess.*/
//RECORD CREATE
if ("New Record (Security)")
if ((istype(active1, /datum/data/record) && !( istype(active2, /datum/data/record) )))
- active2 = CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
+ active2 = data_core.CreateSecurityRecord(active1.fields["name"], active1.fields["id"])
screen = 3
if ("New Record (General)")
- active1 = CreateGeneralRecord()
+ active1 = data_core.CreateGeneralRecord()
active2 = null
//FIELD FUNCTIONS
diff --git a/code/global.dm b/code/global.dm
index b2222ca3f0..3b7a31f6fe 100644
--- a/code/global.dm
+++ b/code/global.dm
@@ -4,7 +4,7 @@
#endif
// Items that ask to be called every cycle.
-var/global/obj/effect/datacore/data_core = null
+var/global/datum/datacore/data_core = null
var/global/list/all_areas = list()
var/global/list/machines = list()
var/global/list/processing_objects = list()
diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm
index b240f087a9..6e2bf5c4cb 100644
--- a/code/modules/admin/verbs/randomverbs.dm
+++ b/code/modules/admin/verbs/randomverbs.dm
@@ -447,7 +447,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
data_core.manifest_inject(new_character)
if(alert(new_character,"Would you like an active AI to announce this character?",,"No","Yes")=="Yes")
- call(/mob/new_player/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
+ call(/proc/AnnounceArrival)(new_character, new_character.mind.assigned_role)
message_admins("\blue [admin] has respawned [player_key] as [new_character.real_name].", 1)
diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm
index bf1fa9d8c2..56147966a8 100644
--- a/code/modules/mob/new_player/new_player.dm
+++ b/code/modules/mob/new_player/new_player.dm
@@ -373,12 +373,6 @@
qdel(src)
- proc/AnnounceArrival(var/mob/living/carbon/human/character, var/rank, var/join_message)
- if (ticker.current_state == GAME_STATE_PLAYING)
- if(character.mind.role_alt_title)
- rank = character.mind.role_alt_title
- global_announcer.autosay("[character.real_name],[rank ? " [rank]," : " visitor," ] [join_message ? join_message : "has arrived on the station"].", "Arrivals Announcement Computer")
-
proc/AnnounceCyborg(var/mob/living/character, var/rank, var/join_message)
if (ticker.current_state == GAME_STATE_PLAYING)
if(character.mind.role_alt_title)