Página 9 de 15

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 15:01
por na_th_an
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.

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 15:17
por na_th_an
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.

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 17:24
por elborra
$this->bbcode_second_pass_quote('NeilParsons', ':')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:
$this->bbcode_second_pass_code('', '# 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:$this->bbcode_second_pass_code('', '#define OBJECT_COUNT 1')por$this->bbcode_second_pass_code('', '#define OBJECT_COUNT 0') y ya si quieres por tenerlo bien comentado cambias en el script$this->bbcode_second_pass_code('', '# 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.

$this->bbcode_second_pass_quote('NeilParsons', 'S')eguí 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?
$this->bbcode_second_pass_quote('na_th_an', '[')b]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.
$this->bbcode_second_pass_quote('na_th_an', 'E')l 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.

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 17:52
por elborra
Na, una tontería era na_th_an.
$this->bbcode_second_pass_code('', '' 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.

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 19:59
por NeilParsons
$this->bbcode_second_pass_quote('elborra', 'U')mmmm, 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:

$this->bbcode_second_pass_code('', '# 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í:

$this->bbcode_second_pass_code('', '# 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.

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 20:04
por NeilParsons
YES I CAN! :picha: :picha: :picha:

Aquanoids-4.PNG
Aquanoids-4.PNG (34.7 KiB) Visto 8856 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

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 21:09
por elborra
$this->bbcode_second_pass_quote('NeilParsons', 'L')a 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

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 22:32
por NeilParsons
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.

$this->bbcode_second_pass_code('', '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:

Re: Proyecto Aquanoids: el videojuego

Publicado: Jue, 13 Ago 2015, 23:48
por elborra
Exacto con añadir IF FLAG 5 = 0 ya no se volvería a repetir.
$this->bbcode_second_pass_code('', '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
$this->bbcode_second_pass_code('', '
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í$this->bbcode_second_pass_code('', '// 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.
$this->bbcode_second_pass_code('', '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')

Re: Proyecto Aquanoids: el videojuego

Publicado: Vie, 14 Ago 2015, 00:07
por elborra
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.
$this->bbcode_second_pass_code('', '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$this->bbcode_second_pass_code('', 'IF FLAG 5 = 4')en lugar de$this->bbcode_second_pass_code('', '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