Por todos es sabido que las localizaciones son una de las partes más importantes en la saga M&B, esos lugares míticos que se nos quedan grabados en la mente, plazas que hemos defendido bajo una lluvia de flechas Vaegires durante toda una noche, asaltos a las recias murallas swadianas o razzias en las calurosas villas del Sultanato Sarraní... Y entonces hacemos nuestro mod... y nos quedamos cortos de castillos y aldeas... ¿Y qué sería de nuestro gargantuesco plan de un mod mundial si no podemos introducir nuevos lugares en el mapa?
En este tutorial aprenderemos a añadir ciudades, castillos y aldeas a nuestro mod de forma relativamente sencilla.
1.- Empezando
Ante todo, planificación. No podemos pretender añadir lugares a lo loco sin una organización previa. Nunca viene mal tener un bloc de notas o algo donde escribir cerca para saber qué tenemos que hacer y qué es lo que ya hemos hecho. Dispondremos del Module System, del Python instalado (para compilar sin problemas) y un editor de textos adecuado (por mi parte uso el Notepad++, resulta realmente cómodo y es bastante intuitivo). Y no menos importante, nos armaremos de paciencia.
2.- Añadiendo la localización (module_parties.py)
Comenzamos con lo más básico: introducir los datos básicos de la ciudad/castillo/villa en nuestro primer archivo del MS. Abrimos module_parties.py y nos encontramos los archivos referentes a todas las localizaciones físicas permanentes del juego (party_templates.py contiene los datos de las patrullas, bandidos... no los confundamos). Si hemos consultado antes el segundo capítulo de mis inacabados tutoriales sabremos perfectamente que significan las partes de todas esas líneas. Por si acaso, condensaré la información necesaria en este hilo:
Si echamos un rápido vistazo al archivo, veremos que todas las líneas tienen la misma forma y organización. Proseguimos:
Si queremos añadir una localización Y, ya sea ciudad, castillo o aldea, deberemos proceder SIEMPRE de la misma forma: copiaremos una línea de código del mismo tipo que la localización que queramos añadir (ciudad - ciudad, castillo - castillo, aldea - aldea) y la pegaremos a continuación de la última localización de ese tipo y antes del siguiente bloque de localizaciones, nunca al final del archivo. Así, además de tener el código ordenado y que nos permita encontrar mejor las cosas, evitaremos esos detalles sin importancia que son los errores por haber colocado lo que no debemos donde no debemos.
Así pues, si copiamos una ciudad, colocaremos la línea nueva de la siguiente forma:
Después de eso podremos renombrar, cambiar los iconos y todo lo que queramos... podemos copiar de 5 en 5, de 10 en 10... siempre y cuando después sigamos correctamente los pasos y no nos olvidemos ninguna scene. Para encontrar mejor las referencias, yo suelo continuar la sucesión de números de las IDs, así pues, las nuevas localizaciones serán town_23, town_24... castle_49, castle_50... eso queda a gusto de cada uno. El caso es que después no tratemos de referenciarlas con otro nombre. Guardamos, compilamos y cruzamos los dedos. Si no hay ningún error, continuaremos.
3.- Copiando las Scenes (Carpeta SceneObj)
Vamos a otra de las partes importantes. Por un lado tenemos los códigos que hacen que todo funcione, pero sin el escenario en sí, da igual cuanto tiempo hayamos pasado con la programación. Abrimos la carpeta SceneObj de nuestro mod y contemplamos la larga lista de archivos. Un rápido vistazo nos dejará ver como se organizan:
Ciudades
Castillos
Aldeas
Cada una de las localizaciones lleva asignados un número determinado de escenarios. Copiaremos los que hagan falta para que nuestras recién creadas localizaciones tengan sus respectivas scenes. Cambiaremos el número de cada una al de la localización añadida, por ejemplo:
4.- Referenciar los cambios (module_scenes.py)
Cuando ya tenemos las scenes copiadas, es hora de referenciarlas desde el MS, así que vamos a module_scenes.py y empezamos a copiar y pegar como locos. Es un paso sencillo, pues sólo debemos tener en mente que cada tipo de localizacion de las ciudades tiene su grupo, y que añadiremos las nuevas al final de cada grupo y antes del siguiente (town_XX_alley con town_alley, town_XX_castle con town_castle...), quedando de la siguiente forma (sólo pongo un ejemplo, los demás son iguales):
En el caso de las aldeas y castillos lo tendremos más sencillo, pues sólo hemos de añadir una localización en el caso de las aldeas (como siempre al final de la lista de aldeas) o en bloque al final de la lista en el caso de los castillos:
Si nos fijamos, hay una parte del código en todos los escenarios al aire libre que tiene la siguiente forma: outer_terrain_xxxxxxxx. Esa parte hace referencia al tipo de *.brf que se colocará alrededor del mapa (si, esos bordes de dudoso acabado gráfico). Tenemos los siguientes tipos:
outer_terrain_plain planicies
outer_terrain_desert desiertos
outer_terrain_steppe estepas
outer_terrain_town_thir_1 para Thir (porque tiene puerto, es especial para esa ciudad)
outer_terrain_snow nieve
Así, deberemos ajustarlo para que no nos aparezca un perfecto desierto de ardiente arena alrededor de nuestra aldea nevada. Guardamos, compilamos y cuando no haya errores, continuamos.
5.- Añadiendo el factor NPC (module_troops.py)
Una vez hemos llegado a este punto, ya tenemos casi a punto nuestras localizaciones, sólo que sufren un preocupante vacío de poder. Nadie las gestiona, y si las dejamos a su suerte, sus muros se derrumbarán, sus vigas de madera se pudrirán y las ratas devorarán a los incautos que crucen sus puertas... Es el momento de añadir cuanta chusma burocrática haga falta para que las ciudades, castillos y aldeas funcionen de acuerdo a las leyes del senescal o anciano del lugar.
Para eso nos dirigimos al archivo module_troops.py y buscamos entre sus incontables líneas a los siguientes NPCs:
Ciudades
"town_1_seneschal"
"town_1_arena_master"
"town_1_armorer"
"town_1_weaponsmith"
"town_1_tavernkeeper"
"town_1_merchant"
"town_1_horse_merchant"
"town_1_mayor"
"town_1_master_craftsman"
Castillos
"castle_1_seneschal"
Aldeas
"village_1_elder"
En cada bloque iremos añadiendo tantos como ciudades/castillos/aldeas hayamos añadido, siempre siguiendo las pautas que he repetido a lo largo del tutorial (al final del bloque de los de su tipo y antes del siguiente). El "town_X_master_craftsman" se localiza de los últimos, pero sigue las mismas directrices que los demás. Cambiamos los números al número de referencia de nuestras nuevas localizaciones y listo. Podemos cambiarles la ropa, las caras... esas cosas tan divertidas que se eternizan hasta la extenuación y parecen nunca acabar (Hágalo bajo su cuenta y riesgo, la casa de Rojas no se responsabiliza de posibles daños cerebrales posteriores a la realización de los cambios).
Guardamos, compilamos y seguimos con los cambios si no hemos obtenido errores.
6.- Añadiendo el factor Facción (module_scripts.py)
Genial, ahora tenemos un lugar perfectamente gestionado por sus gentes, pero lejos de cualquier jurisdicción de los reinos... y nosotros, como buenos señores feudales que respetamos el derecho del pueblo a ser esclavizado y aplastado a impuestos, no debemos dejar que continúe así sin tomar cartas en el asunto. ¿Quién sabe que terribles ideas podrían ocurrírseles si se les deja solos?
Abrimos el archivo module_scripts.py y buscamos la siguiente línea:
Veremos una larga lista de estos códigos. Estos en particular asignan la localización a un reino concreto (en el ejemplo p_town_1 -p_ es el prefijo que hace referencia al archivo module_parties.py- pertenecería a la facción 4 -fac_ es el prefijo que hace referencia al archivo module_factions.py-).
Añadimos al final cuantas líneas sean necesarias (al final del bloque de ciudades y al final del bloque de castillos) y asignamos nuestras nuevas localizaciones a sus correspondientes facciones.
Casi inmediatamente después encontraremos las asignaciones de ciudades a los nobles:
Siguiendo la misma forma, añadiremos las líneas correspondientes y asignaremos las ciudades a los nobles y reyes (las referencias a los lords las podemos encontrar en el archivo module_troops.py)
Vemos que los castillos no se asignan de forma predeterminada, únicamente hay unos pocos que pertenecen a ciertos nobles, Si queremos que Lord Panocha posea el castillo de la Colina Panochil usaremos el siguiente código:
cambiando castle_35 por el correspondiente al castillo de la Colina Panochil y knight_1_3 a la ID de Lord Panocha.
Nota: esos añadidos deberán ir inmediatamente antes de la línea
que asigna las localizaciones sin dueño a los nobles de sus respectivos reinos.
7.- Comerciando, que es gerundio (continuamos en module_scripts.py)
Ahora ya tenemos un noble feliz al mando, unos senescales felizmente asignados a sus tareas, unos aldeanos felizmente abusados y unos comerciantes... no tan felices. Antes de que la gente comience a morir por causas naturales, pues es natural morirse de hambre si no comes nada, añadiremos las rutas comerciales.
Buscamos en module_scripts.py las líneas:
y antes de ese precioso ]),
añadimos, de acuerdo a la siguiente forma, las rutas comerciales que deseemos:
La primera referencia responde al lugar de salida, la segunda al destino. Se pueden añadir tantas como necesitemos.
Guardamos, compilamos... y si no da errores, podremos visitar ingame nuestras nuevas localizaciones.
Llegados a este punto, se da por concluido este tutorial. Si todo ha salido correctamente tendremos nuestras flamantes ciudades listas para ser visitadas, asediadas o defendidas. Si queda alguna duda, preguntad sin miedo, de la misma forma que si detectáis algún error avisadme sin demora para que lo pueda cambiar y no haya algún pobre desgraciado dándose de golpes contra el teclado porque falla el tutorial.
En este tutorial aprenderemos a añadir ciudades, castillos y aldeas a nuestro mod de forma relativamente sencilla.
1.- Empezando
Ante todo, planificación. No podemos pretender añadir lugares a lo loco sin una organización previa. Nunca viene mal tener un bloc de notas o algo donde escribir cerca para saber qué tenemos que hacer y qué es lo que ya hemos hecho. Dispondremos del Module System, del Python instalado (para compilar sin problemas) y un editor de textos adecuado (por mi parte uso el Notepad++, resulta realmente cómodo y es bastante intuitivo). Y no menos importante, nos armaremos de paciencia.
2.- Añadiendo la localización (module_parties.py)
Comenzamos con lo más básico: introducir los datos básicos de la ciudad/castillo/villa en nuestro primer archivo del MS. Abrimos module_parties.py y nos encontramos los archivos referentes a todas las localizaciones físicas permanentes del juego (party_templates.py contiene los datos de las patrullas, bandidos... no los confundamos). Si hemos consultado antes el segundo capítulo de mis inacabados tutoriales sabremos perfectamente que significan las partes de todas esas líneas. Por si acaso, condensaré la información necesaria en este hilo:
- Código:
("town_1","Sargoth",icon_town|pf_town,no_menu,pt_none,fac_neutral,0, ai_bhvr_hold,0,(-1.55,66.45),[],170)
1) Id de la party. “town_1”
2) Nombre de la party. “Sargoth”
3) Flags. icon_town|pf_town
4) Menú. no_menu
5) Party-template. pt_none
6) Facción. fac_neutral
7) Personalidad. 0
Comportamiento de la IA. ai_bhvr_hold
9) IA-target party. 0
10) Coordenadas Iniciales. (-1.55,66.45)
11) Lista de tropas acantonadas. [] (none)
12) Orientación de la “party”. 170
Si echamos un rápido vistazo al archivo, veremos que todas las líneas tienen la misma forma y organización. Proseguimos:
Si queremos añadir una localización Y, ya sea ciudad, castillo o aldea, deberemos proceder SIEMPRE de la misma forma: copiaremos una línea de código del mismo tipo que la localización que queramos añadir (ciudad - ciudad, castillo - castillo, aldea - aldea) y la pegaremos a continuación de la última localización de ese tipo y antes del siguiente bloque de localizaciones, nunca al final del archivo. Así, además de tener el código ordenado y que nos permita encontrar mejor las cosas, evitaremos esos detalles sin importancia que son los errores por haber colocado lo que no debemos donde no debemos.
Así pues, si copiamos una ciudad, colocaremos la línea nueva de la siguiente forma:
- Código:
("town_22","Bariyye", icon_town_desert|pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(165, -106.7),[], 225),
# Aztaq_Castle
# Malabadi_Castle
("castle_1","Culmarr_Castle",icon_castle_a|pf_castle, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-101.3, -21),[],50),
- Código:
("town_22","Bariyye", icon_town_desert|pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(165, -106.7),[], 225),
("town_1","Sargoth", icon_town|pf_town, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-1.55, 66.45),[], 170),
# Aztaq_Castle
# Malabadi_Castle
("castle_1","Culmarr_Castle",icon_castle_a|pf_castle, no_menu, pt_none, fac_neutral,0,ai_bhvr_hold,0,(-101.3, -21),[],50),
Después de eso podremos renombrar, cambiar los iconos y todo lo que queramos... podemos copiar de 5 en 5, de 10 en 10... siempre y cuando después sigamos correctamente los pasos y no nos olvidemos ninguna scene. Para encontrar mejor las referencias, yo suelo continuar la sucesión de números de las IDs, así pues, las nuevas localizaciones serán town_23, town_24... castle_49, castle_50... eso queda a gusto de cada uno. El caso es que después no tratemos de referenciarlas con otro nombre. Guardamos, compilamos y cruzamos los dedos. Si no hay ningún error, continuaremos.
3.- Copiando las Scenes (Carpeta SceneObj)
Vamos a otra de las partes importantes. Por un lado tenemos los códigos que hacen que todo funcione, pero sin el escenario en sí, da igual cuanto tiempo hayamos pasado con la programación. Abrimos la carpeta SceneObj de nuestro mod y contemplamos la larga lista de archivos. Un rápido vistazo nos dejará ver como se organizan:
Ciudades
- Código:
scn_town_21_alley.sco
scn_town_21_arena.sco
scn_town_21_castle.sco
scn_town_21_center.sco
scn_town_21_prison.sco
scn_town_21_store.sco
scn_town_21_tavern.sco
scn_town_21_walls.sco
Castillos
- Código:
scn_castle_1_interior.sco
scn_castle_1_exterior.sco
scn_castle_1_prison.sco
Aldeas
- Código:
scn_village_34.sco
Cada una de las localizaciones lleva asignados un número determinado de escenarios. Copiaremos los que hagan falta para que nuestras recién creadas localizaciones tengan sus respectivas scenes. Cambiaremos el número de cada una al de la localización añadida, por ejemplo:
- Código:
scn_town_23_alley.sco
scn_town_23_arena.sco
scn_town_23_castle.sco
scn_town_23_center.sco
scn_town_23_prison.sco
scn_town_23_store.sco
scn_town_23_tavern.sco
scn_town_23_walls.sco
4.- Referenciar los cambios (module_scenes.py)
Cuando ya tenemos las scenes copiadas, es hora de referenciarlas desde el MS, así que vamos a module_scenes.py y empezamos a copiar y pegar como locos. Es un paso sencillo, pues sólo debemos tener en mente que cada tipo de localizacion de las ciudades tiene su grupo, y que añadiremos las nuevas al final de cada grupo y antes del siguiente (town_XX_alley con town_alley, town_XX_castle con town_castle...), quedando de la siguiente forma (sólo pongo un ejemplo, los demás son iguales):
- Código:
("town_21_arena",sf_generate,"none", "none", (0,0),(100,100),-100,"0x00000002200005000005f57b00005885000046bd00006d9c",
[],[],"outer_terrain_desert"),
("town_22_arena",sf_generate,"none", "none", (0,0),(100,100),-100,"0x00000002200005000005f57b00005885000046bd00006d9c",
[],[],"outer_terrain_desert"),
("town_23_arena",sf_generate,"none", "none", (0,0),(100,100),-100,"0x00000002200005000005f57b00005885000046bd00006d9c",
[],[],"outer_terrain_desert"),
En el caso de las aldeas y castillos lo tendremos más sencillo, pues sólo hemos de añadir una localización en el caso de las aldeas (como siempre al final de la lista de aldeas) o en bloque al final de la lista en el caso de los castillos:
- Código:
("castle_45_exterior",sf_generate,"none", "none", (0,0),(100,100),-100,"0x0000000254c2ec0000042509000016da0000017200000ed3",
[],[],"outer_terrain_desert"),
("castle_45_interior",sf_indoors, "arabian_interior_keep_b", "bo_arabian_interior_keep_b", (-100,-100),(100,100),-100,"0",
["exit"],["castle_35_seneschal"]),
("castle_45_prison",sf_indoors,"interior_prison_n", "bo_interior_prison_n", (-100,-100),(100,100),-100,"0",
[],[]),
Si nos fijamos, hay una parte del código en todos los escenarios al aire libre que tiene la siguiente forma: outer_terrain_xxxxxxxx. Esa parte hace referencia al tipo de *.brf que se colocará alrededor del mapa (si, esos bordes de dudoso acabado gráfico). Tenemos los siguientes tipos:
outer_terrain_plain planicies
outer_terrain_desert desiertos
outer_terrain_steppe estepas
outer_terrain_town_thir_1 para Thir (porque tiene puerto, es especial para esa ciudad)
outer_terrain_snow nieve
Así, deberemos ajustarlo para que no nos aparezca un perfecto desierto de ardiente arena alrededor de nuestra aldea nevada. Guardamos, compilamos y cuando no haya errores, continuamos.
5.- Añadiendo el factor NPC (module_troops.py)
Una vez hemos llegado a este punto, ya tenemos casi a punto nuestras localizaciones, sólo que sufren un preocupante vacío de poder. Nadie las gestiona, y si las dejamos a su suerte, sus muros se derrumbarán, sus vigas de madera se pudrirán y las ratas devorarán a los incautos que crucen sus puertas... Es el momento de añadir cuanta chusma burocrática haga falta para que las ciudades, castillos y aldeas funcionen de acuerdo a las leyes del senescal o anciano del lugar.
Para eso nos dirigimos al archivo module_troops.py y buscamos entre sus incontables líneas a los siguientes NPCs:
Ciudades
"town_1_seneschal"
"town_1_arena_master"
"town_1_armorer"
"town_1_weaponsmith"
"town_1_tavernkeeper"
"town_1_merchant"
"town_1_horse_merchant"
"town_1_mayor"
"town_1_master_craftsman"
Castillos
"castle_1_seneschal"
Aldeas
"village_1_elder"
En cada bloque iremos añadiendo tantos como ciudades/castillos/aldeas hayamos añadido, siempre siguiendo las pautas que he repetido a lo largo del tutorial (al final del bloque de los de su tipo y antes del siguiente). El "town_X_master_craftsman" se localiza de los últimos, pero sigue las mismas directrices que los demás. Cambiamos los números al número de referencia de nuestras nuevas localizaciones y listo. Podemos cambiarles la ropa, las caras... esas cosas tan divertidas que se eternizan hasta la extenuación y parecen nunca acabar (Hágalo bajo su cuenta y riesgo, la casa de Rojas no se responsabiliza de posibles daños cerebrales posteriores a la realización de los cambios).
Guardamos, compilamos y seguimos con los cambios si no hemos obtenido errores.
6.- Añadiendo el factor Facción (module_scripts.py)
Genial, ahora tenemos un lugar perfectamente gestionado por sus gentes, pero lejos de cualquier jurisdicción de los reinos... y nosotros, como buenos señores feudales que respetamos el derecho del pueblo a ser esclavizado y aplastado a impuestos, no debemos dejar que continúe así sin tomar cartas en el asunto. ¿Quién sabe que terribles ideas podrían ocurrírseles si se les deja solos?
Abrimos el archivo module_scripts.py y buscamos la siguiente línea:
- Código:
(call_script, "script_give_center_to_faction_aux", "p_town_1", "fac_kingdom_4"),
Veremos una larga lista de estos códigos. Estos en particular asignan la localización a un reino concreto (en el ejemplo p_town_1 -p_ es el prefijo que hace referencia al archivo module_parties.py- pertenecería a la facción 4 -fac_ es el prefijo que hace referencia al archivo module_factions.py-).
Añadimos al final cuantas líneas sean necesarias (al final del bloque de ciudades y al final del bloque de castillos) y asignamos nuestras nuevas localizaciones a sus correspondientes facciones.
Casi inmediatamente después encontraremos las asignaciones de ciudades a los nobles:
- Código:
(call_script, "script_give_center_to_lord", "p_town_1", "trp_kingdom_4_lord", 0),
Siguiendo la misma forma, añadiremos las líneas correspondientes y asignaremos las ciudades a los nobles y reyes (las referencias a los lords las podemos encontrar en el archivo module_troops.py)
Vemos que los castillos no se asignan de forma predeterminada, únicamente hay unos pocos que pertenecen a ciertos nobles, Si queremos que Lord Panocha posea el castillo de la Colina Panochil usaremos el siguiente código:
- Código:
(call_script, "script_give_center_to_lord", "p_castle_35", "trp_knight_1_3", 0)
cambiando castle_35 por el correspondiente al castillo de la Colina Panochil y knight_1_3 a la ID de Lord Panocha.
Nota: esos añadidos deberán ir inmediatamente antes de la línea
- Código:
(call_script, "script_assign_lords_to_empty_centers"),
que asigna las localizaciones sin dueño a los nobles de sus respectivos reinos.
7.- Comerciando, que es gerundio (continuamos en module_scripts.py)
Ahora ya tenemos un noble feliz al mando, unos senescales felizmente asignados a sus tareas, unos aldeanos felizmente abusados y unos comerciantes... no tan felices. Antes de que la gente comience a morir por causas naturales, pues es natural morirse de hambre si no comes nada, añadiremos las rutas comerciales.
Buscamos en module_scripts.py las líneas:
- Código:
#AHMERRAD - 6 Routes
#Tulga, Halmar, Narra, Shariz, Durquba
(call_script, "script_set_trade_route_between_centers", "p_town_21", "p_town_22"), #Bariyye
#BARIYYE - 6 Routes
#Tulga, Halmar, Narra, Shariz, Durquba, Ahmerrad
y antes de ese precioso ]),
añadimos, de acuerdo a la siguiente forma, las rutas comerciales que deseemos:
- Código:
(call_script, "script_set_trade_route_between_centers", "p_town_23", "p_town_1"), #sargoth
La primera referencia responde al lugar de salida, la segunda al destino. Se pueden añadir tantas como necesitemos.
Guardamos, compilamos... y si no da errores, podremos visitar ingame nuestras nuevas localizaciones.
Llegados a este punto, se da por concluido este tutorial. Si todo ha salido correctamente tendremos nuestras flamantes ciudades listas para ser visitadas, asediadas o defendidas. Si queda alguna duda, preguntad sin miedo, de la misma forma que si detectáis algún error avisadme sin demora para que lo pueda cambiar y no haya algún pobre desgraciado dándose de golpes contra el teclado porque falla el tutorial.