diff --git a/code/__HELPERS/memory_helpers.dm b/code/__HELPERS/memory_helpers.dm index e1e9212cef2..bc916b2d20f 100644 --- a/code/__HELPERS/memory_helpers.dm +++ b/code/__HELPERS/memory_helpers.dm @@ -112,3 +112,11 @@ /// Small helper to clean out memories. /datum/mind/proc/wipe_memory() QDEL_LIST_ASSOC_VAL(memories) + +/// Helper to create quick copies of all of our memories +/// Quick copies aren't full copies - just basic copies containing necessities. +/// They cannot be used in stories. +/datum/mind/proc/quick_copy_all_memories(datum/mind/new_memorizer) + for(var/memory_path in memories) + var/datum/memory/prime_memory = memories[memory_path] + new_memorizer.memories[memory_path] = prime_memory.quick_copy_memory(new_memorizer) diff --git a/code/datums/elements/wall_engraver.dm b/code/datums/elements/wall_engraver.dm index 4a82eabbf82..72e74c7d35c 100644 --- a/code/datums/elements/wall_engraver.dm +++ b/code/datums/elements/wall_engraver.dm @@ -37,7 +37,7 @@ if(HAS_TRAIT_FROM(wall, TRAIT_NOT_ENGRAVABLE, TRAIT_GENERIC)) user.balloon_alert(user, "wall has already been engraved!") return - if(!user.mind?.memories?.len) + if(!length(user.mind?.memories)) user.balloon_alert(user, "nothing memorable to engrave!") return var/datum/memory/memory_to_engrave = user.mind.select_memory("engrave") diff --git a/code/datums/memory/_memory.dm b/code/datums/memory/_memory.dm index f6f51888fba..98dbea10170 100644 --- a/code/datums/memory/_memory.dm +++ b/code/datums/memory/_memory.dm @@ -57,7 +57,7 @@ src.deuteragonist_name = build_story_character(deuteragonist) src.antagonist_name = build_story_character(antagonist) - if(protagonist && !(memory_flags & MEMORY_FLAG_NOLOCATION)) + if(!src.where && isatom(protagonist) && !(memory_flags & MEMORY_FLAG_NOLOCATION)) src.where = get_area_name(protagonist) if(!(memory_flags & MEMORY_FLAG_NOMOOD)) @@ -380,3 +380,29 @@ // Generic result - mobs get "the guy", objs / turfs get "a thing" return ismob(character) ? "\the [character]" : "\a [character]" + +/** + * Creates a "quick copy" of the memory for another mind, + * copying just basic memory information (name, major charactecrs) over. + * + * The copied memory cannot be used for stories or anything. + * They should generally only be used to give a new mind an idea of another mind's memories. + */ +/datum/memory/proc/quick_copy_memory(datum/mind/new_memorizer) + var/datum/memory/copy/new_copy = new(new_memorizer, protagonist_name, deuteragonist_name, antagonist_name, where, memory_flags) + new_copy.name = name + new_copy.story_value = story_value + return new_copy + +// To only be used by quick copies of memories +/datum/memory/copy + memory_flags = MEMORY_NO_STORY + +/datum/memory/copy/New(datum/mind/memorizer_mind, atom/protagonist, atom/deuteragonist, atom/antagonist, where, new_memory_flags) + src.where = where + src.memory_flags |= new_memory_flags + return ..() + +/datum/memory/copy/generate_memory_name() + // We just copy the original memory's name anyways + return diff --git a/code/datums/memory/tattoo_kit.dm b/code/datums/memory/tattoo_kit.dm index 93859571af4..98d47eaa285 100644 --- a/code/datums/memory/tattoo_kit.dm +++ b/code/datums/memory/tattoo_kit.dm @@ -38,7 +38,7 @@ if(!uses) balloon_alert(tattoo_artist, "not enough ink!") return - if(!tattoo_artist.mind.memories) + if(!length(tattoo_artist.mind.memories)) balloon_alert(tattoo_artist, "nothing memorable to engrave!") return var/selected_zone = tattoo_artist.zone_selected diff --git a/code/modules/antagonists/paradox_clone/paradox_clone.dm b/code/modules/antagonists/paradox_clone/paradox_clone.dm index 012d13902b5..feff552e1b2 100644 --- a/code/modules/antagonists/paradox_clone/paradox_clone.dm +++ b/code/modules/antagonists/paradox_clone/paradox_clone.dm @@ -73,6 +73,10 @@ sensor_clothes.sensor_mode = SENSOR_OFF clone_human.update_suit_sensors() + // Perform a quick copy of existing memories. + // This may result in some minutely imperfect memories, but it'll do + original_mind.quick_copy_all_memories(owner) + /datum/antagonist/paradox_clone/roundend_report_header() return "A paradox clone appeared on the station!
"