Heretic Knock Path (#78108)
## About The Pull Request other changes: GODMODEd mobs cannot receive embeds or bleed, admins can now use the traitor panel to give heretics a focus adds a new heretic path, the path of knock its a path about opening shit and having access wound opening included, and stealing this is its award icon  its knowledge is as follows: ### A Locksmith’s Secret starting knowledge, unlocks the key blade which also works as a crowbar https://github.com/tgstation/tgstation/assets/70376633/3690232d-5687-4b0c-a9cc-b6374e7f1850 ### Grasp of Knock it literally just opens stuff (also makes a knocking sound) unbolts bolted airlocks and opens them, opens locked closets, opens mechas, logs you into consoles (comms consoles are with barebones head-level access, no buying shuttle, but hey you can shitpost over comms) Sidepaths: Ashen Eyes, Codex Cicatrix https://github.com/tgstation/tgstation/assets/70376633/8b890d69-ee03-4d12-99dd-dde7b4483cd4 ### Key Keepers Burden transmute a rod,wallet, and some id card to create an eldritch id card (very original naming), the ID card used is not preserved this ID card functions essentially as a superior agent card, using other IDs on it makes it be consumed by the eldritch ID and have its accesses and forms added into it, you can use it inhand to turn it into any of the cards that were consumed in addition you can hit two airlocks with it to link them together to create portals under the doors, which has a green glow going through the portal as a Heretic gets you to the other destination going through as a nonheretic lands you in a random onstation airlock, SM chamber included if youre unlucky 1 id card can only have 1 set of portals, making another destroys the former set, one of the airlocks being destroyed also destroys them https://github.com/tgstation/tgstation/assets/70376633/e96a518e-b35d-44aa-9a7c-8f2103feab6f ### Rite Of Passage transmute a white crayon, a multitool, and a plank to create consecrated lintel heretics can use this cool looking book to create a 8 second shield that knocks back any nonheretic that tries to pass also its ranged https://github.com/tgstation/tgstation/assets/70376633/036e0875-c422-433e-87b3-71328cb2bf8a ### Mark Of Knock the mansus grasp will now mark its victim for like 10 seconds marked victims are denied access by all objects, public airlocks included https://github.com/tgstation/tgstation/assets/70376633/6187ef36-30f4-4a92-af21-e5b288afb869 ### Burglars Finesse steal a random item from the victims backpack (or other storage item if they dont have a backpack) and puts it into your hand the victim will probably hear you and also gets a chat message about this https://github.com/tgstation/tgstation/assets/70376633/2529fa78-616d-4a46-ae18-3cb22efb1ab1 ### Ritual of knowledge this is nothing new i put this here to keep it in order ### Apetra Vulnera (sidepath with flesh) the victim receives bleed wounds on every single bodypart that has more than 15 brute if they dont have a bodypart that has >= 15 brute they get a random wound anyway so side paths are: blood siphon and void cloak https://github.com/tgstation/tgstation/assets/70376633/3c2cd21e-edbc-4956-8c2d-cd9a42b87f33 ### Wave of Desperation (sidepath with flesh) cannot be casted uncuffed with no bola, can be casted cuffed with no bola, with a bola and no cuffs adjacent mobs are knocked down, mobs are repulsed away, your cuffs and bola are destroyed, and you gain a status effect that: after 12 seconds makes you unconscious for 20 seconds 5 min cooldown https://github.com/tgstation/tgstation/assets/70376633/da480921-d5dd-4b46-b2e8-0cf543640bf9 ### Opening Blade your blade has a 35% chance to cause a weeping avulsion on hit https://github.com/tgstation/tgstation/assets/70376633/b6fd2837-6b0a-4a5a-bc7b-b9c3f7f715d1 ### Caretakers Last Refuge you can only cast this when not near sentient living beings while in refuge you are invincible and near transparent, cannot use your hands or spells also immune to damage slowdown, being hit with a null rod cancels this also if you lose your focus you get out of refuge https://github.com/tgstation/tgstation/assets/70376633/f053cfd8-2a16-4195-8004-17df077983ca https://github.com/tgstation/tgstation/assets/70376633/72330486-5273-4123-a108-b437b56120c4 ### Many secrets behind the Spider Door (Ascension) ritual needs 3 bodies without organs in their chest when successfully performed you ascend and; open a tear in reality (not the BoH one) which; Polls all ghosts with sentient mob enabled to spawn and siege the station, ghosts can interact with the portal to spawn as a random eldritch mob spawned mobs are loyal to whoever ascended and on examine can identify their master also fills the entire room with purple light also the heretics opening blade is upgraded to a 65% chance, and they gain Ascended Shapeshift which allows them to shapeshift into eldritch mobs, and its not 1 choice only https://github.com/tgstation/tgstation/assets/70376633/8d06286e-789d-442f-b33c-878d26deab07 ## Why It's Good For The Game its cool i think and an option for those wanting to steal and be sneaky and stuff ## Changelog 🆑 add: heretic knock path and its respective items and award /🆑 --------- Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com> Co-authored-by: Jacquerel <hnevard@gmail.com>
@@ -40,6 +40,14 @@
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/plating,
|
||||
/area/centcom/heretic_sacrifice/rust)
|
||||
"fL" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"fO" = (
|
||||
/turf/open/indestructible,
|
||||
/area/space)
|
||||
"gJ" = (
|
||||
/obj/effect/decal/remains/human,
|
||||
/turf/open/misc/dirt/jungle/dark{
|
||||
@@ -47,6 +55,11 @@
|
||||
slowdown = 0
|
||||
},
|
||||
/area/centcom/heretic_sacrifice/ash)
|
||||
"hE" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/storage/toolbox/mechanical/old,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"hZ" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
@@ -56,6 +69,9 @@
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/plating/rust,
|
||||
/area/centcom/heretic_sacrifice/rust)
|
||||
"jt" = (
|
||||
/turf/closed/indestructible/reinforced,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"jB" = (
|
||||
/obj/machinery/light/very_dim/directional/south,
|
||||
/turf/open/misc/asteroid,
|
||||
@@ -85,6 +101,11 @@
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/centcom/heretic_sacrifice/rust)
|
||||
"mW" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/spear,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"mZ" = (
|
||||
/obj/effect/decal/fakelattice{
|
||||
density = 0
|
||||
@@ -150,6 +171,12 @@
|
||||
/obj/effect/decal/remains/human,
|
||||
/turf/open/misc/asteroid,
|
||||
/area/centcom/heretic_sacrifice/void)
|
||||
"qo" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/storage/toolbox/mechanical/old,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"qu" = (
|
||||
/obj/effect/turf_decal/weather/dirt,
|
||||
/turf/open/misc/ashplanet/wateryrock{
|
||||
@@ -202,6 +229,12 @@
|
||||
},
|
||||
/turf/open/floor/plating/rust,
|
||||
/area/centcom/heretic_sacrifice/rust)
|
||||
"uM" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/clothing/under/color/grey/ancient,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"uT" = (
|
||||
/obj/structure/cable,
|
||||
/turf/open/floor/plating/rust,
|
||||
@@ -225,6 +258,9 @@
|
||||
slowdown = 0
|
||||
},
|
||||
/area/centcom/heretic_sacrifice/ash)
|
||||
"wo" = (
|
||||
/turf/closed/indestructible/grille,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"wt" = (
|
||||
/obj/structure/stone_tile/block{
|
||||
dir = 1
|
||||
@@ -240,6 +276,16 @@
|
||||
slowdown = 0
|
||||
},
|
||||
/area/centcom/heretic_sacrifice/ash)
|
||||
"wP" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/flashlight/flare{
|
||||
fuel = 1e+031;
|
||||
randomize_fuel = 0;
|
||||
icon_state = "flare-on";
|
||||
on = 1
|
||||
},
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"wS" = (
|
||||
/turf/open/misc/dirt/jungle/dark{
|
||||
planetary_atmos = 0;
|
||||
@@ -252,6 +298,9 @@
|
||||
name = "void glass floor"
|
||||
},
|
||||
/area/centcom/heretic_sacrifice/void)
|
||||
"xc" = (
|
||||
/turf/open/indestructible/white,
|
||||
/area/space)
|
||||
"yC" = (
|
||||
/obj/effect/turf_decal/trimline/brown/line{
|
||||
dir = 1
|
||||
@@ -273,6 +322,11 @@
|
||||
},
|
||||
/turf/open/floor/plating/rust,
|
||||
/area/centcom/heretic_sacrifice/rust)
|
||||
"Aw" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"AH" = (
|
||||
/obj/effect/turf_decal/trimline/brown/corner,
|
||||
/turf/open/floor/plating/rust,
|
||||
@@ -287,6 +341,15 @@
|
||||
"AO" = (
|
||||
/turf/open/floor/fakespace,
|
||||
/area/centcom/heretic_sacrifice/void)
|
||||
"AW" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/clothing/mask/gas/tiki_mask/yalp_elor,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"AY" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"Bv" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/turf_decal/trimline/brown/line,
|
||||
@@ -340,6 +403,9 @@
|
||||
slowdown = 0
|
||||
},
|
||||
/area/centcom/heretic_sacrifice/ash)
|
||||
"En" = (
|
||||
/turf/closed/indestructible/fakedoor/maintenance,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"ER" = (
|
||||
/turf/open/misc/ironsand,
|
||||
/area/centcom/heretic_sacrifice/rust)
|
||||
@@ -467,6 +533,17 @@
|
||||
/obj/machinery/light/very_dim/directional/west,
|
||||
/turf/open/floor/fakespace,
|
||||
/area/centcom/heretic_sacrifice/void)
|
||||
"MZ" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/flashlight/flare{
|
||||
fuel = 1e+031;
|
||||
randomize_fuel = 0;
|
||||
icon_state = "flare-on";
|
||||
on = 1
|
||||
},
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"Nh" = (
|
||||
/obj/effect/turf_decal/trimline/brown/line{
|
||||
dir = 1
|
||||
@@ -508,6 +585,11 @@
|
||||
slowdown = 0
|
||||
},
|
||||
/area/centcom/heretic_sacrifice/ash)
|
||||
"OW" = (
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/item/clothing/under/color/grey/ancient,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"Pl" = (
|
||||
/obj/effect/turf_decal/weather/dirt{
|
||||
dir = 6
|
||||
@@ -627,6 +709,12 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/turf/open/indestructible/necropolis/air,
|
||||
/area/centcom/heretic_sacrifice/flesh)
|
||||
"Zw" = (
|
||||
/obj/effect/decal/cleanable/blood/old,
|
||||
/obj/effect/decal/cleanable/dirt/dust,
|
||||
/obj/effect/landmark/heretic/knock,
|
||||
/turf/open/indestructible/plating,
|
||||
/area/centcom/heretic_sacrifice/knock)
|
||||
"ZA" = (
|
||||
/turf/closed/indestructible/riveted/boss,
|
||||
/area/centcom/heretic_sacrifice/ash)
|
||||
@@ -661,9 +749,37 @@ ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
@@ -695,6 +811,20 @@ ab
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
jt
|
||||
jt
|
||||
wo
|
||||
wo
|
||||
jt
|
||||
En
|
||||
En
|
||||
jt
|
||||
wo
|
||||
wo
|
||||
jt
|
||||
jt
|
||||
Fd
|
||||
ZA
|
||||
ZA
|
||||
@@ -726,6 +856,20 @@ ab
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
jt
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
jt
|
||||
Fd
|
||||
ZA
|
||||
Pl
|
||||
@@ -757,6 +901,20 @@ ab
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
wo
|
||||
AY
|
||||
fL
|
||||
uM
|
||||
AY
|
||||
AY
|
||||
qo
|
||||
fL
|
||||
AY
|
||||
mW
|
||||
MZ
|
||||
wo
|
||||
Fd
|
||||
ZA
|
||||
wS
|
||||
@@ -788,6 +946,20 @@ ab
|
||||
"}
|
||||
(6,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
wo
|
||||
AY
|
||||
Aw
|
||||
fL
|
||||
AY
|
||||
wP
|
||||
fL
|
||||
fL
|
||||
AY
|
||||
qo
|
||||
AY
|
||||
wo
|
||||
Fd
|
||||
ZA
|
||||
OG
|
||||
@@ -819,6 +991,20 @@ ab
|
||||
"}
|
||||
(7,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
jt
|
||||
AY
|
||||
fL
|
||||
fL
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
Aw
|
||||
jt
|
||||
Fd
|
||||
ZA
|
||||
Bw
|
||||
@@ -850,6 +1036,20 @@ ab
|
||||
"}
|
||||
(8,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
En
|
||||
AY
|
||||
MZ
|
||||
fL
|
||||
AY
|
||||
Zw
|
||||
OW
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
En
|
||||
Fd
|
||||
ZA
|
||||
Bw
|
||||
@@ -881,6 +1081,20 @@ ab
|
||||
"}
|
||||
(9,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
En
|
||||
fL
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
fL
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
En
|
||||
Fd
|
||||
ZA
|
||||
Bw
|
||||
@@ -912,6 +1126,20 @@ ab
|
||||
"}
|
||||
(10,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
jt
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
AW
|
||||
fL
|
||||
jt
|
||||
Fd
|
||||
ZA
|
||||
Bw
|
||||
@@ -943,6 +1171,20 @@ ab
|
||||
"}
|
||||
(11,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
wo
|
||||
fL
|
||||
AY
|
||||
hE
|
||||
MZ
|
||||
AY
|
||||
AY
|
||||
hE
|
||||
fL
|
||||
wP
|
||||
AY
|
||||
wo
|
||||
Fd
|
||||
ZA
|
||||
Pl
|
||||
@@ -974,6 +1216,20 @@ ab
|
||||
"}
|
||||
(12,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
wo
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
AY
|
||||
OW
|
||||
fL
|
||||
fL
|
||||
wo
|
||||
Fd
|
||||
ZA
|
||||
wS
|
||||
@@ -1005,6 +1261,20 @@ ab
|
||||
"}
|
||||
(13,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
jt
|
||||
AY
|
||||
AY
|
||||
fL
|
||||
fL
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
AY
|
||||
jt
|
||||
Fd
|
||||
ZA
|
||||
OG
|
||||
@@ -1036,6 +1306,20 @@ ab
|
||||
"}
|
||||
(14,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
jt
|
||||
jt
|
||||
wo
|
||||
wo
|
||||
jt
|
||||
En
|
||||
En
|
||||
jt
|
||||
wo
|
||||
wo
|
||||
jt
|
||||
jt
|
||||
Fd
|
||||
ZA
|
||||
ZA
|
||||
@@ -1067,6 +1351,20 @@ ab
|
||||
"}
|
||||
(15,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
@@ -1098,6 +1396,20 @@ ab
|
||||
"}
|
||||
(16,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
WD
|
||||
@@ -1129,6 +1441,20 @@ ab
|
||||
"}
|
||||
(17,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
dZ
|
||||
@@ -1160,6 +1486,20 @@ ab
|
||||
"}
|
||||
(18,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
xc
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
dZ
|
||||
@@ -1191,6 +1531,20 @@ ab
|
||||
"}
|
||||
(19,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
ER
|
||||
@@ -1222,6 +1576,20 @@ ab
|
||||
"}
|
||||
(20,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
Se
|
||||
@@ -1253,6 +1621,20 @@ ab
|
||||
"}
|
||||
(21,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
xc
|
||||
fO
|
||||
xc
|
||||
xc
|
||||
xc
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
Xr
|
||||
@@ -1284,6 +1666,20 @@ ab
|
||||
"}
|
||||
(22,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
Se
|
||||
@@ -1315,6 +1711,20 @@ ab
|
||||
"}
|
||||
(23,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
Xr
|
||||
@@ -1346,6 +1756,20 @@ ab
|
||||
"}
|
||||
(24,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
ps
|
||||
@@ -1377,6 +1801,20 @@ ab
|
||||
"}
|
||||
(25,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
Je
|
||||
@@ -1408,6 +1846,20 @@ ab
|
||||
"}
|
||||
(26,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
ER
|
||||
@@ -1439,6 +1891,20 @@ ab
|
||||
"}
|
||||
(27,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
fO
|
||||
Fd
|
||||
WD
|
||||
WD
|
||||
@@ -1470,6 +1936,20 @@ ab
|
||||
"}
|
||||
(28,1,1) = {"
|
||||
ab
|
||||
ab
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
Fd
|
||||
@@ -1529,4 +2009,18 @@ ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
ab
|
||||
"}
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#define MEDAL_VOID_ASCENSION "Void"
|
||||
#define MEDAL_BLADE_ASCENSION "Blade"
|
||||
#define MEDAL_COSMOS_ASCENSION "Cosmos"
|
||||
#define MEDAL_KNOCK_ASCENSION "Knock"
|
||||
#define MEDAL_TOOLBOX_SOUL "Toolsoul"
|
||||
#define MEDAL_CHEM_TUT "Beginner Chemist"
|
||||
#define MEDAL_HOT_DAMN "Hot Damn!"
|
||||
|
||||
@@ -80,6 +80,7 @@
|
||||
#define PATH_VOID "Void Path"
|
||||
#define PATH_BLADE "Blade Path"
|
||||
#define PATH_COSMIC "Cosmic Path"
|
||||
#define PATH_KNOCK "Knock Path"
|
||||
|
||||
/// Defines are used in /proc/has_living_heart() to report if the heretic has no heart period, no living heart, or has a living heart.
|
||||
#define HERETIC_NO_HEART_ORGAN -1
|
||||
|
||||
@@ -64,3 +64,6 @@
|
||||
#define ATTACKER_SHOVING (1<<1)
|
||||
/// The attack is a damaging-type attack
|
||||
#define ATTACKER_DAMAGING_ATTACK (1<<2)
|
||||
|
||||
/// Called on the atom being hit, from /datum/component/anti_magic/on_attack() : (obj/item/weapon, mob/user, antimagic_flags)
|
||||
#define COMSIG_ATOM_HOLYATTACK "atom_holyattacked"
|
||||
|
||||
@@ -1196,6 +1196,8 @@ 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 /obj/proc/check_access(obj/item)
|
||||
#define TRAIT_ALWAYS_NO_ACCESS "alwaysnoaccess"
|
||||
|
||||
/// Traits granted to items due to their chameleon properties.
|
||||
#define CHAMELEON_ITEM_TRAIT "chameleon_item_trait"
|
||||
|
||||
@@ -366,8 +366,10 @@ GLOBAL_LIST_INIT(phobia_objs, list(
|
||||
"heresy" = typecacheof(list(
|
||||
/obj/effect/floating_blade,
|
||||
/obj/effect/forcefield/cosmic_field,
|
||||
/obj/effect/heretic_rune,
|
||||
/obj/effect/forcefield/wizard/heretic,
|
||||
/obj/effect/heretic_influence,
|
||||
/obj/effect/heretic_rune,
|
||||
/obj/effect/knock_portal,
|
||||
/obj/effect/visible_heretic_influence,
|
||||
/obj/item/ammo_box/strilka310/lionhunter,
|
||||
/obj/item/ammo_casing/strilka310/lionhunter,
|
||||
@@ -379,6 +381,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
|
||||
/obj/item/codex_cicatrix,
|
||||
/obj/item/coin/eldritch,
|
||||
/obj/item/gun/ballistic/rifle/lionhunter,
|
||||
/obj/item/heretic_lintel,
|
||||
/obj/item/melee/rune_carver,
|
||||
/obj/item/melee/sickly_blade,
|
||||
/obj/item/melee/touch_attack/mansus_fist,
|
||||
@@ -387,6 +390,7 @@ GLOBAL_LIST_INIT(phobia_objs, list(
|
||||
/obj/item/toy/reality_pierce,
|
||||
/obj/projectile/curse_hand,
|
||||
/obj/structure/destructible/eldritch_crucible,
|
||||
/obj/structure/knock_tear,
|
||||
)),
|
||||
"insects" = typecacheof(list(
|
||||
/obj/item/clothing/mask/animal/small/bee,
|
||||
|
||||
@@ -135,6 +135,12 @@
|
||||
database_id = MEDAL_COSMOS_ASCENSION
|
||||
icon = "cosmicascend"
|
||||
|
||||
/datum/award/achievement/misc/knock_ascension
|
||||
name = "Secrets behind the Spider Door"
|
||||
desc = "You managed to open a gate into the mansus."
|
||||
database_id = MEDAL_KNOCK_ASCENSION
|
||||
icon = "knockascend"
|
||||
|
||||
/datum/award/achievement/misc/grand_ritual_finale
|
||||
name = "Archmage"
|
||||
desc = "Made a big impression on the station with your phenomenal cosmic power."
|
||||
|
||||
@@ -44,6 +44,7 @@
|
||||
if(isitem(parent))
|
||||
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, PROC_REF(on_equip))
|
||||
RegisterSignal(parent, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))
|
||||
RegisterSignals(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_ATOM), PROC_REF(on_attack))
|
||||
else if(ismob(parent))
|
||||
register_antimagic_signals(parent)
|
||||
else
|
||||
@@ -131,3 +132,7 @@
|
||||
return COMPONENT_MAGIC_BLOCKED
|
||||
|
||||
return NONE
|
||||
|
||||
/datum/component/anti_magic/proc/on_attack(atom/movable/source, atom/target, mob/user)
|
||||
SIGNAL_HANDLER
|
||||
SEND_SIGNAL(target, COMSIG_ATOM_HOLYATTACK, source, user, antimagic_flags)
|
||||
|
||||
@@ -76,6 +76,9 @@
|
||||
|
||||
if(blocked || !istype(victim) || HAS_TRAIT(victim, TRAIT_PIERCEIMMUNE))
|
||||
return FALSE
|
||||
|
||||
if(victim.status_flags & GODMODE)
|
||||
return FALSE
|
||||
|
||||
var/flying_speed = throwingdatum?.speed || weapon.throw_speed
|
||||
|
||||
|
||||
@@ -75,6 +75,7 @@
|
||||
/obj/item/wirecutters,
|
||||
/obj/item/wrench,
|
||||
/obj/item/spess_knife,
|
||||
/obj/item/melee/sickly_blade/knock,
|
||||
))
|
||||
|
||||
/obj/item/storage/belt/utility/chief
|
||||
|
||||
@@ -124,6 +124,9 @@
|
||||
/turf/open/indestructible/light
|
||||
icon_state = "light_on-1"
|
||||
|
||||
/turf/open/indestructible/plating
|
||||
icon_state = "plating"
|
||||
|
||||
/turf/open/indestructible/permalube
|
||||
icon_state = "darkfull"
|
||||
|
||||
|
||||
@@ -64,6 +64,7 @@
|
||||
PATH_VOID = "blue",
|
||||
PATH_BLADE = "label", // my favorite color is label
|
||||
PATH_COSMIC = "purple",
|
||||
PATH_KNOCK = "yellow",
|
||||
)
|
||||
var/static/list/path_to_rune_color = list(
|
||||
PATH_START = COLOR_LIME,
|
||||
@@ -73,6 +74,7 @@
|
||||
PATH_VOID = COLOR_CYAN,
|
||||
PATH_BLADE = COLOR_SILVER,
|
||||
PATH_COSMIC = COLOR_PURPLE,
|
||||
PATH_KNOCK = COLOR_YELLOW,
|
||||
)
|
||||
|
||||
/datum/antagonist/heretic/Destroy()
|
||||
@@ -508,6 +510,7 @@
|
||||
.["Remove Heart Target"] = CALLBACK(src, PROC_REF(remove_target))
|
||||
|
||||
.["Adjust Knowledge Points"] = CALLBACK(src, PROC_REF(admin_change_points))
|
||||
.["Give Focus"] = CALLBACK(src, PROC_REF(admin_give_focus))
|
||||
|
||||
/**
|
||||
* Admin proc for giving a heretic a Living Heart easily.
|
||||
@@ -583,6 +586,18 @@
|
||||
|
||||
knowledge_points += change_num
|
||||
|
||||
/**
|
||||
* Admin proc for giving a heretic a focus.
|
||||
*/
|
||||
/datum/antagonist/heretic/proc/admin_give_focus(mob/admin)
|
||||
if(!admin.client?.holder)
|
||||
to_chat(admin, span_warning("You shouldn't be using this!"))
|
||||
return
|
||||
|
||||
var/mob/living/pawn = owner.current
|
||||
pawn.equip_to_slot_if_possible(new /obj/item/clothing/neck/heretic_focus(get_turf(pawn)), ITEM_SLOT_NECK, TRUE, TRUE)
|
||||
to_chat(pawn, span_hypnophrase("The Mansus has manifested you a focus."))
|
||||
|
||||
/datum/antagonist/heretic/antag_panel_data()
|
||||
var/list/string_of_knowledge = list()
|
||||
|
||||
|
||||
@@ -115,3 +115,14 @@
|
||||
icon_state = "cosmic_blade"
|
||||
inhand_icon_state = "cosmic_blade"
|
||||
after_use_message = "The Stargazer hears your call..."
|
||||
|
||||
// Path of Knock's blade
|
||||
/obj/item/melee/sickly_blade/knock
|
||||
name = "\improper key blade"
|
||||
desc = "A blade and a key, a key to what? \
|
||||
What grand gates does it open?"
|
||||
icon_state = "key_blade"
|
||||
inhand_icon_state = "key_blade"
|
||||
after_use_message = "The Mother of Ants hears your call..."
|
||||
tool_behaviour = TOOL_CROWBAR
|
||||
toolspeed = 1.3
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
/obj/effect/knock_portal
|
||||
name = "crack in reality"
|
||||
desc = "A crack in space, impossibly deep and painful to the eyes. Definitely not safe."
|
||||
icon = 'icons/effects/eldritch.dmi'
|
||||
icon_state = "realitycrack"
|
||||
light_system = STATIC_LIGHT
|
||||
light_power = 1
|
||||
light_on = TRUE
|
||||
light_color = COLOR_GREEN
|
||||
light_range = 3
|
||||
opacity = TRUE
|
||||
density = FALSE //so we dont block doors closing
|
||||
layer = OBJ_LAYER //under doors
|
||||
///The knock portal we teleport to
|
||||
var/obj/effect/knock_portal/destination
|
||||
///The airlock we are linked to, we delete if it is destroyed
|
||||
var/obj/machinery/door/our_airlock
|
||||
|
||||
/obj/effect/knock_portal/Initialize(mapload, target)
|
||||
. = ..()
|
||||
if(target)
|
||||
our_airlock = target
|
||||
RegisterSignal(target, COMSIG_QDELETING, PROC_REF(delete_on_door_delete))
|
||||
|
||||
var/static/list/loc_connections = list(
|
||||
COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
|
||||
)
|
||||
AddElement(/datum/element/connect_loc, loc_connections)
|
||||
|
||||
///Deletes us and our destination portal if our_airlock is destroyed
|
||||
/obj/effect/knock_portal/proc/delete_on_door_delete(datum/source)
|
||||
SIGNAL_HANDLER
|
||||
qdel(src)
|
||||
|
||||
///Signal handler for when our location is entered, calls teleport on the victim, if their old_loc didnt contain a portal already (to prevent loops)
|
||||
/obj/effect/knock_portal/proc/on_entered(datum/source, mob/living/loser, atom/old_loc)
|
||||
SIGNAL_HANDLER
|
||||
if(istype(loser) && !(locate(type) in old_loc))
|
||||
teleport(loser)
|
||||
|
||||
/obj/effect/knock_portal/Destroy()
|
||||
QDEL_NULL(destination)
|
||||
our_airlock = null
|
||||
return ..()
|
||||
|
||||
///Teleports the teleportee, to a random airlock if the teleportee isnt a heretic, or the other portal if they are one
|
||||
/obj/effect/knock_portal/proc/teleport(mob/living/teleportee)
|
||||
if(isnull(destination)) //dumbass
|
||||
qdel(src)
|
||||
return
|
||||
|
||||
//get it?
|
||||
var/obj/machinery/door/doorstination = IS_HERETIC_OR_MONSTER(teleportee) ? destination.our_airlock : find_random_airlock()
|
||||
if(!do_teleport(teleportee, get_turf(doorstination), channel = TELEPORT_CHANNEL_MAGIC))
|
||||
return
|
||||
|
||||
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."))
|
||||
|
||||
INVOKE_ASYNC(src, PROC_REF(async_opendoor), doorstination)
|
||||
|
||||
///Returns a random airlock on the same Z level as our portal, that isnt our airlock
|
||||
/obj/effect/knock_portal/proc/find_random_airlock()
|
||||
var/list/turf/possible_destinations = list()
|
||||
for(var/obj/airlock as anything in SSmachines.get_machines_by_type_and_subtypes(/obj/machinery/door/airlock))
|
||||
if(airlock.z != z)
|
||||
continue
|
||||
if(airlock.loc == loc)
|
||||
continue
|
||||
possible_destinations += airlock
|
||||
return pick(possible_destinations)
|
||||
|
||||
///Asynchronous proc to unbolt, then open the passed door
|
||||
/obj/effect/knock_portal/proc/async_opendoor(obj/machinery/door/door)
|
||||
if(istype(door, /obj/machinery/door/airlock)) //they can create portals on ANY door, but we should unlock airlocks so they can actually open
|
||||
var/obj/machinery/door/airlock/as_airlock = door
|
||||
as_airlock.unbolt()
|
||||
door.open()
|
||||
|
||||
///An ID card capable of shapeshifting to other IDs given by the Key Keepers Burden knowledge
|
||||
/obj/item/card/id/advanced/heretic
|
||||
///List of IDs this card consumed
|
||||
var/list/obj/item/card/id/fused_ids = list()
|
||||
///The first portal in the portal pair, so we can clear it later
|
||||
var/obj/effect/knock_portal/portal_one
|
||||
///The second portal in the portal pair, so we can clear it later
|
||||
var/obj/effect/knock_portal/portal_two
|
||||
///The first door we are linking in the pair, so we can create a portal pair
|
||||
var/datum/weakref/link
|
||||
|
||||
/obj/item/card/id/advanced/heretic/examine(mob/user)
|
||||
. = ..()
|
||||
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("<b>Using this in-hand</b> allows you to change its appearance.")
|
||||
. += span_hypnophrase("<b>Using this on a pair of doors</b>, allows you to link them together. Entering one door will transport you to the other, while heathens are instead teleported to a random airlock.")
|
||||
|
||||
/obj/item/card/id/advanced/heretic/attack_self(mob/user)
|
||||
. = ..()
|
||||
if(!IS_HERETIC(user))
|
||||
return
|
||||
var/cardname = tgui_input_list(user, "Shapeshift into?", "Shapeshift", fused_ids)
|
||||
if(!cardname)
|
||||
balloon_alert(user, "no options!")
|
||||
return ..()
|
||||
var/obj/item/card/id/card = fused_ids[cardname]
|
||||
shapeshift(card)
|
||||
|
||||
///Changes our appearance to the passed ID card
|
||||
/obj/item/card/id/advanced/heretic/proc/shapeshift(obj/item/card/id/advanced/card)
|
||||
trim = card.trim
|
||||
assignment = card.assignment
|
||||
registered_age = card.registered_age
|
||||
registered_name = card.registered_name
|
||||
icon_state = card.icon_state
|
||||
inhand_icon_state = card.inhand_icon_state
|
||||
assigned_icon_state = card.assigned_icon_state
|
||||
name = card.name //not update_label because of the captains spare moment
|
||||
update_icon()
|
||||
|
||||
///Deletes and nulls our portal pair
|
||||
/obj/item/card/id/advanced/heretic/proc/clear_portals()
|
||||
QDEL_NULL(portal_one)
|
||||
QDEL_NULL(portal_two)
|
||||
|
||||
///Clears portal references
|
||||
/obj/item/card/id/advanced/heretic/proc/clear_portal_refs()
|
||||
SIGNAL_HANDLER
|
||||
portal_one = null
|
||||
portal_two = null
|
||||
|
||||
///Creates a portal pair at door1 and door2, displays a balloon alert to user
|
||||
/obj/item/card/id/advanced/heretic/proc/make_portal(mob/user, obj/machinery/door/door1, obj/machinery/door/door2)
|
||||
var/message = "linked"
|
||||
if(portal_one || portal_two)
|
||||
clear_portals()
|
||||
message += ", previous cleared"
|
||||
|
||||
portal_one = new(get_turf(door2), door2)
|
||||
portal_two = new(get_turf(door1), door1)
|
||||
portal_one.destination = portal_two
|
||||
RegisterSignal(portal_one, COMSIG_QDELETING, PROC_REF(clear_portal_refs)) //we only really need to register one because they already qdel both portals if one is destroyed
|
||||
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))
|
||||
return ..()
|
||||
var/obj/item/card/id/card = thing
|
||||
fused_ids[card.name] = card
|
||||
card.moveToNullspace()
|
||||
playsound(drop_location(),'sound/items/eatfood.ogg', rand(10,50), TRUE)
|
||||
access += card.access
|
||||
|
||||
/obj/item/card/id/advanced/heretic/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
|
||||
. = ..()
|
||||
if(!proximity_flag || !IS_HERETIC(user))
|
||||
return
|
||||
if(istype(target, /obj/effect/knock_portal))
|
||||
clear_portals()
|
||||
return
|
||||
|
||||
if(!istype(target, /obj/machinery/door))
|
||||
return
|
||||
|
||||
var/reference_resolved = link?.resolve()
|
||||
if(reference_resolved == target)
|
||||
return
|
||||
|
||||
if(reference_resolved)
|
||||
make_portal(user, reference_resolved, target)
|
||||
to_chat(user, span_notice("You use [src], to link [link] and [target] together."))
|
||||
link = null
|
||||
balloon_alert(user, "link 2/2")
|
||||
else
|
||||
link = WEAKREF(target)
|
||||
balloon_alert(user, "link 1/2")
|
||||
|
||||
/obj/item/card/id/advanced/heretic/Destroy()
|
||||
QDEL_LIST_ASSOC(fused_ids)
|
||||
link = null
|
||||
clear_portals()
|
||||
return ..()
|
||||
@@ -0,0 +1,64 @@
|
||||
/obj/effect/forcefield/wizard/heretic
|
||||
name = "consecrated lintel"
|
||||
desc = "A field of papers flying in the air, repulsing heathens with impossible force."
|
||||
icon_state = "lintel"
|
||||
initial_duration = 8 SECONDS
|
||||
|
||||
/obj/effect/forcefield/wizard/heretic/Bumped(mob/living/bumpee)
|
||||
. = ..()
|
||||
if(!istype(bumpee) || IS_HERETIC_OR_MONSTER(bumpee))
|
||||
return
|
||||
var/throwtarget = get_edge_target_turf(loc, get_dir(loc, get_step_away(bumpee, loc)))
|
||||
bumpee.safe_throw_at(throwtarget, 10, 1, force = MOVE_FORCE_EXTREMELY_STRONG)
|
||||
visible_message(span_danger("[src] repulses [bumpee] in a storm of paper!"))
|
||||
|
||||
///A heretic item that spawns a barrier at the clicked turf, 3 uses
|
||||
/obj/item/heretic_lintel
|
||||
name = "consecrated book"
|
||||
desc = "Some kind of book, its contents make your head hurt. The material is not known to you and it seems to shift and twist unnaturally."
|
||||
icon = 'icons/obj/service/library.dmi'
|
||||
icon_state = "hereticlintel"
|
||||
force = 10
|
||||
damtype = BURN
|
||||
worn_icon_state = "book"
|
||||
throw_speed = 1
|
||||
throw_range = 5
|
||||
w_class = WEIGHT_CLASS_NORMAL
|
||||
attack_verb_continuous = list("bashes", "curses")
|
||||
attack_verb_simple = list("bash", "curse")
|
||||
resistance_flags = FLAMMABLE
|
||||
drop_sound = 'sound/items/handling/book_drop.ogg'
|
||||
pickup_sound = 'sound/items/handling/book_pickup.ogg'
|
||||
///what type of barrier do we spawn when used
|
||||
var/barrier_type = /obj/effect/forcefield/wizard/heretic
|
||||
///how many uses do we have left
|
||||
var/uses = 3
|
||||
|
||||
/obj/item/heretic_lintel/examine(mob/user)
|
||||
. = ..()
|
||||
if(!IS_HERETIC_OR_MONSTER(user))
|
||||
return
|
||||
. += span_hypnophrase("Materializes a barrier upon any tile in sight, which only you can pass through. Lasts 8 seconds.")
|
||||
. += span_hypnophrase("It has <b>[uses]</b> uses left.")
|
||||
|
||||
/obj/item/heretic_lintel/afterattack(atom/target, mob/user, proximity_flag)
|
||||
. = ..()
|
||||
if(IS_HERETIC(user))
|
||||
var/turf/turf_target = get_turf(target)
|
||||
if(locate(barrier_type) in turf_target)
|
||||
user.balloon_alert(user, "already occupied!")
|
||||
return
|
||||
turf_target.visible_message(span_warning("A storm of paper materializes!"))
|
||||
new /obj/effect/temp_visual/paper_scatter(turf_target)
|
||||
playsound(turf_target, 'sound/magic/smoke.ogg', 30)
|
||||
new barrier_type(turf_target, user)
|
||||
uses--
|
||||
if(uses <= 0)
|
||||
to_chat(user, span_warning("[src] falls apart, turning into ash and dust!"))
|
||||
qdel(src)
|
||||
return
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
to_chat(human_user, span_userdanger("Your mind burns as you stare deep into the book, a headache setting in like your brain is on fire!"))
|
||||
human_user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 30, 190)
|
||||
human_user.add_mood_event("gates_of_mansus", /datum/mood_event/gates_of_mansus)
|
||||
human_user.dropItemToGround(src)
|
||||
@@ -262,6 +262,8 @@
|
||||
I finally began to understand. And then, blood rained from the heavens."
|
||||
next_knowledge = list(/datum/heretic_knowledge/summon/stalker)
|
||||
route = PATH_FLESH
|
||||
///What type of wound do we apply on hit
|
||||
var/wound_type = /datum/wound/slash/flesh/severe
|
||||
|
||||
/datum/heretic_knowledge/blade_upgrade/flesh/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade)
|
||||
if(!iscarbon(target) || source == target)
|
||||
@@ -269,7 +271,8 @@
|
||||
|
||||
var/mob/living/carbon/carbon_target = target
|
||||
var/obj/item/bodypart/bodypart = pick(carbon_target.bodyparts)
|
||||
carbon_target.cause_wound_of_type_and_severity(WOUND_SLASH, bodypart, WOUND_SEVERITY_SEVERE, WOUND_SEVERITY_CRITICAL)
|
||||
var/datum/wound/crit_wound = new wound_type()
|
||||
crit_wound.apply_wound(bodypart, attack_direction = get_dir(source, target))
|
||||
|
||||
/datum/heretic_knowledge/summon/stalker
|
||||
name = "Lonely Ritual"
|
||||
|
||||
@@ -0,0 +1,227 @@
|
||||
/**
|
||||
* # The path of Knock.
|
||||
*
|
||||
* Goes as follows:
|
||||
*
|
||||
* A Locksmith’s Secret
|
||||
* Grasp of Knock
|
||||
* > Sidepaths:
|
||||
* Ashen Eyes
|
||||
* Codex Cicatrix
|
||||
* Key Keeper’s Burden
|
||||
*
|
||||
* Rite Of Passage
|
||||
* Mark Of Knock
|
||||
* Ritual of Knowledge
|
||||
* Burglar's Finesse
|
||||
* > Sidepaths:
|
||||
* Apetra Vulnera
|
||||
* Opening Blast
|
||||
*
|
||||
* Opening Blade
|
||||
* Caretaker’s Last Refuge
|
||||
*
|
||||
* Many secrets behind the Spider Door
|
||||
*/
|
||||
/datum/heretic_knowledge/limited_amount/starting/base_knock
|
||||
name = "A Locksmith’s Secret"
|
||||
desc = "Opens up the Path of Knock to you. \
|
||||
Allows you to transmute a knife and a crowbar into a Key Blade. \
|
||||
You can only create two at a time and they function as fast crowbars. \
|
||||
In addition, they can fit into utility belts."
|
||||
gain_text = "The Knock permits no seal and no isolation. It thrusts us gleefully out of the safety of ignorance."
|
||||
next_knowledge = list(/datum/heretic_knowledge/knock_grasp)
|
||||
required_atoms = list(
|
||||
/obj/item/knife = 1,
|
||||
/obj/item/crowbar = 1,
|
||||
)
|
||||
result_atoms = list(/obj/item/melee/sickly_blade/knock)
|
||||
limit = 2
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/knock_grasp
|
||||
name = "Grasp of Knock"
|
||||
desc = "Your mansus grasp allows you to access anything! Right click on an airlock or a locker to force it open. \
|
||||
DNA locks on mechs will be removed, and any pilot will be ejected. Works on consoles. \
|
||||
Makes a distinctive knocking sound on use."
|
||||
gain_text = "Nothing may remain closed from my touch."
|
||||
next_knowledge = list(
|
||||
/datum/heretic_knowledge/key_ring,
|
||||
/datum/heretic_knowledge/medallion,
|
||||
/datum/heretic_knowledge/codex_cicatrix,
|
||||
)
|
||||
cost = 1
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/knock_grasp/on_gain(mob/user, datum/antagonist/heretic/our_heretic)
|
||||
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, PROC_REF(on_secondary_mansus_grasp))
|
||||
RegisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK, PROC_REF(on_mansus_grasp))
|
||||
|
||||
/datum/heretic_knowledge/knock_grasp/on_lose(mob/user, datum/antagonist/heretic/our_heretic)
|
||||
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY)
|
||||
UnregisterSignal(user, COMSIG_HERETIC_MANSUS_GRASP_ATTACK)
|
||||
|
||||
/datum/heretic_knowledge/knock_grasp/proc/on_mansus_grasp(mob/living/source, mob/living/target)
|
||||
SIGNAL_HANDLER
|
||||
var/obj/item/clothing/under/suit = target.get_item_by_slot(ITEM_SLOT_ICLOTHING)
|
||||
if(istype(suit) && suit.adjusted == NORMAL_STYLE)
|
||||
suit.toggle_jumpsuit_adjust()
|
||||
suit.update_appearance()
|
||||
|
||||
/datum/heretic_knowledge/knock_grasp/proc/on_secondary_mansus_grasp(mob/living/source, atom/target)
|
||||
SIGNAL_HANDLER
|
||||
|
||||
if(ismecha(target))
|
||||
var/obj/vehicle/sealed/mecha/mecha = target
|
||||
mecha.dna_lock = null
|
||||
for(var/mob/living/occupant as anything in mecha.occupants)
|
||||
if(isAI(occupant))
|
||||
continue
|
||||
mecha.mob_exit(occupant, randomstep = TRUE)
|
||||
else if(istype(target,/obj/machinery/door/airlock))
|
||||
var/obj/machinery/door/airlock/door = target
|
||||
door.unbolt()
|
||||
else if(istype(target, /obj/machinery/computer))
|
||||
var/obj/machinery/computer/computer = target
|
||||
computer.authenticated = TRUE
|
||||
computer.balloon_alert(source, "unlocked")
|
||||
|
||||
var/turf/target_turf = get_turf(target)
|
||||
SEND_SIGNAL(target_turf, COMSIG_ATOM_MAGICALLY_UNLOCKED, src, source)
|
||||
playsound(target, 'sound/magic/hereticknock.ogg', 100, TRUE, -1)
|
||||
|
||||
return COMPONENT_USE_HAND
|
||||
|
||||
/datum/heretic_knowledge/key_ring
|
||||
name = "Key Keeper’s Burden"
|
||||
desc = "Allows you to transmute a wallet, an iron rod, and an ID card to create an Eldritch Card. \
|
||||
It functions the same as an ID Card, but attacking it with an ID card fuses it and gains its access. \
|
||||
You can use it in-hand to change its form to a card you fused. \
|
||||
Does not preserve the card used in the ritual."
|
||||
gain_text = "Gateways shall open before me, my very will ensnaring reality."
|
||||
required_atoms = list(
|
||||
/obj/item/storage/wallet = 1,
|
||||
/obj/item/stack/rods = 1,
|
||||
/obj/item/card/id = 1,
|
||||
)
|
||||
result_atoms = list(/obj/item/card/id/advanced/heretic)
|
||||
next_knowledge = list(/datum/heretic_knowledge/limited_amount/rite_of_passage)
|
||||
cost = 1
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/limited_amount/rite_of_passage // item that creates 3 max at a time heretic only barriers, probably should limit to 1 only, holy people can also pass
|
||||
name = "Rite Of Passage"
|
||||
desc = "Allows you to transmute a white crayon, a wooden plank, and a multitool to create a Consecrated Book. \
|
||||
It can materialize a barricade at range that only you and people resistant to magic can pass. 3 uses."
|
||||
gain_text = "With this I can repel those that intend me harm."
|
||||
required_atoms = list(
|
||||
/obj/item/toy/crayon/white = 1,
|
||||
/obj/item/stack/sheet/mineral/wood = 1,
|
||||
/obj/item/multitool = 1,
|
||||
)
|
||||
result_atoms = list(/obj/item/heretic_lintel)
|
||||
next_knowledge = list(/datum/heretic_knowledge/mark/knock_mark)
|
||||
cost = 1
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/mark/knock_mark
|
||||
name = "Mark of Knock"
|
||||
desc = "Your Mansus Grasp now applies the Mark of Knock. \
|
||||
Attack a marked person to bar them from all passages for the duration of the mark. \
|
||||
This will make it so that they have no access whatsoever, even public access doors will reject them."
|
||||
gain_text = "Their requests for passage will remain unheeded."
|
||||
next_knowledge = list(/datum/heretic_knowledge/knowledge_ritual/knock)
|
||||
route = PATH_KNOCK
|
||||
mark_type = /datum/status_effect/eldritch/knock
|
||||
|
||||
/datum/heretic_knowledge/knowledge_ritual/knock
|
||||
next_knowledge = list(/datum/heretic_knowledge/spell/burglar_finesse)
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/spell/burglar_finesse
|
||||
name = "Burglar's Finesse"
|
||||
desc = "Grants you Burglar's Finesse, a single-target spell \
|
||||
that puts a random item from the victims backpack into your hand."
|
||||
gain_text = "Their trinkets will be mine, as will their lives in due time."
|
||||
next_knowledge = list(
|
||||
/datum/heretic_knowledge/spell/apetra_vulnera,
|
||||
/datum/heretic_knowledge/spell/opening_blast,
|
||||
/datum/heretic_knowledge/blade_upgrade/flesh/knock,
|
||||
)
|
||||
spell_to_add = /datum/action/cooldown/spell/pointed/burglar_finesse
|
||||
cost = 2
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/blade_upgrade/flesh/knock //basically a chance-based weeping avulsion version of the former
|
||||
name = "Opening Blade"
|
||||
desc = "Your blade has a chance to cause a weeping avulsion on attack."
|
||||
gain_text = "The power of my patron courses through my blade, willing their very flesh to part."
|
||||
next_knowledge = list(/datum/heretic_knowledge/spell/caretaker_refuge)
|
||||
route = PATH_KNOCK
|
||||
wound_type = /datum/wound/slash/flesh/critical
|
||||
var/chance = 35
|
||||
|
||||
/datum/heretic_knowledge/blade_upgrade/flesh/knock/do_melee_effects(mob/living/source, mob/living/target, obj/item/melee/sickly_blade/blade)
|
||||
if(prob(chance))
|
||||
return ..()
|
||||
|
||||
/datum/heretic_knowledge/spell/caretaker_refuge
|
||||
name = "Caretaker’s Last Refuge"
|
||||
desc = "Gives you a spell that makes you transparent and not dense. Cannot be used near living sentient beings. \
|
||||
While in refuge, you cannot use your hands or spells, and you are immune to slowdown. \
|
||||
You are invincible but unable to harm anything. Cancelled by being hit with an anti-magic item."
|
||||
gain_text = "Then I saw my my own reflection cascaded mind-numbingly enough times that I was but a haze."
|
||||
next_knowledge = list(/datum/heretic_knowledge/ultimate/knock_final)
|
||||
route = PATH_KNOCK
|
||||
spell_to_add = /datum/action/cooldown/spell/caretaker
|
||||
cost = 1
|
||||
|
||||
/datum/heretic_knowledge/ultimate/knock_final
|
||||
name = "Many secrets behind the Spider Door"
|
||||
desc = "The ascension ritual of the Path of Knock. \
|
||||
Bring 3 corpses without organs in their torso to a transmutation rune to complete the ritual. \
|
||||
When completed, you gain the ability to transform into empowered eldritch creatures \
|
||||
and in addition, create a tear to the Spider Door; \
|
||||
a tear in reality located at the site of this ritual. \
|
||||
Eldritch creatures will endlessly pour from this rift \
|
||||
who are bound to obey your instructions."
|
||||
gain_text = "With her knowledge, and what I had seen, I knew what to do. \
|
||||
I had to open the gates, with the holes in my foes as Ways! \
|
||||
Reality will soon be torn, the Spider Gate opened! WITNESS ME!"
|
||||
required_atoms = list(/mob/living/carbon/human = 3)
|
||||
route = PATH_KNOCK
|
||||
|
||||
/datum/heretic_knowledge/ultimate/knock_final/recipe_snowflake_check(mob/living/user, list/atoms, list/selected_atoms, turf/loc)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return FALSE
|
||||
|
||||
for(var/mob/living/carbon/human/body in atoms)
|
||||
if(body.stat != DEAD)
|
||||
continue
|
||||
var/obj/item/bodypart/chest = body.get_bodypart(BODY_ZONE_CHEST)
|
||||
if(LAZYLEN(chest.get_organs()))
|
||||
to_chat(user, span_hierophant_warning("[body] has organs in their chest."))
|
||||
continue
|
||||
|
||||
selected_atoms += body
|
||||
|
||||
if(!LAZYLEN(selected_atoms))
|
||||
loc.balloon_alert(user, "ritual failed, not enough valid bodies!")
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/datum/heretic_knowledge/ultimate/knock_final/on_finished_recipe(mob/living/user, list/selected_atoms, turf/loc)
|
||||
. = ..()
|
||||
priority_announce("Delta-class dimensional anomaly detec[generate_heretic_text()] Reality rended, torn. Gates open, doors open, [user.real_name] has ascended! Fear the tide! [generate_heretic_text()]", "Centra[generate_heretic_text()]", ANNOUNCER_SPANOMALIES)
|
||||
user.client?.give_award(/datum/award/achievement/misc/knock_ascension, user)
|
||||
|
||||
// buffs
|
||||
var/datum/action/cooldown/spell/shapeshift/eldritch/ascension/transform_spell = new(user.mind)
|
||||
transform_spell.Grant(user)
|
||||
|
||||
user.client?.give_award(/datum/award/achievement/misc/knock_ascension, user)
|
||||
var/datum/antagonist/heretic/heretic_datum = IS_HERETIC(user)
|
||||
var/datum/heretic_knowledge/blade_upgrade/flesh/knock/blade_upgrade = heretic_datum.get_knowledge(/datum/heretic_knowledge/blade_upgrade/flesh/knock)
|
||||
blade_upgrade.chance += 30
|
||||
new /obj/structure/knock_tear(loc, user.mind)
|
||||
@@ -34,6 +34,10 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks)
|
||||
name = "rust heretic sacrifice landmark"
|
||||
for_heretic_path = PATH_RUST
|
||||
|
||||
/obj/effect/landmark/heretic/knock
|
||||
name = "knock heretic sacrifice landmark"
|
||||
for_heretic_path = PATH_KNOCK
|
||||
|
||||
// A fluff signpost object that doesn't teleport you somewhere when you touch it.
|
||||
/obj/structure/no_effect_signpost
|
||||
name = "signpost"
|
||||
@@ -106,3 +110,8 @@ GLOBAL_LIST_EMPTY(heretic_sacrifice_landmarks)
|
||||
name = "Mansus Rust Gate"
|
||||
ambience_index = AMBIENCE_REEBE
|
||||
sound_environment = SOUND_ENVIRONMENT_SEWER_PIPE
|
||||
|
||||
/area/centcom/heretic_sacrifice/knock
|
||||
name = "Mansus Knock Gate"
|
||||
ambience_index = AMBIENCE_DANGER
|
||||
sound_environment = SOUND_ENVIRONMENT_PSYCHOTIC
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
Also has a chance to transfer wounds from you to the victim."
|
||||
gain_text = "\"No matter the man, we bleed all the same.\" That's what the Marshal told me."
|
||||
next_knowledge = list(
|
||||
/datum/heretic_knowledge/spell/apetra_vulnera,
|
||||
/datum/heretic_knowledge/spell/void_phase,
|
||||
/datum/heretic_knowledge/summon/raw_prophet,
|
||||
)
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
// Sidepaths for knowledge between Knock and Flesh.
|
||||
|
||||
/datum/heretic_knowledge/spell/apetra_vulnera
|
||||
name = "Apetra Vulnera"
|
||||
desc = "Grants you Apetra Vulnera, a spell \
|
||||
which causes heavy bleeding on all bodyparts of the victim that have more than 15 brute damage. \
|
||||
Wounds a random limb if no limb is sufficiently damaged."
|
||||
gain_text = "Flesh opens, and blood spills. My master seeks sacrifice, and I shall appease."
|
||||
next_knowledge = list(
|
||||
/datum/heretic_knowledge/spell/blood_siphon,
|
||||
/datum/heretic_knowledge/void_cloak,
|
||||
)
|
||||
spell_to_add = /datum/action/cooldown/spell/pointed/apetra_vulnera
|
||||
cost = 1
|
||||
route = PATH_SIDE
|
||||
|
||||
/datum/heretic_knowledge/spell/opening_blast
|
||||
name = "Wave Of Desperation"
|
||||
desc = "Grants you Wave Of Desparation, a spell which can only be cast while restrained. \
|
||||
It removes your restraints, repels and knocks down adjacent people, and applies the Mansus Grasp to everything nearby."
|
||||
gain_text = "My shackles undone in dark fury, their feeble bindings crumble before my power."
|
||||
next_knowledge = list(
|
||||
/datum/heretic_knowledge/summon/ashy,
|
||||
/datum/heretic_knowledge/void_cloak,
|
||||
)
|
||||
spell_to_add = /datum/action/cooldown/spell/aoe/wave_of_desperation
|
||||
cost = 1
|
||||
route = PATH_SIDE
|
||||
@@ -0,0 +1,59 @@
|
||||
/datum/action/cooldown/spell/pointed/apetra_vulnera
|
||||
name = "Apetra Vulnera"
|
||||
desc = "Causes severe bleeding on every limb of a target which has more than 15 brute damage. \
|
||||
Wounds a random limb if no limb is sufficiently damaged."
|
||||
background_icon_state = "bg_heretic"
|
||||
overlay_icon_state = "bg_heretic_border"
|
||||
button_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
button_icon_state = "cleave"
|
||||
|
||||
school = SCHOOL_FORBIDDEN
|
||||
cooldown_time = 45 SECONDS
|
||||
|
||||
invocation = "AP'TRA VULN'RA!"
|
||||
invocation_type = INVOCATION_WHISPER
|
||||
spell_requirements = NONE
|
||||
|
||||
cast_range = 4
|
||||
/// What type of wound we apply
|
||||
var/wound_type = /datum/wound/slash/flesh/critical/cleave
|
||||
|
||||
/datum/action/cooldown/spell/pointed/apetra_vulnera/is_valid_target(atom/cast_on)
|
||||
return ..() && ishuman(cast_on)
|
||||
|
||||
/datum/action/cooldown/spell/pointed/apetra_vulnera/cast(mob/living/carbon/human/cast_on)
|
||||
. = ..()
|
||||
|
||||
if(IS_HERETIC_OR_MONSTER(cast_on))
|
||||
return FALSE
|
||||
|
||||
if(!cast_on.blood_volume)
|
||||
return FALSE
|
||||
|
||||
if(cast_on.can_block_magic(antimagic_flags))
|
||||
cast_on.visible_message(
|
||||
span_danger("[cast_on]'s bruises briefly glow, but repels the effect!"),
|
||||
span_danger("Your bruises sting a little, but you are protected!")
|
||||
)
|
||||
return FALSE
|
||||
|
||||
var/a_limb_got_damaged = FALSE
|
||||
for(var/obj/item/bodypart/bodypart in cast_on.bodyparts)
|
||||
if(bodypart.brute_dam < 15)
|
||||
continue
|
||||
a_limb_got_damaged = TRUE
|
||||
var/datum/wound/slash/crit_wound = new wound_type()
|
||||
crit_wound.apply_wound(bodypart)
|
||||
|
||||
if(!a_limb_got_damaged)
|
||||
var/datum/wound/slash/crit_wound = new wound_type()
|
||||
crit_wound.apply_wound(pick(cast_on.bodyparts))
|
||||
|
||||
cast_on.visible_message(
|
||||
span_danger("[cast_on]'s scratches and bruises are torn open by an unholy force!"),
|
||||
span_danger("Your scratches and bruises are torn open by some horrible unholy force!")
|
||||
)
|
||||
|
||||
new /obj/effect/temp_visual/cleave(get_turf(cast_on))
|
||||
|
||||
return TRUE
|
||||
@@ -0,0 +1,32 @@
|
||||
// Given to ascended knock heretics, is a form of shapeshift that can turn into all 4 common heretic summons, and is not limited to 1 selection.
|
||||
/datum/action/cooldown/spell/shapeshift/eldritch/ascension
|
||||
name = "Ascended Shapechange"
|
||||
desc = "A spell that allows you to take on the form of another eldritch creature, gaining their abilities. \
|
||||
You can change your choice at any time, and if your form dies, you dont die."
|
||||
cooldown_time = 20 SECONDS
|
||||
die_with_shapeshifted_form = FALSE
|
||||
possible_shapes = list(
|
||||
/mob/living/simple_animal/hostile/heretic_summon/raw_prophet,
|
||||
/mob/living/simple_animal/hostile/heretic_summon/rust_spirit,
|
||||
/mob/living/simple_animal/hostile/heretic_summon/ash_spirit,
|
||||
/mob/living/simple_animal/hostile/heretic_summon/stalker,
|
||||
)
|
||||
|
||||
/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_shapeshift(mob/living/caster)
|
||||
. = ..()
|
||||
if(!.)
|
||||
return
|
||||
//buff our forms so this ascension ability isnt shit
|
||||
playsound(caster, 'sound/magic/demon_consume.ogg', 50, TRUE)
|
||||
var/mob/living/monster = .
|
||||
monster.AddComponent(/datum/component/seethrough_mob)
|
||||
monster.maxHealth *= 1.5
|
||||
monster.health = monster.maxHealth
|
||||
monster.melee_damage_lower = max((monster.melee_damage_lower * 2), 40)
|
||||
monster.melee_damage_upper = monster.melee_damage_upper / 2
|
||||
monster.transform *= 1.5
|
||||
monster.AddElement(/datum/element/wall_smasher, strength_flag = ENVIRONMENT_SMASH_RWALLS)
|
||||
|
||||
/datum/action/cooldown/spell/shapeshift/eldritch/ascension/do_unshapeshift(mob/living/caster)
|
||||
. = ..()
|
||||
shapeshift_type = null //pick another loser
|
||||
@@ -0,0 +1,39 @@
|
||||
/datum/action/cooldown/spell/pointed/burglar_finesse
|
||||
name = "Burglar's Finesse"
|
||||
desc = "Steal a random item from the victim's backpack."
|
||||
background_icon_state = "bg_heretic"
|
||||
overlay_icon_state = "bg_heretic_border"
|
||||
button_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
button_icon_state = "burglarsfinesse"
|
||||
|
||||
school = SCHOOL_FORBIDDEN
|
||||
cooldown_time = 40 SECONDS
|
||||
|
||||
invocation = "Y'O'K!"
|
||||
invocation_type = INVOCATION_WHISPER
|
||||
spell_requirements = NONE
|
||||
|
||||
cast_range = 4
|
||||
|
||||
/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/cast(mob/living/carbon/human/cast_on)
|
||||
. = ..()
|
||||
if(cast_on.can_block_magic(antimagic_flags))
|
||||
to_chat(cast_on, span_danger("You feel a light tug, but are otherwise fine, you were protected by holiness!"))
|
||||
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
|
||||
|
||||
if(isnull(storage_item))
|
||||
return FALSE
|
||||
|
||||
var/item = pick(storage_item.contents)
|
||||
if(isnull(item))
|
||||
return FALSE
|
||||
|
||||
to_chat(cast_on, span_warning("Your [storage_item] feels lighter..."))
|
||||
to_chat(owner, span_notice("With a blink, you pull [item] out of [cast_on][p_s()] [storage_item]."))
|
||||
owner.put_in_active_hand(item)
|
||||
@@ -0,0 +1,39 @@
|
||||
/datum/action/cooldown/spell/caretaker
|
||||
name = "Caretaker’s Last Refuge"
|
||||
desc = "Shifts you into the Caretaker's Refuge, rendering you translucent and intangible. \
|
||||
While in the Refuge your movement is unrestricted, but you cannot use your hands or cast any spells. \
|
||||
You cannot enter the Refuge while near other sentient beings, \
|
||||
and you can be removed from it upon contact with antimagical artifacts."
|
||||
background_icon_state = "bg_heretic"
|
||||
overlay_icon_state = "bg_heretic_border"
|
||||
button_icon = 'icons/mob/actions/actions_minor_antag.dmi'
|
||||
button_icon_state = "ninja_cloak"
|
||||
sound = 'sound/effects/curse2.ogg'
|
||||
|
||||
school = SCHOOL_FORBIDDEN
|
||||
cooldown_time = 1 MINUTES
|
||||
|
||||
invocation_type = INVOCATION_NONE
|
||||
spell_requirements = NONE
|
||||
|
||||
/datum/action/cooldown/spell/caretaker/Remove(mob/living/remove_from)
|
||||
if(remove_from.has_status_effect(/datum/status_effect/caretaker_refuge))
|
||||
remove_from.remove_status_effect(/datum/status_effect/caretaker_refuge)
|
||||
return ..()
|
||||
|
||||
/datum/action/cooldown/spell/caretaker/is_valid_target(atom/cast_on)
|
||||
return isliving(cast_on)
|
||||
|
||||
/datum/action/cooldown/spell/caretaker/cast(atom/cast_on)
|
||||
. = ..()
|
||||
for(var/mob/living/alive in orange(5, owner))
|
||||
if(alive.stat != DEAD && alive.client)
|
||||
owner.balloon_alert(owner, "other minds nearby!")
|
||||
return FALSE
|
||||
|
||||
var/mob/living/carbon/carbon_user = owner
|
||||
if(carbon_user.has_status_effect(/datum/status_effect/caretaker_refuge))
|
||||
carbon_user.remove_status_effect(/datum/status_effect/caretaker_refuge)
|
||||
else
|
||||
carbon_user.apply_status_effect(/datum/status_effect/caretaker_refuge)
|
||||
return TRUE
|
||||
@@ -0,0 +1,79 @@
|
||||
/datum/action/cooldown/spell/aoe/wave_of_desperation
|
||||
name = "Wave Of Desperation"
|
||||
desc = "Removes your restraints, repels and knocks down adjacent people, and applies certain effects of the Mansus Grasp upon everything nearby. \
|
||||
Cannot be cast unless you are restrained, and the stress renders you unconscious 12 seconds later!"
|
||||
background_icon_state = "bg_heretic"
|
||||
overlay_icon_state = "bg_heretic_border"
|
||||
button_icon = 'icons/mob/actions/actions_ecult.dmi'
|
||||
button_icon_state = "uncuff"
|
||||
sound = 'sound/magic/swap.ogg'
|
||||
|
||||
school = SCHOOL_FORBIDDEN
|
||||
cooldown_time = 5 MINUTES
|
||||
|
||||
invocation = "F'K 'FF."
|
||||
invocation_type = INVOCATION_WHISPER
|
||||
spell_requirements = NONE
|
||||
|
||||
aoe_radius = 3
|
||||
|
||||
/datum/action/cooldown/spell/aoe/wave_of_desperation/is_valid_target(mob/living/carbon/cast_on)
|
||||
return ..() && istype(cast_on) && (cast_on.handcuffed || cast_on.legcuffed)
|
||||
|
||||
// Before the cast, we do some small AOE damage around the caster
|
||||
/datum/action/cooldown/spell/aoe/wave_of_desperation/before_cast(mob/living/carbon/cast_on)
|
||||
. = ..()
|
||||
if(. & SPELL_CANCEL_CAST)
|
||||
return
|
||||
|
||||
if(cast_on.handcuffed)
|
||||
cast_on.visible_message(span_danger("[cast_on.handcuffed] on [cast_on] shatter!"))
|
||||
QDEL_NULL(cast_on.handcuffed)
|
||||
if(cast_on.legcuffed)
|
||||
cast_on.visible_message(span_danger("[cast_on.legcuffed] on [cast_on] shatters!"))
|
||||
QDEL_NULL(cast_on.legcuffed)
|
||||
|
||||
cast_on.apply_status_effect(/datum/status_effect/heretic_lastresort)
|
||||
new /obj/effect/temp_visual/knockblast(get_turf(cast_on))
|
||||
|
||||
for(var/mob/living/victim in get_things_to_cast_on(cast_on, radius_override = 1))
|
||||
victim.AdjustKnockdown(3 SECONDS)
|
||||
victim.AdjustParalyzed(0.5 SECONDS)
|
||||
|
||||
/datum/action/cooldown/spell/aoe/wave_of_desperation/get_things_to_cast_on(atom/center, radius_override)
|
||||
. = list()
|
||||
for(var/atom/nearby in orange(center, radius_override ? radius_override : aoe_radius))
|
||||
if(nearby == owner || nearby == center || isarea(nearby))
|
||||
continue
|
||||
if(!ismob(nearby))
|
||||
. += nearby
|
||||
continue
|
||||
var/mob/living/nearby_mob = nearby
|
||||
if(!isturf(nearby_mob.loc))
|
||||
continue
|
||||
if(IS_HERETIC_OR_MONSTER(nearby_mob))
|
||||
continue
|
||||
if(nearby_mob.can_block_magic(antimagic_flags))
|
||||
continue
|
||||
|
||||
. += nearby_mob
|
||||
|
||||
/datum/action/cooldown/spell/aoe/wave_of_desperation/cast_on_thing_in_aoe(atom/victim, atom/caster)
|
||||
if(!ismob(victim))
|
||||
SEND_SIGNAL(owner, COMSIG_HERETIC_MANSUS_GRASP_ATTACK_SECONDARY, victim)
|
||||
|
||||
var/atom/movable/mover = victim
|
||||
if(!istype(mover))
|
||||
return
|
||||
|
||||
if(mover.anchored)
|
||||
return
|
||||
var/our_turf = get_turf(caster)
|
||||
var/throwtarget = get_edge_target_turf(our_turf, get_dir(our_turf, get_step_away(mover, our_turf)))
|
||||
mover.safe_throw_at(throwtarget, 3, 1, force = MOVE_FORCE_STRONG)
|
||||
|
||||
/obj/effect/temp_visual/knockblast
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "shield-flash"
|
||||
alpha = 180
|
||||
duration = 1 SECONDS
|
||||
@@ -236,3 +236,53 @@
|
||||
return
|
||||
|
||||
addtimer(CALLBACK(src, PROC_REF(create_blade)), blade_recharge_time)
|
||||
|
||||
/datum/status_effect/caretaker_refuge
|
||||
id = "Caretaker’s Last Refuge"
|
||||
status_type = STATUS_EFFECT_REFRESH
|
||||
duration = -1
|
||||
alert_type = null
|
||||
var/static/list/caretaking_traits = list(TRAIT_HANDS_BLOCKED, TRAIT_IGNORESLOWDOWN)
|
||||
|
||||
/datum/status_effect/caretaker_refuge/on_apply()
|
||||
owner.add_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id))
|
||||
owner.status_flags |= GODMODE
|
||||
animate(owner, alpha = 45,time = 0.5 SECONDS)
|
||||
owner.density = FALSE
|
||||
RegisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING), PROC_REF(on_focus_lost))
|
||||
RegisterSignal(owner, COMSIG_MOB_BEFORE_SPELL_CAST, PROC_REF(prevent_spell_usage))
|
||||
RegisterSignal(owner, COMSIG_ATOM_HOLYATTACK, PROC_REF(nullrod_handler))
|
||||
return TRUE
|
||||
|
||||
/datum/status_effect/caretaker_refuge/on_remove()
|
||||
owner.remove_traits(caretaking_traits, TRAIT_STATUS_EFFECT(id))
|
||||
owner.status_flags &= ~GODMODE
|
||||
owner.alpha = initial(owner.alpha)
|
||||
owner.density = initial(owner.density)
|
||||
UnregisterSignal(owner, SIGNAL_REMOVETRAIT(TRAIT_ALLOW_HERETIC_CASTING))
|
||||
UnregisterSignal(owner, COMSIG_MOB_BEFORE_SPELL_CAST)
|
||||
UnregisterSignal(owner, COMSIG_ATOM_HOLYATTACK)
|
||||
owner.visible_message(
|
||||
span_warning("The haze around [owner] disappears, leaving them materialized!"),
|
||||
span_notice("You exit the refuge."),
|
||||
)
|
||||
|
||||
/datum/status_effect/caretaker_refuge/get_examine_text()
|
||||
return span_warning("[owner.p_Theyre()] enveloped in an unholy haze!")
|
||||
|
||||
/datum/status_effect/caretaker_refuge/proc/nullrod_handler(datum/source, obj/item/weapon)
|
||||
SIGNAL_HANDLER
|
||||
playsound(get_turf(owner), 'sound/effects/curse1.ogg', 80, TRUE)
|
||||
owner.visible_message(span_warning("[weapon] repels the haze around [owner]!"))
|
||||
owner.remove_status_effect(type)
|
||||
|
||||
/datum/status_effect/caretaker_refuge/proc/on_focus_lost()
|
||||
SIGNAL_HANDLER
|
||||
to_chat(owner, span_danger("Without a focus, your refuge weakens and dissipates!"))
|
||||
owner.remove_status_effect(type)
|
||||
|
||||
/datum/status_effect/caretaker_refuge/proc/prevent_spell_usage(datum/source, datum/spell)
|
||||
SIGNAL_HANDLER
|
||||
if(!istype(spell, /datum/action/cooldown/spell/caretaker))
|
||||
owner.balloon_alert(owner, "may not cast spells in refuge!")
|
||||
return SPELL_CANCEL_CAST
|
||||
|
||||
@@ -192,3 +192,25 @@
|
||||
|
||||
/datum/status_effect/star_mark/extended
|
||||
duration = 3 MINUTES
|
||||
|
||||
// Last Resort
|
||||
/datum/status_effect/heretic_lastresort
|
||||
id = "heretic_lastresort"
|
||||
alert_type = /atom/movable/screen/alert/status_effect/heretic_lastresort
|
||||
duration = 12 SECONDS
|
||||
status_type = STATUS_EFFECT_REPLACE
|
||||
tick_interval = -1
|
||||
|
||||
/atom/movable/screen/alert/status_effect/heretic_lastresort
|
||||
name = "Last Resort"
|
||||
desc = "Your head spins, heart pumping as fast as it can, losing the fight with the ground. Run to safety!"
|
||||
icon_state = "lastresort"
|
||||
|
||||
/datum/status_effect/heretic_lastresort/on_apply()
|
||||
ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id))
|
||||
to_chat(owner, span_userdanger("You are on the brink of losing consciousness, run!"))
|
||||
return TRUE
|
||||
|
||||
/datum/status_effect/heretic_lastresort/on_remove()
|
||||
REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id))
|
||||
owner.AdjustUnconscious(20 SECONDS, ignore_canstun = TRUE)
|
||||
|
||||
@@ -246,3 +246,17 @@
|
||||
new teleport_effect(get_turf(owner))
|
||||
owner.Paralyze(2 SECONDS)
|
||||
return ..()
|
||||
|
||||
// MARK OF KNOCK
|
||||
|
||||
/datum/status_effect/eldritch/knock
|
||||
effect_icon_state = "emark7"
|
||||
duration = 10 SECONDS
|
||||
|
||||
/datum/status_effect/eldritch/knock/on_apply()
|
||||
. = ..()
|
||||
ADD_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT)
|
||||
|
||||
/datum/status_effect/eldritch/knock/on_remove()
|
||||
REMOVE_TRAIT(owner, TRAIT_ALWAYS_NO_ACCESS, STATUS_EFFECT_TRAIT)
|
||||
return ..()
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
/obj/structure/knock_tear
|
||||
name = "???"
|
||||
desc = "It stares back. Theres no reason to remain. Run."
|
||||
max_integrity = INFINITE
|
||||
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
icon = 'icons/obj/anomaly.dmi'
|
||||
icon_state = "bhole3"
|
||||
color = "#53277E"
|
||||
light_color = "#53277E" //cooler purple
|
||||
light_range = 20
|
||||
anchored = TRUE
|
||||
density = FALSE
|
||||
layer = HIGH_PIPE_LAYER //0.01 above sigil layer used by heretic runes
|
||||
move_resist = INFINITY
|
||||
var/datum/mind/ascendee
|
||||
///a static list of heretic summons, this shouldnt even matter enough to be static but whatever
|
||||
var/static/list/monster_types
|
||||
|
||||
/obj/structure/knock_tear/Initialize(mapload, ascendant)
|
||||
. = ..()
|
||||
transform *= 3
|
||||
if(!monster_types)
|
||||
monster_types = subtypesof(/mob/living/simple_animal/hostile/heretic_summon) - /mob/living/simple_animal/hostile/heretic_summon/armsy/prime
|
||||
if(ascendant)
|
||||
ascendee = ascendant
|
||||
SSpoints_of_interest.make_point_of_interest(src)
|
||||
INVOKE_ASYNC(src, PROC_REF(poll_ghosts))
|
||||
|
||||
/obj/structure/knock_tear/proc/poll_ghosts()
|
||||
var/list/candidates = poll_ghost_candidates("Would you like to be a random eldritch monster attacking the crew?", ROLE_SENTIENCE, ROLE_SENTIENCE, 10 SECONDS, POLL_IGNORE_HERETIC_MONSTER)
|
||||
while(LAZYLEN(candidates))
|
||||
var/mob/dead/observer/candidate = pick_n_take(candidates)
|
||||
ghost_to_monster(candidate, should_ask = FALSE)
|
||||
|
||||
/obj/structure/knock_tear/attack_ghost(mob/user)
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
ghost_to_monster(user)
|
||||
|
||||
/obj/structure/knock_tear/proc/ghost_to_monster(mob/dead/observer/user, should_ask = TRUE)
|
||||
if(should_ask)
|
||||
var/ask = tgui_alert(user, "Become a monster?", "Ascended Rift", list("Yes", "No"))
|
||||
if(ask != "Yes" || QDELETED(src) || QDELETED(user))
|
||||
return FALSE
|
||||
var/monster_type = pick(monster_types)
|
||||
var/mob/living/monster = new monster_type(loc)
|
||||
monster.key = user.key
|
||||
monster.set_name()
|
||||
var/datum/antagonist/heretic_monster/woohoo_free_antag = new(src)
|
||||
monster.mind.add_antag_datum(woohoo_free_antag)
|
||||
if(ascendee)
|
||||
monster.faction = ascendee.current.faction
|
||||
woohoo_free_antag.set_owner(ascendee)
|
||||
var/datum/objective/kill_all_your_friends = new()
|
||||
kill_all_your_friends.owner = monster.mind
|
||||
kill_all_your_friends.explanation_text = "The station's crew must be culled."
|
||||
kill_all_your_friends.completed = TRUE
|
||||
woohoo_free_antag.objectives += kill_all_your_friends
|
||||
|
||||
/obj/structure/knock_tear/move_crushed(atom/movable/pusher, force = MOVE_FORCE_DEFAULT, direction)
|
||||
return FALSE
|
||||
|
||||
/obj/structure/knock_tear/Destroy(force) //this shouldnt happen but hey
|
||||
if(ascendee)
|
||||
ascendee = null
|
||||
return ..()
|
||||
@@ -6,6 +6,8 @@
|
||||
return TRUE
|
||||
if(result_bitflags & COMPONENT_OBJ_DISALLOW) // override all other checks
|
||||
return FALSE
|
||||
if(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
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
//Makes a blood drop, leaking amt units of blood from the mob
|
||||
/mob/living/carbon/proc/bleed(amt)
|
||||
if(!blood_volume)
|
||||
if(!blood_volume || (status_flags & GODMODE))
|
||||
return
|
||||
blood_volume = max(blood_volume - amt, 0)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 917 KiB After Width: | Height: | Size: 911 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 135 KiB After Width: | Height: | Size: 140 KiB |
|
Before Width: | Height: | Size: 78 KiB After Width: | Height: | Size: 79 KiB |
|
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 233 KiB After Width: | Height: | Size: 235 KiB |
@@ -2854,17 +2854,21 @@
|
||||
#include "code\modules\antagonists\heretic\items\heretic_blades.dm"
|
||||
#include "code\modules\antagonists\heretic\items\heretic_necks.dm"
|
||||
#include "code\modules\antagonists\heretic\items\hunter_rifle.dm"
|
||||
#include "code\modules\antagonists\heretic\items\keyring.dm"
|
||||
#include "code\modules\antagonists\heretic\items\lintel.dm"
|
||||
#include "code\modules\antagonists\heretic\items\madness_mask.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\ash_lore.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\blade_lore.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\cosmic_lore.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\flesh_lore.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\general_side.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\knock_lore.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\rust_lore.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_ash_flesh.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_blade_rust.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_cosmos_ash.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_flesh_void.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_knock_flesh.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_rust_cosmos.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\side_void_blade.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\starting_lore.dm"
|
||||
@@ -2874,10 +2878,14 @@
|
||||
#include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_map.dm"
|
||||
#include "code\modules\antagonists\heretic\knowledge\sacrifice_knowledge\sacrifice_moodlets.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\aggressive_spread.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\apetravulnera.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\ascended_shapeshift.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\ash_ascension.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\ash_jaunt.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\blood_cleave.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\blood_siphon.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\burglar_finesse.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\caretaker.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\cosmic_expansion.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\cosmic_runes.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\eldritch_blind.dm"
|
||||
@@ -2905,12 +2913,14 @@
|
||||
#include "code\modules\antagonists\heretic\magic\void_cold_cone.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\void_phase.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\void_pull.dm"
|
||||
#include "code\modules\antagonists\heretic\magic\wave_of_desperation.dm"
|
||||
#include "code\modules\antagonists\heretic\mobs\maid_in_mirror.dm"
|
||||
#include "code\modules\antagonists\heretic\status_effects\buffs.dm"
|
||||
#include "code\modules\antagonists\heretic\status_effects\debuffs.dm"
|
||||
#include "code\modules\antagonists\heretic\status_effects\ghoul.dm"
|
||||
#include "code\modules\antagonists\heretic\status_effects\mark_effects.dm"
|
||||
#include "code\modules\antagonists\heretic\structures\carving_knife.dm"
|
||||
#include "code\modules\antagonists\heretic\structures\knock_final.dm"
|
||||
#include "code\modules\antagonists\heretic\structures\mawed_crucible.dm"
|
||||
#include "code\modules\antagonists\highlander\highlander.dm"
|
||||
#include "code\modules\antagonists\hypnotized\hypnotized.dm"
|
||||
|
||||