! Demo de TriEspacio.h ! Esta simple aventura muestra cómo trabajar con la librería triespacio.h ! ======================================================================= ! ! Créditos. ! ! Constantes Constant Historia "La gema Karssakis^"; Constant Titular "Demostración de la librería TriEspacio^^"; ! Número de serie Serial "020726"; ! Constantes para modificar el comportamiento del parser Constant PUNTUACION_MAX 3; Constant ADMITIR_COMANDO_SALIDAS; Constant HAY_CURIOSIDADES; ! Incluir la librería (en parte) ! Estas líneas están presentes en cualquier aventura Include "EParser"; Include "Acciones"; [curiosidades; "^ Este pequeño juego sin argumento aparente ha sido realizado como demostración de la librería TriEspacio.h, realizada por mí, Baltasar, el arquero.^^ Este ejemplo es realmente muy limitado. Sólo se permiten desplazamientos en 2 dimensiones, y en realidad, sólo se realizan en una (vertical, o eje 'y').^^ Se trata de crear un mapa 10x10x1, en el que la barca se mueve, aunque sólo se permite avanzar hacia el norte, remando.^^ 'remar' no se ha implementado como una acción, sino como un sinónimo de la brújula, dirección norte, que es hacia donde se desea ir. En realidad, no creo que ésta sea la mejor solución, lo más correcto sería implementar la acción 'remar'.^^ La descripción del bote es dinámica y cambia según lo que se avance remando.^^ ¿Cómo se utiliza la librería TriEspacio? Primero, hay que crear un objeto que funcione como mapa por donde se mueve la barca. Por ejemplo:^ espacio mar^ private^ maxx 10,^ maxy 10,^ maxz 1^ ;^ Ya está. Obsérvese que el mapa ocupa muy poca memoria. Nada de WORDSIZE * 100 bytes, como se podría esperar, sino sólo WORDSIZE * 3 = 12 bytes.^^ Entonces, precisamos un 'ente' que se mueva por el mapa. Debe ser una localidad, y no un objeto dentro de otro objeto. Obsérvese que en este ejemplo utilizamos un objeto estático barca que es el que canaliza la acción hacia la barca real.^^ ente bote ~Bote~^ private^ mapa mar^ with^ x 5,^ y 0,^ z 0^ ;^ Vale, ya tenemos un ente que se mueve con n,s,e,o,ne,no,se,so y arriba/abajo por el mapa tridimensional. El bote se sitúa en el límite inferior del mapa, en la mitad del eje x, el ~ancho~.^^ Si se observa el código, eliminamos todas las opciones excepto ~norte~. La barca sólo puede moverse por tanto hacia el norte, hacia la isla. 'remar' es sinónimo de ~norte~.^^ La librería TriEspacio proporciona una serie de ~ganchos~:^ siMueve(x:booleano); implementando este método en un objeto de la clase ente (por ejemplo, el bote), podemos hacer algo después de que el bote se mueva (o no se mueva, que es lo que indica x). Cuando el bote no se mueve es pq ha encontrado un obstáculo.^ siXesMaxX()^ siYesMaxY()^ siZesMaxZ() se activan, en un objeto de la clase espacio (el mar, en el ejemplo), cuando alguna de las tres coordenadas llegan a sus máximos. Si se dejan sin definir, no hacen nada, claro. También se activan en los objetos de la clase ente.^^ Esto es lo básico. Las aplicaciones son realmente infinitas. La librería permite manejar también obstáculos y zonas. Más información en triespacio.h.^^ (c) 2001,2002 Baltasar, el arquero. baltasarq@@64yahoo.es^^ "; ]; Include "TriEspacio"; ! Incluimos la librería ! Definición de localidades !--------------------------------------------------------------------- ! Localidad de inicio !--------------------------------------------------------------------- espacio mar private maxx 10, maxy 10, maxz 1, with siYesMinY [; if (self.dev_UltMovil() == tibu) tibu.girar(); if ((self.dev_UltMovil() == tibu) && (barca.y < 2)) print "Ves aterrorizado como el tiburón se acerca a la costa, para darse la vuelta y nadar hacia la isla.^"; rtrue; ], siYesMaxY [; if (self.dev_UltMovil() == tibu) tibu.girar(); if ((self.dev_UltMovil() == tibu) && (barca.y > (self.devMaxY() - 2))) print "Repentinamente, ves como el tiburón se acerca a la costa, para darse la vuelta y nadar hacia la playa de la que has venido.^"; rtrue; ], ; Object playa "Playa" with irrelevante 'rocas' 'roca', descripcion "La playa de fina arena aurífera se extiende más allá de lo que abarcan tus ojos, al este y al oeste. El mar se sitúa delante de tí, al norte, a la vez que la isla Carnack, de la que te separa un buen trecho. Sabes que para continuar, debes llegar a la isla ... ", al_n "Sería mejor utilizar el bote ...", antes [; subir: <>; entrar: jugadorA(barca, 2); rtrue; ] has femenino luz transparente; object -> objBarca "barca" with nombre_f 'barca' 'chalupa', nombre_m 'bote' 'remos', genero G_FEMENINO, descripcion "Es un bote de remos, abandonado en la playa. Parece en buen estado.", antes [; coger: "La barca pesaría demasiado ..."; meterse: <>; entrar: jugadorA(barca, 2); rtrue; ] has estatico ; !--------------------------------------------------------------------- ! Localidad de la barca que se mueve por el mar !--------------------------------------------------------------------- ente tibu "Tiburón" private avance true, mapa mar with girar [; self.avance = ~~(self.avance); if (self.avance) self.movimientoRel(0); else self.movimientoRel(1); ], nombre 'tiburon' 'escualo', descripcion "La aleta dorsal del tiburón asoma amenazadoramente por encima del agua.", x 5, y 0, z 0, accel 2, daemon [; if (self.avance) self.movimientoRel(0); else self.movimientoRel(1); ! print "tibu en ",self.y, "^"; ! print "barca en ",barca.y, "^"; ], siMueve [ mov; if (mov) { if (( tibu.y == barca.y || tibu.y == (barca.y - 1) || tibu.y == (barca.y + 1) ) && tibu.y != 0 && tibu.y < (self.mapa.devMaxY() -2)) "El tiburón aparece con su amenazadora aleta dorsal ... y ... ¡pasa de largo!"; } ] ; !--------------------------------------------------------------------- ! Localidad de la barca que se mueve por el mar !--------------------------------------------------------------------- ente barca "Barca" private mapa mar, avance true, with siYesMaxY [; print "^Has llegado a la isla Carnack ... el fondo del bote está varado en la playa ...^"; rtrue; ], siYesMinY [; print "^Has llegado a la playa de nuevo ... el fondo del bote está varado en la playa ...^"; rtrue; ], girar [; self.avance = ~~(self.avance); print "Utilizando un remo, haces virar la barca ..."; <>; ], avanzar [; if (self.avance) <>; else <>; ], nombre 'barca' 'bote', descripcion [; print "Sentado en el bote de remos ...^"; if (self.avance == 1) { if (self.y < 4) print "Estás todavía más cerca de la playa que de la isla ... la isla se ve en la lejanía, con su selva verde sobre la nívea playa ...^"; else if (self.y<7) print "Estás a medio camino entre la playa y la isla ... la isla se ve en la lejanía, con su selva verde sobre la nívea playa ...^"; else if (self.y>=9) print "Estás muy cerca de la isla ...^"; } else { if (self.y < 4) print "Estás muy cerca de la isla ...^"; else if (self.y<7) print "Estás a medio camino entre la playa y la isla ... la isla se ve en la lejanía, con su selva verde sobre la nívea playa ...^"; else if (self.y>=9) print "Estás todavía más cerca de la playa que de la isla ... la isla se ve en la lejanía, con su selva verde sobre la nívea playa ...^"; } "El mar lame las bordas del bote ..."; ], x 5, y 0, z 0, al_e [; return self.porAhiNo(); ], al_o [; return self.porAhiNo(); ], al_ne [; return self.porAhiNo(); ], al_no [;return self.porAhiNo(); ], al_se [;return self.porAhiNo(); ], al_so [;return self.porAhiNo(); ], arriba [;return self.porAhiNo(); ], abajo [; <>; ], siMueve [ mov; if (mov) { print "Empujas los remos con tus doloridos brazos ...^"; if (self.y<4) "Te mueves suavemente ... todavía estás cerca de la costa ..."; else if (self.y<7) "Estás en el medio de la travesía ... te esfuerzas un poco más ..."; else if (self.y<9) "Ya casi estás llegando ..."; } else "El bote se mece suavemente, imperceptiblemente ... pero no se aprecia movimiento ..."; return true; ], antes [; ir: if (uno == obj_n) { if (~~self.avance) self.girar(); } else if (uno == obj_s) { if (self.avance) self.girar(); } rfalse; bajar: <>; entrar: "Ya estás en el bote ... "; salir: if (self.y==0) { print "Bajas del bote ...^"; jugadorA(playa, 2); rtrue; } else if (self.y < 9) { print "^Estabas muy decidido, pero ... de repente recuerdas que ... ¡no sabes nadar!"; banderafin = 1; rtrue; } else { print "Bajas a la playa de la isla ...^"; move objBarca to isla; jugadorA(isla, 2); puntuacion++; rtrue; } girar: barca.girar(); rtrue; ], porAhiNo [; "Debes llegar hasta la isla ... llegar como sea ... sin entretenerte ..."; ] has femenino luz ; object -> objbarca2 "Barca" with nombre_f 'barca' 'chalupa', nombre_m 'bote' 'remos', genero G_FEMENINO, antes [; examinar: <>; coger, dejar: "Olvídalo."; ] has estatico oculto; !--------------------------------------------------------------------- ! Localidad de la isla !--------------------------------------------------------------------- Object isla "Isla" with irrelevante 'rocas' 'roca' 'arena' 'agua' 'mar' 'aguas' 'arenas', descripcion "La playa de fina arena aurífera se extiende más allá de lo que abarcan tus ojos, al este y al oeste. El mar se sitúa trás de tí, al sur por fín ... estás en la isla Carnack ... La selva, está al norte, y en el medio, vislumbras el templo ... ", al_n templo, antes [; subir: <>; entrar: jugadorA(barca, 2); rtrue; ] has luz; object -> palmera "palmera" with nombre 'palmera', descripcion "Es una palmera alta y estilizada. Se mueve salvajemente con el viento. Te atrae de alguna forma ...", antes [; meterse: puntuacion++; "No puedes subir. Intuyes que sería un fracaso."; ] has estatico femenino; !--------------------------------------------------------------------- ! Localidad del templo !--------------------------------------------------------------------- Object templo "Templo" with descripcion "Has entrado en el templo de Konshu ... todo está oscuro, aunque aprecias varias inscripciones en las muros ... Unas escaleras agrietadas bajan hacia el sótano. ", al_s isla, abajo sotano has luz; !--------------------------------------------------------------------- ! Localidad del sotano !--------------------------------------------------------------------- Object sotano "Sotano" with descripcion "En un altar, la gema se exhibe en todo su esplendor. Las escaleras conducen arriba, al templo, de nuevo.", arriba templo, has luz; object -> gema "gema Karssakis" with nombre 'gema' 'diamante' 'brillante' 'karssakis' 'joya', descripcion "La gema Karssakis, el objetivo de tu periplo. Las tonalidades verdes y rojas y sus destellos irisados te obnubilan.", antes [; coger: print "Por fín has logrado tu objetivo ... la gema Karssakis.^^ Ahora, te pagarán una fortuna en el museo por esta pieza. ¡Serás rico! "; puntuacion++; banderafin = 2; rtrue; ] has femenino ; ! Después de las localidades, incluimos la gramática ! Este include siempre está aquí en todos los programas Include "Gramatica"; [remarSub; barca.avanzar(); rtrue; ]; Extend 'da' first * 'la' 'vuelta' -> girar ; Verb 'rema' * -> remar ; Verb 'vira' = 'gira'; !--------------------------------------------------------------------- ! Inicialización !--------------------------------------------------------------------- [ Inicializar; ! Poner al jugador en su sitio localizacion = playa; ! Mover los objetos que van a ir con el jugador ArrancarDaemon(tibu); ! Descripción inicial "Agotado, llegas al que parece será el último escenario de tu aventura ... la persecución de la joya Karssakis."; ]; !------------------------------------------------------------- ! Decorados !------------------------------------------------------------- Include "Decorado"; class decoradoEscenaPlaya class Decorado with describir 'palmeras' "Sí, unas bellas palmeras." G_FEMENINO 'arena' "... parece oro ..." G_FEMENINO 'mar' "Ahh ... el proceloso mar ... debe estar fresquito." 0 'agua' "Parece estar fresquita." 0 'carnack' "La isla está al norte, lejos ..." G_FEMENINO 'isla' "La isla está al norte, lejos ..." G_FEMENINO 'sol' "Paso de mirar al sol directamente." 0 'playa' "La playa mola. Ya es tarde y está vacía." G_FEMENINO 'pino' "Al sur, ves unos cuantos." 0 'pinos' "Hay varios hacia el sur." G_PLURAL 'árboles' "Están lejos, al sur." G_PLURAL 'árbol' "Lejos, hacia el sur." 0 , antes [; coger: "No creo que eso sirva de mucho."; ] ; class decoradoEscenaTemplo class Decorado with describir 'inscripciones' "Son bellas inscripciones que no conoces." G_PLURAL 'runas' "Bellas runas que no conoces." 0 'pared' "Las paredes están cubiertas de inscripciones ..." G_FEMENINO 'muro' "Las paredes están cubiertas de inscripciones ..." G_FEMENINO 'paredes' "Las paredes están cubiertas de inscripciones ..." G_FEMENINO + G_PLURAL 'muros' "Las paredes están cubiertas de inscripciones ... en uno de los muros hay también unas runas ..." G_FEMENINO + G_PLURAL 'escaleras' "La escalera conduce al sótano." G_FEMENINO + G_PLURAL 'escalera' "La escalera conduce al sótano." G_FEMENINO 'peldanos' "Los peldaños bajan hacia la oscuridad ..." G_PLURAL 'escalones' "Los peldaños bajan hacia la oscuridad ..." G_PLURAL , antes [; coger: "Prefieres no tocar ciertas cosas sagradas ..."; ] ; decoradoEscenaPlaya DecoradoLaPlaya playa; decoradoEscenaPlaya DecoradoLaBarca barca; decoradoEscenaPlaya DecoradoLaIsla isla; decoradoEscenaTemplo DecoradoTemplo templo; decoradoEscenaTemplo DecoradoSotano sotano;