Diseñando motor de Items para la Churrera

For all things Churrera. ¿Estás haciendo un juego? ¿quieres proponer un cambio? ¿tienes alguna duda? ¡Cuéntanoslo!

Moderador: na_th_an

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

Diseñando motor de Items para la Churrera

Mensajepor na_th_an » Lun, 24 Feb 2014, 17:30

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

Código: Seleccionar todo

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:

Código: Seleccionar todo

IF ITEM n = t
IF ITEM n <> t

Comprueban que en el espacio "n" está o no el objeto de tile "t".

Código: Seleccionar todo

IF SEL_ITEM = t

Comprueba que en el espacio seleccionado por el selector está el objeto de tile "t"

Y los siguientes comandos:

Código: Seleccionar todo

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.

Código: Seleccionar todo

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:

Código: Seleccionar todo

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:

Código: Seleccionar todo

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!

Código: Seleccionar todo

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.
Como diría Rorshach: "Urm..."
Nightwolf
Mensajes: 215
Registrado: Sab, 15 Oct 2011, 11:24

Re: Diseñando motor de Items para la Churrera

Mensajepor Nightwolf » Lun, 24 Feb 2014, 17:46

Ñ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?
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Diseñando motor de Items para la Churrera

Mensajepor na_th_an » Lun, 24 Feb 2014, 17:49

Nightwolf escribió:Ñ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.

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.

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


No hay nada que te impida hacer esto :)

Otra 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.
Como diría Rorshach: "Urm..."
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Diseñando motor de Items para la Churrera

Mensajepor na_th_an » Lun, 24 Feb 2014, 18:00

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:

Código: Seleccionar todo

ENTERING GAME
    IF TRUE
    THEN
        SET FLAG 5 = 38
    END
END


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

Código: Seleccionar todo

ENTERING SCREEN 5
    IF TRUE
    THEN
        SET TILE AT (8, 8) = #5
    END
END


Y detectamos para intercambiar:

Código: Seleccionar todo

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.
Como diría Rorshach: "Urm..."
Avatar de Usuario
Jarlaxe
Mensajes: 212
Registrado: Jue, 09 Ene 2014, 13:44

Re: Diseñando motor de Items para la Churrera

Mensajepor Jarlaxe » Lun, 24 Feb 2014, 20:51

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:
Nightwolf
Mensajes: 215
Registrado: Sab, 15 Oct 2011, 11:24

Re: Diseñando motor de Items para la Churrera

Mensajepor Nightwolf » Lun, 24 Feb 2014, 21:54

Joer como mola :)

¿Cómo se pueden implementar todo eso? :) :)
Avatar de Usuario
son_link
Mensajes: 467
Registrado: Mar, 01 Oct 2013, 11:49
Ubicación: Atlantis, Galaxia Pegaso
Contactar:

Re: Diseñando motor de Items para la Churrera

Mensajepor son_link » Lun, 24 Feb 2014, 22:39

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
LOAD TAPE ERROR
Imagen
Avatar de Usuario
elborra
Mensajes: 209
Registrado: Dom, 12 Ene 2014, 14:37

Re: Diseñando motor de Items para la Churrera

Mensajepor elborra » Mar, 25 Feb 2014, 02:44

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
Avatar de Usuario
na_th_an
Mensajes: 26412
Registrado: Vie, 09 Ene 2009, 12:18

Re: Diseñando motor de Items para la Churrera

Mensajepor na_th_an » Mar, 25 Feb 2014, 08:06

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 :)
Como diría Rorshach: "Urm..."
Nightwolf
Mensajes: 215
Registrado: Sab, 15 Oct 2011, 11:24

Re: Diseñando motor de Items para la Churrera

Mensajepor Nightwolf » Mar, 25 Feb 2014, 12:16

Guay, ¡qué ganas de ponerle la zarpa encima! :)

Volver a “La Churrera”

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados