mojontwins / MK1

MT Engine MK1 para ZX Spectrum (La Churrera)
GNU General Public License v2.0
65 stars 11 forks source link

PLAYER_HAS_JETPAC no funciona si no está activo PLAYER_HAS_JUMP #16

Closed TartessosGames closed 7 months ago

TartessosGames commented 8 months ago

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.

mojontwins commented 7 months ago

No soy capaz de reproducirlo. ¿Tienes algún ejemplo en que esto pase? Gracias

TartessosGames commented 7 months ago

https://github.com/TartessosGames/Prueba-JETPACK

He subido un rar de LALA con JETPACK activado y el salto desactivado.

1

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.

mojontwins commented 7 months ago

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í.

mojontwins commented 7 months ago

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]);
        }

    }
mojontwins commented 7 months ago

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.

TartessosGames commented 7 months ago

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