diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm index 2540b93ee7f..6a6ff10dc40 100644 --- a/code/game/objects/devices/flash.dm +++ b/code/game/objects/devices/flash.dm @@ -15,14 +15,25 @@ var/last_used = 0 //last world.time it was used. /obj/item/device/flash/proc/clown_check(var/mob/user) - if((user.mutations & CLUMSY) && prob(50)) + if(user && (user.mutations & CLUMSY) && prob(50)) user << "\red The Flash slips out of your hand." user.drop_item() 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/attack(mob/living/M as mob, mob/user as mob) + if(!user || !M) return //sanity M.attack_log += text("\[[time_stamp()]\] Has been flashed (attempt) with [src.name] by [user.name] ([user.ckey])") user.attack_log += text("\[[time_stamp()]\] Used the [src.name] to flash [M.name] ([M.ckey])") @@ -31,30 +42,24 @@ if(!clown_check(user)) return if(broken) - user.show_message("\red The [src.name] is broken", 2) + user.show_message("The [src.name] is broken.", 2) return - //capacitor recharges over time - for(var/i=0, i<3, i++) - if(last_used+600 > world.time) - break - last_used += 600 - times_used-- + 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. - times_used = max(0,round(times_used)) //sanity 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! broken = 1 - user << "\red The bulb has burnt out!" + user << "The bulb has burnt out!" icon_state = "flashburnt" return times_used++ else //can only use it 5 times a minute - user.show_message("\red *click* *click*", 2) + user.show_message("*click* *click*", 2) return playsound(src.loc, 'flash.ogg', 100, 1) var/flashfail = 0 @@ -65,22 +70,25 @@ M.Weaken(10) flick("e_flash", M.flash) - if(ishuman(M) && ishuman(user)) - if(user.mind in ticker.mode.head_revolutionaries) + if(ishuman(M) && ishuman(user) && M.stat!=DEAD) + if(user.mind && user.mind in ticker.mode.head_revolutionaries) var/revsafe = 0 for(var/obj/item/weapon/implant/loyalty/L in M) if(L && L.implanted) revsafe = 1 break - if(M.mind.has_been_rev) - revsafe = 2 - if(!revsafe) - M.mind.has_been_rev = 1 - ticker.mode.add_revolutionary(M.mind) - else if(revsafe == 1) - user << "\red Something seems to be blocking the flash!" - else - user << "\red This mind seems resistant to the flash!" + M:update_mind() //give them a mind datum if they don't have one. won't work if they are logged out/ghosted or something. + if(M.mind) + if(M.mind.has_been_rev) + revsafe = 2 + if(!revsafe) + M.mind.has_been_rev = 1 + ticker.mode.add_revolutionary(M.mind) + else if(revsafe == 1) + user << "Something seems to be blocking the flash!" + else + user << "This mind seems resistant to the flash!" + user << "This mind is so vacant that it is not susceptible to influence!" else flashfail = 1 @@ -101,50 +109,42 @@ sleep(5) del(animation) - if(!flashfail) + flick("flash2", src) for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] blinds [] with the flash!", user, M)) + O.show_message("[user] blinds [M] with the flash!") else for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue [] fails to blind [] with the flash!", user, M)) - + O.show_message("[user] fails to blind [M] with the flash!") return + + /obj/item/device/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) - if(!emp) - if (!clown_check(user)) return + if(!user || !clown_check(user)) return if(broken) - if(user) - user.show_message("\red The [src.name] is broken", 2) + user.show_message("The [src.name] is broken", 2) return - //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 + 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. - times_used = max(0,round(times_used)) //sanity 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! broken = 1 - user << "\red The bulb has burnt out!" + user << "The bulb has burnt out!" icon_state = "flashburnt" return times_used++ else //can only use it 5 times a minute - user.show_message("\red *click* *click*", 2) + user.show_message("*click* *click*", 2) return playsound(src.loc, 'flash.ogg', 100, 1) flick("flash2", src) - if(isrobot(user)) + if(user && isrobot(user)) spawn(0) var/atom/movable/overlay/animation = new(user.loc) animation.layer = user.layer + 1 @@ -168,5 +168,21 @@ return /obj/item/device/flash/emp_act(severity) - src.attack_self(null,1,1) + if(broken) return + flash_recharge() + switch(times_used) + if(0 to 5) + if(prob(2*times_used)) + broken = 1 + icon_state = "flashburnt" + return + times_used++ + if(istype(loc, /mob/living/carbon)) + var/mob/living/carbon/M = loc + var/safety = M.eyecheck() + if(safety <= 0) + M.Weaken(10) + flick("e_flash", M.flash) + for(var/mob/O in viewers(M, null)) + O.show_message("[M] is blinded by the flash!") ..() diff --git a/code/game/objects/transfer_valve.dm b/code/game/objects/transfer_valve.dm index 02619098249..39660bbbe6f 100644 --- a/code/game/objects/transfer_valve.dm +++ b/code/game/objects/transfer_valve.dm @@ -1,6 +1,6 @@ /obj/item/device/transfer_valve icon = 'assemblies.dmi' - name = "Tank transfer valve" // because that's what it is exadv1 and don't you dare change it + name = "tank transfer valve" icon_state = "valve_1" desc = "Regulates the transfer of air between two tanks" var/obj/item/weapon/tank/tank_one @@ -19,34 +19,34 @@ attackby(obj/item/item, mob/user) if(istype(item, /obj/item/weapon/tank)) if(tank_one && tank_two) - user << "\red There are already two tanks attached, remove one first!" + user << "There are already two tanks attached, remove one first." return if(!tank_one) tank_one = item user.drop_item() item.loc = src - user << "\blue You attach the tank to the transfer valve" + user << "You attach the tank to the transfer valve." else if(!tank_two) tank_two = item user.drop_item() item.loc = src - user << "\blue You attach the tank to the transfer valve!" + user << "You attach the tank to the transfer valve." update_icon() //TODO: Have this take an assemblyholder else if(isassembly(item)) var/obj/item/device/assembly/A = item if(A.secured) - user << "\red The device is secured!" + user << "The device is secured." return if(attached_device) - user << "\red There is already an device attached to the valve, remove it first!" + user << "There is already an device attached to the valve, remove it first." return user.remove_from_mob(item) attached_device = A A.loc = src - user << "\blue You attach the [item] to the valve controls and secure it!" + user << "You attach the [item] to the valve controls and secure it." A.holder = src A.toggle_secure() @@ -75,39 +75,39 @@ onclose(user, "trans_valve") return - + //CARN: MARKER Topic(href, href_list) ..() - if (usr.stat|| usr.restrained()) + if ( usr.stat || usr.restrained() ) return if (src.loc == usr) - if(href_list["tankone"]) + if(tank_one && href_list["tankone"]) split_gases() valve_open = 0 tank_one.loc = get_turf(src) tank_one = null update_icon() - if(href_list["tanktwo"]) + else if(tank_two && href_list["tanktwo"]) split_gases() valve_open = 0 tank_two.loc = get_turf(src) tank_two = null update_icon() - if(href_list["open"]) + else if(href_list["open"]) toggle_valve() - if(href_list["rem_device"]) - if(attached_device) + else if(attached_device) + if(href_list["rem_device"]) attached_device.loc = get_turf(src) attached_device:holder = null attached_device = null - update_icon() - if(href_list["device"]) - attached_device.attack_self(usr) + update_icon() + if(href_list["device"]) + attached_device.attack_self(usr) src.attack_self(usr) - src.add_fingerprint(usr) return + return process_activation(var/obj/item/device/D) if(toggle) diff --git a/code/game/throwing.dm b/code/game/throwing.dm index a24a2aa550a..d79e40a0aec 100644 --- a/code/game/throwing.dm +++ b/code/game/throwing.dm @@ -25,7 +25,7 @@ /mob/living/carbon/proc/throw_item(atom/target) src.throw_mode_off() - if(usr.stat) + if(usr.stat || !target) return if(target.type == /obj/screen) return diff --git a/code/game/turf.dm b/code/game/turf.dm index ed7dc95a734..c898b98a0e0 100644 --- a/code/game/turf.dm +++ b/code/game/turf.dm @@ -1087,6 +1087,11 @@ turf/simulated/floor/return_siding_icon_state() return if (ismob(user.pulling)) var/mob/M = user.pulling + +// if(M==user) //temporary hack to stop runtimes. ~Carn +// user.pulling = null //but...fixed the root of the problem +// return //shoudn't be needed now, unless somebody fucks with pulling again. + var/mob/t = M.pulling M.pulling = null step(user.pulling, get_dir(user.pulling.loc, src)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 6798001bef6..fa8f15b2667 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -659,7 +659,7 @@ set category = "IC" set src in oview(1) - if (!( usr )) + if ( !usr || usr==src || !istype(src.loc,/turf) ) //if there's no person pulling OR the person is pulling themself OR the object being pulled is inside something: abort! return if (!( anchored )) usr.pulling = src diff --git a/code/modules/mob/say.dm b/code/modules/mob/say.dm index cc263be5161..7e0a3cf172b 100644 --- a/code/modules/mob/say.dm +++ b/code/modules/mob/say.dm @@ -52,6 +52,8 @@ return 0 /mob/proc/say_quote(var/text) + if(!text) + return "says, \"...\""; //not the best solution, but it will stop a large number of runtimes. The cause is somewhere in the Tcomms code var/ending = copytext(text, length(text)) if (src.stuttering) return "stammers, \"[text]\""; @@ -59,7 +61,7 @@ return "gibbers, \"[text]\""; if (ending == "?") return "asks, \"[text]\""; - else if (ending == "!") + if (ending == "!") return "exclaims, \"[text]\""; return "says, \"[text]\"";