diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm
index 0e53ac3555..9ae51c816a 100644
--- a/code/modules/assembly/flash.dm
+++ b/code/modules/assembly/flash.dm
@@ -8,45 +8,35 @@
throwforce = 0
w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL = 300, MAT_GLASS = 300)
-
- crit_fail = 0 //Is the flash burnt out?
+ crit_fail = FALSE //Is the flash burnt out?
var/times_used = 0 //Number of times it's been used.
+ var/burnout_resistance = 0
var/last_used = 0 //last world.time it was used.
+ var/cooldown = 0
+ var/last_trigger = 0 //Last time it was successfully triggered.
-
-/obj/item/device/assembly/flash/update_icon(var/flash = 0)
+/obj/item/device/assembly/flash/update_icon(flash = FALSE)
cut_overlays()
attached_overlays = list()
if(crit_fail)
add_overlay("flashburnt")
attached_overlays += "flashburnt"
-
if(flash)
add_overlay("flash-f")
attached_overlays += "flash-f"
- spawn(5)
- update_icon()
+ addtimer(CALLBACK(src, .proc/update_icon), 5)
if(holder)
holder.update_icon()
/obj/item/device/assembly/flash/proc/clown_check(mob/living/carbon/human/user)
if(user.has_disability(DISABILITY_CLUMSY) && prob(50))
flash_carbon(user, user, 15, 0)
- return 0
- return 1
-
-/obj/item/device/assembly/flash/activate()
- if(!try_use_flash())
- return 0
- var/turf/T = get_turf(src)
- T.visible_message("[src] emits a blinding light!")
- for(var/mob/living/carbon/M in viewers(3, T))
- flash_carbon(M, null, 5, 0)
-
+ return FALSE
+ return TRUE
/obj/item/device/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
if(!crit_fail)
- crit_fail = 1
+ crit_fail = TRUE
update_icon()
if(ismob(loc))
var/mob/M = loc
@@ -55,57 +45,81 @@
var/turf/T = get_turf(src)
T.visible_message("[src] burns out!")
-
-/obj/item/device/assembly/flash/proc/flash_recharge(interval=10)
- if(prob(times_used * 3)) //The more often it's used in a short span of time the more likely it will burn out
- burn_out()
- return 0
-
+/obj/item/device/assembly/flash/proc/flash_recharge(interval = 10)
var/deciseconds_passed = world.time - last_used
- for(var/seconds = deciseconds_passed/10, seconds>=interval, seconds-=interval) //get 1 charge every interval
+ for(var/seconds = deciseconds_passed / 10, seconds >= interval, seconds -= interval) //get 1 charge every interval
times_used--
-
last_used = world.time
times_used = max(0, times_used) //sanity
- return 1
+ if(max(0, prob(times_used * 3) - burnout_resistance)) //The more often it's used in a short span of time the more likely it will burn out
+ burn_out()
+ return FALSE
+ return TRUE
+
+//BYPASS CHECKS ALSO PREVENTS BURNOUT!
+/obj/item/device/assembly/flash/proc/AOE_flash(bypass_checks = FALSE, range = 3, power = 5, targeted = FALSE, mob/user)
+ if(!bypass_checks && !try_use_flash())
+ return FALSE
+ var/list/mob/targets = get_flash_targets(loc, range, FALSE)
+ if(user)
+ targets -= user
+ for(var/mob/M in targets)
+ flash_carbon(M, user, power, targeted, TRUE)
+ return TRUE
+
+/obj/item/device/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE)
+ if(!target_loc)
+ target_loc = loc
+ if(override_vision_checks)
+ return get_hearers_in_view(range, get_turf(target_loc))
+ if(isturf(target_loc) || (ismob(target_loc) && isturf(target_loc.loc)))
+ return viewers(range, get_turf(target_loc))
+ else
+ return typecache_filter_list(target_loc.GetAllContents(), typecacheof(list(/mob)))
/obj/item/device/assembly/flash/proc/try_use_flash(mob/user = null)
- if(crit_fail)
- return 0
- playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ if(crit_fail || (world.time < last_trigger + cooldown))
+ return FALSE
+ last_trigger = world.time
+ playsound(src, 'sound/weapons/flash.ogg', 100, 1)
times_used++
- flash_recharge(10)
- update_icon(1)
+ flash_recharge()
+ update_icon(TRUE)
if(user && !clown_check(user))
- return 0
+ return FALSE
+ return TRUE
- return 1
-
-
-/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user = null, power = 15, targeted = 1)
- add_logs(user, M, "flashed", src)
- if(user && targeted)
+/obj/item/device/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE)
+ add_logs(user, M, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src)
+ if(generic_message && M != user)
+ to_chat(M, "[src] emits a blinding light!")
+ if(targeted)
if(M.flash_act(1, 1))
M.confused += power
- terrible_conversion_proc(M, user)
+ if(user)
+ terrible_conversion_proc(M, user)
+ visible_message("[user] blinds [M] with the flash!")
+ to_chat(user, "You blind [M] with the flash!")
+ to_chat(M, "[user] blinds you with the flash!")
+ else
+ to_chat(M, "You are blinded by [src]!")
M.Knockdown(rand(80,120))
- visible_message("[user] blinds [M] with the flash!")
- to_chat(user, "You blind [M] with the flash!")
- to_chat(M, "[user] blinds you with the flash!")
- else
+ else if(user)
visible_message("[user] fails to blind [M] with the flash!")
to_chat(user, "You fail to blind [M] with the flash!")
to_chat(M, "[user] fails to blind you with the flash!")
+ else
+ to_chat(M, "[src] fails to blind you!")
else
if(M.flash_act())
M.confused += power
/obj/item/device/assembly/flash/attack(mob/living/M, mob/user)
if(!try_use_flash(user))
- return 0
+ return FALSE
if(iscarbon(M))
flash_carbon(M, user, 5, 1)
- return 1
+ return TRUE
else if(issilicon(M))
var/mob/living/silicon/robot/R = M
add_logs(user, R, "flashed", src)
@@ -114,29 +128,24 @@
R.confused += 5
R.flash_act(affect_silicon = 1)
user.visible_message("[user] overloads [R]'s sensors with the flash!", "You overload [R]'s sensors with the flash!")
- return 1
+ return TRUE
user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!")
/obj/item/device/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
if(holder)
- return 0
- if(!try_use_flash(user))
- return 0
- user.visible_message("[user]'s flash emits a blinding light!", "Your flash emits a blinding light!")
- for(var/mob/living/carbon/M in oviewers(3, null))
- flash_carbon(M, user, 1, 0)
-
+ return FALSE
+ if(!AOE_flash(FALSE, 3, 5, FALSE, user))
+ return FALSE
+ to_chat(user, "Your [src] emits a blinding light!")
/obj/item/device/assembly/flash/emp_act(severity)
if(!try_use_flash())
- return 0
- if(iscarbon(loc))
- flash_carbon(loc, null, 10, 0)
+ return FALSE
+ AOE_flash()
burn_out()
- ..()
-
+ . = ..()
/obj/item/device/assembly/flash/proc/terrible_conversion_proc(mob/living/carbon/human/H, mob/user)
if(istype(H) && ishuman(user) && H.stat != DEAD)
@@ -189,7 +198,7 @@
if(I && I.owner)
to_chat(I.owner, "Your photon projector implant overheats and deactivates!")
I.Retract()
- overheat = FALSE
+ overheat = TRUE
addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2)
/obj/item/device/assembly/flash/armimplant/try_use_flash(mob/user = null)
@@ -199,7 +208,7 @@
return FALSE
overheat = TRUE
addtimer(CALLBACK(src, .proc/cooldown), flashcd)
- playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ playsound(src, 'sound/weapons/flash.ogg', 100, 1)
update_icon(1)
return TRUE
@@ -229,8 +238,8 @@
/obj/item/device/assembly/flash/shield/flash_recharge(interval=10)
if(times_used >= 4)
burn_out()
- return 0
- return 1
+ return FALSE
+ return TRUE
/obj/item/device/assembly/flash/shield/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/device/assembly/flash/handheld))
diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm
index cfb700d9d7..413e9c1b0b 100644
--- a/code/modules/mob/living/living_defense.dm
+++ b/code/modules/mob/living/living_defense.dm
@@ -373,7 +373,8 @@
if(get_eye_protection() < intensity && (override_blindness_check || !(has_disability(DISABILITY_BLIND))))
overlay_fullscreen("flash", type)
addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25)
- return 1
+ return TRUE
+ return FALSE
//called when the mob receives a loud bang
/mob/living/proc/soundbang_act()
diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm
index 10c9a04a6e..c2cf2505d0 100644
--- a/code/modules/mob/mob_helpers.dm
+++ b/code/modules/mob/mob_helpers.dm
@@ -323,8 +323,8 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
/proc/is_blind(A)
if(ismob(A))
var/mob/B = A
- return B.eye_blind
- return 0
+ return B.eye_blind
+ return FALSE
/mob/proc/hallucinating()
return FALSE