diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 8ff52bdddda..06f4b2b3190 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -89,6 +89,7 @@ if(istype(O,/obj/item/device/flash)) if(O:broken) O:broken = 0 + O:times_used = 0 O:icon_state = "flash" if(istype(O,/obj/item/weapon/gun/energy/taser/cyborg)) if(O:power_supply.charge < O:power_supply.maxcharge) diff --git a/code/game/objects/devices/flash.dm b/code/game/objects/devices/flash.dm index f5be7fa0bd9..ec0c00583c9 100644 --- a/code/game/objects/devices/flash.dm +++ b/code/game/objects/devices/flash.dm @@ -10,166 +10,160 @@ item_state = "electronic" origin_tech = "magnets=2;combat=1" - var - shots_left = 5 - max_shots = 5 - broken = 0 + 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. - proc - clown_check(var/mob/user) - recharge() +/obj/item/device/flash/proc/clown_check(var/mob/user) + if((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/attack(mob/living/M as mob, mob/user as mob) + 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])") + + log_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey])") - attack(mob/living/M as mob, mob/user as mob) - 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])") + if(!clown_check(user)) return + if(broken) + user.show_message("\red The [src.name] is broken", 2) + return - log_attack("[user.name] ([user.ckey]) Used the [src.name] to flash [M.name] ([M.ckey])") + //capacitor recharges over time + for(var/i=0, i<3, i++) + if(last_used+600 > world.time) + break + last_used += 600 + times_used-- - - if(!clown_check(user)) return - if(broken) - user.show_message("\red The [src.name] is broken", 2) - return - - if(shots_left <= 0) + //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!" + icon_state = "flashburnt" + return + times_used++ + else //can only use it 5 times a minute user.show_message("\red *click* *click*", 2) return + playsound(src.loc, 'flash.ogg', 100, 1) + var/flashfail = 0 - playsound(src.loc, 'flash.ogg', 100, 1) - shots_left-- - var/flashfail = 0 + if(iscarbon(M)) + var/safety = M:eyecheck() + if(safety <= 0) + M.Weaken(10) + flick("e_flash", M.flash) - if(iscarbon(M)) - var/safety = M:eyecheck() - if(safety <= 0) - M.Weaken(10) - flick("e_flash", M.flash) - - if(ishuman(M) && ishuman(user)) - if(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!" - else - flashfail = 1 - - else if(issilicon(M)) - M.Weaken(rand(5,10)) - - if(isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user.loc) - animation.layer = user.layer + 1 - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = user - flick("blspell", animation) - sleep(5) - del(animation) - - - if(!flashfail) - for(var/mob/O in viewers(user, null)) - O.show_message(text("\red [] blinds [] with the flash!", user, M)) + if(ishuman(M) && ishuman(user)) + if(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!" else - for(var/mob/O in viewers(user, null)) - O.show_message(text("\blue [] fails to blind [] with the flash!", user, M)) + flashfail = 1 + + else if(issilicon(M)) + M.Weaken(rand(5,10)) + + if(isrobot(user)) + spawn(0) + var/atom/movable/overlay/animation = new(user.loc) + animation.layer = user.layer + 1 + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = user + flick("blspell", animation) + sleep(5) + del(animation) + if(!flashfail) + for(var/mob/O in viewers(user, null)) + O.show_message(text("\red [] blinds [] with the flash!", user, M)) + else + for(var/mob/O in viewers(user, null)) + O.show_message(text("\blue [] fails to blind [] with the flash!", user, M)) - if (prob(2)) - broken = 1 - user << "\red The bulb has burnt out!" - icon_state = "flashburnt" + return - spawn(60) - recharge() +/obj/item/device/flash/attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) + if(!emp) + if (!clown_check(user)) return + if(broken) + if(user) + user.show_message("\red 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 - attack_self(mob/living/carbon/user as mob, flag = 0, emp = 0) - if(!emp) - if (!clown_check(user)) return - if(broken) - if(user) - user.show_message("\red The [src.name] is broken", 2) - return - - if(shots_left <= 0) - if(user) - user.show_message("\red *click* *click*", 2) - return - - playsound(src.loc, 'flash.ogg', 100, 1) - shots_left-- - - flick("flash2", src) - if(isrobot(user)) - spawn(0) - var/atom/movable/overlay/animation = new(user.loc) - animation.layer = user.layer + 1 - animation.icon_state = "blank" - animation.icon = 'mob.dmi' - animation.master = user - flick("blspell", animation) - sleep(5) - del(animation) - - for(var/mob/living/carbon/M in oviewers(3, null)) - if(prob(50)) - if (locate(/obj/item/weapon/cloaking_device, M)) - for(var/obj/item/weapon/cloaking_device/S in M) - S.active = 0 - S.icon_state = "shield0" - var/safety = M:eyecheck() - if(!safety) - flick("flash", M.flash) - - if (prob(2)) - broken = 1 - icon_state = "flashburnt" - if(user) + //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!" + icon_state = "flashburnt" + return + times_used++ + else //can only use it 5 times a minute + user.show_message("\red *click* *click*", 2) return + playsound(src.loc, 'flash.ogg', 100, 1) + flick("flash2", src) + if(isrobot(user)) + spawn(0) + var/atom/movable/overlay/animation = new(user.loc) + animation.layer = user.layer + 1 + animation.icon_state = "blank" + animation.icon = 'mob.dmi' + animation.master = user + flick("blspell", animation) + sleep(5) + del(animation) - spawn(60) - recharge() + for(var/mob/living/carbon/M in oviewers(3, null)) + if(prob(50)) + if (locate(/obj/item/weapon/cloaking_device, M)) + for(var/obj/item/weapon/cloaking_device/S in M) + S.active = 0 + S.icon_state = "shield0" + var/safety = M:eyecheck() + if(!safety) + flick("flash", M.flash) - return + return - - emp_act(severity) - src.attack_self(null,1,1) - ..() - - - clown_check(var/mob/user) - if((user.mutations & CLUMSY) && prob(50)) - user << "\red The Flash slips out of your hand." - user.drop_item() - return 0 - return 1 - - - recharge() - if(max_shots > shots_left) - shots_left++ - if(max_shots > shots_left) - spawn(60)//more or less 10 seconds - recharge() - return \ No newline at end of file +/obj/item/device/flash/emp_act(severity) + src.attack_self(null,1,1) + ..() diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 034b75751fc..06ef34324e1 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -13,7 +13,6 @@ /obj/admins/Topic(href, href_list) ..() - if (usr.client != src.owner) world << "\blue [usr.key] has attempted to override the admin panel!" log_admin("[key_name(usr)] tried to use the admin panel without authorization.") @@ -121,25 +120,30 @@ if(href_list["jobban2"]) var/mob/M = locate(href_list["jobban2"]) - var/dat = "" - var/header = "Pick Job to ban this guy from.
" - var/body - var/jobs = "" + if(!M) //sanity + alert("Mob no longer exists!") + return + if(!M.ckey) //sanity + alert("Mob has no ckey") + return if(!job_master) usr << "Job Master has not been setup!" return + var/dat = "" + var/header = "Job-Ban Panel: [M.name]" + var/body + var/jobs = "" /***********************************WARNING!************************************ - The jobban stuff looks mangled and disguisting + The jobban stuff looks mangled and disgusting But it looks beautiful in-game -Nodrak ************************************WARNING!***********************************/ var/counter = 0 - //Regular jobs //Command (Blue) jobs += "" - jobs += "" + jobs += "" for(var/jobPos in command_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -152,7 +156,7 @@ jobs += "" counter++ - if(counter >= 5) //So things dont get squiiiiished! + if(counter >= 6) //So things dont get squiiiiished! jobs += "" counter = 0 jobs += "
Command Positions
Command Positions
[dd_replacetext(job.title, " ", " ")]
" @@ -160,7 +164,7 @@ //Security (Red) counter = 0 jobs += "" - jobs += "" + jobs += "" for(var/jobPos in security_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -181,7 +185,7 @@ //Engineering (Yellow) counter = 0 jobs += "
Security Positions
Security Positions
" - jobs += "" + jobs += "" for(var/jobPos in engineering_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -202,7 +206,7 @@ //Medical (White) counter = 0 jobs += "
Engineering Positions
Engineering Positions
" - jobs += "" + jobs += "" for(var/jobPos in medical_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -223,7 +227,7 @@ //Science (Purple) counter = 0 jobs += "
Medical Positions
Medical Positions
" - jobs += "" + jobs += "" for(var/jobPos in science_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -244,7 +248,7 @@ //Civilian (Grey) counter = 0 jobs += "
Science Positions
Science Positions
" - jobs += "" + jobs += "" for(var/jobPos in civilian_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -265,7 +269,7 @@ //Non-Human (Green) counter = 0 jobs += "
Civilian Positions
Civilian Positions
" - jobs += "" + jobs += "" for(var/jobPos in nonhuman_positions) if(!jobPos) continue var/datum/job/job = job_master.GetJob(jobPos) @@ -291,109 +295,186 @@ jobs += "
Non-human Positions
Non-human Positions
" //Antagonist (Orange) + var/isbanned_dept = jobban_isbanned(M, "Syndicate") jobs += "" - jobs += "" - - //All antagonists - if(jobban_isbanned(M, "Syndicate")) - jobs += "" - else - jobs += "" + jobs += "" //Traitor - if(jobban_isbanned(M, "traitor") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "traitor") || isbanned_dept) jobs += "" else jobs += "" //Changeling - if(jobban_isbanned(M, "changeling") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "changeling") || isbanned_dept) jobs += "" else jobs += "" //Nuke Operative - if(jobban_isbanned(M, "operative") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "operative") || isbanned_dept) jobs += "" else jobs += "" //Revolutionary - if(jobban_isbanned(M, "revolutionary") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "revolutionary") || isbanned_dept) jobs += "" else jobs += "" - jobs += "" //Breaking it up so it fits nicer on the screen every 5 entries - //Cultist - if(jobban_isbanned(M, "Cultist") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "cultist") || isbanned_dept) jobs += "" else jobs += "" + jobs += "" //Breaking it up so it fits nicer on the screen every 5 entries + //Wizard - if(jobban_isbanned(M, "wizard") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "wizard") || isbanned_dept) jobs += "" else jobs += "" //Malfunctioning AI - if(jobban_isbanned(M, "malf AI") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "malf AI") || isbanned_dept) jobs += "" else jobs += "" //Alien - if(jobban_isbanned(M, "alien candidate") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "alien candidate") || isbanned_dept) jobs += "" else jobs += "" //Infested Monkey - if(jobban_isbanned(M, "infested monkey") || jobban_isbanned(M, "Syndicate")) + if(jobban_isbanned(M, "infested monkey") || isbanned_dept) jobs += "" else jobs += "" jobs += "
Antagonist Positions
[dd_replacetext("All Antagonists", " ", " ")][dd_replacetext("All Antagonists", " ", " ")]
Antagonist Positions
[dd_replacetext("Traitor", " ", " ")][dd_replacetext("Traitor", " ", " ")][dd_replacetext("Changeling", " ", " ")][dd_replacetext("Changeling", " ", " ")][dd_replacetext("Nuke Operative", " ", " ")][dd_replacetext("Nuke Operative", " ", " ")][dd_replacetext("Revolutionary", " ", " ")][dd_replacetext("Revolutionary", " ", " ")]
[dd_replacetext("Cultist", " ", " ")][dd_replacetext("Cultist", " ", " ")]
[dd_replacetext("Wizard", " ", " ")][dd_replacetext("Wizard", " ", " ")][dd_replacetext("Malf AI", " ", " ")][dd_replacetext("Malf AI", " ", " ")][dd_replacetext("Alien", " ", " ")][dd_replacetext("Alien", " ", " ")][dd_replacetext("Infested Monkey", " ", " ")][dd_replacetext("Infested Monkey", " ", " ")]
" - body = "
[jobs]

" + body = "[jobs]" dat = "[header][body]" - usr << browse(dat, "window=jobban2;size=800x400") + usr << browse(dat, "window=jobban2;size=800x450") return + //JOBBAN'S INNARDS if(href_list["jobban3"]) if (src.rank in list( "Admin Candidate", "Temporary Admin", "Trial Admin", "Badmin", "Game Admin", "Game Master" )) var/mob/M = locate(href_list["jobban4"]) - var/job = href_list["jobban3"] + if(!M) + alert("Mob no longer exists!") + return if ((M.client && M.client.holder && (M.client.holder.level > src.level))) alert("You cannot perform this action. You must be of a higher administrative rank!") return - if (jobban_isbanned(M, job)) - log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]") - ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]") - M << "\redYou have been un-jobbanned by [usr.client.ckey] from [job]." - feedback_inc("ban_job_unban",1) - feedback_add_details("ban_job_unban","- [job]") - message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [job]", 1) - jobban_unban(M, job) - href_list["jobban2"] = 1 - else - var/reason = input(usr,"Reason?","reason","griefer") as text|null - if(!reason) - return - ban_unban_log_save("[key_name(usr)] jobbanned [key_name(M)] from [job]. reason: [reason]") - log_admin("[key_name(usr)] banned [key_name(M)] from [job]") - feedback_inc("ban_job",1) - feedback_add_details("ban_job","- [job]") - M << "\redYou have been jobbanned by [usr.client.ckey] from [job]." - M << "\red The reason is: [reason]" - M << "\red Jooban can be lifted only on demand." - message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [job]", 1) - jobban_fullban(M, job, reason) - href_list["jobban2"] = 1 // lets it fall through and refresh + if(!job_master) + usr << "Job Master has not been setup!" + return + //get jobs for department if specified, otherwise just returnt he one job in a list. + var/list/joblist = list() + switch(href_list["jobban3"]) + if("commanddept") + for(var/jobPos in command_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("securitydept") + for(var/jobPos in security_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("engineeringdept") + for(var/jobPos in engineering_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("medicaldept") + for(var/jobPos in medical_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("sciencedept") + for(var/jobPos in science_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("civiliandept") + for(var/jobPos in civilian_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + if("nonhumandept") + joblist += "pAI" + for(var/jobPos in nonhuman_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title + else + joblist += href_list["jobban3"] + + //Create a list of unbanned jobs within joblist + var/list/notbannedlist = list() + for(var/job in joblist) + if(!jobban_isbanned(M, job)) + notbannedlist += job + + //Banning comes first + if(notbannedlist.len) //at least 1 unbanned job exists in joblist so we have stuff to ban. + var/reason = input(usr,"Reason?","Please State Reason","") as text|null + if(reason) + var/msg + for(var/job in notbannedlist) + ban_unban_log_save("[key_name(usr)] jobbanned [key_name(M)] from [job]. reason: [reason]") + log_admin("[key_name(usr)] banned [key_name(M)] from [job]") + feedback_inc("ban_job",1) + feedback_add_details("ban_job","- [job]") + jobban_fullban(M, job, reason) + if(!msg) msg = job + else msg += ", [job]" + message_admins("\blue [key_name_admin(usr)] banned [key_name_admin(M)] from [msg]", 1) + M << "\redYou have been jobbanned by [usr.client.ckey] from: [msg]." + M << "\red The reason is: [reason]" + M << "\red Jobban can be lifted only upon request." + href_list["jobban2"] = 1 // lets it fall through and refresh + return 1 + + //Unbanning joblist + //all jobs in joblist are banned already OR we didn't give a reason (implying they shouldn't be banned) + if(joblist.len) //at least 1 banned job exists in joblist so we have stuff to unban. + var/msg + for(var/job in joblist) + var/reason = jobban_isbanned(M, job) + if(!reason) continue //skip if it isn't jobbanned anyway + switch(alert("Job: [job] Reason: '[reason]'. Are you sure you want to un-jobban?","Please Confirm","Yes","No")) + if("Yes") + ban_unban_log_save("[key_name(usr)] unjobbanned [key_name(M)] from [job]") + log_admin("[key_name(usr)] unbanned [key_name(M)] from [job]") + feedback_inc("ban_job_unban",1) + feedback_add_details("ban_job_unban","- [job]") + jobban_unban(M, job) + if(!msg) msg = job + else msg += ", [job]" + else + continue + if(msg) + message_admins("\blue [key_name_admin(usr)] unbanned [key_name_admin(M)] from [msg]", 1) + M << "\redYou have been un-jobbanned by [usr.client.ckey] from [msg]." + href_list["jobban2"] = 1 // lets it fall through and refresh + return 1 + return 0 //we didn't do anything! if (href_list["boot2"]) if ((src.rank in list( "Moderator", "Temporary Admin", "Admin Candidate", "Trial Admin", "Badmin", "Game Admin", "Game Master" ))) diff --git a/code/modules/admin/banjob.dm b/code/modules/admin/banjob.dm index 31674903079..ca64270a6b6 100644 --- a/code/modules/admin/banjob.dm +++ b/code/modules/admin/banjob.dm @@ -3,7 +3,7 @@ var jobban_keylist[0] //to store the keys & ranks /proc/jobban_fullban(mob/M, rank, reason) - if (!M || !M.key || !M.client) return + if (!M || !M.key) return jobban_keylist.Add(text("[M.ckey] - [rank] ## [reason]")) jobban_savebanfile() @@ -23,7 +23,12 @@ var for (var/s in jobban_keylist) if( findtext(s,"[M.ckey] - [rank]") ) - return 1 + var/startpos = findtext(s, "## ")+3 + if(startpos && startpos Credits:
- Coders: TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn
+ Coders: TLE, NEO, Errorage, muskets, veryinky, Skie, Noise, Numbers, Agouri, Noka, Urist McDorf, Uhangi, Darem, Mport, rastaf0, Doohl, Superxpdude, Rockdtben, ConstantA, Petethegoat, Kor, Polymorph, Carn, Nodrak
Spriters: Agouri, Cheridan, Cruazy Guest, Deeaych, Deuryn, Matty406, Microwave, ShiftyEyesShady, Skie, Uhangi, Veyveyr, Petethegoat, Kor
Sounds: Skie, Lasty/Vinyl
Thanks to: CDK Station devs, GoonStation devs, the original SpaceStation developers and Erikat for the title image @@ -93,14 +93,21 @@ should be listed in the changelog upon commit tho. Thanks. -->
-

3/12/2012

+

13 March 2012

+

Nodrak & Carn updated:

+
    +
  • Fixed the way flashes break. Long story short: They'll never break on first use so rev don't get screwed over. They run out of charge temporarily when spammed but recharge. Spamming them also increases the chance of them breaking a little, so use them sparingly.
  • +
+
+ +
+

12 March 2012

PolymorphBlue updated:

  • PDA messages now require an active messaging server to be properly sent.
-

11 March 2012

PolymorphBlue updated: