Se me ha ocurrido una cosa.
Cuando estás traduciendo una frase de un idioma a otro, es posible que no tenga la misma estructura, y me gustaría tener la posibilidad de agrupar unas frases en una conversación.
Digamos que mi actor quiere decir:
“Hola.”
“Mi nombre es Guybrush Threepweeod.”
“Quiero ser pirata.”
Yo escribiría en mi código:
actor.Talk("/GUYBRUSH_HELLO_00/Hola."); actor.Talk("/GUYBRUSH_HELLO_01/Mi nombre es Guybrush Threepweeod."); actor.Talk("/GUYBRUSH_HELLO_02/Quiero ser pirata.");
y en string.tab tendría:
GUYBRUSH_HELLO_00 Hola. GUYBRUSH_HELLO_01 Mi nombre es Guybrush Threepweeod. GUYBRUSH_HELLO_02 Quiero ser pirata.
y tengo 3 archivos: GUYBRUSH_HELLO_00.ogg GUYBRUSH_HELLO_01.ogg GUYBRUSH_HELLO_02.ogg.
pero estaba pensando, ¿al traducirlo necesitaré más de 3 frases? ¿o 2 son suficientes?
Así que, no quiero tener diferentes códigos para cada idioma, lo mejor sería agrupar estas tres líneas en una sola.
Pero, ¿cómo las divido para que el actor pronuncie cada línea y tenga tres archivos de sonido independientes?
He escrito este método para hablar (Talk), y puedes incluirlo en el script del actor:
method Talk(inString) { // recupera la cadena de entrada y separa el código y el valor con / var myStr = new String(inString); var SplitArr = myStr.Split("/"); // si no está en formato ("/aaa/bbb") lo deja como está if (SplitArr.Length < 2) { this.Talk(inString); return; } // la recupera de string.tab var expanded = Game.ExpandString(inString); // la divide en partes con el separador \ // asumo que la división sólo tendrá una palabra si no se encuentra en string.tab, así que la trataremos como tal var expandedStr = new String(expanded); var SplitArr2 = expandedStr.Split("\"); // si es una línea la dice como es if (SplitArr2.Length < 2) { this.Talk(inString); return; } // pronuncia cada parte y reproduce su sonido según TAG_NAME_00 etc.. for (var i= 0; i < SplitArr2.Length; i = i+1){ var fmti; if (i < 10) { fmti = "0" + i; } else { fmti = i; } var outString = "/" + SplitArr[1] + "_" + fmti + "/" + SplitArr2[i] ; this.Talk(outString); } }
Ahora, también quiero estar seguro de que tengo todas mis cadenas en string.tab, así que en lugar de usar el texto en el código, escribiré “MISSING_TEXT BLABLABLA” y así sabré qué falta cuando haga las preguntas y respuestas.
Lo que tengo ahora es:
actor.Talk("/GUYBRUSH_HELLO/MISSING TEXT GUYBRUSH_HELLO");
y en string.tab:
GUYBRUSH_HELLO Hola.\Mi nombre es Guybrush Threepweeod.\Quiero ser pirata.
y mantengo mis archivos de sonido originales GUYBRUSH_HELLO_00… hasta el 02, y funciona perfecto.
Nota: inicialmente quería usar el separador |, pero WME lo cambia a \n. algo que no está documentado, y así no puedes dividir fácilmente una cadena con dos caracteres sin escribir otra función.