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