mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-26 13:37:58 +01:00
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>
This commit is contained in:
co-authored by
SteelSlayer
Henri215
Ryan
parent
66831d6a8a
commit
5197d1b62a
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(
|
||||
"<span class='danger'>[L] was shocked by the lightning chain!</span>", \
|
||||
"<span class='userdanger'>You are shocked by the lightning chain!</span>", \
|
||||
"<span class='italics'>You hear a heavy electrical crack.</span>" \
|
||||
)
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user