Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TTS update #40

Merged
merged 23 commits into from
Apr 10, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion config/bandastation/bandastation_config.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
## Text-to-speech
#TTS_TOKEN_SILERO mytoken
#TTS_ENABLED
#TTS_CACHE
#TTS_CACHE_ENABLED
#TTS_API_URL_SILERO
180 changes: 180 additions & 0 deletions config/bandastation/tts_replacements.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
{
"tts_acronym_replacements": {
"нт": "Эн Тэ",
"смо": "Эс Мэ О",
"гп": "Гэ Пэ",
"рд": "Эр Дэ",
"гсб": "Гэ Эс Бэ",
"срп": "Эс Эр Пэ",
"цк": "Цэ Каа",
"рнд": "Эр Эн Дэ",
"сб": "Эс Бэ",
"рцд": "Эр Цэ Дэ",
"брпд": "Бэ Эр Пэ Дэ",
"рпд": "Эр Пэ Дэ",
"рпед": "Эр Пед",
"тсф": "Тэ Эс Эф",
"срт": "Эс Эр Тэ",
"обр": "О Бэ Эр",
"кпк": "Кэ Пэ Каа",
"пда": "Пэ Дэ А",
"id": "Ай Ди",
"мщ": "Эм Ще",
"вт": "Вэ Тэ",
"ерп": "Йе Эр Пэ",
"се": "Эс Йе",
"апц": "А Пэ Цэ",
"лкп": "Эл Ка Пэ",
"см": "Эс Эм",
"ека": "Йе Ка",
"ка": "Кэ А",
"бса": "Бэ Эс Аа",
"днк": "Дэ Эн Ка",
"тк": "Тэ Ка",
"бфл": "Бэ Эф Эл",
"бщ": "Бэ Щэ",
"кк": "Кэ Ка",
"ск": "Эс Ка",
"зк": "Зэ Ка",
"ерт": "Йе Эр Тэ",
"вкд": "Вэ Ка Дэ",
"нтр": "Эн Тэ Эр",
"пнт": "Пэ Эн Тэ",
"авд": "А Вэ Дэ",
"пнв": "Пэ Эн Вэ",
"ссд": "Эс Эс Дэ",
"кпб": "Кэ Пэ Бэ",
"сссп": "Эс Эс Эс Пэ",
"крб": "Ка Эр Бэ",
"бд": "Бэ Дэ",
"сст": "Эс Эс Тэ",
"скс": "Эс Ка Эс",
"икн": "И Ка Эн",
"нсс": "Эн Эс Эс",
"емп": "Йе Эм Пэ",
"бс": "Бэ Эс",
"цкс": "Цэ Ка Эс",
"срд": "Эс Эр Дэ",
"жпс": "Джи Пи Эс",
"gps": "Джи Пи Эс",
"ннксс": "Эн Эн Ка Эс Эс",
"ss": "Эс Эс",
"сс": "Эс Эс",
"тесла": "тэсла",
"трейзен": "трэйзэн",
"нанотрейзен": "нанотрэйзэн",
"мед": "м ед",
"меде": "м еде",
"кз": "Кэ Зэ",
"гбс": "Гэ Бэ Эс",
"цпсс": "Цэ Пэ Эс Эс",
"гкк": "Гэ Кэ Ка"
},
"tts_job_replacements": {
"nanotrasen navy field officer": "Полевой офицер флота Нанотрэйзен",
"nanotrasen navy officer": "Офицер флота nanotrasen",
"supreme commander": "Верховный главнокомандующий",
"solar federation general": "Генерал Солнечной Федерации",
"special operations officer": "Офицер специальных операций",
"civilian": "Гражданский",
"tourist": "Турист",
"businessman": "Бизнэсмэн",
"trader": "Торговец",
"assistant": "Ассистент",
"chief engineer": "Главный Инженер",
"station engineer": "Станционный инженер",
"trainee engineer": "Инженер-стажер",
"Engineer Assistant": "Инженерный Ассистент",
"Technical Assistant": "Технический Ассистент",
"Engineer Student": "Инженер-практикант",
"Technical Student": "Техник-практикант",
"Technical Trainee": "Техник-стажер",
"maintenance technician": "Техник по обслуживанию",
"engine technician": "Техник по двигателям",
"electrician": "Электрик",
"life support specialist": "Специалист по жизнеобеспечению",
"atmospheric technician": "Атмосферный техник",
"mechanic": "Механик",
"chief medical officer": "Главный врач",
"medical doctor": "Врач",
"Intern": "Интерн",
"Student Medical Doctor": "Врач-практикант",
"Medical Assistant": "Ассистирующий врач",
"surgeon": "Хирург",
"nurse": "Медсестра",
"coroner": "К+оронэр",
"chemist": "Химик",
"pharmacist": "Фармацевт",
"pharmacologist": "Фармаколог",
"geneticist": "Генетик",
"virologist": "Вирусолог",
"pathologist": "Патологоанатом",
"microbiologist": "Микробиолог",
"psychiatrist": "Психиатр",
"psychologist": "Психолог",
"therapist": "Терапевт",
"paramedic": "Парамедик",
"research director": "Директор исследований",
"scientist": "Учёный",
"student scientist": "Учёный-практикант",
"Scientist Assistant": "Научный Ассистент",
"Scientist Pregraduate": "Учёный-бакалавр",
"Scientist Graduate": "Научный выпускник",
"Scientist Postgraduate": "Учёный-аспирант",
"anomalist": "Аномалист",
"plasma researcher": "Исследователь плазмы",
"xenobiologist": "Ксенобиолог",
"chemical researcher": "Химик-исследователь",
"roboticist": "Робототехник",
"student robotist": "Студент-робототехник",
"biomechanical engineer": "Биомеханический инженер",
"mechatronic engineer": "Инженер мехатроники",
"head of security": "Глава службы безопасности",
"warden": "Смотритель",
"detective": "Детектив",
"forensic technician": "Криминалист",
"junior security officer": "Младший офицер службы безопасности",
"security officer": "Офицер службы безопасности",
"security trainer": "Тренер службы безопасности",
"security cadet": "Кадет службы безопасности",
"Security Assistant": "Ассистент службы безопасности",
"Security Graduate": "Выпускник кадетской академии",
"brig physician": "Врач брига",
"security pod pilot": "Пилот пода службы безопасности",
"captain": "Капитан",
"ai": "И И",
"cyborg": "Киборг",
"robot": "Робот",
"head of personnel": "Глава персонала",
"nanotrasen representative": "Представитель Нанотрэйзен",
"blueshield": "Блюшилд",
"magistrate": "Магистрат",
"internal affairs agent": "Агент внутренних дел",
"human resources agent": "Агент по персоналу",
"bartender": "Бармэн",
"chef": "Повар",
"cook": "Кук",
"culinary artist": "Кулинар",
"butcher": "Мясник",
"botanist": "Ботаник",
"hydroponicist": "Гидропонист",
"botanical researcher": "Ботаник-исследователь",
"quartermaster": "Квартирмейстер",
"cargo technician": "Карго техник",
"shaft miner": "Шахтёр",
"spelunker": "Спелеолог",
"clown": "Клоун",
"mime": "Мим",
"janitor": "Уборщик",
"custodial technician": "Техник по уходу за помещениями",
"librarian": "Библиотекарь",
"journalist": "Журналист",
"barber": "Парикмахер",
"hair stylist": "Стилист",
"beautician": "Косметолог",
"explorer": "Исследователь",
"chaplain": "Священник",
"syndicate officer": "Офицер синдиката",
"visitor": "посетитель"
}
}
1 change: 1 addition & 0 deletions dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export BYOND_MINOR=1633

#rust_g git tag
export RUST_G_VERSION=3.1.0
export RUST_G_VERSION_SS220=3.0.0-ss220

#node version
export NODE_VERSION=20
Expand Down
3 changes: 3 additions & 0 deletions modular_bandastation/_defines220/_defines220.dme
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
#include "_defines220.dm"

#include "code/signals_atom.dm"
#include "code/defines/keybindings.dm"
#include "code/defines/misc.dm"
#include "code/defines/spans.dm"
#include "code/defines/text_to_speech.dm"
#include "code/signals_mob/signals_mob_ai.dm"
#include "code/signals_mob/signals_mob_carbon.dm"
#include "code/signals_mob/signals_mob_living.dm"
Expand Down
6 changes: 6 additions & 0 deletions modular_bandastation/_defines220/code/defines/misc.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
///Do (almost) nothing - indev placeholder for switch case implementations etc
#define NOOP (.=.)
/// Copies the L from element START to elememt END if L is initialized, otherwise returns an empty list.
#define LAZYCOPY_RANGE(L, START, END) ( L ? L.Copy(START, END) : list() )
/// Cuts the L from element START to elememt END if L is initialized, otherwise returns an empty list.
#define LAZYCUT(L, START, END) ( L ? L.Cut(START, END) : NOOP )
Original file line number Diff line number Diff line change
@@ -1,18 +1,11 @@
#define VV_HK_SELECT_TTS_VOICE "select_tts_voice"

#define SOUND_EFFECT_NONE 0
#define SOUND_EFFECT_RADIO 1
#define SOUND_EFFECT_ROBOT 2
#define SOUND_EFFECT_RADIO_ROBOT 3
#define SOUND_EFFECT_MEGAPHONE 4
#define SOUND_EFFECT_MEGAPHONE_ROBOT 5

#define CHANNEL_TTS_RADIO 1008

#define TTS_TRAIT_PITCH_WHISPER (1<<1)
#define TTS_TRAIT_RATE_FASTER (1<<2)
#define TTS_TRAIT_RATE_MEDIUM (1<<3)

#define TTS_TRAIT_ROBOTIZE "tts_trait_robotize"

#define TTS_CATEGORY_OTHER "Другое"
#define TTS_CATEGORY_WARCRAFT3 "WarCraft 3"
#define TTS_CATEGORY_HALFLIFE2 "Half-Life 2"
Expand All @@ -34,6 +27,25 @@
#define TTS_CATEGORY_HEARTHSTONE "Hearthstone"
#define TTS_CATEGORY_VALORANT "Valorant"
#define TTS_CATEGORY_EVILISLANDS "Evil Islands"
#define TTS_CATEGORY_WITCHER "Witcher"
#define TTS_CATEGORY_LEFT4DEAD "Left 4 Dead"
#define TTS_CATEGORY_SPONGEBOB "SpongeBob"
#define TTS_CATEGORY_TINYBUNNY "Tiny Bunny"
#define TTS_CATEGORY_BALDURS_GATE_3 "Baldur's gate 3"
#define TTS_CATEGORY_PORTAL "Portal"
#define TTS_CATEGORY_TMNT "Teenage mutant ninja turtle"
#define TTS_CATEGORY_STAR_WARS "Star Wars"
#define TTS_CATEGORY_TRANSFORMERS "Transformers"
#define TTS_CATEGORY_LOTR "The Lord of the rings"
#define TTS_CATEGORY_SHREK "Shrek"
#define TTS_CATEGORY_POTC "Pirates of the Caribbean"
#define TTS_CATEGORY_HARRY_POTTER "Harry Potter"
#define TTS_CATEGORY_X3 "X3"
#define TTS_CATEGORY_OVERLORD2 "The Overlord 2"
#define TTS_CATEGORY_MARVEL "Marvel"
#define TTS_CATEGORY_WOW "World of Warcraft"
#define TTS_CATEGORY_TREASURE_ISLAND "Treasure Island"
#define TTS_CATEGORY_BOYS_WORD "Слово пацана"

#define TTS_GENDER_ANY "Любой"
#define TTS_GENDER_MALE "Мужской"
Expand All @@ -55,10 +67,9 @@
"Капитан, вы уверены что хотите назначить клоуна на должность главы персонала?",\
)

#define LOCAL_TTS_VOLUME(mob) mob.client.prefs.read_preference(/datum/preference/numeric/sound_tts_local)
#define RADIO_TTS_VOLUME(mob) mob.client.prefs.read_preference(/datum/preference/numeric/sound_tts_radio)
#define LOCAL_TTS_ENABLED(mob) LOCAL_TTS_VOLUME(mob)
#define RADIO_TTS_ENABLED(mob) RADIO_TTS_VOLUME(mob)
#define BIG_WORKER_TIER 220
#define LITTLE_WORKER_TIER 110

/proc/error(msg)
log_world("## ERROR: [msg]")
#define BIG_WORKER_TTS_LEVEL 3
#define LITTLE_WORKER_TTS_LEVEL 1
#define DONATOR_LEVEL_MAX 5
8 changes: 8 additions & 0 deletions modular_bandastation/_defines220/code/signals_atom.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
///from base of atom/change_tts_seed(): (mob/chooser, override, new_traits)
#define COMSIG_ATOM_TTS_SEED_CHANGE "atom_tts_seed_change"
///from base of atom/cast_tts: (mob/listener, message, atom/location, is_local, effect, traits, preSFX, postSFX)
#define COMSIG_ATOM_TTS_CAST "atom_tts_cast"
///from base of atom/tts_trait_add(): (trait)
#define COMSIG_ATOM_TTS_TRAIT_ADD "atom_tts_trait_add"
///from base of atom/tts_trait_remove(): (trait)
#define COMSIG_ATOM_TTS_TRAIT_REMOVE "atom_tts_trait_remove"
32 changes: 0 additions & 32 deletions modular_bandastation/_helpers220/code/unsorted.dm
Original file line number Diff line number Diff line change
@@ -1,32 +0,0 @@
/** Get all hearers in range, ignores walls and such. Code stolen from `/proc/get_hearers_in_view()`
* Much faster and less expensive than range()
*/
/proc/get_hearers_in_range(range_radius, atom/source)
var/turf/center_turf = get_turf(source)
if(!center_turf)
return

. = list()
var/old_luminosity = center_turf.luminosity
if(range_radius <= 0) //special case for if only source cares
for(var/atom/movable/target as anything in center_turf)
var/list/recursive_contents = target.important_recursive_contents?[RECURSIVE_CONTENTS_HEARING_SENSITIVE]
if(recursive_contents)
. += recursive_contents
return .

var/list/hearables_from_grid = SSspatial_grid.orthogonal_range_search(source, RECURSIVE_CONTENTS_HEARING_SENSITIVE, range_radius)

if(!length(hearables_from_grid))//we know that something is returned by the grid, but we dont know if we need to actually filter down the output
return .

var/list/assigned_oranges_ears = SSspatial_grid.assign_oranges_ears(hearables_from_grid)

for(var/mob/oranges_ear/ear in range(range_radius, center_turf))
. += ear.references

for(var/mob/oranges_ear/remaining_ear as anything in assigned_oranges_ears) //we need to clean up our mess
remaining_ear.unassign()

center_turf.luminosity = old_luminosity
return .
2 changes: 2 additions & 0 deletions modular_bandastation/_modpacks.dm
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ SUBSYSTEM_DEF(modpacks)
var/fail_msg = package.post_initialize()
if(fail_msg)
CRASH("Modpack [(istype(package) && package.name) || "Unknown"] failed to post-initialize: [fail_msg]")

return SS_INIT_SUCCESS

/client/verb/modpacks_list()
set name = "Modpacks List"
Expand Down
4 changes: 4 additions & 0 deletions modular_bandastation/_singletons/_singletons.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
/datum/modpack/singletons
name = "Singletons"
desc = "Ports Singletons from Sierra"
author = "larentoun"
5 changes: 5 additions & 0 deletions modular_bandastation/_singletons/_singletons.dme
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#include "_singletons.dm"

#include "code/_defines.dm"
#include "code/repository.dm"
#include "code/singletons.dm"
23 changes: 23 additions & 0 deletions modular_bandastation/_singletons/code/_defines.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
/*
* Performance behaviors for avoiding calling procs unecessarily on the Singletons global.
*/

/// Get a singleton instance according to path P. Creates it if necessary. Null if abstract or not a singleton.
#define GET_SINGLETON(P)\
(ispath(P, /datum/singleton) ? (GLOB.Singletons.resolved_instances[P] ? GLOB.Singletons.instances[P] : GLOB.Singletons.GetInstance(P)) : null)

/// Get a (path = instance) map of valid singletons according to typesof(P).
#define GET_SINGLETON_TYPE_MAP(P)\
(ispath(P, /datum/singleton) ? (GLOB.Singletons.resolved_type_maps[P] ? GLOB.Singletons.type_maps[P] : GLOB.Singletons.GetTypeMap(P)) : list())

/// Get a (path = instance) map of valid singletons according to subtypesof(P).
#define GET_SINGLETON_SUBTYPE_MAP(P)\
(ispath(P, /datum/singleton) ? (GLOB.Singletons.resolved_subtype_maps[P] ? GLOB.Singletons.subtype_maps[P] : GLOB.Singletons.GetSubtypeMap(P)) : list())

/// Get a list of valid singletons according to typesof(path).
#define GET_SINGLETON_TYPE_LIST(P)\
(ispath(P, /datum/singleton) ? (GLOB.Singletons.resolved_type_lists[P] ? GLOB.Singletons.type_lists[P] : GLOB.Singletons.GetTypeList(P)) : list())

/// Get a list of valid singletons according to subtypesof(path).
#define GET_SINGLETON_SUBTYPE_LIST(P)\
(ispath(P, /datum/singleton) ? (GLOB.Singletons.resolved_subtype_lists[P] ? GLOB.Singletons.subtype_lists[P] : GLOB.Singletons.GetSubtypeList(P)) : list())
Loading
Loading