Sobre las recargas "manuales"

For all things Churrera. ¿Estás haciendo un juego? ¿quieres proponer un cambio? ¿tienes alguna duda? ¡Cuéntanoslo!

Moderador: na_th_an

Avatar de Usuario
Fabio
Mensajes: 44
Registrado: Vie, 17 Ene 2014, 21:52

Sobre las recargas "manuales"

Mensajepor Fabio » Sab, 22 Mar 2014, 02:48

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)