[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Implementation Notes



And for those of you who have an interest in implementation of pbmserv
modules...

My PBeM Server is implemented as a series of scripts/commands.

When mail is received by pbmserv@gamerz.net, it looks for the subject line
to tell it what to do.  If it is not an administrative command (signup,
change password, list, etc.) it looks to see if it has a games of that type
defined (currently trax and twixt).  If so, it executes the command
specified by the subject line.

The PBeM server script also sets a couple of environment variables that
are inheritied by the game commands:
    INPUTFILE	name of the file containing the message being processed
    LOGFILE	name of a log file
    SENDER	email address of the sender
    FROM	Name of the sender (if known)

The pbmserv script itself is written in perl.

	Subject: fetch.2 pbmserv.pl

will retrieve the script.

It is up to the individual game implementations to keep track of whatever
they need.  However, Soren and I have implemented a series of C++ classes
that will make implementation of additional pbmserv modules easy.

All PBeM stuff is located under the $PBMHOME directory
    $PBMHOME
		/etc		misc PBeM files
		/bin		command executables
		/games	
	    	/Ataxx
	    	/Trax
	    	etc.
		/history	history files
		/ratings	ratings files
		/standings	standings files (for tournaments)
		/help		help files
		/src		source code
		/src.2		source code (for the 2nd generation pbmserv code)

All games *must* support a 'list' command to show what games are on-line
(both current and recent past).  'show' and 'preview' commands are nice.
'standings' is also nice.  'challenge' allows two players to begin a game.
Most of these commands are handled by the generic "Game" class.
The important parts are

	Init()			-- initialize the board
	MakeMove()		-- validate the move, and apply it to the board
	PrintBoard()	-- display the board
	IsGameOver()	-- is the game over?  who won?
	MustSkip()		-- can the current player make a move?
	ForcedMove()	-- is the current move forced?  if so, what is it?

To get a sample implementation (Ataxx is a good example), send pbmserv
a fetch.2 request...

	Subject: fetch.2 game.h game.cpp board2d.h board2d.cpp ataxx.h ataxx.cpp

Known bugs in the current implementation include 1st move resignation
not resulting in a board "cancellation", and simultaneous move forfeits
are not necessary handled correctly.

Richard

-- 
 /  \__  | Richard Rognlie / Internet Developer / Erol's Internet
 \__/  \ | E-Mail: rrognlie@gamerz.net       
 /  \__/ | Phone:  (Office) (703) 321-8000 x2222  (Home) (703) 361-4764   
 \__/    | WWW:    http://www.gamerz.net/rrognlie/