diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index a24be427594..2eddf0724ae 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -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" diff --git a/code/datums/components/fishing_spot.dm b/code/datums/components/fishing_spot.dm index 1f3106a7a88..1b46b3cc541 100644 --- a/code/datums/components/fishing_spot.dm +++ b/code/datums/components/fishing_spot.dm @@ -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) diff --git a/code/datums/memory/general_memories.dm b/code/datums/memory/general_memories.dm index 6b93f24542a..1326b72fe16 100644 --- a/code/datums/memory/general_memories.dm +++ b/code/datums/memory/general_memories.dm @@ -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.", + ) diff --git a/code/game/machinery/dna_infuser/dna_infuser.dm b/code/game/machinery/dna_infuser/dna_infuser.dm index 8fc8d96353b..45941ac53df 100644 --- a/code/game/machinery/dna_infuser/dna_infuser.dm +++ b/code/game/machinery/dna_infuser/dna_infuser.dm @@ -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) diff --git a/code/modules/antagonists/revolution/revolution.dm b/code/modules/antagonists/revolution/revolution.dm index 98027f818f2..e878ca80190 100644 --- a/code/modules/antagonists/revolution/revolution.dm +++ b/code/modules/antagonists/revolution/revolution.dm @@ -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 diff --git a/code/modules/client/preferences/prisoner_crime.dm b/code/modules/client/preferences/prisoner_crime.dm index 420bab28419..bb8d0f5e669 100644 --- a/code/modules/client/preferences/prisoner_crime.dm +++ b/code/modules/client/preferences/prisoner_crime.dm @@ -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 diff --git a/code/modules/jobs/job_types/prisoner.dm b/code/modules/jobs/job_types/prisoner.dm index 3fc56fa1b68..783283960f4 100644 --- a/code/modules/jobs/job_types/prisoner.dm +++ b/code/modules/jobs/job_types/prisoner.dm @@ -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"])