1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-11 23:54:09 +02:00

add Polish and Russian subtitles (both are WIP), fixes for French and German

This commit is contained in:
XProger
2019-02-21 03:56:30 +03:00
parent 448222a4b3
commit 7fd4a938f5
8 changed files with 512 additions and 167 deletions

View File

@@ -1445,7 +1445,7 @@ struct Controller {
vec3 p = pos - Core::viewPos.xyz(); vec3 p = pos - Core::viewPos.xyz();
game->getMesh()->addDynSprite(level->spriteSequences[-(getEntity().modelIndex + 1)].sStart + frame, short3(int16(p.x), int16(p.y), int16(p.z)), false, color, color); game->getMesh()->addDynSprite(level->spriteSequences[-(getEntity().modelIndex + 1)].sStart + frame, short3(int16(p.x), int16(p.y), int16(p.z)), false, false, color, color);
} }
virtual void render(Frustum *frustum, MeshBuilder *mesh, Shader::Type type, bool caustics) { virtual void render(Frustum *frustum, MeshBuilder *mesh, Shader::Type type, bool caustics) {

View File

@@ -495,7 +495,7 @@ namespace GAPI {
char defines[1024]; char defines[1024];
defines[0] = 0; defines[0] = 0;
strcat(defines, "#define VER2\n"); strcat(defines, "#define VER3\n");
for (int i = 0; i < defCount; i++) { for (int i = 0; i < defCount; i++) {
sprintf(defines + strlen(defines), "#define %s\n", DefineName[def[i]]); sprintf(defines + strlen(defines), "#define %s\n", DefineName[def[i]]);
@@ -1218,12 +1218,12 @@ namespace GAPI {
strcat(GLSL_HEADER_FRAG, "#define FRAGMENT\n" strcat(GLSL_HEADER_FRAG, "#define FRAGMENT\n"
"precision lowp int;\n" "precision lowp int;\n"
"precision highp float;\n" "precision highp float;\n"
"precision lowp sampler3D;\n"
"#define varying in\n" "#define varying in\n"
"#define texture2D texture\n" "#define texture2D texture\n"
"#define texture3D texture\n" "#define texture3D texture\n"
"#define textureCube texture\n" "#define textureCube texture\n"
"#define sampler3D lowp sampler3D\n" "layout(location = 0) out vec4 fragColor;\n");
"out vec4 fragColor;\n");
} }
#else #else
strcat(GLSL_HEADER_VERT, "#version 110\n" strcat(GLSL_HEADER_VERT, "#version 110\n"

View File

@@ -236,7 +236,7 @@ enum StringID {
#define STR_LANGUAGES \ #define STR_LANGUAGES \
"English" \ "English" \
, "Fran|ais" \ , "Fran|cais" \
, "Deutsch" \ , "Deutsch" \
, "Espa(~nol" \ , "Espa(~nol" \
, "Italiano" \ , "Italiano" \
@@ -678,19 +678,19 @@ const char *STR_FR[] = { ""
/* 35 */ , "Si vous voulez examiner les environs,@appuyez sur la touche qui vous permet de voir.@Puis sur une touche de direction." /* 35 */ , "Si vous voulez examiner les environs,@appuyez sur la touche qui vous permet de voir.@Puis sur une touche de direction."
/* 36 */ , "Si je ne peux pas sauter assez loin, je peux toujours me rattraper@de justesse pour ne pas tomber. Avancez vers la ligne blanche@jusqu'$a ce que je m'arr(ete de moi-m(eme,@ensuite appuyez sur la touche de saut et tout de suite apr$es@sur la touche fl)ech)ee haut, et maintenez la touche d'action enfonc)ee pendant que je saute." /* 36 */ , "Si je ne peux pas sauter assez loin, je peux toujours me rattraper@de justesse pour ne pas tomber. Avancez vers la ligne blanche@jusqu'$a ce que je m'arr(ete de moi-m(eme,@ensuite appuyez sur la touche de saut et tout de suite apr$es@sur la touche fl)ech)ee haut, et maintenez la touche d'action enfonc)ee pendant que je saute."
/* 37 */ , "Appuyez sur la touche fl)ech)ee haut pour me faire grimper." /* 37 */ , "Appuyez sur la touche fl)ech)ee haut pour me faire grimper."
/* 38 */ , "Si je prends de l')elan, je peux sauter |a sans probl$eme!" /* 38 */ , "Si je prends de l')elan, je peux sauter |ca sans probl$eme!"
/* 39 */ , "Avancez jusqu'$a la ligne blanche, jusqu'$a ce que je m'arr(ete,@et appuyez sur la touche de marche puis sur la touche fl)ech)ee bas pour que je prenne de l')elan.@Appuyez ensuite sur la touche fl)ech)ee haut et sur la touche de saut tout de suite apr$es.@Mais en fait, je ne sauterai qu'au dernier moment, je ne suis pas folle!" /* 39 */ , "Avancez jusqu'$a la ligne blanche, jusqu'$a ce que je m'arr(ete,@et appuyez sur la touche de marche puis sur la touche fl)ech)ee bas pour que je prenne de l')elan.@Appuyez ensuite sur la touche fl)ech)ee haut et sur la touche de saut tout de suite apr$es.@Mais en fait, je ne sauterai qu'au dernier moment, je ne suis pas folle!"
/* 40 */ , "L$a, c'est plus difficile.@Nous allons refaire exactement le m(eme saut, mais@vous maintiendrez la touche d'action enfonc)ee@pour que je me rattrape en catastrophe@Quand je serai en l'air." /* 40 */ , "L$a, c'est plus difficile.@Nous allons refaire exactement le m(eme saut, mais@vous maintiendrez la touche d'action enfonc)ee@pour que je me rattrape en catastrophe@Quand je serai en l'air."
/* 41 */ , "Bien jou)e!" /* 41 */ , "Bien jou)e!"
/* 42 */ , "Nous allons essayer de sauter ici.@Appuyez sur la touche fl)ech)ee haut puis sur la touche d'action sans la rel(acher." /* 42 */ , "Nous allons essayer de sauter ici.@Appuyez sur la touche fl)ech)ee haut puis sur la touche d'action sans la rel(acher."
/* 43 */ , "Je n'ai pas la place de grimper i|i, mais si vous appuyez sur la touche@fl)ech)ee droite je longerai la corniche pour trouver un passage@ et vous n'aurez plus qu'$a appuyez sur la touche fl)ech)ee haut $a ce moment l$a." /* 43 */ , "Je n'ai pas la place de grimper i|ci, mais si vous appuyez sur la touche@fl)ech)ee droite je longerai la corniche pour trouver un passage@ et vous n'aurez plus qu'$a appuyez sur la touche fl)ech)ee haut $a ce moment l$a."
/* 44 */ , "Super!@Si je me retrouve trop haut je peux me laisser@glisser doucement, pour )eviter de me blesser en sautant." /* 44 */ , "Super!@Si je me retrouve trop haut je peux me laisser@glisser doucement, pour )eviter de me blesser en sautant."
/* 45 */ , "Appuyez sur la touche fl)ech)ee bas pour que je me laisse tomber@ensuite si vous gardez la touche d'action enfonc)ee@je me rattraperai dans ma chute." /* 45 */ , "Appuyez sur la touche fl)ech)ee bas pour que je me laisse tomber@ensuite si vous gardez la touche d'action enfonc)ee@je me rattraperai dans ma chute."
/* 46 */ , "Ensuite laissez aller." /* 46 */ , "Ensuite laissez aller."
/* 47 */ , "Et maintenant un bon bain!" /* 47 */ , "Et maintenant un bon bain!"
/* 48 */ , "La touche de saut et les touches de direction@me permettent d')evoluer sous l'eau." /* 48 */ , "La touche de saut et les touches de direction@me permettent d')evoluer sous l'eau."
/* 49 */ , "Oh! Ah! De l'air!@Utilisez les touches fl)ech)ees avant, gauche et droite pour me faire nager en surface.@Appuyez sur la touche de saut pour me faire plonger et nager sous l'eau.@Pour me faire sortir, dirigez-vous vers le bord et appuyez sur la touche d'action." /* 49 */ , "Oh! Ah! De l'air!@Utilisez les touches fl)ech)ees avant, gauche et droite pour me faire nager en surface.@Appuyez sur la touche de saut pour me faire plonger et nager sous l'eau.@Pour me faire sortir, dirigez-vous vers le bord et appuyez sur la touche d'action."
/* 50 */ , "Super. Bon je ferais mieux d'enelever ces v(etements mouill)es." /* 50 */ , "Super. Bon je ferais mieux d'enlever ces v(etements mouill)es."
/* 51 */ , "Un petit sourire!" /* 51 */ , "Un petit sourire!"
/* 52 */ , "Ca n'a rien de personel." /* 52 */ , "Ca n'a rien de personel."
/* 53 */ , "J'ai encore mal au cr(ane $a cause de toi. Et j'entends des petites voix dans ma t(ete.@Elles me disent de te tuer!" /* 53 */ , "J'ai encore mal au cr(ane $a cause de toi. Et j'entends des petites voix dans ma t(ete.@Elles me disent de te tuer!"
@@ -809,7 +809,7 @@ const char *STR_DE[] = { "" // by Oktopaps
, "Kompass" , "Kompass"
, "Statistiken" , "Statistiken"
, "Laras Haus" , "Laras Haus"
, "Detailstufe" , "Grafik"
, "Ton" , "Ton"
, "Steuerung" , "Steuerung"
, "Gamma" , "Gamma"
@@ -821,14 +821,14 @@ const char *STR_DE[] = { "" // by Oktopaps
, "Spiel beenden" , "Spiel beenden"
, "Level w~ahlen" , "Level w~ahlen"
// detail options // detail options
, "Detailstufe w~ahlen" , "Grafikeinstellungen"
, "Filterung" , "Filterung"
, "Beleuchtung" , "Beleuchtung"
, "Schatten" , "Schatten"
, "Wasser" , "Wasser"
, "V-Sync" , "V-Sync"
, "Stereo" , "Stereo"
, "Einfache Gegenst~ande" , "Simple Items"
// sound options // sound options
, "Lautst~arke einstellen" , "Lautst~arke einstellen"
, "Nachhall" , "Nachhall"
@@ -840,7 +840,7 @@ const char *STR_DE[] = { "" // by Oktopaps
, "Gamepad" , "Gamepad"
, "Vibration" , "Vibration"
, "Retargeting" , "Retargeting"
, "Multi-Zielen" , "Multi-aiming"
// controls // controls
, "Links", "Rechts", "Vorw~arts", "R~uckw~arts", "Springen", "Gehen", "Handlung", "Waffe ziehen", "Umsehen", "Ducken", "Sprinten", "Rolle", "Inventar", "Start" , "Links", "Rechts", "Vorw~arts", "R~uckw~arts", "Springen", "Gehen", "Handlung", "Waffe ziehen", "Umsehen", "Ducken", "Sprinten", "Rolle", "Inventar", "Start"
// keys // keys
@@ -899,10 +899,10 @@ const char *STR_DE[] = { "" // by Oktopaps
/* 30 */ , "Ah, die gro=e Halle. Tut mir leid wegen der Kisten.@Ich habe ein paar Sachen eingelagert und wei= nicht, wohin damit." /* 30 */ , "Ah, die gro=e Halle. Tut mir leid wegen der Kisten.@Ich habe ein paar Sachen eingelagert und wei= nicht, wohin damit."
/* 31 */ , "Lauf auf eine Kiste zu und w~ahrend du das Steuerkreuz hoch gedr~uckt@h~altst, dr~uck die Handlungstaste. Dann kletter ich rauf." /* 31 */ , "Lauf auf eine Kiste zu und w~ahrend du das Steuerkreuz hoch gedr~uckt@h~altst, dr~uck die Handlungstaste. Dann kletter ich rauf."
/* 32 */ , "Das war mal der Ballsaal, aber ich benutze ihn als Turnhalle.@Wie gef~allt sie dir?@Dann lass uns mal ein paar Lockerungs~ubungen machen." /* 32 */ , "Das war mal der Ballsaal, aber ich benutze ihn als Turnhalle.@Wie gef~allt sie dir?@Dann lass uns mal ein paar Lockerungs~ubungen machen."
/* 33 */ , "Ich laufe nat~urlich nicht ~uberall hin. Wenn ich besonders@vorsichtig sein m~ochte, gehe ich. Halte die Geh-Taste@gedr~uckt und beweg mich zum wei=en Strich." /* 33 */ , "Ich laufe nat~urlich nicht ~uberall hin. Wenn ich besonders@vorsichtig sein m~ochte, gehe ich. Halt die Geh-Taste@gedr~uckt und beweg mich zum wei=en Strich."
/* 34 */ , "W~ahrend du die Geh-Taste gedr~uckt h~altst, kann ich nicht herunterfallen,@selbst wenn du versuchst, mich ~uber die Kante zu f~uhren. Probier es aus!" /* 34 */ , "W~ahrend du die Geh-Taste gedr~uckt h~altst, kann ich nicht herunterfallen,@selbst wenn du versuchst, mich ~uber die Kante zu f~uhren. Probier es aus!"
/* 35 */ , "Wenn du dich umsehen willst, halt die Seh-Taste gedr~uckt@und dr~uck das Steuerkreuz in die gew~unschte Blickrichtung." /* 35 */ , "Wenn du dich umsehen willst, halt die Seh-Taste gedr~uckt@und dr~uck das Steuerkreuz in die gew~unschte Blickrichtung."
/* 36 */ , "Wenn ein Sprung zu weit f~ur mich ist, kann ich mich an der Kante@festklammern, damit ich nicht herunterfalle. Geh zur Kante ~uber den@wei=en Strich bis ich stehen bleibe. Dr~uck dann die Sprungtaste@und gleich danach das Steuerkreuz hoch. Dr~uck jetzt, w~ahrend ich@noch in der Luft bin, die Handlungstaste und halte sie gedr~uckt." /* 36 */ , "Wenn ein Sprung zu weit f~ur mich ist, kann ich mich an der Kante@festklammern, damit ich nicht herunterfalle. Geh zur Kante mit dem@wei=en Strich bis ich stehen bleibe. Dr~uck dann die Sprungtaste@und gleich danach das Steuerkreuz hoch. Dr~uck jetzt, w~ahrend ich@noch in der Luft bin, die Handlungstaste und halte sie gedr~uckt."
/* 37 */ , "Dr~uck das Steuerkreuz hoch, damit hochklettere." /* 37 */ , "Dr~uck das Steuerkreuz hoch, damit hochklettere."
/* 38 */ , "Wenn ich Anlauf nehme, bekomme ich so einen Sprung problemlos hin." /* 38 */ , "Wenn ich Anlauf nehme, bekomme ich so einen Sprung problemlos hin."
/* 39 */ , "Geh zur Kante mit dem wei=en Strich bis ich stehenbleibe. Lass dann@die Geh-Taste los und dr~uck das Steuerkreuz kurz hinunter. Jetzt nehme@ich Anlauf. Dr~uck das Steuerkreuz hoch und sofort danach die Sprungtaste.@Halt die Sprungtaste gedr~uckt. Ich springe erst im letzten Moment." /* 39 */ , "Geh zur Kante mit dem wei=en Strich bis ich stehenbleibe. Lass dann@die Geh-Taste los und dr~uck das Steuerkreuz kurz hinunter. Jetzt nehme@ich Anlauf. Dr~uck das Steuerkreuz hoch und sofort danach die Sprungtaste.@Halt die Sprungtaste gedr~uckt. Ich springe erst im letzten Moment."
@@ -1440,87 +1440,87 @@ const char *STR_IT[] = { ""
, "All Hallows" , "All Hallows"
}; };
const char *STR_PL[] = { "" const char *STR_PL[] = { "" // Nickelony & Dustie
// help // help
, "Loading..." , "Wczytywanie..."
, "Press H for help" , "Wci)snij H je*zeli potrzebujesz pomocy"
, helpText , helpText
, "%s@@@" , "%s@@@"
"KILLS %d@@" "ZAB)OJSTWA %d@@"
"PICKUPS %d@@" "ZNAJD)ZKI %d@@"
"SECRETS %d of %d@@" "SEKRETY %d z %d@@"
"TIME TAKEN %s" "CZAS %s"
, "Saving game..." , "Zapisywanie..."
, "Saving done!" , "Zapis uko)nczony!"
, "SAVING ERROR!" , "B/L|AD ZAPISU!"
, "YES" , "TAK"
, "NO" , "NIE"
, "Off" , "W/l"
, "On" , "Wy/l"
, "Split Screen" , "Podzielony ekran"
, "VR" , "VR"
, "Low" , "Niska"
, "Medium" , ")Srednia"
, "High" , "Wysoka"
, STR_LANGUAGES , STR_LANGUAGES
, "Apply" , "Zastosuj"
, "Gamepad 1" , "Kontroler 1"
, "Gamepad 2" , "Kontroler 2"
, "Gamepad 3" , "Kontroler 3"
, "Gamepad 4" , "Kontroler 4"
, "Not Ready" , "Nie Gotowy"
, "Player 1" , "Gracz 1"
, "Player 2" , "Gracz 2"
, "Press Any Key" , "Wci)snij dowolny przycisk"
, "%s - Select" , "%s - Wybierz"
, "%s - Go Back" , "%s - Wr)o)c"
// inventory pages // inventory pages
, "OPTIONS" , "OPCJE"
, "INVENTORY" , "EKWIPUNEK"
, "ITEMS" , "PRZEDMIOTY"
// save game page // save game page
, "Save Game?" , "Zapisa)c gr|e?"
, "Current Position" , "Aktualna pozycja"
// inventory option // inventory option
, "Game" , "Gra"
, "Map" , "Mapa"
, "Compass" , "Kompas"
, "Statistics" , "Statystyki"
, "Lara's Home" , "Posiad/lo)s)c Lary"
, "Detail Levels" , "Poziom detali"
, "Sound" , "D)zwi|ek"
, "Controls" , "Sterowanie"
, "Gamma" , "Gamma"
// passport menu // passport menu
, "Load Game" , "Wczytaj gr|e"
, "New Game" , "Nowa gra"
, "Restart Level" , "Powt)orz poziom"
, "Exit to Title" , "Wyjd)z to menu g/l)ownego"
, "Exit Game" , "Wyjd)z z gry"
, "Select Level" , "Wybierz poziom"
// detail options // detail options
, "Select Detail" , "Wybierz poziom detali"
, "Filtering" , "Filtrowanie tekstur"
, "Lighting" , "Jako)s)c )swiat/la"
, "Shadows" , "Jako)s)c cieni"
, "Water" , "Jako)s)c wody"
, "VSync" , "VSync"
, "Stereo" , "D)zwi|ek stereo"
, "Simple Items" , "Proste przedmioty"
// sound options // sound options
, "Set Volumes" , "Ustaw g/lo)sno)s)c"
, "Reverberation" , "Pog/los"
, "Subtitles" , "Napisy"
, "Language" , "J|ezyk"
// controls options // controls options
, "Set Controls" , "Ustaw sterowanie"
, "Keyboard" , "Klawiatura"
, "Gamepad" , "Kontroler"
, "Vibration" , "Wibracje"
, "Retargeting" , "Auto. zmiana celu"
, "Multi-aiming" , "Wielo-celowanie"
// controls // controls
, "Left", "Right", "Run", "Back", "Jump", "Walk", "Action", "Draw Weapon", "Look", "Duck", "Dash", "Roll", "Inventory", "Start" , "Lewo", "Prawo", "Prz)od", "Ty/l", "Skok", "Ch)od", "Akcja", "Bro)n", "Rozgl|adanie si|e", "Kucanie", "Sprint", "Przewr)ot", "Ekwipunek", "Menu pauzy"
// keys // keys
, "NONE", "LEFT", "RIGHT", "UP", "DOWN", "SPACE", "TAB", "ENTER", "ESCAPE", "SHIFT", "CTRL", "ALT" , "NONE", "LEFT", "RIGHT", "UP", "DOWN", "SPACE", "TAB", "ENTER", "ESCAPE", "SHIFT", "CTRL", "ALT"
, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" , "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
@@ -1529,64 +1529,64 @@ const char *STR_PL[] = { ""
// gamepad // gamepad
, "NONE", "A", "B", "X", "Y", "L BUMPER", "R BUMPER", "SELECT", "START", "L STICK", "R STICK", "L TRIGGER", "R TRIGGER", "D-LEFT", "D-RIGHT", "D-UP", "D-DOWN" , "NONE", "A", "B", "X", "Y", "L BUMPER", "R BUMPER", "SELECT", "START", "L STICK", "R STICK", "L TRIGGER", "R TRIGGER", "D-LEFT", "D-RIGHT", "D-UP", "D-DOWN"
// inventory items // inventory items
, "Unknown" , "Nieznany"
, "Explosive" , "Materia/l wybuchowy"
, "Pistols" , "Pistolety"
, "Shotgun" , "Strzelba"
, "Magnums" , "Pistolety Magnum"
, "Uzis" , "Pistolety Uzi"
, "Pistol Clips" , "Amunicja do pistolet)ow"
, "Shotgun Shells" , "Naboje do strzelby"
, "Magnum Clips" , "Amunicja do Magnum)ow"
, "Uzi Clips" , "Amunicja do Uzi"
, "Small Medi Pack" , "Ma/la apteczka"
, "Large Medi Pack" , "Du*za apteczka"
, "Lead Bar" , "Sztabka o/lowiu"
, "Scion" , "Dzieci|e"
// keys // keys
, "Key" , "Klucz"
, "Silver Key" , "Srebrny klucz"
, "Rusty Key" , "Zardzewia/ly klucz"
, "Gold Key" , "Z/loty klucz"
, "Sapphire Key" , "Szafirowy klucz"
, "Neptune Key" , "Klucz Neptuna"
, "Atlas Key" , "Klucz Atlasa"
, "Damocles Key" , "Klucz Damoklesa"
, "Thor Key" , "Klucz Thora"
, "Ornate Key" , "Ozdobiony klucz"
// puzzles // puzzles
, "Puzzle" , "Zagadka"
, "Gold Idol" , "Z/lota figurka"
, "Gold Bar" , "Sztabka z/lota"
, "Machine Cog" , "Z|ebatka"
, "Fuse" , "Bezpiecznik"
, "Ankh" , "Anch"
, "Eye of Horus" , "Oko Horusa"
, "Seal of Anubis" , "Piecz|e)c Anubisa"
, "Scarab" , "Skarabeusz"
, "Pyramid Key" , "Klucz do piramidy"
// TR1 subtitles // TR1 subtitles
/* 22 */ , "" /* 22 */ , ""
/* 23 */ , "" /* 23 */ , ""
/* 24 */ , "" /* 24 */ , ""
/* 25 */ , "" /* 25 */ , ""
/* 26 */ , "Welcome to my home!@I'll take you on a guided tour." /* 26 */ , "Witaj w mojej posiad/lo)sci! Chod)z, oprowadz|e ci|e."
/* 27 */ , "Use the directional buttons to go into the music room." /* 27 */ , "U*zywaj przycisk)ow kierunkowych, aby p)oj)s)c do pokoju muzycznego."
/* 28 */ , "OK. Let's do some tumbling.@Press the jump button." /* 28 */ , "No dobrze, teraz zr)obmy kilka akrobacji.@Wci)snij przycisk Skoku."
/* 29 */ , "Now press it again and press one of@the directions and I'll jump that way." /* 29 */ , "Teraz wci)snij go jeszcze raz wraz z jednym z przycisk)ow@kierunkowych, aby skoczy)c w danym kierunku."
/* 30 */ , "Ah, the main hall.@Sorry about the crates, I'm having some things put@ into storage and the delivery people haven't been yet." /* 30 */ , "Ah, g/l)owna hala. Wybacz za te skrzynie,@ale mam kilka rzeczy, kt)ore musz|e wnie)s)c do magazynu,@ale ludzie od dostawy wci|a*z si|e nie zjawili."
/* 31 */ , "Run up to a crate, and while still pressing forwards@press action, and I'll vault up onto it." /* 31 */ , "Podejd)z do skrzyni.@Podczas stania w miejscu i wciskania przycisku Prz)od,@wci)snij Akcj|e abym mog/la si|e wspi|a)c na skrzyni|e."
/* 32 */ , "This used to be the ballroom, but I've converted it into my own personal gym.@What do you think?@Well, let's do some exercises." /* 32 */ , "Tu by/la kiedy)s sala balowa, ale przekszta/lci/lam@j|a we w/lasn|a sal|e gimnastyczn|a.@Co o tym my)slisz?@Zr)obmy kilka )cwicze)n."
/* 33 */ , "I don't actually run everywhere.@When I want to be careful, I walk.@Hold down the walk button, and walk to the white line." /* 33 */ , "W/la)sciwie, to wsz|edzie nie mog|e tylko biec.@Gdy chc|e by)c ostro*zna, zaczynam chodzi)c.@Trzymaj przycisk Chodu, aby ostro*znie podej)s)c@do bia/lej linii."
/* 34 */ , "With the walk button down, I won't fall off even if you try to make me.@Go on, try it." /* 34 */ , "Podczas trzymania przycisku Chodu nie spadn|e@z *zadnej kraw|edzi, nawet je)sli tego spr)obujesz.@)Smia/lo, spr)obuj."
/* 35 */ , "If you want look around, press and hold the look button.@Then press in the direction you want to look." /* 35 */ , "Je)sli chcesz si|e rozejrze)c, wci)snij i trzymaj przycisk Rozgl|adania si|e.@Podczas trzymania, mo*zesz u*zy)c przycisk)ow@kierunkowych, aby rozejrze)c si|e w dan|a stron|e."
/* 36 */ , "If a jump is too far for me, I can grab the ledge and save myself from a nasty fall.@Walk to the edge with the white line until I won't go any further.@Then press jump immediately followed by forwards then while @I'm in the air press and hold the action button." /* 36 */ , "Je)sli skok jest dla mnie zbyt daleki, mog|e chwyci)c@si|e kraw)edzi, aby uratowa)c si|e od gro)znego upadku.@Podejd)z do kraw|edzi z bia/l|a lini|a a*z si|e zatrzymam.@Wci)snij Skok i od razu wci)snij przycisk Prz)od. W powietrzu, wci)snij i trzymaj Akcj|e."
/* 37 */ , "Press forward and I'll climb up." /* 37 */ , "Wci)snij przycisk Prz)od, abym mog/la si|e wspi|a)c."
/* 38 */ , "If I do a running jump, I can make a jump like that, no problem." /* 38 */ , "Je)sli przed skopkiem zrobi|e rozbieg, mog|e@przeskoczy)c ten dystans bez problemu."
/* 39 */ , "Walk to the edge with the white line until I stop.@Then let go of walk and tap backwards to give me a run up.@Press forward, and almost immediately press and hold the jump button.@I won't actually jump until the last minute." /* 39 */ , "Podejd)z do kraw|edzi z bia/l|a lini|a a*z si|e zatrzymam.@Potem p)o)s)c przycisk Chodu i raz wci)snij@przycisk Ty/l, abym mia/la miejsce na rozbieg.@Wci)snij przycisk Prz)od i prawie od razu@wci)snij i trzymaj przycisk Skoku.@Dzi|eki temu skocz|e w idealnym momencie."
/* 40 */ , "Right. This is a really big one.@So do a running jump exactly as before except while I'm in the air@press and hold the action button to make me grab the ledge." /* 40 */ , "No dobra. To jest bardzo du*zy skok.@Zr)ob skok z rozbiegiem tak samo jak przed chwil|a,@ale dodatkowo w powietrzu, wci)snij i trzymaj Akcj|e@abym mog/la si|e chwyci)c kraw|edzi."
/* 41 */ , "Nice." /* 41 */ , "Nie)zle."
/* 42 */ , "Try to vault up here.@Press forwards and hold action." /* 42 */ , "Spr)obuj tu wskoczy)c na g)or|e.@Wci)snij Prz)od i trzymaj Akcj|e."
/* 43 */ , "I can't climb up because the gap is too small.@But press right and I'll shimmy sideways@until there is room, then press forward." /* 43 */ , "I can't climb up because the gap is too small.@But press right and I'll shimmy sideways@until there is room, then press forward."
/* 44 */ , "Great!@If there is a long drop and I don't want to@hurt myself jumping off I can let myself down carefully." /* 44 */ , "Great!@If there is a long drop and I don't want to@hurt myself jumping off I can let myself down carefully."
/* 45 */ , "Tap backwards, and I'll jump off backwards.@Immediately press and hold the action button,@and I'll grab the ledge on the way down." /* 45 */ , "Tap backwards, and I'll jump off backwards.@Immediately press and hold the action button,@and I'll grab the ledge on the way down."
@@ -1666,6 +1666,233 @@ const char *STR_PL[] = { ""
, "All Hallows" , "All Hallows"
}; };
const char *STR_RU[] = { ""
// help
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..."
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> H <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, helpText
, "%s@@@"
"<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD> %d@@"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d@@"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %d <20><> %d@@"
"<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> %s"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>..."
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
, "<EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~<7E><><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "VR"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, STR_LANGUAGES
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD> 1"
, "<EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD> 2"
, "<EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD> 3"
, "<EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD> 4"
, "<EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 1"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "%s - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "%s - <20><><EFBFBD><EFBFBD><EFBFBD>"
// inventory pages
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// save game page
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>?"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// inventory option
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// passport menu
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// detail options
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "VSync"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// sound options
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// controls options
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD>"
// controls
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "Start"
// keys
, "NONE", "LEFT", "RIGHT", "UP", "DOWN", "SPACE", "TAB", "ENTER", "ESCAPE", "SHIFT", "CTRL", "ALT"
, "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"
, "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M"
, "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"
// gamepad
, "NONE", "A", "B", "X", "Y", "L BUMPER", "R BUMPER", "SELECT", "START", "L STICK", "R STICK", "L TRIGGER", "R TRIGGER", "D-LEFT", "D-RIGHT", "D-UP", "D-DOWN"
// inventory items
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// keys
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>"
// puzzles
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
// TR1 subtitles
/* 22 */ , ""
/* 23 */ , ""
/* 24 */ , ""
/* 25 */ , ""
/* 26 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~E<><45><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>~e<><65><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"//"<22><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>{<7B>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 27 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 28 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 29 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>."
/* 30 */ , "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>~<7E> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 31 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>."
/* 32 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD>, <20><> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>.@<40><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?.@<40><><EFBFBD> <20>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>."
/* 33 */ , "<EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20> <20><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>{<7B><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD>."
/* 34 */ , "<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD>{<7B><><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD>."
/* 35 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 36 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-<2D><><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>{<7B> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><> <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 37 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 38 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>,@<40><> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 39 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD><EFBFBD>{<7B>, <20><><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 40 */ , "<EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20><><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>."
/* 41 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
/* 42 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><>, <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 43 */ , "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>{<7B>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><>."
/* 44 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!@<40><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 45 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD><EFBFBD><EFBFBD> <20> <20><> <20><><EFBFBD><EFBFBD><EFBFBD>, <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>{<7B>."
/* 46 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 47 */ , "<EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 48 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>~<7E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>@<40><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD>{<7B>."
/* 49 */ , "<EFBFBD><EFBFBD>! <20>!@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>~<7E><>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,@<40><><EFBFBD><EFBFBD><EFBFBD> <20><>{<7B><><EFBFBD> <20><> <20><><EFBFBD><EFBFBD>."
/* 50 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 51 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>!"
/* 52 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 53 */ , "<EFBFBD> <20><><EFBFBD><EFBFBD> <20><>~<7E> <20><>~<7E> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.@<40> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>.@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
/* 54 */ , "<EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD>."
/* 55 */ , "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><>...@<40><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>~<7E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>~<7E> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>."
/* 56 */ , "<EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>? <20><> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>?! <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>!"
// TR1 levels
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{<7B>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
, "<EFBFBD><EFBFBD><EFBFBD>{<7B>"
// TR2 levels
, "Lara's Home"
, "The Great Wall"
, "Venice"
, "Bartoli's Hideout"
, "Opera House"
, "Offshore Rig"
, "Diving Area"
, "40 Fathoms"
, "Wreck of the Maria Doria"
, "Living Quarters"
, "The Deck"
, "Tibetan Foothills"
, "Barkhang Monastery"
, "Catacombs of the Talion"
, "Ice Palace"
, "Temple of Xian"
, "Floating Islands"
, "The Dragon's Lair"
, "Home Sweet Home"
// TR3 levels
, "Lara's House"
, "Jungle"
, "Temple Ruins"
, "The River Ganges"
, "Caves Of Kaliya"
, "Coastal Village"
, "Crash Site"
, "Madubu Gorge"
, "Temple Of Puna"
, "Thames Wharf"
, "Aldwych"
, "Lud's Gate"
, "City"
, "Nevada Desert"
, "High Security Compound"
, "Area 51"
, "Antarctica"
, "RX-Tech Mines"
, "Lost City Of Tinnos"
, "Meteorite Cavern"
, "All Hallows"
};
char **STR = NULL; char **STR = NULL;
void ensureLanguage(int lang) { void ensureLanguage(int lang) {
@@ -1675,6 +1902,7 @@ void ensureLanguage(int lang) {
ASSERT(COUNT(STR_ES) == STR_MAX); ASSERT(COUNT(STR_ES) == STR_MAX);
ASSERT(COUNT(STR_IT) == STR_MAX); ASSERT(COUNT(STR_IT) == STR_MAX);
ASSERT(COUNT(STR_PL) == STR_MAX); ASSERT(COUNT(STR_PL) == STR_MAX);
ASSERT(COUNT(STR_RU) == STR_MAX);
lang += STR_LANG_EN; lang += STR_LANG_EN;
@@ -1685,7 +1913,7 @@ void ensureLanguage(int lang) {
case STR_LANG_IT : STR = (char**)STR_IT; break; case STR_LANG_IT : STR = (char**)STR_IT; break;
case STR_LANG_PL : STR = (char**)STR_PL; break; case STR_LANG_PL : STR = (char**)STR_PL; break;
case STR_LANG_PT : STR = (char**)STR_EN; break; case STR_LANG_PT : STR = (char**)STR_EN; break;
case STR_LANG_RU : STR = (char**)STR_EN; break; case STR_LANG_RU : STR = (char**)STR_RU; break;
case STR_LANG_JA : STR = (char**)STR_EN; break; case STR_LANG_JA : STR = (char**)STR_EN; break;
default : STR = (char**)STR_EN; break; default : STR = (char**)STR_EN; break;
} }

View File

@@ -357,7 +357,7 @@ struct MeshBuilder {
TR::Room::Data::Vertex &v = d.vertices[f.vertexIndex]; TR::Room::Data::Vertex &v = d.vertices[f.vertexIndex];
TR::TextureInfo &sprite = level->spriteTextures[f.texture]; TR::TextureInfo &sprite = level->spriteTextures[f.texture];
addSprite(indices, vertices, iCount, vCount, vStartRoom, v.pos.x, v.pos.y, v.pos.z, false, sprite, v.color, v.color); addSprite(indices, vertices, iCount, vCount, vStartRoom, v.pos.x, v.pos.y, v.pos.z, false, false, sprite, v.color, v.color);
} }
range.sprites.iCount = iCount - range.sprites.iStart; range.sprites.iCount = iCount - range.sprites.iStart;
#else #else
@@ -1160,7 +1160,7 @@ struct MeshBuilder {
return short4(int16(coord.x), int16(coord.y), int16(coord.z), 0); return short4(int16(coord.x), int16(coord.y), int16(coord.z), 0);
} }
void addSprite(Index *indices, Vertex *vertices, int &iCount, int &vCount, int vStart, int16 x, int16 y, int16 z, bool invert, const TR::TextureInfo &sprite, const Color32 &tColor, const Color32 &bColor, bool expand = false) { void addSprite(Index *indices, Vertex *vertices, int &iCount, int &vCount, int vStart, int16 x, int16 y, int16 z, bool invertX, bool invertY, const TR::TextureInfo &sprite, const Color32 &tColor, const Color32 &bColor, bool expand = false) {
addQuad(indices, iCount, vCount, vStart, NULL, NULL, false, false); addQuad(indices, iCount, vCount, vStart, NULL, NULL, false, false);
Vertex *quad = &vertices[vCount]; Vertex *quad = &vertices[vCount];
@@ -1168,15 +1168,19 @@ struct MeshBuilder {
int16 x0, y0, x1, y1; int16 x0, y0, x1, y1;
if (expand) { if (expand) {
if (invert) { if (invertX) {
x0 = x - int16(sprite.l); x0 = x - int16(sprite.l);
y0 = y - int16(sprite.t);
x1 = x - int16(sprite.r); x1 = x - int16(sprite.r);
y1 = y - int16(sprite.b);
} else { } else {
x0 = x + int16(sprite.l); x0 = x + int16(sprite.l);
y0 = y + int16(sprite.t);
x1 = x + int16(sprite.r); x1 = x + int16(sprite.r);
}
if (invertY) {
y0 = y - int16(sprite.t);
y1 = y - int16(sprite.b);
} else {
y0 = y + int16(sprite.t);
y1 = y + int16(sprite.b); y1 = y + int16(sprite.b);
} }
} else { } else {
@@ -1397,7 +1401,7 @@ struct MeshBuilder {
} }
} }
void addDynSprite(int spriteIndex, const short3 &center, bool invert, const Color32 &tColor, const Color32 &bColor, bool expand = false) { void addDynSprite(int spriteIndex, const short3 &center, bool invertX, bool invertY, const Color32 &tColor, const Color32 &bColor, bool expand = false) {
dynCheck(1 * 6); dynCheck(1 * 6);
TR::TextureInfo &sprite = level->spriteTextures[spriteIndex]; TR::TextureInfo &sprite = level->spriteTextures[spriteIndex];
@@ -1416,7 +1420,7 @@ struct MeshBuilder {
} }
#endif #endif
addSprite(dynIndices, dynVertices, dynICount, dynVCount, 0, center.x, center.y, center.z, invert, sprite, tColor, bColor, expand); addSprite(dynIndices, dynVertices, dynICount, dynVCount, 0, center.x, center.y, center.z, invertX, invertY, sprite, tColor, bColor, expand);
} }
void renderRoomSprites(int roomIndex) { void renderRoomSprites(int roomIndex) {

View File

@@ -2,7 +2,7 @@
cls cls
set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c
set PROJ=OpenLara set PROJ=OpenLara
set FLAGS=-O3 -ffast-math -Wno-deprecated-register --llvm-opts 2 -fmax-type-align=2 -std=c++11 -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -Wall -I../../ set FLAGS=-O3 -ffast-math -Wno-deprecated-register --llvm-opts 2 -fmax-type-align=2 -std=c++11 -s ALLOW_MEMORY_GROWTH=1 -s USE_WEBGL2=1 -Wall -Wno-invalid-source-encoding -I../../
echo. echo.
call em++ %SRC% %FLAGS% -o %PROJ%.js --preload-file ./level/1/TITLE.PSX --preload-file ./audio/1/dummy --preload-file ./audio/2/dummy --preload-file ./audio/3/dummy --preload-file ./level/2/dummy --preload-file ./level/3/dummy call em++ %SRC% %FLAGS% -o %PROJ%.js --preload-file ./level/1/TITLE.PSX --preload-file ./audio/1/dummy --preload-file ./audio/2/dummy --preload-file ./audio/3/dummy --preload-file ./level/2/dummy --preload-file ./level/3/dummy
gzip.exe -9 -f %PROJ%.data %PROJ%.js %PROJ%.js.mem gzip.exe -9 -f %PROJ%.data %PROJ%.js %PROJ%.js.mem

View File

@@ -2,7 +2,7 @@
cls cls
set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c
set PROJ=OpenLara_wasm set PROJ=OpenLara_wasm
set FLAGS=-s WASM=1 -O3 -ffast-math -Wno-deprecated-register --llvm-opts 2 -fmax-type-align=2 -std=c++11 -s USE_WEBGL2=1 -Wall -I../../ set FLAGS=-s WASM=1 -O3 -ffast-math -Wno-deprecated-register --llvm-opts 2 -fmax-type-align=2 -std=c++11 -s USE_WEBGL2=1 -Wall -Wno-invalid-source-encoding -I../../
echo. echo.
call em++ %SRC% %FLAGS% -o %PROJ%.js --preload-file ./level/1/TITLE.PSX --preload-file ./audio/1/dummy --preload-file ./audio/2/dummy --preload-file ./audio/3/dummy --preload-file ./level/2/dummy --preload-file ./level/3/dummy call em++ %SRC% %FLAGS% -o %PROJ%.js --preload-file ./level/1/TITLE.PSX --preload-file ./audio/1/dummy --preload-file ./audio/2/dummy --preload-file ./audio/3/dummy --preload-file ./level/2/dummy --preload-file ./level/3/dummy
gzip.exe -9 -f %PROJ%.data %PROJ%.js %PROJ%.wasm %PROJ%.js.mem load-wasm-worker.js gzip.exe -9 -f %PROJ%.data %PROJ%.js %PROJ%.wasm %PROJ%.js.mem load-wasm-worker.js

View File

@@ -399,7 +399,7 @@ struct TrapLavaEmitter : Controller {
vec3 p = part.pos - Core::viewPos.xyz(); vec3 p = part.pos - Core::viewPos.xyz();
mesh->addDynSprite(level->spriteSequences[-(spriteIndex + 1)].sStart + part.frame, short3(int16(p.x), int16(p.y), int16(p.z)), false, color, color); mesh->addDynSprite(level->spriteSequences[-(spriteIndex + 1)].sStart + part.frame, short3(int16(p.x), int16(p.y), int16(p.z)), false, false, color, color);
} }
} }
}; };

161
src/ui.h
View File

@@ -55,6 +55,82 @@ namespace UI {
enum Align { aLeft, aRight, aCenter, aCenterV }; enum Align { aLeft, aRight, aCenter, aCenterV };
inline int getCyrillic(char c, bool &invertX, bool &invertY, int &dx, int &dy) {
if ((c >= '<EFBFBD>' && c <= '<EFBFBD>') || (c >= '<EFBFBD>' && c <= '<EFBFBD>')) {
switch (c) {
case '<EFBFBD>' : return 'a';
case '<EFBFBD>' : return '6';
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'r';
case '<EFBFBD>' : invertX = true; return '6';
case '<EFBFBD>' : return 'e';
case '<EFBFBD>' : return 'e';
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'u';
case '<EFBFBD>' : return 'u';
case '<EFBFBD>' : return 'k';
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'o';
case '<EFBFBD>' : return 'n';
case '<EFBFBD>' : return 'p';
case '<EFBFBD>' : return 'c';
case '<EFBFBD>' : return 'm';
case '<EFBFBD>' : return 'y';
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'x';
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'A';
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'B';
case '<EFBFBD>' : invertY = true; dy -= 3; return 'L';
case '<EFBFBD>' : return 'D';
case '<EFBFBD>' : return 'E';
case '<EFBFBD>' : return 'E';
case '<EFBFBD>' : break;
case '<EFBFBD>' : return '3';
case '<EFBFBD>' : invertY = true; dy = -3; return 'N';
case '<EFBFBD>' : invertY = true; dy = -3; return 'N';
case '<EFBFBD>' : return 'K';
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'M';
case '<EFBFBD>' : return 'H';
case '<EFBFBD>' : return 'O';
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'P';
case '<EFBFBD>' : return 'C';
case '<EFBFBD>' : return 'T';
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : return 'X';
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : invertX = invertY = true; dy = -3; return 'P';
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : break;
case '<EFBFBD>' : invertX = true; return 'R';
}
return ' ';
}
return c;
}
inline int charRemap(char c) { inline int charRemap(char c) {
ASSERT(c <= 126); ASSERT(c <= 126);
if (c < 11) if (c < 11)
@@ -65,15 +141,21 @@ namespace UI {
return char_map[c - 32]; return char_map[c - 32];
} }
inline bool skipChar(char c) {
return c == '~' || c == '$' || c == '(' || c == ')' || c == '|' || c == '/' || c == '*' || c == '{';
}
short2 getLineSize(const char *text) { short2 getLineSize(const char *text) {
int x = 0; bool ix, iy;
int dx, dy;
int x = 0;
while (char c = *text++) { while (char c = *text++) {
c = getCyrillic(c, ix, iy, dx, dy);
if (c == '\xBF') c = '?'; if (c == '\xBF') c = '?';
if (c == '\xA1') c = '!'; if (c == '\xA1') c = '!';
if (c == '|') c = 'c';
if (c == '~' || c == '$' || c == '(' || c == ')') { // umlauts if (skipChar(c)) {
// //
} else if (c == ' ' || c == '_') { } else if (c == ' ' || c == '_') {
x += 6; x += 6;
@@ -87,14 +169,16 @@ namespace UI {
} }
short2 getTextSize(const char *text) { short2 getTextSize(const char *text) {
bool ix, iy;
int dx, dy;
int x = 0, w = 0, h = 16; int x = 0, w = 0, h = 16;
while (char c = *text++) { while (char c = *text++) {
c = getCyrillic(c, ix, iy, dx, dy);
if (c == '\xBF') c = '?'; if (c == '\xBF') c = '?';
if (c == '\xA1') c = '!'; if (c == '\xA1') c = '!';
if (c == '|') c = 'c';
if (c == '~' || c == '$' || c == '(' || c == ')') { // umlauts if (skipChar(c)) {
// //
} else if (c == ' ' || c == '_') { } else if (c == ' ' || c == '_') {
x += 6; x += 6;
@@ -196,10 +280,12 @@ namespace UI {
} }
while (char c = *text++) { while (char c = *text++) {
bool invert = false; bool invertX = false, invertY = false;
int dx = 0, dy = 0;
if (c == '\xBF') { c = '?'; invert = true; } c = getCyrillic(c, invertX, invertY, dx, dy);
if (c == '\xA1') { c = '!'; invert = true; } if (c == '\xBF') { c = '?'; invertX = invertY = true; }
if (c == '\xA1') { c = '!'; invertX = invertY = true; }
if (c == '@') { if (c == '@') {
x = int(pos.x) + getLeftOffset(text, align, int(width)); x = int(pos.x) + getLeftOffset(text, align, int(width));
@@ -215,7 +301,9 @@ namespace UI {
char charFrame = c; char charFrame = c;
if (charFrame == '\xBF') charFrame = '?'; if (charFrame == '\xBF') charFrame = '?';
if (charFrame == '\xA1') charFrame = '!'; if (charFrame == '\xA1') charFrame = '!';
if (charFrame == '|') charFrame = 'c'; if (charFrame == '|') charFrame = ',';
if (charFrame == '*') charFrame = '.';
if (charFrame == '{') charFrame = '(';
int frame = charRemap(charFrame); int frame = charRemap(charFrame);
@@ -240,27 +328,52 @@ namespace UI {
} }
} }
int dx = 0, dy = 0; bool isSkipChar = skipChar(c);
if (c == '~' || c == '$' || c == '(' || c == ')') {
if (isSkipChar) {
int idx = charRemap(*text); int idx = charRemap(*text);
dx = (char_width[idx] - char_width[frame]) / 2 - 1;
if (idx < 26) { // if next char is uppercase if (c == '{') {
dy -= 4; invertY = true;
dx = idx < 26 ? 2 : 0;
dy = idx < 26 ? -17 : -13;
} else if (c == '*') {
dx = (char_width[idx] - char_width[frame]) / 2;
dy = idx < 26 ? -13 : -9;
} else if (c == '/') {
frame = idx;
text++;
isSkipChar = false;
} else if (c == '|') {
dy = 2;
invertX = true;
if (idx < 26) {
dx = (char_width[idx] - char_width[frame]);
} else {
dx = (char_width[idx] - char_width[frame]) / 2;
}
} else {
dx = (char_width[idx] - char_width[frame]) / 2 - 1;
if (idx < 26) { // if next char is uppercase
dy -= 4;
}
} }
} }
if (invert) { if (invertX) dx += char_width[frame];
dx += char_width[frame]; if (invertY) dy -= 10;
dy -= 10;
if (c == '/') {
int ox = frame < 26 ? 1 : 0;
int line = charRemap(')');
mesh->addDynSprite(level->spriteSequences[seq].sStart + line, short3(x + ox + 1, y + 4, 0), false, false, tColor, bColor, true);
mesh->addDynSprite(level->spriteSequences[seq].sStart + line, short3(x + ox - 3, y + 7, 0), false, false, tColor, bColor, true);
} }
if (c == '|') { mesh->addDynSprite(level->spriteSequences[seq].sStart + frame, short3(x + dx, y + dy, 0), invertX, invertY, tColor, bColor, true);
mesh->addDynSprite(level->spriteSequences[seq].sStart + charRemap(','), short3(x + 3, y + 1, 0), invert, tColor, bColor, true);
}
mesh->addDynSprite(level->spriteSequences[seq].sStart + frame, short3(x + dx, y + dy, 0), invert, tColor, bColor, true); if (!isSkipChar) {
if (c != '~' && c != '$' && c != '(' && c != ')') { // umlauts
x += char_width[frame] + 1; x += char_width[frame] + 1;
} }
} }
@@ -279,7 +392,7 @@ namespace UI {
if (specChar >= level->spriteSequences[seq].sCount) if (specChar >= level->spriteSequences[seq].sCount)
return; return;
mesh->addDynSprite(level->spriteSequences[seq].sStart + specChar, short3(int16(pos.x), int16(pos.y), 0), false, COLOR_WHITE, COLOR_WHITE, true); mesh->addDynSprite(level->spriteSequences[seq].sStart + specChar, short3(int16(pos.x), int16(pos.y), 0), false, false, COLOR_WHITE, COLOR_WHITE, true);
} }
#undef MAX_CHARS #undef MAX_CHARS