lunes, 14 de abril de 2014

Multi User Dungeon (MUD)

Hace mucho tiempo que no tenía en mis manos este tipo de juegos. Los MUD (o mazmorras multi usuario) son juegos en modo texto que proporcionan una experiencia de juego de rol bastante interesante. Por allá por los finales de los 90 conocí a más de uno que se pasaban las horas en el aula de ordenadores de la escuela en la Universidad recorriendo estos mundos.

La cosa es muy sencilla. Se pilla un ordenador, se conecta vía telnet (el protocolo más sencillo que conozco) y se juega leyendo y escribiendo en consecuencia.

¿Cómo lo instalamos en OS X? Buscamos "CicleMUD" en Google y siguiendo los pasos adecuados llegaremos a esta URL:

http://www.circlemud.org/pub/CircleMUD/3.x/

Desde ella se puede descargar la última versión del código fuente de CircleMUD. Si no tenemos algo de mano con esto de la programación, dejamos de leer y buscamos a nuestro friki de cabecera. Si tenemos mano (y tenemos instaladas las herramientas de compilación de línea de comandos que vienen con el Xcode...) seguimos las instrucciones del archivo README, que nos lleva a la carpeta doc a buscar las instrucciones de compilación para UNIX.

En un mundo ideal, ya estaría todo. Pero no... resulta que hay un problema con una variable de sistema y en la carpeta src hay que buscar el archivo comm.c y cambiar esto:

    /* set the current to the maximum */
    limit.rlim_cur = limit.rlim_max;
    if (setrlimit(RLIMIT_NOFILE, &limit) < 0)
    {
      perror("SYSERR: calling setrlimit");
      exit(1);
    }

    #ifdef RLIM_INFINITY
        if (limit.rlim_max == RLIM_INFINITY)
            max_descs = max_playing + NUM_RESERVED_DESCS;
        else
            max_descs = MIN(max_playing + NUM_RESERVED_DESCS, limit.rlim_max);
    #else
        max_descs = MIN(max_playing + NUM_RESERVED_DESCS, limit.rlim_max);

    #endif

Por esto otro...
    #ifdef RLIM_INFINITY
      if (limit.rlim_max == RLIM_INFINITY) {
          /* On OSX rlimit can't be set to infinity, set it to open_max
           * I don't know of any reason why to set rlim_cur greater than open_max anyway */
    #ifdef OPEN_MAX
          limit.rlim_max = (OPEN_MAX < RLIM_INFINITY) ? OPEN_MAX : RLIM_INFINITY;
    #endif
          max_descs = max_playing + NUM_RESERVED_DESCS;
      } else {
          max_descs = MIN(max_playing + NUM_RESERVED_DESCS, limit.rlim_max);
      }
    #else
      max_descs = MIN(CONFIG_MAX_PLAYING + NUM_RESERVED_DESCS, limit.rlim_max);
    #endif
      /* set the current to the maximum */
      limit.rlim_cur = limit.rlim_max;
      if (setrlimit(RLIMIT_NOFILE, &limit) < 0) {
          perror("SYSERR: calling setrlimit");
          exit(1);

      }

Seguidamente recompilamos el tema (seguimos las instrucciones y esta vez si que funcionará) y lanzamos el juego.

Usando telnet localhot 4000 en el terminal, veremos esto:

ciri:circle-3.1 mazcunan$ telnet localhost 4000
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

                              Your MUD Name Here
                              lib/text/greetings

                            Based on CircleMUD 3.1,
                            Created by Jeremy Elson

                      A derivative of DikuMUD (GAMMA 0.0),
                created by Hans-Henrik Staerfeldt, Katja Nyboe,
               Tom Madsen, Michael Seifert, and Sebastian Hammer


By what name do you wish to be known? 

Y de ahí en adelante tenemos una aventura completa en un mundo persistente... Sólo queda personalizar los archivos y ¡a jugar!

Una forma curiosa y entretenida de practicar el inglés... :)