001 000004 003 0 004 Pasillo a su paso por el vestíbulo principal 010 0&0&Te hallas en el pasillo que da acceso a las habitaciones del piso de arriba de la casa. Una barandilla de madera en bastante mal estado lo separa, en esta parte, del vestíbulo principal, y la luz entra por dos grandes ventanas en la pared norte.\n Una escalinata, hacia el sur, baja al vestíbulo principal, que se domina desde aquí.&0&1& La gran araña que sirve de iluminación a dicho vestíbulo está a tu altura.&1&1& En el techo se puede ver la cadena de la que colgaba la gran araña. &4294967296&4294967296&\n Una corriente de aire gélido te hace tiritar, aunque ya estabas prácticamente tiritando de miedo. Oyes un chirrido largo y estremecedor proveniente del este. 011 N@0003$0&0&Bajas por la desnuda escalinata.$30$0$0$0@0007$0&0&Te diriges hacia el oeste por el pasillo.$30$0$0$0@0008$0&0&Te diriges hacia el este por el pasillo.@NO@NE@SO@SE@AR@0003$0&0&Bajas por la desnuda escalinata.$30$0$0$0 012 0004$0&0&Subes por la escalinata. Los trozos de pintura del suelo crujen a tu paso.$30$escalinata&escaleras&vestibulo&vestíbulo&escalera$0$0$0@0@0@0@0@0 030 ventanas$ventana$ventanal$ventanales$Los opacos cristales cubiertos de polvo apenas dejan ver nada. Ves algunos árboles sin hojas y, más lejos, colinas.@árboles$hojas$ramas$colinas$lejos$Los polvorientos cristales no dejan ver muchos detalles. En todo caso, nada de eso te va a ayudar a cumplir tu misión.@polvo$Es polvo estándar, aunque en ingentes cantidades.@barandilla$barandillas$La barandilla está en muy mal estado. Hay partes donde simplemente no está, y en otras la madera está tan podrida que seguramente se derrumbaría si la tocaras.@vestibulo$vestíbulo$Desde aquí se domina todo el vestíbulo principal, al que se accede por la escalinata. Puedes ver el suelo polvoriento de baldosas ajedrezadas, el hueco de la puerta que conduce al zaguán, y las puertas al oeste y al este.@escalinata$escalera$escaleras$escalones$escalinata$escalera$escaleras$escalones$Es una magnífica escalinata de mármol, como sólo se ven en grandes edificios. Recta y de un solo tramo, los dos escalones inferiores son más anchos que el resto y de bordes redondeados. Las barandillas a ambos lados hacen un ángulo al llegar arriba, de modo que también separan el pasillo del vestíbulo, abajo. Unas marcas bien visibles indican que en otro tiempo había una alfombra sobre la escalera; pero ahora sólo hay polvo y pintura caída del techo.@araña$lámpara$lampara$0&1&Desde aquí puedes ver la araña en todo su esplendor. Es una magnífica lámpara que cuelga del techo mediante una cadena metálica. A pesar del abundante polvo que la cubre, sus pequeñas piezas de cristal aún brillan un poco con la luz que entra de la ventana.&1&1&De la magnífica araña sólo quedan pequeños trozos de vidrio esparcidos por el suelo del vestíbulo y, en el techo, la cadena de la que colgaba. Te sientes un poco mal por lo que hiciste.@objeto$metalico$metálico$Desde aquí no puedes ver el objeto metálico, porque estaba hacia el lado opuesto de la gran lámpara. 099 030 mapa$techo$El mapa muestra el reino de Aetheria en toda su extensión. Una rosa de los vientos indica los puntos cardinales. La capital, donde te encuentras, aparece marcada en la zona central del mapa, algo al Oeste. Al Norte y al Noroeste están las ciudades de Vesperis y Alefos. El río que cruza Aetheria desemboca, tras varios meandros, al Sudoeste, en la ciudad de Asparia. Al Este están Vilinys y Vestaeris, esta última al lado de un lago en cuya orilla opuesta se encuentra Ustaeris, aún más al Este, cercana ya a la frontera. 099 099 Abajo vimos el objeto metálico, y aquí arriba es donde podemos lanzar la piedra... 099 080 .CODE command_lanzar: nop command_tirar: nop command_arrojar: nop nop ; load stone's ID into r0, lamp's ID into r1 loadi $r0, 30000001 loadi $r1, 30000002 load $Obj, args mov $a0, $r0 mov $a1, $r1 function referstoentities loadi $r2, true beq $v0, $r2, aversitienelapiedra noesloquequeremos: loadi $a0, ¿Lanzar qué contra qué? function newline function escribir function newline end aversitienelapiedra: load $Obj, player mov $a0, $r0 function hasitem beq $v0, $r2, tienelapiedra notienelapiedra: loadi $a0, ¿Lanzar qué contra qué? function newline function escribir function newline end tienelapiedra: nop ;Aquí es donde la función cambia... nop ;Let's see. nop nop ;Quitamos la piedra al jugador. function removeitem nop nop ;La ponemos en la habitación de abajo. loadi $Obj, 10000003 function giveitem nop nop ;Ponemos también la llave loadi $a0, 30000003 function giveitem nop nop ;Informamos al jugador loadi $Obj, 20000000 loadi $a0, Como estás a la misma altura que la araña, apuntas cuidadosamente con la piedra a la parte donde está unida a la cadena, y lanzas... function newline function escribir function newline function waitkeypress loadi $a0, ¡Aciertas de lleno! La piedra impacta en el punto exacto, con un ruido metálico, y... function escribir function newline function waitkeypress loadi $a0, ¡CRAAAAAAAAAAAAAAAAASSSSSSSSSSHHHHH! ¡La araña se derrumba, con un enorme estruendo! La malograda lámpara cae en el vestíbulo, los trocitos de cristal saltan por todas partes. function escribir function newline nop nop ;Cambiamos estados de habitación de abajo y habitación de arriba (para que no se muestren descripciones de la araña)... jugador más tarde, al coger llave (sangre) loadi $Obj, 10000003 loadi $a0, 1 function getstate or $a0, $a0, $v0 function setstate loadi $Obj, 10000004 loadi $a0, 1 function setstate nop end nop nop -- 1st time description code -- nop event_enterroom: nop load $Obj, player ;el jugador load $a0, this ;esta habitacion function getRelationshipState loadi $r0, 0 beq $v0, $r0, primeravez ;¿relación 0? primera vez que entras, setear a 1 segundavez: loadi $a1, 2 j update_state primeravez: loadi $a1, 1 update_state: nop ;setear el estado a lo que hemos decidido function setRelationshipState end 081 099 Me parece que este era el único uso serio del seudoensamblador EVA en la revisión 1... 099 Bueno, pues este 27 de Noviembre de 2002 (haciendo la revisión 2) lo overrideamos. Una pena. 084 /** parseCommand ( Player p , String verb , String arguments ) parsea comandos. Comando lanzar para piedra y lámpara. */ void parseCommand ( Player p , String verb , String arguments ) { if ( verb.equalsIgnoreCase("lanzar") || verb.equalsIgnoreCase("tirar") || verb.equalsIgnoreCase("arrojar") ) { piedra = world.getObject( 30000001 ); lampara = world.getObject( 30000002 ); //otros items lanzables (fallidamente) linterna = world.getObject ( 30000030 ); daga = world.getObject ( 30000011 ); Inventory invLampara = new Inventory(10000,10000); invLampara.addItem(lampara); List[] matches = p.getInventory().patternMatchTwo ( invLampara , arguments , false , false ); //matches: array 0..1 of vector; if ( matches[0].size() > 0 && (Item)matches[1].get(0) == lampara ) { if ( (world.getObject(10000003).getState() & 1) != 0 ) //ya hecho esto { p.escribirNegacion("\nYa has destrozado la pobre lámpara, no te ensañes más con ella...\n"); end(); } objLanzado = matches[0].get(0); //a ver que objeto intenta lanzar el jugador if ( objLanzado == piedra ) { //si señor, puzzle resuelto //esto eran 40 lineas en EVA assembler p.removeItem ( piedra ); world.getObject(10000003).addItem(piedra); //piedra a hab. de abajo world.getObject(10000003).addItem(world.getObject(30000003)); //llave p.escribirAccion("\nComo estás a la misma altura que la araña, apuntas cuidadosamente con la piedra a la parte donde está unida a la cadena, y lanzas...\n"); p.waitKeyPress(); p.escribirAccion("¡CRAAAAAAAAAAAAAAAAASSSSSSSSSSHHHHH! ¡La araña se derrumba, con un enorme estruendo! La malograda lámpara cae en el vestíbulo, los trocitos de cristal saltan por todas partes.\n"); world.getObject(10000003).setNewState( world.getObject(10000003).getState() | 1 , 1 ); world.getObject(10000004).setNewState(1,1); end(); } else if ( objLanzado == linterna ) { p.removeItem ( linterna ); world.getObject(10000003).addItem ( linterna ); p.escribirAccion("\nLanzas la linterna contra la araña; pero, aunque das en el blanco, no le haces nada. La linterna cae al suelo del vestíbulo. Tal vez con algo más contundente...\n"); end(); } else if ( objLanzado == daga ) { p.escribirNegacion("\n¿Lanzar la daga? Podrías hacerte daño... ¡tu madre siempre te ha dicho que jugar con cuchillos es muy peligroso!\n"); end(); } else { if ( objLanzado.getWeight() < 5 ) { p.escribirNegacion( "\nNo conseguirías nada. Eso pesa demasiado poco como para lanzarlo con fuerza.\n"); end(); } else { p.escribirNegacion("\nNo tienes tanta fuerza como para lanzar eso...\n"); end(); } } } else { //p.escribir(matches[1].get(0).toString()); p.escribirNegacion("\n¿Lanzar qué contra qué?\n"); end(); } } else if ( verb.equalsIgnoreCase("girar") || verb.equalsIgnoreCase("tocar") || verb.equalsIgnoreCase("romper") || verb.equalsIgnoreCase("coger") ) { lampara = world.getObject( 30000002 ); if ( ParserMethods.refersToEntity ( arguments , lampara , false ) ) { if ( (obj.getState() & 1) != 0 ) //ya hecho esto { p.escribirNegacion("\nYa has destrozado la pobre lámpara, no te ensañes más con ella...\n"); end(); } else { p.escribirNegacion("\nTe encuentras a la altura de la lámpara; pero demasiado lejos para poder alcanzarla.\n"); end(); } } } //else, just continue parsing using normal methods! } //BSH code for onEnterRoom event /* Cambiar la relación jugador-habitación de tal modo que la descripción de la primera vez sea diferente. */ void onEnterRoom ( Mobile m ) { relState = m.getRelationshipState(obj); if ( relState == 0 ) { m.setRelationshipState(obj,1); } } void onShowRoom ( Mobile m ) { relState = m.getRelationshipState(obj); if ( relState == 0 ) m.setRelationshipState(obj,2); //was 1 else m.setRelationshipState(obj,2); } 085