diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index ae0c9ab83c2..741706b5d38 100644
--- a/code/game/objects/items/devices/flash.dm
+++ b/code/game/objects/items/devices/flash.dm
@@ -4,7 +4,7 @@
icon_state = "flash"
item_state = "flashbang" //looks exactly like a flash (and nothing like a flashbang)
throwforce = 0
- w_class = 1.0
+ w_class = 1
throw_speed = 3
throw_range = 7
flags = CONDUCT
@@ -13,16 +13,37 @@
var/times_used = 0 //Number of times it's been used.
var/broken = 0 //Is the flash burnt out?
var/last_used = 0 //last world.time it was used.
- var/burnt = "flashburnt"
- var/flashanim = "flash2"
+
/obj/item/device/flash/proc/clown_check(mob/user)
if(user && (CLUMSY in user.mutations) && prob(50))
- user << "[src] slips out of your hand."
- user.drop_item()
+ flash_carbon(user, user, 15, 0)
+ visible_message("[user] blinds [user] with the flash!")
return 0
return 1
+
+/obj/item/device/flash/proc/handle_flash_charges()
+ //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking. It will never break on the first use.
+ switch(times_used)
+ if(0 to 5)
+ last_used = world.time
+ if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
+ burn_out()
+ return 0
+ else //can only use it 5 times a minute
+ visible_message("*click* *click*")
+ return 0
+ times_used++
+ return 1
+
+
+/obj/item/device/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something.
+ broken = 1
+ icon_state = "[initial(icon_state)]burnt"
+ visible_message("The [src.name] burns out!")
+
+
/obj/item/device/flash/proc/flash_recharge()
//capacitor recharges over time
for(var/i=0, i<3, i++)
@@ -31,188 +52,129 @@
last_used += 600
times_used -= 2
last_used = world.time
- times_used = max(0,round(times_used)) //sanity
+ times_used = max(0, times_used) //sanity
-/obj/item/device/flash/proc/burn_out(mob/user = null) //Made so you can override it if you want to have an invincible flash from R&D or something.
- broken = 1
- icon_state = burnt
- if(user)
- user << "The bulb has burnt out!"
+
+/obj/item/device/flash/proc/try_use_flash(var/mob/flasher)
+ flash_recharge()
+
+ if(broken)
+ return 0
+ if(!handle_flash_charges())
+ return 0
+
+ playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ flick("[initial(icon_state)]2", src)
+
+ if(flasher && !clown_check(flasher))
+ return 0
+
+ return 1
+
+
+/obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 10, convert = 1)
+ add_logs(user, M, "flashed", object="[src.name]")
+ //if(iscarbon(M))
+ var/safety = M:eyecheck()
+ if(safety <= 0)
+ M.confused += power
+ flick("e_flash", M.flash)
+ if(user && convert)
+ terrible_conversion_proc(M, user)
/obj/item/device/flash/attack(mob/living/M, mob/user)
- if(!user || !M) return //sanity
-
- add_logs(user, M, "flashed", object="[src.name]")
-
- if(!clown_check(user)) return
- if(broken)
- user << "[src] is broken."
- return
-
- flash_recharge()
-
- //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking
- //It will never break on the first use.
- switch(times_used)
- if(0 to 5)
- last_used = world.time
- if(prob(times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
- burn_out(user)
- return
- times_used++
- else //can only use it 5 times a minute
- user << "*click* *click*"
- return
- playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
- var/flashfail = 0
+ if(!try_use_flash(user))
+ return 0
if(iscarbon(M))
- var/safety = M:eyecheck()
- if(safety <= 0)
- M.Weaken(5)
- flick("e_flash", M.flash)
-
- if(ishuman(M) && ishuman(user) && M.stat != DEAD)
- if(user.mind && ((user.mind in ticker.mode.head_revolutionaries) || (user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.B_bosses)))
- if(M.client)
- if(M.stat == CONSCIOUS)
- M.mind_initialize() //give them a mind datum if they don't have one.
- var/resisted
- if(!isloyal(M))
- if(user.mind in ticker.mode.head_revolutionaries)
- if(!ticker.mode.add_revolutionary(M.mind))
- resisted = 1
- if(user.mind in ticker.mode.A_bosses)
- if(!ticker.mode.add_gangster(M.mind,"A"))
- resisted = 1
- if(user.mind in ticker.mode.B_bosses)
- if(!ticker.mode.add_gangster(M.mind,"B"))
- resisted = 1
- else
- resisted = 1
-
- if(resisted)
- user << "This mind seems resistant to the flash!"
- else
- user << "They must be conscious before you can convert them!"
- else
- user << "This mind is so vacant that it is not susceptible to influence!"
- else
- flashfail = 1
+ flash_carbon(M, user, 10, 1)
+ visible_message("[user] blinds [M] with the flash!")
+ return 1
else if(issilicon(M))
M.Weaken(rand(5,10))
- else
- flashfail = 1
-
- if(isrobot(user))
- spawn(0)
- var/atom/movable/overlay/animation = new(user.loc)
- animation.layer = user.layer + 1
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = user
- flick("blspell", animation)
- sleep(5)
- qdel(animation)
-
- if(!flashfail)
- flick(flashanim, src)
- if(!issilicon(M))
-
- user.visible_message("[user] blinds [M] with the flash!")
- else
-
- user.visible_message("[user] overloads [M]'s sensors with the flash!")
- else
-
- user.visible_message("[user] fails to blind [M] with the flash!")
-
+ add_logs(user, M, "flashed", object="[src.name]")
+ visible_message("[user] overloads [M]'s sensors with the flash!")
+ return 1
+ visible_message("[user] fails to blind [M] with the flash!")
/obj/item/device/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
- if(!user || !clown_check(user)) return
- if(broken)
- user.show_message("[src] is broken!", 2)
- return
-
- flash_recharge()
-
- //spamming the flash before it's fully charged (60seconds) increases the chance of it breaking
- //It will never break on the first use.
- switch(times_used)
- if(0 to 5)
- if(prob(2*times_used)) //if you use it 5 times in a minute it has a 10% chance to break!
- burn_out(user)
- return
- times_used++
- else //can only use it 5 times a minute
- user.show_message("*click* *click*", 2)
- return
- playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
- flick("flash2", src)
- if(user && isrobot(user))
- spawn(0)
- var/atom/movable/overlay/animation = new(user.loc)
- animation.layer = user.layer + 1
- animation.icon_state = "blank"
- animation.icon = 'icons/mob/mob.dmi'
- animation.master = user
- flick("blspell", animation)
- sleep(5)
- qdel(animation)
-
+ if(!try_use_flash(user))
+ return 0
for(var/mob/living/carbon/M in oviewers(3, null))
- var/safety = M:eyecheck()
- if(!safety)
- if(!M.blinded)
- flick("flash", M.flash)
+ flash_carbon(M, user, 5, 0)
- return
/obj/item/device/flash/emp_act(severity)
- if(broken) return
- flash_recharge()
- switch(times_used)
- if(0 to 5)
- if(prob(2*times_used))
- burn_out()
- return
- times_used++
- if(istype(loc, /mob/living/carbon))
- var/mob/living/carbon/M = loc
- var/safety = M.eyecheck()
- if(safety <= 0)
- M.Weaken(5)
- flick("e_flash", M.flash)
- for(var/mob/O in viewers(M, null))
- O.show_message("[M] is blinded by the flash!")
+ if(!try_use_flash())
+ return 0
+
+ for(var/mob/living/carbon/M in viewers(3, null))
+ flash_carbon(M, null, 10, 0)
+ burn_out()
+
+ //if(istype(loc, /mob/living/carbon))
+ //var/mob/living/carbon/M = loc
+ //flash_carbon(M, null, 15, 0)
+ //visible_message("[M] is blinded by the [src.name]!")
..()
-/obj/item/device/flash/synthetic
- name = "synthetic flash"
- desc = "When a problem arises, SCIENCE is the solution."
- icon_state = "sflash"
- origin_tech = "magnets=2;combat=1"
- var/construction_cost = list("metal"=750, "glass"=750)
- var/construction_time=100
-/obj/item/device/flash/synthetic/attack(mob/living/M, mob/user)
- ..()
- if(!broken)
- burn_out(user)
+/obj/item/device/flash/proc/terrible_conversion_proc(var/mob/M, var/mob/user)
+ if(ishuman(M) && ishuman(user) && M.stat != DEAD)
+ if(user.mind && ((user.mind in ticker.mode.head_revolutionaries) || (user.mind in ticker.mode.A_bosses) || (user.mind in ticker.mode.B_bosses)))
+ if(M.client)
+ if(M.stat == CONSCIOUS)
+ M.mind_initialize() //give them a mind datum if they don't have one.
+ var/resisted
+ if(!isloyal(M))
+ if(user.mind in ticker.mode.head_revolutionaries)
+ if(!ticker.mode.add_revolutionary(M.mind))
+ resisted = 1
+ if(user.mind in ticker.mode.A_bosses)
+ if(!ticker.mode.add_gangster(M.mind,"A"))
+ resisted = 1
+ if(user.mind in ticker.mode.B_bosses)
+ if(!ticker.mode.add_gangster(M.mind,"B"))
+ resisted = 1
+ else
+ resisted = 1
-/obj/item/device/flash/synthetic/attack_self(mob/living/carbon/user, flag = 0, emp = 0)
+ if(resisted)
+ user << "This mind seems resistant to the flash!"
+ else
+ user << "They must be conscious before you can convert them!"
+ else
+ user << "This mind is so vacant that it is not susceptible to influence!"
+
+
+/obj/item/device/flash/cyborg
+ origin_tech = null
+
+/obj/item/device/flash/cyborg/attack(mob/living/M, mob/user)
..()
- if(!broken)
- burn_out(user)
+ cyborg_flash_animation(user)
+
+/obj/item/device/flash/cyborg/attack_self(mob/living/M, mob/user)
+ ..()
+ cyborg_flash_animation(user)
+
+/obj/item/device/flash/cyborg/proc/cyborg_flash_animation(var/mob/living/user)
+ var/atom/movable/overlay/animation = new(user.loc)
+ animation.layer = user.layer + 1
+ animation.icon_state = "blank"
+ animation.icon = 'icons/mob/mob.dmi'
+ animation.master = user
+ flick("blspell", animation)
+ sleep(5)
+ qdel(animation)
+
/obj/item/device/flash/memorizer
name = "memorizer"
desc = "If you see this, you're not likely to remember it any time soon."
icon_state = "memorizer"
- item_state = "nullrod"
- burnt = "memorizerburnt"
- flashanim = "memorizer2"
+ item_state = "nullrod"
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index dcd5f06d0c1..c2e2ebf5e6a 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -45,14 +45,14 @@ datum/design/mmi_radio
category = "Misc"
datum/design/synthetic_flash
- name = "Synthetic Flash"
+ name = "Flash"
desc = "When a problem arises, SCIENCE is the solution."
id = "sflash"
req_tech = list("magnets" = 3, "combat" = 2)
build_type = MECHFAB
materials = list("$metal" = 750, "$glass" = 750)
reliability = 76
- build_path = /obj/item/device/flash/synthetic
+ build_path = /obj/item/device/flash/
category = "Misc"
datum/design/bluespacebeaker