diff --git a/code/game/machinery/telecomms/computers/message.dm b/code/game/machinery/telecomms/computers/message.dm index 64f4cc7835..3dad2d057a 100644 --- a/code/game/machinery/telecomms/computers/message.dm +++ b/code/game/machinery/telecomms/computers/message.dm @@ -421,7 +421,7 @@ "name" = "[customsender]", "job" = "[customjob]", "message" = custommessage, - "emoji_message" = emoji_parse(custommessage), + "emojis" = TRUE, "targets" = list("[customrecepient.owner] ([customrecepient.ownjob])") )) // this will log the signal and transmit it to the target diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 56870c5198..a7b2beb709 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -109,8 +109,8 @@ /datum/signal/subspace/pda/proc/format_message(emojify = FALSE) var/message = emojify ? data["emoji_message"] : data["message"] if (logged && data["photo"]) - return "\"[message]\" (Photo)" - return "\"[message]\"" + return "\"[data["message"]]\" (Photo)" + return "\"[data["message"]]\"" /datum/signal/subspace/pda/broadcast() if (!logged) // Can only go through if a message server logs it diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 0c9ac4bb60..73c0cdb1b2 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -77,6 +77,7 @@ GLOBAL_LIST_EMPTY(PDAs) var/hidden = FALSE // Is the PDA hidden from the PDA list? var/emped = FALSE var/equipped = FALSE //used here to determine if this is the first time its been picked up + var/enforce_emojis = TRUE //if the pda can send emojis and actually have them parsed as such var/obj/item/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both. var/ownjob = null //related to above @@ -252,10 +253,14 @@ GLOBAL_LIST_EMPTY(PDAs) var/datum/asset/spritesheet/assets = get_asset_datum(/datum/asset/spritesheet/simple/pda) assets.send(user) + var/datum/asset/spritesheet/emoji_s = get_asset_datum(/datum/asset/spritesheet/goonchat) + emoji_s.send(user) //Already sent by chat but no harm doing this + user.set_machine(src) var/dat = "Personal Data Assistant" dat += assets.css_tag() + dat += emoji_s.css_tag() dat += "[PDAIMG(refresh)]Refresh" @@ -335,6 +340,8 @@ GLOBAL_LIST_EMPTY(PDAs) dat += "
  • [PDAIMG(medbot)]Bots Access
  • " if (cartridge.access & CART_JANITOR) dat += "
  • [PDAIMG(bucket)]Custodial Locator
  • " + if(cartridge.access & CART_MIME) + dat += "
  • [PDAIMG(emoji)]Emoji Guidebook
  • " if (istype(cartridge.radio)) dat += "
  • [PDAIMG(signaler)]Signaler System
  • " if (cartridge.access & CART_NEWSCASTER) @@ -738,7 +745,6 @@ GLOBAL_LIST_EMPTY(PDAs) return if((last_text && world.time < last_text + 10) || (everyone && last_everyone && world.time < last_everyone + PDA_SPAM_DELAY)) return - var/emoji_message = emoji_parse(message) if(prob(1)) message += "\nSent from my PDA" // Send the signal @@ -760,7 +766,7 @@ GLOBAL_LIST_EMPTY(PDAs) "job" = "[ownjob]", "message" = message, "targets" = string_targets, - "emoji_message" = emoji_message + "emojis" = allow_emojis )) if (picture) signal.data["photo"] = picture @@ -774,16 +780,19 @@ GLOBAL_LIST_EMPTY(PDAs) playsound(src, 'sound/machines/terminal_error.ogg', 15, 1) var/target_text = signal.format_target() + if(allow_emojis) + message = emoji_parse(message)//already sent- this just shows the sent emoji as one to the sender in the to_chat + signal.data["message"] = emoji_parse(signal.data["message"]) // Log it in our logs tnote += "→ To [target_text]:
    [signal.format_message()]
    " // Show it to ghosts - var/ghost_message = "[owner] PDA Message --> [target_text]: [signal.format_message(TRUE)]" + var/ghost_message = "[owner] PDA Message --> [target_text]: [signal.format_message()]" for(var/mob/M in GLOB.player_list) if(isobserver(M) && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTPDA)) to_chat(M, "[FOLLOW_LINK(M, user)] [ghost_message]") // Log in the talk log user.log_talk(message, LOG_PDA, tag="PDA: [initial(name)] to [target_text]") - to_chat(user, "Message sent to [target_text]: \"[emoji_message]\"") + to_chat(user, "Message sent to [target_text]: \"[message]\"") if (!silent) playsound(src, 'sound/machines/terminal_success.ogg', 15, 1) // Reset the photo @@ -813,7 +822,11 @@ GLOBAL_LIST_EMPTY(PDAs) hrefstart = "" hrefend = "" - to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [signal.format_message(TRUE)] (Reply)") + var/inbound_message = signal.format_message() + if(signal.data["emojis"] == TRUE)//so will not parse emojis as such from pdas that don't send emojis + inbound_message = emoji_parse(inbound_message) + + to_chat(L, "[icon2html(src)] Message from [hrefstart][signal.data["name"]] ([signal.data["job"]])[hrefend], [inbound_message] [reply]") update_icon(TRUE) diff --git a/code/game/objects/items/devices/PDA/PDA_types.dm b/code/game/objects/items/devices/PDA/PDA_types.dm index 2da47d481e..b604bec258 100644 --- a/code/game/objects/items/devices/PDA/PDA_types.dm +++ b/code/game/objects/items/devices/PDA/PDA_types.dm @@ -19,6 +19,26 @@ if(istype(cart) && cart.charges < 5) cart.charges++ +//Mime PDA sends "silent" messages. +/obj/item/pda/mime + name = "mime PDA" + default_cartridge = /obj/item/cartridge/virus/mime + inserted_item = /obj/item/toy/crayon/mime + icon_state = "pda-mime" + desc = "A portable microcomputer by Thinktronic Systems, LTD. The hardware has been modified for compliance with the vows of silence." + silent = TRUE + ttone = "silence" + +/obj/item/pda/mime/msg_input(mob/living/U = usr) + if(emped || toff) + return + var/emojis = emoji_sanitize(stripped_input(U, "Please enter emojis", name)) + if(!emojis) + return + if(!U.canUseTopic(src, BE_CLOSE)) + return + return emojis + // Special AI/pAI PDAs that cannot explode. /obj/item/pda/ai icon = null @@ -79,14 +99,6 @@ icon_state = "pda-science" ttone = "boom" -/obj/item/pda/mime - name = "mime PDA" - default_cartridge = /obj/item/cartridge/virus/mime - inserted_item = /obj/item/toy/crayon/mime - icon_state = "pda-mime" - silent = TRUE - ttone = "silence" - /obj/item/pda/heads default_cartridge = /obj/item/cartridge/head icon_state = "pda-hop" diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 8be18a5f61..941ddac042 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -578,6 +578,22 @@ Code: if (54) // Beepsky, Medibot, Floorbot, and Cleanbot access menu = "

    [PDAIMG(medbot)] Bots Interlink

    " bot_control() + if (55) // Emoji Guidebook for mimes + menu = "

    [PDAIMG(emoji)] Emoji Guidebook

    " + var/static/list/emoji_icon_states + var/static/emoji_table + if(!emoji_table) + var/datum/asset/spritesheet/sheet = get_asset_datum(/datum/asset/spritesheet/goonchat) + var/list/collate = list("
    ") + for(var/emoji in sortList(icon_states(icon('icons/emoji.dmi')))) + var/tag = sheet.icon_tag("emoji-[emoji]") + collate += "" + collate += "
    [emoji][tag]

    " + emoji_table = collate.Join() + + menu += "
    To use an emoji in a pda message, refer to the guide and add \":\" around the emoji. Your PDA supports the following emoji:
    " + menu += emoji_table + if (99) //Newscaster message permission error menu = "
    ERROR : NOT AUTHORIZED [host_pda.id ? "" : "- ID SLOT EMPTY"]
    " @@ -678,6 +694,11 @@ Code: return playsound(src, 'sound/machines/terminal_select.ogg', 50, 1) + //emoji previews + if(href_list["emoji"]) + var/parse = emoji_parse(":[href_list["emoji"]]:") + to_chat(usr, parse) + //Bot control section! Viciously ripped from radios for being laggy and terrible. if(href_list["op"]) switch(href_list["op"]) diff --git a/code/modules/client/asset_cache.dm b/code/modules/client/asset_cache.dm index 643d072469..ecb7a699ee 100644 --- a/code/modules/client/asset_cache.dm +++ b/code/modules/client/asset_cache.dm @@ -448,7 +448,8 @@ GLOBAL_LIST_EMPTY(asset_datums) "scanner" = 'icons/pda_icons/pda_scanner.png', "signaler" = 'icons/pda_icons/pda_signaler.png', "status" = 'icons/pda_icons/pda_status.png', - "dronephone" = 'icons/pda_icons/pda_dronephone.png' + "dronephone" = 'icons/pda_icons/pda_dronephone.png', + "emoji" = 'icons/pda_icons/pda_emoji.png' ) /datum/asset/spritesheet/simple/paper diff --git a/code/modules/emoji/emoji_parse.dm b/code/modules/emoji/emoji_parse.dm index 2f4a84c646..db46ca09ca 100644 --- a/code/modules/emoji/emoji_parse.dm +++ b/code/modules/emoji/emoji_parse.dm @@ -1,4 +1,4 @@ -/proc/emoji_parse(text) +/proc/emoji_parse(text) //turns :ai: into an emoji in text. . = text if(!CONFIG_GET(flag/emojis)) return @@ -30,3 +30,24 @@ break return parsed +/proc/emoji_sanitize(text) //cuts any text that would not be parsed as an emoji + . = text + if(!CONFIG_GET(flag/emojis)) + return + var/static/list/emojis = icon_states(icon('icons/emoji.dmi')) + var/final = "" //only tags are added to this + var/pos = 1 + var/search = 0 + while(1) + search = findtext(text, ":", pos) + if(search) + pos = search + search = findtext(text, ":", pos+1) + if(search) + var/word = lowertext(copytext(text, pos+1, search)) + if(word in emojis) + final += lowertext(copytext(text, pos, search+1)) + pos = search + 1 + continue + break + return final diff --git a/icons/emoji.dmi b/icons/emoji.dmi index 925b072a5f..931cb7a916 100644 Binary files a/icons/emoji.dmi and b/icons/emoji.dmi differ diff --git a/icons/pda_icons/pda_emoji.png b/icons/pda_icons/pda_emoji.png new file mode 100644 index 0000000000..39f789f520 Binary files /dev/null and b/icons/pda_icons/pda_emoji.png differ