/obj/item/projectile/bullet name = "bullet" icon_state = "bullet" damage = 60 damage_type = BRUTE nodamage = 0 flag = "bullet" embed = 1 sharp = 1 /obj/item/projectile/bullet/on_hit(var/atom/target, var/blocked = 0) if (..(target, blocked)) var/mob/living/L = target shake_camera(L, 3, 2) /obj/item/projectile/bullet/on_penetrate(var/atom/A) if(!A) return 1 //if whatever it was got destroyed when we hit it, then I guess we can just keep going if(istype(A, /obj/mecha)) return 1 //mecha have their own penetration handling if(ismob(A)) if(iscarbon(A)) //squishy mobs absorb KE if (damage <= 20) return 0 damage *= 0.7 return 1 if(istype(A, /obj/machinery) || istype(A, /obj/structure)) var/chance = 15 if(istype(A, /turf/simulated/wall)) var/turf/simulated/wall/W = A chance = round(damage/W.damage_cap*100) else if(istype(A, /obj/machinery/door)) var/obj/machinery/door/D = A chance = round(damage/D.maxhealth*100) else if(istype(A, /obj/structure/girder) || istype(A, /obj/structure/cultgirder)) chance = 100 if(prob(chance)) if(A.opacity) //display a message so that people on the other side aren't so confused A.visible_message("\The [src] pierces through \the [A]!") return 1 return 0 //For projectiles that actually represent clouds of projectiles /obj/item/projectile/bullet/pellet name = "shrapnel" //'shrapnel' sounds more dangerous (i.e. cooler) than 'pellet' damage = 20 //icon_state = "bullet" //TODO: would be nice to have it's own icon state var/pellets = 4 //number of pellets var/range_step = 2 //effective pellet count decreases every few tiles var/base_spread = 90 //lower means the pellets spread more across body parts var/spread_step = 10 //higher means the pellets spread more across body parts with distance /obj/item/projectile/bullet/pellet/Bumped() . = ..() bumped = 0 //can hit all mobs in a tile. pellets is decremented inside attack_mob so this should be fine. /obj/item/projectile/bullet/pellet/attack_mob(var/mob/living/target_mob, var/distance) if (pellets < 0) return 1 var/pellet_loss = round((distance - 1)/range_step) //pellets lost due to distance var/total_pellets = max(pellets - pellet_loss, 1) var/spread = max(base_spread - (spread_step*distance), 0) var/hits = 0 for (var/i in 1 to total_pellets) //pellet hits spread out across different zones, but 'aim at' the targeted zone with higher probability //whether the pellet actually hits the def_zone or a different zone should still be determined by the parent using get_zone_with_miss_chance(). var/old_zone = def_zone def_zone = ran_zone(def_zone, spread) if (..()) hits++ def_zone = old_zone //restore the original zone the projectile was aimed at pellets -= hits //each hit reduces the number of pellets left if (hits >= total_pellets || pellets <= 0) return 1 return 0 /* short-casing projectiles, like the kind used in pistols or SMGs */ /obj/item/projectile/bullet/pistol damage = 20 /obj/item/projectile/bullet/pistol/medium damage = 25 /obj/item/projectile/bullet/pistol/strong //revolvers and matebas damage = 60 /obj/item/projectile/bullet/pistol/rubber //"rubber" bullets name = "rubber bullet" damage = 10 agony = 40 embed = 0 sharp = 0 /* shotgun projectiles */ /obj/item/projectile/bullet/shotgun name = "slug" damage = 60 /obj/item/projectile/bullet/shotgun/beanbag //because beanbags are not bullets name = "beanbag" damage = 20 agony = 60 embed = 0 sharp = 0 //Should do about 80 damage at 1 tile distance (adjacent), and 50 damage at 3 tiles distance. //Overall less damage than slugs in exchange for more damage at very close range and more embedding /obj/item/projectile/bullet/pellet/shotgun name = "shrapnel" damage = 13 pellets = 6 range_step = 1 spread_step = 10 /* "Rifle" rounds */ /obj/item/projectile/bullet/rifle/a762 damage = 25 /obj/item/projectile/bullet/rifle/a145 damage = 90 penetrating = 5 /* Miscellaneous */ /obj/item/projectile/bullet/suffocationbullet//How does this even work? name = "co bullet" damage = 20 damage_type = OXY /obj/item/projectile/bullet/cyanideround name = "poison bullet" damage = 40 damage_type = TOX /obj/item/projectile/bullet/burstbullet name = "exploding bullet" damage = 20 embed = 0 edge = 1 /obj/item/projectile/bullet/gyro/on_hit(var/atom/target, var/blocked = 0) if(isturf(target)) explosion(target, -1, 0, 2) ..() /obj/item/projectile/bullet/blank invisibility = 101 damage = 1 embed = 0 /obj/item/projectile/bullet/chameleon damage = 1 // stop trying to murderbone with a fake gun dumbass!!! embed = 0 // nope