From a3807448dbb939a94e879568327e143d3c207418 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Sun, 21 May 2017 19:42:06 -0500 Subject: [PATCH] Adds framework for kinetic accelerator projectiles having module-based effects on-hit (#1076) --- .../guns/energy/kinetic_accelerator.dm | 96 ++++++++++++++----- 1 file changed, 71 insertions(+), 25 deletions(-) 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"