Merge branch 'incremental_tg' r5200 into bs12_with_tgport

Conflicts:
	baystation12.dme
	code/__HELPERS/global_lists.dm
	code/__HELPERS/type2type.dm
	code/__HELPERS/unsorted.dm
	code/datums/datumvars.dm
	code/datums/disease.dm
	code/datums/organs/organ_external.dm
	code/datums/supplypacks.dm
	code/defines/obj.dm
	code/game/area/areas.dm
	code/game/atoms.dm
	code/game/gamemodes/cult/cult_structures.dm
	code/game/gamemodes/cult/runes.dm
	code/game/gamemodes/events.dm
	code/game/gamemodes/events/ninja_equipment.dm
	code/game/gamemodes/events/space_ninja.dm
	code/game/gamemodes/game_mode.dm
	code/game/gamemodes/gameticker.dm
	code/game/hud.dm
	code/game/jobs/access.dm
	code/game/jobs/job/civilian.dm
	code/game/machinery/alarm.dm
	code/game/machinery/cloning.dm
	code/game/machinery/computer/cloning.dm
	code/game/machinery/computer/medical.dm
	code/game/machinery/computer/syndicate_shuttle.dm
	code/game/machinery/telecomms/broadcaster.dm
	code/game/machinery/telecomms/machine_interactions.dm
	code/game/objects/effects/decals/contraband.dm
	code/game/objects/effects/signs.dm
	code/game/objects/items/devices/PDA/PDA.dm
	code/game/objects/items/devices/PDA/cart.dm
	code/game/objects/items/weapons/photography.dm
	code/game/objects/structures/door_assembly.dm
	code/game/objects/structures/window.dm
	code/game/sound.dm
	code/game/verbs/ooc.dm
	code/global.dm
	code/modules/DetectiveWork/detective_work.dm
	code/modules/DetectiveWork/evidence.dm
	code/modules/DetectiveWork/footprints_and_rag.dm
	code/modules/DetectiveWork/scanner.dm
	code/modules/admin/player_panel.dm
	code/modules/admin/verbs/adminhelp.dm
	code/modules/admin/verbs/adminpm.dm
	code/modules/awaymissions/gateway.dm
	code/modules/client/client defines.dm
	code/modules/client/client procs.dm
	code/modules/client/preferences.dm
	code/modules/clothing/spacesuits/rig.dm
	code/modules/mining/machine_processing.dm
	code/modules/mining/machine_stacking.dm
	code/modules/mining/mint.dm
	code/modules/mining/ores_coins.dm
	code/modules/mining/satchel_ore_boxdm.dm
	code/modules/mob/living/carbon/alien/alien.dm
	code/modules/mob/living/carbon/carbon.dm
	code/modules/mob/living/carbon/carbon_defines.dm
	code/modules/mob/living/carbon/human/human_damage.dm
	code/modules/mob/living/carbon/human/life.dm
	code/modules/mob/living/carbon/human/update_icons.dm
	code/modules/mob/living/living.dm
	code/modules/mob/living/say.dm
	code/modules/mob/mob.dm
	code/modules/mob/mob_cleanup.dm
	code/modules/mob/mob_defines.dm
	code/modules/mob/mob_transformation_simple.dm
	code/modules/mob/new_player/login.dm
	code/modules/mob/new_player/new_player.dm
	code/modules/mob/new_player/preferences_setup.dm
	code/modules/mob/new_player/savefile.dm
	code/modules/mob/new_player/sprite_accessories.dm
	code/modules/paperwork/folders.dm
	code/modules/paperwork/paper.dm
	code/modules/paperwork/photocopier.dm
	code/modules/projectiles/guns/energy/special.dm
	code/modules/projectiles/guns/projectile/automatic.dm
	code/setup.dm
	code/unused/mining/datum_processing_recipe.dm
	code/unused/powerarmor/powerarmor.dm
	code/world.dm
	html/changelog.html
	icons/effects/96x96.dmi
	icons/mob/head.dmi
	icons/mob/items_lefthand.dmi
	icons/mob/items_righthand.dmi
	icons/mob/suit.dmi
	icons/obj/clothing/hats.dmi
	icons/obj/clothing/suits.dmi
	icons/obj/hydroponics.dmi
	icons/obj/items.dmi
	icons/turf/areas.dmi
	icons/turf/walls.dmi
	maps/RandomZLevels/fileList.txt
	maps/RandomZLevels/spacebattle.dmm

Signed-off-by: Cael_Aislinn <cael_aislinn@yahoo.com.au>
This commit is contained in:
Cael_Aislinn
2013-01-07 00:23:22 +10:00
338 changed files with 21863 additions and 19941 deletions
+38 -24
View File
@@ -5,63 +5,78 @@
desc = "An empty evidence bag."
icon = 'icons/obj/storage.dmi'
icon_state = "evidenceobj"
item_state = ""
w_class = 1
/obj/item/weapon/evidencebag/afterattack(obj/item/O, mob/user as mob)
if(!in_range(O,user))
/obj/item/weapon/evidencebag/afterattack(obj/item/I, mob/user as mob)
if(!in_range(I, user))
return
if(istype(O, /obj/item/weapon/storage))
if(!istype(I) || I.anchored == 1)
return ..()
if(!istype(O) || O.anchored == 1)
user << "<span class='notice'>You can't put that inside \the [src]!</span>"
if(istype(I, /obj/item/weapon/storage))
return ..()
if(istype(O, /obj/item/weapon/evidencebag))
if(istype(I, /obj/item/weapon/evidencebag))
user << "<span class='notice'>You find putting an evidence bag in another evidence bag to be slightly absurd.</span>"
return
if(I.w_class > 3)
user << "<span class='notice'>[I] won't fit in [src].</span>"
return
if(contents.len)
user << "<span class='notice'>\The [src] already has something inside it.</span>"
user << "<span class='notice'>[src] already has something inside it.</span>"
return ..()
if(!isturf(O.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
if(istype(O.loc,/obj/item/weapon/storage)) //in a container.
var/obj/item/weapon/storage/U = O.loc
user.client.screen -= O
U.contents.Remove(O)
else if(user.l_hand == O) //in a hand
if(!isturf(I.loc)) //If it isn't on the floor. Do some checks to see if it's in our hands or a box. Otherwise give up.
if(istype(I.loc,/obj/item/weapon/storage)) //in a container.
var/obj/item/weapon/storage/U = I.loc
user.client.screen -= I
U.contents.Remove(I)
else if(user.l_hand == I) //in a hand
user.drop_l_hand()
else if(user.r_hand == O) //in a hand
else if(user.r_hand == I) //in a hand
user.drop_r_hand()
else
return
user.visible_message("\The [user] puts \a [O] into \a [src]", "You put \the [O] inside \the [src].",\
user.visible_message("[user] puts [I] into [src]", "You put [I] inside [src].",\
"You hear a rustle as someone puts something into a plastic bag.")
icon_state = "evidence"
var/image/I = image("icon"=O, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn
underlays += I
desc = "An evidence bag containing \a [O]. [O.desc]"
O.loc = src
w_class = O.w_class
var/xx = I.pixel_x //save the offset of the item
var/yy = I.pixel_y
I.pixel_x = 0 //then remove it so it'll stay within the evidence bag
I.pixel_y = 0
var/image/img = image("icon"=I, "layer"=FLOAT_LAYER) //take a snapshot. (necessary to stop the underlays appearing under our inventory-HUD slots ~Carn
I.pixel_x = xx //and then return it
I.pixel_y = yy
overlays += img
overlays += "evidence" //should look nicer for transparent stuff. not really that important, but hey.
desc = "An evidence bag containing [I]. [I.desc]"
I.loc = src
w_class = I.w_class
return
/obj/item/weapon/evidencebag/attack_self(mob/user as mob)
if (contents.len)
if(contents.len)
var/obj/item/I = contents[1]
user.visible_message("\The [user] takes \a [I] out of \a [src]", "You take \the [I] out of \the [src].",\
user.visible_message("[user] takes [I] out of [src]", "You take [I] out of [src].",\
"You hear someone rustle around in a plastic bag, and remove something.")
underlays = null //remove the underlays
overlays = null //remove the overlays
user.put_in_hands(I)
w_class = 1
icon_state = "evidenceobj"
desc = "An empty evidence bag."
else
user << "\The [src] is empty."
user << "[src] is empty."
icon_state = "evidenceobj"
return
@@ -75,6 +90,5 @@
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/evidencebag(src)
new /obj/item/weapon/f_card(src)
..()
return
+36 -167
View File
@@ -1,158 +1,25 @@
/*
obj/item/clothing/shoes/var
track_blood = 0
mob/living/carbon/human/track_blood_mob
track_blood_type*/
mob/var
bloody_hands = 0
mob/living/carbon/human/bloody_hands_mob
track_blood
mob/living/carbon/human/track_blood_mob
track_blood_type
obj/item/clothing/gloves/var
transfer_blood = 0
mob/living/carbon/human/bloody_hands_mob
/*
obj/effect/decal/cleanable/var
track_amt = 3
mob/blood_owner
/mob
turf/Exited(mob/living/carbon/human/M)
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
if(!istype(src, /turf/space)) // Bloody tracks code starts here
var/dofoot = 1
if(istype(M,/mob/living/simple_animal))
if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
dofoot = 0
var/bloody_hands = 0
var/mob/living/carbon/human/bloody_hands_mob
var/track_blood
var/mob/living/carbon/human/track_blood_mob
var/track_blood_type
if(dofoot)
if(!istype(src, /turf/space)) // Bloody tracks code starts here
if(M.track_blood > 0)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M),M.track_blood_type)
else if(istype(M,/mob/living/carbon/human))
if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = M.shoes
if(S.track_blood > 0)
S.track_blood--
src.add_bloody_footprints(S.track_blood_mob,1,M.dir,S.name,S.track_blood_type) // And bloody tracks end here
. = ..()
turf/Entered(mob/living/carbon/human/M)
if(istype(M,/mob/living) && !istype(M,/mob/living/carbon/metroid))
var/dofoot = 1
if(istype(M,/mob/living/simple_animal))
if(!(istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/constructwraith)))
dofoot = 0
if(dofoot)
if(M.track_blood > 0)
M.track_blood--
src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M),M.track_blood_type)
else if(istype(M,/mob/living/carbon/human))
if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes) && !istype(src,/turf/space))
var/obj/item/clothing/shoes/S = M.shoes
if(S.track_blood > 0)
S.track_blood--
src.add_bloody_footprints(S.track_blood_mob,0,M.dir,S.name,S.track_blood_type)
/obj/item/clothing/gloves
var/transfer_blood = 0
var/mob/living/carbon/human/bloody_hands_mob
for(var/obj/effect/decal/cleanable/B in src)
if(B:track_amt <= 0) continue
if(B.type != /obj/effect/decal/cleanable/blood/tracks)
if(istype(B, /obj/effect/decal/cleanable/xenoblood) || istype(B, /obj/effect/decal/cleanable/blood) || istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
var/track_type = "blood"
if(istype(B, /obj/effect/decal/cleanable/xenoblood))
track_type = "xeno"
else if(istype(B, /obj/effect/decal/cleanable/oil) || istype(B, /obj/effect/decal/cleanable/robot_debris))
track_type = "oil"
/proc/blood_incompatible(donor,receiver)
if(istype(M,/mob/living/carbon/human))
if(M.shoes && istype(M.shoes,/obj/item/clothing/shoes))
var/obj/item/clothing/shoes/S = M.shoes
S.add_blood(B.blood_owner)
S.track_blood_mob = B.blood_owner
S.track_blood = max(S.track_blood,8)
S.track_blood_type = track_type
else
M.add_blood(B.blood_owner)
M.track_blood_mob = B.blood_owner
M.track_blood = max(M.track_blood,rand(4,8))
M.track_blood_type = track_type
B.track_amt--
break
. = ..()
var/donor_antigen = copytext(donor,1,lentext(donor))
var/receiver_antigen = copytext(receiver,1,lentext(receiver))
var/donor_rh = findtext("+",donor)
var/receiver_rh = findtext("+",receiver)
turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info,bloodcolor)
for(var/obj/effect/decal/cleanable/blood/tracks/T in src)
if(T.dir == d && findtext(T.icon_state, bloodcolor))
if((leaving && T.icon_state == "steps2") || (!leaving && T.icon_state == "steps1"))
T.desc = "These bloody footprints appear to have been made by [info]."
if(!T.blood_DNA)
T.blood_DNA = list()
if(istype(M,/mob/living/carbon/human))
T.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
else if(istype(M,/mob/living/carbon/alien))
T.blood_DNA["UNKNOWN DNA"] = "X*"
else if(istype(M,/mob/living/carbon/monkey))
T.blood_DNA["Non-human DNA"] = "A+"
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = 'icons/effects/footprints.dmi'
var/preiconstate = ""
if(info == "animal paws")
preiconstate = "paw"
else if(info == "alien claws")
preiconstate = "claw"
else if(info == "small alien feet")
preiconstate = "paw"
if(leaving)
this.icon_state = "[bloodcolor][preiconstate]2"
else
this.icon_state = "[bloodcolor][preiconstate]1"
this.dir = d
if(bloodcolor == "blood")
this.desc = "These bloody footprints appear to have been made by [info]."
else if(bloodcolor == "xeno")
this.desc = "These acidic bloody footprints appear to have been made by [info]."
else if(bloodcolor == "oil")
this.name = "oil"
this.desc = "These oil footprints appear to have been made by [info]."
if(istype(M,/mob/living/carbon/human))
if(!this.blood_DNA)
this.blood_DNA = list()
this.blood_DNA[M.dna.unique_enzymes] = M.dna.b_type
proc/get_tracks(mob/M)
if(istype(M,/mob/living))
if(istype(M,/mob/living/carbon/human))
. = "human feet"
else if(istype(M,/mob/living/carbon/monkey) || istype(M,/mob/living/simple_animal/cat) || istype(M,/mob/living/simple_animal/corgi) || istype(M,/mob/living/simple_animal/crab))
. = "animal paws"
else if(istype(M,/mob/living/silicon/robot))
. = "robot feet"
else if(istype(M,/mob/living/carbon/alien/humanoid))
. = "alien claws"
else if(istype(M,/mob/living/carbon/alien/larva))
. = "small alien feet"
else
. = "an unknown creature"*/
proc/blood_incompatible(donor,receiver)
var
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
switch(receiver_antigen)
if("A")
@@ -164,6 +31,7 @@ proc/blood_incompatible(donor,receiver)
//AB is a universal receiver.
return 0
/obj/item/weapon/reagent_containers/glass/rag
name = "damp rag"
desc = "For cleaning up messes, you suppose."
@@ -175,26 +43,27 @@ proc/blood_incompatible(donor,receiver)
volume = 5
can_be_placed_into = null
attack(atom/target as obj|turf|area, mob/user as mob , flag)
if(ismob(target) && target.reagents && reagents.total_volume)
user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise")
src.reagents.reaction(target, INGEST)
spawn(5) src.reagents.clear_reagents()
return
else
..()
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(istype(A) && src in user)
user.visible_message("[user] starts to wipe down [A] with [src]!")
if(do_after(user,30))
user.visible_message("[user] finishes wiping off the [A]!")
A.clean_blood()
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
if(ismob(target) && target.reagents && reagents.total_volume)
user.visible_message("\red \The [target] has been smothered with \the [src] by \the [user]!", "\red You smother \the [target] with \the [src]!", "You hear some struggling and muffled cries of surprise")
src.reagents.reaction(target, TOUCH)
spawn(5) src.reagents.clear_reagents()
return
else
..()
examine()
if (!usr)
return
usr << "That's \a [src]."
usr << desc
return
/obj/item/weapon/reagent_containers/glass/rag/afterattack(atom/A as obj|turf|area, mob/user as mob)
if(istype(A) && src in user)
user.visible_message("[user] starts to wipe down [A] with [src]!")
if(do_after(user,30))
user.visible_message("[user] finishes wiping off the [A]!")
A.clean_blood()
return
/obj/item/weapon/reagent_containers/glass/rag/examine()
if (!usr)
return
usr << "That's \a [src]."
usr << desc
return
+107 -112
View File
@@ -1,138 +1,126 @@
//CONTAINS: Detective's Scanner
/obj/item/device/detective_scanner
name = "Scanner"
desc = "Used to scan objects for DNA and fingerprints."
desc = "Used to scan objects for DNA and fingerprints. Can print a report of the findings."
icon_state = "forensic1"
var/amount = 20.0
var/list/stored = list()
w_class = 3.0
item_state = "electronic"
flags = FPRINT | TABLEPASS | CONDUCT | USEDELAY
slot_flags = SLOT_BELT
var/scanning = 0
var/list/log = list()
attackby(obj/item/weapon/f_card/W as obj, mob/user as mob)
..()
if (istype(W, /obj/item/weapon/f_card))
if (W.fingerprints)
return
if (src.amount == 20)
return
if (W.amount + src.amount > 20)
src.amount = 20
W.amount = W.amount + src.amount - 20
/obj/item/device/detective_scanner/attack_self(var/mob/user)
if(log.len && !scanning)
scanning = 1
user << "<span class='notice'>Printing report, please wait...</span>"
spawn(100)
var/obj/item/weapon/paper/P = new(get_turf(src))
P.info = "<center><font size='4'>Scanner Report</font></center><HR><BR>"
P.info += dd_list2text(log, "<BR>")
P.info_links = P.info
user.put_in_hands(P)
log = list()
scanning = 0
if(user)
user << "<span class='notice'>Report printed. Log cleared.<span>"
else
user << "<span class='notice'>The scanner has no logs or is in use.</span>"
/obj/item/device/detective_scanner/attack(mob/living/carbon/human/M as mob, mob/user as mob)
if(!scanning)
scanning = 1
spawn(0)
add_log(user, "<font color='blue'>Scanning [M]...</font>")
if (!ishuman(M))
add_log(user, "<span class='warning'>[M] is not human and cannot have the fingerprints.</span>")
else
src.amount += W.amount
//W = null
del(W)
add_fingerprint(user)
if (W)
W.add_fingerprint(user)
return
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
add_log(user, "<span class='info'>No fingerprints found on [M]</span>")
else
add_log(user, "<span class='info'>Fingerprints found on [M]. Analysing...</span>")
sleep(30)
add_log(user, "<span class='info'>[M]'s Fingerprints: [md5(M.dna.uni_identity)]</span>")
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."
return 0
if (( !( istype(M.dna, /datum/dna) ) || M.gloves) )
user << "\blue No fingerprints found on [M]"
return 0
else
if (src.amount < 1)
user << text("\blue Fingerprints scanned on [M]. Need more cards to print.")
if ( !M.blood_DNA || !M.blood_DNA.len )
add_log(user, "<span class='info'>No blood found on [M]</span>")
if(M.blood_DNA)
del(M.blood_DNA)
else
src.amount--
var/obj/item/weapon/f_card/F = new /obj/item/weapon/f_card( user.loc )
F.amount = 1
F.add_fingerprint(M)
F.icon_state = "fingerprint1"
F.name = text("FPrintC- '[M.name]'")
user << "\blue Done printing."
user << "\blue [M]'s Fingerprints: [md5(M.dna.uni_identity)]"
if ( !M.blood_DNA || !M.blood_DNA.len )
user << "\blue No blood found on [M]"
if(M.blood_DNA)
del(M.blood_DNA)
else
user << "\blue Blood found on [M]. Analysing..."
spawn(15)
add_log(user, "<span class='info'>Blood found on [M]. Analysing...</span>")
sleep(30)
for(var/blood in M.blood_DNA)
user << "\blue Blood type: [M.blood_DNA[blood]]\nDNA: [blood]"
add_log(user, "<span class='info'>Blood type: [M.blood_DNA[blood]]\nDNA: [blood]</span>")
add_log(null, "<font color='blue'>Ending scan report.</font>")
scanning = 0
return
/obj/item/device/detective_scanner/afterattack(atom/A as obj|turf|area, mob/user as mob)
if(!in_range(A,user))
return
if(!isturf(A) && !isobj(A))
return
if(loc != user)
return
afterattack(atom/A as obj|turf|area, mob/user as mob)
if(!in_range(A,user))
return
if(loc != user)
return
if(istype(A,/obj/machinery/computer/forensic_scanning)) //breaks shit.
return
if(istype(A,/obj/item/weapon/f_card))
user << "The scanner displays on the screen: \"ERROR 43: Object on Excluded Object List.\""
return
if(!scanning)
scanning = 1
add_fingerprint(user)
spawn(0)
//Special case for blood splaters.
if (istype(A, /obj/effect/decal/cleanable/blood) || istype(A, /obj/effect/rune))
if(!isnull(A.blood_DNA))
for(var/blood in A.blood_DNA)
user << "\blue Blood type: [A.blood_DNA[blood]]\nDNA: [blood]"
return
//General
if ((!A.fingerprints || !A.fingerprints.len) && !A.suit_fibers && !A.blood_DNA)
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "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
if(add_data(A))
user << "\blue Object already in internal memory. Consolidating data..."
return
//PRINTS
if(!A.fingerprints || !A.fingerprints.len)
if(A.fingerprints)
del(A.fingerprints)
else
user << "\blue Isolated [A.fingerprints.len] fingerprints: Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
var/list/complete_prints = list()
for(var/i in A.fingerprints)
var/print = A.fingerprints[i]
if(stringpercent(print) <= FINGERPRINT_COMPLETE)
complete_prints += print
if(complete_prints.len < 1)
user << "\blue &nbsp;&nbsp;No intact prints found"
add_log(user, "<font color='blue'>Scanning [A]...</font>")
//PRINTS
if(!A.fingerprints || !A.fingerprints.len)
if(A.fingerprints)
del(A.fingerprints)
else
user << "\blue &nbsp;&nbsp;Found [complete_prints.len] intact prints"
for(var/i in complete_prints)
user << "\blue &nbsp;&nbsp;&nbsp;&nbsp;[i]"
var/list/completed_prints = list()
// Bah this looks awful but basically it loop throught the last 15 entries.
for(var/i in A.fingerprints)
var/print = A.fingerprints[i]
completed_prints += print
if(completed_prints.len < 1)
add_log(user, "<span class='info'>No intact prints found</span>")
else
add_log(user, "<span class='info'>Found [completed_prints.len] intact print[completed_prints.len == 1 ? "" : "s"]. Analysing...</span>")
sleep(30)
for(var/i in completed_prints)
add_log(user, "&nbsp;&nbsp;&nbsp;&nbsp;[i]")
//FIBERS
if(A.suit_fibers)
user << "\blue Fibers/Materials Data Stored: Scan with Hi-Res Forensic Scanner to retrieve."
//FIBERS
if(A.suit_fibers && A.suit_fibers.len)
add_log(user, "<span class='info'>Fibers found. Analysing...</span>")
sleep(30)
for(var/fiber in A.suit_fibers)
add_log(user, "&nbsp;&nbsp;&nbsp;&nbsp;[fiber]")
//Blood
if (A.blood_DNA)
user << "\blue Blood found on [A]. Analysing..."
spawn(15)
//Blood
if (A.blood_DNA && A.blood_DNA.len)
add_log(user, "<span class='info'>Blood found. Analysing...</span>")
sleep(30)
for(var/blood in A.blood_DNA)
user << "Blood type: \red [A.blood_DNA[blood]] \t \black DNA: \red [blood]"
if(prob(80) || !A.fingerprints)
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"You finish scanning \the [A].",\
"You hear a faint hum of electrical equipment.")
add_log(user, "&nbsp;&nbsp;&nbsp;&nbsp;Blood type: <font color='red'>[A.blood_DNA[blood]]</font> DNA: <font color='red'>[blood]</font>")
//General
if ((!A.fingerprints || !A.fingerprints.len) && (!A.suit_fibers || !A.suit_fibers.len) && (!A.blood_DNA || !A.blood_DNA.len))
add_log(null, "Unable to locate any fingerprints, materials, fibers, or blood.")
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"<span class='notice'>Unable to locate any fingerprints, materials, fibers, or blood on [A]!</span>",\
"You hear a faint hum of electrical equipment.")
else
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "her"] humming[prob(70) ? " gently." : "."]" ,\
"You finish scanning \the [A].",\
"You hear a faint hum of electrical equipment.")
add_log(null, "<font color='blue'>Ending scan report.</font>")
scanning = 0
return 0
else
user.visible_message("\The [user] scans \the [A] with \a [src], the air around [user.gender == MALE ? "him" : "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)
//I love associative lists.
@@ -169,4 +157,11 @@
sum_list[3] = A.blood_DNA ? A.blood_DNA.Copy() : null
sum_list[4] = "\The [A] in \the [get_area(A)]"
stored["\ref [A]"] = sum_list
return 0
return 0
/obj/item/device/detective_scanner/proc/add_log(var/mob/user, var/msg)
if(scanning)
if(user)
user << msg
log += "<span class='prefix'>[time2text(world.time + 432000, "hh:mm:ss")]</span>:&nbsp;&nbsp;[msg]"
else
CRASH("[src] \ref[src] is adding a log when it was never put in scanning mode!")