Files
Aurora.3/code/game/objects/items/shooting_range.dm
Fluffy c24b4c7097 Projectile refactoring madness (#19878)
Refactored the projectile code, mostly in line with TG's now.
Refactored various procs that are used or depends on it.
Projectiles can now ricochet if enabled to.
Damage falloffs with distance.
Homing projectiles can now have accuracy falloff with distance.
Projectiles have a maximum range.
Muzzle flash is configurable per projectile.
Impact effect of the projectile is configurable per projectile.
Accuracy decreases with distance.
Projectiles work with signals and emits them, for easy hooking up from
other parts of the code.
Meatshielding is now less effective .
Impact sound is now configurable per projectile.

High risk.
2024-09-23 10:12:57 +00:00

143 lines
4.2 KiB
Plaintext

#define DECAL_SCORCH 1
#define DECAL_BULLET 2
// Targets, the things that actually get shot!
/obj/item/target
name = "shooting target"
desc = "A shooting target."
icon = 'icons/obj/target_stake.dmi'
icon_state = "target_h"
var/obj/structure/target_stake/stake
var/hp = 1800
var/icon/virtual_icon
var/list/bullet_holes
/obj/item/target/Destroy()
if(stake)
stake.set_target(null)
return ..()
/obj/item/target/attackby(obj/item/attacking_item, mob/user)
if(attacking_item.iswelder())
if(hp == initial(hp))
to_chat(user, SPAN_NOTICE("\The [src] is fully repaired."))
return TRUE
var/obj/item/weldingtool/WT = attacking_item
if(WT.use(0, user))
ClearOverlays()
LAZYCLEARLIST(bullet_holes)
icon = initial(icon)
hp = initial(hp)
to_chat(user, SPAN_NOTICE("You slice off \the [src]'s uneven chunks of steel and scorch marks."))
return TRUE
/obj/item/target/attack_hand(var/mob/user)
// taking pinned targets off!
if(stake)
stake.attack_hand(user)
else
return ..()
/obj/item/target/syndicate
icon_state = "target_s"
desc = "A shooting target that looks like a hostile agent."
hp = 2600 // i guess syndie targets are sturdier?
/obj/item/target/alien
icon_state = "target_q"
desc = "A shooting target with a threatening silhouette."
hp = 2350 // alium onest too kinda
/obj/item/target/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit)
SHOULD_CALL_PARENT(FALSE) //Ancient coders deserve the rope
var/p_x = hitting_projectile.p_x + pick(0,0,0,0,0,-1,1) // really ugly way of coding "sometimes offset Proj.p_x!"
var/p_y = hitting_projectile.p_y + pick(0,0,0,0,0,-1,1)
var/decaltype = (hitting_projectile.damage_flags & DAMAGE_FLAG_BULLET) ? DECAL_BULLET : DECAL_SCORCH
virtual_icon = new(icon, icon_state)
if(virtual_icon.GetPixel(p_x, p_y)) // if the located pixel isn't blank (null)
hp -= hitting_projectile.damage
if(hp <= 0)
visible_message(SPAN_WARNING("\The [src] breaks into tiny pieces and collapses!"))
qdel(src)
return
// Create a temporary object to represent the damage
var/obj/bmark = new
bmark.pixel_x = p_x
bmark.pixel_y = p_y
bmark.icon = 'icons/effects/effects.dmi'
bmark.layer = ABOVE_OBJ_LAYER
bmark.icon_state = "scorch"
if(decaltype == DECAL_SCORCH) // Energy weapons are hot. they scorch!
// offset correction
bmark.pixel_x--
bmark.pixel_y--
if(hitting_projectile.damage >= 20 || istype(hitting_projectile, /obj/projectile/beam/practice))
bmark.icon_state = "scorch"
bmark.set_dir(pick(NORTH,SOUTH,EAST,WEST)) // random scorch design
else
bmark.icon_state = "light_scorch"
else // Bullets are hard. They make dents!
bmark.icon_state = "dent"
if(hitting_projectile.damage >= 10 && length(bullet_holes) <= 35) // maximum of 35 bullet holes
if(decaltype == DECAL_BULLET)
if(prob(hitting_projectile.damage+30)) // bullets make holes more commonly!
new /datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole
else // Lasers!
if(prob(hitting_projectile.damage-10)) // lasers make holes less commonly
new /datum/bullethole(src, bmark.pixel_x, bmark.pixel_y) // create new bullet hole
// draw bullet holes
for(var/datum/bullethole/B in bullet_holes)
virtual_icon.DrawBox(null, B.b1x1, B.b1y, B.b1x2, B.b1y) // horizontal line, left to right
virtual_icon.DrawBox(null, B.b2x, B.b2y1, B.b2x, B.b2y2) // vertical line, top to bottom
AddOverlays(bmark) // add the decal
icon = virtual_icon // apply bullet_holes over decals
return
return BULLET_ACT_HIT // the bullet/projectile goes through the target!
// Small memory holder entity for transparent bullet holes
/datum/bullethole
// First box
var/b1x1 = 0
var/b1x2 = 0
var/b1y = 0
// Second box
var/b2x = 0
var/b2y1 = 0
var/b2y2 = 0
/datum/bullethole/New(var/obj/item/target/Target, var/pixel_x = 0, var/pixel_y = 0)
if(!Target)
return
// Randomize the first box
b1x1 = pixel_x - pick(1,1,1,1,2,2,3,3,4)
b1x2 = pixel_x + pick(1,1,1,1,2,2,3,3,4)
b1y = pixel_y
if(prob(35))
b1y += rand(-4,4)
// Randomize the second box
b2x = pixel_x
if(prob(35))
b2x += rand(-4,4)
b2y1 = pixel_y + pick(1,1,1,1,2,2,3,3,4)
b2y2 = pixel_y - pick(1,1,1,1,2,2,3,3,4)
LAZYADD(Target.bullet_holes, src)
#undef DECAL_SCORCH
#undef DECAL_BULLET