From 2d315b94e6c1a95853207b14b2c8b4b2881b6e7e Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Wed, 5 Jun 2024 02:17:58 -0700 Subject: [PATCH 01/43] Antag --- .../antagonists/evil_clone/evil_clone.dm | 22 +++++++++++++++++++ .../evil_clone/evil_clone_objective.dm | 7 ++++++ tgstation.dme | 2 ++ 3 files changed, 31 insertions(+) create mode 100644 monkestation/code/modules/antagonists/evil_clone/evil_clone.dm create mode 100644 monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm new file mode 100644 index 00000000000000..653908636c4655 --- /dev/null +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm @@ -0,0 +1,22 @@ +/datum/antagonist/evil_clone + name = "\improper Evil Clone" + show_in_antagpanel = TRUE + roundend_category = "evil clones" + antagpanel_category = "Evil Clones" + job_rank = ROLE_EVIL_CLONE + show_name_in_check_antagonists = TRUE + show_to_ghosts = TRUE + +/datum/antagonist/evil_clone/greet() + . = ..() + owner.announce_objectives() + owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/revolutionary_tide.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) + +/datum/antagonist/evil_clone/on_gain() + forge_objectives() + . = ..() + +/datum/antagonist/evil_clone/forge_objectives() + var/datum/objective/evil_clone/objective = new + objective.owner = owner + objectives += objective diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm new file mode 100644 index 00000000000000..8ae1dddbad7fa7 --- /dev/null +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm @@ -0,0 +1,7 @@ +/datum/objective/evil_clone + name = "clone supremacy" + explanation_text = "Kill everyone who isn't a clone of yourself." + admin_grantable = TRUE + +/datum/objective/evil_clone/check_completion() + return TRUE diff --git a/tgstation.dme b/tgstation.dme index f0a7842082b40f..f81ff60f8de586 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6016,6 +6016,8 @@ #include "monkestation\code\modules\antagonists\contractor\items\modsuit\modules.dm" #include "monkestation\code\modules\antagonists\contractor\items\modsuit\theme.dm" #include "monkestation\code\modules\antagonists\ert\moff_inspectors.dm" +#include "monkestation\code\modules\antagonists\evil_clone\evil_clone.dm" +#include "monkestation\code\modules\antagonists\evil_clone\evil_clone_objective.dm" #include "monkestation\code\modules\antagonists\florida_man\__outfits.dm" #include "monkestation\code\modules\antagonists\florida_man\_defines.dm" #include "monkestation\code\modules\antagonists\florida_man\_florida_man.dm" From cca96097ed289f00c617e700c03fe63f4f3d3d8c Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Wed, 5 Jun 2024 02:33:00 -0700 Subject: [PATCH 02/43] Update exp_cloner.dm --- .../code/game/machinery/exp_cloner.dm | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index f16bb07afbbcb2..734e88dde36602 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -9,6 +9,9 @@ internal_radio = FALSE VAR_PRIVATE static/list/image/cached_clone_images + var/evil = FALSE + var/role_text + var/poll_text /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -54,13 +57,20 @@ ADD_TRAIT(clonee, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) clonee.Unconscious(80) + if(evil) + role_text = "evil clone" + poll_text = "Do you want to play as [clonename]'s evil clone?" + else + role_text = "defective clone" + poll_text = "Do you want to play as [clonename]'s defective clone?" + var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( - "Do you want to play as [clonename]'s defective clone?", + poll_text, poll_time = 10 SECONDS, target_mob = clonee, ignore_category = POLL_IGNORE_DEFECTIVECLONE, pic_source = get_clone_preview(clonee.dna) || clonee, - role_name_text = "defective clone" + role_text ) if(LAZYLEN(candidates)) var/mob/dead/observer/candidate = pick(candidates) @@ -84,6 +94,8 @@ /obj/machinery/clonepod/experimental/exp_clone_check(mob/living/carbon/human/mob_occupant) if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) + else if(evil) + mob_occupant.mind.add_antag_datum(/datum/antagonist/evil_clone) /obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna) RETURN_TYPE(/image) @@ -102,6 +114,24 @@ LAZYSET(cached_clone_images, key, preview) return preview +/obj/machinery/clonepod/experimental/emag_act(mob/user) + if(!evil) + evil = TRUE //Cloner will make EVIL clones from now on. + to_chat(user, "You corrupt the genetic compiler.") + add_fingerprint(user) + log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") + else + to_chat(user, "The cloner is already malfunctioning.") + +/obj/machinery/clonepod/experimental/emp_act(severity) + . = ..() + if (!(. & EMP_PROTECT_SELF)) + if(prob(100/severity) && !evil) + evil = TRUE + //SPEAK(Gibberish("Exposure to electromagnetic fields has caused morality failure." ,0)) + log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") + connected_message(Gibberish("EMP-caused Morality Failure", 0)) + //Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. /obj/machinery/computer/prototype_cloning name = "prototype cloning console" From f3d5dd78c770eb7793de38b63e8c2220cfc06c5e Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Wed, 5 Jun 2024 20:44:02 -0700 Subject: [PATCH 03/43] Hopefully fixes --- monkestation/code/game/machinery/exp_cloner.dm | 2 +- monkestation/code/modules/antagonists/evil_clone/evil_clone.dm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 734e88dde36602..b0edab3a967a96 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -70,7 +70,7 @@ target_mob = clonee, ignore_category = POLL_IGNORE_DEFECTIVECLONE, pic_source = get_clone_preview(clonee.dna) || clonee, - role_text + role_name_text = role_text ) if(LAZYLEN(candidates)) var/mob/dead/observer/candidate = pick(candidates) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm index 653908636c4655..e657f67dffffe6 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm @@ -3,7 +3,6 @@ show_in_antagpanel = TRUE roundend_category = "evil clones" antagpanel_category = "Evil Clones" - job_rank = ROLE_EVIL_CLONE show_name_in_check_antagonists = TRUE show_to_ghosts = TRUE From ec7ada704779e9c14bc5873002cad418553ea91d Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Wed, 5 Jun 2024 22:26:36 -0700 Subject: [PATCH 04/43] Update exp_cloner.dm --- monkestation/code/game/machinery/exp_cloner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index b0edab3a967a96..4043dc1fd7adb0 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -121,7 +121,7 @@ add_fingerprint(user) log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") else - to_chat(user, "The cloner is already malfunctioning.") + to_chat(user, "The cloner is already malfunctioning.") /obj/machinery/clonepod/experimental/emp_act(severity) . = ..() From eb62758821690cedc13c5d7cd0726702eb99c3bd Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Wed, 5 Jun 2024 22:52:43 -0700 Subject: [PATCH 05/43] Examining evil cloner tells you it's evil. --- monkestation/code/game/machinery/cloning.dm | 4 ++++ monkestation/code/game/machinery/exp_cloner.dm | 5 ++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index d194835204edf5..6f906d3c468df0 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -55,6 +55,8 @@ var/auto_clone = TRUE fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. payment_department = ACCOUNT_MED + /// Used in experimental cloner + var/evil = FALSE /obj/machinery/clonepod/Initialize() . = ..() @@ -101,6 +103,8 @@ . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." if(efficiency > 5) . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." + if(evil) + . += "You notice an ominous, flashing red LED light." //Clonepod diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 4043dc1fd7adb0..dbc4e4c922755f 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -9,7 +9,8 @@ internal_radio = FALSE VAR_PRIVATE static/list/image/cached_clone_images - var/evil = FALSE + /// Am I producing evil clones? + evil = FALSE var/role_text var/poll_text @@ -128,9 +129,7 @@ if (!(. & EMP_PROTECT_SELF)) if(prob(100/severity) && !evil) evil = TRUE - //SPEAK(Gibberish("Exposure to electromagnetic fields has caused morality failure." ,0)) log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") - connected_message(Gibberish("EMP-caused Morality Failure", 0)) //Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. /obj/machinery/computer/prototype_cloning From f6dd29705e6936a45961d795e4165db5bab93599 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:23:32 -0700 Subject: [PATCH 06/43] Update monkestation/code/game/machinery/exp_cloner.dm Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- monkestation/code/game/machinery/exp_cloner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index dbc4e4c922755f..623f834fc9b460 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -122,7 +122,7 @@ add_fingerprint(user) log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") else - to_chat(user, "The cloner is already malfunctioning.") + to_chat(user, span_warning("The cloner is already malfunctioning.")) /obj/machinery/clonepod/experimental/emp_act(severity) . = ..() From a02bc308fca43145373a451ef8479f0bcd93fd72 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:23:41 -0700 Subject: [PATCH 07/43] Update monkestation/code/game/machinery/exp_cloner.dm Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- monkestation/code/game/machinery/exp_cloner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 623f834fc9b460..9196a9061c92d3 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -118,7 +118,7 @@ /obj/machinery/clonepod/experimental/emag_act(mob/user) if(!evil) evil = TRUE //Cloner will make EVIL clones from now on. - to_chat(user, "You corrupt the genetic compiler.") + to_chat(user, span_warning("You corrupt the genetic compiler.")) add_fingerprint(user) log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") else From f13efbd1f585d557b615cd94730d0ae935d751aa Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:23:52 -0700 Subject: [PATCH 08/43] Update monkestation/code/game/machinery/cloning.dm Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- monkestation/code/game/machinery/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 6f906d3c468df0..b8c8e5b830f043 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -104,7 +104,7 @@ if(efficiency > 5) . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." if(evil) - . += "You notice an ominous, flashing red LED light." + . += span_warning("You notice an ominous, flashing red LED light.") //Clonepod From e096666b41ce666f005c8a8466c4c01981289638 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 00:37:27 -0700 Subject: [PATCH 09/43] Examine moved down to exp_cloner.dm Not sure if this is the best way to move it down. --- monkestation/code/game/machinery/cloning.dm | 4 ---- monkestation/code/game/machinery/exp_cloner.dm | 12 +++++++++++- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 6f906d3c468df0..d194835204edf5 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -55,8 +55,6 @@ var/auto_clone = TRUE fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. payment_department = ACCOUNT_MED - /// Used in experimental cloner - var/evil = FALSE /obj/machinery/clonepod/Initialize() . = ..() @@ -103,8 +101,6 @@ . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." if(efficiency > 5) . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." - if(evil) - . += "You notice an ominous, flashing red LED light." //Clonepod diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index dbc4e4c922755f..696966b5e9b07b 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -10,7 +10,7 @@ VAR_PRIVATE static/list/image/cached_clone_images /// Am I producing evil clones? - evil = FALSE + var/evil = FALSE var/role_text var/poll_text @@ -18,6 +18,16 @@ clear_human_dummy(REF(src)) return ..() +/obj/machinery/clonepod/experimental/examine(mob/user) + . = ..() + . += "The linking device can be scanned with a multitool." + if(in_range(user, src) || isobserver(user)) + . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." + if(efficiency > 5) + . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." + if(evil) + . += "You notice an ominous, flashing red LED light." + //Start growing a human clone in the pod! /obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) if(panel_open || mess || attempting) From eb1668e8e0372b35c4d6c96a23c4fd7c2885eb4f Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 01:48:52 -0700 Subject: [PATCH 10/43] Being evil makes it clone slower. Don't have time to test as of now, will most likely test tomorrow. Slowdown is equivalent to having one tier worse parts. --- monkestation/code/game/machinery/cloning.dm | 7 +++++++ monkestation/code/game/machinery/exp_cloner.dm | 14 ++------------ 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index d194835204edf5..024c9dd78b8b5d 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -55,6 +55,7 @@ var/auto_clone = TRUE fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. payment_department = ACCOUNT_MED + var/evil = FALSE /obj/machinery/clonepod/Initialize() . = ..() @@ -88,6 +89,10 @@ efficiency += S.tier for(var/datum/stock_part/manipulator/P in component_parts) speed_coeff += P.tier + if(evil) + speed_coeff -= 1 // Equivalent to having one tier lower parts. + if(speed_coeff < 0) // Negative speed coefficient would be bad. + speed_coeff = 0 heal_level = (efficiency * 15) + 10 if(heal_level < MINIMUM_HEAL_LEVEL) heal_level = MINIMUM_HEAL_LEVEL @@ -101,6 +106,8 @@ . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." if(efficiency > 5) . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." + if(evil) + . += "You notice an ominous, flashing red LED light." //Clonepod diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 07bae924e4c40c..2905670b7975bb 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -9,8 +9,6 @@ internal_radio = FALSE VAR_PRIVATE static/list/image/cached_clone_images - /// Am I producing evil clones? - var/evil = FALSE var/role_text var/poll_text @@ -18,16 +16,6 @@ clear_human_dummy(REF(src)) return ..() -/obj/machinery/clonepod/experimental/examine(mob/user) - . = ..() - . += "The linking device can be scanned with a multitool." - if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." - if(efficiency > 5) - . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." - if(evil) - . += "You notice an ominous, flashing red LED light." - //Start growing a human clone in the pod! /obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) if(panel_open || mess || attempting) @@ -131,6 +119,7 @@ to_chat(user, span_warning("You corrupt the genetic compiler.")) add_fingerprint(user) log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") + RefreshParts() else to_chat(user, span_warning("The cloner is already malfunctioning.")) @@ -139,6 +128,7 @@ if (!(. & EMP_PROTECT_SELF)) if(prob(100/severity) && !evil) evil = TRUE + RefreshParts() log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") //Prototype cloning console, much more rudimental and lacks modern functions such as saving records, autocloning, or safety checks. From 26b61cf26c38547e3bfa3363d994c22e9aba4322 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:06:07 -0700 Subject: [PATCH 11/43] Corrects comment Now that I've tested it I found out what a difference of speed_coeff does. --- monkestation/code/game/machinery/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 024c9dd78b8b5d..6a99cd2812c659 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -90,7 +90,7 @@ for(var/datum/stock_part/manipulator/P in component_parts) speed_coeff += P.tier if(evil) - speed_coeff -= 1 // Equivalent to having one tier lower parts. + speed_coeff -= 1 // Equivalent to having 1/2 tier lower parts. if(speed_coeff < 0) // Negative speed coefficient would be bad. speed_coeff = 0 heal_level = (efficiency * 15) + 10 From 2fadbc7e1153ec6ef9799a367536e548e82d546d Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:21:06 -0700 Subject: [PATCH 12/43] Update cloning.dm --- monkestation/code/game/machinery/cloning.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 6a99cd2812c659..a4db416fad0b27 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -90,7 +90,7 @@ for(var/datum/stock_part/manipulator/P in component_parts) speed_coeff += P.tier if(evil) - speed_coeff -= 1 // Equivalent to having 1/2 tier lower parts. + speed_coeff -= 2 // Equivalent to having 1 tier lower parts. if(speed_coeff < 0) // Negative speed coefficient would be bad. speed_coeff = 0 heal_level = (efficiency * 15) + 10 From 2265c08644398f4da8587027819002d5bfef47d6 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:08:32 -0700 Subject: [PATCH 13/43] Moves evil back down --- monkestation/code/game/machinery/cloning.dm | 8 ++++---- monkestation/code/game/machinery/exp_cloner.dm | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index a4db416fad0b27..da37e044a74026 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -55,7 +55,6 @@ var/auto_clone = TRUE fair_market_price = 5 // He nodded, because he knew I was right. Then he swiped his credit card to pay me for arresting him. payment_department = ACCOUNT_MED - var/evil = FALSE /obj/machinery/clonepod/Initialize() . = ..() @@ -89,7 +88,7 @@ efficiency += S.tier for(var/datum/stock_part/manipulator/P in component_parts) speed_coeff += P.tier - if(evil) + if(evilcheck()) speed_coeff -= 2 // Equivalent to having 1 tier lower parts. if(speed_coeff < 0) // Negative speed coefficient would be bad. speed_coeff = 0 @@ -99,6 +98,9 @@ if(heal_level > 100) heal_level = 100 +/obj/machinery/clonepod/proc/evilcheck() + return FALSE + /obj/machinery/clonepod/examine(mob/user) . = ..() . += "The linking device can be scanned with a multitool." @@ -106,8 +108,6 @@ . += "The status display reads: Cloning speed at [speed_coeff*50]%.
Predicted amount of cellular damage: [100-heal_level]%." if(efficiency > 5) . += "Pod has been upgraded to support autoprocessing and apply beneficial mutations." - if(evil) - . += "You notice an ominous, flashing red LED light." //Clonepod diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 2905670b7975bb..43c2feccd0a146 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -9,6 +9,8 @@ internal_radio = FALSE VAR_PRIVATE static/list/image/cached_clone_images + /// Am I producing evil clones? + var/evil = FALSE var/role_text var/poll_text @@ -16,6 +18,18 @@ clear_human_dummy(REF(src)) return ..() +/obj/machinery/clonepod/experimental/examine(mob/user) + . = ..() + if(in_range(user, src) || isobserver(user)) + if(evil) + . += "You notice an ominous, flashing red LED light." + +/obj/machinery/clonepod/experimental/evilcheck() + if(evil) + return TRUE + else + return FALSE + //Start growing a human clone in the pod! /obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) if(panel_open || mess || attempting) From e6d5783cda87aa37a6fcafaf0efc4eb1dddc2e8e Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:32:13 -0700 Subject: [PATCH 14/43] Better --- monkestation/code/game/machinery/cloning.dm | 3 --- monkestation/code/game/machinery/exp_cloner.dm | 9 +++++---- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index da37e044a74026..42347cc01c99dc 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -98,9 +98,6 @@ if(heal_level > 100) heal_level = 100 -/obj/machinery/clonepod/proc/evilcheck() - return FALSE - /obj/machinery/clonepod/examine(mob/user) . = ..() . += "The linking device can be scanned with a multitool." diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 43c2feccd0a146..b7b32eac562f77 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -24,11 +24,12 @@ if(evil) . += "You notice an ominous, flashing red LED light." -/obj/machinery/clonepod/experimental/evilcheck() +/obj/machinery/clonepod/experimental/RefreshParts() + . = ..() if(evil) - return TRUE - else - return FALSE + speed_coeff -= 2 // Equivalent to one tier worse parts. + if(speed_coeff < 0) // Negative speed_coeff would be bad. + speed_coeff = 0 //Start growing a human clone in the pod! /obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) From bbbb78cfcfec80b79d38d5c413bf399edf667b6c Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:40:34 -0700 Subject: [PATCH 15/43] Oops forgot to remove --- monkestation/code/game/machinery/cloning.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 42347cc01c99dc..d194835204edf5 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -88,10 +88,6 @@ efficiency += S.tier for(var/datum/stock_part/manipulator/P in component_parts) speed_coeff += P.tier - if(evilcheck()) - speed_coeff -= 2 // Equivalent to having 1 tier lower parts. - if(speed_coeff < 0) // Negative speed coefficient would be bad. - speed_coeff = 0 heal_level = (efficiency * 15) + 10 if(heal_level < MINIMUM_HEAL_LEVEL) heal_level = MINIMUM_HEAL_LEVEL From 1805fffb8a79f08b209e140208661cbb0b74d1ac Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 6 Jun 2024 21:52:28 -0700 Subject: [PATCH 16/43] Update exp_cloner.dm --- monkestation/code/game/machinery/exp_cloner.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index b7b32eac562f77..218d86f626377a 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -22,7 +22,7 @@ . = ..() if(in_range(user, src) || isobserver(user)) if(evil) - . += "You notice an ominous, flashing red LED light." + . += span_warning("You notice an ominous, flashing red LED light.") /obj/machinery/clonepod/experimental/RefreshParts() . = ..() From 44a9a0c4db64839c6ac2456c374c0981d499e0d3 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 7 Jun 2024 19:34:30 -0700 Subject: [PATCH 17/43] Evil clones have unnaturally glowing red eyes. --- .../code/modules/antagonists/evil_clone/evil_clone.dm | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm index e657f67dffffe6..d43ac16ef698c7 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm @@ -15,6 +15,17 @@ forge_objectives() . = ..() +/datum/antagonist/evil_clone/apply_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/current = owner.current + current.AddElement(/datum/element/cult_eyes, initial_delay = 0 SECONDS) + +/datum/antagonist/evil_clone/remove_innate_effects(mob/living/mob_override) + . = ..() + var/mob/living/current = owner.current + if (HAS_TRAIT(current, TRAIT_UNNATURAL_RED_GLOWY_EYES)) + current.RemoveElement(/datum/element/cult_eyes) + /datum/antagonist/evil_clone/forge_objectives() var/datum/objective/evil_clone/objective = new objective.owner = owner From e7ed5328c02b32191e808014eee084ea3c1f2692 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 02:01:10 -0700 Subject: [PATCH 18/43] New objectives --- .../evil_clone/evil_clone_objective.dm | 41 +++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm index 8ae1dddbad7fa7..5e05af84054055 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm @@ -1,7 +1,42 @@ -/datum/objective/evil_clone +/datum/objective/evil_clone/murder name = "clone supremacy" - explanation_text = "Kill everyone who isn't a clone of yourself." - admin_grantable = TRUE + explanation_text = "Kill everyone who isn't a clone of yourself. Do not spare the original." + +/datum/objective/evil_clone/sole + name = "real one" + explanation_text = "All other versions of you are imposters, eliminate them." + +/datum/objective/evil_clone/rule + name = "rightful rule" + explanation_text = "You and your fellow clones are the rightful rulers of the station, take control." + +/datum/objective/evil_clone/minion + name = "minion" + explanation_text = "Find the most evil being you can, and become their minion." + +/datum/objective/evil_clone/dud + name = "peaceful clone" + explanation_text = "You find it really mean that some people don't like you because of your red eyes." + +/datum/objective/evil_clone/tide + name = "tider" + explanation_text = "Crime is your religion, commit as much crime as possible. Only seriously injure people if they try to stop crime." + +/datum/objective/evil_clone/fake_cult + name = "fake cultist" + explanation_text = "Praise" + +/datum/objective/evil_clone/fake_cult/New() + var/god = pick(list("Rat'var", "Nar'sie", "the Honkmother")) //So clones with different gods will fight eachother. + explanation_text+=" [god]! They haven't answered your prayers yet, but surely if you pray enough and make elaborate enough rituals they will inevitably come. Make sure no heretical religions prosper." + +/datum/objective/evil_clone/singuloose + name = "release engine" + explanation_text = "Deep within engineering a shackled beast lies dormant, release it!" //Is there a better way to tell clones to release the engine? + +/datum/objective/evil_clone/territorial + name = "territorial" + explanation_text = "The clonepod which birthed you is a holy site only you and your fellow clones are worthy to be in the presence of. Secure the area around the clonepod and ensure no non-clones threaten it." /datum/objective/evil_clone/check_completion() return TRUE From 6c88d09ae85af26aa84f424c9e9db459d7ed99b2 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 16:14:10 -0700 Subject: [PATCH 19/43] More evil clone changes. --- .../code/game/machinery/exp_cloner.dm | 31 +++++++++++-------- .../antagonists/evil_clone/evil_clone.dm | 10 ------ .../evil_clone/evil_clone_objective.dm | 8 ++--- 3 files changed, 22 insertions(+), 27 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 218d86f626377a..1bc2082b2ce595 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -10,7 +10,10 @@ VAR_PRIVATE static/list/image/cached_clone_images /// Am I producing evil clones? - var/evil = FALSE + var/evil_objective = null + /// Can my objective be changed? + var/locked = FALSE + var/datum/antagonist/evil_clone/antag_object var/role_text var/poll_text @@ -21,15 +24,14 @@ /obj/machinery/clonepod/experimental/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - if(evil) + if(!isnull(evil_objective)) . += span_warning("You notice an ominous, flashing red LED light.") /obj/machinery/clonepod/experimental/RefreshParts() . = ..() - if(evil) - speed_coeff -= 2 // Equivalent to one tier worse parts. - if(speed_coeff < 0) // Negative speed_coeff would be bad. - speed_coeff = 0 + if(!isnull(evil_objective)) + speed_coeff /= 2 // So better parts have half the speed increase. + speed_coeff += 1 // I still want basic parts to have base 100% speed. //Start growing a human clone in the pod! /obj/machinery/clonepod/experimental/growclone(clonename, ui, mutation_index, mindref, blood_type, datum/species/mrace, list/features, factions, list/quirks, datum/bank_account/insurance) @@ -71,7 +73,7 @@ ADD_TRAIT(clonee, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) clonee.Unconscious(80) - if(evil) + if(!isnull(evil_objective)) role_text = "evil clone" poll_text = "Do you want to play as [clonename]'s evil clone?" else @@ -108,8 +110,10 @@ /obj/machinery/clonepod/experimental/exp_clone_check(mob/living/carbon/human/mob_occupant) if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) - else if(evil) - mob_occupant.mind.add_antag_datum(/datum/antagonist/evil_clone) + else if(!isnull(evil_objective)) + antag_object = mob_occupant.mind.add_antag_datum(/datum/antagonist/evil_clone) + antag_object.objectives += new evil_objective() + mob_occupant.mind.announce_objectives() /obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna) RETURN_TYPE(/image) @@ -129,8 +133,9 @@ return preview /obj/machinery/clonepod/experimental/emag_act(mob/user) - if(!evil) - evil = TRUE //Cloner will make EVIL clones from now on. + if(!locked) + evil_objective = /datum/objective/evil_clone/murder //Emags will give a nasty objective. + locked = TRUE to_chat(user, span_warning("You corrupt the genetic compiler.")) add_fingerprint(user) log_cloning("[key_name(user)] emagged [src] at [AREACOORD(src)], causing it to malfunction.") @@ -141,8 +146,8 @@ /obj/machinery/clonepod/experimental/emp_act(severity) . = ..() if (!(. & EMP_PROTECT_SELF)) - if(prob(100/severity) && !evil) - evil = TRUE + if(prob(100/severity) && !locked) + evil_objective = pick(subtypesof(/datum/objective/evil_clone/)) RefreshParts() log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm index d43ac16ef698c7..27ae6c74108e18 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm @@ -8,13 +8,8 @@ /datum/antagonist/evil_clone/greet() . = ..() - owner.announce_objectives() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/revolutionary_tide.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) -/datum/antagonist/evil_clone/on_gain() - forge_objectives() - . = ..() - /datum/antagonist/evil_clone/apply_innate_effects(mob/living/mob_override) . = ..() var/mob/living/current = owner.current @@ -25,8 +20,3 @@ var/mob/living/current = owner.current if (HAS_TRAIT(current, TRAIT_UNNATURAL_RED_GLOWY_EYES)) current.RemoveElement(/datum/element/cult_eyes) - -/datum/antagonist/evil_clone/forge_objectives() - var/datum/objective/evil_clone/objective = new - objective.owner = owner - objectives += objective diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm index 5e05af84054055..fb1336cf76db31 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm @@ -1,4 +1,4 @@ -/datum/objective/evil_clone/murder +/datum/objective/evil_clone/murder // The existance of the murderbone objective makes evil clones properly feared, so even when they aren't murderboning they will still be shunned and persecuted. name = "clone supremacy" explanation_text = "Kill everyone who isn't a clone of yourself. Do not spare the original." @@ -14,7 +14,7 @@ name = "minion" explanation_text = "Find the most evil being you can, and become their minion." -/datum/objective/evil_clone/dud +/datum/objective/evil_clone/dud // Relies on more destructive objectives, to create conflict from crew hating evil clones because they MIGHT have a more evil objective. name = "peaceful clone" explanation_text = "You find it really mean that some people don't like you because of your red eyes." @@ -27,7 +27,7 @@ explanation_text = "Praise" /datum/objective/evil_clone/fake_cult/New() - var/god = pick(list("Rat'var", "Nar'sie", "the Honkmother")) //So clones with different gods will fight eachother. + var/god = pick(list("Rat'var", "Nar'sie")) //So clones with different gods will fight eachother. explanation_text+=" [god]! They haven't answered your prayers yet, but surely if you pray enough and make elaborate enough rituals they will inevitably come. Make sure no heretical religions prosper." /datum/objective/evil_clone/singuloose @@ -36,7 +36,7 @@ /datum/objective/evil_clone/territorial name = "territorial" - explanation_text = "The clonepod which birthed you is a holy site only you and your fellow clones are worthy to be in the presence of. Secure the area around the clonepod and ensure no non-clones threaten it." + explanation_text = "The clonepod which created you is a holy site only you and your fellow clones are worthy to be in the presence of. Secure the area around the clonepod and ensure no non-clones threaten it." /datum/objective/evil_clone/check_completion() return TRUE From 15f5d90e0cabdbbf06ce4eaea05798541a62ef3e Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 16:57:54 -0700 Subject: [PATCH 20/43] Evil clone event --- .../evil_clone/evil_clone_objective.dm | 4 ++-- .../modules/antagonists/evil_clone/evil_event.dm | 16 ++++++++++++++++ tgstation.dme | 1 + 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 monkestation/code/modules/antagonists/evil_clone/evil_event.dm diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm index fb1336cf76db31..291989eaae3282 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm @@ -8,7 +8,7 @@ /datum/objective/evil_clone/rule name = "rightful rule" - explanation_text = "You and your fellow clones are the rightful rulers of the station, take control." + explanation_text = "You and your fellow clones of yourself are the rightful rulers of the station, take control." /datum/objective/evil_clone/minion name = "minion" @@ -36,7 +36,7 @@ /datum/objective/evil_clone/territorial name = "territorial" - explanation_text = "The clonepod which created you is a holy site only you and your fellow clones are worthy to be in the presence of. Secure the area around the clonepod and ensure no non-clones threaten it." + explanation_text = "The clonepod which created you is a holy site only you and your fellow clones of yourself are worthy to be in the presence of. Secure the area around the clonepod and ensure no non-clones threaten it." /datum/objective/evil_clone/check_completion() return TRUE diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm new file mode 100644 index 00000000000000..1e0165ff47c7eb --- /dev/null +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -0,0 +1,16 @@ +/datum/round_event_control/cloner_corruption + name = "Experimental Cloner Corruption" + typepath = /datum/round_event/cloner_corruption + max_occurrences = 10 + weight = 5 + alert_observers = TRUE + category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. + cost = 1 //What do I set this to? I guess often times there won't be any experimental cloners so it'd be wasted. + track = EVENT_TRACK_MODERATE //What do I set this to? Evil clones start with no gear and are obvious, they'll get slaughtered the moment they get found out. (Which will probably be soon as cloners tend to be made in public areas.) + tags = list(TAG_DESTRUCTIVE, TAG_COMBAT) + +/datum/round_event/cloner_corruption/start() + for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) + if(!cloner.locked) + cloner.evil_objective = pick(subtypesof(/datum/objective/evil_clone/)) + cloner.RefreshParts() diff --git a/tgstation.dme b/tgstation.dme index f81ff60f8de586..ffe8acee514a2d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -6018,6 +6018,7 @@ #include "monkestation\code\modules\antagonists\ert\moff_inspectors.dm" #include "monkestation\code\modules\antagonists\evil_clone\evil_clone.dm" #include "monkestation\code\modules\antagonists\evil_clone\evil_clone_objective.dm" +#include "monkestation\code\modules\antagonists\evil_clone\evil_event.dm" #include "monkestation\code\modules\antagonists\florida_man\__outfits.dm" #include "monkestation\code\modules\antagonists\florida_man\_defines.dm" #include "monkestation\code\modules\antagonists\florida_man\_florida_man.dm" From ca8d511b516d7b248282e93af0182c6c80aed945 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 17:01:49 -0700 Subject: [PATCH 21/43] Update evil_event.dm --- monkestation/code/modules/antagonists/evil_clone/evil_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index 1e0165ff47c7eb..8376d79ad64b7f 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -2,7 +2,7 @@ name = "Experimental Cloner Corruption" typepath = /datum/round_event/cloner_corruption max_occurrences = 10 - weight = 5 + weight = 5 //What do I set this to? alert_observers = TRUE category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. cost = 1 //What do I set this to? I guess often times there won't be any experimental cloners so it'd be wasted. From ec6318c8489ecd7a2267c13569b38bb70e6282a6 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 20:07:52 -0700 Subject: [PATCH 22/43] Fixes it saying you have no objectives when you actually do --- monkestation/code/game/machinery/exp_cloner.dm | 4 ++-- .../code/modules/antagonists/evil_clone/evil_clone.dm | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 1bc2082b2ce595..bdc03a1d6ef6d6 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -111,9 +111,9 @@ if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) else if(!isnull(evil_objective)) - antag_object = mob_occupant.mind.add_antag_datum(/datum/antagonist/evil_clone) + antag_object = new /datum/antagonist/evil_clone() antag_object.objectives += new evil_objective() - mob_occupant.mind.announce_objectives() + mob_occupant.mind.add_antag_datum(antag_object) /obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna) RETURN_TYPE(/image) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm index 27ae6c74108e18..a3b4bc9591db85 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone.dm @@ -8,6 +8,7 @@ /datum/antagonist/evil_clone/greet() . = ..() + owner.announce_objectives() owner.current.playsound_local(get_turf(owner.current), 'sound/ambience/antag/revolutionary_tide.ogg', 100, FALSE, pressure_affected = FALSE, use_reverb = FALSE) /datum/antagonist/evil_clone/apply_innate_effects(mob/living/mob_override) From b0645daac3212bc9f01075f9a0f897d8c0fe25b7 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:09:07 -0700 Subject: [PATCH 23/43] Apply suggestions from code review Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- monkestation/code/game/machinery/exp_cloner.dm | 6 +++--- .../antagonists/evil_clone/evil_clone_objective.dm | 2 +- .../code/modules/antagonists/evil_clone/evil_event.dm | 8 +++----- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index bdc03a1d6ef6d6..f9ed22aff2cce6 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -23,7 +23,7 @@ /obj/machinery/clonepod/experimental/examine(mob/user) . = ..() - if(in_range(user, src) || isobserver(user)) + if(evil_objective && (in_range(user, src) || isobserver(user))) if(!isnull(evil_objective)) . += span_warning("You notice an ominous, flashing red LED light.") @@ -111,7 +111,7 @@ if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) else if(!isnull(evil_objective)) - antag_object = new /datum/antagonist/evil_clone() + var/datum/antagonist/evil_clone/antag_object = new antag_object.objectives += new evil_objective() mob_occupant.mind.add_antag_datum(antag_object) @@ -147,7 +147,7 @@ . = ..() if (!(. & EMP_PROTECT_SELF)) if(prob(100/severity) && !locked) - evil_objective = pick(subtypesof(/datum/objective/evil_clone/)) + evil_objective = pick(subtypesof(/datum/objective/evil_clone) - /datum/objective/evil_clone/murder) RefreshParts() log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm index 291989eaae3282..69af14eeea36e3 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm @@ -1,6 +1,6 @@ /datum/objective/evil_clone/murder // The existance of the murderbone objective makes evil clones properly feared, so even when they aren't murderboning they will still be shunned and persecuted. name = "clone supremacy" - explanation_text = "Kill everyone who isn't a clone of yourself. Do not spare the original." + explanation_text = "Make sure clones of yourself are the only ones alive. Do not spare the original." /datum/objective/evil_clone/sole name = "real one" diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index 8376d79ad64b7f..f45ba5583fe21b 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -1,16 +1,14 @@ /datum/round_event_control/cloner_corruption name = "Experimental Cloner Corruption" typepath = /datum/round_event/cloner_corruption - max_occurrences = 10 - weight = 5 //What do I set this to? - alert_observers = TRUE + max_occurrences = 1 + weight = 3 category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. - cost = 1 //What do I set this to? I guess often times there won't be any experimental cloners so it'd be wasted. track = EVENT_TRACK_MODERATE //What do I set this to? Evil clones start with no gear and are obvious, they'll get slaughtered the moment they get found out. (Which will probably be soon as cloners tend to be made in public areas.) tags = list(TAG_DESTRUCTIVE, TAG_COMBAT) /datum/round_event/cloner_corruption/start() for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) if(!cloner.locked) - cloner.evil_objective = pick(subtypesof(/datum/objective/evil_clone/)) + cloner.evil_objective = pick(subtypesof(/datum/objective/evil_clone)) cloner.RefreshParts() From 3efe8ac55e1c24fd4812b291ad85ecce45cafdae Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:20:01 -0700 Subject: [PATCH 24/43] Update evil_clone_objective.dm --- .../modules/antagonists/evil_clone/evil_clone_objective.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm index 69af14eeea36e3..88aa241e4453c2 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_clone_objective.dm @@ -30,10 +30,6 @@ var/god = pick(list("Rat'var", "Nar'sie")) //So clones with different gods will fight eachother. explanation_text+=" [god]! They haven't answered your prayers yet, but surely if you pray enough and make elaborate enough rituals they will inevitably come. Make sure no heretical religions prosper." -/datum/objective/evil_clone/singuloose - name = "release engine" - explanation_text = "Deep within engineering a shackled beast lies dormant, release it!" //Is there a better way to tell clones to release the engine? - /datum/objective/evil_clone/territorial name = "territorial" explanation_text = "The clonepod which created you is a holy site only you and your fellow clones of yourself are worthy to be in the presence of. Secure the area around the clonepod and ensure no non-clones threaten it." From 8ab378971a36fc19f87b8517c967b57a093840c4 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:23:02 -0700 Subject: [PATCH 25/43] I'm GUESSING this is what was wanted --- monkestation/code/game/machinery/exp_cloner.dm | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index f9ed22aff2cce6..06f498f36332e9 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -14,8 +14,6 @@ /// Can my objective be changed? var/locked = FALSE var/datum/antagonist/evil_clone/antag_object - var/role_text - var/poll_text /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -74,11 +72,11 @@ clonee.Unconscious(80) if(!isnull(evil_objective)) - role_text = "evil clone" - poll_text = "Do you want to play as [clonename]'s evil clone?" + var/role_text = "evil clone" + var/poll_text = "Do you want to play as [clonename]'s evil clone?" else - role_text = "defective clone" - poll_text = "Do you want to play as [clonename]'s defective clone?" + var/role_text = "defective clone" + var/poll_text = "Do you want to play as [clonename]'s defective clone?" var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( poll_text, From f6274c008c2e91588de882e3a84c2a5e79b3f0da Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:27:26 -0700 Subject: [PATCH 26/43] Fix? --- monkestation/code/game/machinery/exp_cloner.dm | 9 ++++++--- .../code/modules/antagonists/evil_clone/evil_event.dm | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 06f498f36332e9..d9fc9a1a2e5c60 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -14,6 +14,8 @@ /// Can my objective be changed? var/locked = FALSE var/datum/antagonist/evil_clone/antag_object + var/role_text = "defective clone" + var/poll_text = "Do you want to play as [clonename]'s defective clone?" /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -74,9 +76,6 @@ if(!isnull(evil_objective)) var/role_text = "evil clone" var/poll_text = "Do you want to play as [clonename]'s evil clone?" - else - var/role_text = "defective clone" - var/poll_text = "Do you want to play as [clonename]'s defective clone?" var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( poll_text, @@ -133,6 +132,8 @@ /obj/machinery/clonepod/experimental/emag_act(mob/user) if(!locked) evil_objective = /datum/objective/evil_clone/murder //Emags will give a nasty objective. + role_text = "evil clone" + poll_text = "Do you want to play as [clonename]'s evil clone?" locked = TRUE to_chat(user, span_warning("You corrupt the genetic compiler.")) add_fingerprint(user) @@ -146,6 +147,8 @@ if (!(. & EMP_PROTECT_SELF)) if(prob(100/severity) && !locked) evil_objective = pick(subtypesof(/datum/objective/evil_clone) - /datum/objective/evil_clone/murder) + role_text = "evil clone" + poll_text = "Do you want to play as [clonename]'s evil clone?" RefreshParts() log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index f45ba5583fe21b..a547bc52a6a9cc 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -11,4 +11,6 @@ for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) if(!cloner.locked) cloner.evil_objective = pick(subtypesof(/datum/objective/evil_clone)) + cloner.role_text = "evil clone" + cloner.poll_text = "Do you want to play as [clonename]'s evil clone?" cloner.RefreshParts() From 3c821f04f2272972d4ebcaa61ffc1cb660fb0b32 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:29:17 -0700 Subject: [PATCH 27/43] Revert "Fix?" This reverts commit f6274c008c2e91588de882e3a84c2a5e79b3f0da. --- monkestation/code/game/machinery/exp_cloner.dm | 9 +++------ .../code/modules/antagonists/evil_clone/evil_event.dm | 2 -- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index d9fc9a1a2e5c60..06f498f36332e9 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -14,8 +14,6 @@ /// Can my objective be changed? var/locked = FALSE var/datum/antagonist/evil_clone/antag_object - var/role_text = "defective clone" - var/poll_text = "Do you want to play as [clonename]'s defective clone?" /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -76,6 +74,9 @@ if(!isnull(evil_objective)) var/role_text = "evil clone" var/poll_text = "Do you want to play as [clonename]'s evil clone?" + else + var/role_text = "defective clone" + var/poll_text = "Do you want to play as [clonename]'s defective clone?" var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( poll_text, @@ -132,8 +133,6 @@ /obj/machinery/clonepod/experimental/emag_act(mob/user) if(!locked) evil_objective = /datum/objective/evil_clone/murder //Emags will give a nasty objective. - role_text = "evil clone" - poll_text = "Do you want to play as [clonename]'s evil clone?" locked = TRUE to_chat(user, span_warning("You corrupt the genetic compiler.")) add_fingerprint(user) @@ -147,8 +146,6 @@ if (!(. & EMP_PROTECT_SELF)) if(prob(100/severity) && !locked) evil_objective = pick(subtypesof(/datum/objective/evil_clone) - /datum/objective/evil_clone/murder) - role_text = "evil clone" - poll_text = "Do you want to play as [clonename]'s evil clone?" RefreshParts() log_cloning("[src] at [AREACOORD(src)] corrupted due to EMP pulse.") diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index a547bc52a6a9cc..f45ba5583fe21b 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -11,6 +11,4 @@ for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) if(!cloner.locked) cloner.evil_objective = pick(subtypesof(/datum/objective/evil_clone)) - cloner.role_text = "evil clone" - cloner.poll_text = "Do you want to play as [clonename]'s evil clone?" cloner.RefreshParts() From 02aba5cb2c212eed6a6973a45f7822b22fb449e1 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sun, 9 Jun 2024 23:29:22 -0700 Subject: [PATCH 28/43] Revert "I'm GUESSING this is what was wanted" This reverts commit 8ab378971a36fc19f87b8517c967b57a093840c4. --- monkestation/code/game/machinery/exp_cloner.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 06f498f36332e9..f9ed22aff2cce6 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -14,6 +14,8 @@ /// Can my objective be changed? var/locked = FALSE var/datum/antagonist/evil_clone/antag_object + var/role_text + var/poll_text /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -72,11 +74,11 @@ clonee.Unconscious(80) if(!isnull(evil_objective)) - var/role_text = "evil clone" - var/poll_text = "Do you want to play as [clonename]'s evil clone?" + role_text = "evil clone" + poll_text = "Do you want to play as [clonename]'s evil clone?" else - var/role_text = "defective clone" - var/poll_text = "Do you want to play as [clonename]'s defective clone?" + role_text = "defective clone" + poll_text = "Do you want to play as [clonename]'s defective clone?" var/list/mob/dead/observer/candidates = SSpolling.poll_ghost_candidates_for_mob( poll_text, From 808597582f6cc408ba7b46d9cd2e9789f2c20430 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Mon, 10 Jun 2024 00:02:23 -0700 Subject: [PATCH 29/43] Update exp_cloner.dm --- monkestation/code/game/machinery/exp_cloner.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index f9ed22aff2cce6..88ca9f3ef08d60 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -14,8 +14,6 @@ /// Can my objective be changed? var/locked = FALSE var/datum/antagonist/evil_clone/antag_object - var/role_text - var/poll_text /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -73,6 +71,8 @@ ADD_TRAIT(clonee, TRAIT_NOCRITDAMAGE, CLONING_POD_TRAIT) clonee.Unconscious(80) + var/role_text + var/poll_text if(!isnull(evil_objective)) role_text = "evil clone" poll_text = "Do you want to play as [clonename]'s evil clone?" From 31b534dac97159dbcb3e9b50af804604c183ae5b Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Mon, 10 Jun 2024 00:58:41 -0700 Subject: [PATCH 30/43] Apply suggestions from code review Co-authored-by: wraith-54321 <69217972+wraith-54321@users.noreply.github.com> --- monkestation/code/game/machinery/exp_cloner.dm | 3 +-- monkestation/code/modules/antagonists/evil_clone/evil_event.dm | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 88ca9f3ef08d60..2f2e197fa87918 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -13,7 +13,6 @@ var/evil_objective = null /// Can my objective be changed? var/locked = FALSE - var/datum/antagonist/evil_clone/antag_object /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -28,7 +27,7 @@ /obj/machinery/clonepod/experimental/RefreshParts() . = ..() if(!isnull(evil_objective)) - speed_coeff /= 2 // So better parts have half the speed increase. + speed_coeff = round(speed_coeff / 2) // So better parts have half the speed increase. speed_coeff += 1 // I still want basic parts to have base 100% speed. //Start growing a human clone in the pod! diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index f45ba5583fe21b..1af1f9f9cd30bd 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -4,7 +4,7 @@ max_occurrences = 1 weight = 3 category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. - track = EVENT_TRACK_MODERATE //What do I set this to? Evil clones start with no gear and are obvious, they'll get slaughtered the moment they get found out. (Which will probably be soon as cloners tend to be made in public areas.) + track = EVENT_TRACK_MODERATE tags = list(TAG_DESTRUCTIVE, TAG_COMBAT) /datum/round_event/cloner_corruption/start() From 1bf0e1459d72f795487be018af29ad1f5cde243d Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Mon, 10 Jun 2024 19:44:30 -0700 Subject: [PATCH 31/43] Update evil_event.dm --- monkestation/code/modules/antagonists/evil_clone/evil_event.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index 1af1f9f9cd30bd..30fbfbfb82268a 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -6,6 +6,7 @@ category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. track = EVENT_TRACK_MODERATE tags = list(TAG_DESTRUCTIVE, TAG_COMBAT) + earliest_start = 40 //This requires an experimental cloner to be made, so should wait until later to fire when there's better chance one has been set up. /datum/round_event/cloner_corruption/start() for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) From 3dd4e19a57dd36a90d488ffac6b3c2e65bfa59f9 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Mon, 10 Jun 2024 22:03:58 -0700 Subject: [PATCH 32/43] Update evil_event.dm --- monkestation/code/modules/antagonists/evil_clone/evil_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index 30fbfbfb82268a..2a6438d2b8d1a8 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -6,7 +6,7 @@ category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. track = EVENT_TRACK_MODERATE tags = list(TAG_DESTRUCTIVE, TAG_COMBAT) - earliest_start = 40 //This requires an experimental cloner to be made, so should wait until later to fire when there's better chance one has been set up. + earliest_start = 35 //This requires an experimental cloner to be made, so should wait until later to fire when there's better chance one has been set up. /datum/round_event/cloner_corruption/start() for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) From 85293b7afbbef771f29b650af166cacf1fd816bc Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Tue, 11 Jun 2024 17:21:17 -0700 Subject: [PATCH 33/43] Cloning console is EMP immune. Experimental cloners are often right next to a cloning console, so an EMP that affects one often affects the other. This nullifies the threat since the clone console would be destroyed turning off the cloner. This makes the EMP not destroy the clone computer. --- monkestation/code/game/machinery/computer/cloning.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/monkestation/code/game/machinery/computer/cloning.dm b/monkestation/code/game/machinery/computer/cloning.dm index 3dcd237a4b90fa..645f6b34a6f939 100644 --- a/monkestation/code/game/machinery/computer/cloning.dm +++ b/monkestation/code/game/machinery/computer/cloning.dm @@ -36,6 +36,8 @@ /obj/machinery/computer/cloning/Initialize() . = ..() updatemodules(TRUE) + AddElement(/datum/element/empprotection, EMP_PROTECT_SELF) // So when an experimental cloner gets emped, it's cloning console doesn't break nullifying the threat. + /obj/machinery/computer/cloning/Destroy() if(pods) From 821b2827e915274b468246a00cca5ad5bd2377a7 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:05:22 -0700 Subject: [PATCH 34/43] Adds clone army kit traitor item 20 tc clone army kit with everything you need to start a clone army. You can code in whatever objective you want. --- .../code/game/machinery/exp_cloner.dm | 10 +++- .../game/objects/items/storage/uplink_kits.dm | 24 +++++++++ .../research/designs/machine_designs.dm | 16 ++++-- .../modules/research/techweb/all_nodes.dm | 2 +- .../code/modules/uplink/uplink_items/job.dm | 51 +++++++++++++++++++ 5 files changed, 98 insertions(+), 5 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 2f2e197fa87918..d4ee8f938d94cd 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -13,6 +13,8 @@ var/evil_objective = null /// Can my objective be changed? var/locked = FALSE + /// The custom objective given by the traitor item. + var/custom_objective = null /obj/machinery/clonepod/experimental/Destroy() clear_human_dummy(REF(src)) @@ -26,7 +28,7 @@ /obj/machinery/clonepod/experimental/RefreshParts() . = ..() - if(!isnull(evil_objective)) + if(!isnull(evil_objective) || !isnull(custom_objective)) speed_coeff = round(speed_coeff / 2) // So better parts have half the speed increase. speed_coeff += 1 // I still want basic parts to have base 100% speed. @@ -109,6 +111,12 @@ /obj/machinery/clonepod/experimental/exp_clone_check(mob/living/carbon/human/mob_occupant) if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) + else if(!isnull(custom_objective)) + var/datum/antagonist/evil_clone/antag_object = new + var/datum/objective/evil_clone/custom = new + custom.explanation_text = custom_objective + antag_object.objectives += custom + mob_occupant.mind.add_antag_datum(antag_object) else if(!isnull(evil_objective)) var/datum/antagonist/evil_clone/antag_object = new antag_object.objectives += new evil_objective() diff --git a/monkestation/code/game/objects/items/storage/uplink_kits.dm b/monkestation/code/game/objects/items/storage/uplink_kits.dm index 09b754b22d8401..d923a57ba7bffc 100644 --- a/monkestation/code/game/objects/items/storage/uplink_kits.dm +++ b/monkestation/code/game/objects/items/storage/uplink_kits.dm @@ -160,6 +160,30 @@ new /obj/item/lighter(src) new /obj/item/jammer(src) +/obj/item/storage/box/clonearmy + name = "Syndicate clone army kit" + desc = "A box containing everything you need to make a clone army. The disk inside cunningly disguised as a DNA data disk is used to give all clones a directive they must follow." + icon_state = "syndiebox" + +/obj/item/storage/box/clonearmy/PopulateContents() + var/static/items_inside = list( + /obj/item/disk/clonearmy = 1, + /obj/item/stack/sheet/iron = 15, + /obj/item/stack/sheet/glass = 4, + /obj/item/stack/cable_coil = 1, + /obj/item/circuitboard/machine/clonepod/experimental = 1, + /obj/item/circuitboard/machine/clonescanner = 1, + /obj/item/circuitboard/computer/cloning = 1, + /obj/item/stock_parts/manipulator/pico = 2, // The syndicate is so cool they gave you tier three parts instead of tier one parts. (This was funnier when I gave tier two parts.) + /obj/item/stock_parts/scanning_module/phasic = 3, + /obj/item/stock_parts/micro_laser/ultra = 1, + /obj/item/stock_parts/matter_bin/super = 1, + /obj/item/wrench = 1, + /obj/item/screwdriver/nuke = 1, + /obj/item/multitool = 1, // For those who want space between the cloning console and pod. + /obj/item/language_manual/codespeak_manual/unlimited = 1,) + generate_items_inside(items_inside, src) + #undef KIT_ITEM_CATEGORY_SUPPORT #undef KIT_ITEM_CATEGORY_WEAPONS #undef KIT_ITEM_CATEGORY_MISC diff --git a/monkestation/code/modules/research/designs/machine_designs.dm b/monkestation/code/modules/research/designs/machine_designs.dm index 41b5bcd143f049..78b0294217969f 100644 --- a/monkestation/code/modules/research/designs/machine_designs.dm +++ b/monkestation/code/modules/research/designs/machine_designs.dm @@ -7,7 +7,7 @@ category = list( RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE /datum/design/board/clonepod @@ -18,7 +18,17 @@ category = list( RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/board/clonepod_experimental + name = "Machine Design (Experimental Clone Pod)" + desc = "Allows for the construction of circuit boards used to build an Experimental Cloning Pod." + id = "clonepod_experimental" + build_path = /obj/item/circuitboard/machine/clonepod/experimental + category = list( + RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL + ) + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE /datum/design/board/clonescanner //hippie end, re-add cloning @@ -29,7 +39,7 @@ category = list( RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL + departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE /datum/design/board/nanite_chamber name = "Machine Design (Nanite Chamber Board)" diff --git a/monkestation/code/modules/research/techweb/all_nodes.dm b/monkestation/code/modules/research/techweb/all_nodes.dm index 71a2f10f00bd4a..80cd1645ccd94e 100644 --- a/monkestation/code/modules/research/techweb/all_nodes.dm +++ b/monkestation/code/modules/research/techweb/all_nodes.dm @@ -3,7 +3,7 @@ display_name = "Cloning" description = "We have the technology to make him." prereq_ids = list("biotech") - design_ids = list("clonecontrol", "clonepod", "clonescanner", "dnascanner", "dna_disk") + design_ids = list("clonecontrol", "clonepod", "clonescanner", "dnascanner", "dna_disk", "clonepod_experimental") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /////////////////////////Nanites///////////////////////// diff --git a/monkestation/code/modules/uplink/uplink_items/job.dm b/monkestation/code/modules/uplink/uplink_items/job.dm index 216d4cb5987d0f..49c022ac4b79e2 100644 --- a/monkestation/code/modules/uplink/uplink_items/job.dm +++ b/monkestation/code/modules/uplink/uplink_items/job.dm @@ -11,3 +11,54 @@ /datum/uplink_item/role_restricted/modified_syringe_gun surplus = 50 + +/datum/uplink_item/role_restricted/clonekit + name = "Clone Army Kit" + desc = "Everything you need for a clone army, armaments not included." + progression_minimum = 5 MINUTES + cost = 20 + item = /obj/item/storage/box/clonearmy + restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) + +///I know this probably isn't the right place to put it, but I don't know where I should put it, and I can move it later. +/obj/item/disk/clonearmy + name = "DNA data disk" //Cunning disguise. + var/objective = "" + icon_state = "datadisk0" + +/obj/item/disk/clonearmy/Initialize(mapload) + . = ..() + icon_state = "datadisk[rand(0,7)]" + add_overlay("datadisk_gene") + +/obj/item/disk/clonearmy/attack_self(mob/user) + var/targName = tgui_input_text(user, "Enter a directive for the evil clones.", "Clone Directive Entry", objective, CONFIG_GET(number/max_law_len), TRUE) + if(!targName) + return + if(is_ic_filtered(targName)) + to_chat(user, span_warning("Error: Directive contains invalid text.")) + return + var/list/soft_filter_result = is_soft_ooc_filtered(targName) + if(soft_filter_result) + if(tgui_alert(user,"Your directive contains \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\". \"[soft_filter_result[CHAT_FILTER_INDEX_REASON]]\", Are you sure you want to use it?", "Soft Blocked Word", list("Yes", "No")) != "Yes") + return + message_admins("[ADMIN_LOOKUPFLW(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for a clone directive. Directive: \"[html_encode(targName)]\"") + log_admin_private("[key_name(user)] has passed the soft filter for \"[soft_filter_result[CHAT_FILTER_INDEX_WORD]]\" they may be using a disallowed term for a clone directive. Directive: \"[targName]\"") + objective = targName + ..() + +/obj/item/disk/clonearmy/attack() + return + +/obj/item/disk/clonearmy/afterattack(atom/target, mob/user, proximity) + . = ..() + var/atom/A = target + if(!proximity) + return + . |= AFTERATTACK_PROCESSED_ITEM + if(!istype(A, /obj/machinery/clonepod/experimental)) + return + to_chat(user, "You upload the directive to the experimental cloner.") + var/obj/machinery/clonepod/experimental/pod = target + pod.custom_objective = objective + pod.RefreshParts() From 1a4e3a7304f9da277c6f50cb7e643b0c8b5ed08e Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 13 Jun 2024 03:15:52 -0700 Subject: [PATCH 35/43] When you give evil clones an objective, they're automatically taught codespeak --- monkestation/code/game/machinery/exp_cloner.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index d4ee8f938d94cd..91053677c97f4a 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -117,6 +117,9 @@ custom.explanation_text = custom_objective antag_object.objectives += custom mob_occupant.mind.add_antag_datum(antag_object) + mob_occupant.grant_language(/datum/language/codespeak) // So you don't have to remember to grant each and every identical clone codespeak with the manual. + mob_occupant.remove_blocked_language(/datum/language/codespeak, source=LANGUAGE_ALL) // All the effects the codespeak manual would have. + ADD_TRAIT(mob_occupant, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) else if(!isnull(evil_objective)) var/datum/antagonist/evil_clone/antag_object = new antag_object.objectives += new evil_objective() From 89a5460b37a9034be449de3d47a3cc0b896f9324 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 13 Jun 2024 18:14:45 -0700 Subject: [PATCH 36/43] Gives cloner kit to more jobs. --- monkestation/code/modules/uplink/uplink_items/job.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/monkestation/code/modules/uplink/uplink_items/job.dm b/monkestation/code/modules/uplink/uplink_items/job.dm index 49c022ac4b79e2..2d35b315d0f1bc 100644 --- a/monkestation/code/modules/uplink/uplink_items/job.dm +++ b/monkestation/code/modules/uplink/uplink_items/job.dm @@ -18,7 +18,7 @@ progression_minimum = 5 MINUTES cost = 20 item = /obj/item/storage/box/clonearmy - restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR) + restricted_roles = list(JOB_GENETICIST, JOB_RESEARCH_DIRECTOR, JOB_MEDICAL_DOCTOR, JOB_CHIEF_MEDICAL_OFFICER, JOB_CARGO_TECHNICIAN, JOB_QUARTERMASTER) // Experimental cloners were traditionally bought by cargo. ///I know this probably isn't the right place to put it, but I don't know where I should put it, and I can move it later. /obj/item/disk/clonearmy From ce801fd21503205f0ed93206622d28a819ef93db Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 14 Jun 2024 01:18:33 -0700 Subject: [PATCH 37/43] Adds stuff I forgot to add for the syndie item stuff. --- monkestation/code/game/machinery/exp_cloner.dm | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 91053677c97f4a..514b6e62f74b9f 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -7,6 +7,7 @@ req_access = null circuit = /obj/item/circuitboard/machine/clonepod/experimental internal_radio = FALSE + grab_ghost_when = CLONER_FRESH_CLONE // This helps with getting the objective for evil clones to display. VAR_PRIVATE static/list/image/cached_clone_images /// Am I producing evil clones? @@ -22,8 +23,8 @@ /obj/machinery/clonepod/experimental/examine(mob/user) . = ..() - if(evil_objective && (in_range(user, src) || isobserver(user))) - if(!isnull(evil_objective)) + if((evil_objective || custom_objective) && (in_range(user, src) || isobserver(user))) + if(!isnull(evil_objective) || !isnull(custom_objective)) . += span_warning("You notice an ominous, flashing red LED light.") /obj/machinery/clonepod/experimental/RefreshParts() @@ -74,7 +75,10 @@ var/role_text var/poll_text - if(!isnull(evil_objective)) + if(!isnull(custom_objective)) + role_text = "syndicate clone" + poll_text = "Do you want to play as [clonename]'s syndicate clone?" + else if(!isnull(evil_objective)) role_text = "evil clone" poll_text = "Do you want to play as [clonename]'s evil clone?" else From 480872252a7a6f97d3b040a3cff00b01c067524a Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:37:43 -0700 Subject: [PATCH 38/43] Fixes runtime Whenever an experimental cloner deleted a soulless mob, it would cause a runtime. --- monkestation/code/game/machinery/cloning.dm | 7 ++++--- monkestation/code/game/machinery/exp_cloner.dm | 3 +++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index d194835204edf5..1149beaa7fbade 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -386,7 +386,7 @@ if(!mob_occupant) return - exp_clone_check(mob_occupant) + var/move = exp_clone_check(mob_occupant) current_insurance = null REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT) @@ -407,7 +407,8 @@ mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, mob_occupant.getCloneLoss()) - occupant.forceMove(T) + if(move) // Preventing runtime + occupant.forceMove(T) icon_state = "pod_0" mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. for(var/fl in unattached_flesh) @@ -417,7 +418,7 @@ occupant = null /obj/machinery/clonepod/proc/exp_clone_check(mob_occupant) - return + return TRUE /obj/machinery/clonepod/proc/malfunction() var/mob/living/mob_occupant = occupant diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 514b6e62f74b9f..a77e075f853ec5 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -115,6 +115,7 @@ /obj/machinery/clonepod/experimental/exp_clone_check(mob/living/carbon/human/mob_occupant) if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) + return FALSE else if(!isnull(custom_objective)) var/datum/antagonist/evil_clone/antag_object = new var/datum/objective/evil_clone/custom = new @@ -124,10 +125,12 @@ mob_occupant.grant_language(/datum/language/codespeak) // So you don't have to remember to grant each and every identical clone codespeak with the manual. mob_occupant.remove_blocked_language(/datum/language/codespeak, source=LANGUAGE_ALL) // All the effects the codespeak manual would have. ADD_TRAIT(mob_occupant, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) + return TRUE else if(!isnull(evil_objective)) var/datum/antagonist/evil_clone/antag_object = new antag_object.objectives += new evil_objective() mob_occupant.mind.add_antag_datum(antag_object) + return TRUE /obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna) RETURN_TYPE(/image) From b9820f71b86b02f6a4587a0e152d2e18e4ed11d1 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sat, 15 Jun 2024 00:23:39 -0700 Subject: [PATCH 39/43] Revert "Fixes runtime" This reverts commit 480872252a7a6f97d3b040a3cff00b01c067524a. --- monkestation/code/game/machinery/cloning.dm | 7 +++---- monkestation/code/game/machinery/exp_cloner.dm | 3 --- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/monkestation/code/game/machinery/cloning.dm b/monkestation/code/game/machinery/cloning.dm index 1149beaa7fbade..d194835204edf5 100644 --- a/monkestation/code/game/machinery/cloning.dm +++ b/monkestation/code/game/machinery/cloning.dm @@ -386,7 +386,7 @@ if(!mob_occupant) return - var/move = exp_clone_check(mob_occupant) + exp_clone_check(mob_occupant) current_insurance = null REMOVE_TRAIT(mob_occupant, TRAIT_STABLEHEART, CLONING_POD_TRAIT) @@ -407,8 +407,7 @@ mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, mob_occupant.getCloneLoss()) - if(move) // Preventing runtime - occupant.forceMove(T) + occupant.forceMove(T) icon_state = "pod_0" mob_occupant.domutcheck(1) //Waiting until they're out before possible monkeyizing. The 1 argument forces powers to manifest. for(var/fl in unattached_flesh) @@ -418,7 +417,7 @@ occupant = null /obj/machinery/clonepod/proc/exp_clone_check(mob_occupant) - return TRUE + return /obj/machinery/clonepod/proc/malfunction() var/mob/living/mob_occupant = occupant diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index a77e075f853ec5..514b6e62f74b9f 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -115,7 +115,6 @@ /obj/machinery/clonepod/experimental/exp_clone_check(mob/living/carbon/human/mob_occupant) if(!mob_occupant?.mind) //When experimental cloner fails to get a ghost, it won't spit out a body, so we don't get an army of brainless rejects. qdel(mob_occupant) - return FALSE else if(!isnull(custom_objective)) var/datum/antagonist/evil_clone/antag_object = new var/datum/objective/evil_clone/custom = new @@ -125,12 +124,10 @@ mob_occupant.grant_language(/datum/language/codespeak) // So you don't have to remember to grant each and every identical clone codespeak with the manual. mob_occupant.remove_blocked_language(/datum/language/codespeak, source=LANGUAGE_ALL) // All the effects the codespeak manual would have. ADD_TRAIT(mob_occupant, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) - return TRUE else if(!isnull(evil_objective)) var/datum/antagonist/evil_clone/antag_object = new antag_object.objectives += new evil_objective() mob_occupant.mind.add_antag_datum(antag_object) - return TRUE /obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna) RETURN_TYPE(/image) From d17643c893abab06f65f73885d323c862740b021 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Sat, 15 Jun 2024 21:34:52 -0700 Subject: [PATCH 40/43] Clones can examine a cloner to know its objective. --- monkestation/code/game/machinery/exp_cloner.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 514b6e62f74b9f..49f1e188d3a732 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -11,7 +11,7 @@ VAR_PRIVATE static/list/image/cached_clone_images /// Am I producing evil clones? - var/evil_objective = null + var/datum/objective/evil_clone/evil_objective = null /// Can my objective be changed? var/locked = FALSE /// The custom objective given by the traitor item. @@ -26,6 +26,11 @@ if((evil_objective || custom_objective) && (in_range(user, src) || isobserver(user))) if(!isnull(evil_objective) || !isnull(custom_objective)) . += span_warning("You notice an ominous, flashing red LED light.") + if(isobserver(user)) + if(!isnull(custom_objective)) + . += span_notice("Those cloned will have the objective: [custom_objective]") //This doesn't look the best I think. + else + . += span_notice("Those cloned will have the objective: [evil_objective.explanation_text]") /obj/machinery/clonepod/experimental/RefreshParts() . = ..() From 673ee3e1bd96077fa3e6fe1f7090b0a2d06fe0d1 Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Mon, 17 Jun 2024 19:15:16 -0700 Subject: [PATCH 41/43] Buffs syndicate clones. Gives syndicate clones (and the buyer) syndicate radio implants so they can coordinate, gives syndicate clones syndicate faction, gives syndicate clones some basic access. Also removes experimental cloner from medbay fab. --- monkestation/code/game/machinery/exp_cloner.dm | 4 ++++ monkestation/code/game/objects/items/storage/uplink_kits.dm | 3 ++- monkestation/code/modules/research/designs/machine_designs.dm | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/monkestation/code/game/machinery/exp_cloner.dm b/monkestation/code/game/machinery/exp_cloner.dm index 49f1e188d3a732..bd8623ea51914c 100644 --- a/monkestation/code/game/machinery/exp_cloner.dm +++ b/monkestation/code/game/machinery/exp_cloner.dm @@ -129,6 +129,10 @@ mob_occupant.grant_language(/datum/language/codespeak) // So you don't have to remember to grant each and every identical clone codespeak with the manual. mob_occupant.remove_blocked_language(/datum/language/codespeak, source=LANGUAGE_ALL) // All the effects the codespeak manual would have. ADD_TRAIT(mob_occupant, TRAIT_TOWER_OF_BABEL, MAGIC_TRAIT) + var/obj/item/implant/radio/syndicate/imp = new(src) + imp.implant(mob_occupant) + mob_occupant.faction |= ROLE_SYNDICATE + mob_occupant.AddComponent(/datum/component/simple_access, list(ACCESS_SYNDICATE, ACCESS_MAINT_TUNNELS, ACCESS_GENETICS, ACCESS_MINERAL_STOREROOM)) //Basic/syndicate access, and genetics too because clones are genetics stuff. else if(!isnull(evil_objective)) var/datum/antagonist/evil_clone/antag_object = new antag_object.objectives += new evil_objective() diff --git a/monkestation/code/game/objects/items/storage/uplink_kits.dm b/monkestation/code/game/objects/items/storage/uplink_kits.dm index d923a57ba7bffc..d8b5ea22a5a956 100644 --- a/monkestation/code/game/objects/items/storage/uplink_kits.dm +++ b/monkestation/code/game/objects/items/storage/uplink_kits.dm @@ -181,7 +181,8 @@ /obj/item/wrench = 1, /obj/item/screwdriver/nuke = 1, /obj/item/multitool = 1, // For those who want space between the cloning console and pod. - /obj/item/language_manual/codespeak_manual/unlimited = 1,) + /obj/item/language_manual/codespeak_manual/unlimited = 1, + /obj/item/implanter/radio/syndicate = 1,) // So you can communicate with your clones, instead of having random evil clones roaming the halls with no direction. generate_items_inside(items_inside, src) #undef KIT_ITEM_CATEGORY_SUPPORT diff --git a/monkestation/code/modules/research/designs/machine_designs.dm b/monkestation/code/modules/research/designs/machine_designs.dm index 78b0294217969f..91f2b95fe4e52a 100644 --- a/monkestation/code/modules/research/designs/machine_designs.dm +++ b/monkestation/code/modules/research/designs/machine_designs.dm @@ -28,7 +28,7 @@ category = list( RND_CATEGORY_MACHINE + RND_SUBCATEGORY_MACHINE_MEDICAL ) - departmental_flags = DEPARTMENT_BITFLAG_MEDICAL | DEPARTMENT_BITFLAG_SCIENCE + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE /datum/design/board/clonescanner //hippie end, re-add cloning From 9775be8a53dd389bc1af443971b6e1dc5d208b5b Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Thu, 20 Jun 2024 09:39:51 -0700 Subject: [PATCH 42/43] Guide kit and part buff --- .../game/objects/items/storage/uplink_kits.dm | 24 +++++++++++++++---- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/monkestation/code/game/objects/items/storage/uplink_kits.dm b/monkestation/code/game/objects/items/storage/uplink_kits.dm index d8b5ea22a5a956..5b5148806f3899 100644 --- a/monkestation/code/game/objects/items/storage/uplink_kits.dm +++ b/monkestation/code/game/objects/items/storage/uplink_kits.dm @@ -174,17 +174,31 @@ /obj/item/circuitboard/machine/clonepod/experimental = 1, /obj/item/circuitboard/machine/clonescanner = 1, /obj/item/circuitboard/computer/cloning = 1, - /obj/item/stock_parts/manipulator/pico = 2, // The syndicate is so cool they gave you tier three parts instead of tier one parts. (This was funnier when I gave tier two parts.) - /obj/item/stock_parts/scanning_module/phasic = 3, - /obj/item/stock_parts/micro_laser/ultra = 1, - /obj/item/stock_parts/matter_bin/super = 1, + /obj/item/stock_parts/manipulator/femto = 2, // The syndicate is so cool they gave you tier four parts. RIP my joke about tier 2 parts. + /obj/item/stock_parts/scanning_module/triphasic = 3, + /obj/item/stock_parts/micro_laser/quadultra = 1, + /obj/item/stock_parts/matter_bin/bluespace = 1, /obj/item/wrench = 1, /obj/item/screwdriver/nuke = 1, /obj/item/multitool = 1, // For those who want space between the cloning console and pod. /obj/item/language_manual/codespeak_manual/unlimited = 1, - /obj/item/implanter/radio/syndicate = 1,) // So you can communicate with your clones, instead of having random evil clones roaming the halls with no direction. + /obj/item/implanter/radio/syndicate = 1, // So you can communicate with your clones, instead of having random evil clones roaming the halls with no direction. + /obj/item/paper/clone_guide = 1,) generate_items_inside(items_inside, src) +/obj/item/paper/clone_guide + name = "Clone Army User Manual" // Start and end shamelessly copied from contractor guide. I am not a good writer. This is also ugly. + default_raw_text = {"Welcome agent, thank you for purchasing the clone army kit.
\ +
    \ +
  • The "DNA data disk" inside is actually a sophisticated device that can be used to hijack an experimental cloner, giving the clones a directive they must follow.
  • \ +
  • In order to use this disk, use it in your hand, and input your desired directive, before hitting the cloner with the disk. You can input and upload a new objective to replace the old one if you ever feel like it, the disk is infinitely reusable.
  • \ +
  • The clones will be given basic access, including syndicate, maintenance, genetics, and mineral storage. They will also be given an implanted syndicate radio and automatically taught codespeak. Syndicate turrets and the like will recognize the clones as a member of the syndicate.
  • \ +
  • Be wary, the clones will have obviously evil red eyes, which will alert anyone who sees them with no eye covering that something is wrong with them. Also, don't try to use this on newer cloning models, Nanotrasen fixed the vulnerability that lets the disk work in their newer models.
  • \ +
  • When hacked, a cloner will begin to operate slower, and anyone who examines it closely will be able to see that the cloner is malfunctioning.
  • \ +
  • A tip, any activated mutations in the person being scanned, will be present in the clones produced, allowing you to give the clones some intrinsic powers. Make sure to use activators, not mutators.
  • \ +
+ Good luck agent. You can burn this document."} + #undef KIT_ITEM_CATEGORY_SUPPORT #undef KIT_ITEM_CATEGORY_WEAPONS #undef KIT_ITEM_CATEGORY_MISC From bf25a7550b2c33fe525c6b876e60762751d2339c Mon Sep 17 00:00:00 2001 From: Uristthedorf <40842973+Uristthedorf@users.noreply.github.com> Date: Mon, 24 Jun 2024 19:48:53 -0700 Subject: [PATCH 43/43] Cloner corruption event improvement. Evil event will refund itself if it doesn't find any experimental cloners to corrupt, also fixes the earliest_start variable to use minutes instead of ticks. (At least I think it was using ticks.) Also removes destructive tag from event because the clones generally don't want wanton destruction. --- .../code/modules/antagonists/evil_clone/evil_event.dm | 8 ++++++-- monkestation/code/modules/uplink/uplink_items/job.dm | 1 + 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm index 2a6438d2b8d1a8..10d5b481d9ccf6 100644 --- a/monkestation/code/modules/antagonists/evil_clone/evil_event.dm +++ b/monkestation/code/modules/antagonists/evil_clone/evil_event.dm @@ -5,11 +5,15 @@ weight = 3 category = EVENT_CATEGORY_ENTITIES //Kinda, evil clones ARE entities. track = EVENT_TRACK_MODERATE - tags = list(TAG_DESTRUCTIVE, TAG_COMBAT) - earliest_start = 35 //This requires an experimental cloner to be made, so should wait until later to fire when there's better chance one has been set up. + tags = list(TAG_COMBAT) // Clones will likely start a fight, but will usually not cause wanton destruction. + earliest_start = 35 MINUTES //This requires an experimental cloner to be made, so should wait until later to fire when there's better chance one has been set up. /datum/round_event/cloner_corruption/start() + var/found = FALSE for(var/obj/machinery/clonepod/experimental/cloner in GLOB.machines) if(!cloner.locked) cloner.evil_objective = pick(subtypesof(/datum/objective/evil_clone)) cloner.RefreshParts() + found = TRUE + if(!found) // Refund if no experimental cloners are found. + control.occurrences-- diff --git a/monkestation/code/modules/uplink/uplink_items/job.dm b/monkestation/code/modules/uplink/uplink_items/job.dm index 2d35b315d0f1bc..8d80747eca3d5f 100644 --- a/monkestation/code/modules/uplink/uplink_items/job.dm +++ b/monkestation/code/modules/uplink/uplink_items/job.dm @@ -62,3 +62,4 @@ var/obj/machinery/clonepod/experimental/pod = target pod.custom_objective = objective pod.RefreshParts() + pod.locked = TRUE // The pod shouldn't be eligible for cloner event.