[MIRROR] Brimdemons & Lobstrosities drop (slightly) useful organs [MDB IGNORE] (#17289)

* Brimdemons & Lobstrosities drop (slightly) useful organs (#70546)

Goliaths, Legions, Watchers, and (as of recently) Bileworms all drop
something vaguely useful when they die.
Brimdemons and Lobstrosities do not. This PR aims to fix that, so that
there's at least some vague benefit to hunting them.

In this case it takes the form of organs you get when you butcher them,
similar to the regenerative core from Legions.
As they're similar to the regenerative core, I modified the regenerative
core to extend from a new common "monster core" typepath which these two
new organs also extend.
Like the regenerative core, both of these items do something when used
and something slightly different if you go to the effort of having
someone implant them into your body. They also decay over time, and you
can use stabilising serum to prevent this from happening.

https://user-images.githubusercontent.com/7483112/195967746-55a7d04d-224e-412d-aedc-3a0ec754db3d.mp4

The Rush Gland from the Lobstrosity lets you do a little impression of
their charging attack, making you run very fast for a handful of seconds
and ignoring slowdown effects. Unlike a lobstrosity you aren't actually
built to do this so if you run into a mob you will fall over, and if you
are doing this on the space station running into any dense object will
also make you fall over (it shouldn't make you _too_ much of a pain for
security to catch).
The idea here is that you use this to save time running back and forth
from the mining base.

The Brimdust Sac from the Brimdemon covers you in exploding dust. The
next three times you take Brute damage some of the dust will explode,
dealing damage equal to an unupgraded PKA shot to anything near you (but
not you).
If you do this in a space station not only is the damage proportionally
lower (still matching the PKA), but it _does_ effect you and also it
sets you on fire. You can remove the buff by showering it off.
The idea here is that you use this for minor revenge damage on enemies
whose attacks you don't manage to dodge.

https://user-images.githubusercontent.com/7483112/195967811-0b362ba9-2da0-42ac-bd55-3809473cbc74.mp4

If you implant the Rush Gland then you can use it once every 3 minutes
without consuming it, and the buff lasts very slightly longer. It will
automatically trigger itself if your health gets low, which might be
good (helps you escape a rough situation) or bad (didn't want to use it
yet).

https://user-images.githubusercontent.com/7483112/195967888-f63f7cbd-60cd-4309-8004-203afc5b2153.mp4

If you implant the Brimdust Sac then you can use it once every 3 minutes
to shake off cloud of dust which gives the buff to everyone nearby, if
you want to kit out your miner squad. The dust cloud also makes you
cough if you stand in it, and it's opaque. If you catch fire with this
organ inside you and aren't in mining atmosphere then it will explode
inside of your abdomen, which should probably be avoided, resultingly it
is very risky to use this on the space station.

* Brimdemons & Lobstrosities drop (slightly) useful organs

* update modular

Co-authored-by: Jacquerel <hnevard@gmail.com>
Co-authored-by: Tom <8881105+tf-4@users.noreply.github.com>
This commit is contained in:
SkyratBot
2022-11-04 15:11:05 -04:00
committed by GitHub
co-authored by Jacquerel Tom
parent 8509edbc92
commit 075e5cfcde
28 changed files with 634 additions and 186 deletions
@@ -99,7 +99,7 @@
/obj/item/flashlight,
/obj/item/knife/combat/bone,
/obj/item/knife/combat/survival,
/obj/item/organ/internal/regenerative_core/legion,
/obj/item/organ/internal/monster_core,
/obj/item/pickaxe,
/obj/item/spear,
/obj/item/tank/internals,
@@ -0,0 +1,183 @@
/**
* Gives you three stacks of Brimdust Coating, when you get hit by anything it will make a short ranged explosion.
* If this happens on the station it also sets you on fire.
* If implanted, you can shake off a cloud of brimdust to give this buff to people around you.area
* I you have this inside you on the station and you catch fire it explodes.
*/
/obj/item/organ/internal/monster_core/brimdust_sac
name = "brimdust sac"
desc = "A strange organ from a brimdemon. You can shake it out to coat yourself in explosive powder."
icon_state = "brim_sac"
icon_state_preserved = "brim_sac_stable"
icon_state_inert = "brim_sac_decayed"
desc_preserved = "A strange organ from a brimdemon. It is preserved, allowing you to coat yourself in its explosive contents at your leisure."
desc_inert = "A decayed brimdemon organ. There's nothing usable left inside it."
user_status = /datum/status_effect/stacking/brimdust_coating
actions_types = list(/datum/action/cooldown/monster_core_action/exhale_brimdust)
/obj/item/organ/internal/monster_core/brimdust_sac/Initialize(mapload)
. = ..()
AddComponent(/datum/component/explodable, light_impact_range = 1)
/obj/item/organ/internal/monster_core/brimdust_sac/on_life(delta_time, times_fired)
. = ..()
if(!owner.on_fire)
return
if(lavaland_equipment_pressure_check(get_turf(owner)))
return
explode_organ()
/// Your gunpowder organ blows up, uh oh
/obj/item/organ/internal/monster_core/brimdust_sac/proc/explode_organ()
owner.visible_message(span_boldwarning("[owner]'s chest bursts open as something inside ignites!"))
var/turf/origin_turf = get_turf(owner)
playsound(origin_turf, 'sound/effects/pop_expl.ogg', 100)
new /obj/effect/temp_visual/explosion/fast(origin_turf)
owner.Paralyze(5 SECONDS)
for(var/mob/living/target in range(1, origin_turf))
var/armor = target.run_armor_check(attack_flag = BOMB)
target.apply_damage(15, damagetype = BURN, blocked = armor, spread_damage = TRUE)
owner.apply_damage(15, damagetype = BRUTE, def_zone = BODY_ZONE_CHEST)
var/obj/item/bodypart/chest/torso = owner.get_bodypart(BODY_ZONE_CHEST)
torso.force_wound_upwards(/datum/wound/burn/severe)
owner.emote("scream")
qdel(src)
/// Make a cloud which applies brimdust to everyone nearby
/obj/item/organ/internal/monster_core/brimdust_sac/trigger_organ_action()
var/turf/origin_turf = get_turf(owner)
do_smoke(range = 2, holder = owner, location = origin_turf, smoke_type = /obj/effect/particle_effect/fluid/smoke/bad/brimdust)
/// Smoke which applies brimdust to you, and is also bad for your lungs
/obj/effect/particle_effect/fluid/smoke/bad/brimdust
lifetime = 5 SECONDS
color = "#383838"
/obj/effect/particle_effect/fluid/smoke/bad/brimdust/smoke_mob(mob/living/carbon/smoker)
if(!istype(smoker))
return FALSE
if(lifetime < 1)
return FALSE
if(smoker.smoke_delay)
return FALSE
smoker.apply_status_effect(/datum/status_effect/stacking/brimdust_coating)
return ..()
/**
* If you take brute damage with this buff, hurt and push everyone next to you.
* If you catch fire and or on the space station, detonate all remaining stacks in a way which hurts you.
* Washes off if you get wet.
*/
/datum/status_effect/stacking/brimdust_coating
id = "brimdust_coating"
stacks = 3
max_stacks = 3
tick_interval = -1
consumed_on_threshold = FALSE
alert_type = /atom/movable/screen/alert/status_effect/brimdust_coating
/// Damage to deal on explosion
var/blast_damage = 40
/// Damage reduction when not in a mining pressure area
var/pressure_modifier = 0.25
/// Time to wait between consuming stacks
var/delay_between_explosions = 5 SECONDS
/// Cooldown between explosions
COOLDOWN_DECLARE(explosion_cooldown)
/// Overlay effect added to mob when buff is present
var/mutable_appearance/dust_overlay
/atom/movable/screen/alert/status_effect/brimdust_coating
name = "Brimdust Coating"
desc = "You %STACKS% explosive dust, kinetic impacts will cause it to detonate! \
The explosion will not harm you as long as you're not under atmospheric pressure."
/atom/movable/screen/alert/status_effect/brimdust_coating/MouseEntered(location,control,params)
desc = initial(desc)
var/datum/status_effect/stacking/brimdust_coating/dust = attached_effect
var/dust_amount_string
switch(dust.stacks)
if (3)
dust_amount_string = "are heavily caked in"
if (2)
dust_amount_string = "have a generous coating of"
if (1)
dust_amount_string = "are lightly sprinkled with"
desc = replacetext(desc, "%STACKS%", dust_amount_string)
return ..()
/datum/status_effect/stacking/brimdust_coating/add_stacks(stacks_added)
. = ..()
if (stacks == 0)
return
linked_alert.icon_state = "brimdemon_[stacks]"
/datum/status_effect/stacking/brimdust_coating/on_creation(mob/living/new_owner, stacks_to_apply)
. = ..()
linked_alert?.icon_state = "brimdemon_[stacks]"
/datum/status_effect/stacking/brimdust_coating/on_apply()
. = ..()
dust_overlay = mutable_appearance('icons/effects/weather_effects.dmi', "ash_storm")
dust_overlay.blend_mode = BLEND_INSET_OVERLAY
owner.add_overlay(dust_overlay)
RegisterSignal(owner, COMSIG_COMPONENT_CLEAN_ACT, .proc/on_cleaned)
RegisterSignal(owner, COMSIG_MOB_APPLY_DAMAGE, .proc/on_take_damage)
/datum/status_effect/stacking/brimdust_coating/on_remove()
. = ..()
owner.cut_overlay(dust_overlay)
UnregisterSignal(owner, list(COMSIG_MOB_APPLY_DAMAGE, COMSIG_COMPONENT_CLEAN_ACT))
/// When you are cleaned, wash off the buff
/datum/status_effect/stacking/brimdust_coating/proc/on_cleaned()
SIGNAL_HANDLER
owner.remove_status_effect(/datum/status_effect/stacking/brimdust_coating)
return COMPONENT_CLEANED
/// When you take brute damage, schedule an explosion
/datum/status_effect/stacking/brimdust_coating/proc/on_take_damage(datum/source, damage, damagetype)
SIGNAL_HANDLER
if(damagetype != BRUTE)
return
if(!COOLDOWN_FINISHED(src, explosion_cooldown))
return
owner.visible_message(span_boldwarning("The brimstone dust surrounding [owner] ignites!"))
addtimer(CALLBACK(src, .proc/explode), 0.25 SECONDS)
COOLDOWN_START(src, explosion_cooldown, delay_between_explosions)
/**
* Hurts everything in a circle around you. Hurts less if in a pressurised environment.
*/
/datum/status_effect/stacking/brimdust_coating/proc/explode()
var/turf/origin_turf = get_turf(owner)
playsound(origin_turf, 'sound/effects/pop_expl.ogg', 50)
new /obj/effect/temp_visual/explosion/fast(origin_turf)
var/under_pressure = !lavaland_equipment_pressure_check(origin_turf)
var/damage_dealt = blast_damage
if(under_pressure)
damage_dealt *= pressure_modifier
var/list/possible_targets = range(1, origin_turf)
if(!under_pressure)
possible_targets -= owner
for(var/mob/living/target in possible_targets)
var/armor = target.run_armor_check(attack_flag = BOMB)
target.apply_damage(damage_dealt, damagetype = BURN, blocked = armor, spread_damage = TRUE)
if(under_pressure)
owner.adjust_fire_stacks(5)
owner.ignite_mob()
add_stacks(-1)
/// Action used by the rush gland
/datum/action/cooldown/monster_core_action/exhale_brimdust
name = "Exhale Brimdust"
desc = "Cough out a cloud of explosive brimdust to coat those nearby. \
This organ and the dust it produces are extremely flammable under atmospheric pressure."
button_icon_state = "brim_sac_stable"
cooldown_time = 3 MINUTES
@@ -0,0 +1,211 @@
/**
* Stabilising serum prevents monster organs from decaying before you can use them.
*/
/obj/item/mining_stabilizer
name = "stabilizing serum"
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "bottle19"
desc = "Inject certain types of monster organs with this stabilizer to prevent their rapid decay."
w_class = WEIGHT_CLASS_TINY
/obj/item/mining_stabilizer/afterattack(obj/item/organ/target_organ, mob/user, proximity)
. = ..()
if (!proximity)
return
var/obj/item/organ/internal/monster_core/target_core = target_organ
if (!istype(target_core, /obj/item/organ/internal/monster_core))
balloon_alert(user, "invalid target!")
return
if (!target_core.preserve())
balloon_alert(user, "organ decayed!")
return
balloon_alert(user, "organ stabilized")
qdel(src)
/**
* Useful organs which drop as loot from a mining creature.
* Generalised behaviour is that they will decay and become useless unless provided with serum.
* These should usually do something both when used in-hand, or when implanted into someone.
*/
/obj/item/organ/internal/monster_core
name = "monster core"
desc = "All that remains of a monster. This abstract item should not spawn. \
It will rapidly decay into uselessness. but don't worry because it's already useless."
icon = 'icons/obj/medical/organs/mining_organs.dmi'
icon_state = "hivelord_core"
actions_types = list(/datum/action/cooldown/monster_core_action)
visual = FALSE
item_flags = NOBLUDGEON
slot = ORGAN_SLOT_MONSTER_CORE
organ_flags = NONE
force = 0
/// Set to true if this organ has decayed into uselessness.
var/inert = FALSE
/// ID of the timer which will decay this organ
var/decay_timer
/// Time after which organ should become useless
var/time_to_decay = 4 MINUTES
/// Icon state to apply when preserved
var/icon_state_preserved
/// Description to use once organ has been preserved
var/desc_preserved
/// Icon state to apply when inert
var/icon_state_inert
/// Description to use once organ is inert
var/desc_inert
/// Status effect applied by this organ
var/datum/status_effect/user_status
/obj/item/organ/internal/monster_core/Initialize(mapload)
. = ..()
decay_timer = addtimer(CALLBACK(src, .proc/go_inert), time_to_decay, TIMER_STOPPABLE)
/obj/item/organ/internal/monster_core/Destroy(force, silent)
deltimer(decay_timer)
return ..()
/obj/item/organ/internal/monster_core/Insert(mob/living/carbon/target_carbon, special = 0, drop_if_replaced = TRUE)
. = ..()
if (!.)
return
if (inert)
to_chat(owner, span_notice("[src] breaks down as you try to insert it."))
qdel(src)
return FALSE
if (!decay_timer)
return TRUE
preserve(TRUE)
owner.visible_message(span_notice("[src] stabilizes as it's inserted."))
return TRUE
/obj/item/organ/internal/monster_core/Remove(mob/living/carbon/target_carbon, special = 0)
if (!inert && !special)
owner.visible_message(span_notice("[src] rapidly decays as it's removed."))
go_inert()
return ..()
/**
* Preserves the organ so that it will not decay.
* Returns true if successful.
* * Implanted - If true, organ has just been inserted into someone.
*/
/obj/item/organ/internal/monster_core/proc/preserve(implanted = FALSE)
if (inert)
return FALSE
deltimer(decay_timer)
decay_timer = null
update_appearance()
return TRUE
/**
* Decays the organ, it is now useless.
*/
/obj/item/organ/internal/monster_core/proc/go_inert()
if (inert)
return FALSE
inert = TRUE
deltimer(decay_timer)
decay_timer = null
name = "decayed [name]"
update_appearance()
return TRUE
/obj/item/organ/internal/monster_core/update_desc()
if (inert)
desc = desc_inert ? desc_inert : initial(desc)
return ..()
if (!decay_timer)
desc = desc_preserved ? desc_preserved : initial(desc)
return ..()
desc = initial(desc)
return ..()
/obj/item/organ/internal/monster_core/update_icon_state()
if (inert)
icon_state = icon_state_inert ? icon_state_inert : initial(icon_state)
return ..()
if (!decay_timer)
icon_state = icon_state_preserved ? icon_state_preserved : initial(icon_state)
return ..()
icon_state = initial(icon_state)
return ..()
/obj/item/organ/internal/monster_core/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if (!proximity_flag)
return
try_apply(target, user)
/obj/item/organ/internal/monster_core/attack_self(mob/user)
if (!user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE))
return
try_apply(user, user)
/**
* Tries to apply organ effect to target.
* Usually you should not need to override this, only apply_to.
* Arguments
* * target - Person you are applying this to.
* * user - Person who is doing the applying.
*/
/obj/item/organ/internal/monster_core/proc/try_apply(atom/target, mob/user)
if (!isliving(target))
balloon_alert(user, "invalid target!")
return
if (inert)
balloon_alert(user, "organ decayed!")
return
var/mob/living/live_target = target
if (live_target.stat == DEAD)
balloon_alert(user, "they're dead!")
return
balloon_alert(user, "applied organ")
apply_to(target, user)
/**
* Applies the effect of this organ to the target.
* Arguments
* * target - Person you are applying this to.
* * user - Person who is doing the applying.
*/
/obj/item/organ/internal/monster_core/proc/apply_to(mob/living/target, mob/user)
if (user_status)
target.apply_status_effect(user_status)
qdel(src)
/**
* Utility proc to find the associated monster organ action and trigger it.
* Call this instead of on_triggered_internal() if the action needs to trigger automatically, or the cooldown won't happen.
*/
/obj/item/organ/internal/monster_core/proc/trigger_organ_action()
var/datum/action/cooldown/monster_core_action/action = locate() in actions
action?.Trigger()
/**
* Called when activated while implanted inside someone.
* This could be via clicking the associated action button or through the above method.
*/
/obj/item/organ/internal/monster_core/proc/on_triggered_internal()
SHOULD_CALL_PARENT(FALSE)
CRASH("Someone forgot to make their organ do something when you implant it.")
/**
* Boilerplate to set the name and icon of the cooldown action.
* Makes it call 'ui_action_click' when the action is activated.
*/
/datum/action/cooldown/monster_core_action
check_flags = AB_CHECK_CONSCIOUS
icon_icon = 'icons/obj/medical/organs/mining_organs.dmi'
button_icon_state = "hivelord_core_2"
text_cooldown = FALSE //Looks really bad when you have minutes long cooldowns
/datum/action/cooldown/monster_core_action/Activate(trigger_flags)
. = ..()
if (!target)
return
var/obj/item/organ/internal/monster_core/organ = target
if (!istype(organ))
return
organ.trigger_organ_action()
@@ -0,0 +1,65 @@
/**
* On use in hand, heals you over time and removes injury movement debuffs. Also makes you a bit sad.
* On use when implanted, fully heals. Automatically fully heals if you would enter crit.
*/
/obj/item/organ/internal/monster_core/regenerative_core
name = "regenerative core"
desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness."
desc_preserved = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay."
desc_inert = "All that remains of a hivelord. It has decayed, and is completely useless."
user_status = /datum/status_effect/regenerative_core
actions_types = list(/datum/action/cooldown/monster_core_action/regenerative_core)
icon_state = "hivelord_core"
icon_state_inert = "hivelord_core_decayed"
/obj/item/organ/internal/monster_core/regenerative_core/preserve(implanted = FALSE)
if (implanted)
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "implanted"))
else
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "stabilizer"))
return ..()
/obj/item/organ/internal/monster_core/regenerative_core/go_inert()
. = .. ()
if (!.)
return
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert"))
/obj/item/organ/internal/monster_core/regenerative_core/on_life(delta_time, times_fired)
. = ..()
if (owner.health <= owner.crit_threshold)
trigger_organ_action()
/obj/item/organ/internal/monster_core/regenerative_core/trigger_organ_action()
owner.revive(full_heal = TRUE, admin_revive = FALSE)
qdel(src)
/// Log applications and apply moodlet.
/obj/item/organ/internal/monster_core/regenerative_core/apply_to(mob/living/target, mob/user)
target.add_mood_event("regenerative core", /datum/mood_event/healsbadman)
if (target != user)
target.visible_message(span_notice("[user] forces [target] to apply [src]... Black tendrils entangle and reinforce [target.p_them()]!"))
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other"))
else
to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?"))
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
return ..()
/// Different graphics/desc for the lavaland legion
/obj/item/organ/internal/monster_core/regenerative_core/legion
desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
desc_preserved = "The core has been stabilized, allowing you to use it to heal completely without danger of decay."
desc_inert = "The core has decayed, and is completely useless."
icon_state = "legion_core"
icon_state_inert = "legion_core_decayed"
icon_state_preserved = "legion_core_stable"
/// Action used by the regenerative core
/datum/action/cooldown/monster_core_action/regenerative_core
name = "Regenerate"
desc = "Fully regenerate your body, consuming your regenerative core in the process. \
This process will trigger automatically if you are badly wounded."
button_icon_state = "legion_core_stable"
check_flags = NONE
/datum/action/cooldown/monster_core_action/regenerative_core
@@ -0,0 +1,98 @@
/// Health under which implanted gland will automatically activate
#define HEALTH_DANGER_ZONE 30
/**
* On use in hand, makes you run really fast for 5 seconds and ignore injury movement decrease.
* On use when implanted, run for longer and ignore all negative movement. Automatically triggers if health is low (to escape).
*/
/obj/item/organ/internal/monster_core/rush_gland
name = "rush gland"
icon_state = "lobster_gland"
icon_state_preserved = "lobster_gland_stable"
icon_state_inert = "lobster_gland_decayed"
desc = "A lobstrosity's engorged adrenal gland. You can squeeze it to get a rush of energy on demand."
desc_preserved = "A lobstrosity's engorged adrenal gland. It is preserved, allowing you to use it for a burst of speed whenever you need it."
desc_inert = "A lobstrosity's adrenal gland. It is all shrivelled up."
user_status = /datum/status_effect/lobster_rush
actions_types = list(/datum/action/cooldown/monster_core_action/adrenal_boost)
/obj/item/organ/internal/monster_core/rush_gland/on_life(delta_time, times_fired)
. = ..()
if (owner.health <= HEALTH_DANGER_ZONE)
trigger_organ_action()
/obj/item/organ/internal/monster_core/rush_gland/trigger_organ_action()
owner.apply_status_effect(/datum/status_effect/lobster_rush/extended)
/**
* Status effect: Makes you run really fast and ignore speed penalties for a short duration.
* If you run into a wall indoors you will fall over and lose the buff.
* If you run into someone you both fall over.
*/
/datum/status_effect/lobster_rush
id = "lobster_rush"
duration = 3 SECONDS
alert_type = /atom/movable/screen/alert/status_effect/lobster_rush
var/spawned_last_move = FALSE
/atom/movable/screen/alert/status_effect/lobster_rush
name = "Lobster Rush"
desc = "Adrenaline is surging through you!"
icon_state = "lobster"
/datum/status_effect/lobster_rush/on_apply()
. = ..()
RegisterSignal(owner, COMSIG_MOVABLE_PRE_MOVE, .proc/on_move)
RegisterSignal(owner, COMSIG_MOVABLE_BUMP, .proc/on_bump)
ADD_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id))
owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush)
to_chat(owner, span_notice("You feel your blood pumping!"))
/datum/status_effect/lobster_rush/on_remove()
. = ..()
UnregisterSignal(owner, list(COMSIG_MOVABLE_PRE_MOVE, COMSIG_MOVABLE_BUMP))
REMOVE_TRAIT(owner, TRAIT_IGNORESLOWDOWN, TRAIT_STATUS_EFFECT(id))
owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lobster_rush)
to_chat(owner, span_notice("Your pulse returns to normal."))
/// Spawn an afterimage every other step, because every step was too many
/datum/status_effect/lobster_rush/proc/on_move()
SIGNAL_HANDLER
if (!spawned_last_move)
new /obj/effect/temp_visual/decoy/fading(owner.loc, owner)
spawned_last_move = !spawned_last_move
/datum/status_effect/lobster_rush/proc/on_bump(mob/living/source, atom/target)
SIGNAL_HANDLER
if (!target.density)
return
if (isliving(target))
source.visible_message(span_warning("[source] crashes into [target]!"))
smack_into(source)
smack_into(target)
qdel(src)
return
if (lavaland_equipment_pressure_check(get_turf(source)))
return
smack_into(source)
source.visible_message(span_warning("[source] crashes into [target]!"))
qdel(src)
/datum/status_effect/lobster_rush/proc/smack_into(mob/living/target)
target.Knockdown(5 SECONDS)
target.apply_damage(40, STAMINA)
target.apply_damage(20, BRUTE, spread_damage = TRUE)
/// You get a longer buff if you take the time to implant it in yourself
/datum/status_effect/lobster_rush/extended
duration = 5 SECONDS
/// Action used by the rush gland
/datum/action/cooldown/monster_core_action/adrenal_boost
name = "Adrenal Boost"
desc = "Pump your rush gland to give yourself a boost of speed. \
Impacts with objects can be dangerous under atmospheric pressure."
button_icon_state = "lobster_gland_stable"
cooldown_time = 3 MINUTES
#undef HEALTH_DANGER_ZONE
@@ -1,139 +0,0 @@
/*********************Hivelord stabilizer****************/
/obj/item/hivelordstabilizer
name = "stabilizing serum"
icon = 'icons/obj/medical/chemical.dmi'
icon_state = "bottle19"
desc = "Inject certain types of monster organs with this stabilizer to preserve their healing powers indefinitely."
w_class = WEIGHT_CLASS_TINY
/obj/item/hivelordstabilizer/afterattack(obj/item/organ/target_organ, mob/user, proximity)
. = ..()
if(!proximity)
return
var/obj/item/organ/internal/regenerative_core/target_core = target_organ
if(!istype(target_core, /obj/item/organ/internal/regenerative_core))
to_chat(user, span_warning("The stabilizer only works on certain types of monster organs, generally regenerative in nature."))
return
target_core.preserved()
to_chat(user, span_notice("You inject the [target_organ] with the stabilizer. It will no longer go inert."))
qdel(src)
/************************Hivelord core*******************/
/obj/item/organ/internal/regenerative_core
name = "regenerative core"
desc = "All that remains of a hivelord. It can be used to help keep your body going, but it will rapidly decay into uselessness."
icon_state = "roro core 2"
visual = FALSE
item_flags = NOBLUDGEON
slot = ORGAN_SLOT_REGENERATIVE_CORE
organ_flags = NONE
force = 0
actions_types = list(/datum/action/item_action/organ_action/use)
var/inert = 0
var/preserved = 0
/obj/item/organ/internal/regenerative_core/Initialize(mapload)
. = ..()
addtimer(CALLBACK(src, .proc/inert_check), 2400)
/obj/item/organ/internal/regenerative_core/proc/inert_check()
if(!preserved)
go_inert()
/obj/item/organ/internal/regenerative_core/proc/preserved(implanted = 0)
inert = FALSE
preserved = TRUE
update_appearance()
desc = "All that remains of a hivelord. It is preserved, allowing you to use it to heal completely without danger of decay."
if(implanted)
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "implanted"))
else
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "stabilizer"))
/obj/item/organ/internal/regenerative_core/proc/go_inert()
inert = TRUE
name = "decayed regenerative core"
desc = "All that remains of a hivelord. It has decayed, and is completely useless."
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "inert"))
update_appearance()
/obj/item/organ/internal/regenerative_core/ui_action_click()
if(inert)
to_chat(owner, span_notice("[src] breaks down as it tries to activate."))
else
owner.revive(full_heal = TRUE, admin_revive = FALSE)
qdel(src)
/obj/item/organ/internal/regenerative_core/on_life(delta_time, times_fired)
..()
if(owner.health <= owner.crit_threshold)
ui_action_click()
///Handles applying the core, logging and status/mood events.
/obj/item/organ/internal/regenerative_core/proc/applyto(atom/target, mob/user)
if(ishuman(target))
var/mob/living/carbon/human/target_human = target
if(inert)
to_chat(user, span_notice("[src] has decayed and can no longer be used to heal."))
return
else
if(target_human.stat == DEAD)
to_chat(user, span_notice("[src] is useless on the dead."))
return
if(target_human != user)
target_human.visible_message(span_notice("[user] forces [target_human] to apply [src]... Black tendrils entangle and reinforce [target_human.p_them()]!"))
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "other"))
else
to_chat(user, span_notice("You start to smear [src] on yourself. Disgusting tendrils hold you together and allow you to keep moving, but for how long?"))
SSblackbox.record_feedback("nested tally", "hivelord_core", 1, list("[type]", "used", "self"))
target_human.apply_status_effect(/datum/status_effect/regenerative_core)
target_human.add_mood_event("core", /datum/mood_event/healsbadman) //Now THIS is a miner buff (fixed - nerf)
qdel(src)
/obj/item/organ/internal/regenerative_core/afterattack(atom/target, mob/user, proximity_flag)
. = ..()
if(proximity_flag)
applyto(target, user)
/obj/item/organ/internal/regenerative_core/attack_self(mob/user)
if(user.canUseTopic(src, be_close = TRUE, no_dexterity = FALSE, no_tk = TRUE))
applyto(user, user)
/obj/item/organ/internal/regenerative_core/Insert(mob/living/carbon/target_carbon, special = 0, drop_if_replaced = TRUE)
. = ..()
if(!preserved && !inert)
preserved(TRUE)
owner.visible_message(span_notice("[src] stabilizes as it's inserted."))
/obj/item/organ/internal/regenerative_core/Remove(mob/living/carbon/target_carbon, special = 0)
if(!inert && !special)
owner.visible_message(span_notice("[src] rapidly decays as it's removed."))
go_inert()
return ..()
/*************************Legion core********************/
/obj/item/organ/internal/regenerative_core/legion
desc = "A strange rock that crackles with power. It can be used to heal completely, but it will rapidly decay into uselessness."
icon_state = "legion_soul"
/obj/item/organ/internal/regenerative_core/legion/Initialize(mapload)
. = ..()
update_appearance()
/obj/item/organ/internal/regenerative_core/update_icon_state()
if (inert)
icon_state = "legion_soul_inert"
if (preserved)
icon_state = "legion_soul"
if (!inert && !preserved)
icon_state = "legion_soul_unstable"
return ..()
/obj/item/organ/internal/regenerative_core/legion/go_inert()
..()
desc = "[src] has become inert. It has decayed, and is completely useless."
/obj/item/organ/internal/regenerative_core/legion/preserved(implanted = 0)
..()
desc = "[src] has been stabilized. It is preserved, allowing you to use it to heal completely without danger of decay."
+11 -1
View File
@@ -631,7 +631,17 @@
body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
resistance_flags = FIRE_PROOF
clothing_flags = THICKMATERIAL
allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/organ/internal/regenerative_core/legion, /obj/item/knife, /obj/item/kinetic_crusher, /obj/item/resonator, /obj/item/melee/cleaving_saw)
allowed = list(
/obj/item/flashlight,
/obj/item/tank/internals,
/obj/item/pickaxe,
/obj/item/spear,
/obj/item/organ/internal/monster_core,
/obj/item/knife,
/obj/item/kinetic_crusher,
/obj/item/resonator,
/obj/item/melee/cleaving_saw,
)
/obj/item/clothing/suit/hooded/berserker/Initialize(mapload)
. = ..()
+1 -1
View File
@@ -21,7 +21,7 @@
new /datum/data/mining_equipment("Soap", /obj/item/soap/nanotrasen, 200),
new /datum/data/mining_equipment("Laser Pointer", /obj/item/laser_pointer, 300),
new /datum/data/mining_equipment("Alien Toy", /obj/item/clothing/mask/facehugger/toy, 300),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/hivelordstabilizer, 400),
new /datum/data/mining_equipment("Stabilizing Serum", /obj/item/mining_stabilizer, 400),
new /datum/data/mining_equipment("Fulton Beacon", /obj/item/fulton_core, 400),
new /datum/data/mining_equipment("Shelter Capsule", /obj/item/survivalcapsule, 400),
new /datum/data/mining_equipment("Environment Proof Bodybag", /obj/item/bodybag/environmental, 500), //SKYRAT EDIT - ADDITION