Página 1 de 5

Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 17:30
por na_th_an
Queremos conseguir que pueda haber un pequeño inventario en pantalla y poder seleccionar un objeto de él, y además queremos que los objetos que compongan el inventario no sean fijos y que podamos saber, desde el script, qué objeto hay seleccionado.

Veamos, la idea es diseñar el sistema de items de forma que sea lo más funcional posible *pero* implique añadir el menor código posible. Siempre vamos de uñas con la memoria y esto es primordial. Hay veces que haciendo el sistema menos amigable para el usuario logramos que lo sea mucho más para la máquina, y tratando con un Spectrum está claro cual es el camino que hay que seguir.

He estado pensando un buen rato y se me ocurre un sistema que implica poquísimo código pero que puede llegar a ser muy potente, si lo combinamos con los flags y un poco de cerebro:

- En una sección inicial del script, vamos a definir "el itemset" (hay que ponerle nombres a las cosas, aunque sean nombres tan chungos como este): cuantos espacios tiene, dónde se colocan, y como se distribuyen los objetos. Algo así:

$this->bbcode_second_pass_code('', 'ITEMSET
# Número de huecos:
SIZE 6

# Posición x, y
LOCATION 1, 21

# Horizonta/vertical, espaciado
DISPOSITION HORZ, 3

# Color y caracteres para pintar el selector
SELECTOR 66, 8, 9

# Flag que contiene qué hueco está seleccionado
FLAG 10
END')

- Un objeto se representa por su tile. Si tenemos una corona en el tile 10, el objeto corona será el 10. Si en un hueco del inventario está el 10, significa que en ese hueco está la corona. El valor 0 siempre representará un hueco vacío. Esto simplifica el código una barbaridad.

- En el script habrá cambios. ITEM n = t significa que en el hueco "n" está el objeto representado por el tile t. Definimos, pues, las siguientes condiciones:

$this->bbcode_second_pass_code('', 'IF ITEM n = t
IF ITEM n <> t')
Comprueban que en el espacio "n" está o no el objeto de tile "t".

$this->bbcode_second_pass_code('', 'IF SEL_ITEM = t')
Comprueba que en el espacio seleccionado por el selector está el objeto de tile "t"

Y los siguientes comandos:
$this->bbcode_second_pass_code('', 'SET ITEM n = t')
Establece en el hueco n el tile t. Obviamente, para quitar un objeto del hueco n, pondremos un 0.

Hay una limitación, por tanto, en el número de objetos que puede llevar el personaje a la vez. Con un poco de cabeza, como he dicho, se puede gestionar esto muy bien, y con un mínimo de código añadido al motor tenemos una herramienta bastante potente. Todo esto hay que combinarlo con los flags para tener funcionalidad completa. Con los ITEMs solo podemos saber si tenemos o no un ITEM en el inventario, pero no si se ha usado ya. Para eso necesitamos los flags.

¿Cómo se usa esto? Pongamos un ejemplo.

Imaginad que en la pantalla 6 tenemos un objeto "corona", representado por el tile 33, y lo tenemos en (7, 7). Además, el flag que indica su estado es el 3, que valdrá 0 cuando aún no lo hayamos cogido ni nada, para pintarlo en la pantalla.

$this->bbcode_second_pass_code('', 'ENTERING SCREEN 6
IF FLAG 3 = 0
THEN
SET TILE (7, 7) = 33
END
END')

Vamos a gestionar el hecho de cogerlo. Podemos hacerlo en modo básico o en modo virguero. Veamos el modo básico primero. En el modo básico asignamos "a mano" un hueco fijo para cada item. La corona la colocaremos en el hueco 2:

$this->bbcode_second_pass_code('', 'PRESS_FIRE AT SCREEN 6
IF PLAYER_TOUCHES (7, 7)
IF FLAG 3 = 0
THEN
SET FLAG 3 = 1
SET TILE (7, 7) = 0
SET ITEM 2 = 33
END
END')
El juego con el flag 3 es simplemente para que no vuelva a dibujarse. Cuando el flag 3 valga 1 no se volverá a pintar el objeto al volver a entrar en la pantalla, ni intentaremos cogerlo de nuevo. Por lo demás, lo que se hace es hacer que en el hueco 2 esté el objeto 33.

Imaginad que en la pantalla 12 tenemos que usarlo en la coordenada 5, 8. Pues habrá que comprobar que el item seleccionado es el 33:
$this->bbcode_second_pass_code('', 'PRESS_FIRE AT SCREEN 12
IF SEL_ITEM = 33
THEN
SET ITEM 2 = 0
# mas cosas
END
END')

Si el objeto seleccionado es el 33 (que sólo podrá ocurrir si antes lo colocamos en el hueco 2), lo quitamos del inventario (poniendo un 0 en el slot 2) y luego hacemos más cosas.

El modo virugero es que el objeto vaya al hueco seleccionado. Para eso usamos la indirección que permite el motor de scripting con el operador #. Recordad que estamos usando el flag 10 para representar el hueco seleccionado. Juguemos con eso. Además, habrá que comprobar que el hueco está libre!

$this->bbcode_second_pass_code('', 'PRESS_FIRE AT SCREEN 6
IF PLAYER_TOUCHES (7, 7)
IF FLAG 3 = 0
IF FLAG 10 <> 0
THEN
# Mal! el hueco no está libre!
SOUND 2
END

IF PLAYER_TOUCHES (7, 7)
IF FLAG 3 = 0
IF FLAG 10 = 0
THEN
SET FLAG 3 = 1
SET TILE (7, 7) = 0
SET ITEM #10 = 33
END
END')

¿Qué hacemos? Pues colocar el objeto de tile 33 (nuestra corona) en el espacio seleccionado, que no es más que el que está almacenado en el flag 10 (recordad que #10 significa "el valor del flag 10").

Para comprobar que lo tenemos, pues lo mismo.

¿Qué os parece? ¿Dudas? ¿Algo que comentar? Si mola, lo haré exactamente como he descrito.

Re: Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 17:46
por Nightwolf
Ñam, está rico. :) Pero espero un ejemplo porque creo que me pierdo un poco jeje

Te comento los problemas que me he encontrado e ideas, a ver que todo eso esté cubierto:

1) La mayoría de las veces, cojo los objetos, van al inventario y ahí se quedan. -> No hay mucho problema.

2) Luego, puede suceder que hay objetos que se usan, y desaparecen, dejando un bonito hueco en nuestro inventario. -> Ese hueco libre, debería ser reutilizable por el bien del mundo reciclable.

3) Estan los que hagan un intercambio de objetos. Dejo el objeto en el suelo y cojo el que hay. -> Esto permitiría emular al los Everyone's a Wally por ejemplo :)

4) Objetos apilables. Se puede tener más de uno (por ejemplo, el sucio dinero)

Otra opcion que veo muy interesante: ¿El objeto requiere del boton de "usar" para ser recogido, o se pueden recoger nada más ser tocado, como si fuese un objeto colecionable?

Re: Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 17:49
por na_th_an
$this->bbcode_second_pass_quote('Nightwolf', 'Ã')‘am, está rico. :) Pero espero un ejemplo porque creo que me pierdo un poco jeje

Te comento los problemas que me he encontrado e ideas, a ver que todo eso esté cubierto:

1) La mayoría de las veces, cojo los objetos, van al inventario y ahí se quedan. -> No hay mucho problema.

2) Luego, puede suceder que hay objetos que se usan, y desaparecen, dejando un bonito hueco en nuestro inventario.


Eso es.

$this->bbcode_second_pass_quote('', '3')) Estan los que hagan un intercambio de objetos. Dejo el objeto en el suelo y cojo el que hay. -> Esto permitiría emular al los Everyone's a Wally por ejemplo :)


Esto lo tienes que programar tú. Hacer intercambio de objetos con un flag es fácil y si quieres ver cómo se hace puedes bajarte los fuentes de Cheril the Goddess. La única diferencia es que aquí seleccionamos cuál intercambiar. En el Cheril The Goddess simplemente teníamos un flag con el objeto que llevábamos, y luego había un flag por cada "contenedor" donde intercambiar o dejar el que ya teníamos.

$this->bbcode_second_pass_quote('', '4')) Objetos apilables. Se puede tener más de uno (por ejemplo, el sucio dinero)


No hay nada que te impida hacer esto :)

$this->bbcode_second_pass_quote('', 'O')tra opcion que veo muy interesante: ¿El objeto requiere del boton de "usar" para ser recogido, o se pueden hacer inmediatos, como si fuese un objeto colecionable?


Se pueden hacer inmediatos usando SET_FIRE_ZONE, pero no de otra forma. Ten en cuenta que estoy intentando añadir la menor cantidad de código posible al motor.

Re: Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 18:00
por na_th_an
Hmmm - para el intercambio de objetos necesitamos algo más que no había pensado. Necesitamos saber el número del objeto seleccionado y poder usarlo.

Se me ocurre una cosa: ya tenemos un flag que indica qué hueco está seleccionado. Bien, podemos definir otro flag que indica qué objeto hay en el hueco seleccionado. Y con esto ya lo tenemos.

También necesitaremos un comando para forzar que se redibujen los tiles de los objetos que tenemos.

Imagina que en la pantalla 5, posición (8, 8) hay un objeto que podemos intercambiar. Vamos a usar el flag 5 para representar qué objeto hay en esa pantalla. Además, tenemos definido que el hueco seleccionado va en el flag 10, y que el objeto que hay en ese hueco va en el flag 11.

Al principio del juego, ponemos un objeto en la pantalla 5, representado por el flag 5. Por ejemplo, el que está en el tile 38:

$this->bbcode_second_pass_code('', 'ENTERING GAME
IF TRUE
THEN
SET FLAG 5 = 38
END
END')

Y en la pantalla 5, pintamos el objeto que sea:

$this->bbcode_second_pass_code('', 'ENTERING SCREEN 5
IF TRUE
THEN
SET TILE AT (8, 8) = #5
END
END')

Y detectamos para intercambiar:

$this->bbcode_second_pass_code('', 'PRESS_FIRE AT SCREEN 5
# Sólo si hay un objeto:
IF FLAG 5 <> 0
THEN
# Cambiamos el objeto de la habitación (valor del flag 5)
# por el objeto que hay en el hueco seleccionado (valor del flag 11)
SWAP 5, 11
SET TILE AT (8, 8) = #5
REDRAW_ITEMS
END
END')

Por ejemplo.

Re: Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 20:51
por Jarlaxe
Nathan... en serio tio... eres un pooooooooto genio! :shock:

Pero al loro! tu genialidad no es tanto como le das al coco para conseguir casi cualquier cosa (que también)
si no, la forma con la que consigues simplificar y hacerlo "entendible" para el resto de los mortales.

A veces pienso que la churrera no tiene más límite que la paciencia, maña e imaginación que se pueda invertir en ella.

Nath, te mereces un ojaldre salado! :lol:

Re: Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 21:54
por Nightwolf
Joer como mola :)

¿Cómo se pueden implementar todo eso? :) :)

Re: Diseñando motor de Items para la Churrera

Publicado: Lun, 24 Feb 2014, 22:39
por son_link
Mola la idea, pero estoy mas perdido que Wally en el Vicente Calderón :lol:
Estaría bien, por poner otro ejemplo, para poner llaves a lo Doom, que para abrir unas puertas necesitas tener las llaves de un determinado color para abrirlas

Re: Diseñando motor de Items para la Churrera

Publicado: Mar, 25 Feb 2014, 02:44
por elborra
Juas, una tarde/noche sin mirar el foro y me encuentro con esto...
A mi esto es lo que más me gusta de la programación, la busqueda de una solución lógica a un problema. La mayoría de las cosas que se plantean son relativamente faciles de implementar pero la adversidad está en la lucha entre la eficiencia y el espacio...

Yo sigo con mi parte de scripting (que voy uniendo a extern y cambios en el engine) y cada vez que cambio algo compilo y miro tamaño el tamaño del binario... a ver que ocupa menos (aunque sea un byte) ¿estoy enfermo? XD

Re: Diseñando motor de Items para la Churrera

Publicado: Mar, 25 Feb 2014, 08:06
por na_th_an
No, no estás enfermo :lol: Yo me he llegado a tirar una hora entera intentando recortar en el motor, y terminar con 18 bytes menos y celebrarlo como un triunfo :lol:

Todo esto lo tengo ya medio implementado. En cuanto tenga una versión "beta" del motor os la paso por si queréis usarla e ir depurando fallos. De todos modos, el sistema es internamente tan sencillo que no creo que haya demasiados bugs :)

Re: Diseñando motor de Items para la Churrera

Publicado: Mar, 25 Feb 2014, 12:16
por Nightwolf
Guay, ¡qué ganas de ponerle la zarpa encima! :)