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
" - var/L = params2list(src.fingerprints) - for(var/i in L) - dat += text("[]
", i) + for(var/i = 1, i < (src.fingerprints.len + 1), i++) + var/list/L = params2list(src.fingerprints[i]) + dat += text("[]
", L[1]) //Foreach goto(41) return dat else @@ -270,7 +270,7 @@ FINGERPRINT CARD ..() if (!istype(usr, /mob/living/silicon)) - if (src.fingerprints) + if (length(src.fingerprints)) if (src.amount > 1) var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( (ismob(src.loc) ? src.loc.loc : src.loc) ) F.amount = --src.amount diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm index 14c44bc578..686339aa6a 100644 --- a/code/modules/admin/verbs/adminhelp.dm +++ b/code/modules/admin/verbs/adminhelp.dm @@ -19,15 +19,10 @@ usr << "Your message has been broadcast to administrators." log_admin("HELP: [key_name(src)]: [msg]") - var/list/replacechars = list("'","\"",">","<","(",")") +/* var/list/replacechars = list("'","\"",">","<","(",")") for(var/rep in replacechars) - var/list/temp = dd_text2list(msg, rep) - if(temp.len > 1) - for(var/i = 1, i < temp.len, i++) - world << temp[i] - temp[i] = copytext(temp[i],1,lentext(temp[i])) - msg = dd_list2text(temp) - world << msg + msg = dd_replacetext(msg, rep, "") + world << msg*/ send2adminirc("#bs12admin","HELP: [src.key]: [msg]") if(tension_master) tension_master.new_adminhelp() diff --git a/code/modules/chemical/Chemistry-Machinery.dm b/code/modules/chemical/Chemistry-Machinery.dm index c5570ee26b..aebb052e6e 100644 --- a/code/modules/chemical/Chemistry-Machinery.dm +++ b/code/modules/chemical/Chemistry-Machinery.dm @@ -196,19 +196,27 @@ return attackby(var/obj/item/weapon/reagent_containers/glass/B as obj, var/mob/user as mob) - if(!istype(B, /obj/item/weapon/reagent_containers/glass)) + if(!istype(B, /obj/item/weapon/reagent_containers/glass) && !istype(B,/obj/item/weapon/reagent_containers/syringe)) return if(src.beaker) - user << "A beaker is already loaded into the machine." + if(istype(beaker,/obj/item/weapon/reagent_containers/syringe)) + user << "A syringe is already loaded into the machine." + else + user << "A beaker is already loaded into the machine." return src.beaker = B user.drop_item() B.loc = src - user << "You add the beaker to the machine!" - src.updateUsrDialog() - icon_state = "mixer1" + if(istype(B,/obj/item/weapon/reagent_containers/syringe)) + user << "You add the syringe to the machine!" + src.updateUsrDialog() + icon_state = "mixers" + else + user << "You add the beaker to the machine!" + src.updateUsrDialog() + icon_state = "mixer1" Topic(href, href_list) if(stat & BROKEN) return @@ -222,7 +230,18 @@ if (href_list["analyze"]) var/dat = "" if(!condi) - dat += "Chemmaster 3000Chemical infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]


(Back)" + if(href_list["name"] == "Blood") + var/datum/reagent/blood/G + for(var/datum/reagent/F in R.reagent_list) + if(F.name == href_list["name"]) + G = F + break + var/A = G.name + var/B = G.data["blood_type"] + var/C = G.data["blood_DNA"] + dat += "Chemmaster 3000Chemical infos:

Name:
[A]

Description:
Blood Type: [B]
DNA: [C]


(Back)" + else + dat += "Chemmaster 3000Chemical infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]


(Back)" else dat += "Condimaster 3000Condiment infos:

Name:
[href_list["name"]]

Description:
[href_list["desc"]]


(Back)" usr << browse(dat, "window=chem_master;size=575x400") @@ -316,7 +335,7 @@ dat += "Add to buffer:
" for(var/datum/reagent/G in R.reagent_list) dat += "[G.name] , [G.volume] Units - " - dat += "(Analyze) " + dat += "(Analyze) " dat += "(1) " if(G.volume >= 5) dat += "(5) " if(G.volume >= 10) dat += "(10) " diff --git a/code/modules/chemical/Chemistry-Reagents.dm b/code/modules/chemical/Chemistry-Reagents.dm index 5402eda0c3..52062de5e8 100644 --- a/code/modules/chemical/Chemistry-Reagents.dm +++ b/code/modules/chemical/Chemistry-Reagents.dm @@ -101,6 +101,12 @@ datum id = "blood" reagent_state = LIQUID color = "#C80000" // rgb: 200, 0, 0 + on_mob_life(var/mob/living/M) + if(istype(M, /mob/living/carbon/human) && blood_incompatible(data["blood_type"],M.dna.b_type)) + M.adjustToxLoss(rand(1.5,3)) + M.adjustOxyLoss(rand(1.5,3)) + ..() + return reaction_mob(var/mob/M, var/method=TOUCH, var/volume) var/datum/reagent/blood/self = src diff --git a/code/modules/chemical/Chemistry-Tools.dm b/code/modules/chemical/Chemistry-Tools.dm index b7531cfb1d..9f7d5ec418 100644 --- a/code/modules/chemical/Chemistry-Tools.dm +++ b/code/modules/chemical/Chemistry-Tools.dm @@ -863,6 +863,7 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = null //list(5,10,15) volume = 15 + var/has_blood = 0 var/mode = SYRINGE_DRAW on_reagent_change() @@ -1023,6 +1024,10 @@ update_icon() var/rounded_vol = round(reagents.total_volume,5) + has_blood = 0 + for(var/datum/reagent/blood/B in reagents.reagent_list) + has_blood = 1 + break if(ismob(loc)) var/mode_t switch(mode) @@ -1030,9 +1035,9 @@ mode_t = "d" if (SYRINGE_INJECT) mode_t = "i" - icon_state = "[mode_t][rounded_vol]" + icon_state = "[mode_t][(has_blood?"b":"")][rounded_vol]" else - icon_state = "[rounded_vol]" + icon_state = "[(has_blood?"b":"")][rounded_vol]" item_state = "syringe_[rounded_vol]" diff --git a/code/modules/mob/living/carbon/give.dm b/code/modules/mob/living/carbon/give.dm index b551bfb86e..5226f4d9bb 100644 --- a/code/modules/mob/living/carbon/give.dm +++ b/code/modules/mob/living/carbon/give.dm @@ -1,4 +1,5 @@ mob/living/carbon/verb/give() + set category = "IC" set name = "Give" set src in view(1) if(src.stat == 2 || usr.stat == 2|| src.client == null) @@ -42,6 +43,7 @@ mob/living/carbon/verb/give() src.l_hand = I else usr << "Their hands are full." + return else usr.drop_item(I) src.r_hand = I @@ -70,6 +72,7 @@ mob/living/carbon/verb/give() src.r_hand = I else usr << "Their hands are full." + return else usr.drop_item(I) src.l_hand = I diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index dd398804db..67773f5f5f 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -112,6 +112,7 @@ emp_act else H.add_blood(src) if(H.wear_suit) H.wear_suit.add_blood(src) else if(H.w_uniform) H.w_uniform.add_blood(src) + if(H.shoes) H.shoes.add_blood(src) switch(hit_area) if("head")//Harder to score a stun but if you do it lasts a bit longer diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 1c1eee6d2a..87c6f98191 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -354,6 +354,7 @@ proc/create_character() spawning = 1 var/mob/living/carbon/human/new_character = new(loc) + new_character.be_syndicate = src.preferences.be_special close_spawn_windows() diff --git a/icons/obj/chemical.dmi b/icons/obj/chemical.dmi index 08a708f72b..d52b9b7be1 100644 Binary files a/icons/obj/chemical.dmi and b/icons/obj/chemical.dmi differ diff --git a/icons/obj/syringe.dmi b/icons/obj/syringe.dmi index 08d86cb7e5..022680cda9 100644 Binary files a/icons/obj/syringe.dmi and b/icons/obj/syringe.dmi differ