From c0b322c51ad1076d2bcff12f59dff811ef62d39d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 12 Apr 2019 00:20:42 +0200 Subject: [PATCH 01/13] - make the switch between game and generic fonts automatic by adding a key value to the language table --- src/c_console.cpp | 27 ++----- src/d_main.cpp | 2 +- src/doomstat.h | 2 +- src/g_cvars.cpp | 15 ++++ src/g_statusbar/hudmessages.cpp | 2 +- src/g_statusbar/shared_sbar.cpp | 4 +- src/v_video.cpp | 1 - wadsrc/static/language.csv | 55 +++++++------- wadsrc/static/zscript/base.zs | 1 - wadsrc/static/zscript/ui/menu/messagebox.zs | 4 +- wadsrc/static/zscript/ui/statusbar/alt_hud.zs | 4 +- .../zscript/ui/statusbar/strife_sbar.zs | 4 +- wadsrc_extra/static/language.csv | 75 ++++++++++++------- 13 files changed, 108 insertions(+), 88 deletions(-) diff --git a/src/c_console.cpp b/src/c_console.cpp index 6a4f70d72..eb50c3ee7 100644 --- a/src/c_console.cpp +++ b/src/c_console.cpp @@ -79,21 +79,6 @@ CUSTOM_CVAR(Int, con_buffersize, -1, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) if (self >= 0 && self < 128) self = 128; } -bool generic_hud, generic_ui; - -EXTERN_CVAR(Bool, ui_generic) - -CUSTOM_CVAR(Bool, hud_generic, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // All HUD elements only use generic assets -{ - generic_hud = self || ui_generic; -} - -CUSTOM_CVAR(Bool, ui_generic, false, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) // The entire UI uses generic assets (this excludes the primary menus) -{ - generic_ui = self; - generic_hud = self || hud_generic; -} - FConsoleBuffer *conbuffer; static void C_TabComplete (bool goForward); @@ -599,13 +584,13 @@ CUSTOM_CVAR (Int, msgmidcolor2, 4, CVAR_ARCHIVE) EColorRange C_GetDefaultFontColor() { // Ideally this should analyze the SmallFont and pick a matching color. - if (!generic_hud) return CR_UNTRANSLATED; + if (!generic_ui) return CR_UNTRANSLATED; return gameinfo.gametype == GAME_Doom ? CR_RED : gameinfo.gametype == GAME_Chex ? CR_GREEN : gameinfo.gametype == GAME_Strife ? CR_GOLD : CR_GRAY; } FFont * C_GetDefaultHUDFont() { - return generic_hud? NewSmallFont : SmallFont; + return generic_ui? NewSmallFont : SmallFont; } void C_InitConback() @@ -800,9 +785,9 @@ void FNotifyBuffer::AddString(int printlevel, FString source) con_notifylines == 0) return; - width = DisplayWidth / active_con_scaletext(generic_hud); + width = DisplayWidth / active_con_scaletext(generic_ui); - FFont *font = hud_generic ? NewSmallFont : SmallFont; + FFont *font = generic_ui ? NewSmallFont : SmallFont; if (font == nullptr) return; // Without an initialized font we cannot handle the message (this is for those which come here before the font system is ready.) if (AddType == APPENDLINE && Text.Size() > 0 && Text[Text.Size() - 1].PrintLevel == printlevel) @@ -1086,7 +1071,7 @@ void FNotifyBuffer::Draw() line = Top; canskip = true; - FFont *font = hud_generic ? NewSmallFont : SmallFont; + FFont *font = generic_ui ? NewSmallFont : SmallFont; lineadv = font->GetHeight (); for (unsigned i = 0; i < Text.Size(); ++ i) @@ -1109,7 +1094,7 @@ void FNotifyBuffer::Draw() else color = PrintColors[notify.PrintLevel]; - int scale = active_con_scaletext(generic_hud); + int scale = active_con_scaletext(generic_ui); if (!center) screen->DrawText (font, color, 0, line, notify.Text, DTA_VirtualWidth, screen->GetWidth() / scale, diff --git a/src/d_main.cpp b/src/d_main.cpp index 7cf6cbd8f..0400a12fe 100644 --- a/src/d_main.cpp +++ b/src/d_main.cpp @@ -858,7 +858,7 @@ void D_Display () screen->DrawTexture (tex, x, 4, DTA_CleanNoMove, true, TAG_DONE); if (paused && multiplayer) { - FFont *font = generic_hud? NewSmallFont : SmallFont; + FFont *font = generic_ui? NewSmallFont : SmallFont; pstring << ' ' << players[paused - 1].userinfo.GetName(); screen->DrawText(font, CR_RED, (screen->GetWidth() - font->StringWidth(pstring)*CleanXfac) / 2, diff --git a/src/doomstat.h b/src/doomstat.h index b885c8a6a..da160f01e 100644 --- a/src/doomstat.h +++ b/src/doomstat.h @@ -254,6 +254,6 @@ EXTERN_CVAR (Int, compatflags2); extern FString LumpFilterIWAD; // These control whether certain items use generic text output instead of game-specific one. -extern bool generic_hud, generic_ui; +extern bool generic_ui; #endif diff --git a/src/g_cvars.cpp b/src/g_cvars.cpp index 433b88888..0146c4abf 100644 --- a/src/g_cvars.cpp +++ b/src/g_cvars.cpp @@ -132,6 +132,20 @@ CUSTOM_CVAR(Float, teamdamage, 0.f, CVAR_SERVERINFO | CVAR_NOINITCALL) } } +bool generic_ui; + +void UpdateGenericUI(bool cvar) +{ + auto switchstr = GStrings["USE_GENERIC_FONT"]; + generic_ui = (cvar || (switchstr && strtoll(switchstr, nullptr, 0))); +} + +CUSTOM_CVAR(Bool, ui_generic, false, 0) // This is for allowing to test the generic font system with all languages +{ + UpdateGenericUI(self); +} + + CUSTOM_CVAR(String, language, "auto", CVAR_ARCHIVE | CVAR_NOINITCALL | CVAR_GLOBALCONFIG) { GStrings.UpdateLanguage(); @@ -140,4 +154,5 @@ CUSTOM_CVAR(String, language, "auto", CVAR_ARCHIVE | CVAR_NOINITCALL | CVAR_GLOB // does this even make sense on secondary levels...? if (Level->info != nullptr) Level->LevelName = Level->info->LookupLevelName(); } + UpdateGenericUI(ui_generic); } diff --git a/src/g_statusbar/hudmessages.cpp b/src/g_statusbar/hudmessages.cpp index fc495bac8..c6eda73c5 100644 --- a/src/g_statusbar/hudmessages.cpp +++ b/src/g_statusbar/hudmessages.cpp @@ -197,7 +197,7 @@ DHUDMessage::DHUDMessage (FFont *font, const char *text, float x, float y, int h Top = y; HoldTics = (int)(holdTime * TICRATE); Tics = -1; // -1 to compensate for one additional Tick the message will receive. - Font = font? font : generic_hud? NewSmallFont : SmallFont; + Font = font? font : generic_ui? NewSmallFont : SmallFont; TextColor = textColor; State = 0; SourceText = copystring (text); diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 37f07f89f..85f0ae665 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -572,7 +572,7 @@ static void DrawAMText(FFont *fnt, int color, const char *text, int vwidth, int void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight) { auto scale = GetUIScale(hud_scale); - auto font = generic_hud ? NewSmallFont : SmallFont; + auto font = generic_ui ? NewSmallFont : SmallFont; auto vwidth = screen->GetWidth() / scale; auto vheight = screen->GetHeight() / scale; auto fheight = font->GetHeight(); @@ -1168,7 +1168,7 @@ void DBaseStatusBar::DrawLog () if (CPlayer->LogText.IsNotEmpty()) { // This uses the same scaling as regular HUD messages - auto scale = active_con_scaletext(generic_hud); + auto scale = active_con_scaletext(generic_ui); hudwidth = SCREENWIDTH / scale; hudheight = SCREENHEIGHT / scale; FFont *font = C_GetDefaultHUDFont(); diff --git a/src/v_video.cpp b/src/v_video.cpp index 177caf384..2afc45e3e 100644 --- a/src/v_video.cpp +++ b/src/v_video.cpp @@ -922,5 +922,4 @@ DEFINE_GLOBAL(CleanXfac_1) DEFINE_GLOBAL(CleanYfac_1) DEFINE_GLOBAL(CleanWidth_1) DEFINE_GLOBAL(CleanHeight_1) -DEFINE_GLOBAL(generic_hud) DEFINE_GLOBAL(generic_ui) diff --git a/wadsrc/static/language.csv b/wadsrc/static/language.csv index 133460a47..64db35389 100644 --- a/wadsrc/static/language.csv +++ b/wadsrc/static/language.csv @@ -392,7 +392,7 @@ demonów do stostowania!","Por favor não vá embora, há mais demônios para matar!","Пожалуйста, не уходи! Тут ещё много демонов!","Молим те, не одлази, има још демона да се побије!" "Let's beat it -- this is turning -into a bloodbath!",QUITMSG2,,,,Doraž to -- tohle se mění na krvavou koupel!,Lass es uns beenden - das wird zu einem Blutbad,"Aceptémoslo, +into a bloodbath!",QUITMSG2,,,,Doraž to -- tohle se mění na krveprolití!,Lass es uns beenden - das wird zu einem Blutbad,"Aceptémoslo, ¡esto se está volviendo en un baño de sangre!",,"Fichons le camp, ça dégénère en bain de sang!","Tűnjünk innen, ebből vérfürdő lesz!","Ammettiamolo - tutto ciò si sta trasformando in un bagno di sangue!",그냥 나가자고- 유혈사태가 곧 시작될 것 같으니!,"Zbijmy to -- to się zamienia @@ -655,18 +655,18 @@ You need all the keys,PD_ALLKEYS,,,,Potřebuješ všechny klíče.,Du brauchst a %k loses another friend.,OB_FRIENDLY4,,,,%k ztratil dalšího přítele.,%k hat wieder einen Freund verloren.,%k pierde otro amigo.,,%k a perdu un autre ami.,%k elveszít egy másik barátot.,%k perde un altro amico.,%o 은(는) 친구를 원치 않았다.,,%k perde mais um amigo.,Игрок %k потерял ещё одного друга., ,,Blood Bath Announcer,,,,,,,,,,,,,, %k boned %o like a fish,BBA_BONED,,,,,%k hat %o zerlegt wie einen Fisch,%k deshuesó a %o como a un pescado,,%k désossa %o comme un poisson,%k kifilézte %o -t mint a halat,%k ha dissossato %o come un pesce,%k 은(는) %o 의 뼈를 발랐다.,,%k desossou %o como um peixe,Игрок %k пересчитал косточки игрока %o, -%k castrated %o,BBA_CASTRA,,,,,%k hat %o kastriert,%k castró a %o,,%k castra %o,%k kasztrálta %o -t,%k ha castrato %o,%k 은(는) %o 을(를) 거세시켰다.,,%k castrou %o,Игрок %k кастрировал игрока %o, +%k castrated %o,BBA_CASTRA,,,,%k vykastroval %o,%k hat %o kastriert,%k castró a %o,,%k castra %o,%k kasztrálta %o -t,%k ha castrato %o,%k 은(는) %o 을(를) 거세시켰다.,,%k castrou %o,Игрок %k кастрировал игрока %o, %k creamed %o,BBA_CREAMED,,,,,%k hat %o eingeseift,%k cremó a %o,,%k a battu %o à plate couture ,%k elkente %o -t,%k ha cremato %o,%k 은(는) %o 을(를) 양념시켰다.,,%k fez creme de %o,Игрок %k взбил игрока %o, %k decimated %o,BBA_DECIMAT,,,,,%k hat %o dezimiert,%k diezmó a %o,,%k a décimé %o,%k megtizedelte %o -t,%k ha decimato %o,%k 은(는) %o 을(를) 망가뜨렸다.,,%k decimou %o,Игрок %k скосил игрока %o, -%k destroyed %o,BBA_DESTRO,,,,,%k hat %o zerstört,%k destruyó a %o,,%k a détruit %o,%k elpusztította %o -t,%k ha distrutto %o,%k 은(는) %o 을(를) 파괴했다.,,%k destruiu %o,Игрок %k уничтожил игрока %o, +%k destroyed %o,BBA_DESTRO,,,,%k zničil %o,%k hat %o zerstört,%k destruyó a %o,,%k a détruit %o,%k elpusztította %o -t,%k ha distrutto %o,%k 은(는) %o 을(를) 파괴했다.,,%k destruiu %o,Игрок %k уничтожил игрока %o, %k diced %o,BBA_DICED,,,,,%k hat %o in Würfel zerteilt,%k picó en cubitos a %o,,%k a coupé en dés %o,%k felkockázta %o -t,%k ha tagliato a cubetti %o,%k 은(는) %o 을(를) 잘게 잘게 썰었다.,,%k fez picadinho de %o,Игрок %k разрезал игрока %o, %k disembowled %o,BBA_DISEMBO,,,,,%k hat %o ausgeweidet,%k destripó a %o,,%k a étripé %o,%k kibelezve,%k ha smembrato %o,%k 은(는) %o 의 내장을 도려냈다.,,%k estripou %o,Игрок %k выпотрошил игрока %o, %k flattened %o,BBA_FLATTE,,,,,%k hat %o dem Erdboden gleichgemacht,%k aplanó a %o,,%k a aplati %o,%k kilapítva,%k ha schiacciato %o,%k 은(는) %o 의 코를 납작하게 만들었다.,,%k achatou %o,Игрок %k сплюснул игрока %o, %k gave %o Anal Justice,BBA_JUSTICE,,,,,%k hat %o anale Gerechtigkeit gegeben,%k le dió Justicia Anal a %o,,%k a rendu une justice anale a %o,%k %o -nak Anális Igazságot adott,%k ha dato a %o Giustizia Anale,%k 은(는) %o 에게 홍콩행을 보냈다.,,%k deu Justiça Anal a %o,Игрок %k устроил Анальное Правосудие игроку %o, %k gave AnAl MaDnEsS to %o,BBA_MADNESS,,,,,%k gab %o AnAlEn WaHnSiNn,%k le dió LoCuRa AnAl a %o,,%k a donné la FOLIE ANALE a %o,%k %o -nak Seggbe Durrantott,%k ha dato FoLlIa AnAle a %o,%o 은(는) %k 의 찰진 맛을 보았다.,,%k deu LoUcUrA aNaL a %o,Игрок %k устроил АнАЛ КаРнаВаЛ игроку %o, -%k killed %o,BBA_KILLED,,,,,%k hat %o getötet,%k mató a %o,,%k a tué %o,%k kicsinálta %o -t,%k ha ucciso %o,%k 은(는) %o 을(를) 죽였다.,,%k matou %o,Игрок %k убил игрока %o, +%k killed %o,BBA_KILLED,,,,%k zabil %o,%k hat %o getötet,%k mató a %o,,%k a tué %o,%k kicsinálta %o -t,%k ha ucciso %o,%k 은(는) %o 을(를) 죽였다.,,%k matou %o,Игрок %k убил игрока %o, %k made mincemeat out of %o,BBA_MINCMEAT,,,,,%k hat %o zu Hackfleisch verarbeitet,%k hizo picadillo de %o,,%k a fait de la viande hachée de %o,%k darálthúst csinált %o -ból,%k ha triturato %o,%o 은(는) %k 에 의해 분쇄됐다.,,%k fez carne moída de %o,Игрок %k сделал отбивную из игрока %o, -%k massacred %o,BBA_MASSACR,,,,,%k hat %o niedergemetzelt,%k masacró a %o,,%k a massacré %o,%k lemészárolta %o -t,%k ha fatto di %o carne tritata,%k 은(는) %o 을(를) 참살했다.,,%k massacrou %o,Игрок %k устроил бойню игроку %o, +%k massacred %o,BBA_MASSACR,,,,%k zmasakroval %o,%k hat %o niedergemetzelt,%k masacró a %o,,%k a massacré %o,%k lemészárolta %o -t,%k ha fatto di %o carne tritata,%k 은(는) %o 을(를) 참살했다.,,%k massacrou %o,Игрок %k устроил бойню игроку %o, %k mutilated %o,BBA_MUTILA,,,,,%k hat %o verstümmelt,%k mutiló a %o,,%k a mutilé %o,%k megcsonkította %o -t,%k ha massacrato %o,%k 은(는) %o 의 팔다리를 절단했다.,,%k mutilou %o,Игрок %k изуродовал игрока %o, %k reamed %o,BBA_REAMED,,,,,%k hat %o aufgerieben,%k escarió a %o,,%k a découpé en fines lamelles %o,%k seggbe rakta %o -t,%k ha squartato %o,%k 은(는) %o 을(를) 크게 혼냈다.,,%k esquartejou %o,Игрок %k просверлил игрока %o, %k ripped %o a new orifice,BBA_RIPPED,,,,,%k hat %o eine neue Körperöffnung verpasst,%k le hizo a %o un nuevo orificio,,%k a ouvert un nouvel orifice a %o,,%k ha aperto a %o un altro orifizio,%k 은(는) %o 을(를) 죽여 뜯어서 작품을 만들었다.,,%k abriu um novo orifício em %o,Игрок %k проделал новое отверстие в игроке %o, @@ -678,28 +678,28 @@ You need all the keys,PD_ALLKEYS,,,,Potřebuješ všechny klíče.,Du brauchst a %k throttled %o,BBA_THROTTL,,,,,%k hat %o erdrosselt,%k aceleró a %o,,%k a étouffé %o,,%k ha strozzato %o,%k 은(는) %o 을(를) 목 졸라 죽였다.,,%k estrangulou %o,Игрок %k задушил игрока %o, %k wasted %o,BBA_WASTED,,,,,%k hat %o verbraucht,%k desechó a %o,,%k a décharné %o,,%k ha distrutto %o,%k 은(는) %o 을(를) 쓰레기처럼 내다 버렸다.,,%k detonou %o,Игрок %k замочил игрока %o, %k body bagged %o,BBA_BODYBAG,,,,,%k hat %o eingesackt,%k embolsó a %o,,%k a placé %o dans son linceul,,%k ha mandato %o all'obitorio,%k 은(는) %o 의 장례식을 치렀다.,,%k mandou %o para o necrotério,Игрок %k упаковал игрока %o в мешок для трупов, -%k sent %o to Hell,BBA_HELL,,,,,%k hat %o zur Hölle fahren lassen,%k envió a %o al infierno,,%k a envoyé %o en enfer,,%k ha spedito %o all'Inferno,%o 은(는) %k 덕에 지옥으로 돌아갔다.,,%k mandou %o para o Inferno,Игрок %k отправил в Ад игрока %o, -%k toasted %o,BBA_TOAST,,,,,%k hat %o geröstet,%k tostó a %o,,%k a grillé %o,%k megpirította %o -t,%k ha arrostito %o,%o 은(는) %k 덕에 맛있게 구워졌다.,,%k tostou %o,Игрок %k поджарил игрока %o, +%k sent %o to Hell,BBA_HELL,,,,%k poslal %o do pekel,%k hat %o zur Hölle fahren lassen,%k envió a %o al infierno,,%k a envoyé %o en enfer,,%k ha spedito %o all'Inferno,%o 은(는) %k 덕에 지옥으로 돌아갔다.,,%k mandou %o para o Inferno,Игрок %k отправил в Ад игрока %o, +%k toasted %o,BBA_TOAST,,,,%k upekl %o,%k hat %o geröstet,%k tostó a %o,,%k a grillé %o,%k megpirította %o -t,%k ha arrostito %o,%o 은(는) %k 덕에 맛있게 구워졌다.,,%k tostou %o,Игрок %k поджарил игрока %o, %k snuffed %o,BBA_SNUFF,,,,,%k hat %o vernichtet,%k aspiró a %o,,%k a crevé %o,,%k ha spento %o,%o 은(는) %k 에 의해 짓눌려졌다.,,%k apagou %o,Игрок %k прикончил игрока %o, %k hosed %o,BBA_HOSED,,,,,%k hat %o eingetütet,%k se cargó a %o,,%k a arrosé %o,,%k l'ha fatta sopra %o,%k 은(는) %o 을(를) 패배로 씻겼다.,,%k metralhou %o,Игрок %k расстрелял игрока %o, %k sprayed %o,BBA_SPRAYED,,,,,%k hat %o pulverisiert,%k pulverizó a %o,,%k a pulvérise %o,,%k ha vaporizzato %o,%o 의 피는 %k 의 물감으로 쓰였다.,,%k pulverizou %o,Игрок %k распылил игрока %o, %k made dog meat out of %o,BBA_DOGMEAT,,,,,%k hat Hundefutter aus %o gemacht,%k hizo comida para perro de %o,,%k a fait de la pâtée pour chien de %o,,%k ha fatto di %o polpette,%k 은(는) %o 로 개밥을 만들었다.,,%k fez almôndegas de %o,Игрок %k скормил псам игрока %o, %k beat %o like a cur,BBA_BEATEN,,,,,%k hat %o wie einen Hund geschlagen,%k pateó a %o como a un perro callejero,,%k a battu %o,,%k ha battuto %o come un cane,%o 은(는) %k 에게 똥개처럼 맞았다.,,%k espancou %o como um cachorro,Игрок %k сделал игрока %o как худую свинью, %o is excrement,BBA_EXCREMENT,,,,,%o wurde zu Exkrement verarbeitet,%o es excremento,,%o est une merde,,%o è un escremento,%o 은(는) 배설물이 되었다.,,%o virou escremento,%o теперь экскремент, -%o is hamburger,BBA_HAMBURGER,,,,,%o ist Hamburger,%o es una hamburguesa,,%o est un hamburger,,%o è un hamburger,%o 은(는) 고기 반죽이 되었다.,,%o virou hamburguer,%o теперь гамбургер, +%o is hamburger,BBA_HAMBURGER,,,,%o je hamburger,%o ist Hamburger,%o es una hamburguesa,,%o est un hamburger,,%o è un hamburger,%o 은(는) 고기 반죽이 되었다.,,%o virou hamburguer,%o теперь гамбургер, %o suffered scrotum separation,BBA_SCROTUM,,,,,%k hat %os Eier gebraten,%o sufrió separación de escroto,,%o a souffert d'une séparation du scrotum,,%o ha subito la separazione dello scroto,%o 은(는) 고자가 되었다.,,%o sofreu separação de escroto,%o страдает от потери тестикул, %o volunteered for population control,BBA_POPULATION,,,,,%o hat sich freiwillig zur Bevölkerungskontrolle gemeldet,%o fue voluntario para control de población,,%o s'est proposé pour un contrôle de la population,,%o si è offerto per il controllo della popolazione,%o 은(는) 자연에 의해 낙태 당했다.,,%o se voluntariou para o controle populacional,%o борется с перенаселением, -%o has suicided,BBA_SUICIDE,,,,,%o hat Selbstmord begangen,%o se ha suicidado,,%o s'est suicidé,%o öngyilkos lett,%o si è suicidato,%o 은(는) 한심하게 자살했다.,,%o se suicidou,Игрок %o самоубился, -%o received the Darwin Award,BBA_DARWIN,,,,,%o hat den Darwinpreis erhalten,%o recibió el premio Darwin,,%o a recu la médaille Darwin,És a Darwin Díj nyertese : %o,%o ha ricevuto il Darwin Award,%o 은(는) 다윈상을 받을 자격이 있다.,,%o recebeu o Prêmio Darwin,Игрок %o получил премию Дарвина, +%o has suicided,BBA_SUICIDE,,,,%o se zavraždil,%o hat Selbstmord begangen,%o se ha suicidado,,%o s'est suicidé,%o öngyilkos lett,%o si è suicidato,%o 은(는) 한심하게 자살했다.,,%o se suicidou,Игрок %o самоубился, +%o received the Darwin Award,BBA_DARWIN,,,,%o dostal darwinovu cenu,%o hat den Darwinpreis erhalten,%o recibió el premio Darwin,,%o a recu la médaille Darwin,És a Darwin Díj nyertese : %o,%o ha ricevuto il Darwin Award,%o 은(는) 다윈상을 받을 자격이 있다.,,%o recebeu o Prêmio Darwin,Игрок %o получил премию Дарвина, ,,Cheats,,,,,,,,,,,,,, -Music Change,STSTR_MUS,,,,,Musikwechsel,Cambio de música,,Changement de Musique,Zene Váltás,Cambio di musica,음악 전환,Zmieniono muzykę,Trocando música...,Смена музыки,Промена музике -Impossible Selection,STSTR_NOMUS,,,,,Falsche Auswahl,SELECCIÓN IMPOSIBLE,,Séléction Impossible!,Lehetetlen Kiválasztás,Selezione impossibile,불가능한 선택입니다,Niemożliwy wybór,Seleção impossível,НЕКОРРЕКТНЫЙ ВЫБОР,НЕМОГУЋИ ИЗБОР -Degreelessness Mode ON,STSTR_DQDON,,,,,Unverwundbarkeit AN,Modo de estado sin grado ACTIVADO,,Invulnérabilité ON ,Sérthetetlenség Mód BE,Modalità Invincibilità ATTIVATA,무미건조한 모드 켬,Niewrażliwość WŁĄCZONA,Modo invencível ATIVADO,Неуязвимость включена,Нерањивост УКЉУЧЕНА -Degreelessness Mode OFF,STSTR_DQDOFF,,,,,Unverwundbarkeit AUS,Modo de estado sin grado DESACTIVADO,,Invulnérabilité OFF,Sérthetetlenség Mód KI,Modalità Invincibilità DISATTIVATA,무미건조한 모드 끔,Niewrażliwość WYŁĄCZONA,Modo invencível DESATIVADO,Неуязвимость отключена,Нерањивост ИСКЉУЧЕНА -Ultimate Degreelessness Mode ON,STSTR_DQD2ON,,,,,Ultimative Unverwundbarkeit AN,Modo de estado sin grado final ACTIVADO,,Parfaite Invulnérabilité ON,Tökéletes Sérthetetlenség Mód BE,Modalità Invincibilità Ultima ATTIVATA,엄청나게 무미건조한 모드 켬,Maksymalna niewrażliwość WŁĄCZONA,Modo invencível supremo ATIVADO,Полная неуязвимость включена,Ултимативна нерањивост УКЉУЧЕНА -Ultimate Degreelessness Mode OFF,STSTR_DQD2OFF,,,,,Ultimative Unverwundbarkeit AUS,Modo de estado sin grado final DESACTIVADO,,Parfaite Invulnérabilité OFF,Tökéletes Sérthetetlenség Mód KI,Modalità Invincibilità Ultima DISATTIVATA,엄청나게 무미건조한 모드 끔,Maksymalna niewrażliwość WYŁĄCZONA,Modo invencível supremo DESATIVADO,Полная неуязвимость отключена,Ултимативна нерањивост ИСКЉУЧЕНА -Very Happy Ammo Added,STSTR_KFAADDED,,,,,Munition hinzugefügt,Munición añadida hasta el tope,,Armement Maximum!,Összes Lőszer Megadva,Equipaggiamento Completato,아주 행복한 탄약 추가됨,Bardzo szczęśliwa amunicja dodana,Equipamento completo,Боезапас пополнен,Веома Срећна Муниција Додана -Ammo (no keys) Added,STSTR_FAADDED,,,,,Munition (keine Schlüssel) hinzugefügt,Munición añadida (sin llaves),,Arsenal ajouté. (Pas de clés!),Lőszer (nincsenek kulcsok) Megadva,Equipaggiamento Completato (senza chiavi),탄약(열쇠 없이) 추가됨,Amunicja (bez kluczy) dodana,Equipamento completo (sem chaves),Боезапас пополнен (без ключей),Муниција (без кључева) Додана +Music Change,STSTR_MUS,,,,Hudba změněna,Musikwechsel,Cambio de música,,Changement de Musique,Zene Váltás,Cambio di musica,음악 전환,Zmieniono muzykę,Trocando música...,Смена музыки,Промена музике +Impossible Selection,STSTR_NOMUS,,,,Nemožný výběr,Falsche Auswahl,SELECCIÓN IMPOSIBLE,,Séléction Impossible!,Lehetetlen Kiválasztás,Selezione impossibile,불가능한 선택입니다,Niemożliwy wybór,Seleção impossível,НЕКОРРЕКТНЫЙ ВЫБОР,НЕМОГУЋИ ИЗБОР +Degreelessness Mode ON,STSTR_DQDON,,,,Nesmrtelnost zapnuta,Unverwundbarkeit AN,Modo de estado sin grado ACTIVADO,,Invulnérabilité ON ,Sérthetetlenség Mód BE,Modalità Invincibilità ATTIVATA,무미건조한 모드 켬,Niewrażliwość WŁĄCZONA,Modo invencível ATIVADO,Неуязвимость включена,Нерањивост УКЉУЧЕНА +Degreelessness Mode OFF,STSTR_DQDOFF,,,,Nesmrtelnost vypnuta,Unverwundbarkeit AUS,Modo de estado sin grado DESACTIVADO,,Invulnérabilité OFF,Sérthetetlenség Mód KI,Modalità Invincibilità DISATTIVATA,무미건조한 모드 끔,Niewrażliwość WYŁĄCZONA,Modo invencível DESATIVADO,Неуязвимость отключена,Нерањивост ИСКЉУЧЕНА +Ultimate Degreelessness Mode ON,STSTR_DQD2ON,,,,Ultimátní nesmrtelnost zapnuta,Ultimative Unverwundbarkeit AN,Modo de estado sin grado final ACTIVADO,,Parfaite Invulnérabilité ON,Tökéletes Sérthetetlenség Mód BE,Modalità Invincibilità Ultima ATTIVATA,엄청나게 무미건조한 모드 켬,Maksymalna niewrażliwość WŁĄCZONA,Modo invencível supremo ATIVADO,Полная неуязвимость включена,Ултимативна нерањивост УКЉУЧЕНА +Ultimate Degreelessness Mode OFF,STSTR_DQD2OFF,,,,ultimátní nesmrtelnost vypnuta,Ultimative Unverwundbarkeit AUS,Modo de estado sin grado final DESACTIVADO,,Parfaite Invulnérabilité OFF,Tökéletes Sérthetetlenség Mód KI,Modalità Invincibilità Ultima DISATTIVATA,엄청나게 무미건조한 모드 끔,Maksymalna niewrażliwość WYŁĄCZONA,Modo invencível supremo DESATIVADO,Полная неуязвимость отключена,Ултимативна нерањивост ИСКЉУЧЕНА +Very Happy Ammo Added,STSTR_KFAADDED,,,,Velmi štastná munice přidána,Munition hinzugefügt,Munición añadida hasta el tope,,Armement Maximum!,Összes Lőszer Megadva,Equipaggiamento Completato,아주 행복한 탄약 추가됨,Bardzo szczęśliwa amunicja dodana,Equipamento completo,Боезапас пополнен,Веома Срећна Муниција Додана +Ammo (no keys) Added,STSTR_FAADDED,,,,Munice (bez klíčú) přidána,Munition (keine Schlüssel) hinzugefügt,Munición añadida (sin llaves),,Arsenal ajouté. (Pas de clés!),Lőszer (nincsenek kulcsok) Megadva,Equipaggiamento Completato (senza chiavi),탄약(열쇠 없이) 추가됨,Amunicja (bez kluczy) dodana,Equipamento completo (sem chaves),Боезапас пополнен (без ключей),Муниција (без кључева) Додана No Clipping Mode ON,STSTR_NCON,,,,,Nicht-Kollisionsmodus AN,Modo de traspaso ACTIVADO,,Collisions OFF,Falonátmenés Mód BE,No Clipping ATTIVATO,노 클립 모드 켬,Tryb no-clip WŁĄCZONY,Modo sem colisão ATIVADO,Прохождение сквозь стены ВКЛЮЧЕНО,Пролажење кроз зидове УКЉУЧЕНО No Clipping Mode OFF,STSTR_NCOFF,,,,,Nicht-Kollisionsmodus AUS,Modo de traspaso DESACTIVADO,,Collisions ON,Falonátmenés Mód KI,No Clipping DISATTIVATO,노 클립 모드 끔,Tryb no-clip WYŁĄCZONY,Modo sem colisão DESATIVADO,Прохождение сквозь стены ОТКЛЮЧЕНО,Пролажење кроз зидове ИСКЉУЧЕНО No Clipping Mode 2 ON,STSTR_NC2ON,,,,,Nicht-Kollisionsmodus 2 AN,Modo de traspaso 2 ACTIVADO,,Collisions 3D OFF,Falonátmenés 2. Mód BE,No Clipping 2 ATTIVATO,노 클립 모드 2 켬,Drugi tryb no-clip WŁĄCZONY,Modo sem colisão 2 ATIVADO,Полёт сковозь стены ВКЛЮЧЁН,Секундарни режим пролажења кроз зидове УКЉУЧЕНО @@ -871,7 +871,7 @@ You need a blue skull to open this door,PD_BLUES,,,,,"Du brauchst einen blauen S You need a red skull to open this door,PD_REDS,,,,,"Du brauchst einen roten Schädel-Schlüssel, um diese Tür zu öffnen",Necesitas una calavera roja para abrir esta puerta,Necesitas un cráneo rojo para abrir esta puerta,Il vous faut un crâne rouge pour ouvrir cette porte.,"Egy piros koponya szükséges, hogy kinyisd ezt az ajtót.",Ti serve una chiave-teschio rossa per aprire questa porta,이 문을 열기 위해선 적색 해골이 필요합니다,"Potrzebujesz czerwonej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio vermelha para abrir essa porta,Для активации нужен красный череп,Треба вам црвена лобања да би отворили ова врата You need a yellow skull to open this door,PD_YELLOWS,,,,,"Du brauchst einen gelben Schädel-Schlüssel, um diese Tür zu öffnen",Necesitas una calavera amarillo para abrir esta puerta,Necesitas un cráneo amarillo para abrir esta puerta,Il vous faut un crâne jaune pour ouvrir cette porte.,Ezt az ajtót egy sárga koponya nyitja.,Ti serve una chiave-teschio gialla per aprire questa porta,이 문을 열기 위해선 황색 해골이 필요합니다,"Potrzebujesz żółtej czaszki, aby otworzyć te drzwi",Você precisa de uma chave-crânio amarela para abrir essa porta,Для активации нужен жёлтый череп,Треба вам жута лобања да би отворили ова врата ,,Cast call names,,,,,,,,,,,,,, -Zombieman,CC_ZOMBIE,,,,Zombiemuž,Zombie,Zombi,,Zombie,Zombi,Zombie Marine,좀비맨,Zombie,Fuzileiro Possuído,Зомби, +Zombieman,CC_ZOMBIE,,,,Zombík,Zombie,Zombi,,Zombie,Zombi,Zombie Marine,좀비맨,Zombie,Fuzileiro Possuído,Зомби, Shotgun Guy,CC_SHOTGUN,,,,Brokovničář,Schütze,Tipo de Escopeta,Tipo de la escopeta,Type au Fusil,Őrmester,Zombie Sergente,샷건 가이,Zombie-sierżant,Sargento Possuído,Зомби-сержант, Heavy Weapon Dude,CC_HEAVY,,,,Kulometář,MG-Schütze,Tipo de Armas Pesadas,Ametrallador,Type au Gros Flingue,Gépágyús pasas,Zombie Commando,헤비 웨폰 듀드,Strzelec,Comando Possuído,Пулемётчик, Imp,CC_IMP,,,,Skřet,Kobold,,,Diablotin,Kobold,Imp,임프,Chochlik,Diabrete,Имп, @@ -889,7 +889,7 @@ The Spider Mastermind,CC_SPIDER,,,,Pavoučí Génius,Der Spinnenmeister,Mente-Ma The Cyberdemon,CC_CYBER,,,,Kyberdémon,Der Cyberdämon,El Ciberdemonio,,Le Cyberdémon,A Kiberdémon,Il Cyberdemonio,사이버데몬,Cyberdemon,O Ciberdemônio,Кибердемон, Our Hero,CC_HERO,,,,Náš Hrdina,Unser Held,Nuestro héroe,,Notre Héros,Hősünk,Il Nostro eroe,우리들의 영웅,Nasz bohater,Nosso Herói,Наш герой, ,,Actor tag names,,,,,,,,,,,,,, -Zombieman,FN_ZOMBIE,,,,Zombiemuž,Zombie,Zombi,,Zombie,zombi,Zombie Marine,좀비맨,Zombie,Fuzileiro Possuído,Зомби, +Zombieman,FN_ZOMBIE,,,,Zombík,Zombie,Zombi,,Zombie,zombi,Zombie Marine,좀비맨,Zombie,Fuzileiro Possuído,Зомби, Sergeant,FN_SHOTGUN,,,,Seržant,Schütze,Sargento,,Type au Fusil,őrmester,Zombie Sergente,샷건 가이,Zombie-sierżant,Sargento Possuído,Сержант, Chaingunner,FN_HEAVY,,,,Kulometář,MG-Schütze,Ametrallador,,Type au Gros Flingue,gépágyús,Zombie Commando,체인거너,Strzelec,Comando Possuído,Пулемётчик, Imp,FN_IMP,,,,Skřet,Kobold,,,Diablotin,kobold,Imp,임프,Chochlik,Diabrete,Имп, @@ -1974,10 +1974,10 @@ Fire,CNTRLMNU_ATTACK,,,,,Feuer,Fuego,,Tirer,Tűz,Fuoco,공격,,Atirar,Атака Secondary Fire,CNTRLMNU_ALTATTACK,,,,,Alternativfeuer,Fuego secundario,,Tir Secondaire,Másodlagos tüzelés,Fuoco secondario,보조 공격,,Tiro Secundário,Вторичная атака,Секундарни напад Weapon Reload,CNTRLMNU_RELOAD,,,,,Waffe nachladen,Recargar,,Recharger Arme,Fegyver újratöltése,Ricarica dell'arma,무기 장전,,Recarregar Arma,Перезарядка,Напуни Weapon Zoom,CNTRLMNU_ZOOM,,,,,Waffenzoom,Zoom del arma,,Zoom avec Arme,Közelítés fegyverrel,Zoom dell'arma,무기 조준,,Zoom da Arma,Приближение,Зум -Weapon State 1,CNTRLMNU_USER1,,,,,Waffen-Aktion 1,Estado del arma 1,,Etat d'Arme 1,Fegyver 1. állapot,Stato dell'arma 1,무기 상태 1,,Estado da Arma 1,Положение оружия 1,Стање оружја 1 -Weapon State 2,CNTRLMNU_USER2,,,,,Waffen-Aktion 2,Estado del arma 2,,Etat d'Arme 2,Fegyver 2. állapot,Stato dell'arma 2,무기 상태 2,,Estado da Arma 2,Положение оружия 2,Стање оружја 2 -Weapon State 3,CNTRLMNU_USER3,,,,,Waffen-Aktion 3,Estado del arma 3,,Etat d'Arme 3,Fegyver 3. állapot,Stato dell'arma 3,무기 상태 3,,Estado da Arma 3,Положение оружия 3,Стање оружја 3 -Weapon State 4,CNTRLMNU_USER4,,,,,Waffen-Aktion 4,Estado del arma 4,,Etat d'Arme 4,Fegyver 4. állapot,Stato dell'arma 4,무기 상태 4,,Estado da Arma 4,Положение оружия 4,Стање оружја 4 +Weapon State 1,CNTRLMNU_USER1,,,,,Waffen-Aktion 1,Estado del arma 1,,Etat d'Arme 1,Fegyver 1. állapot,Stato dell'arma 1,무기 상태 1,,Estado da Arma 1,Положение оружия (1),Стање оружја (1) +Weapon State 2,CNTRLMNU_USER2,,,,,Waffen-Aktion 2,Estado del arma 2,,Etat d'Arme 2,Fegyver 2. állapot,Stato dell'arma 2,무기 상태 2,,Estado da Arma 2,Положение оружия (2),Стање оружја (2) +Weapon State 3,CNTRLMNU_USER3,,,,,Waffen-Aktion 3,Estado del arma 3,,Etat d'Arme 3,Fegyver 3. állapot,Stato dell'arma 3,무기 상태 3,,Estado da Arma 3,Положение оружия (3),Стање оружја (3) +Weapon State 4,CNTRLMNU_USER4,,,,,Waffen-Aktion 4,Estado del arma 4,,Etat d'Arme 4,Fegyver 4. állapot,Stato dell'arma 4,무기 상태 4,,Estado da Arma 4,Положение оружия (4),Стање оружја (4) Use / Open,CNTRLMNU_USE,,,,,Benutzen / Öffnen,Usar / Abrir,,Utiliser/Ouvrir,Használ / Ajtónyitás,Usa / Apri,사용/열기,,Usar / Abrir,Использовать/открыть,Користи / Отвори Move forward,CNTRLMNU_FORWARD,,,,,Vorwärts bewegen,Avanzar,,Avancer,Előre mozgás,Movimento in Avanti,앞으로 이동,,Mover para frente,Движение вперёд,Крећи се напред Move backward,CNTRLMNU_BACK,,,,,Rückwarts bewegen,Retroceder,,Reculer,Hátra mozgás,Movimento in Indietro,뒤로 이동,,Mover para trás,Движение назад,Крећи се уназад @@ -2335,9 +2335,9 @@ Weapons stay,GMPLYMNU_WEAPONSSTAY,,,,,Waffen bleiben,Las armas se quedan,,Armes Allow powerups,GMPLYMNU_ALLOWPOWERUPS,,,,,Boni erlauben,Permitir poderes,,Autoriser powerups,,Potenziamenti consentiti,파워 업 허용,,Permitir powerups,Разрешить бонусы, Allow health,GMPLYMNU_ALLOWHEALTH,,,,,Gesundheit erlauben,Permitir salud,,Autoriser objets santé,,Oggetti per la salute consentiti,체력 회복 아이템 허용,,Permitir itens de saúde,Разрешить бонусы к здоровью, Allow armor,GMPLYMNU_ALLOWARMOR,,,Allow armour,,Panzer erlauben,Permitir armadura,,Autoriser objets armure,,Armature consentite,아머 허용,,Permitir itens de armadura,Разрешить броню, -Spawn farthest,GMPLYMNU_SPAWNFARTHEST,,,,,Am weitesten entfernten Punkt erscheinen,Aparecer más lejos,,Apparaître au plus loin,,Spawn il più lontano possibile,먼 곳에서 소환,,Aparecer mais longe,Восстановление подальше от остальных, +Spawn farthest,GMPLYMNU_SPAWNFARTHEST,,,,,Am weitesten entfernten Punkt erscheinen,Aparecer más lejos,,Apparaître au plus loin,,Spawn il più lontano possibile,먼 곳에서 소환,,Aparecer mais longe,Воскрешение подальше от остальных, Same map,GMPLYMNU_SAMEMAP,,,,,Gleiches Level,Mismo mapa,,Même Carte,,Stessa mappa,같은 맵 플레이,,Mesmo mapa,Зациклить уровень, -Force respawn,GMPLYMNU_FORCERESPAWN,,,,,Zurückkehren erzwingen,Forzar reaparición,,Forcer Réapparition,,Forza il respawn,강제 부활,,Forçar reaparecimento,Моментальное восстановление, +Force respawn,GMPLYMNU_FORCERESPAWN,,,,,Zurückkehren erzwingen,Forzar reaparición,,Forcer Réapparition,,Forza il respawn,강제 부활,,Forçar reaparecimento,Моментальное воскрешение, Allow exit,GMPLYMNU_ALLOWEXIT,,,,,Verlassen erlauben,Permitir salir,,Autoriser Sortie,,Uscita consentita,탈출 허용,,Permitir saída,Разрешить выход, Barrels respawn,GMPLYMNU_BARRELSRESPAWN,,,,,Fässer kehren zurück,Reaparecer Barriles,,Réapparition des Tonneaux,,Respawn barili esplosivi,폭발통 재생성,,Barrís reaparecem,Восстановление бочек, Respawn protection,GMPLYMNU_RESPAWNPROTECTION,,,,,Schutzboni kehen zurück,Reaparecer protección,,Protection à la réapparition,,Protezione al respawn,부활시 무적,,Proteção de reaparecimento,Кратковременная защита после воскрешения, @@ -2947,4 +2947,5 @@ Use original Doom explosion behavior,CMPTMNU_EXPLODE2,,,Use original Doom explos Screen Blend Options,HUDMNU_FLASH,,,,,Überblendoptionen,,,Options de blending écran,,Opzioni Blending dello Schermo,화면 조합 설정,,Opções de mescla de tela,Настройки смешивания экрана, Postprocessing,GLMNU_POSTPROCESS,,,,,,Postprocesado,,,,,포스트프로세싱 적용,,Pós processamento,Постобработка, 3D mode,GLMNU_3DMODE,,,,,3D Modus,Modo 3D,,Mode 3D,3D mód,Modalità 3D,3D 모드 적용,,Modo 3D,Режим 3D, -Enable buggy Strife railing,CMPTMNU_RAILINGHACK,,,,,Fehlerhafte Strife-Geländer,Activar barandillas bugueadas de Strife,,Barrières buggées pour Strife,,Abilita il railing buggato di Strife,고전 스트라이프 철책 적용,,Habilitar railing defeituoso do Strife,Вернуть багнутые перила в Strife, \ No newline at end of file +Enable buggy Strife railing,CMPTMNU_RAILINGHACK,,,,,Fehlerhafte Strife-Geländer,Activar barandillas bugueadas de Strife,,Barrières buggées pour Strife,,Abilita il railing buggato di Strife,고전 스트라이프 철책 적용,,Habilitar railing defeituoso do Strife,Вернуть багнутые перила в Strife, +,USE_GENERIC_FONT,This is not a text to be translated but an engine switch for complex languages.,,,,,,,,,,1,,,, \ No newline at end of file diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index aeeadc603..27f534443 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -45,7 +45,6 @@ struct _ native // These are the global variables, the struct is only here to av deprecated("3.8") native readonly bool globalfreeze; native int LocalViewPitch; native readonly @MusPlayingInfo musplaying; - native readonly bool generic_hud; native readonly bool generic_ui; // sandbox state in multi-level setups: diff --git a/wadsrc/static/zscript/ui/menu/messagebox.zs b/wadsrc/static/zscript/ui/menu/messagebox.zs index cd635bfda..fe1fd6320 100644 --- a/wadsrc/static/zscript/ui/menu/messagebox.zs +++ b/wadsrc/static/zscript/ui/menu/messagebox.zs @@ -62,7 +62,7 @@ class MessageBoxMenu : Menu mMouseLeft = 140; mMouseY = 0x80000000; - if (generic_hud) + if (generic_ui) { arrowFont = textFont = NewSmallFont; int factor = (CleanXfac+1) / 2; @@ -83,7 +83,7 @@ class MessageBoxMenu : Menu int mr2 = destWidth/2 + 10 + textFont.StringWidth(Stringtable.Localize("$TXT_NO")); mMouseRight = MAX(mr1, mr2); mParentMenu = parent; - mMessage = textFont.BreakLines(Stringtable.Localize(message), generic_hud? 600 : 300); + mMessage = textFont.BreakLines(Stringtable.Localize(message), generic_ui? 600 : 300); mMessageMode = messagemode; if (playsound) { diff --git a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs index ff92a95ba..c74baec74 100644 --- a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs +++ b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs @@ -743,7 +743,7 @@ class AltHud ui if (withmapname) { - let font = generic_hud? NewSmallFont : SmallFont; + let font = generic_ui? NewSmallFont : SmallFont; int hh = font.GetHeight(); screen.DrawText(font, hudcolor_titl, hudwidth - 6 - font.StringWidth(Level.MapName), ypos, Level.MapName, @@ -942,7 +942,7 @@ class AltHud ui virtual void DrawAutomap(PlayerInfo CPlayer) { - let font = generic_hud? NewSmallFont : SmallFont; + let font = generic_ui? NewSmallFont : SmallFont; int fonth = font.GetHeight() + 1; int bottom = hudheight - 1; diff --git a/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs index 117215259..7d5e42fec 100644 --- a/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs @@ -109,7 +109,7 @@ class StrifeStatusBar : BaseStatusBar override void ShowPop (int popnum) { Super.ShowPop(popnum); - if (popnum == CurrentPop || (popnum == POP_LOG && generic_hud)) + if (popnum == CurrentPop || (popnum == POP_LOG && generic_ui)) { if (popnum == POP_Keys) { @@ -146,7 +146,7 @@ class StrifeStatusBar : BaseStatusBar override bool MustDrawLog(int state) { // Tell the base class to draw the log if the pop screen won't be displayed. - return !generic_hud; + return !generic_ui; } void Reset () diff --git a/wadsrc_extra/static/language.csv b/wadsrc_extra/static/language.csv index 88870f0b7..892c65734 100644 --- a/wadsrc_extra/static/language.csv +++ b/wadsrc_extra/static/language.csv @@ -256,28 +256,28 @@ Guardian of Steel,TXT_HEXEN_MAP05,,,,Strážce oceli,Wächter des Stahls,Guardi Bright Crucible,TXT_HEXEN_MAP06,,,,Světlý Tyglík,Glänzende Feuerprobe,Crisol de Luz,,Creuset Radiant,,Crogiolo Luminoso,빛나는 고난,Próba Światła,Crisol de Luz,,Испытание света,Светлосни лонац Shadow Wood,TXT_HEXEN_MAP13,,,,Stínové Dřevo,Schattenwald,Bosque de la Sombra,,Forêt des Ombres,Árnyék Erdő,Foresta Oscura,그림자 숲,Las Cieni,Floresta das Sombras,,Лес теней,Шума сена Darkmere,TXT_HEXEN_MAP08,,,,,Düstersee,Pantano,,Marais Noir,,Palude Nera,흙빛호수,Mroczne Bagno,Pantâno Negro,,Болотная топь,Мочваре -Caves of Circe,TXT_HEXEN_MAP09,,,,,Circes Höhle,Cuevas de Circe,,Caves de Circé,Körök Barlangja,Grotte di Circe,키르케의 동굴,Jaskinie Kirke,Cavernas de Circe,Peștera lui Circe,Пещеры цирцеи,Пећине цирке +Caves of Circe,TXT_HEXEN_MAP09,,,,Jeskyně kirké,Circes Höhle,Cuevas de Circe,,Caves de Circé,Körök Barlangja,Grotte di Circe,키르케의 동굴,Jaskinie Kirke,Cavernas de Circe,Peștera lui Circe,Пещеры цирцеи,Пећине цирке Wastelands,TXT_HEXEN_MAP10,,,,Pustina,Ödland,Yermo,,Terres Ruinées,Senkiföldje,Terre in rovina,황무지,Pustkowia,Terras Desoladas,,Пустоши,Пустаре Sacred Grove,TXT_HEXEN_MAP11,,,,Posvátní Háj,Heiliger Hain,Arboleda Sagrada,,Bosquet Sacré,,Boschetto Sacro,성스러운 수풀,Święty Gaj,Bosque Sagrado,,Священная роща,Свети шумарак Hypostyle,TXT_HEXEN_MAP12,,,,,Säulenhalle,Hipóstila,,Hypostyle,,Ipostilo,다주실,Hypostyl,Hipostilo,,Гипостильный зал,Хипостил -Heresiarch's Seminary,TXT_HEXEN_MAP27,,,,,Seminar des Erzketzers,Seminario del Heresiarca,,Séminaire de l'Hérésiarche,,Seminario dell'Heresiarch,헤러시아크의 신학교,Seminarium Herezjarchy,Seminário do Heresiarca,Seminarul Ereziarhului,Семинария Ересиарха,Јересијархов семинар +Heresiarch's Seminary,TXT_HEXEN_MAP27,,,,Heresiáchův seminář,Seminar des Erzketzers,Seminario del Heresiarca,,Séminaire de l'Hérésiarche,,Seminario dell'Heresiarch,헤러시아크의 신학교,Seminarium Herezjarchy,Seminário do Heresiarca,Seminarul Ereziarhului,Семинария Ересиарха,Јересијархов семинар Dragon Chapel,TXT_HEXEN_MAP28,,,,Dračí Kaple,Drachenkapelle,Capilla Dragón,,Chapelle du Dragon,Sárkány Szentély,Cappella del Drago,드래곤 예배실,Kaplica Smoka,Capela do Dragão,Capela dragonilor,Часовня дракона,Змајева капела Griffin Chapel,TXT_HEXEN_MAP30,,,,Griffiní Kaple,Greifenkapelle,Capilla Grifo,,Chapelle du Grifon,Griff Szentély,Cappella del Grifone,그리핀 예배실,Kaplica Gryfa,Capela do Grifo,Capela grifonilor,Часовня грифона,Грифинова капела Deathwind Chapel,TXT_HEXEN_MAP31,,,,,Todeswindkapelle,Capilla Viento de Muerte,,Chapelle du Vent Tueur,,Cappella del Vento Assassino,죽음바람 예배실,Kaplica Wiatru Śmierci,Capela do Vento da Morte,Capela suflului morții,Часовня ветра смерти,Капела ветра смрти -Orchard of Lamentations,TXT_HEXEN_MAP32,,,,,Garten der Wehklagen,Huerto de los Lamentos,,Verger des Lamentations,,Frutteto delle Lamentazioni,통탄의 과수원,Płaczący Sad,Pomar das Lamentações,Livada amărăciunii,Сады плача,Воћњак тужбалица -Silent Refectory,TXT_HEXEN_MAP33,,,,,Stilles Refektorium,Refectorio Silencioso,,Réfectoire Silencieux,,Refettorio silenzioso,침묵의 식당,Cichy Refektarz,Refeitório Silencioso,Refectoriul tăcerii,Безмолвная трапезная,Тиха трпезарија +Orchard of Lamentations,TXT_HEXEN_MAP32,,,,Plantáž nářků,Garten der Wehklagen,Huerto de los Lamentos,,Verger des Lamentations,,Frutteto delle Lamentazioni,통탄의 과수원,Płaczący Sad,Pomar das Lamentações,Livada amărăciunii,Сады плача,Воћњак тужбалица +Silent Refectory,TXT_HEXEN_MAP33,,,,Tichý refektář,Stilles Refektorium,Refectorio Silencioso,,Réfectoire Silencieux,,Refettorio silenzioso,침묵의 식당,Cichy Refektarz,Refeitório Silencioso,Refectoriul tăcerii,Безмолвная трапезная,Тиха трпезарија Wolf Chapel,TXT_HEXEN_MAP34,,,,Vlčí Kaple,Wolfskapelle,Capilla Lobo,,Chapelle du Loup,Farkas Szentély,Cappella del Lupo,늑대 예배실,Kaplica Wilka,Capela do Lobo,Capela lupilor,Часовня волка,Вучја капела Forsaken Outpost,TXT_HEXEN_MAP21,,,,Opuštěná Stanoviště,Verlassener Vorposten,Puesto de Avanzada Abandonado,,Base Abandonnée,,Avamposto Abbandonato,버려진 초소,Opuszczony Posterunek,Posto Abandonado,Avanpostul părăsit,Покинутая застава,Напуштена постаја Castle of Grief,TXT_HEXEN_MAP22,,,,Zámek Zármutku,Leidensburg,Castillo del Pesar,,Château de la Souffrance,,Castello della Sofferenza,비탄의 성,Zamek Smutku,Castelo da Aflição,,Замок скорби,Замак жалости Gibbet,TXT_HEXEN_MAP23,,,,Šibenice,Richtstätte,Horca,,Gibet,,Forca,교수대,Szubienica,Forca,,Виселица,Вешала -Effluvium,TXT_HEXEN_MAP24,,,,,Effluvium,Efluvio,,Effluvium,,Effluvio,악취,Odór,Eflúvio,,Зловонный сток,Ефлувиум +Effluvium,TXT_HEXEN_MAP24,,,,Výpar,Effluvium,Efluvio,,Effluvium,,Effluvio,악취,Odór,Eflúvio,,Зловонный сток,Ефлувиум Dungeons,TXT_HEXEN_MAP25,,,,Žalář,Kerker,Calabozos,,Donjons,Kazamaták,I Dungeon,지하감옥,Lochy,Masmorras,Temnițe,Подземелья,Тамнице Desolate Garden,TXT_HEXEN_MAP26,,,,Dezolátní Zahrada,Verwildeter Garten,Jardín Desolado,,Jardin de la Désolation,,Giardino Desolato,황폐한 정원,Spustoszały Ogród,Jardim Desolado,,Заброшенный сад,Пуста башта Necropolis,TXT_HEXEN_MAP35,,,,Nekropolis,Nekropole,Necrópolis,,Nécropole,Halottak Városa,Necropoli,망자의 도시,Nekropolia,Necrópole,Necropola,Некрополь,Некрополис Zedek's Tomb,TXT_HEXEN_MAP36,,,,Zedekova Hrobka,Zedeks Gruft,Tumba de Zedek,,Tombeau de Zedek,Zedek Sírja,Tomba di Zedek,제닥의 무덤,Grobowiec Zedeka,Tumba de Zedek,Mormântul lui Zedek,Гробница зедека,Зедеков гроб Menelkir's Tomb,TXT_HEXEN_MAP37,,,,Menelkirova Hrobka,Menelkirs Gruft,Tumba de Menelkir,,Tombeau de Menelkir,Menelkir Sírja,Tomba di Menelkir,메넬키어의 무덤,Grobowiec Menelkira,Tumba de Menelkir,Mormântul lui Menelkir,Гробница менелкира,Менелкиров гроб Traductus' Tomb,TXT_HEXEN_MAP38,,,,Traduktova Hrobka,Traductus' Gruft,Tumba de Traductus,,Tombeau de Traductus,Traductus Sírja,Tomba di Traductus,트라닥투스의 무덤,Grobowiec Traductusa,Tumba de Traductus,Mormântul lui Traductus,Гробница традактуса,Традуктусов гроб -Vivarium,TXT_HEXEN_MAP39,,,,,Vivarium,Vivario,,Vivarium,Vivárium,Vivario,사육장,Wiwarium,Viveiro,Vivariu,Виварий,Зверињак +Vivarium,TXT_HEXEN_MAP39,,,,Vivárium,Vivarium,Vivario,,Vivarium,Vivárium,Vivario,사육장,Wiwarium,Viveiro,Vivariu,Виварий,Зверињак Dark Crucible,TXT_HEXEN_MAP40,,,,Tmavý Tyglík,Dunkle Feuerprobe,Crisol de Oscuridad,,Creuset Sombre,,Crogiolo Buio,어두운 고난,Próba Mroku,Crisol das Trevas,,Испытание тьмы,Мрачни лонац ,,Hexen Deathkings,,,,,,,,,,,,,,, Ruined Village,TXT_HEXDD_MAP41,,,,Zruinovaná Vesnice,Zerstörtes Dorf,Pueblo en Ruinas,,Village en Ruines,Az Elpusztult Falu,Villagio in Rovine,파괴된 마을,Zrujnowana Wioska,Aldeia Destruída,Sat ruinat,Разрушенная деревня, @@ -291,7 +291,7 @@ Constable's Gate,TXT_HEXDD_MAP48,,,,,Wachtor,Puerta del Alguacil,,Portail du Con Treasury,TXT_HEXDD_MAP49,,,,Pokladnice,Schatzkammer,Tesorería,,Trésorerie,,Tesoreria,국고,Skarbiec,Tesouraria,Vistierie,Сокровищница, Market Place,TXT_HEXDD_MAP50,,,,Trh,Marktplatz,Plaza del Mercado,,Place du Marché,,Piazza del Mercato,시장,Rynek,Feira,,Рыночная площадь, Locus Requiescat,TXT_HEXDD_MAP51,,,,,Locus Requiescat,Lugar de Descanso Eterno,,Locus Requiescat,,,명복의 장소,Locus Requiescat,,,Место вечного упокоения, -Ordeal,TXT_HEXDD_MAP52,,,,,Heimsuchung,Prueba,,Supplice,,Supplizio,시죄의 시련,Męka,Suplício,Supliciu,Испытание, +Ordeal,TXT_HEXDD_MAP52,,,,utrpení,Heimsuchung,Prueba,,Supplice,,Supplizio,시죄의 시련,Męka,Suplício,Supliciu,Испытание, Armory,TXT_HEXDD_MAP53,,,Armoury,Zbrojovna,Waffenkammer,Armería,,Amurerie,Fegyverraktár,Armeria,무기고,Zbrojownia,Arsenal,,Оружейная, Nave,TXT_HEXDD_MAP54,,,,,Kirchenschiff,La Nave,,Nef,,Navata,본당,Nawa,,Naos,Неф, Chantry,TXT_HEXDD_MAP55,,,,zádušní kaple,Kantorei,Capilla,,Chapelle,,Cappella,예배당,Kaplica Wotywna,Capela,,Часовня, @@ -891,7 +891,25 @@ But now, you see spread before you more potential pain and gibbitude as a nation of demons run amok among our cities. -Next stop, Hell on Earth!",E4TEXT,Doom Ep.4,,,,"Der Spinnenmeister muss seine Legionen +Next stop, Hell on Earth!",E4TEXT,Doom Ep.4,,,"Pavoučí génius musel poslat pryč +své legie z pekla vyvolaních před tvím +posledním střetem s touhle ohavnou +pekelnou příšerou. Ale vykročil +jsi kupředu a přinesl věčné zatracení +a +utrpení nad hordy jako pravý hrdina tváří +v tvář něčemu tak zlému. + +Kromě toho, někdo musí zaplatit +za to +co se stalo Daisy, tvému domácímu králičku. + +Ale těd, vidíš napětí před více možnou +bolestí a rozkucháním jak národ + démonú běhá v amoku mezi našimi městy. + +Další zastávka, Peklo na Zemi! +","Der Spinnenmeister muss seine Legionen der Höllenbrut vor deiner Konfrontation mit ihm ausgesandt haben. Aber du hast ja ewige Verdammnis und Leiden @@ -1892,7 +1910,10 @@ Sei bravo in questo genere di cose.","아크-바일의 진절머리 나는 미 막지는 못했다. 그리고 당신은 곧 가속기를 영원히 꺼 버릴 수 있을 것이다. 당신은 분명히 이 방면에는 타고난 실력을 -갖추고 있다.\n","Nawet śmiercionośny labirynt Arch-Vile'ów nie mógł cię zatrzymać i dotarłeś do prototypu akceleratora, który ma być skutecznie i trwale dezaktywowany. +갖추고 있다.\n","Nawet śmiercionośny labirynt Arch-Vile'ów +nie mógł cię zatrzymać i dotarłeś do +prototypu akceleratora, który ma być +skutecznie i trwale dezaktywowany. Jesteś dobry w te klocki.","Nem mesmo o labirinto mortal do Arch-Vile pôde te deter. Você consegue chegar ao @@ -5262,7 +5283,7 @@ Fool. Guards! Rid me of meddlesome peon.,TXT_DLG_SCRIPT02_D84896_FOOLG,,,,,Du Na "Walk away, boy, just walk away.",TXT_DLG_SCRIPT02_D86412_WALKA,,,,,"Geh weg Jungchen, geh einfach weg.","Aléjate, muchacho, sólo aléjate.",,"Pars, gamin, pars.",,,"지나가라고 친구, 그냥 지나가.",,"Suma daqui, garoto. Apenas suma daqui.",,"Уходи, парень. Просто уходи.", What are you doing here?,TXT_DLG_SCRIPT02_D87928_WHATA,,,,,Was machst du hier?,¿Qué estás haciendo aquí?,,Qu'est-ce que vous foutez ici?,,,여기서 뭘 하는거야?,,O que você está fazendo aqui?,,Что ты тут делаешь?, "Hey, I need gold!",TXT_RPLY0_SCRIPT02_D87928_HEYIN,,,,,"Hey, ich brauche Gold!","¡Hey, necesito oro!",,"Hé, j'ai besoin de sous!",,,"이봐, 난 골드가 필요해!",,"Ei, eu preciso de ouro!",,"Эй, мне нужно золото!", -"Blackbird told you the code, huh? Let me shut off the alarm. Macil is one flight down.",TXT_DLG_SCRIPT02_D89444_BLACK,,,,,"Blackbird hat dir den Code gegeben, wie? Lass mich mal eben den Alarm abschalten. Macil ist eine Etage tiefer.","Blackbird te dijo el código, ¿eh? Déjame apagar la alarma. Macil está un vuelo hacia abajo.",,"Blackbird t'as donné le code, hein? Bon, laisse moi désactiver l'alarme. Macil est en bas des escaliers.",,,"블랙버드가 암호를 알려줬나 보군? 흠, 그럼 경보를 꺼둬야겠군. 마실은 계단 저 밑에 있어.",,"Blackbird te passou o código, hã? Deixa eu desligar o alarme. Macil está no andar debaixo.",,"Чёрный дрозд сказал тебе пароль, так? Давай я отключу сигнализацию. Мэйсил этажом ниже.", +"Blackbird told you the code, huh? Let me shut off the alarm. Macil is one flight down.",TXT_DLG_SCRIPT02_D89444_BLACK,,,,,"Blackbird hat dir den Code gegeben, wie? Lass mich mal eben den Alarm abschalten. Macil ist eine Etage tiefer.","Blackbird te dijo el código, ¿eh? Déjame apagar la alarma. Macil está un vuelo hacia abajo.",,"Blackbird t'as donné le code, hein? Bon, laisse moi désactiver l'alarme. Macil est en bas des escaliers.",,,"블랙버드가 암호를 알려줬나 보군? 흠, 그럼 경보를 꺼둬야겠군. 마실은 계단 저 밑에 있어.",,"Blackbird te passou o código, é? Deixa eu desligar o alarme. Macil está no andar debaixo.",,"Чёрный дрозд сказал тебе пароль, так? Давай я отключу сигнализацию. Мэйсил этажом ниже.", Thanks.,TXT_RPLY0_SCRIPT02_D89444_THANK,,,,,Danke.,Gracias.,,Merci.,,,고맙다.,,Obrigado.,,Спасибо., "Walk away, boy, just walk away.",TXT_DLG_SCRIPT02_D90960_WALKA,,,,,"Geh weg Jungchen, geh einfach weg.","Aléjate, muchacho, sólo aléjate.",,"Pars, gamin, pars.",,,"지나가라고 친구, 그냥 지나가.",,"Suma daqui, garoto. Apenas suma daqui.",,"Проходи, парень. Просто проходи.", Do you have an appointment with the Governor? ,TXT_DLG_SCRIPT02_D92476_DOYOU,,,,,Hast du einen Termin bei dem Gouverneur?,¿Tienes una cita con el gobernador?,,Avez-vous un rendez-vous avec le gouverneur?,,,총독과 약속이 있으십니까?,,Você tem hora marcada com o Governador?,,У Вас назначена встреча с губернатором?, @@ -5285,26 +5306,26 @@ Thanks,TXT_RPLY0_SCRIPT02_D101572_THANK,,,,,Danke.,Gracias,,Merci.,,,고맙습 If you say it's illegal I want nothing to do with you. I have enough trouble as it is.,TXT_DLG_SCRIPT02_D103088_IFYOU,,,,,"Wenn du sagst, es sei illegal, möchte ich nichts damit zu tun haben. Ich habe schon genug Probleme.",Si dices que es ilegal no quiero tener nada que ver contigo. Ya tengo suficientes problemas.,,"Si vous dites que c'est un truc illégal, alors je ne veux pas m'en mêler. J'ai déjà assez de problèmes.",,,저게 불법이라고 말한다면 난 이제 더는 모른다네. 관련 문제도 원치 않고 말일세.,,Se você diz que isso é ilegal então eu não quero envolvimento nenhum contigo. Já tenho problemas o suficiente.,,"Раз ты говоришь, что оно нелегально, я не хочу иметь с тобой дел. Мне и так хватает проблем.", Thanks,TXT_RPLY0_SCRIPT02_D103088_THANK,,,,,Danke,Gracias,,Merci.,,,감사합니다.,,Obrigado,,Спасибо., "Release me, leave an old man alone.",TXT_DLG_SCRIPT02_D104604_RELEA,,,,,Bitte lass einen alten Mann in Ruhe,"Suéltame, deja en paz a un anciano.",,"Laissez moi tranquille, un vieil homme a le droit d'être seul.",,,보내주게. 이 노인은 이제 아무것도 몰라.,,"Me solte, deixe um velho em paz.",,Оставь старика в покое!, -"Welcome to the last flicker of hope. Only we have the free will to oppose the Order. We have the sharpest scientific minds, and many able bodies, but we lack that one real, uh... Problemsolver, who will give us the edge we need. Help us.",TXT_DLG_SCRIPT03_D0_WELCO,,,,,"Wilkommen beim letzten Hoffnungsschimmer. Nur wir haben noch den freien Willen, um gegen den Orden zu arbeiten. Wir haben die besten Wissenschaftler und viele fähige Kämpfer aber was uns fehlt ist ein spezieller... äh... Problemlöser, der uns den nötigen Vorteil verschafft. Bitte hilf uns.","Bienvenido al último destello de esperanza. Solo nosotros tenemos el libre albedrío para oponernos a la Orden. Tenemos las mentes científicas más inteligentes y muchos cuerpos capaces, pero nos falta un, uh ... solucionador de problemas, quien nos dará la ventaja que necesitamos. Ayúdanos.",,"Bienvenue au dernier lieu d'espoir. Nous seuls avons la liberté d'esprit pour opposer l'Ordre. Nous avons les esprits scientifiques les plus aiguisés et de nombreux hommes habiles et sains.. Mais il nous manque quelqu'un qui pourrait.. résoudre nos problèmes. Nous donner un peu d'aide, nous permettre de prendre l'avantage.",,,"최후의 희망 한 가닥을 잡은 것을 환영합니다. 우리만이 오더를 거부할 수 있는 의지를 갖추고 있죠. 뛰어난 과학력과 전투력은 다 갖추고 있습니다만, 정작 '해결사' 몫을 해주는 인물이 없어서 말입니다... 부디 우리를 도와주시길 바랍니다.",,,,"Добро пожаловать в последний оплот надежды. Только мы обладаем свободной волей, чтобы противостоять Ордену. С нами лучшие учёные умы, и у нас есть много толковых людей, но нам не хватает одного-единственного, э... «разрешителя проблем», который поможет нам получить необходимое преимущество. Помоги нам.", -"All right, I accept.",TXT_RPLY0_SCRIPT03_D0_ALLRI,,,,,"Klar, ich bin dabei.","De acuerdo, acepto.",,Très bien. J'accepte.,,,좋아요. 받아들이죠.,,,,Хорошо. Я согласен., -No thanks!,TXT_RPLY1_SCRIPT03_D0_NOTHA,,,,,"Nein, danke!",¡No gracias!,,Non merci.,,,사양할게요!,,,,"Нет уж, спасибо!", -"You might want to reconsider, seeing that you're surrounded by heavily armed angry rebels.",TXT_DLG_SCRIPT03_D1516_YOUMI,,,,,"Bitte überdenke das nochmal, angesichts der Tatsache, dass du von befaffneten und zornigen Rebellen umgeben bist.","Es posible que desees reconsiderar, ya que estas rodeado de rebeldes enojados fuertemente armados.",,"J'espère que vous pouvez y réfléchir. Après tout, vous êtes entouré de rebelles lourdement armés et prêts à se défendre.",,,다시... 생각을 해보는 게 좋을 것 같군요. 우리 병사들을 당황하게 만든 것 같은데 말이죠.,,,,"Возможно, при виде нервных и вооружённых до зубов повстанцев ты передумаешь.", -"All right, I'm in!",TXT_RPLY0_SCRIPT03_D1516_ALLRI,,,,,"Na gut, ich bin dabei.","De acuerdo, ¡quiero entrar!",,"Ok, d'accord, j'accepte!",,,그럼 도와주도록 하죠.,,,,"Хорошо, я с вами!", -No thanks.,TXT_RPLY1_SCRIPT03_D1516_NOTHA,,,,,"Nein, danke!",No gracias.,,Non merci.,,,싫어요! 당신은 낯선 사람이잖아요!,,,,"Нет, спасибо.", -Then die in shame and dishonor.,TXT_DLG_SCRIPT03_D3032_THEND,,,Then die in shame and dishonour.,,Dann wirst du in Schande und Unehre sterben.,Entonces muere en vergüenza y deshonra.,,Périssez dans la honte et le déshonneur.,,,그럼 불명예스럽고 초라하게 죽어버리시길!,,,,Тогда умри в бесчестии и позоре., +"Welcome to the last flicker of hope. Only we have the free will to oppose the Order. We have the sharpest scientific minds, and many able bodies, but we lack that one real, uh... Problemsolver, who will give us the edge we need. Help us.",TXT_DLG_SCRIPT03_D0_WELCO,,,,,"Wilkommen beim letzten Hoffnungsschimmer. Nur wir haben noch den freien Willen, um gegen den Orden zu arbeiten. Wir haben die besten Wissenschaftler und viele fähige Kämpfer aber was uns fehlt ist ein spezieller... äh... Problemlöser, der uns den nötigen Vorteil verschafft. Bitte hilf uns.","Bienvenido al último destello de esperanza. Solo nosotros tenemos el libre albedrío para oponernos a la Orden. Tenemos las mentes científicas más inteligentes y muchos cuerpos capaces, pero nos falta un, uh ... solucionador de problemas, quien nos dará la ventaja que necesitamos. Ayúdanos.",,"Bienvenue au dernier lieu d'espoir. Nous seuls avons la liberté d'esprit pour opposer l'Ordre. Nous avons les esprits scientifiques les plus aiguisés et de nombreux hommes habiles et sains.. Mais il nous manque quelqu'un qui pourrait.. résoudre nos problèmes. Nous donner un peu d'aide, nous permettre de prendre l'avantage.",,,"최후의 희망 한 가닥을 잡은 것을 환영합니다. 우리만이 오더를 거부할 수 있는 의지를 갖추고 있죠. 뛰어난 과학력과 전투력은 다 갖추고 있습니다만, 정작 '해결사' 몫을 해주는 인물이 없어서 말입니다... 부디 우리를 도와주시길 바랍니다.",,"Seja bem-vindo à última ponta de esperança. Somente nós temos o livre arbítrio para combater a Ordem. Temos as mentes científicas mais afiadas e muitas pessoas capazes, mas nos falta aquele verdadeiro, hã... quebra-galho, que nos dará o impulso que precisamos. Ajude-nos.",,"Добро пожаловать в последний оплот надежды. Только мы обладаем свободной волей, чтобы противостоять Ордену. С нами лучшие учёные умы, и у нас есть много толковых людей, но нам не хватает одного-единственного, э... «разрешителя проблем», который поможет нам получить необходимое преимущество. Помоги нам.", +"All right, I accept.",TXT_RPLY0_SCRIPT03_D0_ALLRI,,,,,"Klar, ich bin dabei.","De acuerdo, acepto.",,Très bien. J'accepte.,,,좋아요. 받아들이죠.,,"Tá certo, eu aceito.",,Хорошо. Я согласен., +No thanks!,TXT_RPLY1_SCRIPT03_D0_NOTHA,,,,,"Nein, danke!",¡No gracias!,,Non merci.,,,사양할게요!,,"Não, obrigado!",,"Нет уж, спасибо!", +"You might want to reconsider, seeing that you're surrounded by heavily armed angry rebels.",TXT_DLG_SCRIPT03_D1516_YOUMI,,,,,"Bitte überdenke das nochmal, angesichts der Tatsache, dass du von befaffneten und zornigen Rebellen umgeben bist.","Es posible que desees reconsiderar, ya que estas rodeado de rebeldes enojados fuertemente armados.",,"J'espère que vous pouvez y réfléchir. Après tout, vous êtes entouré de rebelles lourdement armés et prêts à se défendre.",,,다시... 생각을 해보는 게 좋을 것 같군요. 우리 병사들을 당황하게 만든 것 같은데 말이죠.,,"Talvez você queira reconsiderar, já que está cercado de rebeldes furiosos armados até os dentes.",,"Возможно, при виде нервных и вооружённых до зубов повстанцев ты передумаешь.", +"All right, I'm in!",TXT_RPLY0_SCRIPT03_D1516_ALLRI,,,,,"Na gut, ich bin dabei.","De acuerdo, ¡quiero entrar!",,"Ok, d'accord, j'accepte!",,,그럼 도와주도록 하죠.,,"Tá certo, estou dentro!",,"Хорошо, я с вами!", +No thanks.,TXT_RPLY1_SCRIPT03_D1516_NOTHA,,,,,"Nein, danke!",No gracias.,,Non merci.,,,싫어요! 당신은 낯선 사람이잖아요!,,"Não, obrigado.",,"Нет, спасибо.", +Then die in shame and dishonor.,TXT_DLG_SCRIPT03_D3032_THEND,,,Then die in shame and dishonour.,,Dann wirst du in Schande und Unehre sterben.,Entonces muere en vergüenza y deshonra.,,Périssez dans la honte et le déshonneur.,,,그럼 불명예스럽고 초라하게 죽어버리시길!,,Então morra com desonra e vergonha!,,Тогда умри в бесчестии и позоре., "Good, Blackbird will continue to be your guide. She's taken quite a shine to you. Together you've got to unlock the secrets of the Order and their inhuman servants. Get inside and take them down.",TXT_DLG_SCRIPT03_D4548_GOODB,,,,,"Gut so! Blackbird wird weiter deine Leiterin sein, sie scheint dich zu mögen. Zusammen müsst ihr die Geheimnisse des Ordens und ihrer unmenschlichen Diener ergründen. Dann haben wir eine Chance, sie niederzuringen.","Bien, Blackbird continuará siendo tu guía. Parece que le caes bien. Juntos debéis descubrir los secretos de la Orden y sus sirvientes inhumanos. Entrad y echadlos abajo.","Bien, Blackbird continuará siendo tu guía. Parece que le caes bien. Juntos deberán descubrir los secretos de la Orden y sus sirvientes inhumanos. Penetrar y echarlos abajo.","Parfait. Blackbird continuera à être votre guide. Elle semble vous apprécier. Ensemble, vous allez découvrir les secrets de l'Ordre et leurs servants inhumains. Infiltrez-les et détruisez-les.",,,"좋군요. 블랙버드가 당신에게 지시를 계속 내려줄 겁니다. 당신을 꽤 신뢰하는 듯하더군요. 우리는 오더와 그들의 잔혹한 심복들의 실체를 파헤치고 폭로할 겁니다. 비밀을 헤집고 그들을 몰락시켜 버리세요. - \cy듣기만 해도 꿈에 그리던 일만 같네, 그렇지?",,,,Хорошо. Чёрный дрозд останется твоим проводником. Она тебе несколько симпатизирует. Вместе вы раскроете секреты Ордена и его бесчеловечных слуг. Проникни на их территорию и ударь по ним как следует!, -Where do I start?,TXT_RPLY0_SCRIPT03_D4548_WHERE,,,,,Wo fange ich an?,¿Por dónde empiezo?,,Où est-ce que je commence?,,,어디서부터 시작하면 되죠?,,,,С чего мне начать?, -Frankly the situation is a mess. You must accomplish several missions to prepare the way for more attacks on the Order. Our last raid was a disaster and most of our troops were captured. I need you to free these prisoners.,TXT_DLG_SCRIPT03_D6064_FRANK,,,,,"Ehrlich gesagt, die Situation ist eine Sauerei. Du musst mehrere Aufgaben erfüllen um den Weg für weitere Angriffe vorzubereiten. Der letzte Überfall war ein Desaster und die meisten unserer Leute wurden gefangengenommen. Du musst sie wieder befreien.",Fráncamente la situación es un lío. Debes completar varias misiones para preparar el camino a más ataques contra la Orden. Nuestra última incursión fue un desastre y la mayoría de nuestras tropas fueron capturadas. Necesito que liberes a estos prisioneros.,,"Franchement, nous sommes dans un bazar sans précédent. Vous devez accomplir de nombreuses missions pour préparer nos futures attaques contre l'Ordre. Notre dernier raid à été un désastre et la majorité de nos troupes ont été capturées. Il faut que vous les libérez.",,,"애석하게도, 현재 상황은 엉망입니다. 우리가 오더를 공습하기 전에 당신이 수행해야 할 일이 몇 가지 있습니다. 몇 주 전 공습은 비참한 결과로 끝났고, 대부분의 병사가 감금당했습니다. 그들을 풀어주어야만 합니다.",,,,"Честно говоря, наши дела идут не лучшим образом. Тебе предстоит выполнить несколько заданий, чтобы расчистить путь для дальнейших атак на Орден. Наша последняя вылазка обернулась катастрофой, и большинство наших бойцов были схвачены. Мне нужно, чтобы ты освободил их.", -I think I can handle it.,TXT_RPLY0_SCRIPT03_D6064_ITHIN,,,,,"Ich denke, das kann ich schaffen.",Creo que puedo hacerlo.,,Je pense pouvoir m'en occuper.,,,아마도 제가 할 수 있을 것 같군요.,,,,"Думаю, справлюсь.", + \cy듣기만 해도 꿈에 그리던 일만 같네, 그렇지?",,Ótimo. Blackbird continuará sendo a sua guia. Parece que ela vai com a sua cara. Juntos vocês desvendarão os segredos da Ordem e de seus discípulos desumanos. Entre lá e elimine eles.,,Хорошо. Чёрный дрозд останется твоим проводником. Она тебе несколько симпатизирует. Вместе вы раскроете секреты Ордена и его бесчеловечных слуг. Проникни на их территорию и ударь по ним как следует!, +Where do I start?,TXT_RPLY0_SCRIPT03_D4548_WHERE,,,,,Wo fange ich an?,¿Por dónde empiezo?,,Où est-ce que je commence?,,,어디서부터 시작하면 되죠?,,Por onde eu começo?,,С чего мне начать?, +Frankly the situation is a mess. You must accomplish several missions to prepare the way for more attacks on the Order. Our last raid was a disaster and most of our troops were captured. I need you to free these prisoners.,TXT_DLG_SCRIPT03_D6064_FRANK,,,,,"Ehrlich gesagt, die Situation ist eine Sauerei. Du musst mehrere Aufgaben erfüllen um den Weg für weitere Angriffe vorzubereiten. Der letzte Überfall war ein Desaster und die meisten unserer Leute wurden gefangengenommen. Du musst sie wieder befreien.",Fráncamente la situación es un lío. Debes completar varias misiones para preparar el camino a más ataques contra la Orden. Nuestra última incursión fue un desastre y la mayoría de nuestras tropas fueron capturadas. Necesito que liberes a estos prisioneros.,,"Franchement, nous sommes dans un bazar sans précédent. Vous devez accomplir de nombreuses missions pour préparer nos futures attaques contre l'Ordre. Notre dernier raid à été un désastre et la majorité de nos troupes ont été capturées. Il faut que vous les libérez.",,,"애석하게도, 현재 상황은 엉망입니다. 우리가 오더를 공습하기 전에 당신이 수행해야 할 일이 몇 가지 있습니다. 몇 주 전 공습은 비참한 결과로 끝났고, 대부분의 병사가 감금당했습니다. 그들을 풀어주어야만 합니다.",,Sinceramente a situação é uma bagunça. Você precisa cumprir algumas missões para preparar o caminho para mais ataques contra a Ordem. Nossa última invasão foi um desastre e muitas das nossas tropas foram capturadas. Preciso que você liberte esses prisioneiros.,,"Честно говоря, наши дела идут не лучшим образом. Тебе предстоит выполнить несколько заданий, чтобы расчистить путь для дальнейших атак на Орден. Наша последняя вылазка обернулась катастрофой, и большинство наших бойцов были схвачены. Мне нужно, чтобы ты освободил их.", +I think I can handle it.,TXT_RPLY0_SCRIPT03_D6064_ITHIN,,,,,"Ich denke, das kann ich schaffen.",Creo que puedo hacerlo.,,Je pense pouvoir m'en occuper.,,,아마도 제가 할 수 있을 것 같군요.,,Acho que eu posso dar conta disso.,,"Думаю, справлюсь.", "Take this money and visit Irale who supplies our weapons. Then, this key will get you in to see the Governor. He's a corrupt puppet of the Order, but he loves to make deals. Do whatever you need to free our brothers in arms.",TXT_DLG_SCRIPT03_D7580_TAKET,,,,,"Nimm das Geld hier und geh zu Irale, der und mit Waffen versorgt. Und dieser Schlüssel erlaubt die Zutritt zum Haus des Gouverneurs. Er ist eine korrupte Marionette des Ordens aber er liebt es, Deals zu machen. Mach was nötig ist um unsere Waffenbrüder zu befreien.","Toma este dinero y ve a ver a Irale, que suministra nuestras armas. Después, esta llave te servirá para ver al gobernador. Es una marioneta corrupta de la Orden, pero le encantan los tratos. Haz lo que creas necesario para liberar a nuestros compatriotas.",,Prenez cet argent et allez voir Irale qui nous approvisionne en armes. Utilisez ensuite cette clé pour aller voir le gouverneur. Il est un pantin de l'Ordre mais il adore faire affaires. Faites ce qu'il faut pour libérer nos compatriotes.,,,"이 돈을 가지고 마을의 무기상인 이롤리를 찾아가시길 바랍니다. 그리고 이 열쇠만 있으면 모렐 총독을 쉽게 만날 수 있을 겁니다. 그는 부패한 오더의 앞잡이지만, 거래에 미쳐있죠. 우리 요원들을 풀어줄 무슨 수단이든 강구해 보시길. - \cy그리고 내가 너와 함께 있어 줄께.",,,,"Возьми эти деньги и посети Ирэйла, нашего поставщика оружия. Затем, с этим ключом, ты пройдёшь к губернатору. Он — продажная марионетка Ордена, но обожает торговаться. Делай всё, что захочешь, но освободи наших братьев по оружию.", -I'll see to it.,TXT_RPLY0_SCRIPT03_D7580_ILLSE,,,,,"Ich seh, was ich machen kann.",Veré que hacer.,,Je m'y attelle.,,,한 번 확인하러 가보겠습니다.,,,,Я позабочусь об этом., -Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D9096_FIGHT,,,,,Kämpfe für die Front und die Freiheit. Nun geh.,Lucha por el frente y la libertad. En marcha.,,Battez vous pour le Front et pour la liberté. Repos.,,,"프론트와 자유를 향하여, 전진하세요!",,,,Сражайся за свободу и справедливость. Вперёд., -"The prisoners have been welcomed back, thanks to you. Here's some gold, go visit the medic and the weapons trainer and then, I have higher goals for you.",TXT_DLG_SCRIPT03_D10612_THEPR,,,,,"Die Gefangenen sind zu uns zrückgekehrt, dank dir. Hier hast du etwas Gold, schau mal beim Sanitäter und beim Waffentrainer rein, danach sind höhere Ziele in Aussicht.","Los prisioneros han sido bienvenidos de vuelta, gracias a ti. Aquí tienes algo de oro, ve a ver al médico y al entrenador de armamento y después, tengo mayores metas para ti.",,"Les prisonniers sont revenus à bon port, grâce à vous. Voici de l'argent, allez voir le médecin et le maître d'armes, puis j'aurais d'autres missions pour vous.",,,감금된 병사들이 당신 덕에 다시 돌아왔습니다. 정말 감사드립니다! 이 보상을 받으시고 의무관이랑 무기 담당관을 찾아뵈시길 바랍니다. 또 다른 임무가 기다리고 있으니까요.,,,,"Благодаря тебе, пленники вернулись к нам. Вот немного золота, посети медика и инструктора по стрельбе, а потом тебя ждут ещё более ответственные задания.", -I will. What's next?,TXT_RPLY0_SCRIPT03_D10612_IWILL,,,,,"Alles klar, was gibt's als Nächstes?",Lo haré. ¿Qué es lo siguiente?,Lo haré. ¿Qué sigue?,"Très bien, quoi maintenant?",,,그렇군요. 그 다음은 뭐죠?,,,,Хорошо. Что дальше?, + \cy그리고 내가 너와 함께 있어 줄께.",,"Pegue este dinheiro e visite o Irale, nosso fornecedor de armas. Depois use esta chave para entrar e falar com o Governador. Ele é um fantoche corrupto da Ordem mas ele adora negociar. Faça o que for necessário para libertar os nossos irmãos de armas.",,"Возьми эти деньги и посети Ирэйла, нашего поставщика оружия. Затем, с этим ключом, ты пройдёшь к губернатору. Он — продажная марионетка Ордена, но обожает торговаться. Делай всё, что захочешь, но освободи наших братьев по оружию.", +I'll see to it.,TXT_RPLY0_SCRIPT03_D7580_ILLSE,,,,,"Ich seh, was ich machen kann.",Veré que hacer.,,Je m'y attelle.,,,한 번 확인하러 가보겠습니다.,,Vou dar um jeito nisso.,,Я позабочусь об этом., +Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D9096_FIGHT,,,,,Kämpfe für die Front und die Freiheit. Nun geh.,Lucha por el frente y la libertad. En marcha.,,Battez vous pour le Front et pour la liberté. Repos.,,,"프론트와 자유를 향하여, 전진하세요!",,Lute pela Frente e pela liberdade. Agora vá.,,Сражайся за свободу и справедливость. Вперёд., +"The prisoners have been welcomed back, thanks to you. Here's some gold, go visit the medic and the weapons trainer and then, I have higher goals for you.",TXT_DLG_SCRIPT03_D10612_THEPR,,,,,"Die Gefangenen sind zu uns zrückgekehrt, dank dir. Hier hast du etwas Gold, schau mal beim Sanitäter und beim Waffentrainer rein, danach sind höhere Ziele in Aussicht.","Los prisioneros han sido bienvenidos de vuelta, gracias a ti. Aquí tienes algo de oro, ve a ver al médico y al entrenador de armamento y después, tengo mayores metas para ti.",,"Les prisonniers sont revenus à bon port, grâce à vous. Voici de l'argent, allez voir le médecin et le maître d'armes, puis j'aurais d'autres missions pour vous.",,,감금된 병사들이 당신 덕에 다시 돌아왔습니다. 정말 감사드립니다! 이 보상을 받으시고 의무관이랑 무기 담당관을 찾아뵈시길 바랍니다. 또 다른 임무가 기다리고 있으니까요.,,"Recebemos os prisioneiros de volta, graças a você. Pegue este dinheiro, visite o médico, o treinador de armas e depois eu vou te dar uns objetivos mais importantes.",,"Благодаря тебе, пленники вернулись к нам. Вот немного золота, посети медика и инструктора по стрельбе, а потом тебя ждут ещё более ответственные задания.", +I will. What's next?,TXT_RPLY0_SCRIPT03_D10612_IWILL,,,,,"Alles klar, was gibt's als Nächstes?",Lo haré. ¿Qué es lo siguiente?,Lo haré. ¿Qué sigue?,"Très bien, quoi maintenant?",,,그렇군요. 그 다음은 뭐죠?,,Farei isso. Qual a próxima missão?,,Хорошо. Что дальше?, "A single crystal runs the power grid which drives the Order's shields. Destroy that crystal and you will punch huge holes in the Order's defenses. Blackbird will lead you to a spy who has a way in, good luck.",TXT_DLG_SCRIPT03_D12128_ASING,,,,,"Ein einziger Kristall kontrolliert das gesamte Energiesystem für die Kraftschilde des Ordens. Zerstöre diesen Kristall und du wirst riesige Löcher in die Verteidigungsanlagen des Ordens schlagen. Blackbird führt dich zu einem Spion, der dir Einlass verschaffen kann. Viel Glück.","Un único cristal alimenta la red eléctrica que mantiene los escudos de la Orden. Destruye ese cristal y abrirás grandes brechas en las defensas de la Orden. Blackbird te guiará hacia un espía que tiene una forma de entrar, buena suerte.",,Un seul cristal fait fonctionner la grille énergétique qui alimente les boucliers de l'Ordre. Détruisez ce cristal et vous créez des énormes failles dans les défenses de l'Ordre. Blackbird va vous mener à un espion qui a un moyen de vous faire rentrer. Bonne chance.,,,"오더의 방어막을 생성하는 수정체가 그들의 발전소 안에 있습니다. 그것을 파괴할 수만 있다면, 오더의 방어 체계를 약화할 수 있을 겁니다. 블랙버드가 길을 알려줄 첩자의 위치를 알려줄 것입니다. 건투를 빌어요. - \cy워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.",,,,"Энергосеть, которая питает щиты Ордена, работает от одного кристалла. Уничтожь этот кристалл, и ты пробьёшь огромную брешь в их обороне. Чёрный дрозд приведёт тебя к шпиону, который знает, как проникнуть на станцию. Удачи!", + \cy워너는 우리가 모집한 첩자야. 그는 발전소 창고에 있어.",,Há um cristal que fornece energia à rede elétrica que mantém os escudos da Ordem em funcionamento. Destrua esse cristal e você abrirá brechas grandes nas defesas da Ordem. Blackbird levará você à um espião que sabe como entrar lá. Boa sorte.,,"Энергосеть, которая питает щиты Ордена, работает от одного кристалла. Уничтожь этот кристалл, и ты пробьёшь огромную брешь в их обороне. Чёрный дрозд приведёт тебя к шпиону, который знает, как проникнуть на станцию. Удачи!", We'll get it.,TXT_RPLY0_SCRIPT03_D12128_WELLG,,,,,Das werden wir hinkriegen.,Lo conseguiremos.,,Je m'en occupe.,,,그 수정체를 파괴하겠습니다.,,,,Мы справимся., Fight for the Front and freedom. Move out.,TXT_DLG_SCRIPT03_D13644_FIGHT,,,,,Kämpfe für die Front und die Freiheit. Nun geh.,Lucha por el frente y la libertad. En marcha.,,Battez vous pour le Front et pour la liberté. Repos.,,,"프론트와 자유를 향하여, 전진하세요!",,,,Сражайся за свободу и справедливость. Вперёд., "You've exceeded all of our expectations. Because of your daring our troops are on the move. I want you two to join the assault, with a specific target. Take out the Programmer. It's time to reveal what we've found out about this layer of the Order.",TXT_DLG_SCRIPT03_D15160_YOUVE,,,,,"Du hast alle unsere Erwartungen übertroffen. Dank dir sind unsere Truppen auf dem Vormarsch. Ich möchte, dass du auch an dem Angriff teilnimmst, aber mit einer Spezialmission. Eliminiere den Programmierer. Es ist Zeit zu enthüllen, was wir über dien Teil des Ordens herausgefunden haben.","Has superado todas nuestras expectativas. Por tú hazaña nuestras tropas están en movimiento. Quiero que los dos os unais al asalto, con un objetivo específico. Acabar con el Programador. Es hora de revelar lo que hemos encontrado de esta capa de la Orden.","Has superado todas nuestras expectativas. Por tú hazaña nuestras tropas están en movimiento. Quiero que ambos se unan al asalto, con un objetivo específico. Acabar con el Programador. Es hora de revelar lo que hemos encontrado de esta capa de la Orden.","Vous avez dépassé toutes nos attentes. Grâce à votre audace, nos troupes sont sur le pied de guerre. Je que vous rejoignez l'assaut tous les deux, avec une cible précise. Eliminez le Programmeur. Il est l'heure de révéler ce que nous avons découvert sur cette facette de l'Ordre.",,,당신의 성과는 우리가 예상했던 것보다 훨씬 굉장하더군요. 당신의 노고 덕에 이제 우리가 활동을 본격적으로 개시할 수 있게 되었습니다. 자네와 블랙버드가 이번 공격에 참여했으면 합니다. 그리고 프로그래머를 없애버리세요. 지금이야말로 오더의 실체가 어떠한지를 폭로할 절호의 기회입니다.,,,,"Ты превзошёл все наши ожидания. Благодаря твоей отваге, наши войска уже в пути. Я хочу, чтобы вы двое присоединились к атаке, с особой целью — уничтожить Программиста. Настало время рассказать всё, что мы смогли узнать об этом уровне власти в Ордене.", From 61a8f122f07d43b651c881acd37dadf669d711ca Mon Sep 17 00:00:00 2001 From: "alexey.lysiuk" Date: Fri, 12 Apr 2019 18:20:27 +0300 Subject: [PATCH 02/13] - fixed crash caused by broken saved game picture https://forum.zdoom.org/viewtopic.php?t=64244 --- src/menu/loadsavemenu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/menu/loadsavemenu.cpp b/src/menu/loadsavemenu.cpp index 7c09013a4..a21818f54 100644 --- a/src/menu/loadsavemenu.cpp +++ b/src/menu/loadsavemenu.cpp @@ -499,7 +499,7 @@ unsigned FSavegameManager::ExtractSaveData(int index) { SavePic = PNGTexture_CreateFromFile(png, node->Filename); delete png; - if (SavePic->GetDisplayWidth() == 1 && SavePic->GetDisplayHeight() == 1) + if (SavePic && SavePic->GetDisplayWidth() == 1 && SavePic->GetDisplayHeight() == 1) { delete SavePic; SavePic = nullptr; From edd71bafdadd3d76777e2987042bc2cd7cc60831 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Fri, 12 Apr 2019 18:49:49 +0200 Subject: [PATCH 03/13] =?UTF-8?q?-=20added=20the=20missing=20=C3=92=20for?= =?UTF-8?q?=20Doom's=20and=20Chex=20Quest's=20Smallfonts.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/game-chex/fonts/defsmallfont/00D2.lmp | Bin 0 -> 127 bytes .../filter/game-doom/fonts/defsmallfont/00D2.lmp | Bin 0 -> 127 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/defsmallfont/00D2.lmp create mode 100644 wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D2.lmp diff --git a/wadsrc_extra/static/filter/game-chex/fonts/defsmallfont/00D2.lmp b/wadsrc_extra/static/filter/game-chex/fonts/defsmallfont/00D2.lmp new file mode 100644 index 0000000000000000000000000000000000000000..29bb39ffa358f14e06b0a8e0a557bc23aa558c1f GIT binary patch literal 127 zcmd;J;9y{2U}Vq$lKMbw2gKe$909~BK%5W66+q0wR0{j6& literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D2.lmp b/wadsrc_extra/static/filter/game-doom/fonts/defsmallfont/00D2.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f8a1581e7e8814ac58e76e1e658122f2ded20062 GIT binary patch literal 127 zcmd;J;9y{2U}Vq$lKMbw2gKe$909~BK%5W66+q0wqz?rD8Nd`Xi@yG@T_7%pzWyft mU0b)qINS9%>g#U-$}qA6l>^y8^q+|hsC@HgkQ%s7sCfXV1RsC^ literal 0 HcmV?d00001 From bcf7bc8d34b24c0b7d27c5d93106ca830dda7547 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 13 Apr 2019 09:31:36 +0200 Subject: [PATCH 04/13] - added some UTF-8 utilities to FString. This deprecated CharAt and CharCodeAt for being unsuitable for text processing and in the case of CharCodeAt also for being buggy. A new replacement, ByteAt has been added that reads a string byte by byte, as well as CodePointCount, which counts the amount of Unicode code points in a string and GetNextCodePoint which reads the string code point by code point. Note that while this woll work as intended with the currently supported languages as a means to read single characters, there is no guarantee that this will remain so if Unicode support gets extended to things which break the "one code point == one character" assumption. --- src/scripting/vmthunks.cpp | 41 +++++++++++++++++++ wadsrc/static/zscript/base.zs | 7 +++- .../static/zscript/ui/menu/listmenuitems.zs | 9 ++-- .../static/zscript/ui/menu/textentermenu.zs | 4 +- .../zscript/ui/statscreen/statscreen.zs | 2 +- wadsrc/static/zscript/ui/statusbar/alt_hud.zs | 2 +- 6 files changed, 55 insertions(+), 10 deletions(-) diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 42b38edc9..4bf34ede8 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -176,6 +176,19 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, CharCodeAt, StringCharCodeAt) ACTION_RETURN_INT(StringCharCodeAt(self, pos)); } +static int StringByteAt(FString *self, int pos) +{ + if ((unsigned)pos >= self->Len()) return 0; + else return (uint8_t)((*self)[pos]); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, ByteAt, StringByteAt) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + PARAM_INT(pos); + ACTION_RETURN_INT(StringByteAt(self, pos)); +} + static void StringFilter(FString *self, FString *result) { *result = strbin1(*self); @@ -288,6 +301,34 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, Split, StringSplit) return 0; } +static int StringCodePointCount(FString *self) +{ + return (int)self->CharacterCount(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, CodePointCount, StringCodePointCount) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + ACTION_RETURN_INT(StringCodePointCount(self)); +} + +static int StringNextCodePoint(FString *self, int inposition, int *position) +{ + int codepoint = self->GetNextCharacter(inposition); + if (position) *position = inposition; + return codepoint; +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, GetNextCodePoint, StringNextCodePoint) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + PARAM_INT(pos); + if (numret > 0) ret[0].SetInt(self->GetNextCharacter(pos)); + if (numret > 1) ret[1].SetInt(pos); + return numret; +} + + //===================================================================================== // // sector_t exports diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index 27f534443..18a80287b 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -898,8 +898,9 @@ struct StringStruct native native String Mid(int pos = 0, int len = 2147483647) const; native void Truncate(int newlen); native void Remove(int index, int remlen); - native String CharAt(int pos) const; - native int CharCodeAt(int pos) const; + deprecated("4.1") native String CharAt(int pos) const; + deprecated("4.1") native int CharCodeAt(int pos) const; + native int ByteAt(int pos) const; native String Filter(); native int IndexOf(String substr, int startIndex = 0) const; deprecated("3.5.1") native int LastIndexOf(String substr, int endIndex = 2147483647) const; @@ -911,6 +912,8 @@ struct StringStruct native native void Split(out Array tokens, String delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; native void AppendCharacter(int c); native void DeleteLastCharacter(); + native int CodePointCount(); + native int, int GetNextCodePoint(int position); } class SectorEffect : Thinker native diff --git a/wadsrc/static/zscript/ui/menu/listmenuitems.zs b/wadsrc/static/zscript/ui/menu/listmenuitems.zs index 4ed436c75..16b75ad0d 100644 --- a/wadsrc/static/zscript/ui/menu/listmenuitems.zs +++ b/wadsrc/static/zscript/ui/menu/listmenuitems.zs @@ -274,7 +274,7 @@ class ListMenuItemTextItem : ListMenuItemSelectable mFont = desc.mFont; mColor = desc.mFontColor; mColorSelected = desc.mFontcolor2; - mHotkey = hotkey.CharCodeAt(0); + mHotkey = hotkey.GetNextCodePoint(0); } void InitDirect(double x, double y, int height, String hotkey, String text, Font font, int color, int color2, Name child, int param = 0) @@ -284,7 +284,8 @@ class ListMenuItemTextItem : ListMenuItemSelectable mFont = font; mColor = color; mColorSelected = color2; - mHotkey = hotkey.CharCodeAt(0); + int pos = 0; + mHotkey = hotkey.GetNextCodePoint(0); } override void Drawer(bool selected) @@ -313,14 +314,14 @@ class ListMenuItemPatchItem : ListMenuItemSelectable void Init(ListMenuDescriptor desc, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(desc.mXpos, desc.mYpos, desc.mLinespacing, child, param); - mHotkey = hotkey.CharCodeAt(0); + mHotkey = hotkey.GetNextCodePoint(0); mTexture = patch; } void InitDirect(double x, double y, int height, TextureID patch, String hotkey, Name child, int param = 0) { Super.Init(x, y, height, child, param); - mHotkey = hotkey.CharCodeAt(0); + mHotkey = hotkey.GetNextCodePoint(0); mTexture = patch; } diff --git a/wadsrc/static/zscript/ui/menu/textentermenu.zs b/wadsrc/static/zscript/ui/menu/textentermenu.zs index 6fb150f29..2f179d0d7 100644 --- a/wadsrc/static/zscript/ui/menu/textentermenu.zs +++ b/wadsrc/static/zscript/ui/menu/textentermenu.zs @@ -271,7 +271,7 @@ class TextEnterMenu : Menu case MKEY_Enter: if (mInputGridOkay) { - int ch = InputGridChars.CharCodeAt(InputGridX + InputGridY * INPUTGRID_WIDTH); + int ch = InputGridChars.ByteAt(InputGridX + InputGridY * INPUTGRID_WIDTH); if (ch == 0) // end { if (mEnterString.Length() > 0) @@ -338,7 +338,7 @@ class TextEnterMenu : Menu for (int x = 0; x < INPUTGRID_WIDTH; ++x) { int xx = x * cell_width - INPUTGRID_WIDTH * cell_width / 2 + screen.GetWidth() / 2; - int ch = InputGridChars.CharCodeAt(y * INPUTGRID_WIDTH + x); + int ch = InputGridChars.ByteAt(y * INPUTGRID_WIDTH + x); int width = displayFont.GetCharWidth(ch); // The highlighted character is yellow; the rest are dark gray. diff --git a/wadsrc/static/zscript/ui/statscreen/statscreen.zs b/wadsrc/static/zscript/ui/statscreen/statscreen.zs index 2c592d21c..8c92b8ca7 100644 --- a/wadsrc/static/zscript/ui/statscreen/statscreen.zs +++ b/wadsrc/static/zscript/ui/statscreen/statscreen.zs @@ -306,7 +306,7 @@ class StatusScreen abstract play version("2.5") { // Digits are centered in a box the width of the '3' character. // Other characters (specifically, '-') are right-aligned in their cell. - int c = text.CharCodeAt(text_p); + int c = text.ByteAt(text_p); if (c >= "0" && c <= "9") { x -= fntwidth; diff --git a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs index c74baec74..6c4fbbb3f 100644 --- a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs +++ b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs @@ -124,7 +124,7 @@ class AltHud ui x += zerowidth / 2; for(int i=0; i < text.length(); i++) { - int c = text.CharCodeAt(i); + int c = text.ByteAt(i); int width = fnt.GetCharWidth(c); double offset = fnt.GetBottomAlignOffset(c); From 325b744f4a30d715b60197456f07bb6c58932d9f Mon Sep 17 00:00:00 2001 From: Nemrtvi Date: Sat, 13 Apr 2019 10:09:08 +0200 Subject: [PATCH 05/13] European BIGFONT for Chex Quest MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This covers French, German, Italian, Portugese, Spanish, and Swedish. Also adjusts the offsets of the inverted exclamation and question mark for Doom (so that they are in line with the colon sign). Chex also has its own colon sign, so I’m adding that too. --- .../filter/game-chex/fonts/bigfont/003A.lmp | Bin 105 -> 88 bytes .../filter/game-chex/fonts/bigfont/00A1.lmp | Bin 0 -> 117 bytes .../filter/game-chex/fonts/bigfont/00BF.lmp | Bin 0 -> 188 bytes .../filter/game-chex/fonts/bigfont/00C0.lmp | Bin 0 -> 239 bytes .../filter/game-chex/fonts/bigfont/00C1.lmp | Bin 0 -> 241 bytes .../filter/game-chex/fonts/bigfont/00C2.lmp | Bin 0 -> 246 bytes .../filter/game-chex/fonts/bigfont/00C3.lmp | Bin 0 -> 271 bytes .../filter/game-chex/fonts/bigfont/00C4.lmp | Bin 0 -> 247 bytes .../filter/game-chex/fonts/bigfont/00C5.lmp | Bin 0 -> 255 bytes .../filter/game-chex/fonts/bigfont/00C6.lmp | Bin 0 -> 342 bytes .../filter/game-chex/fonts/bigfont/00C7.lmp | Bin 0 -> 229 bytes .../filter/game-chex/fonts/bigfont/00C8.lmp | Bin 0 -> 214 bytes .../filter/game-chex/fonts/bigfont/00C9.lmp | Bin 0 -> 216 bytes .../filter/game-chex/fonts/bigfont/00CA.lmp | Bin 0 -> 217 bytes .../filter/game-chex/fonts/bigfont/00CB.lmp | Bin 0 -> 218 bytes .../filter/game-chex/fonts/bigfont/00CC.lmp | Bin 0 -> 129 bytes .../filter/game-chex/fonts/bigfont/00CD.lmp | Bin 0 -> 131 bytes .../filter/game-chex/fonts/bigfont/00CE.lmp | Bin 0 -> 147 bytes .../filter/game-chex/fonts/bigfont/00CF.lmp | Bin 0 -> 142 bytes .../filter/game-chex/fonts/bigfont/00D1.lmp | Bin 0 -> 273 bytes .../filter/game-chex/fonts/bigfont/00D2.lmp | Bin 0 -> 241 bytes .../filter/game-chex/fonts/bigfont/00D3.lmp | Bin 0 -> 243 bytes .../filter/game-chex/fonts/bigfont/00D4.lmp | Bin 0 -> 255 bytes .../filter/game-chex/fonts/bigfont/00D5.lmp | Bin 0 -> 273 bytes .../filter/game-chex/fonts/bigfont/00D6.lmp | Bin 0 -> 249 bytes .../filter/game-chex/fonts/bigfont/00D9.lmp | Bin 0 -> 243 bytes .../filter/game-chex/fonts/bigfont/00DA.lmp | Bin 0 -> 245 bytes .../filter/game-chex/fonts/bigfont/00DB.lmp | Bin 0 -> 253 bytes .../filter/game-chex/fonts/bigfont/00DC.lmp | Bin 0 -> 247 bytes .../filter/game-chex/fonts/bigfont/0152.lmp | Bin 0 -> 375 bytes .../filter/game-chex/fonts/bigfont/016E.lmp | Bin 0 -> 268 bytes .../filter/game-chex/fonts/bigfont/0178.lmp | Bin 0 -> 196 bytes .../filter/game-chex/fonts/bigfont/0401.lmp | Bin 0 -> 218 bytes .../filter/game-chex/fonts/bigfont/1E9E.lmp | Bin 0 -> 198 bytes .../filter/game-doom/fonts/bigfont/00A1.lmp | Bin 134 -> 134 bytes .../filter/game-doom/fonts/bigfont/00BF.lmp | Bin 252 -> 252 bytes .../filter/game-doom/fonts/bigupper/00A1.lmp | Bin 142 -> 142 bytes .../filter/game-doom/fonts/bigupper/00BF.lmp | Bin 255 -> 255 bytes 38 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00A1.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00BF.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C0.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C1.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C2.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C3.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C4.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C5.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C6.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C7.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C8.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C9.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CA.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CB.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CC.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CD.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CE.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CF.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D1.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D2.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D3.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D4.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D5.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D6.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D9.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00DA.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00DB.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/00DC.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/0152.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/016E.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/0178.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/0401.lmp create mode 100644 wadsrc_extra/static/filter/game-chex/fonts/bigfont/1E9E.lmp diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/003A.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/003A.lmp index f4d3a84320c78d37c11ddcf73e61b014f1a34e48..84d7ffb8d8abf5623197419d2026eda3f083b3f6 100644 GIT binary patch literal 88 zcmZQ!;ACK6`1@Z1NU8&|1rU1zF#~g9VL^2@D|1yba29~0tqG|>PR+g%&!V(4s bpg?(fc^ycgrlza{D8R@J(#60Aq5cB^J-ibA literal 105 zcmZQ&;9_84`2Sx9NNNJH6%cy^aSRYMGSvbBJDB{>z*1XVTv=Po2BonJltER1=>I7C E0i4|-hX4Qo diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00A1.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00A1.lmp new file mode 100644 index 0000000000000000000000000000000000000000..62189bc7fdc1e05828e4c81287e6f054454c4f68 GIT binary patch literal 117 zcmW-ZK@NZ*3#+g&`fhy~r*Rp#0Y^lt rYha70sCH~Q=K}jFaRE$-NCUBO;xk literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C0.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C0.lmp new file mode 100644 index 0000000000000000000000000000000000000000..9220e742fbb3a2d73eb3e40d301889bacad6f1ae GIT binary patch literal 239 zcmWm7+YQ1n3ga@eh6`N5!2_P~f;W8N3qP1!@BOlru~!vqOdu+|eT=GX9X1%LQH`;inT;_i2iALE z;}$_mHMcG-tLFj#QP~_+GqLk=9fWJrOsLkmph*O`x=BPrPR#6_YT4HPn#FqwH@xph U%tO}5ifP0#q8u~&xvM>zKMvzTvH$=8 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C1.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C1.lmp new file mode 100644 index 0000000000000000000000000000000000000000..73c2aed59ae7faec8a9606edbac7c5ed0d88b306 GIT binary patch literal 241 zcmW-a(G9{d3`AWhw50(t4xbFb2CM*5n%GI}p#HD}GcW}sFaZOwMY!Gqfk7 znhuypZ~|v=0eA2KPw)b7@Bv?7mfrhm%3Y%>gSCMuuQxHO^5AfRtPQiZc1(fw*1)J1 z)x(^VcrW3K WsHTH%lSWpk4y8mXA}O1?>{xzH9zh}i literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C2.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C2.lmp new file mode 100644 index 0000000000000000000000000000000000000000..78942222938250c26e3c41e924ef0720b0762cf0 GIT binary patch literal 246 zcmWlS%Mrpb3`CU>NDSdq4o3>018QK#AIXkoCO3MZ2x_1SDxd&rFw5a-cBPdx(t(IN zI-;Jy8C-w^cklpD@B(k}0bejKLI^om)2oWJHWJm(1YcGfZx`;g{Apb%@Bv2C35KI$ZbU+p#}5{YGEX75$&qCs}KL79t$ ZAn}UT-oOt<6Dyp-Q=*az^w|A1#1EkALU{lH literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C3.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C3.lmp new file mode 100644 index 0000000000000000000000000000000000000000..1712aa66e99e3300a54beb8898344010b7199e2d GIT binary patch literal 271 zcmXAj+ik-z3`OZz?K*aWZqv^UkR>`m0huBtnKC>?w#W?GA!B5S{J2-h$03MI9*Glu z6H!M$sAq5izres1+`t_?z!SW{M@2L@-urbu#@018QK#AIVN+CP!MJ2zsCjDxd&bFq^~M*_FN0ND~n? zbb_A21zdp#5AXyp@CG071wSw}A%tZqrc)JXZ6qqYLrSXbJYEo~wsxMIk=erJ$a?R# z@g$N7zv8k6HrPd_8lmh%T8;2FpxQZfd*{55I*Z^G9kHH7VxF1Vd(~3aTfH41YnBis Y-ca86$R=xIMKU-_lv9Qu+RelK0j-2W6aWAK literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C5.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C5.lmp new file mode 100644 index 0000000000000000000000000000000000000000..85c9407033816e4c2c09ed8ebfc98fbbe6ede6d6 GIT binary patch literal 255 zcmXAj-3`Jp41`VjX@HiBZFpn=Hed#%)UlJ+L0y0$*nuIKf(aOa*K&o2?{xNAmsGST zq9q-mM{ojXz~Bb%-~pcC1>WET>UjvE@5fDPrmgppXe>7=nMun?FwP29vt=dXz3*}q zyOvnfLe dg$!9k(0DQ5FSd4??D8eDnHp| zO86hojNmCU9QQn|lyi|>^0okTm?;HA>Q_h4EXE9djNy8J(7&EL(ZFw Zz{Nd|(;}-1eyMf4W%vDhANr-H_6Pr?U!4E| literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C7.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00C7.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8f0d7f4669adc2aade75d98f0b07f48d6cc7615c GIT binary patch literal 229 zcmXBM+mXUB3)zfrAG;;Sc`d1-&UHmo!O?ts7%>A(yCuxzS;sy?2b3Ii*I&X>yX6-BKl}wdYP% z8*N2=!6Un^)oWBe_o_sV2IgRiMkAux>AYqek#N6{CWL5e#TC|a_6g@hNvLQY{3X|;>J!|r8}?&Td-Jh`f*Rz^I4wY4geM&nos4W zycJPC%2)X*_KFy=W(^EE@7BkNA*^#Gq5`nPP%E?bDJAAYTsR%IAqpa0PYrT%AlUoU zxz+_DIX9VkPTS_KNa&kk)OSd&O?n!g^OpHoSR+!pzbtF7MQBxj9Mp%)kvG$4*#E7( BHUkYy%41`T%lp=!EF&Kdr*n$z_#EIR9+7(!YE!e9#<;Qoj?sUE$1^_^~n?8)E z@iL0>Ha^DJz$;OtshUu%b;pnr#kiEj%p<^l>O`gqL(W-bWEmwl8wTd6kn##Odr&$| zU&;)S*!$j)Jc!sqCT11O-^)SXL0P%{M19CbZ zTM_F!A_<{))5P00_?%-6+fEfp*0pyc6vE(DkHC2#ms)tgm+I#%ixs-o7UFd1#nl`8 EA0VMNRsaA1 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CB.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CB.lmp new file mode 100644 index 0000000000000000000000000000000000000000..d2330ccfbe5fb83362af4d4abe00ee9d9f5e6610 GIT binary patch literal 218 zcmW-a;Squ`3`PS*%N?Ao;RtTw5H66kX_E>ELpXB5O>JYgHl`T ziLC8HVDG(4DIUi(sA7{>kv9+lJt23N` D9V9jE literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CC.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CC.lmp new file mode 100644 index 0000000000000000000000000000000000000000..2e249a2cf8e8eee4b1c7d40ea5e1d7859d6f0c02 GIT binary patch literal 129 zcmX|(!4ZQn38{AYma#V$!;id1Pny9{acv3xJGA>>579SNI9@ z#DShFM5Nl%plX)qUP-O;z8lc6l(JP23vX;y2~_-nPwAbKPh}B6951J literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CF.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00CF.lmp new file mode 100644 index 0000000000000000000000000000000000000000..bfa80cbcee02c017b3febdd1c265ce1803e41188 GIT binary patch literal 142 zcmX|(F%E-33F3j} H_do3iJ=i0h literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D1.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D1.lmp new file mode 100644 index 0000000000000000000000000000000000000000..40c23f16ee4bfce420803fce029c16dc7b3b4c6e GIT binary patch literal 273 zcmX|*-EG4#41_5swgT8F+Fd$ASLhaf5GhL5AN-abxNy89i8(}X&7#~4znwb)k1QOi2y*Xs{ccS`yI literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D2.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D2.lmp new file mode 100644 index 0000000000000000000000000000000000000000..a7077d8aad70002598e9d612f3549a821e815fec GIT binary patch literal 241 zcmW-bfo%dY3`Kt-M`-Va7={6upd+vWQj&8>;zTe3L$E_vU<5W`kMOUSp5^~-*&eY6 zU~phQl3#Knk=)6H{E;VlkvG}cd3KCeN*}(L%DYsPNH?R13o+!DqtCfxrJ9nNoC~F? zy|x?@(6Q!N&WkUW3xO7Ruzy+A3Lh&lnHc?r-fG8okRYuk&o#8nREqaig*sko3}Z^l Z2WGicSlfpm;C9xm%`S4Y{lCFP@d3;8Lzn;n literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D3.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D3.lmp new file mode 100644 index 0000000000000000000000000000000000000000..ee9ce64587e6a634fc7b33341b408ede745f9ba9 GIT binary patch literal 243 zcmW-b-3`Jp41^6zNuhn{Fbu#1jKBtnBz2l!l{c1P3ASJaHeii##?oi`PP&r^nutiz z5&Hzr-~w*o0iNIm-rxhiV5jHVU}{RO+skE5D1o`Df!R3kVvXL$*wko@OEv4YMi+?M zW*b7zVzWjQQFR_R^~goCz7UPdd%K7^dC`s?*BUH}{sod!V@lSR%y9h*yBpAp7iL}x UY2CU5(fyiZu3F@-my`^|4+R241^@s6 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D4.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D4.lmp new file mode 100644 index 0000000000000000000000000000000000000000..b57a884155cb363a860d676b311edd02b7582db5 GIT binary patch literal 255 zcmW-b+i}7$5Jj(zj7ZFYi=lv2kS6lYjI>&zhc%>ul#wpd15Km@8c?pYGiM+7<47|W z00tNKH}XzCNFrb4oBWUm`6W-Xw;?!IE2U2_+vZ(blWHG_5Q3RiokYnkN1t;a&LRa) zN~`wXvQXWzIH!P9OCQiAZsE>*PGdM$;Amp>H|E2rO6^fZMO#arF2>_2B^2-1s!ZaY h(Qcq@np3L$PSD#5Yy0#Hd|qp=&2H!Z@c$$mk3SWoMdJVf literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D5.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D5.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f0e70e7b54ef61722508efa683eac7991b096f30 GIT binary patch literal 273 zcmXAj;Z4La3`W0}v;hj@*yRRb0;b?EQsO#InwYyOSc4@Pf-xAOd=ZwOl|0*t7d!)) zaAtlXujGwAeu^Qtta=QiYAMsA8YD@vl42my2KkR_GQTqEoOzcL*<*KFfZ#pFCj( zFyf2(OfKY`7)PB$uO#Fxt2PWFn2nQah$&jNBxVhBN*h94 zYw`DLF#~P)Nu!{i8K^N)8l4FDFu9cEMgfEHd_2XdQESaYi!RSO7px*%QA+9F?S}5- bCQkUsqPGp+H+KXc*J7pm-tG^5sRx@kS=dAW literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D9.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/00D9.lmp new file mode 100644 index 0000000000000000000000000000000000000000..419fc33df90d7bf8a3fe449b588f4b8a8f92173c GIT binary patch literal 243 zcmXxefsMj2387^>z8{FXmVQZFi)_L(#YWN(-IL646opP>WU}lk1jIKOQl{W6G zVaJ@^eexo#M3owmXx0v0*Y$rm7E|BXkH)Z4Z1}C0!Y+@lx(;=bcJrw9Xdlt=m^YBfKWJsB!E}+ z^g=|AUa`NyJA6QgFZhNZ_=P|C2X|DhwaT{lbv1X2F~ktKX{y!6A*JLzGv}N_=)$ep z@XXwZYwx}FHM0;IxezkaCO^;f@`~UM*#+epqff6Wz7LdYsf~9AT zpX~YL2Rc(*7w`;T!3b{P4Sax4@CClX5BLT59nm9r0vGTC4nC!TRZCgBW2-pmtRgF& zL_*Bbs%17?=^R2Vb@EHKs6?9(kG@1T<|Z6-o{0vRGh-m!h*6@{s*I)j-eW*Dh;U`&^zi0mCwN~%S)Xxc@LX`wNBGTuawQ14xzbGlv! nXBKwNEX(40k?8&4RR1+{+UJEMRIC literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/016E.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/016E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..8121b55c71959c235c1d314c39a773a25ea40616 GIT binary patch literal 268 zcmXYr(QU&p3`8$R6+5**nq4|UH|P}o3P3TUBuj?dHM&Em=n~nYBSbkHJ>gNHjubiK z48Y-)@r}Hb5AsF6$q)G@H}XgB#GP`EF{WiLwKn(cy?7Cw^EJkH=*&uSqpF5*6)8#Q zx#7u7BHt%fUS%#dXaX9XNJR#YW8e3~Cr=g|1{$inF*%@k+iK5d>_$#`Q_}s1!wUxj n++ddmCavqZC*0({28$Lfa0HqgQ_7`Y)@4}-=Eu`k_OJE;8Z=B6 literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/0178.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/0178.lmp new file mode 100644 index 0000000000000000000000000000000000000000..51587d514a2e1dc45f398761bcf47409472c9551 GIT binary patch literal 196 zcmW;E%?-jZ3C5IT*{>Z1AI*Xv$QjCtZYK(mt(Ih(~)O+TZ t{4}A-oU@%ELpXB5O>JYgHl`T ziLC8HVDG(4DIUi(sA7{>kv9+lJt23N` D9V9jE literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-chex/fonts/bigfont/1E9E.lmp b/wadsrc_extra/static/filter/game-chex/fonts/bigfont/1E9E.lmp new file mode 100644 index 0000000000000000000000000000000000000000..f96d377f2f4a713aa8a33e2058e665c009a7b40b GIT binary patch literal 198 zcmXxc!41MN3gm(hDoF0z0r?_^pKHcks9DnHDN-sbwoP#MuSQOliH6=RrP+zZ p^URDx2*PSHpTWLk_C6Ndb_Cr}iefX4wHB***Lrt8^@I2Rn19Q!F;M^j literal 0 HcmV?d00001 diff --git a/wadsrc_extra/static/filter/game-doom/fonts/bigfont/00A1.lmp b/wadsrc_extra/static/filter/game-doom/fonts/bigfont/00A1.lmp index da7389a7bc28fc02ab895c3453928017437705b6..c7722ff5e30fe8c3f3e2fa1dd87f9d144e0119a5 100644 GIT binary patch delta 15 WcmZo;Y-40+W8h(6VE8|gy&eD+_5(fu delta 15 WcmZo;Y-40+W8h(6VE8kUy&eD+>H|9f diff --git a/wadsrc_extra/static/filter/game-doom/fonts/bigfont/00BF.lmp b/wadsrc_extra/static/filter/game-doom/fonts/bigfont/00BF.lmp index b4a5cc7b69d5cc023e286973a81bd01662728bb1..47a6d9b08bc24e739cf1c129f2ce94c600c36463 100644 GIT binary patch delta 15 Wcmeyv_=l05kAa7Qf#Lr|_OAdVqy(q{ delta 15 Wcmeyv_=l05kAa7Qf#J_Y_OAdVm;|K& diff --git a/wadsrc_extra/static/filter/game-doom/fonts/bigupper/00A1.lmp b/wadsrc_extra/static/filter/game-doom/fonts/bigupper/00A1.lmp index 1bed4cbffc77f02d0828b4e202057550209663bf..a752f40ef20af6cbcdeb8dc5853a3db2160a7ca0 100644 GIT binary patch delta 15 WcmeBU>||H}5) diff --git a/wadsrc_extra/static/filter/game-doom/fonts/bigupper/00BF.lmp b/wadsrc_extra/static/filter/game-doom/fonts/bigupper/00BF.lmp index 2a66f8f4064e998c06ea5e2acd330a20c7fee47a..073483d30c3713de368790ccae7ddc49b6bbef59 100644 GIT binary patch delta 15 Wcmey*_@9xTmw}&wf#Lr|_8$Nw2?VnM delta 15 Wcmey*_@9xTmw}&wf#J_Y_8$Nv{RFT8 From f7561f25d60279e5df07200460a513270a8c355d Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 13 Apr 2019 10:12:33 +0200 Subject: [PATCH 06/13] - added Unicode aware MakeUpper/MakeLower functions to FString and ZScript's String and deprecated ToUpper/ToLower because their semantics did not allow fixing them. --- src/scripting/vmthunks.cpp | 22 ++++++++++++++++++++++ src/utility/zstring.cpp | 35 ++++++++++++++++++++++------------- src/utility/zstring.h | 3 ++- wadsrc/static/zscript/base.zs | 6 ++++-- 4 files changed, 50 insertions(+), 16 deletions(-) diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 4bf34ede8..18d9b214e 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -263,6 +263,28 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, ToLower, StringToLower) return 0; } +static void StringMakeUpper(FString *self, FString *out) +{ + *out = self->MakeUpper(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, MakeUpper, StringMakeUpper) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + ACTION_RETURN_STRING(self->MakeUpper()); +} + +static void StringMakeLower(FString *self, FString *out) +{ + *out = self->MakeLower(); +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, MakeLower, StringMakeLower) +{ + PARAM_SELF_STRUCT_PROLOGUE(FString); + ACTION_RETURN_STRING(self->MakeLower()); +} + static int StringToInt(FString *self, int base) { return (int)self->ToLong(base); diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index 6bcf36c7f..efb79a460 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -40,6 +40,7 @@ #include "zstring.h" #include "v_text.h" #include "utf8.h" +#include "fontinternals.h" FNullStringData FString::NullString = { @@ -680,22 +681,30 @@ void FString::ToLower () UnlockBuffer(); } -void FString::SwapCase () +FString FString::MakeLower() { - LockBuffer(); - size_t max = Len(); - for (size_t i = 0; i < max; ++i) + TArray builder(Len()); + int pos = 0; + while (int c = GetNextCharacter(pos)) { - if (isupper(Chars[i])) - { - Chars[i] = (char)tolower(Chars[i]); - } - else - { - Chars[i] = (char)toupper(Chars[i]); - } + if (c < 65536) c = lowerforupper[c]; + auto cp = MakeUTF8(c); + while (auto uc = *cp++) builder.Push(uc); } - UnlockBuffer(); + return FString(builder); +} + +FString FString::MakeUpper() +{ + TArray builder(Len()); + int pos = 0; + while (int c = GetNextCharacter(pos)) + { + if (c < 65536) c = upperforlower[c]; + auto cp = MakeUTF8(c); + while (auto uc = *cp++) builder.Push(uc); + } + return FString(builder); } void FString::StripLeft () diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 35e7be700..9c7a2ffd1 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -238,7 +238,8 @@ public: void ToUpper (); void ToLower (); - void SwapCase (); + FString MakeUpper(); + FString MakeLower(); void StripLeft (); void StripLeft (const FString &charset); diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index 18a80287b..0938c9ab8 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -905,8 +905,10 @@ struct StringStruct native native int IndexOf(String substr, int startIndex = 0) const; deprecated("3.5.1") native int LastIndexOf(String substr, int endIndex = 2147483647) const; native int RightIndexOf(String substr, int endIndex = 2147483647) const; - native void ToUpper(); - native void ToLower(); + deprecated("4.1") native void ToUpper(); + deprecated("4.1") native void ToLower(); + native String MakeUpper(); + native String MakeLower(); native int ToInt(int base = 0) const; native double ToDouble() const; native void Split(out Array tokens, String delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; From 393811919287d1e306a8b2aece4c0ba6f4402b22 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 13 Apr 2019 10:26:55 +0200 Subject: [PATCH 07/13] - added CharUpper and CharLower functions to ZScript. These, like MakeUpper and MakeLower, use the internal Unicode case conversion tables. --- src/scripting/vmthunks.cpp | 26 ++++++++++++++++++++++++++ wadsrc/static/zscript/base.zs | 2 ++ 2 files changed, 28 insertions(+) diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 18d9b214e..5cdd1aaca 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -50,6 +50,7 @@ #include "am_map.h" #include "v_video.h" #include "gi.h" +#include "fontinternals.h" #include "intermission/intermission.h" DVector2 AM_GetPosition(); @@ -285,6 +286,31 @@ DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, MakeLower, StringMakeLower) ACTION_RETURN_STRING(self->MakeLower()); } +static int StringCharUpper(int ch) +{ + return ch >= 0 && ch < 65536 ? upperforlower[ch] : ch; +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, CharUpper, StringCharUpper) +{ + PARAM_PROLOGUE; + PARAM_INT(ch); + ACTION_RETURN_INT(StringCharUpper(ch)); +} + +static int StringCharLower(int ch) +{ + return ch >= 0 && ch < 65536 ? lowerforupper[ch] : ch; +} + +DEFINE_ACTION_FUNCTION_NATIVE(FStringStruct, CharLower, StringCharLower) +{ + PARAM_PROLOGUE; + PARAM_INT(ch); + ACTION_RETURN_INT(StringCharLower(ch)); +} + + static int StringToInt(FString *self, int base) { return (int)self->ToLong(base); diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index 0938c9ab8..3c86611f3 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -909,6 +909,8 @@ struct StringStruct native deprecated("4.1") native void ToLower(); native String MakeUpper(); native String MakeLower(); + native static int CharUpper(int ch); + native static int CharLower(int ch); native int ToInt(int base = 0) const; native double ToDouble() const; native void Split(out Array tokens, String delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; From d73f8faafa4d22e45af92cb2442d1b629ed8196f Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 13 Apr 2019 12:17:38 +0200 Subject: [PATCH 08/13] - added monospacing support to Screen.DrawText and its native counterparts. --- src/g_statusbar/shared_sbar.cpp | 24 ++++--------------- src/rendering/2d/v_draw.cpp | 12 +++++++++- src/rendering/2d/v_drawtext.cpp | 22 ++++++++++++++++- src/v_video.h | 12 ++++++++++ wadsrc/static/zscript/base.zs | 2 ++ wadsrc/static/zscript/constants.zs | 8 +++++++ wadsrc/static/zscript/ui/statusbar/alt_hud.zs | 16 ++----------- 7 files changed, 61 insertions(+), 35 deletions(-) diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 85f0ae665..46e3af0ca 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -552,23 +552,6 @@ void DBaseStatusBar::BeginHUD(int resW, int resH, double Alpha, bool forcescaled void FormatMapName(FLevelLocals *self, int cr, FString *result); -static void DrawAMText(FFont *fnt, int color, const char *text, int vwidth, int vheight, int x, int y) -{ - int zerowidth = fnt->GetCharWidth('0'); - - x += zerowidth / 2; - for (int i = 0; text[i]; i++) - { - int c = text[i]; - int width = fnt->GetCharWidth(c); - - screen->DrawChar(fnt, color, x, y, c, DTA_KeepRatio, true, - DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, DTA_LeftOffset, width / 2, TAG_DONE); - x += zerowidth; - } -} - - void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight) { auto scale = GetUIScale(hud_scale); @@ -580,12 +563,14 @@ void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight) int sec; int y = 0; int textdist = 4; + int zerowidth = font->GetCharWidth('0'); if (am_showtime) { sec = Tics2Seconds(primaryLevel->time); textbuffer.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); - DrawAMText(font, crdefault, textbuffer, vwidth, vheight, vwidth - font->GetCharWidth('0') * 8 - textdist, y); + screen->DrawText(font, crdefault, vwidth - zerowidth * 8 - textdist, y, textbuffer, DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, + DTA_Monospace, EMonospacing::CellCenter, DTA_Spacing, zerowidth, DTA_KeepRatio, true, TAG_END); y += fheight; } @@ -593,7 +578,8 @@ void DBaseStatusBar::DoDrawAutomapHUD(int crdefault, int highlight) { sec = Tics2Seconds(primaryLevel->totaltime); textbuffer.Format("%02d:%02d:%02d", sec / 3600, (sec % 3600) / 60, sec % 60); - DrawAMText(font, crdefault, textbuffer, vwidth, vheight, vwidth - font->GetCharWidth('0') * 8 - textdist, y); + screen->DrawText(font, crdefault, vwidth - zerowidth * 8 - textdist, y, textbuffer, DTA_VirtualWidth, vwidth, DTA_VirtualHeight, vheight, + DTA_Monospace, EMonospacing::CellCenter, DTA_Spacing, zerowidth, DTA_KeepRatio, true, TAG_END); } if (!deathmatch) diff --git a/src/rendering/2d/v_draw.cpp b/src/rendering/2d/v_draw.cpp index 5cf593bbb..0f77380b9 100644 --- a/src/rendering/2d/v_draw.cpp +++ b/src/rendering/2d/v_draw.cpp @@ -545,6 +545,8 @@ bool DFrameBuffer::ParseDrawTextureTags(FTexture *img, double x, double y, uint3 parms->srcwidth = 1.; parms->srcheight = 1.; parms->burn = false; + parms->monospace = EMonospacing::Off; + parms->spacing = 0; // Parse the tag list for attributes. (For floating point attributes, // consider that the C ABI dictates that all floats be promoted to @@ -896,7 +898,15 @@ bool DFrameBuffer::ParseDrawTextureTags(FTexture *img, double x, double y, uint3 case DTA_CellY: parms->celly = ListGetInt(tags); break; - + + case DTA_Monospace: + parms->monospace = ListGetInt(tags); + break; + + case DTA_Spacing: + parms->spacing = ListGetInt(tags); + break; + case DTA_Burn: parms->burn = true; break; diff --git a/src/rendering/2d/v_drawtext.cpp b/src/rendering/2d/v_drawtext.cpp index 2d1996a4b..2e0302dca 100644 --- a/src/rendering/2d/v_drawtext.cpp +++ b/src/rendering/2d/v_drawtext.cpp @@ -296,6 +296,11 @@ void DFrameBuffer::DrawTextCommon(FFont *font, int normalcolor, double x, double cx = x; cy = y; + if (parms.monospace == EMonospacing::CellCenter) + cx += parms.spacing / 2; + else if (parms.monospace == EMonospacing::CellRight) + cx += parms.spacing; + auto currentcolor = normalcolor; while (ch - string < parms.maxstrlen) @@ -334,9 +339,24 @@ void DFrameBuffer::DrawTextCommon(FFont *font, int normalcolor, double x, double parms.destwidth = parms.cellx; parms.destheight = parms.celly; } + if (parms.monospace == EMonospacing::CellLeft) + parms.left = 0; + else if (parms.monospace == EMonospacing::CellCenter) + parms.left = w / 2.; + else if (parms.monospace == EMonospacing::CellRight) + parms.left = w; + DrawTextureParms(pic, parms); } - cx += (w + kerning) * parms.scalex; + if (parms.monospace == EMonospacing::Off) + { + cx += (w + kerning + parms.spacing) * parms.scalex; + } + else + { + cx += (parms.spacing) * parms.scalex; + } + } } diff --git a/src/v_video.h b/src/v_video.h index 39089388c..be3246515 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -236,6 +236,16 @@ enum DTA_SrcHeight, DTA_LegacyRenderStyle, // takes an old-style STYLE_* constant instead of an FRenderStyle DTA_Burn, // activates the burn shader for this element + DTA_Spacing, // Strings only: Additional spacing between characters + DTA_Monospace, // Fonts only: Use a fixed distance between characters. +}; + +enum EMonospacing +{ + Off = 0, + CellLeft = 1, + CellCenter = 2, + CellRight = 3 }; enum @@ -286,6 +296,8 @@ struct DrawParms int desaturate; int scalex, scaley; int cellx, celly; + int monospace; + int spacing; int maxstrlen; bool fortext; bool virtBottom; diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index 3c86611f3..2a9295d67 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -186,6 +186,8 @@ enum DrawTextureTags DTA_SrcHeight, DTA_LegacyRenderStyle, // takes an old-style STYLE_* constant instead of an FRenderStyle DTA_Internal3, + DTA_Spacing, // Strings only: Additional spacing between characters + DTA_Monospace, // Strings only: Use a fixed distance between characters. }; class Shape2D : Object native diff --git a/wadsrc/static/zscript/constants.zs b/wadsrc/static/zscript/constants.zs index ad3065fe4..a4b6b756b 100644 --- a/wadsrc/static/zscript/constants.zs +++ b/wadsrc/static/zscript/constants.zs @@ -1344,3 +1344,11 @@ enum ECompatFlags COMPATF2_EXPLODE2 = 1 << 9, // Use original explosion code throughout. COMPATF2_RAILING = 1 << 10, // Bugged Strife railings. }; + +enum EMonospacing +{ + Mono_Off = 0, + Mono_CellLeft = 1, + Mono_CellCenter = 2, + Mono_CellRight = 3 +}; diff --git a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs index 6c4fbbb3f..317999921 100644 --- a/wadsrc/static/zscript/ui/statusbar/alt_hud.zs +++ b/wadsrc/static/zscript/ui/statusbar/alt_hud.zs @@ -120,20 +120,8 @@ class AltHud ui void DrawHudText(Font fnt, int color, String text, int x, int y, double trans = 0.75) { int zerowidth = fnt.GetCharWidth("0"); - - x += zerowidth / 2; - for(int i=0; i < text.length(); i++) - { - int c = text.ByteAt(i); - int width = fnt.GetCharWidth(c); - double offset = fnt.GetBottomAlignOffset(c); - - screen.DrawChar(fnt, color, x, y, c, - DTA_KeepRatio, true, - DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, DTA_Alpha, trans, - DTA_LeftOffset, width/2, DTA_TopOffsetF, offset); - x += zerowidth; - } + screen.DrawText(fnt, color, x, y-fnt.GetHeight(), text, DTA_VirtualWidth, hudwidth, DTA_VirtualHeight, hudheight, + DTA_KeepRatio, true, DTA_Alpha, trans, DTA_Monospace, MONO_CellCenter, DTA_Spacing, zerowidth); } From 5f2d41884c6ab643252aa06fd1d45fe02dce7887 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 13 Apr 2019 13:58:37 +0200 Subject: [PATCH 09/13] - make sure that the global and default language tables are always separate, if some other tables is being attempted to be filled in along with them, these tables should be ignored. --- src/gamedata/stringtable.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index 2e249a0f9..ea8fa074b 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -293,10 +293,12 @@ void FStringTable::LoadLanguage (const TArray &buffer) } if (len == 1 && sc.String[0] == '*') { + activeMaps.Clear(); activeMaps.Push(global_table); } else if (len == 7 && stricmp (sc.String, "default") == 0) { + activeMaps.Clear(); activeMaps.Push(default_table); } else @@ -307,7 +309,8 @@ void FStringTable::LoadLanguage (const TArray &buffer) } else { - activeMaps.Push(MAKE_ID(tolower(sc.String[0]), tolower(sc.String[1]), tolower(sc.String[2]), 0)); + if (activeMaps.Size() != 1 || (activeMaps[0] != default_table && activeMaps[0] != global_table)) + activeMaps.Push(MAKE_ID(tolower(sc.String[0]), tolower(sc.String[1]), tolower(sc.String[2]), 0)); } sc.MustGetString (); } while (!sc.Compare ("]")); From 4668fa95e35d002f3d0fdc2d208c4452969f6018 Mon Sep 17 00:00:00 2001 From: Christoph Oelckers Date: Sat, 13 Apr 2019 14:43:49 +0200 Subject: [PATCH 10/13] - when altering the default string table, make sure that all existing text for the given label is removed that comes from an older resource file. If this isn't done there can be a mix of content from different sources, depending on the language. It's better to have correct English text than unfitting localized versions. --- src/gamedata/d_dehacked.cpp | 15 ++++++++--- src/gamedata/stringtable.cpp | 50 ++++++++++++++++++++++++++++++------ src/gamedata/stringtable.h | 8 +++--- 3 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/gamedata/d_dehacked.cpp b/src/gamedata/d_dehacked.cpp index c7105117d..7156796db 100644 --- a/src/gamedata/d_dehacked.cpp +++ b/src/gamedata/d_dehacked.cpp @@ -282,6 +282,7 @@ static int PatchSize; static char *Line1, *Line2; static int dversion, pversion; static bool including, includenotext; +static int LumpFileNum; static const char *unknown_str = "Unknown key %s encountered in %s %d.\n"; @@ -2169,7 +2170,7 @@ static int PatchMusic (int dummy) keystring << "MUSIC_" << Line1; - TableElement te = { newname, newname, newname, newname }; + TableElement te = { LumpFileNum, { newname, newname, newname, newname } }; DehStrings.Insert(keystring, te); DPrintf (DMSG_SPAMMY, "Music %s set to:\n%s\n", keystring.GetChars(), newname.GetChars()); } @@ -2285,7 +2286,7 @@ static int PatchText (int oldSize) if (str != NULL) { FString newname = newStr; - TableElement te = { newname, newname, newname, newname }; + TableElement te = { LumpFileNum, { newname, newname, newname, newname } }; DehStrings.Insert(str, te); EnglishStrings.Remove(str); // remove entry so that it won't get found again by the next iteration or by another replacement later good = true; @@ -2340,7 +2341,7 @@ static int PatchStrings (int dummy) // Account for a discrepancy between Boom's and ZDoom's name for the red skull key pickup message const char *ll = Line1; if (!stricmp(ll, "GOTREDSKULL")) ll = "GOTREDSKUL"; - TableElement te = { holdstring, holdstring, holdstring, holdstring }; + TableElement te = { LumpFileNum, { holdstring, holdstring, holdstring, holdstring } }; DehStrings.Insert(ll, te); DPrintf (DMSG_SPAMMY, "%s set to:\n%s\n", Line1, holdstring.GetChars()); } @@ -2496,13 +2497,19 @@ int D_LoadDehLumps(DehLumpSource source) bool D_LoadDehLump(int lumpnum) { + auto ls = LumpFileNum; + LumpFileNum = Wads.GetLumpFile(lumpnum); + PatchSize = Wads.LumpLength(lumpnum); PatchName = copystring(Wads.GetLumpFullPath(lumpnum)); PatchFile = new char[PatchSize + 1]; Wads.ReadLump(lumpnum, PatchFile); PatchFile[PatchSize] = '\0'; // terminate with a '\0' character - return DoDehPatch(); + auto res = DoDehPatch(); + LumpFileNum = ls; + + return res; } bool D_LoadDehFile(const char *patchfile) diff --git a/src/gamedata/stringtable.cpp b/src/gamedata/stringtable.cpp index ea8fa074b..724951c22 100644 --- a/src/gamedata/stringtable.cpp +++ b/src/gamedata/stringtable.cpp @@ -67,8 +67,8 @@ void FStringTable::LoadStrings () { auto lumpdata = Wads.ReadLumpIntoArray(lump); - if (!ParseLanguageCSV(lumpdata)) - LoadLanguage (lumpdata); + if (!ParseLanguageCSV(lump, lumpdata)) + LoadLanguage (lump, lumpdata); } UpdateLanguage(); allMacros.Clear(); @@ -191,7 +191,7 @@ bool FStringTable::readMacros(int lumpnum) // //========================================================================== -bool FStringTable::ParseLanguageCSV(const TArray &buffer) +bool FStringTable::ParseLanguageCSV(int lumpnum, const TArray &buffer) { if (memcmp(buffer.Data(), "default,", 8)) return false; auto data = parseCSV(buffer); @@ -199,6 +199,7 @@ bool FStringTable::ParseLanguageCSV(const TArray &buffer) int labelcol = -1; int filtercol = -1; TArray> langrows; + bool hasDefaultEntry = false; if (data.Size() > 0) { @@ -221,6 +222,7 @@ bool FStringTable::ParseLanguageCSV(const TArray &buffer) if (lang.CompareNoCase("default") == 0) { langrows.Push(std::make_pair(column, default_table)); + hasDefaultEntry = true; } else if (lang.Len() < 4) { @@ -243,12 +245,16 @@ bool FStringTable::ParseLanguageCSV(const TArray &buffer) } FName strName = row[labelcol]; + if (hasDefaultEntry) + { + DeleteForLabel(lumpnum, strName); + } for (auto &langentry : langrows) { auto str = row[langentry.first]; if (str.Len() > 0) { - InsertString(langentry.second, strName, str); + InsertString(lumpnum, langentry.second, strName, str); } else { @@ -266,7 +272,7 @@ bool FStringTable::ParseLanguageCSV(const TArray &buffer) // //========================================================================== -void FStringTable::LoadLanguage (const TArray &buffer) +void FStringTable::LoadLanguage (int lumpnum, const TArray &buffer) { bool errordone = false; TArray activeMaps; @@ -363,10 +369,14 @@ void FStringTable::LoadLanguage (const TArray &buffer) } if (!skip) { + if (activeMaps[0] == default_table) + { + DeleteForLabel(lumpnum, strName); + } // Insert the string into all relevant tables. for (auto map : activeMaps) { - InsertString(map, strName, strText); + InsertString(lumpnum, map, strName, strText); } } } @@ -384,16 +394,40 @@ void FStringTable::DeleteString(int langid, FName label) allStrings[langid].Remove(label); } +//========================================================================== +// +// This deletes all older entries for a given label. This gets called +// when a string in the default table gets updated. +// +//========================================================================== + +void FStringTable::DeleteForLabel(int lumpnum, FName label) +{ + decltype(allStrings)::Iterator it(allStrings); + decltype(allStrings)::Pair *pair; + auto filenum = Wads.GetLumpFile(lumpnum); + + while (it.NextPair(pair)) + { + auto entry = pair->Value.CheckKey(label); + if (entry && entry->filenum < filenum) + { + pair->Value.Remove(label); + } + } + +} + //========================================================================== // // // //========================================================================== -void FStringTable::InsertString(int langid, FName label, const FString &string) +void FStringTable::InsertString(int lumpnum, int langid, FName label, const FString &string) { const char *strlangid = (const char *)&langid; - TableElement te = { string, string, string, string }; + TableElement te = { lumpnum, { string, string, string, string } }; long index; while ((index = te.strings[0].IndexOf("@[")) >= 0) { diff --git a/src/gamedata/stringtable.h b/src/gamedata/stringtable.h index e96d29c58..37dac5553 100644 --- a/src/gamedata/stringtable.h +++ b/src/gamedata/stringtable.h @@ -49,6 +49,7 @@ struct TableElement { + int filenum; FString strings[4]; }; @@ -104,14 +105,15 @@ private: LangMap allStrings; TArray> currentLanguageSet; - void LoadLanguage (const TArray &buffer); + void LoadLanguage (int lumpnum, const TArray &buffer); TArray> parseCSV(const TArray &buffer); - bool ParseLanguageCSV(const TArray &buffer); + bool ParseLanguageCSV(int lumpnum, const TArray &buffer); bool LoadLanguageFromSpreadsheet(int lumpnum, const TArray &buffer); bool readMacros(int lumpnum); - void InsertString(int langid, FName label, const FString &string); + void InsertString(int lumpnum, int langid, FName label, const FString &string); void DeleteString(int langid, FName label); + void DeleteForLabel(int lumpnum, FName label); static size_t ProcessEscapes (char *str); }; From 747906730c8a6306b818014a136d08b3afa9818d Mon Sep 17 00:00:00 2001 From: Player701 Date: Sat, 13 Apr 2019 19:10:58 +0300 Subject: [PATCH 11/13] Added support for monospacing alignment modes to HUDFont / BaseStatusBar.DrawString (#810) * - Added support for monospacing alignment modes to HUDFont / BaseStatusBar.DrawString * - added underlying type declaration for EMonospacing * - replaced "#include v_video.h" with a declaration of EMonospacing --- src/g_statusbar/sbar.h | 10 ++++++---- src/g_statusbar/shared_sbar.cpp | 14 ++++++++++---- src/scripting/vmthunks.cpp | 8 ++++---- src/v_video.h | 2 +- wadsrc/static/zscript/ui/statusbar/doom_sbar.zs | 4 ++-- wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs | 6 +++--- wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs | 6 +++--- wadsrc/static/zscript/ui/statusbar/statusbar.zs | 2 +- wadsrc/static/zscript/ui/statusbar/strife_sbar.zs | 6 +++--- 9 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/g_statusbar/sbar.h b/src/g_statusbar/sbar.h index 55d26e71b..1b89190ca 100644 --- a/src/g_statusbar/sbar.h +++ b/src/g_statusbar/sbar.h @@ -52,6 +52,8 @@ enum EHudState HUD_AltHud // Used for passing through popups to the alt hud }; +enum EMonospacing : int; + // HUD Message base object -------------------------------------------------- // This is a mo-op base class to allow derived ZScript message types that can be managed by the status bar. @@ -332,12 +334,12 @@ class DHUDFont : public DObject public: FFont *mFont; int mSpacing; - bool mMonospaced; + EMonospacing mMonospacing; int mShadowX; int mShadowY; - DHUDFont(FFont *f, int sp, bool ms, int sx, int sy) - : mFont(f), mSpacing(sp), mMonospaced(ms), mShadowX(sx), mShadowY(sy) + DHUDFont(FFont *f, int sp, EMonospacing ms, int sx, int sy) + : mFont(f), mSpacing(sp), mMonospacing(ms), mShadowX(sx), mShadowY(sy) {} }; @@ -434,7 +436,7 @@ public: void DrawAltHUD(); void DrawGraphic(FTextureID texture, double x, double y, int flags, double Alpha, double boxwidth, double boxheight, double scaleX, double scaleY); - void DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, bool monospaced, int shadowX, int shadowY); + void DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY); void TransformRect(double &x, double &y, double &w, double &h, int flags = 0); void Fill(PalEntry color, double x, double y, double w, double h, int flags = 0); void SetClipRect(double x, double y, double w, double h, int flags = 0); diff --git a/src/g_statusbar/shared_sbar.cpp b/src/g_statusbar/shared_sbar.cpp index 46e3af0ca..ccbcadc3a 100644 --- a/src/g_statusbar/shared_sbar.cpp +++ b/src/g_statusbar/shared_sbar.cpp @@ -1586,8 +1586,10 @@ void DBaseStatusBar::DrawGraphic(FTextureID texture, double x, double y, int fla // //============================================================================ -void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, bool monospaced, int shadowX, int shadowY) +void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, double y, int flags, double Alpha, int translation, int spacing, EMonospacing monospacing, int shadowX, int shadowY) { + bool monospaced = monospacing != EMonospacing::Off; + switch (flags & DI_TEXT_ALIGN) { default: @@ -1671,6 +1673,11 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d rw = c->GetDisplayWidthDouble(); rh = c->GetDisplayHeightDouble(); + if (monospacing == EMonospacing::CellCenter) + rx += (spacing - rw) / 2; + else if (monospacing == EMonospacing::CellRight) + rx += (spacing - rw); + if (!fullscreenOffsets) { StatusbarToRealCoords(rx, ry, rw, rh); @@ -1707,7 +1714,6 @@ void DBaseStatusBar::DrawString(FFont *font, const FString &cstring, double x, d else x += spacing; } - } void SBar_DrawString(DBaseStatusBar *self, DHUDFont *font, const FString &string, double x, double y, int flags, int trans, double alpha, int wrapwidth, int linespacing) @@ -1729,13 +1735,13 @@ void SBar_DrawString(DBaseStatusBar *self, DHUDFont *font, const FString &string auto brk = V_BreakLines(font->mFont, wrapwidth, string, true); for (auto &line : brk) { - self->DrawString(font->mFont, line.Text, x, y, flags, alpha, trans, font->mSpacing, font->mMonospaced, font->mShadowX, font->mShadowY); + self->DrawString(font->mFont, line.Text, x, y, flags, alpha, trans, font->mSpacing, font->mMonospacing, font->mShadowX, font->mShadowY); y += font->mFont->GetHeight() + linespacing; } } else { - self->DrawString(font->mFont, string, x, y, flags, alpha, trans, font->mSpacing, font->mMonospaced, font->mShadowX, font->mShadowY); + self->DrawString(font->mFont, string, x, y, flags, alpha, trans, font->mSpacing, font->mMonospacing, font->mShadowX, font->mShadowY); } } diff --git a/src/scripting/vmthunks.cpp b/src/scripting/vmthunks.cpp index 5cdd1aaca..df5169b1a 100644 --- a/src/scripting/vmthunks.cpp +++ b/src/scripting/vmthunks.cpp @@ -2632,9 +2632,9 @@ DEFINE_ACTION_FUNCTION_NATIVE(DBaseStatusBar, GetInventoryIcon, GetInventoryIcon // //===================================================================================== -DHUDFont *CreateHudFont(FFont *fnt, int spac, bool mono, int sx, int sy) +DHUDFont *CreateHudFont(FFont *fnt, int spac, int mono, int sx, int sy) { - return (Create(fnt, spac, mono, sy, sy)); + return (Create(fnt, spac, EMonospacing(mono), sy, sy)); } DEFINE_ACTION_FUNCTION_NATIVE(DHUDFont, Create, CreateHudFont) @@ -2642,10 +2642,10 @@ DEFINE_ACTION_FUNCTION_NATIVE(DHUDFont, Create, CreateHudFont) PARAM_PROLOGUE; PARAM_POINTER(fnt, FFont); PARAM_INT(spac); - PARAM_BOOL(mono); + PARAM_INT(mono); PARAM_INT(sx); PARAM_INT(sy); - ACTION_RETURN_POINTER(Create(fnt, spac, mono, sy, sy)); + ACTION_RETURN_POINTER(Create(fnt, spac, EMonospacing(mono), sy, sy)); } diff --git a/src/v_video.h b/src/v_video.h index be3246515..ee355daac 100644 --- a/src/v_video.h +++ b/src/v_video.h @@ -240,7 +240,7 @@ enum DTA_Monospace, // Fonts only: Use a fixed distance between characters. }; -enum EMonospacing +enum EMonospacing : int { Off = 0, CellLeft = 1, diff --git a/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs b/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs index bd2681a05..4fc7347ca 100644 --- a/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/doom_sbar.zs @@ -13,9 +13,9 @@ class DoomStatusBar : BaseStatusBar // Create the font used for the fullscreen HUD Font fnt = "HUDFONT_DOOM"; - mHUDFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), true, 1, 1); + mHUDFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), Mono_CellLeft, 1, 1); fnt = "INDEXFONT_DOOM"; - mIndexFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), true); + mIndexFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), Mono_CellLeft); mAmountFont = HUDFont.Create("INDEXFONT"); diparms = InventoryBarState.Create(); } diff --git a/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs b/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs index 38569ac93..04785270d 100644 --- a/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/heretic_sbar.zs @@ -16,11 +16,11 @@ class HereticStatusBar : BaseStatusBar // Create the font used for the fullscreen HUD Font fnt = "HUDFONT_RAVEN"; - mHUDFont = HUDFont.Create(fnt, fnt.GetCharWidth("0") + 1, true, 1, 1); + mHUDFont = HUDFont.Create(fnt, fnt.GetCharWidth("0") + 1, Mono_CellLeft, 1, 1); fnt = "INDEXFONT_RAVEN"; - mIndexFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), true); + mIndexFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), Mono_CellLeft); fnt = "BIGFONT"; - mBigFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), true, 2, 2); + mBigFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), Mono_CellLeft, 2, 2); diparms = InventoryBarState.Create(mIndexFont); diparms_sbar = InventoryBarState.CreateNoBox(mIndexFont, boxsize:(31, 31), arrowoffs:(0,-10)); mHealthInterpolator = DynamicValueInterpolator.Create(0, 0.25, 1, 8); diff --git a/wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs b/wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs index a39244a49..26794e933 100644 --- a/wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/hexen_sbar.zs @@ -16,11 +16,11 @@ class HexenStatusBar : BaseStatusBar // Create the font used for the fullscreen HUD Font fnt = "HUDFONT_RAVEN"; - mHUDFont = HUDFont.Create(fnt, fnt.GetCharWidth("0") + 1, true, 1, 1); + mHUDFont = HUDFont.Create(fnt, fnt.GetCharWidth("0") + 1, Mono_CellLeft, 1, 1); fnt = "INDEXFONT_RAVEN"; - mIndexFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), true); + mIndexFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), Mono_CellLeft); fnt = "BIGFONT"; - mBigFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), true, 2, 2); + mBigFont = HUDFont.Create(fnt, fnt.GetCharWidth("0"), Mono_CellLeft, 2, 2); diparms = InventoryBarState.Create(mIndexFont); diparms_sbar = InventoryBarState.CreateNoBox(mIndexFont, boxsize:(31, 31), arrowoffs:(0,-10)); mHealthInterpolator = DynamicValueInterpolator.Create(0, 0.25, 1, 8); diff --git a/wadsrc/static/zscript/ui/statusbar/statusbar.zs b/wadsrc/static/zscript/ui/statusbar/statusbar.zs index 4cb6675c6..18f04af7f 100644 --- a/wadsrc/static/zscript/ui/statusbar/statusbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/statusbar.zs @@ -18,7 +18,7 @@ struct MugShot class HUDFont native ui { native Font mFont; - native static HUDFont Create(Font fnt, int spacing = 0, bool monospaced = false, int shadowx = 0, int shadowy = 0); + native static HUDFont Create(Font fnt, int spacing = 0, EMonospacing monospacing = Mono_Off, int shadowx = 0, int shadowy = 0); } class InventoryBarState ui diff --git a/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs index 7d5e42fec..c2318ef44 100644 --- a/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs +++ b/wadsrc/static/zscript/ui/statusbar/strife_sbar.zs @@ -63,9 +63,9 @@ class StrifeStatusBar : BaseStatusBar CursorImage = Images[imgINVCURS].IsValid() ? imgINVCURS : imgCURSOR01; - mYelFont = HUDFont.Create("Indexfont_Strife_Yellow", 7, true, 1, 1); - mGrnFont = HUDFont.Create("Indexfont_Strife_Green", 7, true, 1, 1); - mBigFont = HUDFont.Create("BigFont", 0, false, 2, 2); + mYelFont = HUDFont.Create("Indexfont_Strife_Yellow", 7, Mono_CellLeft, 1, 1); + mGrnFont = HUDFont.Create("Indexfont_Strife_Green", 7, Mono_CellLeft, 1, 1); + mBigFont = HUDFont.Create("BigFont", 0, Mono_Off, 2, 2); } override void NewGame () From 8ab6747d77fb44423fb605908de52d3aa6e55d5c Mon Sep 17 00:00:00 2001 From: Player701 Date: Sat, 13 Apr 2019 22:18:47 +0300 Subject: [PATCH 12/13] - Added "const" qualifiers to the new UTF-8-aware string methods --- src/utility/zstring.cpp | 4 ++-- src/utility/zstring.h | 4 ++-- wadsrc/static/zscript/base.zs | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/utility/zstring.cpp b/src/utility/zstring.cpp index efb79a460..0f7a0bd10 100644 --- a/src/utility/zstring.cpp +++ b/src/utility/zstring.cpp @@ -681,7 +681,7 @@ void FString::ToLower () UnlockBuffer(); } -FString FString::MakeLower() +FString FString::MakeLower() const { TArray builder(Len()); int pos = 0; @@ -694,7 +694,7 @@ FString FString::MakeLower() return FString(builder); } -FString FString::MakeUpper() +FString FString::MakeUpper() const { TArray builder(Len()); int pos = 0; diff --git a/src/utility/zstring.h b/src/utility/zstring.h index 9c7a2ffd1..d7a9417ef 100644 --- a/src/utility/zstring.h +++ b/src/utility/zstring.h @@ -238,8 +238,8 @@ public: void ToUpper (); void ToLower (); - FString MakeUpper(); - FString MakeLower(); + FString MakeUpper() const; + FString MakeLower() const; void StripLeft (); void StripLeft (const FString &charset); diff --git a/wadsrc/static/zscript/base.zs b/wadsrc/static/zscript/base.zs index 2a9295d67..fe929e41e 100644 --- a/wadsrc/static/zscript/base.zs +++ b/wadsrc/static/zscript/base.zs @@ -909,8 +909,8 @@ struct StringStruct native native int RightIndexOf(String substr, int endIndex = 2147483647) const; deprecated("4.1") native void ToUpper(); deprecated("4.1") native void ToLower(); - native String MakeUpper(); - native String MakeLower(); + native String MakeUpper() const; + native String MakeLower() const; native static int CharUpper(int ch); native static int CharLower(int ch); native int ToInt(int base = 0) const; @@ -918,8 +918,8 @@ struct StringStruct native native void Split(out Array tokens, String delimiter, EmptyTokenType keepEmpty = TOK_KEEPEMPTY) const; native void AppendCharacter(int c); native void DeleteLastCharacter(); - native int CodePointCount(); - native int, int GetNextCodePoint(int position); + native int CodePointCount() const; + native int, int GetNextCodePoint(int position) const; } class SectorEffect : Thinker native From ad23726cb64ee8810486cbb76daf6f8e0e8837f4 Mon Sep 17 00:00:00 2001 From: Player701 Date: Sun, 14 Apr 2019 11:41:36 +0300 Subject: [PATCH 13/13] - Fixed conditions tested for when checking whether "Force respawn" or "Respawn protection" dmflags are enabled --- wadsrc/static/zscript/actors/player/player.zs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wadsrc/static/zscript/actors/player/player.zs b/wadsrc/static/zscript/actors/player/player.zs index a1f35d298..bddbee27c 100644 --- a/wadsrc/static/zscript/actors/player/player.zs +++ b/wadsrc/static/zscript/actors/player/player.zs @@ -231,7 +231,7 @@ class PlayerPawn : Actor virtual void OnRespawn() { - if (sv_respawnprotect && (multiplayer || alwaysapplydmflags)) + if (sv_respawnprotect && (deathmatch || alwaysapplydmflags)) { let invul = Powerup(Spawn("PowerInvulnerable")); invul.EffectTics = 3 * TICRATE; @@ -718,7 +718,7 @@ class PlayerPawn : Actor } if ((player.cmd.buttons & BT_USE || - ((multiplayer || alwaysapplydmflags) && sv_forcerespawn)) && !sv_norespawn) + ((deathmatch || alwaysapplydmflags) && sv_forcerespawn)) && !sv_norespawn) { if (Level.maptime >= player.respawn_time || ((player.cmd.buttons & BT_USE) && player.Bot == NULL)) {