diff --git a/code/WorkInProgress/detective_work.dm b/code/WorkInProgress/detective_work.dm
index 154cfdb3fb..a8c0b8dbea 100644
--- a/code/WorkInProgress/detective_work.dm
+++ b/code/WorkInProgress/detective_work.dm
@@ -49,6 +49,8 @@ atom/proc/add_fibers(mob/living/carbon/human/M)
suit_fibers += "Material from a pair of [M.gloves.name]."
if(!suit_fibers.len) del suit_fibers
+#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)
obj/machinery/computer/forensic_scanning
name = "High-Res Forensic Scanning Computer"
@@ -67,9 +69,9 @@ obj/machinery/computer/forensic_scanning
// 3: All fibers on the object
// 4: All blood on the object
//This is then used to show what objects were used to "find" the full print, as well as the fibers on it.
- list/files = list()
+ list/files
//This holds objects (1) without prints, and their fibers(2) and blood(3).
- list/misc = list()
+ list/misc
obj/item/weapon/f_card/card
scan_data = ""
@@ -102,15 +104,16 @@ obj/machinery/computer/forensic_scanning
if(scanning)
if(scan_process)
dat += "Scan Object: {[scanning.name]}
"
- dat += "{Cancel Scan} {Print}
"
+ dat += "{Cancel Scan} {Print}
"
else
if(isai) dat += "Scan Object: {[scanning.name]}
"
else dat += "Scan Object: {[scanning.name]}
"
- dat += "{Scan} {Print}
"
+ dat += "{Scan} {Print}
"
else
if(isai) dat += "{No Object Inserted}
"
else dat += "{No Object Inserted}
"
- dat += "{Scan} {Print}
"
+ dat += "{Scan} {Print}
"
+ dat += "{Access Database}
"
dat += "[scan_data]"
if(scan_data && !scan_process)
dat += "
{Erase Data}"
@@ -122,59 +125,56 @@ obj/machinery/computer/forensic_scanning
return
- proc/add_data_scanner(var/obj/item/device/detective_scanner/W as obj)
- for(var/i = 1, i < W.stored.len, i++)
+ proc/add_data_scanner(var/obj/item/device/detective_scanner/W)
+ for(var/i = 1, i < (W.stored.len + 1), i++)
var/list/data = W.stored[i]
- var/atom/A = new
- A = W
- world << "[A] at [A.loc]"
- A.fingerprints = data[2]
- A.suit_fibers = data[3]
- A.blood_DNA = data[4]
- add_data(A,1)
- del(A)
+ add_data(data[1],1,data[2],data[3],data[4])
- proc/add_data(var/atom/A, var/override = 0)
+ proc/add_data(var/atom/A, var/override = 0, var/tempfingerprints, var/tempsuit_fibers,var/tempblood_DNA)
//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.
- if((!A.fingerprints || A.fingerprints.len < 1) && !override) //No prints
+ var
+ backup_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 || !length(A.fingerprints))) //No prints
var/merged = 0
- for(var/i = 1, i < misc.len, i++) //Lets see if we can find it.
- var/list/templist = misc[i]
- var/check = templist[1]
- if(check == A) //There it is!
- merged = 1
- var/list/fibers = templist[2]
- if(A.suit_fibers)
- for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
- var/test_print1 = A.suit_fibers[j]
- var/found = 0
- for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
- var/test_print2 = fibers[k]
- if(test_print2 == test_print1) //It is! Do nothing!
- found = 1
- break
- if(!found) //It isn't! Add!
- fibers += A.suit_fibers[j]
- var/list/blood = templist[3]
- if(A.blood_DNA)
- for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
- var/test_print1 = A.blood_DNA[j]
- var/found = 0
- for(var/k = 1, k <= blood.len, k++) //Lets see if the fiber is already in there
- var/test_print2 = blood[k]
- if(test_print2 == test_print1) //It is! Do nothing!
- found = 1
- break
- if(!found) //It isn't! Add!
- blood += A.blood_DNA[j]
- var/list/sum_list[3] //Pack it back up!
- sum_list[1] = A
- sum_list[2] = fibers
- sum_list[3] = blood
- misc[i] = sum_list //Store it!
- break //We found it, we're done here.
+ if(!misc)
+ misc = list()
+ if(misc)
+ for(var/i = 1, i < (misc.len + 1), i++) //Lets see if we can find it.
+ var/list/templist = misc[i]
+ var/check = templist[1]
+ if(check == A) //There it is!
+ merged = 1
+ var/list/fibers = templist[2]
+ if(!fibers)
+ fibers = list()
+ if(A.suit_fibers)
+ for(var/j = 1, j < (A.suit_fibers.len + 1), j++) //Fibers~~~
+ if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
+ fibers += A.suit_fibers[j]
+ var/list/blood = templist[3]
+ if(!blood)
+ blood = list()
+ if(A.blood_DNA)
+ for(var/j = 1, j < (A.blood_DNA.len + 1), j++) //Blood~~~
+ if(!blood.Find(A.blood_DNA[j])) //It isn't! Add!
+ blood += A.blood_DNA[j]
+ var/list/sum_list[3] //Pack it back up!
+ sum_list[1] = A
+ sum_list[2] = fibers
+ sum_list[3] = blood
+ misc[i] = sum_list //Store it!
+ break //We found it, we're done here.
if(!merged) //Nope! Guess we have to add it!
var/list/templist[4]
templist[1] = A
@@ -184,30 +184,34 @@ obj/machinery/computer/forensic_scanning
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++)
+ var/list/found_prints[A.fingerprints.len + 1]
+ for(var/i = 1, i < (found_prints.len + 1), i++)
found_prints[i] = 0
- for(var/i = 1, i < files.len, i++) //Lets see if we can find the owner of the prints
- var/merged = 0
+ if(!files)
+ files = list()
+ for(var/i = 1, i < (files.len + 1), i++) //Lets see if we can find the owner of the prints
var/list/perp_list = files[i]
var/list/perp_prints = params2list(perp_list[1])
var/perp = perp_prints[1]
- for(var/m = 1, m < A.fingerprints.len, m++) //Compare database prints with prints on object.
+ var/found2 = 0
+ for(var/m = 1, m < (A.fingerprints.len + 1), m++) //Compare database prints with prints on object.
var/list/test_prints_list = params2list(A.fingerprints[m])
var/checker = test_prints_list[1]
if(checker == perp) //Found 'em! Merge!
found_prints[m] = 1
- for(var/n = 2, n < perp_list.len, n++) //Lets see if it is already in the database
+ for(var/n = 2, n < (perp_list.len + 1), n++) //Lets see if it is already in the database
var/list/target = perp_list[n]
if(target[1] == A) //Found the original object!
- merged = 1
+ found2 = 1
var/list/prints = target[2]
+ if(!prints)
+ prints = list()
if(A.fingerprints)
- for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
+ for(var/j = 1, j < (A.fingerprints.len + 1), j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
var/test_print1 = print_test1[1]
var/found = 0
- for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
+ for(var/k = 1, k <= (prints.len + 1), k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
var/test_print2 = print_test2[1]
if(test_print2 == test_print1) //It is! Merge!
@@ -217,28 +221,18 @@ obj/machinery/computer/forensic_scanning
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~~~
- var/test_print1 = A.suit_fibers[j]
- var/found = 0
- for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
- var/test_print2 = fibers[k]
- if(test_print2 == test_print1) //It is! Do nothing!
- found = 1
- break //We found it, we're done here.
- if(!found) //It isn't! Add!
+ 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~~~
- var/test_print1 = A.blood_DNA[j]
- var/found = 0
- for(var/k = 1, k <= blood.len, k++) //Lets see if the blood is already in there
- var/test_print2 = blood[k]
- if(test_print2 == test_print1) //It is! Do nothing!
- found = 1
- break //We found it, we're done here.
- if(!found) //It isn't! Add!
+ 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] = A
@@ -248,65 +242,78 @@ obj/machinery/computer/forensic_scanning
perp_list[n] = sum_list //Store it!
files[i] = perp_list
break //We found it, we're done here.
- if(merged)
- update_fingerprints(i) //Lets update the calculated sum of the stored prints.
- for(var/m = 1, m < found_prints.len, m++) //Uh Oh! A print wasn't used! New datapoint!
- if(found_prints.len[m] == 0)
- var/list/newperp[2]
- var/list/sum_list
- sum_list[1] = A
- 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(!found2) //Add a new datapoint to this perp!
+ var/list/sum_list[4]
+ sum_list[1] = A
+ 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
+ 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
- proc/update_fingerprints(var/index) //I am tired, but this updates the master print, which is used to determine completion of a print.
- if(!index)
- return
- var/list/perp_list = files[1]
- var/list/perp_prints = params2list(perp_list[1])
- var/perp = perp_prints[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)
- var/list/test_list_2 = params2list(test_prints[j])
- var/test_prints_2 = test_list_2[1]
- if(test_prints_2 == perp)
- found_prints += test_list_2[2]
- break
- for(var/prints in found_prints)
- perp_prints[2] = stringmerge(perp_prints[2],prints)
- perp_list[1] = perp + "&" + perp_prints[2]
- files[1] = perp_list
+ proc/update_fingerprints() //I am tired, but this updates the master print, which is used to determine completion of a print.
+ for(var/k = 1, k < (files.len + 1), k++)
+ var/list/perp_list = files[k]
+ var/list/perp_prints = params2list(perp_list[1])
+ var/perp = perp_prints[1]
+ var/list/found_prints = list()
+ for(var/i = 2, i < (perp_list.len + 1), i++)
+ var/list/test_list = perp_list[i]
+ var/list/test_prints = test_list[2]
+ for(var/j = 1, j < (test_prints.len + 1), j++)
+ var/list/test_list_2 = params2list(test_prints[j])
+ var/test_prints_2 = test_list_2[1]
+ if(test_prints_2 == perp)
+ found_prints += test_list_2[2]
+ break
+ for(var/prints in found_prints)
+ perp_prints[2] = stringmerge(perp_prints[2],prints)
+ perp_list[1] = perp + "&" + perp_prints[2]
+ files[k] = perp_list
return
-// attackby(var/obj/item/device/detective_scanner/W as obj, mob/user as mob)
-// ..()
-// if (istype(W, /obj/item/device/detective_scanner))
-//
-//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.
-//
-// var/list/data = W.stored
-// if(files.len || misc.len)
-//
-//
-//
-// else
-//
-//
-// src.add_fingerprint(user)
-// if (W)
-// W.add_fingerprint(user)
-// return
+ proc/process_card() //I am tired, but this updates the master print from a fingerprint card
+ //which is used to determine completion of a print.
+ if(card.fingerprints)
+ for(var/k = 1, k < (card.fingerprints.len + 1), k++)
+ var/list/test_prints = params2list(card.fingerprints[k])
+ var/print = test_prints[1]
+ for(var/i = 1, i < (files.len + 1), i++)
+ var/list/test_list = files[i]
+ var/list/perp_prints = params2list(test_list[1])
+ var/perp = perp_prints[1]
+ if(perp == print)
+ test_list[1] = print + "&" + print
+ files[i] = test_list
+ break
+ del(card)
+ return
+ proc/get_name(var/atom/A)
+ return A.name
Topic(href,href_list)
switch(href_list["operation"])
@@ -349,6 +356,141 @@ obj/machinery/computer/forensic_scanning
I.loc = src
else
temp = "Invalid Object Rejected."
+ if("card")
+ var/mob/M = usr
+ var/obj/item/I = M.equipped()
+ if(I && istype(I,/obj/item/weapon/f_card))
+ card = I
+ M.drop_item()
+ I.loc = src
+ process_card()
+ usr << "You insert the card, and it is destroyed by the machinery in the process of comparing prints."
+ else
+ usr << "\red Invalid Object Rejected."
+ if("database")
+ canclear = 1
+ if(!misc && !files)
+ temp = "Database is empty."
+ else
+ if(files)
+ temp = "Criminal Evidence Database
"
+ temp += "Consolidated data points:
"
+ for(var/i = 1, i < (files.len + 1), i++)
+ temp += "{Dossier [i]}
"
+ temp += "
{Insert Finger Print Card}
"
+ else
+ temp = ""
+ if(misc)
+ temp += "Auxiliary Evidence Database
"
+ temp += "This is where anything without fingerprints goes.
"
+ for(var/i = 1, i < (misc.len + 1), i++)
+ var/list/temp_list = misc[i]
+ var/item_name = get_name(temp_list[1])
+ temp += "{[item_name]}
"
+ if("record")
+ canclear = 0
+ if(files)
+ temp = "Criminal Evidence Database
"
+ temp += "Consolidated data points: Dossier [href_list["identifier"]]
"
+ var/identifier = text2num(href_list["identifier"])
+ var/list/dossier = files[identifier]
+ var/list/prints = params2list(dossier[1])
+ var/print_string = "Fingerprints: Print not complete!
"
+ if(stringpercent(prints[2]) <= FINGERPRINT_COMPLETE)
+ print_string = "Fingerprints: (80% or higher completion reached)
" + prints[2] + "
"
+ temp += print_string
+ for(var/i = 2, i < (dossier.len + 1), i++)
+ var/list/outputs = dossier[i]
+ var/item_name = get_name(outputs[1])
+ var/list/prints_len = outputs[2]
+ temp += "Object: [item_name]
"
+ temp += " [prints_len.len] Unique fingerprints found.
"
+ var/list/fibers = outputs[3]
+ if(fibers)
+ var/dat = "[fibers[1]]"
+ for(var/j = 2, j < (fibers.len + 1), j++)
+ dat += ",
[fibers[j]]"
+ temp += " Fibers: [dat]
"
+ else
+ temp += " No fibers found.
"
+ var/list/blood = outputs[4]
+ if(blood)
+ var/dat = "[blood[1]]"
+ if(blood.len > 1)
+ for(var/j = 2, j < (blood.len + 1), j++)
+ dat += ",
[blood[j]]"
+ temp += " Blood: [dat]
"
+ else
+ temp += " No blood found.
"
+ else
+ temp = "ERROR. Database not found!
"
+ temp += "
{Print}"
+ temp += "
{Return}"
+ if("databaseprint")
+ if(files)
+ var/obj/item/weapon/paper/P = new(loc)
+ P.name = "Database File (Dossier [href_list["identifier"]])"
+ P.overlays += "paper_words"
+ P.info = "Criminal Evidence Database
"
+ P.info += "Consolidated data points: Dossier [href_list["identifier"]]
"
+ var/list/dossier = files[text2num(href_list["identifier"])]
+ var/list/prints = params2list(dossier[1])
+ var/print_string = "Fingerprints: Print not complete!
"
+ if(stringpercent(prints[2]) <= FINGERPRINT_COMPLETE)
+ print_string = "Fingerprints: " + prints[2] + "
"
+ P.info += print_string
+ for(var/i = 2, i < (dossier.len + 1), i++)
+ var/list/outputs = dossier[i]
+ var/item_name = get_name(outputs[1])
+ var/list/prints_len = outputs[2]
+ P.info += "Object: [item_name]
"
+ P.info += " [prints_len.len] Unique fingerprints found.
"
+ var/list/fibers = outputs[3]
+ if(fibers)
+ var/dat = "[fibers[1]]"
+ for(var/j = 2, j < (fibers.len + 1), j++)
+ dat += ",
[fibers[j]]"
+ P.info += " Fibers: [dat]
"
+ else
+ P.info += " No fibers found.
"
+ var/list/blood = outputs[4]
+ if(blood)
+ var/dat = "[blood[1]]"
+ if(blood.len > 1)
+ for(var/j = 2, j < (blood.len + 1), j++)
+ dat += ",
[blood[j]]"
+ P.info += " Blood: [dat]
"
+ else
+ P.info += " No blood found."
+ else
+ usr << "ERROR. Database not found!
"
+ if("auxiliary")
+ canclear = 0
+ if(misc)
+ temp = "Auxiliary Evidence Database
"
+ var/identifier = text2num(href_list["identifier"])
+ var/list/outputs = misc[identifier]
+ var/item_name = get_name(outputs[1])
+ temp += "Consolidated data points: [item_name]
"
+ var/list/fibers = outputs[2]
+ if(fibers)
+ var/dat = "[fibers[1]]"
+ for(var/j = 2, j < (fibers.len + 1), j++)
+ dat += ",
[fibers[j]]"
+ temp += " Fibers: [dat]
"
+ else
+ temp += " No fibers found."
+ var/list/blood = outputs[3]
+ if(blood)
+ var/dat = "[blood[1]]"
+ for(var/j = 2, j < (blood.len + 1), j++)
+ dat += ",
[blood[j]]"
+ temp += " Blood: [dat]
"
+ else
+ temp += " No blood found.
"
+ else
+ temp = "ERROR. Database not found!
"
+ temp += "
{Return}"
if("scan")
if(scanning)
scan_process = 3
@@ -380,19 +522,19 @@ obj/machinery/computer/forensic_scanning
scan_data = "[scanning]
"
if (scanning.blood_DNA)
scan_data += "Blood Found:
"
- for(var/i = 1, i < scanning.blood_DNA.len, i++)
+ for(var/i = 1, i < (scanning.blood_DNA.len + 1), i++)
var/list/templist = scanning.blood_DNA[i]
scan_data += "-Blood type: [templist[2]]\nDNA: [templist[1]]
"
else
scan_data += "No Blood Found
"
- if (!( scanning.fingerprints.len ))
+ if (!length(scanning.fingerprints))
scan_data += "No Fingerprints Found
"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.
"
add_data(scanning)
- if(!scanning.suit_fibers.len)
+ if(!scanning.suit_fibers)
/*if(istype(scanning,/obj/item/device/detective_scanner))
var/obj/item/device/detective_scanner/scanner = scanning
if(scanner.stored_name)
@@ -418,7 +560,8 @@ obj/machinery/computer/forensic_scanning
scan_data += "- [data]
"
if(istype(scanning,/obj/item/device/detective_scanner))
scan_data += "
Data transfered from Scanner to Database.
"
- else if(!scanning.fingerprints.len)
+ add_data_scanner(scanning)
+ else if(!length(scanning.fingerprints))
scan_data += "
Add to Database?
"
else
temp = "Scan Failed: No Object"
@@ -538,8 +681,8 @@ proc/get_tracks(mob/M)
proc/blood_incompatible(donor,receiver)
var
- donor_antigen = copytext(donor,1,2)
- receiver_antigen = copytext(receiver,1,2)
+ donor_antigen = copytext(donor,1,lentext(donor))
+ receiver_antigen = copytext(receiver,1,lentext(receiver))
donor_rh = findtext("+",donor)
receiver_rh = findtext("+",receiver)
if(donor_rh && !receiver_rh) return 1
diff --git a/code/WorkInProgress/meteors.dm b/code/WorkInProgress/meteors.dm
new file mode 100644
index 0000000000..35c370fb0b
--- /dev/null
+++ b/code/WorkInProgress/meteors.dm
@@ -0,0 +1,154 @@
+#define METEOR_TEMPERATURE
+
+/var/const/meteor_wave_delay = 625 //minimum wait between waves in tenths of seconds
+//set to at least 100 unless you want evarr ruining every round
+
+/var/const/meteors_in_wave = 20
+/var/const/meteors_in_small_wave = 10
+
+/proc/meteor_wave(var/number = meteors_in_wave)
+ if(!ticker || wavesecret)
+ return
+
+ var/startx
+ var/starty
+ var/endx
+ var/endy
+ var/turf/pickedstart
+ var/turf/pickedgoal
+ switch(pick(1,2,3,4))
+ if(1) //NORTH
+ starty = world.maxy-3
+ startx = rand(1, world.maxx-1)
+ endy = 1
+ endx = rand(1, world.maxx-1)
+ if(2) //EAST
+ starty = rand(1,world.maxy-1)
+ startx = world.maxx-3
+ endy = rand(1, world.maxy-1)
+ endx = 1
+ if(3) //SOUTH
+ starty = 3
+ startx = rand(1, world.maxx-1)
+ endy = world.maxy-1
+ endx = rand(1, world.maxx-1)
+ if(4) //WEST
+ starty = rand(1, world.maxy-1)
+ startx = 3
+ endy = rand(1,world.maxy-1)
+ endx = world.maxx-1
+ pickedstart = locate(startx, starty, 1)
+ pickedgoal = locate(endx, endy, 1)
+ wavesecret = 1
+ for(var/i = 0 to number)
+ spawn(rand(10,100))
+ spawn_meteor(pickedstart, pickedgoal)
+ spawn(meteor_wave_delay)
+ wavesecret = 0
+
+/proc/spawn_meteors(var/turf/pickedstart, var/turf/pickedgoal, var/number = meteors_in_small_wave)
+ for(var/i = 0; i < number; i++)
+ spawn(0)
+ spawn_meteor(pickedstart, pickedgoal)
+
+/proc/spawn_meteor(var/turf/pickedstart, var/turf/pickedgoal)
+
+ var/route = rand(1,5)
+ var/turf/tempgoal = pickedgoal
+ for(var/i, i < route, i++)
+ tempgoal = get_step(tempgoal,rand(1,8))
+
+ var/obj/effect/meteor/M
+ switch(rand(1, 100))
+ if(1 to 15)
+ M = new /obj/effect/meteor/big(pickedstart)
+ if(16 to 75)
+ M = new /obj/effect/meteor( pickedstart )
+ if(76 to 100)
+ M = new /obj/effect/meteor/small( pickedstart )
+
+ M.dest = tempgoal
+
+ do
+ sleep(1)
+ walk_towards(M, M.dest, 1)
+ while (!istype(M.loc, /turf/space) || pickedstart.loc.name != "Space" ) //FUUUCK, should never happen.
+
+ return
+
+/obj/effect/meteor
+ name = "meteor"
+ icon = 'meteor.dmi'
+ icon_state = "flaming"
+ density = 1
+ anchored = 1.0
+ var/hits = 1
+ var/dest
+ pass_flags = PASSTABLE
+
+/obj/effect/meteor/small
+ name = "small meteor"
+ icon_state = "smallf"
+ pass_flags = PASSTABLE | PASSGRILLE
+
+/obj/effect/meteor/Move()
+ var/turf/T = src.loc
+ if (istype(T, /turf))
+ T.hotspot_expose(METEOR_TEMPERATURE, 1000)
+ ..()
+ return
+
+/obj/effect/meteor/Bump(atom/A)
+ spawn(0)
+ for(var/mob/M in range(10, src))
+ if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view
+ shake_camera(M, 3, 1)
+ if (A)
+ A.meteorhit(src)
+ playsound(src.loc, 'meteorimpact.ogg', 40, 1)
+ if (--src.hits <= 0)
+ if(prob(15))// && !istype(A, /obj/structure/grille))
+ explosion(src.loc, 4, 5, 6, 7, 0)
+ playsound(src.loc, "explosion", 50, 1)
+ del(src)
+ return
+
+
+/obj/effect/meteor/ex_act(severity)
+
+ if (severity < 4)
+ del(src)
+ return
+
+/obj/effect/meteor/big
+ name = "big meteor"
+ hits = 5
+
+ ex_act(severity)
+ return
+
+ Bump(atom/A)
+ spawn(0)
+ for(var/mob/M in range(10, src))
+ if(!M.stat && !istype(M, /mob/living/silicon/ai)) //bad idea to shake an ai's view
+ shake_camera(M, 3, 1)
+ if (A)
+ if(isobj(A))
+ del(A)
+ else
+ A.meteorhit(src)
+ src.hits--
+ return
+ playsound(src.loc, 'meteorimpact.ogg', 40, 1)
+ if (--src.hits <= 0)
+ if(prob(15) && !istype(A, /obj/structure/grille))
+ explosion(src.loc, 1, 2, 3, 4, 0)
+ playsound(src.loc, "explosion", 50, 1)
+ del(src)
+ return
+
+/obj/effect/meteor/attackby(obj/item/weapon/W as obj, mob/user as mob)
+ if(istype(W, /obj/item/weapon/pickaxe))
+ del(src)
+ return
+ ..()
\ No newline at end of file
diff --git a/code/defines/atom.dm b/code/defines/atom.dm
index df67c32085..5db2913830 100644
--- a/code/defines/atom.dm
+++ b/code/defines/atom.dm
@@ -2,7 +2,7 @@
layer = 2
var/level = 2
var/flags = FPRINT
- var/list/fingerprints
+ var/list/fingerprints = list()
var/list/fingerprintshidden = new/list()
var/fingerprintslast = null
var/list/blood_DNA = null
diff --git a/code/game/atom_procs.dm b/code/game/atom_procs.dm
index 02753978f7..b4cde466f1 100644
--- a/code/game/atom_procs.dm
+++ b/code/game/atom_procs.dm
@@ -93,32 +93,25 @@
src.fingerprintshidden += text("(Wearing gloves). Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
return 0
- if (!( src.fingerprints ))
- src.fingerprints = list(text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(40,60))))
- if(src.fingerprintslast != H.key)
- src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
- src.fingerprintslast = H.key
- return 1
else
if(src.fingerprintslast != H.key)
src.fingerprintshidden += text("Real name: [], Key: []",H.real_name, H.key)
src.fingerprintslast = H.key
var/new_prints = 0
var/prints
- for(var/i = 1, i < src.fingerprints.len, i++)
+ for(var/i = 1, i < (src.fingerprints.len + 1), i++)
var/list/L = params2list(src.fingerprints[i])
if(L[1] == md5(H.dna.uni_identity))
new_prints = i
prints = L[2]
break
else
- src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(90,95))
+ src.fingerprints[i] = L[1] + "&" + stars(L[2], rand(80,90))
if(new_prints)
- src.fingerprints[new_prints] = list(text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(40,60)))))
- return 1
- else
- src.fingerprints += text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(40,60)))
- return 1
+ src.fingerprints[new_prints] = text("[]&[]", md5(H.dna.uni_identity), stringmerge(prints,stars(md5(H.dna.uni_identity), rand(15,30))))
+ else if(new_prints == 0)
+ src.fingerprints += text("[]&[]", md5(H.dna.uni_identity), stars(md5(H.dna.uni_identity), rand(15,30)))
+ return 1
else
if(src.fingerprintslast != M.key)
src.fingerprintshidden += text("Real name: [], Key: []",M.real_name, M.key)
@@ -140,26 +133,37 @@
I.Blend(new /icon('blood.dmi', "itemblood"),ICON_MULTIPLY)
I.Blend(new /icon(src.icon, src.icon_state),ICON_UNDERLAY)
src.icon = I
- src.blood_DNA.len++
- src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
+ if(src.blood_DNA)
+ src.blood_DNA.len++
+ src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
+ else
+ var/list/blood_DNA_temp[1]
+ blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
+ src.blood_DNA = blood_DNA_temp
else if (istype(src, /turf/simulated))
var/turf/simulated/source2 = src
var/list/objsonturf = range(0,src)
- var/i
- for(i=1, i<=objsonturf.len, i++)
- if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
- return
+ if(objsonturf)
+ for(var/i=1, i<=objsonturf.len, i++)
+ if(istype(objsonturf[i],/obj/effect/decal/cleanable/blood))
+ return
var/obj/effect/decal/cleanable/blood/this = new /obj/effect/decal/cleanable/blood(source2)
- this.blood_DNA.len++
- this.blood_DNA[this.blood_DNA.len] = list(M.dna.unique_enzymes, M.b_type)
+ var/list/blood_DNA_temp[1]
+ blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
+ this.blood_DNA = blood_DNA_temp
this.virus2 = M.virus2
for(var/datum/disease/D in M.viruses)
var/datum/disease/newDisease = new D.type
this.viruses += newDisease
newDisease.holder = this
else if (istype(src, /mob/living/carbon/human))
- src.blood_DNA.len++
- src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
+ if(src.blood_DNA)
+ src.blood_DNA.len++
+ src.blood_DNA[src.blood_DNA.len] = list(M.dna.unique_enzymes,M.b_type)
+ else
+ var/list/blood_DNA_temp[1]
+ blood_DNA_temp[1] = list(M.dna.unique_enzymes, M.b_type)
+ src.blood_DNA = blood_DNA_temp
else
return
else
diff --git a/code/game/dna.dm b/code/game/dna.dm
index c94ca9f46f..acb1d477f6 100644
--- a/code/game/dna.dm
+++ b/code/game/dna.dm
@@ -69,7 +69,6 @@
unique_enzymes = md5(character.real_name)
original_name = character.real_name
- b_type = character.b_type
reg_dna[unique_enzymes] = character.real_name
/////////////////////////// DNA DATUM
diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm
index 9c4492eadf..000a13d8da 100644
--- a/code/game/gamemodes/traitor/traitor.dm
+++ b/code/game/gamemodes/traitor/traitor.dm
@@ -109,7 +109,8 @@
objective = steal_objective
var/inthere = 0
for(var/j, j<= target.len, j++)
- if(target[j] == objective)
+ var/datum/objective/temp = target[j]
+ if(temp:target == objective:target)
inthere = 1
break
if(!inthere)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 5389935bd4..d5144e09d0 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -429,6 +429,8 @@ About the new airlock wires panel:
return 0
if(!prob(prb))
return 0 //you lucked out, no shock for you
+ if(istype(usr.equipped(),/obj/item/weapon/shard))
+ return 0
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
s.set_up(5, 1, src)
s.start() //sparks always.
@@ -817,10 +819,10 @@ About the new airlock wires panel:
usr.machine = src
if (href_list["wires"])
var/t1 = text2num(href_list["wires"])
- if (!( istype(usr.equipped(), /obj/item/weapon/wirecutters) ))
+ if (!istype(usr.equipped(), /obj/item/weapon/wirecutters) || !istype(usr.equipped(),/obj/item/weapon/shard))
usr << "You need wirecutters!"
return
- if (src.isWireColorCut(t1))
+ if (src.isWireColorCut(t1) && istype(usr.equipped(), /obj/item/weapon/wirecutters))
src.mend(t1)
else
src.cut(t1)
diff --git a/code/game/objects/closets/secure/security.dm b/code/game/objects/closets/secure/security.dm
index fb964a64f9..a1da400009 100644
--- a/code/game/objects/closets/secure/security.dm
+++ b/code/game/objects/closets/secure/security.dm
@@ -85,7 +85,7 @@
/obj/structure/closet/secure_closet/detective
name = "Detective"
req_access = list(access_forensics_lockers)
- icon_state = "cabinetdetective"
+ icon_state = "cabinetdetective_locked"
icon_closed = "cabinetdetective"
icon_locked = "cabinetdetective_locked"
icon_opened = "cabinetdetective_open"
diff --git a/code/game/objects/devices/scanners.dm b/code/game/objects/devices/scanners.dm
index 06b16694e8..ab5f245e49 100644
--- a/code/game/objects/devices/scanners.dm
+++ b/code/game/objects/devices/scanners.dm
@@ -131,7 +131,7 @@ MASS SPECTROMETER
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
return
- afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
+ afterattack(atom/A as obj|turf|area, mob/user as mob)
if(src.loc != user)
return 0
src.add_fingerprint(user)
@@ -141,34 +141,42 @@ MASS SPECTROMETER
var/list/templist = A.blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
return
- if (!( A.fingerprints ) && !(A.suit_fibers) && !(A.blood_DNA))
+ var/duplicate = 0
+ if ((!A.fingerprints || A.fingerprints.len == 0) && !(A.suit_fibers) && !(A.blood_DNA))
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
return 0
else if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
sleep(15)
- var/duplicate = add_data(A)
- if(duplicate)
- user << "\blue Blood already in memory."
- for(var/i = 1, i < A.blood_DNA.len, i++)
+ if(!duplicate)
+ duplicate = 1
+ var/i = add_data(A)
+ if(i)
+ user << "\blue Blood already in memory."
+ for(var/i = 1, i < (A.blood_DNA.len + 1), i++)
var/list/templist = A.blood_DNA[i]
user << "\blue Blood type: [templist[2]]\nDNA: [templist[1]]"
else
user << "\blue No Blood Located"
- if(!( A.fingerprints ))
+ if(!A.fingerprints || A.fingerprints.len == 0)
user << "\blue No Fingerprints Located."
else
user << text("\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve.")
- var/duplicate = add_data(A)
- if(duplicate)
- user << "\blue Figerprints already in memory."
+ if(!duplicate)
+ duplicate = 1
+ var/i = add_data(A)
+ if(i)
+ user << "\blue Fingerprints already in memory."
if(!A.suit_fibers)
user << "\blue No Fibers/Materials Located."
else
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
- var/duplicate = add_data(A)
- if(duplicate)
- user << "\blue Fibers/Materials already in memory."
+
+ if(!duplicate)
+ duplicate = 1
+ var/i = add_data(A)
+ if(i)
+ user << "\blue Fibers/Materials already in memory."
// else
// if ((src.amount < 1 && src.printing))
// user << "\blue Fingerprints found. Need more cards to print."
@@ -188,18 +196,20 @@ MASS SPECTROMETER
proc/add_data(atom/A as mob|obj|turf|area)
var/merged = 0
- for(var/i = 1, i < stored.len, i++) //Lets see if the object is already in there!
+ for(var/i = 1, i < (stored.len + 1), i++) //Lets see if the object is already in there!
var/list/temp = stored[i]
var/checker = temp[1]
if(checker == A) //It is! Merge!
merged = 1
var/list/prints = temp[2]
+ if(!prints)
+ prints = list()
if(A.fingerprints)
- for(var/j = 1, j < A.fingerprints.len, j++) //Fingerprints~~~
+ for(var/j = 1, j < (A.fingerprints.len + 1), j++) //Fingerprints~~~
var/list/print_test1 = params2list(A.fingerprints[j])
var/test_print1 = print_test1[1]
var/found = 0
- for(var/k = 1, k <= prints.len, k++) //Lets see if the print is already in there
+ for(var/k = 1, k < (prints.len + 1), k++) //Lets see if the print is already in there
var/list/print_test2 = params2list(prints[k])
var/test_print2 = print_test2[1]
if(test_print2 == test_print1) //It is! Merge!
@@ -209,28 +219,18 @@ MASS SPECTROMETER
if(!found) //It isn't! Add!
prints += A.fingerprints[j]
var/list/fibers = temp[3]
+ if(!fibers)
+ fibers = list()
if(A.suit_fibers)
- for(var/j = 1, j < A.suit_fibers.len, j++) //Fibers~~~
- var/test_print1 = A.suit_fibers[j]
- var/found = 0
- for(var/k = 1, k <= fibers.len, k++) //Lets see if the fiber is already in there
- var/test_print2 = fibers[k]
- if(test_print2 == test_print1) //It is! Do nothing!
- found = 1
- break //We found it, we're done here.
- if(!found) //It isn't! Add!
+ for(var/j = 1, j < (A.suit_fibers.len + 1), j++) //Fibers~~~
+ if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
fibers += A.suit_fibers[j]
var/list/blood = temp[4]
+ if(!blood)
+ blood = list()
if(A.blood_DNA)
- for(var/j = 1, j < A.blood_DNA.len, j++) //Blood~~~
- var/test_print1 = A.blood_DNA[j]
- var/found = 0
- for(var/k = 1, k <= blood.len, k++) //Lets see if the blood is already in there
- var/test_print2 = blood[k]
- if(test_print2 == test_print1) //It is! Do nothing!
- found = 1
- break //We found it, we're done here.
- if(!found) //It isn't! Add!
+ for(var/j = 1, j < (A.blood_DNA.len + 1), 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] = A
@@ -247,7 +247,7 @@ MASS SPECTROMETER
sum_list[4] = A.blood_DNA
stored.len++
stored[stored.len] = sum_list
- return !merged
+ return merged
/obj/item/device/healthanalyzer
diff --git a/code/game/objects/items/item.dm b/code/game/objects/items/item.dm
index 351dd922f5..a2167decfb 100644
--- a/code/game/objects/items/item.dm
+++ b/code/game/objects/items/item.dm
@@ -228,7 +228,7 @@
user << "\blue The wardrobe is full."
return
user << "\blue You pick up all the items."
- user.visible_message("\blue [user] gathers up the pile of stuff, and puts it into \the [src]")
+ user.visible_message("\blue [user] gathers up the pile of stuff, and puts it into \the [W]")
I.update_icon()
/obj/item/attack_self(mob/user as mob)
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 8352ccf718..482271c349 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -201,11 +201,11 @@ FINGERPRINT CARD
/obj/item/weapon/f_card/proc/display()
- if (src.fingerprints)
+ if (length(src.fingerprints))
var/dat = "Fingerprints on Card