mirror of
https://github.com/PolarisSS13/Polaris.git
synced 2025-12-29 11:31:51 +00:00
Merge pull request #1213 from SkyMarshal/CoolTweaks
Several changes, any PDA with a security cartridge can be used to gather evidence to be put in the forensic scanning computer, removed a proc that should never have existed, moved the visible_message proc into the atom_procs file.
This commit is contained in:
@@ -1080,95 +1080,32 @@ var/using_new_click_proc = 0 //TODO ERRORAGE (This is temporary, while the DblCl
|
||||
var/mob/living/carbon/U = M
|
||||
U.swap_hand()
|
||||
|
||||
/*
|
||||
/atom/proc/get_global_map_pos()
|
||||
if(!islist(global_map) || isemptylist(global_map)) return
|
||||
var/cur_x = null
|
||||
var/cur_y = null
|
||||
var/list/y_arr = null
|
||||
for(cur_x=1,cur_x<=global_map.len,cur_x++)
|
||||
y_arr = global_map[cur_x]
|
||||
cur_y = y_arr.Find(src.z)
|
||||
if(cur_y)
|
||||
break
|
||||
// world << "X = [cur_x]; Y = [cur_y]"
|
||||
if(cur_x && cur_y)
|
||||
return list("x"=cur_x,"y"=cur_y)
|
||||
else
|
||||
return 0
|
||||
*/ //Don't touch this either. DMTG
|
||||
/atom/proc/checkpass(passflag)
|
||||
return pass_flags&passflag
|
||||
|
||||
|
||||
//Could not find object proc defines and this could almost be an atom level one.
|
||||
|
||||
/obj/proc/process()
|
||||
processing_objects.Remove(src)
|
||||
return 0
|
||||
|
||||
// Show a message to all mobs in sight of this one
|
||||
// This would be for visible actions by the src mob
|
||||
// message is the message output to anyone who can see e.g. "[src] does something!"
|
||||
// self_message (optional) is what the src mob sees e.g. "You do something!"
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
|
||||
/*Really why was this in the click proc of all the places you could put it
|
||||
if (usr:a_intent == "help")
|
||||
// ------- YOU HAVE THE HELP INTENT SELECTED -------
|
||||
if(istype(src, /mob/living/carbon))
|
||||
// ------- YOUR TARGET IS LIVING CARBON CREATURE (NOT AI OR CYBORG OR SIMPLE ANIMAL) -------
|
||||
var/mob/living/carbon/C = src
|
||||
if(usr:mutations & HEAL)
|
||||
// ------- YOU ARE HUMAN, WITH THE HELP INTENT TARGETING A HUMAN AND HAVE THE 'HEAT' GENETIC MUTATION -------
|
||||
|
||||
if(C.stat != 2)
|
||||
// ------- THE PERSON YOU'RE TOUCHING IS NOT DEAD -------
|
||||
|
||||
var/t_him = "it"
|
||||
if (src.gender == MALE)
|
||||
t_him = "his"
|
||||
else if (src.gender == FEMALE)
|
||||
t_him = "her"
|
||||
var/u_him = "it"
|
||||
if (usr.gender == MALE)
|
||||
t_him = "him"
|
||||
else if (usr.gender == FEMALE)
|
||||
t_him = "her"
|
||||
|
||||
if(src != usr)
|
||||
usr.visible_message( \
|
||||
"\blue <i>[usr] places [u_him] palms on [src], healing [t_him]!</i>", \
|
||||
"\blue You place your palms on [src] and heal [t_him].", \
|
||||
)
|
||||
else
|
||||
usr.visible_message( \
|
||||
"\blue <i>[usr] places [u_him] palms on [u_him]self and heals.</i>", \
|
||||
"\blue You place your palms on yourself and heal.", \
|
||||
)
|
||||
|
||||
C.adjustOxyLoss(-25)
|
||||
C.adjustToxLoss(-25)
|
||||
|
||||
if(istype(C, /mob/living/carbon/human))
|
||||
// ------- YOUR TARGET IS HUMAN -------
|
||||
var/mob/living/carbon/human/H = C
|
||||
var/datum/organ/external/affecting = H.get_organ(check_zone(usr:zone_sel:selecting))
|
||||
if(affecting && affecting.heal_damage(25, 25))
|
||||
H.UpdateDamageIcon()
|
||||
else
|
||||
C.heal_organ_damage(25, 25)
|
||||
C.adjustCloneLoss(-25)
|
||||
C.stunned = max(0, C.stunned-5)
|
||||
C.paralysis = max(0, C.paralysis-5)
|
||||
C.stuttering = max(0, C.stuttering-5)
|
||||
C.drowsyness = max(0, C.drowsyness-5)
|
||||
C.weakened = max(0, C.weakened-5)
|
||||
usr:nutrition -= rand(1,10)
|
||||
usr.next_move = world.time + 6
|
||||
else
|
||||
// ------- PERSON YOU'RE TOUCHING IS ALREADY DEAD -------
|
||||
usr << "\red [src] is dead and can't be healed."
|
||||
return
|
||||
|
||||
// ------- IF YOU DON'T HAVE THE SILLY ABILITY ABOVE OR FAIL ON ANY OTHER CHECK, THEN YOU'RE CLICKING ON SOMETHING WITH AN EMPTY HAND. ATTACK_HAND IT IS THEN -------
|
||||
*/
|
||||
/mob/visible_message(var/message, var/self_message, var/blind_message)
|
||||
for(var/mob/M in viewers(src))
|
||||
var/msg = message
|
||||
if(self_message && M==src)
|
||||
msg = self_message
|
||||
M.show_message( msg, 1, blind_message, 2)
|
||||
|
||||
// Show a message to all mobs in sight of this atom
|
||||
// Use for objects performing visible actions
|
||||
// message is output to anyone who can see, e.g. "The [src] does something!"
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
/atom/proc/visible_message(var/message, var/blind_message)
|
||||
for(var/mob/M in viewers(src))
|
||||
M.show_message( message, 1, blind_message, 2)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -840,22 +840,23 @@ ________________________________________________________________________________
|
||||
U << "\red Procedure interrupted. Protocol terminated."
|
||||
return
|
||||
else if(istype(I, /obj/item/weapon/disk/tech_disk))//If it's a data disk, we want to copy the research on to the suit.
|
||||
if(I:stored)//If it has something on it.
|
||||
var/obj/item/weapon/disk/tech_disk/T = I
|
||||
if(T.stored)//If it has something on it.
|
||||
U << "Research information detected, processing..."
|
||||
if(do_after(U,s_delay))
|
||||
for(var/datum/tech/current_data in stored_research)
|
||||
if(current_data.id==I:stored.id)
|
||||
if(current_data.level<I:stored.level)
|
||||
current_data.level=I:stored.level
|
||||
if(current_data.id==T.stored.id)
|
||||
if(current_data.level<T.stored.level)
|
||||
current_data.level=T.stored.level
|
||||
break
|
||||
I:stored = null
|
||||
T.stored = null
|
||||
U << "\blue Data analyzed and updated. Disk erased."
|
||||
else
|
||||
U << "\red <b>ERROR</b>: \black Procedure interrupted. Process terminated."
|
||||
else
|
||||
I.loc = src
|
||||
t_disk = I
|
||||
U << "\blue You slot \the [I] into \the [src]."
|
||||
T.loc = src
|
||||
t_disk = T
|
||||
U << "\blue You slot \the [T] into \the [src]."
|
||||
return
|
||||
..()
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if((air_group && blobtype != "Shield") || (height==0)) return 1
|
||||
if(istype(mover) && mover.checkpass(PASSBLOB)) return 1
|
||||
if(istype(mover) && mover.pass_flags&PASSBLOB) return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@
|
||||
/obj/machinery/optable/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
if(istype(mover) && mover.pass_flags&PASSTABLE)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -133,7 +133,7 @@ for reference:
|
||||
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
|
||||
if(air_group || (height==0))
|
||||
return 1
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
if(istype(mover) && mover.pass_flags&PASSTABLE)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
@@ -260,7 +260,7 @@ for reference:
|
||||
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff.
|
||||
if(air_group || (height==0))
|
||||
return 1
|
||||
if(istype(mover) && mover.checkpass(PASSTABLE))
|
||||
if(istype(mover) && mover.pass_flags&PASSTABLE)
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
|
||||
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group) return 0
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
if(istype(mover) && mover.pass_flags&PASSGLASS)
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/door/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
if(istype(mover) && mover.pass_flags & PASSGLASS)
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir) //Make sure looking at appropriate border
|
||||
if(air_group) return 0
|
||||
@@ -67,7 +67,7 @@
|
||||
return 1
|
||||
|
||||
/obj/machinery/door/window/CheckExit(atom/movable/mover as mob|obj, turf/target as turf)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
if(istype(mover) && mover.pass_flags & PASSGLASS)
|
||||
return 1
|
||||
if(get_dir(loc, target) == dir)
|
||||
return !density
|
||||
|
||||
@@ -475,7 +475,7 @@
|
||||
/obj/machinery/shieldwall/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
if(istype(mover) && mover.pass_flags&PASSGLASS)
|
||||
return prob(20)
|
||||
else
|
||||
if (istype(mover, /obj/item/projectile))
|
||||
|
||||
@@ -161,6 +161,6 @@
|
||||
|
||||
/obj/effect/alien/resin/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group) return 0
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
if(istype(mover) && mover.pass_flags & PASSGLASS)
|
||||
return !opacity
|
||||
return !density
|
||||
|
||||
@@ -860,6 +860,8 @@
|
||||
user.show_message("\blue No radiation detected.")
|
||||
|
||||
/obj/item/device/pda/afterattack(atom/A as mob|obj|turf|area, mob/user as mob)
|
||||
if(!in_range(A, user))
|
||||
return
|
||||
switch(scanmode)
|
||||
if(2)
|
||||
if (!A.fingerprints)
|
||||
@@ -878,6 +880,9 @@
|
||||
user << "\blue Found [complete_prints.len] intact prints"
|
||||
for(var/i in complete_prints)
|
||||
user << "\blue [i]"
|
||||
if(cartridge && cartridge.access_security)
|
||||
cartridge.add_data(A)
|
||||
user << "Data added to internal storage. Scan with a High-Resolution Scanner to retreive."
|
||||
|
||||
if(3)
|
||||
if(!isnull(A.reagents))
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
var/list/powermonitors = list()
|
||||
var/message1 // used for status_displays
|
||||
var/message2
|
||||
var/list/stored = list()
|
||||
|
||||
engineering
|
||||
name = "Power-ON Cartridge"
|
||||
@@ -50,6 +51,7 @@
|
||||
spawn(5)
|
||||
radio = new /obj/item/radio/integrated/beepsky(src)
|
||||
|
||||
|
||||
detective
|
||||
name = "D.E.T.E.C.T. Cartridge"
|
||||
icon_state = "cart-s"
|
||||
@@ -570,6 +572,43 @@ Code:
|
||||
else
|
||||
menu += "ERROR: Unable to determine current location."
|
||||
|
||||
proc/add_data(atom/A as mob|obj|turf|area)
|
||||
//I love hashtables.
|
||||
var/list/data_entry = stored["\ref [A]"]
|
||||
if(islist(data_entry)) //Yay, it was already stored!
|
||||
//Merge the fingerprints.
|
||||
var/list/data_prints = data_entry[1]
|
||||
for(var/print in A.fingerprints)
|
||||
var/merged_print = data_prints[print]
|
||||
if(!merged_print)
|
||||
data_prints[print] = A.fingerprints[print]
|
||||
else
|
||||
data_prints[print] = stringmerge(data_prints[print],A.fingerprints[print])
|
||||
|
||||
//Now the fibers
|
||||
var/list/fibers = data_entry[2]
|
||||
if(!fibers)
|
||||
fibers = list()
|
||||
if(A.suit_fibers && A.suit_fibers.len)
|
||||
for(var/j = 1, j <= A.suit_fibers.len, j++) //Fibers~~~
|
||||
if(!fibers.Find(A.suit_fibers[j])) //It isn't! Add!
|
||||
fibers += A.suit_fibers[j]
|
||||
var/list/blood = data_entry[3]
|
||||
if(!blood)
|
||||
blood = list()
|
||||
if(A.blood_DNA && A.blood_DNA.len)
|
||||
for(var/main_blood in A.blood_DNA)
|
||||
if(!blood[main_blood])
|
||||
blood[main_blood] = A.blood_DNA[blood]
|
||||
return 1
|
||||
var/list/sum_list[4] //Pack it back up!
|
||||
sum_list[1] = A.fingerprints
|
||||
sum_list[2] = A.suit_fibers
|
||||
sum_list[3] = A.blood_DNA
|
||||
sum_list[4] = "\The [A] in [get_area(A)]"
|
||||
stored["\ref [A]"] = sum_list
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/cartridge/Topic(href, href_list)
|
||||
..()
|
||||
|
||||
|
||||
@@ -64,7 +64,6 @@ MASS SPECTROMETER
|
||||
desc = "Used to scan objects for DNA and fingerprints."
|
||||
icon_state = "forensic1"
|
||||
var/amount = 20.0
|
||||
// var/printing = 0.0
|
||||
var/list/stored = list()
|
||||
w_class = 3.0
|
||||
item_state = "electronic"
|
||||
@@ -90,16 +89,6 @@ MASS SPECTROMETER
|
||||
W.add_fingerprint(user)
|
||||
return
|
||||
|
||||
// attack_self(mob/user as mob)
|
||||
// src.printing = !( src.printing )
|
||||
// if(src.printing)
|
||||
// user << "\blue Printing turned on"
|
||||
// else
|
||||
// user << "\blue Printing turned off"
|
||||
// src.icon_state = text("forensic[]", src.printing)
|
||||
// add_fingerprint(user)
|
||||
// return
|
||||
|
||||
attack(mob/living/carbon/human/M as mob, mob/user as mob)
|
||||
if (!ishuman(M))
|
||||
user << "\red [M] is not human and cannot have the fingerprints."
|
||||
@@ -132,17 +121,16 @@ MASS SPECTROMETER
|
||||
return
|
||||
|
||||
afterattack(atom/A as obj|turf|area, mob/user as mob)
|
||||
if(!(locate(A) in oview(1,user)))
|
||||
if(!in_range(A,user))
|
||||
return
|
||||
if(src.loc != user)
|
||||
if(loc != user)
|
||||
return
|
||||
if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
|
||||
return
|
||||
if(istype(A,/obj/item/weapon/f_card))
|
||||
user << "Haha, nice try. Cheater. (It would break stuff anyways.)"
|
||||
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
|
||||
return
|
||||
if(!A.fingerprints)
|
||||
A.fingerprints = list()
|
||||
|
||||
add_fingerprint(user)
|
||||
|
||||
//Special case for blood splaters.
|
||||
@@ -151,50 +139,46 @@ MASS SPECTROMETER
|
||||
for(var/blood in A.blood_DNA)
|
||||
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
|
||||
return
|
||||
var/duplicate = 0
|
||||
|
||||
//General
|
||||
if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
|
||||
user << "\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!"
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "his": "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
"\blue Unable to locate any fingerprints, materials, fibers, or blood on [A]!",\
|
||||
"You hear a faint hum of electrical equipment.")
|
||||
return 0
|
||||
|
||||
//BLOOD
|
||||
else if (A.blood_DNA)
|
||||
user << "\blue Blood found on [A]. Analysing..."
|
||||
sleep(15)
|
||||
if(!duplicate)
|
||||
duplicate = 1
|
||||
var/i = add_data(A)
|
||||
if(i)
|
||||
user << "\blue Blood already in memory."
|
||||
for(var/blood in A.blood_DNA)
|
||||
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
|
||||
else
|
||||
user << "\blue No Blood Located"
|
||||
if(add_data(A))
|
||||
user << "\blue Object already in internal memory. Consolidating data..."
|
||||
return
|
||||
|
||||
|
||||
//PRINTS
|
||||
if(!A.fingerprints || !A.fingerprints.len)
|
||||
user << "\blue No Fingerprints Located."
|
||||
if(A.fingerprints)
|
||||
del(A.fingerprints)
|
||||
else
|
||||
user << text("\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve.")
|
||||
if(!duplicate)
|
||||
duplicate = 1
|
||||
var/i = add_data(A)
|
||||
if(i)
|
||||
user << "\blue Fingerprints already in memory."
|
||||
user << "\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
|
||||
|
||||
//FIBERS
|
||||
if(!A.suit_fibers)
|
||||
user << "\blue No Fibers/Materials Located."
|
||||
else
|
||||
if(A.suit_fibers)
|
||||
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
|
||||
|
||||
if(!duplicate)
|
||||
duplicate = 1
|
||||
var/i = add_data(A)
|
||||
if(i)
|
||||
user << "\blue Fibers/Materials already in memory."
|
||||
//Blood
|
||||
if (A.blood_DNA)
|
||||
user << "\blue Blood found on [A]. Analysing..."
|
||||
spawn(15)
|
||||
for(var/blood in A.blood_DNA)
|
||||
user << "Blood type: \red [A.blood_DNA[blood]] \t \black DNA: \red [blood]"
|
||||
if(prob(5))
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "his": "her"] humming[prob(70) ? " gently." : "."]" ,\
|
||||
"You finish scanning \the [A].",\
|
||||
"You hear a faint hum of electrical equipment.")
|
||||
return 0
|
||||
else
|
||||
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "his": "her"] humming[prob(70) ? " gently." : "."]\n[user.gender == MALE ? "He": "She"] seems to perk up slightly at the readout." ,\
|
||||
"The results of the scan pique your interest.",\
|
||||
"You hear a faint hum of electrical equipment, and someone making a thoughtful noise.")
|
||||
return 0
|
||||
return
|
||||
|
||||
proc/add_data(atom/A as mob|obj|turf|area)
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
|
||||
CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
if(istype(mover) && mover.checkpass(PASSGRILLE))
|
||||
if(istype(mover) && mover.pass_flags & PASSGRILLE)
|
||||
return 1
|
||||
else
|
||||
if (istype(mover, /obj/item/projectile))
|
||||
|
||||
@@ -117,7 +117,7 @@ TABLE AND RACK OBJECT INTERATIONS
|
||||
/obj/structure/table/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(air_group || (height==0)) return 1
|
||||
|
||||
if(istype(mover) && (mover.checkpass(PASSTABLE) || (mover.flags & TABLEPASS) || mover.throwing)) //WTF do things hit tables like that? Jeez.
|
||||
if(istype(mover) && (mover.pass_flags & PASSTABLE || (mover.flags & TABLEPASS) || mover.throwing)) //WTF do things hit tables like that? Jeez.
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
@@ -358,7 +358,7 @@ TABLE AND RACK OBJECT INTERATIONS
|
||||
if(air_group || (height==0)) return 1
|
||||
if(src.density == 0) //Because broken racks -Agouri |TODO: SPRITE!|
|
||||
return 1
|
||||
if(istype(mover) && (mover.checkpass(PASSTABLE) || mover.flags & TABLEPASS || mover.throwing))
|
||||
if(istype(mover) && (mover.pass_flags & PASSTABLE || mover.flags & TABLEPASS || mover.throwing))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
del(src)
|
||||
|
||||
/obj/structure/window/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(istype(mover) && mover.checkpass(PASSGLASS))
|
||||
if(istype(mover) && mover.pass_flags & PASSGLASS)
|
||||
return 1
|
||||
if (src.dir == SOUTHWEST || src.dir == SOUTHEAST || src.dir == NORTHWEST || src.dir == NORTHEAST)
|
||||
return 0 //full tile window, you can't move into it!
|
||||
@@ -44,7 +44,7 @@
|
||||
return 1
|
||||
|
||||
/obj/structure/window/CheckExit(atom/movable/O as mob|obj, target as turf)
|
||||
if(istype(O) && O.checkpass(PASSGLASS))
|
||||
if(istype(O) && O.pass_flags & PASSGLASS)
|
||||
return 1
|
||||
if (get_dir(O.loc, target) == dir)
|
||||
return 0
|
||||
|
||||
@@ -46,7 +46,7 @@ var/list/supply_groups = new()
|
||||
layer = 4
|
||||
|
||||
/obj/structure/plasticflaps/CanPass(atom/A, turf/T)
|
||||
if(istype(A) && A.checkpass(PASSGLASS))
|
||||
if(istype(A) && A.pass_flags&PASSGLASS)
|
||||
return prob(60)
|
||||
else if(istype(A, /mob/living)) // You Shall Not Pass!
|
||||
var/mob/living/M = A
|
||||
|
||||
@@ -392,7 +392,7 @@ obj/machinery/computer/forensic_scanning
|
||||
scan_data += "Fibers/Materials Found:<br>"
|
||||
for(var/data in scanning.suit_fibers)
|
||||
scan_data += "- [data]<br>"
|
||||
if(istype(scanning,/obj/item/device/detective_scanner))
|
||||
if(istype(scanning,/obj/item/device/detective_scanner) || (istype(scanning, /obj/item/device/pda) && scanning:cartridge && scanning:cartridge.access_security))
|
||||
scan_data += "<br><b>Data transfered from Scanner to Database.</b><br>"
|
||||
add_data_scanner(scanning)
|
||||
else if(!scanning.fingerprints)
|
||||
@@ -425,12 +425,19 @@ obj/machinery/computer/forensic_scanning
|
||||
return
|
||||
|
||||
|
||||
proc/add_data_scanner(var/obj/item/device/detective_scanner/W)
|
||||
if(W.stored)
|
||||
for(var/atom in W.stored)
|
||||
var/list/data = W.stored[atom]
|
||||
add_data_master(atom,data[1],data[2],data[3],data[4])
|
||||
W.stored = list()
|
||||
proc/add_data_scanner(var/obj/item/device/W)
|
||||
if(istype(W, /obj/item/device/detective_scanner))
|
||||
if(W:stored)
|
||||
for(var/atom in W:stored)
|
||||
var/list/data = W:stored[atom]
|
||||
add_data_master(atom,data[1],data[2],data[3],data[4])
|
||||
W:stored = list()
|
||||
else if(istype(W, /obj/item/device/pda) && W:cartridge && W:cartridge.access_security)
|
||||
if(W:cartridge.stored)
|
||||
for(var/atom in W:cartridge.stored)
|
||||
var/list/data = W:cartridge.stored[atom]
|
||||
add_data_master(atom,data[1],data[2],data[3],data[4])
|
||||
W:cartridge.stored = list()
|
||||
return
|
||||
|
||||
proc/add_data(var/atom/scanned_atom)
|
||||
@@ -446,89 +453,88 @@ obj/machinery/computer/forensic_scanning
|
||||
//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(!atom_fingerprints) //No prints
|
||||
if(!misc)
|
||||
misc = list()
|
||||
var/list/data_entry = misc[atom_reference]
|
||||
if(data_entry)
|
||||
var/list/fibers = data_entry[1]
|
||||
if(!fibers)
|
||||
fibers = list()
|
||||
if(atom_suit_fibers)
|
||||
for(var/j = 1, j <= atom_suit_fibers.len, j++) //Fibers~~~
|
||||
if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
|
||||
fibers += atom_suit_fibers[j]
|
||||
var/list/blood = data_entry[2]
|
||||
if(!blood)
|
||||
blood = list()
|
||||
if(atom_blood_DNA)
|
||||
for(var/main_blood in atom_blood_DNA)
|
||||
if(!blood[main_blood])
|
||||
blood[main_blood] = atom_blood_DNA[blood]
|
||||
return 1
|
||||
if(!misc)
|
||||
misc = list()
|
||||
var/list/data_entry = misc[atom_reference]
|
||||
if(data_entry)
|
||||
var/list/fibers = data_entry[1]
|
||||
if(!fibers)
|
||||
fibers = list()
|
||||
if(atom_suit_fibers)
|
||||
for(var/j = 1, j <= atom_suit_fibers.len, j++) //Fibers~~~
|
||||
if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
|
||||
fibers += atom_suit_fibers[j]
|
||||
var/list/blood = data_entry[2]
|
||||
if(!blood)
|
||||
blood = list()
|
||||
if(atom_blood_DNA)
|
||||
for(var/main_blood in atom_blood_DNA)
|
||||
if(!blood[main_blood])
|
||||
blood[main_blood] = atom_blood_DNA[blood]
|
||||
else
|
||||
var/list/templist[3]
|
||||
templist[1] = atom_suit_fibers
|
||||
templist[2] = atom_blood_DNA
|
||||
templist[3] = atom_name
|
||||
misc[atom_reference] = templist //Store it!
|
||||
return 0
|
||||
//Has prints.
|
||||
if(!files)
|
||||
files = list()
|
||||
for(var/main_print in atom_fingerprints)
|
||||
var/list/data_entry = files[main_print]
|
||||
if(data_entry)//The print is already in here!
|
||||
var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
|
||||
if(internal_atom)
|
||||
//We must be on a roll! Just update what needs to be updated.
|
||||
var/list/internal_prints = internal_atom[1]
|
||||
for(var/print in atom_fingerprints) //Sorry for the double loop! D:
|
||||
var/associated_print = internal_prints[print]
|
||||
var/reference_print = atom_fingerprints[print]
|
||||
if(associated_print && associated_print != reference_print) //It does not match
|
||||
internal_prints[print] = stringmerge(associated_print, reference_print)
|
||||
else if(!associated_print)
|
||||
internal_prints[print] = reference_print
|
||||
//If the main print was updated, lets update the master as well.
|
||||
if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
|
||||
update_fingerprints(main_print, internal_prints[print])
|
||||
//Fibers.
|
||||
var/list/fibers = internal_atom[2]
|
||||
if(!fibers)
|
||||
fibers = list()
|
||||
if(atom_suit_fibers)
|
||||
for(var/j = 1, j < atom_suit_fibers.len, j++) //Fibers~~~
|
||||
if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
|
||||
fibers += atom_suit_fibers[j]
|
||||
//Blood.
|
||||
var/list/blood = internal_atom[3]
|
||||
if(!blood)
|
||||
blood = list()
|
||||
if(atom_blood_DNA)
|
||||
for(var/main_blood in atom_blood_DNA)
|
||||
if(!blood[main_blood])
|
||||
blood[main_blood] = atom_blood_DNA[blood]
|
||||
if(atom_fingerprints)
|
||||
if(!files)
|
||||
files = list()
|
||||
for(var/main_print in atom_fingerprints)
|
||||
data_entry = files[main_print]
|
||||
if(data_entry)//The print is already in here!
|
||||
var/list/internal_atom = data_entry[atom_reference] //Lets see if we can find the current object
|
||||
if(internal_atom)
|
||||
//We must be on a roll! Just update what needs to be updated.
|
||||
var/list/internal_prints = internal_atom[1]
|
||||
for(var/print in atom_fingerprints) //Sorry for the double loop! D:
|
||||
var/associated_print = internal_prints[print]
|
||||
var/reference_print = atom_fingerprints[print]
|
||||
if(associated_print && associated_print != reference_print) //It does not match
|
||||
internal_prints[print] = stringmerge(associated_print, reference_print)
|
||||
else if(!associated_print)
|
||||
internal_prints[print] = reference_print
|
||||
//If the main print was updated, lets update the master as well.
|
||||
if(print == main_print && (!associated_print || (associated_print && associated_print != reference_print)))
|
||||
update_fingerprints(main_print, internal_prints[print])
|
||||
//Fibers.
|
||||
var/list/fibers = internal_atom[2]
|
||||
if(!fibers)
|
||||
fibers = list()
|
||||
if(atom_suit_fibers)
|
||||
for(var/j = 1, j < atom_suit_fibers.len, j++) //Fibers~~~
|
||||
if(!fibers.Find(atom_suit_fibers[j])) //It isn't! Add!
|
||||
fibers += atom_suit_fibers[j]
|
||||
//Blood.
|
||||
var/list/blood = internal_atom[3]
|
||||
if(!blood)
|
||||
blood = list()
|
||||
if(atom_blood_DNA)
|
||||
for(var/main_blood in atom_blood_DNA)
|
||||
if(!blood[main_blood])
|
||||
blood[main_blood] = atom_blood_DNA[blood]
|
||||
|
||||
continue
|
||||
//It's not in there! We gotta add it.
|
||||
update_fingerprints(main_print, atom_fingerprints[main_print])
|
||||
var/list/data_point[4]
|
||||
data_point[1] = atom_fingerprints
|
||||
data_point[2] = atom_suit_fibers
|
||||
data_point[3] = atom_blood_DNA
|
||||
data_point[4] = atom_name
|
||||
data_entry[atom_reference] = data_point
|
||||
continue
|
||||
//It's not in there! We gotta add it.
|
||||
update_fingerprints(main_print, atom_fingerprints[main_print])
|
||||
//No print at all! New data entry, go!
|
||||
var/list/data_point[4]
|
||||
data_point[1] = atom_fingerprints
|
||||
data_point[2] = atom_suit_fibers
|
||||
data_point[3] = atom_blood_DNA
|
||||
data_point[4] = atom_name
|
||||
data_entry[atom_reference] = data_point
|
||||
continue
|
||||
//No print at all! New data entry, go!
|
||||
var/list/data_point[4]
|
||||
data_point[1] = atom_fingerprints
|
||||
data_point[2] = atom_suit_fibers
|
||||
data_point[3] = atom_blood_DNA
|
||||
data_point[4] = atom_name
|
||||
var/list/new_file[1]
|
||||
new_file[1] = atom_fingerprints[main_print]
|
||||
new_file[atom_reference] = data_point
|
||||
files[main_print] = new_file
|
||||
var/list/new_file[1]
|
||||
new_file[1] = atom_fingerprints[main_print]
|
||||
new_file[atom_reference] = data_point
|
||||
files[main_print] = new_file
|
||||
return 1
|
||||
/********************************
|
||||
***END DO NOT DIRECTLY CALL ME***
|
||||
|
||||
@@ -1,19 +1,3 @@
|
||||
/mob/living/Life()
|
||||
|
||||
..()
|
||||
|
||||
// While I'm doing a terriblly lazy way of initalizing things, why don't I make it so people's preferences tag along with them. This could be useful in fixing the fucking cloned-as-unknown thing, making me not have to dynamically load them during tensioner, and of course, storing metadata.
|
||||
//Whoever wrote this should go suck a choad. This was causing runtimes, asshat. IN ADDITION, YOU PUT IT IN THE LIFE PROC YOU ASSHAT
|
||||
// if(!src.storedpreferences)
|
||||
// src.storedpreferences = new
|
||||
// storedpreferences.savefile_load(src, 0)
|
||||
|
||||
|
||||
|
||||
|
||||
return
|
||||
|
||||
|
||||
/mob/living/verb/succumb()
|
||||
set hidden = 1
|
||||
if ((src.health < 0 && src.health > -95.0))
|
||||
|
||||
@@ -64,28 +64,6 @@
|
||||
src << msg
|
||||
return
|
||||
|
||||
// Show a message to all mobs in sight of this one
|
||||
// This would be for visible actions by the src mob
|
||||
// message is the message output to anyone who can see e.g. "[src] does something!"
|
||||
// self_message (optional) is what the src mob sees e.g. "You do something!"
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
|
||||
/mob/visible_message(var/message, var/self_message, var/blind_message)
|
||||
for(var/mob/M in viewers(src))
|
||||
var/msg = message
|
||||
if(self_message && M==src)
|
||||
msg = self_message
|
||||
M.show_message( msg, 1, blind_message, 2)
|
||||
|
||||
// Show a message to all mobs in sight of this atom
|
||||
// Use for objects performing visible actions
|
||||
// message is output to anyone who can see, e.g. "The [src] does something!"
|
||||
// blind_message (optional) is what blind people will hear e.g. "You hear something!"
|
||||
/atom/proc/visible_message(var/message, var/blind_message)
|
||||
for(var/mob/M in viewers(src))
|
||||
M.show_message( message, 1, blind_message, 2)
|
||||
|
||||
|
||||
/mob/proc/findname(msg)
|
||||
for(var/mob/M in world)
|
||||
if (M.real_name == text("[]", msg))
|
||||
@@ -1158,7 +1136,7 @@ note dizziness decrements automatically in the mob's Life() proc.
|
||||
if(!isemptylist(args))
|
||||
for(var/file in args)
|
||||
src << browse_rsc(file)
|
||||
return 1
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user