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;}