Merge pull request #13738 from DeltaFire15/heretic-tweaks
Updates the heretics gamemode with a bunch of changes from /tg/
This commit is contained in:
@@ -70,6 +70,7 @@
|
||||
|
||||
///Heretics --
|
||||
#define IS_HERETIC(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic))
|
||||
#define IS_HERETIC_MONSTER(mob) (mob.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
|
||||
|
||||
#define PATH_SIDE "Side"
|
||||
|
||||
|
||||
@@ -163,7 +163,7 @@
|
||||
timeout = 3 MINUTES
|
||||
|
||||
/datum/mood_event/gates_of_mansus
|
||||
description = "<span class='boldwarning'>LIVING IN A PERFORMANCE IS WORSE THAN DEATH</span>\n"
|
||||
description = "<span class='boldwarning'>I HAD A GLIMPSE OF THE HORROR BEYOND THIS WORLD. REALITY UNCOILED BEFORE MY EYES!</span>\n"
|
||||
mood_change = -25
|
||||
timeout = 4 MINUTES
|
||||
|
||||
|
||||
@@ -586,7 +586,7 @@
|
||||
|
||||
var/list/mob/living/targets = list()
|
||||
for(var/mob/living/potential_target in oview(owner, 1))
|
||||
if(IS_HERETIC(potential_target) || potential_target.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
|
||||
if(IS_HERETIC(potential_target) || IS_HERETIC_MONSTER(potential_target))
|
||||
continue
|
||||
targets += potential_target
|
||||
if(LAZYLEN(targets))
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
///Gives you a charge and destroys a corresponding influence
|
||||
/obj/item/forbidden_book/proc/get_power_from_influence(atom/target, mob/user)
|
||||
var/obj/effect/reality_smash/RS = target
|
||||
to_chat(target, "<span class='danger'>You start drawing power from influence...</span>")
|
||||
to_chat(user, "<span class='danger'>You start drawing power from influence...</span>")
|
||||
if(do_after(user,10 SECONDS,TRUE,RS))
|
||||
qdel(RS)
|
||||
charge += 1
|
||||
@@ -50,7 +50,7 @@
|
||||
|
||||
for(var/turf/T in range(1,target))
|
||||
if(is_type_in_typecache(T, blacklisted_turfs))
|
||||
to_chat(target, "<span class='warning'>The terrain doesn't support runes!</span>")
|
||||
to_chat(user, "<span class='warning'>The terrain doesn't support runes!</span>")
|
||||
return
|
||||
var/A = get_turf(target)
|
||||
to_chat(user, "<span class='danger'>You start drawing a rune...</span>")
|
||||
|
||||
@@ -8,6 +8,12 @@
|
||||
///Used mainly for summoning ritual to prevent spamming the rune to create millions of monsters.
|
||||
var/is_in_use = FALSE
|
||||
|
||||
/obj/effect/eldritch/Initialize()
|
||||
. = ..()
|
||||
var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src)
|
||||
I.override = TRUE
|
||||
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "heretic_rune", I)
|
||||
|
||||
/obj/effect/eldritch/attack_hand(mob/living/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
@@ -69,6 +75,7 @@
|
||||
if(is_type_in_list(local_atom_in_range,local_required_atom_list))
|
||||
selected_atoms |= local_atom_in_range
|
||||
local_required_atoms -= list(local_required_atom_list)
|
||||
break
|
||||
|
||||
if(length(local_required_atoms) > 0)
|
||||
continue
|
||||
@@ -190,6 +197,19 @@
|
||||
icon_state = "pierced_illusion"
|
||||
anchored = TRUE
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
alpha = 0
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
|
||||
/obj/effect/broken_illusion/Initialize()
|
||||
. = ..()
|
||||
addtimer(CALLBACK(src, .proc/show_presence), 15 SECONDS)
|
||||
var/image/I = image(icon = 'icons/effects/eldritch.dmi', icon_state = null, loc = src)
|
||||
I.override = TRUE
|
||||
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/silicons, "pierced_reality", I)
|
||||
|
||||
/obj/effect/broken_illusion/proc/show_presence()
|
||||
invisibility = 0
|
||||
animate(src, alpha = 255, time = 15 SECONDS)
|
||||
|
||||
/obj/effect/broken_illusion/attack_hand(mob/living/user)
|
||||
if(!ishuman(user))
|
||||
@@ -228,17 +248,19 @@
|
||||
explosion.start()
|
||||
|
||||
/obj/effect/broken_illusion/examine(mob/user)
|
||||
. = ..()
|
||||
if(!IS_HERETIC(user) && ishuman(user))
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
to_chat(human_user,"<span class='userdanger'>Your brain hurts when you look at this!</span>")
|
||||
human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,30)
|
||||
. = ..()
|
||||
human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN,20,190)
|
||||
SEND_SIGNAL(human_user, COMSIG_ADD_MOOD_EVENT, "gates_of_mansus", /datum/mood_event/gates_of_mansus)
|
||||
|
||||
/obj/effect/reality_smash
|
||||
name = "/improper reality smash"
|
||||
icon = 'icons/effects/eldritch.dmi'
|
||||
anchored = TRUE
|
||||
resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
invisibility = INVISIBILITY_OBSERVER
|
||||
///We cannot use icon_state since this is invisible, functions the same way but with custom behaviour.
|
||||
var/image_state = "reality_smash"
|
||||
///Who can see us?
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
return
|
||||
var/dist = get_dist(user.loc,target.loc)
|
||||
var/dir = get_dir(user.loc,target.loc)
|
||||
|
||||
|
||||
if(user.z != target.z)
|
||||
to_chat(user,"<span class='warning'>[target.real_name] is beyond our reach.</span>")
|
||||
to_chat(user,"<span class='warning'>[target.real_name] is on another plane of existance!</span>")
|
||||
else
|
||||
switch(dist)
|
||||
if(0 to 15)
|
||||
@@ -33,6 +33,34 @@
|
||||
if(target.stat == DEAD)
|
||||
to_chat(user,"<span class='warning'>[target.real_name] is dead. Bring them onto a transmutation rune!</span>")
|
||||
|
||||
/datum/action/innate/heretic_shatter
|
||||
name = "Shattering Offer"
|
||||
desc = "By breaking your blade, you will be granted salvation from a dire situation. (Teleports you to a random safe turf on your current z level, but destroys your blade.)"
|
||||
background_icon_state = "bg_ecult"
|
||||
button_icon_state = "shatter"
|
||||
icon_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
check_flags = MOBILITY_HOLD|MOBILITY_MOVE|MOBILITY_USE
|
||||
var/mob/living/carbon/human/holder
|
||||
var/obj/item/melee/sickly_blade/sword
|
||||
|
||||
/datum/action/innate/heretic_shatter/Grant(mob/user, obj/object)
|
||||
sword = object
|
||||
holder = user
|
||||
//i know what im doing
|
||||
return ..()
|
||||
|
||||
/datum/action/innate/heretic_shatter/IsAvailable()
|
||||
if(IS_HERETIC(holder) || IS_HERETIC_MONSTER(holder))
|
||||
return TRUE
|
||||
else
|
||||
return FALSE
|
||||
|
||||
/datum/action/innate/heretic_shatter/Activate()
|
||||
var/turf/safe_turf = find_safe_turf(zlevels = sword.z, extended_safety_checks = TRUE)
|
||||
do_teleport(holder,safe_turf,forceMove = TRUE)
|
||||
to_chat(holder,"<span class='warning'>You feel a gust of energy flow through your body... the Rusted Hills heard your call...</span>")
|
||||
qdel(sword)
|
||||
|
||||
/obj/item/melee/sickly_blade
|
||||
name = "eldritch blade"
|
||||
desc = "A sickly green crescent blade, decorated with an ornamental eye. You feel like you're being watched..."
|
||||
@@ -50,15 +78,28 @@
|
||||
throwforce = 10
|
||||
hitsound = 'sound/weapons/bladeslice.ogg'
|
||||
attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "lacerated", "ripped", "diced", "rended")
|
||||
var/datum/action/innate/heretic_shatter/linked_action
|
||||
|
||||
/obj/item/melee/sickly_blade/Initialize()
|
||||
. = ..()
|
||||
linked_action = new(src)
|
||||
|
||||
/obj/item/melee/sickly_blade/attack(mob/living/M, mob/living/user)
|
||||
if(!IS_HERETIC(user))
|
||||
if(!(IS_HERETIC(user) || !IS_HERETIC_MONSTER(user)))
|
||||
to_chat(user,"<span class='danger'>You feel a pulse of some alien intellect lash out at your mind!</span>")
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
human_user.AdjustParalyzed(5 SECONDS)
|
||||
return FALSE
|
||||
return ..()
|
||||
|
||||
/obj/item/melee/sickly_blade/pickup(mob/user)
|
||||
. = ..()
|
||||
linked_action.Grant(user, src)
|
||||
|
||||
/obj/item/melee/sickly_blade/dropped(mob/user, silent)
|
||||
. = ..()
|
||||
linked_action.Remove(user, src)
|
||||
|
||||
/obj/item/melee/sickly_blade/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
var/datum/antagonist/heretic/cultie = user.mind.has_antag_datum(/datum/antagonist/heretic)
|
||||
@@ -103,7 +144,7 @@
|
||||
|
||||
/obj/item/clothing/neck/eldritch_amulet/equipped(mob/user, slot)
|
||||
. = ..()
|
||||
if(ishuman(user) && user.mind && slot == SLOT_NECK && IS_HERETIC(user))
|
||||
if(ishuman(user) && user.mind && slot == SLOT_NECK && (IS_HERETIC(user) || IS_HERETIC_MONSTER(user)))
|
||||
ADD_TRAIT(user, trait, CLOTHING_TRAIT)
|
||||
user.update_sight()
|
||||
|
||||
|
||||
@@ -264,12 +264,19 @@
|
||||
if(!LH.target)
|
||||
var/datum/objective/A = new
|
||||
A.owner = user.mind
|
||||
var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code
|
||||
LH.target = targeted.current
|
||||
var/list/targets = list()
|
||||
for(var/i in 0 to 3)
|
||||
var/datum/mind/targeted = A.find_target()//easy way, i dont feel like copy pasting that entire block of code
|
||||
if(!targeted)
|
||||
break
|
||||
targets[targeted.current.real_name] = targeted.current
|
||||
LH.target = targets[input(user,"Choose your next target","Target") in targets]
|
||||
|
||||
if(!LH.target && targets.len)
|
||||
LH.target = pick(targets) //Tsk tsk, you can and will get another target if you want it or not.
|
||||
qdel(A)
|
||||
if(LH.target)
|
||||
to_chat(user,"<span class='warning'>Your new target has been selected, go and sacrifice [LH.target.real_name]!</span>")
|
||||
|
||||
else
|
||||
to_chat(user,"<span class='warning'>target could not be found for living heart.</span>")
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
desc = "Touch spell that allows you to channel the power of the Old Gods through you."
|
||||
hand_path = /obj/item/melee/touch_attack/mansus_fist
|
||||
school = "evocation"
|
||||
charge_max = 150
|
||||
charge_max = 100
|
||||
clothes_req = FALSE
|
||||
action_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
action_icon_state = "mansus_grasp"
|
||||
@@ -104,57 +104,61 @@
|
||||
desc = "Spreads rust onto nearby turfs."
|
||||
range = 2
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/touch/blood_siphon
|
||||
/obj/effect/proc_holder/spell/pointed/blood_siphon
|
||||
name = "Blood Siphon"
|
||||
desc = "Touch spell that heals you while damaging the enemy, has a chance to transfer wounds between you and your enemy."
|
||||
hand_path = /obj/item/melee/touch_attack/blood_siphon
|
||||
desc = "A touch spell that heals your wounds while damaging the enemy. It has a chance to transfer wounds between you and your enemy."
|
||||
school = "evocation"
|
||||
charge_max = 150
|
||||
clothes_req = FALSE
|
||||
invocation_type = "none"
|
||||
invocation = "FL'MS O'ET'RN'ITY"
|
||||
invocation_type = "whisper"
|
||||
action_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
action_icon_state = "blood_siphon"
|
||||
action_background_icon_state = "bg_ecult"
|
||||
range = 9
|
||||
|
||||
/obj/item/melee/touch_attack/blood_siphon
|
||||
name = "Blood Siphon"
|
||||
desc = "A sinister looking aura that distorts the flow of reality around it."
|
||||
color = RUNE_COLOR_RED
|
||||
icon_state = "disintegrate"
|
||||
item_state = "disintegrate"
|
||||
catchphrase = "SUN'AI'KINI'MAS"
|
||||
|
||||
/obj/item/melee/touch_attack/blood_siphon/afterattack(atom/target, mob/user, proximity_flag, proximity)
|
||||
if(!proximity_flag)
|
||||
return
|
||||
playsound(user, 'sound/effects/curseattack.ogg', 75, TRUE)
|
||||
/obj/effect/proc_holder/spell/pointed/blood_siphon/cast(list/targets, mob/user)
|
||||
. = ..()
|
||||
var/target = targets[1]
|
||||
playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE)
|
||||
if(ishuman(target))
|
||||
var/mob/living/carbon/human/tar = target
|
||||
if(tar.anti_magic_check())
|
||||
tar.visible_message("<span class='danger'>Spell bounces off of [target]!</span>","<span class='danger'>The spell bounces off of you!</span>")
|
||||
tar.visible_message("<span class='danger'>The spell bounces off of [target]!</span>","<span class='danger'>The spell bounces off of you!</span>")
|
||||
return ..()
|
||||
var/mob/living/carbon/C2 = user
|
||||
var/mob/living/carbon/carbon_user = user
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
L.adjustBruteLoss(20)
|
||||
C2.adjustBruteLoss(-20)
|
||||
var/mob/living/living_target = target
|
||||
living_target.adjustBruteLoss(20)
|
||||
carbon_user.adjustBruteLoss(-20)
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C1 = target
|
||||
for(var/obj/item/bodypart/bodypart in C2.bodyparts)
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
for(var/bp in carbon_user.bodyparts)
|
||||
var/obj/item/bodypart/bodypart = bp
|
||||
for(var/i in bodypart.wounds)
|
||||
var/datum/wound/iter_wound = i
|
||||
if(prob(50))
|
||||
continue
|
||||
var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in C1.bodyparts
|
||||
var/obj/item/bodypart/target_bodypart = locate(bodypart.type) in carbon_target.bodyparts
|
||||
if(!target_bodypart)
|
||||
continue
|
||||
iter_wound.remove_wound()
|
||||
iter_wound.apply_wound(target_bodypart)
|
||||
|
||||
C1.blood_volume -= 20
|
||||
if(C2.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all
|
||||
C2.blood_volume += 20
|
||||
return ..()
|
||||
carbon_target.blood_volume -= 20
|
||||
if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all
|
||||
carbon_user.blood_volume += 20
|
||||
return
|
||||
|
||||
/obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
if(!istype(target,/mob/living))
|
||||
if(!silent)
|
||||
to_chat(user, "<span class='warning'>You are unable to siphon [target]!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/obj/effect/proc_holder/spell/aimed/rust_wave
|
||||
name = "Patron's Reach"
|
||||
@@ -451,7 +455,7 @@
|
||||
new /obj/effect/hotspot(T)
|
||||
T.hotspot_expose(700,50,1)
|
||||
for(var/mob/living/livies in T.contents - centre)
|
||||
livies.adjustFireLoss(10)
|
||||
livies.adjustFireLoss(5)
|
||||
_range++
|
||||
sleep(3)
|
||||
|
||||
@@ -500,7 +504,7 @@
|
||||
new /obj/effect/hotspot(T)
|
||||
T.hotspot_expose(700,50,1)
|
||||
for(var/mob/living/livies in T.contents - current_user)
|
||||
livies.adjustFireLoss(5)
|
||||
livies.adjustFireLoss(2.5)
|
||||
|
||||
|
||||
/obj/effect/proc_holder/spell/targeted/worm_contract
|
||||
@@ -519,6 +523,7 @@
|
||||
. = ..()
|
||||
if(!istype(user,/mob/living/simple_animal/hostile/eldritch/armsy))
|
||||
to_chat(user, "<span class='userdanger'>You try to contract your muscles but nothing happens...</span>")
|
||||
return
|
||||
var/mob/living/simple_animal/hostile/eldritch/armsy/armsy = user
|
||||
armsy.contract_next_chain_into_single_tile()
|
||||
|
||||
@@ -727,7 +732,7 @@
|
||||
|
||||
/obj/effect/proc_holder/spell/cone/staggered/entropic_plume/do_mob_cone_effect(mob/living/victim, level)
|
||||
. = ..()
|
||||
if(victim.anti_magic_check() || IS_HERETIC(victim) || victim.mind?.has_antag_datum(/datum/antagonist/heretic_monster))
|
||||
if(victim.anti_magic_check() || IS_HERETIC(victim) || IS_HERETIC_MONSTER(victim))
|
||||
return
|
||||
victim.apply_status_effect(STATUS_EFFECT_AMOK)
|
||||
victim.apply_status_effect(STATUS_EFFECT_CLOUDSTRUCK, (level*10))
|
||||
|
||||
@@ -190,7 +190,7 @@
|
||||
required_atoms = list(/mob/living/carbon/human)
|
||||
cost = 5
|
||||
route = PATH_ASH
|
||||
var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE,TRAIT_RADIMMUNE,TRAIT_GENELESS,TRAIT_PIERCEIMMUNE,TRAIT_NODISMEMBER,TRAIT_BOMBIMMUNE)
|
||||
var/list/trait_list = list(TRAIT_NOBREATH,TRAIT_RESISTCOLD,TRAIT_RESISTHIGHPRESSURE,TRAIT_RESISTLOWPRESSURE)
|
||||
|
||||
/datum/eldritch_knowledge/final/ash_final/on_finished_recipe(mob/living/user, list/atoms, loc)
|
||||
priority_announce("$^@&#*$^@(#&$(@&#^$&#^@# Fear the blaze, for Ashbringer [user.real_name] has come! $^@&#*$^@(#&$(@&#^$&#^@#","#$^@&#*$^@(#&$(@&#^$&#^@#", 'sound/announcer/classic/spanomalies.ogg')
|
||||
|
||||
@@ -173,9 +173,9 @@
|
||||
/datum/eldritch_knowledge/summon/stalker
|
||||
name = "Lonely Ritual"
|
||||
gain_text = "I was able to combine my greed and desires to summon an eldritch beast I have not seen before."
|
||||
desc = "You can now summon a Stalker using a knife, a flower, a pen and a piece of paper using a transmutation circle. Stalkers possess the ability to shapeshift into various forms while assuming the vigor and powers of that form."
|
||||
desc = "You can now summon a Stalker using a knife, a candle, a pen and a piece of paper using a transmutation circle. Stalkers possess the ability to shapeshift into various forms while assuming the vigor and powers of that form."
|
||||
cost = 1
|
||||
required_atoms = list(/obj/item/kitchen/knife,/obj/item/reagent_containers/food/snacks/grown/poppy,/obj/item/pen,/obj/item/paper)
|
||||
required_atoms = list(/obj/item/kitchen/knife,/obj/item/candle,/obj/item/pen,/obj/item/paper)
|
||||
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/stalker
|
||||
next_knowledge = list(/datum/eldritch_knowledge/summon/ashy,/datum/eldritch_knowledge/summon/rusty,/datum/eldritch_knowledge/flesh_blade_upgrade_2)
|
||||
route = PATH_FLESH
|
||||
@@ -203,7 +203,7 @@
|
||||
gain_text = "Our blood is all the same after all, the owl told me."
|
||||
desc = "You are granted a spell that drains some of the targets health, and returns it to you. It also has a chance to transfer any wounds you possess onto the target."
|
||||
cost = 1
|
||||
spell_to_add = /obj/effect/proc_holder/spell/targeted/touch/blood_siphon
|
||||
spell_to_add = /obj/effect/proc_holder/spell/pointed/blood_siphon
|
||||
next_knowledge = list(/datum/eldritch_knowledge/summon/raw_prophet,/datum/eldritch_knowledge/spell/area_conversion)
|
||||
|
||||
/datum/eldritch_knowledge/final/flesh_final
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 48 KiB |
Reference in New Issue
Block a user