Files
2020-02-19 19:48:29 -08:00

1140 lines
29 KiB
Plaintext

/datum/projectile/bullet
//How much of a punch this has, tends to be seconds/damage before any resist
power = 45
//How much ammo this costs
cost = 1
//How fast the power goes away
dissipation_rate = 5
//How many tiles till it starts to lose power
dissipation_delay = 5
//Kill/Stun ratio
ks_ratio = 1.0
//name of the projectile setting, used when you change a guns setting
sname = "single shot"
//file location for the sound you want it to play
shot_sound = 'sound/weapons/Gunshot.ogg'
//How many projectiles should be fired, each will cost the full cost
shot_number = 1
// caliber list: update as needed
// 0.22 pistol / zipgun
// 0.308 - rifles
// 0.357 - revolver
// 0.38 - detective
// 0.41 - derringer
// 0.72 - shotgun shell, 12ga
// 1.57 - grenade shell, 40mm
// 1.58 - RPG-7 (Tube is 40mm too, though warheads are usually larger in diameter.)
//What is our damage type
/*
kinetic - raw power
piercing - punches though things
slashing - cuts things
energy - energy
burning - hot
radioactive - rips apart cells or some shit
toxic - poisons
*/
damage_type = D_KINETIC
// blood system damage type - DAMAGE_STAB, DAMAGE_CUT, DAMAGE_BLUNT
hit_type = DAMAGE_CUT
//With what % do we hit mobs laying down
hit_ground_chance = 33
//Can we pass windows
window_pass = 0
implanted = /obj/item/implant/projectile
// we create this overlay on walls when we hit them
icon_turf_hit = "bhole"
hit_mob_sound = 'sound/impact_sounds/Flesh_Stab_2.ogg'
//Any special things when it hits shit?
on_hit(atom/hit, direction, projectile)
if (ishuman(hit) && src.hit_type)
take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type) // oh god no why was the first var set to src what was I thinking
..()//uh, what the fuck, call your parent
//return // BULLETS CANNOT BLEED, HAINE
/datum/projectile/bullet/bullet_22
name = "bullet"
power = 22
shot_sound = 'sound/machines/click.ogg'
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
implanted = /obj/item/implant/projectile/bullet_22
casing = /obj/item/casing/small
caliber = 0.22
icon_turf_hit = "bhole-small"
silentshot = 1 // It's supposed to be a stealth weapon, right (Convair880)?
/datum/projectile/bullet/bullet_9mm
name = "bullet"
power = 25
shot_sound = 'sound/weapons/smg_shot.ogg'
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
implanted = /obj/item/implant/projectile/bullet_22
casing = /obj/item/casing/small
caliber = 0.355
icon_turf_hit = "bhole-small"
smg
power = 20
/datum/projectile/bullet/custom
name = "bullet"
power = 1
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
implanted = /obj/item/implant/projectile/bullet_22
casing = /obj/item/casing/small
caliber = 0.22
icon_turf_hit = "bhole-small"
/datum/projectile/bullet/revolver_357
name = "bullet"
power = 60 // okay this can be made worse again now that crit isn't naptime
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
implanted = /obj/item/implant/projectile/bullet_357
caliber = 0.357
icon_turf_hit = "bhole-small"
casing = /obj/item/casing/medium
/datum/projectile/bullet/revolver_357/AP
power = 50
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
implanted = /obj/item/implant/projectile/bullet_357AP
/datum/projectile/bullet/staple
name = "staple"
power = 5
damage_type = D_KINETIC // don't staple through armor
hit_type = DAMAGE_BLUNT
implanted = /obj/item/implant/projectile/staple // HEH
shot_sound = 'sound/impact_sounds/Generic_Snap_1.ogg'
icon_turf_hit = "bhole-staple"
casing = null
/datum/projectile/bullet/revolver_38
name = "bullet"
power = 35
ks_ratio = 1.0
implanted = /obj/item/implant/projectile/bullet_38
caliber = 0.38
icon_turf_hit = "bhole-small"
casing = /obj/item/casing/medium
/datum/projectile/bullet/revolver_38/AP//traitor det revolver
power = 50
implanted = /obj/item/implant/projectile/bullet_38AP
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
/datum/projectile/bullet/revolver_45
name = "bullet"
power = 35
ks_ratio = 1.0
hit_type = DAMAGE_CUT
implanted = /obj/item/implant/projectile/bullet_45
caliber = 0.45
icon_turf_hit = "bhole-small"
casing = /obj/item/casing/medium
/datum/projectile/bullet/nine_mm_NATO
name = "bullet"
shot_sound = 'sound/weapons/9x19NATO.ogg'
power = 6
ks_ratio = 0.9
dissipation_rate = 2
dissipation_delay = 8
projectile_speed = 36
caliber = 0.355
icon_turf_hit = "bhole-small"
implanted = /obj/item/implant/projectile/bullet_nine_mm_NATO
casing = /obj/item/casing/small
/datum/projectile/bullet/nine_mm_NATO/burst
shot_number = 3
cost = 3
sname = "burst fire"
/datum/projectile/bullet/rifle_3006
name = "bullet"
power = 100
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
implanted = /obj/item/implant/projectile/bullet_308
shot_sound = 'sound/weapons/railgun.ogg'
dissipation_delay = 10
casing = /obj/item/casing/rifle
caliber = 0.308
icon_turf_hit = "bhole-small"
on_hit(atom/hit, dirflag, obj/projectile/proj)
if(ishuman(hit))
var/mob/living/carbon/human/M = hit
if(proj.power > 40)
#ifdef USE_STAMINA_DISORIENT
M.do_disorient(75, weakened = 40, stunned = 40, disorient = 60, remove_stamina_below_zero = 0)
#else
M.changeStatus("stunned", 4 SECONDS)
M.changeStatus("weakened", 3 SECONDS)
#endif
if(proj.power > 80)
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
M.throw_at(target, 2, 2, throw_type = THROW_GUNIMPACT)
if (src.hit_type)
take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type)
impact_image_effect("K", hit)
/datum/projectile/bullet/rifle_762_NATO //like .308 but military
name = "bullet"
power = 80
icon_state = "sniper_bullet"
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
implanted = /obj/item/implant/projectile/bullet_308
shot_sound = 'sound/weapons/railgun.ogg'
dissipation_delay = 15
casing = /obj/item/casing/rifle
caliber = 0.308
icon_turf_hit = "bhole-small"
on_hit(atom/hit, dirflag)
if(ishuman(hit))
var/mob/living/carbon/human/M = hit
if(power > 40)
#ifdef USE_STAMINA_DISORIENT
M.do_disorient(75, weakened = 40, stunned = 40, disorient = 60, remove_stamina_below_zero = 0)
#else
M.changeStatus("stunned", 4 SECONDS)
M.changeStatus("weakened", 3 SECONDS)
#endif
if(power > 60)
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
M.throw_at(target, 3, 3, throw_type = THROW_GUNIMPACT)
if (src.hit_type)
take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type)
/datum/projectile/bullet/tranq_dart
name = "dart"
power = 10
icon = 'icons/obj/chemical.dmi'
icon_state = "syringeproj"
damage_type = D_TOXIC
hit_type = DAMAGE_BLUNT
implanted = null
shot_sound = 'sound/effects/syringeproj.ogg'
dissipation_delay = 10
caliber = 0.308
reagent_payload = "haloperidol"
casing = /obj/item/casing/rifle
on_hit(atom/hit, dirflag)
return
syndicate
reagent_payload = "sodium_thiopental" // HEH
pistol
caliber = 0.355
casing = /obj/item/casing/small
shot_sound = 'sound/weapons/tranq_pistol.ogg'
//haha gannets, fuck you I stole ur shit! - kyle
law_giver
caliber = 0.355
casing = /obj/item/casing/small
shot_sound = 'sound/weapons/tranq_pistol.ogg'
anti_mutant
reagent_payload = "mutadone" // HAH
/datum/projectile/bullet/revolver_38/stunners//energy bullet things so he can actually stun something
name = "stun bullet"
power = 20
ks_ratio = 0.0
damage_type = D_ENERGY // FUCK YOU.
hit_type = null
icon_turf_hit = null // stun bullets shouldn't actually enter walls should they?
/* this is now handled in the projectile parent on_hit for all ks_ratio 0.0 weapons.
on_hit(atom/hit) // adding this so these work like taser shots I guess, if this sucks feel free to remove it
if (ishuman(hit))
var/mob/living/carbon/human/H = hit
H.changeStatus("slowed", power)
H.change_misstep_chance(5)
H.emote("twitch_v")
if (H.getStatusDuration("slowed") > power)
H.changeStatus("stunned", power)
return*/
on_pointblank(var/obj/projectile/P, var/mob/living/M)
stun_bullet_hit(P, M)
impact_image_effect("T", M)
/datum/projectile/bullet/derringer
name = "bullet"
shot_sound = 'sound/weapons/derringer.ogg'
power = 125
dissipation_delay = 1
dissipation_rate = 25
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
implanted = /obj/item/implant/projectile/bullet_41
ks_ratio = 0.5
caliber = 0.41
icon_turf_hit = "bhole"
casing = /obj/item/casing/derringer
on_hit(atom/hit)
if(ismob(hit) && hasvar(hit, "stunned"))
hit:stunned += 5
if (ishuman(hit))
if (src.hit_type)
take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type)
impact_image_effect("K", hit)
return
/datum/projectile/bullet/a12
name = "buckshot"
shot_sound = 'sound/weapons/shotgunshot.ogg'
power = 70
ks_ratio = 1.0
dissipation_delay = 3//2
dissipation_rate = 20
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
caliber = 0.72 // roughly
icon_turf_hit = "bhole"
implanted = /obj/item/implant/projectile/bullet_12ga
casing = /obj/item/casing/shotgun_red
on_hit(atom/hit, dirflag, obj/projectile/proj)
if (ishuman(hit))
var/mob/living/carbon/human/M = hit
if(proj.power > 30)
#ifdef USE_STAMINA_DISORIENT
M.do_disorient(75, weakened = 50, stunned = 50, disorient = 30, remove_stamina_below_zero = 0)
#else
M.changeStatus("stunned", 50)
M.changeStatus("weakened", 5 SECONDS)
#endif
if(proj.power > 70)
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
if(!M.stat) M.emote("scream")
M.throw_at(target, 6, 2, throw_type = THROW_GUNIMPACT)
if (src.hit_type)
take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type)
weak
power = 30
/datum/projectile/bullet/airzooka
name = "airburst"
shot_sound = 'sound/weapons/airzooka.ogg'
power = 0
ks_ratio = 1.0
icon = 'icons/obj/projectiles.dmi'
icon_state = "crescent_white"
dissipation_delay = 6
dissipation_rate = 5
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
icon_turf_hit = "bhole"
implanted = null
casing = null
cost = 1
on_hit(atom/hit, dirflag)
if (ishuman(hit))
var/mob/living/carbon/human/M = hit
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
if(!M.stat) M.emote("scream")
M.do_disorient(15, weakened = 10)
M.throw_at(target, 6, 3, throw_type = THROW_GUNIMPACT)
/datum/projectile/bullet/airzooka/bad
name = "plasmaburst"
shot_sound = 'sound/weapons/airzooka.ogg'
power = 15
ks_ratio = 1.0
icon = 'icons/obj/projectiles.dmi'
icon_state = "crescent_white"
dissipation_delay = 6
dissipation_rate = 5
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
icon_turf_hit = "bhole"
implanted = null
casing = null
cost = 2
on_hit(atom/hit, dirflag)
if (ishuman(hit))
var/mob/living/carbon/human/M = hit
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
if(!M.stat) M.emote("scream")
fireflash(get_turf(M), 2)
M.do_disorient(15, weakened = 25)
M.throw_at(target, 12, 3, throw_type = THROW_GUNIMPACT)
/datum/projectile/bullet/aex
name = "explosive slug"
shot_sound = 'sound/weapons/shotgunshot.ogg'
power = 35 // the damage should be more from the explosion
ks_ratio = 1.0
dissipation_delay = 6
dissipation_rate = 10
implanted = null
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
caliber = 0.72
icon_turf_hit = "bhole"
casing = /obj/item/casing/shotgun_orange
on_hit(atom/hit)
explosion_new(null, get_turf(hit), 1)
lawgiver
name = "lawgiver"
power = 1
cost = 150
on_hit(atom/hit)
explosion_new(null, get_turf(hit), 3)
/datum/projectile/bullet/abg
name = "rubber slug"
shot_sound = 'sound/weapons/shotgunshot.ogg'
power = 24
ks_ratio = 0.2
dissipation_rate = 4
dissipation_delay = 3
implanted = null
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
caliber = 0.72
icon_turf_hit = "bhole"
casing = /obj/item/casing/shotgun_blue
on_hit(atom/hit, dirflag, obj/projectile/proj)
if (ishuman(hit))
var/mob/living/carbon/human/M = hit
if(proj.power >= 16)
var/throw_range = (proj.power > 20) ? 5 : 3
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
if(!M.stat) M.emote("scream")
M.throw_at(target, throw_range, 1, throw_type = THROW_GUNIMPACT)
M.update_canmove()
//if (src.hit_type)
// impact_image_effect("K", hit)
//take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type)
/datum/projectile/bullet/minigun
name = "bullet"
shot_sound = 'sound/weapons/minigunshot.ogg'
power = 8
cost = 10
shot_number = 10
shot_delay = 0.7
dissipation_delay = 7
ks_ratio = 1.0
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
caliber = 0.308
icon_turf_hit = "bhole-small"
implanted = /obj/item/implant/projectile/bullet_308
casing = /obj/item/casing/rifle
/datum/projectile/bullet/minigun/turret
power = 15
dissipation_delay = 8
/datum/projectile/bullet/lmg
name = "bullet"
shot_sound = 'sound/weapons/minigunshot.ogg'
power = 12
cost = 8
shot_number = 8
shot_delay = 0.7
dissipation_delay = 12
ks_ratio = 1.0
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
caliber = 0.308
icon_turf_hit = "bhole-small"
implanted = /obj/item/implant/projectile/bullet_308
casing = /obj/item/casing/rifle
on_hit(atom/hit, dirflag)
if(ishuman(hit))
var/mob/living/carbon/human/M = hit
M.changeStatus("slowed", 1.5 SECONDS)
/datum/projectile/bullet/lmg/weak
power = 1
cost = 2
shot_number = 16
shot_delay = 0.7
dissipation_delay = 8
nomsg = 1
/datum/projectile/bullet/ak47
name = "bullet"
shot_sound = 'sound/weapons/ak47shot.ogg'
power = 40
cost = 3
ks_ratio = 1.0
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
shot_number = 3
caliber = 0.308
icon_turf_hit = "bhole-small"
implanted = /obj/item/implant/projectile/bullet_308
casing = /obj/item/casing/rifle
/datum/projectile/bullet/assault_rifle
name = "bullet"
shot_sound = 'sound/weapons/ak47shot.ogg'
power = 30
cost = 1
ks_ratio = 1.0
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
shot_number = 1
caliber = 0.223
icon_turf_hit = "bhole-small"
implanted = /obj/item/implant/projectile/bullet_308
casing = /obj/item/casing/rifle
armor_piercing
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
/*
/datum/projectile/bullet/revolver_357/AP
power = 50
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
implanted = /obj/item/implant/projectile/bullet_357AP
*/
/datum/projectile/bullet/vbullet
name = "virtual bullet"
shot_sound = 'sound/weapons/Gunshot.ogg'
power = 10
cost = 1
ks_ratio = 1.0
damage_type = D_KINETIC
hit_type = DAMAGE_CUT
implanted = null
casing = null
icon_turf_hit = null
/datum/projectile/bullet/flare
name = "flare"
shot_sound = 'sound/weapons/flaregun.ogg'
power = 20
cost = 1
ks_ratio = 1.0
damage_type = D_BURNING
hit_type = null
brightness = 1
color_red = 1
color_green = 0.3
color_blue = 0
icon_state = "flare"
implanted = null
caliber = 0.72 // 12 guage
icon_turf_hit = "bhole"
casing = /obj/item/casing/shotgun_orange
on_hit(atom/hit)
if (isliving(hit))
fireflash(get_turf(hit), 0)
else if (isturf(hit))
fireflash(hit, 0)
else
fireflash(get_turf(hit), 0)
/datum/projectile/bullet/flare/UFO
name = "heat beam"
window_pass = 1
icon_state = "plasma"
casing = null
/datum/projectile/bullet/shrapnel // cogwerks: for explosions
name = "shrapnel"
power = 10
damage_type = D_PIERCING
hit_type = DAMAGE_CUT
window_pass = 0
icon = 'icons/obj/scrap.dmi'
icon_state = "2metal0"
casing = null
icon_turf_hit = "bhole-staple"
/datum/projectile/bullet/autocannon
name = "HE grenade"
window_pass = 0
icon_state = "40mmR"
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
power = 25
dissipation_delay = 30
cost = 1
shot_sound = 'sound/weapons/rocket.ogg'
ks_ratio = 1.0
caliber = 1.57 // 40mm grenade shell
icon_turf_hit = "bhole-large"
casing = /obj/item/casing/grenade
on_hit(atom/hit)
explosion_new(null, get_turf(hit), 12)
plasma_orb
name = "fusion orb"
damage_type = D_BURNING
hit_type = null
icon_state = "fusionorb"
implanted = null
brightness = 0.8
color_red = 1
color_green = 0.6
color_blue = 0.2
power = 50
shot_sound = 'sound/machines/engine_alert3.ogg'
icon_turf_hit = null
casing = null
huge
icon_state = "400mm"
power = 100
caliber = 15.7
icon_turf_hit = "bhole-large"
on_hit(atom/hit)
explosion_new(null, get_turf(hit), 80)
seeker
name = "drone-seeking grenade"
var/max_turn_rate = 20
var/type_to_seek = /obj/critter/gunbot/drone //what are we going to seek
precalculated = 0
on_launch(var/obj/projectile/P)
var/D = locate(type_to_seek) in range(15, P)
if (D)
P.data = D
tick(var/obj/projectile/P)
if (!P)
return
if (!P.loc)
return
if (!P.data)
return
var/obj/D = P.data
if (!istype(D))
return
var/turf/T = get_turf(D)
var/turf/S = get_turf(P)
if (!T || !S)
return
var/STx = T.x - S.x
var/STy = T.y - S.y
var/STlen = STx * STx + STy * STy
if (!STlen)
return
STlen = sqrt(STlen)
STx /= STlen
STy /= STlen
var/dot = STx * P.xo + STy * P.yo
var/det = STx * P.yo - STy * P.xo
var/sign = -1
if (det <= 0)
sign = 1
var/relang = arccos(dot)
P.rotateDirection(max(-max_turn_rate, min(max_turn_rate, sign * relang)))
pod_seeking
name = "pod-seeking grenade"
type_to_seek = /obj/machinery/vehicle
ghost
name = "pod-seeking grenade"
type_to_seek = /mob/dead/observer
/datum/projectile/bullet/grenade_round
name = "40mm round"
window_pass = 0
icon_state = "40mmR"
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
power = 5
dissipation_delay = 30
cost = 1
shot_sound = 'sound/weapons/launcher.ogg'
ks_ratio = 1.0
caliber = 1.57
icon_turf_hit = "bhole-large"
casing = /obj/item/casing/grenade
explosive
name = "40mm HEDP round"
on_hit(atom/hit)
explosion_new(null, get_turf(hit),4,2)
high_explosive //more powerful than HEDP
name = "40mm HE round"
power = 10
on_hit(atom/hit)
explosion_new(null,get_turf(hit),10)
// Ported from old, non-gun RPG-7 object class (Convair880).
/datum/projectile/bullet/rpg
name = "MPRT rocket"
window_pass = 0
icon = 'icons/obj/projectiles.dmi'
icon_state = "rpg_rocket"
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
power = 40
dissipation_delay = 30
cost = 1
shot_sound = 'sound/weapons/rocket.ogg'
ks_ratio = 1.0
caliber = 1.58
icon_turf_hit = "bhole-large"
on_hit(atom/hit)
var/turf/T = get_turf(hit)
if (T)
for (var/mob/living/carbon/human/M in view(hit, 2))
if (istype(M.wear_suit, /obj/item/clothing/suit/armor))
boutput(M, "<span style=\"color:red\">Your armor blocks the shrapnel!</span>")
M.TakeDamage("chest", 5, 0)
else
M.TakeDamage("chest", 15, 0)
var/obj/item/implant/projectile/shrapnel/implanted = new /obj/item/implant/projectile/shrapnel(M)
implanted.owner = M
M.implant += implanted
implanted.implanted(M, null, 2)
boutput(M, "<span style=\"color:red\">You are struck by shrapnel!</span>")
if (!M.stat)
M.emote("scream")
T.hotspot_expose(700,125)
explosion_new(null, T, 30, 0.5)
return
/obj/smokeDummy
name = ""
desc = ""
invisibility = 101
anchored = 1
density = 0
opacity = 0
var/list/affected = list()
disposing()
remove()
return ..()
New(var/atom/sloc)
if(!sloc) return
src.loc = sloc
for(var/mob/M in src.loc)
Crossed(M)
return ..()
proc/remove()
for(var/mob/M in affected)
M.removeOverlayComposition(/datum/overlayComposition/smoke)
M.updateOverlaysClient(M.client)
affected.Cut()
return
Crossed(atom/movable/O)
if(ishuman(O) && prob(30))
var/mob/living/carbon/human/H = O
if (H.internal != null && H.wear_mask && (H.wear_mask.c_flags & MASKINTERNALS))
else
H.emote("cough")
if (prob(20)) //remove this maybe. it shoudla been stunning, but has been broken since the status system updates.
H.setStatus("stunned",max(H.getStatusDuration("stunned"), 20))
if(ismob(O))
var/mob/M = O
if (M.client && !isobserver(M) && !iswraith(M) && !isintangible(M)) // fuck you stop affecting ghosts FUCK YOU
M.addOverlayComposition(/datum/overlayComposition/smoke)
M.updateOverlaysClient(M.client)
affected.Add(O)
return ..()
Uncrossed(atom/movable/O)
if(ismob(O))
var/mob/M = O
if (M.client && !isobserver(M) && !iswraith(M) && !isintangible(M)) // FUCK YOU
if(!(locate(/obj/smokeDummy) in M.loc))
M.removeOverlayComposition(/datum/overlayComposition/smoke)
M.updateOverlaysClient(M.client)
affected.Remove(M)
return ..()
/datum/projectile/bullet/smoke
name = "smoke grenade"
window_pass = 0
icon_state = "40mmB"
damage_type = D_KINETIC
power = 25
dissipation_delay = 10
cost = 1
shot_sound = 'sound/weapons/launcher.ogg'
ks_ratio = 1.0
caliber = 1.57 // 40mm grenade shell
icon_turf_hit = "bhole-large"
casing = /obj/item/casing/grenade
var/list/smokeLocs = list()
var/smokeLength = 100
proc/startSmoke(atom/hit, dirflag, atom/projectile)
/*var/turf/trgloc = get_turf(projectile)
var/list/affected = block(locate(trgloc.x - 3,trgloc.y - 3,trgloc.z), locate(trgloc.x + 3,trgloc.y + 3,trgloc.z))
if(!affected.len) return
var/list/centerview = view(world.view, trgloc)
for(var/atom/A in affected)
if(!(A in centerview)) continue
var/obj/smokeDummy/D = new(A)
smokeLocs.Add(D)
SPAWN_DBG(smokeLength) qdel(D)
particleMaster.SpawnSystem(new/datum/particleSystem/areaSmoke("#ffffff", smokeLength, trgloc))
return*/
// I'm so tired of overlays freezing my client, sorry. Get rid of the old smoke call here once
// the performance and issues of full-screen overlays have been resolved, I guess (Convair880).
var/turf/T = get_turf(projectile)
if (T && isturf(T))
var/datum/effects/system/bad_smoke_spread/S = new /datum/effects/system/bad_smoke_spread/(T)
if (S)
S.set_up(20, 0, T)
S.start()
return
on_hit(atom/hit, dirflag, atom/projectile)
startSmoke(hit, dirflag, projectile)
return
/datum/projectile/bullet/glitch
name = "bullet"
window_pass = 1
icon_state = "glitchproj"
damage_type = D_KINETIC
hit_type = null
power = 30
dissipation_delay = 12
cost = 1
shot_sound = 'sound/effects/glitchshot.ogg'
ks_ratio = 1.0
casing = null
icon_turf_hit = null
New()
..()
src.name = pick("weird", "puzzling", "odd", "strange", "baffling", "creepy", "unusual", "confusing", "discombobulating") + " bullet"
src.name = corruptText(src.name, 66)
on_hit(atom/hit)
hit.icon_state = pick(icon_states(hit.icon))
for(var/atom/a in hit)
a.icon_state = pick(icon_states(a.icon))
playsound(hit, "sound/machines/glitch3.ogg", 50, 1)
/datum/projectile/bullet/glitch/gun
power = 1
/datum/projectile/bullet/rod // for the coilgun
name = "metal rod"
power = 50
damage_type = D_KINETIC
hit_type = DAMAGE_STAB
window_pass = 0
icon_state = "rod_1"
dissipation_delay = 25
caliber = 1.0
shot_sound = 'sound/weapons/ACgun2.ogg'
casing = null
icon_turf_hit = "bhole-large"
on_hit(atom/hit)
explosion_new(null, get_turf(hit), 5)
/datum/projectile/bullet/frog/ //sorry for making this, players -ZeWaka
name = "green splat" //thanks aibm for wording this beautifully
window_pass = 0
icon_state = "acidspit"
hit_type = null
damage_type = 0
power = 0
dissipation_delay = 12
sname = "Get In"
shot_sound = 'sound/weapons/ribbit.ogg' //heh
casing = null
icon_turf_hit = null
New()
..()
on_hit(atom/hit)
hit.UpdateOverlays(image('icons/misc/frogs.dmi', "icon_state" = "getin"), "getin") //why did i code this
/datum/projectile/bullet/frog/getout
sname = "Get Out"
on_hit(atom/hit)
hit.UpdateOverlays(image('icons/misc/frogs.dmi', "icon_state" = "getout"), "getout") //its like im trying to intentionally torture players
/datum/projectile/bullet/flak_chunk
name = "flak chunk"
sname = "flak chunk"
icon_state = "trace"
shot_sound = null
power = 12
dissipation_rate = 5
dissipation_delay = 8
damage_type = D_KINETIC
/datum/projectile/bullet/buckshot // buckshot pellets generates by shotguns
name = "buckshot"
sname = "buckshot"
icon_state = "trace"
power = 6
dissipation_rate = 5
dissipation_delay = 3
damage_type = D_KINETIC
/datum/projectile/bullet/grenade_shell
name = "40mm grenade conversion shell"
window_pass = 0
icon_state = "40mmR"
damage_type = D_KINETIC
power = 25
dissipation_delay = 20
cost = 1
shot_sound = 'sound/weapons/rocket.ogg'
ks_ratio = 1.0
caliber = 1.57 // 40mm grenade shell
icon_turf_hit = "bhole-large"
casing = /obj/item/casing/grenade
var/has_grenade = 0
var/obj/item/chem_grenade/CHEM = null
var/obj/item/old_grenade/OLD = null
var/has_det = 0 //have we detonated a grenade yet?
proc/get_nade()
if (src.has_grenade != 0)
if (src.CHEM != null)
return src.CHEM
else if (src.OLD != null)
return src.OLD
else
return null
else
return null
proc/load_nade(var/obj/item/W)
if (W)
if (src.has_grenade == 0)
if (istype(W,/obj/item/chem_grenade))
src.CHEM = W
src.has_grenade = 1
return 1
else if (istype(W, /obj/item/old_grenade))
src.OLD = W
src.has_grenade = 1
return 1
else
return 0
else
return 0
else
return 0
proc/unload_nade(var/turf/T)
if (src.has_grenade !=0)
if (src.CHEM != null)
if (T)
src.CHEM.loc = T
src.CHEM = null
src.has_grenade = 0
return 1
else if (src.OLD != null)
if (T)
src.OLD.loc = T
src.OLD = null
src.has_grenade = 0
return 1
else //how did this happen?
return 0
else
return 0
proc/det(var/turf/T)
if (T && src.has_det == 0 && src.has_grenade != 0)
if (src.CHEM != null)
src.CHEM.loc = T
src.has_det = 1
SPAWN_DBG(1 DECI SECOND)
src.CHEM.explode()
src.has_grenade = 0
return
else if (src.OLD != null)
src.OLD.loc = T
src.has_det = 1
SPAWN_DBG(1 DECI SECOND)
src.OLD.prime()
src.has_grenade = 0
return
else //what the hell happened
return
else
return
on_hit(atom/hit, angle, obj/projectile/O)
var/turf/T = get_turf(hit)
if (T)
src.det(T)
else if (O)
var/turf/pT = get_turf(O)
if (pT)
src.det(pT)
return ..()
on_end(obj/projectile/O)
if (O && src.has_det == 0)
var/turf/T = get_turf(O)
if (T)
src.det(T)
else if (O)
src.has_det = 0
/datum/projectile/bullet/flintlock
name = "bullet"
power = 110
damage_type = D_PIERCING
hit_type = DAMAGE_STAB
implanted = /obj/item/implant/projectile/flintlock
shot_sound = 'sound/weapons/flintlock.ogg'
dissipation_delay = 10
casing = null
caliber = 0.58
icon_turf_hit = "bhole-small"
on_hit(atom/hit, dirflag)
if(ishuman(hit))
var/mob/living/carbon/human/M = hit
if(power > 40)
#ifdef USE_STAMINA_DISORIENT
M.do_disorient(75, weakened = 40, stunned = 40, disorient = 60, remove_stamina_below_zero = 0)
#else
M.changeStatus("stunned", 4 SECONDS)
M.changeStatus("weakened", 3 SECONDS)
#endif
if(power > 80)
var/turf/target = get_edge_target_turf(M, dirflag)
SPAWN_DBG(0)
M.throw_at(target, 2, 2, throw_type = THROW_GUNIMPACT)
if (src.hit_type)
take_bleeding_damage(hit, null, round(src.power / 3), src.hit_type)
/datum/projectile/bullet/antisingularity
name = "Singularity buster rocket"
window_pass = 0
icon = 'icons/obj/projectiles.dmi'
icon_state = "regrocket"
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
power = 5
dissipation_delay = 30
cost = 1
shot_sound = 'sound/weapons/rocket.ogg'
ks_ratio = 1.0
caliber = 1.12
icon_turf_hit = "bhole-large"
implanted = null
on_hit(atom/hit)
var/obj/machinery/the_singularity/S = hit
if(istype(S))
new /obj/bhole(S.loc,rand(100,300))
qdel(S)
else
new /obj/effects/rendersparks(hit.loc)
if(ishuman(hit))
var/mob/living/carbon/human/M = hit
M.TakeDamage("chest", 15, 0)
boutput(M, "<span style=\"color:red\">You are struck by a big rocket! Thankfully it was not the exploding kind.</span>")
M.do_disorient(stunned = 40)
if (!M.stat)
M.emote("scream")
/datum/projectile/bullet/clownshot
name = "clownshot"
power = 1
cost = 15 //This should either cost a lot or a little I don't know. On one hand if it costs nothing you can truly tormet clowns with it, but on the other hand if it costs your full charge, then the clown will know how much you hate it because of how much you sacraficed to harm it. I settled for a med amount...
damage_type = D_KINETIC
hit_type = DAMAGE_BLUNT
implanted = null
shot_sound = 'sound/impact_sounds/Generic_Snap_1.ogg'
icon_turf_hit = "bhole-staple"
casing = null
hit_ground_chance = 50
icon_state = "random_thing" //actually exists, looks funny enough to use as the projectile image for this
on_hit(atom/hit, dirflag)
if (ishuman(hit))
var/mob/living/carbon/human/H = hit
var/clown_tally = 0
if(istype(H.w_uniform, /obj/item/clothing/under/misc/clown))
clown_tally += 1
if(istype(H.shoes, /obj/item/clothing/shoes/clown_shoes))
clown_tally += 1
if(istype(H.wear_mask, /obj/item/clothing/mask/clown_hat))
clown_tally += 1
if(clown_tally > 0)
playsound(H, "sound/musical_instruments/Bikehorn_1.ogg", 50, 1)
if (H.job == "Clown" || clown_tally >= 2)
H.drop_from_slot(H.shoes)
spawn(0)
H.throw_at(get_offset_target_turf(H, rand(5)-rand(5), rand(5)-rand(5)), rand(2,4), 2, throw_type = THROW_GUNIMPACT)
H.emote("twitch_v")
return