Closed TartessosGames closed 7 months ago
No soy capaz de reproducirlo. ¿Tienes algún ejemplo en que esto pase? Gracias
https://github.com/TartessosGames/Prueba-JETPACK
He subido un rar de LALA con JETPACK activado y el salto desactivado.
En este caso, LALA ni salta ni vuela, pero si se activan las dos opciones en config.h, tanto el salto como el JETPACK, LALA salta al pulsar la barra espaciadora, y si mientras cae se pulsa arriba (Q), lo hará lentamente, Además, si para saltar pulsamos la barra espaciadora + arriba (Q), entoces LALA usa el JETPACK y vuela. Creo haber visto que en otros juegos como JETPaco no es así y puede estar JETPACK activado sin el salto. Además, al tener que estar activado el salto para usar JETPACK se desabilita la posibilidad de usar VENG_SELECTOR.
No es que lo esté usando en mi proyecto, al final he creado un código en custom_veng.h para hacer otro tipo de acción, pero lo estuve probando, y como lo vi raro, por eso lo he comentado.
Buenas. El enlace que has puesto me lleva a una página de error. Pero voy a probar a ver qué ocurre. Voy a ver si z88dk te deja sacar la salida del preprocesador a ver qué código está generando al desactivar salto y activar jetpac porque, como bien dices, jet paco es exactamente así.
Este es el código de move_player
tras pasar por el preprocesador, con jetpac activado, salto desactivado. El trozo necesario está ahí, pero es cierto que no funciona. Otras veces me he topado con algo así y tenía que ver con algún bug en z88dk. Voy a comparar con la salida con el salto activado y voy viendo:
unsigned char player_move(void) {
{
#asm
; Signed comparisons are hard
; p_vy <= 512 - 32
; We are going to take a shortcut.
; If p_vy < 0, just add 32 .
; If p_vy > 0, we can use unsigned comparison anyway.
ld hl, (_p_vy)
bit 7, h
jr nz, _player_gravity_add; < 0
ld de, 512 - 32
or a
push hl
sbc hl, de
pop hl
jr nc, _player_gravity_maximum
._player_gravity_add
ld de, 32
add hl, de
jr _player_gravity_vy_set
._player_gravity_maximum
ld hl, 512
._player_gravity_vy_set
ld(_p_vy), hl
._player_gravity_done
ld a, (_p_gotten)
or a
jr z, _player_gravity_p_gotten_done
; If HL = pvy > 0
bit 7, h
jr nz, _player_gravity_p_gotten_done
ld hl, 0
ld(_p_vy), hl
._player_gravity_p_gotten_done
#endasm
}
{
if ((pad0 & 0x01) == 0) {
p_vy -= 32;
if (p_vy < -256) p_vy = -256;
p_jetpac_on = 1;
} else p_jetpac_on = 0;
}
p_y += p_vy;
if (p_gotten) p_y += ptgmy;
if (p_y < 0) p_y = 0;
if (p_y > 9216) p_y = 9216;
#asm
ld hl, (_p_y)
call HLshr6_A
ld(_gpy), a
#endasm
possee = 0;
player_calc_bounding_box();
hit_v = 0;
cx1 = ptx1;
cx2 = ptx2;
if (p_vy + ptgmy < 0) {
cy1 = cy2 = pty1;
cm_two_points();
if ((at1 & 8) || (at2 & 8)) {
p_vy = 0;
#asm
ld a, (_pty1)
inc a
sla a
sla a
sla a
sla a
sub 8
ld(_gpy), a
#endasm
#asm
ld a, (_gpy)
call Ashl16_HL
ld(_p_y), hl
#endasm
}
}
if (p_vy + ptgmy >= 0) {
cy1 = cy2 = pty2b;
cm_two_points();
if ((at1 & 8) || (at2 & 8) || ((gpy & 15) < 8 && ((at1 & 4) || (at2 & 4)))) {
p_vy = 0;
#asm
ld a, (_pty2b)
dec a
sla a
sla a
sla a
sla a
ld(_gpy), a
#endasm
#asm
ld a, (_gpy)
call Ashl16_HL
ld(_p_y), hl
#endasm
possee = 1;
}
}
cy1 = cy2 = pty2;
#asm
ld a, (_p_vy)
ld c, a
ld a, (_p_vy + 1)
or c
jr z, evil_tile_check_vert_done
ld a, (_at1)
and 1
ld c, a
ld a, (_at2)
and 1
or c
ld(_hit_v), a
.evil_tile_check_vert_done
#endasm
#asm
ld a, (_gpx)
srl a
srl a
srl a
srl a
ld(_gpxx), a
ld a, (_gpy)
srl a
srl a
srl a
srl a
ld(_gpyy), a
#endasm
#asm
ld a, (_pad0)
ld c, a
and 0x04
or a
jr z, h_decelerate_done
ld a, c
and 0x08
or a
jr z, h_decelerate_done
xor a
ld(_wall_h), a
ld hl, (_p_vx)
bit 7, h;
bit 7 of H = 1: negative(left)
jr z, decelerate_right
.decelerate_left
ld de, 32
add hl, de
bit 7, h
jr nz, h_acceleration_set
ld hl, 0
.h_acceleration_set
ld(_p_vx), hl
jr h_acceleration_done
.decelerate_right
ld a, l
or h
jr z, h_acceleration_done
ld de, -32
add hl, de
bit 7, h
jr z, h_acceleration_set
ld hl, 0
jr h_acceleration_set
.h_decelerate_done
.accelerate_left
ld a, c
and 0x04
jr nz, accelerate_left_done
#endasm
#asm
ld de, (_p_vx)
ld hl, -192
call l_gt;
Int signed de > hl
jr nc, accelerate_left_done
xor a
ld(_p_facing), a
ld hl, (_p_vx)
ld de, -24
add hl, de
jr h_acceleration_set
.accelerate_left_done
.accelerate_right
ld a, c
and 0x08
jr nz, accelerate_right_done
#endasm
#asm
ld de, (_p_vx)
ld hl, 192
call l_lt;
Int signed de < hl
jr nc, accelerate_right_done
ld a, 1
ld(_p_facing), a
ld hl, (_p_vx)
ld de, 24
add hl, de
jr h_acceleration_set
.accelerate_right_done
.h_acceleration_done
#endasm
p_x = p_x + p_vx;
p_x += ptgmx;
if (p_x < 0) p_x = 0;
if (p_x > 14336) p_x = 14336;
#asm
ld a, (_gpx)
ld(_gpox), a
ld hl, (_p_x)
call HLshr6_A
ld(_gpx), a
#endasm
player_calc_bounding_box();
hit_h = 0;
cy1 = pty1;
cy2 = pty2;
if (p_vx + ptgmx < 0) {
cx1 = cx2 = ptx1;
cm_two_points();
if ((at1 & 8) || (at2 & 8)) {
p_vx = 0;
#asm
ld a, (_ptx1)
inc a
sla a
sla a
sla a
sla a
sub 4
ld(_gpx), a
#endasm
#asm
ld a, (_gpx)
call Ashl16_HL
ld(_p_x), hl
ld a, 3
ld(_wall_h), a
#endasm
} else {
#asm
ld a, (_at1)
and 1
ld c, a
ld a, (_at2)
and 1
or c
ld(_hit_h), a
#endasm
}
}
if (p_vx + ptgmx > 0) {
cx1 = cx2 = ptx2;
cm_two_points();
if ((at1 & 8) || (at2 & 8)) {
p_vx = 0;
#asm
ld a, (_ptx1)
sla a
sla a
sla a
sla a
add 4
ld(_gpx), a
#endasm
#asm
ld a, (_gpx)
call Ashl16_HL
ld(_p_x), hl
ld a, 4
ld(_wall_h), a
#endasm
} else {
#asm
ld a, (_at1)
and 1
ld c, a
ld a, (_at2)
and 1
or c
ld(_hit_h), a
#endasm
}
}
#asm
ld a, (_gpx)
add 8
srl a
srl a
srl a
srl a
ld(_p_tx), a
ld(_cx1), a
ld c, a
ld a, (_gpy)
add 8
srl a
srl a
srl a
srl a
ld(_p_ty), a
ld(_cy1), a
call _attr_2
ld a, l
ld(_rdb), a
#endasm
if (rdb & 128) {
}
if (wall_h == 3) {
#asm
ld a, (_gpx)
add 3
srl a
srl a
srl a
srl a
ld(_cx1), a
ld c, a
ld a, (_cy1)
call _attr_2
ld a, l
cp 10
jr nz, p_int_left_no
ld a, (_cy1)
ld(_y0), a
ld(_y1), a
ld a, (_cx1)
ld(_x0), a
dec a
ld(_x1), a
call _process_tile
.p_int_left_no
#endasm
} else if (wall_h == 4) {
#asm
ld a, (_gpx)
add 12
srl a
srl a
srl a
srl a
ld(_cx1), a
ld c, a
ld a, (_cy1)
call _attr_2
ld a, l
cp 10
jr nz, p_int_right_no
ld a, (_cy1)
ld(_y0), a
ld(_y1), a
ld a, (_cx1)
ld(_x0), a
inc a
ld(_x1), a
call _process_tile
.p_int_right_no
#endasm
}
hit = 0;
if (hit_v) {
hit = 1;
p_vy = addsign(-p_vy, 192);
} else if (hit_h) {
hit = 1;
p_vx = addsign(-p_vx, 192);
}
if (hit) {
{
p_killme = 4;
}
}
if (!possee && !p_gotten) {
p_next_frame = (unsigned char * )(player_cells[8 + p_facing]);
} else {
gpit = p_facing << 2;
if (p_vx == 0) {
rda = 1;
} else {
rda = ((gpx + 4) >> 3) & 3;
}
p_next_frame = (unsigned char * )(player_cells[gpit + rda]);
}
}
Acabo de darme cuenta de qué pasa y me he sentido muy tonto por no verlo XD
El problema no es que no funcione el jetpac, sino que, por defecto, la aceleración del jetpac es -32... y la gravedad es 32. Se cancelan. El Jetpac no propulsa lo suficiente. Hay que usar una gravedad menor o una aceleración de jetpac mayor para que funcione el jetpac. En Jet Paco la gravedad es muy baja, por eso un valor de 32 funciona para ese juego.
Voy a cerrarlo, pondré otro valor por defecto en el config.
Ahhh, lo del error en el enlace es porque al subir el rar de la prueba de los behs cambié el nombre de la carpeta donde estaban subidos.
La gravedad... Vaya tela... Pues mira que estuve toqueteando cosas para ver si lo hacía funcionar... Incluso conseguí que funcionara el Jetpack modificando el motor para que tanto el salto y el jetpack se activaran pulsando arriba, así el jetpack funcionaba sin tener que pulsar a la vez arriba + la barra espaciadora. Una chapuzilla :-D
Para que funcione el JETPAC tiene que estar activo el salto. Si se desactiva el salto en config, PLAYER_HAS_JETPAC no hace nada. Se puede comprobar tambien al tener ambos activados junto con VENG_SELECTOR , que cuando VENG_SELECTOR está seleccionado para que funcione el salto, el sprite salta, pero si se activa para que funcione el JETPAC, el sprite no hace nada, ya que el salto se desactiva.