From 541395a18a4d0dbc617412dcf8f0260c2626239c Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 3 Jul 2023 14:46:38 -0700 Subject: [PATCH] wj emote panel --- code/__DEFINES/tgui.dm | 2 +- code/__DEFINES/wj_emotes.dm | 8 + .../carbon/human/species/emote-synthetic.dm | 354 ------------------ .../human/species/working_joe/_emote.dm | 6 + .../human/species/working_joe/_species.dm | 129 +++++++ .../human/species/working_joe/farewell.dm | 26 ++ .../human/species/working_joe/greeting.dm | 20 + .../human/species/working_joe/notice.dm | 50 +++ .../human/species/working_joe/question.dm | 26 ++ .../carbon/human/species/working_joe/quip.dm | 102 +++++ .../species/working_joe/restricted_area.dm | 32 ++ .../human/species/working_joe/task_update.dm | 20 + .../human/species/working_joe/warning.dm | 92 +++++ code/modules/unit_tests/_unit_tests.dm | 1 + code/modules/unit_tests/wj_emotes.dm | 7 + colonialmarines.dme | 12 +- icons/mob/hud/actions.dmi | Bin 19806 -> 21312 bytes tgui/packages/tgui/interfaces/JoeEmotes.tsx | 110 ++++++ 18 files changed, 641 insertions(+), 356 deletions(-) create mode 100644 code/__DEFINES/wj_emotes.dm delete mode 100644 code/modules/mob/living/carbon/human/species/emote-synthetic.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/_emote.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/_species.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/farewell.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/greeting.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/notice.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/question.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/quip.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/restricted_area.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/task_update.dm create mode 100644 code/modules/mob/living/carbon/human/species/working_joe/warning.dm create mode 100644 code/modules/unit_tests/wj_emotes.dm create mode 100644 tgui/packages/tgui/interfaces/JoeEmotes.tsx 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 1692879116dc760f884f1e279a84265ffb63b4d9..4d06977332078ca179f87621b7523a533d0c176e 100644 GIT binary patch literal 21312 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 literal 19806 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 { + 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 ( + + + + + + ); +};