From 5197d1b62ab5283f1832e2f2b382b9f993109104 Mon Sep 17 00:00:00 2001
From: Qwertytoforty <52090703+Qwertytoforty@users.noreply.github.com>
Date: Fri, 17 Mar 2023 11:26:02 -0400
Subject: [PATCH] Completely reworks the tesla revolver (need to work on damage
values) (#20295)
* part one: the rest of a fucking owl
* kit
* shocking changes
Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
* Update code/modules/projectiles/projectile/energy.dm
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
* Update code/modules/projectiles/projectile/energy.dm
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
* Update energy_projectiles.dm
---------
Co-authored-by: SteelSlayer <42044220+SteelSlayer@users.noreply.github.com>
Co-authored-by: Henri215 <77684085+Henri215@users.noreply.github.com>
Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
---
code/_globalvars/lists/objects.dm | 1 +
code/game/mecha/equipment/weapons/weapons.dm | 2 +-
code/modules/crafting/guncrafting.dm | 6 +-
code/modules/crafting/recipes.dm | 4 +-
.../hostile/megafauna/ancient_robot.dm | 26 +++-
.../projectiles/ammunition/energy_lens.dm | 23 ++-
code/modules/projectiles/guns/energy/stun.dm | 8 +-
.../projectile/energy_projectiles.dm | 139 +++++++++++++++---
.../research/designs/weapon_designs.dm | 6 +-
9 files changed, 176 insertions(+), 39 deletions(-)
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