diff --git a/code/__DEFINES/traits/declarations.dm b/code/__DEFINES/traits/declarations.dm
index 7a20d3ea4c9..ce573554d8d 100644
--- a/code/__DEFINES/traits/declarations.dm
+++ b/code/__DEFINES/traits/declarations.dm
@@ -1159,8 +1159,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_MAGNETIC_ID_CARD "magnetic_id_card"
/// ID cards with this trait have special appraisal text.
#define TRAIT_TASTEFULLY_THICK_ID_CARD "impressive_very_nice"
-/// things with this trait are treated as having no access in /atom/movable/proc/check_access(obj/item)
-#define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess"
///The entity has Silicon 'access', so is either a silicon, has an access wand, or is an admin ghost AI.
///This is put on the mob, it is used on the client for Admins but they are the exception as they use `isAdminGhostAI`.
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index fb53fc6cad0..1403eb741c9 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -147,7 +147,6 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE,
"TRAIT_ALLOWED_HONORBOUND_ATTACK" = TRAIT_ALLOWED_HONORBOUND_ATTACK,
"TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING,
- "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS,
"TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED,
"TRAIT_ANALGESIA" = TRAIT_ANALGESIA,
"TRAIT_ANGELIC" = TRAIT_ANGELIC,
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 5a3512f1d8f..78d0ecbe4a7 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -38,7 +38,6 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_AGEUSIA" = TRAIT_AGEUSIA,
"TRAIT_ALCOHOL_TOLERANCE" = TRAIT_ALCOHOL_TOLERANCE,
"TRAIT_ALLOW_HERETIC_CASTING" = TRAIT_ALLOW_HERETIC_CASTING,
- "TRAIT_ALWAYS_NO_ACCESS" = TRAIT_ALWAYS_NO_ACCESS,
"TRAIT_ALWAYS_WANTED" = TRAIT_ALWAYS_WANTED,
"TRAIT_ANOSMIA" = TRAIT_ANOSMIA,
"TRAIT_ANTENNAE" = TRAIT_ANTENNAE,
diff --git a/code/modules/antagonists/heretic/items/keyring.dm b/code/modules/antagonists/heretic/items/keyring.dm
index a37b55c17f3..1d8e88a8c59 100644
--- a/code/modules/antagonists/heretic/items/keyring.dm
+++ b/code/modules/antagonists/heretic/items/keyring.dm
@@ -64,6 +64,8 @@
if(!do_teleport(teleportee, get_turf(doorstination), channel = TELEPORT_CHANNEL_MAGIC))
return
+ teleportee.client?.move_delay = 0 //make moving through smoother
+
if(!IS_HERETIC_OR_MONSTER(teleportee))
teleportee.apply_damage(20, BRUTE) //so they dont roll it like a jackpot machine to see if they can land in the armory
to_chat(teleportee, span_userdanger("You stumble through [src], battered by forces beyond your comprehension, landing anywhere but where you thought you were going."))
@@ -109,7 +111,7 @@
if(!IS_HERETIC_OR_MONSTER(user))
return
. += span_hypnophrase("Enchanted by the Mansus!")
- . += span_hypnophrase("Using an ID on this will consume it and allow you to copy its accesses.")
+ . += span_hypnophrase("Using an ID on this or using this ID on another ID will consume it and allow you to copy its accesses.")
. += span_hypnophrase("Using this in-hand allows you to change its appearance.")
. += span_hypnophrase("Using this on a pair of doors, allows you to link them together. Entering one door will transport you to the other, while heathens are instead teleported to a random airlock.")
. += span_hypnophrase("Ctrl-clicking the ID, makes the ID make inverted portals instead, which teleport you onto a random airlock onstation, while heathens are teleported to the destination.")
@@ -169,18 +171,28 @@
portal_two.destination = portal_one
balloon_alert(user, "[message]")
-/obj/item/card/id/advanced/heretic/attackby(obj/item/thing, mob/user, params)
- if(!istype(thing, /obj/item/card/id/advanced) || !IS_HERETIC(user))
+/obj/item/card/id/advanced/heretic/item_interaction(mob/living/user, obj/item/tool, list/modifiers)
+ if(!istype(tool, /obj/item/card/id/advanced) || !IS_HERETIC(user))
return ..()
- var/obj/item/card/id/card = thing
+ eat_card(tool, user)
+ return ITEM_INTERACT_SUCCESS
+
+/obj/item/card/id/advanced/heretic/proc/eat_card(obj/item/card/id/card, mob/user)
+ if(card == src)
+ return //no self vore
fused_ids[card.name] = card
card.moveToNullspace()
- playsound(drop_location(),'sound/items/eatfood.ogg', rand(10,50), TRUE)
+ playsound(drop_location(), 'sound/items/eatfood.ogg', rand(10,30), TRUE)
access += card.access
+ if(!isnull(user))
+ balloon_alert(user, "consumed card")
/obj/item/card/id/advanced/heretic/interact_with_atom(atom/target, mob/living/user, list/modifiers)
if(!IS_HERETIC(user))
return NONE
+ if(istype(target, /obj/item/card/id))
+ eat_card(target, user)
+ return ITEM_INTERACT_SUCCESS
if(istype(target, /obj/effect/lock_portal))
clear_portals()
return ITEM_INTERACT_SUCCESS
diff --git a/code/modules/antagonists/heretic/knowledge/lock_lore.dm b/code/modules/antagonists/heretic/knowledge/lock_lore.dm
index 96c6110f6df..d323beecc18 100644
--- a/code/modules/antagonists/heretic/knowledge/lock_lore.dm
+++ b/code/modules/antagonists/heretic/knowledge/lock_lore.dm
@@ -117,11 +117,11 @@
/datum/heretic_knowledge/limited_amount/concierge_rite // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass
name = "Concierge's Rite"
- desc = "Allows you to transmute a stick of chalk, a wooden plank, and a multitool to create a Labyrinth Handbook. \
+ desc = "Allows you to transmute a crayon, a wooden plank, and a multitool to create a Labyrinth Handbook. \
It can materialize a barricade at range that only you and people resistant to magic can pass. 3 uses."
gain_text = "The Concierge scribbled my name into the Handbook. \"Welcome to your new home, fellow Steward.\""
required_atoms = list(
- /obj/item/toy/crayon/white = 1,
+ /obj/item/toy/crayon = 1,
/obj/item/stack/sheet/mineral/wood = 1,
/obj/item/multitool = 1,
)
diff --git a/code/modules/antagonists/heretic/magic/burglar_finesse.dm b/code/modules/antagonists/heretic/magic/burglar_finesse.dm
index a90acb8495f..fec0fb923bb 100644
--- a/code/modules/antagonists/heretic/magic/burglar_finesse.dm
+++ b/code/modules/antagonists/heretic/magic/burglar_finesse.dm
@@ -13,10 +13,13 @@
invocation_type = INVOCATION_WHISPER
spell_requirements = NONE
- cast_range = 4
+ cast_range = 6
-/datum/action/cooldown/spell/pointed/burglar_finesse/is_valid_target(atom/cast_on)
- return ..() && ishuman(cast_on) && (locate(/obj/item/storage/backpack) in cast_on.contents)
+/datum/action/cooldown/spell/pointed/burglar_finesse/is_valid_target(mob/living/carbon/human/cast_on)
+ if(!istype(cast_on))
+ return FALSE
+ var/obj/item/back_item = cast_on.get_item_by_slot(ITEM_SLOT_BACK)
+ return ..() && back_item?.atom_storage
/datum/action/cooldown/spell/pointed/burglar_finesse/cast(mob/living/carbon/human/cast_on)
. = ..()
@@ -25,12 +28,12 @@
to_chat(owner, span_danger("[cast_on] is protected by holy forces!"))
return FALSE
- var/obj/storage_item = locate(/obj/item/storage/backpack) in cast_on.contents
+ var/obj/storage_item = cast_on.get_item_by_slot(ITEM_SLOT_BACK)
if(isnull(storage_item))
return FALSE
- var/item = pick(storage_item.contents)
+ var/item = pick(storage_item.atom_storage.return_inv(recursive = FALSE))
if(isnull(item))
return FALSE
diff --git a/code/modules/antagonists/heretic/magic/caretaker.dm b/code/modules/antagonists/heretic/magic/caretaker.dm
index b882386329a..01a9970b204 100644
--- a/code/modules/antagonists/heretic/magic/caretaker.dm
+++ b/code/modules/antagonists/heretic/magic/caretaker.dm
@@ -24,7 +24,7 @@
/datum/action/cooldown/spell/caretaker/is_valid_target(atom/cast_on)
return isliving(cast_on)
-/datum/action/cooldown/spell/caretaker/before_cast(atom/cast_on)
+/datum/action/cooldown/spell/caretaker/before_cast(mob/living/cast_on)
. = ..()
if(. & SPELL_CANCEL_CAST)
return
@@ -34,6 +34,9 @@
owner.balloon_alert(owner, "other minds nearby!")
return . | SPELL_CANCEL_CAST
+ if(!cast_on.has_status_effect(/datum/status_effect/caretaker_refuge))
+ return SPELL_NO_IMMEDIATE_COOLDOWN // cooldown only on exit
+
/datum/action/cooldown/spell/caretaker/cast(mob/living/cast_on)
. = ..()
diff --git a/code/modules/antagonists/heretic/status_effects/mark_effects.dm b/code/modules/antagonists/heretic/status_effects/mark_effects.dm
index de895d33caa..ba8a86340d7 100644
--- a/code/modules/antagonists/heretic/status_effects/mark_effects.dm
+++ b/code/modules/antagonists/heretic/status_effects/mark_effects.dm
@@ -235,12 +235,16 @@
/datum/status_effect/eldritch/lock/on_apply()
. = ..()
- ADD_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT)
+ RegisterSignal(owner, COMSIG_MOB_TRIED_ACCESS, PROC_REF(attempt_access))
/datum/status_effect/eldritch/lock/on_remove()
- REMOVE_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT)
+ UnregisterSignal(owner, COMSIG_MOB_TRIED_ACCESS)
return ..()
+/datum/status_effect/eldritch/lock/proc/attempt_access(datum/source, obj/door_attempt)
+ SIGNAL_HANDLER
+ return ACCESS_DISALLOWED
+
// MARK OF MOON
/datum/status_effect/eldritch/moon
diff --git a/code/modules/jobs/access.dm b/code/modules/jobs/access.dm
index b31574bec33..e9b2e832f92 100644
--- a/code/modules/jobs/access.dm
+++ b/code/modules/jobs/access.dm
@@ -9,11 +9,6 @@
return TRUE
if(result_bitflags & COMPONENT_OBJ_DISALLOW) // override all other checks
return FALSE
- if(!isnull(accessor) && HAS_TRAIT(accessor, TRAIT_ALWAYS_NO_ACCESS))
- return FALSE
- //check if it doesn't require any access at all
- if(check_access(null))
- return TRUE
if(isnull(accessor)) //likely a TK user.
return FALSE
if(isAdminGhostAI(accessor))
@@ -25,6 +20,9 @@
return TRUE
if(attempted_access & ACCESS_DISALLOWED)
return FALSE
+ //check if it doesn't require any access at all
+ if(check_access(null))
+ return TRUE
if(HAS_SILICON_ACCESS(accessor))
if(ispAI(accessor))
return FALSE