Re-adds the Dragoon tomb ruin & Spear (#90781)

It was removed in https://github.com/tgstation/tgstation/pull/27799
because the spear was broken and the Flans' AI sucked with not-great
sprites and was all just one big reference. Original addition:
https://github.com/tgstation/tgstation/pull/22270

This re-adds it, updates the map (now using airless turfs) with extra
ambiance, using ash whelps (lavaland variation of ice whelps) instead of
Flans, re-adds the spear, and adds armor as well this time around.

The spear gives you a jump ability to crash down upon a player below
you, rather than teleporting to wherever you throw the spear at. You
can't attack while mid-air, you can go through tables but not
walls/doors, and you also can't un-dualwield or drop the spear mid-jump.
Landing on a mob deals double damage to them (36 to unarmored people),
while landing on objects deals 150 damage to them (taken from savannah's
jump ability, which was in turn taken from hulk's punching)
It's also got some extra throw force (24 compared to default spear's 20)

The armor has basic security-level armor but covers your whole body.
Does not include space protection, and can be worn by Ian.

Video demonstration

https://github.com/user-attachments/assets/a77c3a0d-17d2-4e8d-88b6-cdbca8b1f2c3

New sprites demonstration

https://github.com/user-attachments/assets/0e465351-5484-406f-8adc-ffa1ac180daf

Armor demonstration

https://github.com/user-attachments/assets/abdfcac6-65bf-443c-bde2-27d157ee3a80

Map

![436285657-104a555f-60dc-46f0-8283-a92db2ca5352](https://github.com/user-attachments/assets/a1677c9a-7157-4562-9703-5ad44c923e8d)

With the changes in https://github.com/tgstation/tgstation/pull/90771 I
had to mess with ash whelp abilities a bit, I decided to make them use
cold fire instead of hardcoding blue color on top of the fire sprites,
and it now acts accordingly too

https://github.com/user-attachments/assets/cfca0d70-d13d-4c73-996d-2d4a7519866d

The jump was taken from Savannah Ivanov, and Goof's bunny jumping.

This Re-implements a old spear that got removed for its buggyness/bad
mapping and on the authors request as well not wanting to deal with it.

Re-introduces the SkyBulge as a space ruin, referencing Dragoons from
Final Fantasy. this just like any normal spear, but using the savannah
jump mechanic, this allows you to close distances with the spear
avoiding ranged projectiles in the jump, and if you directly land on
your target you will do double the damage.

🆑 Ezel/Improvedname, Toriate, JohnFulpWillard
add: Re-added the Dragoon Tomb lair, now has a Skybulge spear and
Drachen armor.
balance: Ice whelps now spit out cold fire.
/🆑

---------

Co-authored-by: Jacquerel <hnevard@gmail.com>
This commit is contained in:
John Willard
2025-06-05 18:50:51 -04:00
committed by Roxy
co-authored by Jacquerel
parent aa7a2314a5
commit b97f3779b2
50 changed files with 2952 additions and 64 deletions
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -58163,7 +58163,7 @@
/turf/open/floor/grass,
/area/station/service/chapel)
"tts" = (
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/obj/item/book/bible,
/obj/effect/landmark/start/hangover,
/obj/item/flashlight/lantern/on,
@@ -11245,7 +11245,7 @@
},
/area/station/hallway/secondary/service)
"drE" = (
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/obj/structure/noticeboard/directional/north,
/turf/open/floor/iron/chapel{
dir = 4
@@ -94565,7 +94565,7 @@
/area/station/science/xenobiology)
"xDd" = (
/obj/item/book/bible,
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/turf/open/floor/iron/grimy,
/area/station/service/chapel)
"xDf" = (
@@ -2636,7 +2636,7 @@
/obj/machinery/atmospherics/pipe/smart/manifold4w/supply/hidden/layer4,
/obj/machinery/atmospherics/pipe/smart/manifold4w/scrubbers/hidden/layer2,
/obj/item/book/bible,
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
"aLz" = (
+1 -1
View File
@@ -34758,7 +34758,7 @@
/area/station/maintenance/fore)
"msl" = (
/obj/item/book/bible,
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
"msu" = (
@@ -98938,7 +98938,7 @@
/turf/open/floor/iron/dark,
/area/station/maintenance/aft/greater)
"oJn" = (
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/obj/effect/turf_decal/siding/thinplating_new/dark,
/obj/item/book/bible,
/obj/effect/turf_decal/siding/thinplating_new/dark{
+1 -1
View File
@@ -39617,7 +39617,7 @@
/area/station/commons/vacant_room)
"mVo" = (
/obj/item/book/bible,
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/turf/open/floor/iron/dark,
/area/station/service/chapel)
"mVp" = (
+1 -1
View File
@@ -21516,7 +21516,7 @@
/turf/open/floor/iron/dark,
/area/station/security/execution/education)
"hzC" = (
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/obj/effect/turf_decal/siding/dark{
dir = 8
},
+1 -1
View File
@@ -1195,7 +1195,7 @@
"sv" = (
/obj/item/book/bible,
/obj/structure/cable,
/obj/structure/altar_of_gods,
/obj/structure/altar/of_gods,
/turf/open/floor/carpet,
/area/shuttle/escape)
"sz" = (
+3
View File
@@ -38,6 +38,9 @@
#define COOLDOWN_MECHA_MISSILE_STRIKE "mecha_missile_strike"
#define COOLDOWN_MECHA_CABIN_SEAL "mecha_cabin_seal"
//skybulge cooldown
#define COOLDOWN_SKYBULGE_JUMP "skybulge_jump"
//car cooldowns
#define COOLDOWN_CAR_HONK "car_honk"
+2
View File
@@ -1,4 +1,6 @@
/// Temperature of drake fire hotspots
#define DRAKE_FIRE_TEMP 500
/// Temperature of ash whelp fire hostpos
#define ICE_WHELP_FIRE_TEMP TCMB
/// Volume of drake fire hotspots
#define DRAKE_FIRE_EXPOSURE 50
+6 -2
View File
@@ -53,7 +53,7 @@
/// Finally spawn the actual fire, spawns the fire hotspot in case you want to recolour it or something
/datum/action/cooldown/mob_cooldown/fire_breath/proc/burn_turf(turf/fire_turf, list/hit_list, mob/living/source)
var/obj/effect/hotspot/fire_hotspot = new /obj/effect/hotspot(fire_turf)
var/obj/effect/hotspot/fire_hotspot = new /obj/effect/hotspot(fire_turf, fire_volume, fire_temperature)
fire_turf.hotspot_expose(fire_temperature, fire_volume, TRUE)
for(var/mob/living/barbecued in fire_turf.contents)
@@ -72,7 +72,11 @@
/// Do something unpleasant to someone we set on fire
/datum/action/cooldown/mob_cooldown/fire_breath/proc/on_burn_mob(mob/living/barbecued, mob/living/source)
to_chat(barbecued, span_userdanger("You are burned by [source]'s fire breath!"))
if(fire_temperature <= TCMB)
barbecued.apply_status_effect(/datum/status_effect/ice_block_talisman, 2 SECONDS)
to_chat(barbecued, span_userdanger("You're frozen solid by [source]'s icy breath!"))
else
to_chat(barbecued, span_userdanger("You are burned by [source]'s fire breath!"))
barbecued.adjustFireLoss(fire_damage)
/// Shoot three lines of fire in a sort of fork pattern approximating a cone
+9 -9
View File
@@ -166,16 +166,16 @@
/datum/component/two_handed/proc/on_equip(datum/source, mob/user, slot)
SIGNAL_HANDLER
if(require_twohands && (slot & ITEM_SLOT_HANDS)) // force equip the item
if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS) && (slot & ITEM_SLOT_HANDS)) // force equip the item
wield(user)
if(!user.is_holding(parent) && wielded && !require_twohands)
if(!user.is_holding(parent) && wielded && !HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS))
unwield(user)
/// Triggered on drop of item containing the component
/datum/component/two_handed/proc/on_drop(datum/source, mob/user)
SIGNAL_HANDLER
if(require_twohands) //Don't let the item fall to the ground and cause bugs if it's actually being equipped on another slot.
if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS)) //Don't let the item fall to the ground and cause bugs if it's actually being equipped on another slot.
unwield(user, FALSE, FALSE)
if(wielded)
unwield(user)
@@ -192,7 +192,7 @@
/datum/component/two_handed/proc/on_attack_self(datum/source, mob/user)
SIGNAL_HANDLER
if(!require_twohands)
if(!HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS))
if(wielded)
unwield(user)
else if(user.is_holding(parent))
@@ -210,21 +210,21 @@
var/atom/atom_parent = parent
if(HAS_TRAIT(user, TRAIT_NO_TWOHANDING))
if(require_twohands)
if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS))
atom_parent.balloon_alert(user, "can't wield!")
user.dropItemToGround(parent, force = TRUE)
else
atom_parent.balloon_alert(user, "can't wield with both hands!")
return COMPONENT_EQUIPPED_FAILED
if(user.get_inactive_held_item())
if(require_twohands)
if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS))
atom_parent.balloon_alert(user, "can't carry in one hand!")
user.dropItemToGround(parent, force = TRUE)
else
atom_parent.balloon_alert(user, "holding something in other hand!")
return COMPONENT_EQUIPPED_FAILED
if(user.usable_hands < 2)
if(require_twohands)
if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS))
user.dropItemToGround(parent, force = TRUE)
atom_parent.balloon_alert(user, "not enough hands!")
return COMPONENT_EQUIPPED_FAILED
@@ -313,14 +313,14 @@
user.update_held_items()
// if the item requires two handed drop the item on unwield
if(require_twohands && can_drop)
if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS) && can_drop)
user.dropItemToGround(parent, force=TRUE)
// Show message if requested
if(show_message)
if(iscyborg(user))
to_chat(user, span_notice("You free up your module."))
else if(require_twohands)
else if(HAS_TRAIT(parent, TRAIT_NEEDS_TWO_HANDS))
to_chat(user, span_notice("You drop [parent]."))
else
to_chat(user, span_notice("You are now carrying [parent] with one hand."))
+4
View File
@@ -90,6 +90,10 @@
name = "Captain %REAL_NAME%"
desc = "Probably better than the last captain."
/datum/dog_fashion/head/dragoon
name = "Dragoon %REAL_NAME%"
desc = "The last living Dragon Knight."
/datum/dog_fashion/head/kitty
name = "Runtime"
desc = "They're a cute little kitty-cat! ... wait ... what the hell?"
+8
View File
@@ -553,6 +553,14 @@ BUBBERSTATION REMOVAL END */
name = "Space-Ruin Space Sector 13 Local Channel"
description = "A local TV station serving areas surrounding Space Sector 13, shows including but not limited to: talk shows, operas, stage plays and more!"
/datum/map_template/ruin/space/dragoon
id = "dragoon"
suffix = "dragoontomb.dmm"
name = "Sky Bulge Tomb"
description = "A tomb of a dice-loving dragoon in space. \
Turns out he got too good and jumped too high. \
Contains the Sky Bulge, which allows the user to jump onto targets."
/datum/map_template/ruin/space/experimental_cloning
id = "cloning_facility"
suffix = "cloning_facility.dmm"
@@ -692,6 +692,14 @@
trash_type = /obj/effect/decal/cleanable/ash
can_be_extinguished = TRUE
/obj/item/flashlight/flare/torch/everburning
name = "everburning torch"
desc = "A torch which burns continuously, even in the vacuum of space"
can_be_extinguished = FALSE
fuel = INFINITY
randomize_fuel = FALSE
start_on = TRUE
/obj/item/flashlight/lantern
name = "lantern"
icon_state = "lantern"
+138
View File
@@ -284,3 +284,141 @@
/datum/element/slapcrafting,\
slapcraft_recipes = slapcraft_recipe_list,\
)
/**
* Skybulge
*
* Gives a special ability that allows you to enter the skies an drop down upon a target.
* Other than that ability, is a default spear with extra throw force, but no embedding.
*/
/obj/item/spear/skybulge
name = "\improper Sky Bulge"
desc = "A legendary stick with a very pointy tip. Takes you to the skies!"
icon_state = "dragoonpole0"
icon_prefix = "dragoonpole"
attack_verb_continuous = list("attacks", "pokes", "jabs", "tears", "gores", "lances")
attack_verb_simple = list("attack", "poke", "jab", "tear", "gore", "lance")
throwforce = 24
embed_type = null //no embedding
custom_materials = list(
/datum/material/diamond = HALF_SHEET_MATERIAL_AMOUNT,
/datum/material/alloy/plastitaniumglass = SHEET_MATERIAL_AMOUNT,
)
action_slots = ITEM_SLOT_HANDS
actions_types = list(/datum/action/item_action/skybulge)
///The action button the spear gives, usable once a minute.
/datum/action/item_action/skybulge
name = "Dragoon Strike"
desc = "Jump up into the skies and fall down upon your opponents to deal double damage."
check_flags = parent_type::check_flags | AB_CHECK_IMMOBILE | AB_CHECK_PHASED
///Ref to the addtimer we have between jumping up and falling down, used to cancel early if you're incapacitated mid-jump.
var/jump_timer
///Cooldown time between jumps.
var/jump_cooldown_time = 1 MINUTES
/**
* boolean we set every time we jump, to know if we should take away the passflags we give,
* so we don't give/take when they have it from other sources (since we don't have traits, we have
* no way to tell which pass flags they get from what source.)
*/
var/gave_pass_flags = FALSE
/datum/action/item_action/skybulge/do_effect(trigger_flags)
if(!HAS_TRAIT(target, TRAIT_WIELDED))
owner.balloon_alert(owner, "not dual-wielded!")
return
var/time_left = S_TIMER_COOLDOWN_TIMELEFT(target, COOLDOWN_SKYBULGE_JUMP)
if(time_left)
owner.balloon_alert(owner, "[FLOOR(time_left * 0.1, 0.1)]s cooldown!")
return
//do after shows the progress bar as feedback, so nothing here.
if(LAZYACCESS(owner.do_afters, target))
return
owner.balloon_alert(owner, "charging up...")
ADD_TRAIT(target, TRAIT_NEEDS_TWO_HANDS, ACTION_TRAIT)
INVOKE_ASYNC(src, PROC_REF(jump_up))
///Sends the owner up in the air and calls them back down, calling land() for aftereffects.
/datum/action/item_action/skybulge/proc/jump_up()
if(!do_after(owner, 2 SECONDS, target = owner, timed_action_flags = IGNORE_USER_LOC_CHANGE))
REMOVE_TRAIT(target, TRAIT_NEEDS_TWO_HANDS, ACTION_TRAIT)
return
playsound(owner, 'sound/effects/footstep/heavy1.ogg', 50, 1)
S_TIMER_COOLDOWN_START(target, COOLDOWN_SKYBULGE_JUMP, jump_cooldown_time)
new /obj/effect/temp_visual/telegraphing/exclamation/following(get_turf(owner), 2.5 SECONDS, owner)
RegisterSignal(target, COMSIG_ITEM_ATTACK, PROC_REF(on_attack_during_jump))
ADD_TRAIT(target, TRAIT_NODROP, ACTION_TRAIT)
owner.add_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_MOVE_FLYING), ACTION_TRAIT)
if(owner.pass_flags & PASSTABLE)
gave_pass_flags = FALSE
else
gave_pass_flags = TRUE
owner.pass_flags |= PASSTABLE
owner.set_density(FALSE)
owner.layer = ABOVE_ALL_MOB_LAYER
animate(owner, pixel_y = owner.pixel_y + 60, time = (2 SECONDS), easing = CIRCULAR_EASING|EASE_OUT)
animate(pixel_y = initial(owner.pixel_y), time = (1 SECONDS), easing = CIRCULAR_EASING|EASE_IN)
jump_timer = addtimer(CALLBACK(src, PROC_REF(land), /*do_effects = */TRUE, /*mob_override = */owner), 3 SECONDS, TIMER_STOPPABLE)
/datum/action/item_action/skybulge/update_status_on_signal(datum/source, new_stat, old_stat)
if(!isnull(jump_timer) && !IsAvailable())
INVOKE_ASYNC(src, PROC_REF(land), /*do_effects = */FALSE, /*mob_override = */source)
deltimer(jump_timer)
return ..()
/**
* ## land()
*
* Called by jump_up, this is the post-jump effects, damaging objects and mobs it lands on.
* Args:
* do_effects - Whether we'll do the attacking effects of the land (damaging mobs & sound),
* we set this to false if we were forced out of the jump, they lost their ability to do the hit.
* mob_doing_effects - This is who we use for aftereffects, passing the mob using the ability, with owner as fallback.
* ourselves.
*/
/datum/action/item_action/skybulge/proc/land(do_effects = TRUE, mob/living/mob_doing_effects)
if(!mob_doing_effects)
mob_doing_effects = owner
var/turf/landed_on = get_turf(mob_doing_effects)
UnregisterSignal(target, COMSIG_ITEM_ATTACK)
target.remove_traits(list(TRAIT_NEEDS_TWO_HANDS, TRAIT_NODROP), ACTION_TRAIT)
mob_doing_effects.remove_traits(list(TRAIT_SILENT_FOOTSTEPS, TRAIT_MOVE_FLYING), ACTION_TRAIT)
if(gave_pass_flags)
mob_doing_effects.pass_flags &= ~PASSTABLE
mob_doing_effects.set_density(TRUE)
mob_doing_effects.layer = initial(mob_doing_effects.layer)
SET_PLANE(mob_doing_effects, initial(mob_doing_effects.plane), landed_on)
if(!do_effects)
return
playsound(mob_doing_effects, 'sound/effects/explosion/explosion1.ogg', 40, 1)
var/obj/item/skybulge_item = target
for(var/atom/thing as anything in landed_on)
if(thing == mob_doing_effects)
continue
if(isobj(thing))
thing.take_damage(150)
continue
if(isliving(thing))
skybulge_item.melee_attack_chain(owner, thing, list("[FORCE_MULTIPLIER]" = 2))
skybulge_item.attack(thing, owner)
var/mob/living/living_target = thing
living_target.SetKnockdown(1 SECONDS)
///Called when the person holding us is trying to attack something mid-jump.
///You're technically in mid-air, so block any attempts at getting extra hits in.
/datum/action/item_action/skybulge/proc/on_attack_during_jump(atom/source, mob/living/target_mob, mob/living/user, params)
SIGNAL_HANDLER
return COMPONENT_CANCEL_ATTACK_CHAIN
+10
View File
@@ -677,6 +677,11 @@
baseturfs = /turf/open/misc/asteroid/basalt
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
/turf/closed/mineral/volcanic/airless
turf_type = /turf/open/misc/asteroid/basalt/airless
baseturfs = /turf/open/misc/asteroid/basalt/airless
initial_gas_mix = AIRLESS_ATMOS
/turf/closed/mineral/volcanic/lava_land_surface
turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface
baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface
@@ -872,6 +877,11 @@
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = TRUE
/turf/closed/mineral/gibtonite/volcanic/airless
turf_type = /turf/open/misc/asteroid/basalt
baseturfs = /turf/open/misc/asteroid/basalt
initial_gas_mix = AIRLESS_ATMOS
/turf/closed/mineral/gibtonite/ice
MAP_SWITCH(, icon_state = "icerock_Gibtonite_inactive")
icon = MAP_SWITCH('icons/turf/walls/icerock_wall.dmi', 'icons/turf/mining.dmi')
+13
View File
@@ -126,3 +126,16 @@
/turf/closed/wall/material/meat/airless
baseturfs = /turf/open/floor/material/meat/airless
/turf/closed/wall/tomb
name = "tomb wall"
desc = "The carved surface of a dusty tomb. It's not clear who built this."
icon = 'icons/turf/walls/boss_wall.dmi'
icon_state = "boss_wall-0"
base_icon_state = "boss_wall"
smoothing_flags = SMOOTH_BITMASK
smoothing_groups = SMOOTH_GROUP_CLOSED_TURFS + SMOOTH_GROUP_BOSS_WALLS
canSmoothWith = SMOOTH_GROUP_BOSS_WALLS
turf_flags = NO_RUST
explosive_resistance = 50
baseturfs = /turf/open/misc/asteroid/basalt/airless
+33
View File
@@ -54,6 +54,39 @@
new custom_material.sheet_type(drop_location(), amount)
//////////////////////////////////////STATUES/////////////////////////////////////////////////////////////
/obj/structure/statue/drake
name = "drake statue"
desc = "Statue of a lesser drake. Its carved eye sockets glow slightly."
icon_state = "drake"
anchored = TRUE
/obj/structure/statue/drake/Initialize(mapload)
. = ..()
if (prob(25))
icon_state = "drake_headless"
desc = "Statue of a lesser drake. Time has not been kind."
update_appearance(UPDATE_OVERLAYS)
/obj/structure/statue/drake/update_overlays()
. = ..()
if (icon_state == "drake")
. += emissive_appearance(icon, "drake_emissive", src)
/obj/structure/statue/dragonman
name = "dragonman statue"
desc = "Statue of a draconic humanoid warrior. Its glittering eyes seem to follow you around the room."
icon_state = "dragonman"
anchored = TRUE
/obj/structure/statue/dragonman/Initialize(mapload)
. = ..()
update_appearance(UPDATE_OVERLAYS)
/obj/structure/statue/dragonman/update_overlays()
. = ..()
. += emissive_appearance(icon, "dragonman_emissive", src)
////////////////////////uranium///////////////////////////////////
/obj/structure/statue/uranium
@@ -108,6 +108,8 @@
volume = starting_volume
if(!isnull(starting_temperature))
temperature = starting_temperature
if(temperature <= FREON_MAXIMUM_BURN_TEMPERATURE)
cold_fire = TRUE
var/turf/open/our_turf = loc
//on creation we check adjacent turfs for hot spot to start grouping, if surrounding do not have hot spots we create our own
@@ -147,6 +149,7 @@
// Remove just_spawned protection if no longer processing the parent cell
just_spawned = (our_turf.current_cycle < SSair.times_fired)
update_color()
/obj/effect/hotspot/set_smoothed_icon_state(new_junction)
+14
View File
@@ -751,3 +751,17 @@
fire = 20
acid = 40
wound = 10
/obj/item/clothing/head/helmet/dragoon
name = "drachen helmet"
desc = "A chainmail helmet with dragon scales attached to the skeleton, with ash-covered mythril plate reinforcement covering it."
icon_state = "dragoonhelm"
base_icon_state = "dragoonhelm"
inhand_icon_state = "dragoonhelm"
clothing_flags = SNUG_FIT
resistance_flags = FIRE_PROOF | ACID_PROOF
dog_fashion = /datum/dog_fashion/head/dragoon
sound_vary = TRUE
equip_sound = 'sound/items/handling/helmet/helmet_equip1.ogg'
pickup_sound = 'sound/items/handling/helmet/helmet_pickup1.ogg'
drop_sound = 'sound/items/handling/helmet/helmet_drop1.ogg'
+10
View File
@@ -884,3 +884,13 @@
fire = 20
acid = 40
wound = 10
/obj/item/clothing/suit/armor/dragoon
name = "drachen suit"
desc = "A chainmail suit with dragon scales attached to the skeleton, with ash-covered mythril plate reinforcement covering it."
icon_state = "dragoon"
inhand_icon_state = "dragoon"
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
resistance_flags = FIRE_PROOF | ACID_PROOF
allowed = list(/obj/item/spear/skybulge)
+1 -1
View File
@@ -199,7 +199,7 @@ GLOBAL_LIST_INIT(bibleitemstates, list(
balloon_alert(user, "unpacking bible...")
if(!do_after(user, 15 SECONDS, new_altar_area))
return
new /obj/structure/altar_of_gods(new_altar_area)
new /obj/structure/altar/of_gods(new_altar_area)
qdel(src)
/obj/item/book/bible/proc/bless(mob/living/blessed, mob/living/user)
@@ -58,6 +58,18 @@
src.duration = duration
return ..()
/obj/effect/temp_visual/telegraphing/exclamation/following/Initialize(mapload, duration, obj/following)
. = ..()
if(isnull(following))
return INITIALIZE_HINT_QDEL
glide_size = following.glide_size
RegisterSignal(following, COMSIG_MOVABLE_MOVED, PROC_REF(follow))
///called when the thing we're following moves
/obj/effect/temp_visual/telegraphing/exclamation/following/proc/follow(datum/source)
SIGNAL_HANDLER
forceMove(get_turf(source))
/obj/effect/temp_visual/telegraphing/exclamation/animated
alpha = 0
@@ -36,18 +36,16 @@
ai_controller = /datum/ai_controller/basic_controller/ice_whelp
///how much we will heal when cannibalizing a target
var/heal_on_cannibalize = 5
var/list/innate_actions = list(
/datum/action/cooldown/mob_cooldown/fire_breath/ice = BB_WHELP_STRAIGHTLINE_FIRE,
/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption = BB_WHELP_WIDESPREAD_FIRE,
)
/mob/living/basic/mining/ice_whelp/Initialize(mapload)
. = ..()
ADD_TRAIT(src, TRAIT_NO_GLIDE, INNATE_TRAIT)
AddElement(/datum/element/footstep, FOOTSTEP_MOB_HEAVY)
var/static/list/innate_actions = list(
/datum/action/cooldown/mob_cooldown/fire_breath/ice = BB_WHELP_STRAIGHTLINE_FIRE,
/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption = BB_WHELP_WIDESPREAD_FIRE,
)
grant_actions_by_list(innate_actions)
ai_controller.set_blackboard_key(BB_TARGETED_ACTION, ai_controller.blackboard[BB_WHELP_STRAIGHTLINE_FIRE])
@@ -90,3 +88,16 @@
return
target.gib(DROP_ALL_REMAINS)
adjustBruteLoss(-1 * heal_on_cannibalize)
///Ash whelp, the "lava" variant of ice whelps.
/mob/living/basic/mining/ice_whelp/ash
name = "ash whelp"
desc = "The offspring of an ash drake, weak in comparison but still terrifying."
icon = 'icons/mob/simple/lavaland/lavaland_monsters.dmi'
icon_state = "ash_whelp"
icon_living = "ash_whelp"
icon_dead = "ash_whelp_dead"
innate_actions = list(
/datum/action/cooldown/mob_cooldown/fire_breath = BB_WHELP_STRAIGHTLINE_FIRE,
/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption/fire = BB_WHELP_WIDESPREAD_FIRE,
)
@@ -8,6 +8,7 @@
fire_range = 7
fire_damage = 10
fire_delay = 0.85 DECISECONDS
fire_temperature = ICE_WHELP_FIRE_TEMP
/// Time to warn people about what we are doing
var/forecast_delay = 0.6 SECONDS
/// What turf are we aiming at?
@@ -44,16 +45,6 @@
fire_line(target_turf)
target_turf = null
/datum/action/cooldown/mob_cooldown/fire_breath/ice/burn_turf(turf/fire_turf, list/hit_list, atom/source)
var/obj/effect/hotspot/fire_hotspot = ..()
fire_hotspot.add_atom_colour(COLOR_BLUE_LIGHT, FIXED_COLOUR_PRIORITY) // You're blue now, that's my attack
return fire_hotspot
/datum/action/cooldown/mob_cooldown/fire_breath/ice/on_burn_mob(mob/living/barbecued, mob/living/source)
barbecued.apply_status_effect(/datum/status_effect/ice_block_talisman, 2 SECONDS)
to_chat(barbecued, span_userdanger("You're frozen solid by [source]'s icy breath!"))
barbecued.adjustFireLoss(fire_damage)
/// Breathe really cold fire in a plus shape, like bomberman
/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption
name = "Ice Eruption"
@@ -84,3 +75,8 @@
for (var/turf/open/kindling as anything in nearby_turfs["[i]"])
burn_turf(kindling, hit_list, owner)
sleep(fire_delay)
///Fire subtype for ash whelps
/datum/action/cooldown/mob_cooldown/fire_breath/ice/eruption/fire
name = "Eruption"
fire_temperature = /datum/action/cooldown/mob_cooldown/fire_breath::fire_temperature
@@ -413,7 +413,7 @@
if(!get_bodypart(BODY_ZONE_HEAD)) //Decapitated
return
if(client && hud_used?.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1])
if(client && hud_used?.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1])
var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1]
inv.update_appearance()
@@ -481,7 +481,7 @@ There are several things that need to be remembered:
/mob/living/carbon/human/update_worn_head(update_obscured = TRUE)
remove_overlay(HEAD_LAYER)
if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_BACK) + 1])
if(client && hud_used && hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1])
var/atom/movable/screen/inventory/inv = hud_used.inv_slots[TOBITSHIFT(ITEM_SLOT_HEAD) + 1]
inv.update_icon()
@@ -14,6 +14,16 @@
spawned_human.gender = NEUTER
//don't need to set the human's body type (neuter)
/obj/effect/mob_spawn/corpse/human/charredskeleton/dragoon
outfit = /datum/outfit/dragoon_gear
/datum/outfit/dragoon_gear
name = "Dragoon"
suit = /obj/item/clothing/suit/armor/dragoon
head = /obj/item/clothing/head/helmet/dragoon
suit_store = /obj/item/spear/skybulge
//Legion infested mobs
/// Mob spawner used by Legion to spawn costumed bodies
@@ -70,7 +70,7 @@
///what the instrument will glow when playing
var/glow_color = COLOR_BLACK
/datum/religion_rites/song_tuner/invoke_effect(mob/living/user, obj/structure/altar_of_gods/altar)
/datum/religion_rites/song_tuner/invoke_effect(mob/living/user, obj/structure/altar/of_gods/altar)
. = ..()
to_chat(user, span_notice(song_invocation_message))
user.AddComponent(/datum/component/smooth_tunes, src, repeats_okay, particles_path, glow_color)
+35 -24
View File
@@ -1,6 +1,6 @@
/obj/structure/altar_of_gods
name = "\improper Altar of the Gods"
desc = "An altar which allows the head of the church to choose a sect of religious teachings as well as provide sacrifices to earn favor."
/obj/structure/altar
name = "\improper Altar"
desc = "A religious structure. You could lie on it if you wanted to."
icon = 'icons/obj/service/hand_of_god_structures.dmi'
icon_state = "convertaltar"
density = TRUE
@@ -9,29 +9,21 @@
pass_flags_self = PASSSTRUCTURE | PASSTABLE | LETPASSTHROW
can_buckle = TRUE
buckle_lying = 90 //we turn to you!
///Avoids having to check global everytime by referencing it locally.
var/datum/religion_sect/sect_to_altar
/// Do we have lit candles?
var/lit_candles = TRUE
/obj/structure/altar_of_gods/Initialize(mapload)
/obj/structure/altar/Initialize(mapload)
. = ..()
AddComponent(/datum/component/religious_tool, ALL, FALSE, CALLBACK(src, PROC_REF(reflect_sect_in_icons)))
reflect_sect_in_icons()
GLOB.chaplain_altars += src
AddElement(/datum/element/climbable)
AddElement(/datum/element/elevation, pixel_shift = 12)
update_appearance(UPDATE_OVERLAYS)
/obj/structure/altar_of_gods/Destroy()
GLOB.chaplain_altars -= src
return ..()
/obj/structure/altar/update_overlays()
. = ..()
if (lit_candles)
. += "convertaltarcandle"
/obj/structure/altar_of_gods/update_overlays()
var/list/new_overlays = ..()
if(GLOB.religious_sect)
return new_overlays
new_overlays += "convertaltarcandle"
return new_overlays
/obj/structure/altar_of_gods/attack_hand(mob/living/user, list/modifiers)
/obj/structure/altar/attack_hand(mob/living/user, list/modifiers)
if(!Adjacent(user) || !user.pulling)
return ..()
if(!isliving(user.pulling))
@@ -46,7 +38,24 @@
pushed_mob.forceMove(loc)
return ..()
/obj/structure/altar_of_gods/examine_more(mob/user)
/// This one actually has relevance to chaplains
/obj/structure/altar/of_gods
name = "\improper Altar of the Gods"
desc = "An altar which allows the head of the church to choose a sect of religious teachings as well as provide sacrifices to earn favor."
///Avoids having to check global everytime by referencing it locally.
var/datum/religion_sect/sect_to_altar
/obj/structure/altar/of_gods/Initialize(mapload)
. = ..()
AddComponent(/datum/component/religious_tool, ALL, FALSE, CALLBACK(src, PROC_REF(reflect_sect_in_icons)))
reflect_sect_in_icons()
GLOB.chaplain_altars += src
/obj/structure/altar/of_gods/Destroy()
GLOB.chaplain_altars -= src
return ..()
/obj/structure/altar/of_gods/examine_more(mob/user)
if(!isobserver(user))
return ..()
. = list(span_notice("<i>You examine [src] closer, and note the following...</i>"))
@@ -61,19 +70,21 @@
if(isAdminObserver(user) && chaplains)
. += list(span_notice("Chaplains: [chaplains]."))
/obj/structure/altar_of_gods/proc/reflect_sect_in_icons()
/obj/structure/altar/of_gods/proc/reflect_sect_in_icons()
if(isnull(GLOB.religious_sect))
lit_candles = FALSE
icon = initial(icon)
icon_state = initial(icon_state)
else
lit_candles = TRUE
sect_to_altar = GLOB.religious_sect
if(sect_to_altar.altar_icon)
icon = sect_to_altar.altar_icon
if(sect_to_altar.altar_icon_state)
icon_state = sect_to_altar.altar_icon_state
update_appearance() //Light the candles!
update_appearance(UPDATE_OVERLAYS) //Light the candles!
/obj/structure/altar_of_gods/proc/get_chaplains()
/obj/structure/altar/of_gods/proc/get_chaplains()
var/chaplain_string = ""
for(var/mob/living/carbon/human/potential_chap in GLOB.player_list)
if(potential_chap.key && is_chaplain_job(potential_chap.mind?.assigned_role))
+1
View File
@@ -87,6 +87,7 @@
#_maps/RandomRuins/SpaceRuins/waystation.dmm
#_maps/RandomRuins/SpaceRuins/whiteshipdock.dmm
#_maps/RandomRuins/SpaceRuins/whiteshipruin_box.dmm
#_maps/RandomRuins/SpaceRuins/dragoontomb.dmm
#_maps/RandomRuins/SpaceRuins/skyrat/drones_derelict.dmm
#modular_skyrat/modules/mapping/_maps/RandomRuins/SpaceRuins/forgottenship_skyrat.dmm
#modular_skyrat/modules/mapping/_maps/RandomRuins/SpaceRuins/shuttle8532.dmm
Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

After

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 42 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

@@ -0,0 +1 @@
/obj/structure/altar_of_gods : /obj/structure/altar/of_gods{@OLD}