Game Server for the ICFP 2002 Programming Contest

	http://icfpcontest.cse.ogi.edu

Author:   Iavor S. Diatchki <diatchki@cse.ogi.edu>
Language: Haskell, with extensions provided by GHC 5.04
Platform: Tested under Linux
Version:  6.3

Please report bugs to icfp-judges@cse.ogi.edu.

INSTALLATION
============

Compilation requires GHC 5.04, available from http://www.haskell.org/ghc/

Use make to compile it. Install by copying Simulator to /usr/local/bin or
whatever.

USAGE
=====

Simulator <flags>
  where flags are:
  -p NUM   --port=NUM      port to listen on (default: 20005)

  -n NUM   --new=NUM       new game every NUM players 
  -o NUM   --one=NUM       one game with NUM players
  -r NUM:(NUM,NUM):CMD  --robo=NUM:(NUM,NUM):CMD
			   a player to be started by the Simulator,
			   with uid:initial_pos:command.
			   This flag can be repeated.
	(-n, -o and -r are mutually exclusive, if neither one is present,
	 Simulator runs a continuous game)

  -m FILE  --map=FILE      the map to use for the game
  -k FILE  --packs=FILE    locations of packages
  -f NUM   --fuel=NUM      fuel for each player (default: 5000)
  -c NUM   --capacity=NUM  capacity for each player (default: 50)

  -v       --verbose       produce an extra verbose log of the game(s)
  -q       --quiet         be extra quiet
	(-q and -v are mutually exclusive)

  -i (NUM,NUM)    --init=(NUM,NUM)     set the default initial position
					default: (1,1)
  -j [(NUM,NUM)]  --inits=[(NUM,NUM)]  set the first initial positions
  -t NUM          --timeout=NUM        set timeout in millisecs
					default: no timeout

In continuous games, the game starts immediately. Clients can join the game
at any time.

In single games and many games (-n NUM and -o NUM), the games don't
start until the right number of clients have connected.

THE GAME AND THE GAME PROTOCOL
==============================

The game and the protocol are described in doc.html, also available from

	http://icfpcontest.cse.ogi.edu/task.html

STRUCTURE OF THE SOURCE CODE
============================

Files:

Board.hs	-- interesting
Event.hs	-- interesting
Game.hs		-- interesting
Main.hs		-- definitely boring, command line parsing
Observer.hs	-- boring
Opts.hs		-- boring
Pack.hs		-- not very interesting
Pos.hs		-- boring
Robo.hs		-- interesting
Server.hs	-- maybe interesting, main loop of the simulator
Utils.hs	-- some useful bits

Programming style:

The program uses an approach based on mutable objects.

LOG FILE FORMAT
===============

The Simulator produces logs of the games. For continuous games and single games,
the log appears on stdout. For many games (-n NUM), a separate log file for
each game is written in the current directory.

Logs may contain comment lines starting with a #. Apart from the
comment lines, the log files depend on the verbosity flag given to the
server.  There are three verbosity levels:

  1. quiet (-q) no logging info 
  2. usual mode (no special flag)
     this should contain enough information to reproduce all interesting stuff
  3. verbose (-v) produce even more info, for tools which do not want to
     keep their own state.


The log file have the following structure:

1. The log files start with the map, in the format described in doc.html
   section The game protocol, Initialization, also available from

	http://icfpcontest.cse.ogi.edu/task.html#initialization

   Note that maps may contains lines starting with a #. These *are* part
   of the map and should not be treated as comment lines.

2. Then follows one line, giving the destinations of packages. (This is intended
   to aid graphical presentations of the games.). Example:

	[(9,17),(14,3),(3,5)]

   In this scenario, packages should be delivered to three different locations.

3. Some information is send for each turn:
    3.1. With -v there are 4 lines/turn as described in a,b,c,d bellow.
    3.2. Without -v there are 2 lines/turn, as described in c,d bellow.

     a. The current position of the robots. Example:

		[(1,(10,15)),(2,(9,3))]

        The robot with id 1 is located at (10,15) and the robot with id 2 is
	located at (9,3).

     b. The current position of packages. Example:

		[((6,17),20),((16,3),10)]

        There are 20 packages at (6,17) and 10 packages at (16,3).

     c. The commands received from the robots. Example:

		[(4,1,Drop [8,3,4,5]),(5,1,Move W)]

        The robot with id 4 sent the command "Drop 8 3 4 5" with bid 1.
	(The Pick command uses the same syntax.) Robot 5 sent the command
	"Move W" with bid 1.

	The data type for commands is Cmd, defined in Robo.hs.

     d.	Events (what happened to the robots). Example:

		[(2,[WasPushed]),(1,[GoodPush])]

	Robot 1 pushed robot 2.

		[(2,[Moved E]),(1,[Died "Bad reply: kjslkdjf" 0 4999])]

	Robot 2 moved east, while robot 1 send an
	illegal command and was killed, having earned 0 points and having
	4999 units of money left.

	The data type for events is Event, defined in Event.hs

OBSERVERS
=========

Special clients called observers can connect to games to get a
real-time view of the game. When they connect to the server they
should send the line Observer. They shouldn't send anything else to the
server after that. They will receive information about the progress of
the games in the same format as the log files.

In single games and many games mode (-n NUM and -o NUM), observers count as
players, so they must connect at the beginning of the game. In continuous
games, observer can connect at any time and view the progress of the game
from that point.
