Even Further Heretic Adjustments: New minor things, Bug fixes, Heretic path adjustments and movement adjustments! (#20843)

* a whole lot of shit

yessir

* gun stuff

crazy

* haha

fuck guns

* my brain bursts

it hurts

* so much shit

im done

* fuck forgot this

god damn low memory mode

* removes backslashes

really linter

* oops

typos
This commit is contained in:
cowbot92
2023-11-14 13:07:50 -05:00
committed by GitHub
parent 59c466edc1
commit bc3374c7da
38 changed files with 1161 additions and 56 deletions

View File

@@ -109,6 +109,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define PASSMACHINES (1<<7)
#define PASSCOMPUTER (1<<8)
#define PASSSTRUCTURE (1<<9)
#define PASSDOORS (1<<10)
//Movement Types
#define GROUND (1<<0)

View File

@@ -9,6 +9,7 @@
var/last_trigger = 0
var/time_between_triggers = 1 MINUTES //takes a minute to recharge
var/charges = INFINITY
var/antimagic_flags = MAGIC_RESISTANCE
var/list/static/ignore_typecache
var/list/mob/immune_minds = list()
@@ -140,3 +141,23 @@
/obj/structure/trap/ward/Initialize(mapload)
. = ..()
QDEL_IN(src, time_between_triggers)
/obj/structure/trap/proc/on_entered(datum/source, atom/movable/victim)
SIGNAL_HANDLER
if(last_trigger + time_between_triggers > world.time)
return
// Don't want the traps triggered by sparks, ghosts or projectiles.
if(is_type_in_typecache(victim, ignore_typecache))
return
if(ismob(victim))
var/mob/mob_victim = victim
if(mob_victim.mind in immune_minds)
return
if(mob_victim.can_block_magic(antimagic_flags))
flare()
return
if(charges <= 0)
return
flare()
if(isliving(victim))
trap_effect(victim)

View File

@@ -37,16 +37,18 @@
/datum/eldritch_knowledge/madness_mask,
/datum/eldritch_knowledge/flesh_ghoul,
/datum/eldritch_knowledge/rust_regen,
/datum/eldritch_knowledge/spell/mental_obfuscation,
/datum/eldritch_knowledge/spell/void_phase,
/datum/eldritch_knowledge/spell/eldritchbolt,
/datum/eldritch_knowledge/rune_carver,
/datum/eldritch_knowledge/blade_dance,
/datum/eldritch_knowledge/spell/cosmic_runes,
/datum/eldritch_knowledge/key_ring,
/datum/eldritch_knowledge/armor,
/datum/eldritch_knowledge/spell/rust_construction,
/datum/eldritch_knowledge/void_cloak,
/datum/eldritch_knowledge/ashen_eyes,
/datum/eldritch_knowledge/essence,
/datum/eldritch_knowledge/eldritch_eye),
/datum/eldritch_knowledge/eldritch_eye,
/datum/eldritch_knowledge/fire_shark),
TIER_MARK = list(
/datum/eldritch_knowledge/ash_mark,
/datum/eldritch_knowledge/flesh_mark,
@@ -65,8 +67,8 @@
/datum/eldritch_knowledge/duel_stance,
/datum/eldritch_knowledge/spell/star_blast,
/datum/eldritch_knowledge/spell/burglar_finesse,
/datum/eldritch_knowledge/spell/realignment,
/datum/eldritch_knowledge/spell/blood_siphon,
/datum/eldritch_knowledge/spell/eldritchbolt,
/datum/eldritch_knowledge/spell/void_blast),
TIER_BLADE = list(
/datum/eldritch_knowledge/ash_blade_upgrade,
@@ -86,6 +88,7 @@
/datum/eldritch_knowledge/spell/furious_steel,
/datum/eldritch_knowledge/spell/cosmic_expansion,
/datum/eldritch_knowledge/spell/freedom_forever,
/datum/eldritch_knowledge/lionhunter_rifle,
/datum/eldritch_knowledge/ashy,
/datum/eldritch_knowledge/rusty,
/datum/eldritch_knowledge/spell/cleave,

View File

@@ -0,0 +1,156 @@
/// The max range we can zoom in on people from.
#define MAX_LIONHUNTER_RANGE 30
// The Lionhunter, a gun for heretics
// The ammo it uses takes time to "charge" before firing,
// releasing a homing, very damaging projectile
/obj/item/gun/ballistic/rifle/boltaction/lionhunter
name = "\improper Lionhunter's Rifle"
desc = "An antique looking rifle that looks immaculate despite being clearly very old."
slot_flags = ITEM_SLOT_BACK
icon = 'icons/obj/eldritch.dmi'
icon_state = "lionhunter"
item_state = "lionhunter"
mag_type = /obj/item/ammo_box/magazine/internal/boltaction/lionhunter
fire_sound = "sound/weapons/sniper_shot.ogg"
zoomable = TRUE
zoom_amt = 10 //Long range, enough to see in front of you, but no tiles behind you.
zoom_out_amt = 5
/obj/item/ammo_box/magazine/internal/boltaction/lionhunter
name = "lionhunter rifle internal magazine"
ammo_type = /obj/item/ammo_casing/strilka310/lionhunter
caliber = "CALIBER_STRILKA310"
max_ammo = 3
multiload = 1
/obj/item/ammo_casing/strilka310/lionhunter
name = "strilka310 bullet casing"
desc = "A .310 bullet casing."
icon_state = "310-casing"
caliber = "CALIBER_STRILKA310"
projectile_type = /obj/projectile/bullet/strilka310/lionhunter
/// Whether we're currently aiming this casing at something
var/currently_aiming = FALSE
/// How many seconds it takes to aim per tile of distance between the target
var/seconds_per_distance = 0.5 SECONDS
/// The minimum distance required to gain a damage bonus from aiming
var/min_distance = 4
/obj/item/ammo_casing/strilka310/lionhunter/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
if(!BB)
return
if(!check_fire(target, user))
return
return ..()
/// Checks if we can successfully fire our projectile.
/obj/item/ammo_casing/strilka310/lionhunter/proc/check_fire(atom/target, mob/living/user)
// In case someone puts this in turrets or something wacky, just fire like normal
if(!iscarbon(user) || !istype(loc, /obj/item/gun/ballistic/rifle/boltaction/lionhunter))
return TRUE
if(currently_aiming)
user.balloon_alert(user, "already aiming!")
return FALSE
var/distance = get_dist(user, target)
if(target.z != user.z || distance > MAX_LIONHUNTER_RANGE)
return FALSE
var/fire_time = min(distance * seconds_per_distance, 10 SECONDS)
if(distance <= min_distance || !isliving(target))
return TRUE
user.balloon_alert(user, "taking aim...")
user.playsound_local(get_turf(user), 'sound/weapons/chunkyrack.ogg', 100, TRUE)
var/image/reticle = image(
icon = 'icons/mob/actions/actions_items.dmi',
icon_state = "sniper_zoom",
layer = ABOVE_MOB_LAYER,
loc = target,
)
reticle.alpha = 0
var/list/mob/viewers = viewers(target)
// The shooter might be out of view, but they should be included
viewers |= user
for(var/mob/viewer as anything in viewers)
viewer.client?.images |= reticle
// Animate the fade in
animate(reticle, fire_time * 0.5, alpha = 255, transform = turn(reticle.transform, 180))
animate(reticle, fire_time * 0.5, transform = turn(reticle.transform, 180))
currently_aiming = TRUE
. = do_after(user, fire_time, target, IGNORE_TARGET_LOC_CHANGE, extra_checks = CALLBACK(src, PROC_REF(check_fire_callback), target, user))
currently_aiming = FALSE
animate(reticle, 0.5 SECONDS, alpha = 0)
for(var/mob/viewer as anything in viewers)
viewer.client?.images -= reticle
if(!.)
user.balloon_alert(user, "interrupted!")
return .
/// Callback for the do_after within the check_fire proc to see if something will prevent us from firing while aiming
/obj/item/ammo_casing/strilka310/lionhunter/proc/check_fire_callback(mob/living/target, mob/living/user)
if(!isturf(target.loc))
return FALSE
return TRUE
/obj/item/ammo_casing/strilka310/lionhunter/ready_proj(atom/target, mob/living/user, quiet, zone_override, atom/fired_from)
if(!BB)
return
var/distance = get_dist(user, target)
// If we're close range, or the target's not a living, OR for some reason a non-carbon is firing the gun
// The projectile is dry-fired, and gains no buffs
// BUT, if we're at a decent range and the target's a living mob,
// the projectile's been channel fired. It has full effects and homes in.
if(distance > min_distance && isliving(target) && iscarbon(user))
BB.damage *= 2
BB.stamina *= 2
BB.knockdown = 0.5 SECONDS
BB.stutter = 6 SECONDS
BB.projectile_phasing = PASSTABLE | PASSGLASS | PASSGRILLE | PASSCLOSEDTURF | PASSMACHINES | PASSSTRUCTURE | PASSDOORS
BB.homing = TRUE
BB.homing_turn_speed = 80
BB.set_homing_target(target)
return ..()
/obj/projectile/bullet/strilka310/lionhunter
name = "hunter's .310 bullet"
// These stats are only applied if the weapon is fired fully aimed
// If fired without aiming or at someone too close, it will do much less
damage = 30
stamina = 30
penetration_type = 2
penetrating = TRUE
// Extra ammunition can be made with a heretic ritual.
/obj/item/ammo_box/strilka310/lionhunter
name = "stripper clip (.310 hunter)"
desc = "A stripper clip of mysterious, atypical ammo. It doesn't fit into normal ballistic rifles."
icon_state = "310_strip"
ammo_type = /obj/item/ammo_casing/strilka310/lionhunter
max_ammo = 3
multiple_sprites = AMMO_BOX_PER_BULLET
/obj/effect/temp_visual/bullet_target
icon = 'icons/mob/actions/actions_items.dmi'
icon_state = "sniper_zoom"
layer = BELOW_MOB_LAYER
plane = GAME_PLANE
light_range = 2
#undef MAX_LIONHUNTER_RANGE

View File

@@ -121,5 +121,5 @@
desc = "As your journey begins, you'll need a way to shift between realms easily, this movement ability will allow you to travel a small range and assist in escaping emergencies"
gain_text = "Your body's connection to this realm feels weakened, for better or worse."
cost = 0
spell_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash
spell_to_add = /datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic
route = "Start"

View File

@@ -0,0 +1,245 @@
// The rune carver, a heretic knife that can draw rune traps.
/obj/item/melee/rune_carver
name = "carving knife"
desc = "A small knife made of cold steel, pure and perfect. Its sharpness can carve into titanium itself - \
but only few can evoke the dangers that lurk beneath reality."
icon = 'icons/obj/eldritch.dmi'
icon_state = "rune_carver"
flags_1 = CONDUCT_1
sharpness = SHARP_EDGED
w_class = WEIGHT_CLASS_SMALL
wound_bonus = 20
force = 10
throwforce = 20
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("attacks", "slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "rends")
actions_types = list(/datum/action/item_action/rune_shatter)
embedding = list(
ignore_throwspeed_threshold = TRUE,
embed_chance = 75,
jostle_chance = 2,
jostle_pain_mult = 5,
pain_stam_pct = 0.4,
pain_mult = 3,
rip_time = 15,
)
/// Whether we're currently drawing a rune
var/drawing = FALSE
/// Max amount of runes that can be drawn
var/max_rune_amt = 3
/// A list of weakrefs to all of ourc urrent runes
var/list/datum/weakref/current_runes = list()
/// Turfs that you cannot draw carvings on
var/static/list/blacklisted_turfs = typecacheof(list(/turf/open/space, /turf/open/openspace, /turf/open/lava))
/obj/item/melee/rune_carver/examine(mob/user)
. = ..()
if(!IS_HERETIC_OR_MONSTER(user) && !isobserver(user))
return
. += span_notice("<b>[length(current_runes)] / [max_rune_amt]</b> total carvings have been drawn.")
. += span_info("The following runes can be carved:")
for(var/obj/structure/trap/eldritch/trap as anything in subtypesof(/obj/structure/trap/eldritch))
var/potion_string = span_info("\tThe " + initial(trap.name) + " - " + initial(trap.carver_tip))
. += potion_string
/obj/item/melee/rune_carver/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
. = ..()
if(!proximity_flag)
return
if(!IS_HERETIC_OR_MONSTER(user))
return
if(!isopenturf(target))
return
if(is_type_in_typecache(target, blacklisted_turfs))
return
INVOKE_ASYNC(src, PROC_REF(try_carve_rune), target, user)
/*
* Begin trying to carve a rune. Go through a few checks, then call do_carve_rune if successful.
*/
/obj/item/melee/rune_carver/proc/try_carve_rune(turf/open/target_turf, mob/user)
if(drawing)
target_turf.balloon_alert(user, "already carving!")
return
if(locate(/obj/structure/trap/eldritch) in range(1, target_turf))
target_turf.balloon_alert(user, "to close to another carving!")
return
for(var/datum/weakref/rune_ref as anything in current_runes)
if(!rune_ref?.resolve())
current_runes -= rune_ref
if(length(current_runes) >= max_rune_amt)
target_turf.balloon_alert(user, "too many carvings!")
return
drawing = TRUE
do_carve_rune(target_turf, user)
drawing = FALSE
/*
* The actual proc that handles selecting the rune to draw and creating it.
*/
/obj/item/melee/rune_carver/proc/do_carve_rune(turf/open/target_turf, mob/user)
// Assoc list of [name] to [image] for the radial (to show tooltips)
var/static/list/choices = list()
// Assoc list of [name] to [path] for after the radial
var/static/list/names_to_path = list()
if(!choices.len || !names_to_path.len)
for(var/obj/structure/trap/eldritch/trap as anything in subtypesof(/obj/structure/trap/eldritch))
names_to_path[initial(trap.name)] = trap
choices[initial(trap.name)] = image(icon = initial(trap.icon), icon_state = initial(trap.icon_state))
var/picked_choice = show_radial_menu(
user,
target_turf,
choices,
require_near = TRUE,
tooltips = TRUE,
)
if(isnull(picked_choice))
return
var/to_make = names_to_path[picked_choice]
if(!ispath(to_make, /obj/structure/trap/eldritch))
CRASH("[type] attempted to create a rune of incorrect type! (got: [to_make])")
target_turf.balloon_alert(user, "carving [picked_choice]...")
user.playsound_local(target_turf, 'sound/items/sheath.ogg', 50, TRUE)
if(!do_after(user, 5 SECONDS, target = target_turf))
target_turf.balloon_alert(user, "interrupted!")
return
target_turf.balloon_alert(user, "[picked_choice] carved")
var/obj/structure/trap/eldritch/new_rune = new to_make(target_turf, user)
current_runes += WEAKREF(new_rune)
/datum/action/item_action/rune_shatter
name = "Rune Break"
desc = "Destroys all runes carved by this blade."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon_state = "rune_break"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
/datum/action/item_action/rune_shatter/New(Target)
. = ..()
if(!istype(Target, /obj/item/melee/rune_carver))
qdel(src)
return
/datum/action/item_action/rune_shatter/Grant(mob/granted)
if(!IS_HERETIC_OR_MONSTER(granted))
return
return ..()
/datum/action/item_action/rune_shatter/IsAvailable(feedback = FALSE)
. = ..()
if(!.)
return
if(!IS_HERETIC_OR_MONSTER(owner))
return FALSE
var/obj/item/melee/rune_carver/target_sword = target
if(!length(target_sword.current_runes))
return FALSE
/datum/action/item_action/rune_shatter/Trigger(trigger_flags)
. = ..()
if(!.)
return
owner.playsound_local(get_turf(owner), 'sound/magic/blind.ogg', 50, TRUE)
var/obj/item/melee/rune_carver/target_sword = target
QDEL_LIST(target_sword.current_runes)
target_sword.SpinAnimation(5, 1)
return TRUE
// The actual rune traps the knife draws.
/obj/structure/trap/eldritch
name = "elder carving"
desc = "Collection of unknown symbols, they remind you of days long gone..."
icon = 'icons/obj/hand_of_god_structures.dmi'
/// A tip displayed to heretics who examine the rune carver. Explains what the rune does.
var/carver_tip
/// Reference to trap owner mob
var/datum/weakref/owner
/obj/structure/trap/eldritch/Initialize(mapload, new_owner)
. = ..()
if(new_owner)
owner = WEAKREF(new_owner)
/obj/structure/trap/eldritch/on_entered(datum/source, atom/movable/entering_atom)
if(!isliving(entering_atom))
return ..()
var/mob/living/living_mob = entering_atom
if(WEAKREF(living_mob) == owner)
return
if(IS_HERETIC_OR_MONSTER(living_mob))
return
return ..()
/obj/structure/trap/eldritch/attacked_by(obj/item/weapon, mob/living/user)
if(istype(weapon, /obj/item/melee/rune_carver) || istype(weapon, /obj/item/nullrod))
loc.balloon_alert(user, "carving dispelled")
playsound(src, 'sound/items/sheath.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, ignore_walls = FALSE)
qdel(src)
return ..()
/obj/structure/trap/eldritch/alert
name = "alert carving"
icon_state = "alert_rune"
alpha = 10
time_between_triggers = 5 SECONDS
carver_tip = "A nearly invisible rune that, when stepped on, alerts the carver who triggered it and where."
/obj/structure/trap/eldritch/alert/trap_effect(mob/living/victim)
var/mob/living/real_owner = owner?.resolve()
if(real_owner)
to_chat(real_owner, span_userdanger("[victim.real_name] has stepped foot on the alert rune in [get_area(src)]!"))
real_owner.playsound_local(get_turf(real_owner), 'sound/magic/curse.ogg', 50, TRUE)
/obj/structure/trap/eldritch/tentacle
name = "grasping carving"
icon_state = "tentacle_rune"
time_between_triggers = 45 SECONDS
charges = 1
carver_tip = "When stepped on, causes heavy damage leg damage and stuns the victim for 5 seconds. Has 1 charge."
/obj/structure/trap/eldritch/tentacle/trap_effect(mob/living/victim)
if(!iscarbon(victim))
return
var/mob/living/carbon/carbon_victim = victim
carbon_victim.Paralyze(5 SECONDS)
carbon_victim.apply_damage(20, BRUTE, BODY_ZONE_R_LEG)
carbon_victim.apply_damage(20, BRUTE, BODY_ZONE_L_LEG)
playsound(src, 'sound/magic/demon_attack1.ogg', 75, TRUE)
/obj/structure/trap/eldritch/mad
name = "mad carving"
icon_state = "madness_rune"
time_between_triggers = 20 SECONDS
charges = 2
carver_tip = "When stepped on, causes heavy stamina damage, and a variety of ailments to the victim. Has 2 charges."
/obj/structure/trap/eldritch/mad/trap_effect(mob/living/victim)
if(!iscarbon(victim))
return
var/mob/living/carbon/carbon_victim = victim
carbon_victim.adjustStaminaLoss(80)
carbon_victim.adjust_silence(20 SECONDS)
carbon_victim.adjust_stutter(1 MINUTES)
carbon_victim.adjust_confusion(5 SECONDS)
carbon_victim.set_jitter_if_lower(20 SECONDS)
carbon_victim.set_dizzy_if_lower(40 SECONDS)
playsound(src, 'sound/magic/blind.ogg', 75, TRUE)

View File

@@ -23,6 +23,7 @@
/datum/eldritch_knowledge/void_blade_upgrade,
/datum/eldritch_knowledge/blade_blade_upgrade,
/datum/eldritch_knowledge/cosmic_blade_upgrade,
/datum/eldritch_knowledge/knock_blade_upgrade,
/datum/eldritch_knowledge/rust_final,
/datum/eldritch_knowledge/flesh_final,
/datum/eldritch_knowledge/mind_final,
@@ -39,9 +40,17 @@
. = ..()
if(ishuman(user))
var/mob/living/carbon/human/H = user
H.physiology.heat_mod *= 0.6
H.physiology.heat_mod *= 0.4
H.physiology.burn_mod *= 0.8
var/obj/realknife = new /obj/item/melee/sickly_blade/ash
user.put_in_hands(realknife)
///use is if you want to swap out a spell they get upon becoming their certain type of heretic
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/ash/ash_jaunt = new(user)
ash_jaunt.Grant(user)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
/datum/eldritch_knowledge/base_ash/on_lose(mob/user)

View File

@@ -54,6 +54,15 @@
. = ..()
var/obj/realknife = new /obj/item/melee/sickly_blade/dark
user.put_in_hands(realknife)
///use is if you want to swap out a spell they get upon becoming their certain type of heretic
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/blade/blade_jaunt = new(user)
blade_jaunt.Grant(user)
ADD_TRAIT(user, TRAIT_SILENT_FOOTSTEPS, INNATE_TRAIT)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
/datum/eldritch_knowledge/base_blade/on_lose(mob/user)
@@ -62,7 +71,6 @@
/datum/eldritch_knowledge/base_blade/proc/on_mansus_grasp(mob/living/source, mob/living/target)
SIGNAL_HANDLER
if(!isliving(target))
return COMPONENT_BLOCK_HAND_USE
// Let's see if source is behind target
@@ -225,6 +233,16 @@
route = PATH_BLADE
tier = TIER_2
/datum/eldritch_knowledge/spell/realignment
name = "T2 - Realignment"
desc = "Grants you Realignment a spell that wil realign your body rapidly for a short period. \
During this process, you will rapidly regenerate stamina and quickly recover from stuns, however, you will be unable to attack. \
This spell can be cast in rapid succession, but doing so will increase the cooldown."
gain_text = "In the flurry of death, he found peace within himself. Despite insurmountable odds, he forged on."
cost = 1
spell_to_add = /datum/action/cooldown/spell/realignment
tier = TIER_2
/datum/eldritch_knowledge/duel_stance/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
. = ..()
ADD_TRAIT(user, TRAIT_NODISMEMBER, type)

View File

@@ -41,6 +41,16 @@
. = ..()
var/obj/realknife = new /obj/item/melee/sickly_blade/cosmic
user.put_in_hands(realknife)
///use is if you want to swap out a spell they get upon becoming their certain type of heretic
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/cosmic/cosmic_jaunt = new(user)
cosmic_jaunt.Grant(user)
ADD_TRAIT(user, TRAIT_RESISTLOWPRESSURE, INNATE_TRAIT)
ADD_TRAIT(user, TRAIT_RESISTCOLD, INNATE_TRAIT)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
/datum/eldritch_knowledge/base_cosmic/on_lose(mob/user)

View File

@@ -43,6 +43,14 @@
var/obj/realknife = new /obj/item/melee/sickly_blade/flesh
user.put_in_hands(realknife)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
ADD_TRAIT(user, TRAIT_LIMBATTACHMENT, INNATE_TRAIT)
ADD_TRAIT(user, TRAIT_NOLIMBDISABLE, INNATE_TRAIT)
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/flesh/flesh_jaunt = new(user)
flesh_jaunt.Grant(user)
/datum/eldritch_knowledge/base_flesh/on_lose(mob/user, datum/antagonist/heretic/our_heretic)
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
@@ -117,6 +125,14 @@
route = PATH_FLESH
tier = TIER_1
/datum/eldritch_knowledge/fire_shark
name = "T1- Heated Ritual"
gain_text = "It's stronger to hunt in a pack, rather than alone. Animals of all kind know this, and now, so do you."
desc = "Allows you to summon a Fire Shark by transmuting a pair of eyes, a pile of ash, and a sheet of plasma. Fire sharks leave behind a cloud of plasma upon death, and injects Phlogiston into the targets it bites."
cost = 1
unlocked_transmutations = list(/datum/eldritch_transmutation/summon/fire_shark)
tier = TIER_1
/datum/eldritch_knowledge/flesh_mark
name = "Grasp Mark - Lover's Exsanguination"
gain_text = "She revels and laughs when life begins to flow. Her kiss rips and feasts on flesh alike. This imitates her touch."

View File

@@ -45,6 +45,13 @@
var/obj/realknife = new /obj/item/melee/sickly_blade/knock
user.put_in_hands(realknife)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
ADD_TRAIT(user, TRAIT_QUICKEST_CARRY, INNATE_TRAIT)
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/knock/knock_jaunt = new(user)
knock_jaunt.Grant(user)
/datum/eldritch_knowledge/base_ash/on_lose(mob/user)
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
@@ -158,13 +165,13 @@
return
if(A.hasPower())
user.visible_message(span_warning("[user] jams [src] into the airlock and starts prying it open!"), span_warning("We start forcing the airlock open."), //yogs modified description
user.visible_message(span_warning("[user] jams their blade into the airlock and starts prying it open!"), span_warning("We start forcing the airlock open."), //yogs modified description
span_italics("You hear a metal screeching sound."))
playsound(A, 'sound/machines/airlock_alien_prying.ogg', 100, 1)
if(!do_after(user, 6 SECONDS, A))
return
//user.say("Heeeeeeeeeerrre's Johnny!")
user.visible_message(span_warning("[user] forces the airlock to open with [user.p_their()] [src]!"), span_warning("We force the airlock to open."), //yogs modified description
user.visible_message(span_warning("[user] forces the airlock to open with their blade!"), span_warning("We force the airlock to open."), //yogs modified description
span_italics("You hear a metal screeching sound."))
A.open(2)

View File

@@ -45,6 +45,12 @@
mansus_touch.hand_path = /obj/item/melee/touch_attack/mansus_fist/mind //longer range version
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/mind/mind_jaunt = new(user)
mind_jaunt.Grant(user)
/datum/eldritch_knowledge/base_mind/on_lose(mob/user)
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
@@ -57,14 +63,23 @@
human_target.blur_eyes(1 SECONDS)
human_target.Knockdown(2 SECONDS)
/datum/eldritch_knowledge/spell/mental_obfuscation
name = "T1 - Mental Obfuscation"
gain_text = "A mind is such an easy thing to trick, nothing more than a lump of meat ready to be moulded by your hands."
desc = "Allows you to teleport a short distance to a targeted destination."
// /datum/eldritch_knowledge/spell/mental_obfuscation
// name = "T1 - Mental Obfuscation"
// gain_text = "A mind is such an easy thing to trick, nothing more than a lump of meat ready to be moulded by your hands."
// desc = "Allows you to teleport a short distance to a targeted destination."
// cost = 1
// spell_to_add = /datum/action/cooldown/spell/pointed/phase_jump/obfuscation
// banned_knowledge = list(
// /datum/eldritch_knowledge/spell/void_phase)
// route = PATH_MIND
// tier = TIER_1
/datum/eldritch_knowledge/spell/eldritchbolt
name = "T1 - Eldritch Bolt"
gain_text = "Remain wary of the frailty of men. Their wills are weak, minds young. Were it not for fear, death would go unlamented. Seek the old blood. Let us pray, let us wish... to partake in communion."
desc = "A strong single target spell, shoot a target with raw energy from another dimension."
cost = 1
spell_to_add = /datum/action/cooldown/spell/pointed/phase_jump/obfuscation
banned_knowledge = list(
/datum/eldritch_knowledge/spell/void_phase)
spell_to_add = /datum/action/cooldown/spell/pointed/projectile/lightningbolt/eldritchbolt
route = PATH_MIND
tier = TIER_1
@@ -162,14 +177,6 @@
. = ..()
ADD_TRAIT(user, TRAIT_REDUCED_DAMAGE_SLOWDOWN, type)
/datum/eldritch_knowledge/spell/eldritchbolt
name = "T2 - Eldritch Bolt"
gain_text = "Remain wary of the frailty of men. Their wills are weak, minds young. Were it not for fear, death would go unlamented. Seek the old blood. Let us pray, let us wish... to partake in communion."
desc = "A strong single target spell, shoot a target with raw energy from another dimension."
cost = 1
spell_to_add = /datum/action/cooldown/spell/pointed/projectile/lightningbolt/eldritchbolt
tier = TIER_2
/datum/eldritch_knowledge/mind_final
name = "Ascension Rite - Beyond All Knowledge Lies Despair"
gain_text = "A beast, a walking corpse, a murderer, a hunter. You are all these and more, and you like it. A hunter is a hunter, even in a dream, and you've made it to the end. It's time to wake from this endless nightmare, the keys to the lock built on a mountain of corpses. "

View File

@@ -41,6 +41,13 @@
var/obj/realknife = new /obj/item/melee/sickly_blade/rust
user.put_in_hands(realknife)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
ADD_TRAIT(user, TRAIT_PUSHIMMUNE, INNATE_TRAIT)
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/rust/rust_jaunt = new(user)
rust_jaunt.Grant(user)
/datum/eldritch_knowledge/base_rust/on_lose(mob/user)
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
@@ -76,6 +83,14 @@
route = PATH_RUST
tier = TIER_1
/datum/eldritch_knowledge/spell/rust_construction
name = "T1 - Rust Construction"
gain_text = "To destroy is also to build, the lack of an answer is itself an answer."
desc = "An instant spell that will create a wall at your command, only works on rusted tiles. Will knock back and damage anyone caught on the same tile."
cost = 1
spell_to_add = /datum/action/cooldown/spell/pointed/rust_construction
tier = TIER_1
/datum/eldritch_knowledge/rust_regen/on_life(mob/user)
. = ..()
var/turf/user_loc_turf = get_turf(user)

View File

@@ -9,24 +9,28 @@
/datum/eldritch_knowledge/base_mind,
/datum/eldritch_knowledge/base_blade,
/datum/eldritch_knowledge/base_cosmic,
/datum/eldritch_knowledge/base_knock,
/datum/eldritch_knowledge/ash_mark,
/datum/eldritch_knowledge/rust_mark,
/datum/eldritch_knowledge/flesh_mark,
/datum/eldritch_knowledge/mind_mark,
/datum/eldritch_knowledge/blade_mark,
/datum/eldritch_knowledge/cosmic_mark,
/datum/eldritch_knowledge/knock_mark,
/datum/eldritch_knowledge/ash_blade_upgrade,
/datum/eldritch_knowledge/rust_blade_upgrade,
/datum/eldritch_knowledge/flesh_blade_upgrade,
/datum/eldritch_knowledge/mind_blade_upgrade,
/datum/eldritch_knowledge/blade_blade_upgrade,
/datum/eldritch_knowledge/cosmic_blade_upgrade,
/datum/eldritch_knowledge/knock_blade_upgrade,
/datum/eldritch_knowledge/ash_final,
/datum/eldritch_knowledge/rust_final,
/datum/eldritch_knowledge/flesh_final,
/datum/eldritch_knowledge/mind_final,
/datum/eldritch_knowledge/blade_final,
/datum/eldritch_knowledge/cosmic_final)
/datum/eldritch_knowledge/cosmic_final,
/datum/eldritch_knowledge/knock_final)
unlocked_transmutations = list(/datum/eldritch_transmutation/void_knife)
cost = 1
route = PATH_VOID
@@ -37,6 +41,15 @@
var/obj/realknife = new /obj/item/melee/sickly_blade/void
user.put_in_hands(realknife)
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
ADD_TRAIT(user, TRAIT_RESISTCOLD, INNATE_TRAIT)
ADD_TRAIT(user, TRAIT_NOSLIPICE, INNATE_TRAIT)
var/datum/action/cooldown/spell/basic_jaunt = locate(/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic) in user.actions
if(basic_jaunt)
basic_jaunt.Remove(user)
var/datum/action/cooldown/spell/jaunt/ethereal_jaunt/void/void_jaunt = new(user)
void_jaunt.Grant(user)
/datum/eldritch_knowledge/base_void/on_lose(mob/user)
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
@@ -60,19 +73,31 @@
H.adjust_silence(10)
H.adjust_bodytemperature(-10)
/datum/eldritch_knowledge/spell/void_phase
name = "T1 - Void Phase"
gain_text = "The entity calls themself the Aristocrat. They effortlessly walk through air like \
nothing - leaving a harsh, cold breeze in their wake. They disappear, and I am left in the blizzard."
desc = "Grants you Void Phase, a long range targeted teleport spell. \
Additionally causes damage to heathens around your original and target destination."
/datum/eldritch_knowledge/rune_carver
name = "T1 - Carving Knife"
desc = "Allows you to transmute a knife, a shard of glass, and a piece of paper to create a Carving Knife. \
The Carving Knife allows you to etch difficult to see traps that trigger on heathens who walk overhead. \
Also makes for a handy throwing weapon."
gain_text = "Etched, carved... eternal. There is power hidden in everything. I can unveil it! \
I can carve the monolith to reveal the chains!"
unlocked_transmutations = list(/datum/eldritch_transmutation/rune_carver)
cost = 1
spell_to_add = /datum/action/cooldown/spell/pointed/void_phase
banned_knowledge = list(
/datum/eldritch_knowledge/spell/mental_obfuscation)
route = PATH_VOID
tier = TIER_1
// /datum/eldritch_knowledge/spell/void_phase
// name = "T1 - Void Phase"
// gain_text = "The entity calls themself the Aristocrat. They effortlessly walk through air like
// nothing - leaving a harsh, cold breeze in their wake. They disappear, and I am left in the blizzard."
// desc = "Grants you Void Phase, a long range targeted teleport spell.
// Additionally causes damage to heathens around your original and target destination."
// cost = 1
// spell_to_add = /datum/action/cooldown/spell/pointed/void_phase
// banned_knowledge = list(
// /datum/eldritch_knowledge/spell/mental_obfuscation)
// route = PATH_VOID
// tier = TIER_1
/datum/eldritch_knowledge/void_cloak
name = "T1 - Void Cloak"
gain_text = "The Owl is the keeper of things that are not quite in practice, but in theory are. Many things are."
@@ -95,7 +120,8 @@
/datum/eldritch_knowledge/flesh_mark,
/datum/eldritch_knowledge/mind_mark,
/datum/eldritch_knowledge/blade_mark,
/datum/eldritch_knowledge/cosmic_mark)
/datum/eldritch_knowledge/cosmic_mark,
/datum/eldritch_knowledge/knock_mark,)
route = PATH_VOID
tier = TIER_MARK
@@ -152,7 +178,8 @@
/datum/eldritch_knowledge/flesh_blade_upgrade,
/datum/eldritch_knowledge/mind_blade_upgrade,
/datum/eldritch_knowledge/blade_blade_upgrade,
/datum/eldritch_knowledge/cosmic_blade_upgrade)
/datum/eldritch_knowledge/cosmic_blade_upgrade,
/datum/eldritch_knowledge/knock_blade_upgrade)
route = PATH_VOID
tier = TIER_BLADE
@@ -185,6 +212,22 @@
spell_to_add = /datum/action/cooldown/spell/aoe/slip/void
tier = TIER_3
/datum/eldritch_knowledge/lionhunter_rifle
name = "T3 - Lionhunter Rifle"
name = "Lionhunter's Rifle"
desc = "Allows you to transmute any ballistic weapon, with \
a plank of wood, a piece of gold and a camera to create the Lionhunter's rifle. \
The Lionhunter's Rifle is a long ranged ballistic weapon with three shots. \
These shots function as normal, albeit weak high caliber mutitions when fired from \
close range or at inanimate objects. You can aim the rifle at distant foes, \
causing the shot to deal massively increased damage and hone in on them. \
You can create more ammo with three casings and five bars of silver."
gain_text = "I met an old man in an anique shop who wielded a very unusual weapon. \
I could not purchase it at the time, but they showed me how they made it ages ago."
unlocked_transmutations = list(/datum/eldritch_transmutation/lionhunter, /datum/eldritch_transmutation/lionhunter_ammo)
cost = 1
tier = TIER_3
/datum/eldritch_knowledge/void_final
name = "Ascension Rite - Waltz at the End of Time"
gain_text = "The world falls into darkness. I stand in an empty plane, small flakes of ice fall from the sky. \

View File

@@ -18,9 +18,9 @@ ASH PATH SPELLS GO HERE
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.1 SECONDS
jaunt_in_time = 1.3 SECONDS
jaunt_out_time = 0.6 SECONDS
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/ash_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/ash_shift/out
@@ -37,7 +37,7 @@ ASH PATH SPELLS GO HERE
name = "ash_shift"
icon = 'icons/mob/mob.dmi'
icon_state = "ash_shift2"
duration = 1.3 SECONDS
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/ash_shift/out
icon_state = "ash_shift"

View File

@@ -1,3 +1,36 @@
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/blade
name = "Shadow Passage"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "shadow"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/shadow_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/shadow_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/blade/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/shadow_shift
name = "shadow_shift"
icon = 'icons/mob/mob.dmi'
icon_state = "shadow"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/shadow_shift/out
icon_state = "uncloak"
/datum/action/cooldown/spell/pointed/projectile/furious_steel
name = "Furious Steel"
desc = "Summon three silver blades which orbit you. \
@@ -116,3 +149,81 @@
return BULLET_ACT_FORCE_PIERCE
return ..()
// Realignment. It's like Fleshmend but solely for stamina damage and stuns. Sec meta
/datum/action/cooldown/spell/realignment
name = "Realignment"
desc = "Realign yourself, rapidly regenerating stamina and reducing any stuns or knockdowns. \
You cannot attack while realigning. Can be casted multiple times in short succession, but each cast lengthens the cooldown."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/obj/implants.dmi'
button_icon_state = "adrenal"
// sound = 'sound/magic/whistlereset.ogg'
school = SCHOOL_FORBIDDEN
cooldown_time = 6 SECONDS
cooldown_reduction_per_rank = -6 SECONDS // we're not a wizard spell but we use the levelling mechanic
spell_max_level = 10 // we can get up to / over a minute duration cd time
invocation = "R'S'T."
invocation_type = INVOCATION_SHOUT
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
/datum/action/cooldown/spell/realignment/is_valid_target(atom/cast_on)
return isliving(cast_on)
/datum/action/cooldown/spell/realignment/cast(mob/living/cast_on)
. = ..()
cast_on.apply_status_effect(/datum/status_effect/realignment)
to_chat(cast_on, span_notice("We begin to realign ourselves."))
/datum/action/cooldown/spell/realignment/after_cast(atom/cast_on)
. = ..()
// With every cast, our spell level increases for a short time, which goes back down after a period
// and with every spell level, the cooldown duration of the spell goes up
if(level_spell())
var/reduction_timer = max(cooldown_time * spell_max_level * 0.5, 1.5 MINUTES)
addtimer(CALLBACK(src, PROC_REF(delevel_spell)), reduction_timer)
/datum/action/cooldown/spell/realignment/get_spell_title()
switch(spell_level)
if(1, 2)
return "Hasty " // Hasty Realignment
if(3, 4)
return "" // Realignment
if(5, 6, 7)
return "Slowed " // Slowed Realignment
if(8, 9, 10)
return "Laborious " // Laborious Realignment (don't reach here)
return ""
/datum/status_effect/realignment
id = "realigment"
status_type = STATUS_EFFECT_REFRESH
duration = 8 SECONDS
alert_type = /atom/movable/screen/alert/status_effect/realignment
tick_interval = 0.2 SECONDS
/datum/status_effect/realignment/on_apply()
ADD_TRAIT(owner, TRAIT_PACIFISM, id)
owner.add_filter(id, 2, list("type" = "outline", "color" = "#d6e3e7", "size" = 2))
var/filter = owner.get_filter(id)
animate(filter, alpha = 127, time = 1 SECONDS, loop = -1)
animate(alpha = 63, time = 2 SECONDS)
return TRUE
/datum/status_effect/realignment/on_remove()
REMOVE_TRAIT(owner, TRAIT_PACIFISM, id)
owner.remove_filter(id)
/datum/status_effect/realignment/tick(seconds_between_ticks)
owner.adjustStaminaLoss(-15)
owner.AdjustAllImmobility(-0.5 SECONDS)
/atom/movable/screen/alert/status_effect/realignment
name = "Realignment"
desc = "You're realignment yourself. You cannot attack, but are rapidly regenerating stamina."
icon_state = "realignment"

View File

@@ -1,3 +1,36 @@
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/cosmic
name = "Cosmic Passage"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "space_crawl"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/space_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/space_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/cosmic/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/space_shift
name = "space_shift"
icon = 'icons/mob/mob.dmi'
icon_state = "space_explosion"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/space_shift/out
icon_state = "space_explosion"
/datum/action/cooldown/spell/cosmic_rune
name = "Cosmic Rune"
desc = "Creates a cosmic rune at your position, only two can exist at a time. Invoking one rune transports you to the other."

View File

@@ -4,6 +4,39 @@ FLESH PATH SPELLS GO HERE
*/
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/flesh
name = "Blood Passage"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "bloodout"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/blood_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/blood_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/flesh/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/blood_shift
name = "blood_shift"
icon = 'icons/effects/cult_effects.dmi'
icon_state = "bloodin"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/blood_shift/out
icon_state = "bloodout"
/datum/action/cooldown/spell/pointed/blood_siphon
name = "Blood Siphon"
desc = "A touch spell that heals your wounds while damaging the enemy. \

View File

@@ -69,6 +69,24 @@ THIS FILE IS FOR ALL HERETIC SPELLS THAT DO NOT CONFER TO A PATH'S THEME OR YOU
/obj/item/melee/touch_attack/mansus_fist/mind/upgraded //more ranged
weapon_stats = list(SWING_SPEED = 1, ENCUMBRANCE = 0, ENCUMBRANCE_TIME = 0, REACH = 4, DAMAGE_LOW = 0, DAMAGE_HIGH = 0)
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/basic
name = "Mansus Passage"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
// Currently unused.
/datum/action/cooldown/spell/touch/mad_touch
name = "Touch of Madness"

View File

@@ -1,3 +1,36 @@
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/knock
name = "Expedited Passage"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "phaseout"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/knock_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/knock_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/knock/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/knock_shift
name = "knock_shift"
icon = 'icons/mob/mob.dmi'
icon_state = "phasein"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/knock_shift/out
icon_state = "phaseout"
/datum/action/cooldown/spell/pointed/burglar_finesse
name = "Burglar's Finesse"
desc = "Steal a random item from the victim's backpack."

View File

@@ -3,6 +3,38 @@
MIND PATH SPELLS GO HERE
*/
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/mind
name = "Mental Obfuscation"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "mansus_link"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 2 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/mind_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/mind_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/mind/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/mind_shift
name = "knock_shift"
icon = 'icons/effects/cult_effects.dmi'
icon_state = "cultin"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/mind_shift/out
icon_state = "cultout"
/datum/action/cooldown/spell/aoe/immobilize/famished_roar
name = "Famished Roar"
@@ -87,24 +119,24 @@ MIND PATH SPELLS GO HERE
bolt_power = 1000
/datum/action/cooldown/spell/pointed/phase_jump/obfuscation
name = "Mental Obfuscation"
desc = "A short range targeted teleport."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "mansus_link"
ranged_mousepointer = 'icons/effects/mouse_pointers/phase_jump.dmi'
// /datum/action/cooldown/spell/pointed/phase_jump/obfuscation
// name = "Mental Obfuscation"
// desc = "A short range targeted teleport."
// background_icon_state = "bg_heretic"
// overlay_icon_state = "bg_heretic_border"
// button_icon = 'icons/mob/actions/actions_ecult.dmi'
// button_icon_state = "mansus_link"
// ranged_mousepointer = 'icons/effects/mouse_pointers/phase_jump.dmi'
school = SCHOOL_FORBIDDEN
// school = SCHOOL_FORBIDDEN
cooldown_time = 25 SECONDS
cast_range = 7
invocation = "PH'ASE"
invocation_type = INVOCATION_WHISPER
active_msg = span_notice("You prepare to warp everyone's vision.")
deactive_msg = span_notice("You relax your mind.")
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
// cooldown_time = 25 SECONDS
// cast_range = 7
// invocation = "PH'ASE"
// invocation_type = INVOCATION_WHISPER
// active_msg = span_notice("You prepare to warp everyone's vision.")
// deactive_msg = span_notice("You relax your mind.")
// spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
/datum/action/cooldown/spell/pointed/projectile/assault
name = "Amygdala Assault"

View File

@@ -4,6 +4,39 @@ RUST PATH SPELLS GO HERE
*/
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/rust
name = "Decaying Phase"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "curse"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/rust_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/rust_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/rust/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/rust_shift
name = "rust_shift"
icon = 'icons/effects/effects.dmi'
icon_state = "curse"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/rust_shift/out
icon_state = "curse"
/datum/action/cooldown/spell/aoe/rust_conversion
name = "Aggressive Spread"
desc = "Spread rust onto nearby turfs, possibly destroying rusted walls."
@@ -145,3 +178,111 @@ RUST PATH SPELLS GO HERE
else
return 2
/datum/action/cooldown/spell/pointed/rust_construction
name = "Rust Formation"
desc = "Transforms a rusted floor into a full wall of rust. Creating a wall underneath a mob will harm it."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon_state = "shield"
ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi'
check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS|AB_CHECK_HANDS_BLOCKED
school = SCHOOL_FORBIDDEN
cooldown_time = 5 SECONDS
invocation = "Someone raises a wall of rust."
invocation_self_message = "You raise a wall of rust."
invocation_type = INVOCATION_EMOTE
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
cast_range = 4
aim_assist = FALSE
/// How long does the filter last on walls we make?
var/filter_duration = 2 MINUTES
/datum/action/cooldown/spell/pointed/rust_construction/is_valid_target(atom/cast_on)
if(!isfloorturf(cast_on))
if(isturf(cast_on) && owner)
cast_on.balloon_alert(owner, "not a floor!")
return FALSE
if(!HAS_TRAIT(cast_on, TRAIT_RUSTY))
if(owner)
cast_on.balloon_alert(owner, "not rusted!")
return FALSE
return TRUE
/datum/action/cooldown/spell/pointed/rust_construction/before_cast(turf/open/cast_on)
. = ..()
if(!isliving(owner))
return
var/mob/living/living_owner = owner
invocation = span_danger("<b>[owner]</b> drags [owner.p_their()] hand[living_owner.usable_hands == 1 ? "":"s"] upwards as a wall of rust rises out of [cast_on]!")
invocation_self_message = span_notice("You drag [living_owner.usable_hands == 1 ? "a hand":"your hands"] upwards as a wall of rust rises out of [cast_on].")
/datum/action/cooldown/spell/pointed/rust_construction/cast(turf/open/cast_on)
. = ..()
var/rises_message = "rises out of [cast_on]"
var/turf/closed/wall/new_wall = cast_on.PlaceOnTop(/turf/closed/wall)
if(!istype(new_wall))
return
playsound(new_wall, 'sound/effects/constructform.ogg', 50, TRUE)
new_wall.rust_heretic_act()
new_wall.name = "\improper enchanted [new_wall.name]"
new_wall.hardness = 10
new_wall.sheet_amount = 0
new_wall.girder_type = null
// I wanted to do a cool animation of a wall raising from the ground
// but I guess a fading filter will have to do for now as walls have 0 depth (currently)
// damn though with 3/4ths walls this'll look sick just imagine it
addtimer(CALLBACK(src, PROC_REF(fade_wall_filter), new_wall), filter_duration * (1/20))
addtimer(CALLBACK(src,PROC_REF(remove_wall_filter), new_wall), filter_duration)
var/message_shown = FALSE
for(var/mob/living/living_mob in cast_on)
message_shown = TRUE
if(IS_HERETIC_OR_MONSTER(living_mob) || living_mob == owner)
living_mob.visible_message(
span_warning("\A [new_wall] [rises_message] and pushes along [living_mob]!"),
span_notice("\A [new_wall] [rises_message] beneath your feet and pushes you along!"),
)
else
living_mob.visible_message(
span_warning("\A [new_wall] [rises_message] and slams into [living_mob]!"),
span_userdanger("\A [new_wall] [rises_message] beneath your feet and slams into you!"),
)
living_mob.apply_damage(10, BRUTE, wound_bonus = 10)
living_mob.Knockdown(5 SECONDS)
living_mob.SpinAnimation(5, 1)
// If we're a multiz map send them to the next floor
var/turf/above_us = get_step_multiz(cast_on, UP)
if(above_us)
living_mob.forceMove(above_us)
continue
// If we're not throw them to a nearby (open) turf
var/list/turfs_by_us = get_adjacent_open_turfs(cast_on)
// If there is no side by us, hardstun them
if(!length(turfs_by_us))
living_mob.Paralyze(5 SECONDS)
continue
// If there's an open turf throw them to the side
living_mob.throw_at(pick(turfs_by_us), 1, 3, thrower = owner, spin = FALSE)
if(!message_shown)
new_wall.visible_message(span_warning("\A [new_wall] [rises_message]!"))
/datum/action/cooldown/spell/pointed/rust_construction/proc/fade_wall_filter(turf/closed/wall)
if(QDELETED(wall))
return
/datum/action/cooldown/spell/pointed/rust_construction/proc/remove_wall_filter(turf/closed/wall)
if(QDELETED(wall))
return

View File

@@ -4,6 +4,39 @@ VOID PATH SPELLS GO HERE
*/
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/void
name = "Void Shift"
desc = "A short range spell that allows you to pass unimpeded through walls."
background_icon_state = "bg_heretic"
overlay_icon_state = "bg_heretic_border"
button_icon = 'icons/mob/actions/actions_ecult.dmi'
button_icon_state = "voidblink"
sound = null
school = SCHOOL_FORBIDDEN
cooldown_time = 15 SECONDS
spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC
exit_jaunt_sound = null
jaunt_duration = 1.5 SECONDS
jaunt_in_time = 0.5 SECONDS
jaunt_out_time = 0.5 SECONDS
jaunt_in_type = /obj/effect/temp_visual/dir_setting/void_shift
jaunt_out_type = /obj/effect/temp_visual/dir_setting/void_shift/out
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/void/do_steam_effects()
return
/obj/effect/temp_visual/dir_setting/void_shift
name = "void_shift"
icon = 'icons/mob/mob.dmi'
icon_state = "void_blink_in"
duration = 0.5 SECONDS
/obj/effect/temp_visual/dir_setting/void_shift/out
icon_state = "void_blink_out"
/datum/action/cooldown/spell/pointed/void_phase
name = "Void Phase"
desc = "Let's you blink to your pointed destination, causes 3x3 aoe damage bubble \

View File

@@ -76,6 +76,12 @@
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/ash_spirit
required_shit_list = "A pile of ash, a head, and a book."
/datum/eldritch_transmutation/summon/fire_shark
name = "Summon Fire Shark"
required_atoms = list(/obj/item/organ/eyes,/obj/effect/decal/cleanable/ash,/obj/item/stack/sheet/mineral/plasma)
mob_to_summon = /mob/living/simple_animal/hostile/eldritch/fire_shark
required_shit_list = "A pile of ash, a pair of eyes, and a stack of plasma."
/datum/eldritch_transmutation/summon/rusty
name = "Summon Rustwalker"
required_atoms = list(/obj/effect/decal/cleanable/vomit,,/obj/item/book)

View File

@@ -14,6 +14,48 @@
result_atoms = list(/obj/item/clothing/suit/cultrobes/void)
required_shit_list = "glass shard, clothing, bedsheet"
/datum/eldritch_transmutation/rune_carver
name = "Carving Knife"
required_atoms = list(
/obj/item/shard = 1,
/obj/item/paper = 1
)
result_atoms = list(/obj/item/melee/rune_carver)
required_shit_list = "glass shard, piece of paper"
/datum/eldritch_transmutation/lionhunter
name = "Lionhunter Rifle"
required_atoms = list(
/obj/item/gun = 1,
/obj/item/stack/sheet/mineral/wood = 1,
/obj/item/camera,
/obj/item/stack/sheet/mineral/gold
)
result_atoms = list(/obj/item/gun/ballistic/rifle/boltaction/lionhunter)
required_shit_list = "A gun, a piece of wood, a camera, and a piece of gold"
/datum/eldritch_transmutation/lionhunter_ammo
name = "Lionhunter Rifle Ammo"
required_atoms = list(
/obj/item/ammo_casing = 3,
/obj/item/stack/sheet/mineral/silver = 5
)
result_atoms = list(/obj/item/ammo_casing/strilka310/lionhunter)
required_shit_list = "Three ammo casings and five bars of silver."
/datum/eldritch_transmutation/rune_carver
name = "Carving Knife"
required_atoms = list(
/obj/item/shard = 1,
/obj/item/paper = 1
)
result_atoms = list(/obj/item/melee/rune_carver)
required_shit_list = "glass shard, piece of paper"
/datum/eldritch_transmutation/final/void_final
name = "Waltz at the End of Time"
required_atoms = list(/mob/living/carbon/human)

View File

@@ -142,3 +142,10 @@
var/body_position_pixel_x_offset = 0
///The y amount a mob's sprite should be offset due to the current position they're in or size (e.g. lying down moves your sprite down)
var/body_position_pixel_y_offset = 0
///How many hands does this mob have by default. This shouldn't change at runtime.
var/default_num_hands = 2
///How many hands hands does this mob currently have. Should only be changed through set_num_hands()
var/num_hands = 2
///How many usable hands does this mob currently have. Should only be changed through set_usable_hands()
var/usable_hands = 2

View File

@@ -420,3 +420,61 @@
ADD_TRAIT(src, TRAIT_NO_TELEPORT, MEGAFAUNA_TRAIT)
ADD_TRAIT(src, TRAIT_NO_FLOATING_ANIM, INNATE_TRAIT)
set_light(4, l_color = "#dcaa5b")
/mob/living/simple_animal/hostile/eldritch/fire_shark
name = "Fire Shark"
real_name = "Ignis"
desc = "It is a eldritch dwarf space shark, also known as a fire shark."
icon = 'icons/mob/eldritch_mobs.dmi'
icon_state = "fire_shark"
icon_living = "fire_shark"
pass_flags = PASSTABLE | PASSMOB
mob_biotypes = MOB_ORGANIC | MOB_BEAST
speed = -0.5
health = 16
maxHealth = 16
melee_damage_lower = 8
melee_damage_upper = 8
attack_sound = 'sound/weapons/bite.ogg'
attack_vis_effect = ATTACK_EFFECT_BITE
attacktext = "bites"
obj_damage = 0
damage_coeff = list(BRUTE = 1, BURN = 0.25, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0)
mob_size = MOB_SIZE_TINY
speak_emote = list("screams")
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
maxbodytemp = 1500
pressure_resistance = 200
var/poison_per_bite = 2
var/poison_type = /datum/reagent/phlogiston
var/death_cloud_size = 1 //size of cloud produced from a dying shark
/mob/living/simple_animal/hostile/eldritch/fire_shark/Initialize(mapload)
. = ..()
AddComponent(/datum/component/swarming)
AddComponent(/datum/component/regenerator, outline_colour = COLOR_DARK_RED)
/mob/living/simple_animal/hostile/eldritch/fire_shark/AttackingTarget()
. = ..()
if(. && isliving(target))
var/mob/living/L = target
if(L.reagents && poison_per_bite)
L.reagents.add_reagent(poison_type, poison_per_bite)
return .
/mob/living/simple_animal/hostile/eldritch/fire_shark/death(gibbed)
// On death, create a small smoke of harmful gas (s-Acid)
var/datum/effect_system/fluid_spread/smoke/chem/S = new
var/turf/location = get_turf(src)
// Create the reagents to put into the air
create_reagents(10)
reagents.add_reagent(/datum/reagent/toxin/plasma, 40)
// Attach the smoke spreader and setup/start it.
S.attach(location)
S.set_up(death_cloud_size, location = location, carry = reagents, silent = TRUE)
S.start()
..()

View File

@@ -153,6 +153,11 @@
var/splatter = FALSE // Make a cool splatter effect even if it doesn't do brute damage
/// If FALSE, allow us to hit something directly targeted/clicked/whatnot even if we're able to phase through it
var/phasing_ignore_direct_target = FALSE
/// Bitflag for things the projectile should just phase through entirely - No hitting unless direct target and [phasing_ignore_direct_target] is FALSE. Uses pass_flags flags.
var/projectile_phasing = NONE
/obj/projectile/Initialize(mapload)
. = ..()
impacted = list()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 KiB

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 213 KiB

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

View File

@@ -1812,9 +1812,11 @@
#include "code\modules\antagonists\eldritch_cult\eldritch_antag.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_book.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_effects.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_gun.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_items.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_knowledge.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_monster_antag.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_rune_knife.dm"
#include "code\modules\antagonists\eldritch_cult\eldritch_transmutations.dm"
#include "code\modules\antagonists\eldritch_cult\knowledge\ash_lore.dm"
#include "code\modules\antagonists\eldritch_cult\knowledge\blade_lore.dm"