diff --git a/src/controller.h b/src/controller.h index aa40263..a52726e 100644 --- a/src/controller.h +++ b/src/controller.h @@ -1445,7 +1445,7 @@ struct Controller { 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) { diff --git a/src/gapi_gl.h b/src/gapi_gl.h index 0b08621..7f6938a 100644 --- a/src/gapi_gl.h +++ b/src/gapi_gl.h @@ -495,7 +495,7 @@ namespace GAPI { char defines[1024]; defines[0] = 0; - strcat(defines, "#define VER2\n"); + strcat(defines, "#define VER3\n"); for (int i = 0; i < defCount; i++) { sprintf(defines + strlen(defines), "#define %s\n", DefineName[def[i]]); @@ -1218,12 +1218,12 @@ namespace GAPI { strcat(GLSL_HEADER_FRAG, "#define FRAGMENT\n" "precision lowp int;\n" "precision highp float;\n" + "precision lowp sampler3D;\n" "#define varying in\n" "#define texture2D texture\n" "#define texture3D texture\n" "#define textureCube texture\n" - "#define sampler3D lowp sampler3D\n" - "out vec4 fragColor;\n"); + "layout(location = 0) out vec4 fragColor;\n"); } #else strcat(GLSL_HEADER_VERT, "#version 110\n" diff --git a/src/lang.h b/src/lang.h index ea37bc5..0421a82 100644 --- a/src/lang.h +++ b/src/lang.h @@ -236,7 +236,7 @@ enum StringID { #define STR_LANGUAGES \ "English" \ - , "Fran|ais" \ + , "Fran|cais" \ , "Deutsch" \ , "Espa(~nol" \ , "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." /* 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." -/* 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!" /* 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!" /* 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." /* 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." /* 47 */ , "Et maintenant un bon bain!" /* 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." -/* 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!" /* 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!" @@ -809,7 +809,7 @@ const char *STR_DE[] = { "" // by Oktopaps , "Kompass" , "Statistiken" , "Laras Haus" - , "Detailstufe" + , "Grafik" , "Ton" , "Steuerung" , "Gamma" @@ -821,14 +821,14 @@ const char *STR_DE[] = { "" // by Oktopaps , "Spiel beenden" , "Level w~ahlen" // detail options - , "Detailstufe w~ahlen" + , "Grafikeinstellungen" , "Filterung" , "Beleuchtung" , "Schatten" , "Wasser" , "V-Sync" , "Stereo" - , "Einfache Gegenst~ande" + , "Simple Items" // sound options , "Lautst~arke einstellen" , "Nachhall" @@ -840,7 +840,7 @@ const char *STR_DE[] = { "" // by Oktopaps , "Gamepad" , "Vibration" , "Retargeting" - , "Multi-Zielen" + , "Multi-aiming" // controls , "Links", "Rechts", "Vorw~arts", "R~uckw~arts", "Springen", "Gehen", "Handlung", "Waffe ziehen", "Umsehen", "Ducken", "Sprinten", "Rolle", "Inventar", "Start" // 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." /* 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." -/* 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!" /* 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." /* 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." @@ -1440,87 +1440,87 @@ const char *STR_IT[] = { "" , "All Hallows" }; -const char *STR_PL[] = { "" +const char *STR_PL[] = { "" // Nickelony & Dustie // help - , "Loading..." - , "Press H for help" + , "Wczytywanie..." + , "Wci)snij H je*zeli potrzebujesz pomocy" , helpText , "%s@@@" - "KILLS %d@@" - "PICKUPS %d@@" - "SECRETS %d of %d@@" - "TIME TAKEN %s" - , "Saving game..." - , "Saving done!" - , "SAVING ERROR!" - , "YES" - , "NO" - , "Off" - , "On" - , "Split Screen" + "ZAB)OJSTWA %d@@" + "ZNAJD)ZKI %d@@" + "SEKRETY %d z %d@@" + "CZAS %s" + , "Zapisywanie..." + , "Zapis uko)nczony!" + , "B/L|AD ZAPISU!" + , "TAK" + , "NIE" + , "W/l" + , "Wy/l" + , "Podzielony ekran" , "VR" - , "Low" - , "Medium" - , "High" + , "Niska" + , ")Srednia" + , "Wysoka" , STR_LANGUAGES - , "Apply" - , "Gamepad 1" - , "Gamepad 2" - , "Gamepad 3" - , "Gamepad 4" - , "Not Ready" - , "Player 1" - , "Player 2" - , "Press Any Key" - , "%s - Select" - , "%s - Go Back" + , "Zastosuj" + , "Kontroler 1" + , "Kontroler 2" + , "Kontroler 3" + , "Kontroler 4" + , "Nie Gotowy" + , "Gracz 1" + , "Gracz 2" + , "Wci)snij dowolny przycisk" + , "%s - Wybierz" + , "%s - Wr)o)c" // inventory pages - , "OPTIONS" - , "INVENTORY" - , "ITEMS" + , "OPCJE" + , "EKWIPUNEK" + , "PRZEDMIOTY" // save game page - , "Save Game?" - , "Current Position" + , "Zapisa)c gr|e?" + , "Aktualna pozycja" // inventory option - , "Game" - , "Map" - , "Compass" - , "Statistics" - , "Lara's Home" - , "Detail Levels" - , "Sound" - , "Controls" + , "Gra" + , "Mapa" + , "Kompas" + , "Statystyki" + , "Posiad/lo)s)c Lary" + , "Poziom detali" + , "D)zwi|ek" + , "Sterowanie" , "Gamma" // passport menu - , "Load Game" - , "New Game" - , "Restart Level" - , "Exit to Title" - , "Exit Game" - , "Select Level" + , "Wczytaj gr|e" + , "Nowa gra" + , "Powt)orz poziom" + , "Wyjd)z to menu g/l)ownego" + , "Wyjd)z z gry" + , "Wybierz poziom" // detail options - , "Select Detail" - , "Filtering" - , "Lighting" - , "Shadows" - , "Water" + , "Wybierz poziom detali" + , "Filtrowanie tekstur" + , "Jako)s)c )swiat/la" + , "Jako)s)c cieni" + , "Jako)s)c wody" , "VSync" - , "Stereo" - , "Simple Items" + , "D)zwi|ek stereo" + , "Proste przedmioty" // sound options - , "Set Volumes" - , "Reverberation" - , "Subtitles" - , "Language" + , "Ustaw g/lo)sno)s)c" + , "Pog/los" + , "Napisy" + , "J|ezyk" // controls options - , "Set Controls" - , "Keyboard" - , "Gamepad" - , "Vibration" - , "Retargeting" - , "Multi-aiming" + , "Ustaw sterowanie" + , "Klawiatura" + , "Kontroler" + , "Wibracje" + , "Auto. zmiana celu" + , "Wielo-celowanie" // 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 , "NONE", "LEFT", "RIGHT", "UP", "DOWN", "SPACE", "TAB", "ENTER", "ESCAPE", "SHIFT", "CTRL", "ALT" , "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" @@ -1529,64 +1529,64 @@ const char *STR_PL[] = { "" // 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 - , "Unknown" - , "Explosive" - , "Pistols" - , "Shotgun" - , "Magnums" - , "Uzis" - , "Pistol Clips" - , "Shotgun Shells" - , "Magnum Clips" - , "Uzi Clips" - , "Small Medi Pack" - , "Large Medi Pack" - , "Lead Bar" - , "Scion" + , "Nieznany" + , "Materia/l wybuchowy" + , "Pistolety" + , "Strzelba" + , "Pistolety Magnum" + , "Pistolety Uzi" + , "Amunicja do pistolet)ow" + , "Naboje do strzelby" + , "Amunicja do Magnum)ow" + , "Amunicja do Uzi" + , "Ma/la apteczka" + , "Du*za apteczka" + , "Sztabka o/lowiu" + , "Dzieci|e" // keys - , "Key" - , "Silver Key" - , "Rusty Key" - , "Gold Key" - , "Sapphire Key" - , "Neptune Key" - , "Atlas Key" - , "Damocles Key" - , "Thor Key" - , "Ornate Key" + , "Klucz" + , "Srebrny klucz" + , "Zardzewia/ly klucz" + , "Z/loty klucz" + , "Szafirowy klucz" + , "Klucz Neptuna" + , "Klucz Atlasa" + , "Klucz Damoklesa" + , "Klucz Thora" + , "Ozdobiony klucz" // puzzles - , "Puzzle" - , "Gold Idol" - , "Gold Bar" - , "Machine Cog" - , "Fuse" - , "Ankh" - , "Eye of Horus" - , "Seal of Anubis" - , "Scarab" - , "Pyramid Key" + , "Zagadka" + , "Z/lota figurka" + , "Sztabka z/lota" + , "Z|ebatka" + , "Bezpiecznik" + , "Anch" + , "Oko Horusa" + , "Piecz|e)c Anubisa" + , "Skarabeusz" + , "Klucz do piramidy" // TR1 subtitles /* 22 */ , "" /* 23 */ , "" /* 24 */ , "" /* 25 */ , "" -/* 26 */ , "Welcome to my home!@I'll take you on a guided tour." -/* 27 */ , "Use the directional buttons to go into the music room." -/* 28 */ , "OK. Let's do some tumbling.@Press the jump button." -/* 29 */ , "Now press it again and press one of@the directions and I'll jump that way." -/* 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." -/* 31 */ , "Run up to a crate, and while still pressing forwards@press action, and I'll vault up onto it." -/* 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." -/* 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." -/* 34 */ , "With the walk button down, I won't fall off even if you try to make me.@Go on, try it." -/* 35 */ , "If you want look around, press and hold the look button.@Then press in the direction you want to look." -/* 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." -/* 37 */ , "Press forward and I'll climb up." -/* 38 */ , "If I do a running jump, I can make a jump like that, no problem." -/* 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." -/* 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." -/* 41 */ , "Nice." -/* 42 */ , "Try to vault up here.@Press forwards and hold action." +/* 26 */ , "Witaj w mojej posiad/lo)sci! Chod)z, oprowadz|e ci|e." +/* 27 */ , "U*zywaj przycisk)ow kierunkowych, aby p)oj)s)c do pokoju muzycznego." +/* 28 */ , "No dobrze, teraz zr)obmy kilka akrobacji.@Wci)snij przycisk Skoku." +/* 29 */ , "Teraz wci)snij go jeszcze raz wraz z jednym z przycisk)ow@kierunkowych, aby skoczy)c w danym kierunku." +/* 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 */ , "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 */ , "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 */ , "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 */ , "Podczas trzymania przycisku Chodu nie spadn|e@z *zadnej kraw|edzi, nawet je)sli tego spr)obujesz.@)Smia/lo, spr)obuj." +/* 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 */ , "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 */ , "Wci)snij przycisk Prz)od, abym mog/la si|e wspi|a)c." +/* 38 */ , "Je)sli przed skopkiem zrobi|e rozbieg, mog|e@przeskoczy)c ten dystans bez problemu." +/* 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 */ , "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 */ , "Nie)zle." +/* 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." /* 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." @@ -1666,6 +1666,233 @@ const char *STR_PL[] = { "" , "All Hallows" }; +const char *STR_RU[] = { "" +// help + , "Загрузка..." + , "Нажмите H для помощи" + , helpText + , "%s@@@" + "Уби{иств %d@@" + "Предметов %d@@" + "Секретов %d из %d@@" + "Время %s" + , "Сохранение игры..." + , "Сохранение завершено!" + , "ОШИБКА СОХРАНЕНИЯ!" + , "ДА" + , "НЕТ" + , "Выкл" + , "Вкл" + , "Раздел~енны{и экран" + , "VR" + , "Низкое" + , "Среднее" + , "Высокое" + , STR_LANGUAGES + , "Принять" + , "Ге{импад 1" + , "Ге{импад 2" + , "Ге{импад 3" + , "Ге{импад 4" + , "Не готов" + , "Игрок 1" + , "Игрок 2" + , "Нажмите любую клавишу" + , "%s - Выбрать" + , "%s - Назад" +// inventory pages + , "ОПЦИИ" + , "ИНВЕНТАРЬ" + , "Предметы" +// save game page + , "Сохранить игру?" + , "Текущая позиция" +// inventory option + , "Игра" + , "Карта" + , "Компас" + , "Статистика" + , "Особняк Лары" + , "Графика" + , "Звук" + , "Управление" + , "Гамма" +// passport menu + , "Загрузить игру" + , "Новая игра" + , "Перезапустить" + , "Выход в меню" + , "Вы{ити из игры" + , "Выбор уровня" +// detail options + , "Настро{ика графики" + , "Фильтрация" + , "Освещение" + , "Тени" + , "Вода" + , "VSync" + , "Стерео" + , "Простые предметы" +// sound options + , "Настро{ика звука" + , "Реверберация" + , "Субтитры" + , "Язык" +// controls options + , "Настро{ика управления" + , "Клавиатура" + , "Ге{импад" + , "Вибрация" + , "Ретаргетинг" + , "Мульти-цель" + // controls + , "Влево", "Вправо", "Бег", "Назад", "Прыжок", "Шаг", "Де{иствие", "Оружие", "Смотреть", "Присесть", "Спринт", "Кувырок", "Инвентарь", "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 + , "Неизвестно" + , "Взрывчатка" + , "Пистолеты" + , "Дробовик" + , "Магнумы" + , "Узи" + , "Обо{имы пистолетов" + , "Патроны дробовика" + , "Обо{имы магнумов" + , "Обо{имы узи" + , "Маленькая аптечка" + , "Большая аптечка" + , "Свинцовы{и слиток" + , "Скион" +// keys + , "Ключ" + , "Серебряны{и ключ" + , "Ржавы{и ключ" + , "Золото{и ключ" + , "Сапфировы{и ключ" + , "Ключ Нептуна" + , "Ключ Атланта" + , "Ключ Дамокла" + , "Ключ Тора" + , "Изысканны{и ключ" +// puzzles + , "Элемент" + , "Золото{и идол" + , "Золото{и слиток" + , "Шестерня" + , "Предохранитель" + , "Анкх" + , "Глаз Гора" + , "Печать Анубиса" + , "Скарабе{и" + , "Ключ пирамиды" +// TR1 subtitles +/* 22 */ , "" +/* 23 */ , "" +/* 24 */ , "" +/* 25 */ , "" +/* 26 */ , "АБВГДЕ~EЖЗИ{ИКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ@абвгде~eжзи{иклмнопрстуфхцчшщъыьэюя"//"Добро пожаловать ко мне домо{и. Я проведу небольшую экскурсию." +/* 27 */ , "Использу{ите стрелки, чтобы идти в музыкальную комнату." +/* 28 */ , "Хорошо. Теперь немного акробатики.@Нажмите клавишу прыжка." +/* 29 */ , "Теперь снова нажмите прыжок и быстро нажмите одну из стрелок.@Я прыгну в одном из направлени{и." +/* 30 */ , "Это главны{и холл.@Прошу прощения за беспорядок, много веще{и нужно перенести в хранилище, но грузчики ещ~е не прибыли." +/* 31 */ , "Подо{идите к ящику и продолжая нажимать клафишу впер~ед нажима{ите клавишу де{иствия,@тогда я залезу на ящик." +/* 32 */ , "Раньше это был бальны{и зал, но я переделала его для заняти{и гимнастико{и.@Что скажете?.@Что ж, сделаем пару упражнени{и." +/* 33 */ , "Я не всегда бегаю сломя голову.@Иногда требуется осторожно подо{ити к чему-нибудь.@Зажмите клавишу ходьбы и подо{идите к бело{и линии." +/* 34 */ , "С зажато{и клавише{и ходьбы я никуда упаду, даже если вы будете неосторожны.@Дава{ите, попробу{ите." +/* 35 */ , "Если вы хотите осмотреться, нажмите и держите клавишу смотреть,@затем нажмите клавишу нужного направления." +/* 36 */ , "Если я не могу допрыгнуть куда-либо, я могу ухватиться за кра{и и уберечься от падения.@Идите к краю с бело{и линие{и до тех пор пока я не остановлюсь.@Затем нажмите прыжок и сразу же клавишу впер~ед.@Когда я окажусь в воздухе, нажмите и держите клавишу де{иствия." +/* 37 */ , "Нажмите клавишу впер~ед и я полезу наверх." +/* 38 */ , "Если нажать прыжок во время бега,@то я без проблем совершу такие прыжки." +/* 39 */ , "Идите к краю с бело{и линие{и, пока я не остановлюсь.@Затем пере{идя на шаг нажмите клавишу назад,@чтобы дать мне место для разбега.@Нажмите клавишу впер~ед и сразу нажмите и держите клавишу прыжка.@Я совершу прыжок в ту же секунду." +/* 40 */ , "Так, я теперь сложны{и трюк.@Сдела{ите как и прежде прыжок с разбега, а затем, пока я в воздухе,@нажмите клавишу де{иствия, чтобя я ухватилась за уступ." +/* 41 */ , "Отлично!" +/* 42 */ , "Попробуем туда забраться.@Нажмите клавишу впер~ед, а затем зажмите клавишу де{иствия." +/* 43 */ , "Мне туда не залезть, проход слишком узки{и.@Нажмите клавишу вправо и я пере{иду на руках на свободное место.@Затем нажмите впер~ед." +/* 44 */ , "Отлично!@Если уступ слишком высоки{и и при прыжке с него можно покалечиться,@я могу спуститься осторожно." +/* 45 */ , "Нажмите клавишу назад и я отпрыгну назад.@Сразу же нажмите и держите клавишу де{иствия,@тогда я не упаду, а ухвачусь за кра{и." +/* 46 */ , "Затем отпустите клавишу." +/* 47 */ , "А теперь поплаваем." +/* 48 */ , "Клавиша прыжка и стрелки изменяют мо~е направление@при плавании под водо{и." +/* 49 */ , "Ах! Э!@Использу{ите клавиши впер~ед, вправо и влево для перемещения по поверхности воды.@Нажмите прыжок, чтобы нырнуть,@или плывите к краю и нажмите де{иствие,@чтобы вы{ити из воды." +/* 50 */ , "Хорошо. А теперь пора переодеться в сухую одежду." +/* 51 */ , "Скажи сыыыр!" +/* 52 */ , "Ничего личного." +/* 53 */ , "У меня вс~е ещ~е боль в голове после тебя.@И она подкидывает забавные идеи.@Например, пристрелить тебя к чертям!" +/* 54 */ , "Так просто от меня и моих выродков тебе не избавиться, Лара." +/* 55 */ , "Немного поздно для разадчи призов, но...@впрочем, тво~е участие ещ~е считается." +/* 56 */ , "Ты в меня стреляешь? Ты в меня стреляешь?! Тут больше никого, значит ты в меня стреляешь!" +// TR1 levels + , "Особняк Лары" + , "Пещеры" + , "Город Вилкабамба" + , "Затерянная Долина" + , "Гробница Квалопека" + , "Монастырь Св. Франциска" + , "Колизе{и" + , "Дворец Мидаса" + , "Цистерна" + , "Гробница Тихокана" + , "Храм Камун" + , "Обелиск Камун" + , "Святилище Скиона" + , "Раскопки Натлы" + , "Атлантида" + , "Великая Пирамида" + , "Возвращение в Египет" + , "Храм Кошки" + , "Крепость Атлантиды" + , "Уле{и" +// 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; void ensureLanguage(int lang) { @@ -1675,6 +1902,7 @@ void ensureLanguage(int lang) { ASSERT(COUNT(STR_ES) == STR_MAX); ASSERT(COUNT(STR_IT) == STR_MAX); ASSERT(COUNT(STR_PL) == STR_MAX); + ASSERT(COUNT(STR_RU) == STR_MAX); lang += STR_LANG_EN; @@ -1685,7 +1913,7 @@ void ensureLanguage(int lang) { case STR_LANG_IT : STR = (char**)STR_IT; break; case STR_LANG_PL : STR = (char**)STR_PL; 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; default : STR = (char**)STR_EN; break; } diff --git a/src/mesh.h b/src/mesh.h index bf4a56f..daa8ad2 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -357,7 +357,7 @@ struct MeshBuilder { TR::Room::Data::Vertex &v = d.vertices[f.vertexIndex]; 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; #else @@ -1160,7 +1160,7 @@ struct MeshBuilder { 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); Vertex *quad = &vertices[vCount]; @@ -1168,15 +1168,19 @@ struct MeshBuilder { int16 x0, y0, x1, y1; if (expand) { - if (invert) { + if (invertX) { x0 = x - int16(sprite.l); - y0 = y - int16(sprite.t); x1 = x - int16(sprite.r); - y1 = y - int16(sprite.b); } else { x0 = x + int16(sprite.l); - y0 = y + int16(sprite.t); 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); } } else { @@ -1397,7 +1401,7 @@ struct MeshBuilder { } } - void addDynSprite(int spriteIndex, const short3 ¢er, bool invert, const Color32 &tColor, const Color32 &bColor, bool expand = false) { + void addDynSprite(int spriteIndex, const short3 ¢er, bool invertX, bool invertY, const Color32 &tColor, const Color32 &bColor, bool expand = false) { dynCheck(1 * 6); TR::TextureInfo &sprite = level->spriteTextures[spriteIndex]; @@ -1416,7 +1420,7 @@ struct MeshBuilder { } #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) { diff --git a/src/platform/web/build.bat b/src/platform/web/build.bat index 0ce2d34..28ecd67 100644 --- a/src/platform/web/build.bat +++ b/src/platform/web/build.bat @@ -2,7 +2,7 @@ cls set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c 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. 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 \ No newline at end of file diff --git a/src/platform/web/build_wasm.bat b/src/platform/web/build_wasm.bat index 3b38762..1b53d48 100644 --- a/src/platform/web/build_wasm.bat +++ b/src/platform/web/build_wasm.bat @@ -2,7 +2,7 @@ cls set SRC=main.cpp ../../libs/stb_vorbis/stb_vorbis.c ../../libs/tinf/tinflate.c 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. 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 \ No newline at end of file diff --git a/src/trigger.h b/src/trigger.h index 995e461..f20aa44 100644 --- a/src/trigger.h +++ b/src/trigger.h @@ -399,7 +399,7 @@ struct TrapLavaEmitter : Controller { 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); } } }; diff --git a/src/ui.h b/src/ui.h index b4f4387..ea89d68 100644 --- a/src/ui.h +++ b/src/ui.h @@ -55,6 +55,82 @@ namespace UI { enum Align { aLeft, aRight, aCenter, aCenterV }; + inline int getCyrillic(char c, bool &invertX, bool &invertY, int &dx, int &dy) { + if ((c >= 'А' && c <= 'Я') || (c >= 'а' && c <= 'я')) { + switch (c) { + case 'а' : return 'a'; + case 'б' : return '6'; + case 'в' : break; + case 'г' : return 'r'; + case 'д' : invertX = true; return '6'; + case 'е' : return 'e'; + case 'ё' : return 'e'; + case 'ж' : break; + case 'з' : break; + case 'и' : return 'u'; + case 'й' : return 'u'; + case 'к' : return 'k'; + case 'л' : break; + case 'м' : break; + case 'н' : break; + case 'о' : return 'o'; + case 'п' : return 'n'; + case 'р' : return 'p'; + case 'с' : return 'c'; + case 'т' : return 'm'; + case 'у' : return 'y'; + case 'ф' : break; + case 'х' : return 'x'; + case 'ц' : break; + case 'ч' : break; + case 'ш' : break; + case 'щ' : break; + case 'ъ' : break; + case 'ы' : break; + case 'ь' : break; + case 'э' : break; + case 'ю' : break; + case 'я' : break; + + case 'А' : return 'A'; + case 'Б' : break; + case 'В' : return 'B'; + case 'Г' : invertY = true; dy -= 3; return 'L'; + case 'Д' : return 'D'; + case 'Е' : return 'E'; + case 'Ё' : return 'E'; + case 'Ж' : break; + case 'З' : return '3'; + case 'И' : invertY = true; dy = -3; return 'N'; + case 'Й' : invertY = true; dy = -3; return 'N'; + case 'К' : return 'K'; + case 'Л' : break; + case 'М' : return 'M'; + case 'Н' : return 'H'; + case 'О' : return 'O'; + case 'П' : break; + case 'Р' : return 'P'; + case 'С' : return 'C'; + case 'Т' : return 'T'; + case 'У' : break; + case 'Ф' : break; + case 'Х' : return 'X'; + case 'Ц' : break; + case 'Ч' : break; + case 'Ш' : break; + case 'Щ' : break; + case 'Ъ' : invertX = invertY = true; dy = -3; return 'P'; + case 'Ы' : break; + case 'Ь' : break; + case 'Э' : break; + case 'Ю' : break; + case 'Я' : invertX = true; return 'R'; + } + return ' '; + } + return c; + } + inline int charRemap(char c) { ASSERT(c <= 126); if (c < 11) @@ -65,15 +141,21 @@ namespace UI { return char_map[c - 32]; } + inline bool skipChar(char c) { + return c == '~' || c == '$' || c == '(' || c == ')' || c == '|' || c == '/' || c == '*' || c == '{'; + } + short2 getLineSize(const char *text) { - int x = 0; + bool ix, iy; + int dx, dy; + int x = 0; while (char c = *text++) { + c = getCyrillic(c, ix, iy, dx, dy); if (c == '\xBF') c = '?'; if (c == '\xA1') c = '!'; - if (c == '|') c = 'c'; - if (c == '~' || c == '$' || c == '(' || c == ')') { // umlauts + if (skipChar(c)) { // } else if (c == ' ' || c == '_') { x += 6; @@ -87,14 +169,16 @@ namespace UI { } short2 getTextSize(const char *text) { + bool ix, iy; + int dx, dy; int x = 0, w = 0, h = 16; while (char c = *text++) { + c = getCyrillic(c, ix, iy, dx, dy); if (c == '\xBF') c = '?'; if (c == '\xA1') c = '!'; - if (c == '|') c = 'c'; - if (c == '~' || c == '$' || c == '(' || c == ')') { // umlauts + if (skipChar(c)) { // } else if (c == ' ' || c == '_') { x += 6; @@ -196,10 +280,12 @@ namespace UI { } while (char c = *text++) { - bool invert = false; + bool invertX = false, invertY = false; + int dx = 0, dy = 0; - if (c == '\xBF') { c = '?'; invert = true; } - if (c == '\xA1') { c = '!'; invert = true; } + c = getCyrillic(c, invertX, invertY, dx, dy); + if (c == '\xBF') { c = '?'; invertX = invertY = true; } + if (c == '\xA1') { c = '!'; invertX = invertY = true; } if (c == '@') { x = int(pos.x) + getLeftOffset(text, align, int(width)); @@ -215,7 +301,9 @@ namespace UI { char charFrame = c; if (charFrame == '\xBF') charFrame = '?'; if (charFrame == '\xA1') charFrame = '!'; - if (charFrame == '|') charFrame = 'c'; + if (charFrame == '|') charFrame = ','; + if (charFrame == '*') charFrame = '.'; + if (charFrame == '{') charFrame = '('; int frame = charRemap(charFrame); @@ -240,27 +328,52 @@ namespace UI { } } - int dx = 0, dy = 0; - if (c == '~' || c == '$' || c == '(' || c == ')') { + bool isSkipChar = skipChar(c); + + if (isSkipChar) { int idx = charRemap(*text); - dx = (char_width[idx] - char_width[frame]) / 2 - 1; - if (idx < 26) { // if next char is uppercase - dy -= 4; + + if (c == '{') { + 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) { - dx += char_width[frame]; - dy -= 10; + if (invertX) dx += char_width[frame]; + if (invertY) 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 + charRemap(','), short3(x + 3, y + 1, 0), invert, tColor, bColor, true); - } + mesh->addDynSprite(level->spriteSequences[seq].sStart + frame, short3(x + dx, y + dy, 0), invertX, invertY, tColor, bColor, true); - mesh->addDynSprite(level->spriteSequences[seq].sStart + frame, short3(x + dx, y + dy, 0), invert, tColor, bColor, true); - - if (c != '~' && c != '$' && c != '(' && c != ')') { // umlauts + if (!isSkipChar) { x += char_width[frame] + 1; } } @@ -279,7 +392,7 @@ namespace UI { if (specChar >= level->spriteSequences[seq].sCount) 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