domingo, 10 de febrero de 2008

brújula

Voy a poner una brújula gráfica que indique las salidas de cada localidad. Para aligerar en la medida de lo posible la aparición de vocabulario repetitivo en las descripciones: cosas como "puedes ir hacia el Norte..." o un listado de salidas no requerido por el jugador con el comando pertinente.

Aunque en muchos casos será inevitable que aparezcan puntos cardinales en la descripción. De otro modo, si por ejemplo a lo lejos vemos un molino, sin más, podríamos tener que pasar por otros sitios antes de -por descarte- saber que la dirección que conduce a él es noroeste.

Para lugares sin referencias lejanas ni caminos, como un bosque cerrado, funcionará bien.
-Ahorra texto repetitivo en la descripción.
-Ahorra tener que escribir el comando salidas.
-Ahorra jugar a los coches de choque para buscar salidas.

Primero hice un par de diseños que se basaban en dibujar un centro y en torno a él las diversas ramas de las direcciones, una a una en función de que existieran esas salidas.

Pero finalmente he optado por poner un gráfico con la brújula entera, con todos los puntos cardinales, arriba y abajo, y entrar y salir; y oscurecer con PNG transparentes las salidas no disponibles. Es más sencillo y me permite cambiar los colores de la brújula editando un único gráfico.

Para ello creo una ventana gráfica nueva en un lateral: gg_ventana2, y aprovecho la librería NewFlags.h, que por otro lado voy a utilizar para más cosas.
La función que dibuja la brújula será llamada cada vez que se repinten los gráficos, al cambiar de localidad, o manualmente cuando un evento modifique las salidas.

[dibujabrujula i loc;
loc = location;

!dibujo la brújula entera:
glk_image_draw(gg_ventana2,GRAF_brujula_base,5,15);

!pongo a 0 los flags que almacenarán las salidas viables:
for(i=10:i<22:i++)ClearFlag(i);

!busco direcciones viables... y VISIBLES,
!parte de código copiado de la rutina de listado de salidas de la librería en español:
if(location~=TheDark)
objectloop (i in compass)
{
if (loc provides (i.door_dir) && metaclass (loc.(i.door_dir)) ~= nothing or string)
{
switch(i){!sw
nw_obj: setflag(15);
ne_obj: setflag(14);
sw_obj: setflag(17);
se_obj: setflag(16);

n_obj: setflag(10);
s_obj: setflag(11);
e_obj: setflag(12);
w_obj: setflag(13);

in_obj: setflag(18);
out_obj: setflag(19);
u_obj: setflag(20);
d_obj: setflag(21);
}!sw
}
}

!sombreo las direcciones no disponibles con diversos PNG trasnparentes
!ajustados a las formas de cada parte de la brújula:
for(i=10:i<22:i++){
if(Flagoff(i))switch (i){!sww
10: glk_image_draw(gg_ventana2,GRAF_brujula_sombra0,65,14);
11: glk_image_draw(gg_ventana2,GRAF_brujula_sombra0,65,94);
12: glk_image_draw(gg_ventana2,GRAF_brujula_sombra90,4,75);
13: glk_image_draw(gg_ventana2,GRAF_brujula_sombra90,84,75);

14: glk_image_draw(gg_ventana2,GRAF_brujula_sombra45,83,34);
15: glk_image_draw(gg_ventana2,GRAF_brujula_sombra135,25,34);
16: glk_image_draw(gg_ventana2,GRAF_brujula_sombra135,83,93);
17: glk_image_draw(gg_ventana2,GRAF_brujula_sombra45,25,91);

18: glk_image_draw(gg_ventana2,GRAF_brujula_sombracuad,162,95);
19: glk_image_draw(gg_ventana2,GRAF_brujula_sombracuad,162,132);
20: glk_image_draw(gg_ventana2,GRAF_brujula_sombracuad,162,16);
21: glk_image_draw(gg_ventana2,GRAF_brujula_sombracuad,162,55);
}!sww
}
rtrue;
];

No hay comentarios: