diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 0462076c016..e9fc61a8262 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1687,7 +1687,7 @@ if(!istype(H)) to_chat(usr, "This can only be used on instances of type /mob/living/carbon/human") return - var/etypes = list("Borgification","Corgification","Death By Fire","Total Brain Death","Honk Tumor","Cluwne","Demotion Notice") + var/etypes = list("Borgification", "Corgification", "Death By Fire", "Total Brain Death", "Honk Tumor", "Cluwne", "Demote", "Demote with Bot", "Revoke Fax Access", "Angry Fax Machine") var/eviltype = input(src.owner, "Which type of evil fax do you wish to send [H]?","Its good to be baaaad...", "") as null|anything in etypes if(!(eviltype in etypes)) return @@ -1721,8 +1721,8 @@ P.overlays += stampoverlay P.stamps += "
" P.update_icon() - //fax.receivefax(P) // this does not work, it does not preserve the type, we have to physically teleport the fax paper instead - P.loc = fax.loc + P.faxmachineid = fax.UID() + P.loc = fax.loc // Do not use fax.receivefax(P) here, as it won't preserve the type. Physically teleporting the fax paper is required. if(istype(H) && H.stat == CONSCIOUS && (istype(H.l_ear, /obj/item/radio/headset) || istype(H.r_ear, /obj/item/radio/headset))) to_chat(H, "Your headset pings, notifying you that a reply to your fax has arrived.") to_chat(src.owner, "You sent a [eviltype] fax to [H]") @@ -1744,7 +1744,8 @@ btypes += "Super Powers" btypes += "Scarab Guardian" btypes += "Human Protector" - btypes += "Pet" + btypes += "Sentient Pet" + btypes += "All Access" var/blessing = input(owner, "How would you like to bless [M]?", "Its good to be good...", "") as null|anything in btypes if(!(blessing in btypes)) return @@ -1794,28 +1795,55 @@ spawn(700) qdel(scarab) logmsg = "scarab guardian." - if("Pet") - var/pets = subtypesof(/mob/living/simple_animal/pet) + if("Sentient Pet") + var/pets = subtypesof(/mob/living/simple_animal) var/petchoice = input("Select pet type", "Pets") as null|anything in pets if(isnull(petchoice)) return var/mob/living/simple_animal/pet/P = new petchoice(H.loc) - var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [P], pet of [H]?", poll_time = 100, min_hours = 10) + var/list/mob/dead/observer/candidates = pollCandidates("Do you want to play as [P], pet of [H]?", poll_time = 200, min_hours = 10) var/mob/dead/observer/theghost = null if(candidates.len) theghost = pick(candidates) P.key = theghost.key P.master_commander = H + P.universal_speak = 1 + P.universal_understand = 1 + P.can_collar = 1 + var/obj/item/clothing/accessory/petcollar/C = new /obj/item/clothing/accessory/petcollar(P) + P.collar = C + C.equipped(P) + var/obj/item/card/id/I = H.wear_id + if(I) + var/obj/item/card/id/D = new /obj/item/card/id(C) + D.access = I.access + D.registered_name = P.name + D.assignment = "Pet" + C.access_id = D spawn(30) var/newname = sanitize(copytext(input(P, "You are [P], pet of [H]. Would you like to change your name to something else?", "Name change", P.name) as null|text,1,MAX_NAME_LEN)) if(newname && newname != P.name) P.name = newname if(P.mind) P.mind.name = newname + else + to_chat(usr, "WARNING: Nobody volunteered to play [P].") + qdel(P) logmsg = "pet ([P])." if("Human Protector") usr.client.create_eventmob_for(H, 0) logmsg = "syndie protector." + if("All Access") + var/obj/item/card/id/I = H.wear_id + if(I) + var/list/access_to_give = get_all_accesses() + for(var/this_access in access_to_give) + if(!(this_access in I.access)) + // don't have it - add it + I.access |= this_access + else + to_chat(usr, "ERROR: [H] is not wearing an ID card.") + logmsg = "all access." if(logmsg) log_admin("[key_name(owner)] answered [key_name(M)]'s prayer with a blessing: [logmsg]") message_admins("[key_name_admin(owner)] answered [key_name_admin(M)]'s prayer with a blessing: [logmsg]") diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index cd0832bd714..47e98b8e1b9 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -2,6 +2,7 @@ var/list/obj/machinery/photocopier/faxmachine/allfaxes = list() var/list/admin_departments = list("Central Command") var/list/hidden_admin_departments = list("Syndicate") var/list/alldepartments = list() +var/global/list/fax_blacklist = list() /obj/machinery/photocopier/faxmachine name = "fax machine" @@ -160,7 +161,9 @@ var/list/alldepartments = list() if(href_list["auth"]) if(!is_authenticated && scan) - if(check_access(scan)) + if(scan.registered_name in fax_blacklist) + playsound(loc, 'sound/machines/buzz-sigh.ogg', 50, 0) + else if(check_access(scan)) authenticated = 1 else if(is_authenticated) authenticated = 0 @@ -322,3 +325,9 @@ var/list/alldepartments = list() to_chat(C, msg) if(C.prefs.sound & SOUND_ADMINHELP) C << 'sound/effects/adminhelp.ogg' + +/obj/machinery/photocopier/faxmachine/proc/become_mimic() + if(scan) + scan.forceMove(get_turf(src)) + var/mob/living/simple_animal/hostile/mimic/copy/M = new(loc, src, null, 1) // it will delete src on creation and override any machine checks + M.name = "angry fax machine" \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 06921bce252..40cc2bcc534 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -596,6 +596,7 @@ var/used = 0 var/countdown = 60 var/activate_on_timeout = 0 + var/faxmachineid = null /obj/item/paper/evilfax/show_content(var/mob/user, var/forceshow = 0, var/forcestars = 0, var/infolinks = 0, var/view = 1) if(user == mytarget) @@ -642,7 +643,8 @@ /obj/item/paper/evilfax/proc/evilpaper_specialaction(var/mob/living/carbon/target) spawn(30) - if(istype(target,/mob/living/carbon)) + if(istype(target, /mob/living/carbon)) + var/obj/machinery/photocopier/faxmachine/fax = locateUID(faxmachineid) if(myeffect == "Borgification") to_chat(target,"You seem to comprehend the AI a little better. Why are your muscles so stiff?") target.ForceContractDisease(new /datum/disease/transformation/robot(0)) @@ -668,8 +670,25 @@ var/mob/living/carbon/human/H = target to_chat(H, "You feel surrounded by sadness. Sadness... and HONKS!") H.makeCluwne() - else if(myeffect == "Demotion Notice") - event_announcement.Announce("[mytarget] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") + else if(myeffect == "Demote") + event_announcement.Announce("[target.real_name] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") + else if(myeffect == "Demote with Bot") + event_announcement.Announce("[target.real_name] is hereby demoted to the rank of Civilian. Process this demotion immediately. Failure to comply with these orders is grounds for termination.","CC Demotion Order") + for(var/datum/data/record/R in sortRecord(data_core.security)) + if(R.fields["name"] == target.real_name) + R.fields["criminal"] = "*Arrest*" + update_all_mob_security_hud() + if(fax) + var/turf/T = get_turf(fax) + new /obj/effect/portal(T) + new /mob/living/simple_animal/bot/secbot(T) + else if(myeffect == "Revoke Fax Access") + fax_blacklist += target.real_name + if(fax) + fax.authenticated = 0 + else if(myeffect == "Angry Fax Machine") + if(fax) + fax.become_mimic() else message_admins("Evil paper [src] was activated without a proper effect set! This is a bug.") used = 1