Files
VOREStation/code/game/objects/items/devices/translator.dm
T
Cameron Lennox 84dc5535dc var/global/list -> GLOB. conversion (#17928)
* These two are easy

* !!!runlevel_flags

the fact it was global.runlevel_flags.len has me a bit...iffy on this.

* !!!json_cache

Same as above. used global.

* player_list & observer_mob_list

* mechas_list

* this wasn't even used

* surgery_steps

* event_triggers

* landmarks_list

* dead_mob_list

* living_mob_list

* ai_list

* cable_list

* cleanbot_reserved_turfs

* listening_objects

* silicon_mob_list

* human_mob_list

* Update global_lists.dm

* joblist

* mob_list

* Update global_lists.dm

* holomap_markers

* mapping_units

* mapping_beacons

* hair_styles_list

* facial_hair_styles_list

* Update global_lists.dm

* facial_hair_styles_male_list

* facial_hair_styles_female_list

* body_marking_styles_list

* body_marking_nopersist_list

* ear_styles_list

* hair_styles_male_list

* tail_styles_list

* wing_styles_list

* escape_list & rune_list & endgame_exits

these were all really small

* endgame_safespawns

* stool_cache

* emotes_by_key

* random_maps & map_count

* item_tf_spawnpoints

* narsie_list

* active_radio_jammers

* unused

* paikeys

* pai_software_by_key & default_pai_software

* plant_seed_sprites

* magazine_icondata_keys  & magazine_icondata_states

* unused

* ashtray_cache

* light_type_cache

* HOLIDAY!!!

this one was annoying

* faction stuff (red?!)

* Update preferences_factions.dm

* vs edit removal

* backbaglist, pdachoicelist, exclude_jobs

* item_digestion_blacklist, edible_tech, blacklisted_artifact_effect, selectable_footstep, hexNums, syndicate_access

* string_slot_flags and hexdigits->hexNums

* possible_changeling_IDs

* vr_mob_tf_options

* vr_mob_spawner_options

* pipe_colors

* vr_mob_spawner_options

* common_tools

* newscaster_standard_feeds

* Update periodic_news.dm

* changeling_fabricated_clothing

* semirandom_mob_spawner_decisions

* id_card_states

* Update syndicate_ids.dm

* overlay_cache & gear_distributed_to

* more

* radio_channels_by_freq

* Update global_lists.dm

* proper

* default_medbay_channels & default_internal_channels

default_internal_channels is weird as it has a mapbased proc() but that proc is never called...

* valid_ringtones

* move this

* possible_plants

* more

* separate these

moves xeno2chemlist from a hook to a new global list.

* tube_dir_list

* valid_bloodreagents & monitor_states

* Junk

* valid_bloodtypes

* breach_burn_descriptors & burn

* more!!

appliance_available_recipes seems uber cursed, re-look at later

* Appliance code is cursed

* wide_chassis & flying_chassis

* allows_eye_color

* all_tooltip_styles

* direction_table

* gun_choices

* severity_to_string

* old event_viruses

* description_icons

* MOVE_KEY_MAPPINGS

* more more

* pai & robot modules

* Update global_lists.dm

* GEOSAMPLES

Also swaps a .len to LAZYLEN()

* shieldgens

* reagent recipies

* global ammo types

* rad collector

* old file and unused global

* nif_look_messages

* FESH

* nifsoft

* chamelion

* the death of sortAtom

* globulins

* lazylen that

* Update global_lists.dm

* LAZY

* Theese too

* quick fix

---------

Co-authored-by: Kashargul <144968721+Kashargul@users.noreply.github.com>
2025-07-14 20:14:31 +02:00

236 lines
7.7 KiB
Plaintext

//Universal translator
/obj/item/universal_translator
name = "handheld translator"
desc = "This handy device appears to translate the languages it hears into onscreen text for a user."
icon = 'icons/obj/device.dmi'
icon_state = "translator"
w_class = ITEMSIZE_NORMAL
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
var/mult_icons = 1 //Changes sprite when it translates
var/visual = 1 //If you need to see to get the message
var/audio = 0 //If you need to hear to get the message
var/listening = 0
var/datum/language/langset
pickup_sound = 'sound/items/pickup/device.ogg'
drop_sound = 'sound/items/drop/device.ogg'
/obj/item/universal_translator/attack_self(mob/user)
if(!listening) //Turning ON
langset = tgui_input_list(user,"Translate to which of your languages?","Language Selection", user.languages)
if(langset)
if(langset && ((langset.flags & NONVERBAL) || (langset.flags & HIVEMIND) || (!langset.machine_understands)))
//Nonverbal means no spoken words to translate, so I didn't see the need to remove it.
to_chat(user, span_warning("\The [src] cannot output that language."))
return
else
listening = 1
GLOB.listening_objects |= src
if(mult_icons)
icon_state = "[initial(icon_state)]1"
to_chat(user, span_notice("You enable \the [src], translating into [langset.name]."))
else //Turning OFF
listening = 0
GLOB.listening_objects -= src
langset = null
icon_state = "[initial(icon_state)]"
to_chat(user, span_notice("You disable \the [src]."))
/obj/item/universal_translator/hear_talk(mob/M, list/message_pieces, verb)
if(!listening || !istype(M))
return
//Show the "I heard something" animation.
if(mult_icons)
flick("[initial(icon_state)]2",src)
//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 = ""
for(var/datum/multilingual_say_piece/S in message_pieces)
if(S.speaking.flags & NONVERBAL)
continue
if(!S.speaking.machine_understands)
new_message += stars(S.message) + " "
continue
new_message += (S.message + " ")
if(!L.say_understands(null, langset))
new_message = langset.scramble(new_message)
to_chat(L, span_filter_say(span_italics(span_bold("[src]") + " translates, ") + " \"<span class='[langset.colour]'>[new_message]</span>\""))
/obj/item/universal_translator/proc/user_understands(mob/M, mob/living/L, list/message_pieces)
for(var/datum/multilingual_say_piece/S in message_pieces)
if(S.speaking && !L.say_understands(M, S.speaking))
return FALSE
return TRUE
//Let's try an ear-worn version
/obj/item/universal_translator/ear
name = "translator earpiece"
desc = "This handy device appears to translate the languages it hears into another language for a user."
icon_state = "earpiece"
w_class = ITEMSIZE_TINY
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("<i><b>[src]</b> translates, </i>\"<span class='[langset.colour]'>[new_message]</span>\""))
/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)