mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-08-23 05:00:55 +01:00
[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:
co-authored by
Jacquerel
Tom
parent
8509edbc92
commit
075e5cfcde
@@ -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."
|
||||
@@ -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)
|
||||
. = ..()
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user