Saludos caballeros
Es increible como esta quedando esta seccion, ha crecido mucho y de a poco se va completando.
Es mas, despues de haebr leido un poco me entran unas ganitas de meter mano...
Este es el capitulo 3, continuacion de los dos anteriores publicados por Mike.
AUTOR: Lope de Rojas
Tutorial aparecido en el viejo foro de M&B
He logrado recuperar esta serie de tutoriales, asi que en dias sucesivos los voya ir subiendo
CLICK EN EL ENLACE PARA IR AL INDICE
https://www.caballerosdecalradia.net/t371-lista-de-tutoriales-en-el-foro
PARTE 3: MODULE TROOPS
En este capítulo, dedicaremos nuestros esfuerzos a comprender el funcionamiento de module_troops.py. Este archivo contiene toda la información sobre las tropas, los héroes, cofres y NPCs de las ciudades, detallando sus habilidades y equipo, además del código de su rostro. Siempre que queramos crear un nuevo personaje o tipo de tropa, será este archivo el que debamos modificar.
3.1.- Estructura del Module_Troops
Este archivo comienza con un pequeño bloque de códigos que calculan las habilidades de combate y algunos otros códigos no modificables. Ya que estas líneas quedan fuera de la lista Python y no pueden ser modificadas, no nos fijaremos mucho en ellas. Pasaremos entonces a la cabecera de la lista: troops = [.
Aquí encontramos los tuples referentes al jugador y a otras tropas importantes del juego. Justo en el comienzo vemos los diferentes tipos de luchadores que encontramos en los torneos y combates en la arena. Comenzaremos fijándonos en estos, pues son un excelente ejemplo de cómo progresa un soldado común.
Este es el luchador básico llamado “Novice Fighter”. Es de nivel bajo, no muy buen luchador, y con unas habilidades bastante deficientes. La estructura del tuple es la siguiente:
1) ID del soldado. Se utiliza para referenciarlo desde otros archivos (añadiendo el prefijo trp_).
2) Nombre del soldado.
3) Nombre en plural del soldado.
4) Flags del soldado. Utilizaremos tf_guarantee_* siempre que queramos equipar a dicho soldado con determinada categoría del inventario. Si no lo ponemos, el soldado aparecerá sin armadura de ese tipo. Únicamente las armas de melee se equiparan automáticamente, siempre y cuando se encuentren en el inventario del soldado.
5) Escena. Esto sólo es aplicable a los héroes. Determina en que escena y en que EntryPoint (punto de entrada) aparecerá. Por ejemplo: scn_reyvadin_castle|entry(1) significa que el héroe aparecerá en el punto de entrada 1 del castillo de Reyvadin.
6) Reservado. Sin uso actual, por lo que deberá figurar como reserved o 0.
7) Facción. La facción del soldado (usamos el prefijo fac_).
8 ) Inventario. La lista de equipo que tiene el soldado en el inventario. Las tropas comunes eligen el equipo aleatoriamente dentro de esa lista. El equipo aparecerá dentro de corchetes de la siguiente manera: [itm_cleaver,itm_knife,itm_pitch_fork,itm_sickle,itm_club,itm_stones,itm_leather_cap,itm_felt_hat]
9) Atributos. Los puntos de los atributos y el nivel del soldado. Funcionan de la misma forma que para el jugador.
10) Competencias de Armas. Los puntos asignados a las habilidades marciales del soldado. Con la función wp(x) que se encuentra al inicio del archivo se crearan puntuaciones aleatorias en torno al valor establecido x. Aun asi, si queremos crear un arquero experto, podemos precisar la puntuación de tiro con arco, manteniendo las demás a niveles más bajos: wp_archery(160) | wp(60). Esto significa que tendrá una habilidad de armas de 60, pero que respecto al tiro con arco, su habilidad será de 160.
11) Habilidades. Son las mismas que las del jugador. Nos tenemos que fijar que además de los puntos de habilidades y atributos que hemos fijado nosotros, el soldado, por cada nivel suyo, tendrá 1 punto más en los atributos y 1 más en las habilidades, repartidos aleatoriamente.
12) Código del Rostro. El juego generará un rostro de acuerdo al código que este escrito aquí. Podemos exportar el código de nuevas caras desde el Editor del juego, presionando Ctrl E en el editor de rostros. Pulsando después el código que aparecerá en la zona superior de la pantalla, se copiará el código, y podremos almacenarlo en cualquier editor de textos (Wordpad, Microsoft Word…) pulsando simplemente Ctrl V.
13) Código secundario del rostro. Solo se aplica para soldados comunes, se puede omitir en el caso de los héroes. El juego creará rostros aleatorios entre el primer código y este para cada soldado del tipo al que se refiera el tuple.
Analizamos ahora el tuple del “Novice Fighter”:
1) ID del soldado. “novice_fighter”.
2) Nombre del soldado. “Novice Fighter”.
3) Nombre en plural del soldado. “Novice Fighters”.
4) Flags del soldado. tf_guarantee_boots|tf_guarantee_armour
5) Escena. no_scene.
6) Reservado. reserved.
7) Facción. fac_commoners.
8 ) Inventario. [itm_hide_boots].
9) Atributos. str_6|agi_6|level_(5).
10) Competencias de Armas. wp(60).
11) Habilidades. knows_common.
12) Código del Rostro. mercenary_face_1.
13) Código secundario del rostro. mercenary_face_2.
Prestemos atención a tres detalles importantes:
El soldado tiene el flag tf_guarantee_armor, pero sin embargo no posee ninguna armadura en su inventario. En este caso, funcionará de forma que el soldado utilizará cualquier armadura que se le otorgue durante el juego.
Al comenzar (pongamos que con nivel 1), este “novice fighter” tiene fuerza y agilidad 6. Sin embargo, se aumenta su nivel a 5, con la consiguiente ganancia en puntos en sus habilidades.
Tiene la habilidad knows_common. Esta engloba varias habilidades, tal y como viene recogido en la cabecera del archivo module_troops. Fijémonos en dicha lista:
Un soldado que tenga knows_common poseerá todas las habilidades recogidas anteriormente: Monta a caballo a nivel 1, comercio a nivel 2, gestión del inventario a nivel 2, gestión de prisioneros a nivel 1 y liderazgo a nivel 1. knows_common es lo que se conoce como constante, un conjunto de elementos -ya sean números, identificadores, otras constantes…- representados por una única entrada. Una constante puede representar cualquier cantidad de objetos, pudiendo ser tan larga como deseásemos. En este caso, knows_common esta definida como la constante que engloba todas las habilidades que se encuentran a la derecha del signo =. Por eso, siempre que escribamos una de estas entradas en el lugar de las habilidades, el MS entenderá que has escrito todas y cada una de las habilidades que esta recoge.
Ahora fijémonos en la siguiente entrada de la lista:
En este ejemplo, podemos ver el tuple del “regular fighter”, un soldado más fuerte que el anterior. Posee más nivel en sus habilidades, y posee varios conocimientos más, además de los recogidos en knows_common. En el juego, si en tu ejercito algún “novice fighter” ha ganado suficiente experiencia como para alcanzar el nivel 11, debería ser capaz de mejorar a “regular fighter”. A continuación veremos como se realiza esto.
3.2.- Mejorando tropas
La lista de las tropas que pueden mejorar a otros niveles se encuentra al final del archivo module_troops. Esta lista incluye qué tropas pueden mejorar y a qué tipo de soldado pueden hacerlo, siempre y cuando cumplan las condiciones de experiencia adquirida.
Como podemos ver, cada opción de mejora debe estar definida aquí, por medio de la operación upgrade(troops). La primera cadena que debe estar escrita es el ID del soldado a mejorar, la segunda será el ID del soldado al que evolucionará. Veamos este ejemplo:
Este código permitirá evolucionar al “farmer” a “watchman”, cuando este haya alcanzado el nivel mínimo requerido.
Existen dos tipos de operaciones de upgrade:
upgrade(troops,"tropa_inicial", "tropa_objetivo_1")
nos permite una sola línea de mejora, de tropa_inicial a tropa_objetivo_1, y
upgrade2(troops,"tropa_inicial", "tropa_objetivo_1", "tropa_objetivo_2")
que nos deja elegir entre dos líneas de mejora: tropa_objetivo_1 o tropa_objetivo_2.
Dos es el máximo de líneas de mejoras posibles a elegir.
Como podemos observar, no existe ninguna entrada para “novice_fighter” en estas listas, por eso vamos a crear una. Copiamos upgrade(troops,"farmer", "watchman")y la pegamos al final del bloque (recordamos, siempre antes del último ] . Es importante que nos demos cuenta de las particularidades de los códigos que estamos modificando, como por ejemplo que en este caso las líneas no llevan comas (,) al final).
En la línea que hemos copiado cambiamos “farmer” por “novice_fighter” y “watchman” por “regular_fighter”. De esta forma, cualquier “novice fighter” de un ejército podrá mejorar a “regular fighter”.
Ahora iremos un poco más lejos. Creamos otra línea de mejora, pero con el soldado inicial “new_troop” y como soldado objetivo “regular_fighter”. Aunque el tipo de tropa “new troop” no exista aún, lo crearemos ahora mismo.
Ascendemos de nuevo por el archivo hasta la línea:
# Add Extra Quest NPCs below this point.
Los nuevos tipos de soldados deben ser añadidos siempre antes de la entrada “local_merchant” para que no surjan problemas.
3.3.- Creando nuevas tropas
Hacemos un poco de espacio justo debajo de
# Add Extra Quest NPCs below this point
y posteriormente copiamos y pegamos ahí el código del “novice_fighter”. Seguidamente, hacemos los siguientes cambios:
De ahora en adelante, todas las tropas del tipo “new_troop” estarán equipadas con itm_leather_jerkin, y de forma aleatoria llevaran en su inventario itm_sword_medieval_a o itm_fighting_axe. Sin embargo, solamente algunos de ellos utilizaran el itm_skullcap, debido a las flags asignadas, este soldado solo tiene asignadas como fijas la armadura y las botas. Como queremos que nuestro soldado se proteja la cabeza de las inclemencias del tiempo y de la guerra, añadiremos la siguiente flag en el lugar adecuado: tf_guarantee_helmet. De esta forma, el código para nuestro recién creado soldado quedara de la siguiente manera:
Nuestro siguiente paso sera editar las habilidades de nuestro soldado. Le asignaremos una fuerza de 9 (str_9) y una agilidad de igual valor (agi_9), modificaremos su nivel inicial a 4 (level(4)) y aumentaremos su competencia de armas a 80 (wp(90)). Una vez hecho esto, el código quedará asi:
Nuestro soldado ya está listo para entrar en combate. Una vez que hemos realizado todos estos cambios, guardamos y ejecutamos build_module.bat. Así nos aseguraremos de que no hemos tenido ningún error. Si no es así, comprobaremos de nuevo que hemos escrito todo correctamente, sin olvidarnos de las comas al final de la línea ni de paréntesis y corchetes.
3.4.- Añadiendo nuevas tropas a nuestro ejercito
Si el paso anterior esta correctamente realizado, pasaremos entonces a reclutar para nuestro ejército a estos nuevos soldados, ávidos de aventuras y peleas.
Abrimos el archivo module_parties.py, y una vez dentro buscamos “main_party”. Este código corresponde al ejercito del jugador.
Como podemos ver, el único efectivo de nuestro ejército somos nosotros mismos. Esto se debe a que inicialmente el jugador comienza la partida sin compañeros ni soldados bajo su mando. Lo que vamos a hacer ahora es darle 5 soldados a nuestro héroe para que le acompañen por las salvajes tierras de Calradia. De esta forma quedará así:
Como podemos ver en el código, hemos añadido
(trp_new_troop,5,0)
Guardamos los cambios y ejecutamos build_module.bat. Si hemos realizado bien los pasos anteriores, cuando iniciemos un juego nuevo tendremos 5 soldados “new troop” en el ejercito de nuestro personaje (Siempre que hagamos cambios en el MS deberemos iniciar una nueva partida para poder ver las modificaciones).
Con nuestros recién estrenados soldados como compañeros, entablaremos algún combate contra algunos looters para que ganen experiencia. Entonces, veremos cómo serán capaces de mejorar a “regular fighters”.
¡Enhorabuena! Ahora ya sabemos cómo crear y modificar soldados comunes del juego. En el próximo capítulo aprenderemos a modificar y crear Héroes, Mercaderes y los demás NPCs que pueblan el continente de Calradia.
3.5.- NPCs
Para poder ver los NPCs del juego, debemos volver al archivo module_troops.py. Allí encontramos a estos importantes personajes del Mount&Blade. Si nos fijamos bien, nos daremos cuenta que todos estos mercaderes y NPCs son muy parecidos a las tropas comunes. Sin embargo, hay un elemento significativo que los diferencia claramente del resto: el flag tf_hero. Este flag es el que hace a Marnid, Borcha y los demás tener características especiales. Todos los NPCs del juego, incluso los mercaderes, son Héroes.
Las principales diferencias entre los Héroes y las tropas comunes son las siguientes:
1) Los Héroes son inmortales. Su salud está representada por un porcentaje y solo se puede tener uno de cada, salvo por error o diseño (Aun así, clonar Héroes es una mala idea).
2) Los Héroes ocupan una casilla completa en la lista de ejército.
3) Los Héroes aparecen en las escenas que se les asigne.
4) Los Héroes permanecen con el jugador incluso cuando este es derrotado –no pueden ser capturados por el enemigo-. Sin embargo, los Héroes enemigos sí pueden ser capturados por el jugador.
Como los Heroes son personajes únicos, no tienen nombre en plural. Por eso el segundo y el tercer campo en los tuples de los Héroes son idénticos. Veamos un ejemplo:
Aquí tenemos a Marnid, uno de nuestros infatigables compañeros de aventuras. Como podemos ver, está marcado con el flag tf_hero. Además, posee también el flag tf_unmoveable_in_party_window. Esto significa que a no ser que un Héroe sea enemigo, no podremos entregarlo en ninguna fortaleza o traspasarlo de un ejército a otro.
En las versiones iniciales del juego, podíamos encontrar a Marnid en el entryPoint 4 de la Taberna del Jabalí Feliz (Happy Boar inn), pero con el nuevo código aparecerá de forma aleatoria en cualquier taberna de Calradia (explicaremos el código más tarde). Es un poco pusilánime en combate, pero su habilidad de comercio nos será muy útil en los primeros compases de nuestras aventuras. Como es un Héroe, nunca morirá, aunque sí que puede eliminarse o abandonar el ejército debido a ciertos scripts del juego.
Como podemos observar, Marnid tiene su propio código para el rostro. Es posible diseñar cientos de rostros utilizando el editor in-Game y después exportar dichos rostros a nuestros mods, pero esto lo expondremos más detalladamente en el Capítulo 7 de los tutoriales.
Debemos fijarnos bien en el identificador de Marnid –“npc2”-. Siempre que queramos referenciarlo, deberemos escribirlo en minúsculas, sin espacios y anteponiendo el prefijo trp_ de la siguiente forma: “trp_npc2”.
Ahora que ya conocemos los aspectos principales de los NPCs, podemos crear nuestro propio Héroe. Copiamos el tuple de Marnid y lo pegamos al comienzo de la sección que comienza con la frase: “#Add Extra Quest NPCs Below this point”. Podemos ponerlo justo antes del soldado “new_troop” que creamos anteriormente. Es buena idea tener juntas las modificaciones y añadidos que hagamos (siempre que sea posible).
A pesar de que aparezcan nuevas versiones del Mount&Blade, que podrían permitir a Marnid tener nuevas habilidades, el tuple seguiría siendo igual al actual. Cambiamos el identificador y el nombre de nuestro Héroe:
Hemos cambiado el identificador a npc17 (justo después que npc16, el ultimo Héroe del Native) y su nombre a Eufresino. Continuar con la lista de identificadores de NPCs nos servirá para poder encontrar más fácilmente a nuestro Héroe. Si quisiéramos que Eufresino pudiese unirse a nuestro ejército, sería buena idea colocarlo después del npc16. Sin embargo, nuestro objetivo es bien distinto. Utilizaremos a Eufresino como “actor” para la quest que crearemos más tarde. Para que Eufresino no parezca un clon idéntico de Marnid cambiamos su itm_linen_tunic por itm_courtly_outfit (Ahora haz el cambio tu mismo).
Llegados a este punto, si compilamos con build_module.bat, el MS no debería darnos ningún problema. Aun así, tendremos un gran problema, y es que Eufresino, como los demás NPCs, aparecerá de forma aleatoria en cualquier taberna del juego (debido a la flag 0).
Para solucionarlo, le asignaremos el entryPoint 1 de Praven (town_6), y quedará de la siguiente manera:
Podemos asignarle cualquier equipo, de la misma forma que se los asignamos a los soldados “new_troop”. Cerramos module_troops.py, ejecutamos build_module.bat e iniciamos una nueva partida.
Ponemos rumbo a Praven y entramos en la taberna, donde encontraremos a Eufresino. Al intentar conversar con él, nos aparecerá un dialogo que nada tiene que ver (soldados ofreciendo sus servicios como mercenarios), debido a que aun no le hemos asignado ningún dialogo propio. De todas formas, esto nos sirve como ejemplo para que veamos como funcionan las interrelaciones entre archivos. Debido a su posición en module_troops.py, el juego lo toma como un soldado más, aspecto que se encuentra definido en module_constants.py (Trataremos este tema más tarde).
Dejamos a Eufresino tranquilo por el momento, pues ya tendremos tiempo de hablar con él cuando aprendamos a modificar las scenes del juego y los archivos module_quest y module_dialogs.
Antes de terminar con esta sección, añadiremos un nuevo “actor” para nuestra próxima quest. Buscamos el identificador “constable_hareck”. Su tuple tiene el siguiente aspecto:
Lo copiaremos justo debajo de Eufresino. Esto nos permitirá hacer cambios de manera más sencilla cuando lo necesitemos. Como este personaje hace tiempo (varias versiones) que no se utiliza en el juego, podemos modificarlo a nuestro gusto. Más tarde le asignaremos un nuevo rostro (el actual pertenece al código anterior) y lo pondremos en una scene. Nuestro objetivo es trasladar a ambos (Eufresino y Hareck) a la ciudad que creamos en el capítulo anterior, para que formen parte de la futura quest.
Por el momento, nos limitaremos a hacer a Hareck único cambiando su ID a “hareck” y su localización a 0.
3.6.- Mercaderes
Los mercaderes son un tipo especial de Héroe. Además del flag tf_hero, poseen el flag tf_is_merchant, que hace que no se equipen con ninguno de los elementos que se encuentran en su inventario, excepto aquellos que se les asignen inicialmente en su tuple. En otras palabras, los mercaderes pueden recibir cualquier tipo de equipo o ítem del juego, pero en ningún momento lo utilizaran sino que se mostrarán de la forma conocida en la ventana de comercio.
Veamos un ejemplo de mercader:
Este era el mercader de armas en Zendar. Como podemos apreciar es exactamente idéntico a los demás mercaderes, exceptuando su ID, el nombre, la scene donde aparece y el rostro.
Añadir un mercader al juego puede resultar complicado. Todos ellos están organizados en grupos por una razón: Existen algunos scripts en el M&B que actualizan el inventario de los mercaderes cada día para cada tipo distinto de mercader.
Para hacer esto, estos scripts utilizan “rangos”, que son el conjunto de tuples que se encuentran entre un punto inicial a nuestra elección (el límite inferior) y un punto final también a nuestra elección (límite superior). Por ejemplo, el rango para los mercaderes de armas va desde “zendar_armorer” (límite superior) hasta “zendar_weaponsmith” (límite inferior), que no está incluido en el rango.
Como el límite inferior no está incluido, siempre deberemos escribir el tuple inmediatamente posterior al último tuple de nuestro rango deseado.
Todos los mercaderes deberán añadirse antes del tuple “merchants_end”.
3.7.- Cofres
Los cofres son un tipo especial de tropa que funcionan como inventarios dentro del juego y con los que el jugador puede interactuar. Estos elementos son una amalgama compleja de códigos (algunos de ellos inmodificables), que definen a los cofres como tropas, elementos de las scenes (scene props) e información.
Para crear un cofre nuevo es necesario llevar a cabo complejos cambios en el MS, por lo que aquí solo veremos la información relativa al module_troops.py. Veamos un ejemplo de cofre:
Todos los cofres tendrán un tuple como este. Las únicas cosas que se deben modificar en estos cofres son el nombre, el ID, el nivel y las habilidades. Además podemos asignarles elementos de inicio, pudiendo encontrar dichos objetos en el cofre cuando comencemos el juego.
Los cofres requieren varias modificaciones para funcionar (además de su tuple en el module_troops) en distintos archivos del MS, pero eso lo veremos más tarde.
Una vez que hayamos terminado este capítulo, sabremos todos los aspectos importantes sobre module_troops. Ademas, podemos encontrar una lista de flags para nuestras tropas en header_troops.py. Prueba, modifica y haz experimentos para coger experiencia y cuando estés listo, pasa al siguiente capítulo.
Es increible como esta quedando esta seccion, ha crecido mucho y de a poco se va completando.
Es mas, despues de haebr leido un poco me entran unas ganitas de meter mano...
Este es el capitulo 3, continuacion de los dos anteriores publicados por Mike.
AUTOR: Lope de Rojas
Tutorial aparecido en el viejo foro de M&B
He logrado recuperar esta serie de tutoriales, asi que en dias sucesivos los voya ir subiendo
CLICK EN EL ENLACE PARA IR AL INDICE
https://www.caballerosdecalradia.net/t371-lista-de-tutoriales-en-el-foro
PARTE 3: MODULE TROOPS
En este capítulo, dedicaremos nuestros esfuerzos a comprender el funcionamiento de module_troops.py. Este archivo contiene toda la información sobre las tropas, los héroes, cofres y NPCs de las ciudades, detallando sus habilidades y equipo, además del código de su rostro. Siempre que queramos crear un nuevo personaje o tipo de tropa, será este archivo el que debamos modificar.
3.1.- Estructura del Module_Troops
Este archivo comienza con un pequeño bloque de códigos que calculan las habilidades de combate y algunos otros códigos no modificables. Ya que estas líneas quedan fuera de la lista Python y no pueden ser modificadas, no nos fijaremos mucho en ellas. Pasaremos entonces a la cabecera de la lista: troops = [.
Aquí encontramos los tuples referentes al jugador y a otras tropas importantes del juego. Justo en el comienzo vemos los diferentes tipos de luchadores que encontramos en los torneos y combates en la arena. Comenzaremos fijándonos en estos, pues son un excelente ejemplo de cómo progresa un soldado común.
- Código:
["novice_fighter","Novice Fighter","Novice Fighters",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
[itm_hide_boots],
str_6|agi_6|level(5),wp(60),knows_common,mercenary_face_1, mercenary_face_2],
Este es el luchador básico llamado “Novice Fighter”. Es de nivel bajo, no muy buen luchador, y con unas habilidades bastante deficientes. La estructura del tuple es la siguiente:
1) ID del soldado. Se utiliza para referenciarlo desde otros archivos (añadiendo el prefijo trp_).
2) Nombre del soldado.
3) Nombre en plural del soldado.
4) Flags del soldado. Utilizaremos tf_guarantee_* siempre que queramos equipar a dicho soldado con determinada categoría del inventario. Si no lo ponemos, el soldado aparecerá sin armadura de ese tipo. Únicamente las armas de melee se equiparan automáticamente, siempre y cuando se encuentren en el inventario del soldado.
5) Escena. Esto sólo es aplicable a los héroes. Determina en que escena y en que EntryPoint (punto de entrada) aparecerá. Por ejemplo: scn_reyvadin_castle|entry(1) significa que el héroe aparecerá en el punto de entrada 1 del castillo de Reyvadin.
6) Reservado. Sin uso actual, por lo que deberá figurar como reserved o 0.
7) Facción. La facción del soldado (usamos el prefijo fac_).
8 ) Inventario. La lista de equipo que tiene el soldado en el inventario. Las tropas comunes eligen el equipo aleatoriamente dentro de esa lista. El equipo aparecerá dentro de corchetes de la siguiente manera: [itm_cleaver,itm_knife,itm_pitch_fork,itm_sickle,itm_club,itm_stones,itm_leather_cap,itm_felt_hat]
9) Atributos. Los puntos de los atributos y el nivel del soldado. Funcionan de la misma forma que para el jugador.
10) Competencias de Armas. Los puntos asignados a las habilidades marciales del soldado. Con la función wp(x) que se encuentra al inicio del archivo se crearan puntuaciones aleatorias en torno al valor establecido x. Aun asi, si queremos crear un arquero experto, podemos precisar la puntuación de tiro con arco, manteniendo las demás a niveles más bajos: wp_archery(160) | wp(60). Esto significa que tendrá una habilidad de armas de 60, pero que respecto al tiro con arco, su habilidad será de 160.
11) Habilidades. Son las mismas que las del jugador. Nos tenemos que fijar que además de los puntos de habilidades y atributos que hemos fijado nosotros, el soldado, por cada nivel suyo, tendrá 1 punto más en los atributos y 1 más en las habilidades, repartidos aleatoriamente.
12) Código del Rostro. El juego generará un rostro de acuerdo al código que este escrito aquí. Podemos exportar el código de nuevas caras desde el Editor del juego, presionando Ctrl E en el editor de rostros. Pulsando después el código que aparecerá en la zona superior de la pantalla, se copiará el código, y podremos almacenarlo en cualquier editor de textos (Wordpad, Microsoft Word…) pulsando simplemente Ctrl V.
13) Código secundario del rostro. Solo se aplica para soldados comunes, se puede omitir en el caso de los héroes. El juego creará rostros aleatorios entre el primer código y este para cada soldado del tipo al que se refiera el tuple.
Analizamos ahora el tuple del “Novice Fighter”:
- Código:
["novice_fighter","Novice Fighter","Novice Fighters",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
[itm_hide_boots],
str_6|agi_6|level(5),wp(60),knows_common,mercenary_face_1, mercenary_face_2],
1) ID del soldado. “novice_fighter”.
2) Nombre del soldado. “Novice Fighter”.
3) Nombre en plural del soldado. “Novice Fighters”.
4) Flags del soldado. tf_guarantee_boots|tf_guarantee_armour
5) Escena. no_scene.
6) Reservado. reserved.
7) Facción. fac_commoners.
8 ) Inventario. [itm_hide_boots].
9) Atributos. str_6|agi_6|level_(5).
10) Competencias de Armas. wp(60).
11) Habilidades. knows_common.
12) Código del Rostro. mercenary_face_1.
13) Código secundario del rostro. mercenary_face_2.
Prestemos atención a tres detalles importantes:
El soldado tiene el flag tf_guarantee_armor, pero sin embargo no posee ninguna armadura en su inventario. En este caso, funcionará de forma que el soldado utilizará cualquier armadura que se le otorgue durante el juego.
Al comenzar (pongamos que con nivel 1), este “novice fighter” tiene fuerza y agilidad 6. Sin embargo, se aumenta su nivel a 5, con la consiguiente ganancia en puntos en sus habilidades.
Tiene la habilidad knows_common. Esta engloba varias habilidades, tal y como viene recogido en la cabecera del archivo module_troops. Fijémonos en dicha lista:
- Código:
knows_common = knows_riding_1|knows_trade_2|knows_inventory_management_2|knows_prisoner_management_1|knows_leadership_1
Un soldado que tenga knows_common poseerá todas las habilidades recogidas anteriormente: Monta a caballo a nivel 1, comercio a nivel 2, gestión del inventario a nivel 2, gestión de prisioneros a nivel 1 y liderazgo a nivel 1. knows_common es lo que se conoce como constante, un conjunto de elementos -ya sean números, identificadores, otras constantes…- representados por una única entrada. Una constante puede representar cualquier cantidad de objetos, pudiendo ser tan larga como deseásemos. En este caso, knows_common esta definida como la constante que engloba todas las habilidades que se encuentran a la derecha del signo =. Por eso, siempre que escribamos una de estas entradas en el lugar de las habilidades, el MS entenderá que has escrito todas y cada una de las habilidades que esta recoge.
Ahora fijémonos en la siguiente entrada de la lista:
- Código:
["regular_fighter","Regular Fighter","Regular Fighters",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
[itm_hide_boots],
str_8|agi_8|level(11),wp(90),knows_common|knows_ironflesh_1|knows_power_strike_1|knows_athletics_1|knows_riding_1|knows_shield_2,mercenary
_face_1, mercenary_face_2],
En este ejemplo, podemos ver el tuple del “regular fighter”, un soldado más fuerte que el anterior. Posee más nivel en sus habilidades, y posee varios conocimientos más, además de los recogidos en knows_common. En el juego, si en tu ejercito algún “novice fighter” ha ganado suficiente experiencia como para alcanzar el nivel 11, debería ser capaz de mejorar a “regular fighter”. A continuación veremos como se realiza esto.
3.2.- Mejorando tropas
La lista de las tropas que pueden mejorar a otros niveles se encuentra al final del archivo module_troops. Esta lista incluye qué tropas pueden mejorar y a qué tipo de soldado pueden hacerlo, siempre y cuando cumplan las condiciones de experiencia adquirida.
Como podemos ver, cada opción de mejora debe estar definida aquí, por medio de la operación upgrade(troops). La primera cadena que debe estar escrita es el ID del soldado a mejorar, la segunda será el ID del soldado al que evolucionará. Veamos este ejemplo:
- Código:
upgrade(troops,"farmer", "watchman")
Este código permitirá evolucionar al “farmer” a “watchman”, cuando este haya alcanzado el nivel mínimo requerido.
Existen dos tipos de operaciones de upgrade:
upgrade(troops,"tropa_inicial", "tropa_objetivo_1")
nos permite una sola línea de mejora, de tropa_inicial a tropa_objetivo_1, y
upgrade2(troops,"tropa_inicial", "tropa_objetivo_1", "tropa_objetivo_2")
que nos deja elegir entre dos líneas de mejora: tropa_objetivo_1 o tropa_objetivo_2.
Dos es el máximo de líneas de mejoras posibles a elegir.
Como podemos observar, no existe ninguna entrada para “novice_fighter” en estas listas, por eso vamos a crear una. Copiamos upgrade(troops,"farmer", "watchman")y la pegamos al final del bloque (recordamos, siempre antes del último ] . Es importante que nos demos cuenta de las particularidades de los códigos que estamos modificando, como por ejemplo que en este caso las líneas no llevan comas (,) al final).
En la línea que hemos copiado cambiamos “farmer” por “novice_fighter” y “watchman” por “regular_fighter”. De esta forma, cualquier “novice fighter” de un ejército podrá mejorar a “regular fighter”.
Ahora iremos un poco más lejos. Creamos otra línea de mejora, pero con el soldado inicial “new_troop” y como soldado objetivo “regular_fighter”. Aunque el tipo de tropa “new troop” no exista aún, lo crearemos ahora mismo.
Ascendemos de nuevo por el archivo hasta la línea:
# Add Extra Quest NPCs below this point.
Los nuevos tipos de soldados deben ser añadidos siempre antes de la entrada “local_merchant” para que no surjan problemas.
3.3.- Creando nuevas tropas
Hacemos un poco de espacio justo debajo de
# Add Extra Quest NPCs below this point
y posteriormente copiamos y pegamos ahí el código del “novice_fighter”. Seguidamente, hacemos los siguientes cambios:
- Código:
##Nuevo soldado
["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor,no_scene,reserved,fac_commoners,
[itm_sword_medieval_a,itm_fighting_axe,itm_leather_jerkin,itm_skullcap,itm_hide_boots],
str_6|agi_6|level(5),wp(60),knows_common,mercenary_face_1, mercenary_face_2],
De ahora en adelante, todas las tropas del tipo “new_troop” estarán equipadas con itm_leather_jerkin, y de forma aleatoria llevaran en su inventario itm_sword_medieval_a o itm_fighting_axe. Sin embargo, solamente algunos de ellos utilizaran el itm_skullcap, debido a las flags asignadas, este soldado solo tiene asignadas como fijas la armadura y las botas. Como queremos que nuestro soldado se proteja la cabeza de las inclemencias del tiempo y de la guerra, añadiremos la siguiente flag en el lugar adecuado: tf_guarantee_helmet. De esta forma, el código para nuestro recién creado soldado quedara de la siguiente manera:
- Código:
##Nuevo soldado
["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor|tf_guarantee_helmet,no_scene,reserved,fac_commoners,
[itm_sword_medieval_a,itm_fighting_axe,itm_leather_jerkin,itm_skullcap,itm_hide_boots],
str_6|agi_6|level(5),wp(60),knows_common,mercenary_face_1, mercenary_face_2],
Nuestro siguiente paso sera editar las habilidades de nuestro soldado. Le asignaremos una fuerza de 9 (str_9) y una agilidad de igual valor (agi_9), modificaremos su nivel inicial a 4 (level(4)) y aumentaremos su competencia de armas a 80 (wp(90)). Una vez hecho esto, el código quedará asi:
- Código:
##Nuevo soldado
["new_troop","new_troop","new_troops",tf_guarantee_boots|tf_guarantee_armor|tf_guarantee_helmet,no_scene,reserved,fac_commoners,
[itm_sword_medieval_a,itm_fighting_axe,itm_leather_jerkin,itm_skullcap,itm_hide_boots],
str_9|agi_9|level(4),wp(90),knows_common,mercenary_face_1, mercenary_face_2],
Nuestro soldado ya está listo para entrar en combate. Una vez que hemos realizado todos estos cambios, guardamos y ejecutamos build_module.bat. Así nos aseguraremos de que no hemos tenido ningún error. Si no es así, comprobaremos de nuevo que hemos escrito todo correctamente, sin olvidarnos de las comas al final de la línea ni de paréntesis y corchetes.
3.4.- Añadiendo nuevas tropas a nuestro ejercito
Si el paso anterior esta correctamente realizado, pasaremos entonces a reclutar para nuestro ejército a estos nuevos soldados, ávidos de aventuras y peleas.
Abrimos el archivo module_parties.py, y una vez dentro buscamos “main_party”. Este código corresponde al ejercito del jugador.
- Código:
("main_party","Main Party",icon_player|pf_limit_members, no_menu, pt_none,fac_player_faction,0,ai_bhvr_hold,0,(17,
52.5),[(trp_player,1,0)]),
Como podemos ver, el único efectivo de nuestro ejército somos nosotros mismos. Esto se debe a que inicialmente el jugador comienza la partida sin compañeros ni soldados bajo su mando. Lo que vamos a hacer ahora es darle 5 soldados a nuestro héroe para que le acompañen por las salvajes tierras de Calradia. De esta forma quedará así:
- Código:
("main_party","Main Party",icon_player|pf_limit_members, no_menu, pt_none,fac_player_faction,0,ai_bhvr_hold,0,(17,
52.5),[(trp_player,1,0),(trp_new_troop,5,0)]),
Como podemos ver en el código, hemos añadido
(trp_new_troop,5,0)
Guardamos los cambios y ejecutamos build_module.bat. Si hemos realizado bien los pasos anteriores, cuando iniciemos un juego nuevo tendremos 5 soldados “new troop” en el ejercito de nuestro personaje (Siempre que hagamos cambios en el MS deberemos iniciar una nueva partida para poder ver las modificaciones).
Con nuestros recién estrenados soldados como compañeros, entablaremos algún combate contra algunos looters para que ganen experiencia. Entonces, veremos cómo serán capaces de mejorar a “regular fighters”.
¡Enhorabuena! Ahora ya sabemos cómo crear y modificar soldados comunes del juego. En el próximo capítulo aprenderemos a modificar y crear Héroes, Mercaderes y los demás NPCs que pueblan el continente de Calradia.
3.5.- NPCs
Para poder ver los NPCs del juego, debemos volver al archivo module_troops.py. Allí encontramos a estos importantes personajes del Mount&Blade. Si nos fijamos bien, nos daremos cuenta que todos estos mercaderes y NPCs son muy parecidos a las tropas comunes. Sin embargo, hay un elemento significativo que los diferencia claramente del resto: el flag tf_hero. Este flag es el que hace a Marnid, Borcha y los demás tener características especiales. Todos los NPCs del juego, incluso los mercaderes, son Héroes.
Las principales diferencias entre los Héroes y las tropas comunes son las siguientes:
1) Los Héroes son inmortales. Su salud está representada por un porcentaje y solo se puede tener uno de cada, salvo por error o diseño (Aun así, clonar Héroes es una mala idea).
2) Los Héroes ocupan una casilla completa en la lista de ejército.
3) Los Héroes aparecen en las escenas que se les asigne.
4) Los Héroes permanecen con el jugador incluso cuando este es derrotado –no pueden ser capturados por el enemigo-. Sin embargo, los Héroes enemigos sí pueden ser capturados por el jugador.
Como los Heroes son personajes únicos, no tienen nombre en plural. Por eso el segundo y el tercer campo en los tuples de los Héroes son idénticos. Veamos un ejemplo:
- Código:
["npc2","Marnid","Marnid", tf_hero|tf_unmoveable_in_party_window, 0,reserved, fac_commoners,[itm_linen_tunic,itm_hide_boots,itm_club],
str_7|agi_7|int_11|cha_6|level(1),wp(40),knows_merchant_npc|
knows_trade_2|knows_weapon_master_1|knows_ironflesh_1|knows_wound_treatment_1|knows_athletics_2|knows_first_aid_1|knows_leadership_1,
0x000000019d004001570b893712c8d28d00000000001dc8990000000000000000],
Aquí tenemos a Marnid, uno de nuestros infatigables compañeros de aventuras. Como podemos ver, está marcado con el flag tf_hero. Además, posee también el flag tf_unmoveable_in_party_window. Esto significa que a no ser que un Héroe sea enemigo, no podremos entregarlo en ninguna fortaleza o traspasarlo de un ejército a otro.
En las versiones iniciales del juego, podíamos encontrar a Marnid en el entryPoint 4 de la Taberna del Jabalí Feliz (Happy Boar inn), pero con el nuevo código aparecerá de forma aleatoria en cualquier taberna de Calradia (explicaremos el código más tarde). Es un poco pusilánime en combate, pero su habilidad de comercio nos será muy útil en los primeros compases de nuestras aventuras. Como es un Héroe, nunca morirá, aunque sí que puede eliminarse o abandonar el ejército debido a ciertos scripts del juego.
Como podemos observar, Marnid tiene su propio código para el rostro. Es posible diseñar cientos de rostros utilizando el editor in-Game y después exportar dichos rostros a nuestros mods, pero esto lo expondremos más detalladamente en el Capítulo 7 de los tutoriales.
Debemos fijarnos bien en el identificador de Marnid –“npc2”-. Siempre que queramos referenciarlo, deberemos escribirlo en minúsculas, sin espacios y anteponiendo el prefijo trp_ de la siguiente forma: “trp_npc2”.
Ahora que ya conocemos los aspectos principales de los NPCs, podemos crear nuestro propio Héroe. Copiamos el tuple de Marnid y lo pegamos al comienzo de la sección que comienza con la frase: “#Add Extra Quest NPCs Below this point”. Podemos ponerlo justo antes del soldado “new_troop” que creamos anteriormente. Es buena idea tener juntas las modificaciones y añadidos que hagamos (siempre que sea posible).
A pesar de que aparezcan nuevas versiones del Mount&Blade, que podrían permitir a Marnid tener nuevas habilidades, el tuple seguiría siendo igual al actual. Cambiamos el identificador y el nombre de nuestro Héroe:
- Código:
["npc17","Eufresino","Eufresino", tf_hero|tf_unmoveable_in_party_window, 0,reserved,
fac_commoners,[itm_linen_tunic,itm_hide_boots,itm_club],def_attrib|level(6),wp(60),knows_trade_3|knows_inventory_management_2|knows_riding
_2, 0x000000019d004001570b893712c8d28d00000000001dc8990000000000000000],
Hemos cambiado el identificador a npc17 (justo después que npc16, el ultimo Héroe del Native) y su nombre a Eufresino. Continuar con la lista de identificadores de NPCs nos servirá para poder encontrar más fácilmente a nuestro Héroe. Si quisiéramos que Eufresino pudiese unirse a nuestro ejército, sería buena idea colocarlo después del npc16. Sin embargo, nuestro objetivo es bien distinto. Utilizaremos a Eufresino como “actor” para la quest que crearemos más tarde. Para que Eufresino no parezca un clon idéntico de Marnid cambiamos su itm_linen_tunic por itm_courtly_outfit (Ahora haz el cambio tu mismo).
Llegados a este punto, si compilamos con build_module.bat, el MS no debería darnos ningún problema. Aun así, tendremos un gran problema, y es que Eufresino, como los demás NPCs, aparecerá de forma aleatoria en cualquier taberna del juego (debido a la flag 0).
Para solucionarlo, le asignaremos el entryPoint 1 de Praven (town_6), y quedará de la siguiente manera:
- Código:
["npc17","Eufresino","Eufresino", tf_hero, scn_town_6_tavern|entry(1),reserved,
fac_commoners,[itm_courtly_outfit,itm_hide_boots,itm_club],
def_attrib|level(6),wp(60),knows_trade_3|knows_inventory_management_2|knows_riding_2,
0x000000019d004001570b893712c8d28d00000000001dc8990000000000000000],
Podemos asignarle cualquier equipo, de la misma forma que se los asignamos a los soldados “new_troop”. Cerramos module_troops.py, ejecutamos build_module.bat e iniciamos una nueva partida.
Ponemos rumbo a Praven y entramos en la taberna, donde encontraremos a Eufresino. Al intentar conversar con él, nos aparecerá un dialogo que nada tiene que ver (soldados ofreciendo sus servicios como mercenarios), debido a que aun no le hemos asignado ningún dialogo propio. De todas formas, esto nos sirve como ejemplo para que veamos como funcionan las interrelaciones entre archivos. Debido a su posición en module_troops.py, el juego lo toma como un soldado más, aspecto que se encuentra definido en module_constants.py (Trataremos este tema más tarde).
Dejamos a Eufresino tranquilo por el momento, pues ya tendremos tiempo de hablar con él cuando aprendamos a modificar las scenes del juego y los archivos module_quest y module_dialogs.
Antes de terminar con esta sección, añadiremos un nuevo “actor” para nuestra próxima quest. Buscamos el identificador “constable_hareck”. Su tuple tiene el siguiente aspecto:
- Código:
["constable_hareck","Constable Hareck","Constable Hareck",tf_hero, scn_zendar_center|entry(5),reserved,
fac_commoners,[itm_leather_jacket,itm_hide_boots],def_attrib|level(5),wp(20),knows_common,0x00000000000c41c001fb15234eb6dd3f],
Lo copiaremos justo debajo de Eufresino. Esto nos permitirá hacer cambios de manera más sencilla cuando lo necesitemos. Como este personaje hace tiempo (varias versiones) que no se utiliza en el juego, podemos modificarlo a nuestro gusto. Más tarde le asignaremos un nuevo rostro (el actual pertenece al código anterior) y lo pondremos en una scene. Nuestro objetivo es trasladar a ambos (Eufresino y Hareck) a la ciudad que creamos en el capítulo anterior, para que formen parte de la futura quest.
Por el momento, nos limitaremos a hacer a Hareck único cambiando su ID a “hareck” y su localización a 0.
- Código:
["hareck","Constable Hareck","Constable Hareck",tf_hero, 0,reserved,
fac_commoners,[itm_leather_jacket,itm_hide_boots],def_attrib|level(5),wp(20),knows_common,0x00000000000c41c001fb15234eb6dd3f],
3.6.- Mercaderes
Los mercaderes son un tipo especial de Héroe. Además del flag tf_hero, poseen el flag tf_is_merchant, que hace que no se equipen con ninguno de los elementos que se encuentran en su inventario, excepto aquellos que se les asignen inicialmente en su tuple. En otras palabras, los mercaderes pueden recibir cualquier tipo de equipo o ítem del juego, pero en ningún momento lo utilizaran sino que se mostrarán de la forma conocida en la ventana de comercio.
Veamos un ejemplo de mercader:
- Código:
["zendar_weaponsmith","Dunga","Dunga",tf_hero|tf_is_merchant, scn_zendar_center|entry(3),0, fac_commoners,
[itm_linen_tunic,itm_nomad_boots],
def_attrib|level(2),wp(20),knows_inventory_management_10, 0x00000000000021c401f545a49b6eb2bc],
Este era el mercader de armas en Zendar. Como podemos apreciar es exactamente idéntico a los demás mercaderes, exceptuando su ID, el nombre, la scene donde aparece y el rostro.
Añadir un mercader al juego puede resultar complicado. Todos ellos están organizados en grupos por una razón: Existen algunos scripts en el M&B que actualizan el inventario de los mercaderes cada día para cada tipo distinto de mercader.
Para hacer esto, estos scripts utilizan “rangos”, que son el conjunto de tuples que se encuentran entre un punto inicial a nuestra elección (el límite inferior) y un punto final también a nuestra elección (límite superior). Por ejemplo, el rango para los mercaderes de armas va desde “zendar_armorer” (límite superior) hasta “zendar_weaponsmith” (límite inferior), que no está incluido en el rango.
Como el límite inferior no está incluido, siempre deberemos escribir el tuple inmediatamente posterior al último tuple de nuestro rango deseado.
Todos los mercaderes deberán añadirse antes del tuple “merchants_end”.
3.7.- Cofres
Los cofres son un tipo especial de tropa que funcionan como inventarios dentro del juego y con los que el jugador puede interactuar. Estos elementos son una amalgama compleja de códigos (algunos de ellos inmodificables), que definen a los cofres como tropas, elementos de las scenes (scene props) e información.
Para crear un cofre nuevo es necesario llevar a cabo complejos cambios en el MS, por lo que aquí solo veremos la información relativa al module_troops.py. Veamos un ejemplo de cofre:
- Código:
["zendar_chest","zendar_chest","zendar_chest",tf_hero|tf_inactive, 0,reserved, fac_vaegirs,[],def_attrib|level(18),wp(60),knows_common, 0],
Todos los cofres tendrán un tuple como este. Las únicas cosas que se deben modificar en estos cofres son el nombre, el ID, el nivel y las habilidades. Además podemos asignarles elementos de inicio, pudiendo encontrar dichos objetos en el cofre cuando comencemos el juego.
Los cofres requieren varias modificaciones para funcionar (además de su tuple en el module_troops) en distintos archivos del MS, pero eso lo veremos más tarde.
Una vez que hayamos terminado este capítulo, sabremos todos los aspectos importantes sobre module_troops. Ademas, podemos encontrar una lista de flags para nuestras tropas en header_troops.py. Prueba, modifica y haz experimentos para coger experiencia y cuando estés listo, pasa al siguiente capítulo.
FIN
Última edición por maxtor07 el Miér Nov 28, 2012 8:26 pm, editado 2 veces