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 else
var/test_print = stars(L[num2text(2)], rand(80,90)) fingerprints[full_print] = stringmerge(print, stars(full_print, (H.gloves ? rand(10,20) : rand(25,40))))
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
if(!fingerprints || !fingerprints.len)
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.
O.blood_DNA.len++ blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
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.
H.blood_DNA.len++ blood_DNA[H.dna.unique_enzymes] = H.dna.b_type
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"]
var/new_print = stars(test_print, rand(1,20))
if(stringpercent(new_print) == 32)
if(src.fingerprints.len == 1)
src.fingerprints = list()
else else
for(var/j = (i + 1), j < (src.fingerprints.len), j++) fingerprints[P] = test_print
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
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] = test_print2 + "&" + 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 = temp[3]
if(!fibers) if(!fibers)
fibers = list() fibers = list()
if(A.suit_fibers && A.suit_fibers.len) if(A.suit_fibers && A.suit_fibers.len)
for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~ for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add! if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j] fibers += A.suit_fibers[j]
var/list/blood = temp[4] var/list/blood = data_entry[3]
if(!blood) if(!blood)
blood = list() blood = list()
if(A.blood_DNA && A.blood_DNA.len) if(A.blood_DNA && A.blood_DNA.len)
for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~ for(var/main_blood in A.blood_DNA)
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! if(!blood[main_blood])
blood += A.blood_DNA[j] blood[main_blood] = A.blood_DNA[blood]
return 1
var/list/sum_list[4] //Pack it back up! var/list/sum_list[4] //Pack it back up!
sum_list[1] = checker sum_list[1] = A.fingerprints
sum_list[2] = prints sum_list[2] = A.suit_fibers
sum_list[3] = fibers sum_list[3] = A.blood_DNA
sum_list[4] = blood sum_list[4] = "\The [A] in [get_area(A)]"
stored[i] = sum_list //Store it! stored["\ref [A]"] = sum_list
break //We found it, we're done here. return 0
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>"
else
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=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=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
else
temp = "ERROR. Database not found!<br>"
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>"
else
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=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=auxiliaryprint;identifier=[href_list["identifier"]]'>{Print}</a>"
else
temp = "ERROR. Database not found!<br>"
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]
var/atom_checker_scan = (A.original_atom ? check.original_atom[1] == A.original_atom[1] : 0)
if(check.original_atom[1] == A || atom_checker_scan) //There it is!
merged = 1
var/list/fibers = templist[2]
if(!fibers) if(!fibers)
fibers = list() fibers = list()
if(A.suit_fibers) if(atom_suit_fibers)
for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~ for(var/j = 1, j <= atom_suit_fibers.len, j++) //Fibers~~~
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add! if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j] fibers += atom_suit_fibers[j]
var/list/blood = templist[3] var/list/blood = data_entry[2]
if(!blood) if(!blood)
blood = list() blood = list()
if(A.blood_DNA) if(atom_blood_DNA)
for(var/j = 1, j <= A.blood_DNA.len, j++) //Blood~~~ for(var/main_blood in atom_blood_DNA)
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! if(!blood[main_blood])
blood += A.blood_DNA[j] blood[main_blood] = atom_blood_DNA[blood]
var/list/sum_list[3] //Pack it back up! return 1
sum_list[1] = check var/list/templist[2]
sum_list[2] = fibers templist[1] = atom_suit_fibers
sum_list[3] = blood templist[2] = atom_blood_DNA
misc[i] = sum_list //Store it! templist[3] = atom_name
break //We found it, we're done here. misc[atom_reference] = templist //Store it!
if(!merged) //Nope! Guess we have to add it! return 0
var/list/templist[3] //Has prints.
templist[1] = A.get_duplicate(src)
templist[2] = A.suit_fibers
templist[3] = A.blood_DNA
misc.len++
misc[misc.len] = templist //Store it!
return !merged
else //Has prints.
var/list/found_prints[A.fingerprints.len]
for(var/i = 1, i <= found_prints.len, i++)
found_prints[i] = 0
if(!files) if(!files)
files = list() files = list()
for(var/i = 1, i <= files.len, i++) //Lets see if we can find the owner of the prints for(var/main_print in atom_fingerprints)
var/list/perp_list = files[i] var/list/data_entry = files[main_print]
var/list/perp_prints = params2list(perp_list[1]) if(data_entry)//The print is already in here!
var/perp = perp_prints[num2text(1)] var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
var/found2 = 0 if(internal_atom)
for(var/m = 1, m <= A.fingerprints.len, m++) //Compare database prints with prints on object. //We must be on a roll! Just update what needs to be updated.
var/list/test_prints_list = params2list(A.fingerprints[m]) var/list/internal_prints = internal_atom[1]
var/checker = test_prints_list[num2text(1)] for(var/print in atom_fingerprints) //Sorry for the double loop! D:
if(checker == perp) //Found 'em! Merge! var/associated_print = internal_prints[print]
found_prints[m] = 1 var/reference_print = atom_fingerprints[print]
for(var/n = 2, n <= perp_list.len, n++) //Lets see if it is already in the database if(associated_print && associated_print != reference_print) //It does not match
var/list/target = perp_list[n] internal_prints[print] = stringmerge(associated_print, reference_print)
var/atom/atom_checker = target[1] else if(!associated_print)
var/atom_checker_scan = (A.original_atom ? atom_checker.original_atom[1] == A.original_atom[1] : 0) internal_prints[print] = reference_print
if(atom_checker.original_atom[1] == A || atom_checker_scan) //Found the original object! //If the main print was updated, lets update the master as well.
found2 = 1 if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
var/list/prints = target[2] update_fingerprints(main_print, internal_prints[print])
if(!prints) //Fibers.
prints = list() var/list/fibers = internal_atom[2]
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) if(!fibers)
fibers = list() fibers = list()
if(A.suit_fibers) if(atom_suit_fibers)
for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~ for(var/j = 1, j < atom_suit_fibers.len, j++) //Fibers~~~
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add! if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j] fibers += atom_suit_fibers[j]
var/list/blood = target[4] //Blood.
var/list/blood = internal_atom[3]
if(!blood) if(!blood)
blood = list() blood = list()
if(A.blood_DNA) if(atom_blood_DNA)
for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~ for(var/main_blood in atom_blood_DNA)
if(!blood.Find(A.blood_DNA[j])) //It isn't! Add! if(!blood[main_blood])
blood += A.blood_DNA[j] blood[main_blood] = atom_blood_DNA[blood]
var/list/sum_list[4] //Pack it back up!
sum_list[1] = atom_checker continue
sum_list[2] = prints //It's not in there! We gotta add it.
sum_list[3] = fibers update_fingerprints(main_print, atom_fingerprints[main_print])
sum_list[4] = blood var/list/data_point[4]
perp_list[n] = sum_list //Store it! data_point[1] = atom_fingerprints
files[i] = perp_list data_point[2] = atom_suit_fibers
break //We found it, we're done here. data_point[3] = atom_blood_DNA
if(!found2) //Add a new datapoint to this perp! data_point[4] = atom_name
var/list/sum_list[4] data_entry[atom_reference] = data_point
sum_list[1] = A.get_duplicate(src) continue
sum_list[2] = A.fingerprints //No print at all! New data entry, go!
sum_list[3] = A.suit_fibers var/list/data_point[4]
sum_list[4] = A.blood_DNA data_point[1] = atom_fingerprints
perp_list.len++ data_point[2] = atom_suit_fibers
perp_list[perp_list.len] = sum_list data_point[3] = atom_blood_DNA
files[i] = perp_list data_point[4] = atom_name
for(var/m = 1, m <= found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint! var/list/new_file[1]
if(found_prints[m] == 0) new_file[1] = atom_fingerprints[main_print]
var/list/newperp[2] new_file[atom_reference] = data_point
var/list/sum_list[4] files[main_print] = new_file
sum_list[1] = A.get_duplicate(src) return 1
sum_list[2] = A.fingerprints /********************************
sum_list[3] = A.suit_fibers ***END DO NOT DIRECTLY CALL ME***
sum_list[4] = A.blood_DNA ********************************/
newperp[2] = sum_list
newperp[1] = A.fingerprints[m] proc/update_fingerprints(var/ref_print, var/new_print)
if(!files) var/list/master = files[ref_print]
files = newperp if(master)
master[1] = stringmerge(master[1],new_print)
else else
files.len++ CRASH("Fucking hell. Something went wrong, and it tried to update a null print or something. Tell SkyMarshal")
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
proc/update_fingerprints() //I am tired, but this updates the master print from evidence, which is used to determine completion of a print.
for(var/k = 1, k <= files.len, k++)
var/list/perp_list = files[k]
var/list/perp_prints = params2list(perp_list[1])
var/perp = perp_prints[num2text(1)]
var/list/found_prints = list()
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++)
var/list/test_list = files[i]
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 found = 1
break data_entry[1] = master_print
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

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,8 +1140,7 @@
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
@@ -1138,13 +1148,7 @@
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