Proyecto Aquanoids: el videojuego

Ayuda sobre MT Engine MK2.

Moderador: na_th_an

Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Proyecto Aquanoids: el videojuego

Mensajepor na_th_an » Jue, 13 Ago 2015, 15:01

Tema del cerrojo:

Eso es probablemente un bug de MK2, sencillamente porque no hemos usado nunca el código de los cerrojos/llaves automáticos, está portado directamente de la Churrera, y jamás ha sido probado. Le echaré un vistazo.

El cambio debería ser persistente, vaya.

El otro tema:

Será cualquier detallico de script, lo miraré también.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Proyecto Aquanoids: el videojuego

Mensajepor na_th_an » Jue, 13 Ago 2015, 15:17

El problema es que no se detecta el cerrojo en la lista de cerrojos en memoria a la hora de abrirlo para marcarlo como "abierto". No tengo muy claro por qué pasa, pero será una tontería - lo malo es que hasta mañana ya no lo voy a poder mirar.
Como diría Rorshach: "Urm..."
Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Proyecto Aquanoids: el videojuego

Mensajepor elborra » Jue, 13 Ago 2015, 17:24

NeilParsons escribió::ymca: ¡Asias, asias!

Una cosa que tengo que ver, aparte de que había corregido en el script la colocación de unos tiles en la primera pantalla y la dinámica de movimiento del personaje, es lo siguiente:

Ya había entrado antes en esta pantalla para recoger una de las baterías: había que abrir el cerrojo presente en ella con una llave, bajar y recuperarla, pero en ella tenía que figurar además una lata de fuel en la posición tx, ty = 13, 5 (en el script está correctamente definido) y no había nada, solo un tile del fondo. Y se había definido el flag 1 correspondiente a dicho tile con valor cero para que se imprimiera en su lugar. No creo haberme equivocado en las coordenadas.
Ummmm, ok, el tema es que hay un pequeño lio de flags... en config.h se define a la flag 1 como aquella que usa el motor para contar los objetos (las baterias) y de hecho en el fichero de script na_th_an (supongo) contando con ello comenta:

Código: Seleccionar todo

# flags:
# 1   = cuenta de baterías (hasta 15)
# 2 = cuenta de objeto 1
# 3 = cuenta de objeto 2
# 4 = cuenta de objeto 3
# 5 = control objetos
Pero luego en las condiciones realmente se usa la 1, la 2 y la 3 para los objetos (en lugar de la 2, 3, y 4)...

Solución más rápida:
en config.h cambias:

Código: Seleccionar todo

#define OBJECT_COUNT         1
por

Código: Seleccionar todo

#define OBJECT_COUNT         0
y ya si quieres por tenerlo bien comentado cambias en el script

Código: Seleccionar todo

# flags:
# 0   = cuenta de baterías (hasta 15)
# 1 = cuenta de objeto 1
# 2 = cuenta de objeto 2
# 3 = cuenta de objeto 3
# 4 = control objetos
El resto no tienes que tocar nada.

NeilParsons escribió:Seguí recorriendo el juego y pude ver que en las otras dos pantallas donde coloqué otros objetos especiales estaban en su lugar como así lo indiqué, recogiéndolos y situándolos en el marco del juego. Hasta ahí bien. Quise volver a esa pantalla (la 17 del mapa) y me encuentro que el cerrojo, que se suponía ya estaba abierto de antes, está nuevamente en su sitio. Eso sí, solo en unas pocas pantallas donde había un cerrojo y han sido retirados con las llaves volvían a aparecer. ¿Esto se puede cambiar en alguna parte?
na_th_an escribió:Tema del cerrojo:
Eso es probablemente un bug de MK2, sencillamente porque no hemos usado nunca el código de los cerrojos/llaves automáticos, está portado directamente de la Churrera, y jamás ha sido probado. Le echaré un vistazo.
El cambio debería ser persistente, vaya.
na_th_an escribió:El problema es que no se detecta el cerrojo en la lista de cerrojos en memoria a la hora de abrirlo para marcarlo como "abierto". No tengo muy claro por qué pasa, pero será una tontería - lo malo es que hasta mañana ya no lo voy a poder mirar.

Yo tampoco estoy usando los cerrojos porque sino ya me hubiera topado con el mismo problema. Pero me entró curiosidad y... ¡Encontré el problema! :P. Empecé a indagar y todo está perfecto: el cambio es persistente, el motor lo controla bien, etc, etc... ¿entonces? lo único que quedaba por ver es el contenido de bolts.bin y efectivamente no se está generando correctamente. Na_th_an, hay algunos cerrojos que estan correctos pero otros parece que repite la cordenada x del tile para la cordenada y.
Como el fichero source de la utilidad está en la carpeta utils le echaré un vistazo a ver si encuentro el problema.
En resumen, se tiene que corregir un bug en la utilidad map2bin.exe para que genere correctamente el fichero binario de cerrojos.
Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Proyecto Aquanoids: el videojuego

Mensajepor elborra » Jue, 13 Ago 2015, 17:52

Na, una tontería era na_th_an.

Código: Seleccionar todo

' Autodetect lock
      If d = tile_lock Then
         If numlocks = 32 Then Puts ("ERROR! No more than 32 locks allowed!!"): End
         x_pant = x \ 15: y_pant = y \ 10
         Puts "    lock @ (" & x & ", " & y & ") => (" & x_pant & ", " & y_pant & ")=" & (x_pant + y_pant * map_w) & "."
         l (numlocks).np = x_pant + y_pant * map_w
         l (numlocks).x = x Mod 15
         l (numlocks).y = y Mod 15        <--------   debería ser: l (numlocks).y = y Mod 10
         l (numlocks).st = 1
         numlocks = numlocks + 1
      End If

Observación: No viene al caso ni tiene ninguna importancia, pero ¿con qué compilas los codigos de free basic na_th_an? A mi los ejecutables me ocupan casi el doble que los tuyos XD

Aquí el ejecutable corregido.
Adjuntos
map2bin.rar
(29.41 KiB) Descargado 92 veces
Avatar de Usuario
NeilParsons
Mensajes: 122
Registrado: Vie, 20 Ago 2010, 23:55

Re: Proyecto Aquanoids: el videojuego

Mensajepor NeilParsons » Jue, 13 Ago 2015, 19:59

elborra escribió:Ummmm, ok, el tema es que hay un pequeño lio de flags... en config.h se define a la flag 1 como aquella que usa el motor para contar los objetos (las baterias) y de hecho en el fichero de script na_th_an (supongo) contando con ello comenta:

Código: Seleccionar todo

# flags:
# 1   = cuenta de baterías (hasta 15)
# 2 = cuenta de objeto 1
# 3 = cuenta de objeto 2
# 4 = cuenta de objeto 3
# 5 = control objetos
Pero luego en las condiciones realmente se usa la 1, la 2 y la 3 para los objetos (en lugar de la 2, 3, y 4)...

...

El resto no tienes que tocar nada.


Tiene que ser de un scripting anterior porque en el último había corregido esa parte y borrado la definición del flag para OBJECTS dejándolo así:

Código: Seleccionar todo

# flags:
# 1 = cuenta de objeto 1
# 2 = cuenta de objeto 2
# 3 = cuenta de objeto 3
# 4 = control objetos


Y en config.h está activado #define PLAYER_NUM_OBJETOS y #define OBJECT_COUNT en el flag... un momentitoooowww. Acabo de caer en la cuenta de algo y lo voy a corregir ya mismo, a ver si es lo que creo que es.
Tengo una vah-ka leshera
pechis y muy besuquera...
Avatar de Usuario
NeilParsons
Mensajes: 122
Registrado: Vie, 20 Ago 2010, 23:55

Re: Proyecto Aquanoids: el videojuego

Mensajepor NeilParsons » Jue, 13 Ago 2015, 20:04

YES I CAN! :picha: :picha: :picha:

Aquanoids-4.PNG
Aquanoids-4.PNG (34.7 KiB) Visto 2791 veces


La respuesta estaba en que estaba solapando el flag de los objetos con el del tile que tenía que aparecer en esta pantalla. Así que he corregido los valores de todos los flags definidos en el scripting, con solo subirlos numéricamente (SET FLAG 2 = 0, SET FLAG 3 = 0, SET FLAG 4 = 0 y SET FLAG 5 = 0). Ahora sí, ese tile especial ya aparece en el juego. :D
Tengo una vah-ka leshera
pechis y muy besuquera...
Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Proyecto Aquanoids: el videojuego

Mensajepor elborra » Jue, 13 Ago 2015, 21:09

NeilParsons escribió:La respuesta estaba en que estaba solapando el flag de los objetos con el del tile que tenía que aparecer en esta pantalla. Así que he corregido los valores de todos los flags definidos en el scripting, con solo subirlos numéricamente (SET FLAG 2 = 0, SET FLAG 3 = 0, SET FLAG 4 = 0 y SET FLAG 5 = 0). Ahora sí, ese tile especial ya aparece en el juego. :D
Eso es lo que te había puesto XD XD.. pero más sencillo era cambiar #define OBJECT_COUNT 1 por 0, y te evitabas cambiar el fichero .spt

De todas formas, acuérdate de lo de los cerrojos, que las puertas vuelvan a aparecer cerradas despues de abrirlas va a seguir ocurriendo sino usas el map2bin que he subido
Avatar de Usuario
NeilParsons
Mensajes: 122
Registrado: Vie, 20 Ago 2010, 23:55

Re: Proyecto Aquanoids: el videojuego

Mensajepor NeilParsons » Jue, 13 Ago 2015, 22:32

Así lo haré, en cuanto vuelva a depurar el script, pues me ha salido algo que tengo que mejorar.

Ahora sí que he podido llegar a coger esos tres objetos. Ahora solo me queda retocar esta cláusula, para mí clave para la consecución del juego, pero en la que tengo dudas de cómo reestructurarla para que no esté repitiéndose cada vez que se pasa de pantalla o cuando pisas a un bicho, algo en lo que me he dado cuenta justo después.

Código: Seleccionar todo

ENTERING ANY
   IF FLAG 2 = 1
   IF FLAG 3 = 1
   IF FLAG 4 = 1
   THEN
      # EXTERN 1 // Imprime texto
      SET FLAG 5, 1
      SOUND 7
      SOUND 7
   END
END


Tendría que estar estructurada de manera que una vez se ha comprobado que se han conseguido los tres objetos especiales, se ejecuten los comandos escritos y que, en lo sucesivo, no tenga que hacer nada más, para eso tendría que usar el valor del flag 5 para evitar que esta cláusula vuelva a repetirse.

En parte está bien, pero tendría que mejorarlo bastante más, solo que en este momento no veo yo de qué forma podría hacerlo.

Si más adelante consigo averiguar cómo hacerlo, ya solo me faltaría crear la música para la pantalla de introducción, ajustar un poco más los valores de movimiento del robot (siguen sin convencerme del todo) y tal vez no necesite meter nada más. Mi idea es lanzar el juego para todos los modelos de Spectrum de 48k.

Y de paso, mira por dónde he dado el salto de la CHurrera al MK2, sin apenas proponérmelo. :lol: :lol:
Tengo una vah-ka leshera
pechis y muy besuquera...
Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Proyecto Aquanoids: el videojuego

Mensajepor elborra » Jue, 13 Ago 2015, 23:48

Exacto con añadir IF FLAG 5 = 0 ya no se volvería a repetir.

Código: Seleccionar todo

ENTERING ANY
   IF FLAG 5 = 0
   IF FLAG 2 = 1
   IF FLAG 3 = 1
   IF FLAG 4 = 1
   THEN
      # EXTERN 1 // Imprime texto
      SET FLAG 5, 1
      SOUND 7
      SOUND 7
   END
END
No tienes que preocuparte porque se ejecute ese código cada vez que entra a una pantalla, no es problema en absoluto. Sin embargo entiendo que lo que quieres es que nada más coger el último objeto se imprima el texto, y esto así, no te va a valer, puesto que el script no se ejecutaría hasta entrar a otra pantalla después de coger el último objeto (sea cual sea)

Yo creo que la opción más viable si vas al final a usar EXTERN para los textos es tener un EXTER X que compruebe las flags y las modifique mediante c. Así cada vez que cogemos un objeto llamamos al extern con nuestro código en c. Ej. para la pantalla 17

Código: Seleccionar todo

PRESS_FIRE AT SCREEN 17
   # Si lo cojemos, añadirlo a lista
   IF PLAYER_TOUCHES 13, 5
   IF FLAG 2 = 0
   THEN
      INC FLAG 2, 1
      PRINT_TILE_AT (2, 21) = 29
      SOUND 6
      SET TILE (13, 5) = 0

      # comprobamos si tenemos el resto de objetos
      EXTERN 20
   END
END
y modificamos el fichero extern.h para que quede así

Código: Seleccionar todo

// MT Engine MK2
// Copyleft 2014 the Mojon Twins

// extern.h
// External custom code to be run from a script

void do_extern_action (unsigned char n) {

   switch ( n ) {
      case 20:  // Comprueba las flags para saber si tenemos todos los objetos
         if ( flags[2] && flags[3] && flags[4] && !flag[5] ) {
            flags[5]=1;            // ponemos la FLAG 5 = 1
            peta_el_beeper (7);      // lo mismo que hacer por script SOUND (7)
            peta_el_beeper (7);
            // Aquí tendriamos que hacer la llamada al texto que queramos mostrar...
         }
         break;
   }

}
}
Por supuesto no olvidarse de activar el uso de EXTERN en config.h.

Si al final no usas EXTERN y quieres hacerlo todo desde el script la solución es muy parecida (y habría que comprobar si ocuparía más o menos, ¡cada byte cuenta! yo a bote pronto no tengo ni idea de cual es mejor sin compilar ambas opciones y mirar directamente el tamaño del tap XD). Esta consistiría nuevamente en eliminar la parte de ENTERING ANY y hacer las comprobaciones mediante script en cada pantalla de los objetos esos. Mejor un ejemplo, otra vez con la pantalla del primer objeto.

Código: Seleccionar todo

PRESS_FIRE AT SCREEN 17
   # Si lo cojemos, añadirlo a lista
   IF PLAYER_TOUCHES 13, 5
   IF FLAG 2 = 0
   THEN
      INC FLAG 2, 1
      PRINT_TILE_AT (2, 21) = 29
      SOUND 6
      SET TILE (13, 5) = 0
   END
   
   IF PLAYER_TOUCHES 13, 5 ; estamos todavía "tocando" el objeto
   IF FLAG 5 = 0         ; y no hayamos cumplido la condición antes
   IF FLAG 2 = 1         ; pero ya lo hemos cogido el objeto
   IF FLAG 3 = 1         ; ya tenemos el obj 2 también
   IF FLAG 4 = 1         ; ya tenemos el obj 3 también
   THEN
      #TEXT DONE!_COME_BACK_TO_BASE
      SET FLAG 5, 1
      SOUND 6
      SOUND 7
   END
   
END
Última edición por elborra el Vie, 14 Ago 2015, 00:11, editado 1 vez en total.
Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Proyecto Aquanoids: el videojuego

Mensajepor elborra » Vie, 14 Ago 2015, 00:07

Justo acabo de caer que si no usas EXTERN habría una manera más eficaz de hacerlo mediante script y esta vez INC FLAG nos viene de perlas.

Código: Seleccionar todo

PRESS_FIRE AT SCREEN 17
   # Si lo cojemos, añadirlo a lista
   IF PLAYER_TOUCHES 13, 5
   IF FLAG 2 = 0
   THEN
      INC FLAG 2, 1
      PRINT_TILE_AT (2, 21) = 29
      SOUND 6
      SET TILE (13, 5) = 0
      INC FLAG 5, 1      ;cada vez que cogemos un objeto incrementamos la FLAG 5 en 1
   END
   
   IF PLAYER_TOUCHES 13, 5 ; estamos todavía "tocando" el objeto
   IF FLAG 5 = 3         ; significa que tenemos los 3 objetos
   THEN
      #TEXT DONE!_COME_BACK_TO_BASE
      INC FLAG 5, 1      ; volvemos a incrementar para que no se cumpla de nuevo la condición flag 5 = 3
      SOUND 6
      SOUND 7
   END
   
END

Obviamente en donde compruebas si se cumple la condicion para GANAR tendrás que hacerlo con

Código: Seleccionar todo

IF FLAG 5 = 4
en lugar de

Código: Seleccionar todo

IF FLAG 5 = 1


Como ves hay muchas maneras de resolver el problema, seguro que hay incluso maneras más sencillas, el motor de clausulas es una maravilla :D

Volver a “MK2”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado