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  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>
@@ -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" = (
|
||||
|
||||
@@ -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{
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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
|
||||
},
|
||||
|
||||
@@ -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" = (
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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."))
|
||||
|
||||
@@ -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?"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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')
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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'
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
|
Before Width: | Height: | Size: 131 KiB After Width: | Height: | Size: 132 KiB |
|
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 100 KiB After Width: | Height: | Size: 105 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 49 KiB |
|
Before Width: | Height: | Size: 49 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 9.3 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 134 KiB After Width: | Height: | Size: 134 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 36 KiB |
|
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}
|
||||