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