Skip to content

Commit

Permalink
[MIRROR] Cult vs Heretic overall polishing (Skyrat-SS13#28981)
Browse files Browse the repository at this point in the history
* Cult vs Heretic overall polishing

* Update signals_mob_living.dm

---------

Co-authored-by: carlarctg <[email protected]>
Co-authored-by: SpaceLoveSs13 <[email protected]>
  • Loading branch information
3 people authored Jul 24, 2024
1 parent 32a11e8 commit 112ee98
Show file tree
Hide file tree
Showing 22 changed files with 67 additions and 61 deletions.
2 changes: 1 addition & 1 deletion code/__DEFINES/cult.dm
Original file line number Diff line number Diff line change
Expand Up @@ -58,5 +58,5 @@ GLOBAL_LIST(sacrificed)

// Used to keep track of items rewarded after a heretic is sacked.
#define CURSED_BLADE_UNLOCKED "Cursed Blade"
#define CRIMSON_FOCUS_UNLOCKED "Crimson Focus"
#define CRIMSON_MEDALLION_UNLOCKED "Crimson Medallion"
#define PROTEON_ORB_UNLOCKED "Proteon Orb"
3 changes: 3 additions & 0 deletions code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm
Original file line number Diff line number Diff line change
Expand Up @@ -294,5 +294,8 @@
#define COMSIG_MOB_HAPPINESS_CHANGE "happiness_change"
/// From /obj/item/melee/baton/baton_effect(): (datum/source, mob/living/user, /obj/item/melee/baton)
#define COMSIG_MOB_BATONED "mob_batoned"

/// Sent to the mob when their mind is slaved
#define COMSIG_MOB_ENSLAVED_TO "mob_enslaved_to"
/// From /obj/item/proc/attack_atom: (mob/living/attacker, atom/attacked)
#define COMSIG_LIVING_ATTACK_ATOM "living_attack_atom"
6 changes: 3 additions & 3 deletions code/_onclick/hud/alert.dm
Original file line number Diff line number Diff line change
Expand Up @@ -549,9 +549,9 @@ or shoot a gun to move around via Newton's 3rd Law of Motion."
construct_owner = null

// construct track
if(construct_owner?.seeking && construct_owner.master)
blood_target = construct_owner.master
desc = "Your blood sense is leading you to [construct_owner.master]"
if(construct_owner?.seeking && construct_owner.construct_master)
blood_target = construct_owner.construct_master
desc = "Your blood sense is leading you to [construct_owner.construct_master]"

// cult track
var/datum/antagonist/cult/antag = owner.mind.has_antag_datum(/datum/antagonist/cult,TRUE)
Expand Down
10 changes: 8 additions & 2 deletions code/datums/components/spirit_holding.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,17 @@
var/allow_renaming
/// Allows channeling
var/allow_channeling
/// Allows exorcism
var/allow_exorcism
///mob contained in the item.
var/mob/living/basic/shade/bound_spirit

/datum/component/spirit_holding/Initialize(datum/mind/soul_to_bind, mob/awakener, allow_renaming = TRUE, allow_channeling = TRUE)
/datum/component/spirit_holding/Initialize(datum/mind/soul_to_bind, mob/awakener, allow_renaming = TRUE, allow_channeling = TRUE, allow_exorcism = TRUE)
if(!ismovable(parent)) //you may apply this to mobs, i take no responsibility for how that works out
return COMPONENT_INCOMPATIBLE
src.allow_renaming = allow_renaming
src.allow_channeling = allow_channeling
src.allow_exorcism = allow_exorcism
if(soul_to_bind)
bind_the_soule(soul_to_bind, awakener, soul_to_bind.name)

Expand Down Expand Up @@ -107,7 +110,8 @@
bound_spirit.get_language_holder().omnitongue = TRUE //Grants omnitongue

RegisterSignal(parent, COMSIG_ATOM_RELAYMOVE, PROC_REF(block_buckle_message))
RegisterSignal(parent, COMSIG_BIBLE_SMACKED, PROC_REF(on_bible_smacked))
if(allow_exorcism)
RegisterSignal(parent, COMSIG_BIBLE_SMACKED, PROC_REF(on_bible_smacked))

/**
* custom_name : Simply sends a tgui input text box to the blade asking what name they want to be called, and retries it if the input is invalid.
Expand Down Expand Up @@ -139,6 +143,8 @@
* * exorcist: user who is attempting to remove the spirit
*/
/datum/component/spirit_holding/proc/attempt_exorcism(mob/exorcist)
if(!allow_exorcism)
return // just in case
var/atom/movable/exorcised_movable = parent
to_chat(exorcist, span_notice("You begin to exorcise [parent]..."))
playsound(parent, 'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
Expand Down
3 changes: 2 additions & 1 deletion code/datums/mind/antag.dm
Original file line number Diff line number Diff line change
Expand Up @@ -215,9 +215,10 @@
N.nukeop_outfit = null
add_antag_datum(N,converter.nuke_team)


enslaved_to = WEAKREF(creator)

SEND_SIGNAL(current, COMSIG_MOB_ENSLAVED_TO, creator)

current.faction |= creator.faction
creator.faction |= "[REF(current)]"

Expand Down
2 changes: 1 addition & 1 deletion code/modules/antagonists/cult/blood_magic.dm
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
default_button_position = DEFAULT_BLOODSPELLS
var/list/spells = list()
var/channeling = FALSE
/// If the magic has been enhanced somehow, likely due to a crimson focus.
/// If the magic has been enhanced somehow, likely due to a crimson medallion.
var/magic_enhanced = FALSE

/datum/action/innate/cult/blood_magic/Remove()
Expand Down
1 change: 1 addition & 0 deletions code/modules/antagonists/cult/cult_items.dm
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,7 @@ Striking a noncultist, however, will tear their flesh."}
awakener = awakener,\
allow_renaming = FALSE,\
allow_channeling = FALSE,\
allow_exorcism = FALSE,\
)

// Get the heretic's new body and antag datum.
Expand Down
12 changes: 6 additions & 6 deletions code/modules/antagonists/cult/cult_structure_archives.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
#define CULT_BLINDFOLD "Zealot's Blindfold"
#define CURSE_ORB "Shuttle Curse"
#define VEIL_WALKER "Veil Walker Set"
#define CRIMSON_FOCUS "Crimson Focus"
#define CRIMSON_MEDALLION "Crimson Medallion"

// Cult archives. Gives out utility items.
/obj/structure/destructible/cult/item_dispenser/archives
Expand Down Expand Up @@ -38,11 +38,11 @@
options += extra_item

/obj/structure/destructible/cult/item_dispenser/archives/extra_options()
if(!cult_team?.unlocked_heretic_items[CRIMSON_FOCUS_UNLOCKED])
if(!cult_team?.unlocked_heretic_items[CRIMSON_MEDALLION_UNLOCKED])
return
return list(CRIMSON_FOCUS = list(
PREVIEW_IMAGE = image(icon = 'icons/obj/clothing/neck.dmi', icon_state = "crimson_focus"),
OUTPUT_ITEMS = list(/obj/item/clothing/neck/heretic_focus/crimson_focus),
return list(CRIMSON_MEDALLION = list(
PREVIEW_IMAGE = image(icon = 'icons/obj/clothing/neck.dmi', icon_state = "crimson_medallion"),
OUTPUT_ITEMS = list(/obj/item/clothing/neck/heretic_focus/crimson_medallion),
),
)

Expand All @@ -56,4 +56,4 @@
#undef CULT_BLINDFOLD
#undef CURSE_ORB
#undef VEIL_WALKER
#undef CRIMSON_FOCUS
#undef CRIMSON_MEDALLION
2 changes: 1 addition & 1 deletion code/modules/antagonists/cult/datums/cult_team.dm
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
/// List that keeps track of which items have been unlocked after a heretic was sacked.
var/list/unlocked_heretic_items = list(
CURSED_BLADE_UNLOCKED = FALSE,
CRIMSON_FOCUS_UNLOCKED = FALSE,
CRIMSON_MEDALLION_UNLOCKED = FALSE,
PROTEON_ORB_UNLOCKED = FALSE,
)

Expand Down
5 changes: 5 additions & 0 deletions code/modules/antagonists/cult/sword_fling.dm
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,8 @@
particle_to_spawn = /obj/effect/particle_effect/sparks/electricity

new particle_to_spawn(get_turf(loccer))
loccer.shake_up_animation()
playsound(loccer, 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1)

if(prob(resist_chance))
flinged_sword.forceMove(get_turf(loccer))
Expand Down Expand Up @@ -82,6 +84,9 @@
flinged_sword.throw_at(cast_on, cast_range, flinged_sword.throw_speed, owner)
flinged_sword.visible_message(\
span_warning("\the [flinged_sword] lunges at \the [cast_on]!"))
playsound(flinged_sword, 'sound/items/haunted/ghostitemattack.ogg', 100, TRUE)
flinged_sword.add_filter("cool_glow", 2, list("type" = "outline", "color" = COLOR_HERETIC_GREEN, "size" = 0.7))
addtimer(CALLBACK(flinged_sword, TYPE_PROC_REF(/datum, remove_filter), "cool_glow"), 0.7 SECONDS)

/obj/effect/temp_visual/eldritch_sparks
icon_state = "purplesparkles"
Expand Down
2 changes: 1 addition & 1 deletion code/modules/antagonists/heretic/heretic_antag.dm
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@
/// List that keeps track of which items have been gifted to the heretic after a cultist was sacrificed. Used to alter drop chances to reduce dupes.
var/list/unlocked_heretic_items = list(
/obj/item/melee/sickly_blade/cursed = 0,
/obj/item/clothing/neck/heretic_focus/crimson_focus = 0,
/obj/item/clothing/neck/heretic_focus/crimson_medallion = 0,
/mob/living/basic/construct/harvester/heretic = 0,
)
/// Simpler version of above used to limit amount of loot that can be hoarded
Expand Down
1 change: 0 additions & 1 deletion code/modules/antagonists/heretic/heretic_knowledge.dm
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,6 @@

var/datum/antagonist/heretic_monster/heretic_monster = summoned.mind.add_antag_datum(/datum/antagonist/heretic_monster)
heretic_monster.set_owner(user.mind)
summoned.RegisterSignal(user, COMSIG_LIVING_DEATH, TYPE_PROC_REF(/mob/living/, on_master_death))

var/datum/objective/heretic_summon/summon_objective = locate() in user.mind.get_all_objectives()
summon_objective?.num_summoned++
Expand Down
5 changes: 1 addition & 4 deletions code/modules/antagonists/heretic/heretic_monsters.dm
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
*/
/datum/antagonist/heretic_monster/proc/set_owner(datum/mind/master)
src.master = master
owner.enslave_mind_to_creator(master.current)

var/datum/objective/master_obj = new()
master_obj.owner = owner
Expand All @@ -38,7 +39,3 @@
owner.announce_objectives()
to_chat(owner, span_boldnotice("You are a [ishuman(owner.current) ? "shambling corpse returned":"horrible creation brought"] to this plane through the Gates of the Mansus."))
to_chat(owner, span_notice("Your master is [master]. Assist them to all ends."))

if(istype(owner.current, /mob/living/basic/construct/harvester/heretic))
var/mob/living/basic/construct/harvester/heretic/shitcode = owner.current
shitcode.master = master
14 changes: 7 additions & 7 deletions code/modules/antagonists/heretic/items/heretic_necks.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,16 @@
. = ..()
AddElement(/datum/element/heretic_focus)

/obj/item/clothing/neck/heretic_focus/crimson_focus
name = "Crimson Focus"
/obj/item/clothing/neck/heretic_focus/crimson_medallion
name = "Crimson Medallion"
desc = "A blood-red focusing glass that provides a link to the world beyond, and worse. Its eye is constantly twitching and gazing in all directions. It almost seems to be silently screaming..."
icon_state = "crimson_focus"
icon_state = "crimson_medallion"
/// The aura healing component. Used to delete it when taken off.
var/datum/component/component
/// If active or not, used to add and remove its cult and heretic buffs.
var/active = FALSE

/obj/item/clothing/neck/heretic_focus/crimson_focus/equipped(mob/living/user, slot)
/obj/item/clothing/neck/heretic_focus/crimson_medallion/equipped(mob/living/user, slot)
. = ..()
if(!(slot & ITEM_SLOT_NECK))
return
Expand Down Expand Up @@ -51,7 +51,7 @@
healing_color = team_color, \
)

/obj/item/clothing/neck/heretic_focus/crimson_focus/dropped(mob/living/user)
/obj/item/clothing/neck/heretic_focus/crimson_medallion/dropped(mob/living/user)
. = ..()

if(!istype(user))
Expand All @@ -75,7 +75,7 @@
magic_holder?.magic_enhanced = FALSE


/obj/item/clothing/neck/heretic_focus/crimson_focus/attack_self(mob/living/user, modifiers)
/obj/item/clothing/neck/heretic_focus/crimson_medallion/attack_self(mob/living/user, modifiers)
. = ..()
to_chat(user, span_danger("You start tightly squeezing [src]..."))
if(!do_after(user, 1.25 SECONDS, src))
Expand All @@ -90,7 +90,7 @@
user.reagents?.add_reagent(/datum/reagent/eldritch, rand(6, 10))
qdel(src)

/obj/item/clothing/neck/heretic_focus/crimson_focus/examine(mob/user)
/obj/item/clothing/neck/heretic_focus/crimson_medallion/examine(mob/user)
. = ..()

var/magic_dude
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@
heretic_datum.knowledge_points += 3
heretic_datum.high_value_sacrifices++
feedback += " <i>graciously</i>"
else if(cultist_datum)
if(cultist_datum)
heretic_datum.knowledge_points += 1
grant_reward(user, sacrifice, loc)
// easier to read
Expand All @@ -229,9 +229,9 @@
span_narsie(" one of our own. Destroy and sacrifice the infidel before it claims more!")
to_chat(mind.current, message)
// he(retic) gets a warn too
var/message = span_cult_bold("You feel that your action has attracted") + \
span_cult_bold_italic(" attention.")
to_chat(user, message)
to_chat(user, span_narsiesmall("How DARE you!? I will see you destroyed for this."))
var/non_flavor_warning = span_cult_bold("You feel that your action has attracted ") + span_hypnophrase("attention") + span_cult_bold(".")
to_chat(user, non_flavor_warning)
return
else
heretic_datum.knowledge_points += 2
Expand Down Expand Up @@ -263,12 +263,6 @@
var/datum/antagonist/heretic/antag = IS_HERETIC(user)
antag.rewards_given++

// We limit the amount so the heretic doesn't just turn into a frickin' god (early)
to_chat(user, span_hierophant("You feel the rotten energies of the infidel warp and twist, mixing with that of your own..."))
if(prob(8 * antag.rewards_given))
to_chat(user, span_hierophant("Faint, dark red sparks flit around the dust, then fade. It looks like your patrons weren't able to fashion something out of it."))
return

// Cool effect for the rune as well as the item
var/obj/effect/heretic_rune/rune = locate() in range(2, user)
if(rune)
Expand All @@ -285,7 +279,7 @@
/datum/heretic_knowledge/hunt_and_sacrifice/proc/deposit_reward(mob/user, turf/loc, loop = 0, obj/rune)
if(loop > 5) // Max limit for retrying a reward
return
// Remove the rays, we don't need them anymore.
// Remove the outline, we don't need it anymore.
rune?.remove_filter("reward_outline")
playsound(loc, 'sound/magic/repulse.ogg', 75, TRUE)
var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
Expand Down
2 changes: 1 addition & 1 deletion code/modules/antagonists/wizard/equipment/soulstone.dm
Original file line number Diff line number Diff line change
Expand Up @@ -516,7 +516,7 @@
playsound(newstruct, 'sound/effects/constructform.ogg', 50)
if(stoner)
newstruct.faction |= "[REF(stoner)]"
newstruct.master = stoner
newstruct.construct_master = stoner
var/datum/action/innate/seek_master/seek_master = new
seek_master.Grant(newstruct)

Expand Down
2 changes: 1 addition & 1 deletion code/modules/library/bibles.dm
Original file line number Diff line number Diff line change
Expand Up @@ -316,7 +316,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
playsound(src,'sound/hallucinations/veryfar_noise.ogg',40,TRUE)
if(do_after(user, 4 SECONDS, target = sword))
playsound(src,'sound/effects/pray_chaplain.ogg',60,TRUE)
new /obj/item/nullrod/claymore(get_turf(sword))
new /obj/item/nullrod/nullblade(get_turf(sword))
user.visible_message(span_notice("[user] exorcises [sword]!"))
qdel(sword)
return ITEM_INTERACT_SUCCESS
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
/// Flavor text shown to players when they spawn as this construct
var/playstyle_string = "You are a generic construct. Your job is to not exist, and you should probably adminhelp this."
/// The construct's master
var/master = null
var/mob/construct_master = null
/// Whether this construct is currently seeking nar nar
var/seeking = FALSE
/// Whether this construct can repair other constructs or cult buildings. Gets the healing_touch component if so.
Expand Down
35 changes: 16 additions & 19 deletions code/modules/mob/living/basic/cult/constructs/harvester.dm
Original file line number Diff line number Diff line change
Expand Up @@ -80,9 +80,9 @@
var/datum/objective/eldergod/summon_objective = locate() in cult_status.cult_team.objectives

if(summon_objective.check_completion())
the_construct.master = cult_status.cult_team.blood_target
the_construct.construct_master = cult_status.cult_team.blood_target

if(!the_construct.master)
if(!the_construct.construct_master)
to_chat(the_construct, span_cult_italic("You have no master to seek!"))
the_construct.seeking = FALSE
return
Expand Down Expand Up @@ -122,8 +122,8 @@
to_chat(the_construct, span_cult_italic("Nar'Sie has completed her harvest!"))
return

the_construct.master = pick(GLOB.cult_narsie.souls_needed)
var/mob/living/real_target = the_construct.master //We can typecast this way because Narsie only allows /mob/living into the souls list
the_construct.construct_master = pick(GLOB.cult_narsie.souls_needed)
var/mob/living/real_target = the_construct.construct_master //We can typecast this way because Narsie only allows /mob/living into the souls list
to_chat(the_construct, span_cult_italic("You are now tracking your prey, [real_target.real_name] - harvest [real_target.p_them()]!"))
desc = "Activate to track Nar'Sie!"
button_icon_state = "sintouch"
Expand All @@ -150,33 +150,33 @@
lighting_cutoff_red = 10
lighting_cutoff_green = 20
lighting_cutoff_blue = 5
playstyle_string = "<B>You are a Rusted Harvester, built to serve the Sanguine Apostate, twisted to work the will of the Mansus. You are fragile and weak, but you rend cultists (only) apart on each attack. Follow your Master's orders!<B>"
playstyle_string = span_bold("You are a Rusted Harvester, built to serve the Sanguine Apostate, twisted to work the will of the Mansus. You are fragile and weak, but you rend cultists (only) apart on each attack. Follow your Master's orders!")
theme = THEME_HERETIC

/mob/living/basic/construct/harvester/heretic/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_MANSUS_TOUCHED, REF(src))
add_filter("rusted_harvester", 3, list("type" = "outline", "color" = COLOR_GREEN, "size" = 2, "alpha" = 40))
RegisterSignal(src, COMSIG_MIND_TRANSFERRED, TYPE_PROC_REF(/datum/mind, enslave_mind_to_creator))
RegisterSignal(src, COMSIG_MOB_ENSLAVED_TO, PROC_REF(link_master))

/mob/living/basic/construct/harvester/heretic/proc/link_master(mob/self, mob/master)
src.construct_master = master
RegisterSignal(construct_master, COMSIG_LIVING_DEATH, PROC_REF(on_master_death))
SIGNAL_HANDLER

/**
* Somewhat janky proc called when a heretic monster's master dies
* Used to kill any living Rusted Harvester
*/
/mob/living/proc/on_master_death()
return
/mob/living/basic/construct/harvester/heretic/proc/on_master_death(mob/self, mob/master)
SIGNAL_HANDLER
to_chat(src, span_userdanger("Your link to the mansus suddenly snaps as your master [construct_master] perishes! Without [construct_master.p_their()] support, your body crumbles..."))
visible_message(span_alert("[src] suddenly crumbles to dust!"))
death()

/mob/living/basic/construct/harvester/heretic/attack_animal(mob/living/simple_animal/user, list/modifiers)
// They're pretty fragile so this is probably necessary to prevent bullshit deaths.
if(user == src)
return
return ..()

/mob/living/basic/construct/harvester/heretic/on_master_death()
to_chat(src, span_userdanger("Your link to the mansus suddenly snaps as your master perishes! Without its support, your body crumbles..."))
visible_message(span_alert("[src] suddenly crumbles to dust!"))
death()

/mob/living/basic/construct/harvester/heretic/grant_abilities()
AddElement(/datum/element/wall_walker, or_trait = TRAIT_RUSTY)
AddElement(/datum/element/leeching_walk)
Expand Down Expand Up @@ -233,9 +233,6 @@
. = ..()
the_construct = Target
the_construct.seeking = TRUE
var/datum/antagonist/heretic_monster/antag = IS_HERETIC_MONSTER(the_construct)
if(antag)
the_construct.master = antag.master

// no real reason for most of this weird oldcode
/datum/action/innate/seek_master/Activate()
Expand Down
3 changes: 3 additions & 0 deletions code/modules/mob/living/carbon/carbon_defense.dm
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,9 @@

// Shake animation
if (incapacitated())
shake_up_animation()

/mob/proc/shake_up_animation()
var/direction = prob(50) ? -1 : 1
animate(src, pixel_x = pixel_x + SHAKE_ANIMATION_OFFSET * direction, time = 1, easing = QUAD_EASING | EASE_OUT, flags = ANIMATION_PARALLEL)
animate(pixel_x = pixel_x - (SHAKE_ANIMATION_OFFSET * 2 * direction), time = 1)
Expand Down
Binary file modified icons/mob/clothing/neck.dmi
Binary file not shown.
Binary file modified icons/obj/clothing/neck.dmi
Binary file not shown.

0 comments on commit 112ee98

Please sign in to comment.