summaryrefslogtreecommitdiff
path: root/appl
diff options
context:
space:
mode:
authorCharles.Forsyth <devnull@localhost>2009-04-03 15:06:26 +0000
committerCharles.Forsyth <devnull@localhost>2009-04-03 15:06:26 +0000
commit674a6de7c1bbbcf8d645962263a25a2b84e54fb2 (patch)
tree1553dd42f93f2b8d921dd321697eb19d63b07d8d /appl
parentb78013d1beb612b79795b6f2fa9275db79fa45c5 (diff)
20090403-1606
Diffstat (limited to 'appl')
-rw-r--r--appl/spree/man/gamesrv.man2471
-rw-r--r--appl/spree/man/gamesrv.man4296
2 files changed, 0 insertions, 767 deletions
diff --git a/appl/spree/man/gamesrv.man2 b/appl/spree/man/gamesrv.man2
deleted file mode 100644
index fd910519..00000000
--- a/appl/spree/man/gamesrv.man2
+++ /dev/null
@@ -1,471 +0,0 @@
-.TH GAMESRV 2
-.SH NAME
-Gamesrv \- game server module
-.SH SYNOPSIS
-.EX
-.ps -1
-.vs -1
-include "draw.m";
-include "gamesrv.m";
-gamesrv := load Gamesrv Gamesrv->PATH;
-Range, Object, Game, Player: import gamesrv;
-
-Range: adt {
- start: int;
- end: int;
-};
-
-Object: adt {
- transfer: fn(o: self ref Object,
- r: Range, dst: ref Object, i: int);
- setvisibility: fn(o: self ref Object,
- visibility: int);
- setattrvisibility: fn(o: self ref Object,
- name: string, visibility: int);
- setattr: fn(o: self ref Object,
- name: string, val: string, vis: int);
- getattr: fn(o: self ref Object, name: string): string;
- delete: fn(o: self ref Object);
- deletechildren: fn(o: self ref Object, r: Range);
-
- id: int;
- parentid: int;
- children: array of ref Object;
- objtype: string;
- visibility: int;
- # ...private data
-
-};
-
-Game: adt {
- newobject: fn(game: self ref Game, parent: ref Object,
- visibility: int, objtype: string): ref Object;
- action: fn(game: self ref Game, cmd: string,
- objs: list of int, rest: string, whoto: int);
- player: fn(game: self ref Game, id: int): ref Player;
-
- objects: array of ref Object;
- # ...private data
-};
-
-Player: adt {
- name: fn(player: self ref Player): string;
- hangup: fn(player: self ref Player);
- obj: fn(player: self ref Player, id: int): ref Object;
-
- id: int;
- # ...private data
-};
-
-Gamemodule: module {
- clienttype: fn(): string;
- init: fn(game: ref Gamesrv->Game, srvmod: Gamesrv): string;
- command: fn(player: ref Gamesrv->Player, e: string): string;
- join: fn(player: ref Gamesrv->Player): string;
- leave: fn(player: ref Gamesrv->Player);
-};
-
-rand: fn(n: int): int;
-.ps +1
-.vs +1
-.EE
-.SH DESCRIPTION
-.I Gamesrv
-provides a general server interface that allows distributed
-clients to interact in a controlled manner, with the
-interaction mediated
-by Limbo modules, known as
-.IR "game engines" ,
-or just
-.I engines
-for short.
-Each engine decides on the rules
-of its particular game; the engine interface is described
-at the end of this manual page, under
-``Module Interface''.
-.PP
-This manual page describes the
-interface as presented to an engine
-once it has been loaded by
-.IR gamesrv .
-An engine is responsible for a particular
-.IR game ,
-in which one or more
-.I players
-participate. Messages sent by players
-are interpreted by the game engine, which
-responds by making changes to the hierarchical
-.I object
-database held by the game.
-Behind the scenes
-.I gamesrv
-distributes updates to this database to players
-of the game as appropriate.
-.SS "Objects and visibility"
-Objects hold a game's visible state. An object
-has a unique integer
-.IR id ,
-which is an index into the array
-.IB game .objects\fR;\fP
-it also holds a set of attribute-value pairs, a type, and
-zero or more child objects. Together, all the objects
-in the game form a hierarchical tree, rooted at
-the
-.IR "root object"
-(id 0), which always exists.
-Each attribute and each object also has an associated
-.IR "visibility set" ,
-the set of players that sees updates to the attribute or the children
-of the object. A visibility set is an integer, a bitmask where each
-bit represents one player, hence
-.B ~0
-is visible to all players, and
-.B 0
-is visible to no-one.
-In general, each player has a unique
-identifier
-.IR id ;
-in an integer
-.I i
-representing a set of players,
-the
-.IR id th
-bit represents the presence of the player with
-identifier
-.IR id .
-Thus, for a player
-.IR p ,
-.BI "(1<<" p ".id)"
-is the set containing only
-.IR p ,
-.BI "(" i "&~(1<<" p ".id))"
-excludes
-.I p
-from the set, and
-.BI "(" i "|(1<<" p ".id))"
-includes
-.I p
-in the set.
-.PP
-Note that the visibility set of an object does not alter the visibility
-of that object's attributes, but only that of its children (and of
-their children: in general an object is visible to a player if the
-intersection of all its ancestors' visibility sets contains that
-player).
-.PP
-Objects can be transferred inside the hierarchy from one parent to
-another. If an object is moved to a parent whose visibility conceals it
-from a player, then it will appear to that player to have been deleted;
-if it is later made visible, then it will be recreated for that
-player.
-A game engine can almost always ignore this technicality,
-except for one thing: the identifier used by a particular player to
-identify an object is not necessarily the same as that used by the game
-engine. Thus when an engine receives an object id in a player's
-message, it should convert it using the
-.IB player .obj()
-function.
-.SS \fBGame\fP
-The
-.B Game
-type holds all the objects in a game. It allows the
-creation of new objects, and provides way of communicating
-with players outside the object hierarchy.
-All data members of a
-.B Game
-should be treated as read-only.
-.TP 10
-.IB game .objects
-This array holds the objects in the game. An object with
-identifier
-.I id
-is found at
-.IB game .objects[ id ]\fR.\fP
-.TP
-.IB game .newobject(\fIparent\fP,\ \fIvisibility\fP,\ \fIobjtype\fP)
-.B Newobject
-creates a new object at the end
-of
-.IR parent 's
-children;
-If
-.I parent
-is nil, the new object is created under the root object.
-The new object has visibility
-.IR visibility ,
-and type
-.IR objtype .
-An object's type cannot be changed once
-it has been created.
-.TP
-.IB game .action(\fIcmd\fP,\ \fIobjs\fP,\ \fIrest\fP,\ \fIwhoto\fP)
-.B Action
-sends a message to some players without affecting
-the object hierarchy. It can be used to send transient
-events that have no meaning when stored statically
-(for example, network latency probes).
-The message is sent to the set of players given by
-.IR whoto .
-.I Objs
-is assumed to be a list of object ids, which are
-converted appropriately for each player
-receiving the message; the final
-message is a string built by concatenating
-.IR cmd ,
-the list of object ids, and
-.IR rest ,
-separated by spaces.
-.TP
-.IB game .player(\fIid\fP)
-.B Player
-yields the player corresponding to identifier
-.IR id ,
-or
-.B nil
-if there is none.
-.SS Player
-The
-.B Player
-type represents a player of a game.
-.TP 10
-.IB player .id
-The player's identifier, an integer between
-0 and 31. This is unique across all current players,
-but ids of players that have left the game will
-be reused.
-.TP
-.IB player .obj(\fIid\fP)
-.B Obj
-converts from a player's external object
-identifier to the game's local
-.B Object
-that it represents. It returns
-.B nil
-if there is no such object.
-.TP
-.IB player .hangup()
-.B Hangup
-hangs up a player's connection to the game;
-no more requests from
-.I player
-will be received by the game engine.
-.TP
-.IB player .name()
-.B Name
-yields the authenticated name of the player.
-This is not necessarily unique over the players
-of a game.
-.SS \fBObject\fP
-The
-.B Object
-type is the basic unit of game engine state.
-An object's children can be selectively concealed
-from players; it holds a set of
-.RI ( attribute ,\ value )
-pairs, each of which can be concealed likewise.
-Where an argument
-.IR r ,
-of
-.B Range
-type is used, it refers to a range of an object's
-children starting at index
-.IB r .start\fR,\fP
-and finishing at
-.IB r .end-1\fR.\fP
-All the data members of an
-.B Object
-should be treated as read-only.
-.TP 10
-.IB obj .setattr(\fIname\fP,\ \fIval\fP,\ \fIvis\fP)
-.B Setattr
-sets attribute
-.I name
-in
-.I obj
-to
-.IR val.
-If the attribute is being created for the
-first time, then it will be given visibility
-.IR vis .
-.I Name
-should be non-empty, and should not
-contain any space characters.
-Note that it is not possible for an attribute
-to refer directly to an object by its identifier;
-if this facility is needed, another identifying
-scheme should be used. This also applies
-to player identifiers, which will change
-if the game is saved and loaded again (not
-implemented yet).
-.TP
-.IB obj .getattr(\fIname\fP)
-.B Getattr
-yields the current value of the
-attribute
-.I name
-in
-.IR obj .
-If an attribute is not set, it yields
-.BR nil .
-.TP
-.IB obj .delete()
-.B Delete
-removes
-.I obj
-from the object
-hierarchy.
-.TP
-.IB obj .deletechildren(\fIr\fP)
-.B Deletechildren
-deletes children in range
-.I r
-from
-.IR obj .
-.TP
-.IB obj .transfer(\fIr\fP,\ \fIdst\fP,\ \fIi\fP)
-.B Transfer
-transfers the children in range
-.I r
-from
-.I obj
-to just before the object at index
-.I i
-in
-.IR dst .
-It is permissible for
-.I obj
-and
-.I dst
-to be the same object.
-.TP
-.IB obj .setvisibility(\fIvisibility\fP)
-.B Setvisibility
-allows the set of players
-given in
-.I visibility
-to see the children of
-.IR obj ,
-and denies access to all others.
-Players are notified of the change.
-.TP
-.IB obj .setattrvisibility(\fIname\fP,\ \fIvisibility\fP)
-.B Setattrvisibility
-allows the set of players
-given in
-.I visibility
-to see the value of
-.IR obj 's
-attribute
-.IR name ,
-and denies access to all others.
-Players are not notified of the change;
-if there is a need to communicate
-the fact of an attribute becoming invisible to
-players, it should be done by using another
-(visible) attribute to communicate the change.
-.SS "Module Interface"
-A game engine module,
-.IR mod ,
-must implement the
-following functions. Where a function returns a string,
-it is interpreted as an error response to the player
-responsible for the request; an empty string signifies
-no error.
-.TP
-.IB mod .clienttype()
-.B Clienttype
-should return the type of client required
-by the engine (e.g.
-.B cards
-for the card-game client).
-Each client type has its own conventions
-as to the meaning of object types and attribute
-names and values.
-This function may be called before
-.BR init() .
-.TP
-.IB mod .init(\fIgame\fP,\ \fIsrvmod\fP)
-.B Init
-initialises the game engine.
-.I Game
-is the game that the engine is controlling,
-and
-.I srvmod
-is the
-.B Gamesrv
-module holding its associated data.
-An error response from this function
-causes the game to be aborted.
-.TP
-.IB mod .join(\fIplayer\fP)
-.I Player
-has made a request to join the game;
-an error response causes the request to be
-refused, otherwise the player joins the
-game.
-.TP
-.IB mod .leave(\fIplayer\fP)
-.I Player
-has left the game.
-.TP
-.IB mod .command(\fIplayer\fP,\ \fIe\fP)
-.I Player
-has sent the command
-.IR e .
-The command usually follows
-the simple message conventions
-used in
-.IR gamesrv (4),
-i.e. simple space-separated tokens.
-.SH EXAMPLE
-The following is a small, but working example
-of a game engine that acts as a chat server
-(parsing error checking omitted, and white-space
-compressed to save paper):
-.PP
-.EX
-.ps -1
-.vs -1
-implement Gamemodule;
-include "sys.m";
- sys: Sys;
-include "draw.m";
-include "../gamesrv.m";
- gamesrv: Gamesrv;
- Game, Player: import gamesrv;
-game: ref Game;
-clienttype(): string
-{
- return "chat";
-}
-init(g: ref Game, srvmod: Gamesrv): string
-{
- (sys, game, gamesrv) = (load Sys Sys->PATH, g, srvmod);
- return nil;
-}
-join(nil: ref Player): string
-{
- return nil;
-}
-leave(nil: ref Player)
-{
-}
-command(player: ref Player, cmd: string): string
-{
- game.action("say " + string player.id + " " + cmd, nil, nil, ~0);
- return nil;
-}
-.ps +1
-.vs +1
-.EE
-.SH SOURCE
-.B /appl/cmd/games/gamesrv.b
-.SH "SEE ALSO"
-.IR gamesrv (4)
-.SH BUGS
-The reuse of object ids can lead to
-problems when objects are deleted and
-recreated on the server before clients become
-aware of the changes.
-.PP
-This interface is new and will change.
diff --git a/appl/spree/man/gamesrv.man4 b/appl/spree/man/gamesrv.man4
deleted file mode 100644
index 5db352b3..00000000
--- a/appl/spree/man/gamesrv.man4
+++ /dev/null
@@ -1,296 +0,0 @@
-.TH GAMESRV 4
-.SH NAME
-gamesrv \- game server
-.SH SYNOPSIS
-.B games/gamesrv
-[
-.B -l
-] [
-.B -a
-.I alg
-]...
-[
-.B -A
-] [
-.IR addr | mntpoint
-]
-.PP
-.IB mntpoint /players
-.br
-.IB mntpoint /new
-.br
-.IB mntpoint / n
-.SH DESCRIPTION
-.B Gamesrv
-serves a file system that allows clients to interact
-through various types of game engine.
-Usually, it operates in network mode:
-it listens for incoming connections on
-.I addr
-(default
-.BR tcp!*!3242 ),
-authenticates them, and serves files to them.
-If the
-.B -A
-option is given, no authentication takes place,
-otherwise each
-.I alg
-gives an additional possible
-encryption or digest algorithm to use
-on the connection (see
-.IR ssl (3)).
-If no
-.I alg
-is specified,
-.B none
-is assumed.
-The
-.B -l
-option causes the game server to be mounted
-locally on
-.I mntpoint
-\- this can be useful for single player games,
-or debugging.
-.PP
-Once the name-space served by
-.I gamesrv
-is mounted, it serves the following files.
-All identifiers referred to below are
-small integers, expressed as decimal ASCII strings.
-.TP
-.B players
-Reading this file provides updates on players
-arriving and leaving, games being created
-and destroyed, and chat messages outside
-the scope of any game.
-Reads will block until something of interest happens.
-Each update holds space separated
-tokens and is terminated with a newline.
-A read will return as many updates as will fit
-into the read buffer. Update messages are as follows:
-.RS
-.TP
-.BI clientid " clientid name"
-Identifies the name,
-.IR name ,
-and the client identifier,
-.IR clientid ,
-of the client
-reading the players file.
-.TP
-.BI join " clientid name"
-A client has authenticated as
-.IR name ,
-and has been allocated identifier
-.IR clientid .
-.TP
-.BI leave " clientid"
-The client identified by
-.I clientid
-has terminated connection with the server.
-.TP
-.BI gametype " clienttype name"
-The server announces the availability of a game
-named
-.I name
-on the server. The game requires a client of
-type
-.I clienttype
-to display the game.
-.TP
-.BI creategame " gameid name clienttype"
-An instance of a game named
-.IR name
-has been created; it needs a client
-of type
-.IR clienttype ,
-and has been given identifier
-.IR gameid .
-.TP
-.BI deletegame " gameid"
-The game identified by
-.I gameid
-has been deleted.
-.TP
-.BI joingame " gameid clientid playerid name"
-Client
-.I clientid
-(named
-.IR name )
-has joined game
-.I gameid ,
-and is allocated player id
-.I playerid
-in the game.
-.TP
-.BI leavegame " gameid playerid name"
-Player
-.I playerid
-(named
-.IR name )
-has left
-.IR gameid .
-.TP
-.BI chat " clientid msg"
-Client
-.I clientid
-has sent the chat message
-.IR msg .
-.PP
-Writing to the
-.B players
-file causes a
-.B chat
-message to be sent to all other clients reading
-the players file. All but the first line of the
-write request is ignored.
-.RE
-.TP
-.B new
-Opening
-.B new
-prepares to create a new game.
-The only message that can be written
-to a newly opened game is
-.BI \fR``\fPcreate " name"\fR'',\fP
-to request a new game named
-.IR name .
-The write request draws an error
-if
-.I gamesrv
-fails to find and load the requisite game
-engine.
-If the write succeeds, the game is created,
-and game updates can be read in the same
-manner as from the
-.B players
-file. The update messages are as follows:
-.RS
-.TP
-.BI playerid " clientid playerid name"
-Identifies the player identifier,
-.IR playerid ,
-and name,
-.IR name ,
-of the reader.
-.TP
-.BI create " objid parentid visibility objtype"
-Create an object, identified by
-.IR objid ,
-at the end of
-.IR parentid 's
-children
-.RI ( parentid
-is
-.B -1
-for the root object).
-.I Visibility
-is the visibility set of the object (see
-.IR gamesrv (2)),
-and
-.I objtype
-is its type.
-.TP
-.BI tx " srcid dstid start end index"
-Transfer objects from
-.I srcid
-to
-.IR dstid.
-Take the objects from the range
-.RI [ start ,\ end )
-in the children of
-.IR srcid ,
-and insert them just before
-.I index
-in
-.IR dstid .
-Note that when objects are transferred
-to an object that conceals its children,
-and the object is itself visible,
-the objects will first be transferred to the
-destination and then deleted; objects transferred
-out of such an object will first be created and
-.I then
-transferred to their destination.
-This enables a client to maintain some knowledge
-of where an object has been transferred to, even
-if the object is no longer visible.
-.TP
-.BI del " parentid start end"
-Delete the range
-.RI [ start ,\ end )
-of children from the object identified by
-.IR parentid .
-.I Gamesrv
-guarantees that those objects will themselves
-not have any children.
-.TP
-.BI set " objid attr val"
-Set the attribute named
-.I attr
-on object
-.I objid
-to
-.IR val .
-.TP
-.BI vis " objid visibility"
-The visibility of object
-.I objid
-has changed to
-.IR visibility .
-.TP
-.I action
-Game engines can generate arbitrary messages
-of their own devising; such messages are specific
-to particular client types.
-.PP
-Note that a given client does not have to interpret
-all the above messages \- different client types
-have their own conventions. The
-.B card
-client type uses most of the above functionality,
-for example, whereas a client for the
-.B chat
-engine listed in
-.IR gamesrv (2)
-can get away with interpreting only one message, the custom action
-.BR chat .
-.PP
-Writes to the opened game file
-are interpreted as game actions by
-the game that has been loaded, and acted on accordingly.
-Invalid actions will draw a write error.
-.RE
-.TP
-.I n
-Once a game has been created, it appears as
-a numbered file, corresponding to the
-.I gameid
-of the game in question.
-Opening this file joins the game; reads and writes
-work as for the
-.B new
-file, above.
-A single client cannot join a particular game
-more than once.
-.PP
-A zero-length write to any file causes any reads
-of that file from the same file descriptor to yield
-EOF (no bytes).
-This is necessary to force a hangup under
-systems such as Windows, where it is not possible
-to interrupt a kproc blocked on a network read.
-.SH EXAMPLE
-The simplest client!
-.PP
-.EX
-mount tcp!somehost.com!3242 /n/remote
-{
- echo create chat >[1=0]
- cat &
- cat >[1=0] < /dev/cons
-} <> /n/remote/new
-.SH SOURCE
-.B /appl/cmd/games/gamesrv.b
-.SH SEE ALSO
-.IR gamesrv (2)