diff --git a/code/modules/clothing/under/accessories/holster_vr.dm b/code/modules/clothing/under/accessories/holster_vr.dm
index 8cd7681dd9..2506251a4f 100644
--- a/code/modules/clothing/under/accessories/holster_vr.dm
+++ b/code/modules/clothing/under/accessories/holster_vr.dm
@@ -1,6 +1,6 @@
/obj/item/clothing/accessory/holster/waist/kinetic_accelerator
name = "KA holster"
- desc = "A specialized holster, made specifically for Kinetic Accelerator."
+ desc = "A specialized holster, made specifically for Kinetic Accelerators."
can_hold = list(/obj/item/weapon/gun/energy/kinetic_accelerator)
/obj/item/clothing/accessory/holster/machete/rapier
diff --git a/code/modules/mining/kinetic_crusher.dm b/code/modules/mining/kinetic_crusher.dm
index f4712d31b9..7effaf60d9 100644
--- a/code/modules/mining/kinetic_crusher.dm
+++ b/code/modules/mining/kinetic_crusher.dm
@@ -246,7 +246,7 @@
slot_r_hand_str = 'icons/mob/items/righthand_melee_vr.dmi',
)
item_state = "c-machete"
- w_class = ITEMSIZE_SMALL
+ w_class = ITEMSIZE_NORMAL
attack_verb = list("cleaved", "chopped", "pulped", "stabbed", "skewered")
can_cleave = TRUE
requires_wield = FALSE
diff --git a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
index 1f54311881..e1f33581e1 100644
--- a/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
+++ b/code/modules/mining/ore_redemption_machine/equipment_vendor.dm
@@ -76,7 +76,7 @@
EQUIPMENT("Kinetic Accelerator", /obj/item/weapon/gun/energy/kinetic_accelerator, 900),
EQUIPMENT("KA AoE Damage", /obj/item/borg/upgrade/modkit/aoe/mobs, 2000),
EQUIPMENT("KA Damage Increase", /obj/item/borg/upgrade/modkit/damage, 1000),
- EQUIPMENT("KA Efficiency Increase", /obj/item/borg/upgrade/modkit/efficiency, 1200),
+ EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1200),
EQUIPMENT("KA Range Increase", /obj/item/borg/upgrade/modkit/range, 1000),
EQUIPMENT("KA Cooldown Decrease", /obj/item/borg/upgrade/modkit/cooldown, 1000),
EQUIPMENT("KA Holster", /obj/item/clothing/accessory/holster/waist/kinetic_accelerator, 350),
diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm
index aa37003520..2b0d100c10 100644
--- a/code/modules/power/cell.dm
+++ b/code/modules/power/cell.dm
@@ -14,6 +14,8 @@
throw_speed = 3
throw_range = 5
w_class = ITEMSIZE_NORMAL
+ /// Are we EMP immune?
+ var/emp_proof = FALSE
var/static/cell_uid = 1 // Unique ID of this power cell. Used to reduce bunch of uglier code in nanoUI.
var/c_uid
var/charge = 0 // note %age conveted to actual charge in New
@@ -189,6 +191,8 @@
rigged = 1 //broken batterys are dangerous
/obj/item/weapon/cell/emp_act(severity)
+ if(emp_proof)
+ return
//remove this once emp changes on dev are merged in
if(isrobot(loc))
var/mob/living/silicon/robot/R = loc
diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm
index 643383067d..a5a0b66e0e 100644
--- a/code/modules/power/cells/device_cells.dm
+++ b/code/modules/power/cells/device_cells.dm
@@ -69,6 +69,9 @@
update_icon()
//CHOMP Add end
+/obj/item/weapon/cell/device/weapon/empproof
+ emp_proof = TRUE
+
/obj/item/weapon/cell/device/weapon/recharge
name = "self-charging weapon power cell"
desc = "A small power cell designed to power handheld weaponry. This one recharges itself."
diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm
index c1dae89a6e..74dc34a72c 100644
--- a/code/modules/projectiles/guns/energy.dm
+++ b/code/modules/projectiles/guns/energy.dm
@@ -21,6 +21,7 @@
var/recharge_time = 4
var/charge_tick = 0
var/charge_delay = 75 //delay between firing and charging
+ var/shot_counter = TRUE // does this gun tell you how many shots it has?
var/battery_lock = 0 //If set, weapon cannot switch batteries
@@ -175,14 +176,15 @@
/obj/item/weapon/gun/energy/examine(mob/user)
. = ..()
- if(power_supply)
- if(charge_cost)
- var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
- . += "Has [shots_remaining] shot\s remaining."
+ if(shot_counter)
+ if(power_supply)
+ if(charge_cost)
+ var/shots_remaining = round(power_supply.charge / max(1, charge_cost)) // Paranoia
+ . += "Has [shots_remaining] shot\s remaining."
+ else
+ . += "Has infinite shots remaining."
else
- . += "Has infinite shots remaining."
- else
- . += "Does not have a power cell."
+ . += "Does not have a power cell."
/obj/item/weapon/gun/energy/update_icon(var/ignore_inhands)
if(power_supply == null)
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
index 581e05d74d..f486d897d2 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator_vr.dm
@@ -1,51 +1,126 @@
+#define LAVALAND_EQUIPMENT_EFFECT_PRESSURE 50 //what pressure you have to be under to increase the effect of equipment meant for lavaland
+#define HEATMODE_ATMOSPHERE 312.1 //kPa. basically virgo 2's
+#define HEATMODE_TEMP 612 //kelvin. basically virgo 2's
+/**
+ * This is here for now
+ */
+/proc/lavaland_environment_check(turf/simulated/T)
+ . = TRUE
+ if(!istype(T))
+ return
+ var/datum/gas_mixture/environment = T.return_air()
+ if(!istype(environment))
+ return
+ var/pressure = environment.return_pressure()
+ if(pressure > LAVALAND_EQUIPMENT_EFFECT_PRESSURE)
+ . = FALSE
+ if(environment.temperature < (T20C - 30))
+ . = TRUE
+
+/proc/virgotwo_environment_check(turf/simulated/T)
+ . = TRUE
+ if(!istype(T))
+ return
+ var/datum/gas_mixture/environment = T.return_air()
+ if(!istype(environment))
+ return
+ var/pressure = environment.return_pressure()
+ if(pressure < HEATMODE_ATMOSPHERE - 20)
+ . = FALSE
+ if(environment.temperature > HEATMODE_TEMP - 30)
+ . = TRUE
+
/obj/item/weapon/gun/energy/kinetic_accelerator
name = "proto-kinetic accelerator"
- desc = "A self recharging, ranged mining tool that does increased damage in low temperature. Capable of holding up to six slots worth of mod kits."
+ desc = "A self recharging, ranged mining tool that does increased damage in low pressure."
icon = 'icons/obj/gun_vr.dmi'
icon_state = "kineticgun"
- item_state = "kineticgun"
item_icons = list(
slot_l_hand_str = 'icons/mob/items/lefthand_guns_vr.dmi',
- slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi')
+ slot_r_hand_str = 'icons/mob/items/righthand_guns_vr.dmi',
+ )
+ item_state = "kineticgun"
+ // ammo_type = list(/obj/item/ammo_casing/energy/kinetic)
+ cell_type = /obj/item/weapon/cell/device/weapon/empproof
+ item_flags = NONE
+ charge_meter = FALSE
+ // obj_flags = UNIQUE_RENAME
+ // weapon_weight = WEAPON_LIGHT
+ // can_flashlight = 1
+ // flight_x_offset = 15
+ // flight_y_offset = 9
+ // automatic_charge_overlays = FALSE
projectile_type = /obj/item/projectile/kinetic
- origin_tech = list(TECH_COMBAT = 3, TECH_POWER = 3, TECH_ENGINEERING = 3)
- can_flashlight = TRUE
- flight_x_offset = 15
- flight_y_offset = 9
- charge_cost = 120 // 20 shots on weapon power cell
- fire_delay = 16
- self_recharge = TRUE
- recharge_time = 10 // every 20*2 seconds will get 20% power restored
+ charge_cost = 1200
+ battery_lock = TRUE
+ fire_sound = 'sound/weapons/kenetic_accel.ogg'
+ var/overheat_time = 16
+ var/holds_charge = FALSE
+ var/unique_frequency = FALSE // modified by KA modkits
+ var/overheat = FALSE
+ var/emptystate = "kineticgun_empty"
+ shot_counter = FALSE
+ // can_bayonet = TRUE
+ // knife_x_offset = 20
+ // knife_y_offset = 12
var/max_mod_capacity = 100
var/list/modkits = list()
- var/empty_state = "kineticgun_empty"
+
+ var/recharge_timerid
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile()
+ if(overheat)
+ return
+ . = ..()
+ if(.)
+ var/obj/item/projectile/P = .
+ modify_projectile(P)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, pointblank, reflex)
+ . = ..()
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka
+ name = "premium accelerator"
+ desc = "A premium kinetic accelerator fitted with an extended barrel and increased pressure tank."
+ icon_state = "premiumgun"
+ item_state = "premiumgun"
+ projectile_type = /obj/item/projectile/kinetic/premium
/obj/item/weapon/gun/energy/kinetic_accelerator/examine(mob/user)
. = ..()
- if(Adjacent(user) && max_mod_capacity)
+ if(max_mod_capacity)
. += "[get_remaining_mod_capacity()]% mod capacity remaining."
- for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
- . += "There is a [M.name] mod installed, using [M.cost]% capacity."
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
+ . += "There is \a [M] installed, using [M.cost]% capacity."
-/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/weapon/tool/crowbar))
+/obj/item/weapon/gun/energy/kinetic_accelerator/Exited(atom/movable/AM)
+ . = ..()
+ if((AM in modkits) && istype(AM, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/M = AM
+ M.uninstall(src, FALSE)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user)
+ if(I.has_tool_quality(TOOL_CROWBAR))
if(modkits.len)
to_chat(user, "You pry the modifications out.")
- playsound(src, A.usesound, 100, 1)
+ playsound(loc, I.usesound, 100, 1)
for(var/obj/item/borg/upgrade/modkit/M in modkits)
M.uninstall(src)
else
to_chat(user, "There are no modifications currently installed.")
- else if(istype(A, /obj/item/borg/upgrade/modkit))
- var/obj/item/borg/upgrade/modkit/MK = A
+ if(istype(I, /obj/item/borg/upgrade/modkit))
+ var/obj/item/borg/upgrade/modkit/MK = I
MK.install(src, user)
else
..()
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity()
var/current_capacity_used = 0
- for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
+ for(var/A in get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
current_capacity_used += M.cost
return max_mod_capacity - current_capacity_used
@@ -55,134 +130,243 @@
. += A
/obj/item/weapon/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
- for(var/obj/item/borg/upgrade/modkit/M as anything in get_modkits())
+ 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)
-/obj/item/weapon/gun/energy/kinetic_accelerator/consume_next_projectile()
- var/obj/item/projectile/kinetic/BB = ..()
- if(!istype(BB))
- return
- modify_projectile(BB)
+/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
- var/turf/proj_turf = get_turf(src)
- if(!isturf(proj_turf))
- return
- var/datum/gas_mixture/environment = proj_turf.return_air()
- if(environment.temperature > 250)
- BB.name = "weakened [BB.name]"
- BB.damage *= BB.pressure_decrease
- return BB
+/obj/item/weapon/gun/energy/kinetic_accelerator/cyborg/Destroy()
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
+ return ..()
-/obj/item/weapon/gun/energy/kinetic_accelerator/handle_post_fire(mob/user, atom/target, var/pointblank=0, var/reflex=0)
+/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/premiumka/cyborg/Destroy()
+ for(var/obj/item/borg/upgrade/modkit/M in modkits)
+ M.uninstall(src)
+ return ..()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/minebot
+ // trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+ overheat_time = 20
+ holds_charge = TRUE
+ unique_frequency = TRUE
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/Initialize()
. = ..()
- spawn(fire_delay)
- if(power_supply && power_supply.check_charge(charge_cost))
- playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ if(!holds_charge)
+ empty()
+ AddElement(/datum/element/conflict_checking, CONFLICT_ELEMENT_KA)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/equipped(mob/user)
+ . = ..()
+ if(power_supply.charge < charge_cost)
+ attempt_reload()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/dropped(mob/user)
+ . = ..()
+ if(!QDELING(src) && !holds_charge)
+ // Put it on a delay because moving item from slot to hand
+ // calls dropped().
+ addtimer(CALLBACK(src, .proc/empty_if_not_held), 2)
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty_if_not_held()
+ if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit))
+ empty()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/empty()
+ if(power_supply)
+ power_supply.use(power_supply.charge)
+ update_icon()
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time)
+ if(!power_supply)
+ return
+ if(overheat)
+ return
+ if(!recharge_time)
+ recharge_time = overheat_time
+ overheat = TRUE
+ update_icon()
+
+ var/carried = max(1, loc.ConflictElementCount(CONFLICT_ELEMENT_KA))
+
+ 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
+
+/obj/item/weapon/gun/energy/kinetic_accelerator/proc/reload()
+ power_supply.give(power_supply.maxcharge)
+ // process_chamber()
+ // if(!suppressed)
+ playsound(src, 'sound/weapons/kenetic_reload.ogg', 60, 1)
+ // else
+ // to_chat(loc, "[src] silently charges up.")
+ overheat = FALSE
+ update_icon()
/obj/item/weapon/gun/energy/kinetic_accelerator/update_icon()
cut_overlays()
- if(!power_supply || !power_supply.check_charge(charge_cost))
- add_overlay(empty_state)
- if(can_flashlight)
- var/iconF = "flight"
- if(gun_light)
- iconF = "flight_on"
- add_overlay(image(icon = icon, icon_state = iconF, pixel_x = flight_x_offset, pixel_y = flight_y_offset))
+ if(overheat || (power_supply.charge == 0))
+ add_overlay(emptystate)
+
+#define KA_ENVIRO_TYPE_COLD 0
+#define KA_ENVIRO_TYPE_HOT 1
//Projectiles
/obj/item/projectile/kinetic
name = "kinetic force"
- icon = 'icons/obj/projectiles_vr.dmi'
icon_state = null
- damage = 32
+ damage = 30
damage_type = BRUTE
check_armour = "bomb"
- range = 3 // Our "range" var is named "kill_count". Yes it is.
+ range = 4
+ // log_override = TRUE
- var/pressure_decrease = 0.25
- var/turf_aoe = FALSE
- var/mob_aoe = FALSE
- var/list/hit_overlays = list()
+ var/pressure_decrease_active = FALSE
+ var/pressure_decrease = 1/3
+ var/environment = KA_ENVIRO_TYPE_COLD
+ var/obj/item/weapon/gun/energy/kinetic_accelerator/kinetic_gun
-// /obj/item/projectile/kinetic/pod
-// kill_count = 4
-//
-// /obj/item/projectile/kinetic/pod/regular
-// damage = 50
-// pressure_decrease = 0.5
-//
-// /obj/item/projectile/kinetic/pod/enhanced
-// turf_aoe = TRUE
-// mob_aoe = TRUE
+/obj/item/projectile/kinetic/premium
+ damage = 40
+ damage_type = BRUTE
+ range = 5
-/obj/item/projectile/kinetic/on_impact(var/atom/A)
- strike_thing(A)
- . = ..()
+/obj/item/projectile/kinetic/Destroy()
+ kinetic_gun = null
+ return ..()
-/obj/item/projectile/kinetic/on_hit(var/atom/target)
+/obj/item/projectile/kinetic/Bump(atom/target)
+ if(kinetic_gun)
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_prehit(src, target, kinetic_gun)
+ if(!pressure_decrease_active)
+ if(environment == KA_ENVIRO_TYPE_COLD)
+ if(!lavaland_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ else if(environment == KA_ENVIRO_TYPE_HOT)
+ if(!virgotwo_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ return ..()
+
+/obj/item/projectile/kinetic/attack_mob(mob/living/target_mob, distance, miss_modifier)
+ if(!pressure_decrease_active)
+ if(environment == KA_ENVIRO_TYPE_COLD)
+ if(!lavaland_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ else if(environment == KA_ENVIRO_TYPE_HOT)
+ if(!virgotwo_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ return ..()
+
+/obj/item/projectile/kinetic/on_range()
+ strike_thing()
+ ..()
+
+/obj/item/projectile/kinetic/on_hit(atom/target)
strike_thing(target)
. = ..()
+/obj/item/projectile/kinetic/on_impact(atom/A)
+ . = ..()
+ strike_thing(A)
+
/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
+ if(!pressure_decrease_active)
+ if(environment == KA_ENVIRO_TYPE_COLD)
+ if(!lavaland_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
+ else if(environment == KA_ENVIRO_TYPE_HOT)
+ if(!virgotwo_environment_check(get_turf(src)))
+ name = "weakened [name]"
+ damage = damage * pressure_decrease
+ pressure_decrease_active = TRUE
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
- if(istype(target_turf, /turf/simulated/mineral))
+ if(kinetic_gun) //hopefully whoever shot this was not very, very unfortunate.
+ var/list/mods = kinetic_gun.get_modkits()
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike_predamage(src, target_turf, target, kinetic_gun)
+ for(var/obj/item/borg/upgrade/modkit/M in mods)
+ M.projectile_strike(src, target_turf, target, kinetic_gun)
+ if(ismineralturf(target_turf))
var/turf/simulated/mineral/M = target_turf
- M.GetDrilled()
+ M.GetDrilled(TRUE)
var/obj/effect/temp_visual/kinetic_blast/K = new /obj/effect/temp_visual/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(istype(T, /turf/simulated/mineral))
- var/turf/simulated/mineral/M = T
- M.GetDrilled()
- if(mob_aoe)
- for(var/mob/living/L in range(1, target_turf) - firer - target)
- var/armor = L.run_armor_check(def_zone, check_armour)
- L.apply_damage(damage*mob_aoe, damage_type, def_zone, armor)
- to_chat(L, "You're struck by a [name]!")
+
//Modkits
/obj/item/borg/upgrade/modkit
- name = "modification kit"
+ name = "kinetic accelerator modification kit"
desc = "An upgrade for kinetic accelerators."
icon = 'icons/obj/objects_vr.dmi'
icon_state = "modkit"
- origin_tech = list(TECH_DATA = 2, TECH_MATERIAL = 2, TECH_MAGNET = 4)
+ w_class = ITEMSIZE_SMALL
require_module = 1
- // var/module_type = /obj/item/robot_module/miner
- usesound = 'sound/items/Screwdriver.ogg'
+ // module_type = list(/obj/item/robot_module/miner)
var/denied_type = null
var/maximum_of_type = 1
var/cost = 30
var/modifier = 1 //For use in any mod kit that has numerical modifiers
+ var/minebot_upgrade = TRUE
+ var/minebot_exclusive = FALSE
/obj/item/borg/upgrade/modkit/examine(mob/user)
. = ..()
- if(Adjacent(user))
- . += "Occupies [cost]% of mod capacity."
+ . += "Occupies [cost]% of mod capacity."
/obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user)
- if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator) && !issilicon(user))
+ if(istype(A, /obj/item/weapon/gun/energy/kinetic_accelerator))
install(A, user)
else
..()
-/obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R)
- if(..())
- return
-
+/*
+/obj/item/borg/upgrade/modkit/afterInstall(mob/living/silicon/robot/R)
for(var/obj/item/weapon/gun/energy/kinetic_accelerator/H in R.module.modules)
- return install(H, usr)
+ if(install(H, R)) //It worked
+ return
+ to_chat(R, "Upgrade error - Aborting Kinetic Accelerator linking.") //No applicable KA found, insufficient capacity, or some other problem.
+*/
/obj/item/borg/upgrade/modkit/proc/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = TRUE
+ if(src in KA.modkits) // Sanity check to prevent installing the same modkit twice thanks to occasional click/lag delays.
+ return FALSE
+ // if(minebot_upgrade)
+ // if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
+ // to_chat(user, "The modkit you're trying to install is only rated for minebot use.")
+ // return FALSE
+ // else if(istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone))
+ // to_chat(user, "The modkit you're trying to install is not rated for minebot use.")
+ // return FALSE
if(denied_type)
var/number_of_denied = 0
- for(var/obj/item/borg/upgrade/modkit/M as anything in KA.get_modkits())
+ for(var/A in KA.get_modkits())
+ var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, denied_type))
number_of_denied++
if(number_of_denied >= maximum_of_type)
@@ -190,10 +374,11 @@
break
if(KA.get_remaining_mod_capacity() >= cost)
if(.)
+ user.drop_from_inventory(src, KA)
+ // if(!user.transferItemToLoc(src, KA))
+ // return FALSE
to_chat(user, "You install the modkit.")
- playsound(src, usesound, 100, 1)
- user.unEquip(src)
- forceMove(KA)
+ playsound(loc, 'sound/items/screwdriver.ogg', 100, 1)
KA.modkits += src
else
to_chat(user, "The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.")
@@ -201,19 +386,26 @@
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))
+/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA, forcemove = TRUE)
KA.modkits -= src
+ if(forcemove)
+ forceMove(get_turf(KA))
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
- return
+
+//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
+/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+//use this one for effects you want to trigger before mods that do damage
+/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+//and this one for things that don't need to trigger before other damage-dealing mods
+/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
name = "range increase"
desc = "Increases the range of a kinetic accelerator when installed."
modifier = 1
- cost = 24 //so you can fit four plus a tracer cosmetic
+ cost = 25
/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K)
K.range += modifier
@@ -228,55 +420,87 @@
/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
K.damage += modifier
-
- //Cooldown - CHOMPstation re-addition start
+//Cooldown
/obj/item/borg/upgrade/modkit/cooldown
name = "cooldown decrease"
- desc = "Decreases the cooldown of a kinetic accelerator."
+ desc = "Decreases the cooldown of a kinetic accelerator. Not rated for minebot use."
modifier = 2.5
+ minebot_upgrade = FALSE
+ var/decreased
/obj/item/borg/upgrade/modkit/cooldown/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
. = ..()
if(.)
- KA.fire_delay -= modifier
+ var/old = KA.overheat_time
+ KA.overheat_time = max(0, KA.overheat_time - modifier)
+ decreased = old - KA.overheat_time
+
/obj/item/borg/upgrade/modkit/cooldown/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
- KA.fire_delay += modifier
+ KA.overheat_time += decreased
..()
-//Cooldown - CHOMPstation re-addition end
-/obj/item/borg/upgrade/modkit/efficiency
- name = "energy efficiency"
- desc = "Decreases the energy use of a kinetic accelerator."
- modifier = 20
+/obj/item/borg/upgrade/modkit/cooldown/minebot
+ name = "minebot cooldown decrease"
+ desc = "Decreases the cooldown of a kinetic accelerator. Only rated for minebot use."
+ icon_state = "door_electronics"
+ icon = 'icons/obj/module.dmi'
+ denied_type = /obj/item/borg/upgrade/modkit/cooldown/minebot
+ modifier = 10
+ cost = 0
+ minebot_upgrade = TRUE
+ minebot_exclusive = TRUE
-/obj/item/borg/upgrade/modkit/efficiency/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
- . = ..()
- if(.)
- KA.charge_cost -= modifier
-
-/obj/item/borg/upgrade/modkit/efficiency/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
- KA.charge_cost += modifier
- ..()
//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 || AOE == src)
+ 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)
+ 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/temp_visual/explosion/fast
- K.mob_aoe += modifier
+
+/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)
+ if(turf_aoe)
+ for(var/T in RANGE_TURFS(1, target_turf) - target_turf)
+ if(ismineralturf(T))
+ var/turf/simulated/mineral/M = T
+ M.GetDrilled(TRUE)
+ 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.check_armour)
+ // var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
+ L.apply_damage(K.damage*modifier, K.damage_type, K.def_zone, armor)
+ // 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"
@@ -289,19 +513,150 @@
desc = "Causes the kinetic accelerator to damage mobs in an AoE."
modifier = 0.2
+//Minebot passthrough
+/obj/item/borg/upgrade/modkit/minebot_passthrough
+ name = "minebot passthrough"
+ desc = "Causes kinetic accelerator shots to pass through minebots."
+ cost = 0
+
+//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_predamage(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"
+ 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_prehit(obj/item/projectile/kinetic/K, 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/resonance/R = locate(/obj/effect/resonance) in target_turf
+ if(R)
+ R.resonance_damage *= modifier
+ R.burst()
+ return
+ new /obj/effect/resonance(target_turf, K.firer, 30)
+
+/*
+/obj/item/borg/upgrade/modkit/bounty
+ name = "death syphon"
+ desc = "Killing or assisting in killing a creature permanently increases your damage against that type of creature."
+ denied_type = /obj/item/borg/upgrade/modkit/bounty
+ modifier = 1.25
+ cost = 30
+ var/maximum_bounty = 25
+ var/list/bounties_reaped = list()
+
+/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target))
+ var/mob/living/L = target
+ var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK)
+ for(var/i in existing_marks)
+ var/datum/status_effect/syphon_mark/SM = i
+ if(SM.reward_target == src) //we want to allow multiple people with bounty modkits to use them, but we need to replace our own marks so we don't multi-reward
+ SM.reward_target = null
+ qdel(SM)
+ L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src)
+
+/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ if(isliving(target))
+ var/mob/living/L = target
+ if(bounties_reaped[L.type])
+ var/kill_modifier = 1
+ if(K.pressure_decrease_active)
+ kill_modifier *= K.pressure_decrease
+ var/armor = L.run_armor_check(K.def_zone, K.flag, null, null, K.armour_penetration)
+ L.apply_damage(bounties_reaped[L.type]*kill_modifier, K.damage_type, K.def_zone, armor)
+
+/obj/item/borg/upgrade/modkit/bounty/proc/get_kill(mob/living/L)
+ var/bonus_mod = 1
+ if(ismegafauna(L)) //megafauna reward
+ bonus_mod = 4
+ if(!bounties_reaped[L.type])
+ bounties_reaped[L.type] = min(modifier * bonus_mod, maximum_bounty)
+ else
+ bounties_reaped[L.type] = min(bounties_reaped[L.type] + (modifier * bonus_mod), maximum_bounty)
+*/
//Indoors
/obj/item/borg/upgrade/modkit/indoors
name = "decrease pressure penalty"
- desc = "Increases the damage a kinetic accelerator does in a high pressure environment."
+ desc = "A remarkably illegal modification kit that increases the damage a kinetic accelerator does in pressurized environments."
modifier = 2
denied_type = /obj/item/borg/upgrade/modkit/indoors
maximum_of_type = 2
- cost = 40
+ cost = 35
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
K.pressure_decrease *= modifier
+// Atmospheric
+/obj/item/borg/upgrade/modkit/heater
+ name = "temperature modulator"
+ desc = "A remarkably unusual modification kit that makes kinetic accelerators more usable in hot, overpressurized environments, \
+ in exchange for making them weak elsewhere, like the cold or in space."
+ denied_type = /obj/item/borg/upgrade/modkit/indoors
+ maximum_of_type = 1
+ cost = 30
+
+/obj/item/borg/upgrade/modkit/heater/modify_projectile(obj/item/projectile/kinetic/K)
+ K.environment = KA_ENVIRO_TYPE_HOT
+
+//Trigger Guard
+
+/*
+/obj/item/borg/upgrade/modkit/trigger_guard
+ name = "modified trigger guard"
+ desc = "Allows creatures normally incapable of firing guns to operate the weapon when installed."
+ cost = 20
+ denied_type = /obj/item/borg/upgrade/modkit/trigger_guard
+
+/obj/item/borg/upgrade/modkit/trigger_guard/install(obj/item/weapon/gun/energy/kinetic_accelerator/KA, mob/user)
+ . = ..()
+ if(.)
+ KA.trigger_guard = TRIGGER_GUARD_ALLOW_ALL
+
+/obj/item/borg/upgrade/modkit/trigger_guard/uninstall(obj/item/weapon/gun/energy/kinetic_accelerator/KA)
+ KA.trigger_guard = TRIGGER_GUARD_NORMAL
+ ..()
+*/
+
//Cosmetic
/obj/item/borg/upgrade/modkit/chassis_mod
@@ -342,7 +697,7 @@
/obj/item/borg/upgrade/modkit/tracer/adjustable
name = "adjustable tracer bolts"
- desc = "Causes kinetic accelerator bolts to have a adjustably-colored tracer trail and explosion. Use in-hand to change color."
+ desc = "Causes kinetic accelerator bolts to have an adjustable-colored tracer trail and explosion. Use in-hand to change color."
/obj/item/borg/upgrade/modkit/tracer/adjustable/attack_self(mob/user)
- bolt_color = input(user,"Choose Color") as color
+ bolt_color = input(user,"","Choose Color",bolt_color) as color|null
diff --git a/icons/mob/items/lefthand_guns_vr.dmi b/icons/mob/items/lefthand_guns_vr.dmi
index 0d8acb4fbb..fcf529ee98 100644
Binary files a/icons/mob/items/lefthand_guns_vr.dmi and b/icons/mob/items/lefthand_guns_vr.dmi differ
diff --git a/icons/mob/items/righthand_guns_vr.dmi b/icons/mob/items/righthand_guns_vr.dmi
index 73ee95c0a3..5554423acb 100644
Binary files a/icons/mob/items/righthand_guns_vr.dmi and b/icons/mob/items/righthand_guns_vr.dmi differ
diff --git a/icons/obj/gun_vr.dmi b/icons/obj/gun_vr.dmi
index 609e107845..a623c02134 100644
Binary files a/icons/obj/gun_vr.dmi and b/icons/obj/gun_vr.dmi differ