/obj/item/gun/energy/kinetic_accelerator name = "proto-kinetic accelerator" desc = "A self recharging, ranged mining tool that does increased damage in low pressure." icon_state = "kineticgun" item_state = "kineticgun" ammo_type = list(/obj/item/ammo_casing/energy/kinetic) cell_type = /obj/item/stock_parts/cell/emproof item_flags = NONE obj_flags = UNIQUE_RENAME weapon_weight = WEAPON_LIGHT recoil = 0.5 can_flashlight = 1 flight_x_offset = 15 flight_y_offset = 9 automatic_charge_overlays = FALSE var/overheat_time = 16 var/holds_charge = FALSE var/unique_frequency = FALSE // modified by KA modkits var/overheat = FALSE can_bayonet = TRUE knife_x_offset = 20 knife_y_offset = 12 var/max_mod_capacity = 100 var/list/modkits = list() var/recharge_timerid /obj/item/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" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' ammo_type = list(/obj/item/ammo_casing/energy/kinetic/premium) /obj/item/ammo_casing/energy/kinetic/premium projectile_type = /obj/item/projectile/kinetic/premium /obj/item/projectile/kinetic/premium name = "kinetic force" icon_state = null damage = 50 damage_type = BRUTE flag = BOMB range = 4 log_override = TRUE /obj/item/gun/energy/kinetic_accelerator/getinaccuracy(mob/living/user, bonus_spread, stamloss) var/old_fire_delay = fire_delay //It's pretty irrelevant tbh but whatever. fire_delay = overheat_time . = ..() fire_delay = old_fire_delay /obj/item/gun/energy/kinetic_accelerator/examine(mob/user) . = ..() if(max_mod_capacity) . += "[get_remaining_mod_capacity()]% mod capacity remaining." for(var/obj/item/borg/upgrade/modkit/M in modkits) . += "There is \a [M] installed, using [M.cost]% capacity." /obj/item/gun/energy/kinetic_accelerator/crowbar_act(mob/living/user, obj/item/I) . = TRUE if(modkits.len) to_chat(user, span_notice("You pry all the modifications out.")) I.play_tool_sound(src, 100) for(var/obj/item/borg/upgrade/modkit/M in modkits) M.forceMove(drop_location()) //uninstallation handled in Exited(), or /mob/living/silicon/robot/remove_from_upgrades() for borgs else to_chat(user, span_notice("There are no modifications currently installed.")) /obj/item/gun/energy/kinetic_accelerator/Exited(atom/movable/gone) if(gone in modkits) var/obj/item/borg/upgrade/modkit/MK = gone MK.uninstall(src) return ..() /obj/item/gun/energy/kinetic_accelerator/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/borg/upgrade/modkit)) var/obj/item/borg/upgrade/modkit/MK = I MK.install(src, user) else ..() /obj/item/gun/energy/kinetic_accelerator/proc/get_remaining_mod_capacity() var/current_capacity_used = 0 for(var/obj/item/borg/upgrade/modkit/M in modkits) current_capacity_used += M.cost return max_mod_capacity - current_capacity_used /obj/item/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K) K.kinetic_gun = src //do something special on-hit, easy! for(var/obj/item/borg/upgrade/modkit/M in modkits) M.modify_projectile(K) /obj/item/gun/energy/kinetic_accelerator/cyborg holds_charge = TRUE unique_frequency = TRUE /obj/item/gun/energy/kinetic_accelerator/cyborg/Destroy() for(var/obj/item/borg/upgrade/modkit/M in modkits) M.uninstall(src) return ..() /obj/item/gun/energy/kinetic_accelerator/premiumka/cyborg holds_charge = TRUE unique_frequency = TRUE /obj/item/gun/energy/kinetic_accelerator/premiumka/cyborg/Destroy() for(var/obj/item/borg/upgrade/modkit/M in modkits) M.uninstall(src) return ..() /obj/item/gun/energy/kinetic_accelerator/minebot trigger_guard = TRIGGER_GUARD_ALLOW_ALL overheat_time = 20 holds_charge = TRUE unique_frequency = TRUE /obj/item/gun/energy/kinetic_accelerator/Initialize(mapload) . = ..() if(!holds_charge) empty() /obj/item/gun/energy/kinetic_accelerator/shoot_live_shot(mob/living/user, pointblank = FALSE, mob/pbtarget, message = 1, stam_cost = 0) . = ..() attempt_reload() /obj/item/gun/energy/kinetic_accelerator/equipped(mob/user) . = ..() if(!can_shoot()) attempt_reload() /obj/item/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_REF(empty_if_not_held)), 2) /obj/item/gun/energy/kinetic_accelerator/proc/empty_if_not_held() if(!ismob(loc) && !istype(loc, /obj/item/integrated_circuit)) empty() /obj/item/gun/energy/kinetic_accelerator/proc/empty() if(cell) cell.use(cell.charge) update_icon() /obj/item/gun/energy/kinetic_accelerator/proc/attempt_reload(recharge_time) if(!cell) return if(overheat) return if(!recharge_time) recharge_time = overheat_time overheat = TRUE var/carried = 0 if(!unique_frequency) for(var/obj/item/gun/energy/kinetic_accelerator/K in loc.GetAllContents()) carried++ carried = max(carried, 1) else carried = 1 deltimer(recharge_timerid) recharge_timerid = addtimer(CALLBACK(src, PROC_REF(reload)), recharge_time * carried, TIMER_STOPPABLE) /obj/item/gun/energy/kinetic_accelerator/emp_act(severity) return /obj/item/gun/energy/kinetic_accelerator/proc/reload() cell.give(cell.maxcharge) process_chamber() if(!suppressed) playsound(src.loc, 'sound/weapons/kenetic_reload.ogg', 60, 1) else to_chat(loc, "[src] silently charges up.") update_icon() overheat = FALSE /obj/item/gun/energy/kinetic_accelerator/update_overlays() . = ..() if(!can_shoot()) . += "[icon_state]_empty" //Casing /obj/item/ammo_casing/energy/kinetic projectile_type = /obj/item/projectile/kinetic select_name = "kinetic" e_cost = 500 fire_sound = 'sound/weapons/kenetic_accel.ogg' // fine spelling there chap /obj/item/ammo_casing/energy/kinetic/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") ..() if(loc && istype(loc, /obj/item/gun/energy/kinetic_accelerator)) var/obj/item/gun/energy/kinetic_accelerator/KA = loc KA.modify_projectile(BB) /obj/item/gun/energy/kinetic_accelerator/getstamcost(mob/living/carbon/user) if(user && !lavaland_equipment_pressure_check(get_turf(user))) return FALSE else return ..() //Projectiles /obj/item/projectile/kinetic name = "kinetic force" icon_state = null damage = 40 damage_type = BRUTE flag = BOMB range = 3 log_override = TRUE var/pressure_decrease_active = FALSE var/pressure_decrease = 0.25 var/obj/item/gun/energy/kinetic_accelerator/kinetic_gun /obj/item/projectile/kinetic/Destroy() kinetic_gun = null return ..() /obj/item/projectile/kinetic/prehit_pierce(atom/target) . = ..() if(. == PROJECTILE_PIERCE_PHASE) return if(kinetic_gun) var/list/mods = kinetic_gun.modkits for(var/obj/item/borg/upgrade/modkit/modkit in mods) modkit.projectile_prehit(src, target, kinetic_gun) if(!pressure_decrease_active && !lavaland_equipment_pressure_check(get_turf(target))) name = "weakened [name]" damage = damage * pressure_decrease pressure_decrease_active = TRUE /obj/item/projectile/kinetic/on_range() strike_thing() ..() /obj/item/projectile/kinetic/on_hit(atom/target) strike_thing(target) . = ..() /obj/item/projectile/kinetic/proc/strike_thing(atom/target) 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. var/list/mods = kinetic_gun.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/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 //Modkits /obj/item/borg/upgrade/modkit name = "kinetic accelerator modification kit" desc = "An upgrade for kinetic accelerators." icon = 'icons/obj/objects.dmi' icon_state = "modkit" w_class = WEIGHT_CLASS_SMALL require_module = TRUE module_type = list(/obj/item/robot_module/miner) module_flags = BORG_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) . = ..() . += "Occupies [cost]% of mod capacity." /obj/item/borg/upgrade/modkit/attackby(obj/item/A, mob/user) if(istype(A, /obj/item/gun/energy/kinetic_accelerator)) install(A, user) else ..() /obj/item/borg/upgrade/modkit/action(mob/living/silicon/robot/R) . = ..() if (.) for(var/obj/item/gun/energy/kinetic_accelerator/H in R.module.modules) return install(H, usr, FALSE) /obj/item/borg/upgrade/modkit/proc/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user, transfer_to_loc = TRUE) . = TRUE if(minebot_upgrade) if(minebot_exclusive && !istype(KA.loc, /mob/living/simple_animal/hostile/mining_drone)) to_chat(user, span_notice("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, span_notice("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/A in KA.modkits) var/obj/item/borg/upgrade/modkit/M = A if(istype(M, denied_type)) number_of_denied++ if(number_of_denied >= maximum_of_type) . = FALSE break if(KA.get_remaining_mod_capacity() >= cost) if(.) if(transfer_to_loc && !user.transferItemToLoc(src, KA)) return to_chat(user, span_notice("You install the modkit.")) playsound(loc, 'sound/items/screwdriver.ogg', 100, TRUE) KA.modkits += src else to_chat(user, span_notice("The modkit you're trying to install would conflict with an already installed modkit. Use a crowbar to remove existing modkits.")) else to_chat(user, span_notice("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/deactivate(mob/living/silicon/robot/R, user = usr) . = ..() if (.) for(var/obj/item/gun/energy/kinetic_accelerator/KA in R.module.modules) uninstall(KA) /obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA) KA.modkits -= src /obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K) //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/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/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/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 = 25 /obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K) K.range += modifier //Damage /obj/item/borg/upgrade/modkit/damage name = "damage increase" desc = "Increases the damage of kinetic accelerator when installed." modifier = 10 /obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K) K.damage += modifier //Cooldown /obj/item/borg/upgrade/modkit/cooldown name = "cooldown decrease" 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/gun/energy/kinetic_accelerator/KA, mob/user) . = ..() if(.) 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/gun/energy/kinetic_accelerator/KA) KA.overheat_time += decreased ..() /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 //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/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/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" /obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/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/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, null, null, 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 turf_aoe = TRUE /obj/item/borg/upgrade/modkit/aoe/turfs/andmobs name = "offensive mining explosion" desc = "Causes the kinetic accelerator to destroy rock and damage mobs in an AoE." maximum_of_type = 3 modifier = 0.25 /obj/item/borg/upgrade/modkit/aoe/mobs name = "offensive explosion" 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." denied_type = /obj/item/borg/upgrade/modkit/minebot_passthrough // If you have something cost zero, you can keep adding forever, why 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/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/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/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) /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/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/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 = "A syndicate modification kit that increases the damage a kinetic accelerator does in high pressure environments." modifier = 2 denied_type = /obj/item/borg/upgrade/modkit/indoors maximum_of_type = 2 cost = 35 /obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K) K.pressure_decrease *= modifier //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/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/gun/energy/kinetic_accelerator/KA) KA.trigger_guard = TRIGGER_GUARD_NORMAL ..() //Cosmetic /obj/item/borg/upgrade/modkit/chassis_mod name = "super chassis" desc = "Makes your KA yellow. All the fun of having a more powerful KA without actually having a more powerful KA." cost = 0 denied_type = /obj/item/borg/upgrade/modkit/chassis_mod var/chassis_icon = "kineticgun_u" var/chassis_name = "super-kinetic accelerator" /obj/item/borg/upgrade/modkit/chassis_mod/install(obj/item/gun/energy/kinetic_accelerator/KA, mob/user) . = ..() if(.) KA.icon_state = chassis_icon KA.name = chassis_name /obj/item/borg/upgrade/modkit/chassis_mod/uninstall(obj/item/gun/energy/kinetic_accelerator/KA) KA.icon_state = initial(KA.icon_state) KA.name = initial(KA.name) ..() /obj/item/borg/upgrade/modkit/chassis_mod/orange name = "hyper chassis" desc = "Makes your KA orange. All the fun of having explosive blasts without actually having explosive blasts." chassis_icon = "kineticgun_h" chassis_name = "hyper-kinetic accelerator" /obj/item/borg/upgrade/modkit/tracer name = "white tracer bolts" desc = "Causes kinetic accelerator bolts to have a white tracer trail and explosion." cost = 0 denied_type = /obj/item/borg/upgrade/modkit/tracer var/bolt_color = "#FFFFFF" /obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/item/projectile/kinetic/K) K.icon_state = "ka_tracer" K.color = bolt_color /obj/item/borg/upgrade/modkit/tracer/adjustable name = "adjustable tracer bolts" 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",bolt_color) as color|null