diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 8a3f4ee633..a21f798309 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -11,7 +11,7 @@ desc = "It's watching you suspiciously." /obj/structure/closet/crate/necropolis/tendril/PopulateContents() - var/loot = rand(1,26) + var/loot = rand(1,27) switch(loot) if(1) new /obj/item/device/shared_storage/red(src) @@ -28,9 +28,7 @@ if(7) new /obj/item/weapon/pickaxe/diamond(src) if(8) - new /obj/item/clothing/head/culthood(src) - new /obj/item/clothing/suit/cultrobes(src) - new /obj/item/weapon/bedsheet/cult(src) + new /obj/item/borg/upgrade/modkit/resonator_blasts(src) if(9) new /obj/item/organ/brain/alien(src) if(10) @@ -40,7 +38,7 @@ if(12) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker(src) if(13) - new /obj/item/weapon/sord(src) + new /obj/item/borg/upgrade/modkit/cooldown/repeater(src) if(14) new /obj/item/weapon/nullrod/scythe/talking(src) if(15) @@ -68,6 +66,9 @@ new /obj/item/weapon/spellbook/oneuse/summonitem(src) if(26) new /obj/item/book_of_babel(src) + if(27) + new /obj/item/borg/upgrade/modkit/lifesteal(src) + new /obj/item/weapon/bedsheet/cult(src) diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm index 1799a33cbb..8268c25f7a 100644 --- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm +++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm @@ -24,6 +24,7 @@ var/list/modkits = list() var/empty_state = "kineticgun_empty" + var/recharge_timerid /obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user) ..() @@ -61,10 +62,10 @@ . += A /obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K) + K.kinetic_gun = src //do something special on-hit, easy! 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 @@ -100,15 +101,16 @@ power_supply.use(500) update_icon() -/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload() +/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time) if(overheat) return + if(!recharge_time) + recharge_time = overheat_time overheat = TRUE var/carried = 0 if(!unique_frequency) - for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in \ - loc.GetAllContents()) + for(var/obj/item/weapon/gun/energy/kinetic_accelerator/K in loc.GetAllContents()) carried++ @@ -116,7 +118,8 @@ else carried = 1 - addtimer(CALLBACK(src, .proc/reload), overheat_time * carried) + deltimer(recharge_timerid) + recharge_timerid = addtimer(CALLBACK(src, .proc/reload), recharge_time * carried, TIMER_STOPPABLE) /obj/item/weapon/gun/energy/kinetic_accelerator/emp_act(severity) return @@ -161,10 +164,10 @@ log_override = TRUE var/pressure_decrease = 0.25 - var/list/kinetic_modules = list() + var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun /obj/item/projectile/kinetic/Destroy() - QDEL_NULL(kinetic_modules) + kinetic_gun = null return ..() /obj/item/projectile/kinetic/prehit(atom/target) @@ -190,15 +193,14 @@ var/turf/target_turf = get_turf(target) if(!target_turf) target_turf = get_turf(src) + if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate. + for(var/obj/item/borg/upgrade/modkit/M in kinetic_gun.get_modkits()) + M.projectile_strike(src, target_turf, target, kinetic_gun) if(ismineralturf(target_turf)) var/turf/closed/mineral/M = target_turf M.gets_drilled(firer) var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/kinetic_blast(target_turf) K.color = color - 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 @@ -262,7 +264,7 @@ /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) +/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) //Range /obj/item/borg/upgrade/modkit/range @@ -350,7 +352,7 @@ /obj/item/borg/upgrade/modkit/aoe/modify_projectile(obj/item/projectile/kinetic/K) K.name = "kinetic explosion" -/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target) +/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) if(stats_stolen) return new /obj/effect/temp_visual/explosion/fast(target_turf) @@ -382,6 +384,58 @@ desc = "Causes the kinetic accelerator to damage mobs in an AoE." modifier = 0.2 +//Tendril-unique modules +/obj/item/borg/upgrade/modkit/cooldown/repeater + name = "rapid repeater" + desc = "Quarters the kinetic accelerator's cooldown on striking a living target, but greatly increases the base cooldown." + denied_type = /obj/item/borg/upgrade/modkit/cooldown/repeater + modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss. + cost = 50 + +/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + var/valid_repeat = FALSE + if(isliving(target)) + var/mob/living/L = target + if(L.stat != DEAD) + valid_repeat = TRUE + if(ismineralturf(target_turf)) + valid_repeat = TRUE + if(valid_repeat) + KA.overheat = FALSE + KA.attempt_reload(KA.overheat_time * 0.25) //If you hit, the cooldown drops to 0.75 seconds. + +/obj/item/borg/upgrade/modkit/lifesteal + name = "lifesteal crystal" + desc = "Causes kinetic accelerator shots to slightly heal the firer on striking a living target." + icon_state = "modkit_crystal" + denied_type = /obj/item/borg/upgrade/modkit/lifesteal + modifier = 2.5 //Not a very effective method of healing. + cost = 20 + var/static/list/damage_heal_order = list(BRUTE, BURN, OXY) + +/obj/item/borg/upgrade/modkit/lifesteal/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(isliving(target) && isliving(K.firer)) + var/mob/living/L = target + if(L.stat == DEAD) + return + L = K.firer + L.heal_ordered_damage(modifier, damage_heal_order) + +/obj/item/borg/upgrade/modkit/resonator_blasts + name = "resonator blast" + desc = "Causes kinetic accelerator shots to leave and detonate resonator blasts." + denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts + cost = 30 + modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it. + +/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA) + if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs. + var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in target_turf + if(R) + R.damage_multiplier = modifier + R.burst() + return + new /obj/effect/temp_visual/resonance(target_turf, K.firer, null, 30) //Indoors /obj/item/borg/upgrade/modkit/indoors diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index 2bbe115510..ca0e225d7e 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ