/obj/item/projectile --> /obj/projectile (#30411)

* yers

* vars

* map changes

* some comments (clearly not stolen from items)

* fix component

* summary
This commit is contained in:
kyunkyunkyun
2025-11-12 10:23:20 +00:00
committed by GitHub
parent e92a45369a
commit f96b26b75a
169 changed files with 858 additions and 851 deletions
+1 -1
View File
@@ -11,7 +11,7 @@
var/casing_drop_sound = "casingdrop" //What sound should play when this ammo hits the ground
var/caliber = null //Which kind of guns it can be loaded into
var/projectile_type = null //The bullet type to create when New() is called
var/obj/item/projectile/BB = null //The loaded bullet
var/obj/projectile/BB = null //The loaded bullet
var/pellets = 1 //Pellets for spreadshot
var/variance = 0 //Variance for inaccuracy fundamental to the casing
var/delay = 0 //Delay for energy weapons
@@ -3,7 +3,7 @@
desc = "A .357 magnum cartridge, often used in revolvers. Very deadly."
icon_state = "magnum_steel"
caliber = "357"
projectile_type = /obj/item/projectile/bullet
projectile_type = /obj/projectile/bullet
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
@@ -12,44 +12,44 @@
desc = "A 9mm pistol cartridge. This one has a rubber tip for less-lethal takedowns."
icon_state = "pistol_brass_rubber"
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/weakbullet4
projectile_type = /obj/projectile/bullet/weakbullet4
/obj/item/ammo_casing/a762
name = "7.62mm round"
desc = "A 7.62mm rifle cartridge, often used in Soviet rifles."
icon_state = "rifle_brass"
caliber = "a762"
projectile_type = /obj/item/projectile/bullet
projectile_type = /obj/projectile/bullet
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
/obj/item/ammo_casing/a762/enchanted
name = "enchanted 7.62 round"
desc = "A 7.62mm rifle cartridge. It sparkles with magic."
projectile_type = /obj/item/projectile/bullet/weakbullet3
projectile_type = /obj/projectile/bullet/weakbullet3
/obj/item/ammo_casing/a50
name = ".50 AE round"
desc = "A .50AE pistol cartridge, used in large caliber handguns."
icon_state = "magnum_steel"
caliber = ".50"
projectile_type = /obj/item/projectile/bullet
projectile_type = /obj/projectile/bullet
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
/obj/item/ammo_casing/c38/invisible
projectile_type = /obj/item/projectile/bullet/mime
projectile_type = /obj/projectile/bullet/mime
muzzle_flash_effect = null // invisible eh
/obj/item/ammo_casing/c38/invisible/fake
projectile_type = /obj/item/projectile/bullet/mime/fake
projectile_type = /obj/projectile/bullet/mime/fake
/obj/item/ammo_casing/c10mm
name = "10mm round"
desc = "A 10mm pistol cartridge, commonly used in Syndicate sidearms."
icon_state = "pistol_steel"
caliber = "10mm"
projectile_type = /obj/item/projectile/bullet/midbullet3
projectile_type = /obj/projectile/bullet/midbullet3
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -57,51 +57,51 @@
name = "10mm armor piercing round"
desc = "A 10mm pistol cartridge, with a Teflon coating to increase armor penetration, at the cost of damage."
icon_state = "pistol_steel_ap"
projectile_type = /obj/item/projectile/bullet/midbullet3/ap
projectile_type = /obj/projectile/bullet/midbullet3/ap
/obj/item/ammo_casing/c10mm/fire
name = "10mm incendiary round"
desc = "A 10mm pistol cartridge, containing a payload of flammable chemicals."
icon_state = "pistol_steel_incin"
projectile_type = /obj/item/projectile/bullet/midbullet3/fire
projectile_type = /obj/projectile/bullet/midbullet3/fire
muzzle_flash_color = LIGHT_COLOR_FIRE
/obj/item/ammo_casing/c10mm/hp
name = "10mm hollow point round"
desc = "A 10mm pistol cartridge, with an expanding tip that greatly increases stopping power, at the cost of armor penetration."
icon_state = "pistol_steel_hollow"
projectile_type = /obj/item/projectile/bullet/midbullet3/hp
projectile_type = /obj/projectile/bullet/midbullet3/hp
/obj/item/ammo_casing/overgrown
name = "overgrown round"
desc = "A pistol cartridge... probably. Why does it resemble a pea?"
projectile_type = /obj/item/projectile/bullet/midbullet3/overgrown
projectile_type = /obj/projectile/bullet/midbullet3/overgrown
icon_state = "peashooter_bullet"
/obj/item/ammo_casing/c9mm
name = "9mm round"
desc = "A 9mm pistol cartridge, commonly used in handguns and submachine guns."
caliber = "9mm"
projectile_type = /obj/item/projectile/bullet/weakbullet3
projectile_type = /obj/projectile/bullet/weakbullet3
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
/obj/item/ammo_casing/c9mm/ap
name = "9mm armor piercing round"
desc = "A 9mm pistol cartridge, with a Teflon coating to increase armor penetration, at the cost of stopping power."
icon_state = "pistol_brass_ap"
projectile_type = /obj/item/projectile/bullet/armourpiercing
projectile_type = /obj/projectile/bullet/armourpiercing
/obj/item/ammo_casing/c9mm/tox
name = "9mm toxic round"
desc = "A 9mm pistol cartridge, tipped with lethal toxins. Likely a war crime."
icon_state = "pistol_brass_toxin"
projectile_type = /obj/item/projectile/bullet/toxinbullet
projectile_type = /obj/projectile/bullet/toxinbullet
/obj/item/ammo_casing/c9mm/inc
name = "9mm incendiary round"
desc = "A 9mm pistol cartridge, tipped with an incendiary chemical payload."
icon_state = "pistol_brass_incin"
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
projectile_type = /obj/projectile/bullet/incendiary/firebullet
muzzle_flash_color = LIGHT_COLOR_FIRE
/obj/item/ammo_casing/c46x30mm
@@ -109,26 +109,26 @@
desc = "A 4.6x30mm PDW cartridge, commonly used in submachine guns and small-caliber rifles."
icon_state = "magnum_brass"
caliber = "4.6x30mm"
projectile_type = /obj/item/projectile/bullet/weakbullet3
projectile_type = /obj/projectile/bullet/weakbullet3
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
/obj/item/ammo_casing/c46x30mm/ap
name = "4.6x30mm armor piercing round"
desc = "A 4.6x30mm PDW cartridge, with a tungsten core to increase armor penetration, at the cost of stopping power."
icon_state = "magnum_brass_ap"
projectile_type = /obj/item/projectile/bullet/armourpiercing/wt550
projectile_type = /obj/projectile/bullet/armourpiercing/wt550
/obj/item/ammo_casing/c46x30mm/tox
name = "4.6x30mm toxic round"
desc = "A 4.6x30mm PDW cartridge, tipped with lethal toxins. Probably a war crime."
icon_state = "magnum_brass_toxin"
projectile_type = /obj/item/projectile/bullet/toxinbullet
projectile_type = /obj/projectile/bullet/toxinbullet
/obj/item/ammo_casing/c46x30mm/inc
name = "4.6x30 incendiary round"
desc = "a 4.6x30mm PDW cartridge, tipped with an incendiary chemical payload."
icon_state = "magnum_brass_incin"
projectile_type = /obj/item/projectile/bullet/incendiary/firebullet
projectile_type = /obj/projectile/bullet/incendiary/firebullet
muzzle_flash_color = LIGHT_COLOR_FIRE
/obj/item/ammo_casing/rubber45
@@ -136,7 +136,7 @@
desc = "A .45 caliber pistol cartridge. Features a rubber bullet for less-lethal takedowns."
icon_state = "pistol_steel_rubber"
caliber = ".45"
projectile_type = /obj/item/projectile/bullet/midbullet_r
projectile_type = /obj/projectile/bullet/midbullet_r
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -145,26 +145,26 @@
desc = "A .45 caliber pistol cartridge, commonly used in pistols and submachine guns."
icon_state = "pistol_steel"
caliber = ".45"
projectile_type = /obj/item/projectile/bullet/midbullet
projectile_type = /obj/projectile/bullet/midbullet
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
/obj/item/ammo_casing/c45/nostamina
projectile_type = /obj/item/projectile/bullet/weakbullet3
projectile_type = /obj/projectile/bullet/weakbullet3
/obj/item/ammo_casing/n762
name = "7.62x38mmR round"
desc = "A 7.62x38mmR pistol cartridge, commonly used by antique revolvers."
icon_state = "magnum_brass"
caliber = "n762"
projectile_type = /obj/item/projectile/bullet
projectile_type = /obj/projectile/bullet
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
/obj/item/ammo_casing/caseless/magspear
name = "magnetic spear"
desc = "A reusable spear that is typically loaded into kinetic spearguns."
projectile_type = /obj/item/projectile/bullet/reusable/magspear
projectile_type = /obj/projectile/bullet/reusable/magspear
caliber = "speargun"
icon_state = "magspear"
throwforce = 15 //still deadly when thrown
@@ -177,7 +177,7 @@
icon_state = "slug"
caliber = "shotgun"
casing_drop_sound = 'sound/weapons/gun_interactions/shotgun_fall.ogg'
projectile_type = /obj/item/projectile/bullet
projectile_type = /obj/projectile/bullet
materials = list(MAT_METAL=4000)
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
@@ -186,7 +186,7 @@
name = "buckshot shell"
desc = "A 12 gauge buckshot shell. Fires a spread of lethal shot."
icon_state = "buckshot"
projectile_type = /obj/item/projectile/bullet/pellet
projectile_type = /obj/projectile/bullet/pellet
pellets = 6
variance = 25
@@ -194,7 +194,7 @@
name = "rubbershot shell"
desc = "A 12 gauge shell filled with densely-packed rubber balls, used to incapacitate crowds from a distance."
icon_state = "rubbershot"
projectile_type = /obj/item/projectile/bullet/pellet/rubber
projectile_type = /obj/projectile/bullet/pellet/rubber
pellets = 6
variance = 25
materials = list(MAT_METAL=4000)
@@ -203,7 +203,7 @@
name = "beanbag slug"
desc = "A 12 gauge shell loaded with a beanbag slug for less-lethal takedowns."
icon_state = "beanbag"
projectile_type = /obj/item/projectile/bullet/weakbullet
projectile_type = /obj/projectile/bullet/weakbullet
materials = list(MAT_METAL=250)
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -212,7 +212,7 @@
name = "taser slug"
desc = "A 12 gauge shell loaded with a taser cartridge, somehow."
icon_state = "taser"
projectile_type = /obj/item/projectile/bullet/stunshot
projectile_type = /obj/projectile/bullet/stunshot
materials = list(MAT_METAL=250)
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -223,33 +223,33 @@
name = "meteorslug shell"
desc = "A 12 gauge shell rigged with CMC technology, which launches a massive slug when fired."
icon_state = "meteor"
projectile_type = /obj/item/projectile/bullet/meteorshot
projectile_type = /obj/projectile/bullet/meteorshot
/obj/item/ammo_casing/shotgun/pulseslug
name = "proto pulse slug"
desc = "A 12 gauge shell loaded with a powerful energy emitter, firing a devastating pulse blast."
icon_state = "pulse"
projectile_type = /obj/item/projectile/beam/pulse/shot
projectile_type = /obj/projectile/beam/pulse/shot
muzzle_flash_color = LIGHT_COLOR_DARKBLUE
/obj/item/ammo_casing/shotgun/incendiary
name = "incendiary slug"
desc = "A 12 gauge slug shell containing an incendiary chemical payload."
icon_state = "incendiary"
projectile_type = /obj/item/projectile/bullet/incendiary/shell
projectile_type = /obj/projectile/bullet/incendiary/shell
muzzle_flash_color = LIGHT_COLOR_FIRE
/obj/item/ammo_casing/shotgun/frag12
name = "\improper FRAG-12 slug"
desc = "A 12 gauge shell, loaded with a high-explosive slug."
icon_state = "frag"
projectile_type = /obj/item/projectile/bullet/frag12
projectile_type = /obj/projectile/bullet/frag12
/obj/item/ammo_casing/shotgun/incendiary/dragonsbreath
name = "dragonsbreath shell"
desc = "A 12 gauge shell which fires a spread of incendiary pellets."
icon_state = "dragonsbreath"
projectile_type = /obj/item/projectile/bullet/incendiary/shell/dragonsbreath
projectile_type = /obj/projectile/bullet/incendiary/shell/dragonsbreath
pellets = 4
variance = 35
@@ -257,7 +257,7 @@
name = "ion shell"
desc = "An advanced 12 gauge shell that fires a spread of ion bolts."
icon_state = "ion"
projectile_type = /obj/item/projectile/ion/weak
projectile_type = /obj/projectile/ion/weak
pellets = 6
variance = 40
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
@@ -268,7 +268,7 @@
name = "laser slug"
desc = "A rudimentary 12 gauge shotgun shell that replicates the effects of a laser weapon with a low-powered laser."
icon_state = "improvised"
projectile_type = /obj/item/projectile/beam/laser
projectile_type = /obj/projectile/beam/laser
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
muzzle_flash_color = LIGHT_COLOR_DARKRED
@@ -277,7 +277,7 @@
name = "lasershot"
desc = "An advanced 12 gauge shell that uses a multitude of lenses to split a high-powered laser into eight small beams."
icon_state = "laser"
projectile_type = /obj/item/projectile/beam/scatter
projectile_type = /obj/projectile/beam/scatter
pellets = 8
variance = 25
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
@@ -295,7 +295,7 @@
desc = "A 12 gauge shell loaded with a hypodermic needle. Can be injected with up to 30 units of any chemical."
icon_state = "dart"
container_type = OPENCONTAINER
projectile_type = /obj/item/projectile/bullet/dart
projectile_type = /obj/projectile/bullet/dart
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -321,7 +321,7 @@
name = "tranquilizer dart"
desc = "A 12 gauge dart shell loaded with powerful tranquilizers."
icon_state = "dart"
projectile_type = /obj/item/projectile/bullet/dart/syringe/tranquilizer
projectile_type = /obj/projectile/bullet/dart/syringe/tranquilizer
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
materials = list(MAT_METAL=250)
@@ -330,7 +330,7 @@
name = "holy water dart"
desc = "A 12 gauge dart shell loaded with holy water."
icon_state = "holydart"
projectile_type = /obj/item/projectile/bullet/dart/syringe/holy
projectile_type = /obj/projectile/bullet/dart/syringe/holy
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
materials = list(MAT_METAL=250)
@@ -339,11 +339,11 @@
name = "confettishot"
desc = "A 12 gauge shell loaded with... confetti?"
icon_state = "confetti"
projectile_type = /obj/item/projectile/bullet/confetti
projectile_type = /obj/projectile/bullet/confetti
/obj/item/ammo_casing/shotgun/shrapnel
name = "shrapnel rounds"
projectile_type = /obj/item/projectile/bullet/shrapnel
projectile_type = /obj/projectile/bullet/shrapnel
pellets = 3
variance = 20
@@ -352,7 +352,7 @@
desc = "A 5.56mm rifle round, produced in incredible quantities by the Trans-Solar Federation."
icon_state = "rifle_steel"
caliber = "a556"
projectile_type = /obj/item/projectile/bullet/heavybullet
projectile_type = /obj/projectile/bullet/heavybullet
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -361,7 +361,7 @@
desc = "A 5.45x39mm rifle round, used by the elite marines of the USSP."
icon_state = "rifle_brass"
caliber = "a545"
projectile_type = /obj/item/projectile/bullet/midbullet3
projectile_type = /obj/projectile/bullet/midbullet3
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -369,7 +369,7 @@
name = "beanbag shell"
desc = "A 12 gauge beanbag slug. Smells strongly of alcohol."
icon_state = "beanbag"
projectile_type = /obj/item/projectile/bullet/weakbullet/booze
projectile_type = /obj/projectile/bullet/weakbullet/booze
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
@@ -377,7 +377,7 @@
name = "rocket propelled grenade"
desc = "A high explosive rocket meant to be fired from a launcher."
icon_state = "rocket"
projectile_type = /obj/item/projectile/missile
projectile_type = /obj/projectile/missile
caliber = "rocket"
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
@@ -396,7 +396,7 @@
desc = "A .75 caliber gyrojet cartridge, for use in experimental weaponry. There's a Sunburst Heavy Industries logo on the side."
icon_state = "magnum_steel"
caliber = "75"
projectile_type = /obj/item/projectile/bullet/gyro
projectile_type = /obj/projectile/bullet/gyro
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
@@ -405,14 +405,14 @@
desc = "A 40mm high-explosive grenade round, meant to be fired from a grenade launcher."
icon_state = "40mmHE"
caliber = "40mm"
projectile_type = /obj/item/projectile/bullet/a40mm
projectile_type = /obj/projectile/bullet/a40mm
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
/obj/item/ammo_casing/caseless/foam_dart
name = "foam dart"
desc = "It's nerf or nothing! Ages 8 and up."
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart
projectile_type = /obj/projectile/bullet/reusable/foam_dart
muzzle_flash_effect = null
caliber = "foam_force"
icon = 'icons/obj/guns/toy.dmi'
@@ -437,7 +437,7 @@
/obj/item/ammo_casing/caseless/foam_dart/attackby__legacy__attackchain(obj/item/A, mob/user, params)
..()
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
var/obj/projectile/bullet/reusable/foam_dart/FD = BB
if((is_pen(A)) && modified && !FD.pen)
if(!user.unequip(A)) // forceMove happens in add_pen
return
@@ -448,7 +448,7 @@
if(modified)
return
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
var/obj/projectile/bullet/reusable/foam_dart/FD = BB
I.play_tool_sound(src)
modified = TRUE
FD.damage_type = BRUTE
@@ -456,7 +456,7 @@
return TRUE
/obj/item/ammo_casing/caseless/foam_dart/proc/add_pen(obj/item/pen/P)
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
var/obj/projectile/bullet/reusable/foam_dart/FD = BB
harmful = TRUE
P.forceMove(FD)
FD.log_override = FALSE
@@ -465,7 +465,7 @@
FD.nodamage = FALSE
/obj/item/ammo_casing/caseless/foam_dart/attack_self__legacy__attackchain(mob/living/user)
var/obj/item/projectile/bullet/reusable/foam_dart/FD = BB
var/obj/projectile/bullet/reusable/foam_dart/FD = BB
if(FD.pen)
FD.damage = initial(FD.damage)
FD.nodamage = initial(FD.nodamage)
@@ -476,14 +476,14 @@
/obj/item/ammo_casing/caseless/foam_dart/riot
name = "riot foam dart"
desc = "Whose smart idea was it to use toys as crowd control? Ages 18 and up."
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/riot
projectile_type = /obj/projectile/bullet/reusable/foam_dart/riot
icon_state = "foamdart_riot"
/obj/item/ammo_casing/caseless/foam_dart/sniper
name = "foam sniper dart"
desc = "For the big nerf! Ages 8 and up."
caliber = "foam_force_sniper"
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/sniper
projectile_type = /obj/projectile/bullet/reusable/foam_dart/sniper
icon_state = "foamdartsniper"
@@ -505,13 +505,13 @@
/obj/item/ammo_casing/caseless/foam_dart/sniper/riot
name = "riot foam sniper dart"
desc = "For the bigger brother of the crowd control toy. Ages 18 and up."
projectile_type = /obj/item/projectile/bullet/reusable/foam_dart/sniper/riot
projectile_type = /obj/projectile/bullet/reusable/foam_dart/sniper/riot
icon_state = "foamdartsniper_riot"
/obj/item/ammo_casing/shotgun/assassination
name = "assassination shell"
desc = "A 12 gauge buckshot shell containing a powerful silencing toxin."
projectile_type = /obj/item/projectile/bullet/pellet/assassination
projectile_type = /obj/projectile/bullet/pellet/assassination
muzzle_flash_effect = null
icon_state = "buckshot"
pellets = 6
@@ -521,7 +521,7 @@
name = "cap"
desc = "A cap for children toys."
caliber = "cap"
projectile_type = /obj/item/projectile/bullet/cap
projectile_type = /obj/projectile/bullet/cap
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_NORMAL
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
harmful = FALSE
@@ -530,7 +530,7 @@
name = "caseless laser round"
desc = "An experimental laser casing, designed to vaporize when fired."
caliber = "laser"
projectile_type = /obj/item/projectile/beam/laser/ik //Subtype that breaks on firing if emp'd
projectile_type = /obj/projectile/beam/laser/ik //Subtype that breaks on firing if emp'd
muzzle_flash_effect = /obj/effect/temp_visual/target_angled/muzzle_flash/energy
muzzle_flash_range = MUZZLE_FLASH_RANGE_NORMAL
muzzle_flash_color = LIGHT_COLOR_DARKRED
@@ -540,5 +540,5 @@
name = "\improper C-Foam blob"
desc = "You shouldn't see this! Make an issue report on Github!"
caliber = "c_foam"
projectile_type = /obj/item/projectile/c_foam
projectile_type = /obj/projectile/c_foam
muzzle_flash_color = LIGHT_COLOR_DARKRED
@@ -2,7 +2,7 @@
name = "energy weapon lens"
desc = "The part of the gun that makes the laser go pew."
caliber = "energy"
projectile_type = /obj/item/projectile/energy
projectile_type = /obj/projectile/energy
var/e_cost = 100 //The amount of energy a cell needs to expend to create this shot.
var/select_name = "energy"
fire_sound = 'sound/weapons/laser.ogg'
@@ -13,7 +13,7 @@
var/lens_speed_multiplier = 1
/obj/item/ammo_casing/energy/laser
projectile_type = /obj/item/projectile/beam/laser
projectile_type = /obj/projectile/beam/laser
muzzle_flash_color = LIGHT_COLOR_DARKRED
select_name = "kill"
@@ -22,7 +22,7 @@
e_cost = 250
/obj/item/ammo_casing/energy/lasergun
projectile_type = /obj/item/projectile/beam/laser
projectile_type = /obj/projectile/beam/laser
muzzle_flash_color = LIGHT_COLOR_DARKRED
e_cost = 83
select_name = "kill"
@@ -34,18 +34,18 @@
e_cost = 120
/obj/item/ammo_casing/energy/laser/practice
projectile_type = /obj/item/projectile/beam/practice
projectile_type = /obj/projectile/beam/practice
select_name = "practice"
harmful = FALSE
/obj/item/ammo_casing/energy/laser/scatter
projectile_type = /obj/item/projectile/beam/scatter
projectile_type = /obj/projectile/beam/scatter
pellets = 5
variance = 25
select_name = "scatter"
/obj/item/ammo_casing/energy/laser/eshotgun
projectile_type = /obj/item/projectile/beam/scatter/eshotgun
projectile_type = /obj/projectile/beam/scatter/eshotgun
pellets = 6
variance = 25
delay = 1 SECONDS
@@ -54,51 +54,51 @@
e_cost = 500
/obj/item/ammo_casing/energy/laser/heavy
projectile_type = /obj/item/projectile/beam/laser/heavylaser
projectile_type = /obj/projectile/beam/laser/heavylaser
select_name = "anti-vehicle"
fire_sound = 'sound/weapons/lasercannonfire.ogg'
/obj/item/ammo_casing/energy/laser/sparker
projectile_type = /obj/item/projectile/beam/laser/sparker
projectile_type = /obj/projectile/beam/laser/sparker
select_name = "spark"
e_cost = (100 / 3) * 2 // 15 * 12.5 damage = 187.5 damage. Almost as much as a base laser gun, but takes longer to get all the shots out.
/obj/item/ammo_casing/energy/laser/pulse
projectile_type = /obj/item/projectile/beam/pulse/hitscan
projectile_type = /obj/projectile/beam/pulse/hitscan
muzzle_flash_color = LIGHT_COLOR_DARKBLUE
e_cost = 200
select_name = "DESTROY"
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/scatter/pulse
projectile_type = /obj/item/projectile/beam/pulse/hitscan
projectile_type = /obj/projectile/beam/pulse/hitscan
e_cost = 200
select_name = "ANNIHILATE"
fire_sound = 'sound/weapons/pulse.ogg'
/obj/item/ammo_casing/energy/laser/bluetag
projectile_type = /obj/item/projectile/beam/lasertag/bluetag
projectile_type = /obj/projectile/beam/lasertag/bluetag
muzzle_flash_color = LIGHT_COLOR_BLUE
select_name = "bluetag"
harmful = FALSE
/obj/item/ammo_casing/energy/laser/redtag
projectile_type = /obj/item/projectile/beam/lasertag/redtag
projectile_type = /obj/projectile/beam/lasertag/redtag
select_name = "redtag"
harmful = FALSE
/obj/item/ammo_casing/energy/xray
projectile_type = /obj/item/projectile/beam/xray
projectile_type = /obj/projectile/beam/xray
muzzle_flash_color = LIGHT_COLOR_GREEN
fire_sound = 'sound/weapons/laser3.ogg'
/obj/item/ammo_casing/energy/immolator
projectile_type = /obj/item/projectile/beam/immolator
projectile_type = /obj/projectile/beam/immolator
fire_sound = 'sound/weapons/laser3.ogg'
e_cost = 125
/obj/item/ammo_casing/energy/immolator/strong
projectile_type = /obj/item/projectile/beam/immolator/strong
projectile_type = /obj/projectile/beam/immolator/strong
select_name = "precise"
/obj/item/ammo_casing/energy/immolator/strong/cyborg
@@ -106,7 +106,7 @@
e_cost = 1000 // 5x that of the standard laser, for 2.25x the damage (if 1/1 shots hit) plus ignite. Not energy-efficient, but can be used for sniping.
/obj/item/ammo_casing/energy/immolator/scatter
projectile_type = /obj/item/projectile/beam/immolator/weak
projectile_type = /obj/projectile/beam/immolator/weak
pellets = 6
variance = 25
select_name = "scatter"
@@ -116,7 +116,7 @@
e_cost = 1000 // 5x that of the standard laser, for 7.5x the damage (if 6/6 shots hit) plus ignite. Efficient only if you hit with at least 4/6 of the shots.
/obj/item/ammo_casing/energy/electrode
projectile_type = /obj/item/projectile/energy/electrode
projectile_type = /obj/projectile/energy/electrode
muzzle_flash_color = "#FFFF00"
select_name = "stun"
fire_sound = 'sound/weapons/taser.ogg'
@@ -124,23 +124,23 @@
harmful = FALSE
/obj/item/ammo_casing/energy/ion
projectile_type = /obj/item/projectile/ion
projectile_type = /obj/projectile/ion
muzzle_flash_color = LIGHT_COLOR_LIGHTBLUE
select_name = "ion"
fire_sound = 'sound/weapons/ionrifle.ogg'
/obj/item/ammo_casing/energy/ion/hos
projectile_type = /obj/item/projectile/ion/weak
projectile_type = /obj/projectile/ion/weak
e_cost = 300
/obj/item/ammo_casing/energy/declone
projectile_type = /obj/item/projectile/energy/declone
projectile_type = /obj/projectile/energy/declone
muzzle_flash_color = LIGHT_COLOR_GREEN
select_name = "declone"
fire_sound = 'sound/weapons/pulse3.ogg'
/obj/item/ammo_casing/energy/mindflayer
projectile_type = /obj/item/projectile/energy/mindflayer
projectile_type = /obj/projectile/energy/mindflayer
muzzle_flash_color = LIGHT_COLOR_PURPLE
select_name = "mindflayer"
fire_sound = 'sound/weapons/pulse3.ogg'
@@ -151,15 +151,15 @@
harmful = FALSE
/obj/item/ammo_casing/energy/flora/yield
projectile_type = /obj/item/projectile/energy/florayield
projectile_type = /obj/projectile/energy/florayield
select_name = "yield"
/obj/item/ammo_casing/energy/flora/mut
projectile_type = /obj/item/projectile/energy/floramut
projectile_type = /obj/projectile/energy/floramut
select_name = "mutation"
/obj/item/ammo_casing/energy/temp
projectile_type = /obj/item/projectile/temp
projectile_type = /obj/projectile/temp
fire_sound = 'sound/weapons/pulse3.ogg'
var/temp = 300
@@ -171,13 +171,13 @@
..(temp)
/obj/item/ammo_casing/energy/meteor
projectile_type = /obj/item/projectile/meteor
projectile_type = /obj/projectile/meteor
muzzle_flash_effect = /obj/effect/temp_visual/target_angled/muzzle_flash
muzzle_flash_color = null
select_name = "goddamn meteor"
/obj/item/ammo_casing/energy/disabler
projectile_type = /obj/item/projectile/beam/disabler
projectile_type = /obj/projectile/beam/disabler
muzzle_flash_color = LIGHT_COLOR_LIGHTBLUE
select_name = "disable"
e_cost = 50
@@ -186,7 +186,7 @@
delay = 0.6 SECONDS
/obj/item/ammo_casing/energy/disabler/smg
projectile_type = /obj/item/projectile/beam/disabler/weak
projectile_type = /obj/projectile/beam/disabler/weak
e_cost = 25
fire_sound = 'sound/weapons/taser3.ogg'
click_cooldown_override = 2
@@ -195,11 +195,11 @@
delay = 0
/obj/item/ammo_casing/energy/disabler/fake
projectile_type = /obj/item/projectile/beam/disabler/fake
projectile_type = /obj/projectile/beam/disabler/fake
e_cost = 100
/obj/item/ammo_casing/energy/disabler/eshotgun
projectile_type = /obj/item/projectile/beam/disabler/pellet
projectile_type = /obj/projectile/beam/disabler/pellet
e_cost = 75
delay = 1 SECONDS
pellets = 6
@@ -213,7 +213,7 @@
e_cost = 60
/obj/item/ammo_casing/energy/plasma
projectile_type = /obj/item/projectile/plasma
projectile_type = /obj/projectile/plasma
muzzle_flash_color = LIGHT_COLOR_PURPLE
select_name = "plasma burst"
fire_sound = 'sound/weapons/pulse.ogg'
@@ -221,12 +221,12 @@
e_cost = 75
/obj/item/ammo_casing/energy/plasma/adv
projectile_type = /obj/item/projectile/plasma/adv
projectile_type = /obj/projectile/plasma/adv
delay = 10
e_cost = 10
/obj/item/ammo_casing/energy/wormhole
projectile_type = /obj/item/projectile/beam/wormhole
projectile_type = /obj/projectile/beam/wormhole
muzzle_flash_color = "#33CCFF"
delay = 10
fire_sound = 'sound/weapons/pulse3.ogg'
@@ -239,12 +239,12 @@
return ..()
/obj/item/ammo_casing/energy/wormhole/orange
projectile_type = /obj/item/projectile/beam/wormhole/orange
projectile_type = /obj/projectile/beam/wormhole/orange
muzzle_flash_color = "#FF6600"
select_name = "orange"
/obj/item/ammo_casing/energy/bolt
projectile_type = /obj/item/projectile/energy/bolt
projectile_type = /obj/projectile/energy/bolt
muzzle_flash_color = null
muzzle_flash_effect = /obj/effect/temp_visual/target_angled/muzzle_flash
select_name = "bolt"
@@ -252,21 +252,21 @@
fire_sound = 'sound/weapons/genhit.ogg'
/obj/item/ammo_casing/energy/bolt/large
projectile_type = /obj/item/projectile/energy/bolt/large
projectile_type = /obj/projectile/energy/bolt/large
select_name = "heavy bolt"
/obj/item/ammo_casing/energy/instakill
projectile_type = /obj/item/projectile/beam/instakill
projectile_type = /obj/projectile/beam/instakill
muzzle_flash_color = LIGHT_COLOR_PURPLE
e_cost = 0
select_name = "DESTROY"
/obj/item/ammo_casing/energy/instakill/blue
projectile_type = /obj/item/projectile/beam/instakill/blue
projectile_type = /obj/projectile/beam/instakill/blue
muzzle_flash_color = LIGHT_COLOR_DARKBLUE
/obj/item/ammo_casing/energy/instakill/red
projectile_type = /obj/item/projectile/beam/instakill/red
projectile_type = /obj/projectile/beam/instakill/red
muzzle_flash_color = LIGHT_COLOR_DARKRED
/obj/item/ammo_casing/energy/tesla_bolt
@@ -274,13 +274,13 @@
e_cost = 200
select_name = "lightning beam"
muzzle_flash_color = LIGHT_COLOR_FADEDPURPLE
projectile_type = /obj/item/projectile/energy/tesla_bolt
projectile_type = /obj/projectile/energy/tesla_bolt
/obj/item/ammo_casing/energy/arc_revolver
fire_sound = 'sound/magic/lightningbolt.ogg' //New sound
select_name = "lightning beam" //I guess
muzzle_flash_color = LIGHT_COLOR_FADEDPURPLE // Depends on sprite
projectile_type = /obj/item/projectile/energy/arc_revolver
projectile_type = /obj/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
@@ -290,32 +290,32 @@
/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
var/obj/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
projectile_type = /obj/projectile/energy/weak_plasma
e_cost = 75 // With no charging, 162.5 damage from 13 shots.
muzzle_flash_color = LIGHT_COLOR_FADEDPURPLE
fire_sound = 'sound/weapons/taser2.ogg'
select_name = null //If the select name is null, it does not send a message of switching modes to the user, important on the pistol.
/obj/item/ammo_casing/energy/charged_plasma
projectile_type = /obj/item/projectile/homing/charged_plasma
projectile_type = /obj/projectile/homing/charged_plasma
e_cost = 0 //Charge is used when you charge the gun. Prevents issues.
muzzle_flash_color = LIGHT_COLOR_FADEDPURPLE
fire_sound = 'sound/weapons/marauder.ogg' //Should be different enough to get attention
select_name = null
/obj/item/ammo_casing/energy/clown
projectile_type = /obj/item/projectile/clown
projectile_type = /obj/projectile/clown
muzzle_flash_effect = null
fire_sound = 'sound/weapons/gunshots/gunshot_smg.ogg'
select_name = "clown"
/obj/item/ammo_casing/energy/emitter
projectile_type = /obj/item/projectile/beam/emitter
projectile_type = /obj/projectile/beam/emitter
muzzle_flash_color = LIGHT_COLOR_GREEN
fire_sound = 'sound/weapons/emitter.ogg'
delay = 2 SECONDS // Lasers fire twice every second for 40 dps, this fires every 2 seconds for 15 dps. Seems fair, since every cyborg will have this with more shots?
@@ -331,7 +331,7 @@
delay = 2 SECONDS
/obj/item/ammo_casing/energy/bsg
projectile_type = /obj/item/projectile/energy/bsg
projectile_type = /obj/projectile/energy/bsg
muzzle_flash_color = LIGHT_COLOR_DARKBLUE
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
@@ -341,7 +341,7 @@
delay = 4 SECONDS //Looooooong cooldown // Used to be 10 seconds, has been rebalanced to be normal firing rate now
/obj/item/ammo_casing/energy/teleport
projectile_type = /obj/item/projectile/energy/teleport
projectile_type = /obj/projectile/energy/teleport
muzzle_flash_color = LIGHT_COLOR_LIGHTBLUE
fire_sound = 'sound/weapons/wave.ogg'
e_cost = 250
@@ -356,7 +356,7 @@
..(teleport_target)
/obj/item/ammo_casing/energy/mimic
projectile_type = /obj/item/projectile/mimic
projectile_type = /obj/projectile/mimic
muzzle_flash_effect = null
fire_sound = 'sound/weapons/bite.ogg'
select_name = "gun mimic"
@@ -370,22 +370,22 @@
..(mimic_type)
/obj/item/ammo_casing/energy/detective
projectile_type = /obj/item/projectile/beam/laser/detective
projectile_type = /obj/projectile/beam/laser/detective
fire_sound = 'sound/weapons/gunshots/gunshot_det_energy.ogg'
select_name = "disabler"
/obj/item/ammo_casing/energy/detective/tracker_warrant
projectile_type = /obj/item/projectile/beam/laser/detective/tracker_warrant_shot
projectile_type = /obj/projectile/beam/laser/detective/tracker_warrant_shot
e_cost = 50
select_name = "tracker and warrant generator"
/obj/item/ammo_casing/energy/detective/overcharge
projectile_type = /obj/item/projectile/beam/laser/detective/overcharged
projectile_type = /obj/projectile/beam/laser/detective/overcharged
e_cost = 200
select_name = "overcharged"
/obj/item/ammo_casing/energy/silencer_ammo
projectile_type = /obj/item/projectile/beam/silencer
projectile_type = /obj/projectile/beam/silencer
muzzle_flash_effect = null
select_name = "silencing dissidents"
e_cost = 50 // 16 shots
@@ -1,45 +1,45 @@
/obj/item/ammo_casing/magic
name = "magic casing"
desc = "I didn't even know magic needed ammo..."
projectile_type = /obj/item/projectile/magic
projectile_type = /obj/projectile/magic
muzzle_flash_color = COLOR_BLUE_GRAY
muzzle_flash_effect = /obj/effect/temp_visual/target_angled/muzzle_flash/magic
/obj/item/ammo_casing/magic/change
projectile_type = /obj/item/projectile/magic/change
projectile_type = /obj/projectile/magic/change
/obj/item/ammo_casing/magic/animate
projectile_type = /obj/item/projectile/magic/animate
projectile_type = /obj/projectile/magic/animate
/obj/item/ammo_casing/magic/heal
projectile_type = /obj/item/projectile/magic/resurrection
projectile_type = /obj/projectile/magic/resurrection
harmful = FALSE
/obj/item/ammo_casing/magic/death
projectile_type = /obj/item/projectile/magic/death
projectile_type = /obj/projectile/magic/death
/obj/item/ammo_casing/magic/teleport
projectile_type = /obj/item/projectile/magic/teleport
projectile_type = /obj/projectile/magic/teleport
harmful = FALSE
/obj/item/ammo_casing/magic/door
projectile_type = /obj/item/projectile/magic/door
projectile_type = /obj/projectile/magic/door
harmful = FALSE
/obj/item/ammo_casing/magic/fireball
projectile_type = /obj/item/projectile/magic/fireball
projectile_type = /obj/projectile/magic/fireball
/obj/item/ammo_casing/magic/chaos
projectile_type = /obj/item/projectile/magic/chaos
projectile_type = /obj/projectile/magic/chaos
/obj/item/ammo_casing/magic/slipping
projectile_type = /obj/item/projectile/magic/slipping
projectile_type = /obj/projectile/magic/slipping
/obj/item/ammo_casing/magic/arcane_barrage
projectile_type = /obj/item/projectile/magic/arcane_barrage
projectile_type = /obj/projectile/magic/arcane_barrage
/obj/item/ammo_casing/magic/forcebolt
projectile_type = /obj/item/projectile/forcebolt
projectile_type = /obj/projectile/forcebolt
/obj/item/ammo_casing/syringegun
name = "syringe gun spring"
@@ -48,7 +48,7 @@
muzzle_flash_effect = null
/obj/item/ammo_casing/energy/c3dbullet
projectile_type = /obj/item/projectile/bullet/midbullet3
projectile_type = /obj/projectile/bullet/midbullet3
select_name = "spraydown"
fire_sound = 'sound/weapons/gunshots/gunshot_mg.ogg'
e_cost = 20
+1 -1
View File
@@ -94,7 +94,7 @@
* - deviation: (Optional) How the trajectory should deviate from the target in degrees.
* - //Spread is FORCED!
*/
/obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, list/modifiers = null, deviation = 0)
/obj/projectile/proc/preparePixelProjectile(atom/target, atom/source, list/modifiers = null, deviation = 0)
if(!(isnull(modifiers) || islist(modifiers)))
stack_trace("WARNING: Projectile [type] fired with non-list modifiers, likely was passed click params.")
modifiers = null
+9 -9
View File
@@ -5,7 +5,7 @@
#define CHAOS_STAFF_GIFT_CHANCE 15
#define CHAOS_STAFF_GREAT_GIFT_CHANCE 5
/obj/item/projectile/magic/chaos
/obj/projectile/magic/chaos
name = "chaos bolt"
icon_state = "ice_1"
impact_effect_type = /obj/effect/temp_visual/impact_effect/chaos
@@ -16,7 +16,7 @@
/// Name of random effect to be applied on target mob.
var/chaos_effect
/obj/item/projectile/magic/chaos/on_hit(atom/target, blocked = 0)
/obj/projectile/magic/chaos/on_hit(atom/target, blocked = 0)
. = ..()
if(!.)
return
@@ -31,7 +31,7 @@
return
chaos_chaos(L)
/obj/item/projectile/magic/chaos/Initialize(mapload)
/obj/projectile/magic/chaos/Initialize(mapload)
. = ..()
icon_state = pick("bluespace", "pulse1", "magicm", "declone", "fireball", "blood_bolt", "arcane_barrage", "laser", "u_laser")
@@ -45,7 +45,7 @@
* Arguments:
* * target - mob/living that will have effect applied on them
*/
/obj/item/projectile/magic/chaos/proc/chaos_chaos(mob/living/target)
/obj/projectile/magic/chaos/proc/chaos_chaos(mob/living/target)
var/category = pick(prob(CHAOS_STAFF_LETHAL_CHANCE);"lethal", prob(CHAOS_STAFF_NEGATIVE_CHANCE);"negative", prob(CHAOS_STAFF_MISC_CHANCE);"misc",\
prob(CHAOS_STAFF_GIFT_CHANCE);"gift", prob(CHAOS_STAFF_GREAT_GIFT_CHANCE);"great gift")
switch(category)
@@ -96,7 +96,7 @@
/**
* Picks and apply a lethal effect on mob/living/target. Some are more instantaneous than others.
*/
/obj/item/projectile/magic/chaos/proc/apply_lethal_effect(mob/living/target)
/obj/projectile/magic/chaos/proc/apply_lethal_effect(mob/living/target)
if(!ishuman(target))
target.visible_message("<span class='chaosverybad'>[target] suddenly dies!</span>", "<span class='chaosverybad'>Game over!</span>")
target.death(FALSE)
@@ -176,7 +176,7 @@
/**
* Picks and apply a negative effect on mob/living/target. Usually causes damage and/or incapacitating effect.
*/
/obj/item/projectile/magic/chaos/proc/apply_negative_effect(mob/living/target)
/obj/projectile/magic/chaos/proc/apply_negative_effect(mob/living/target)
if(!ishuman(target))
if(prob(50))
target.apply_damage(CHAOS_STAFF_DAMAGE, BRUTE)
@@ -263,7 +263,7 @@
/**
* Picks and apply a random miscellaneous effect on mob/living/target. Can be negative or mildly positive.
*/
/obj/item/projectile/magic/chaos/proc/apply_misc_effect(mob/living/target)
/obj/projectile/magic/chaos/proc/apply_misc_effect(mob/living/target)
if(!ishuman(target))
chaos_effect = pick("recolor", "bark", "confetti", "smoke", "wand of nothing", "bike horn")
else
@@ -314,7 +314,7 @@
/**
* Picks a random gift to be given to mob/living/target. Should be mildly useful and/or funny.
*/
/obj/item/projectile/magic/chaos/proc/apply_gift_effect(mob/living/target)
/obj/projectile/magic/chaos/proc/apply_gift_effect(mob/living/target)
chaos_effect = pick("toy sword", "toy revolver", "cheese", "food", "medkit", "tarot pack", \
"insulated gloves", "wand of doors", "golden bike horn", "ban hammer", "banana")
switch(chaos_effect)
@@ -354,7 +354,7 @@
/**
* Picks a random gift to be given to mob/living/target. Should be valuable and/or threatening to the wizard.
*/
/obj/item/projectile/magic/chaos/proc/apply_great_gift_effect(mob/living/target)
/obj/projectile/magic/chaos/proc/apply_great_gift_effect(mob/living/target)
chaos_effect = pick("esword", "emag", "chaos wand", "revolver", "aeg", "tarot deck", \
"bluespace banana", "banana grenade", "disco ball", "syndicate minibomb", "crystal ball")
switch(chaos_effect)
@@ -71,7 +71,7 @@
for(var/A in modkits)
. += A
/obj/item/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/item/projectile/kinetic/K)
/obj/item/gun/energy/kinetic_accelerator/proc/modify_projectile(obj/projectile/kinetic/K)
K.kinetic_gun = src //do something special on-hit, easy!
for(var/A in get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
@@ -183,7 +183,7 @@
//Casing
/obj/item/ammo_casing/energy/kinetic
projectile_type = /obj/item/projectile/kinetic
projectile_type = /obj/projectile/kinetic
muzzle_flash_color = null
select_name = "kinetic"
e_cost = 500
@@ -197,10 +197,10 @@
//Malf casing
/obj/item/ammo_casing/energy/kinetic/malf
projectile_type = /obj/item/projectile/kinetic/malf
projectile_type = /obj/projectile/kinetic/malf
//Projectiles
/obj/item/projectile/kinetic
/obj/projectile/kinetic
name = "kinetic force"
icon_state = null
damage = 40
@@ -211,23 +211,23 @@
var/pressure_decrease = 0.25
var/obj/item/gun/energy/kinetic_accelerator/kinetic_gun
/obj/item/projectile/kinetic/malf
/obj/projectile/kinetic/malf
pressure_decrease = 1
color = "#FFFFFF"
icon_state = "ka_tracer"
/obj/item/projectile/kinetic/pod
/obj/projectile/kinetic/pod
range = 4
/obj/item/projectile/kinetic/pod/regular
/obj/projectile/kinetic/pod/regular
damage = 50
pressure_decrease = 0.5
/obj/item/projectile/kinetic/Destroy()
/obj/projectile/kinetic/Destroy()
kinetic_gun = null
return ..()
/obj/item/projectile/kinetic/prehit(atom/target)
/obj/projectile/kinetic/prehit(atom/target)
. = ..()
if(.)
if(kinetic_gun)
@@ -240,15 +240,15 @@
pressure_decrease_active = TRUE
/obj/item/projectile/kinetic/on_range()
/obj/projectile/kinetic/on_range()
strike_thing()
..()
/obj/item/projectile/kinetic/on_hit(atom/target)
/obj/projectile/kinetic/on_hit(atom/target)
strike_thing(target)
. = ..()
/obj/item/projectile/kinetic/proc/strike_thing(atom/target)
/obj/projectile/kinetic/proc/strike_thing(atom/target)
var/turf/target_turf = get_turf(target)
if(!target_turf)
target_turf = get_turf(src)
@@ -362,19 +362,19 @@
accelerator.modkits -= src
return ..()
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/projectile/kinetic/K)
return
//use this one for effects you want to trigger before any damage is done at all and before damage is decreased by pressure
/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/proc/projectile_prehit(obj/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
return
//use this one for effects you want to trigger before mods that do damage
/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/proc/projectile_strike_predamage(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
return
//and this one for things that don't need to trigger before other damage-dealing mods
/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/proc/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
return
//Range
@@ -383,7 +383,7 @@
desc = "Increases the range of a kinetic accelerator when installed."
cost = 24 //so you can fit four plus a tracer cosmetic
/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/item/projectile/kinetic/K)
/obj/item/borg/upgrade/modkit/range/modify_projectile(obj/projectile/kinetic/K)
K.range += modifier
@@ -393,7 +393,7 @@
desc = "Increases the damage of kinetic accelerator when installed."
modifier = 10
/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/item/projectile/kinetic/K)
/obj/item/borg/upgrade/modkit/damage/modify_projectile(obj/projectile/kinetic/K)
K.damage += modifier
@@ -448,7 +448,7 @@
turf_aoe = initial(turf_aoe)
stats_stolen = FALSE
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/aoe/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
if(stats_stolen)
return
new /obj/effect/temp_visual/pka_explosion(target_turf)
@@ -494,7 +494,7 @@
modifier = -14 //Makes the cooldown 3 seconds(with no cooldown mods) if you miss. Don't miss.
cost = 50
/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/cooldown/repeater/projectile_strike_predamage(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
var/valid_repeat = FALSE
if(isliving(target))
var/mob/living/L = target
@@ -514,7 +514,7 @@
cost = 20
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/lifesteal/projectile_prehit(obj/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
if(isliving(target) && isliving(K.firer))
var/mob/living/L = target
if(L.stat == DEAD)
@@ -528,7 +528,7 @@
denied_type = /obj/item/borg/upgrade/modkit/resonator_blasts
modifier = 0.25 //A bonus 15 damage if you burst the field on a target, 60 if you lure them into it.
/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/resonator_blasts/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
if(target_turf && !ismineralturf(target_turf)) //Don't make fields on mineral turfs.
var/obj/effect/temp_visual/resonance/R = locate(/obj/effect/temp_visual/resonance) in target_turf
if(R)
@@ -545,7 +545,7 @@
var/maximum_bounty = 25
var/list/bounties_reaped = list()
/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/item/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/bounty/projectile_prehit(obj/projectile/kinetic/K, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
if(isliving(target))
var/mob/living/L = target
var/list/existing_marks = L.has_status_effect_list(STATUS_EFFECT_SYPHONMARK)
@@ -556,7 +556,7 @@
qdel(SM)
L.apply_status_effect(STATUS_EFFECT_SYPHONMARK, src)
/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/item/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
/obj/item/borg/upgrade/modkit/bounty/projectile_strike(obj/projectile/kinetic/K, turf/target_turf, atom/target, obj/item/gun/energy/kinetic_accelerator/KA)
if(isliving(target))
var/mob/living/L = target
if(bounties_reaped[L.type])
@@ -584,7 +584,7 @@
maximum_of_type = 2
cost = 35
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/item/projectile/kinetic/K)
/obj/item/borg/upgrade/modkit/indoors/modify_projectile(obj/projectile/kinetic/K)
K.pressure_decrease *= modifier
@@ -648,7 +648,7 @@
denied_type = /obj/item/borg/upgrade/modkit/tracer
var/bolt_color = "#FFFFFF"
/obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/item/projectile/kinetic/K)
/obj/item/borg/upgrade/modkit/tracer/modify_projectile(obj/projectile/kinetic/K)
K.icon_state = "ka_tracer"
K.color = bolt_color
+10 -10
View File
@@ -181,17 +181,17 @@
. += "At any rate, Nanotrasen is looking to sell these to sniper units who will undoubtedly appreciate the devastating effect that one of these can have when given proper operating distance."
/obj/item/ammo_casing/energy/laser/accelerator
projectile_type = /obj/item/projectile/beam/laser/accelerator
projectile_type = /obj/projectile/beam/laser/accelerator
select_name = "accelerator"
fire_sound = 'sound/weapons/lasercannonfire.ogg'
/obj/item/projectile/beam/laser/accelerator
/obj/projectile/beam/laser/accelerator
name = "accelerator laser"
icon_state = "heavylaser"
range = 255
damage = 6
/obj/item/projectile/beam/laser/accelerator/Range()
/obj/projectile/beam/laser/accelerator/Range()
..()
damage = min(damage+7, 100)
@@ -250,7 +250,7 @@
return //no manual ammo changing.
/obj/item/ammo_casing/energy/laser/sniper
projectile_type = /obj/item/projectile/beam/laser/sniper
projectile_type = /obj/projectile/beam/laser/sniper
muzzle_flash_color = LIGHT_COLOR_PINK
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
@@ -259,9 +259,9 @@
delay = 2 SECONDS
/obj/item/ammo_casing/energy/laser/sniper/pierce
projectile_type = /obj/item/projectile/beam/laser/sniper/pierce
projectile_type = /obj/projectile/beam/laser/sniper/pierce
/obj/item/projectile/beam/laser/sniper
/obj/projectile/beam/laser/sniper
name = "sniper laser"
icon_state = "sniperlaser"
range = 255
@@ -271,18 +271,18 @@
forced_accuracy = TRUE
var/can_knockdown = TRUE
/obj/item/projectile/beam/laser/sniper/Range()
/obj/projectile/beam/laser/sniper/Range()
..()
damage = min(damage + 5, 100)
/obj/item/projectile/beam/laser/sniper/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/beam/laser/sniper/on_hit(atom/target, blocked = 0, hit_zone)
..()
var/mob/living/carbon/human/H = target
if(istype(H) && damage >= 40 && can_knockdown)
H.KnockDown(2 SECONDS * (damage / 10))
can_knockdown = FALSE //Projectiles that pierce can not knockdown, no wall knockdowns.
/obj/item/projectile/beam/laser/sniper/pierce
/obj/projectile/beam/laser/sniper/pierce
forcedodge = 1 // Can pierce one non wall thing.
speed = 0.5
always_hit_living_nondense = TRUE //This means if you are scoped in sniping at crit xenomorphs or crit humans, you can always hit them even if you do not directly click on them
@@ -290,7 +290,7 @@
var/hit_a_r_wall = FALSE
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE | PASSGIRDER
/obj/item/projectile/beam/laser/sniper/pierce/prehit(atom/target)
/obj/projectile/beam/laser/sniper/pierce/prehit(atom/target)
if(istype(target, /turf/simulated/wall/r_wall))
if(!hit_a_r_wall)
hit_a_r_wall = TRUE
@@ -345,7 +345,7 @@
if(blue)
blue.target = null
/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/item/projectile/beam/wormhole/W)
/obj/item/gun/energy/wormhole_projector/proc/create_portal(obj/projectile/beam/wormhole/W)
var/obj/effect/portal/P = new /obj/effect/portal(get_turf(W), null, src)
P.precision = 0
P.failchance = 0
@@ -1084,12 +1084,12 @@
/obj/item/ammo_casing/energy/spike
name = "alloy spike"
desc = "A broadhead spike made out of a weird silvery metal."
projectile_type = /obj/item/projectile/bullet/spike
projectile_type = /obj/projectile/bullet/spike
muzzle_flash_effect = null
select_name = "spike"
fire_sound = 'sound/weapons/bladeslice.ogg'
/obj/item/projectile/bullet/spike
/obj/projectile/bullet/spike
name = "alloy spike"
desc = "It's about a foot of weird silvery metal with a wicked point."
damage = 25
@@ -1097,7 +1097,7 @@
armor_penetration_flat = 30
icon_state = "magspear"
/obj/item/projectile/bullet/spike/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/spike/on_hit(atom/target, blocked = 0)
if((blocked < 100) && ishuman(target))
var/mob/living/carbon/human/H = target
H.bleed(50)
@@ -1120,7 +1120,7 @@
cell_type = /obj/item/stock_parts/cell/infinite
/obj/item/ammo_casing/energy/vortex_blast
projectile_type = /obj/item/projectile/energy/vortex_blast
projectile_type = /obj/projectile/energy/vortex_blast
muzzle_flash_effect = /obj/effect/temp_visual/target_angled/muzzle_flash/vortex_blast
variance = 70
pellets = 8
@@ -1128,7 +1128,7 @@
select_name = "vortex blast"
fire_sound = 'sound/weapons/wave.ogg'
/obj/item/projectile/energy/vortex_blast
/obj/projectile/energy/vortex_blast
name = "vortex blast"
hitscan = TRUE
damage = 2
@@ -1138,7 +1138,7 @@
hitsound_wall = null
suppressed = TRUE
/obj/item/projectile/energy/vortex_blast/prehit(atom/target)
/obj/projectile/energy/vortex_blast/prehit(atom/target)
. = ..()
if(ishuman(target))
return
@@ -1147,7 +1147,7 @@
return
damage *= 6 //objects tend to fall apart as atoms are ripped up
/obj/item/projectile/energy/vortex_blast/on_hit(atom/target, blocked = 0)
/obj/projectile/energy/vortex_blast/on_hit(atom/target, blocked = 0)
if(blocked >= 100)
return ..()
if(ishuman(target))
+1 -1
View File
@@ -278,7 +278,7 @@ CONTENTS:
"Would you like a glass of water?", "What fun is there in making sense?", "Maybe you ought to go back home and crawl under your bed.", \
"Time to dual wield chaos wands!", "Sixty percent of the time, it works every time.", "Cheese for everyone!", "You hear a deep voice cackling.", \
"Xom bursts into laughter!", "Xom thinks this is hilarious!")]</span>")
var/obj/item/projectile/magic/chaos/proj = new /obj/item/projectile/magic/chaos(src)
var/obj/projectile/magic/chaos/proj = new /obj/projectile/magic/chaos(src)
proj.chaos_chaos(user)
qdel(proj)
charges--
@@ -89,11 +89,11 @@
var/turf/targturf = get_turf(target)
message_admins("Blast wave fired from [ADMIN_COORDJMP(starting)] ([get_area_name(user, TRUE)]) at [ADMIN_COORDJMP(targturf)] ([target.name]) by [key_name_admin(user)] with power [heavy]/[medium]/[light].")
log_game("Blast wave fired from ([starting.x], [starting.y], [starting.z]) ([get_area_name(user, TRUE)]) at ([target.x], [target.y], [target.z]) ([target]) by [key_name(user)] with power [heavy]/[medium]/[light].")
var/obj/item/projectile/blastwave/BW = new(loc, heavy, medium, light)
var/obj/projectile/blastwave/BW = new(loc, heavy, medium, light)
BW.preparePixelProjectile(target, get_turf(src), params2list(params), 0)
BW.fire()
/obj/item/projectile/blastwave
/obj/projectile/blastwave
name = "blast wave"
icon_state = "blastwave"
damage = 0
@@ -103,13 +103,13 @@
var/mediumr = 0
var/lightr = 0
/obj/item/projectile/blastwave/New(loc, _h, _m, _l)
/obj/projectile/blastwave/New(loc, _h, _m, _l)
..()
heavyr = _h
mediumr = _m
lightr = _l
/obj/item/projectile/blastwave/Range()
/obj/projectile/blastwave/Range()
..()
var/amount_destruction = 0
if(heavyr)
@@ -132,5 +132,5 @@
mediumr = max(mediumr - 1, 0)
lightr = max(lightr - 1, 0)
/obj/item/projectile/blastwave/ex_act()
/obj/projectile/blastwave/ex_act()
return
@@ -65,7 +65,7 @@
max_ammo = 1
/obj/item/projectile/bullet/reusable/arrow
/obj/projectile/bullet/reusable/arrow
name = "arrow"
icon_state = "arrow"
ammo_type = /obj/item/ammo_casing/caseless/arrow
@@ -77,7 +77,7 @@
desc = "Stab, stab, stab."
icon_state = "arrow"
force = 10
projectile_type = /obj/item/projectile/bullet/reusable/arrow
projectile_type = /obj/projectile/bullet/reusable/arrow
muzzle_flash_effect = null
caliber = "arrow"
+12 -12
View File
@@ -70,34 +70,34 @@
//ammo//
/obj/item/projectile/bullet/saw
/obj/projectile/bullet/saw
damage = 45
armor_penetration_flat = 5
/obj/item/projectile/bullet/saw/bleeding
/obj/projectile/bullet/saw/bleeding
damage = 20
armor_penetration_flat = 0
/obj/item/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/bullet/saw/bleeding/on_hit(atom/target, blocked = 0, hit_zone)
. = ..()
if((blocked != 100) && iscarbon(target))
var/mob/living/carbon/C = target
C.bleed(35)
/obj/item/projectile/bullet/saw/hollow
/obj/projectile/bullet/saw/hollow
damage = 60
armor_penetration_flat = -30
/obj/item/projectile/bullet/saw/ap
/obj/projectile/bullet/saw/ap
damage = 40
armor_penetration_percentage = 100
/obj/item/projectile/bullet/saw/incen
/obj/projectile/bullet/saw/incen
damage = 7
armor_penetration_flat = 0
immolate = 3
/obj/item/projectile/bullet/saw/incen/Move()
/obj/projectile/bullet/saw/incen/Move()
..()
var/turf/location = get_turf(src)
if(location)
@@ -144,7 +144,7 @@
desc = "A 7.62x51mm full-metal jacket rifle cartridge, commonly used in general-purpose machine guns."
icon_state = "rifle_brass"
caliber = "mm762x51"
projectile_type = /obj/item/projectile/bullet/saw
projectile_type = /obj/projectile/bullet/saw
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
@@ -152,23 +152,23 @@
name = "7.62x51mm 'Shredder' round"
desc = "A 7.62x51mm 'Shredder' cartridge, with a heavily serrated tip intended to cause massive bleeding."
icon_state = "rifle_brass_surplus"
projectile_type = /obj/item/projectile/bullet/saw/bleeding
projectile_type = /obj/projectile/bullet/saw/bleeding
/obj/item/ammo_casing/mm762x51/hollow
name = "7.62x51mm hollow point round"
desc = "A 7.62x51mm rifle cartridge designed to cause more damage to unarmored targets."
icon_state = "rifle_brass_hollow"
projectile_type = /obj/item/projectile/bullet/saw/hollow
projectile_type = /obj/projectile/bullet/saw/hollow
/obj/item/ammo_casing/mm762x51/ap
name = "7.62x51mm armor-piercing round"
desc = "A 7.62x51mm rifle cartridge with a hardened tungsten core to increase armor penetration."
icon_state = "rifle_brass_ap"
projectile_type = /obj/item/projectile/bullet/saw/ap
projectile_type = /obj/projectile/bullet/saw/ap
/obj/item/ammo_casing/mm762x51/incen
name = "7.62x51mm incendiary round"
desc = "A 7.62x51mm rifle cartridge with an incendiary chemical payload."
icon_state = "rifle_brass_incin"
projectile_type = /obj/item/projectile/bullet/saw/incen
projectile_type = /obj/projectile/bullet/saw/incen
muzzle_flash_color = LIGHT_COLOR_FIRE
@@ -24,8 +24,8 @@
AddComponent(/datum/component/scope, range_modifier = 2, flags = SCOPE_TURF_ONLY | SCOPE_NEED_ACTIVE_HAND)
/obj/item/gun/projectile/automatic/sniper_rifle/process_fire(atom/target, mob/living/user, message = TRUE, params, zone_override, bonus_spread = 0)
if(istype(chambered.BB, /obj/item/projectile/bullet/sniper) && !HAS_TRAIT(user, TRAIT_SCOPED))
var/obj/item/projectile/bullet/sniper/S = chambered.BB
if(istype(chambered.BB, /obj/projectile/bullet/sniper) && !HAS_TRAIT(user, TRAIT_SCOPED))
var/obj/projectile/bullet/sniper/S = chambered.BB
if(S.non_zoom_spread)
to_chat(user, "<span class='warning'>[src] must be zoomed in to fire this ammunition accurately!</span>")
bonus_spread += S.non_zoom_spread
@@ -62,11 +62,11 @@
desc = "A .50 BMG rifle cartridge, commonly used in anti-materiel rifles and heavy machine guns."
icon_state = "heavy_steel"
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper
projectile_type = /obj/projectile/bullet/sniper
muzzle_flash_strength = MUZZLE_FLASH_STRENGTH_STRONG
muzzle_flash_range = MUZZLE_FLASH_RANGE_STRONG
/obj/item/projectile/bullet/sniper
/obj/projectile/bullet/sniper
damage = 70
weaken = 10 SECONDS
armor_penetration_flat = 70
@@ -86,14 +86,14 @@
desc = "A .50 BMG high-explosive cartridge. Does not actually contain antimatter."
icon_state = "heavy_steel_incin"
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper/antimatter
projectile_type = /obj/projectile/bullet/sniper/antimatter
/obj/item/projectile/bullet/sniper/antimatter
/obj/projectile/bullet/sniper/antimatter
name = "antimatter bullet"
dismemberment = 50
non_zoom_spread = 60
/obj/item/projectile/bullet/sniper/antimatter/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/bullet/sniper/antimatter/on_hit(atom/target, blocked = 0, hit_zone)
if((blocked != 100) && (!ismob(target)))
target.ex_act(rand(1,2))
@@ -113,15 +113,15 @@
desc = "A .50 BMG hypodermic cartridge, loaded with sedatives for instant incapacitation."
icon_state = "heavy_steel_rubber"
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper/soporific
projectile_type = /obj/projectile/bullet/sniper/soporific
harmful = FALSE
/obj/item/projectile/bullet/sniper/soporific
/obj/projectile/bullet/sniper/soporific
armor_penetration_flat = 0
nodamage = 1
weaken = 0
/obj/item/projectile/bullet/sniper/soporific/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/bullet/sniper/soporific/on_hit(atom/target, blocked = 0, hit_zone)
if((blocked != 100) && isliving(target))
var/mob/living/L = target
L.SetSleeping(40 SECONDS)
@@ -141,14 +141,14 @@
desc = "A .50 BMG 'Shredder' cartridge, with a heavily serrated bullet intended to cause massive blood loss."
icon_state = "heavy_steel_hollow"
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper/haemorrhage
projectile_type = /obj/projectile/bullet/sniper/haemorrhage
/obj/item/projectile/bullet/sniper/haemorrhage
/obj/projectile/bullet/sniper/haemorrhage
armor_penetration_flat = 25
damage = 45
weaken = 6 SECONDS
/obj/item/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/bullet/sniper/haemorrhage/on_hit(atom/target, blocked = 0, hit_zone)
if((blocked != 100) && iscarbon(target))
var/mob/living/carbon/C = target
C.bleed(150)
@@ -169,9 +169,9 @@
desc = "A .50 BMG Sabot Penetrator cartridge, capable of punching through just about anything."
icon_state = "heavy_steel_ap"
caliber = ".50"
projectile_type = /obj/item/projectile/bullet/sniper/penetrator
projectile_type = /obj/projectile/bullet/sniper/penetrator
/obj/item/projectile/bullet/sniper/penetrator
/obj/projectile/bullet/sniper/penetrator
icon_state = "gauss"
name = "penetrator round"
damage = 60
+1 -1
View File
@@ -319,7 +319,7 @@
if(!S)
return
chambered.BB = new /obj/item/projectile/bullet/dart/syringe/pierce_ignore(src)
chambered.BB = new /obj/projectile/bullet/dart/syringe/pierce_ignore(src)
update_loaded_syringe()
chambered.BB.name = S.name
+47 -47
View File
@@ -1,4 +1,4 @@
/obj/item/projectile/beam
/obj/projectile/beam
name = "laser"
icon_state = "laser"
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
@@ -15,25 +15,25 @@
ricochets_max = 50 //Honk!
ricochet_chance = 80
/obj/item/projectile/beam/laser
/obj/projectile/beam/laser
/obj/item/projectile/beam/laser/ik
/obj/projectile/beam/laser/ik
/obj/item/projectile/beam/laser/ik/emp_act(severity)
/obj/projectile/beam/laser/ik/emp_act(severity)
if(prob(40 / severity))
range = 0
/obj/item/projectile/beam/laser/ik/on_range() //Should spark out of the gun. Theoretically, one could emp projectiles out of the air. However, its more practical to EMP the guns, rather than projectiles in flight
/obj/projectile/beam/laser/ik/on_range() //Should spark out of the gun. Theoretically, one could emp projectiles out of the air. However, its more practical to EMP the guns, rather than projectiles in flight
do_sparks(1, 1, src)
..()
/obj/item/projectile/beam/laser/heavylaser
/obj/projectile/beam/laser/heavylaser
name = "heavy laser"
icon_state = "heavylaser"
damage = 40
/obj/item/projectile/beam/laser/ai_turret
/obj/projectile/beam/laser/ai_turret
damage = 17.5 //Slight loss in damage because hitscan
forcedodge = 1
hitscan = TRUE
@@ -50,7 +50,7 @@
impact_light_range = 2.5
impact_light_color_override = LIGHT_COLOR_DARKRED
/obj/item/projectile/beam/laser/ai_turret/prehit(atom/target)
/obj/projectile/beam/laser/ai_turret/prehit(atom/target)
if(is_ai(target))
damage = 0 //cheater cheater I don't want AI to die to stupid placement eater
nodamage = 1
@@ -58,31 +58,31 @@
forcedodge = 0 //no peircing after hitting a mob to avoid rooms destroying itself. If someone does monkey chair on AI sat though, I swear to god
..()
/obj/item/projectile/beam/laser/ai_turret/heavylaser
/obj/projectile/beam/laser/ai_turret/heavylaser
damage = 35
muzzle_type = /obj/effect/projectile/muzzle/heavy_laser
tracer_type = /obj/effect/projectile/tracer/heavy_laser
impact_type = /obj/effect/projectile/impact/heavy_laser
/obj/item/projectile/beam/practice
/obj/projectile/beam/practice
name = "practice laser"
damage = 0
nodamage = 1
log_override = TRUE
/obj/item/projectile/beam/scatter
/obj/projectile/beam/scatter
name = "laser pellet"
icon_state = "scatterlaser"
damage = 5
/obj/item/projectile/beam/scatter/eshotgun
/obj/projectile/beam/scatter/eshotgun
damage = 6
tile_dropoff = 0.5
tile_dropoff_s = 0.5
range = 8
/obj/item/projectile/beam/xray
/obj/projectile/beam/xray
name = "xray beam"
icon_state = "xray"
damage = 15
@@ -93,7 +93,7 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/disabler
/obj/projectile/beam/disabler
name = "disabler beam"
icon_state = "omnilaser"
damage = 30
@@ -104,25 +104,25 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_CYAN
/obj/item/projectile/beam/disabler/weak
/obj/projectile/beam/disabler/weak
name = "weakened disabler beam"
damage = 15
armor_penetration_flat = -10
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/disabler/fake
/obj/projectile/beam/disabler/fake
name = "weakened disabler beam"
nodamage = 1
damage = 0
/obj/item/projectile/beam/disabler/pellet
/obj/projectile/beam/disabler/pellet
name = "split disabler beam"
icon_state = "scatterdisabler"
damage = 10
light_color = LIGHT_COLOR_BLUE
range = 8
/obj/item/projectile/beam/pulse
/obj/projectile/beam/pulse
name = "pulse"
icon_state = "u_laser"
damage = 50
@@ -131,7 +131,7 @@
/// If this shot can immediately destroy rwalls or not
var/weakened_against_rwalls = FALSE
/obj/item/projectile/beam/pulse/hitscan
/obj/projectile/beam/pulse/hitscan
impact_effect_type = null
light_color = null
hitscan = TRUE
@@ -147,26 +147,26 @@
impact_light_range = 2.5
impact_light_color_override = LIGHT_COLOR_DARKBLUE
/obj/item/projectile/beam/pulse/on_hit(atom/target, blocked = 0)
/obj/projectile/beam/pulse/on_hit(atom/target, blocked = 0)
if(isreinforcedwallturf(target) && weakened_against_rwalls)
target.ex_act(EXPLODE_LIGHT)
else if(isturf(target) || isstructure(target) || ismachinery(target))
target.ex_act(EXPLODE_HEAVY)
..()
/obj/item/projectile/beam/pulse/shot
/obj/projectile/beam/pulse/shot
name = "proto pulse"
damage = 40
weakened_against_rwalls = TRUE
/obj/item/projectile/beam/emitter
/obj/projectile/beam/emitter
name = "emitter beam"
icon_state = "emitter"
damage = 30
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
light_color = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/emitter/hitscan
/obj/projectile/beam/emitter/hitscan
hitscan = TRUE
muzzle_type = /obj/effect/projectile/muzzle/laser/emitter
tracer_type = /obj/effect/projectile/tracer/laser/emitter
@@ -181,10 +181,10 @@
impact_light_range = 2.5
impact_light_color_override = LIGHT_COLOR_GREEN
/obj/item/projectile/beam/emitter/singularity_pull()
/obj/projectile/beam/emitter/singularity_pull()
return //don't want the emitters to miss
/obj/item/projectile/beam/lasertag
/obj/projectile/beam/lasertag
name = "laser tag beam"
icon_state = "omnilaser"
hitsound = 'sound/weapons/tap.ogg'
@@ -196,7 +196,7 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_DARKBLUE
/obj/item/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
/obj/projectile/beam/lasertag/on_hit(atom/target, blocked = 0)
. = ..()
if(ishuman(target))
var/mob/living/carbon/human/M = target
@@ -205,34 +205,34 @@
M.apply_damage(34, STAMINA)
return 1
/obj/item/projectile/beam/lasertag/omni
/obj/projectile/beam/lasertag/omni
/obj/item/projectile/beam/lasertag/redtag
/obj/projectile/beam/lasertag/redtag
icon_state = "laser"
suit_types = list(/obj/item/clothing/suit/bluetag)
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_DARKRED
/obj/item/projectile/beam/lasertag/bluetag
/obj/projectile/beam/lasertag/bluetag
icon_state = "bluelaser"
suit_types = list(/obj/item/clothing/suit/redtag)
light_color = LIGHT_COLOR_BLUE
/obj/item/projectile/beam/immolator
/obj/projectile/beam/immolator
name = "immolation beam"
immolate = 1
/obj/item/projectile/beam/immolator/strong
/obj/projectile/beam/immolator/strong
name = "heavy immolation beam"
damage = 45
icon_state = "heavylaser"
/obj/item/projectile/beam/immolator/weak
/obj/projectile/beam/immolator/weak
name = "light immolation beam"
damage = 8
icon_state = "scatterlaser"
/obj/item/projectile/beam/immolator/weak/hitscan
/obj/projectile/beam/immolator/weak/hitscan
color = LIGHT_COLOR_FIRE
hitscan = TRUE
muzzle_type = /obj/effect/projectile/muzzle/laser
@@ -248,7 +248,7 @@
impact_light_range = 2.5
impact_light_color_override = LIGHT_COLOR_FIRE
/obj/item/projectile/beam/instakill
/obj/projectile/beam/instakill
name = "instagib laser"
icon_state = "purple_laser"
damage = 200
@@ -256,24 +256,24 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
light_color = LIGHT_COLOR_PURPLE
/obj/item/projectile/beam/instakill/blue
/obj/projectile/beam/instakill/blue
icon_state = "blue_laser"
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_DARKBLUE
/obj/item/projectile/beam/instakill/red
/obj/projectile/beam/instakill/red
icon_state = "red_laser"
impact_effect_type = /obj/effect/temp_visual/impact_effect/red_laser
light_color = LIGHT_COLOR_DARKRED
/obj/item/projectile/beam/instakill/on_hit(atom/target)
/obj/projectile/beam/instakill/on_hit(atom/target)
. = ..()
if(isliving(target))
var/mob/living/L = target
L.visible_message("<span class='danger'>[L] explodes!</span>")
L.quick_explode_gib()
/obj/item/projectile/beam/laser/detective
/obj/projectile/beam/laser/detective
name = "energy revolver shot"
icon_state = "omnilaser"
light_color = LIGHT_COLOR_CYAN
@@ -282,7 +282,7 @@
stamina = 25
eyeblur = 2 SECONDS
/obj/item/projectile/beam/laser/detective/overcharged
/obj/projectile/beam/laser/detective/overcharged
name = "overcharged shot"
icon_state = "spark"
light_color = LIGHT_COLOR_DARKRED
@@ -292,7 +292,7 @@
stamina = 15
eyeblur = 4 SECONDS
/obj/item/projectile/beam/laser/detective/tracker_warrant_shot
/obj/projectile/beam/laser/detective/tracker_warrant_shot
name = "tracker shot"
icon_state = "yellow_laser"
light_color = LIGHT_COLOR_YELLOW
@@ -300,7 +300,7 @@
stamina = 0
reflectability = REFLECTABILITY_PHYSICAL //No mr cult juggernaught, please don't set me to search!
/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/on_hit(atom/target)
/obj/projectile/beam/laser/detective/tracker_warrant_shot/on_hit(atom/target)
. = ..()
if(!ishuman(target))
no_worky(target)
@@ -308,7 +308,7 @@
start_tracking(target)
set_warrant(target)
/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/proc/start_tracking(atom/target)
/obj/projectile/beam/laser/detective/tracker_warrant_shot/proc/start_tracking(atom/target)
var/obj/item/gun/energy/detective/D = firer_source_atom
if(!D)
no_worky(target)
@@ -318,7 +318,7 @@
return
D.start_pointing(target.UID())
/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/proc/set_warrant(atom/target)
/obj/projectile/beam/laser/detective/tracker_warrant_shot/proc/set_warrant(atom/target)
var/mob/living/carbon/human/target_to_mark = target
var/perpname = target_to_mark.get_visible_name(TRUE)
if(!perpname || perpname == "Unknown")
@@ -330,7 +330,7 @@
return
set_criminal_status(firer, R, SEC_RECORD_STATUS_SEARCH, "Target tagged by Detective Revolver", "Detective Revolver")
/obj/item/projectile/beam/laser/detective/tracker_warrant_shot/proc/no_worky(atom/target, tracking_already, warrant_fail)
/obj/projectile/beam/laser/detective/tracker_warrant_shot/proc/no_worky(atom/target, tracking_already, warrant_fail)
if(tracking_already)
to_chat(firer, "<span class='danger'>Weapon Alert: You are already tracking a target!</span>")
return
@@ -339,7 +339,7 @@
return
to_chat(firer, "<span class='danger'>Weapon Alert: unable to track [target]!</span>")
/obj/item/projectile/beam/silencer
/obj/projectile/beam/silencer
name = "energy beam" //Keep it vague? It's not a laser, but it's silenced, does a person know what it is?
icon_state = "omnilaser"
stamina = 30
@@ -351,13 +351,13 @@
impact_effect_type = /obj/effect/temp_visual/impact_effect/blue_laser
light_color = LIGHT_COLOR_CYAN
/obj/item/projectile/beam/laser/sparker
/obj/projectile/beam/laser/sparker
name = "sparker beam"
icon_state = "scatterlaser"
damage = 12.5
range = 12
/obj/item/projectile/beam/laser/sparker/on_range()
/obj/projectile/beam/laser/sparker/on_range()
new /obj/effect/particle_effect/sparks(get_turf(src))
return ..()
+59 -59
View File
@@ -1,16 +1,16 @@
/obj/item/projectile/bullet
/obj/projectile/bullet
name = "bullet"
damage = 60
hitsound_wall = "ricochet"
impact_effect_type = /obj/effect/temp_visual/impact_effect
/// beanbag, heavy stamina damage
/obj/item/projectile/bullet/weakbullet
/obj/projectile/bullet/weakbullet
name = "beanbag slug"
damage = 5
stamina = 40
/obj/item/projectile/bullet/weakbullet/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/weakbullet/on_hit(atom/target, blocked = 0)
. = ..()
if(isliving(target))
var/mob/living/L = target
@@ -18,9 +18,9 @@
var/atom/throw_target = get_edge_target_turf(L, get_dir(src, get_step_away(L, starting)))
L.throw_at(throw_target, 1, 2)
/obj/item/projectile/bullet/weakbullet/booze
/obj/projectile/bullet/weakbullet/booze
/obj/item/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/weakbullet/booze/on_hit(atom/target, blocked = 0)
if(..(target, blocked))
var/mob/living/M = target
M.AdjustDizzy(40 SECONDS)
@@ -37,57 +37,57 @@
M.AdjustDrowsy(20 SECONDS)
A.volume += 5 //Because we can
/obj/item/projectile/bullet/weakbullet2
/obj/projectile/bullet/weakbullet2
name = "rubber bullet"
damage = 5
stamina = 35
icon_state = "bullet-r"
/obj/item/projectile/bullet/weakbullet3
/obj/projectile/bullet/weakbullet3
damage = 20
/obj/item/projectile/bullet/weakbullet4
/obj/projectile/bullet/weakbullet4
name = "rubber bullet"
damage = 5
stamina = 30
icon_state = "bullet-r"
/obj/item/projectile/bullet/toxinbullet
/obj/projectile/bullet/toxinbullet
damage = 15
damage_type = TOX
color = COLOR_GREEN
/obj/item/projectile/bullet/incendiary
/obj/projectile/bullet/incendiary
immolate = 1
/obj/item/projectile/bullet/incendiary/firebullet
/obj/projectile/bullet/incendiary/firebullet
damage = 10
/obj/item/projectile/bullet/armourpiercing
/obj/projectile/bullet/armourpiercing
damage = 17
armor_penetration_flat = 10
/obj/item/projectile/bullet/armourpiercing/wt550
/obj/projectile/bullet/armourpiercing/wt550
damage = 15
armor_penetration_percentage = 50
armor_penetration_flat = 25
/obj/item/projectile/bullet/pellet
/obj/projectile/bullet/pellet
name = "pellet"
damage = 12.5
tile_dropoff = 0.75
tile_dropoff_s = 1.25
armor_penetration_flat = -20
/obj/item/projectile/bullet/pellet/rubber
/obj/projectile/bullet/pellet/rubber
name = "rubber pellet"
damage = 3
stamina = 12.5
icon_state = "bullet-r"
armor_penetration_flat = -10
/obj/item/projectile/bullet/pellet/rubber/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/pellet/rubber/on_hit(atom/target, blocked = 0)
. = ..()
if(!ishuman(target))
return
@@ -96,62 +96,62 @@
if(initial(range) - range <= 5 && H.getStaminaLoss() >= 60)
H.KnockDown(8 SECONDS)
/obj/item/projectile/bullet/pellet/rubber/stinger
/obj/projectile/bullet/pellet/rubber/stinger
name = "stingball"
damage = 1
/obj/item/projectile/bullet/pellet/assassination
/obj/projectile/bullet/pellet/assassination
damage = 12
tile_dropoff = 1 // slightly less damage and greater damage falloff compared to normal buckshot
/obj/item/projectile/bullet/pellet/assassination/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/pellet/assassination/on_hit(atom/target, blocked = 0)
if(..(target, blocked))
var/mob/living/M = target
M.AdjustSilence(4 SECONDS) // HELP MIME KILLING ME IN MAINT
/obj/item/projectile/bullet/midbullet
/obj/projectile/bullet/midbullet
damage = 20
stamina = 45 // Three rounds from the c20r knocks unarmoured people down, four for people with bulletproof
/obj/item/projectile/bullet/midbullet_r
/obj/projectile/bullet/midbullet_r
damage = 5
stamina = 75 //Still two rounds to knock people down
/obj/item/projectile/bullet/midbullet2
/obj/projectile/bullet/midbullet2
damage = 25
/obj/item/projectile/bullet/midbullet3
/obj/projectile/bullet/midbullet3
damage = 30
/obj/item/projectile/bullet/midbullet3/hp
/obj/projectile/bullet/midbullet3/hp
damage = 40
armor_penetration_flat = -40
/obj/item/projectile/bullet/midbullet3/ap
/obj/projectile/bullet/midbullet3/ap
damage = 27
armor_penetration_flat = 40
/obj/item/projectile/bullet/midbullet3/fire
/obj/projectile/bullet/midbullet3/fire
immolate = 1
/obj/item/projectile/bullet/midbullet3/overgrown
/obj/projectile/bullet/midbullet3/overgrown
icon = 'icons/obj/ammo.dmi'
icon_state = "peashooter_bullet"
damage = 25
/obj/item/projectile/bullet/midbullet3/overgrown/prehit(atom/target)
/obj/projectile/bullet/midbullet3/overgrown/prehit(atom/target)
if(HAS_TRAIT(target, TRAIT_I_WANT_BRAINS))
damage += 10
return ..()
/obj/item/projectile/bullet/heavybullet
/obj/projectile/bullet/heavybullet
damage = 35
/obj/item/projectile/bullet/heavybullet2
/obj/projectile/bullet/heavybullet2
damage = 40
/// taser slugs for shotguns, nothing special
/obj/item/projectile/bullet/stunshot
/obj/projectile/bullet/stunshot
name = "stunshot"
damage = 5
weaken = 10 SECONDS
@@ -161,11 +161,11 @@
icon_state = "spark"
color = "#FFFF00"
/obj/item/projectile/bullet/incendiary/shell
/obj/projectile/bullet/incendiary/shell
name = "incendiary slug"
damage = 20
/obj/item/projectile/bullet/incendiary/shell/Move()
/obj/projectile/bullet/incendiary/shell/Move()
..()
var/turf/location = get_turf(src)
if(location)
@@ -174,11 +174,11 @@
hotspot.recolor()
location.hotspot_expose(700, 50)
/obj/item/projectile/bullet/incendiary/shell/dragonsbreath
/obj/projectile/bullet/incendiary/shell/dragonsbreath
name = "dragonsbreath round"
damage = 5
/obj/item/projectile/bullet/meteorshot
/obj/projectile/bullet/meteorshot
name = "meteor"
icon = 'icons/obj/meteor.dmi'
icon_state = "dust"
@@ -186,7 +186,7 @@
knockdown = 8 SECONDS
hitsound = 'sound/effects/meteorimpact.ogg'
/obj/item/projectile/bullet/meteorshot/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/meteorshot/on_hit(atom/target, blocked = 0)
..()
if(ismovable(target))
var/atom/movable/M = target
@@ -194,15 +194,15 @@
var/atom/throw_target = get_edge_target_turf(M, get_dir(src, get_step_away(M, src)))
M.throw_at(throw_target, 3, 2)
/obj/item/projectile/bullet/meteorshot/New()
/obj/projectile/bullet/meteorshot/New()
..()
SpinAnimation()
/obj/item/projectile/bullet/mime
/obj/projectile/bullet/mime
damage = 40
var/special_effects = TRUE
/obj/item/projectile/bullet/mime/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/mime/on_hit(atom/target, blocked = 0)
..(target, blocked)
if(special_effects)
if(iscarbon(target))
@@ -215,28 +215,28 @@
for(var/obj/item/mecha_parts/mecha_equipment/weapon/honker in chassis.equipment)
honker.set_ready_state(0)
/obj/item/projectile/bullet/mime/nonlethal
/obj/projectile/bullet/mime/nonlethal
damage = 0 /// We deal no normal damage...
stamina = 40 /// ...Rather a large amount of stamina damage. Used in the mime mecha
/obj/item/projectile/bullet/mime/fake
/obj/projectile/bullet/mime/fake
damage = 0
nodamage = TRUE
special_effects = FALSE
log_override = TRUE
/obj/item/projectile/bullet/dart
/obj/projectile/bullet/dart
name = "dart"
icon_state = "cbbolt"
damage = 6
var/penetrate_thick = FALSE
/obj/item/projectile/bullet/dart/New()
/obj/projectile/bullet/dart/New()
..()
create_reagents(50)
reagents.set_reacting(FALSE)
/obj/item/projectile/bullet/dart/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/bullet/dart/on_hit(atom/target, blocked = 0, hit_zone)
if(iscarbon(target))
var/mob/living/carbon/M = target
if(blocked != INFINITY)
@@ -255,39 +255,39 @@
reagents.handle_reactions()
return TRUE
/obj/item/projectile/bullet/dart/metalfoam
/obj/projectile/bullet/dart/metalfoam
/obj/item/projectile/bullet/dart/metalfoam/New()
/obj/projectile/bullet/dart/metalfoam/New()
..()
reagents.add_reagent("aluminum", 15)
reagents.add_reagent("fluorosurfactant", 5)
reagents.add_reagent("sacid", 5)
//This one is for future syringe guns update
/obj/item/projectile/bullet/dart/syringe
/obj/projectile/bullet/dart/syringe
name = "syringe"
icon = 'icons/obj/chemical.dmi'
icon_state = "syringeproj"
/obj/item/projectile/bullet/dart/syringe/heavyduty
/obj/projectile/bullet/dart/syringe/heavyduty
damage = 20
/obj/item/projectile/bullet/dart/syringe/pierce_ignore
/obj/projectile/bullet/dart/syringe/pierce_ignore
penetrate_thick = TRUE
/obj/item/projectile/bullet/dart/syringe/tranquilizer
/obj/projectile/bullet/dart/syringe/tranquilizer
/obj/item/projectile/bullet/dart/syringe/tranquilizer/New()
/obj/projectile/bullet/dart/syringe/tranquilizer/New()
..()
reagents.add_reagent("haloperidol", 15)
/obj/item/projectile/bullet/dart/syringe/holy
/obj/projectile/bullet/dart/syringe/holy
/obj/item/projectile/bullet/dart/syringe/holy/New()
/obj/projectile/bullet/dart/syringe/holy/New()
..()
reagents.add_reagent("holywater", 10)
/obj/item/projectile/bullet/neurotoxin
/obj/projectile/bullet/neurotoxin
name = "neurotoxin spit"
icon_state = "neurotoxin"
damage = 5
@@ -295,28 +295,28 @@
stamina = 40
knockdown = 10 SECONDS
/obj/item/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/neurotoxin/on_hit(atom/target, blocked = 0)
if(isalien(target))
knockdown = 0
nodamage = TRUE
. = ..() // Execute the rest of the code.
/obj/item/projectile/bullet/anti_alien_toxin
/obj/projectile/bullet/anti_alien_toxin
name = "neurotoxin spit"
icon_state = "neurotoxin"
damage = 15 // FRENDLY FIRE FRENDLY FIRE
damage_type = BURN
/obj/item/projectile/bullet/anti_alien_toxin/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/anti_alien_toxin/on_hit(atom/target, blocked = 0)
if(isalien(target))
stun = 10 SECONDS
. = ..()
/obj/item/projectile/bullet/cap
/obj/projectile/bullet/cap
name = "cap"
damage = 0
nodamage = 1
/obj/item/projectile/bullet/cap/fire()
/obj/projectile/bullet/cap/fire()
loc = null
qdel(src)
@@ -1,4 +1,4 @@
/obj/item/projectile/energy
/obj/projectile/energy
name = "energy"
icon_state = "spark"
damage = 0
@@ -6,7 +6,7 @@
flag = "energy"
reflectability = REFLECTABILITY_ENERGY
/obj/item/projectile/energy/electrode
/obj/projectile/energy/electrode
name = "electrode"
color = "#FFFF00"
nodamage = 1
@@ -17,7 +17,7 @@
range = 7
//Damage will be handled on the MOB side, to prevent window shattering.
/obj/item/projectile/energy/electrode/on_hit(atom/target, blocked = 0)
/obj/projectile/energy/electrode/on_hit(atom/target, blocked = 0)
. = ..()
if(!ismob(target) || blocked >= 100) //Fully blocked by mob or collided with dense object - burst into sparks!
do_sparks(1, 1, src)
@@ -30,11 +30,11 @@
spawn(5)
C.Jitter(jitter)
/obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
/obj/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet
do_sparks(1, 1, src)
..()
/obj/item/projectile/energy/declone
/obj/projectile/energy/declone
name = "declone"
icon_state = "declone"
damage = 20
@@ -42,7 +42,7 @@
irradiate = 10
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
/obj/item/projectile/energy/bolt
/obj/projectile/energy/bolt
name = "bolt"
icon_state = "cbbolt"
damage = 15
@@ -52,12 +52,12 @@
knockdown = 2 SECONDS
slur = 10 SECONDS
/obj/item/projectile/energy/bolt/large
/obj/projectile/energy/bolt/large
damage = 20
#define BSG_BASE_DAMAGE 90
/obj/item/projectile/energy/bsg
/obj/projectile/energy/bsg
name = "orb of pure bluespace energy"
icon_state = "bluespace"
impact_effect_type = /obj/effect/temp_visual/bsg_kaboom
@@ -71,23 +71,23 @@
/obj/item/ammo_casing/energy/bsg/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
..()
var/obj/item/projectile/energy/bsg/P = BB
addtimer(CALLBACK(P, TYPE_PROC_REF(/obj/item/projectile/energy/bsg, make_chain), P, user), 1)
var/obj/projectile/energy/bsg/P = BB
addtimer(CALLBACK(P, TYPE_PROC_REF(/obj/projectile/energy/bsg, make_chain), P, user), 1)
/obj/item/projectile/energy/bsg/proc/make_chain(obj/item/projectile/P, mob/user)
/obj/projectile/energy/bsg/proc/make_chain(obj/projectile/P, mob/user)
P.chain = P.Beam(user, icon_state = "sm_arc_supercharged", icon = 'icons/effects/beam.dmi', time = 10 SECONDS, maxdistance = 30)
/obj/item/projectile/energy/bsg/on_hit(atom/target)
/obj/projectile/energy/bsg/on_hit(atom/target)
. = ..()
kaboom(target)
qdel(src)
/obj/item/projectile/energy/bsg/on_range()
/obj/projectile/energy/bsg/on_range()
kaboom()
new /obj/effect/temp_visual/bsg_kaboom(loc)
..()
/obj/item/projectile/energy/bsg/proc/kaboom(atom/target)
/obj/projectile/energy/bsg/proc/kaboom(atom/target)
// If a lens is modifying the damage of the projectile, the AOE should be impacted as well
var/damage_multiplier = damage / BSG_BASE_DAMAGE
playsound(src, 'sound/weapons/bsg_explode.ogg', 75, TRUE)
@@ -122,12 +122,12 @@
#undef BSG_BASE_DAMAGE
/obj/item/projectile/energy/weak_plasma
/obj/projectile/energy/weak_plasma
name = "plasma bolt"
icon_state = "plasma_light"
damage = 12.5
/obj/item/projectile/homing/charged_plasma
/obj/projectile/homing/charged_plasma
name = "charged plasma bolt"
icon_state = "plasma_heavy"
damage = 45
@@ -137,7 +137,7 @@
shield_buster = TRUE
var/reached_target = FALSE
/obj/item/projectile/homing/charged_plasma/pixel_move(trajectory_multiplier)
/obj/projectile/homing/charged_plasma/pixel_move(trajectory_multiplier)
homing_active = FALSE
if(isturf(original))
return ..() //It gets weird if it is a turf. Turfs don't move anyway.
@@ -155,13 +155,13 @@
#define ARC_REVOLVER_BASE_DAMAGE 10
/obj/item/projectile/energy/arc_revolver
/obj/projectile/energy/arc_revolver
name = "arc emitter"
icon_state = "plasma_light"
damage = ARC_REVOLVER_BASE_DAMAGE
var/charge_number = null
/obj/item/projectile/energy/arc_revolver/on_hit(atom/target)
/obj/projectile/energy/arc_revolver/on_hit(atom/target)
. = ..()
for(var/obj/effect/E in target)
if(istype(E, /obj/effect/abstract/arc_revolver))
+3 -3
View File
@@ -1,12 +1,12 @@
/obj/item/projectile/forcebolt
/obj/projectile/forcebolt
name = "force bolt"
icon_state = "ice_1"
damage = 20
flag = "energy"
/obj/item/projectile/forcebolt/strong
/obj/projectile/forcebolt/strong
/obj/item/projectile/forcebolt/on_hit(atom/movable/target, blocked = 0)
/obj/projectile/forcebolt/on_hit(atom/movable/target, blocked = 0)
. = ..()
if(istype(target) && blocked < 100)
var/throwdir = get_dir(firer, target)
@@ -1,8 +1,8 @@
/obj/item/projectile/homing
/obj/projectile/homing
name = "smart bullet"
var/homing_active = TRUE
/obj/item/projectile/homing/pixel_move(trajectory_multiplier)
/obj/projectile/homing/pixel_move(trajectory_multiplier)
. = ..()
if(!homing_active)
return
@@ -21,7 +21,7 @@
var/angle = ATAN2(dy, dx)
set_angle(angle)
/obj/item/projectile/homing/magic
/obj/projectile/homing/magic
name = "bolt of nothing"
icon_state = "energy"
damage = 0
@@ -32,7 +32,7 @@
antimagic_flags = MAGIC_RESISTANCE
antimagic_charge_cost = 1
/obj/item/projectile/homing/magic/toolbox
/obj/projectile/homing/magic/toolbox
name = "magic toolbox"
icon = 'icons/obj/storage.dmi'
icon_state = "toolbox_default"
@@ -41,11 +41,11 @@
nodamage = FALSE
damage_type = BRUTE
/obj/item/projectile/homing/magic/toolbox/on_range()
/obj/projectile/homing/magic/toolbox/on_range()
. = ..()
new /obj/item/storage/toolbox(get_turf(src))
/obj/item/projectile/homing/magic/toolbox/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/homing/magic/toolbox/on_hit(atom/target, blocked, hit_zone)
. = ..()
var/obj/item/storage/toolbox/T = new /obj/item/storage/toolbox(get_turf(src))
if(ishuman(target))
@@ -53,7 +53,7 @@
var/obj/item/organ/external/E = pick(H.bodyparts)
E.add_embedded_object(T)
/obj/item/projectile/homing/magic/homing_fireball
/obj/projectile/homing/magic/homing_fireball
name = "greater bolt of fireball"
icon_state = "fireball"
damage = 20
@@ -67,7 +67,7 @@
var/explosion_flash = 4
var/explosion_fire = 3
/obj/item/projectile/homing/magic/homing_fireball/on_hit(mob/living/target)
/obj/projectile/homing/magic/homing_fireball/on_hit(mob/living/target)
. = ..()
if(ismob(target))
if(!.)
@@ -1,4 +1,4 @@
/obj/item/projectile/magic
/obj/projectile/magic
name = "bolt of nothing"
icon_state = "energy"
damage = 0
@@ -9,7 +9,7 @@
antimagic_flags = MAGIC_RESISTANCE
antimagic_charge_cost = 1
/obj/item/projectile/magic/death
/obj/projectile/magic/death
name = "bolt of death"
icon_state = null
hitscan = TRUE
@@ -25,7 +25,7 @@
impact_light_range = 2.5
impact_light_color_override = LIGHT_COLOR_PURPLE
/obj/item/projectile/magic/death/on_hit(mob/living/carbon/target)
/obj/projectile/magic/death/on_hit(mob/living/carbon/target)
. = ..()
if(!.)
return .
@@ -43,7 +43,7 @@
target.visible_message("<span class='danger'>[target] topples backwards as the death bolt impacts [target.p_them()]!</span>")
/obj/item/projectile/magic/fireball
/obj/projectile/magic/fireball
name = "bolt of fireball"
icon_state = "fireball"
damage = 10
@@ -58,7 +58,7 @@
var/exp_flash = 3
var/exp_fire = 2
/obj/item/projectile/magic/fireball/Range()
/obj/projectile/magic/fireball/Range()
var/turf/T1 = get_step(src,turn(dir, -45))
var/turf/T2 = get_step(src,turn(dir, 45))
var/turf/T3 = get_step(src,dir)
@@ -76,7 +76,7 @@
return
..()
/obj/item/projectile/magic/fireball/on_hit(target)
/obj/projectile/magic/fireball/on_hit(target)
. = ..()
if(ismob(target))
if(!.)
@@ -87,18 +87,18 @@
M.adjustFireLoss(10) // between this 10 burn, the 10 brute, the explosion brute, and the onfire burn, your at about 65 damage if you stop drop and roll immediately
/obj/item/projectile/magic/fireball/infernal
/obj/projectile/magic/fireball/infernal
name = "infernal fireball"
exp_heavy = -1
exp_light = -1
exp_flash = 4
exp_fire= 5
/obj/item/projectile/magic/resurrection
/obj/projectile/magic/resurrection
name = "bolt of resurrection"
icon_state = "ion"
/obj/item/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
/obj/projectile/magic/resurrection/on_hit(mob/living/carbon/target)
. = ..()
if(!.)
return .
@@ -120,13 +120,13 @@
else
to_chat(target, "<span class='notice'>You rise with a start, you're alive!!!</span>")
/obj/item/projectile/magic/teleport
/obj/projectile/magic/teleport
name = "bolt of teleportation"
icon_state = "bluespace"
var/inner_tele_radius = 0
var/outer_tele_radius = 6
/obj/item/projectile/magic/teleport/on_hit(mob/target)
/obj/projectile/magic/teleport/on_hit(mob/target)
. = ..()
if(!.)
return .
@@ -142,13 +142,13 @@
smoke.set_up(max(round(10 - teleammount), 1), FALSE, stuff) //Smoke drops off if a lot of stuff is moved for the sake of sanity
smoke.start()
/obj/item/projectile/magic/door
/obj/projectile/magic/door
name = "bolt of door creation"
var/list/door_types = list(/obj/structure/mineral_door/wood,/obj/structure/mineral_door/iron,/obj/structure/mineral_door/silver,\
/obj/structure/mineral_door/gold,/obj/structure/mineral_door/uranium,/obj/structure/mineral_door/sandstone,/obj/structure/mineral_door/transparent/plasma,\
/obj/structure/mineral_door/transparent/diamond)
/obj/item/projectile/magic/door/on_hit(atom/target)
/obj/projectile/magic/door/on_hit(atom/target)
. = ..()
var/atom/T = target.loc
if(isturf(target) && target.density)
@@ -162,30 +162,30 @@
else if(istype(target, /obj/structure/closet))
OpenCloset(target)
/obj/item/projectile/magic/door/proc/CreateDoor(turf/T)
/obj/projectile/magic/door/proc/CreateDoor(turf/T)
var/door_type = pick(door_types)
var/obj/structure/mineral_door/D = new door_type(T)
T.ChangeTurf(/turf/simulated/floor/plasteel)
D.operate()
/obj/item/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D)
/obj/projectile/magic/door/proc/OpenDoor(obj/machinery/door/D)
if(istype(D,/obj/machinery/door/airlock))
var/obj/machinery/door/airlock/A = D
A.locked = FALSE
D.open()
/obj/item/projectile/magic/door/proc/OpenCloset(obj/structure/closet/C)
/obj/projectile/magic/door/proc/OpenCloset(obj/structure/closet/C)
if(istype(C, /obj/structure/closet/secure_closet))
var/obj/structure/closet/secure_closet/SC = C
SC.locked = FALSE
C.open()
/obj/item/projectile/magic/change
/obj/projectile/magic/change
name = "bolt of change"
icon_state = "ice_1"
damage_type = BURN
/obj/item/projectile/magic/change/on_hit(atom/change)
/obj/projectile/magic/change/on_hit(atom/change)
. = ..()
if(!.)
return .
@@ -342,12 +342,12 @@ GLOBAL_LIST_INIT(wabbajack_docile_animals, list(
qdel(M)
return new_mob
/obj/item/projectile/magic/animate
/obj/projectile/magic/animate
name = "bolt of animation"
icon_state = "red_1"
damage_type = BURN
/obj/item/projectile/magic/animate/Bump(atom/change)
/obj/projectile/magic/animate/Bump(atom/change)
if(isitem(change) || isstructure(change) && !is_type_in_list(change, GLOB.protected_objects))
if(istype(change, /obj/structure/closet/statue))
for(var/mob/living/carbon/human/H in change.contents)
@@ -377,7 +377,7 @@ GLOBAL_LIST_INIT(wabbajack_docile_animals, list(
C.ChangeOwner(firer)
return ..()
/obj/item/projectile/magic/slipping
/obj/projectile/magic/slipping
name = "magical banana"
icon = 'icons/obj/hydroponics/harvest.dmi'
icon_state = "banana"
@@ -385,11 +385,11 @@ GLOBAL_LIST_INIT(wabbajack_docile_animals, list(
var/slip_weaken = 10 SECONDS
hitsound = 'sound/items/bikehorn.ogg'
/obj/item/projectile/magic/slipping/New()
/obj/projectile/magic/slipping/New()
..()
SpinAnimation()
/obj/item/projectile/magic/slipping/on_hit(atom/target, blocked = 0)
/obj/projectile/magic/slipping/on_hit(atom/target, blocked = 0)
. = ..()
if(!.)
return .
@@ -408,7 +408,7 @@ GLOBAL_LIST_INIT(wabbajack_docile_animals, list(
L.Weaken(slip_weaken)
L.Stun(slip_stun)
/obj/item/projectile/magic/arcane_barrage
/obj/projectile/magic/arcane_barrage
name = "arcane bolt"
icon_state = "arcane_barrage"
damage = 20
+11 -11
View File
@@ -1,31 +1,31 @@
/obj/item/projectile/bullet/reusable
/obj/projectile/bullet/reusable
name = "reusable bullet"
desc = "How do you even reuse a bullet?"
var/ammo_type = /obj/item/ammo_casing/caseless/
var/dropped = 0
impact_effect_type = null
/obj/item/projectile/bullet/reusable/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/reusable/on_hit(atom/target, blocked = 0)
. = ..()
handle_drop()
/obj/item/projectile/bullet/reusable/on_range()
/obj/projectile/bullet/reusable/on_range()
handle_drop()
..()
/obj/item/projectile/bullet/reusable/proc/handle_drop()
/obj/projectile/bullet/reusable/proc/handle_drop()
if(!dropped)
new ammo_type(loc)
dropped = 1
/obj/item/projectile/bullet/reusable/magspear
/obj/projectile/bullet/reusable/magspear
name = "magnetic spear"
desc = "WHITE WHALE, HOLY GRAIL!"
damage = 30 //takes 3 spears to kill a mega carp, one to kill a normal carp
icon_state = "magspear"
ammo_type = /obj/item/ammo_casing/caseless/magspear
/obj/item/projectile/bullet/reusable/foam_dart
/obj/projectile/bullet/reusable/foam_dart
name = "foam dart"
desc = "I hope you're wearing eye protection."
damage = 0 // It's a damn toy.
@@ -38,7 +38,7 @@
var/obj/item/pen/pen = null
log_override = TRUE//it won't log even when there's a pen inside, but since the damage will be so low, I don't think there's any point in making it any more complex
/obj/item/projectile/bullet/reusable/foam_dart/handle_drop()
/obj/projectile/bullet/reusable/foam_dart/handle_drop()
if(dropped)
return
dropped = 1
@@ -51,11 +51,11 @@
pen = null
newdart.update_appearance(UPDATE_DESC|UPDATE_ICON_STATE)
/obj/item/projectile/bullet/reusable/foam_dart/Destroy()
/obj/projectile/bullet/reusable/foam_dart/Destroy()
QDEL_NULL(pen)
return ..()
/obj/item/projectile/bullet/reusable/foam_dart/riot
/obj/projectile/bullet/reusable/foam_dart/riot
name = "riot foam dart"
icon_state = "foamdart_riot"
damage = 25
@@ -64,13 +64,13 @@
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/riot
log_override = FALSE
/obj/item/projectile/bullet/reusable/foam_dart/sniper
/obj/projectile/bullet/reusable/foam_dart/sniper
name = "foam sniper dart"
icon_state = "foamdartsniper"
ammo_type = /obj/item/ammo_casing/caseless/foam_dart/sniper
range = 30
/obj/item/projectile/bullet/reusable/foam_dart/sniper/riot
/obj/projectile/bullet/reusable/foam_dart/sniper/riot
name = "riot sniper foam dart"
icon_state = "foamdartsniper_riot"
damage = 100
@@ -1,4 +1,4 @@
/obj/item/projectile/ion
/obj/projectile/ion
name = "ion bolt"
icon_state = "ion"
damage = 0
@@ -10,38 +10,38 @@
var/strong_emp = 1
var/weak_emp = 1
/obj/item/projectile/ion/on_hit(atom/target, blocked = 0)
/obj/projectile/ion/on_hit(atom/target, blocked = 0)
..()
empulse(target, strong_emp, weak_emp, TRUE, cause = "[type] fired by [key_name(firer)]")
return TRUE
/obj/item/projectile/ion/weak
/obj/projectile/ion/weak
strong_emp = -1
weak_emp = 0
/obj/item/projectile/bullet/gyro
/obj/projectile/bullet/gyro
name ="explosive bolt"
icon_state= "bolter"
damage = 50
alwayslog = TRUE
/obj/item/projectile/bullet/gyro/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/gyro/on_hit(atom/target, blocked = 0)
..()
explosion(target, -1, 0, 2, cause = "[type] fired by [key_name(firer)]")
return TRUE
/obj/item/projectile/bullet/a40mm
/obj/projectile/bullet/a40mm
name ="40mm grenade"
desc = "USE A WEEL GUN."
icon_state= "bolter"
alwayslog = TRUE
/obj/item/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = 0)
..()
explosion(target, -1, 0, 2, 1, 0, flame_range = 3, cause = "[type] fired by [key_name(firer)]")
return TRUE
/obj/item/projectile/temp
/obj/projectile/temp
name = "temperature beam"
icon_state = "temp_4"
damage = 0
@@ -51,7 +51,7 @@
var/temperature = 300
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
/obj/item/projectile/temp/New(loc, shot_temp)
/obj/projectile/temp/New(loc, shot_temp)
..()
if(!isnull(shot_temp))
temperature = shot_temp
@@ -88,7 +88,7 @@
icon_state = "temp_4"
/obj/item/projectile/temp/on_hit(atom/target, blocked = 0)//These two could likely check temp protection on the mob
/obj/projectile/temp/on_hit(atom/target, blocked = 0)//These two could likely check temp protection on the mob
..()
if(isliving(target))
var/mob/living/M = target
@@ -99,14 +99,14 @@
playsound(M.loc, 'sound/effects/bamf.ogg', 50, 0)
return 1
/obj/item/projectile/meteor
/obj/projectile/meteor
name = "meteor"
icon = 'icons/obj/meteor.dmi'
icon_state = "small"
damage = 0
nodamage = 1
/obj/item/projectile/meteor/Bump(atom/A)
/obj/projectile/meteor/Bump(atom/A)
if(A == firer)
loc = A.loc
return
@@ -116,14 +116,14 @@
shake_camera(M, 3, 1)
qdel(src)
/obj/item/projectile/missile
/obj/projectile/missile
icon = 'icons/obj/grenade.dmi'
icon_state = "missile"
damage = 50
///If the missile will have a heavy, or light explosion.
var/heavy = TRUE
/obj/item/projectile/missile/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/missile/on_hit(atom/target, blocked, hit_zone)
..()
if(heavy)
explosion(target, 1, 2, 3, cause = "[type] fired by [key_name(firer)]")
@@ -131,47 +131,47 @@
explosion(target, -1, 0, 2, cause = "[type] fired by [key_name(firer)]")
return TRUE
/obj/item/projectile/missile/light
/obj/projectile/missile/light
damage = 15
heavy = FALSE
/obj/item/projectile/energy/floramut
/obj/projectile/energy/floramut
name = "alpha somatoray"
icon_state = "energy"
damage_type = TOX
nodamage = TRUE
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
/obj/item/projectile/energy/florayield
/obj/projectile/energy/florayield
name = "beta somatoray"
icon_state = "energy2"
damage_type = TOX
nodamage = TRUE
impact_effect_type = /obj/effect/temp_visual/impact_effect/green_laser
/obj/item/projectile/energy/mindflayer
/obj/projectile/energy/mindflayer
name = "flayer ray"
/obj/item/projectile/energy/mindflayer/on_hit(atom/target, blocked = 0)
/obj/projectile/energy/mindflayer/on_hit(atom/target, blocked = 0)
. = ..()
if(ishuman(target))
var/mob/living/carbon/human/M = target
M.adjustBrainLoss(20)
M.AdjustHallucinate(20 SECONDS)
/obj/item/projectile/clown
/obj/projectile/clown
name = "snap-pop"
icon = 'icons/obj/toy.dmi'
icon_state = "snappop"
/obj/item/projectile/clown/Bump(atom/A as mob|obj|turf|area)
/obj/projectile/clown/Bump(atom/A as mob|obj|turf|area)
do_sparks(3, 1, src)
new /obj/effect/decal/cleanable/ash(loc)
visible_message("<span class='warning'>[src] explodes!</span>","<span class='warning'>You hear a snap!</span>")
playsound(src, 'sound/effects/snap.ogg', 50, 1)
qdel(src)
/obj/item/projectile/beam/wormhole
/obj/projectile/beam/wormhole
name = "wormhole beam"
icon_state = "spark"
hitsound = "sparks"
@@ -180,16 +180,16 @@
color = "#33CCFF"
nodamage = TRUE
/obj/item/projectile/beam/wormhole/orange
/obj/projectile/beam/wormhole/orange
name = "orange wormhole beam"
color = "#FF6600"
/obj/item/projectile/beam/wormhole/New(obj/item/ammo_casing/energy/wormhole/casing)
/obj/projectile/beam/wormhole/New(obj/item/ammo_casing/energy/wormhole/casing)
..()
if(istype(casing))
gun = casing.gun
/obj/item/projectile/beam/wormhole/on_hit(atom/target)
/obj/projectile/beam/wormhole/on_hit(atom/target)
if(ismob(target))
if(is_teleport_allowed(target.z))
var/turf/portal_destination = pick(orange(6, src))
@@ -199,30 +199,30 @@
qdel(src)
gun.create_portal(src)
/obj/item/projectile/bullet/frag12
/obj/projectile/bullet/frag12
name ="explosive slug"
damage = 15
alwayslog = TRUE
/obj/item/projectile/bullet/frag12/on_hit(atom/target, blocked = 0)
/obj/projectile/bullet/frag12/on_hit(atom/target, blocked = 0)
..()
explosion(target, -1, 0, 1, cause = "frag 12 fired by [key_name(firer)]")
return TRUE
/obj/item/projectile/bullet/confetti
/obj/projectile/bullet/confetti
name = "confetti shot"
damage = 0
range = 3
/obj/item/projectile/bullet/confetti/on_range()
/obj/projectile/bullet/confetti/on_range()
confettisize(src, 7, 3)
..()
/obj/item/projectile/bullet/confetti/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/bullet/confetti/on_hit(atom/target, blocked, hit_zone)
confettisize(src, 7, 3)
..()
/obj/item/projectile/plasma
/obj/projectile/plasma
name = "plasma blast"
icon_state = "plasmacutter"
damage = 5
@@ -243,14 +243,14 @@
impact_light_range = 2.5
impact_light_color_override = LIGHT_COLOR_CYAN
/obj/item/projectile/plasma/prehit(atom/target)
/obj/projectile/plasma/prehit(atom/target)
. = ..()
if(!lavaland_equipment_pressure_check(get_turf(target)))
name = "weakened [name]"
dismemberment = 0
sharp = FALSE
/obj/item/projectile/plasma/on_hit(atom/target)
/obj/projectile/plasma/on_hit(atom/target)
. = ..()
if(ismineralturf(target))
if(is_ancient_rock(target))
@@ -263,27 +263,27 @@
else
forcedodge = 0
/obj/item/projectile/plasma/adv
/obj/projectile/plasma/adv
damage = 7
range = 5
/obj/item/projectile/plasma/adv/mech
/obj/projectile/plasma/adv/mech
damage = 10
range = 9
/obj/item/projectile/energy/teleport
/obj/projectile/energy/teleport
name = "teleportation burst"
icon_state = "bluespace"
nodamage = 1
alwayslog = TRUE
var/obj/item/beacon/teleport_target
/obj/item/projectile/energy/teleport/New(loc, tele_target)
/obj/projectile/energy/teleport/New(loc, tele_target)
..(loc)
if(tele_target)
teleport_target = tele_target
/obj/item/projectile/energy/teleport/on_hit(atom/target, blocked = 0)
/obj/projectile/energy/teleport/on_hit(atom/target, blocked = 0)
var/turf/target_turf = get_turf(teleport_target)
if(isliving(target))
if(istype(target_turf) && (target_turf.z == target.z || teleport_target.emagged))
@@ -293,13 +293,13 @@
add_attack_logs(firer, target, "Shot with a [type] [teleport_target ? "(Destination: [teleport_target])" : ""]")
return ..()
/obj/item/projectile/energy/demonic_grappler
/obj/projectile/energy/demonic_grappler
name = "demonic grappler"
icon_state = "bluespace"
nodamage = 1
pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE
/obj/item/projectile/energy/demonic_grappler/on_hit(atom/target, blocked = 0)
/obj/projectile/energy/demonic_grappler/on_hit(atom/target, blocked = 0)
if(isliving(target))
var/turf/source_turf = get_turf(firer)
do_teleport(target, source_turf)
@@ -308,31 +308,31 @@
do_teleport(firer, miss_turf)
return ..()
/obj/item/projectile/snowball
/obj/projectile/snowball
name = "snowball"
icon_state = "snowball"
hitsound = 'sound/items/dodgeball.ogg'
damage = 4
damage_type = BURN
/obj/item/projectile/snowball/on_hit(atom/target) //chilling
/obj/projectile/snowball/on_hit(atom/target) //chilling
. = ..()
if(isliving(target))
var/mob/living/M = target
M.bodytemperature = max(0, M.bodytemperature - 50) //each hit will drop your body temp, so don't get surrounded!
M.ExtinguishMob() //bright side, they counter being on fire!
/obj/item/projectile/ornament
/obj/projectile/ornament
name = "ornament"
icon_state = "ornament-1"
hitsound = 'sound/effects/glasshit.ogg'
damage = 7
/obj/item/projectile/ornament/New()
/obj/projectile/ornament/New()
icon_state = pick("ornament-1", "ornament-2")
..()
/obj/item/projectile/ornament/on_hit(atom/target) //knockback
/obj/projectile/ornament/on_hit(atom/target) //knockback
..()
if(isturf(target))
return 0
@@ -341,7 +341,7 @@
T.throw_at(get_edge_target_turf(target, throwdir),10,10)
return 1
/obj/item/projectile/mimic
/obj/projectile/mimic
name = "googly-eyed gun"
hitsound = 'sound/weapons/genhit1.ogg'
damage = 0
@@ -350,7 +350,7 @@
flag = "melee"
var/obj/item/gun/stored_gun
/obj/item/projectile/mimic/New(loc, mimic_type)
/obj/projectile/mimic/New(loc, mimic_type)
..(loc)
if(mimic_type)
stored_gun = new mimic_type(src)
@@ -359,7 +359,7 @@
overlays = stored_gun.overlays
SpinAnimation(20, -1)
/obj/item/projectile/mimic/on_hit(atom/target)
/obj/projectile/mimic/on_hit(atom/target)
..()
var/turf/T = get_turf(src)
var/obj/item/gun/G = stored_gun
+1 -1
View File
@@ -1,4 +1,4 @@
/obj/item/projectile/neurotox
/obj/projectile/neurotox
name = "neurotoxin"
damage = 30
icon_state = "toxin"
+44 -37
View File
@@ -3,7 +3,7 @@
/// How many pixels to move the muzzle flash up so your character doesn't look like they're shitting out lasers.
#define MUZZLE_EFFECT_PIXEL_INCREMENT 17
/obj/item/projectile
/obj/projectile
name = "projectile"
icon = 'icons/obj/projectiles.dmi'
icon_state = "bullet"
@@ -11,7 +11,15 @@
anchored = TRUE //There's a reason this is here, Mport. God fucking damn it -Agouri. Find&Fix by Pete. The reason this is here is to stop the curving of emitter shots.
flags = ABSTRACT
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
hitsound = 'sound/weapons/pierce.ogg'
blocks_emissive = EMISSIVE_BLOCK_GENERIC
pass_flags = PASSTABLE
animate_movement = NO_STEPS
/// Flat armor reduction, occurs after percentage armor penetration.
var/armor_penetration_flat
/// Percentage armor reduction, happens before flat armor reduction.
var/armor_penetration_percentage
/// Hit sound to play when we hit something
var/hitsound = 'sound/weapons/pierce.ogg'
var/hitsound_wall = ""
var/def_zone = "" //Aiming at
var/mob/firer = null//Who shot it
@@ -31,7 +39,6 @@
var/Angle = null
var/original_angle = null //Angle at firing
var/spread = 0 //amount (in degrees) of projectile spread
animate_movement = NO_STEPS
var/ignore_source_check = FALSE
@@ -41,7 +48,7 @@
var/damage_type = BRUTE //BRUTE, BURN, TOX, OXY, CLONE are the only things that should be in here
var/nodamage = FALSE //Determines if the projectile will skip any damage inflictions
var/flag = BULLET //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb //Cael - bio and rad are also valid
var/projectile_type = "/obj/item/projectile"
var/projectile_type = "/obj/projectile"
var/range = 50 //This will de-increment every step. When 0, it will delete the projectile.
/// Determines the reflectability level of a projectile, either REFLECTABILITY_NEVER, REFLECTABILITY_PHYSICAL, REFLECTABILITY_ENERGY in order of ease to reflect.
var/reflectability = REFLECTABILITY_PHYSICAL
@@ -138,17 +145,17 @@
/// determines the drain cost on the antimagic item
var/antimagic_charge_cost
/obj/item/projectile/New()
/obj/projectile/New()
return ..()
/obj/item/projectile/Initialize(mapload)
/obj/projectile/Initialize(mapload)
. = ..()
var/static/list/loc_connections = list(
COMSIG_ATOM_ENTERED = PROC_REF(on_atom_entered)
)
AddElement(/datum/element/connect_loc, loc_connections)
/obj/item/projectile/proc/Range()
/obj/projectile/proc/Range()
range--
if(damage && tile_dropoff)
damage = max(0, damage - tile_dropoff) // decrement projectile damage based on dropoff value for each tile it moves
@@ -159,10 +166,10 @@
if(!damage && !stamina && (tile_dropoff || tile_dropoff_s))
on_range()
/obj/item/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range
/obj/projectile/proc/on_range() //if we want there to be effects when they reach the end of their range
qdel(src)
/obj/item/projectile/proc/prehit(atom/target)
/obj/projectile/proc/prehit(atom/target)
if(isliving(target))
var/mob/living/victim = target
if(victim.can_block_magic(antimagic_flags, antimagic_charge_cost))
@@ -172,7 +179,7 @@
return FALSE
return TRUE
/obj/item/projectile/proc/on_hit(atom/target, blocked = 0, hit_zone)
/obj/projectile/proc/on_hit(atom/target, blocked = 0, hit_zone)
var/turf/target_loca = get_turf(target)
var/hitx
var/hity
@@ -263,7 +270,7 @@
return were_affects_applied
/obj/item/projectile/proc/get_splatter_blockage(turf/step_over, atom/target, splatter_dir, target_loca) //Check whether the place we want to splatter blood is blocked (i.e. by windows).
/obj/projectile/proc/get_splatter_blockage(turf/step_over, atom/target, splatter_dir, target_loca) //Check whether the place we want to splatter blood is blocked (i.e. by windows).
var/turf/step_cardinal = !(splatter_dir in list(NORTH, SOUTH, EAST, WEST)) ? get_step(target_loca, get_cardinal_dir(target_loca, step_over)) : null
if(step_over.density && !step_over.CanPass(target, step_over, 1)) //Preliminary simple check.
@@ -272,18 +279,18 @@
if(border_obstacle.flags&ON_BORDER && get_dir(step_cardinal ? step_cardinal : target_loca, step_over) == turn(border_obstacle.dir, 180))
return TRUE
/obj/item/projectile/proc/vol_by_damage()
/obj/projectile/proc/vol_by_damage()
if(damage)
return clamp((damage) * 0.67, 30, 100)// Multiply projectile damage by 0.67, then clamp the value between 30 and 100
else
return 50 //if the projectile doesn't do damage, play its hitsound at 50% volume
/obj/item/projectile/proc/store_hitscan_collision(datum/point_precise/point_cache)
/obj/projectile/proc/store_hitscan_collision(datum/point_precise/point_cache)
beam_segments[beam_index] = point_cache
beam_index = point_cache
beam_segments[beam_index] = null
/obj/item/projectile/Bump(atom/A)
/obj/projectile/Bump(atom/A)
if(check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max && is_reflectable(REFLECTABILITY_PHYSICAL))
if(hitscan && ricochets_max > 10)
ricochets_max = 10 //I do not want a chucklefuck editing this higher, sorry.
@@ -341,10 +348,10 @@
picked_mob.bullet_act(src, def_zone)
qdel(src)
/obj/item/projectile/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
/obj/projectile/Process_Spacemove(movement_dir = 0, continuous_move = FALSE)
return 1 //Bullets don't drift in space
/obj/item/projectile/process()
/obj/projectile/process()
if(!loc || !trajectory)
return PROCESS_KILL
if(paused || !isturf(loc))
@@ -364,7 +371,7 @@
for(var/i in 1 to required_moves)
pixel_move(1)
/obj/item/projectile/proc/pixel_move(trajectory_multiplier, hitscanning = FALSE)
/obj/projectile/proc/pixel_move(trajectory_multiplier, hitscanning = FALSE)
if(!loc || !trajectory)
return
last_projectile_move = world.time
@@ -408,7 +415,7 @@
animate(src, pixel_x = trajectory.return_px(), pixel_y = trajectory.return_py(), time = 1, flags = ANIMATION_END_NOW)
Range()
/obj/item/projectile/proc/fire(setAngle)
/obj/projectile/proc/fire(setAngle)
if(setAngle)
Angle = setAngle
if(!current || loc == current)
@@ -431,7 +438,7 @@
START_PROCESSING(SSprojectiles, src)
pixel_move(1, FALSE)
/obj/item/projectile/proc/reflect_back(atom/source, list/position_modifiers = list(0, 0, 0, 0, 0, -1, 1, -2, 2))
/obj/projectile/proc/reflect_back(atom/source, list/position_modifiers = list(0, 0, 0, 0, 0, -1, 1, -2, 2))
if(!starting)
return
var/new_x = starting.x + pick(position_modifiers)
@@ -452,14 +459,14 @@
set_angle(get_angle(curloc, original))
/// A mob moving on a tile with a projectile is hit by it.
/obj/item/projectile/proc/on_atom_entered(datum/source, atom/movable/entered)
/obj/projectile/proc/on_atom_entered(datum/source, atom/movable/entered)
if(!isliving(entered))
return
var/mob/living_entered = entered
if(((living_entered.density || !living_entered.projectile_hit_check(src))) && !checkpass(PASSMOB) && !(living_entered in permutated) && (living_entered.loc == loc))
Bump(entered, 1)
/obj/item/projectile/Destroy()
/obj/projectile/Destroy()
if(hitscan)
finalize_hitscan_and_generate_tracers()
STOP_PROCESSING(SSprojectiles, src)
@@ -468,12 +475,12 @@
firer = null
return ..()
/obj/item/projectile/proc/dumbfire(dir)
/obj/projectile/proc/dumbfire(dir)
current = get_ranged_target_turf(src, dir, world.maxx) //world.maxx is the range. Not sure how to handle this better.
fire()
/obj/item/projectile/proc/on_ricochet(atom/A)
/obj/projectile/proc/on_ricochet(atom/A)
if(!ricochet_auto_aim_angle || !ricochet_auto_aim_range)
return
@@ -490,12 +497,12 @@
if(unlucky_sob)
set_angle(get_angle(src, unlucky_sob.loc))
/obj/item/projectile/proc/check_ricochet()
/obj/projectile/proc/check_ricochet()
if(prob(ricochet_chance))
return TRUE
return FALSE
/obj/item/projectile/proc/check_ricochet_flag(atom/A)
/obj/projectile/proc/check_ricochet_flag(atom/A)
if((flag in list(ENERGY, LASER)) && (A.flags_ricochet & RICOCHET_SHINY))
return TRUE
@@ -504,7 +511,7 @@
return FALSE
/obj/item/projectile/set_angle(new_angle)
/obj/projectile/set_angle(new_angle)
..()
Angle = new_angle
@@ -517,7 +524,7 @@
store_hitscan_collision(point_cache)
return TRUE
/obj/item/projectile/proc/set_angle_centered(new_angle)
/obj/projectile/proc/set_angle_centered(new_angle)
set_angle(new_angle)
var/list/coordinates = trajectory.return_coordinates()
trajectory.set_location(coordinates[1], coordinates[2], coordinates[3]) // Sets the trajectory to the center of the tile it bounced at
@@ -528,10 +535,10 @@
store_hitscan_collision(point_cache)
return TRUE
/obj/item/projectile/experience_pressure_difference()
/obj/projectile/experience_pressure_difference()
return // Immune to gas flow.
/obj/item/projectile/forceMove(atom/target)
/obj/projectile/forceMove(atom/target)
. = ..()
if(QDELETED(src)) // we coulda bumped something
return
@@ -542,20 +549,20 @@
if(hitscan)
record_hitscan_start(RETURN_PRECISE_POINT(src))
/obj/item/projectile/proc/is_reflectable(desired_reflectability_level)
/obj/projectile/proc/is_reflectable(desired_reflectability_level)
if(reflectability == REFLECTABILITY_NEVER) //You'd trust coders not to try and override never reflectable things, but heaven help us I do not
return FALSE
if(reflectability < desired_reflectability_level)
return FALSE
return TRUE
/obj/item/projectile/proc/record_hitscan_start(datum/point_precise/point_cache)
/obj/projectile/proc/record_hitscan_start(datum/point_precise/point_cache)
if(point_cache)
beam_segments = list()
beam_index = point_cache
beam_segments[beam_index] = null //record start.
/obj/item/projectile/proc/process_hitscan()
/obj/projectile/proc/process_hitscan()
//Safety here is to make hitscan stop if something goes wrong. Why is it equal to range * 10, when range is the maximum amount of tiles it can go? No clue.
var/safety = range * 10
record_hitscan_start(RETURN_POINT_VECTOR_INCREMENT(src, Angle, MUZZLE_EFFECT_PIXEL_INCREMENT, 1))
@@ -571,13 +578,13 @@
return //Kill!
pixel_move(1, TRUE)
/obj/item/projectile/proc/finalize_hitscan_and_generate_tracers(impacting = TRUE)
/obj/projectile/proc/finalize_hitscan_and_generate_tracers(impacting = TRUE)
if(trajectory && beam_index)
var/datum/point_precise/point_cache = trajectory.copy_to()
beam_segments[beam_index] = point_cache
generate_hitscan_tracers(null, hitscan_duration, impacting)
/obj/item/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE)
/obj/projectile/proc/generate_hitscan_tracers(cleanup = TRUE, duration = 3, impacting = TRUE)
if(!length(beam_segments))
return
if(tracer_type)
@@ -607,7 +614,7 @@
if(cleanup)
cleanup_beam_segments()
/obj/item/projectile/proc/cleanup_beam_segments()
/obj/projectile/proc/cleanup_beam_segments()
QDEL_LIST_ASSOC(beam_segments)
/**
@@ -618,7 +625,7 @@
* This is NOT used for pacifist checks, that's handled by [/obj/item/ammo_casing/var/harmful]
* This is used in places such as AI responses to determine if they're being threatened or not (among other places)
*/
/obj/item/projectile/proc/is_hostile_projectile()
/obj/projectile/proc/is_hostile_projectile()
if(damage > 0 || stamina > 0)
return TRUE
@@ -633,7 +640,7 @@
playsound(src, sound, vol = 100, vary = TRUE)
var/turf/startloc = get_turf(src)
var/obj/item/projectile/bullet = new projectile_type(startloc)
var/obj/projectile/bullet = new projectile_type(startloc)
bullet.starting = startloc
bullet.firer = firer || src
bullet.firer_source_atom = src