From 7b21a612284f1c09da7d70a5712c716aabb7b228 Mon Sep 17 00:00:00 2001
From: SatinIsle <98125273+SatinIsle@users.noreply.github.com>
Date: Sat, 12 Oct 2024 15:41:42 +0100
Subject: [PATCH] Single language translators (#16460)
Added a new variant of the handheld translator that only translates a single language into one that you know. These can be taken from character loadout and currently cost 4 points. They can also be found in maintenance randomly.
---
code/game/objects/items/devices/translator.dm | 143 ++++++++++++++++++
code/game/objects/random/maintenance.dm | 3 +-
code/game/objects/random/misc.dm | 33 +++-
.../loadout/loadout_utility.dm | 36 +++++
icons/obj/device.dmi | Bin 92704 -> 93344 bytes
5 files changed, 213 insertions(+), 2 deletions(-)
diff --git a/code/game/objects/items/devices/translator.dm b/code/game/objects/items/devices/translator.dm
index 593bd0be7b6..1bd0a22a52a 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 bbf04a1bc8d..268cf07f7cd 100644
--- a/code/game/objects/random/maintenance.dm
+++ b/code/game/objects/random/maintenance.dm
@@ -117,7 +117,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 3cac8c4d1b6..adc52260937 100644
--- a/code/game/objects/random/misc.dm
+++ b/code/game/objects/random/misc.dm
@@ -1142,4 +1142,35 @@
prob(1);/obj/item/cracker/knockover,
prob(1);/obj/item/cracker/vore,
prob(1);/obj/item/cracker/money
- )
\ No newline at end of file
+ )
+
+/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 5192e758e3e..1f64bea9854 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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