Memory Expansion! New memories, and prisoners are tattoo'd to the degree of their crime. (#72457)

## About The Pull Request

### New Memories

- Added a memory for catching a fish
- Added a memory of who turned you into a revolutionary, this might be
very cool later on for mindreading purposes
- Added a memory for infusing with something

### Prisoner Tats

- Prisoner backgrounds now come with a certain amount of tattoos
depending on what you did. Negligence? Zero tats.
<details>
  <summary>Mass Murderer?</summary>

  BECOME
  https://youtu.be/7xUtZzLBV5c?t=73

</details>
- Because I wanted someone covered head to toe in tats, there is now a
"Mass Murderer" background that comes with 6 tattoos, one for each limb.

## Why It's Good For The Game
## Changelog
🆑
add: Some prisoner backgrounds have more or less tattoos.
add: More Memories to collect involving fishing and getting converted
/🆑
This commit is contained in:
tralezab
2023-01-13 20:11:08 +00:00
committed by GitHub
parent 4d6eadabad
commit 7795faec8a
7 changed files with 240 additions and 32 deletions
-24
View File
@@ -192,30 +192,6 @@ GLOBAL_LIST_INIT(security_depts_prefs, sort_list(list(
SEC_DEPT_SUPPLY,
)))
/// Types of Crimes Prisoners will have on their record roundstart.
/// (They also can choose Random, which picks from these options... randomly!)
GLOBAL_LIST_INIT(prisoner_crimes, list(
"Abhorrent Criminal Negligence" = "Incompetently risked numerous lives.",
"Attempted Development of Cloning" = "Attempted illegal research in the cloning sphere. Cloning, cloning construction, and cloning-related R&D was outlawed in 2560.",
"Attempted Murder" = "Attempted to maliciously kill someone.",
"Biological Terrorism" = "Created and or released a lethal biological agent/lifeform.",
"Classified" = "Consult Legal.",
"Corporate Espionage" = "Conducted espionage against Nanotrasen for commercial purposes.",
"Counterfeiting" = "Engaged in widespread fraud.",
"Enemy of the Corporation" = "Acted as, or knowingly aided, an enemy of Nanotrasen.",
"Grand Sabotage" = "Engaged in malicious destructive actions, seriously threatening Nanotrasen employees and or infrastructure.",
"Grand Theft" = "Stole items of high value or sensitive nature.",
"Identity Theft of High-Ranking Figure" = "Impersonated a high-ranking figure.",
"Kidnapping" = "Planned and executed a kidnapping.",
"Medical Malpractice" = "Engaged in organ harvesting, limb theft, or other malicious medical procedures.",
"Murder" = "Maliciously killed someone.",
"Mutiny" = "Attempted to overthrow/subvert Chain of Command.",
"Other" = "Consult Legal.",
"Tampering of Artificial Intelligence" = "Uploaded malicious, negligent, or otherwise blacklisted directives to an Artificial Intelligence.",
"Tax Evasion" = "Outstanding amount of tax evasion.",
"Worship of Blacklisted Deities" = "Practiced worship of blacklisted deities.",
))
//Backpacks
#define DBACKPACK "Department Backpack"
#define DDUFFELBAG "Department Duffel Bag"
+2
View File
@@ -59,4 +59,6 @@
/datum/component/fishing_spot/proc/fishing_completed(datum/fishing_challenge/source, mob/user, success, perfect)
if(success)
var/obj/item/fish/caught = source.reward_path
user.add_mob_memory(/datum/memory/caught_fish, protagonist = user, deuteragonist = initial(caught.name))
fish_source.dispense_reward(source.reward_path, user)
+96
View File
@@ -818,3 +818,99 @@
"[protagonist_name] helping up [deuteragonist_name]",
"[deuteragonist_name] taking the hand offered graciously by [protagonist_name] to get up",
)
/// Catching a fish
/datum/memory/caught_fish
story_value = STORY_VALUE_OKAY
/datum/memory/caught_fish/get_names()
return list(
"[protagonist_name] catching an absolute honker.",
"[protagonist_name] caught a [deuteragonist_name].",
)
/datum/memory/caught_fish/get_starts()
return list(
"[protagonist_name] reels in the line",
"[protagonist_name]'s eye glints, and they begin reeling",
"in a fishing trance, [protagonist_name] catches something",
"[protagonist_name] begins battle with a fish",
"a whole lot of fishing going on",
)
/datum/memory/caught_fish/get_moods()
return list(
"[protagonist_name] [mood_verb] as a [deuteragonist_name] flies out of the water!",
"[protagonist_name] [mood_verb] as they catch a [deuteragonist_name]!",
"[protagonist_name] [mood_verb] as they pose holding a [deuteragonist_name]!",
)
/datum/memory/caught_fish/get_sad_moods()
return list("partakes in therapy fishing")
/// Becoming a mutant via infusion
/datum/memory/dna_infusion
story_value = STORY_VALUE_MEH
///describing what they turn into, "skittish", "nomadic", etc
var/mutantlike
/datum/memory/dna_infusion/New(
datum/mind/memorizer_mind,
atom/protagonist,
atom/deuteragonist,
atom/antagonist,
mutantlike,
)
src.mutantlike = mutantlike
return ..()
/datum/memory/dna_infusion/get_names()
return list(
"[protagonist_name] infusing with a [deuteragonist_name].",
"[protagonist_name] infusing a [deuteragonist_name] into themselves.",
)
/datum/memory/dna_infusion/get_starts()
return list(
"[protagonist_name] enters a creepy DNA machine",
"[protagonist_name]'s partakes in some mad science",
"the DNA infuser closes with [protagonist_name] inside",
"a [deuteragonist_name] is in the infusion slot"
)
/datum/memory/dna_infusion/get_moods()
return list(
"[protagonist_name] [mood_verb] as they infuse with a [deuteragonist_name]!",
"[protagonist_name] [mood_verb] as they become one the [deuteragonist_name].",
"[protagonist_name] [mood_verb] as their DNA has [deuteragonist_name] folded into it.",
"[protagonist_name] becomes more [mutantlike] as they infuse with a [deuteragonist_name]!",
"[protagonist_name] becomes more [mutantlike] as they become one the [deuteragonist_name].",
"[protagonist_name] becomes more [mutantlike] as their DNA has [deuteragonist_name] folded into it.",
)
/datum/memory/dna_infusion/get_happy_moods()
return list(
"endures the pain for science",
"confidently winces through the pain"
)
/datum/memory/dna_infusion/get_neutral_moods()
return list(
"screams with pain",
"begins to have second thoughts"
)
/datum/memory/dna_infusion/get_sad_moods()
return list("bitterly rejects their humanity")
/// Who rev'd me, so if a mindreader reads a rev, they have a clue on who to hunt down
/datum/memory/recruited_by_headrev
/datum/memory/recruited_by_headrev/get_names()
return list("[protagonist_name] is converted into a revolutionary by [antagonist_name]")
/datum/memory/recruited_by_headrev/get_starts()
return list(
"[protagonist_name]'s mind sets itself on a singular, violent purpose as they're flashed by [antagonist_name]: Kill the heads.",
"[antagonist_name] lifts an odd device to [protagonist_name]'s eyes and flashes him, imprinting murderous instructions.",
)
@@ -71,6 +71,7 @@
playsound(src, 'sound/machines/blender.ogg', 50, TRUE)
to_chat(hoccupant, span_danger("Little needles repeatedly prick you! And with each prick, you feel yourself becoming more... [infusing_into.infusion_desc]?"))
hoccupant.take_overall_damage(10)
hoccupant.add_mob_memory(/datum/memory/dna_infusion, protagonist = hoccupant, deuteragonist = infusing_from, mutantlike = infusing_into.infusion_desc)
Shake(15, 15, INFUSING_TIME)
addtimer(CALLBACK(occupant, TYPE_PROC_REF(/mob, emote), "scream"), INFUSING_TIME - 1 SECONDS)
addtimer(CALLBACK(src, PROC_REF(end_infuse)), INFUSING_TIME)
@@ -233,6 +233,7 @@
rev_mind.current.flash_act(1, 1)
rev_mind.current.Stun(10 SECONDS)
rev_mind.add_memory(/datum/memory/recruited_by_headrev, protagonist = rev_mind.current, antagonist = owner.current)
rev_mind.add_antag_datum(/datum/antagonist/rev,rev_team)
rev_mind.special_role = ROLE_REV
return TRUE
@@ -18,3 +18,128 @@
return FALSE
return istype(preferences.get_highest_priority_job(), /datum/job/prisoner)
/// Types of Crimes Prisoners will have on their record roundstart.
/// (They also can choose Random, which picks from these options... randomly!)
GLOBAL_LIST_INIT(prisoner_crimes, init_prisoner_crimes())
/proc/init_prisoner_crimes()
var/list/instances = list()
for(var/datum/prisoner_crime/crime as anything in subtypesof(/datum/prisoner_crime))
crime = new crime()
instances[crime.name] = crime
return instances
/datum/prisoner_crime
/// crime name
var/name = "Bugged the Game"
/// what the record will say about the crime
var/desc = "Engaged in widespread gamebreaking, didn't report on Github. By the way, report this on Github!"
/// how many tattoos come from the crime. People who committed murder have more than tax evaders!
var/tattoos = -1
/datum/prisoner_crime/New()
. = ..()
if(tattoos == -1)
tattoos = 1
stack_trace("\"[src]\" prisoner_crime does not have a set amount of tattoos!")
/datum/prisoner_crime/negligence
name = "Abhorrent Criminal Negligence"
desc = "Incompetently risked numerous lives."
tattoos = 0
/datum/prisoner_crime/cloning
name = "Attempted Development of Cloning"
desc = "Attempted illegal research in the cloning sphere. Cloning, cloning construction, and cloning-related R&D was outlawed in 2560."
tattoos = 0
/datum/prisoner_crime/attempted_murder
name = "Attempted Murder"
desc = "Attempted to maliciously kill someone."
tattoos = 2
/datum/prisoner_crime/bio_terrorism
name = "Biological Terrorism"
desc = "Created and or released a lethal biological agent/lifeform."
tattoos = 3
/datum/prisoner_crime/classified
name = "Classified"
desc = "Consult Legal."
tattoos = 0
/datum/prisoner_crime/espionage
name = "Corporate Espionage"
desc = "Conducted espionage against Nanotrasen for commercial purposes."
tattoos = 1
/datum/prisoner_crime/counterfeiting
name = "Counterfeiting"
desc = "Engaged in widespread fraud."
tattoos = 1
/datum/prisoner_crime/enemy_of_the_corp
name = "Enemy of the Corporation"
desc = "Acted as, or knowingly aided, an enemy of Nanotrasen."
tattoos = 1
/datum/prisoner_crime/grand_sabo
name = "Grand Sabotage"
desc = "Engaged in malicious destructive actions, seriously threatening Nanotrasen employees and or infrastructure."
tattoos = 2
/datum/prisoner_crime/grand_theft
name = "Grand Theft"
desc = "Stole items of high value or sensitive nature."
tattoos = 1
/datum/prisoner_crime/identity_theft
name = "Identity Theft of High-Ranking Figure"
desc = "Impersonated a high-ranking figure."
tattoos = 0 //well, obviously can't impersonate people with tats. if they want to go back to doing that
/datum/prisoner_crime/kidnapping
name = "Kidnapping"
desc = "Planned and executed a kidnapping."
tattoos = 1
/datum/prisoner_crime/malpractice
name = "Medical Malpractice"
desc = "Engaged in organ harvesting, limb theft, or other malicious medical procedures."
tattoos = 2
/datum/prisoner_crime/murder
name = "Murder"
desc = "Maliciously killed someone."
tattoos = 3
/datum/prisoner_crime/mutiny
name = "Mutiny"
desc = "Attempted to overthrow/subvert Chain of Command."
tattoos = 5 //+rep for trying
/datum/prisoner_crime/other
name = "Other"
desc = "Consult Legal."
tattoos = 1
/datum/prisoner_crime/ai_tampering
name = "Tampering of Artificial Intelligence"
desc = "Uploaded malicious, negligent, or otherwise blacklisted directives to an Artificial Intelligence."
tattoos = 3
/datum/prisoner_crime/tax_evasion
name = "Tax Evasion"
desc = "Outstanding amount of tax evasion."
tattoos = 1
/datum/prisoner_crime/cultist
name = "Worship of Blacklisted Deities"
desc = "Practiced worship of blacklisted deities."
tattoos = 1
/datum/prisoner_crime/mass_murder
name = "Mass Murder"
desc = "Maliciously planned and executed the slaughter of many people."
tattoos = 6
+15 -8
View File
@@ -39,10 +39,10 @@
return
if(crime_name == "Random")
crime_name = pick(assoc_to_keys(GLOB.prisoner_crimes))
var/datum/prisoner_crime/crime = GLOB.prisoner_crimes[crime_name]
var/datum/data/record/target_record = find_record("name", crewmember.real_name, GLOB.data_core.security)
var/crime_desc = GLOB.prisoner_crimes[crime_name]
target_record.fields["criminal"] = "Incarcerated"
var/datum/data/crime/past_crime = GLOB.data_core.createCrimeEntry(crime_name, crime_desc, "Central Command", "Indefinite.")
var/datum/data/crime/past_crime = GLOB.data_core.createCrimeEntry(crime.name, crime.desc, "Central Command", "Indefinite.")
GLOB.data_core.addCrime(target_record.fields["id"], past_crime)
to_chat(crewmember, span_warning("You are imprisoned for \"[crime_name]\"."))
@@ -64,9 +64,16 @@
/datum/outfit/job/prisoner/post_equip(mob/living/carbon/human/new_prisoner, visualsOnly)
. = ..()
if(!length(SSpersistence.prison_tattoos_to_use) || visualsOnly)
var/crime_name = new_prisoner.client?.prefs?.read_preference(/datum/preference/choiced/prisoner_crime)
if(!crime_name)
return
var/obj/item/bodypart/tatted_limb = pick(new_prisoner.bodyparts)
var/list/tattoo = pick(SSpersistence.prison_tattoos_to_use)
tatted_limb.AddComponent(/datum/component/tattoo, tattoo["story"])
SSpersistence.prison_tattoos_to_use -= tattoo
var/datum/prisoner_crime/crime = GLOB.prisoner_crimes[crime_name]
var/list/limbs_to_tat = new_prisoner.bodyparts.Copy()
for(var/i in 1 to crime.tattoos)
if(!length(SSpersistence.prison_tattoos_to_use) || visualsOnly)
return
var/obj/item/bodypart/tatted_limb = pick_n_take(limbs_to_tat)
var/list/tattoo = pick_n_take(SSpersistence.prison_tattoos_to_use)
tatted_limb.AddComponent(/datum/component/tattoo, tattoo["story"])