diff --git a/code/_globalvars/station.dm b/code/_globalvars/station.dm
index 523965b66a1..f08afe5efb9 100644
--- a/code/_globalvars/station.dm
+++ b/code/_globalvars/station.dm
@@ -1,4 +1,4 @@
-var/global/obj/effect/datacore/data_core = null
+var/global/datum/datacore/data_core = null
var/CELLRATE = 0.002 // multiplier for watts per tick <> cell storage (eg: .002 means if there is a load of 1000 watts, 20 units will be taken from a cell per second)
var/CHARGELEVEL = 0.0005 // Cap for how fast cells charge, as a percentage-per-tick (.001 means cellcharge is capped to 1% per second)
diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm
index 6a73d9108dd..364f39c208f 100644
--- a/code/datums/datacore.dm
+++ b/code/datums/datacore.dm
@@ -1,16 +1,231 @@
/hook/startup/proc/createDatacore()
- data_core = new /obj/effect/datacore()
+ data_core = new /datum/datacore()
return 1
-/obj/effect/datacore/proc/manifest(var/nosleep = 0)
- spawn()
- if(!nosleep)
- sleep(40)
- for(var/mob/living/carbon/human/H in player_list)
- manifest_inject(H)
- return
+/datum/datacore
+ var/list/medical = list()
+ var/list/general = list()
+ var/list/security = list()
+ //This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
+ var/list/locked = list()
-/obj/effect/datacore/proc/manifest_modify(var/name, var/assignment)
+/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/ser = new()
+ var/list/sup = 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 = 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"]
+ 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 service_positions)
+ ser[name] = rank
+ department = 1
+ if(real_rank in supply_positions)
+ sup[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(var/name in heads)
+ dat += "| [name] | [heads[name]] | [isactive[name]] |
"
+ even = !even
+ if(sec.len > 0)
+ dat += "| Security |
"
+ for(var/name in sec)
+ dat += "| [name] | [sec[name]] | [isactive[name]] |
"
+ even = !even
+ if(eng.len > 0)
+ dat += "| Engineering |
"
+ for(var/name in eng)
+ dat += "| [name] | [eng[name]] | [isactive[name]] |
"
+ even = !even
+ if(med.len > 0)
+ dat += "| Medical |
"
+ for(var/name in med)
+ dat += "| [name] | [med[name]] | [isactive[name]] |
"
+ even = !even
+ if(sci.len > 0)
+ dat += "| Science |
"
+ for(var/name in sci)
+ dat += "| [name] | [sci[name]] | [isactive[name]] |
"
+ even = !even
+ if(ser.len > 0)
+ dat += "| Service |
"
+ for(var/name in ser)
+ dat += "| [name] | [ser[name]] | [isactive[name]] |
"
+ even = !even
+ if(sup.len > 0)
+ dat += "| Supply |
"
+ for(var/name in sup)
+ dat += "| [name] | [sup[name]] | [isactive[name]] |
"
+ even = !even
+ if(bot.len > 0)
+ dat += "| Silicon |
"
+ for(var/name in bot)
+ dat += "| [name] | [bot[name]] | [isactive[name]] |
"
+ even = !even
+ if(misc.len > 0)
+ dat += "| Miscellaneous |
"
+ for(var/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
+
+
+/*
+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 /datum/datacore/proc/manifest_inject(), or manifest_insert()
+*/
+
+var/global/list/PDA_Manifest = list()
+
+/datum/datacore/proc/get_manifest_json()
+ if(PDA_Manifest.len)
+ return
+ var/heads[0]
+ var/sec[0]
+ var/eng[0]
+ var/med[0]
+ var/sci[0]
+ var/ser[0]
+ var/sup[0]
+ var/bot[0]
+ var/misc[0]
+ for(var/datum/data/record/t in data_core.general)
+ var/name = sanitize(t.fields["name"])
+ var/rank = sanitize(t.fields["rank"])
+ var/real_rank = t.fields["real_rank"]
+
+ var/isactive = t.fields["p_stat"]
+ var/department = 0
+ var/depthead = 0 // Department Heads will be placed at the top of their lists.
+ if(real_rank in command_positions)
+ heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ depthead = 1
+ if(rank == "Captain" && heads.len != 1)
+ heads.Swap(1, heads.len)
+
+ if(real_rank in security_positions)
+ sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sec.len != 1)
+ sec.Swap(1, sec.len)
+
+ if(real_rank in engineering_positions)
+ eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && eng.len != 1)
+ eng.Swap(1, eng.len)
+
+ if(real_rank in medical_positions)
+ med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && med.len != 1)
+ med.Swap(1, med.len)
+
+ if(real_rank in science_positions)
+ sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sci.len != 1)
+ sci.Swap(1, sci.len)
+
+ if(real_rank in service_positions)
+ ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && ser.len != 1)
+ ser.Swap(1, ser.len)
+
+ if(real_rank in supply_positions)
+ sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+ if(depthead && sup.len != 1)
+ sup.Swap(1, sup.len)
+
+ if(real_rank in nonhuman_positions)
+ bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
+ department = 1
+
+ if(!department && !(name in heads))
+ misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
+
+
+ PDA_Manifest = list(\
+ "heads" = heads,\
+ "sec" = sec,\
+ "eng" = eng,\
+ "med" = med,\
+ "sci" = sci,\
+ "ser" = ser,\
+ "sup" = sup,\
+ "bot" = bot,\
+ "misc" = misc\
+ )
+ return
+
+
+
+/datum/datacore/proc/manifest()
+ for(var/mob/living/carbon/human/H in player_list)
+ manifest_inject(H)
+
+/datum/datacore/proc/manifest_modify(name, assignment)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
var/datum/data/record/foundrecord
@@ -35,7 +250,8 @@
foundrecord.fields["rank"] = assignment
foundrecord.fields["real_rank"] = real_title
-/obj/effect/datacore/proc/manifest_inject(var/mob/living/carbon/human/H)
+var/record_id_num = 1001
+/datum/datacore/proc/manifest_inject(mob/living/carbon/human/H)
if(PDA_Manifest.len)
PDA_Manifest.Cut()
@@ -50,7 +266,7 @@
else
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/id = num2hex(record_id_num++, 6)
//General Record
@@ -125,8 +341,7 @@
locked += L
return
-
-proc/get_id_photo(var/mob/living/carbon/human/H)
+/proc/get_id_photo(mob/living/carbon/human/H)
var/icon/preview_icon = null
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = H.get_int_organ(/obj/item/organ/internal/eyes)
diff --git a/code/game/objects/effects/datacore-effect.dm b/code/game/objects/effects/datacore-effect.dm
deleted file mode 100644
index 65d873666d1..00000000000
--- a/code/game/objects/effects/datacore-effect.dm
+++ /dev/null
@@ -1,228 +0,0 @@
-//This item is not completely unused- the central datacore datum uses it.
-/*
- * 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/ser = new()
- var/list/sup = 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 = 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"]
-// to_chat(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 service_positions)
- ser[name] = rank
- department = 1
- if(real_rank in supply_positions)
- sup[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(ser.len > 0)
- dat += "| Service |
"
- for(name in ser)
- dat += "| [name] | [ser[name]] | [isactive[name]] |
"
- even = !even
- if(sup.len > 0)
- dat += "| Supply |
"
- for(name in sup)
- dat += "| [name] | [sup[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
-
-
-/*
-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( )
-*/
-
-var/global/list/PDA_Manifest = list()
-
-/obj/effect/datacore/proc/get_manifest_json()
- if(PDA_Manifest.len)
- return
- var/heads[0]
- var/sec[0]
- var/eng[0]
- var/med[0]
- var/sci[0]
- var/ser[0]
- var/sup[0]
- var/bot[0]
- var/misc[0]
- for(var/datum/data/record/t in data_core.general)
- var/name = sanitize(t.fields["name"])
- var/rank = sanitize(t.fields["rank"])
- var/real_rank = t.fields["real_rank"]
-
- var/isactive = t.fields["p_stat"]
- var/department = 0
- var/depthead = 0 // Department Heads will be placed at the top of their lists.
- if(real_rank in command_positions)
- heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- depthead = 1
- if(rank == "Captain" && heads.len != 1)
- heads.Swap(1, heads.len)
-
- if(real_rank in security_positions)
- sec[++sec.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sec.len != 1)
- sec.Swap(1, sec.len)
-
- if(real_rank in engineering_positions)
- eng[++eng.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && eng.len != 1)
- eng.Swap(1, eng.len)
-
- if(real_rank in medical_positions)
- med[++med.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && med.len != 1)
- med.Swap(1, med.len)
-
- if(real_rank in science_positions)
- sci[++sci.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sci.len != 1)
- sci.Swap(1, sci.len)
-
- if(real_rank in service_positions)
- ser[++ser.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && ser.len != 1)
- ser.Swap(1, ser.len)
-
- if(real_rank in supply_positions)
- sup[++sup.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
- if(depthead && sup.len != 1)
- sup.Swap(1, sup.len)
-
- if(real_rank in nonhuman_positions)
- bot[++bot.len] = list("name" = name, "rank" = rank, "active" = isactive)
- department = 1
-
- if(!department && !(name in heads))
- misc[++misc.len] = list("name" = name, "rank" = rank, "active" = isactive)
-
-
- PDA_Manifest = list(\
- "heads" = heads,\
- "sec" = sec,\
- "eng" = eng,\
- "med" = med,\
- "sci" = sci,\
- "ser" = ser,\
- "sup" = sup,\
- "bot" = bot,\
- "misc" = misc\
- )
- return
-
diff --git a/paradise.dme b/paradise.dme
index 841dd078c1b..3087d0cb61c 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -663,7 +663,6 @@
#include "code\game\objects\effects\aliens.dm"
#include "code\game\objects\effects\anomalies.dm"
#include "code\game\objects\effects\bump_teleporter.dm"
-#include "code\game\objects\effects\datacore-effect.dm"
#include "code\game\objects\effects\effect_system.dm"
#include "code\game\objects\effects\explosion_particles.dm"
#include "code\game\objects\effects\forcefields.dm"