diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm
index 4426c66cab8..94b17ee096b 100644
--- a/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm
+++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hierophant.dmm
@@ -1,64 +1,604 @@
-"a" = (/turf/closed/indestructible/riveted/hierophant,/area/ruin/unpowered/hierophant)
-"b" = (/obj/effect/decal/cleanable/blood/tracks,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"c" = (/obj/effect/decal/cleanable/cobweb,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"d" = (/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"e" = (/obj/effect/gibspawner/human,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"f" = (/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/decal/cleanable/blood,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"g" = (/obj/effect/light_emitter{set_cap = 3; set_luminosity = 7},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"h" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)"; icon_state = "tracks"; dir = 4},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"i" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (EAST)"; icon_state = "tracks"; dir = 4},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"j" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/obj/effect/light_emitter{set_cap = 3; set_luminosity = 5},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"k" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHWEST)"; icon_state = "tracks"; dir = 10},/obj/effect/decal/cleanable/blood,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"l" = (/obj/effect/light_emitter{set_cap = 3; set_luminosity = 5},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"m" = (/obj/effect/gibspawner/generic,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"n" = (/obj/effect/decal/cleanable/blood,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"o" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)"; icon_state = "tracks"; dir = 5},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"p" = (/obj/effect/light_emitter,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"q" = (/obj/effect/decal/cleanable/blood/old,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"r" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHWEST)"; icon_state = "tracks"; dir = 9},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"s" = (/obj/effect/decal/cleanable/blood/gibs/limb,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"t" = (/obj/effect/decal/cleanable/ash,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"u" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHWEST)"; icon_state = "tracks"; dir = 10},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"v" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHEAST)"; icon_state = "tracks"; dir = 5},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"w" = (/obj/effect/gibspawner/human,/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)"; icon_state = "tracks"; dir = 6},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"x" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (WEST)"; icon_state = "tracks"; dir = 8},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"y" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (WEST)"; icon_state = "tracks"; dir = 8},/obj/effect/light_emitter{set_cap = 3; set_luminosity = 7},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"z" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (NORTHWEST)"; icon_state = "tracks"; dir = 9},/obj/effect/decal/cleanable/blood,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"A" = (/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHEAST)"; icon_state = "tracks"; dir = 6},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"B" = (/mob/living/simple_animal/hostile/megafauna/hierophant,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"C" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (WEST)"; icon_state = "tracks"; dir = 8},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"D" = (/obj/effect/decal/remains/human,/obj/effect/decal/cleanable/blood,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"E" = (/obj/effect/decal/cleanable/blood/gibs/up,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"F" = (/obj/effect/decal/cleanable/blood/old,/obj/effect/decal/remains/human,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"G" = (/obj/effect/decal/cleanable/blood/gibs/core,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"H" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/tracks{tag = "icon-tracks (SOUTHWEST)"; icon_state = "tracks"; dir = 10},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"I" = (/obj/effect/gibspawner/human,/obj/effect/light_emitter{set_cap = 3; set_luminosity = 5},/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
-"J" = (/obj/effect/decal/cleanable/blood/gibs/down,/turf/open/indestructible/hierophant,/area/ruin/unpowered/hierophant)
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/closed/indestructible/riveted/hierophant,
+/area/ruin/unpowered/hierophant)
+"b" = (
+/turf/open/indestructible/hierophant,
+/area/ruin/unpowered/hierophant)
+"c" = (
+/obj/effect/light_emitter{
+ set_cap = 3;
+ set_luminosity = 5
+ },
+/turf/open/indestructible/hierophant,
+/area/ruin/unpowered/hierophant)
+"d" = (
+/mob/living/simple_animal/hostile/megafauna/hierophant,
+/turf/open/indestructible/hierophant/two,
+/area/ruin/unpowered/hierophant)
+"f" = (
+/obj/effect/light_emitter{
+ set_cap = 3;
+ set_luminosity = 5
+ },
+/turf/open/indestructible/hierophant/two,
+/area/ruin/unpowered/hierophant)
+"e" = (
+/turf/open/indestructible/hierophant/two,
+/area/ruin/unpowered/hierophant)
(1,1,1) = {"
-aaaaaaaaaaaabaaaaaaaaaaaa
-acdddddddddddddddddddddda
-adeddfddddddgdddhhhdiddda
-addjddddddddkhhddddddldda
-adddadddaaaaaaaaadddaddda
-addddmhdhddddddddddmddnda
-adddddgdddddddddddgddodda
-addddddddkdopddfdddbdddda
-adqdadddddadddaddddbaddda
-adddadddddrdddddddddaddda
-adstadddadudhhdvadhwabdda
-adddadrxxmddddduddddaddda
-xxyoazApddddBddddpddadyxC
-addbabddddddddtdddddaddda
-addbabddadDdEdddadddafdda
-adddabddddddndddddqdaddda
-adddabddddadddadddddadnda
-adqedbddsdddpddddddddddda
-addddAgddddeddddddgFdddGa
-addddmdddddHdehddxdedddda
-adddadddaaaaaaaaadddaddda
-addlddddddddrdddddAddIdda
-adddddJdddddgdddqddddddda
-adnddddddFddbdddddddnddda
-aaaaaaaaaaaabaaaaaaaaaaaa
+a
+a
+a
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+a
+a
+a
+"}
+(2,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+c
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+"}
+(3,1,1) = {"
+a
+b
+b
+b
+c
+c
+b
+b
+b
+a
+b
+b
+b
+a
+b
+b
+b
+c
+c
+b
+b
+b
+a
+"}
+(4,1,1) = {"
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+"}
+(5,1,1) = {"
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+b
+c
+b
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+"}
+(6,1,1) = {"
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+b
+c
+b
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+"}
+(7,1,1) = {"
+b
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+b
+b
+b
+b
+b
+b
+"}
+(8,1,1) = {"
+a
+b
+b
+b
+c
+c
+e
+e
+e
+a
+e
+e
+e
+a
+e
+e
+e
+c
+c
+b
+b
+b
+a
+"}
+(9,1,1) = {"
+a
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+f
+e
+e
+e
+e
+e
+b
+b
+b
+b
+b
+a
+"}
+(10,1,1) = {"
+a
+b
+a
+b
+b
+b
+e
+a
+e
+e
+e
+e
+e
+e
+e
+a
+e
+b
+b
+b
+a
+b
+a
+"}
+(11,1,1) = {"
+a
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+b
+b
+b
+b
+b
+a
+"}
+(12,1,1) = {"
+a
+c
+b
+b
+c
+c
+e
+e
+f
+e
+e
+d
+e
+e
+f
+e
+e
+c
+c
+b
+b
+c
+a
+"}
+(13,1,1) = {"
+a
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+b
+b
+b
+b
+b
+a
+"}
+(14,1,1) = {"
+a
+b
+a
+b
+b
+b
+e
+a
+e
+e
+e
+e
+e
+e
+e
+a
+e
+b
+b
+b
+a
+b
+a
+"}
+(15,1,1) = {"
+a
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+f
+e
+e
+e
+e
+e
+b
+b
+b
+b
+b
+a
+"}
+(16,1,1) = {"
+a
+b
+b
+b
+c
+c
+e
+e
+e
+a
+e
+e
+e
+a
+e
+e
+e
+c
+c
+b
+b
+b
+a
+"}
+(17,1,1) = {"
+b
+b
+b
+b
+b
+b
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+e
+b
+b
+b
+b
+b
+b
+"}
+(18,1,1) = {"
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+b
+c
+b
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+"}
+(19,1,1) = {"
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+b
+c
+b
+b
+b
+c
+b
+a
+a
+b
+c
+b
+b
+"}
+(20,1,1) = {"
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+"}
+(21,1,1) = {"
+a
+b
+b
+b
+c
+c
+b
+b
+b
+a
+b
+b
+b
+a
+b
+b
+b
+c
+c
+b
+b
+b
+a
+"}
+(22,1,1) = {"
+a
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+c
+b
+b
+b
+b
+b
+b
+b
+b
+b
+b
+a
+"}
+(23,1,1) = {"
+a
+a
+a
+b
+b
+b
+b
+a
+a
+a
+a
+a
+a
+a
+a
+a
+b
+b
+b
+b
+a
+a
+a
"}
diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm
index 72ac92ac8de..e796c9c3ffb 100644
--- a/code/__HELPERS/unsorted.dm
+++ b/code/__HELPERS/unsorted.dm
@@ -536,12 +536,12 @@ Turf and target are seperate in case you want to teleport some distance from a t
return 1
-/proc/is_blocked_turf(turf/T)
+/proc/is_blocked_turf(turf/T, exclude_mobs)
if(T.density)
return 1
for(var/i in T)
var/atom/A = i
- if(A.density)
+ if(A.density && (!exclude_mobs || !ismob(A)))
return 1
return 0
diff --git a/code/datums/action.dm b/code/datums/action.dm
index ee91d7d13e1..d038d431075 100644
--- a/code/datums/action.dm
+++ b/code/datums/action.dm
@@ -206,7 +206,7 @@
/datum/action/item_action/toggle_unfriendly_fire
name = "Toggle Friendly Fire \[ON\]"
- desc = "Toggles if the staff causes friendly fire."
+ desc = "Toggles if the club's blasts cause friendly fire."
button_icon_state = "vortex_ff_on"
/datum/action/item_action/toggle_unfriendly_fire/Trigger()
@@ -214,8 +214,8 @@
UpdateButtonIcon()
/datum/action/item_action/toggle_unfriendly_fire/UpdateButtonIcon()
- if(istype(target, /obj/item/weapon/hierophant_staff))
- var/obj/item/weapon/hierophant_staff/H = target
+ if(istype(target, /obj/item/weapon/hierophant_club))
+ var/obj/item/weapon/hierophant_club/H = target
if(H.friendly_fire_check)
button_icon_state = "vortex_ff_off"
name = "Toggle Friendly Fire \[OFF\]"
@@ -226,12 +226,12 @@
/datum/action/item_action/vortex_recall
name = "Vortex Recall"
- desc = "Recall yourself, and anyone nearby, to an attuned hierophant rune at any time.
If no such rune exists, will produce a rune at your location."
+ desc = "Recall yourself, and anyone nearby, to an attuned hierophant beacon at any time.
If the beacon is still attached, will detach it."
button_icon_state = "vortex_recall"
/datum/action/item_action/vortex_recall/IsAvailable()
- if(istype(target, /obj/item/weapon/hierophant_staff))
- var/obj/item/weapon/hierophant_staff/H = target
+ if(istype(target, /obj/item/weapon/hierophant_club))
+ var/obj/item/weapon/hierophant_club/H = target
if(H.teleporting)
return 0
return ..()
diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm
index 3674680eb28..53e8fe4d9e5 100644
--- a/code/datums/ruins/lavaland.dm
+++ b/code/datums/ruins/lavaland.dm
@@ -124,7 +124,7 @@
/datum/map_template/ruin/lavaland/hierophant
name = "Hierophant's Arena"
id = "hierophant"
- description = "A huge fucking bird priest awaits you in this arena."
+ description = "A strange, square chunk of metal of massive size. Inside awaits only death and many, many squares."
suffix = "lavaland_surface_hierophant.dmm"
cost = 0
allow_duplicates = FALSE
diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm
index db0777fe84d..2047e97f5c5 100644
--- a/code/game/objects/effects/overlays.dm
+++ b/code/game/objects/effects/overlays.dm
@@ -40,6 +40,9 @@
timerid = QDEL_IN(src, duration)
+/obj/effect/overlay/temp/ex_act()
+ return
+
/obj/effect/overlay/temp/dir_setting
randomdir = FALSE
diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm
index f1498e119aa..79ab9742dc4 100644
--- a/code/game/turfs/closed.dm
+++ b/code/game/turfs/closed.dm
@@ -43,7 +43,6 @@
..()
if(smooth)
queue_smooth(src)
- icon_state = ""
/turf/closed/indestructible/riveted/uranium
icon = 'icons/turf/walls/uranium_wall.dmi'
@@ -97,3 +96,10 @@
icon_state = "necro"
explosion_block = 50
baseturf = /turf/closed/indestructible/necropolis
+
+/turf/closed/indestructible/riveted/hierophant
+ name = "wall"
+ desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern."
+ icon = 'icons/turf/walls/hierophant_wall.dmi'
+ icon_state = "wall"
+ smooth = SMOOTH_TRUE
diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm
index c667745dcf5..fcaafe9b36f 100644
--- a/code/game/turfs/open.dm
+++ b/code/game/turfs/open.dm
@@ -31,6 +31,19 @@
if(prob(12))
icon_state = "necro[rand(2,3)]"
+/turf/open/indestructible/hierophant
+ icon = 'icons/turf/floors/hierophant_floor.dmi'
+ initial_gas_mix = "o2=14;n2=23;TEMP=300"
+ baseturf = /turf/open/indestructible/hierophant
+ smooth = SMOOTH_TRUE
+
+/turf/open/indestructible/hierophant/New()
+ ..()
+ if(smooth)
+ queue_smooth(src)
+
+/turf/open/indestructible/hierophant/two
+
/turf/open/Initalize_Atmos(times_fired)
excited = 0
@@ -198,7 +211,7 @@
if(wet == TURF_WET_PERMAFROST)
wet = TURF_WET_ICE
else if(wet == TURF_WET_ICE)
- wet = TURF_WET_WATER
+ wet = TURF_WET_WATER
else
wet = TURF_DRY
if(wet_overlay)
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index f7ccdc19f49..6d87eaf7fe0 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -758,33 +758,41 @@
qdel(src)
//Hierophant
-
-/obj/item/weapon/hierophant_staff
- name = "Hierophant's staff"
- desc = "A large club with intense magic power infused into it."
- icon_state = "hierophant_staff"
- item_state = "hierophant_staff"
- icon = 'icons/obj/guns/magic.dmi'
+/obj/item/weapon/hierophant_club
+ name = "hierophant club"
+ desc = "The strange technology of this large club allows various nigh-magical feats. It used to beat you, but now you can set the beat."
+ icon_state = "hierophant_club_ready_beacon"
+ item_state = "hierophant_club_ready_beacon"
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ lefthand_file = 'icons/mob/inhands/64x64_lefthand.dmi'
+ righthand_file = 'icons/mob/inhands/64x64_righthand.dmi'
+ inhand_x_dimension = 64
+ inhand_y_dimension = 64
slot_flags = SLOT_BACK
w_class = WEIGHT_CLASS_BULKY
- force = 20
- hitsound = "swing_hit"
- //hitsound = 'sound/weapons/sonic_jackhammer.ogg'
+ force = 15
+ hitsound = 'sound/weapons/sonic_jackhammer.ogg'
actions_types = list(/datum/action/item_action/vortex_recall, /datum/action/item_action/toggle_unfriendly_fire)
var/cooldown_time = 20 //how long the cooldown between non-melee ranged attacks is
- var/chaser_cooldown = 101 //how long the cooldown between firing chasers at mobs is
+ var/chaser_cooldown = 81 //how long the cooldown between firing chasers at mobs is
var/chaser_timer = 0 //what our current chaser cooldown is
+ var/chaser_speed = 0.8 //how fast our chasers are
var/timer = 0 //what our current cooldown is
- var/blast_range = 3 //how long the cardinal blast's walls are
- var/obj/effect/hierophant/rune //the associated rune we teleport to
+ var/blast_range = 13 //how long the cardinal blast's walls are
+ var/obj/effect/hierophant/beacon //the associated beacon we teleport to
var/teleporting = FALSE //if we ARE teleporting
var/friendly_fire_check = FALSE //if the blasts we make will consider our faction against the faction of hit targets
-/obj/item/weapon/hierophant_staff/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+/obj/item/weapon/hierophant_club/examine(mob/user)
+ ..()
+ user << "The[beacon ? " beacon is not currently":"re is a beacon"] attached."
+
+/obj/item/weapon/hierophant_club/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
..()
var/turf/T = get_turf(target)
if(!T || timer > world.time)
return
+ calculate_anger_mod(user)
timer = world.time + CLICK_CD_MELEE //by default, melee attacks only cause melee blasts, and have an accordingly short cooldown
if(proximity_flag)
addtimer(src, "aoe_burst", 0, TIMER_NORMAL, T, user)
@@ -797,77 +805,123 @@
timer = world.time + cooldown_time
if(isliving(target) && chaser_timer <= world.time) //living and chasers off cooldown? fire one!
chaser_timer = world.time + chaser_cooldown
- PoolOrNew(/obj/effect/overlay/temp/hierophant/chaser, list(get_turf(user), user, target, 1.5, friendly_fire_check))
+ PoolOrNew(/obj/effect/overlay/temp/hierophant/chaser, list(get_turf(user), user, target, chaser_speed, friendly_fire_check))
add_logs(user, target, "fired a chaser at", src)
else
addtimer(src, "cardinal_blasts", 0, TIMER_NORMAL, T, user) //otherwise, just do cardinal blast
add_logs(user, target, "fired cardinal blast at", src)
else
user << "That target is out of range!" //too far away
+ timer = world.time
+ addtimer(src, "prepare_icon_update", 0)
-/obj/item/weapon/hierophant_staff/ui_action_click(mob/user, action)
+/obj/item/weapon/hierophant_club/proc/calculate_anger_mod(mob/user) //we get stronger as the user loses health
+ chaser_cooldown = initial(chaser_cooldown)
+ cooldown_time = initial(cooldown_time)
+ chaser_speed = initial(chaser_speed)
+ blast_range = initial(blast_range)
+ if(isliving(user))
+ var/mob/living/L = user
+ var/health_percent = L.health / L.maxHealth
+ chaser_cooldown += round(health_percent * 20) //two tenths of a second for each missing 10% of health
+ cooldown_time += round(health_percent * 10) //one tenth of a second for each missing 10% of health
+ chaser_speed = max(chaser_speed + health_percent, 0.5) //one tenth of a second faster for each missing 10% of health
+ blast_range -= round(health_percent * 10) //one additional range for each missing 10% of health
+
+/obj/item/weapon/hierophant_club/update_icon()
+ icon_state = "hierophant_club[timer <= world.time ? "_ready":""][beacon ? "":"_beacon"]"
+ item_state = icon_state
+ if(ismob(loc))
+ var/mob/M = loc
+ M.update_inv_hands()
+ M.update_inv_back()
+
+/obj/item/weapon/hierophant_club/proc/prepare_icon_update()
+ update_icon()
+ sleep(timer - world.time)
+ update_icon()
+
+/obj/item/weapon/hierophant_club/ui_action_click(mob/user, action)
if(istype(action, /datum/action/item_action/toggle_unfriendly_fire)) //toggle friendly fire...
friendly_fire_check = !friendly_fire_check
user << "You toggle friendly fire [friendly_fire_check ? "off":"on"]!"
return
- if(!user.is_holding(src)) //you need to hold the staff to teleport
- user << "You need to hold the staff in your hands to [rune ? "teleport with it":"create a rune"]!"
+ if(timer > world.time)
return
- if(!rune)
+ if(!user.is_holding(src)) //you need to hold the staff to teleport
+ user << "You need to hold the club in your hands to [beacon ? "teleport with it":"detach the beacon"]!"
+ return
+ if(!beacon)
if(isturf(user.loc))
- user.visible_message("[user] holds [src] carefully in front of [user.p_them()], moving it in a strange pattern...", \
- "You start creating a hierophant rune to teleport to...")
+ user.visible_message("[user] starts fiddling with [src]'s pommel...", \
+ "You start detaching the hierophant beacon...")
timer = world.time + 51
- if(do_after(user, 50, target = user))
+ addtimer(src, "prepare_icon_update", 0)
+ if(do_after(user, 50, target = user) && !beacon)
var/turf/T = get_turf(user)
playsound(T,'sound/magic/Blind.ogg', 200, 1, -4)
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/teleport, list(T, user))
- var/obj/effect/hierophant/H = new/obj/effect/hierophant(T)
- rune = H
+ beacon = new/obj/effect/hierophant(T)
user.update_action_buttons_icon()
- user.visible_message("[user] creates a strange rune beneath [user.p_them()]!", \
- "You create a hierophant rune, which you can teleport yourself and any allies to at any time!\n\
- You can remove the rune to place a new one by striking it with the staff.")
+ user.visible_message("[user] places a strange machine beneath [user.p_their()] feet!", \
+ "You detach the hierophant beacon, allowing you to teleport yourself and any allies to it at any time!\n\
+ You can remove the beacon to place it again by striking it with the club.")
else
timer = world.time
+ addtimer(src, "prepare_icon_update", 0)
else
- user << "You need to be on solid ground to produce a rune!"
+ user << "You need to be on solid ground to detach the beacon!"
return
- if(get_dist(user, rune) <= 2) //rune too close abort
- user << "You are too close to the rune to teleport to it!"
+ if(get_dist(user, beacon) <= 2) //beacon too close abort
+ user << "You are too close to the beacon to teleport to it!"
return
- if(is_blocked_turf(get_turf(rune)))
- user << "The rune is blocked by something, preventing teleportation!"
+ if(is_blocked_turf(get_turf(beacon), TRUE))
+ user << "The beacon is blocked by something, preventing teleportation!"
+ return
+ if(!isturf(user.loc))
+ user << "You don't have enough space to teleport from here!"
return
teleporting = TRUE //start channel
user.update_action_buttons_icon()
user.visible_message("[user] starts to glow faintly...")
timer = world.time + 50
- if(do_after(user, 40, target = user) && rune)
- var/turf/T = get_turf(rune)
+ addtimer(src, "prepare_icon_update", 0)
+ beacon.icon_state = "hierophant_tele_on"
+ var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE1 = PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/edge, user.loc)
+ var/obj/effect/overlay/temp/hierophant/telegraph/edge/TE2 = PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/edge, beacon.loc)
+ if(do_after(user, 40, target = user) && user && beacon)
+ var/turf/T = get_turf(beacon)
var/turf/source = get_turf(user)
- if(is_blocked_turf(T))
+ if(is_blocked_turf(T, TRUE))
teleporting = FALSE
- user << "The rune is blocked by something, preventing teleportation!"
+ user << "The beacon is blocked by something, preventing teleportation!"
user.update_action_buttons_icon()
+ timer = world.time
+ addtimer(src, "prepare_icon_update", 0)
+ beacon.icon_state = "hierophant_tele_off"
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(T, user))
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(source, user))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
- playsound(source,'sound/magic/blink.ogg', 200, 1)
- //playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
- if(!do_after(user, 3, target = user) || !rune) //no walking away shitlord
+ playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
+ playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
+ if(!do_after(user, 3, target = user) || !user || !beacon) //no walking away shitlord
teleporting = FALSE
if(user)
user.update_action_buttons_icon()
+ timer = world.time
+ addtimer(src, "prepare_icon_update", 0)
+ if(beacon)
+ beacon.icon_state = "hierophant_tele_off"
return
- if(is_blocked_turf(T))
+ if(is_blocked_turf(T, TRUE))
teleporting = FALSE
- user << "The rune is blocked by something, preventing teleportation!"
+ user << "The beacon is blocked by something, preventing teleportation!"
user.update_action_buttons_icon()
+ timer = world.time
+ addtimer(src, "prepare_icon_update", 0)
+ beacon.icon_state = "hierophant_tele_off"
return
- add_logs(user, rune, "teleported self from ([source.x],[source.y],[source.z]) to")
+ add_logs(user, beacon, "teleported self from ([source.x],[source.y],[source.z]) to")
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/teleport, list(T, user))
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/teleport, list(source, user))
for(var/t in RANGE_TURFS(1, T))
@@ -879,15 +933,22 @@
for(var/mob/living/L in range(1, source))
addtimer(src, "teleport_mob", 0, TIMER_NORMAL, source, L, T, user) //regardless, take all mobs near us along
sleep(6) //at this point the blasts detonate
+ if(beacon)
+ beacon.icon_state = "hierophant_tele_off"
else
+ qdel(TE1)
+ qdel(TE2)
timer = world.time
+ addtimer(src, "prepare_icon_update", 0)
+ if(beacon)
+ beacon.icon_state = "hierophant_tele_off"
teleporting = FALSE
if(user)
user.update_action_buttons_icon()
-/obj/item/weapon/hierophant_staff/proc/teleport_mob(turf/source, mob/M, turf/target, mob/user)
+/obj/item/weapon/hierophant_club/proc/teleport_mob(turf/source, mob/M, turf/target, mob/user)
var/turf/turf_to_teleport_to = get_step(target, get_dir(source, M)) //get position relative to caster
- if(!turf_to_teleport_to || is_blocked_turf(turf_to_teleport_to))
+ if(!turf_to_teleport_to || is_blocked_turf(turf_to_teleport_to, TRUE))
return
animate(M, alpha = 0, time = 2, easing = EASE_OUT) //fade out
sleep(1)
@@ -909,18 +970,17 @@
if(user != M)
add_logs(user, M, "teleported", null, "from ([source.x],[source.y],[source.z])")
-/obj/item/weapon/hierophant_staff/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
+/obj/item/weapon/hierophant_club/proc/cardinal_blasts(turf/T, mob/living/user) //fire cardinal cross blasts with a delay
if(!T)
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/cardinal, list(T, user))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(T, user, friendly_fire_check))
for(var/d in cardinal)
addtimer(src, "blast_wall", 0, TIMER_NORMAL, T, d, user)
-/obj/item/weapon/hierophant_staff/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long
+/obj/item/weapon/hierophant_club/proc/blast_wall(turf/T, dir, mob/living/user) //make a wall of blasts blast_range tiles long
if(!T)
return
var/range = blast_range
@@ -933,12 +993,11 @@
previousturf = J
J = get_step(previousturf, dir)
-/obj/item/weapon/hierophant_staff/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
+/obj/item/weapon/hierophant_club/proc/aoe_burst(turf/T, mob/living/user) //make a 3x3 blast around a target
if(!T)
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(T, user))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(t, user, friendly_fire_check))
diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
index a56c00e7fdd..d5a545f91ac 100644
--- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
+++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm
@@ -3,7 +3,7 @@
The Hierophant
-The Hierophant spawns in its arena, an area designed to make it harder to fight than it would otherwise be.
+The Hierophant spawns in its arena, which makes fighting it challenging but not impossible.
The text this boss speaks is ROT4, use ROT22 to decode
@@ -21,51 +21,53 @@ The Hierophant's attacks are as follows, and INTENSIFY at a random chance based
If chasers are off cooldown, creates four high-speed chasers.
- IF TARGET WAS STRUCK IN MELEE: Creates a 3x3 square of blasts under the target.
-Cross Blasts and the AoE burst gain additional range as the Hierophant loses health, while Chasers gain additional speed.
+- IF TARGET IS OUTSIDE THE ARENA: Creates an arena around the target for 10 seconds, blinking to it if Hierophant is not in the arena.
+ The arena has a 20 second cooldown, giving people a small window to get the fuck out.
-When The Hierophant dies, it leaves behind its staff, which, while much weaker than when wielded by The Hierophant itself, is still quite effective.
-- The staff can place a teleport rune, allowing the user to teleport themself and their allies to the rune.
+Cross Blasts and the AoE burst gain additional range as Hierophant loses health, while Chasers gain additional speed.
+
+When Hierophant dies, it stops trying to murder you and shrinks into a small form, which, while much weaker, is still quite effective.
+- The smaller club can place a teleport beacon, allowing the user to teleport themself and their allies to the beacon.
Difficulty: Hard
*/
/mob/living/simple_animal/hostile/megafauna/hierophant
- name = "Hierophant"
- desc = "Stolen from Hyper Light Drifter."
+ name = "hierophant"
+ desc = "A massive metal club that hangs in the air as though waiting. It'll make you dance to its beat."
health = 2500
maxHealth = 2500
attacktext = "clubs"
- //attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
- attack_sound = "swing_hit"
+ attack_sound = 'sound/weapons/sonic_jackhammer.ogg'
icon_state = "hierophant"
icon_living = "hierophant"
friendly = "stares down"
- icon = 'icons/mob/lavaland/hierophant.dmi'
+ icon = 'icons/mob/lavaland/hierophant_new.dmi'
faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house
speak_emote = list("preaches")
armour_penetration = 50
- melee_damage_lower = 10
- melee_damage_upper = 10
+ melee_damage_lower = 15
+ melee_damage_upper = 15
speed = 1
move_to_delay = 10
ranged = 1
- pixel_x = -16
ranged_cooldown_time = 40
- aggro_vision_range = 23
- loot = list(/obj/item/weapon/hierophant_staff)
+ aggro_vision_range = 21 //so it can see to one side of the arena to the other
+ loot = list(/obj/item/weapon/hierophant_club)
wander = FALSE
var/burst_range = 3 //range on burst aoe
var/beam_range = 5 //range on cross blast beams
var/chaser_speed = 3 //how fast chasers are currently
var/chaser_cooldown = 101 //base cooldown/cooldown var between spawning chasers
var/major_attack_cooldown = 60 //base cooldown for major attacks
+ var/arena_cooldown = 200 //base cooldown/cooldown var for creating an arena
var/blinking = FALSE //if we're doing something that requires us to stand still and not attack
- var/obj/effect/hierophant/spawned_rune //the rune we teleport back to
- var/timeout_time = 15 //after this many Life() ticks with no target, we return to our rune
- var/did_reset = TRUE //if we timed out, returned to our rune, and healed some
- //var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...")
- //var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.")
+ var/obj/effect/hierophant/spawned_beacon //the beacon we teleport back to
+ var/timeout_time = 15 //after this many Life() ticks with no target, we return to our beacon
+ var/did_reset = TRUE //if we timed out, returned to our beacon, and healed some
+ var/list/kill_phrases = list("Wsyvgi sj irivkc xettih. Vitemvmrk...", "Irivkc wsyvgi jsyrh. Vitemvmrk...", "Jyip jsyrh. Egxmzexmrk vitemv gcgpiw...", "Kix fiex. Liepmrk...")
+ var/list/target_phrases = list("Xevkix psgexih.", "Iriqc jsyrh.", "Eguymvih xevkix.")
medal_type = MEDAL_PREFIX
score_type = BIRD_SCORE
del_on_death = TRUE
@@ -74,25 +76,25 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/hierophant/New()
..()
internal = new/obj/item/device/gps/internal/hierophant(src)
- spawned_rune = new(loc)
+ spawned_beacon = new(loc)
/mob/living/simple_animal/hostile/megafauna/hierophant/Life()
. = ..()
- if(. && spawned_rune && !client)
- if(target || loc == spawned_rune.loc)
+ if(. && spawned_beacon && !qdeleted(spawned_beacon) && !client)
+ if(target || loc == spawned_beacon.loc)
timeout_time = initial(timeout_time)
else
timeout_time--
if(timeout_time <= 0 && !did_reset)
did_reset = TRUE
- //visible_message("\"Vixyvrmrk xs fewi...\"")
- blink(spawned_rune)
- adjustHealth(min((health - maxHealth) * 0.5, -50)) //heal for 50% of our missing health
+ visible_message("\"Vixyvrmrk xs fewi...\"")
+ blink(spawned_beacon)
+ adjustHealth(min((health - maxHealth) * 0.5, -250)) //heal for 50% of our missing health, minimum 10% of maximum health
wander = FALSE
- /*if(health > maxHealth * 0.9)
+ if(health > maxHealth * 0.9)
visible_message("\"Vitemvw gsqtpixi. Stivexmrk ex qebmqyq ijjmgmirgc.\"")
else
- visible_message("\"Vitemvw gsqtpixi. Stivexmsrep ijjmgmirgc gsqtvsqmwih.\"")*/
+ visible_message("\"Vitemvw gsqtpixi. Stivexmsrep ijjmgmirgc gsqtvsqmwih.\"")
/mob/living/simple_animal/hostile/megafauna/hierophant/death()
if(health > 0 || stat == DEAD)
@@ -100,36 +102,33 @@ Difficulty: Hard
else
stat = DEAD
blinking = TRUE //we do a fancy animation, release a huge burst(), and leave our staff.
- animate(src, alpha = 0, color = "660099", time = 20, easing = EASE_OUT)
- addtimer(src, "update_atom_colour", 20)
burst_range = 10
- //visible_message("\"Mrmxmexmrk wipj-hiwxvygx wiuyirgi...\"")
- visible_message("[src] disappears in a massive burst of magic, leaving only its staff.")
+ visible_message("\"Mrmxmexmrk wipj-hiwxvygx wiuyirgi...\"")
+ visible_message("[src] shrinks, releasing a massive burst of energy!")
burst(get_turf(src))
..()
/mob/living/simple_animal/hostile/megafauna/hierophant/Destroy()
- qdel(spawned_rune)
+ qdel(spawned_beacon)
. = ..()
/mob/living/simple_animal/hostile/megafauna/hierophant/devour(mob/living/L)
for(var/obj/item/W in L)
if(!L.unEquip(W))
qdel(W)
- /*visible_message(
- "\"[pick(kill_phrases)]\"\n[src] annihilates [L]!",
- "You annihilate [L], restoring your health!")*/
visible_message(
- "\"Caw.\"\n[src] annihilates [L]!",
+ "\"[pick(kill_phrases)]\"\n[src] annihilates [L]!",
"You annihilate [L], restoring your health!")
adjustHealth(-L.maxHealth*0.5)
L.dust()
-/*/mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target)
+/mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target)
var/targets_the_same = (new_target == target)
. = ..()
if(. && target && !targets_the_same)
- visible_message("\"[pick(target_phrases)]\"")*/
+ visible_message("\"[pick(target_phrases)]\"")
+ if(spawned_beacon && loc == spawned_beacon.loc && did_reset)
+ arena_trap(src)
/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()
@@ -149,9 +148,14 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/hierophant/Move()
if(!blinking)
- /*if(!stat)
- playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4)*/
- ..()
+ var/prevloc = loc
+ . = ..()
+ if(!stat && .)
+ var/obj/effect/overlay/temp/hierophant/squares/HS = PoolOrNew(/obj/effect/overlay/temp/hierophant/squares, prevloc)
+ HS.dir = dir
+ playsound(loc, 'sound/mecha/mechmove04.ogg', 150, 1, -4)
+ if(target)
+ arena_trap(target)
/mob/living/simple_animal/hostile/megafauna/hierophant/Goto(target, delay, minimum_distance)
wander = TRUE
@@ -177,6 +181,8 @@ Difficulty: Hard
chaser_speed = max(1, (3 - anger_modifier * 0.04) + target_is_slow * 0.5)
if(blinking)
return
+
+ arena_trap(target)
ranged_cooldown = world.time + max(5, ranged_cooldown_time - anger_modifier * 0.75) //scale cooldown lower with high anger.
if(prob(anger_modifier * 0.75)) //major ranged attack
@@ -197,7 +203,7 @@ Difficulty: Hard
switch(pick(possibilities))
if("blink_spam") //blink either once or multiple times.
if(health < maxHealth * 0.5 && !target_is_slow && blink_counter > 1)
- //visible_message("\"Mx ampp rsx iwgeti.\"")
+ visible_message("\"Mx ampp rsx iwgeti.\"")
var/oldcolor = color
animate(src, color = "#660099", time = 6)
while(health && target && blink_counter)
@@ -215,13 +221,13 @@ Difficulty: Hard
else
blink(target)
if("cross_blast_spam") //fire a lot of cross blasts at a target.
- //visible_message("\"Piezi mx rsalivi xs vyr.\"")
+ visible_message("\"Piezi mx rsalivi xs vyr.\"")
blinking = TRUE
var/oldcolor = color
animate(src, color = "#660099", time = 6)
while(health && target && cross_counter)
cross_counter--
- var/delay = 6
+ var/delay = 7
if(prob(60))
addtimer(src, "cardinal_blasts", 0, TIMER_NORMAL, target)
else
@@ -233,7 +239,7 @@ Difficulty: Hard
sleep(8)
blinking = FALSE
if("chaser_swarm") //fire four fucking chasers at a target and their friends.
- //visible_message("\"Mx gerrsx lmhi.\"")
+ visible_message("\"Mx gerrsx lmhi.\"")
blinking = TRUE
var/oldcolor = color
animate(src, color = "#660099", time = 10)
@@ -243,7 +249,7 @@ Difficulty: Hard
var/mob/living/pickedtarget = pick(targets)
if(targets.len > 4)
pickedtarget = pick_n_take(targets)
- if(pickedtarget.stat == DEAD)
+ if(!istype(pickedtarget) || pickedtarget.stat == DEAD)
pickedtarget = target
var/obj/effect/overlay/temp/hierophant/chaser/C = PoolOrNew(/obj/effect/overlay/temp/hierophant/chaser, list(loc, src, pickedtarget, chaser_speed, FALSE))
C.moving = 3
@@ -289,8 +295,7 @@ Difficulty: Hard
if(!T)
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/diagonal, list(T, src))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(T, src, FALSE))
for(var/d in diagonals)
@@ -301,8 +306,7 @@ Difficulty: Hard
if(!T)
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/cardinal, list(T, src))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(T, src, FALSE))
for(var/d in cardinal)
@@ -313,21 +317,46 @@ Difficulty: Hard
if(!T)
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(T, src))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(T, src, FALSE))
for(var/d in alldirs)
addtimer(src, "blast_wall", 0, TIMER_NORMAL, T, d)
-/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blast_wall(turf/T, dir) //make a wall of blasts beam_range tiles long
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blast_wall(turf/T, set_dir) //make a wall of blasts beam_range tiles long
var/range = beam_range
var/turf/previousturf = T
- var/turf/J = get_step(previousturf, dir)
+ var/turf/J = get_step(previousturf, set_dir)
for(var/i in 1 to range)
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(J, src, FALSE))
previousturf = J
- J = get_step(previousturf, dir)
+ J = get_step(previousturf, set_dir)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/arena_trap(mob/victim) //trap a target in an arena
+ var/turf/T = get_turf(victim)
+ if(!istype(victim) || victim.stat == DEAD || !T || arena_cooldown > world.time)
+ return
+ if((istype(get_area(T), /area/ruin/unpowered/hierophant) || istype(get_area(src), /area/ruin/unpowered/hierophant)) && victim != src)
+ return
+ arena_cooldown = world.time + initial(arena_cooldown)
+ for(var/d in cardinal)
+ addtimer(src, "arena_squares", 0, TIMER_NORMAL, T, d)
+ for(var/t in RANGE_TURFS(11, T))
+ if(t && get_dist(t, T) == 11)
+ new /obj/effect/overlay/temp/hierophant/wall(t)
+ PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(t, src, FALSE))
+ if(get_dist(src, T) >= 11) //hey you're out of range I need to get closer to you!
+ addtimer(src, "blink", 0, TIMER_NORMAL, T)
+
+/mob/living/simple_animal/hostile/megafauna/hierophant/proc/arena_squares(turf/T, set_dir) //make a fancy effect extending from the arena target
+ var/turf/previousturf = T
+ var/turf/J = get_step(previousturf, set_dir)
+ for(var/i in 1 to 10)
+ var/obj/effect/overlay/temp/hierophant/squares/HS = PoolOrNew(/obj/effect/overlay/temp/hierophant/squares, J)
+ HS.dir = set_dir
+ previousturf = J
+ J = get_step(previousturf, set_dir)
+ sleep(0.5)
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/blink(mob/victim) //blink to a target
if(blinking || !victim)
@@ -336,10 +365,8 @@ Difficulty: Hard
var/turf/source = get_turf(src)
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(T, src))
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(source, src))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
- playsound(source,'sound/magic/blink.ogg', 200, 1)
- //playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
+ playsound(T,'sound/magic/Wand_Teleport.ogg', 200, 1)
+ playsound(source,'sound/machines/AirlockOpen.ogg', 200, 1)
blinking = TRUE
sleep(2) //short delay before we start...
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/teleport, list(T, src))
@@ -371,15 +398,13 @@ Difficulty: Hard
if(!T)
return
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph, list(T, src))
- playsound(T,'sound/magic/blink.ogg', 200, 1)
- //playsound(T,'sound/effects/bin_close.ogg', 200, 1)
+ playsound(T,'sound/effects/bin_close.ogg', 200, 1)
sleep(2)
for(var/t in RANGE_TURFS(1, T))
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(t, src, FALSE))
/mob/living/simple_animal/hostile/megafauna/hierophant/proc/burst(turf/original) //release a wave of blasts
- playsound(original,'sound/magic/blink.ogg', 200, 1)
- //playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1)
+ playsound(original,'sound/machines/AirlockOpen.ogg', 200, 1)
var/last_dist = 0
for(var/t in spiral_range_turfs(burst_range, original))
var/turf/T = t
@@ -388,7 +413,7 @@ Difficulty: Hard
var/dist = get_dist(original, T)
if(dist > last_dist)
last_dist = dist
- sleep(1 + (burst_range - last_dist) * 0.5) //gets faster as it gets further out
+ sleep(1 + min(burst_range - last_dist, 12) * 0.5) //gets faster as it gets further out
PoolOrNew(/obj/effect/overlay/temp/hierophant/blast, list(T, src, FALSE))
/mob/living/simple_animal/hostile/megafauna/hierophant/AltClickOn(atom/A) //player control handler(don't give this to a player holy fuck)
@@ -398,6 +423,7 @@ Difficulty: Hard
//Hierophant overlays
/obj/effect/overlay/temp/hierophant
+ name = "vortex energy"
layer = BELOW_MOB_LAYER
var/mob/living/caster //who made this, anyway
@@ -406,6 +432,41 @@ Difficulty: Hard
if(new_caster)
caster = new_caster
+/obj/effect/overlay/temp/hierophant/squares
+ icon_state = "hierophant_squares"
+ duration = 3
+ luminosity = 1
+ randomdir = FALSE
+
+/obj/effect/overlay/temp/hierophant/squares/New(loc, new_caster)
+ ..()
+ if(ismineralturf(loc))
+ var/turf/closed/mineral/M = loc
+ M.gets_drilled(caster)
+
+/obj/effect/overlay/temp/hierophant/wall //smoothing and pooling are not friends. TODO: figure this out
+ name = "vortex wall"
+ icon = 'icons/turf/walls/hierophant_wall_temp.dmi'
+ icon_state = "wall"
+ luminosity = 1
+ duration = 100
+ smooth = SMOOTH_TRUE
+
+/obj/effect/overlay/temp/hierophant/wall/New(loc, new_caster)
+ ..()
+ queue_smooth_neighbors(src)
+ queue_smooth(src)
+
+/obj/effect/overlay/temp/hierophant/wall/Destroy()
+ queue_smooth_neighbors(src)
+ ..()
+ return QDEL_HINT_QUEUE
+
+/obj/effect/overlay/temp/hierophant/wall/CanPass(atom/movable/mover, turf/target, height = 0)
+ if(mover == caster)
+ return TRUE
+ return FALSE
+
/obj/effect/overlay/temp/hierophant/chaser //a hierophant's chaser. follows target around, moving and producing a blast every speed deciseconds.
duration = 98
var/mob/living/target //what it's following
@@ -483,6 +544,10 @@ Difficulty: Hard
icon_state = "hierophant_telegraph_teleport"
duration = 9
+/obj/effect/overlay/temp/hierophant/telegraph/edge
+ icon_state = "hierophant_telegraph_edge"
+ duration = 40
+
/obj/effect/overlay/temp/hierophant/blast
icon_state = "hierophant_blast"
name = "vortex blast"
@@ -545,34 +610,40 @@ Difficulty: Hard
M.take_damage(damage, BURN, 0, 0)
/obj/effect/hierophant
- name = "hierophant rune"
- desc = "A powerful magic mark allowing whomever attunes themself to it to return to it at will."
- icon = 'icons/obj/rune.dmi'
- icon_state = "hierophant"
+ name = "hierophant beacon"
+ desc = "A strange beacon, allowing mass teleportation for those able to use it."
+ icon = 'icons/obj/lavaland/artefacts.dmi'
+ icon_state = "hierophant_tele_off"
+ luminosity = 2
layer = LOW_OBJ_LAYER
anchored = TRUE
- color = "#CC00FF"
+
+/obj/effect/hierophant/ex_act()
+ return
/obj/effect/hierophant/attackby(obj/item/I, mob/user, params)
- if(istype(I, /obj/item/weapon/hierophant_staff))
- var/obj/item/weapon/hierophant_staff/H = I
- if(H.rune == src)
- user << "You start removing your hierophant rune..."
+ if(istype(I, /obj/item/weapon/hierophant_club))
+ var/obj/item/weapon/hierophant_club/H = I
+ if(H.timer > world.time)
+ return
+ if(H.beacon == src)
+ user << "You start removing your hierophant beacon..."
H.timer = world.time + 51
+ addtimer(H, "prepare_icon_update", 0)
if(do_after(user, 50, target = src))
playsound(src,'sound/magic/Blind.ogg', 200, 1, -4)
PoolOrNew(/obj/effect/overlay/temp/hierophant/telegraph/teleport, list(get_turf(src), user))
- user << "You touch the rune with the staff, dispelling it!"
- H.rune = null
+ user << "You collect [src], reattaching it to the club!"
+ H.beacon = null
user.update_action_buttons_icon()
qdel(src)
else
H.timer = world.time
+ addtimer(H, "prepare_icon_update", 0)
else
- user << "You touch the rune with the staff, but nothing happens."
-
+ user << "You touch the beacon with the club, but nothing happens."
else
- ..()
+ return ..()
/obj/item/device/gps/internal/hierophant
icon_state = null
@@ -580,21 +651,4 @@ Difficulty: Hard
desc = "Heed its words."
invisibility = 100
-/turf/open/indestructible/hierophant
- icon_state = "hierophant1"
- initial_gas_mix = "o2=14;n2=23;TEMP=300"
- desc = "A floor with a square pattern. It's faintly cool to the touch."
-
-/turf/open/indestructible/hierophant/New()
- ..()
- if(prob(50))
- icon_state = "hierophant2"
-
-/turf/closed/indestructible/riveted/hierophant
- name = "wall"
- desc = "A wall made out of smooth, cold stone."
- icon = 'icons/turf/walls/hierophant_wall.dmi'
- icon_state = "hierophant"
- smooth = SMOOTH_TRUE
-
#undef MEDAL_PREFIX
\ No newline at end of file
diff --git a/icons/effects/96x96.dmi b/icons/effects/96x96.dmi
index 01a40107540..b89f734fe32 100644
Binary files a/icons/effects/96x96.dmi and b/icons/effects/96x96.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index ed8218b6958..3f3afd64fab 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi
index aa6d1473444..9aa9735d550 100644
Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ
diff --git a/icons/mob/inhands/64x64_lefthand.dmi b/icons/mob/inhands/64x64_lefthand.dmi
new file mode 100644
index 00000000000..434756a784a
Binary files /dev/null and b/icons/mob/inhands/64x64_lefthand.dmi differ
diff --git a/icons/mob/inhands/64x64_righthand.dmi b/icons/mob/inhands/64x64_righthand.dmi
new file mode 100644
index 00000000000..d148fbdec2d
Binary files /dev/null and b/icons/mob/inhands/64x64_righthand.dmi differ
diff --git a/icons/mob/lavaland/hierophant.dmi b/icons/mob/lavaland/hierophant.dmi
index d05bc3bd62d..a1013ea0006 100644
Binary files a/icons/mob/lavaland/hierophant.dmi and b/icons/mob/lavaland/hierophant.dmi differ
diff --git a/icons/mob/lavaland/hierophant_new.dmi b/icons/mob/lavaland/hierophant_new.dmi
new file mode 100644
index 00000000000..84348700324
Binary files /dev/null and b/icons/mob/lavaland/hierophant_new.dmi differ
diff --git a/icons/obj/guns/magic.dmi b/icons/obj/guns/magic.dmi
index 05c8aa7794f..45e7b49f4e1 100644
Binary files a/icons/obj/guns/magic.dmi and b/icons/obj/guns/magic.dmi differ
diff --git a/icons/obj/lavaland/artefacts.dmi b/icons/obj/lavaland/artefacts.dmi
index 45927256e35..d19bc538563 100644
Binary files a/icons/obj/lavaland/artefacts.dmi and b/icons/obj/lavaland/artefacts.dmi differ
diff --git a/icons/turf/floors/hierophant_floor.dmi b/icons/turf/floors/hierophant_floor.dmi
new file mode 100644
index 00000000000..365f887bfa4
Binary files /dev/null and b/icons/turf/floors/hierophant_floor.dmi differ
diff --git a/icons/turf/walls/hierophant_wall.dmi b/icons/turf/walls/hierophant_wall.dmi
index 8482970eaf0..8963db4e996 100644
Binary files a/icons/turf/walls/hierophant_wall.dmi and b/icons/turf/walls/hierophant_wall.dmi differ
diff --git a/icons/turf/walls/hierophant_wall_temp.dmi b/icons/turf/walls/hierophant_wall_temp.dmi
new file mode 100644
index 00000000000..9f0d4b8d23c
Binary files /dev/null and b/icons/turf/walls/hierophant_wall_temp.dmi differ
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 9b7ecb9d393..65d1f55cb73 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -71,8 +71,8 @@ h1.alert, h2.alert {color: #000000;}
.cultlarge {color: #960000; font-weight: bold; font-size: 3;}
.narsie {color: #960000; font-weight: bold; font-size: 15;}
.colossus {color: #7F282A; font-size: 5;}
-.hierophant {color: #660099; font-weight: bold; font-size: 4;}
-.hierophant_warning {color: #660099; font-weight: bold; font-style: italic;}
+.hierophant {color: #660099; font-weight: bold; font-style: italic;}
+.hierophant_warning {color: #660099; font-style: italic;}
.purple {color: #5e2d79;}
.holoparasite {color: #35333a;}
.holoparasitebold {color: #35333a; font-weight: bold;}