diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 96d87e65d10..25723d3c21d 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -45,6 +45,7 @@ GLOBAL_LIST_INIT(poi_list, list()) //list of points of interest for observe/ GLOBAL_LIST_INIT(active_jammers, list()) // List of active radio jammers GLOBAL_LIST_EMPTY(ladders) GLOBAL_LIST_EMPTY(mirrors) //list of all mirrors and mirror shields. +GLOBAL_LIST_EMPTY(arc_emitters) //list of all arc emitters GLOBAL_LIST_INIT(active_diseases, list()) //List of Active disease in all mobs; purely for quick referencing. diff --git a/code/game/mecha/equipment/weapons/weapons.dm b/code/game/mecha/equipment/weapons/weapons.dm index 3c441e3c697..7c3781f6ce9 100644 --- a/code/game/mecha/equipment/weapons/weapons.dm +++ b/code/game/mecha/equipment/weapons/weapons.dm @@ -119,7 +119,7 @@ icon_state = "mecha_laser" origin_tech = "materials=4;engineering=4;combat=6;magnets=6" energy_drain = 500 - projectile = /obj/item/projectile/energy/shock_revolver + projectile = /obj/item/projectile/energy/tesla_bolt fire_sound = 'sound/magic/lightningbolt.ogg' harmful = TRUE diff --git a/code/modules/crafting/guncrafting.dm b/code/modules/crafting/guncrafting.dm index 2bba49ba5ce..f3211488a10 100644 --- a/code/modules/crafting/guncrafting.dm +++ b/code/modules/crafting/guncrafting.dm @@ -31,9 +31,9 @@ origin_tech = "combat=4;magnets=4;powerstorage=4" /obj/item/weaponcrafting/gunkit/tesla - name = "\improper tesla revolver parts kit" - desc = "A suitcase containing the necessary gun parts to construct a tesla revolver around a laser rifle. Handle with care." - origin_tech = "combat=4;materials=4;powerstorage=4" + name = "\improper arc revolver parts kit" + desc = "A suitcase containing the necessary gun parts to construct a arc revolver around a laser rifle. Handle with care." + origin_tech = "combat=5;materials=5;powerstorage=5" /obj/item/weaponcrafting/gunkit/xray name = "\improper x-ray laser gun parts kit" diff --git a/code/modules/crafting/recipes.dm b/code/modules/crafting/recipes.dm index 67643bc631f..fbb8076acd3 100644 --- a/code/modules/crafting/recipes.dm +++ b/code/modules/crafting/recipes.dm @@ -189,9 +189,9 @@ blacklist += subtypesof(/obj/item/gun/energy/laser) /datum/crafting_recipe/teslarevolver - name = "Tesla Revolver" + name = "Arc Revolver" tools = list(TOOL_SCREWDRIVER, TOOL_WIRECUTTER) - result = list(/obj/item/gun/energy/shock_revolver) + result = list(/obj/item/gun/energy/arc_revolver) reqs = list(/obj/item/gun/energy/laser = 1, /obj/item/stack/cable_coil = 5, /obj/item/weaponcrafting/gunkit/tesla = 1) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm index c85c3bc7ce0..80754b60f6f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/ancient_robot.dm @@ -336,7 +336,7 @@ Difficulty: Hard var/turf/S = get_turf(src) if(!S || !T) return - var/obj/item/projectile/energy/shock_revolver/ancient/O = new /obj/item/projectile/energy/shock_revolver/ancient(S) + var/obj/item/projectile/energy/tesla_bolt/O = new /obj/item/projectile/energy/tesla_bolt(S) O.current = S O.yo = T.y - S.y O.xo = T.x - S.x @@ -692,10 +692,28 @@ Difficulty: Hard icon_state = "small1" duration = 20 -/obj/item/projectile/energy/shock_revolver/ancient - damage = 5 -/obj/item/projectile/energy/shock_revolver/ancient/Bump(atom/A, yes) // Don't want the projectile hitting the legs +/obj/item/projectile/energy/tesla_bolt //Leaving here for adminbus / so vetus still uses it. + name = "shock bolt" + icon_state = "purple_laser" + impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser + damage = 5 //A worse lasergun + var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE + var/zap_range = 3 + var/power = 10000 + +/obj/item/ammo_casing/energy/tesla_bolt/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + ..() + var/obj/item/projectile/energy/tesla_bolt/P = BB + spawn(1) + P.chain = P.Beam(user, icon_state = "purple_lightning", icon = 'icons/effects/effects.dmi', time = 1000, maxdistance = 30) + +/obj/item/projectile/energy/tesla_bolt/on_hit(atom/target) + . = ..() + tesla_zap(src, zap_range, power, zap_flags) + qdel(src) + +/obj/item/projectile/energy/tesla_bolt/Bump(atom/A, yes) // Don't want the projectile hitting the legs if(!istype(/mob/living/simple_animal/hostile/ancient_robot_leg, A)) return ..() var/turf/target_turf = get_turf(A) diff --git a/code/modules/projectiles/ammunition/energy_lens.dm b/code/modules/projectiles/ammunition/energy_lens.dm index c6f54a62d65..8f52e9ca646 100644 --- a/code/modules/projectiles/ammunition/energy_lens.dm +++ b/code/modules/projectiles/ammunition/energy_lens.dm @@ -239,12 +239,31 @@ /obj/item/ammo_casing/energy/plasma/adv projectile_type = /obj/item/projectile/plasma/adv -/obj/item/ammo_casing/energy/shock_revolver +/obj/item/ammo_casing/energy/tesla_bolt fire_sound = 'sound/magic/lightningbolt.ogg' e_cost = 200 select_name = "lightning beam" muzzle_flash_color = LIGHT_COLOR_FADEDPURPLE - projectile_type = /obj/item/projectile/energy/shock_revolver + projectile_type = /obj/item/projectile/energy/tesla_bolt + +/obj/item/ammo_casing/energy/arc_revolver + fire_sound = 'sound/magic/lightningbolt.ogg' //New sound + e_cost = 125 //8 shots? + select_name = "lightning beam" //I guess + muzzle_flash_color = LIGHT_COLOR_FADEDPURPLE // Depends on sprite + projectile_type = /obj/item/projectile/energy/arc_revolver + ///This number is randomly generated when the arc revolver is made. This ensures the beams only link to beams from the gun, one lower or higher than the number on the boosted object. + var/random_link_number + +/obj/item/ammo_casing/energy/arc_revolver/Initialize() + . = ..() + random_link_number = rand(1, 9999999) + +/obj/item/ammo_casing/energy/arc_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") + ..() + var/obj/item/projectile/energy/arc_revolver/P = BB + P.charge_number = random_link_number + random_link_number++ /obj/item/ammo_casing/energy/weak_plasma projectile_type = /obj/item/projectile/energy/weak_plasma diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 6b002019239..ac673937163 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -8,13 +8,13 @@ ammo_x_offset = 3 can_holster = TRUE // Pistol size -/obj/item/gun/energy/shock_revolver - name = "tesla revolver" - desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." +/obj/item/gun/energy/arc_revolver + name = "arc revolver" + desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers. These shots charge whatever they hit, causing arcs of electricity to form between them." icon_state = "stunrevolver" item_state = "gun" origin_tech = "combat=4;materials=4;powerstorage=4" - ammo_type = list(/obj/item/ammo_casing/energy/shock_revolver) + ammo_type = list(/obj/item/ammo_casing/energy/arc_revolver) can_flashlight = FALSE shaded_charge = FALSE can_holster = TRUE diff --git a/code/modules/projectiles/projectile/energy_projectiles.dm b/code/modules/projectiles/projectile/energy_projectiles.dm index 7ad012f4417..a25675bdf68 100644 --- a/code/modules/projectiles/projectile/energy_projectiles.dm +++ b/code/modules/projectiles/projectile/energy_projectiles.dm @@ -57,26 +57,6 @@ /obj/item/projectile/energy/bolt/large damage = 20 -/obj/item/projectile/energy/shock_revolver - name = "shock bolt" - icon_state = "purple_laser" - impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser - damage = 10 //A worse lasergun - var/zap_flags = ZAP_MOB_DAMAGE | ZAP_OBJ_DAMAGE - var/zap_range = 3 - var/power = 10000 - -/obj/item/ammo_casing/energy/shock_revolver/ready_proj(atom/target, mob/living/user, quiet, zone_override = "") - ..() - var/obj/item/projectile/energy/shock_revolver/P = BB - spawn(1) - P.chain = P.Beam(user, icon_state = "purple_lightning", icon = 'icons/effects/effects.dmi', time = 1000, maxdistance = 30) - -/obj/item/projectile/energy/shock_revolver/on_hit(atom/target) - . = ..() - tesla_zap(src, zap_range, power, zap_flags) - qdel(src) - /obj/item/projectile/energy/bsg name = "orb of pure bluespace energy" icon_state = "bluespace" @@ -147,3 +127,122 @@ armour_penetration_flat = 10 // It can have a little armor pen, as a treat. Bigger than it looks, energy armor is often low. shield_buster = TRUE reflectability = REFLECTABILITY_PHYSICAL //I will let eswords block it like a normal projectile, but it's not getting reflected, and eshields will take the hit hard. Carp still can reflect though, screw you. + +/obj/item/projectile/energy/arc_revolver + name = "arc emitter" + icon_state = "plasma_light" + damage = 10 + damage_type = BURN + var/charge_number = null + +/obj/item/projectile/energy/arc_revolver/on_hit(atom/target) + . = ..() + for(var/obj/effect/E in target) + if(istype(E, /obj/effect/abstract/arc_revolver)) + var/obj/effect/abstract/arc_revolver/A = E + A.charge_numbers += charge_number + A.duration += 10 SECONDS + qdel(src) + return + new /obj/effect/abstract/arc_revolver(target, charge_number) + qdel(src) + + +/obj/effect/abstract/arc_revolver + name = "arc emitter" + desc = "Emits arcs. What more do you want?" + var/duration = 10 SECONDS + var/list/charge_numbers = list() + var/list/chains = list() + var/successfulshocks = 0 + var/wait_for_three = 0 + +/obj/effect/abstract/arc_revolver/Initialize(mapload, charge_number) + . = ..() + charge_numbers += charge_number + START_PROCESSING(SSfastprocess, src) + GLOB.arc_emitters += src + build_chains() + +/obj/effect/abstract/arc_revolver/proc/build_chains() + for(var/obj/effect/abstract/arc_revolver/A in GLOB.arc_emitters) + if(A == src) + continue + for(var/chain in chains) + var/datum/beam/B = chain + if(B.target == A.loc) + continue + for(var/num1 in A.charge_numbers) + for(var/num2 in charge_numbers) + if(num1 - num2 == -1) //Don't ABS it, we only want one chain made, not 2. + var/dont = FALSE + for(var/datum/beam/B as anything in chains) + if(B.target == A.loc) + dont = TRUE + break + if(!dont && (A.loc in view(7, loc))) + chains += loc.Beam(A.loc, "lightning[rand(1, 12)]", 'icons/effects/effects.dmi', time = 10 SECONDS, maxdistance = 7, beam_type = /obj/effect/ebeam/chain) + + +/obj/effect/abstract/arc_revolver/Destroy() + STOP_PROCESSING(SSfastprocess, src) + GLOB.arc_emitters -= src + removechains() + return ..() + +/obj/effect/abstract/arc_revolver/process()// We want this to not be on crossed, or people fucking die when yeeted diagonally. We want this fast process to be faster, but not doing for loops every tick. Thus, every 3 fastproccesses + duration -= 2 // 5 ticks per second, second is 10 + if(duration <= 0) + qdel(src) + wait_for_three++ + if(wait_for_three >= 3) //Every 0.6 seconds. + wait_for_three = 0 + cleardeletedchains() + build_chains() + if(successfulshocks > 3) + successfulshocks = 0 + if(shockallchains()) + successfulshocks++ + +/obj/effect/abstract/arc_revolver/proc/shockallchains() + . = 0 + cleardeletedchains() + if(length(chains)) + for(var/chain in chains) + . += chainshock(chain) + +/obj/effect/abstract/arc_revolver/proc/chainshock(datum/beam/B) + . = 0 + var/list/turfs = list() + for(var/obj/effect/ebeam/chainpart as anything in B.elements) + if(chainpart && chainpart.x && chainpart.y && chainpart.z) + var/turf/T1 = get_turf_pixel(chainpart) + turfs |= T1 + if(T1 != get_turf(B.origin) && T1 != get_turf(B.target)) + for(var/turf/TU in circlerange(T1, 1)) + turfs |= TU + for(var/turf/T as anything in turfs) + for(var/mob/living/L in T) + if(L.stat != DEAD) + if(successfulshocks > 2) + L.visible_message( + "[L] was shocked by the lightning chain!", \ + "You are shocked by the lightning chain!", \ + "You hear a heavy electrical crack." \ + ) + var/damage = (2 - isliving(B.origin) + 2 - isliving(B.target)) //Damage is upped depending if the origin is a mob or not. Wall to wall hurts more than mob to wall, or mob to mob + L.adjustFireLoss(damage) //time to die + . = 1 + +/obj/effect/abstract/arc_revolver/proc/removechains() + if(length(chains)) + for(var/chain in chains) + qdel(chain) + + +/obj/effect/abstract/arc_revolver/proc/cleardeletedchains() + if(length(chains)) + for(var/chain in chains) + var/datum/cd = chain + if(!chain || QDELETED(cd)) + chains -= chain diff --git a/code/modules/research/designs/weapon_designs.dm b/code/modules/research/designs/weapon_designs.dm index 0a2908e62f8..7e3b39ddaed 100644 --- a/code/modules/research/designs/weapon_designs.dm +++ b/code/modules/research/designs/weapon_designs.dm @@ -179,10 +179,10 @@ build_path = /obj/item/ammo_box/magazine/wt550m9/wttx /datum/design/stunrevolver - name = "Tesla Revolver Parts Kit" - desc = "A kit for a high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers." + name = "Arc Revolver Parts Kit" + desc = "A high-tech revolver that fires internal, reusable shock cartridges in a revolving cylinder. The cartridges can be recharged using conventional rechargers. These shots charge whatever they hit, causing arcs of electricity to form between them." id = "stunrevolver" - req_tech = list("combat" = 4, "materials" = 4, "powerstorage" = 5) + req_tech = list("combat" = 7, "materials" = 6, "powerstorage" = 6) build_type = PROTOLATHE materials = list(MAT_METAL = 10000, MAT_GLASS = 10000, MAT_SILVER = 10000) build_path = /obj/item/weaponcrafting/gunkit/tesla