diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 6a5dab12bf..0a886a76d1 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -61,6 +61,7 @@
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
M.modify_projectile(K)
+ K.kinetic_modules += M //do something special on-hit, easy!
/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
holds_charge = TRUE
@@ -165,9 +166,11 @@
log_override = TRUE
var/pressure_decrease = 0.25
- var/turf_aoe = FALSE
- var/mob_aoe = 0
- var/list/hit_overlays = list()
+ var/list/kinetic_modules = list()
+
+/obj/item/projectile/kinetic/Destroy()
+ QDEL_NULL(kinetic_modules)
+ return ..()
/obj/item/projectile/kinetic/prehit(atom/target)
var/turf/target_turf = get_turf(target)
@@ -197,23 +200,15 @@
M.gets_drilled(firer)
var/obj/effect/overlay/temp/kinetic_blast/K = new /obj/effect/overlay/temp/kinetic_blast(target_turf)
K.color = color
- for(var/type in hit_overlays)
- new type(target_turf)
- if(turf_aoe)
- for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
- if(ismineralturf(T))
- var/turf/closed/mineral/M = T
- M.gets_drilled(firer)
- if(mob_aoe)
- for(var/mob/living/L in range(1, target_turf) - firer - target)
- var/armor = L.run_armor_check(def_zone, flag, "", "", armour_penetration)
- L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
- to_chat(L, "You're struck by a [name]!")
+ for(var/obj/item/borg/upgrade/modkit/M in kinetic_modules)
+ if(QDELETED(M)) //whoever shot this was very, very unfortunate.
+ continue
+ M.projectile_strike(src, target_turf, target)
//Modkits
/obj/item/borg/upgrade/modkit
- name = "modification kit"
+ name = "kinetic accelerator modification kit"
desc = "An upgrade for kinetic accelerators."
icon = 'icons/obj/objects.dmi'
icon_state = "modkit"
@@ -266,14 +261,13 @@
to_chat(user, "You don't have room([KA.get_remaining_mod_capacity()]% remaining, [cost]% needed) to install this modkit. Use a crowbar to remove existing modkits.")
. = FALSE
-
-
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
forceMove(get_turf(KA))
KA.modkits -= src
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
+/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
//Range
/obj/item/borg/upgrade/modkit/range
@@ -315,21 +309,73 @@
//AoE blasts
/obj/item/borg/upgrade/modkit/aoe
modifier = 0
+ var/turf_aoe = FALSE
+ var/stats_stolen = FALSE
+
+/obj/item/borg/upgrade/modkit/aoe/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits) //make sure only one of the aoe modules has values if somebody has multiple
+ if(AOE.stats_stolen)
+ continue
+ modifier += AOE.modifier //take its modifiers
+ AOE.modifier = 0
+ turf_aoe += AOE.turf_aoe
+ AOE.turf_aoe = FALSE
+ AOE.stats_stolen = TRUE
+
+/obj/item/borg/upgrade/modkit/aoe/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ ..()
+ modifier = initial(modifier) //get our modifiers back
+ turf_aoe = initial(turf_aoe)
+ if(stats_stolen) //if we had our stats stolen, find the stealer and take them from it
+ for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits)
+ if(AOE.stats_stolen)
+ continue
+ AOE.modifier -= modifier
+ AOE.turf_aoe -= turf_aoe
+ else //otherwise, reset the stolen stats and have it recalculate
+ var/obj/item/borg/upgrade/modkit/aoe/new_stealer
+ for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits)
+ if(!new_stealer)
+ new_stealer = AOE //just make the first one a stealer
+ AOE.modifier = initial(AOE.modifier)
+ AOE.turf_aoe = initial(AOE.turf_aoe)
+ AOE.stats_stolen = FALSE
+ if(new_stealer) //if there's no stealer, then there's no other aoe modkits
+ for(var/obj/item/borg/upgrade/modkit/aoe/AOE in KA.modkits)
+ if(AOE != new_stealer)
+ new_stealer.modifier += AOE.modifier
+ AOE.modifier = 0
+ new_stealer.turf_aoe += AOE.turf_aoe
+ AOE.turf_aoe = FALSE
+ AOE.stats_stolen = TRUE
+ stats_stolen = FALSE
/obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K)
K.name = "kinetic explosion"
- if(!K.turf_aoe && !K.mob_aoe)
- K.hit_overlays += /obj/effect/overlay/temp/explosion/fast
- K.mob_aoe += modifier
+
+/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target)
+ if(stats_stolen)
+ return
+ new /obj/effect/overlay/temp/explosion/fast(target_turf)
+ if(turf_aoe)
+ for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
+ if(ismineralturf(T))
+ var/turf/closed/mineral/M = T
+ M.gets_drilled(K.firer)
+ if(modifier)
+ for(var/mob/living/L in range(1, target_turf) - K.firer - target)
+ var/armor = L.run_armor_check(K.def_zone, K.flag, "", "", K.armour_penetration)
+ L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
+ to_chat(L, "You're struck by a [K.name]!")
+
/obj/item/borg/upgrade/modkit/aoe/turfs
name = "mining explosion"
desc = "Causes the kinetic accelerator to destroy rock in an AoE."
denied_type = /obj/item/borg/upgrade/modkit/aoe/turfs
-
-/obj/item/borg/upgrade/modkit/aoe/turfs/modify_projectile(obj/item/projectile/kinetic/K)
- ..()
- K.turf_aoe = TRUE
+ turf_aoe = TRUE
/obj/item/borg/upgrade/modkit/aoe/turfs/andmobs
name = "offensive mining explosion"