diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm
index 3b5ed8bd53..705492c00a 100644
--- a/code/modules/projectiles/projectile.dm
+++ b/code/modules/projectiles/projectile.dm
@@ -50,115 +50,113 @@
var/agony = 0
var/embed = 0 // whether or not the projectile can embed itself in the mob
- proc/on_hit(var/atom/target, var/blocked = 0)
- if(blocked >= 2) return 0//Full block
- if(!isliving(target)) return 0
- if(isanimal(target)) return 0
- var/mob/living/L = target
- L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
- return 1
+/obj/item/projectile/proc/on_hit(var/atom/target, var/blocked = 0)
+ if(blocked >= 2) return 0//Full block
+ if(!isliving(target)) return 0
+ if(isanimal(target)) return 0
+ var/mob/living/L = target
+ L.apply_effects(stun, weaken, paralyze, irradiate, stutter, eyeblur, drowsy, agony, blocked) // add in AGONY!
+ return 1
- proc/check_fire(var/mob/living/target as mob, var/mob/living/user as mob) //Checks if you can hit them or not.
- if(!istype(target) || !istype(user))
- return 0
- var/obj/item/projectile/test/in_chamber = new /obj/item/projectile/test(get_step_to(user,target)) //Making the test....
- in_chamber.target = target
- in_chamber.flags = flags //Set the flags...
- in_chamber.pass_flags = pass_flags //And the pass flags to that of the real projectile...
- in_chamber.firer = user
- var/output = in_chamber.process() //Test it!
- del(in_chamber) //No need for it anymore
- return output //Send it back to the gun!
+/obj/item/projectile/proc/check_fire(var/mob/living/target as mob, var/mob/living/user as mob) //Checks if you can hit them or not.
+ if(!istype(target) || !istype(user))
+ return 0
+ var/obj/item/projectile/test/in_chamber = new /obj/item/projectile/test(get_step_to(user,target)) //Making the test....
+ in_chamber.target = target
+ in_chamber.flags = flags //Set the flags...
+ in_chamber.pass_flags = pass_flags //And the pass flags to that of the real projectile...
+ in_chamber.firer = user
+ var/output = in_chamber.process() //Test it!
+ del(in_chamber) //No need for it anymore
+ return output //Send it back to the gun!
- Bump(atom/A as mob|obj|turf|area)
- if(A == firer)
+/obj/item/projectile/Bump(atom/A as mob|obj|turf|area)
+ if(A == firer)
+ loc = A.loc
+ return 0 //cannot shoot yourself
+
+ if(bumped) return 0
+ var/forcedodge = 0 // force the projectile to pass
+
+ bumped = 1
+ if(firer && istype(A, /mob))
+ var/mob/M = A
+ if(!istype(A, /mob/living))
loc = A.loc
- return 0 //cannot shoot yourself
+ return 0// nope.avi
- if(bumped) return 0
- var/forcedodge = 0 // force the projectile to pass
+ var/distance = get_dist(starting,loc)
+ var/miss_modifier = -30
- bumped = 1
- if(firer && istype(A, /mob))
- var/mob/M = A
- if(!istype(A, /mob/living))
- loc = A.loc
- return 0// nope.avi
+ if (istype(shot_from,/obj/item/weapon/gun)) //If you aim at someone beforehead, it'll hit more often.
+ var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim
+ if (daddy.target && original in daddy.target) //As opposed to no-delay pew pew
+ miss_modifier += -30
+ def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 15*distance)
- var/distance = get_dist(starting,loc)
- var/miss_modifier = -30
-
- if (istype(shot_from,/obj/item/weapon/gun)) //If you aim at someone beforehead, it'll hit more often.
- var/obj/item/weapon/gun/daddy = shot_from //Kinda balanced by fact you need like 2 seconds to aim
- if (daddy.target && original in daddy.target) //As opposed to no-delay pew pew
- miss_modifier += -30
- def_zone = get_zone_with_miss_chance(def_zone, M, miss_modifier + 15*distance)
-
- if(!def_zone)
- visible_message("\blue \The [src] misses [M] narrowly!")
- forcedodge = -1
+ if(!def_zone)
+ visible_message("\blue \The [src] misses [M] narrowly!")
+ forcedodge = -1
+ else
+ if(silenced)
+ M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!"
else
- if(silenced)
- M << "\red You've been shot in the [parse_zone(def_zone)] by the [src.name]!"
- else
- visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
- if(istype(firer, /mob))
- M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]"
- firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]"
- msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
- else
- M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]"
- msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ visible_message("\red [A.name] is hit by the [src.name] in the [parse_zone(def_zone)]!")//X has fired Y is now given by the guns so you cant tell who shot you if you could not see the shooter
+ if(istype(firer, /mob))
+ M.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]"
+ firer.attack_log += "\[[time_stamp()]\] [firer]/[firer.ckey] shot [M]/[M.ckey] with a [src.type]"
+ msg_admin_attack("[firer] ([firer.ckey]) shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
+ else
+ M.attack_log += "\[[time_stamp()]\] UNKNOWN SUBJECT (No longer exists) shot [M]/[M.ckey] with a [src]"
+ msg_admin_attack("UNKNOWN shot [M] ([M.ckey]) with a [src] (JMP)") //BS12 EDIT ALG
- if(A)
- if (!forcedodge)
- forcedodge = A.bullet_act(src, def_zone) // searches for return value
- if(forcedodge == -1) // the bullet passes through a dense object!
- bumped = 0 // reset bumped variable!
- if(istype(A, /turf))
- loc = A
- else
- loc = A.loc
- permutated.Add(A)
- return 0
- if(istype(A,/turf))
- for(var/obj/O in A)
- O.bullet_act(src)
- for(var/mob/M in A)
- M.bullet_act(src, def_zone)
- density = 0
- invisibility = 101
- del(src)
+ if(A)
+ if (!forcedodge)
+ forcedodge = A.bullet_act(src, def_zone) // searches for return value
+ if(forcedodge == -1) // the bullet passes through a dense object!
+ bumped = 0 // reset bumped variable!
+ if(istype(A, /turf))
+ loc = A
+ else
+ loc = A.loc
+ permutated.Add(A)
+ return 0
+ if(istype(A,/turf))
+ for(var/obj/O in A)
+ O.bullet_act(src)
+ for(var/mob/M in A)
+ M.bullet_act(src, def_zone)
+ density = 0
+ invisibility = 101
+ del(src)
+ return 1
+
+/obj/item/projectile/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
+ if(air_group || (height==0)) return 1
+
+ if(istype(mover, /obj/item/projectile))
+ return prob(95)
+ else
return 1
-
- CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
-
- if(istype(mover, /obj/item/projectile))
- return prob(95)
- else
- return 1
-
-
- process()
- if(kill_count < 1)
+/obj/item/projectile/process()
+ if(kill_count < 1)
+ del(src)
+ kill_count--
+ spawn while(src)
+ if((!( current ) || loc == current))
+ current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
+ if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
del(src)
- kill_count--
- spawn while(src)
- if((!( current ) || loc == current))
- current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
- if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
- del(src)
- return
- step_towards(src, current)
- sleep(1)
- if(!bumped && !isturf(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Bump(original)
- sleep(1)
- return
+ return
+ step_towards(src, current)
+ sleep(1)
+ if(!bumped && !isturf(original))
+ if(loc == get_turf(original))
+ if(!(original in permutated))
+ Bump(original)
+ sleep(1)
+ return
/obj/item/projectile/test //Used to see if you can hit them.
invisibility = 101 //Nope! Can't see me!
@@ -167,36 +165,36 @@
var/target = null
var/result = 0 //To pass the message back to the gun.
- Bump(atom/A as mob|obj|turf|area)
- if(A == firer)
- loc = A.loc
- return //cannot shoot yourself
- if(istype(A, /obj/item/projectile))
- return
- if(istype(A, /mob/living))
- result = 2 //We hit someone, return 1!
- return
- result = 1
+/obj/item/projectile/test/Bump(atom/A as mob|obj|turf|area)
+ if(A == firer)
+ loc = A.loc
+ return //cannot shoot yourself
+ if(istype(A, /obj/item/projectile))
return
+ if(istype(A, /mob/living))
+ result = 2 //We hit someone, return 1!
+ return
+ result = 1
+ return
- process()
- var/turf/curloc = get_turf(src)
- var/turf/targloc = get_turf(target)
- if(!curloc || !targloc)
- return 0
- yo = targloc.y - curloc.y
- xo = targloc.x - curloc.x
- target = targloc
- while(src) //Loop on through!
- if(result)
- return (result - 1)
- if((!( target ) || loc == target))
- target = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge
- step_towards(src, target)
- var/mob/living/M = locate() in get_turf(src)
- if(istype(M)) //If there is someting living...
- return 1 //Return 1
- else
- M = locate() in get_step(src,target)
- if(istype(M))
- return 1
+/obj/item/projectile/test/process()
+ var/turf/curloc = get_turf(src)
+ var/turf/targloc = get_turf(target)
+ if(!curloc || !targloc)
+ return 0
+ yo = targloc.y - curloc.y
+ xo = targloc.x - curloc.x
+ target = targloc
+ while(src) //Loop on through!
+ if(result)
+ return (result - 1)
+ if((!( target ) || loc == target))
+ target = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z) //Finding the target turf at map edge
+ step_towards(src, target)
+ var/mob/living/M = locate() in get_turf(src)
+ if(istype(M)) //If there is someting living...
+ return 1 //Return 1
+ else
+ M = locate() in get_step(src,target)
+ if(istype(M))
+ return 1
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index b811eb9281..1aaefb060d 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -17,68 +17,69 @@ var/list/beam_master = list()
flag = "laser"
eyeblur = 4
var/frequency = 1
- process()
- var/reference = "\ref[src]" //So we do not have to recalculate it a ton
- var/first = 1 //So we don't make the overlay in the same tile as the firer
- spawn while(src) //Move until we hit something
- if((!( current ) || loc == current)) //If we pass our target
- current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
- if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
- del(src) //Delete if it passes the world edge
- return
- step_towards(src, current) //Move~
+/obj/item/projectile/beam/process()
+ var/reference = "\ref[src]" //So we do not have to recalculate it a ton
+ var/first = 1 //So we don't make the overlay in the same tile as the firer
+ spawn while(src) //Move until we hit something
- if(kill_count < 1)
- del(src)
- kill_count--
+ if((!( current ) || loc == current)) //If we pass our target
+ current = locate(min(max(x + xo, 1), world.maxx), min(max(y + yo, 1), world.maxy), z)
+ if((x == 1 || x == world.maxx || y == 1 || y == world.maxy))
+ del(src) //Delete if it passes the world edge
+ return
+ step_towards(src, current) //Move~
- if(!bumped && !isturf(original))
- if(loc == get_turf(original))
- if(!(original in permutated))
- Bump(original)
+ if(kill_count < 1)
+ del(src)
+ kill_count--
- if(!first) //Add the overlay as we pass over tiles
- var/target_dir = get_dir(src, current) //So we don't call this too much
+ if(!bumped && !isturf(original))
+ if(loc == get_turf(original))
+ if(!(original in permutated))
+ Bump(original)
- //If the icon has not been added yet
- if( !("[icon_state][target_dir]" in beam_master) )
- var/image/I = image(icon,icon_state,10,target_dir) //Generate it.
- beam_master["[icon_state][target_dir]"] = I //And cache it!
+ if(!first) //Add the overlay as we pass over tiles
+ var/target_dir = get_dir(src, current) //So we don't call this too much
- //Finally add the overlay
- src.loc.overlays += beam_master["[icon_state][target_dir]"]
+ //If the icon has not been added yet
+ if( !("[icon_state][target_dir]" in beam_master) )
+ var/image/I = image(icon,icon_state,10,target_dir) //Generate it.
+ beam_master["[icon_state][target_dir]"] = I //And cache it!
- //Add the turf to a list in the beam master so they can be cleaned up easily.
- if(reference in beam_master)
- var/list/turf_master = beam_master[reference]
- if("[icon_state][target_dir]" in turf_master)
- var/list/turfs = turf_master["[icon_state][target_dir]"]
- turfs += loc
- else
- turf_master["[icon_state][target_dir]"] = list(loc)
+ //Finally add the overlay
+ src.loc.overlays += beam_master["[icon_state][target_dir]"]
+
+ //Add the turf to a list in the beam master so they can be cleaned up easily.
+ if(reference in beam_master)
+ var/list/turf_master = beam_master[reference]
+ if("[icon_state][target_dir]" in turf_master)
+ var/list/turfs = turf_master["[icon_state][target_dir]"]
+ turfs += loc
else
- var/list/turfs = list()
- turfs["[icon_state][target_dir]"] = list(loc)
- beam_master[reference] = turfs
+ turf_master["[icon_state][target_dir]"] = list(loc)
else
- first = 0
- cleanup(reference)
- return
+ var/list/turfs = list()
+ turfs["[icon_state][target_dir]"] = list(loc)
+ beam_master[reference] = turfs
+ else
+ first = 0
+ cleanup(reference)
+ return
- Del()
- cleanup("\ref[src]")
- ..()
+/obj/item/projectile/beam/Del()
+ cleanup("\ref[src]")
+ ..()
- proc/cleanup(reference) //Waits .3 seconds then removes the overlay.
- src = null //we're getting deleted! this will keep the code running
- spawn(3)
- var/list/turf_master = beam_master[reference]
- for(var/laser_state in turf_master)
- var/list/turfs = turf_master[laser_state]
- for(var/turf/T in turfs)
- T.overlays -= beam_master[laser_state]
- return
+/obj/item/projectile/beam/proc/cleanup(reference) //Waits .3 seconds then removes the overlay.
+ src = null //we're getting deleted! this will keep the code running
+ spawn(3)
+ var/list/turf_master = beam_master[reference]
+ for(var/laser_state in turf_master)
+ var/list/turfs = turf_master[laser_state]
+ for(var/turf/T in turfs)
+ T.overlays -= beam_master[laser_state]
+ return
/obj/item/projectile/beam/practice
name = "laser"
@@ -89,7 +90,6 @@ var/list/beam_master = list()
flag = "laser"
eyeblur = 2
-
/obj/item/projectile/beam/heavylaser
name = "heavy laser"
icon_state = "heavylaser"
@@ -105,13 +105,11 @@ var/list/beam_master = list()
icon_state = "u_laser"
damage = 50
-
/obj/item/projectile/beam/emitter
name = "emitter beam"
icon_state = "emitter"
damage = 30
-
/obj/item/projectile/beam/lastertag/blue
name = "lasertag beam"
icon_state = "bluelaser"
@@ -120,12 +118,12 @@ var/list/beam_master = list()
damage_type = BURN
flag = "laser"
- on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
- M.Weaken(5)
- return 1
+/obj/item/projectile/beam/lastertag/blue/on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if(istype(M.wear_suit, /obj/item/clothing/suit/redtag))
+ M.Weaken(5)
+ return 1
/obj/item/projectile/beam/lastertag/red
name = "lasertag beam"
@@ -135,12 +133,12 @@ var/list/beam_master = list()
damage_type = BURN
flag = "laser"
- on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
- M.Weaken(5)
- return 1
+/obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if(istype(M.wear_suit, /obj/item/clothing/suit/bluetag))
+ M.Weaken(5)
+ return 1
/obj/item/projectile/beam/lastertag/omni//A laser tag bolt that stuns EVERYONE
name = "lasertag beam"
@@ -150,12 +148,12 @@ var/list/beam_master = list()
damage_type = BURN
flag = "laser"
- on_hit(var/atom/target, var/blocked = 0)
- if(istype(target, /mob/living/carbon/human))
- var/mob/living/carbon/human/M = target
- if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag)))
- M.Weaken(5)
- return 1
+/obj/item/projectile/beam/lastertag/omni/on_hit(var/atom/target, var/blocked = 0)
+ if(istype(target, /mob/living/carbon/human))
+ var/mob/living/carbon/human/M = target
+ if((istype(M.wear_suit, /obj/item/clothing/suit/bluetag))||(istype(M.wear_suit, /obj/item/clothing/suit/redtag)))
+ M.Weaken(5)
+ return 1
/obj/item/projectile/beam/sniper
name = "sniper beam"