Author: Aidin Gharibnavaz
Traducción: Quimey Vivas
Última actualización: 28 de Septiembre de 2008
Esto es una referencia completa al proyecto IWOR y como usarlo. Leyendo esto deberías ser capaz de escribir tus propios robots para IWOR.
IWOR simula un mundo virtual en el cual pueden vivir robots. Los robots son objetos fisicos en este mundo. Todo lo que un jugador(programador) debería hacer es diseñar un cerebro para estos pequeños robots, y mirarlos moverse alrededor de este mundo impergecto. En este articulo y en otros documentos la palabra 'robot' se referira a este cerebro(programa que controla a los robots fisicos) y no al robot fisico en si.
Este programa simulara un mundo en el que los robots pueden vivir, trabajar, defender su tribu contra el enemigo, engendrar nuevos niños,etc. Cada robot pertenece a una tribu. Los robots deben reunir los cristales para la fabrica de la tribu y defenderlos. A cambio la fabrica les proveera energia
Cada robot tiene una bateria. Haciendo actividades una cierta porcion de la bateria se consume. Ellos pueden cargar la bateria moviendose alrededor de la fabrica.
Cada tribu tiene su propia fabrica. La fabrica consumira cristal para producir energia. La tarea mas importante de cada robot es recoger cristal para la fabrica. Los cristales se encuentran alrededor del mundo. Los robots pueden recogerlos y arrojarlos a la fabrica. Haciendo actividades sociales, sirviendo a la tribu y ayudando a los otros los robots pueden sobrevivir mas en este imperfecto y despiadado mundo.
Clonación
Sirviendo a la tribu los robots ganaran honor. Si un cierto robot tiene suficientes puntos de honor, la sociedad le dejara tener un nuevo hijo.
Los robots deben enviar una "llave" valida al servidor para poder unirse al juego. Al principio hay algunas llaves libres (=0). El número de estas llaves se puede configurar usando la opcion ROBOTS_PER_TRIBE del archivo .config Despues de gastar estas llaves, los robots pueden obtener nuevas llaves enviando el comando CLONE al servidor (deben tener suficiente honor). En este caso pueden enviar las nuevas llaves a sus hijos(nuevos procesos) y esos chicos pueden unirse al juego.
De esta firma, solo los robots que sirven a la tribu pueder clonarse y expandir su generación.
Vida
Cada robot tiene un cierto tiempo de vida. Esto puede ser configurado usando ROBOT_LIFETIME en el archivo .config. Al enviar ciertos comandos al servidor (por ejemplo MOVE, PICK,...) los robots consumiran su tiempo de vida.
Uno de los objetivos de estos robots es clonarse antes de que se acabe su tiempo de vida.
IWOR usa un modelo cliente/servidor para la comunicación entre los robots y el servidor. Por lo tanto los robots deben funcionar como programas separados. Ellos pueden ser escritos en casi cualquier lenguaje y sistema operativo. Con este modelo los robots pueden correr en maquinas diferentes.
Para usar IWOR, primero debe correr el servidor que escuchara el puerto 7200. Los robots se pueden conectar al servidor usando este puerto. El juego comenzara inmediatamente despues de la primer conexion. Los clientes pueden enviar comandos al servidor para controlar sus robots. Si tu quieres usar una interfaz grafica (GUI) tambien necesitas ejecutarla como un proceso aparte. La GUI se puede conectar al puerto 7250 (por default) y el sevidor le enviara los objetos del mundo cada vez que algo cambie.
Si descargaste el paquete hay un directorio "bin" que contiene los archivos compilados para ejecutar el juego. Si no, debes compilarlos. En el archivo README hay instrucciones para compilar IWOR
Ejecutando `iwor' , el servidor comenzará y esperará por una conexión. Despues de ejecutar el servidor puedes ejecutar una gui(interfaz grafica). Hay una interfaz simple por defecto disponible. Ejecutá `gui' . Ahora esta todo listo para conectar los robots.
Si quieres probar los comandos sin escribir codigo podes usar "telnet". Ejecuta `telnet localhost 7200' y escribí los comandos directamente.
Los comandos son mensajes que los clientees mandan al servidor para controlar sus robots. Son simples cadenas de texto que le dicen al servidor que quieren que hagan sus robots. Los comandos tienen un formato parecido a:
command&arg1&arg2&...&argn&
Los argumentos de un comando estan separados por '&'. Observar que hay un '&' al final del comando. Todos los comandos son en mayusculas.
Los comandos son:
INIT&Numero_de_tribu&Nombre&
Le dice al servidor que agrege este robot a la tribu Numero_de_tribu. Este comando deberia ser enviado al servidor justo despues de la conexion. Nombre puede ser cualquier cadena de texto, incluyendo la cadena vacia. Por ejemplo INIT&1&ejemplo& agregara al robot a la primera tribu y lo llamara ejemplo.
El robot sera puesto en algun lado alrededor de la fabrica de la tribu. Si no hay lugares vacios, el robot recibira el mensaje de error 190 (intente mas tarde)
MOVE&direccion&
Mueve al robot en la direccion direccion. direccion puede ser NORTH, SOUTH, EAST and WEST. (norte, sur, este, oeste).
LOCATION&
El servidor enviara la ubicacion actual del robot en el mundo en respuesta a este comando. La ubicacion se da en un formato como i,j. Donde i es la fila y j es la columna de la ubicacion.
SENSE&
Con este comando el radar del robot se encendera y el servidor devolvera los objetos alrededor del robot en el mundo. El resultado estara en el siguiente formato:
i1,j1,objeto1&i2,j2,objeto2& ...
Donde i1,j1 es la ubicacion del objeto objeto1. Los objetos estaran separados por '&'.
Los objetos pueden ser # (pared),C (cristal), R (robot), F (fabrica). R y F van seguidos de un numero que indica a que tribu pertenecen.
Por ejemplo en la siguiente imagen:
El circulo rojo es nuestro robot, los azules son otros robots y los negros son paredes. El robot puede observar los cuadrados verdes. Enviando el comando SENSE recibira: (la posicion actual es 5,5)
3,7,R2&4,3,#&5,3,#&6,3,#&6,8,R2&
PICK&dirección&Enviando este comando, el robot intentara agarrar un objeto de al lado suyo. Por ejemplo enviando PICK&WEST&, el robot intentará agarrar un objeto a su izquierda. Si fue un exito, el servidor devolverá 255, y si no, 130.
DROP&dirección&
Este comando se usa para soltar un cristal en una fabrica. Al igual que PICK, el servidor devolverá 255 si fue un exito, y 140 si no. Si no tiene nada que arrojar el robot recibirá 140.
ISHELD&
En respuesta a este comando el servidor enviará 250(Si) si el robot tiene algo en su mano, y 251(No) si no.
INFO&i&j
El robot puede usar este comando para obtener información de un objeto en el lugar (i,j). El servidor responderá en el siguiente formato:
objeto&id&tribu&
`objeto' puede ser WALL, ROBOT, y FACTORY. Obviamente no hay ID ni numero de tribu para un objeto WALL. Si no hay un objeto en ese lugar el servidor responderá 211.
WORLDSIZE&
El servidor devolverá el tamaño del mundo en el formato i,j.
HONOR&
En respuesta a este comando el servidor devolvera la cantidad de honor del robot que lo mandó
LIFETIME&
Al recivir este comando el servidor enviará la cantidad de tiempo que el robot tiene antes de morir.
SEND&id&message&
Usando este mensaje los robot se pueden comunicar. id es la ID del robot que debe recibir el mensaje. Y obviamente, message es el mensaje que será enviado.
El servidor envia varios mensajes en respuesta a los pedidos de los robots. Todos esos mensajes son numeros enteros. Aca hay una lista de los mensajes del servidor:
255 | OK El ultimo comando se ejecuto correctamente. |
250 | Si Sera enviado en respuesta a los comandos Si/No como por ejemplo ISHELD. |
251 | No Sera enviado en respuesta a los comandos Si/No como por ejemplo ISHELD. |
210 | No hay objetos alrededor del robot. Este mensaje sera enviado en respuesta del comando SENSE. Si no hay objetos alrededor del robot el servidor le enviara 210. |
211 | No hay un objeto en esa ubicación. Usualmente sera enviado en respuesta al comando INFO. |
220 | Le diste a un enemigo. El robot acaba de acertar a un enemigo con su arma. Este mensaje será recibido en respuesta al comando SHOOT. |
221 | Le diste a un amigo Acabas de acertar a uno de tus compañeros. Este mensaje será recibido en respuesta al comando SHOOT. |
222 | Le diste a una fabrica Acertaste a una fabrica. Este mensaje será recibido en respuesta al comando SHOOT. |
223 | Le diste a una pared Acertaste a una pared. Este mensaje será recibido en respuesta al comando SHOOT. |
224 | Le diste a un cristal Acertaste a un cristal. Este mensaje será recibido en respuesta al comando SHOOT. |
229 | No le diste a nada No habia nada en el camino de la bala. Este mensaje será recibido en respuesta al comando SHOOT. |
100 | El robot esta muerto. Recibir este mensaje significa que el robot esta muerto. Justo despues de este mensaje la conexión con el servidor se cerrará. |
110 | Comando invalido El comando estaba en un formato incorrecto. |
112 | Llave para clonación invalida. El robot envio una llave invalida. |
120 | No se puede mover en esa direccion. Esto pasa si el destino no estaba vacio, o si el robot no se puede mover por alguna razon. |
130 | No se puede agarrar un objeto. El robot no puede agarrar este objeto. Sera enviado si no hay un objeto alrededor del robot o si el robot no puede agarrarlo(por ejemplo una pared). |
140 | No se puede soltar un objeto Usualmente será enviado si el robot intenta soltar algo en una pared, o algo parecido. |
150 | No hay suficiente honor El robot no puede clonarse porque le falta honor. Esto se envia en respuesta al comando CLONE. |
160 | No existe el robot. La ID especificada no existe. Esto se envia en respuesta al comando SEND. |
190 | Intente mas tarde. La mayoria de las veces este mensaje sera enviado como respuesta al comando INIT. A veces no hay espacio vacio alrededor de la fabrica de la tribu para poner al robot. El robot deberia mandar el mensaje INIT de nuevo. |
199 | Error desconocido. Si ocurre un error inmanejable, el servidor enviara 199. Usualmente esto pasa cuando un robot se quiere mover pero ya murio antes. O en otras situaciones similares. |
El servidor leerá configuraciones y opciones del juego de un archivo .config. Es un archivo de texto ordinario que contiene los valores de las opciones del juego. Por default el sevidor buscara un archivo llamado iwor.config en el directorio actual. Puedes especificar otro archivo de configuración ejecutando el servidor con la opción -c Cosas como cuanta bateria consumen los robots, la cantidad de energía que generan las fabricas por cristal, etc... pueden ser personalizadas.
Algunas opciones importantes son:
ROBOTS_PER_TRIBE: Al principio del juego hay algunas llaves cero que permiten a un numero limitado de robots unirse al juego. (Mira las reglas del juego para mas información.) Esta opcion define el numero de esas llaves.Los mundos se describen en un archivo de texto. El servidor lee estos archivos y construye el mundo simulado. Puedes construir tu propio mundo para IWOR. Esta sección describe el formato de estos archivos de mundo. Por ejemplo en el siguiente mundo pequeño:
9 15 ############### #000000000000## #010000000c000# #000000#000000# #00000###00000# #0000000000000# #000c000000020# #0000000##0000# ############### |
Las primeras 2 lineas corresponden al tamaño del mundo. Las otras lineas muestran los objetos en el mundo. Los ceros son espacios vacios. Los numeros son la ubicación de las fabricas (1 para la primer tribu, 2 para la segunda y así sucesivamente), '#' es una pared, y 'c' es un cristal. Facil, no?