diff --git a/_maps/map_files/MetaStation.v39K.dmm b/_maps/map_files/MetaStation.v39K.dmm
index 26cb458cb4e..7036fbfd3c2 100644
--- a/_maps/map_files/MetaStation.v39K.dmm
+++ b/_maps/map_files/MetaStation.v39K.dmm
@@ -6622,7 +6622,7 @@
"cxr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics)
"cxs" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; icon_state = "intact-g"; level = 2},/turf/space,/area/space)
"cxt" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cxu" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics)
+"cxu" = (/obj/structure/rack,/obj/item/weapon/storage/belt/utility,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor{icon_state = "bot"},/area/assembly/robotics)
"cxv" = (/obj/machinery/door/window/southleft{base_state = "right"; dir = 2; icon_state = "right"; name = "Cloning Shower"},/obj/structure/sink/kitchen{desc = "A sink used for washing one's hands and face. It looks rusty and home-made"; name = "sink"; pixel_y = 28},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning)
"cxw" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/assembly/showroom{name = "\improper Corporate Showroom"})
"cxx" = (/obj/machinery/clonepod{pixel_y = 2},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/obj/structure/window/reinforced,/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning)
diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm
index d5e1f8a2a8c..f1d5c7ce4e4 100644
--- a/_maps/map_files/tgstation.2.1.3.dmm
+++ b/_maps/map_files/tgstation.2.1.3.dmm
@@ -3290,7 +3290,7 @@
"bln" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"blo" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/assembly/robotics)
"blp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/assembly/robotics)
-"blq" = (/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/obj/structure/table,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
+"blq" = (/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/obj/structure/table,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/obj/item/device/flash,/turf/simulated/floor{icon_state = "white"},/area/assembly/robotics)
"blr" = (/obj/structure/closet/emcloset,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 9; icon_state = "warnwhite"},/area/medical/research{name = "Research Division"})
"bls" = (/turf/simulated/floor{icon_state = "white"},/area/medical/research{name = "Research Division"})
"blt" = (/obj/machinery/camera{c_tag = "Research Division Access"; dir = 2; network = list("SS13")},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "warnwhite"; dir = 5},/area/medical/research{name = "Research Division"})
diff --git a/code/game/objects/items/devices/flash.dm b/code/game/objects/items/devices/flash.dm
index ae0c9ab83c2..1c41c285f3e 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,206 +13,147 @@
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)
+ user.visible_message("[user] blinds [user] with the flash!")
return 0
return 1
-/obj/item/device/flash/proc/flash_recharge()
- //capacitor recharges over time
- for(var/i=0, i<3, i++)
- if(last_used+600 > world.time)
- break
- last_used += 600
- times_used -= 2
- last_used = world.time
- times_used = max(0,round(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.
+/obj/item/device/flash/proc/burn_out(var/mob/user) //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!"
+ icon_state = "[initial(icon_state)]burnt"
+ user.visible_message("The [src.name] burns out!")
+
+
+/obj/item/device/flash/proc/flash_recharge(var/mob/user)
+ if(prob(times_used * 2)) //if you use it 5 times in a minute it has a 10% chance to break!
+ burn_out(user)
+ return 0
+
+ var/deciseconds_passed = world.time - last_used
+ for(var/seconds = deciseconds_passed/10, seconds>=10, seconds-=10) //get 1 charge every 10 seconds
+ times_used--
+
+ last_used = world.time
+ times_used = max(0, times_used) //sanity
+
+
+/obj/item/device/flash/proc/try_use_flash(var/mob/user)
+ flash_recharge(user)
+
+ if(broken)
+ return 0
+
+ playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1)
+ flick("[initial(icon_state)]2", src)
+ times_used++
+
+ if(user && !clown_check(user))
+ return 0
+
+ return 1
+
+
+/obj/item/device/flash/proc/flash_carbon(var/mob/living/carbon/M, var/mob/user = null, var/power = 5, convert = 1)
+ add_logs(user, M, "flashed", object="[src.name]")
+ 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, 5, 1)
+ user.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]")
+ user.visible_message("[user] overloads [M]'s sensors with the flash!")
+ return 1
+ user.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, 3, 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()
..()
-/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/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/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 981217e6ad8..abd72da72d3 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -36,7 +36,7 @@
/obj/item/weapon/robot_module/New()
modules += new /obj/item/device/flashlight(src)
- modules += new /obj/item/device/flash(src)
+ modules += new /obj/item/device/flash/cyborg(src)
emag = new /obj/item/toy/sword(src)
emag.name = "Placeholder Emag Item"
// jetpack = new /obj/item/toy/sword(src)
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