From 82a2178c7ae4a9d02902aaeefb8df6d0ad95c553 Mon Sep 17 00:00:00 2001 From: CHOMPStation2 <58959929+CHOMPStation2@users.noreply.github.com> Date: Sat, 12 Oct 2024 10:15:09 -0700 Subject: [PATCH] [MIRROR] Single language translators (#9221) Co-authored-by: SatinIsle <98125273+SatinIsle@users.noreply.github.com> Co-authored-by: Kashargul --- code/game/objects/items/devices/translator.dm | 143 ++++++++++++++++++ code/game/objects/random/maintenance.dm | 3 +- code/game/objects/random/misc.dm | 31 ++++ .../loadout/loadout_utility.dm | 36 +++++ icons/obj/device.dmi | Bin 92704 -> 93344 bytes 5 files changed, 212 insertions(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm index 593bd0be7b..1bd0a22a52 100644 --- a/code/game/objects/items/devices/translator.dm +++ b/code/game/objects/items/devices/translator.dm @@ -88,3 +88,146 @@ slot_flags = SLOT_EARS visual = 0 audio = 1 + +//////////////Single language translators + + +/obj/item/universal_translator/limited + name = "handheld translator (galcom)" + desc = "This handy device appears to translate specific languages that it hears into onscreen text for a user." + var/list/known_languages = list(LANGUAGE_GALCOM) + icon_state = "translator_small" + +/obj/item/universal_translator/limited/hear_talk(mob/M, list/message_pieces, verb) + if(!listening || !istype(M)) + return + + //Handheld or pocket only. + if(!isliving(loc)) + return + + var/mob/living/L = loc + if(visual && ((L.sdisabilities & BLIND) || L.eye_blind)) + return + if(audio && ((L.sdisabilities & DEAF) || L.ear_deaf)) + return + + // Using two for loops kinda sucks, but I think it's more efficient + // to shortcut past string building if we're just going to discard the string + // anyways. + if(user_understands(M, L, message_pieces)) + return + + var/new_message = "" + var/confirm = 0 + + for(var/datum/multilingual_say_piece/S in message_pieces) + if(S.speaking.name in known_languages) + confirm = 1 + new_message += (S.message + " ") + + if(!L.say_understands(null, langset)) + new_message = langset.scramble(new_message) + + //Show the "I heard something" animation, only if it's an appropriate language! + if(mult_icons && confirm) + flick("[initial(icon_state)]2",src) + + if(confirm) //Don't show a message at all if there's no recognised language, that'd just be annoying. + to_chat(L, span_filter_say("[src] translates, \"[new_message]\"")) + +/obj/item/universal_translator/limited/sol + name = "handheld translator (solcom)" + known_languages = list(LANGUAGE_SOL_COMMON) + +/obj/item/universal_translator/limited/terminus + name = "handheld translator (terminus)" + known_languages = list(LANGUAGE_TERMINUS) + +/obj/item/universal_translator/limited/tradeband + name = "handheld translator (tradeband)" + known_languages = list(LANGUAGE_TRADEBAND) + +/obj/item/universal_translator/limited/gutterband + name = "handheld translator (gutterband)" + known_languages = list(LANGUAGE_GUTTER) + +/obj/item/universal_translator/limited/skrellian + name = "handheld translator (skrellian)" + known_languages = list(LANGUAGE_SKRELLIAN) + +/obj/item/universal_translator/limited/unathi + name = "handheld translator (sinta'unathi)" + known_languages = list(LANGUAGE_UNATHI) + +/obj/item/universal_translator/limited/siik + name = "handheld translator (siik)" + known_languages = list(LANGUAGE_SIIK) + +/obj/item/universal_translator/limited/schechi + name = "handheld translator (schechi)" + known_languages = list(LANGUAGE_SCHECHI) + +/obj/item/universal_translator/limited/vedaqh + name = "handheld translator (vedaqh)" + known_languages = list(LANGUAGE_ZADDAT) + +/obj/item/universal_translator/limited/birdsong + name = "handheld translator (birdsong)" + known_languages = list(LANGUAGE_BIRDSONG) + +/obj/item/universal_translator/limited/sagaru + name = "handheld translator (sagaru)" + known_languages = list(LANGUAGE_SAGARU) + +/obj/item/universal_translator/limited/canilunzt + name = "handheld translator (canilunzt)" + known_languages = list(LANGUAGE_CANILUNZT) + +/obj/item/universal_translator/limited/ecureuilian + name = "handheld translator (ecureuilian)" + known_languages = list(LANGUAGE_ECUREUILIAN) + +/obj/item/universal_translator/limited/daemon + name = "handheld translator (daemon)" + known_languages = list(LANGUAGE_DAEMON) + +/obj/item/universal_translator/limited/enochian + name = "handheld translator (enochian)" + known_languages = list(LANGUAGE_ENOCHIAN) + +/obj/item/universal_translator/limited/vespinae + name = "handheld translator (vespinae)" + known_languages = list(LANGUAGE_VESPINAE) + +/obj/item/universal_translator/limited/dragon + name = "handheld translator (d'rudak'ar)" + known_languages = list(LANGUAGE_DRUDAKAR) + +/obj/item/universal_translator/limited/spacer + name = "handheld translator (spacer)" + known_languages = list(LANGUAGE_SPACER) + +/obj/item/universal_translator/limited/tavan + name = "handheld translator (tavan)" + known_languages = list(LANGUAGE_TAVAN) + +/obj/item/universal_translator/limited/echosong + name = "handheld translator (echo song)" + known_languages = list(LANGUAGE_ECHOSONG) + +/obj/item/universal_translator/limited/akhani + name = "handheld translator (akhani)" + known_languages = list(LANGUAGE_AKHANI) + +/obj/item/universal_translator/limited/alai + name = "handheld translator (alai)" + known_languages = list(LANGUAGE_ALAI) + +/obj/item/universal_translator/limited/glamour //Admin spawn only, just here for utility + name = "handheld translator (glamourspeak)" + known_languages = list(LANGUAGE_LLEILL) + +/obj/item/universal_translator/limited/teppi //Admin spawn only, just here for utility + name = "handheld translator (teppi)" + known_languages = list(LANGUAGE_TEPPI) diff --git a/code/game/objects/random/maintenance.dm b/code/game/objects/random/maintenance.dm index f6f0f9ce1b..4580f94691 100644 --- a/code/game/objects/random/maintenance.dm +++ b/code/game/objects/random/maintenance.dm @@ -118,7 +118,8 @@ something, make sure it's not in one of the other lists.*/ prob(5);/obj/item/material/fishing_net/butterfly_net, prob(2);/obj/item/cracker, prob(5);/obj/random/mega_nukies, - prob(1);/obj/random/potion_ingredient/plus + prob(1);/obj/random/potion_ingredient/plus, + prob(2);/obj/random/translator /* VOREStation Edit End */ ) diff --git a/code/game/objects/random/misc.dm b/code/game/objects/random/misc.dm index f912f07f43..457445833c 100644 --- a/code/game/objects/random/misc.dm +++ b/code/game/objects/random/misc.dm @@ -1165,3 +1165,34 @@ prob(1);/obj/item/cracker/vore, prob(1);/obj/item/cracker/money ) + +/obj/random/translator + name = "Random language translator" + desc = "This is a random single language translator." + icon = 'icons/obj/device.dmi' + icon_state = "translator_small" + +/obj/random/translator/item_to_spawn() + return pick(/obj/item/universal_translator/limited, + /obj/item/universal_translator/limited/sol, + /obj/item/universal_translator/limited/terminus, + /obj/item/universal_translator/limited/tradeband, + /obj/item/universal_translator/limited/gutterband, + /obj/item/universal_translator/limited/skrellian, + /obj/item/universal_translator/limited/unathi, + /obj/item/universal_translator/limited/siik, + /obj/item/universal_translator/limited/schechi, + /obj/item/universal_translator/limited/vedaqh, + /obj/item/universal_translator/limited/birdsong, + /obj/item/universal_translator/limited/sagaru, + /obj/item/universal_translator/limited/canilunzt, + /obj/item/universal_translator/limited/ecureuilian, + /obj/item/universal_translator/limited/daemon, + /obj/item/universal_translator/limited/enochian, + /obj/item/universal_translator/limited/vespinae, + /obj/item/universal_translator/limited/dragon, + /obj/item/universal_translator/limited/spacer, + /obj/item/universal_translator/limited/tavan, + /obj/item/universal_translator/limited/echosong, + /obj/item/universal_translator/limited/akhani, + /obj/item/universal_translator/limited/alai) diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index fdc8488587..2ebbe0c5f5 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -194,3 +194,39 @@ modular computers /datum/gear/utility/customlaptop/New() ..() gear_tweaks += new /datum/gear_tweak/laptop() + +//////////Language Translators + +/datum/gear/utility/translator + display_name = "handheld translator (selection)" + path = /obj/item/universal_translator/limited + cost = 4 + +/datum/gear/utility/translator/New() + ..() + var/list/translators = list( + "galcom" = /obj/item/universal_translator/limited, + "solcom" = /obj/item/universal_translator/limited/sol, + "terminus" = /obj/item/universal_translator/limited/terminus, + "tradeband" = /obj/item/universal_translator/limited/tradeband, + "gutterband" = /obj/item/universal_translator/limited/gutterband, + "skrellian" = /obj/item/universal_translator/limited/skrellian, + "sinta'unathi" = /obj/item/universal_translator/limited/unathi, + "siik" = /obj/item/universal_translator/limited/siik, + "schechi" = /obj/item/universal_translator/limited/schechi, + "vedaqh" = /obj/item/universal_translator/limited/vedaqh, + "birdsong" = /obj/item/universal_translator/limited/birdsong, + "sagaru" = /obj/item/universal_translator/limited/sagaru, + "canilunzt" = /obj/item/universal_translator/limited/canilunzt, + "ecureuilian" = /obj/item/universal_translator/limited/ecureuilian, + "daemon" = /obj/item/universal_translator/limited/daemon, + "enochian" = /obj/item/universal_translator/limited/enochian, + "vespinae" = /obj/item/universal_translator/limited/vespinae, + "d'rudak'ar" = /obj/item/universal_translator/limited/dragon, + "spacer" = /obj/item/universal_translator/limited/spacer, + "tavan" = /obj/item/universal_translator/limited/tavan, + "echo song" = /obj/item/universal_translator/limited/echosong, + "akhani" = /obj/item/universal_translator/limited/akhani, + "alai" = /obj/item/universal_translator/limited/alai + ) + gear_tweaks += new/datum/gear_tweak/path(translators) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 6e3cd24503f4c79678c64da5ad5779ad1e36bdff..a538ec2b6092ddaa8c13685be12dcac204b8efbe 100644 GIT binary patch delta 5913 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 Hiwyq{qyyXh delta 5268 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