From cd1cefdd7b3c218ee79a5c80c7784beb2eecdc20 Mon Sep 17 00:00:00 2001 From: Cheridan Date: Sat, 4 Oct 2014 19:51:14 -0500 Subject: [PATCH] Flash Update MASSIVE CLEANUP of flash code. Instead of Weaken(), flashes now add confusion, similar to being drunk. Synth flashes removed. --- code/game/objects/items/devices/flash.dm | 288 ++++++++---------- .../research/designs/medical_designs.dm | 4 +- 2 files changed, 127 insertions(+), 165 deletions(-) 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