Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Evil Clones #2175

Closed
wants to merge 48 commits into from
Closed
Show file tree
Hide file tree
Changes from 31 commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
2d315b9
Antag
Uristthedorf Jun 5, 2024
cca9609
Update exp_cloner.dm
Uristthedorf Jun 5, 2024
f3d5dd7
Hopefully fixes
Uristthedorf Jun 6, 2024
ec7ada7
Update exp_cloner.dm
Uristthedorf Jun 6, 2024
eb62758
Examining evil cloner tells you it's evil.
Uristthedorf Jun 6, 2024
f6dd297
Update monkestation/code/game/machinery/exp_cloner.dm
Uristthedorf Jun 6, 2024
a02bc30
Update monkestation/code/game/machinery/exp_cloner.dm
Uristthedorf Jun 6, 2024
f13efbd
Update monkestation/code/game/machinery/cloning.dm
Uristthedorf Jun 6, 2024
e096666
Examine moved down to exp_cloner.dm
Uristthedorf Jun 6, 2024
f1f7c15
Merge branch 'EvilClone' of https://github.com/Uristthedorf/Monkestat…
Uristthedorf Jun 6, 2024
eb1668e
Being evil makes it clone slower.
Uristthedorf Jun 6, 2024
26b61cf
Corrects comment
Uristthedorf Jun 6, 2024
2fadbc7
Update cloning.dm
Uristthedorf Jun 6, 2024
2265c08
Moves evil back down
Uristthedorf Jun 6, 2024
e6d5783
Better
Uristthedorf Jun 6, 2024
bbbb78c
Oops forgot to remove
Uristthedorf Jun 6, 2024
1805fff
Update exp_cloner.dm
Uristthedorf Jun 7, 2024
44a9a0c
Evil clones have unnaturally glowing red eyes.
Uristthedorf Jun 8, 2024
e7ed532
New objectives
Uristthedorf Jun 9, 2024
6c88d09
More evil clone changes.
Uristthedorf Jun 9, 2024
15f5d90
Evil clone event
Uristthedorf Jun 9, 2024
ca8d511
Update evil_event.dm
Uristthedorf Jun 10, 2024
ec6318c
Fixes it saying you have no objectives when you actually do
Uristthedorf Jun 10, 2024
e29b9df
Merge remote-tracking branch 'upstream/master' into EvilClone
Uristthedorf Jun 10, 2024
b0645da
Apply suggestions from code review
Uristthedorf Jun 10, 2024
3efe8ac
Update evil_clone_objective.dm
Uristthedorf Jun 10, 2024
8ab3789
I'm GUESSING this is what was wanted
Uristthedorf Jun 10, 2024
f6274c0
Fix?
Uristthedorf Jun 10, 2024
3c821f0
Revert "Fix?"
Uristthedorf Jun 10, 2024
02aba5c
Revert "I'm GUESSING this is what was wanted"
Uristthedorf Jun 10, 2024
8085975
Update exp_cloner.dm
Uristthedorf Jun 10, 2024
31b534d
Apply suggestions from code review
Uristthedorf Jun 10, 2024
1bf0e14
Update evil_event.dm
Uristthedorf Jun 11, 2024
3dd4e19
Update evil_event.dm
Uristthedorf Jun 11, 2024
85293b7
Cloning console is EMP immune.
Uristthedorf Jun 12, 2024
821b282
Adds clone army kit traitor item
Uristthedorf Jun 13, 2024
1a4e3a7
When you give evil clones an objective, they're automatically taught …
Uristthedorf Jun 13, 2024
89a5460
Gives cloner kit to more jobs.
Uristthedorf Jun 14, 2024
ce801fd
Adds stuff I forgot to add for the syndie item stuff.
Uristthedorf Jun 14, 2024
4808722
Fixes runtime
Uristthedorf Jun 14, 2024
b9820f7
Revert "Fixes runtime"
Uristthedorf Jun 15, 2024
d17643c
Clones can examine a cloner to know its objective.
Uristthedorf Jun 16, 2024
b0070de
Merge remote-tracking branch 'upstream/master' into EvilClone
Uristthedorf Jun 16, 2024
673ee3e
Buffs syndicate clones.
Uristthedorf Jun 18, 2024
9775be8
Guide kit and part buff
Uristthedorf Jun 20, 2024
bf25a75
Cloner corruption event improvement.
Uristthedorf Jun 25, 2024
d7947f2
Merge remote-tracking branch 'upstream/master' into EvilClone
Uristthedorf Jun 25, 2024
d4756a7
Merge remote-tracking branch 'upstream/master' into EvilClone
Uristthedorf Jul 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 51 additions & 2 deletions monkestation/code/game/machinery/exp_cloner.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,28 @@
internal_radio = FALSE
VAR_PRIVATE
static/list/image/cached_clone_images
/// Am I producing evil clones?
var/evil_objective = null
/// Can my objective be changed?
var/locked = FALSE
var/datum/antagonist/evil_clone/antag_object
Uristthedorf marked this conversation as resolved.
Show resolved Hide resolved

/obj/machinery/clonepod/experimental/Destroy()
clear_human_dummy(REF(src))
return ..()

/obj/machinery/clonepod/experimental/examine(mob/user)
. = ..()
if(evil_objective && (in_range(user, src) || isobserver(user)))
if(!isnull(evil_objective))
. += span_warning("You notice an ominous, flashing red LED light.")

/obj/machinery/clonepod/experimental/RefreshParts()
. = ..()
if(!isnull(evil_objective))
speed_coeff /= 2 // So better parts have half the speed increase.
Uristthedorf marked this conversation as resolved.
Show resolved Hide resolved
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)
if(panel_open || mess || attempting)
Expand Down Expand Up @@ -54,13 +71,22 @@
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"
wraith-54321 marked this conversation as resolved.
Show resolved Hide resolved
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_name_text = role_text
)
if(LAZYLEN(candidates))
var/mob/dead/observer/candidate = pick(candidates)
Expand All @@ -84,6 +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(!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)

/obj/machinery/clonepod/experimental/proc/get_clone_preview(datum/dna/clone_dna)
RETURN_TYPE(/image)
Expand All @@ -102,6 +132,25 @@
LAZYSET(cached_clone_images, key, preview)
return preview

/obj/machinery/clonepod/experimental/emag_act(mob/user)
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.")
RefreshParts()
else
to_chat(user, span_warning("The cloner is already malfunctioning."))

/obj/machinery/clonepod/experimental/emp_act(severity)
. = ..()
if (!(. & EMP_PROTECT_SELF))
if(prob(100/severity) && !locked)
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.")

//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"
Expand Down
23 changes: 23 additions & 0 deletions monkestation/code/modules/antagonists/evil_clone/evil_clone.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/datum/antagonist/evil_clone
name = "\improper Evil Clone"
show_in_antagpanel = TRUE
roundend_category = "evil clones"
antagpanel_category = "Evil Clones"
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/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)
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
/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 = "Make sure clones of yourself are the only ones alive. 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 of yourself 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 // 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."

/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")) //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/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."

/datum/objective/evil_clone/check_completion()
return TRUE
14 changes: 14 additions & 0 deletions monkestation/code/modules/antagonists/evil_clone/evil_event.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/datum/round_event_control/cloner_corruption
name = "Experimental Cloner Corruption"
typepath = /datum/round_event/cloner_corruption
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.)
Uristthedorf marked this conversation as resolved.
Show resolved Hide resolved
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()
3 changes: 3 additions & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -6019,6 +6019,9 @@
#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\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"
Expand Down
Loading