/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 15:23:20 +05:00
committed by GitHub
parent e92a45369a
commit f96b26b75a
169 changed files with 858 additions and 851 deletions
@@ -253,7 +253,7 @@
/obj/item/ammo_casing/magic/tentacle
name = "tentacle"
desc = "a tentacle."
projectile_type = /obj/item/projectile/tentacle
projectile_type = /obj/projectile/tentacle
caliber = "tentacle"
icon = 'icons/obj/projectiles.dmi'
icon_state = "tentacle_end"
@@ -269,7 +269,7 @@
gun = null
return ..()
/obj/item/projectile/tentacle
/obj/projectile/tentacle
name = "tentacle"
icon_state = "tentacle_end"
damage = 0
@@ -278,11 +278,11 @@
reflectability = REFLECTABILITY_NEVER //Let us not reflect this ever. It's not quite a bullet, and a cling should never wrap its tentacle around itself, it controls its body well
var/obj/item/ammo_casing/magic/tentacle/source //the item that shot it
/obj/item/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing)
/obj/projectile/tentacle/New(obj/item/ammo_casing/magic/tentacle/tentacle_casing)
source = tentacle_casing
..()
/obj/item/projectile/tentacle/fire(setAngle)
/obj/projectile/tentacle/fire(setAngle)
if(firer)
chain = firer.Beam(src, icon_state = "tentacle", time = INFINITY, maxdistance = INFINITY)
..()
@@ -298,7 +298,7 @@
I.melee_attack_chain(src, C)//Hits the victim with whatever they are holding that is no the zero force tentacle
/obj/item/projectile/tentacle/on_hit(atom/target, blocked = 0)
/obj/projectile/tentacle/on_hit(atom/target, blocked = 0)
var/mob/living/carbon/human/H = firer
source.gun.hit_something = TRUE
source.gun.check_should_delete()
@@ -369,7 +369,7 @@
C.throw_at(get_step_towards(H,C), 8, 2, callback=CALLBACK(H, TYPE_PROC_REF(/mob, tentacle_stab), C))
return TRUE
/obj/item/projectile/tentacle/Destroy()
/obj/projectile/tentacle/Destroy()
qdel(chain)
source = null
return ..()
@@ -133,7 +133,7 @@
/obj/item/ammo_casing/magic/grapple_ammo
name = "grapple"
desc = "a hand"
projectile_type = /obj/item/projectile/tether/flayer
projectile_type = /obj/projectile/tether/flayer
icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
icon_state = "flayer_claw"
caliber = "grapple"
@@ -149,7 +149,7 @@
. = ..()
grapple = null
/obj/item/projectile/tether/flayer
/obj/projectile/tether/flayer
name = "Grapple Arm"
range = 10
damage = 15
@@ -160,20 +160,20 @@
/// The ammo this came from
var/obj/item/ammo_casing/magic/grapple_ammo/ammo
/obj/item/projectile/tether/flayer/Initialize(mapload, obj/item/ammo_casing/magic/grapple_ammo/grapple_casing)
/obj/projectile/tether/flayer/Initialize(mapload, obj/item/ammo_casing/magic/grapple_ammo/grapple_casing)
. = ..()
ammo = grapple_casing
/obj/item/projectile/tether/flayer/fire(setAngle)
/obj/projectile/tether/flayer/fire(setAngle)
. = ..()
make_chain()
SEND_SIGNAL(firer, COMSIG_FLAYER_RETRACT_IMPLANTS)
/obj/item/projectile/tether/flayer/Destroy()
/obj/projectile/tether/flayer/Destroy()
. = ..()
ammo = null
/obj/item/projectile/tether/flayer/on_hit(atom/target, blocked = 0)
/obj/projectile/tether/flayer/on_hit(atom/target, blocked = 0)
. = ..()
playsound(target, 'sound/items/zip.ogg', 75, TRUE)
if(isliving(target) && blocked < 100)
@@ -129,7 +129,7 @@
desc = "Summon a hand of demonic energy, snaring and throwing its target around, based on your intent. Disarm pushes, grab pulls."
gain_desc = "You have gained the ability to snare and disrupt people with demonic appendages."
base_cooldown = 30 SECONDS
fireball_type = /obj/item/projectile/magic/demonic_grasp
fireball_type = /obj/projectile/magic/demonic_grasp
selection_activated_message = "<span class='notice'>You raise your hand, full of demonic energy! <B>Left-click to cast at a target!</B></span>"
selection_deactivated_message = "<span class='notice'>You re-absorb the energy...for now.</span>"
@@ -149,17 +149,17 @@
V.required_blood = 20
return V
/obj/item/projectile/magic/demonic_grasp
/obj/projectile/magic/demonic_grasp
name = "demonic grasp"
// parry this you filthy casual
reflectability = REFLECTABILITY_NEVER
icon_state = null
/obj/item/projectile/magic/demonic_grasp/pixel_move(trajectory_multiplier)
/obj/projectile/magic/demonic_grasp/pixel_move(trajectory_multiplier)
. = ..()
new /obj/effect/temp_visual/demonic_grasp(loc)
/obj/item/projectile/magic/demonic_grasp/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/magic/demonic_grasp/on_hit(atom/target, blocked, hit_zone)
. = ..()
if(!.)
return
@@ -184,7 +184,7 @@
throw_target = get_step(firer, get_dir(firer, L))
L.throw_at(throw_target, 2, 5, spin = FALSE, diagonals_first = TRUE, callback = CALLBACK(src, PROC_REF(create_snare), L)) // pull towards
/obj/item/projectile/magic/demonic_grasp/proc/create_snare(mob/target)
/obj/projectile/magic/demonic_grasp/proc/create_snare(mob/target)
new /obj/effect/temp_visual/demonic_snare(target.loc)
/obj/effect/temp_visual/demonic_grasp
@@ -323,7 +323,7 @@
for(var/mob/living/L in view(8, owner))
if(L.affects_vampire(owner))
L.adjust_bodytemperature(-3 * TEMPERATURE_DAMAGE_COEFFICIENT) //The dark is cold and unforgiving. Equivelnt to -60 with previous values.
for(var/obj/item/projectile/P in view(8, owner))
for(var/obj/projectile/P in view(8, owner))
if(P.flag == ENERGY || P.flag == LASER)
P.damage *= 0.7
+1 -1
View File
@@ -24,7 +24,7 @@
/turf/cordon/TerraformTurf(path, list/new_baseturfs, flags)
return
/turf/cordon/bullet_act(obj/item/projectile/hitting_projectile, def_zone, piercing_hit)
/turf/cordon/bullet_act(obj/projectile/hitting_projectile, def_zone, piercing_hit)
SHOULD_CALL_PARENT(FALSE) // Fuck you
return
@@ -229,7 +229,7 @@
ranged = TRUE
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/neurotox
projectiletype = /obj/projectile/neurotox
projectilesound = 'sound/weapons/pierce.ogg'
// Below here is ruin specific code
@@ -37,7 +37,7 @@
icon_state = "syndicate_harbinger"
icon_living = "syndicate_harbinger"
speak_emote = list("snarls")
projectiletype = /obj/item/projectile/bullet/heavybullet
projectiletype = /obj/projectile/bullet/heavybullet
projectilesound = 'sound/weapons/gunshots/gunshot_rifle.ogg'
internal_gps = null
faction = list("syndicate", "spawned_corpse")
@@ -190,7 +190,7 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank)
GLOB.telecomms_trap_tank -= src
return ..()
/obj/structure/telecomms_trap_tank/bullet_act(obj/item/projectile/P)
/obj/structure/telecomms_trap_tank/bullet_act(obj/projectile/P)
explode()
/obj/structure/telecomms_trap_tank/proc/explode()
@@ -337,7 +337,7 @@ GLOBAL_LIST_EMPTY(telecomms_trap_tank)
maxHealth = 200
faction = list("malf_drone")
speed = 0.5
projectile_type = /obj/item/projectile/beam/disabler/weak
projectile_type = /obj/projectile/beam/disabler/weak
projectile_sound = 'sound/weapons/taser2.ogg'
ranged_burst_count = 2
gold_core_spawnable = NO_SPAWN // Could you imagine xenobio with this? lmao.
@@ -150,7 +150,7 @@
/// Datum which keeps us hanging out with our parent
var/datum/movement_detector/tracker
/// Type of projectile we fire
var/projectile_type = /obj/item/projectile/baby_watcher_blast
var/projectile_type = /obj/projectile/baby_watcher_blast
/// Sound to make when we shoot
var/projectile_sound = 'sound/weapons/pierce.ogg'
/// Time between taking potshots at goliaths
@@ -193,7 +193,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/O = new projectile_type(T)
var/obj/projectile/O = new projectile_type(T)
playsound(get_turf(src), projectile_sound, 75, TRUE)
O.firer = parent // no hitting owner.
O.current = T
@@ -253,6 +253,6 @@
/// Beam fired by a baby watcher, doesn't actually do less damage than its parent
/obj/item/projectile/baby_watcher_blast
/obj/projectile/baby_watcher_blast
name = "hatchling beam"
icon_state = "ice_2"
+3 -3
View File
@@ -454,8 +454,8 @@
/obj/item/clothing/suit/armor/reactive/proc/reaction_check(hitby)
if(prob(hit_reaction_chance))
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
if(istype(P, /obj/item/projectile/ion))
var/obj/projectile/P = hitby
if(istype(P, /obj/projectile/ion))
return FALSE
if(!P.nodamage || P.stun || P.weaken)
return TRUE
@@ -550,7 +550,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/temp/basilisk/O = new /obj/item/projectile/temp/basilisk(T)
var/obj/projectile/temp/basilisk/O = new /obj/projectile/temp/basilisk(T)
playsound(get_turf(src), 'sound/weapons/taser2.ogg', 75, TRUE)
O.current = T
O.yo = U.y - T.y
+2 -2
View File
@@ -75,8 +75,8 @@ GLOBAL_LIST_EMPTY(blob_minions)
/obj/structure/blob/blob_act(obj/structure/blob/B)
return
/obj/structure/blob/bullet_act(obj/item/projectile/P)
if(istype(P, /obj/item/projectile/kinetic))
/obj/structure/blob/bullet_act(obj/projectile/P)
if(istype(P, /obj/projectile/kinetic))
P.damage /= 2
return ..()
+1 -1
View File
@@ -225,7 +225,7 @@
. = ..()
SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, user)
/obj/structure/spawner/nether/demon_incursion/bullet_act(obj/item/projectile/P)
/obj/structure/spawner/nether/demon_incursion/bullet_act(obj/projectile/P)
. = ..()
if(P.firer)
SEND_SIGNAL(src, COMSIG_SPAWNER_SET_TARGET, P.firer)
+4 -4
View File
@@ -501,7 +501,7 @@
/obj/effect/hallucination/sniper/proc/fire_bullet(turf/shot_loc, mob/living/carbon/target)
// Fire the bullet
var/obj/item/projectile/bullet/sniper/penetrator/hallucination/bullet = new(shot_loc)
var/obj/projectile/bullet/sniper/penetrator/hallucination/bullet = new(shot_loc)
bullet.hallucinator = target
bullet.def_zone = BODY_ZONE_HEAD
bullet.suppressed = TRUE
@@ -537,7 +537,7 @@
hallucination_icon_state = pick("mfloor1", "mfloor2", "mfloor3", "mfloor4", "mfloor5", "mfloor6", "mfloor7")
/obj/item/projectile/bullet/sniper/penetrator/hallucination
/obj/projectile/bullet/sniper/penetrator/hallucination
nodamage = TRUE
invisibility = INVISIBILITY_MAXIMUM // You no see boolet
/// The hallucinator
@@ -545,7 +545,7 @@
/// Handles only the victim seeing it
var/image/bullet_image = null
/obj/item/projectile/bullet/sniper/penetrator/hallucination/on_hit(atom/target, blocked, hit_zone)
/obj/projectile/bullet/sniper/penetrator/hallucination/on_hit(atom/target, blocked, hit_zone)
if(!isliving(target))
return
if(target != hallucinator)
@@ -560,7 +560,7 @@
new /obj/effect/hallucination/sniper_bloodsplatter(get_turf(src), hit_target)
to_chat(hit_target, "<span class='userdanger'>You're shot by \a [src][organ_hit_text]!</span>")
/obj/item/projectile/bullet/sniper/penetrator/hallucination/Bump(atom/A, yes)
/obj/projectile/bullet/sniper/penetrator/hallucination/Bump(atom/A, yes)
if(!yes) // prevents double bumps.
return
var/turf/target_turf = get_turf(A)
+3 -3
View File
@@ -169,13 +169,13 @@
update_state()
/obj/machinery/hydroponics/bullet_act(obj/item/projectile/Proj) //Works with the Somatoray to modify plant variables.
/obj/machinery/hydroponics/bullet_act(obj/projectile/Proj) //Works with the Somatoray to modify plant variables.
if(!myseed)
return ..()
if(istype(Proj ,/obj/item/projectile/energy/floramut))
if(istype(Proj ,/obj/projectile/energy/floramut))
mut_beamed = TRUE
return ..()
else if(istype(Proj ,/obj/item/projectile/energy/florayield))
else if(istype(Proj ,/obj/projectile/energy/florayield))
yield_beamed = TRUE
return ..()
else
+2 -2
View File
@@ -174,8 +174,8 @@
if("weed chance")
adjust_weed_chance(mod)
/obj/item/seeds/bullet_act(obj/item/projectile/Proj) // Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/item/projectile/energy/florayield))
/obj/item/seeds/bullet_act(obj/projectile/Proj) // Works with the Somatoray to modify plant variables.
if(istype(Proj, /obj/projectile/energy/florayield))
var/rating = 1
if(istype(loc, /obj/machinery/hydroponics))
var/obj/machinery/hydroponics/H = loc
@@ -118,7 +118,7 @@
var/turf/proj_turf = get_turf_for_projectile(user)
if(!isturf(proj_turf))
return
var/obj/item/projectile/destabilizer/D = new /obj/item/projectile/destabilizer(proj_turf)
var/obj/projectile/destabilizer/D = new /obj/projectile/destabilizer(proj_turf)
for(var/t in trophies)
var/obj/item/crusher_trophy/T = t
T.on_projectile_fire(D, user)
@@ -197,7 +197,7 @@
update_action_buttons()
//destablizing force
/obj/item/projectile/destabilizer
/obj/projectile/destabilizer
name = "destabilizing force"
icon_state = "pulse1"
nodamage = TRUE
@@ -207,11 +207,11 @@
log_override = TRUE
var/obj/item/kinetic_crusher/hammer_synced
/obj/item/projectile/destabilizer/Destroy()
/obj/projectile/destabilizer/Destroy()
hammer_synced = null
return ..()
/obj/item/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
/obj/projectile/destabilizer/on_hit(atom/target, blocked = FALSE)
if(isliving(target))
var/mob/living/L = target
var/had_effect = (L.has_status_effect(STATUS_EFFECT_CRUSHERMARK)) //used as a boolean
@@ -279,7 +279,7 @@
/obj/item/crusher_trophy/proc/on_melee_hit(mob/living/target, mob/living/user) //the target and the user
return
/obj/item/crusher_trophy/proc/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
/obj/item/crusher_trophy/proc/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user) //the projectile fired and the user
return
/obj/item/crusher_trophy/proc/on_mark_application(mob/living/target, datum/status_effect/crusher_mark/mark, had_mark) //the target, the mark applied, and if the target had a mark before
@@ -346,7 +346,7 @@
/obj/item/crusher_trophy/blaster_tubes/magma_wing/effect_desc()
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage"
/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
/obj/item/crusher_trophy/blaster_tubes/magma_wing/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
if(deadly_shot)
marker.name = "heated [marker.name]"
marker.icon_state = "lava"
@@ -479,7 +479,7 @@
/obj/item/crusher_trophy/blaster_tubes/effect_desc()
return "mark detonation to make the next destabilizer shot deal <b>[bonus_value]</b> damage but move slower"
/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/item/projectile/destabilizer/marker, mob/living/user)
/obj/item/crusher_trophy/blaster_tubes/on_projectile_fire(obj/projectile/destabilizer/marker, mob/living/user)
if(deadly_shot)
marker.name = "deadly [marker.name]"
marker.icon_state = "chronobolt"
@@ -34,9 +34,9 @@
ActivationReaction(user, "weapon")
return ..()
/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
/obj/machinery/anomalous_crystal/bullet_act(obj/projectile/P, def_zone)
..()
if(istype(P, /obj/item/projectile/magic))
if(istype(P, /obj/projectile/magic))
ActivationReaction(P.firer, "magic", P.damage_type)
return
ActivationReaction(P.firer, P.flag, P.damage_type)
@@ -140,16 +140,16 @@
/// Generates a projectile when interacted with
/obj/machinery/anomalous_crystal/emitter
cooldown_add = 50
var/generated_projectile = /obj/item/projectile/beam/emitter
var/generated_projectile = /obj/projectile/beam/emitter
/obj/machinery/anomalous_crystal/emitter/Initialize(mapload)
. = ..()
generated_projectile = pick(/obj/item/projectile/magic/fireball/infernal,
/obj/item/projectile/bullet/meteorshot, /obj/item/projectile/beam/xray, /obj/item/projectile/colossus)
generated_projectile = pick(/obj/projectile/magic/fireball/infernal,
/obj/projectile/bullet/meteorshot, /obj/projectile/beam/xray, /obj/projectile/colossus)
/obj/machinery/anomalous_crystal/emitter/ActivationReaction(mob/user, method)
if(..())
var/obj/item/projectile/P = new generated_projectile(get_turf(src))
var/obj/projectile/P = new generated_projectile(get_turf(src))
P.dir = dir
switch(dir)
if(NORTH)
@@ -349,13 +349,13 @@
/obj/item/ammo_casing/magic/hook
name = "hook"
desc = "a hook."
projectile_type = /obj/item/projectile/hook
projectile_type = /obj/projectile/hook
caliber = "hook"
icon = 'icons/obj/lavaland/artefacts.dmi'
icon_state = "hook"
muzzle_flash_effect = null
/obj/item/projectile/hook
/obj/projectile/hook
name = "hook"
icon_state = "hook"
icon = 'icons/obj/lavaland/artefacts.dmi'
@@ -365,13 +365,13 @@
weaken = 1 SECONDS
knockdown = 6 SECONDS
/obj/item/projectile/hook/fire(setAngle)
/obj/projectile/hook/fire(setAngle)
if(firer)
chain = firer.Beam(src, icon_state = "chain", time = INFINITY, maxdistance = INFINITY)
..()
//TODO: root the firer until the chain returns
/obj/item/projectile/hook/on_hit(atom/target)
/obj/projectile/hook/on_hit(atom/target)
. = ..()
if(isliving(target))
var/mob/living/L = target
@@ -382,7 +382,7 @@
L.forceMove(get_turf(firer))
L.density = old_density
/obj/item/projectile/hook/Destroy()
/obj/projectile/hook/Destroy()
QDEL_NULL(chain)
return ..()
@@ -243,7 +243,7 @@
if(berserk_active)
return
if(isprojectile(hitby))
var/obj/item/projectile/P = hitby
var/obj/projectile/P = hitby
if(P.damage_type == STAMINA)
return //no disabler rage
var/berserk_value = damage * DAMAGE_TO_CHARGE_SCALE
+2 -2
View File
@@ -311,7 +311,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
else
..()
/obj/item/gibtonite/bullet_act(obj/item/projectile/P)
/obj/item/gibtonite/bullet_act(obj/projectile/P)
GibtoniteReaction(P.firer)
..()
@@ -416,7 +416,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
materials = list(MAT_PLASMA = 400)
credits = 80
/obj/item/coin/plasma/bullet_act(obj/item/projectile/P)
/obj/item/coin/plasma/bullet_act(obj/projectile/P)
if(!QDELETED(src) && !P.nodamage && (P.damage_type == BURN))
log_and_set_aflame(P.firer, P)
@@ -12,7 +12,7 @@
ai_controller = /datum/ai_controller/basic_controller/alien/queen
is_ranged = TRUE
projectile_type = /obj/item/projectile/neurotox
projectile_type = /obj/projectile/neurotox
projectile_sound = 'sound/weapons/pierce.ogg'
ranged_cooldown = 3 SECONDS
@@ -11,7 +11,7 @@
ai_controller = /datum/ai_controller/basic_controller/alien/sentinel
is_ranged = TRUE
projectile_type = /obj/item/projectile/neurotox
projectile_type = /obj/projectile/neurotox
projectile_sound = 'sound/weapons/pierce.ogg'
ranged_cooldown = 3 SECONDS
@@ -1,4 +1,4 @@
/obj/item/projectile/hivebotbullet
/obj/projectile/hivebotbullet
/mob/living/basic/hivebot
name = "Hivebot"
@@ -28,7 +28,7 @@
basic_mob_flags = DEL_ON_DEATH
step_type = FOOTSTEP_MOB_CLAW
ai_controller = /datum/ai_controller/basic_controller/hivebot
projectile_type = /obj/item/projectile/hivebotbullet
projectile_type = /obj/projectile/hivebotbullet
projectile_sound = 'sound/weapons/gunshots/gunshot.ogg'
/mob/living/basic/hivebot/range
@@ -59,7 +59,7 @@
icon_state = "piratespaceranged"
icon_living = "piratespaceranged"
is_ranged = TRUE
projectile_type = /obj/item/projectile/beam
projectile_type = /obj/projectile/beam
projectile_sound = 'sound/weapons/laser.ogg'
ranged_burst_count = 2
ranged_burst_interval = 0.5 SECONDS // Same fire rate as people!
@@ -36,7 +36,7 @@
step_type = FOOTSTEP_MOB_SHOE
is_ranged = TRUE
projectile_type = /obj/item/projectile/plasma/adv
projectile_type = /obj/projectile/plasma/adv
projectile_sound = 'sound/weapons/laser.ogg'
ranged_cooldown = 1.75 SECONDS
@@ -73,7 +73,7 @@
icon_state = "vox_foreman"
icon_living = "vox_foreman"
ai_controller = /datum/ai_controller/basic_controller/simple/vox_foreman
projectile_type = /obj/item/projectile/bullet/spike
projectile_type = /obj/projectile/bullet/spike
projectile_sound = 'sound/weapons/bladeslice.ogg'
ranged_burst_count = 2
ranged_burst_interval = 0.5 SECONDS
@@ -130,14 +130,14 @@
return ..()
/mob/living/basic/mining_drone/CanPass(atom/movable/O)
if(istype(O, /obj/item/projectile/kinetic))
var/obj/item/projectile/kinetic/K = O
if(istype(O, /obj/projectile/kinetic))
var/obj/projectile/kinetic/K = O
if(K.kinetic_gun)
for(var/A in K.kinetic_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
if(istype(M, /obj/item/borg/upgrade/modkit/minebot_passthrough))
return TRUE
if(istype(O, /obj/item/projectile/destabilizer))
if(istype(O, /obj/projectile/destabilizer))
return TRUE
return ..()
@@ -25,7 +25,7 @@
ai_controller = /datum/ai_controller/basic_controller/watcher
is_ranged = TRUE
ranged_cooldown = 3 SECONDS
projectile_type = /obj/item/projectile/temp/basilisk
projectile_type = /obj/projectile/temp/basilisk
projectile_sound = 'sound/weapons/pierce.ogg'
loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER},
@@ -35,12 +35,12 @@
. = ..()
AddElement(/datum/element/ai_retaliate)
/obj/item/projectile/temp/basilisk
/obj/projectile/temp/basilisk
name = "freezing blast"
icon_state = "ice_2"
temperature = 50
/obj/item/projectile/temp/basilisk/on_hit(atom/target, blocked)
/obj/projectile/temp/basilisk/on_hit(atom/target, blocked)
..()
if(isrobot(target))
var/mob/living/silicon/robot/cyborg = target
@@ -94,7 +94,7 @@
light_range = 3
light_power = 2.5
light_color = LIGHT_COLOR_LAVA
projectile_type = /obj/item/projectile/temp/basilisk/magmawing
projectile_type = /obj/projectile/temp/basilisk/magmawing
crusher_loot = /obj/item/crusher_trophy/blaster_tubes/magma_wing
crusher_drop_mod = 100 // These things are extremely rare (1/133 per spawner). You shouldn't have to hope for another stroke of luck to get it's trophy after finding it
@@ -107,12 +107,12 @@
icon_dead = "watcher_icewing_dead"
maxHealth = 170
health = 170
projectile_type = /obj/item/projectile/temp/basilisk/icewing
projectile_type = /obj/projectile/temp/basilisk/icewing
butcher_results = list(/obj/item/stack/ore/diamond = 5, /obj/item/stack/sheet/bone = 1) // No sinew; the wings are too fragile to be usable
crusher_loot = /obj/item/crusher_trophy/watcher_wing/ice_wing
crusher_drop_mod = 100 // These things are extremely rare (1/400 per spawner). You shouldn't have to hope for another stroke of luck to get it's trophy after finding it
/obj/item/projectile/temp/basilisk/magmawing
/obj/projectile/temp/basilisk/magmawing
name = "scorching blast"
icon_state = "lava"
damage = 5
@@ -120,11 +120,11 @@
temperature = 500 // Heats you up!
immolate = 1
/obj/item/projectile/temp/basilisk/icewing
/obj/projectile/temp/basilisk/icewing
damage = 5
nodamage = FALSE
/obj/item/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
/obj/projectile/temp/basilisk/icewing/on_hit(atom/target, blocked = FALSE)
. = ..()
if(.)
var/mob/living/L = target
@@ -48,7 +48,7 @@
for(var/obj/item/stack/ore/ore in src)
ore.forceMove(loc)
/mob/living/basic/mining/goldgrub/bullet_act(obj/item/projectile/P)
/mob/living/basic/mining/goldgrub/bullet_act(obj/projectile/P)
if(P.armor_penetration_flat + P.armor_penetration_percentage >= 100)
return ..()
visible_message("<span class='danger'>[P.name] was repelled by [name]'s girth!</span>")
@@ -27,7 +27,7 @@
/// Message to output if throwing damage is absorbed
var/throw_blocked_message = "bounces off"
/mob/living/basic/mining/bullet_act(obj/item/projectile/P) // Reduces damage from most projectiles to curb off-screen kills
/mob/living/basic/mining/bullet_act(obj/projectile/P) // Reduces damage from most projectiles to curb off-screen kills
if(P.damage < 30 && P.damage_type != BRUTE && has_laser_resist)
P.damage = (P.damage / 3)
visible_message("<span class='danger'>[P] has a reduced effect on [src]!</span>")
@@ -30,7 +30,7 @@
/mob/living/basic/netherworld/Initialize(mapload)
. = ..()
if(prob(grappler_chance))
AddComponent(/datum/component/ranged_attacks, projectile_type = /obj/item/projectile/energy/demonic_grappler, projectile_sound = 'sound/weapons/wave.ogg')
AddComponent(/datum/component/ranged_attacks, projectile_type = /obj/projectile/energy/demonic_grappler, projectile_sound = 'sound/weapons/wave.ogg')
name = "grappling " + name
ai_controller = new /datum/ai_controller/basic_controller/simple/simple_skirmisher/prowler(src)
update_appearance(UPDATE_NAME)
@@ -15,7 +15,7 @@
is_ranged = TRUE
ranged_burst_count = 3
ranged_burst_interval = 0.4
projectile_type = /obj/item/projectile/beam/immolator/weak/hitscan
projectile_type = /obj/projectile/beam/immolator/weak/hitscan
projectile_sound = 'sound/weapons/laser3.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minimum_survivable_temperature = 0
@@ -88,7 +88,7 @@
update_icons()
/// We overide the basic effect, as malfunctioning drones are in space, and use jets to dodge. Also lets us do cool effects.
/mob/living/basic/malf_drone/advanced_bullet_dodge(mob/living/source, obj/item/projectile/hitting_projectile)
/mob/living/basic/malf_drone/advanced_bullet_dodge(mob/living/source, obj/projectile/hitting_projectile)
if(HAS_TRAIT(source, TRAIT_IMMOBILIZED))
return NONE
if(source.stat != CONSCIOUS)
@@ -8,7 +8,7 @@ emp_act
*/
/mob/living/carbon/human/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/bullet_act(obj/projectile/P, def_zone)
if(!dna.species.bullet_act(P, src, def_zone))
add_attack_logs(P.firer, src, "hit by [P.type] but got deflected by species '[dna.species]'")
P.reflect_back(src) //It has to be here, not on species. Why? Who knows. Testing showed me no reason why it doesn't work on species, and neither did tracing. It has to be here, or it gets qdel'd by bump.
@@ -21,7 +21,7 @@ emp_act
if(1) // proper reflection
reflected = TRUE
if(2) //If target is holding a toy sword
var/static/list/safe_list = list(/obj/item/projectile/beam/lasertag, /obj/item/projectile/beam/practice)
var/static/list/safe_list = list(/obj/projectile/beam/lasertag, /obj/projectile/beam/practice)
reflected = is_type_in_list(P, safe_list) //And it's safe
if(reflected)
@@ -147,7 +147,7 @@ emp_act
log_game("[key_name(user)] set [key_name(src)] on fire with [I]")
/mob/living/carbon/human/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/check_projectile_dismemberment(obj/projectile/P, def_zone)
var/obj/item/organ/external/affecting = get_organ(check_zone(def_zone))
if(affecting && !(affecting.limb_flags & CANNOT_DISMEMBER) && affecting.get_damage() >= (affecting.max_damage - P.dismemberment))
var/damtype = DROPLIMB_SHARP
@@ -826,7 +826,7 @@ emp_act
return FALSE
return TRUE
/mob/living/carbon/human/projectile_hit_check(obj/item/projectile/P)
/mob/living/carbon/human/projectile_hit_check(obj/projectile/P)
return (HAS_TRAIT(src, TRAIT_FLOORED) || HAS_TRAIT(src, TRAIT_NOKNOCKDOWNSLOWDOWN)) && !density && !(P.always_hit_living_nondense && (stat != DEAD) && !isLivingSSD(src)) // hit mobs that are intentionally lying down to prevent combat crawling.
/mob/living/carbon/human/canBeHandcuffed()
@@ -95,7 +95,7 @@
var/last_hit = 0
var/timer_id = TIMER_ID_NULL
/mob/living/carbon/human/dummy/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/carbon/human/dummy/bullet_act(obj/projectile/P, def_zone)
if(!first_hit)
first_hit = world.time
visible_message("Started tracking hit at time [first_hit]!")
@@ -1071,7 +1071,7 @@ It'll return null if the organ doesn't correspond, so include null checks when u
/datum/species/proc/water_act(mob/living/carbon/human/M, volume, temperature, source, method = REAGENT_TOUCH)
M.adjust_bodytemperature(clamp((temperature + M.bodytemperature) * 0.5 - M.bodytemperature, BODYTEMP_COOLING_MAX, BODYTEMP_HEATING_MAX)) // Approximation for gradual heating or cooling.
/datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) //return TRUE if hit, FALSE if stopped/reflected/etc
/datum/species/proc/bullet_act(obj/projectile/P, mob/living/carbon/human/H) //return TRUE if hit, FALSE if stopped/reflected/etc
return TRUE
/datum/species/proc/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
@@ -114,8 +114,8 @@
H.adjustBruteLoss(2)
..()
/datum/species/diona/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H, def_zone)
if(istype(P, /obj/item/projectile/energy/floramut))
/datum/species/diona/bullet_act(obj/projectile/P, mob/living/carbon/human/H, def_zone)
if(istype(P, /obj/projectile/energy/floramut))
P.nodamage = TRUE
H.Weaken(1 SECONDS)
if(prob(80))
@@ -123,7 +123,7 @@
else
randmutg(H)
H.visible_message("[H] writhes for a moment as [H.p_their()] nymphs squirm and mutate.", "All of you squirm uncomfortably for a moment as you feel your genes changing.")
else if(istype(P, /obj/item/projectile/energy/florayield))
else if(istype(P, /obj/projectile/energy/florayield))
P.nodamage = TRUE
var/obj/item/organ/external/organ = H.get_organ(check_zone(def_zone))
if(!organ)
@@ -384,7 +384,7 @@
new /obj/item/stack/ore/glass(get_turf(H))
qdel(H)
/datum/species/golem/sand/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/sand/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(!(P.original == H && P.firer == H))
if((P.flag == BULLET || P.flag == BOMB) && P.armor_penetration_percentage < 100)
playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1)
@@ -418,7 +418,7 @@
new /obj/item/shard(get_turf(H))
qdel(H)
/datum/species/golem/glass/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/glass/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(!(P.original == H && P.firer == H)) //self-shots don't reflect
if(P.is_reflectable(REFLECTABILITY_ENERGY))
H.visible_message("<span class='danger'>[P] gets reflected by [H]'s glass skin!</span>", \
@@ -485,7 +485,7 @@
if(world.time > last_teleport + teleport_cooldown && user != H)
reactive_teleport(H)
/datum/species/golem/bluespace/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bluespace/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(world.time > last_teleport + teleport_cooldown)
reactive_teleport(H)
return TRUE
@@ -604,7 +604,7 @@
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
/datum/species/golem/bananium/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
/datum/species/golem/bananium/bullet_act(obj/projectile/P, mob/living/carbon/human/H)
if(world.time > last_banana + banana_cooldown)
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
+3 -3
View File
@@ -46,7 +46,7 @@
/mob/living/proc/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
return FALSE
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
/mob/living/bullet_act(obj/projectile/P, def_zone)
SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone)
//Armor
var/armor = run_armor_check(def_zone, P.flag, armor_penetration_flat = P.armor_penetration_flat, armor_penetration_percentage = P.armor_penetration_percentage)
@@ -57,7 +57,7 @@
return P.on_hit(src, armor, def_zone)
/// Tries to dodge incoming bullets if we aren't disabled for any reasons. Advised to overide with advanced effects, this is as basic example admins can apply.
/mob/living/proc/advanced_bullet_dodge(mob/living/source, obj/item/projectile/hitting_projectile)
/mob/living/proc/advanced_bullet_dodge(mob/living/source, obj/projectile/hitting_projectile)
SIGNAL_HANDLER
if(HAS_TRAIT(source, TRAIT_IMMOBILIZED))
@@ -79,7 +79,7 @@
advanced_bullet_dodge_chance = 0
return ATOM_PREHIT_FAILURE
/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
/mob/living/proc/check_projectile_dismemberment(obj/projectile/P, def_zone)
return 0
///As the name suggests, this should be called to apply electric shocks.
+1 -1
View File
@@ -904,7 +904,7 @@ GLOBAL_LIST_INIT(ai_verbs_default, list(
if(target)
open_nearest_door(target)
/mob/living/silicon/ai/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/ai/bullet_act(obj/projectile/Proj)
..(Proj)
return 2
+1 -1
View File
@@ -393,7 +393,7 @@
. += msg
/mob/living/silicon/pai/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/pai/bullet_act(obj/projectile/Proj)
..(Proj)
if(stat != 2)
spawn(1)
@@ -929,7 +929,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
return
/mob/living/silicon/robot/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/robot/bullet_act(obj/projectile/Proj)
..(Proj)
if(prob(75) && Proj.damage > 0) spark_system.start()
return 2
@@ -1212,7 +1212,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
if(emagged)
to_chat(user, "<span class='warning'>The emag sparks, and flashes red. [src] has already been emagged!</span>")
return
if(wiresexposed)
to_chat(user, "<span class='warning'>You must close the wiring panel first!</span>")
return
@@ -1614,7 +1614,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
else
to_chat(src, "<span class='boldwarning'>Your allegiance has not been compromised. Keep serving all Syndicate agents to the best of your abilities.</span>")
to_chat(src, "<span class='boldwarning'>Warning: Remote lockdown and detonation protections have been disabled due to system instability.</span>")
if(module)
module.emag_act(flayer)
module.module_type = "Malf" // For the cool factor.
@@ -1626,7 +1626,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
/mob/living/silicon/robot/proc/remove_robot_mindslave()
clear_zeroth_law()
if(mind)
if(mind)
mind.remove_antag_datum(/datum/antagonist/mindslave/malf_robot)
mind.remove_antag_datum(/datum/antagonist/mindslave/emagged_robot)
mind.remove_antag_datum(/datum/antagonist/mindslave/mindflayer_mindslave_robot)
@@ -1683,7 +1683,7 @@ GLOBAL_LIST_INIT(robot_verbs_default, list(
radio.recalculateChannels()
playsound(get_turf(src), 'sound/mecha/nominalnano.ogg', 75, FALSE)
/mob/living/silicon/robot/deathsquad/bullet_act(obj/item/projectile/P)
/mob/living/silicon/robot/deathsquad/bullet_act(obj/projectile/P)
if(istype(P) && P.is_reflectable(REFLECTABILITY_ENERGY) && P.starting)
visible_message("<span class='danger'>[P] gets reflected by [src]!</span>", "<span class='userdanger'>[P] gets reflected by [src]!</span>")
P.reflect_back(src)
@@ -421,7 +421,7 @@
if(!current_syringes || chambered?.BB)
return
chambered.BB = new /obj/item/projectile/bullet/dart/syringe/heavyduty(src)
chambered.BB = new /obj/projectile/bullet/dart/syringe/heavyduty(src)
chambered.BB.reagents.add_reagent_list(list("toxin" = 2))
chambered.BB.name = "heavy duty syringe"
current_syringes--
@@ -284,7 +284,7 @@
user.visible_message("<span class='alert'>[user] patches some dents on [src] with [I].</span>")
/mob/living/silicon/bullet_act(obj/item/projectile/Proj)
/mob/living/silicon/bullet_act(obj/projectile/Proj)
if(!Proj.nodamage)
var/damage = run_armor(Proj.damage, Proj.damage_type, Proj.flag, 0, Proj.armor_penetration_flat, Proj.armor_penetration_percentage)
switch(Proj.damage_type)
@@ -83,7 +83,7 @@
apply_damage(damage, damagetype, null, getarmor(armor_type = armorcheck))
return TRUE
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bullet_act(obj/projectile/Proj)
if(!Proj)
return
apply_damage(Proj.damage, Proj.damage_type)
@@ -515,7 +515,7 @@
add_fingerprint(user)
user.visible_message("[user] repairs [src]!","<span class='notice'>You repair [src].</span>")
/mob/living/simple_animal/bot/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bot/bullet_act(obj/projectile/Proj)
if(Proj && (Proj.damage_type == BRUTE || Proj.damage_type == BURN))
if(prob(75) && Proj.damage > 0)
do_sparks(5, 1, src)
@@ -38,7 +38,7 @@
var/weapons_check = TRUE //If true, arrest people for weapons if they don't have access
var/check_records = TRUE //Does it check security records?
var/no_handcuffs = FALSE //If true, don't handcuff
var/projectile = /obj/item/projectile/beam/disabler //Holder for projectile type
var/projectile = /obj/projectile/beam/disabler //Holder for projectile type
var/shoot_sound = 'sound/weapons/taser.ogg'
var/baton_delayed = FALSE
var/obj/item/melee/baton/infinite_cell/baton = null // stunbaton bot uses to melee attack
@@ -200,15 +200,15 @@
icon_state = "[lasercolor]ed209[on]"
set_weapon()
/mob/living/simple_animal/bot/ed209/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bot/ed209/bullet_act(obj/projectile/Proj)
if(!disabled)
var/lasertag_check = FALSE
if(lasercolor == "b")
if(istype(Proj, /obj/item/projectile/beam/lasertag/redtag))
if(istype(Proj, /obj/projectile/beam/lasertag/redtag))
lasertag_check = TRUE
else if(lasercolor == "r")
if(istype(Proj, /obj/item/projectile/beam/lasertag/bluetag))
if(istype(Proj, /obj/projectile/beam/lasertag/bluetag))
lasertag_check = TRUE
if(lasertag_check)
@@ -219,7 +219,7 @@
addtimer(CALLBACK(src, PROC_REF(unset_disabled)), 10 SECONDS)
return TRUE
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
if(istype(Proj ,/obj/projectile/beam)||istype(Proj,/obj/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
@@ -440,16 +440,16 @@
shoot_sound = 'sound/weapons/laser.ogg'
if(emagged)
if(lasercolor)
projectile = /obj/item/projectile/beam/disabler
projectile = /obj/projectile/beam/disabler
else
projectile = /obj/item/projectile/beam
projectile = /obj/projectile/beam
else
if(!lasercolor)
projectile = /obj/item/projectile/beam/disabler
projectile = /obj/projectile/beam/disabler
else if(lasercolor == "b")
projectile = /obj/item/projectile/beam/lasertag/bluetag
projectile = /obj/projectile/beam/lasertag/bluetag
else if(lasercolor == "r")
projectile = /obj/item/projectile/beam/lasertag/redtag
projectile = /obj/projectile/beam/lasertag/redtag
/mob/living/simple_animal/bot/ed209/proc/shootAt(mob/target)
if(lastfired && world.time - lastfired < shot_delay)
@@ -469,7 +469,7 @@
if(!isturf(U))
return
var/obj/item/projectile/A = new projectile(loc)
var/obj/projectile/A = new projectile(loc)
playsound(loc, shoot_sound, 50, 1)
A.current = U
A.yo = U.y - T.y
@@ -69,7 +69,7 @@
var/mob/living/carbon/C = A
sword_attack(C)
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/item/projectile/P) //so uncivilized
/mob/living/simple_animal/bot/secbot/griefsky/bullet_act(obj/projectile/P) //so uncivilized
retaliate(P.firer)
if((icon_state == spin_icon) && (prob(block_chance_ranged))) //only when the eswords are on
visible_message("[src] deflects [P] with its energy swords!")
@@ -156,8 +156,8 @@
if(HAS_TRAIT(src, TRAIT_CMAGGED))
. += "<span class='warning'>Yellow ooze seems to be seeping from the case...</span>"
/mob/living/simple_animal/bot/honkbot/bullet_act(obj/item/projectile/Proj)
if((istype(Proj,/obj/item/projectile/beam)) || (istype(Proj,/obj/item/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer)))
/mob/living/simple_animal/bot/honkbot/bullet_act(obj/projectile/Proj)
if((istype(Proj,/obj/projectile/beam)) || (istype(Proj,/obj/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer)))
retaliate(Proj.firer)
..()
@@ -223,7 +223,7 @@
wires.cut_random()
return
/mob/living/simple_animal/bot/mulebot/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/bot/mulebot/bullet_act(obj/projectile/Proj)
if(..())
if(prob(50) && !isnull(load))
unload(0)
@@ -207,14 +207,14 @@
declare_arrests = FALSE
icon_state = "[base_icon][on]"
/mob/living/simple_animal/bot/secbot/bullet_act(obj/item/projectile/Proj)
if(istype(Proj ,/obj/item/projectile/beam)||istype(Proj,/obj/item/projectile/bullet))
/mob/living/simple_animal/bot/secbot/bullet_act(obj/projectile/Proj)
if(istype(Proj ,/obj/projectile/beam)||istype(Proj,/obj/projectile/bullet))
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
if(!Proj.nodamage && Proj.damage < src.health)
retaliate(Proj.firer)
..()
/mob/living/simple_animal/bot/secbot/projectile_hit_check(obj/item/projectile/P)
/mob/living/simple_animal/bot/secbot/projectile_hit_check(obj/projectile/P)
return FALSE
@@ -150,7 +150,7 @@
if(lastfired && world.time - lastfired < shot_delay)
return
lastfired = world.time
var/obj/item/projectile/P = new projectile(loc)
var/obj/projectile/P = new projectile(loc)
playsound(loc, shoot_sound, 100, 1)
P.current = loc
P.starting = loc
@@ -176,7 +176,7 @@
qdel(src)
/mob/living/simple_animal/bot/ed209/syndicate/set_weapon()
projectile = /obj/item/projectile/bullet/a40mm
projectile = /obj/projectile/bullet/a40mm
/mob/living/simple_animal/bot/ed209/syndicate/emp_act(severity)
return
@@ -61,7 +61,7 @@
damage_shield()
playsound(src,'sound/hallucinations/veryfar_noise.ogg', 40, 1)
/mob/living/simple_animal/hostile/clockwork_construct/clockwork_marauder/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/hostile/clockwork_construct/clockwork_marauder/bullet_act(obj/projectile/Proj)
if(shield_health > 0)
damage_shield()
to_chat(src, "<span class='danger'>Your shield blocks the attack!</span>")
@@ -138,7 +138,7 @@
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
/mob/living/simple_animal/hostile/construct/armoured/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/construct/armoured/bullet_act(obj/projectile/P)
if(P.is_reflectable(REFLECTABILITY_ENERGY))
if(P.damage_type == BRUTE || P.damage_type == BURN)
adjustBruteLoss(P.damage * 0.8) // 16 hit with security laser gun
@@ -621,7 +621,7 @@
var/turf/U = get_turf(target)
if(!T || !U)
return
var/obj/item/projectile/beam/A = new /obj/item/projectile/beam(loc)
var/obj/projectile/beam/A = new /obj/projectile/beam(loc)
A.icon = 'icons/effects/genetics.dmi'
A.icon_state = "eyelasers"
playsound(src.loc, 'sound/weapons/taser2.ogg', 75, 1)
@@ -63,7 +63,7 @@
to_chat(src, "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>")
addtimer(CALLBACK(src, PROC_REF(death)), 25 SECONDS)
/mob/living/simple_animal/hostile/headslug/projectile_hit_check(obj/item/projectile/P)
/mob/living/simple_animal/hostile/headslug/projectile_hit_check(obj/projectile/P)
return (stat || FALSE)
/obj/item/organ/internal/body_egg/changeling_egg
@@ -122,7 +122,7 @@
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client && user)
FindTarget(list(user), 1)
/mob/living/simple_animal/hostile/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/bullet_act(obj/projectile/P)
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
@@ -397,7 +397,7 @@
playsound(src, projectilesound, 100, 1)
casing.fire(targeted_atom, src, zone_override = ran_zone(), firer_source_atom = src)
else if(projectiletype)
var/obj/item/projectile/P = new projectiletype(startloc)
var/obj/projectile/P = new projectiletype(startloc)
playsound(src, projectilesound, 100, 1)
P.current = startloc
P.starting = startloc
@@ -359,7 +359,7 @@ Difficulty: Hard
addtimer(CALLBACK(src, PROC_REF(body_shield)), BODY_SHIELD_COOLDOWN_TIME)
/mob/living/simple_animal/hostile/megafauna/ancient_robot/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/ancient_robot/bullet_act(obj/projectile/P)
if(!body_shield_enabled)
return ..()
do_sparks(2, 1, src)
@@ -435,7 +435,7 @@ Difficulty: Hard
var/turf/S = get_turf(src)
if(!S || !T)
return
var/obj/item/projectile/energy/tesla_bolt/O = new /obj/item/projectile/energy/tesla_bolt(S)
var/obj/projectile/energy/tesla_bolt/O = new /obj/projectile/energy/tesla_bolt(S)
O.current = S
O.yo = T.y - S.y
O.xo = T.x - S.x
@@ -488,7 +488,7 @@ Difficulty: Hard
var/turf/T = get_turf(target)
if(!spot || !T)
return
var/obj/item/projectile/bullet/rock/O = new /obj/item/projectile/bullet/rock(spot)
var/obj/projectile/bullet/rock/O = new /obj/projectile/bullet/rock(spot)
O.current = spot
O.yo = T.y - spot.y
O.xo = T.x - spot.x
@@ -662,7 +662,7 @@ Difficulty: Hard
check_friendly_fire = 1
ranged = TRUE
projectilesound = 'sound/weapons/gunshots/gunshot.ogg'
projectiletype = /obj/item/projectile/bullet/ancient_robot_bullet
projectiletype = /obj/projectile/bullet/ancient_robot_bullet
attacktext = "stomps on"
armor_penetration_percentage = 50
melee_damage_lower = 15
@@ -707,7 +707,7 @@ Difficulty: Hard
..()
health_and_snap_check(TRUE)
/mob/living/simple_animal/hostile/ancient_robot_leg/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/ancient_robot_leg/bullet_act(obj/projectile/P)
if(core.stat == CONSCIOUS && !core.target && core.AIStatus != AI_OFF && !core.client)
if(P.firer && get_dist(core, P.firer) <= core.aggro_vision_range)
core.FindTarget(list(P.firer), 1)
@@ -809,10 +809,10 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/ancient_robot_leg/electrocute_act(shock_damage, source, siemens_coeff, flags)
return
/obj/item/projectile/bullet/ancient_robot_bullet
/obj/projectile/bullet/ancient_robot_bullet
damage = 8
/obj/item/projectile/bullet/rock
/obj/projectile/bullet/rock
name= "thrown rock"
damage = 25
icon = 'icons/obj/meteor.dmi'
@@ -827,7 +827,7 @@ Difficulty: Hard
/// Leaving here for adminbus / so vetus still uses it.
/obj/item/projectile/energy/tesla_bolt
/obj/projectile/energy/tesla_bolt
name = "shock bolt"
icon_state = "purple_laser"
impact_effect_type = /obj/effect/temp_visual/impact_effect/purple_laser
@@ -838,16 +838,16 @@ Difficulty: Hard
/obj/item/ammo_casing/energy/tesla_bolt/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
..()
var/obj/item/projectile/energy/tesla_bolt/P = BB
var/obj/projectile/energy/tesla_bolt/P = BB
spawn(1)
P.chain = P.Beam(user, icon_state = "purple_lightning", icon = 'icons/effects/effects.dmi', time = 1000, maxdistance = 30)
/obj/item/projectile/energy/tesla_bolt/on_hit(atom/target)
/obj/projectile/energy/tesla_bolt/on_hit(atom/target)
. = ..()
tesla_zap(src, zap_range, power, zap_flags)
qdel(src)
/obj/item/projectile/energy/tesla_bolt/Bump(atom/A) // Don't want the projectile hitting the legs
/obj/projectile/energy/tesla_bolt/Bump(atom/A) // Don't want the projectile hitting the legs
if(!istype(/mob/living/simple_animal/hostile/ancient_robot_leg, A))
return ..()
var/turf/target_turf = get_turf(A)
@@ -32,7 +32,7 @@ Difficulty: Medium
light_color = "#E4C7C5"
speak_emote = list("roars")
speed = 3
projectiletype = /obj/item/projectile/kinetic/miner
projectiletype = /obj/projectile/kinetic/miner
projectilesound = 'sound/weapons/kenetic_accel.ogg'
ranged = TRUE
ranged_cooldown_time = 16
@@ -120,13 +120,13 @@ Difficulty: Medium
..()
target.remove_stun_absorption("miner")
/obj/item/projectile/kinetic/miner
/obj/projectile/kinetic/miner
damage = 20
speed = 0.9
icon_state = "ka_tracer"
range = MINER_DASH_RANGE
/obj/item/projectile/kinetic/miner/enraged
/obj/projectile/kinetic/miner/enraged
damage = 35
/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/adjustHealth(amount, updating_health = TRUE)
@@ -201,7 +201,7 @@ Difficulty: Medium
miner_saw = new /obj/item/melee/energy/cleaving_saw(src) //Real saw for real men.
dash_cooldown_to_use = 0.5 SECONDS //Becomes a teleporting shit.
ranged_cooldown_time = 5 //They got some cooldown mods.
projectiletype = /obj/item/projectile/kinetic/miner/enraged
projectiletype = /obj/projectile/kinetic/miner/enraged
maxHealth = 1800
health = 1800 //Bit more of a challenge.
@@ -513,7 +513,7 @@ Difficulty: Hard
if(.)
recovery_time = world.time + 20 // can only attack melee once every 2 seconds but rapid_melee gives higher priority
/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/bubblegum/bullet_act(obj/projectile/P)
if(BUBBLEGUM_IS_ENRAGED)
visible_message("<span class='danger'>[src] deflects the projectile; [p_they()] can't be hit with ranged weapons while enraged!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 300, TRUE)
@@ -654,7 +654,7 @@ Difficulty: Hard
second_life = TRUE
enraged = TRUE
rapid_melee = 12
projectiletype = /obj/item/projectile/magic/arcane_barrage/blood
projectiletype = /obj/projectile/magic/arcane_barrage/blood
projectilesound = 'sound/effects/splat.ogg'
deathmessage = null
death_sound = 'sound/hallucinations/veryfar_noise.ogg'
@@ -222,7 +222,7 @@ Difficulty: Very Hard
if(!startloc || !endloc || endloc == loc)
return
var/obj/item/projectile/P = new /obj/item/projectile/colossus(startloc)
var/obj/projectile/P = new /obj/projectile/colossus(startloc)
P.preparePixelProjectile(endloc, startloc)
P.firer = src
P.firer_source_atom = src
@@ -334,7 +334,7 @@ Difficulty: Very Hard
target = new_target
INVOKE_ASYNC(src, TYPE_PROC_REF(/atom/movable, orbit), target, 0, FALSE, 0, 0, FALSE, TRUE)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/colossus/bullet_act(obj/projectile/P)
if(stat == CONSCIOUS)
var/obj/effect/temp_visual/at_shield/AT = new /obj/effect/temp_visual/at_shield(loc, src)
var/random_x = rand(-32, 32)
@@ -356,14 +356,14 @@ Difficulty: Very Hard
for(var/I in 1 to 2)
loot += pick_n_take(choices)
/obj/item/projectile/colossus
/obj/projectile/colossus
name = "death bolt"
icon_state = "chronobolt"
damage = 25
armor_penetration_percentage = 100
speed = 2
/obj/item/projectile/colossus/on_hit(atom/target, blocked = 0)
/obj/projectile/colossus/on_hit(atom/target, blocked = 0)
. = ..()
if(isturf(target) || isobj(target))
target.ex_act(EXPLODE_HEAVY)
@@ -549,7 +549,7 @@ Difficulty: Hard
burst_range = initial(burst_range) + round(anger_modifier * 0.08)
beam_range = initial(beam_range) + round(anger_modifier * 0.12)
/mob/living/simple_animal/hostile/megafauna/hierophant/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/hostile/megafauna/hierophant/bullet_act(obj/projectile/P)
if(stat == CONSCIOUS && !target && AIStatus != AI_OFF && !client)
if(P.firer && get_dist(src, P.firer) <= aggro_vision_range)
FindTarget(list(P.firer), 1)
@@ -608,7 +608,7 @@ Difficulty: Hard
if(mover == caster.pulledby)
return TRUE
if(isprojectile(mover))
var/obj/item/projectile/P = mover
var/obj/projectile/P = mover
if(P.firer == caster)
return TRUE
if(mover == caster)
@@ -19,7 +19,7 @@
environment_smash = ENVIRONMENT_SMASH_STRUCTURES
attacktext = "drills into"
attack_sound = 'sound/weapons/circsawhit.ogg'
projectiletype = /obj/item/projectile/kinetic
projectiletype = /obj/projectile/kinetic
projectilesound = 'sound/weapons/kenetic_accel.ogg'
speak_emote = list("states")
throw_message = "does not go through the armor of"
@@ -70,9 +70,9 @@
. += "<span class='notice'><b>[rand(-30, 110)]%</b> mod capacity remaining.\nThere is a module installed, using <b>[rand(-5, 35)]%</b> capacity.\n...or at least you think so.</span>"
/mob/living/simple_animal/hostile/asteroid/abandoned_minebot/CanPass(atom/movable/O)
if(!istype(O, /obj/item/projectile/kinetic))
if(!istype(O, /obj/projectile/kinetic))
return ..()
var/obj/item/projectile/kinetic/K = O
var/obj/projectile/kinetic/K = O
if(K.kinetic_gun)
for(var/A in K.kinetic_gun.get_modkits())
var/obj/item/borg/upgrade/modkit/M = A
@@ -128,7 +128,7 @@
/mob/living/simple_animal/hostile/asteroid/elite/herald/proc/shoot_projectile(turf/marker, set_angle, is_teleshot, is_trishot)
var/turf/startloc = get_turf(src)
if(!is_teleshot)
var/obj/item/projectile/H = new /obj/item/projectile/herald(startloc)
var/obj/projectile/H = new /obj/projectile/herald(startloc)
H.preparePixelProjectile(marker, startloc)
H.firer = src
H.firer_source_atom = src
@@ -139,7 +139,7 @@
shoot_projectile(marker, set_angle + 15, FALSE, FALSE)
shoot_projectile(marker, set_angle - 15, FALSE, FALSE)
else
var/obj/item/projectile/H = new /obj/item/projectile/herald/teleshot(startloc)
var/obj/projectile/H = new /obj/projectile/herald/teleshot(startloc)
H.preparePixelProjectile(marker, startloc)
H.firer = src
H.firer_source_atom = src
@@ -222,19 +222,19 @@
my_master = null
. = ..()
/obj/item/projectile/herald
/obj/projectile/herald
name = "death bolt"
icon_state = "chronobolt"
damage = 15
armor_penetration_percentage = 50
speed = 2
/obj/item/projectile/herald/teleshot
/obj/projectile/herald/teleshot
name = "golden bolt"
damage = 0
color = rgb(255,255,102)
/obj/item/projectile/herald/prehit(atom/target)
/obj/projectile/herald/prehit(atom/target)
if(ismob(target) && ismob(firer))
var/mob/living/mob_target = target
if(mob_target.faction_check_mob(firer))
@@ -244,13 +244,13 @@
if(mob_target.buckled && mob_target.stat == DEAD)
mob_target.dust() //no body cheese
/obj/item/projectile/herald/on_hit(atom/target, blocked = FALSE)
/obj/projectile/herald/on_hit(atom/target, blocked = FALSE)
. = ..()
if(ismineralturf(target))
var/turf/simulated/mineral/M = target
M.gets_drilled()
/obj/item/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE)
/obj/projectile/herald/teleshot/on_hit(atom/target, blocked = FALSE)
. = ..()
if(!istype(target, /mob/living/simple_animal/hostile/asteroid/elite/herald))
firer.forceMove(get_turf(src))
@@ -32,7 +32,7 @@
return
icon_state = icon_living
/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
/mob/living/simple_animal/hostile/asteroid/bullet_act(obj/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
if(stat == CONSCIOUS)
Aggro()
if(P.damage < 30 && P.damage_type != BRUTE && has_laser_resist)
@@ -511,7 +511,7 @@
return ..()
/mob/living/simple_animal/hostile/syndicate/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/hostile/syndicate/bullet_act(obj/projectile/Proj)
if(!Proj)
return
if(((melee_type == MELEE_WEAPON_DSWORD || syndie_flags & ESHIELD) || (melee_type == MELEE_WEAPON_ESWORD && prob(reflect_chance))) && Proj.is_reflectable(REFLECTABILITY_ENERGY))
@@ -172,7 +172,7 @@
/obj/structure/spider/terrorweb/CanPass(atom/movable/mover, border_dir)
if(isterrorspider(mover))
return TRUE
if(istype(mover, /obj/item/projectile/terrorqueenspit))
if(istype(mover, /obj/projectile/terrorqueenspit))
return TRUE
if(isliving(mover))
var/mob/living/M = mover
@@ -202,7 +202,7 @@
if(!QDELETED(C) && C.loc == loc)
qdel(src)
/obj/structure/spider/terrorweb/bullet_act(obj/item/projectile/Proj)
/obj/structure/spider/terrorweb/bullet_act(obj/projectile/Proj)
if(Proj.damage_type != BRUTE && Proj.damage_type != BURN)
visible_message("<span class='danger'>[src] is undamaged by [Proj]!</span>")
// Webs don't care about disablers, tasers, etc. Or toxin damage. They're organic, but not alive.
@@ -22,7 +22,7 @@
ai_playercontrol_allowtype = 0
canlay = 1000
spider_tier = TS_TIER_5
projectiletype = /obj/item/projectile/terrorqueenspit/empress
projectiletype = /obj/projectile/terrorqueenspit/empress
icon = 'icons/mob/terrorspider64.dmi'
pixel_x = -16
mob_size = MOB_SIZE_LARGE
@@ -107,6 +107,6 @@
qdel(T)
to_chat(src, "<span class='userdanger'>All Terror Spiders, except yourself, will die off shortly.</span>")
/obj/item/projectile/terrorqueenspit/empress
/obj/projectile/terrorqueenspit/empress
damage = 90
@@ -33,7 +33,7 @@
retreat_distance = 5
minimum_distance = 5
projectilesound = 'sound/weapons/pierce.ogg'
projectiletype = /obj/item/projectile/terrorqueenspit
projectiletype = /obj/projectile/terrorqueenspit
spider_tier = TS_TIER_4
loudspeaker = TRUE
spider_opens_doors = 2
@@ -352,7 +352,7 @@
if(is_station_level((get_turf(src)).z) && stat != DEAD)
return list(ASSIGNMENT_SECURITY = 3, ASSIGNMENT_CREW = 30, ASSIGNMENT_MEDICAL = 2)
/obj/item/projectile/terrorqueenspit
/obj/projectile/terrorqueenspit
name = "acid spit"
damage = 40
icon_state = "toxin"
@@ -49,7 +49,7 @@
ranged = TRUE
retreat_distance = 5
minimum_distance = 5
projectiletype = /obj/item/projectile/snowball
projectiletype = /obj/projectile/snowball
/mob/living/simple_animal/hostile/winter/reindeer
name = "reindeer"
@@ -104,7 +104,7 @@
maxHealth = 200 //DID YOU REALLY BELIEVE IT WOULD BE THIS EASY!??!!
health = 200
ranged = TRUE
projectiletype = /obj/item/projectile/ornament
projectiletype = /obj/projectile/ornament
retreat_distance = 5
minimum_distance = 5
@@ -118,7 +118,7 @@
ranged = TRUE
rapid = 3
speed = 0 //he's lost some weight from the fighting
projectiletype = /obj/item/projectile/ornament
projectiletype = /obj/projectile/ornament
retreat_distance = 3
minimum_distance = 3
@@ -192,7 +192,7 @@
drop_held_item(FALSE)
//Bullets
/mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/P)
/mob/living/simple_animal/parrot/bullet_act(obj/projectile/P)
..()
if(stat == CONSCIOUS && !client)
if(parrot_state == PARROT_PERCH)
@@ -263,7 +263,7 @@
amount = -abs(amount)
return ..() //Heals them
/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj)
/mob/living/simple_animal/slime/bullet_act(obj/projectile/Proj)
if(!Proj)
return
attacked += 10
+1 -1
View File
@@ -20,7 +20,7 @@
return TRUE
return (!mover.density || !density || horizontal)
/mob/proc/projectile_hit_check(obj/item/projectile/P)
/mob/proc/projectile_hit_check(obj/projectile/P)
return !(P.always_hit_living_nondense && (stat != DEAD) && !isLivingSSD(src)) && !density
/client/verb/toggle_throw_mode()
+1 -1
View File
@@ -318,7 +318,7 @@
return
unstealth(source)
/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/item/projectile)
/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/projectile)
SIGNAL_HANDLER
unstealth(source)
@@ -119,16 +119,16 @@
. = ..()
if(!.)
return
var/obj/item/projectile/tether = new /obj/item/projectile/tether(get_turf(mod.wearer))
var/obj/projectile/tether = new /obj/projectile/tether(get_turf(mod.wearer))
tether.original = target
tether.firer = mod.wearer
tether.preparePixelProjectile(target, mod.wearer)
tether.fire()
playsound(src, 'sound/weapons/batonextend.ogg', 25, TRUE)
INVOKE_ASYNC(tether, TYPE_PROC_REF(/obj/item/projectile/tether, make_chain))
INVOKE_ASYNC(tether, TYPE_PROC_REF(/obj/projectile/tether, make_chain))
drain_power(use_power_cost)
/obj/item/projectile/tether
/obj/projectile/tether
name = "tether"
icon_state = "tether_projectile"
icon = 'icons/obj/clothing/modsuit/mod_modules.dmi'
@@ -141,18 +141,18 @@
///How fast the tether will throw the user at the target
var/yank_speed = 1
/obj/item/projectile/tether/proc/make_chain()
/obj/projectile/tether/proc/make_chain()
if(firer)
chain = Beam(firer, chain_icon_state, icon, time = 10 SECONDS, maxdistance = range)
/obj/item/projectile/tether/on_hit(atom/target)
/obj/projectile/tether/on_hit(atom/target)
. = ..()
if(firer && isliving(firer))
var/mob/living/L = firer
L.apply_status_effect(STATUS_EFFECT_IMPACT_IMMUNE)
L.throw_at(target, 15, yank_speed, L, FALSE, FALSE, callback = CALLBACK(L, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_IMPACT_IMMUNE), block_movement = FALSE)
/obj/item/projectile/tether/Destroy()
/obj/projectile/tether/Destroy()
QDEL_NULL(chain)
return ..()
+4 -4
View File
@@ -474,7 +474,7 @@
. = ..()
if(!.)
return
var/obj/item/projectile/bomb = new /obj/item/projectile/bullet/reusable/mining_bomb(get_turf(mod.wearer))
var/obj/projectile/bomb = new /obj/projectile/bullet/reusable/mining_bomb(get_turf(mod.wearer))
bomb.original = target
bomb.firer = mod.wearer
bomb.preparePixelProjectile(target, mod.wearer)
@@ -494,7 +494,7 @@
return
on_deactivation()
/obj/item/projectile/bullet/reusable/mining_bomb
/obj/projectile/bullet/reusable/mining_bomb
name = "mining bomb"
desc = "A bomb. Why are you staring at this?"
icon_state = "mine_bomb"
@@ -506,7 +506,7 @@
light_color = LIGHT_COLOR_ORANGE
ammo_type = /obj/structure/mining_bomb
/obj/item/projectile/bullet/reusable/mining_bomb/handle_drop()
/obj/projectile/bullet/reusable/mining_bomb/handle_drop()
if(!dropped)
new ammo_type(loc, firer)
dropped = TRUE
@@ -566,7 +566,7 @@
object.take_damage(damage, BRUTE, BOMB)
qdel(src)
/obj/item/projectile/bullet/reusable/mining_bomb/mecha
/obj/projectile/bullet/reusable/mining_bomb/mecha
ammo_type = /obj/structure/mining_bomb/mecha
/obj/structure/mining_bomb/mecha
@@ -33,7 +33,7 @@
/// Locked by an ID card
var/locked = FALSE
var/projectile_type = /obj/item/projectile/beam/emitter/hitscan
var/projectile_type = /obj/projectile/beam/emitter/hitscan
var/projectile_sound = 'sound/weapons/emitter.ogg'
var/datum/effect_system/spark_spread/sparks
@@ -282,7 +282,7 @@
return FALSE
/obj/machinery/power/emitter/proc/fire_beam()
var/obj/item/projectile/P = new projectile_type(get_turf(src))
var/obj/projectile/P = new projectile_type(get_turf(src))
playsound(get_turf(src), projectile_sound, 50, TRUE)
if(prob(35))
sparks.start()
@@ -180,7 +180,7 @@ field_generator energy level display
else
..()
/obj/machinery/field/generator/bullet_act(obj/item/projectile/Proj)
/obj/machinery/field/generator/bullet_act(obj/projectile/Proj)
if(Proj.flag != BULLET && !Proj.nodamage)
energy = min(energy + Proj.damage, FIELD_GENERATOR_MAX_ENERGY)
check_energy_level()
@@ -129,7 +129,7 @@ GLOBAL_VAR_INIT(global_singulo_id, 1)
return
/obj/singularity/bullet_act(obj/item/projectile/P)
/obj/singularity/bullet_act(obj/projectile/P)
qdel(P)
return 0 //Will there be an impact? Who knows. Will we see it? No.
@@ -692,11 +692,11 @@
countdown()
return 1
/obj/machinery/atmospherics/supermatter_crystal/bullet_act(obj/item/projectile/proj)
/obj/machinery/atmospherics/supermatter_crystal/bullet_act(obj/projectile/proj)
var/turf/L = loc
if(!istype(L))
return FALSE
if(!istype(proj, /obj/item/projectile/beam/emitter/hitscan) && power_changes)
if(!istype(proj, /obj/projectile/beam/emitter/hitscan) && power_changes)
investigate_log("has been hit by [proj] fired by [key_name(proj.firer)]", INVESTIGATE_SUPERMATTER)
if(proj.flag != BULLET)
if(power_changes) //This needs to be here I swear
+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

Some files were not shown because too many files have changed in this diff Show More