The Case Dossier program (#22703)

This adds the case dossier program. A program intended for investigators
to use for their cases, with the ability to record evidence, photos,
documents, people and their notes on a case. The rest of security is
able to view cases in the program, but not edit them.
Additionally, the forensic skill was added to evidence bags and photos,
allowing a person to add the time, place and the person using them,
mainly intended to be used with the case dossier program.
Fibers and prints can now be gathered from objects inside evidence bags,
to avoid contamination.
Also fixed some bugs with taking photos of certain objects, such as
airlocks.


https://github.com/user-attachments/assets/92a880e9-9032-46d4-88c0-43d45b64f979
This commit is contained in:
Casper3667
2026-06-19 04:36:07 +00:00
committed by GitHub
parent 7d6d45fae1
commit 7a99813dd0
20 changed files with 3671 additions and 24 deletions
+38 -4
View File
@@ -26,7 +26,7 @@
/********
* photo *
********/
GLOBAL_VAR_INIT(photo_count, 0)
GLOBAL_VAR_INIT(photo_count, 1)
/obj/item/photo
name = "photo"
@@ -35,12 +35,26 @@ GLOBAL_VAR_INIT(photo_count, 0)
icon_state = "photo"
item_state = "paper"
w_class = WEIGHT_CLASS_TINY
var/picture_desc // Who and/or what's in the picture.
/// Who and/or what's in the picture.
var/picture_desc
/// The photo's id
var/id
var/icon/img //Big photo image
var/scribble //Scribble on the back.
/// Big photo image
var/icon/img
/// Scribble on the back.
var/scribble
/// The small size of the photo used for the icon
var/icon/tiny
/// The size of the photo
var/photo_size = 3
/// The time the photo was taken
var/time_taken
/// The place the photo was taken
var/location_taken
/// Who took the photo
var/taken_by
/// The photo's name/caption
var/caption
drop_sound = 'sound/items/drop/paper.ogg'
pickup_sound = 'sound/items/pickup/paper.ogg'
@@ -95,8 +109,10 @@ GLOBAL_VAR_INIT(photo_count, 0)
if(surface_atom == usr || surface_atom.Adjacent(usr))
if(n_name)
name = "[initial(name)] ([n_name])"
caption = n_name
else
name = initial(name)
caption = null
add_fingerprint(usr)
@@ -238,6 +254,12 @@ GLOBAL_VAR_INIT(photo_count, 0)
desc = "A one use - polaroid camera."
pictures_left = 30
// Detective cameras have build in data recording, so no need for a skill check
/obj/item/camera/detective/record_data(mob/living/user, obj/item/photo/pic)
pic.time_taken = worldtime2text()
pic.location_taken = get_area_display_name(get_area(user))
pic.taken_by = user.name
//Proc for capturing check
/mob/living/proc/can_capture_turf(turf/T)
return TRUE // DVIEW will do sanity checks, we've got no special checks.
@@ -288,9 +310,21 @@ GLOBAL_VAR_INIT(photo_count, 0)
p.pixel_x = rand(-10, 10)
p.pixel_y = rand(-10, 10)
p.photo_size = size
record_data(user, p)
return p
/// Data recorded on photos.
/obj/item/camera/proc/record_data(mob/living/user, obj/item/photo/pic)
var/forensic = GET_SKILL_LEVEL(user, FORENSICS_SKILL_COMPONENT)
forensic = forensic ? forensic : SKILL_LEVEL_TRAINED
// Trained people would know to add this data
if(forensic >= SKILL_LEVEL_FAMILIAR)
pic.time_taken = worldtime2text()
pic.location_taken = get_area_display_name(get_area(user))
pic.taken_by = user.name
/obj/item/camera/proc/printpicture(mob/user, obj/item/photo/p)
p.forceMove(user.loc)
if(!user.get_inactive_hand())