Partially reverts #89619, where I partially reverted #87936; Puts back the mining and damage AOE damage on Mech PKA, but improves the standard modkits as well (#89993)

## About The Pull Request

In #89619, I removed the mech PKA's mining AOE and reduced the damaging
AOE to a fraction of the damage.

I have restored both of these aspects, but I have also applied this
change to the standard PKA's mining and damage AOE. I have also included
the mob biotype limitations as well.

AOE modkits take 10% capacity, now allowing miners to use them in more
setups. However, they conflict with one another. You can only have one
AOE mod until you can get the dual AOE mod from tendrils.

The AOE damage/mining effect is now a 2 tile effect rather than 1 tile
effect.

## Why It's Good For The Game

My intent in the previous PR was to bring mech PKA's down to standard
mining limitations. So, why not improve those standards for everyone
instead? The new state of mining expects you to be dealing with a lot of
mobs at once. Even small vents can, on occasion, decide to spit out
several goliaths back to back. That's a lot of mobs with a lot of
health.

Miners need AOE options more than ever. They have very little that are
actually meaningful, sadly. So my intent here is that this should be an
expectation for our miners to be seeking out and can fit into their
current, standard gameplay.

Certainly I've only felt like shit having to sacrifice a damage or
cooldown mod for an AOE mod, only to get a very minor amount of damage
splash for my efforts. That, and the radius doesn't usually impact most
mobs as they spawn and attack from awkward angles or distances from one
another where they are JUST out of reach of one another. Trying to use
the splash to hit multiple enemies is often not worth it compared to
just hitting one enemy at a time with a lot of damage.

So, let's just go with the standard of 'Good AOE is fundamentally needed
now' and worth from that premise.

## Changelog
🆑
balance: Mech PKA now once again mines turfs and does full damage on its
AOE explosion (still only hitting mining mobs).
balance: The standard PKA AOE mods are now by default 10% capacity. But
they cannot be used with one another.
balance: The standard PKA offensive AOE mod now does the PKA's full
damage in its AOE.
balance: Mining AOEs will affect everything within a 2 tile radius
around the point of impact, up from a 1 tile radius.
/🆑

---------

Co-authored-by: SmArtKar <44720187+SmArtKar@users.noreply.github.com>
This commit is contained in:
necromanceranne
2025-03-19 17:57:52 +11:00
committed by GitHub
parent edcd25dfd1
commit 8df0c5851d
12 changed files with 55 additions and 45 deletions

View File

@@ -341,7 +341,7 @@
add_action(ACTION_MELEED, 50 * (ismegafauna(attacked) ? 1.5 : 1)) add_action(ACTION_MELEED, 50 * (ismegafauna(attacked) ? 1.5 : 1))
/datum/component/style/proc/on_mine(datum/source, turf/closed/mineral/rock, give_exp) /datum/component/style/proc/on_mine(datum/source, turf/closed/mineral/rock, exp_multiplier)
SIGNAL_HANDLER SIGNAL_HANDLER
if(istype(rock, /turf/closed/mineral/gibtonite)) if(istype(rock, /turf/closed/mineral/gibtonite))
@@ -360,11 +360,11 @@
return return
if(rock.mineralType) if(rock.mineralType)
if(give_exp) if(exp_multiplier)
add_action(ACTION_ORE_MINED, 40) add_action(ACTION_ORE_MINED, 40)
rock.mineralAmt = ROUND_UP(rock.mineralAmt * (1 + ((rank * 0.1) - 0.3))) // You start out getting 20% less ore, but it goes up to 20% more at S-tier rock.mineralAmt = ROUND_UP(rock.mineralAmt * (1 + ((rank * 0.1) - 0.3))) // You start out getting 20% less ore, but it goes up to 20% more at S-tier
else if(give_exp) else if(exp_multiplier)
add_action(ACTION_ROCK_MINED, 25) add_action(ACTION_ROCK_MINED, 25)
/datum/component/style/proc/on_resonator_burst(datum/source, mob/creator, mob/living/hit_living) /datum/component/style/proc/on_resonator_burst(datum/source, mob/creator, mob/living/hit_living)

View File

@@ -230,7 +230,7 @@
if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // so it's too common if(istype(rock, /turf/open/misc/asteroid) && prob(35)) // so it's too common
new /obj/effect/decal/cleanable/rubble(rock) new /obj/effect/decal/cleanable/rubble(rock)
if(prob(100 - (i * 15))) if(prob(100 - (i * 15)))
rock.gets_drilled(user, FALSE) rock.gets_drilled(user)
if(prob(50)) if(prob(50))
new /obj/effect/decal/cleanable/rubble(rock) new /obj/effect/decal/cleanable/rubble(rock)
sleep(0.6 SECONDS) sleep(0.6 SECONDS)

View File

@@ -182,7 +182,7 @@
TIMER_COOLDOWN_END(src, REF(user)) //if we fail we can start again immediately TIMER_COOLDOWN_END(src, REF(user)) //if we fail we can start again immediately
return return
if(ismineralturf(src)) if(ismineralturf(src))
gets_drilled(user, TRUE) gets_drilled(user, 1)
SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type) SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type)
/turf/closed/mineral/attack_hand(mob/user) /turf/closed/mineral/attack_hand(mob/user)
@@ -208,9 +208,9 @@
if(user.Adjacent(src)) if(user.Adjacent(src))
attack_hand(user) attack_hand(user)
/turf/closed/mineral/proc/gets_drilled(mob/user, give_exp = FALSE) /turf/closed/mineral/proc/gets_drilled(mob/user, exp_multiplier = 0)
if(istype(user)) if(istype(user))
SEND_SIGNAL(user, COMSIG_MOB_MINED, src, give_exp) SEND_SIGNAL(user, COMSIG_MOB_MINED, src, exp_multiplier)
if(mineralType && (mineralAmt > 0)) if(mineralType && (mineralAmt > 0))
new mineralType(src, mineralAmt) new mineralType(src, mineralAmt)
SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, mineralType) SSblackbox.record_feedback("tally", "ore_mined", mineralAmt, mineralType)
@@ -218,11 +218,11 @@
new spawned_boulder(src) new spawned_boulder(src)
if(ishuman(user)) if(ishuman(user))
var/mob/living/carbon/human/H = user var/mob/living/carbon/human/H = user
if(give_exp) if(exp_multiplier)
if (mineralType && (mineralAmt > 0)) if (mineralType && (mineralAmt > 0))
H.mind.adjust_experience(/datum/skill/mining, initial(mineralType.mine_experience) * mineralAmt) H.mind.adjust_experience(/datum/skill/mining, initial(mineralType.mine_experience) * mineralAmt * exp_multiplier)
else else
H.mind.adjust_experience(/datum/skill/mining, 4) H.mind.adjust_experience(/datum/skill/mining, 4 * exp_multiplier)
for(var/obj/effect/temp_visual/mining_overlay/M in src) for(var/obj/effect/temp_visual/mining_overlay/M in src)
qdel(M) qdel(M)
@@ -255,23 +255,23 @@
/turf/closed/mineral/ex_act(severity, target) /turf/closed/mineral/ex_act(severity, target)
. = ..() . = ..()
if(target == src) if(target == src)
gets_drilled(null, FALSE) gets_drilled()
return TRUE return TRUE
switch(severity) switch(severity)
if(EXPLODE_DEVASTATE) if(EXPLODE_DEVASTATE)
gets_drilled(null, FALSE) gets_drilled()
if(EXPLODE_HEAVY) if(EXPLODE_HEAVY)
if(prob(90)) if(prob(90))
gets_drilled(null, FALSE) gets_drilled()
if(EXPLODE_LIGHT) if(EXPLODE_LIGHT)
if(prob(75)) if(prob(75))
gets_drilled(null, FALSE) gets_drilled()
return TRUE return TRUE
/turf/closed/mineral/blob_act(obj/structure/blob/B) /turf/closed/mineral/blob_act(obj/structure/blob/B)
if(prob(50)) if(prob(50))
gets_drilled(give_exp = FALSE) gets_drilled()
/turf/closed/mineral/random /turf/closed/mineral/random
/// What are the base odds that this turf spawns a mineral in the wall on initialize? /// What are the base odds that this turf spawns a mineral in the wall on initialize?
@@ -834,9 +834,9 @@
if(defuser) if(defuser)
SEND_SIGNAL(defuser, COMSIG_LIVING_DEFUSED_GIBTONITE, det_time) SEND_SIGNAL(defuser, COMSIG_LIVING_DEFUSED_GIBTONITE, det_time)
/turf/closed/mineral/gibtonite/gets_drilled(mob/user, give_exp = FALSE, triggered_by_explosion = FALSE) /turf/closed/mineral/gibtonite/gets_drilled(mob/user, exp_multiplier = 0, triggered_by_explosion = FALSE)
if(istype(user)) if(istype(user))
SEND_SIGNAL(user, COMSIG_MOB_MINED, src, give_exp) SEND_SIGNAL(user, COMSIG_MOB_MINED, src, exp_multiplier)
if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated if(stage == GIBTONITE_UNSTRUCK && mineralAmt >= 1) //Gibtonite deposit is activated
playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,TRUE) playsound(src,'sound/effects/hit_on_shattered_glass.ogg',50,TRUE)
@@ -906,9 +906,9 @@
to_chat(usr, span_warning("The rock seems to be too strong to destroy. Maybe I can break it once I become a master miner.")) to_chat(usr, span_warning("The rock seems to be too strong to destroy. Maybe I can break it once I become a master miner."))
/turf/closed/mineral/strong/gets_drilled(mob/user, give_exp = FALSE) /turf/closed/mineral/strong/gets_drilled(mob/user, exp_multiplier = 0)
if(istype(user)) if(istype(user))
SEND_SIGNAL(user, COMSIG_MOB_MINED, src, give_exp) SEND_SIGNAL(user, COMSIG_MOB_MINED, src, exp_multiplier)
if(!ishuman(user)) if(!ishuman(user))
return // see attackby return // see attackby

View File

@@ -144,7 +144,7 @@
for(var/turf/turf_to_clear in underbelly) for(var/turf/turf_to_clear in underbelly)
if(ismineralturf(turf_to_clear)) if(ismineralturf(turf_to_clear))
var/turf/closed/mineral/rock_to_clear = turf_to_clear var/turf/closed/mineral/rock_to_clear = turf_to_clear
rock_to_clear.gets_drilled(give_exp = FALSE) rock_to_clear.gets_drilled()
for(var/turf/turf_to_quake in edges) for(var/turf/turf_to_quake in edges)
turf_to_quake.Shake(pixelshiftx = 0.5, pixelshifty = 0.5, duration = 1 SECONDS) turf_to_quake.Shake(pixelshiftx = 0.5, pixelshifty = 0.5, duration = 1 SECONDS)
playsound(epicenter, 'sound/misc/metal_creak.ogg', 125, TRUE) playsound(epicenter, 'sound/misc/metal_creak.ogg', 125, TRUE)

View File

@@ -317,7 +317,7 @@
if(QDELETED(hit_mineral)) if(QDELETED(hit_mineral))
return ..() return ..()
new /obj/effect/temp_visual/kinetic_blast(hit_mineral) new /obj/effect/temp_visual/kinetic_blast(hit_mineral)
hit_mineral.gets_drilled(firer, TRUE) hit_mineral.gets_drilled(firer, 1)
if(!iscarbon(firer)) if(!iscarbon(firer))
return ..() return ..()
var/mob/living/carbon/carbon_firer = firer var/mob/living/carbon/carbon_firer = firer

View File

@@ -171,7 +171,7 @@
/obj/item/crusher_trophy/bileworm_spewlet/on_projectile_hit_mineral(turf/closed/mineral, mob/living/user) /obj/item/crusher_trophy/bileworm_spewlet/on_projectile_hit_mineral(turf/closed/mineral, mob/living/user)
for(var/turf/closed/mineral/mineral_turf in RANGE_TURFS(1, mineral) - mineral) for(var/turf/closed/mineral/mineral_turf in RANGE_TURFS(1, mineral) - mineral)
mineral_turf.gets_drilled(user, TRUE) mineral_turf.gets_drilled(user, 1)
//yes this is a /mob_cooldown subtype being added to an item. I can't recommend you do what I'm doing //yes this is a /mob_cooldown subtype being added to an item. I can't recommend you do what I'm doing
/datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/spewlet /datum/action/cooldown/mob_cooldown/projectile_attack/dir_shots/spewlet

View File

@@ -484,7 +484,7 @@
target_turf = get_turf(src) target_turf = get_turf(src)
if(ismineralturf(target_turf)) if(ismineralturf(target_turf))
var/turf/closed/mineral/mineral_turf = target_turf var/turf/closed/mineral/mineral_turf = target_turf
mineral_turf.gets_drilled(firer, TRUE) mineral_turf.gets_drilled(firer, 1)
/obj/item/pen/destroyer /obj/item/pen/destroyer
name = "Fine Tipped Pen" name = "Fine Tipped Pen"

View File

@@ -249,7 +249,7 @@
modkit_upgrade.projectile_strike(src, target_turf, target, kinetic_gun) modkit_upgrade.projectile_strike(src, target_turf, target, kinetic_gun)
if(ismineralturf(target_turf)) if(ismineralturf(target_turf))
var/turf/closed/mineral/M = target_turf var/turf/closed/mineral/M = target_turf
M.gets_drilled(firer, TRUE) M.gets_drilled(firer, 1)
if(iscarbon(firer)) if(iscarbon(firer))
var/mob/living/carbon/carbon_firer = firer var/mob/living/carbon/carbon_firer = firer
var/skill_modifier = 1 var/skill_modifier = 1
@@ -264,18 +264,19 @@
/obj/projectile/kinetic/mech /obj/projectile/kinetic/mech
range = 5 range = 5
damage = 50 damage = 50
//the multiplier we apply to our PKa's AOE effect.
var/aoe_damage_multiplier = 0.3
/obj/projectile/kinetic/mech/strike_thing(atom/target) /obj/projectile/kinetic/mech/strike_thing(atom/target)
. = ..() . = ..()
new /obj/effect/temp_visual/explosion/fast(get_turf(target)) new /obj/effect/temp_visual/explosion/fast(get_turf(target))
for(var/mob/living/living_mob in range(1, target) - firer - target) for(var/turf/closed/mineral/mineral_turf in RANGE_TURFS(2, target) - target)
mineral_turf.gets_drilled(firer, 0.1)
for(var/mob/living/living_mob in range(2, target) - firer - target)
if(!ismining(living_mob)) if(!ismining(living_mob))
continue continue
var/armor = living_mob.run_armor_check(def_zone, armor_flag, armour_penetration = armour_penetration) var/armor = living_mob.run_armor_check(def_zone, armor_flag, armour_penetration = armour_penetration)
living_mob.apply_damage(damage*aoe_damage_multiplier, damage_type, def_zone, armor) living_mob.apply_damage(damage, damage_type, def_zone, armor)
to_chat(living_mob, span_userdanger("You're struck by a [name]!")) to_chat(living_mob, span_userdanger("You're struck by a [name]!"))
//Modkits //Modkits
@@ -426,6 +427,8 @@
//AoE blasts //AoE blasts
/obj/item/borg/upgrade/modkit/aoe /obj/item/borg/upgrade/modkit/aoe
modifier = 0 modifier = 0
cost = 10
maximum_of_type = 1
var/turf_aoe = FALSE var/turf_aoe = FALSE
var/stats_stolen = FALSE var/stats_stolen = FALSE
@@ -450,20 +453,25 @@
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/projectile/kinetic/K) /obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/projectile/kinetic/K)
K.name = "kinetic explosion" K.name = "kinetic explosion"
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA) /obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/projectile/kinetic/kinetic_blast, turf/target_turf, atom/target, obj/item/gun/energy/recharge/kinetic_accelerator/KA)
if(stats_stolen) if(stats_stolen)
return return
new /obj/effect/temp_visual/explosion/fast(target_turf) new /obj/effect/temp_visual/explosion/fast(target_turf)
if(turf_aoe) if(turf_aoe)
for(var/T in RANGE_TURFS(1, target_turf) - target_turf) for(var/T in RANGE_TURFS(2, target_turf) - target_turf)
if(ismineralturf(T)) if(ismineralturf(T))
var/turf/closed/mineral/M = T var/turf/closed/mineral/M = T
M.gets_drilled(K.firer, TRUE) M.gets_drilled(kinetic_blast.firer, 0.1)
if(modifier) if(modifier)
for(var/mob/living/L in range(1, target_turf) - K.firer - target) for(var/mob/living/living_mob in range(2, target) - kinetic_blast.firer - target)
var/armor = L.run_armor_check(K.def_zone, K.armor_flag, "", "", K.armour_penetration)
L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor) if(!ismining(living_mob))
to_chat(L, span_userdanger("You're struck by a [K.name]!")) continue
var/armor = living_mob.run_armor_check(kinetic_blast.def_zone, kinetic_blast.armor_flag, armour_penetration = kinetic_blast.armour_penetration)
living_mob.apply_damage(kinetic_blast.damage*modifier, kinetic_blast.damage_type, kinetic_blast.def_zone, armor)
to_chat(living_mob, span_userdanger("You're struck by a [kinetic_blast.name]!"))
/obj/item/borg/upgrade/modkit/aoe/turfs /obj/item/borg/upgrade/modkit/aoe/turfs
name = "mining explosion" name = "mining explosion"
@@ -471,16 +479,15 @@
denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs
turf_aoe = TRUE turf_aoe = TRUE
/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
name = "offensive mining explosion"
desc = "Causes the kinetic accelerator to destroy rock and damage mobs in an AoE."
maximum_of_type = 3
modifier = 0.25
/obj/item/borg/upgrade/modkit/aoe/mobs /obj/item/borg/upgrade/modkit/aoe/mobs
name = "offensive explosion" name = "offensive explosion"
desc = "Causes the kinetic accelerator to damage mobs in an AoE." desc = "Causes the kinetic accelerator to damage mobs in an AoE."
modifier = 0.2 modifier = 1
/obj/item/borg/upgrade/modkit/aoe/mobs/andturfs
name = "offensive mining explosion"
desc = "Causes the kinetic accelerator to destroy rock and damage mobs in an AoE."
turf_aoe = TRUE
//Minebot passthrough //Minebot passthrough
/obj/item/borg/upgrade/modkit/minebot_passthrough /obj/item/borg/upgrade/modkit/minebot_passthrough

View File

@@ -15,7 +15,7 @@
. = ..() . = ..()
if(ismineralturf(target)) if(ismineralturf(target))
var/turf/closed/mineral/M = target var/turf/closed/mineral/M = target
M.gets_drilled(firer, FALSE) M.gets_drilled(firer)
if(mine_range) if(mine_range)
mine_range-- mine_range--
range++ range++

View File

@@ -267,7 +267,7 @@
desc = "A device which causes kinetic accelerators to fire AoE blasts that destroy rock and damage creatures." desc = "A device which causes kinetic accelerators to fire AoE blasts that destroy rock and damage creatures."
id = "hyperaoemod" id = "hyperaoemod"
materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*3.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.5, /datum/material/silver =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/gold =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/diamond = SHEET_MATERIAL_AMOUNT*2) materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT*3.5, /datum/material/glass = SHEET_MATERIAL_AMOUNT*1.5, /datum/material/silver =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/gold =SHEET_MATERIAL_AMOUNT*1.5, /datum/material/diamond = SHEET_MATERIAL_AMOUNT*2)
build_path = /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs build_path = /obj/item/borg/upgrade/modkit/aoe/mobs/andturfs
/datum/design/unique_modkit/rapid_repeater /datum/design/unique_modkit/rapid_repeater
name = "Kinetic Accelerator Rapid Repeater Mod" name = "Kinetic Accelerator Rapid Repeater Mod"

View File

@@ -381,7 +381,7 @@
var/turf/closed/mineral/dest_mineral_turf = dest_turf var/turf/closed/mineral/dest_mineral_turf = dest_turf
for(var/mob/client_mob in SSspatial_grid.orthogonal_range_search(dest_mineral_turf, SPATIAL_GRID_CONTENTS_TYPE_CLIENTS, 8)) for(var/mob/client_mob in SSspatial_grid.orthogonal_range_search(dest_mineral_turf, SPATIAL_GRID_CONTENTS_TYPE_CLIENTS, 8))
shake_camera(client_mob, duration = 2, strength = 3) shake_camera(client_mob, duration = 2, strength = 3)
dest_mineral_turf.gets_drilled(give_exp = FALSE) dest_mineral_turf.gets_drilled()
for(var/obj/structure/victim_structure in dest_turf.contents) for(var/obj/structure/victim_structure in dest_turf.contents)
if(QDELING(victim_structure)) if(QDELING(victim_structure))

View File

@@ -0,0 +1,3 @@
#comment This repaths AOE Offensive Mining modkit from being a child of the turf aoe mining kit to the mob aoe mining kit
/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs : /obj/item/borg/upgrade/modkit/aoe/mobs/andturfs{@OLD}