diff --git a/code/defines/obj.dm b/code/defines/obj.dm
index c574a8285ed..b8658dadf68 100644
--- a/code/defines/obj.dm
+++ b/code/defines/obj.dm
@@ -107,6 +107,110 @@
//This list tracks characters spawned in the world and cannot be modified in-game. Currently referenced by respawn_character().
var/locked[] = list()
+ proc/get_manifest(monochrome)
+ 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/dat = {"
+
+
+ | Name | Rank |
+ "}
+ 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"]
+
+ //world << "[name]: [rank]"
+
+ if(rank in command_positions)
+ heads[name] = rank
+ if(rank in security_positions)
+ sec[name] = rank
+ continue
+ if(rank in engineering_positions)
+ eng[name] = rank
+ continue
+ if(rank in medical_positions)
+ med[name] = rank
+ continue
+ if(rank in science_positions)
+ sci[name] = rank
+ continue
+ if(rank in civilian_positions)
+ civ[name] = rank
+ continue
+ if(rank in nonhuman_positions)
+ bot[name] = rank
+ continue
+
+ if(!(name in heads))
+ misc[name] = rank
+
+ if(heads.len > 0)
+ dat += "| Heads |
"
+ for(name in heads)
+ dat += "| [name] | [heads[name]] |
"
+ even = !even
+ if(sec.len > 0)
+ dat += "| Security |
"
+ for(name in sec)
+ dat += "| [name] | [sec[name]] |
"
+ even = !even
+ if(eng.len > 0)
+ dat += "| Engineering |
"
+ for(name in eng)
+ dat += "| [name] | [eng[name]] |
"
+ even = !even
+ if(med.len > 0)
+ dat += "| Medical |
"
+ for(name in med)
+ dat += "| [name] | [med[name]] |
"
+ even = !even
+ if(sci.len > 0)
+ dat += "| Science |
"
+ for(name in sci)
+ dat += "| [name] | [sci[name]] |
"
+ even = !even
+ if(civ.len > 0)
+ dat += "| Civilian |
"
+ for(name in civ)
+ dat += "| [name] | [civ[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]] |
"
+ even = !even
+ // misc guys
+ if(misc.len > 0)
+ dat += "| Miscellaneous |
"
+ for(name in misc)
+ dat += "| [name] | [misc[name]] |
"
+ even = !even
+
+
+ dat += "
"
+ dat = dd_replacetext(dat, "\n", "") // so it can be placed on paper correctly
+ dat = dd_replacetext(dat, "\t", "")
+ return dat
+
/obj/effect/equip_e
name = "equip e"
var/mob/source = null
diff --git a/code/game/machinery/computer/id.dm b/code/game/machinery/computer/id.dm
index 05cc6749c91..6583bc5f416 100644
--- a/code/game/machinery/computer/id.dm
+++ b/code/game/machinery/computer/id.dm
@@ -52,9 +52,7 @@
if (!( ticker ))
return
if (mode) // accessing crew manifest
- var/crew = ""
- for(var/datum/data/record/t in data_core.general)
- crew += "[t.fields["name"]] - [t.fields["rank"]]
"
+ var/crew = data_core.get_manifest()
dat = "Crew Manifest:
Please use the security record computer to modify entries.
[crew]Print
Access ID modification console.
"
else
var/header = "Identification Card Modifier
"
@@ -245,10 +243,7 @@
printing = 1
sleep(50)
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( loc )
- var/t1 = "Crew Manifest:
"
- for(var/datum/data/record/t in data_core.general)
- t1 += "[t.fields["name"]] - [t.fields["rank"]]
"
- P.info = t1
+ P.info = "Crew Manifest:
" + data_core.get_manifest()
P.name = "paper - 'Crew Manifest'"
printing = null
if (modify)
diff --git a/code/game/objects/devices/PDA/cart.dm b/code/game/objects/devices/PDA/cart.dm
index b3e9698f6de..488db44b814 100644
--- a/code/game/objects/devices/PDA/cart.dm
+++ b/code/game/objects/devices/PDA/cart.dm
@@ -235,8 +235,7 @@ Code:
menu = "
Crew Manifest
"
menu += "Entries cannot be modified from this terminal.
"
- for (var/datum/data/record/t in data_core.general)
- menu += "[t.fields["name"]] - [t.fields["rank"]]
"
+ menu += data_core.get_manifest(1)
menu += "
"
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index 81e8d63dad0..0fc8d0c57e9 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -228,11 +228,8 @@
return
/obj/effect/manifest/proc/manifest()
- var/dat = "Crew Manifest:
"
- for(var/mob/living/carbon/human/M in world)
- dat += text(" [] - []
", M.name, M.get_assignment())
var/obj/item/weapon/paper/P = new /obj/item/weapon/paper( src.loc )
- P.info = dat
+ P.info = "Crew Manifest:
" + data_core.get_manifest()
P.name = "paper - 'Crew Manifest'"
//SN src = null
del(src)