Final updates on Fingerprints

fix for traitors getting assassinate and protect targets for the same person
Ported blood rejection
This commit is contained in:
SkyMarshal
2012-01-31 02:00:45 -07:00
parent 6648061dcb
commit beffc2299a
20 changed files with 554 additions and 221 deletions

View File

@@ -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]}<br>"
dat += "<a href='?src=\ref[src];operation=cancel'>{Cancel Scan}</a> {Print}<br><br>"
dat += "<a href='?src=\ref[src];operation=cancel'>{Cancel Scan}</a> {Print}<br>"
else
if(isai) dat += "Scan Object: {[scanning.name]}<br>"
else dat += "Scan Object: <a href='?src=\ref[src];operation=eject'>{[scanning.name]}</a><br>"
dat += "<a href='?src=\ref[src];operation=scan'>{Scan}</a> <a href='?src=\ref[src];operation=print'>{Print}</a><br><br>"
dat += "<a href='?src=\ref[src];operation=scan'>{Scan}</a> <a href='?src=\ref[src];operation=print'>{Print}</a><br>"
else
if(isai) dat += "{No Object Inserted}<br>"
else dat += "<a href='?src=\ref[src];operation=insert'>{No Object Inserted}</a><br>"
dat += "{Scan} <a href='?src=\ref[src];operation=print'>{Print}</a><br><br>"
dat += "{Scan} <a href='?src=\ref[src];operation=print'>{Print}</a><br>"
dat += "<a href='?src=\ref[src];operation=database'>{Access Database}</a><br><br>"
dat += "<tt>[scan_data]</tt>"
if(scan_data && !scan_process)
dat += "<br><a href='?src=\ref[src];operation=erase'>{Erase Data}</a>"
@@ -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 = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points:<br>"
for(var/i = 1, i < (files.len + 1), i++)
temp += "<a href='?src=\ref[src];operation=record;identifier=[i]'>{Dossier [i]}</a><br>"
temp += "<br><a href='?src=\ref[src];operation=card'>{Insert Finger Print Card}</a><br><br><br>"
else
temp = ""
if(misc)
temp += "<b>Auxiliary Evidence Database</b><br><br>"
temp += "This is where anything without fingerprints goes.<br><br>"
for(var/i = 1, i < (misc.len + 1), i++)
var/list/temp_list = misc[i]
var/item_name = get_name(temp_list[1])
temp += "<a href='?src=\ref[src];operation=auxiliary;identifier=[i]'>{[item_name]}</a><br>"
if("record")
canclear = 0
if(files)
temp = "<b>Criminal Evidence Database</b><br><br>"
temp += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/identifier = text2num(href_list["identifier"])
var/list/dossier = files[identifier]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[2]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: (80% or higher completion reached)<br>" + prints[2] + "<br>"
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]<br>"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
if(fibers)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
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 += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=databaseprint;identifier=[href_list["identifier"]]'>{Print}</a>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
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 = "<b>Criminal Evidence Database</b><br><br>"
P.info += "Consolidated data points: Dossier [href_list["identifier"]]<br>"
var/list/dossier = files[text2num(href_list["identifier"])]
var/list/prints = params2list(dossier[1])
var/print_string = "Fingerprints: Print not complete!<br>"
if(stringpercent(prints[2]) <= FINGERPRINT_COMPLETE)
print_string = "Fingerprints: " + prints[2] + "<BR>"
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]<br>"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;[prints_len.len] Unique fingerprints found.<br>"
var/list/fibers = outputs[3]
if(fibers)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found.<br>"
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 += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
P.info += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found."
else
usr << "ERROR. Database not found!<br>"
if("auxiliary")
canclear = 0
if(misc)
temp = "<b>Auxiliary Evidence Database</b><br><br>"
var/identifier = text2num(href_list["identifier"])
var/list/outputs = misc[identifier]
var/item_name = get_name(outputs[1])
temp += "Consolidated data points: [item_name]<br>"
var/list/fibers = outputs[2]
if(fibers)
var/dat = "[fibers[1]]"
for(var/j = 2, j < (fibers.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[fibers[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Fibers: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No fibers found."
var/list/blood = outputs[3]
if(blood)
var/dat = "[blood[1]]"
for(var/j = 2, j < (blood.len + 1), j++)
dat += ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[blood[j]]"
temp += "&nbsp;&nbsp;&nbsp;&nbsp;Blood: [dat]<br>"
else
temp += "&nbsp;&nbsp;&nbsp;&nbsp;No blood found.<br>"
else
temp = "ERROR. Database not found!<br>"
temp += "<br><a href='?src=\ref[src];operation=database'>{Return}</a>"
if("scan")
if(scanning)
scan_process = 3
@@ -380,19 +522,19 @@ obj/machinery/computer/forensic_scanning
scan_data = "<u>[scanning]</u><br><br>"
if (scanning.blood_DNA)
scan_data += "Blood Found:<br>"
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]]<br><br>"
else
scan_data += "No Blood Found<br><br>"
if (!( scanning.fingerprints.len ))
if (!length(scanning.fingerprints))
scan_data += "No Fingerprints Found<br><br>"
else
var/list/L = scanning.fingerprints
scan_data += "Isolated [L.len] Fingerprints. Loaded into database.<br>"
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]<br>"
if(istype(scanning,/obj/item/device/detective_scanner))
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
else if(!scanning.fingerprints.len)
add_data_scanner(scanning)
else if(!length(scanning.fingerprints))
scan_data += "<br><b><a href='?src=\ref[src];operation=add'>Add to Database?</a></b><br>"
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

View File

@@ -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
..()