constant historia "¿Sin Sentido?^"; constant titular "(C) 2003 Presi (kifcu@@64confluencia.net) http://aventuras.presi.org^ de libre distribución bajo licencia GNU GPL (http://www.gnu.org)^"; ! compila solo para Glulx release 1; constant ADMITIR_COMANDO_SALIDAS; constant NO_LUGARES; constant NO_PUNTUACION; constant IMPRIMIR_DEDUCCIONES; include "EParser"; object mensajeslibreria with antes [; prompt: if (factor.tecladdo) { print ": "; return true; } return false; ], ; include "Acciones"; include "Facilitar"; array entrada->120; array tentrada->65; habitacion universo "Universo" with descripcion "Te encuentras en un universo vacío de objetos materiales pero repleto de ideas y conceptos abstractos.", ; objeto respuesta_universo universo with nombre 'universo' 'sitio' 'espacio', adjetivos 'vacio' 'ideas' 'conceptos' 'abstractos', descripcion [; <>; ], has escenario ; objeto factor "factor" universo with valor 0, nombre 'factor' 'multiplicando' 'multiplicador', descripcion [; quitafiltro(); print "Factor: ",self.valor,"^"; ponfiltro(); ], antes [; operar_factor, ponerA: return self.mei_factor(otro); cambiar: print "^Nuevo"; quitafiltro(); print " factor"; ponfiltro(); self.tecladdo=true; teclado(entrada,tentrada); self.tecladdo=false; return self.mei_factor(num_a_entero(entrada,tentrada)); ], tecladdo false, private mei_factor [ num; if (num== -1000 || num==nothing) "El factor debe ser un número mayor que 0."; if (num==10000) "El factor que intentas es demasiado grande."; self.valor=num; ; "Si puedes leer esto: dale a ~curiosidades~."; ], has escenario ; objeto formula "formula" universo with nombre 'formula' 'funcion', descripcion [; quitafiltro(); print (string) self.funcion_texto; ponfiltro(); ], funcion [ c; if (c>=' ' && c<='~') c=((((c-32)*factor.valor)%95)+32); return c; ], tiempo_restante, tiempo_agotado [; print "^"; ; arrancarreloj(self,4); ], private funcion_texto "Formula: carácter=((((carácter-32)*factor)%95)+32)^", has estatico femenino ; objeto caracter "caracter" universo with nombre 'caracter', descripcion "Es cada carácter que se imprime durante el juego.", has escenario ; [ inicializar; modomirar=2; localizacion=universo; arrancarreloj(formula,2); factor.valor=random(95); ponfiltro(); ]; [ ponfiltro; @setiosys 1 filtro; ]; [ quitafiltro; @setiosys 2 0; ]; [ filtro c; c=formula.funcion(c); glk(128,c); ]; include "Gramatica"; verb 'curiosidades' * -> curiosidades ; [ curiosidadessub; print "^"; anuncio(); print "^Como supongo que has podido comprobar si has llegado aqui, al final parece que el juego sí tenía su sentido, ¿no?. El truco está en la manipulación que se le hace individualmente a cada carácter justo antes de que salga por pantalla haciendo uso del filtro de salida de Glulx. ^ La fórmula utilizada es una variante del algoritmo clásico de cifrado 'César', usando enteros módulo 95 (y un desplazamiento de 32 para evitar los caracteres de control), donde el factor realmente es la clave.^ Existe una sucesión de factores para la que el carácter devuelto es igual al original: 1,96,191,287,381,.... que viene determinado por s=1;s=s+95.^ El título es también un pequeño homenaje a Lewis Carroll y a su 'nonsense'.^"; ]; verb 'factor' * -> operar_factor_sin_numero * number -> operar_factor * ':=' / '=//' number -> operar_factor * 'igual' 'al' 'valor'/'numero' number -> operar_factor * 'igual' 'al' 'valor'/'numero' 'de' number -> operar_factor * 'igual' 'a//' number -> operar_factor ; [ operar_factor_sin_numerosub; <>; ]; [ operar_factorsub; <>; ]; verb 'formula' 'xyzzy' 'ayuda' 'pista' * -> operar_formula ; [ operar_formulasub; <>; ]; extend 'pon' first * 'valor'/'numero' number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * 'el' 'valor'/'numero' number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * noun 'en' / 'a//' / ':=' / '=//' / 'con' number -> ponerA * noun 'igual' 'al' 'valor'/'numero' number -> ponerA * noun 'al'/'con' 'valor'/'numero' number -> ponerA * noun 'con' 'el' 'valor'/'numero' number -> ponerA * noun 'igual' 'al' 'valor'/'numero' 'de' number -> ponerA * noun 'al'/'con' 'valor'/'numero' 'de' number -> ponerA * noun 'con' 'el' 'valor'/'numero' 'de' number -> ponerA * noun 'igual' 'a//' number -> ponerA ; verb 'asigna' * 'valor'/'numero' number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * 'el' 'valor'/'numero' number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer ; extend only 'da' 'dale' first * 'valor'/'numero' number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * 'el' 'valor'/'numero' number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer * number 'en' / 'para' / 'a//' / 'al' / ':=' / '=//' noun -> Aponer ; [ Aponersub; if (otro==factor) <>; print "Eso no se puede poner.^"; ]; extend 'ajusta' first * noun 'en' / 'a//' / ':=' / '=//' / 'con' number -> ponerA * noun 'igual' 'al' 'valor'/'numero' number -> ponerA * noun 'al'/'con' 'valor'/'numero' number -> ponerA * noun 'con' 'el' 'valor'/'numero' number -> ponerA * noun 'igual' 'al' 'valor'/'numero' 'de' number -> ponerA * noun 'al'/'con' 'valor'/'numero' 'de' number -> ponerA * noun 'con' 'el' 'valor'/'numero' 'de' number -> ponerA * noun 'igual' 'a//' number -> ponerA ; verb 'haz' = 'ajusta'; verboirregular "hacer" with imperativo 'haz'; extend only 'cambia' first * noun -> cambiar * noun 'a//' / ':=' / '=//' number -> ponerA * noun 'igual' 'al' 'valor'/'numero' number -> ponerA * noun 'al'/'con' 'valor'/'numero' number -> ponerA * noun 'con' 'el' 'valor'/'numero' number -> ponerA * noun 'igual' 'al' 'valor'/'numero' 'de' number -> ponerA * noun 'al'/'con' 'valor'/'numero' 'de' number -> ponerA * noun 'con' 'el' 'valor'/'numero' 'de' number -> ponerA * noun 'igual' 'a//' number -> ponerA ; verb 'modifica' = 'cambia'; [ cambiarsub; print "Eso no puede cambiarse.^"; ]; [ num_a_entero cadena palabras pal x num longi mult res dig; res=0; x=0; pal=PalabraNumero(palabras-->1); if (pal>=1) return pal; pal=palabras-->3; num=pal+cadena; longi=palabras-->2; switch (longi) { 1: mult=1; 2: mult=10; 3: mult=100; default: mult=1000; } longi--; for (x=0:x<=longi:x++) { switch (num->x) { '0': dig=0; '1': dig=1; '2': dig=2; '3': dig=3; '4': dig=4; '5': dig=5; '6': dig=6; '7': dig=7; '8': dig=8; '9': dig=9; default: return -1000; } res=res+mult*dig; mult=mult/10; } if (longi>3) res=10000; return res; ];