From 2dba158031571949a9904027bb72496f41369fbb Mon Sep 17 00:00:00 2001 From: XProger Date: Mon, 18 Feb 2019 02:32:42 +0300 Subject: [PATCH] add Spanish translation (text only) --- src/controller.h | 2 +- src/lang.h | 234 ++++++++++++++++++++++++++++++++++++++++++++++- src/mesh.h | 23 +++-- src/trigger.h | 2 +- src/ui.h | 21 +++-- 5 files changed, 260 insertions(+), 22 deletions(-) diff --git a/src/controller.h b/src/controller.h index d000821..2355b04 100644 --- a/src/controller.h +++ b/src/controller.h @@ -1434,7 +1434,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)), color, color); + game->getMesh()->addDynSprite(level->spriteSequences[-(getEntity().modelIndex + 1)].sStart + frame, short3(int16(p.x), int16(p.y), int16(p.z)), false, color, color); } virtual void render(Frustum *frustum, MeshBuilder *mesh, Shader::Type type, bool caustics) { diff --git a/src/lang.h b/src/lang.h index 33f4236..9aff811 100644 --- a/src/lang.h +++ b/src/lang.h @@ -478,7 +478,7 @@ const char *STR_EN[] = { "" const char *STR_FR[] = { "" // help , "Chargement..." - , "Press H for help" + , "Appuyez sur H pour afficher l'aide" , helpText , "%s@@@" "ENNEMIS TU)ES %d@@" @@ -512,7 +512,7 @@ const char *STR_FR[] = { "" , "Not Ready" , "Joueur 1" , "Joueur 2" - , "Press Any Key" + , "Appuyez sur une touche" , "%s - Choisir" , "%s - Retour" // inventory pages @@ -931,6 +931,234 @@ const char *STR_DE[] = { "" , "All Hallows" }; +const char *STR_ES[] = { "" +// help + , "Cargando..." + , "Pulsa H para ayuda" + , helpText + , "%s@@@" + "BAJAS %d@@" + "RECOGIDAS %d@@" + "SECRETOS %d de %d@@" + "TIEMPO %s" + , "Saving game..." + , "Saving done!" + , "SAVING ERROR!" + , "SI" + , "NO" + , "No" + , "Si" + , "Pantalla dividida" + , "VR" + , "Bajo" + , "Medio" + , "Alto" + , "English" + , "French" + , "German" + , "Spanish" + , "Italian" + , "Russian" + , "Japanese" + , "Aplicar" + , "Gamepad 1" + , "Gamepad 2" + , "Gamepad 3" + , "Gamepad 4" + , "Not Ready" + , "Jugador 1" + , "Jugador 2" + , "Pulsa Cualquier Tecla" + , "%s - Elegir" + , "%s - Regresa" +// inventory pages + , "OPCIONES" + , "INVENTARIO" + , "OBJETOS" +// save game page + , "\xBF""Guardar juego?" + , "Posici)on actual" +// inventory option + , "Juego" + , "Mapa" + , "Br)ujula" + , "Estadistica" + , "Casa De Lara" + , "Nivel de Detalle" + , "Sonido" + , "Controles" + , "Gamma" +// passport menu + , "Cargar Juego" + , "Juego Nuevo" + , "Reiniciar Nivel" + , "Regresar a los T)itulos" + , "Salir del Juego" + , "Seleccionar Nivel" +// detail options + , "Escoger Detalle" + , "Filtraci)on" + , "Iluminaci)on" + , "Oscuridad" + , "Agua" + , "VSync" + , "Stereo" + , "Objetos Simples" +// sound options + , "Fijar Volumen" + , "Reverberation" + , "Subtitles" + , "Language" +// controls options + , "Ajustar Controles" + , "Teclado" + , "Gamepad" + , "Vibraci)on" + , "Retargeting" + , "Multi-objetivo" + // controls + , "Izquierda", "Derecha", "Correr", "Atr)as", "Saltar", "Andar", "Acci)on", "Sacar Armas", "Mirar", "Duck", "Dash", "Rodar", "Inventario", "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 + , "Unknown" + , "Explosivo" + , "Pistolas" + , "Escopeta" + , "Magnums" + , "Uzis" + , "Cargadores de Pistola" + , "Cartuchos de Escopeta" + , "Cargadores de Magnum" + , "Cargadores de Uzi" + , "Botiqu)in Peque(~no" + , "Botiqu)in Grande" + , "Lingote de Plomo" + , "Scion" +// keys + , "Llave" + , "Llave de Plata" + , "Llave Oxidada" + , "Llave de Oro" + , "Llave de Zafiro" + , "Llave de Neptuno" + , "Llave de Atlas" + , "Llave de Damocles" + , "Llave de Thor" + , "Llave Decorada" +// puzzles + , "Puzle" + , "Idolo de Oro" + , "Lingote de Oror" + , "Rueda Dentada" + , "Fusible" + , "Ankh" + , "Ojo de Horus" + , "Sello de Anubis" + , "Escarabajo" + , "Llave de la Pir)amide" +// TR1 subtitles +/* 26 */ , "Bienvenido a mi casa." +/* 27 */ , "Utiliza la tecla de control para llegar a@la habitaci)on de la m)usica." +/* 28 */ , "Vale. Hagamos unas cuantas acrobacias.@Presiona la tecla de salto." +/* 29 */ , "Ahora presi)onalo de nuevo y presiona tambi)en@la tecla de control para saltar hacia ese lado." +/* 30 */ , "Ah, el hall principal.@Perdona por las cajas, estoy guardando algunas cosas@y los transportistas no han llegado." +/* 31 */ , "Corre hasta una caja y, mientras mantienes presionado la tecla Adelante@presiona la tecla Acci)on para saltar encima de la caja" +/* 32 */ , "Esto era la sala de bailes,@pero la he convertido en mi gimnasio particular.@\xBFQu)e te parece? Bien, hagamos un poco de ejercicio." +/* 33 */ , "En realidad no voy corriendo a todos lados.@Cuando quiero tener cuidado, ando.@Mant)en pulsado la tecla andar y anda hasta la linea blanca." +/* 34 */ , "Con la tecla Andar presionada no me caer)e por mucho que lo intentes.@Vamos, int)entalo." +/* 35 */ , "Si quieres mirar alrededor, presiona la tecla mirar y mantenla asi.@A continuaci)on presiona la direcci)on en la que quieras mirar." +/* 36 */ , "Si un salto es demasiado largo, puedo agarrarme@al borde salv)andome de una desagradable caida.@Camina hasta el borde que tiene la linea blanca,@hasta que ya no pueda avanzar.@Ahora presiona Saltar y justo a continuaci)on Adelante,@mientras estoy en el aire presiona Acci)on." +/* 37 */ , "Pulsa Adelante y subir)e a pulso." +/* 38 */ , "Si hago un salto en carrera tambi)en puedo hacer@ese tipo de saltos. No hay problema." +/* 39 */ , "Camina hasta el borde que tiene la linea blanca,@hasta que ya no pueda avanzar.@Ahora dame la vuelta para que tenga espacio.@Presiona Adelante y casi inmediatamente presiona@y mant)en presionada la tecla Saltar.@No voy a saltar hasta el )ultimo momento." +/* 40 */ , "Vale. Esto es m)as dificil.@Salta en carrera igual que antes pero, mientras estoy en el aire@presiona y mant)en presionado la tecla para que me agarre al borde." +/* 41 */ , "Bonito." +/* 42 */ , "Intenta subir aqui.@Presiona Adelante y mant)en presionado Acci)on." +/* 43 */ , "No puedo escalar porque el espacio es muy peque(~no.@Pero si presionas Derecha, oscilar)e a un lado@hasta que haya espacio, presiona entonces Adelante." +/* 44 */ , "\xA1\xA1Muy bien!!@Si la caida es muy grande y no quiero da(~narme@puedo descolgarme con cuidado." +/* 45 */ , "Pulsa Hacia atr)as y saltar)e.@Presiona a continuaci)on la tecla Acci)on@y me agarrar)e al borde." +/* 46 */ , "Deja que siga." +/* 47 */ , "Vamos a nadar un poco." +/* 48 */ , "La tecla de salto y la de control sirven@para dirigirme mientras buceo." +/* 49 */ , "\xA1""Ah! \xA1""Aire!@S)olo tienes que usar Adelante, Izquierda y@Derecha para moverse por la superficie.@Presiona Saltar para sumergirte y darte otro ba(~no.@O vete al borde y presiona Acci)on para salir." +/* 50 */ , "Bien. Mejor me quito la ropa mojada." +/* 51 */ , "\xA1""Di patata!" +/* 52 */ , "No es nada personal." +/* 53 */ , "Todavia me provocas dolor de cabeza.@Y ese dolor hace que se me ocurran ideas divertidas.@\xA1""Como dispararte hasta mandarte al infierno!" +/* 54 */ , "No te burlar)as de mi y mi progenie tan f)acilmente, Lara." +/* 55 */ , "Un poco tarde para la entrega de premios ¿no?@A tiempo, lo que cuenta es la recogida." +/* 56 */ , "\xBFMe disparas a mi?@\xBFMe disparas a mi, ¿eh?@\xA1No hay nadie m)as, asi que debes estar dispar)andome a mi!" +// TR1 levels + , "Casa de Lara" + , "Cuevas" + , "Ciudad de Vilcabamba" + , "El Valle Perdido" + , "Tumba de Qualopec" + , "Abad)ia de San Francis" + , "El Coliseo" + , "Palacio de Midas" + , "La Cisterna" + , "Tumba de Tihocan" + , "Ciudad de Khamoon" + , "Obelisco de Khamoon" + , "Santuario del Scion" + , "Minas de Natla" + , "Atl)antida" + , "La Gran Pir)amide" + , "Regreso a Egipto" + , "Templo de la Gata" + , "Fortaleza Atlante" + , "La Colmena" +// 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; enum LangID { @@ -951,7 +1179,7 @@ void ensureLanguage(LangID lang) { switch (lang) { case LANG_FR : STR = (char**)STR_FR; break; case LANG_DE : STR = (char**)STR_DE; break; - case LANG_ES : STR = (char**)STR_EN; break; + case LANG_ES : STR = (char**)STR_ES; break; case LANG_IT : STR = (char**)STR_EN; break; case LANG_RU : STR = (char**)STR_EN; break; case LANG_JA : STR = (char**)STR_EN; break; diff --git a/src/mesh.h b/src/mesh.h index 6113c31..556084d 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, sprite, v.color, v.color); + addSprite(indices, vertices, iCount, vCount, vStartRoom, v.pos.x, v.pos.y, v.pos.z, false, sprite, v.color, v.color); } range.sprites.iCount = iCount - range.sprites.iStart; #else @@ -1155,7 +1155,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, 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 invert, 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]; @@ -1163,10 +1163,17 @@ struct MeshBuilder { int16 x0, y0, x1, y1; if (expand) { - x0 = x + int16(sprite.l); - y0 = y + int16(sprite.t); - x1 = x + int16(sprite.r); - y1 = y + int16(sprite.b); + if (invert) { + 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); + y1 = y + int16(sprite.b); + } } else { x0 = x1 = x; y0 = y1 = y; @@ -1385,7 +1392,7 @@ struct MeshBuilder { } } - void addDynSprite(int spriteIndex, const short3 ¢er, const Color32 &tColor, const Color32 &bColor, bool expand = false) { + void addDynSprite(int spriteIndex, const short3 ¢er, bool invert, const Color32 &tColor, const Color32 &bColor, bool expand = false) { dynCheck(1 * 6); TR::TextureInfo &sprite = level->spriteTextures[spriteIndex]; @@ -1404,7 +1411,7 @@ struct MeshBuilder { } #endif - addSprite(dynIndices, dynVertices, dynICount, dynVCount, 0, center.x, center.y, center.z, sprite, tColor, bColor, expand); + addSprite(dynIndices, dynVertices, dynICount, dynVCount, 0, center.x, center.y, center.z, invert, sprite, tColor, bColor, expand); } void renderRoomSprites(int roomIndex) { diff --git a/src/trigger.h b/src/trigger.h index c0d873b..995e461 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)), color, color); + mesh->addDynSprite(level->spriteSequences[-(spriteIndex + 1)].sStart + part.frame, short3(int16(p.x), int16(p.y), int16(p.z)), false, color, color); } } }; diff --git a/src/ui.h b/src/ui.h index 7623562..11fbd30 100644 --- a/src/ui.h +++ b/src/ui.h @@ -196,8 +196,10 @@ namespace UI { } while (char c = *text++) { - if (c == '\xBF') c = '?'; - if (c == '\xA1') c = '!'; + bool invert = false; + + if (c == '\xBF') { c = '?'; invert = true; } + if (c == '\xA1') { c = '!'; invert = true; } if (c == '@') { x = int(pos.x) + getLeftOffset(text, align, int(width)); @@ -244,18 +246,19 @@ namespace UI { dx = (char_width[idx] - char_width[frame]) / 2 - 1; if (idx < 26) { // if next char is uppercase dy -= 4; - // dx += (c == '~') ? 1 : 2; } - //if (c == ')') { - // dx += 2; - //} + } + + if (invert) { + dx += char_width[frame]; + dy -= 10; } if (c == '|') { - mesh->addDynSprite(level->spriteSequences[seq].sStart + charRemap(','), short3(x + 3, y + 1, 0), 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), 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 x += char_width[frame] + 1; @@ -276,7 +279,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), COLOR_WHITE, COLOR_WHITE, true); + mesh->addDynSprite(level->spriteSequences[seq].sStart + specChar, short3(int16(pos.x), int16(pos.y), 0), false, COLOR_WHITE, COLOR_WHITE, true); } #undef MAX_CHARS