Files
Bubberstation/code/datums/records/record.dm
Return b5aa4f649b [Records rework] Creates defaults for all records (#4614)
## About The Pull Request
This PR does four things:
- Shortens and simplifies the medical records template, making it more
accessible
- Expands Security records flavor into a personnel file that includes
exploitables and your character's background, so that you can have
Security records without having a criminal history
- Creates defaults for medical records, general records, and Security
records in the character creator, rather than just the wiki.
- Removes exploitables and background records as they've now been
integrated into Security records.

## Why It's Good For The Game
This PR should make records more accessible for individual players by
reducing the amount of work involved, as well as expanding Security
records to be more useful.

## Proof Of Testing
<img width="656" height="494" alt="image"
src="https://github.com/user-attachments/assets/2b5455b2-0e73-4e0a-b9c8-fd278db85040"
/>

## Changelog

🆑 ReturnToZender (code)
add: All records now have enhanced defaults when making a new character 
add: Security records have been expanded into personnel records,
containing more information on your character
del: Exploitables and Background records have been merged into the
definition of Security records, which are now Personnel Records.
/🆑
2025-09-14 22:54:46 +03:00

344 lines
11 KiB
Plaintext

/**
* Record datum. Used for crew records and admin locked records.
*/
/datum/record
/// Age of the character
var/age
/// Their blood type
var/blood_type
/// Character appearance
var/mutable_appearance/character_appearance
/// DNA string
var/dna_string
/// Fingerprint string (md5)
var/fingerprint
/// The character's gender
var/gender
/// The character's initial rank at roundstart
var/initial_rank
/// The character's name
var/name = "Unknown"
/// The character's rank
var/rank
/// The character's species
var/species
/// The character's ID trim
var/trim
/// The character's voice, if they have one.
var/voice
/datum/record/New(
age = 18,
chrono_age = 18, // SKYRAT EDIT ADDITION - Chronological age
blood_type = "?",
character_appearance,
dna_string = "Unknown",
fingerprint = "?????",
gender = "Other",
initial_rank = "Unassigned",
name = "Unknown",
rank = "Unassigned",
species = "Human",
trim = "Unassigned",
voice = "?????",
)
src.age = age
src.chrono_age = chrono_age // SKYRAT EDIT ADDITION - Chronological age
src.blood_type = blood_type
src.character_appearance = character_appearance
src.dna_string = dna_string
src.fingerprint = fingerprint
src.gender = gender
src.initial_rank = rank
src.name = name
src.rank = rank
src.species = species
src.trim = trim
/**
* Crew record datum
*/
/datum/record/crew
/// List of citations
var/list/citations = list()
/// List of crimes
var/list/crimes = list()
/// Unique ID generated that is used to fetch lock record
var/lock_ref
/// Names of major disabilities
var/major_disabilities
/// Fancy description of major disabilities
var/major_disabilities_desc
/// List of medical notes
var/list/medical_notes = list()
/// Names of minor disabilities
var/minor_disabilities
/// Fancy description of minor disabilities
var/minor_disabilities_desc
/// Physical status of this person in medical records.
var/physical_status
/// Mental status of this person in medical records.
var/mental_status
/// Positive and neutral quirk strings
var/quirk_notes
/// Security note
var/security_note
/// Current arrest status
var/wanted_status = WANTED_NONE
///Photo used for records, which we store here so we don't have to constantly make more of.
var/list/obj/item/photo/record_photos
/datum/record/crew/New(
age = 18,
chrono_age = 18, // SKYRAT EDIT ADDITION - Chronological age
blood_type = "?",
character_appearance,
dna_string = "Unknown",
fingerprint = "?????",
gender = "Other",
initial_rank = "Unassigned",
name = "Unknown",
rank = "Unassigned",
species = "Human",
trim = "Unassigned",
/// Crew specific
lock_ref,
major_disabilities = "None",
major_disabilities_desc = "No disabilities have been diagnosed at the moment.",
minor_disabilities = "None",
minor_disabilities_desc = "No disabilities have been diagnosed at the moment.",
physical_status = PHYSICAL_ACTIVE,
mental_status = MENTAL_STABLE,
quirk_notes,
// SKYRAT EDIT START - RP Records
past_general_records = "",
past_medical_records = "",
past_security_records = "",
// SKYRAT EDIT END
)
. = ..()
src.lock_ref = lock_ref
src.major_disabilities = major_disabilities
src.major_disabilities_desc = major_disabilities_desc
src.minor_disabilities = minor_disabilities
src.minor_disabilities_desc = minor_disabilities_desc
src.physical_status = physical_status
src.mental_status = mental_status
src.quirk_notes = quirk_notes
// SKYRAT EDIT START - RP Records
src.past_general_records = past_general_records
src.past_medical_records = past_medical_records
src.past_security_records = past_security_records
// SKYRAT EDIT END
GLOB.manifest.general += src
/datum/record/crew/Destroy()
GLOB.manifest.general -= src
QDEL_LAZYLIST(record_photos)
return ..()
/**
* Admin locked record
*/
/datum/record/locked
/// Mob's dna
var/datum/dna/locked_dna
/// Mind datum
var/datum/weakref/mind_ref
/// Typepath of species used by player, for usage in respawning via records
var/species_type
/datum/record/locked/New(
age = 18,
chrono_age = 18, // SKYRAT EDIT ADDITION - Chronological age
blood_type = "?",
character_appearance,
dna_string = "Unknown",
fingerprint = "?????",
gender = "Other",
initial_rank = "Unassigned",
name = "Unknown",
rank = "Unassigned",
species = "Human",
trim = "Unassigned",
/// Locked specific
datum/dna/locked_dna,
datum/mind/mind_ref,
// BUBBER EDIT BEGIN - Records
exploitable_information = "",
)
. = ..()
src.locked_dna = locked_dna
src.mind_ref = WEAKREF(mind_ref)
species_type = locked_dna.species.type
GLOB.manifest.locked += src
// BUBBER EDIT BEGIN - Records
src.exploitable_information = exploitable_information
// BUBBER EDIT END
/datum/record/locked/Destroy()
GLOB.manifest.locked -= src
return ..()
/// A helper proc to get the front photo of a character from the record.
/// Handles calling `get_photo()`, read its documentation for more information.
/datum/record/crew/proc/get_front_photo()
return get_photo("photo_front", SOUTH)
/// A helper proc to get the side photo of a character from the record.
/// Handles calling `get_photo()`, read its documentation for more information.
/datum/record/crew/proc/get_side_photo()
return get_photo("photo_side", WEST)
/// A helper proc to recreate all photos of a character from the record.
/datum/record/crew/proc/recreate_manifest_photos(add_height_chart)
delete_photos("photo_front")
make_photo("photo_front", SOUTH, add_height_chart)
delete_photos("photo_side")
make_photo("photo_side", WEST, add_height_chart)
///Deletes the existing photo for field_name
/datum/record/crew/proc/delete_photos(field_name)
var/obj/item/photo/existing_photo = LAZYACCESS(record_photos, field_name)
if(existing_photo)
qdel(existing_photo)
LAZYREMOVE(record_photos, field_name)
/**
* You shouldn't be calling this directly, use `get_front_photo()` or `get_side_photo()`
* instead.
*
* This is the proc that handles either fetching (if it was already generated before) or
* generating (if it wasn't) the specified photo from the specified record. This is only
* intended to be used by records that used to try to access `fields["photo_front"]` or
* `fields["photo_side"]`, and will return an empty icon if there isn't any of the necessary
* fields.
*
* Arguments:
* * field_name - The name of the key in the `fields` list, of the record itself.
* * orientation - The direction in which you want the character appearance to be rotated
* in the outputed photo.
*
* Returns an empty `/icon` if there was no `character_appearance` entry in the `fields` list,
* returns the generated/cached photo otherwise.
*/
/datum/record/crew/proc/get_photo(field_name, orientation = SOUTH)
if(!field_name)
return
if(!character_appearance)
return new /icon()
var/obj/item/photo/existing_photo = LAZYACCESS(record_photos, field_name)
if(!existing_photo)
existing_photo = make_photo(field_name, orientation)
return existing_photo
/**
* make_photo
*
* Called if the person doesn't already have a photo, this will make a photo of the person,
* then make a picture out of it, then finally create a new photo.
*/
/datum/record/crew/proc/make_photo(field_name, orientation, add_height_chart)
var/icon/picture_image
if(!isicon(character_appearance))
var/mutable_appearance/appearance = character_appearance
appearance.setDir(orientation)
if(add_height_chart)
appearance.underlays += mutable_appearance('icons/obj/machines/photobooth.dmi', "height_chart", alpha = 125, appearance_flags = RESET_ALPHA|RESET_COLOR|RESET_TRANSFORM|KEEP_APART)
picture_image = getFlatIcon(appearance)
else
picture_image = character_appearance
var/datum/picture/picture = new
picture.picture_name = name
picture.picture_desc = "This is [name]."
picture.picture_image = picture_image
var/obj/item/photo/new_photo = new(null, picture)
LAZYSET(record_photos, field_name, new_photo)
return new_photo
/// Returns a paper printout of the current record's crime data.
/datum/record/crew/proc/get_rapsheet(alias, header = "Rapsheet", description = "No further details.")
var/print_count = ++GLOB.manifest.print_count
var/obj/item/paper/printed_paper = new
var/final_paper_text = "<center><b>SR-[print_count]: [header]</b></center><br>"
final_paper_text += "Name: [name]<br>Gender: [gender]<br>Age: [age]<br>"
final_paper_text += "Chronological Age: [chrono_age]<br>" // SKYRAT EDIT ADDITION - Chronological age
if(alias != name)
final_paper_text += "Alias: [alias]<br>"
final_paper_text += "Species: [species]<br>Fingerprint: [fingerprint]<br>Wanted Status: [wanted_status]<br><br>"
//SKYRAT EDIT ADD - RP RECORDS
if(past_general_records != "")
final_paper_text += "<br><B>General Records:</B>"
final_paper_text += "<br>[past_general_records]<br>"
//SKYRAT EDIT ADD END
final_paper_text += "<center><B>Security Data</B></center><br><br>"
//SKYRAT EDIT ADDITION START - RP RECORDS
if(past_security_records != "")
final_paper_text += "<B>Security Records:</B>"
final_paper_text += "<br>[past_security_records]<br>"
//SKYRAT EDIT END
final_paper_text += "Crimes:<br>"
final_paper_text += {"<table style="text-align:center;" border="1" cellspacing="0" width="100%">
<tr>
<th>Crime</th>
<th>Details</th>
<th>Author</th>
<th>Time Added</th>
</tr>"}
for(var/datum/crime/crime in crimes)
if(crime.valid)
final_paper_text += "<tr><td>[crime.name]</td>"
final_paper_text += "<td>[crime.details]</td>"
final_paper_text += "<td>[crime.author]</td>"
final_paper_text += "<td>[crime.time]</td>"
else
for(var/i in 1 to 4)
final_paper_text += "<td>--REDACTED--</td>"
final_paper_text += "</tr>"
final_paper_text += "</table><br><br>"
final_paper_text += "Citations:<br>"
final_paper_text += {"<table style="text-align:center;" border="1" cellspacing="0" width="100%">
<tr>
<th>Citation</th>
<th>Details</th>
<th>Author</th>
<th>Time Added</th>
<th>Fine</th>
</tr><br>"}
for(var/datum/crime/citation/warrant in citations)
final_paper_text += "<tr><td>[warrant.name]</td>"
final_paper_text += "<td>[warrant.details]</td>"
final_paper_text += "<td>[warrant.author]</td>"
final_paper_text += "<td>[warrant.time]</td>"
final_paper_text += "<td>[warrant.fine]</td>"
final_paper_text += "</tr>"
final_paper_text += "</table><br><br>"
final_paper_text += "<center>Important Notes:</center><br>"
if(security_note)
final_paper_text += "- [security_note]<br>"
if(description)
final_paper_text += "- [description]<br>"
printed_paper.name = "SR-[print_count] '[name]'"
/// SKYRAT EDIT ADD - TRUE
printed_paper.add_raw_text(final_paper_text,TRUE)
/// SKYRAT EDIT ADD END
printed_paper.update_appearance()
return printed_paper