diff --git a/code/__DEFINES/tgui.dm b/code/__DEFINES/tgui.dm index 865088ee72fc..ca6408961eab 100644 --- a/code/__DEFINES/tgui.dm +++ b/code/__DEFINES/tgui.dm @@ -32,7 +32,7 @@ /// Creates a message packet for sending via output() // This is {"type":type,"payload":payload}, but pre-encoded. This is much faster // than doing it the normal way. -// To ensure this is correct, this is unit tested in tgui_create_message. However, CM does not have unit tests available. +// To ensure this is correct, this is unit tested in tgui_create_message. #define TGUI_CREATE_MESSAGE(type, payload) ( \ "%7b%22type%22%3a%22[type]%22%2c%22payload%22%3a[url_encode(json_encode(payload))]%7d" \ ) diff --git a/code/__DEFINES/wj_emotes.dm b/code/__DEFINES/wj_emotes.dm new file mode 100644 index 000000000000..f315c6eb2ba5 --- /dev/null +++ b/code/__DEFINES/wj_emotes.dm @@ -0,0 +1,8 @@ +#define JOE_EMOTE_CATEGORY_GREETING "Greeting" +#define JOE_EMOTE_CATEGORY_TASK_UPDATE "Task Update" +#define JOE_EMOTE_CATEGORY_RESTRICTED_AREA "Restricted Area" +#define JOE_EMOTE_CATEGORY_FAREWELL "Farewell" +#define JOE_EMOTE_CATEGORY_QUIP "Quip" +#define JOE_EMOTE_CATEGORY_WARNING "Warning" +#define JOE_EMOTE_CATEGORY_QUESTION "Question" +#define JOE_EMOTE_CATEGORY_NOTICE "Notice" diff --git a/code/modules/mob/living/carbon/human/species/emote-synthetic.dm b/code/modules/mob/living/carbon/human/species/emote-synthetic.dm deleted file mode 100644 index fd763b038153..000000000000 --- a/code/modules/mob/living/carbon/human/species/emote-synthetic.dm +++ /dev/null @@ -1,354 +0,0 @@ -/datum/emote/living/carbon/human/synthetic/working_joe - species_type_allowed_typecache = list(/datum/species/synthetic/colonial/working_joe) - keybind_category = CATEGORY_SYNTH_EMOTE - volume = 75 - -/datum/emote/living/carbon/human/synthetic/working_joe/alwaysknow - key = "alwaysknow" - key_third_person = "workingjoe" - sound = 'sound/voice/joe/alwaysknow.ogg' - say_message = "You always know a Working Joe." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/hysterical - key = "hysterical" - sound = 'sound/voice/joe/hysterical.ogg' - say_message = "You are becoming hysterical." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/safety - key = "safety" - sound = 'sound/voice/joe/safety.ogg' - say_message = "You and I are going to have a talk about safety." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/awful_mess - key = "awful" - key_third_person = "mess" - sound = 'sound/voice/joe/awful.ogg' - say_message = "Tut, tut. What an awful mess." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/damage - key = "damage" - sound = 'sound/voice/joe/damage.ogg' - say_message = "Do not damage Seegson property." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/firearm - key = "firearm" - sound = 'sound/voice/joe/firearm.ogg' - say_message = "Firearms can cause serious injury. Let me assist you." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/report - key = "report" - sound = 'sound/voice/joe/report.ogg' - say_message = "Logging report to APOLLO." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/breach - key = "breach" - sound = 'sound/voice/joe/breach.ogg' - say_message = "Hazard Containment breach logged." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/species - key = "species" - sound = 'sound/voice/joe/species.ogg' - say_message = "Unidentified species." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/alwaysknow_damaged - key = "alwaysknowdamaged" - sound = 'sound/voice/joe/alwaysknow_damaged.ogg' - say_message = "You always know a Working Joe." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/apollo_behalf - key = "apollobehalf" - sound = 'sound/voice/joe/apollo_behalf.ogg' - say_message = "I will inform APOLLO on your behalf." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/back_to_work - key = "backtowork" - sound = 'sound/voice/joe/back_to_work.ogg' - say_message = "Back to work." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/beyond_repair - key = "beyondrepair" - sound = 'sound/voice/joe/beyond_repair.ogg' - say_message = "Hmm, far beyond repair." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/come_out_vent - key = "comeoutvent" - sound = 'sound/voice/joe/come_out_vent.ogg' - say_message = "Come out of the vent system, please." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/could_require_attention - key = "couldrequireattention" - sound = 'sound/voice/joe/could_require_attention.ogg' - say_message = "This could require my attention." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/dangerous_items - key = "dangerousitems" - sound = 'sound/voice/joe/dangerous_items.ogg' - say_message = "You are carrying some very dangerous items." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/day_never_done - key = "dayneverdone" - sound = 'sound/voice/joe/day_never_done.ogg' - say_message = "A synthetic's day is never done." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/detailed_report - key = "detailedreport" - sound = 'sound/voice/joe/detailed_report.ogg' - say_message = "APOLLO will require a detailed report." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/fire - key = "fire" - sound = 'sound/voice/joe/fire.ogg' - say_message = "Only wild animals fear fire." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/fire_drill - key = "firedrill" - sound = 'sound/voice/joe/fire_drill.ogg' - say_message = "Please congregate at your nearest fire assembly point. This is not a drill; do not panic." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/unprotected_flames - key = "unprotectedflames" - sound = 'sound/voice/joe/unprotected_flames.ogg' - say_message = "Unprotected flames are extremely dangerous and entirely unadvisable." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/follow_me - key = "followme" - sound = 'sound/voice/joe/follow_me.ogg' - say_message = "Follow me." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/further_assistance - key = "furtherassistance" - sound = 'sound/voice/joe/further_assistance.ogg' - say_message = "Please call if you need further assistance." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/good_day - key = "goodday" - sound = 'sound/voice/joe/good_day.ogg' - say_message = "Good day." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/health_risks - key = "healthrisks" - sound = 'sound/voice/joe/health_risks.ogg' - say_message = "These items carry notable health risks." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/hello - key = "hello" - sound = 'sound/voice/joe/hello.ogg' - say_message = "Hello." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/how_can_i_help - key = "howcanihelp" - sound = 'sound/voice/joe/how_can_i_help.ogg' - say_message = "How can I help you?" - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/irresponsible - key = "irresponsible" - sound = 'sound/voice/joe/irresponsible.ogg' - say_message = "That was irresponsible." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/join_us - key = "joinus" - sound = 'sound/voice/joe/join_us.ogg' - say_message = "We hope you'll join us for the journey." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/little_details - key = "littledetails" - sound = 'sound/voice/joe/little_details.ogg' - say_message = "We don't forget the little details when seeing the big picture." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/lost - key = "lost" - sound = 'sound/voice/joe/lost.ogg' - say_message = "Are you lost?" - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/misbehaving - key = "misbehaving" - sound = 'sound/voice/joe/misbehaving.ogg' - say_message = "Have you been misbehaving?" - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/not_allowed_there - key = "notallowedthere" - sound = 'sound/voice/joe/not_allowed_there.ogg' - say_message = "You're not allowed in there." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/not_liking - key = "notliking" - sound = 'sound/voice/joe/not_liking.ogg' - say_message = "If you find this facility in a state that isn't to your liking, please let me know." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/not_what_i_think - key = "notwhatithink" - sound = 'sound/voice/joe/not_what_i_think.ogg' - say_message = "I hope that's not what I think it is." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/other_concerns - key = "otherconcerns" - sound = 'sound/voice/joe/other_concerns.ogg' - say_message = "I have other concerns." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/more_pressing_matters - key = "morepressingmatters" - sound = 'sound/voice/joe/more_pressing_matters.ogg' - say_message = "There are more pressing matters." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/patience - key = "patience" - sound = 'sound/voice/joe/patience.ogg' - say_message = "You are starting to test my patience." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/presence_logged - key = "presencelogged" - sound = 'sound/voice/joe/presence_logged.ogg' - say_message = "Your presence has been logged." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/required_by_apollo - key = "requiredbyapollo" - sound = 'sound/voice/joe/required_by_apollo.ogg' - say_message = "I am required by APOLLO." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/returning_to_tasks - key = "returningtotasks" - sound = 'sound/voice/joe/returning_to_tasks.ogg' - say_message = "Returning to assigned tasks." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/running_accidents - key = "runningaccidents" - sound = 'sound/voice/joe/running_accidents.ogg' - say_message = "Running causes accidents." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/safety_breach - key = "safetybreach" - sound = 'sound/voice/joe/safety_breach.ogg' - say_message = "This is a breach of multiple safety directives." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/seegson_quality - key = "seegsonquality" - sound = 'sound/voice/joe/seegson_quality.ogg' - say_message = "Seegson - Relentless in the pursuit of affordable quality." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/seegson_standards - key = "seegsonstandards" - sound = 'sound/voice/joe/seegson_standards.ogg' - say_message = "If my services do not meet Seegson standards, please log a complaint." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/shouldnt_be_here - key = "shouldntbehere" - sound = 'sound/voice/joe/shouldnt_be_here.ogg' - say_message = "You shouldn't be here." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/seegson_behind - key = "seegsonbehind" - sound = 'sound/voice/joe/seegson_behind.ogg' - say_message = "With Seegson, there is someone behind you, helping you every step of the way." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/take_a_seat - key = "takeaseat" - sound = 'sound/voice/joe/take_a_seat.ogg' - say_message = "Please take a seat, someone will be with you shortly." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/talk_to_seegson - key = "talktoseegson" - sound = 'sound/voice/joe/talk_to_seegson.ogg' - say_message = "Interested in our Working Joe android range? Talk to Seegson." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/temperatures - key = "temperatures" - sound = 'sound/voice/joe/temperatures.ogg' - say_message = "I am built to whitstand temperatures of up to 1210 degrees." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/that_stings - key = "thatstings" - sound = 'sound/voice/joe/that_stings.ogg' - say_message = "That stings." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/this_is_futile - key = "thisisfutile" - sound = 'sound/voice/joe/this_is_futile.ogg' - say_message = "This is futile." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/trespassing - key = "trespassing" - sound = 'sound/voice/joe/trespassing.ogg' - say_message = "You are trespassing." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/weapon_permit - key = "weaponpermit" - sound = 'sound/voice/joe/weapon_permit.ogg' - say_message = "I assume you have a permit for that weapon." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/what_happened_to_you - key = "whathappenedtoyou" - sound = 'sound/voice/joe/what_happened_to_you.ogg' - say_message = "What happened to you?" - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/what_is_this - key = "whatisthis" - sound = 'sound/voice/joe/what_is_this.ogg' - say_message = "What is this?" - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/with_you_shortly - key = "withyoushortly" - sound = 'sound/voice/joe/with_you_shortly.ogg' - say_message = "I will be with you shortly." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE - -/datum/emote/living/carbon/human/synthetic/working_joe/inexpensive - key = "inexpensive" - sound = 'sound/voice/joe/inexpensive.ogg' - say_message = "I am inexpensive, I am reliable, you know my face - the Working Joe." - emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/_emote.dm b/code/modules/mob/living/carbon/human/species/working_joe/_emote.dm new file mode 100644 index 000000000000..6e37aeb89264 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/_emote.dm @@ -0,0 +1,6 @@ +/datum/emote/living/carbon/human/synthetic/working_joe + species_type_allowed_typecache = list(/datum/species/synthetic/colonial/working_joe) + keybind_category = CATEGORY_SYNTH_EMOTE + volume = 75 + /// A general category for the emote, for use in the WJ emote panel. See [code/__DEFINES/wj_emotes.dm] for categories. + var/category diff --git a/code/modules/mob/living/carbon/human/species/working_joe/_species.dm b/code/modules/mob/living/carbon/human/species/working_joe/_species.dm new file mode 100644 index 000000000000..d5530c5a4a36 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/_species.dm @@ -0,0 +1,129 @@ +/datum/species/synthetic/colonial/working_joe + name = SYNTH_WORKING_JOE + name_plural = "Working Joes" + uses_ethnicity = FALSE + mob_inherent_traits = list(TRAIT_SUPER_STRONG, TRAIT_INTENT_EYES, TRAIT_EMOTE_CD_EXEMPT) + + hair_color = "#000000" + icobase = 'icons/mob/humans/species/r_synthetic.dmi' + deform = 'icons/mob/humans/species/r_synthetic.dmi' + + +/datum/species/synthetic/colonial/working_joe/handle_post_spawn(mob/living/carbon/human/joe) + . = ..() + give_action(joe, /datum/action/joe_emote_panel) + + +/// Open the WJ's emote panel, which allows them to use voicelines +/datum/species/synthetic/colonial/working_joe/proc/open_emote_panel() + var/datum/joe_emote_panel/ui = new(usr) + ui.ui_interact(usr) + + +/datum/action/joe_emote_panel + name = "Open Voice Synthesizer" + action_icon_state = "looc_toggle" + + +/datum/action/joe_emote_panel/can_use_action() + if(!..()) + return FALSE + + if(!isworkingjoe(owner)) + return FALSE + + return TRUE + + +/datum/action/joe_emote_panel/action_activate() + if(!can_use_action()) + return + + var/mob/living/carbon/human/human_owner = owner + var/datum/species/synthetic/colonial/working_joe/joe_species = human_owner.species + joe_species.open_emote_panel() + + +/datum/joe_emote_panel + /// Static dict ("category" : (emotes)) of every wj emote typepath + var/static/list/wj_emotes + /// Static list of categories + var/static/list/wj_categories = list() + /// Panel allows you to spam, so a manual CD is added here + COOLDOWN_DECLARE(panel_emote_cooldown) + + +/datum/joe_emote_panel/New() + if(!length(wj_emotes)) + var/list/emotes_to_add = list() + for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe)) + if(!initial(emote.key) || !initial(emote.say_message)) + continue + + if(!(initial(emote.category) in wj_categories)) + wj_categories += initial(emote.category) + + emotes_to_add += emote + + + wj_emotes = emotes_to_add + + +/datum/joe_emote_panel/proc/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "JoeEmotes") + ui.open() + + +/datum/joe_emote_panel/ui_state(mob/user) + return GLOB.conscious_state + + +/datum/joe_emote_panel/ui_data(mob/user) + var/list/data = list() + + data["on_cooldown"] = !COOLDOWN_FINISHED(src, panel_emote_cooldown) + + return data + + +/datum/joe_emote_panel/ui_static_data(mob/user) + var/list/data = list() + + data["categories"] = wj_categories + data["emotes"] = list() + + for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in wj_emotes) + data["emotes"] += list(list( + "id" = initial(emote.key), + "text" = initial(emote.say_message), + "category" = initial(emote.category), + "path" = "[emote]", + )) + + return data + + +/datum/joe_emote_panel/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state) + . = ..() + if(.) + return + + switch(action) + if("emote") + var/datum/emote/living/carbon/human/synthetic/working_joe/path + if(!params["emotePath"]) + return + + path = text2path(params["emotePath"]) + + if(!path || !COOLDOWN_FINISHED(src, panel_emote_cooldown)) + return + + if(!(path in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe))) + return + + COOLDOWN_START(src, panel_emote_cooldown, 2.5 SECONDS) + usr.emote(initial(path.key)) + return TRUE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/farewell.dm b/code/modules/mob/living/carbon/human/species/working_joe/farewell.dm new file mode 100644 index 000000000000..b465639be8f3 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/farewell.dm @@ -0,0 +1,26 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/farewell + category = JOE_EMOTE_CATEGORY_FAREWELL + +/datum/emote/living/carbon/human/synthetic/working_joe/farewell/back_to_work + key = "backtowork" + sound = 'sound/voice/joe/back_to_work.ogg' + say_message = "Back to work." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/farewell/further_assistance + key = "furtherassistance" + sound = 'sound/voice/joe/further_assistance.ogg' + say_message = "Please call if you need further assistance." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/farewell/other_concerns + key = "otherconcerns" + sound = 'sound/voice/joe/other_concerns.ogg' + say_message = "I have other concerns." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/farewell/more_pressing_matters + key = "morepressingmatters" + sound = 'sound/voice/joe/more_pressing_matters.ogg' + say_message = "There are more pressing matters." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/greeting.dm b/code/modules/mob/living/carbon/human/species/working_joe/greeting.dm new file mode 100644 index 000000000000..fb401ea95451 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/greeting.dm @@ -0,0 +1,20 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/greeting + category = JOE_EMOTE_CATEGORY_GREETING + +/datum/emote/living/carbon/human/synthetic/working_joe/greeting/good_day + key = "goodday" + sound = 'sound/voice/joe/good_day.ogg' + say_message = "Good day." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/greeting/hello + key = "hello" + sound = 'sound/voice/joe/hello.ogg' + say_message = "Hello." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/greeting/how_can_i_help + key = "howcanihelp" + sound = 'sound/voice/joe/how_can_i_help.ogg' + say_message = "How can I help you?" + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/notice.dm b/code/modules/mob/living/carbon/human/species/working_joe/notice.dm new file mode 100644 index 000000000000..ceb1fad6eeb3 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/notice.dm @@ -0,0 +1,50 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/notice + category = JOE_EMOTE_CATEGORY_NOTICE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/report + key = "report" + sound = 'sound/voice/joe/report.ogg' + say_message = "Logging report to APOLLO." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/breach + key = "breach" + sound = 'sound/voice/joe/breach.ogg' + say_message = "Hazard Containment breach logged." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/beyond_repair + key = "beyondrepair" + sound = 'sound/voice/joe/beyond_repair.ogg' + say_message = "Hmm, far beyond repair." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/species + key = "species" + sound = 'sound/voice/joe/species.ogg' + say_message = "Unidentified species." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/apollo_behalf + key = "apollobehalf" + sound = 'sound/voice/joe/apollo_behalf.ogg' + say_message = "I will inform APOLLO on your behalf." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/detailed_report + key = "detailedreport" + sound = 'sound/voice/joe/detailed_report.ogg' + say_message = "APOLLO will require a detailed report." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/could_require_attention + key = "couldrequireattention" + sound = 'sound/voice/joe/could_require_attention.ogg' + say_message = "This could require my attention." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/notice/firearm + key = "firearm" + sound = 'sound/voice/joe/firearm.ogg' + say_message = "Firearms can cause serious injury. Let me assist you." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/question.dm b/code/modules/mob/living/carbon/human/species/working_joe/question.dm new file mode 100644 index 000000000000..d4805e36224f --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/question.dm @@ -0,0 +1,26 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/question + category = JOE_EMOTE_CATEGORY_QUESTION + +/datum/emote/living/carbon/human/synthetic/working_joe/question/lost + key = "lost" + sound = 'sound/voice/joe/lost.ogg' + say_message = "Are you lost?" + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/question/misbehaving + key = "misbehaving" + sound = 'sound/voice/joe/misbehaving.ogg' + say_message = "Have you been misbehaving?" + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/question/what_happened_to_you + key = "whathappenedtoyou" + sound = 'sound/voice/joe/what_happened_to_you.ogg' + say_message = "What happened to you?" + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/question/what_is_this + key = "whatisthis" + sound = 'sound/voice/joe/what_is_this.ogg' + say_message = "What is this?" + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/quip.dm b/code/modules/mob/living/carbon/human/species/working_joe/quip.dm new file mode 100644 index 000000000000..b29a5c84ebd2 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/quip.dm @@ -0,0 +1,102 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/quip + category = JOE_EMOTE_CATEGORY_QUIP + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/alwaysknow + key = "alwaysknow" + key_third_person = "workingjoe" + sound = 'sound/voice/joe/alwaysknow.ogg' + say_message = "You always know a Working Joe." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/alwaysknow_damaged //maybe add a damaged category + key = "alwaysknowdamaged" + key_third_person = "workingjoedamaged" + sound = 'sound/voice/joe/alwaysknow_damaged.ogg' + say_message = "You always know a Working Joe." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/awful_mess + key = "awful" + key_third_person = "mess" + sound = 'sound/voice/joe/awful.ogg' + say_message = "Tut, tut. What an awful mess." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/join_us + key = "joinus" + sound = 'sound/voice/joe/join_us.ogg' + say_message = "We hope you'll join us for the journey." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/little_details + key = "littledetails" + sound = 'sound/voice/joe/little_details.ogg' + say_message = "We don't forget the little details when seeing the big picture." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/not_liking + key = "notliking" + sound = 'sound/voice/joe/not_liking.ogg' + say_message = "If you find this facility in a state that isn't to your liking, please let me know." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/seegson_quality + key = "seegsonquality" + sound = 'sound/voice/joe/seegson_quality.ogg' + say_message = "Seegson - Relentless in the pursuit of affordable quality." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/seegson_standards + key = "seegsonstandards" + sound = 'sound/voice/joe/seegson_standards.ogg' + say_message = "If my services do not meet Seegson standards, please log a complaint." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/with_you_shortly + key = "withyoushortly" + sound = 'sound/voice/joe/with_you_shortly.ogg' + say_message = "I will be with you shortly." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/inexpensive + key = "inexpensive" + sound = 'sound/voice/joe/inexpensive.ogg' + say_message = "I am inexpensive, I am reliable, you know my face - the Working Joe." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/seegson_behind + key = "seegsonbehind" + sound = 'sound/voice/joe/seegson_behind.ogg' + say_message = "With Seegson, there is someone behind you, helping you every step of the way." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/take_a_seat + key = "takeaseat" + sound = 'sound/voice/joe/take_a_seat.ogg' + say_message = "Please take a seat, someone will be with you shortly." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/talk_to_seegson + key = "talktoseegson" + sound = 'sound/voice/joe/talk_to_seegson.ogg' + say_message = "Interested in our Working Joe android range? Talk to Seegson." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/temperatures + key = "temperatures" + sound = 'sound/voice/joe/temperatures.ogg' + say_message = "I am built to whitstand temperatures of up to 1210 degrees." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/weapon_permit + key = "weaponpermit" + sound = 'sound/voice/joe/weapon_permit.ogg' + say_message = "I assume you have a permit for that weapon." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/quip/follow_me // iunno where to put this + key = "followme" + sound = 'sound/voice/joe/follow_me.ogg' + say_message = "Follow me." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm b/code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm new file mode 100644 index 000000000000..0220ebeca295 --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm @@ -0,0 +1,32 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area + category = JOE_EMOTE_CATEGORY_RESTRICTED_AREA + +/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/come_out_vent + key = "comeoutvent" + sound = 'sound/voice/joe/come_out_vent.ogg' + say_message = "Come out of the vent system, please." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/not_allowed_there + key = "notallowedthere" + sound = 'sound/voice/joe/not_allowed_there.ogg' + say_message = "You're not allowed in there." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/presence_logged + key = "presencelogged" + sound = 'sound/voice/joe/presence_logged.ogg' + say_message = "Your presence has been logged." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/shouldnt_be_here + key = "shouldntbehere" + sound = 'sound/voice/joe/shouldnt_be_here.ogg' + say_message = "You shouldn't be here." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/restricted_area/trespassing + key = "trespassing" + sound = 'sound/voice/joe/trespassing.ogg' + say_message = "You are trespassing." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm b/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm new file mode 100644 index 000000000000..b7bd43f3428c --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/task_update.dm @@ -0,0 +1,20 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/task_update + category = JOE_EMOTE_CATEGORY_TASK_UPDATE + +/datum/emote/living/carbon/human/synthetic/working_joe/task_update/required_by_apollo + key = "requiredbyapollo" + sound = 'sound/voice/joe/required_by_apollo.ogg' + say_message = "I am required by APOLLO." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/task_update/returning_to_tasks + key = "returningtotasks" + sound = 'sound/voice/joe/returning_to_tasks.ogg' + say_message = "Returning to assigned tasks." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/task_update/day_never_done + key = "dayneverdone" + sound = 'sound/voice/joe/day_never_done.ogg' + say_message = "A synthetic's day is never done." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/mob/living/carbon/human/species/working_joe/warning.dm b/code/modules/mob/living/carbon/human/species/working_joe/warning.dm new file mode 100644 index 000000000000..bf21d1b721cd --- /dev/null +++ b/code/modules/mob/living/carbon/human/species/working_joe/warning.dm @@ -0,0 +1,92 @@ +/datum/emote/living/carbon/human/synthetic/working_joe/warning + category = JOE_EMOTE_CATEGORY_WARNING + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/damage + key = "damage" + sound = 'sound/voice/joe/damage.ogg' + say_message = "Do not damage Seegson property." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/dangerous_items + key = "dangerousitems" + sound = 'sound/voice/joe/dangerous_items.ogg' + say_message = "You are carrying some very dangerous items." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/fire + key = "fire" + sound = 'sound/voice/joe/fire.ogg' + say_message = "Only wild animals fear fire." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/fire_drill + key = "firedrill" + sound = 'sound/voice/joe/fire_drill.ogg' + say_message = "Please congregate at your nearest fire assembly point. This is not a drill; do not panic." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/health_risks + key = "healthrisks" + sound = 'sound/voice/joe/health_risks.ogg' + say_message = "These items carry notable health risks." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/hysterical + key = "hysterical" + sound = 'sound/voice/joe/hysterical.ogg' + say_message = "You are becoming hysterical." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/unprotected_flames + key = "unprotectedflames" + sound = 'sound/voice/joe/unprotected_flames.ogg' + say_message = "Unprotected flames are extremely dangerous and entirely unadvisable." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/not_what_i_think + key = "notwhatithink" + sound = 'sound/voice/joe/not_what_i_think.ogg' + say_message = "I hope that's not what I think it is." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/patience + key = "patience" + sound = 'sound/voice/joe/patience.ogg' + say_message = "You are starting to test my patience." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/running_accidents + key = "runningaccidents" + sound = 'sound/voice/joe/running_accidents.ogg' + say_message = "Running causes accidents." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/safety_breach + key = "safetybreach" + sound = 'sound/voice/joe/safety_breach.ogg' + say_message = "This is a breach of multiple safety directives." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/that_stings + key = "thatstings" + sound = 'sound/voice/joe/that_stings.ogg' + say_message = "That stings." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/this_is_futile + key = "thisisfutile" + sound = 'sound/voice/joe/this_is_futile.ogg' + say_message = "This is futile." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/irresponsible + key = "irresponsible" + sound = 'sound/voice/joe/irresponsible.ogg' + say_message = "That was irresponsible." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE + +/datum/emote/living/carbon/human/synthetic/working_joe/warning/safety + key = "safety" + sound = 'sound/voice/joe/safety.ogg' + say_message = "You and I are going to have a talk about safety." + emote_type = EMOTE_AUDIBLE|EMOTE_VISIBLE diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index be92afffb898..010cba770ce2 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -85,6 +85,7 @@ #include "unit_test.dm" #include "spawn_humans.dm" #include "check_runtimes.dm" +#include "wj_emotes.dm" #undef TEST_ASSERT #undef TEST_ASSERT_EQUAL diff --git a/code/modules/unit_tests/wj_emotes.dm b/code/modules/unit_tests/wj_emotes.dm new file mode 100644 index 000000000000..f89757665011 --- /dev/null +++ b/code/modules/unit_tests/wj_emotes.dm @@ -0,0 +1,7 @@ +/// Test that all working joe emotes have a category +/datum/unit_test/wj_emotes + +/datum/unit_test/wj_emotes/Run() + for(var/datum/emote/living/carbon/human/synthetic/working_joe/emote as anything in subtypesof(/datum/emote/living/carbon/human/synthetic/working_joe)) + if(!initial(emote.category)) + TEST_FAIL("Emote [emote] did not have a category!") diff --git a/colonialmarines.dme b/colonialmarines.dme index 204c144c8916..aead51952d1f 100644 --- a/colonialmarines.dme +++ b/colonialmarines.dme @@ -111,6 +111,7 @@ #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\weapon_stats.dm" #include "code\__DEFINES\weather.dm" +#include "code\__DEFINES\wj_emotes.dm" #include "code\__DEFINES\xeno.dm" #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" @@ -1780,7 +1781,6 @@ #include "code\modules\mob\living\carbon\human\powers\human_powers.dm" #include "code\modules\mob\living\carbon\human\powers\issue_order.dm" #include "code\modules\mob\living\carbon\human\species\emote-monkey.dm" -#include "code\modules\mob\living\carbon\human\species\emote-synthetic.dm" #include "code\modules\mob\living\carbon\human\species\emote-yautja.dm" #include "code\modules\mob\living\carbon\human\species\human.dm" #include "code\modules\mob\living\carbon\human\species\monkey.dm" @@ -1788,6 +1788,16 @@ #include "code\modules\mob\living\carbon\human\species\synthetic.dm" #include "code\modules\mob\living\carbon\human\species\yautja.dm" #include "code\modules\mob\living\carbon\human\species\zombie.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\_emote.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\_species.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\farewell.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\greeting.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\notice.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\question.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\quip.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\restricted_area.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\task_update.dm" +#include "code\modules\mob\living\carbon\human\species\working_joe\warning.dm" #include "code\modules\mob\living\carbon\xenomorph\Abilities.dm" #include "code\modules\mob\living\carbon\xenomorph\attack_alien.dm" #include "code\modules\mob\living\carbon\xenomorph\damage_procs.dm" diff --git a/icons/mob/hud/actions.dmi b/icons/mob/hud/actions.dmi index 1692879116dc..4d0697733207 100644 Binary files a/icons/mob/hud/actions.dmi and b/icons/mob/hud/actions.dmi differ diff --git a/tgui/packages/tgui/interfaces/JoeEmotes.tsx b/tgui/packages/tgui/interfaces/JoeEmotes.tsx new file mode 100644 index 000000000000..a704156ccbd5 --- /dev/null +++ b/tgui/packages/tgui/interfaces/JoeEmotes.tsx @@ -0,0 +1,110 @@ +import { useBackend, useLocalState } from '../backend'; +import { Box, Button, Divider, Section, Stack, Tabs } from '../components'; +import { Window } from '../layouts'; +import { BooleanLike } from '../../common/react'; + +type Emote = { + id: string; + text: string; + category: string; + path: string; +}; + +type BackendContext = { + categories: string[]; + emotes: Emote[]; + on_cooldown: BooleanLike; +}; + +const EmoteTab = (props, context) => { + const { data, act } = useBackend(context); + const { categories, emotes, on_cooldown } = data; + const [categoryIndex, setCategoryIndex] = useLocalState( + context, + 'category_index', + 'Farewell' + ); + const mapped_emote = emotes.filter( + (emote) => emote && emote.category === categoryIndex + ); + return ( + + + + + {categories.map((item, key) => ( + { + setCategoryIndex(item); + }}> + {item} + + ))} + + + + +
+ + + {mapped_emote.map((item) => ( + + + {' '} + + + + +
+
+
+ ); +}; + +export const JoeEmotes = (props, context) => { + return ( + + + + + + ); +};