diff --git a/code/game/machinery/telecomms/broadcaster.dm b/code/game/machinery/telecomms/broadcaster.dm
index 5b32f3a1f78..707e68225c4 100644
--- a/code/game/machinery/telecomms/broadcaster.dm
+++ b/code/game/machinery/telecomms/broadcaster.dm
@@ -288,6 +288,9 @@ var
if (R.client && R.client.STFU_radio) //Adminning with 80 people on can be fun when you're trying to talk and all you can hear is radios.
continue
+ if(istype(M, /mob/new_player)) // we don't want new players to hear messages. rare but generates runtimes.
+ continue
+
// --- Check for compression ---
if(compression > 0)
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index a9934dd7b78..9e4bf23ab9c 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -58,10 +58,12 @@
for(var/datum/comm_log_entry/C in SelectedServer.log_entries)
i++
- dat += "
[C.name] \[X\]
"
// If the log is a speech file
if(C.input_type == "Speech File")
+
+ dat += "[C.name] \[X\]
"
+
// -- Determine race of orator --
var/race // The actual race of the mob
@@ -113,9 +115,10 @@
dat += "
"
else if(C.input_type == "Execution Error")
- dat += "Data type: [C.input_type]
"
- dat += "Source: Internal server code
"
- dat += "Contents: \"[C.parameters["message"]]\"
"
+
+ dat += "[C.name] \[X\]
"
+ dat += "Output: \"[C.parameters["message"]]\"
"
+ dat += "
"
dat += ""
@@ -192,7 +195,7 @@
var/newnet = input(usr, "Which network do you want to view?", "Comm Monitor", network) as null|text
- if(newnet && usr in range(1, src))
+ if(newnet && ((usr in range(1, src) || issilicon(usr))))
if(length(newnet) > 15)
temp = "- FAILED: NETWORK TAG STRING TOO LENGHTLY -"
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 1014a2b62ea..972c36e9110 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -10,6 +10,7 @@
screen = 0 // the screen number:
list/servers = list() // the servers located by the computer
mob/editingcode
+ mob/lasteditor
list/viewingcode = list()
obj/machinery/telecomms/server/SelectedServer
@@ -49,13 +50,13 @@
showcode = dd_replacetext(storedcode, "\"", "\\\"")
for(var/mob/M in viewingcode)
- if(M.machine == src && M in view(1, src))
+
+ if( (M.machine == src && M in view(1, src) ) || issilicon(M))
winset(M, "tcscode", "is-disabled=true")
winset(M, "tcscode", "text=\"[showcode]\"")
else
- if(!issilicon(M))
- viewingcode.Remove(M)
- winshow(M, "Telecomms IDE", 0) // hide the window!
+ viewingcode.Remove(M)
+ winshow(M, "Telecomms IDE", 0) // hide the window!
sleep(5)
@@ -164,6 +165,7 @@
if(usr in viewingcode) return
if(!editingcode)
+ lasteditor = usr
editingcode = usr
winshow(editingcode, "Telecomms IDE", 1) // show the IDE
winset(editingcode, "tcscode", "is-disabled=false")
diff --git a/code/modules/DetectiveWork/detective_work.dm b/code/modules/DetectiveWork/detective_work.dm
index 7e5b2bcdfb7..b2c22c4ccc9 100644
--- a/code/modules/DetectiveWork/detective_work.dm
+++ b/code/modules/DetectiveWork/detective_work.dm
@@ -219,7 +219,7 @@ obj/machinery/computer/forensic_scanning
temp += "Consolidated data points:
"
for(var/i = 1, i <= files.len, i++)
temp += "{Dossier [i]}
"
- temp += "
{Insert Finger Print Card}
"
+ temp += "
{Insert Finger Print Card (To complete a Dossier)}
"
else
temp = ""
if(misc && misc.len)
@@ -700,63 +700,89 @@ obj/machinery/computer/forensic_scanning
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/blood/var
- track_amt = 2
+obj/effect/decal/cleanable/var
+ track_amt = 3
mob/blood_owner
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
- if(M.track_blood > 0)
- M.track_blood--
- src.add_bloody_footprints(M.track_blood_mob,1,M.dir,get_tracks(M))
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes)
- if(M.shoes.track_blood > 0)
- M.shoes.track_blood--
- src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name) // And bloody tracks end 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
+
+ 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)
+ if(M.shoes.track_blood > 0)
+ M.shoes.track_blood--
+ src.add_bloody_footprints(M.shoes.track_blood_mob,1,M.dir,M.shoes.name,M.shoes.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))
- if(M.track_blood > 0)
- M.track_blood--
- src.add_bloody_footprints(M.track_blood_mob,0,M.dir,get_tracks(M))
- else if(istype(M,/mob/living/carbon/human))
- if(M.shoes && !istype(src,/turf/space))
- if(M.shoes.track_blood > 0)
- M.shoes.track_blood--
- src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name)
+ 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(src,/turf/space))
+ if(M.shoes.track_blood > 0)
+ M.shoes.track_blood--
+ src.add_bloody_footprints(M.shoes.track_blood_mob,0,M.dir,M.shoes.name,M.shoes.track_blood_type)
- for(var/obj/effect/decal/cleanable/blood/B in src)
- if(B.track_amt <= 0) continue
- if(B.type != /obj/effect/decal/cleanable/blood/tracks)
- if(istype(M,/mob/living/carbon/human))
- if(M.shoes)
- M.shoes.add_blood(B.blood_owner)
- M.shoes.track_blood_mob = B.blood_owner
- M.shoes.track_blood = max(M.shoes.track_blood,8)
- else
- M.add_blood(B.blood_owner)
- M.track_blood_mob = B.blood_owner
- M.track_blood = max(M.track_blood,rand(4,8))
- B.track_amt--
- break
+ 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"
+
+ if(istype(M,/mob/living/carbon/human))
+ if(M.shoes)
+ M.shoes.add_blood(B.blood_owner)
+ M.shoes.track_blood_mob = B.blood_owner
+ M.shoes.track_blood = max(M.shoes.track_blood,8)
+ M.shoes.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
. = ..()
-turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
+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)
+ if(T.dir == d && findtext(T.icon, 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)
@@ -770,12 +796,29 @@ turf/proc/add_bloody_footprints(mob/living/carbon/human/M,leaving,d,info)
return
var/obj/effect/decal/cleanable/blood/tracks/this = new(src)
this.icon = '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 = "blood2"
+ this.icon_state = "[bloodcolor][preiconstate]2"
else
- this.icon_state = "blood1"
+ this.icon_state = "[bloodcolor][preiconstate]1"
this.dir = d
- this.desc = "These bloody footprints appear to have been made by [info]."
+
+ 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.desc = "These oil footprints appear to have been made by [info]."
+
if(istype(M,/mob/living/carbon/human))
if(this.blood_DNA.len)
this.blood_DNA.len++
@@ -787,15 +830,18 @@ 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))
- . = "monkey paws"
+ 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))
+ 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))
diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm
index 4279085a460..6fbfe0db907 100644
--- a/code/modules/mob/living/carbon/human/life.dm
+++ b/code/modules/mob/living/carbon/human/life.dm
@@ -962,7 +962,8 @@
lying = 1
stat = 0
if (paralysis > 0)
- handle_dreams()
+ if(sleeping > 0)
+ handle_dreams()
AdjustParalysis(-1)
blinded = 1
lying = 1
diff --git a/icons/effects/footprints.dmi b/icons/effects/footprints.dmi
index 61d86aaa16b..ede9c8e17d6 100644
Binary files a/icons/effects/footprints.dmi and b/icons/effects/footprints.dmi differ