#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.tool_behaviour == TOOL_WELDER) 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