Página 1 de 2

Sobre las recargas "manuales"

Publicado: Sab, 22 Mar 2014, 02:48
por Fabio
Hola. Quisiera hacer lo mismo para el juego que estoy haciendo, pero tengo la version 3.99.2 de la churrera. El archivo engine.h, esta igual que como lo describen aqui y no tengo problemas para modificarlo. Pero el mainloop esta un poco diferente y no me atrevo a meter mano. Me podrian orientar como modificarlo acorde a la version que tengo yo? (3.99.2)

$this->bbcode_second_pass_quote('na_th_an', '[')b]D_Skywalk ha propuesto el siguiente cambio:

$this->bbcode_second_pass_quote('D_Skywalk', 'R')especto a las recargas, [...] en la documentación dice algo como que las recargas salen aleatoriamente si el jugador ha cogido el objeto, en el lugar donde se puso el hotspot. Mi pregunta era que sabiendo que sólo puedo poner un hotspot por pantalla hay alguna forma sencilla donde se pueda configurar (usando un tipo nuevo?) que un hotspot sea recarga o sea objeto (trozo de espada).


Vamos a invalidar el comportamiento normal y a establecer la recarga como tipo de hotspot número 3. Usaremos el colocador para poner las recargas de vida como los objetos o las llaves, pero con tipo = 3.

En el código del motor hay que cambiar dos cosas: primero tendremos que modificar el código que dibuja el hotspot al entrar en una nueva pantalla. Este código está en la función draw_scr, a partir de la linea 1159 del archivo engine.h. Este trozo distingue si hemos cogido o no el objeto/llave/balas de un hotspot activo para mostrar el item correspondiente o, al azar, una recarga:

$this->bbcode_second_pass_code('', ' if ((hotspots [n_pant].act == 1 && hotspots [n_pant].tipo) ||
(hotspots [n_pant].act == 0 && (rand () & 7) == 2)) {
hotspot_x = gpx << 4;
hotspot_y = gpy << 4;
orig_tile = map_buff [15 * gpy + gpx];
draw_coloured_tile (VIEWPORT_X + gpx + gpx, VIEWPORT_Y + gpy + gpy, 16 + (hotspots [n_pant].act ? hotspots [n_pant].tipo : 0));
}')

Tendremos que modificarlo para que quede así:

$this->bbcode_second_pass_code('', ' if (hotspots [n_pant].act == 1 && hotspots [n_pant].tipo) {
hotspot_x = gpx << 4;
hotspot_y = gpy << 4;
orig_tile = map_buff [15 * gpy + gpx];
draw_coloured_tile (VIEWPORT_X + gpx + gpx, VIEWPORT_Y + gpy + gpy, 16 + (hotspots [n_pant].tipo != 3 ? hotspots [n_pant].tipo : 0));
}')

Así, si el hotspot es de tipo 3 se dibujará el tile 16. Si vale 1, el 17 (objeto), si vale 2, el 18 (llave), y si vale 4, el 20 (munición). Ahora tenemos que cambiar la parte del código que se encarga de detectar cuando el jugador toca el hotspot. Este código se encuentra en el archivo mainloop.h, a partir de la linea 316. Se trata de mover el código que aparece en la primera rama del IF a un caso de la instrucción selectiva de más abajo. El código original es:

$this->bbcode_second_pass_code('', ' // Was it an object, key or life boost?
if (hotspots [n_pant].act == 0) {
player.life += PLAYER_REFILL;
if (player.life > PLAYER_LIFE)
player.life = PLAYER_LIFE;
hotspots [n_pant].act = 2;
peta_el_beeper (8);
} else {
switch (hotspots [n_pant].tipo) {
#ifndef DEACTIVATE_OBJECTS
case 1:
#ifdef ONLY_ONE_OBJECT
if (player.objs == 0) {
player.objs ++;
peta_el_beeper (9);
} else {
peta_el_beeper (4);
draw_coloured_tile (VIEWPORT_X + (hotspot_x >> 3), VIEWPORT_Y + (hotspot_y >> 3), 17);
gpit = 1;
}
#else
player.objs ++;
peta_el_beeper (9);
break;
#endif
#endif
#ifndef DEACTIVATE_KEYS
case 2:
player.keys ++;
peta_el_beeper (7);
break;
#endif
#ifdef MAX_AMMO
case 4:
if (MAX_AMMO - player.ammo > AMMO_REFILL)
player.ammo += AMMO_REFILL;
else
player.ammo = MAX_AMMO;
peta_el_beeper (9);
break;
#endif
}
hotspots [n_pant].act = gpit;
}
hotspot_x = hotspot_y = 240;
} ')

Y debe quedar así:

$this->bbcode_second_pass_code('', ' // Was it an object, key or life boost?
if (hotspots [n_pant].act) {
switch (hotspots [n_pant].tipo) {
#ifndef DEACTIVATE_OBJECTS
case 1:
#ifdef ONLY_ONE_OBJECT
if (player.objs == 0) {
player.objs ++;
peta_el_beeper (9);
} else {
peta_el_beeper (4);
draw_coloured_tile (VIEWPORT_X + (hotspot_x >> 3), VIEWPORT_Y + (hotspot_y >> 3), 17);
gpit = 1;
}
#else
player.objs ++;
peta_el_beeper (9);
#endif
break;
#endif
#ifndef DEACTIVATE_KEYS
case 2:
player.keys ++;
peta_el_beeper (7);
break;
#endif
case 3:
player.life += PLAYER_REFILL;
if (player.life > PLAYER_LIFE)
player.life = PLAYER_LIFE;
peta_el_beeper (8);
break;
#ifdef MAX_AMMO
case 4:
if (MAX_AMMO - player.ammo > AMMO_REFILL)
player.ammo += AMMO_REFILL;
else
player.ammo = MAX_AMMO;
peta_el_beeper (9);
break;
#endif
}
hotspots [n_pant].act = gpit;
}
hotspot_x = hotspot_y = 240;
}')

(las explicaciones se refieren a al versión actual 3.99.1, es posible que las lineas bailen un poco en otras versiones)

Re: El hilo de las modificaciones a la Churrera

Publicado: Sab, 22 Mar 2014, 08:08
por son_link
Fabio, lo tengo implementado en Sami Troid desde la misma versión que usas. En las 3.99.3 ya viene de serie

Re: El hilo de las modificaciones a la Churrera

Publicado: Dom, 23 Mar 2014, 01:42
por Fabio
Es decir, si me bajo de la carpeta Dev el engine.h y el mainloop.h del link que me has pasado, y los reeemplazo por los mios , me tendria que andar sin mas?


$this->bbcode_second_pass_quote('son_link', 'F')abio, lo tengo implementado en Sami Troid desde la misma versión que usas. En las 3.99.3 ya viene de serie

Re: El hilo de las modificaciones a la Churrera

Publicado: Lun, 24 Mar 2014, 02:00
por Fabio
No me funciono. Habra alguna diferencia.

Re: El hilo de las modificaciones a la Churrera

Publicado: Mar, 25 Mar 2014, 22:01
por son_link
Fabio, aquí lo tienes -> viewtopic.php?p=47736#p47736

Re: Sobre las recargas "manuales"

Publicado: Mié, 26 Mar 2014, 17:51
por na_th_an
Cada vez que os bajéis una nueva versión, tenéis que recordar leer "whatsnew.txt" donde se indica cómo usar todas las cosas nuevas que se incluyen.

Lo que quiere hacer fabio es esto:

$this->bbcode_second_pass_code('', 'Hotspots tipo 3
===============

Hemos hecho esta modificación, propuesta en el foro, fija a golpe de directiva.
Si defines

#define USE_HOTSPOTS_TYPE_3 // Alternate logic for recharges.

Las recargas aparecerán única y exclusivamente donde tú las coloques, usando
el hotspot de tipo 3.')

Re: Sobre las recargas "manuales"

Publicado: Mié, 26 Mar 2014, 22:52
por son_link
$this->bbcode_second_pass_quote('na_th_an', 'C')ada vez que os bajéis una nueva versión, tenéis que recordar leer "whatsnew.txt" donde se indica cómo usar todas las cosas nuevas que se incluyen.

Lo que quiere hacer fabio es esto:

$this->bbcode_second_pass_code('', 'Hotspots tipo 3
===============

Hemos hecho esta modificación, propuesta en el foro, fija a golpe de directiva.
Si defines

#define USE_HOTSPOTS_TYPE_3 // Alternate logic for recharges.

Las recargas aparecerán única y exclusivamente donde tú las coloques, usando
el hotspot de tipo 3.')

Ya, pero esto no esta implementado en la 3.99.1 que es la que usa

Re: Sobre las recargas "manuales"

Publicado: Jue, 27 Mar 2014, 17:12
por Fabio
Claro, esa version que comenta na_th_an me parece que es la 3.99.3 que yo ni sabia que existia cuando empeze el juego. Es que el curso que sigo en el mundodelspectrum es con la 3.99.2. Voy a ver si me animo a usar esta nueva version. De todas formas les agradezco los comentarios y sugerencias.
Y una consulta son_link, esta modificacion que has hecho en TmxCnv va con windows?, lo pregunto porque en el titulo dice que es para GNU/Linux.
PD: De todas formas el nuevo juego (Guerrero Ninja) ya esta terminado (con la recarga al azar). En el proximo sera lo de poner la recarga donde yo quiera.
El link pueden verlo en la firma del mensaje (Junto al de Isidoro y Terrorlandia). Espero les guste.

Re: Sobre las recargas "manuales"

Publicado: Jue, 27 Mar 2014, 19:07
por na_th_an
Al. En ese caso la.modificación manualserá muy parecida. Aunque no te coincidan los números de línea, busca los trozos de código que deberíanser muy parecidos, si no iguales.

Enviado desde mi LT18i usando Tapatalk 2

Re: Sobre las recargas "manuales"

Publicado: Vie, 28 Mar 2014, 12:41
por son_link
Solo tienes que compilarlo (o que alguien lo haga) para Windows.
Yo lo haria, pero solo tengo una maquina virtual con lo necesario en un XP, hasta que no haga limpieza en el disco, que sera este finde, no le meteré un 7 de 64 bits