7. Module_Dialogs

    Comparte

    blancire
    Sargento a pie
    Sargento a pie

    Mensajes : 356
    Edad : 24
    Facción : 3/4

    7. Module_Dialogs

    Mensaje por blancire el Jue Feb 21, 2013 6:11 pm

    Otra parte traducida del tutorial de module system de winter: http://forums.taleworlds.com/index.php/topic,12733.0.html?PHPSESSID=hg2d05qg3d6mtdhhp327tmjlo5

    En esta parte del tutorial examinaremos el archivo module_dialogs.py, por mucho el archivo mas grande de module system y uno de los mas importantes, pues contiene todo el dialogo de Mount&Blade. Cualquier nuevo dialogo que desees crear deberá ir en este archivo. Este archivo también contiene los marcadores de posición del dialogo abajo del todo, los cuales son usados para tropas que no tienen (todavía) su propio dialogo.

    7.1 -- Desglose de Module_Dialogs

    El archivo comienza con una lista Python, seguida de la primera pieza de dialogo en el juego – El alguacil Hareck anuncia la llegada de los piratas. Un hecho importante a recordar es que el juego recorre module_dialogs de arriba abajo, usando la primera línea que cumple todos los criterios de una situación. Esto diferencia entre lineas usadas en diferentes situaciones, desde un encuentro con una party en el mapa a un escena en la que hablamos con un NPC.
    Observa que cada línea de dialogo es un tuple individual. Las únicas cosas que las unen son sus dialog-states, los cuales veremos en su momento.
    Ejemplo de un tuple de dialogo:

    [trp_constable_hareck,"start", [], "What do you want?", "constable_hareck_talk",[]],

    Esto es un tuple maravillosamente sencillo, el cual servirá como un buen ejemplo. Esto hace todo lo que una línea de dialogo puede hacer; se abre al dirigirnos al Alguacil Hareck en una escena, muestra el texto “what do you want?, y entonces continua iniciando el dialog-state “Constable_hareck_talk” mediante un clic del raton.
    Desglosamiento del campo tuple:

    1 ) interlocutor. Debe coincidir con la persona que esta hablando.
    2 ) comienzo de dialog-state. Determina como es abierta esta linea.
    3 ) Bloque de condiciones. La lista de condiciones que deben cumplirse para que esta línea sea tomada en cuenta. Debe ser un bloque de operaciones validas.
    4 )Texto del dialogo. El texto tal como aparecerá en el juego.
    5 ) Final del dialog-state. Determina que ocurre después de esta línea.
    6 ) Bloque de consecuencias. Las operaciones que toman lugar después de que el jugador haya hecho click a través de esta líneat. Debe ser un bloque de operación valido.

    Analisis del tuple de ejemplo del alguacil Hareck:
    1 ) interlocutor = trp_constable_hareck
    2 ) comienzo de dialog-state = "start"
    3 ) Bloque de condiciones = []
    4 )Texto del dialogo = "What do you want?"
    5 ) Final del dialog-state = "constable_hareck_talk"
    6 ) Bloque de consecuencias = []
    Las cosas mas importantes a observar en este tuple son los dialog-states, mencionados en el párrafo de apertura de este segmento. Ahora vamos a profundizar mas en los dialog-states.

    El final del dialog-state (“Constable_hareck_talk") es lo que conduce una conversación de una línea a la siguiente. El final del dialog-state puede ser cualquier cosa que quieras – pero debe haber una coincidencia con el comienzo del state-dialog. Por ejemplo, si hacemos un tuple con el state final “blue_oyster”, esto llevaría a cualquier tuple con el state inicial “blue_oyster” Debe ser una coincidencia exacta; si no existe coincidencia, build_module.bat nos mandara un error al intentar compilar.

    Si hay varios tuples con el state inicial “blue_oyster”, ocurrirá algo especial. Si los tuples son lineas de dialogo que dice el jugador aparecerá un menú donde el jugador podrá elegir entre los tuples que contengan ese state inicial. Si las lineas de dialogo del tuple son dichas por un NPC, el module system usara la primera tuple en module_dialogs que cumpla con la condiciones – incluso si hay varias lineas que las cumplan.

    Para finalizar una conversación, deberías usar el dialog-state final “close_window”.

    Para comenzar una conversación, hay varios dialog-states inciales especiales que puedes elegir. Nos referiremos a ellas como initial dialog-states. Aquí esta la lista completa de initial dialog-states:

    “start" – Al hablar a un NPC en una escena o cuando una conversación se activa en una escena.
    "party_encounter" – Al encontrarse con otra party en el mapa.
    "party_relievedstart" – Al ayudar a una party en una batalla en el mapa.
    "prisoner_liberated" – Cuando el jugador derrota a una party enemiga que tiene como prisioneros a uno o mas héroes.
    "enemy_defeated" – Cuando el jugador derrota una party enemiga liderada por un héroe.
    "event_triggered" – Cuando un dialogo es activado por una operación mientras no esta en una escena.
    "member_chat" – Cuando hablas a un miembro en tu party.
    "prisoner_chat" – Cuando hablas con un prisionero de tu party.

    Como puedes ver, cada initial dialog-state es diseñado para una situación específica. No se tendrán en cuenta fuera de esas situaciones.

    Viendo nuestro ejemplo del alguacil Hareck, su initial dialog-state es “start".

    7.2 – Requerimientos y las Conditions Blocks

    La interfaz de dialogo es muy flexible, y puede ser usada en una gran cantidad de formas. Se ocupa tanto de los acontecimientos en el mapa como de los eventos en las escenas. Esto permite a los diálogos ser activados cuando tu quieras.

    En los párrafos siguientes examinaremos como aprovechar al máximo la interfaz de dialogo, y después aprendermos como crear diálogos complejos nosotros mismos.

    Como hemos esbozado en la parte anterior una línea de dialogo solo será tomada en cuenta si todos las condiciones son cumplidas. Lo primero de todo el jugador deberá hablar a la tropa(troop) correcta. Una línea con trp_constable_hareck no será tomada en cuenta si el jugador se esta dirigiendo a trp_ramun_the_slave_trader. La constante anyone será usada si la línea es para ser dicha por cualquiera al que el jugador se este dirigiendo en ese momento.

    Lo segundo, el comienzo del dialog-state tiene que ser acorde a la situación – una de dos o la línea es iniciada por un initial dialog-state de los antes mencionados, o el dialog-state final coincide con el dialog-state inicial. Si el dialog-state inicial no cumple con las condiciones no será tomada en cuenta para su uso.

    Tercero, la misma lógica que los dos puntos anteriores se aplica a los bloques de condiciones. Si toda la línea de condiciones no se cumple, la línea no será tomada en cuenta. Si uno de los dos, las condiciones o el dialog-state inicial son erróneos, tendras problemas; obuild_module.bat nos dara un error, o las lineas erróneas de dialogo simplemente se congelaran en el juego, ya que su dialog-state final no será capaz de hallar otro tuple que activar.

    Esta es la razón por la que deberas ser muy cuidadoso con los bloques de condiciones(conditions blocks). Asegurate que no estropeas tu propio dialogo poniendo condiciones que no son apropiadas.

    De cualquier manera, cuando todo funciona en armonía, los bloques de condiciones pueden ser muy potentes. Ellos pueden contener bloques de prueba. Puedes llamar a las ranuras del interior de un bloque de condiciones y entonces usar el resultado en una operación de condición dentro del mismo bloque. Puedes elegir registros y cadenas de registros en el orden que las usara el dialogo. Haremos todo esto en esta parte del tutorial, uno a uno.

    Puedes observar el uso de un bloque de condiciones en el primer tuple de module_dialogs:

    [trp_constable_hareck,"start", [(eq,"$constable_announcement",0)]

    Este bloque contiene solo una condición, la cual requiere que [/color]"$constable_announcement" sea igual a 0(equal). Esto es porque todos los registros y variables son igual a 0 al principio de un nuevo juego. Y si miras al final de este tuple, veras el bloque de consecuencias:

    "constable_hareck_introduce_1",[(assign,"$constable_announcement",1)]]

    La operación assign en este bloque establece la variable "$constable_announcement" a 1 despues de que la línea ha sido mostrada. En otras palabras después de que esta línea haya sido mostrada una vez, ya nunca volverá a ser mostrada de nuevo – porque después, la variable "$constable_announcement" ya no será igual a 0. El sistema de dialogo entonces ignorara esta línea y pasara al siguiente tuple en el archivo que cumpla los requisitos:

    [trp_constable_hareck,"start", [], "What do you want?", "constable_hareck_talk",[]],

    El único requisito en esta línea es que el jugador deberá hablar con el Alguacil Hareck en una scene. Será seleccionado siempre cuando hablemos con el Alguacil Hareck en el centro de Zendar después de haber dado su discurso.

    7.3 – Añadiendo nuevos dialogos

    Aqui finalmente tenemos la ocasión de darle a nuestra nueva troop Geoffrey un dialogo. Sin embargo como module_troops, module_dialog es otro archivo donde no puedes simplemente añadir mas tuples al final de la lista. El final de module_dialog contiene marcadores de posición de conversaciones que no serán activados por nadie en absoluto, y porque el archivo será escaneado de arriba abajo, cualquier dialogo que añadas después del marcador de posición de las conversaciones será completamente ignorado.

    Es recomendable que añadas un nuevo dialogo antes del siguiente comentario:

    # Random quests
    ######################################################


    Nuestro primer objetivo es crear una introducción para Geoffrey. Esto nos permitirá ganar un poco de experiencia antes de lanzarnos a la creación nosotros mismos de un quest en toda regla.

    Copia el siguiente tuple y pegalo en el sitio apropiado en tu module_dialogs:

    [trp_geoffrey,"start", [], "What? What do you want? Leave me be, {sir/wench}, I have no time for beggars.", "geoffrey_talk",[]],

    Este es el primer tuple en nuestra nueva conversación. Esta es activada por el initial dialog-state “start”, dicho por Geoffrey y esto nos conduce al dialog-state inicial “Geoffrey_talk. Tambien el sistema de dialogo mostrara la palabra ‘sir’ o ‘wench’ dependiendo del genero del jugador.

    A continuación haremos la siguiente línea, dicha por el jugador. Copia el siguiente tuple y pegalo en module_dialogs, justo a continuación del tuple nuevo:

    [trp_geoffrey|plyr,"geoffrey_talk", [], "Nothing, never you mind.", "close_window",[]],

    Esta línea será mostrada justo después de la primera. Esta será dicha por el jugador. Debido al ending dialog-state “close_window”, esta conversación finalizara después de que esta línea haya sido mostrada.

    Como ya dijimos anteriormente, añadir multiples tuples con el mismo dialog-state inicial dara como resultado un menú de opciones desde el cual el jugador podrá elegir la línea que mas le guste. Recuerda que esto solo funciona para tuples que son dichos por el jugador y no por cualquier otra troop. Copia los siguientes tuples y pegalos en tu archivo module_dialogs:

    [trp_geoffrey|plyr,"geoffrey_talk", [], "And who are you supposed to be?", "geoffrey_talk_2",[]],
    [trp_geoffrey,"geoffrey_talk_2", [], "Why, I'm Geoffrey Eaglescourt, son of the Baron Eaglescourt! Leader of the Red Riders, bane of bandits, and crusher of pirates!", "geoffrey_talk_3",[]],
    [trp_geoffrey|plyr,"geoffrey_talk_3", [], "Oh, I see. And how many pirates have you killed?", "geoffrey_talk_4",[]],
    [trp_geoffrey,"geoffrey_talk_4", [], "See for yourself! I scalp every one of the dogs I kill. They are my battle trophies.", "geoffrey_talk_5",[]],
    [trp_geoffrey|plyr,"geoffrey_talk_5", [], "That's nice. I'll be going now.", "close_window",[]],


    Todo esto esto es parte de una posible conversación – un pequeño tira y afloja entre Geoffrey y el jugador. Nada importante ha ocurrido todavía, pero estamos a punto de añadir algo mas de variedad a este intercambio. Añade los siguientes dos tuples al dialogo:

    [trp_geoffrey|plyr,"geoffrey_talk_5", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",0)], "Really? Those scalps look suspiciously like horse tails to me.", "geoffrey_hostile",[]],
    [trp_geoffrey|plyr,"geoffrey_talk", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",0)], "You look familiar. Haven't I seen your face in a pigsty before?", "geoffrey_hostile",[]],


    Estas dos lineas crearan un menú con elecciones extra para los dialog-states iniciales “Geoffrey_talk_5” y “Geoffrey_talk”, respectivamente. Tecnicamente no importa en que parte de module_dialogs coloques tuples con el mismo dialog-state inicial. El sistema de dialogo encontrara todo y si las condiciones se cumplen los añadirá al menú de opciones. Sin embargo, deberías tratar de mantener los tuples de menú juntos en orden manteniendo asi tu código sencillo y legible.

    La característica mas notable de estas lineas son sus bloques de condiciones. Cualquier línea solo aparecerá como una opción de dialogo si el quest "qst_speak_with_troublemakers" esta actualmente activa y si "$geoffrey_duel" es igual a 0. Si alguna de estas condiciones no se cumple, la línea no se tomada en cuenta para ser mostrada. Ahora copia y pega estos últimos tuples:

    [trp_geoffrey,"geoffrey_hostile", [], "What?! I'll see you dead for that insult, peasant! Don't you know who I am?", "geoffrey_hostile_2",[]],
    [trp_geoffrey|plyr,"geoffrey_hostile_2", [], "No . . . Was I supposed to remember?", "geoffrey_hostile_3",[]],
    [trp_geoffrey,"geoffrey_hostile_3", [], "Why, I'm Geoffrey Eaglescourt, son of the Baron Eaglescourt, and you have delivered the gravest insult to my family's honour! I demand satisfaction! Meet me outside the town walls tonight, or you will be known a coward to every man in this countryside. Good day, {sirrah/wench}.", "geoffrey_hostile_4",[]],
    [trp_geoffrey|plyr,"geoffrey_hostile_4", [], "Charming lad. Tonight, eh . . . ? I shouldn't miss it . . .", "close_window",[(assign,"$geoffrey_duel",1)]],


    Con esto hecho, ahora tenemos una conversación con varias condiciones y consecuencias relacionas con la quest, asi como una tuple de quest hecha; pero todavía tenemos que crear las condiciones que permitirán al jugador activar la quest en primer lugar.

    7.4 – Dialogos y Quests

    Cuando añadimos nuevas lineas a una conversación existente, nosotros debemos tener mucho cuidado de que nuestro nuevos tuples concuerden con los existentes. Recuerda que el archivo de dialogo es escaneado de arriba abajo; recuerda comprobar tus bloques de condiciones; recuerda mantener una mirada atenta en tu sintaxis. Una falta de ortografía puede tirar abajo bloques enteros de código. Revisa el código cada poco para encontrar errores de sintaxis lo antes posible.

    Primero, vamos a añadir un tuple mas para Geoffrey, y vamos a añadirlo antes que cualquiera de sus otras lineas. Esto significa que será tomada en cuenta antes que sus otras lineas porque como ya sabemos el sistema de diálogos lee el archivo en orden desde arriba hasta abajo. Si este las condiciones de este tuple están presentes, este será seleccionado para usarlo independientemente de que cualquier otro cumpla las condiciones.

    El primer tuple de Geoffrey es este:

    [trp_geoffrey,"start", [], "What? What do you want? Leave me be, {sir/wench}, I have no time for beggars.", "geoffrey_talk",[]],

    Ahora copia el siguiente tuple y pegalo en tu archivo de dialogo por encima del tuple mencionado:

    [trp_geoffrey,"start", [(eq,"$geoffrey_duel",1)], "Begone! I have nothing to say to you, varlet.", "close_window",[]],

    Con este tuple en su lugar, la conversación normal con Geoffrey no será mostrada una vez que el haya combatido contigo en un duelo. De esta manera, puedes cambiar conversaciones dependiendo de la situación y crear infinidad de diálogos distintos con bloques de condiciones que controlen cuando aparece cada línea.

    El ultimo tuple en la conversación del Alguacil Hareck es este:

    [trp_constable_hareck|plyr,"constable_hareck_talk", [], "Nothing. Good-bye.", "close_window",[]],

    "constable_hareck_talk" es un menú con varias opciones, de las cuales este tuple es la ultima. Para que una opción de dialogo aparezca en el menú antes que esta, nosotros deberemos añadirla en module_dialogs antes de este tuple.

    Copia el siguiente tuple y pegalo en tu arhivo de diálogos antes del tuple mencionado:
    [trp_constable_hareck|plyr,"constable_hareck_talk", [(neg|check_quest_active,"qst_speak_with_troublemakers"),(neg|check_quest_finished,"qst_speak_with_troublemakers")], "Is something wrong? You look worried.", "constable_hareck_troublemakers",[]],

    Este tuple solo será mostrado si el quest "qst_speak_with_troublemakers" no esta activo y no ha sido completado esto es debido al prefijo de negación neg|, el cual causa que una condición requiera lo contrario de lo que normalmente requeriría. Por ejemplo el operador condicional eq requiere que dos valores sean iguales; neg|eq requiere que dos valores sean diferentes.

    Copia y pega los siguientes tuples:

    [trp_constable_hareck,"constable_hareck_troublemakers", [], "Oh, it's nothing, just . . .", "constable_hareck_troublemakers_2",[]],
    [trp_constable_hareck|plyr,"constable_hareck_troublemakers_2", [], "You can tell me, sir.", "constable_hareck_troublemakers_3",[]],
    [trp_constable_hareck,"constable_hareck_troublemakers_3", [], "No harm in it, I suppose. The trouble is, a few of the town's young nobles . . . spoiled dandies and fops, the lot of them . . . they've decided that suddenly they're men to be respected, and that they should 'take matters into their own hands', to 'take action where the official government has failed'. They say they're going to kill all the river pirates that have been troubling Zendar of late. Of course, they've not actually gone out to fight any river pirates, but they've been making a great ruckus in town and there's not a thing I can do about it.", "constable_hareck_troublemakers_4",[]],
    [trp_constable_hareck|plyr,"constable_hareck_troublemakers_4", [], "Hmm . . . Would there be a reward for solving this problem?", "constable_hareck_troublemakers_5",[]],
    [trp_constable_hareck,"constable_hareck_troublemakers_5", [], "What? What are you saying?", "constable_hareck_troublemakers_6",[]],
    [trp_constable_hareck|plyr,"constable_hareck_troublemakers_6", [], "Nothing, sir. However, it sounds to me like a neutral third party might be just what you need. I could talk to them.", "constable_hareck_troublemakers_7",[]],
    [trp_constable_hareck,"constable_hareck_troublemakers_7", [], "Heh. Well, you can try, friend. If you manage to do any good, I'll even throw in a few coins for getting the sand out of my breeches. Their leader is a boy named Geoffrey, spends most of his time on watered-down ale and whores in the Happy Boar. Chances are you'll find him there.", "constable_hareck_troublemakers_8",[]],
    [trp_constable_hareck|plyr,"constable_hareck_troublemakers_8", [], "Thank you, constable. I shall return.", "close_window",[(setup_quest_text,"qst_speak_with_troublemakers"),(start_quest,"qst_speak_with_troublemakers")]],

    [trp_constable_hareck|plyr,"constable_hareck_talk", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",2)], "Constable, I've taken care of the toublemakers for you. They shouldn't be a worry any longer.", "constable_hareck_troublemakers_10",[]],
    [trp_constable_hareck,"constable_hareck_troublemakers_10", [], "Truly? Thank God! A few more days and I would've thrown them all into a cell and thrown away the key. Here, take this. You've earned it.", "constable_hareck_troublemakers_11",[(troop_add_gold,"trp_player",100),(add_xp_as_reward,750),(succeed_quest,"qst_speak_with_troublemakers")]],
    [trp_constable_hareck|plyr,"constable_hareck_troublemakers_11", [], "My pleasure, constable. If you've any other jobs that need doing, please let me know. Farewell.", "close_window",[]],

    [trp_constable_hareck|plyr,"constable_hareck_talk", [(check_quest_active,"qst_speak_with_troublemakers"),(eq,"$geoffrey_duel",3)], "Constable, I failed. I'm sorry.", "constable_hareck_troublemakers_15",[]],
    [trp_constable_hareck,"constable_hareck_troublemakers_15", [], "Oh . . . Oh well. I suppose you did the best you could. Thanks anyway, friend. Perhaps some other job will suit you better. I shall let you know when I have any. Farewell.", "close_window",[(fail_quest,"qst_speak_with_troublemakers")]],


    El primer bloque establece la quest, explica los detalles y como comenzarla. El segundo bloque finaliza la quest con una pequeña recompensa de dinero y puntos de experiencia, una vez la variable "$geoffrey_duel" ha sido establecida en 2, lo cual lograremos al derrotar a Geoffrey. El tercer bloque finaliza la quest si el jugador falla al vencer a Geoffrey, lo cual significa que no recibirá recompensas.

    Como puedes ver, con esto podemos cubrir todos los posibles aspectos de una quest. Todo el dialogo esta ahora colocado, sin embargo, ya estamos preparados para ir a la siguiente parte de este tutorial.

    Este a costado mas fiuuu pero ya esta traducido para todo el que lo necesite y lo mismo cualquier sugerencia en la traduccion o cualquier cosa que no se entienda me lo decis y tratare de corregirla.

    Mikeboix
    Emperador
    Emperador

    : : wyrd bi∂ ful ārǣd
    Mensajes : 11261
    Facción : Imperio de Calradia

    Re: 7. Module_Dialogs

    Mensaje por Mikeboix el Jue Feb 21, 2013 7:17 pm

    Eres un capo, blancire. ¡Trabajazo!


    _________________
    ~No olvides leer las normas. No resuelvo dudas de los juegos por mensaje privado.~




    Last Breath of Calradian Empire: Mod sobre el glorioso pasado de Calradia. ¡Apoya el desarrollo!

      Fecha y hora actual: Lun Dic 05, 2016 11:29 am