Merge branch 'DetectiveWork' of https://github.com/SkyMarshal/Baystation12 into SkyMarshal-DetectiveWork

Notes:
Fucking hell. Makes the detective backend shit non-retarded. <3 Hashtables.
Map changes. Some improvements/adjustments to code to work with the map changes.

Conflicts:
	baystation12.dme
This commit is contained in:
Erthilo
2012-05-10 16:48:01 +01:00
18 changed files with 4752 additions and 4564 deletions

View File

@@ -195,15 +195,15 @@
..() ..()
*/ */
var/obj/effect/decal/cleanable/blood/B = new(src.loc) // var/obj/effect/decal/cleanable/blood/B = new(src.loc)
var/list/blood_DNA_temp[1] // var/list/blood_DNA_temp[1]
blood_DNA_temp[1] = list(H.dna.unique_enzymes, H.dna.b_type) // blood_DNA_temp[1] = list(H.dna.unique_enzymes, H.dna.b_type)
B.blood_DNA = blood_DNA_temp // B.blood_DNA = blood_DNA_temp
B.virus2 = H.virus2 // B.virus2 = H.virus2
for(var/datum/disease/D in H.viruses) // for(var/datum/disease/D in H.viruses)
var/datum/disease/newDisease = new D.type // var/datum/disease/newDisease = new D.type
B.viruses += newDisease // B.viruses += newDisease
newDisease.holder = B // newDisease.holder = B
H:weakened = max(H:weakened,2) H:weakened = max(H:weakened,2)
H:updatehealth() H:updatehealth()

View File

@@ -17,9 +17,6 @@
// replaced by OPENCONTAINER flags and atom/proc/is_open_container() // replaced by OPENCONTAINER flags and atom/proc/is_open_container()
///Chemistry. ///Chemistry.
//Detective Work, used for the duplicate data points kept in the scanners
var/list/original_atom
proc/assume_air(datum/air_group/giver) proc/assume_air(datum/air_group/giver)
del(giver) del(giver)
return null return null

View File

@@ -2,17 +2,6 @@
return return
/atom/proc/attack_hand(mob/user as mob) /atom/proc/attack_hand(mob/user as mob)
if(ishuman(user) || ismonkey(user))
if (user.hand)
var/datum/organ/external/temp = user:organs["l_hand"]
if(temp.destroyed)
user << "\red Yo- wait a minute."
return
else
var/datum/organ/external/temp = user:organs["r_hand"]
if(temp.destroyed)
user << "\red Yo- wait a minute."
return
return return
/atom/proc/attack_paw(mob/user as mob) /atom/proc/attack_paw(mob/user as mob)
@@ -115,68 +104,68 @@
if(isnull(M.key)) return if(isnull(M.key)) return
if (!( flags ) & 256) if (!( flags ) & 256)
return return
//Smudge up dem prints some
for(var/P in fingerprints)
var/test_print = stars(fingerprints[P], rand(85,95))
if(stringpercent(test_print) == 32) //She's full of stars! (No actual print left)
fingerprints.Remove(P)
else
fingerprints[P] = test_print
if (ishuman(M)) if (ishuman(M))
//Add the list if it does not exist.
if(!fingerprintshidden) if(!fingerprintshidden)
fingerprintshidden = list() fingerprintshidden = list()
//Fibers~
add_fibers(M) add_fibers(M)
//He has no prints!
if (M.mutations2 & mFingerprints) if (M.mutations2 & mFingerprints)
if(fingerprintslast != M.key) if(fingerprintslast != M.key)
fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]" fingerprintshidden += "(Has no fingerprints) Real name: [M.real_name], Key: [M.key]"
fingerprintslast = M.key fingerprintslast = M.key
return 0 return 0
//Now, lets get to the dirty work.
//First, make sure their DNA makes sense.
var/mob/living/carbon/human/H = M var/mob/living/carbon/human/H = M
if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32)) if (!istype(H.dna, /datum/dna) || !H.dna.uni_identity || (length(H.dna.uni_identity) != 32))
if(!istype(H.dna, /datum/dna)) if(!istype(H.dna, /datum/dna))
H.dna = new /datum/dna(null) H.dna = new /datum/dna(null)
H.check_dna() H.check_dna()
//Now, deal with gloves.
if (H.gloves && H.gloves != src) if (H.gloves && H.gloves != src)
if(fingerprintslast != H.key) if(fingerprintslast != H.key)
fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key) fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
fingerprintslast = H.key fingerprintslast = H.key
H.gloves.add_fingerprint(M) H.gloves.add_fingerprint(M)
//Deal with gloves the pass finger/palm prints.
if(H.gloves != src) if(H.gloves != src)
if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex)) if(prob(75) && istype(H.gloves, /obj/item/clothing/gloves/latex))
return 0 return 0
else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex) && !istype(H.gloves, /obj/item/clothing/gloves/fingerless)) else if(H.gloves && !istype(H.gloves, /obj/item/clothing/gloves/latex) && !istype(H.gloves, /obj/item/clothing/gloves/fingerless))
return 0 return 0
//More adminstuffz
if(fingerprintslast != H.key) if(fingerprintslast != H.key)
fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key) fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
fingerprintslast = H.key fingerprintslast = H.key
//Make the list if it does not exist.
if(!fingerprints) if(!fingerprints)
fingerprints = list() fingerprints = list()
var/new_prints = 0 //Hash this shit.
var/prints var/full_print = md5(H.dna.uni_identity)
for(var/i = 1, i <= fingerprints.len, i++) var/print = fingerprints[full_print] //Find if the print is already there.
var/list/L = params2list(fingerprints[i]) //It is not! We need to add it!
if(L[num2text(1)] == md5(H.dna.uni_identity)) if(!print)
new_prints = i fingerprints[full_print] = stars(full_print, H.gloves ? rand(10,20) : rand(25,40))
prints = L[num2text(2)] //It's there, lets merge this shit!
break
else
var/test_print = stars(L[num2text(2)], rand(80,90))
if(stringpercent(test_print) == 32)
if(fingerprints.len == 1)
fingerprints = list()
else
fingerprints.Cut(i,i+1)
else
fingerprints[i] = "1=[L[num2text(1)]]&2=[test_print]"
if(new_prints)
fingerprints[new_prints] = text("1=[]&2=[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), (H.gloves ? rand(10,20) : rand(25,40)))))
else else
if(!fingerprints || !fingerprints.len) fingerprints[full_print] = stringmerge(print, stars(full_print, (H.gloves ? rand(10,20) : rand(25,40))))
fingerprints = list(text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40))))
else
fingerprints += text("1=[]&2=[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), H.gloves ? rand(10,20) : rand(25,40)))
for(var/i = 1, i <= fingerprints.len, i++)
if(length(fingerprints[i]) != 69)
fingerprints.Remove(fingerprints[i])
if(fingerprints && !fingerprints.len) del(fingerprints)
return 1 return 1
else else
if(fingerprintslast != M.key) if(fingerprintslast != M.key)
fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key) fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
fingerprintslast = M.key fingerprintslast = M.key
//Cleaning up shit.
if(fingerprints && !fingerprints.len)
del(fingerprints)
return return
//returns 1 if made bloody, returns 0 otherwise //returns 1 if made bloody, returns 0 otherwise
@@ -211,11 +200,9 @@
O.overlays += O.blood_overlay O.overlays += O.blood_overlay
//if this blood isn't already in the list, add it //if this blood isn't already in the list, add it
for(var/i = 1, i <= O.blood_DNA.len, i++) if(blood_DNA[M.dna.unique_enzymes])
if((O.blood_DNA[i][1] == M.dna.unique_enzymes) && (O.blood_DNA[i][2] == M.dna.b_type)) return 0 //already bloodied with this blood. Cannot add more.
return 0 //already bloodied with this blood. Cannot add more. blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
O.blood_DNA.len++
O.blood_DNA[O.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
return 1 //we applied blood to the item return 1 //we applied blood to the item
//adding blood to turfs //adding blood to turfs
@@ -224,8 +211,8 @@
//get one blood decal and infect it with virus from M.viruses //get one blood decal and infect it with virus from M.viruses
for(var/obj/effect/decal/cleanable/blood/B in T.contents) for(var/obj/effect/decal/cleanable/blood/B in T.contents)
B.blood_DNA.len++ if(!B.blood_DNA[M.dna.unique_enzymes])
B.blood_DNA[B.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) B.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
B.virus2 += M.virus2 B.virus2 += M.virus2
for(var/datum/disease/D in M.viruses) for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type var/datum/disease/newDisease = new D.type
@@ -235,7 +222,7 @@
//if there isn't a blood decal already, make one. //if there isn't a blood decal already, make one.
var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(T) var/obj/effect/decal/cleanable/blood/newblood = new /obj/effect/decal/cleanable/blood(T)
newblood.blood_DNA = list(list(M.dna.unique_enzymes, M.dna.b_type)) newblood.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
newblood.blood_owner = M newblood.blood_owner = M
newblood.virus2 = M.virus2 newblood.virus2 = M.virus2
for(var/datum/disease/D in M.viruses) for(var/datum/disease/D in M.viruses)
@@ -248,11 +235,9 @@
else if (istype(src, /mob/living/carbon/human)) else if (istype(src, /mob/living/carbon/human))
var/mob/living/carbon/human/H = src var/mob/living/carbon/human/H = src
//if this blood isn't already in the list, add it //if this blood isn't already in the list, add it
for(var/i = 1, i <= H.blood_DNA.len, i++) if(blood_DNA[H.dna.unique_enzymes])
if((H.blood_DNA[i][1] == M.dna.unique_enzymes) && (H.blood_DNA[i][2] == M.dna.b_type)) return 0 //already bloodied with this blood. Cannot add more.
return 0 //already bloodied with this blood. Cannot add more. blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
H.blood_DNA.len++
H.blood_DNA[H.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type)
return 1 //we applied blood to the item return 1 //we applied blood to the item
return return
@@ -275,7 +260,7 @@
if( istype(src, /turf/simulated) ) if( istype(src, /turf/simulated) )
var/turf/simulated/source1 = src var/turf/simulated/source1 = src
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source1) var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source1)
this.blood_DNA = list(M.dna.unique_enzymes, M.dna.b_type) this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
this.OriginalMob = M.dna.original_name this.OriginalMob = M.dna.original_name
for(var/datum/disease/D in M.viruses) for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type var/datum/disease/newDisease = new D.type
@@ -286,7 +271,7 @@
if( istype(src, /turf/simulated) ) if( istype(src, /turf/simulated) )
var/turf/simulated/source2 = src var/turf/simulated/source2 = src
var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(source2) var/obj/effect/decal/cleanable/xenoblood/this = new /obj/effect/decal/cleanable/xenoblood(source2)
this.blood_DNA = list(list("UNKNOWN BLOOD","X*")) this.blood_DNA["UNKNOWN BLOOD"] = "X*"
for(var/datum/disease/D in M.viruses) for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type var/datum/disease/newDisease = new D.type
this.viruses += newDisease this.viruses += newDisease
@@ -305,9 +290,9 @@
/atom/proc/clean_blood() /atom/proc/clean_blood()
if (!( src.flags ) & 256) if (!flags & 256)
return return
if ( src.blood_DNA ) if (blood_DNA )
//Cleaning blood off of mobs //Cleaning blood off of mobs
if (istype (src, /mob/living/carbon)) if (istype (src, /mob/living/carbon))
@@ -340,25 +325,14 @@
if(blood_DNA && istype(blood_DNA, /list) && !blood_DNA.len) if(blood_DNA && istype(blood_DNA, /list) && !blood_DNA.len)
del(blood_DNA) del(blood_DNA)
if(src.fingerprints && src.fingerprints.len) if(fingerprints && fingerprints.len)
var/done = 0 //Smudge up dem prints some
while(!done) for(var/P in fingerprints)
done = 1 var/test_print = stars(fingerprints[P], rand(10,20))
for(var/i = 1, i < (src.fingerprints.len + 1), i++) if(stringpercent(test_print) == 32) //She's full of stars! (No actual print left)
var/list/prints = params2list(src.fingerprints[i]) fingerprints.Remove(P)
var/test_print = prints["2"] else
var/new_print = stars(test_print, rand(1,20)) fingerprints[P] = test_print
if(stringpercent(new_print) == 32)
if(src.fingerprints.len == 1)
src.fingerprints = list()
else
for(var/j = (i + 1), j < (src.fingerprints.len), j++)
src.fingerprints[j-1] = src.fingerprints[j]
src.fingerprints.len--
done = 0
break
else
src.fingerprints[i] = "1=" + prints["1"] + "&2=" + new_print
if(fingerprints && !fingerprints.len) if(fingerprints && !fingerprints.len)
del(fingerprints) del(fingerprints)
if(istype(src, /mob/living/carbon/human)) if(istype(src, /mob/living/carbon/human))

View File

@@ -801,7 +801,7 @@
H.apply_damage(0.5*damage, BRUTE, "r_arm") H.apply_damage(0.5*damage, BRUTE, "r_arm")
var/obj/effect/decal/cleanable/blood/B = new(src.loc) var/obj/effect/decal/cleanable/blood/B = new(src.loc)
B.blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type)) B.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
bloodiness += 4 bloodiness += 4

View File

@@ -486,7 +486,17 @@
autolinkers = list("bus3", "bus4") // Bus units 3 and 4 autolinkers = list("bus3", "bus4") // Bus units 3 and 4
freq_listening = list(1459, 1353, 1357, 1359) // common, command, engineering, security freq_listening = list(1459, 1353, 1357, 1359) // common, command, engineering, security
/obj/machinery/telecomms/receiver/antiqua_left
id = "Receiver A"
network = "tcommsat"
autolinkers = list("bus1") // link to bus units 1 and 2
freq_listening = list(1351, 1355, 1347, 1349) // science, medical, cargo, mining
/obj/machinery/telecomms/receiver/antiqua_right
id = "Receiver B"
network = "tcommsat"
autolinkers = list("bus2") // Bus units 3 and 4
freq_listening = list(1459, 1353, 1357, 1359) // common, command, engineering, security
/obj/machinery/telecomms/bus/preset_one /obj/machinery/telecomms/bus/preset_one
id = "Bus 1" id = "Bus 1"
@@ -508,6 +518,15 @@
network = "tcommsat" network = "tcommsat"
autolinkers = list("bus4", "processor4", "engineering", "common") autolinkers = list("bus4", "processor4", "engineering", "common")
/obj/machinery/telecomms/bus/antiqua_one
id = "Bus 1"
network = "tcommsat"
autolinkers = list("bus1", "processor1", "science", "medical", "cargo", "mining")
/obj/machinery/telecomms/bus/antiqua_two
id = "Bus 2"
network = "tcommsat"
autolinkers = list("bus2", "processor2", "cargo", "mining", "engineering", "common")
/obj/machinery/telecomms/processor/preset_one /obj/machinery/telecomms/processor/preset_one

View File

@@ -562,7 +562,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
R.word2 = w2 R.word2 = w2
R.word3 = w3 R.word3 = w3
R.check_icon() R.check_icon()
R.blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type)) R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
return return
else else
user << "The book seems full of illegible scribbles. Is this a joke?" user << "The book seems full of illegible scribbles. Is this a joke?"
@@ -607,7 +607,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology",
var/obj/effect/rune/R = new /obj/effect/rune var/obj/effect/rune/R = new /obj/effect/rune
if(istype(user, /mob/living/carbon/human)) if(istype(user, /mob/living/carbon/human))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
R.blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type)) R.blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
switch(r) switch(r)
if("teleport") if("teleport")
var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri") var/list/words = list("ire", "ego", "nahlizet", "certum", "veri", "jatkaa", "balaq", "mgar", "karazet", "geeri")

View File

@@ -831,9 +831,8 @@
else else
user << "\blue Blood found on [C]. Analysing..." user << "\blue Blood found on [C]. Analysing..."
spawn(15) spawn(15)
for(var/i = 1, i < C:blood_DNA.len, i++) for(var/blood in C:blood_DNA)
var/list/templist = C:blood_DNA[i] user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]"
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
if(4) if(4)
for (var/mob/O in viewers(C, null)) for (var/mob/O in viewers(C, null))
@@ -855,16 +854,15 @@
var/list/prints = A:fingerprints var/list/prints = A:fingerprints
var/list/complete_prints = list() var/list/complete_prints = list()
for(var/i in prints) for(var/i in prints)
var/list/templist = params2list(i) var/print = prints[i]
var/temp = stringpercent(templist["2"]) if(stringpercent(print) <= FINGERPRINT_COMPLETE)
if(temp <= 6) complete_prints += print
complete_prints += templist["2"]
if(complete_prints.len < 1) if(complete_prints.len < 1)
user << "\blue No intact prints found" user << "\blue No intact prints found"
else else
user << "\blue Found [complete_prints.len] intact prints" user << "\blue Found [complete_prints.len] intact prints"
for(var/i in complete_prints) for(var/i in complete_prints)
user << "\blue " + i user << "\blue [i]"
if(3) if(3)
if(!isnull(A.reagents)) if(!isnull(A.reagents))

View File

@@ -85,7 +85,7 @@ MASS SPECTROMETER
src.amount += W.amount src.amount += W.amount
//W = null //W = null
del(W) del(W)
src.add_fingerprint(user) add_fingerprint(user)
if (W) if (W)
W.add_fingerprint(user) W.add_fingerprint(user)
return return
@@ -110,9 +110,6 @@ MASS SPECTROMETER
else else
if (src.amount < 1) if (src.amount < 1)
user << text("\blue Fingerprints scanned on [M]. Need more cards to print.") user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
// src.printing = 0
// src.icon_state = text("forensic[]", src.printing)
// if (src.printing)
else else
src.amount-- src.amount--
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc ) var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
@@ -122,7 +119,7 @@ MASS SPECTROMETER
F.name = text("FPrintC- '[M.name]'") F.name = text("FPrintC- '[M.name]'")
user << "\blue Done printing." user << "\blue Done printing."
user << text("\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]") user << "\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]"
if ( !M.blood_DNA || !M.blood_DNA.len ) if ( !M.blood_DNA || !M.blood_DNA.len )
user << "\blue No blood found on [M]" user << "\blue No blood found on [M]"
if(M.blood_DNA) if(M.blood_DNA)
@@ -130,16 +127,15 @@ MASS SPECTROMETER
else else
user << "\blue Blood found on [M]. Analysing..." user << "\blue Blood found on [M]. Analysing..."
spawn(15) spawn(15)
for(var/i = 1, i <= M.blood_DNA.len, i++) for(var/blood in M.blood_DNA)
var/list/templist = M.blood_DNA[i] user << "\blue Blood type: [M.blood_DNA[blood]]\nDNA: [blood]"
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
return return
afterattack(atom/A as obj|turf|area, mob/user as mob) afterattack(atom/A as obj|turf|area, mob/user as mob)
if(!(locate(A) in oview(1,user))) if(!(locate(A) in oview(1,user)))
return return
if(src.loc != user) if(src.loc != user)
return 0 return
if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit. if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
return return
if(istype(A,/obj/item/weapon/f_card)) if(istype(A,/obj/item/weapon/f_card))
@@ -147,17 +143,21 @@ MASS SPECTROMETER
return return
if(!A.fingerprints) if(!A.fingerprints)
A.fingerprints = list() A.fingerprints = list()
src.add_fingerprint(user) add_fingerprint(user)
//Special case for blood splaters.
if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune)) if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
if(!isnull(A.blood_DNA)) if(!isnull(A.blood_DNA))
for(var/i = 1, i <= A.blood_DNA.len, i++) for(var/blood in A.blood_DNA)
var/list/templist = A.blood_DNA[i] user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
return return
var/duplicate = 0 var/duplicate = 0
//General
if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA) if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!" user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
return 0 return 0
//BLOOD
else if (A.blood_DNA) else if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..." user << "\blue Blood found on [A]. Analysing..."
sleep(15) sleep(15)
@@ -166,11 +166,12 @@ MASS SPECTROMETER
var/i = add_data(A) var/i = add_data(A)
if(i) if(i)
user << "\blue Blood already in memory." user << "\blue Blood already in memory."
for(var/i = 1, i < (A.blood_DNA.len + 1), i++) for(var/blood in A.blood_DNA)
var/list/templist = A.blood_DNA[i] user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
else else
user << "\blue No Blood Located" user << "\blue No Blood Located"
//PRINTS
if(!A.fingerprints || !A.fingerprints.len) if(!A.fingerprints || !A.fingerprints.len)
user << "\blue No Fingerprints Located." user << "\blue No Fingerprints Located."
if(A.fingerprints) if(A.fingerprints)
@@ -182,6 +183,8 @@ MASS SPECTROMETER
var/i = add_data(A) var/i = add_data(A)
if(i) if(i)
user << "\blue Fingerprints already in memory." user << "\blue Fingerprints already in memory."
//FIBERS
if(!A.suit_fibers) if(!A.suit_fibers)
user << "\blue No Fibers/Materials Located." user << "\blue No Fibers/Materials Located."
else else
@@ -192,78 +195,44 @@ MASS SPECTROMETER
var/i = add_data(A) var/i = add_data(A)
if(i) if(i)
user << "\blue Fibers/Materials already in memory." user << "\blue Fibers/Materials already in memory."
// else
// if ((src.amount < 1 && src.printing))
// user << "\blue Fingerprints found. Need more cards to print."
// src.printing = 0
// src.icon_state = text("forensic[]", src.printing)
// if (src.printing)
// src.amount--
// var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
// F.amount = 1
// F.fingerprints = A.fingerprints
// F.icon_state = "fingerprint1"
// user << "\blue Done printing."
// for(var/i in L)
// user << text("\blue \t [i]")
// //Foreach goto(186)
return return
proc/add_data(atom/A as mob|obj|turf|area) proc/add_data(atom/A as mob|obj|turf|area)
var/merged = 0 //I love hashtables.
for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there! var/list/data_entry = stored["\ref [A]"]
var/list/temp = stored[i] if(islist(data_entry)) //Yay, it was already stored!
var/atom/checker = temp[1] //Merge the fingerprints.
var/atom_checker_scan = (A.original_atom ? checker.original_atom[1] == A.original_atom[1] : 0) var/list/data_prints = data_entry[1]
if(checker.original_atom[1] == A || atom_checker_scan) //It is! Merge! for(var/print in A.fingerprints)
merged = 1 var/merged_print = data_prints[print]
var/list/prints = temp[2] if(!merged_print)
if(!prints) data_prints[print] = A.fingerprints[print]
prints = list() else
if(A.fingerprints && A.fingerprints.len) data_prints[print] = stringmerge(data_prints[print],A.fingerprints[print])
for(var/j = 1, j <= A.fingerprints.len, j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j]) //Now the fibers
var/test_print1 = print_test1[num2text(1)] var/list/fibers = data_entry[2]
var/found = 0 if(!fibers)
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there fibers = list()
var/list/print_test2 = params2list(prints[k]) if(A.suit_fibers && A.suit_fibers.len)
var/test_print2 = print_test2[num2text(1)] for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
if(test_print2 == test_print1) //It is! Merge! if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
prints[k] = test_print2 + "&" + stringmerge(print_test2[num2text(2)],print_test1[num2text(2)]) fibers += A.suit_fibers[j]
found = 1 var/list/blood = data_entry[3]
break //We found it, we're done here. if(!blood)
if(!found) //It isn't! Add! blood = list()
prints += A.fingerprints[j] if(A.blood_DNA && A.blood_DNA.len)
var/list/fibers = temp[3] for(var/main_blood in A.blood_DNA)
if(!fibers) if(!blood[main_blood])
fibers = list() blood[main_blood] = A.blood_DNA[blood]
if(A.suit_fibers && A.suit_fibers.len) return 1
for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~ var/list/sum_list[4] //Pack it back up!
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add! sum_list[1] = A.fingerprints
fibers += A.suit_fibers[j] sum_list[2] = A.suit_fibers
var/list/blood = temp[4] sum_list[3] = A.blood_DNA
if(!blood) sum_list[4] = "\The [A] in [get_area(A)]"
blood = list() stored["\ref [A]"] = sum_list
if(A.blood_DNA && A.blood_DNA.len) return 0
for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = checker
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
stored[i] = sum_list //Store it!
break //We found it, we're done here.
if(!merged) //Uh, oh! New data point!
var/list/sum_list[4] //Pack it back up!
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
stored.len++
stored[stored.len] = sum_list
return merged
/obj/item/device/healthanalyzer /obj/item/device/healthanalyzer

View File

@@ -52,13 +52,13 @@
viruus.holder = gib viruus.holder = gib
viruus.spread_type = CONTACT_FEET viruus.spread_type = CONTACT_FEET
if(MobDNA) if(MobDNA)
gib.blood_DNA = list(list(MobDNA.unique_enzymes, MobDNA.b_type)) gib.blood_DNA[MobDNA.unique_enzymes] = MobDNA.b_type
if(MobDNA.original_name != "Unknown") if(MobDNA.original_name != "Unknown")
gib.OriginalMob = MobDNA.original_name gib.OriginalMob = MobDNA.original_name
else if(istype(src, /obj/effect/gibspawner/xeno)) else if(istype(src, /obj/effect/gibspawner/xeno))
gib.blood_DNA = list(list("UNKNOWN DNA", "X*")) gib.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey else if(istype(src, /obj/effect/gibspawner/human)) // Probably a monkey
gib.blood_DNA = list(list("Non-human DNA", "A+")) gib.blood_DNA["Non-human DNA"] = "A+"
var/list/directions = gibdirections[i] var/list/directions = gibdirections[i]
if(directions.len) if(directions.len)
gib.streak(directions) gib.streak(directions)

View File

@@ -228,13 +228,10 @@ FINGERPRINT CARD
/obj/item/weapon/f_card/proc/display() /obj/item/weapon/f_card/proc/display()
if(!fingerprints) return if(!fingerprints) return
if (!istype(src.fingerprints, /list)) if (length(fingerprints))
src.fingerprints = params2list(src.fingerprints)
if (length(src.fingerprints))
var/dat = "<B>Fingerprints on Card</B><HR>" var/dat = "<B>Fingerprints on Card</B><HR>"
for(var/i = 1, i < (src.fingerprints.len + 1), i++) for(var/name in fingerprints)
var/list/L = params2list(src.fingerprints[i]) dat += "[name]<BR>"
dat += text("[]<BR>", L["1"])
//Foreach goto(41) //Foreach goto(41)
return dat return dat
else else
@@ -294,7 +291,7 @@ FINGERPRINT CARD
else else
src.name = "Finger Print Card" src.name = "Finger Print Card"
W.add_fingerprint(user) W.add_fingerprint(user)
src.add_fingerprint(user) add_fingerprint(user)
return return
/obj/item/weapon/f_card/add_fingerprint() /obj/item/weapon/f_card/add_fingerprint()

View File

@@ -159,8 +159,8 @@
var/pressure = air_contents.return_pressure() var/pressure = air_contents.return_pressure()
if(pressure > TANK_FRAGMENT_PRESSURE) if(pressure > TANK_FRAGMENT_PRESSURE)
if(!istype(src.loc,/obj/item/device/transfer_valve)) if(!istype(src.loc,/obj/item/device/transfer_valve))
message_admins("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") message_admins("Explosive tank rupture! last key to touch the tank was [fingerprintslast].")
log_game("Explosive tank rupture! last key to touch the tank was [src.fingerprintslast].") log_game("Explosive tank rupture! last key to touch the tank was [fingerprintslast].")
//world << "\blue[x],[y] tank is exploding: [pressure] kPa" //world << "\blue[x],[y] tank is exploding: [pressure] kPa"
//Give the gas a chance to build up more pressure through reacting //Give the gas a chance to build up more pressure through reacting
air_contents.react() air_contents.react()

View File

@@ -47,22 +47,7 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
suit_fibers += "Material from a pair of [M.gloves.name]." suit_fibers += "Material from a pair of [M.gloves.name]."
if(!suit_fibers.len) del suit_fibers if(!suit_fibers.len) del suit_fibers
atom/proc/get_duplicate(var/atom/location) var/const/FINGERPRINT_COMPLETE = 6 //This is the output of the stringpercent(print) proc, and means about 80% of
var/atom/movable/temp_atom = new /atom/movable(location)
temp_atom.name = src.name
temp_atom.desc = src.desc
temp_atom.icon = src.icon
temp_atom.icon_state = src.icon_state
temp_atom.fingerprints = src.fingerprints
temp_atom.blood_DNA = src.blood_DNA
temp_atom.suit_fibers = src.suit_fibers
if(src.original_atom)
temp_atom.original_atom = src.original_atom
else
temp_atom.original_atom = list(src)
return temp_atom
#define FINGERPRINT_COMPLETE 6 //This is the output of the stringpercent(print) proc, and means about 80% of
//the print must be there for it to be complete. (Prints are 32 digits) //the print must be there for it to be complete. (Prints are 32 digits)
obj/machinery/computer/forensic_scanning obj/machinery/computer/forensic_scanning
@@ -204,96 +189,90 @@ obj/machinery/computer/forensic_scanning
if("database") if("database")
canclear = 1 canclear = 1
if(href_list["delete_record"]) if(href_list["delete_record"])
delete_dossier(text2num(href_list["delete_record"])) delete_dossier(href_list["delete_record"])
if(href_list["delete_aux"]) if(href_list["delete_aux"])
delete_record(text2num(href_list["delete_aux"])) delete_record(href_list["delete_aux"])
if((!misc || !misc.len) && (!files || !files.len)) if((!misc || !misc.len) && (!files || !files.len))
temp = "Database is empty." temp = "Database is empty."
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
else else
if(files && files.len) if(files && files.len)
temp = "<b>Criminal Evidence Database</b><br><br>" temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points:<br>" temp += "Consolidated data points:<br>"
for(var/i = 1, i <= files.len, i++) var/i = 1
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>" for(var/print in files)
temp += "<a href='?src=\ref[src];operation=record;identifier=[print]'>{Dossier [i]}</a><br>"
i++
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card (To complete a Dossier)}</a><br><br><br>" temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card (To complete a Dossier)}</a><br><br><br>"
else else
temp = "" temp = ""
if(misc && misc.len) if(misc && misc.len)
if(href_list["delete"])
delete_record(text2num(href_list["delete"]))
temp += "<b>Auxiliary Evidence Database</b><br><br>" temp += "<b>Auxiliary Evidence Database</b><br><br>"
temp += "This is where anything without fingerprints goes.<br><br>" temp += "This is where anything without fingerprints goes.<br><br>"
for(var/i = 1, i <= misc.len, i++) for(var/atom in misc)
var/list/temp_list = misc[i] var/list/data_entry = misc[atom]
var/item_name = get_name(temp_list[1]) temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[atom]'>{[data_entry[3]]}</a><br>"
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[i]'>{[item_name]}</a><br>"
if("record") if("record")
canclear = 0 canclear = 0
if(files) if(files)
temp = "<b>Criminal Evidence Database</b><br><br>" temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points: Dossier [href_list["identifier"]]<br>" temp += "Consolidated data points: Dossier [files.Find(href_list["identifier"])]<br>"
var/identifier = text2num(href_list["identifier"]) var/list/dossier = files[href_list["identifier"]]
var/list/dossier = files[identifier]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>" var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE) if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[num2text(2)] + "<br>" print_string = "Fingerprints: (80% or higher completion reached)<br>[dossier[1]]<br>"
temp += print_string temp += print_string
for(var/i = 2, i <= dossier.len, i++) for(var/object in dossier)
if(object == dossier[1])
continue
temp += "<hr>" temp += "<hr>"
var/list/outputs = dossier[i] var/list/outputs = dossier[object]
var/item_name = get_name(outputs[1]) var/list/prints_len = outputs[1]
var/list/prints_len = outputs[2] temp += "<big><b>Object:</b> [outputs[4]]</big><br>"
temp += "<big><b>Object:</b> [item_name]</big><br>"
temp += "&nbsp<b>Fingerprints:</b><br>" temp += "&nbsp<b>Fingerprints:</b><br>"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>" temp += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3] var/list/fibers = outputs[2]
if(fibers && fibers.len) if(fibers && fibers.len)
temp += "&nbsp<b>Fibers:</b><br>" temp += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++) for(var/j = 1, j <= fibers.len, j++)
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]<br>" temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]<br>"
var/list/blood = outputs[4] var/list/blood = outputs[3]
if(blood && blood.len) if(blood && blood.len)
temp += "&nbsp<b>Blood:</b><br>" temp += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++) for(var/j = 1, j <= blood.len, j++)
var/list/templist2 = blood[j] var/list/templist2 = blood[j]
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>" temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
else else
temp = "ERROR. Database not found!<br>" temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_record=[href_list["identifier"]]'>{Delete this Dossier}</a>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>" temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("databaseprint") if("databaseprint")
if(files) if(files)
var/obj/item/weapon/paper/P = new(loc) var/obj/item/weapon/paper/P = new(loc)
P.name = "Database File (Dossier [href_list["identifier"]])" P.name = "Database File (Dossier [files.Find(href_list["identifier"])])"
P.overlays += "paper_words" P.overlays += "paper_words"
P.info = "<b>Criminal Evidence Database</b><br><br>" P.info = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>" P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/list/dossier = files[text2num(href_list["identifier"])] var/list/dossier = files[href_list["identifier"]]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>" var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[num2text(2)]) <= FINGERPRINT_COMPLETE) if(stringpercent(dossier[1]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: " + prints[num2text(2)] + "<BR>" print_string = "Fingerprints: (80% or higher completion reached)<br>[dossier[1]]<br>"
P.info += print_string P.info += print_string
for(var/i = 2, i <= dossier.len, i++) for(var/object in dossier)
if(object == dossier[1])
continue
P.info += "<hr>" P.info += "<hr>"
var/list/outputs = dossier[i] var/list/outputs = dossier[object]
var/item_name = get_name(outputs[1]) var/list/prints_len = outputs[1]
var/list/prints_len = outputs[2] P.info += "<big><b>Object:</b> [outputs[4]]</big><br>"
P.info += "<big><b>Object:</b> [item_name]</big><br>"
P.info += "&nbsp<b>Fingerprints:</b><br>" P.info += "&nbsp<b>Fingerprints:</b><br>"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>" P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3] var/list/fibers = outputs[2]
if(fibers && fibers.len) if(fibers && fibers.len)
P.info += "&nbsp<b>Fibers:</b><br>" P.info += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++) for(var/j = 1, j <= fibers.len, j++)
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]<br>" P.info += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]<br>"
var/list/blood = outputs[4] var/list/blood = outputs[3]
if(blood && blood.len) if(blood && blood.len)
P.info += "&nbsp<b>Blood:</b><br>" P.info += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++) for(var/j = 1, j <= blood.len, j++)
@@ -305,42 +284,38 @@ obj/machinery/computer/forensic_scanning
canclear = 0 canclear = 0
if(misc) if(misc)
temp = "<b>Auxiliary Evidence Database</b><br><br>" temp = "<b>Auxiliary Evidence Database</b><br><br>"
var/identifier = text2num(href_list["identifier"]) var/list/outputs = misc[href_list["identifier"]]
var/list/outputs = misc[identifier] temp += "<big><b>Consolidated data points:</b> [outputs[3]]</big><br>"
var/item_name = get_name(outputs[1]) var/list/fibers = outputs[1]
temp += "<big><b>Consolidated data points:</b> [item_name]</big><br>"
var/list/fibers = outputs[2]
if(fibers && fibers.len) if(fibers && fibers.len)
temp += "&nbsp<b>Fibers:</b><br>" temp += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++) for(var/j = 1, j <= fibers.len, j++)
temp += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]" temp += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
var/list/blood = outputs[3] var/list/blood = outputs[2]
if(blood && blood.len) if(blood && blood.len)
temp += "&nbsp<b>Blood:</b><br>" temp += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++) for(var/j = 1, j <= blood.len, j++)
var/list/templist2 = blood[j] var/list/templist2 = blood[j]
temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>" temp += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Type: [templist2[2]], DNA: [templist2[1]]<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
else else
temp = "ERROR. Database not found!<br>" temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database;delete_aux=[href_list["identifier"]]'>{Delete This Record}</a>"
temp += "<br><a href='?src=\ref[src];operation=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>" temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("auxiliaryprint") if("auxiliaryprint")
if(misc) if(misc)
var/obj/item/weapon/paper/P = new(loc) var/obj/item/weapon/paper/P = new(loc)
var/identifier = text2num(href_list["identifier"]) var/list/outputs = misc[href_list["identifier"]]
var/list/outputs = misc[identifier] P.name = "Auxiliary Database File ([outputs[3]])"
var/item_name = get_name(outputs[1])
P.name = "Auxiliary Database File ([item_name])"
P.overlays += "paper_words" P.overlays += "paper_words"
P.info = "<b>Auxiliary Evidence Database</b><br><br>" P.info = "<b>Auxiliary Evidence Database</b><br><br>"
P.info += "<big><b>Consolidated data points:</b> [item_name]</big><br>" P.info += "<big><b>Consolidated data points:</b> [outputs[3]]</big><br>"
var/list/fibers = outputs[2] var/list/fibers = outputs[1]
if(fibers && fibers.len) if(fibers && fibers.len)
P.info += "&nbsp<b>Fibers:</b><br>" P.info += "&nbsp<b>Fibers:</b><br>"
for(var/j = 1, j <= fibers.len, j++) for(var/j = 1, j <= fibers.len, j++)
P.info += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]" P.info += "<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
var/list/blood = outputs[3] var/list/blood = outputs[2]
if(blood && blood.len) if(blood && blood.len)
P.info += "&nbsp<b>Blood:</b><br>" P.info += "&nbsp<b>Blood:</b><br>"
for(var/j = 1, j <= blood.len, j++) for(var/j = 1, j <= blood.len, j++)
@@ -383,9 +358,8 @@ obj/machinery/computer/forensic_scanning
scan_data = "<u>[scanning]</u><br><br>" scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA) if (scanning.blood_DNA)
scan_data += "Blood Found:<br>" scan_data += "Blood Found:<br>"
for(var/i = 1, i <= scanning.blood_DNA.len, i++) for(var/blood in scanning.blood_DNA)
var/list/templist = scanning.blood_DNA[i] scan_data += "Blood type: [scanning.blood_DNA[blood]]\nDNA: [blood]<br><br>"
scan_data += "Blood type: [templist[2]]\nDNA: [templist[1]]<br><br>"
else else
scan_data += "No Blood Found<br><br>" scan_data += "No Blood Found<br><br>"
if(!scanning.fingerprints) if(!scanning.fingerprints)
@@ -448,221 +422,138 @@ obj/machinery/computer/forensic_scanning
temp = "Data Transfer Failed: No Object." temp = "Data Transfer Failed: No Object."
updateUsrDialog() updateUsrDialog()
verb/reset()
set name = "Reset Database"
set category = "Object"
set src in oview(1)
temp = ""
add_fingerprint(usr)
files = list()
misc = list()
for(var/atom/A in contents)
if(A == scanning)
continue
del(A)
return
ex_act() ex_act()
return return
proc/add_data_scanner(var/obj/item/device/detective_scanner/W) proc/add_data_scanner(var/obj/item/device/detective_scanner/W)
if(W.stored) if(W.stored)
for(var/i = 1, i <= W.stored.len, i++) for(var/atom in W.stored)
var/list/data = W.stored[i] var/list/data = W.stored[atom]
add_data(data[1],1,data[2],data[3],data[4]) add_data_master(atom,data[1],data[2],data[3],data[4])
W.stored = list() W.stored = list()
for(var/atom/A in W.contents)
del(A)
return return
proc/add_data(var/atom/scanned_atom)
return add_data_master("\ref [scanned_atom]", scanned_atom.fingerprints,\
scanned_atom.suit_fibers, scanned_atom.blood_DNA, scanned_atom.name)
proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA)
/********************************
*****DO NOT DIRECTLY CALL ME*****
********************************/
proc/add_data_master(var/atom_reference, var/list/atom_fingerprints, var/list/atom_suit_fibers, var/list/atom_blood_DNA, var/atom_name)
//What follows is massive. It cross references all stored data in the scanner with the other stored data, //What follows is massive. It cross references all stored data in the scanner with the other stored data,
//and what is already in the computer. Not sure how bad the lag may/may not be. //and what is already in the computer. Not sure how bad the lag may/may not be.
var
backup_prints if(!atom_fingerprints) //No prints
backup_fibers
backup_DNA
if(override)
backup_prints = A.fingerprints
A.fingerprints = tempfingerprints
backup_fibers = A.suit_fibers
A.suit_fibers = tempsuit_fibers
backup_DNA = A.blood_DNA
A.blood_DNA = tempblood_DNA
if(!A.fingerprints) //No prints
var/merged = 0
if(!misc) if(!misc)
misc = list() misc = list()
if(misc) var/list/data_entry = misc[atom_reference]
for(var/i = 1, i <= misc.len, i++) //Lets see if we can find it. if(data_entry)
var/list/templist = misc[i] var/list/fibers = data_entry[1]
var/atom/check = templist[1] if(!fibers)
var/atom_checker_scan = (A.original_atom ? check.original_atom[1] == A.original_atom[1] : 0) fibers = list()
if(check.original_atom[1] == A || atom_checker_scan) //There it is! if(atom_suit_fibers)
merged = 1 for(var/j = 1, j <= atom_suit_fibers.len, j++) //Fibers~~~
var/list/fibers = templist[2] if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
if(!fibers) fibers += atom_suit_fibers[j]
fibers = list() var/list/blood = data_entry[2]
if(A.suit_fibers) if(!blood)
for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~ blood = list()
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add! if(atom_blood_DNA)
fibers += A.suit_fibers[j] for(var/main_blood in atom_blood_DNA)
var/list/blood = templist[3] if(!blood[main_blood])
if(!blood) blood[main_blood] = atom_blood_DNA[blood]
blood = list() return 1
if(A.blood_DNA) var/list/templist[2]
for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~ templist[1] = atom_suit_fibers
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! templist[2] = atom_blood_DNA
blood += A.blood_DNA[j] templist[3] = atom_name
var/list/sum_list[3] //Pack it back up! misc[atom_reference] = templist //Store it!
sum_list[1] = check return 0
sum_list[2] = fibers //Has prints.
sum_list[3] = blood if(!files)
misc[i] = sum_list //Store it! files = list()
break //We found it, we're done here. for(var/main_print in atom_fingerprints)
if(!merged) //Nope! Guess we have to add it! var/list/data_entry = files[main_print]
var/list/templist[3] if(data_entry)//The print is already in here!
templist[1] = A.get_duplicate(src) var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
templist[2] = A.suit_fibers if(internal_atom)
templist[3] = A.blood_DNA //We must be on a roll! Just update what needs to be updated.
misc.len++ var/list/internal_prints = internal_atom[1]
misc[misc.len] = templist //Store it! for(var/print in atom_fingerprints) //Sorry for the double loop! D:
return !merged var/associated_print = internal_prints[print]
else //Has prints. var/reference_print = atom_fingerprints[print]
var/list/found_prints[A.fingerprints.len] if(associated_print && associated_print != reference_print) //It does not match
for(var/i = 1, i <= found_prints.len, i++) internal_prints[print] = stringmerge(associated_print, reference_print)
found_prints[i] = 0 else if(!associated_print)
if(!files) internal_prints[print] = reference_print
files = list() //If the main print was updated, lets update the master as well.
for(var/i = 1, i <= files.len, i++) //Lets see if we can find the owner of the prints if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
var/list/perp_list = files[i] update_fingerprints(main_print, internal_prints[print])
var/list/perp_prints = params2list(perp_list[1]) //Fibers.
var/perp = perp_prints[num2text(1)] var/list/fibers = internal_atom[2]
var/found2 = 0 if(!fibers)
for(var/m = 1, m <= A.fingerprints.len, m++) //Compare database prints with prints on object. fibers = list()
var/list/test_prints_list = params2list(A.fingerprints[m]) if(atom_suit_fibers)
var/checker = test_prints_list[num2text(1)] for(var/j = 1, j < atom_suit_fibers.len, j++) //Fibers~~~
if(checker == perp) //Found 'em! Merge! if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
found_prints[m] = 1 fibers += atom_suit_fibers[j]
for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database //Blood.
var/list/target = perp_list[n] var/list/blood = internal_atom[3]
var/atom/atom_checker = target[1] if(!blood)
var/atom_checker_scan = (A.original_atom ? atom_checker.original_atom[1] == A.original_atom[1] : 0) blood = list()
if(atom_checker.original_atom[1] == A || atom_checker_scan) //Found the original object! if(atom_blood_DNA)
found2 = 1 for(var/main_blood in atom_blood_DNA)
var/list/prints = target[2] if(!blood[main_blood])
if(!prints) blood[main_blood] = atom_blood_DNA[blood]
prints = list()
if(A.fingerprints)
for(var/j = 1, j <= A.fingerprints.len, j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
var/test_print1 = print_test1[num2text(1)]
var/found = 0
for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
var/test_print2 = print_test2[num2text(1)]
if(test_print2 == test_print1) //It is! Merge!
prints[k] = "1=" + test_print2 + "&2=" + stringmerge(print_test2[num2text(2)],print_test1[num2text(2)])
found = 1
break //We found it, we're done here.
if(!found) //It isn't! Add!
prints += A.fingerprints[j]
var/list/fibers = target[3]
if(!fibers)
fibers = list()
if(A.suit_fibers)
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = target[4]
if(!blood)
blood = list()
if(A.blood_DNA)
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
blood += A.blood_DNA[j]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = atom_checker
sum_list[2] = prints
sum_list[3] = fibers
sum_list[4] = blood
perp_list[n] = sum_list //Store it!
files[i] = perp_list
break //We found it, we're done here.
if(!found2) //Add a new datapoint to this perp!
var/list/sum_list[4]
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
perp_list.len++
perp_list[perp_list.len] = sum_list
files[i] = perp_list
for(var/m = 1, m <= found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
if(found_prints[m] == 0)
var/list/newperp[2]
var/list/sum_list[4]
sum_list[1] = A.get_duplicate(src)
sum_list[2] = A.fingerprints
sum_list[3] = A.suit_fibers
sum_list[4] = A.blood_DNA
newperp[2] = sum_list
newperp[1] = A.fingerprints[m]
if(!files)
files = newperp
else
files.len++
files[files.len] = newperp
update_fingerprints() //Lets update the calculated sum of the stored prints.
if(override)
A.fingerprints = backup_prints
A.suit_fibers = backup_fibers
A.blood_DNA = backup_DNA
return
continue
//It's not in there! We gotta add it.
update_fingerprints(main_print, atom_fingerprints[main_print])
var/list/data_point[4]
data_point[1] = atom_fingerprints
data_point[2] = atom_suit_fibers
data_point[3] = atom_blood_DNA
data_point[4] = atom_name
data_entry[atom_reference] = data_point
continue
//No print at all! New data entry, go!
var/list/data_point[4]
data_point[1] = atom_fingerprints
data_point[2] = atom_suit_fibers
data_point[3] = atom_blood_DNA
data_point[4] = atom_name
var/list/new_file[1]
new_file[1] = atom_fingerprints[main_print]
new_file[atom_reference] = data_point
files[main_print] = new_file
return 1
/********************************
***END DO NOT DIRECTLY CALL ME***
********************************/
proc/update_fingerprints() //I am tired, but this updates the master print from evidence, which is used to determine completion of a print. proc/update_fingerprints(var/ref_print, var/new_print)
for(var/k = 1, k <= files.len, k++) var/list/master = files[ref_print]
var/list/perp_list = files[k] if(master)
var/list/perp_prints = params2list(perp_list[1]) master[1] = stringmerge(master[1],new_print)
var/perp = perp_prints[num2text(1)] else
var/list/found_prints = list() CRASH("Fucking hell. Something went wrong, and it tried to update a null print or something. Tell SkyMarshal")
for(var/i = 2, i <= perp_list.len, i++)
var/list/test_list = perp_list[i]
var/list/test_prints = test_list[2]
for(var/j = 1, j <= test_prints.len, j++)
var/list/test_list_2 = params2list(test_prints[j])
var/test_prints_2 = test_list_2[num2text(1)]
if(test_prints_2 == perp)
found_prints += test_list_2[num2text(2)]
break
for(var/prints in found_prints)
perp_prints[num2text(2)] = stringmerge(perp_prints[num2text(2)],prints)
perp_list[1] = "1=" + perp + "&2=" + perp_prints[num2text(2)]
files[k] = perp_list
return return
proc/process_card() //Same as above, but for fingerprint cards proc/process_card() //Same as above, but for fingerprint cards
if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len) if(card.fingerprints && !(card.amount > 1) && islist(card.fingerprints) && files && files.len)
usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints." usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
var/found = 0 var/found = 0
for(var/k = 1, k <= card.fingerprints.len, k++) for(var/master_print in card.fingerprints)
var/list/test_prints = params2list(card.fingerprints[k]) var/list/data_entry = files[master_print]
var/print = test_prints[num2text(1)] if(data_entry)
for(var/i = 1, i <= files.len, i++) found = 1
var/list/test_list = files[i] data_entry[1] = master_print
var/list/perp_prints = params2list(test_list[1])
var/perp = perp_prints[num2text(1)]
if(perp == print)
test_list[1] = "1=" + print + "&2=" + print
files[i] = test_list
found = 1
break
if(found) if(found)
usr << "The machinery finds can completes a match." usr << "The machinery finds it can complete a match."
else else
usr << "No match found." usr << "No match found."
del(card) del(card)
@@ -674,24 +565,14 @@ obj/machinery/computer/forensic_scanning
return return
return return
proc/delete_record(var/location) //Deletes an entry in the misc database at the given location proc/delete_record(var/atom_ref) //Deletes an entry in the misc database at the given location
if(misc && misc.len) if(misc && misc.len)
for(var/i = location, i < misc.len, i++) misc.Remove(atom_ref)
misc[i] = misc[i+i]
misc.len--
return return
proc/get_name(var/atom/A) //HurrDurr proc/delete_dossier(var/print) //Deletes a Dossier at a given location.
return A.name
proc/delete_dossier(var/location) //Deletes a Dossier at a given location.
if(files && files.len) if(files && files.len)
if(files.len > location) files.Remove(print)
for(var/i = location, i < files.len, i++)
files[i] = files[i + 1]
if(files.len >= location)
files[files.len] = list()
files.len--
return return
detective detective
@@ -784,17 +665,17 @@ turf/Entered(mob/living/carbon/human/M)
turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor) turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor)
for(var/obj/effect/decal/cleanable/blood/tracks/T in src) for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
if(T.dir == d && findtext(T.icon, bloodcolor)) if(T.dir == d && findtext(T.icon_state, bloodcolor))
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1")) if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]." T.desc = "These bloody footprints appear to have been made by [info]."
if(T.blood_DNA) if(!T.blood_DNA)
T.blood_DNA.len++ T.blood_DNA = list()
if(istype(M,/mob/living/carbon/human)) if(istype(M,/mob/living/carbon/human))
T.blood_DNA[T.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) T.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
else if(istype(M,/mob/living/carbon/alien)) else if(istype(M,/mob/living/carbon/alien))
T.blood_DNA[T.blood_DNA.len] = list("UNKNOWN DNA","X*") T.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(M,/mob/living/carbon/monkey)) else if(istype(M,/mob/living/carbon/monkey))
T.blood_DNA[T.blood_DNA.len] = list("Non-human DNA","A+") T.blood_DNA["Non-human DNA"] = "A+"
return return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src) var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'footprints.dmi' this.icon = 'footprints.dmi'
@@ -819,14 +700,13 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodco
else if(bloodcolor == "xeno") else if(bloodcolor == "xeno")
this.desc = "These acidic bloody footprints appear to have been made by [info]." this.desc = "These acidic bloody footprints appear to have been made by [info]."
else if(bloodcolor == "oil") else if(bloodcolor == "oil")
this.name = "oil"
this.desc = "These oil footprints appear to have been made by [info]." this.desc = "These oil footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human)) if(istype(M,/mob/living/carbon/human))
if(this.blood_DNA.len) if(!this.blood_DNA)
this.blood_DNA.len++ this.blood_DNA = list()
this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes,M.dna.b_type) this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
else
this.blood_DNA = list(list(M.dna.unique_enzymes,M.dna.b_type))
proc/get_tracks(mob/M) proc/get_tracks(mob/M)
if(istype(M,/mob/living)) if(istype(M,/mob/living))

View File

@@ -155,13 +155,11 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T //find some blood here
if(!blood_prop) //first blood! if(!blood_prop) //first blood!
blood_prop = new(T) blood_prop = new(T)
blood_prop.blood_DNA = list(list(self.data["blood_DNA"], self.data["blood_type"])) blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
else else
if(!blood_prop.blood_DNA) if(!blood_prop.blood_DNA)
blood_prop.blood_DNA = list(list(self.data["blood_DNA"], self.data["blood_type"])) blood_prop.blood_DNA = list()
else blood_prop.blood_DNA[self.data["blood_DNA"]] = self.data["blood_type"]
blood_prop.blood_DNA.len++
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], self.data["blood_type"])
for(var/datum/disease/D in self.data["viruses"]) for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type var/datum/disease/newVirus = new D.type
@@ -185,13 +183,11 @@ datum
var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T var/obj/effect/decal/cleanable/blood/blood_prop = locate() in T
if(!blood_prop) if(!blood_prop)
blood_prop = new(T) blood_prop = new(T)
blood_prop.blood_DNA = list(list(self.data["blood_DNA"],"A+")) blood_prop.blood_DNA[self.data["blood_DNA"]] = "A+"
else else
if(!blood_prop.blood_DNA) if(!blood_prop.blood_DNA)
blood_prop.blood_DNA = list(list(self.data["blood_DNA"],"A+")) blood_prop.blood_DNA = list()
else blood_prop.blood_DNA[self.data["blood_DNA"]] = "A+"
blood_prop.blood_DNA.len++
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list(self.data["blood_DNA"], "A+")
for(var/datum/disease/D in self.data["viruses"]) for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type var/datum/disease/newVirus = new D.type
@@ -209,13 +205,11 @@ datum
var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T var/obj/effect/decal/cleanable/xenoblood/blood_prop = locate() in T
if(!blood_prop) if(!blood_prop)
blood_prop = new(T) blood_prop = new(T)
blood_prop.blood_DNA = list(list("UNKNOWN DNA","X*")) blood_prop.blood_DNA["UNKNOWN DNA"] = "X*"
else else
if(!blood_prop.blood_DNA) if(!blood_prop.blood_DNA)
blood_prop.blood_DNA = list(list("UNKNOWN DNA","X*")) blood_prop.blood_DNA = list()
else blood_prop.blood_DNA["UNKNOWN DNA"] = "X*"
blood_prop.blood_DNA.len++
blood_prop.blood_DNA[blood_prop.blood_DNA.len] = list("UNKNOWN DNA","X*")
for(var/datum/disease/D in self.data["viruses"]) for(var/datum/disease/D in self.data["viruses"])
var/datum/disease/newVirus = new D.type var/datum/disease/newVirus = new D.type
@@ -3414,4 +3408,4 @@ datum
holder.remove_reagent(src.id, 0.2) holder.remove_reagent(src.id, 0.2)
data++ data++
..() ..()
return return

View File

@@ -175,15 +175,15 @@
iconL.Remove(G.icon_state) iconL.Remove(G.icon_state)
if(nums.len >= 3) if(nums.len >= 3)
var/obj/effect/decal/cleanable/blood/drip/D = pick(nums) var/obj/effect/decal/cleanable/blood/drip/D = pick(nums)
D.blood_DNA.len++ D.blood_DNA[dna.unique_enzymes] = dna.b_type
D.blood_DNA[D.blood_DNA.len] = list(dna.unique_enzymes,dna.b_type)
if(virus2) if(virus2)
D.virus2 = virus2.getcopy() D.virus2 = virus2.getcopy()
return return
var/obj/effect/decal/cleanable/blood/drip/this = new(T) var/obj/effect/decal/cleanable/blood/drip/this = new(T)
this.icon_state = pick(iconL) this.icon_state = pick(iconL)
this.blood_DNA = list(list(dna.unique_enzymes,dna.b_type)) this.blood_DNA = list()
this.blood_DNA[dna.unique_enzymes] = dna.b_type
this.blood_owner = src this.blood_owner = src
if(virus2) if(virus2)

View File

@@ -94,11 +94,9 @@ obj/item/weapon/organ/New(loc, mob/living/carbon/human/H)
if(!istype(H)) if(!istype(H))
return return
if(H.dna) if(H.dna)
if(blood_DNA && blood_DNA.len) if(!blood_DNA)
blood_DNA.len++ blood_DNA = list()
blood_DNA[blood_DNA.len] = list(H.dna.unique_enzymes, H.dna.b_type) blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
else
blood_DNA = list(list(H.dna.unique_enzymes, H.dna.b_type))
var/icon/I = new /icon(icon, icon_state) var/icon/I = new /icon(icon, icon_state)

View File

@@ -603,20 +603,6 @@
if(!istype(D, /obj/machinery/disposal/toilet))//So it does not drain gas from a toilet which does not function on it. if(!istype(D, /obj/machinery/disposal/toilet))//So it does not drain gas from a toilet which does not function on it.
gas = D.air_contents// transfer gas resv. into holder object gas = D.air_contents// transfer gas resv. into holder object
//Check for any living mobs trigger hasmob.
//hasmob effects whether the package goes to cargo or its tagged destination.
for(var/mob/living/M in D)
if(M && M.stat != 2)
hasmob = 1
//Checks 1 contents level deep. This means that players can be sent through disposals...
//...but it should require a second person to open the package. (i.e. person inside a wrapped locker)
for(var/obj/O in D)
if(O.contents)
for(var/mob/living/M in O.contents)
if(M && M.stat != 2)
hasmob = 1
// now everything inside the disposal gets put into the holder // now everything inside the disposal gets put into the holder
// note AM since can contain mobs or objs // note AM since can contain mobs or objs
for(var/atom/movable/AM in D) for(var/atom/movable/AM in D)
@@ -664,7 +650,7 @@
// //
if(!(count--)) if(!(count--))
tomail = 1 //So loops end up in the mail room. tomail = 1 //So loops end up in the mail room.
destinationTag = "Mail Office" destinationTag = null
return return
@@ -1102,6 +1088,31 @@
screen = 0 screen = 0
icon_state_old = null icon_state_old = null
nonsorting
NE
dir = 1
icon_state = "pipe-j1s"
NW
dir = 1
icon_state = "pipe-j2s"
ES
dir = 4
icon_state = "pipe-j1s"
EN
dir = 4
icon_state = "pipe-j2s"
SW
dir = 2
icon_state = "pipe-j1s"
SE
dir = 2
icon_state = "pipe-j2s"
WN
dir = 8
icon_state = "pipe-j1s"
WS
dir = 81
icon_state = "pipe-j2s"
New() New()
..() ..()
@@ -1129,22 +1140,15 @@
if(service) if(service)
return posdir //If it's being worked on, it isn't sorting. return posdir //If it's being worked on, it isn't sorting.
if(sortTag) if(sortTag)
for(var/i, i <= backType.len, i++) if(sortTag in backType)
if(sortTag == src.backType[i]) return negdir
return negdir
else if (!sortTag && mailsort) else if (!sortTag && mailsort)
return sortdir return sortdir
else if (!sortTag && !mailsort) else if (!sortTag && !mailsort)
return posdir return posdir
if(fromdir != sortdir) // probably came from the negdir if(fromdir != sortdir) // probably came from the negdir
if(sortTag in sortType)
var/issort = 0
for(var/i, i <= sortType.len, i++)
if(sortTag == src.sortType[i])
issort = 1
if(issort) //if destination matches filtered type...
return sortdir // exit through sortdirection return sortdir // exit through sortdirection
else else
return posdir return posdir
@@ -1240,6 +1244,68 @@
sortType -= variable sortType -= variable
updateUsrDialog() updateUsrDialog()
//a three-way junction that sorts objects
/obj/structure/disposalpipe/mailjunction
name = "\improper Package Discrimination Unit"
desc = "An underfloor disposal pipe that is racist against packages."
icon_state = "pipe-j1s"
var
posdir = 0
negdir = 0
sortdir = 0
screen = 0
New()
..()
posdir = dir
if(icon_state == "pipe-j1s")
sortdir = turn(posdir, -90)
negdir = turn(posdir, 180)
else
icon_state = "pipe-j2s"
sortdir = turn(posdir, 90)
negdir = turn(posdir, 180)
dpdir = sortdir | posdir | negdir
update()
return
// next direction to move
// if coming in from negdir, then next is primary dir or sortdir
// if coming in from posdir, then flip around and go back to posdir
// if coming in from sortdir, go to posdir
nextdir(var/package)
//var/flipdir = turn(fromdir, 180)
if(package)
return sortdir
else
return posdir // so go with the flow to positive direction
transfer(var/obj/structure/disposalholder/H)
var/package = locate(/obj/structure/bigDelivery) in H
if(!package)
package = locate(/obj/item/smallDelivery) in H
var/nextdir = nextdir(package)
H.dir = nextdir
var/turf/T = H.nextloc()
var/obj/structure/disposalpipe/P = H.findpipe(T)
if(P)
// find other holder in next loc, if inactive merge it with current
var/obj/structure/disposalholder/H2 = locate() in P
if(H2 && !H2.active)
H.merge(H2)
H.loc = P
else // if wasn't a pipe, then set loc to turf
H.loc = T
return null
return P
//a trunk joining to a disposal bin or outlet on the same turf //a trunk joining to a disposal bin or outlet on the same turf
/obj/structure/disposalpipe/trunk /obj/structure/disposalpipe/trunk
icon_state = "pipe-t" icon_state = "pipe-t"

View File

@@ -248,10 +248,9 @@
desc = "Used to set the destination of properly wrapped packages." desc = "Used to set the destination of properly wrapped packages."
icon_state = "forensic0" icon_state = "forensic0"
var/currTag = null var/currTag = null
var/list/spaceList = list(0,1,0,0,1,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0) // Breaks up departments with whitespace. var/list/spaceList = list(0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0) // Breaks up departments with whitespace.
var/list/locationList = list("Disposals", var/list/locationList = list("Disposals",
"Mail Office", "Cargo Bay", "QM Office", "Mail Office", "Cargo Bay", "QM Office","Mining Bay",
"Mining Base", "Mining West", "Mining North",
"Locker Room", "Tool Storage", "Laundry Room", "Toilets", "Locker Room", "Tool Storage", "Laundry Room", "Toilets",
"Security", "Courtroom", "Detective's Office", "Law Office", "Security", "Courtroom", "Detective's Office", "Law Office",
"Research Division", "Research Director", "Genetics", "Research Division", "Research Director", "Genetics",

File diff suppressed because it is too large Load Diff