From 8b04cb4fc191b2994e97277eb697222b4b2e13a8 Mon Sep 17 00:00:00 2001 From: haha26315 Date: Thu, 15 Sep 2022 12:33:30 -0400 Subject: [PATCH] Cyborg PDA Update Allows robots to use the same PDA subtype as the AI. Adds a 1/1000 chance of AOL "You've got mail!" playing when receiving a PDA message. --- code/_onclick/hud/_defines.dm | 4 +- code/_onclick/hud/robot.dm | 11 +++++ code/game/objects/items/devices/PDA/PDA.dm | 42 ++++++++++-------- code/modules/awaymissions/corpse.dm | 4 +- code/modules/mob/living/silicon/ai/ai.dm | 15 +++---- .../modules/mob/living/silicon/robot/robot.dm | 18 +++++--- code/modules/mob/living/silicon/silicon.dm | 3 ++ sound/machines/youve_got_mail.ogg | Bin 0 -> 10543 bytes 8 files changed, 62 insertions(+), 35 deletions(-) create mode 100644 sound/machines/youve_got_mail.ogg diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 7bc9acd51..0b490863b 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -59,7 +59,9 @@ #define ui_borg_store "CENTER+2:16,SOUTH:5" //borgs #define ui_borg_camera "CENTER+3:21,SOUTH:5" //borgs #define ui_borg_album "CENTER+4:21,SOUTH:5" //borgs -#define ui_borg_language_menu "CENTER+4:21,SOUTH+1:5" //borgs +#define ui_borg_language_menu "CENTER+6:21,SOUTH+1:5" //borgs +#define ui_borg_pda_log "CENTER+5:21,SOUTH:5" //borgs +#define ui_borg_pda_send "CENTER+6:21,SOUTH:5" //borgs #define ui_monkey_head "CENTER-5:13,SOUTH:5" //monkey #define ui_monkey_mask "CENTER-4:14,SOUTH:5" //monkey diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 61b10c4fb..716cba557 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -128,6 +128,17 @@ //End of module select +//PDA stuff + using = new /obj/screen/ai/pda_msg_send + using.screen_loc = ui_borg_pda_send + using.hud = src + static_inventory += using + + using = new/obj/screen/ai/pda_msg_show + using.screen_loc = ui_borg_pda_log + using.hud = src + static_inventory += using + //Photography stuff using = new /obj/screen/ai/image_take() using.screen_loc = ui_borg_camera diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 8f5405255..aed207ea3 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -795,8 +795,12 @@ GLOBAL_LIST_EMPTY(PDAs) tnote += "← From [signal.data["name"]] ([signal.data["job"]]):
[signal.format_message()]
" if (!silent) - playsound(src, 'sound/machines/twobeep.ogg', 50, 1) - audible_message("[icon2html(src, hearers(src))] *[ttone]*", null, 3) + if(prob(0.1)) + playsound(src, 'sound/machines/youve_got_mail.ogg', 50, 1) + audible_message("[icon2html(src, hearers(src))] *You've got mail!*", null, 3) + else + playsound(src, 'sound/machines/twobeep.ogg', 50, 1) + audible_message("[icon2html(src, hearers(src))] *[ttone]*", null, 3) //Search for holder of the PDA. var/mob/living/L = null if(loc && isliving(loc)) @@ -1069,21 +1073,21 @@ GLOBAL_LIST_EMPTY(PDAs) //AI verb and proc for sending PDA messages. -/mob/living/silicon/ai/proc/cmd_send_pdamesg(mob/user) +/mob/living/silicon/proc/cmd_send_pdamesg(mob/user) var/list/plist = list() var/list/namecounts = list() - if(aiPDA.toff) + if(builtInPDA.toff) to_chat(user, "Turn on your receiver in order to send messages.") return for (var/obj/item/pda/P in get_viewable_pdas()) if (P == src) continue - else if (P == aiPDA) + else if (P == builtInPDA) continue - plist[avoid_assoc_duplicate_keys(P.owner, namecounts)] = P + plist[avoid_assoc_duplicate_keys(P.owner, namecounts)+" ("+P.ownjob+")"] = P var/c = input(user, "Please select a PDA") as null|anything in sortList(plist) @@ -1096,42 +1100,42 @@ GLOBAL_LIST_EMPTY(PDAs) var/add_photo = input(user,"Do you want to attach a photo?","Photo","No") as null|anything in list("Yes","No") if(add_photo=="Yes") var/datum/picture/Pic = aicamera.selectpicture(user) - aiPDA.picture = Pic + builtInPDA.picture = Pic if(incapacitated()) return - aiPDA.create_message(src, selected) + builtInPDA.create_message(src, selected) -/mob/living/silicon/ai/verb/cmd_toggle_pda_receiver() +/mob/living/silicon/verb/cmd_toggle_pda_receiver() set category = "AI Commands" set name = "PDA - Toggle Sender/Receiver" if(usr.stat == DEAD) return //won't work if dead - if(!isnull(aiPDA)) - aiPDA.toff = !aiPDA.toff - to_chat(usr, "PDA sender/receiver toggled [(aiPDA.toff ? "Off" : "On")]!") + if(!isnull(builtInPDA)) + builtInPDA.toff = !builtInPDA.toff + to_chat(usr, "PDA sender/receiver toggled [(builtInPDA.toff ? "Off" : "On")]!") else to_chat(usr, "You do not have a PDA. You should make an issue report about this.") -/mob/living/silicon/ai/verb/cmd_toggle_pda_silent() +/mob/living/silicon/verb/cmd_toggle_pda_silent() set category = "AI Commands" set name = "PDA - Toggle Ringer" if(usr.stat == DEAD) return //won't work if dead - if(!isnull(aiPDA)) + if(!isnull(builtInPDA)) //0 - aiPDA.silent = !aiPDA.silent - to_chat(usr, "PDA ringer toggled [(aiPDA.silent ? "Off" : "On")]!") + builtInPDA.silent = !builtInPDA.silent + to_chat(usr, "PDA ringer toggled [(builtInPDA.silent ? "Off" : "On")]!") else to_chat(usr, "You do not have a PDA. You should make an issue report about this.") -/mob/living/silicon/ai/proc/cmd_show_message_log(mob/user) +/mob/living/silicon/proc/cmd_show_message_log(mob/user) if(incapacitated()) return - if(!isnull(aiPDA)) - var/HTML = "AI PDA Message Log[aiPDA.tnote]" + if(!isnull(builtInPDA)) + var/HTML = "PDA Message Log[builtInPDA.tnote]" user << browse(HTML, "window=log;size=400x444;border=1;can_resize=1;can_close=1;can_minimize=0") else to_chat(user, "You do not have a PDA. You should make an issue report about this.") diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index 9476356b0..12e52d91a 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -90,7 +90,7 @@ /obj/effect/mob_spawn/proc/delayusability(deciseconds, showOnMenu) //How many deciseconds until it is enabled, + should it show up on the menu? addtimer(CALLBACK(src, .proc/enableghostrole, showOnMenu), deciseconds) - + /obj/effect/mob_spawn/proc/enableghostrole(show) ghost_usable = TRUE if (show == TRUE) @@ -276,7 +276,7 @@ var/mob/living/silicon/ai/spawned/M = new(loc) //spawn new AI at landmark as var M M.name = src.name M.real_name = src.name - M.aiPDA.toff = TRUE //turns the AI's PDA messenger off, stopping it showing up on player PDAs + M.builtInPDA.toff = TRUE //turns the AI's PDA messenger off, stopping it showing up on player PDAs M.death() //call the AI's death proc qdel(src) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 8e7ebc065..07f0079e2 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -40,7 +40,6 @@ var/obj/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. - var/obj/item/pda/ai/aiPDA var/obj/item/multitool/aiMulti var/mob/living/simple_animal/bot/Bot var/tracking = FALSE //this is 1 if the AI is currently tracking somebody, but the track has not yet been completed. @@ -139,10 +138,10 @@ add_verb(src, /mob/living/silicon/ai/proc/show_laws_verb) - aiPDA = new/obj/item/pda/ai(src) - aiPDA.owner = name - aiPDA.ownjob = "AI" - aiPDA.name = name + " (" + aiPDA.ownjob + ")" + builtInPDA = new/obj/item/pda/ai(src) + builtInPDA.owner = name + builtInPDA.ownjob = "AI" + builtInPDA.name = name + " (" + builtInPDA.ownjob + ")" aiMulti = new(src) radio = new /obj/item/radio/headset/ai(src) @@ -846,9 +845,9 @@ Slave.show_laws() /mob/living/silicon/ai/replace_identification_name(oldname,newname) - if(aiPDA) - aiPDA.owner = newname - aiPDA.name = newname + " (" + aiPDA.ownjob + ")" + if(builtInPDA) + builtInPDA.owner = newname + builtInPDA.name = newname + " (" + builtInPDA.ownjob + ")" /mob/living/silicon/ai/proc/add_malf_picker() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index b52e5c1da..e561cdee3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -142,10 +142,6 @@ builtInCamera.internal_light = FALSE if(wires.is_cut(WIRE_CAMERA)) builtInCamera.status = 0 - module = new /obj/item/robot_module(src) - module.rebuild_modules() - update_icons() - . = ..() //If this body is meant to be a borg controlled by the AI player if(shell) @@ -165,6 +161,18 @@ updatename() + //Name updated, can build PDA data now + if(!builtInPDA) + builtInPDA = new/obj/item/pda/ai(src) + builtInPDA.owner = name + builtInPDA.ownjob = "Station Cyborg" + builtInPDA.name = name + " (" + builtInPDA.ownjob + ")" + + module = new /obj/item/robot_module(src) + module.rebuild_modules() + update_icons() + . = ..() + equippable_hats = typecacheof(equippable_hats) playsound(loc, 'sound/voice/liveagain.ogg', 75, 1) @@ -661,7 +669,7 @@ if(BORGBELLY_GREEN) sleeper_overlay_state = "_g" if(BORGBELLY_RED) sleeper_overlay_state = "_r" add_overlay("[module.sleeper_overlay][sleeper_overlay_state]") - + if(module.dogborg == TRUE) if(resting) cut_overlays() diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index 9e519a53c..5dbbdd556 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -43,6 +43,8 @@ var/obj/machinery/camera/builtInCamera = null var/updating = FALSE //portable camera camerachunk update + var/obj/item/pda/ai/builtInPDA = null + var/hack_software = FALSE //Will be able to use hacking actions var/interaction_range = 7 //wireless control range @@ -70,6 +72,7 @@ radio = null aicamera = null QDEL_NULL(builtInCamera) + QDEL_NULL(builtInPDA) GLOB.silicon_mobs -= src return ..() diff --git a/sound/machines/youve_got_mail.ogg b/sound/machines/youve_got_mail.ogg new file mode 100644 index 0000000000000000000000000000000000000000..518a30ef841beb46e5f7c194b0f8bbdd5e8d1836 GIT binary patch literal 10543 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 TzPnX7WvNQy!yA<#i0uCYy3lEs literal 0 HcmV?d00001