! Multiplayer Inform stub file
! for use with ifMUD's Floyd
! this file by Adam Cadre
! multiplayer Inform developed by Adam Cadre and Evin Robertson
! Floyd created by Evin Robertson
! Inform created by Graham Nelson
! As of this writing (07 March 1999), ifMUD's interpreter-bot Floyd is
! equipped to run multiplayer games. This file is a starting point for
! coding them. There are a few differences from single-player IF to keep
! in mind. Chief among these is that all input to the game, such as DO
! THIS, is translated into the form, SPEAKER, DO THIS. This means that
! the responses to verbs should be placed into the 'orders' block of the
! Newplayer class. Also, whispering output to a particular player is done
! through HTML-style tags, such as: "You can't see any such
! thing.".
Constant Story "[insert name of game here]";
Constant Headline "^[insert other headers here]";
Include "Parser";
Object LibraryMessages
with before [;
Prompt: rtrue; ! Multiplayer games, especially those involving
! whispering, will probably not want to offer a
! prompt. If you'd like a prompt, simply delete
! or comment out this line.
Miscellany: ! These lines run on top of the "You seem to want to
! talk to someone, but I can't see whom" message. If
! you would like to add more verbs that people not in
! the game can use, add them.
if (lm_n==23) {
if ((parse+2)-->4 == 'join') Addplayer();
else if ((parse+2)-->4 == 'who') Listplayers();
else if ((parse+2)-->4 == 'quit') quit;
else "You must be a player to enter a command.";
}
rtrue;
];
Include "Verblib";
Array text_buffer -> 16;
Global the_named_word = 0;
Global from_char; Global to_char;
Global game_on; ! This flag goes up when the joining phase is complete.
Attribute ingame; ! This is an attribute given to each player in the game
! upon joining. Objectloops through the player list should
! be on (x has ingame), since (x ofclass Newplayer) will
! include blank players, and (x in gameroom) will include
! "yourself".
Class Newplayer(20) ! If you need more than twenty players -- or want a
! lower maximum -- change this.
with number 0 0 0 0 0 0 0 0,
description "A player not unlike yourself.",
parse_name [i j flag;
if (parser_action==##TheSame) {
for (i=0:i<16:i++) {
if ((parser_one.&number)->i ~= (parser_two.&number)->i)
return -2;
}
return -1;
}
for (::i++) {
j=NextWord(); flag=0;
if (flag==0 && ((self.&number)->0) ~= 0) {
wn--;
if (TextReader(0)==0) return i;
for (j=0: j<16: j++)
if ((self.&number)->j ~= text_buffer->j) return i;
flag=1;
}
if (flag==0) return i;
}
],
short_name [i;
while (((self.&number)->i) ~= 0) print (char) (self.&number)->i++;
rtrue;
],
create [i;
wn = the_named_word;
if (TextReader(1)==0) return i;
for (i=0: i<16: i++) {
(self.&number)->i = text_buffer->i;
}
],
orders [a y ct;
Who: Listplayers(); rtrue;
Join: ! If the game recognizes the player well enough to pass it
! here, then that player has by definition already joined.
print_ret (name) self, " is already a player.";
Begin: ! Note that the following demonstrates how to code whispers
! to players. print_ret and print-less strings should not
! be used, as that will make Floyd output blank lines.
if (game_on) {
print "The game has already
begun!"; rtrue;
}
game_on = 1; Startgame(); rtrue;
Leave:
if (game_on) {
print "Sorry! Can't leave while
a game is in progress!"; rtrue;
}
remove self; give self ~ingame; players--;
print (name) self, " deleted! Current players: ";
objectloop (y has ingame) print (name) y, " ";
new_line; rtrue;
MyQuit: quit;
NotUnderstood: print "I don't understand
that."; rtrue;
default: print "I can't do that, ",
(name) self, "."; rtrue;
],
has animate neuter proper;
[ TextReader flag point i j len;
if (flag==1 && from_char~=to_char)
{ for (i=from_char, j=0:i<=to_char && j<15:i++)
{ text_buffer->j = buffer->i;
if (buffer->i ~= ' ' or ',' or '.') j++;
}
for (:j<16:j++) text_buffer->j = 0;
from_char=0; to_char=0;
rtrue;
}
for (i=0:i<16:i++) text_buffer->i = 0;
if (wn > parse->1) { wn++; rfalse; }
i=wn*4+1; j=parse->i; point=j+buffer; len=parse->(i-1);
for (i=0:ii = point->i;
wn++; rtrue;
];
Object gameroom "Waiting for players to join"
with article "the",
description "WHO: Who's already playing?^
JOIN: Add me to the list of players!^
LEAVE: Scratch me from the list of players!^
BEGIN: Everyone has arrived! Let's play!^
QUIT: Let's not play after all!",
has light;
[ Initialise;
location = gameroom;
!!! print out your credits in here somewhere
return(2);
];
Include "Grammar";
[ AnyWord; from_char=0; to_char=0; the_named_word=wn++; ];
[ Addplayer x y;
if (game_on)
"New players may not join while a game is in progress. Sorry!";
from_char = 0; to_char = 0; the_named_word = 1;
x = Newplayer.create(); if (x ~= nothing) move x to gameroom;
else "Sorry, too many players have been created.";
print (name) x, " added! Current players: "; players++; give x ingame;
objectloop (y has ingame) print (name) y, " ";
new_line; rtrue;
];
[ Listplayers a b;
print "Current players: ";
objectloop (a has ingame) { print (name) a, " "; b = 1; }
if (~~b) print "NONE";
new_line; rtrue;
];
[ Startgame;
! Insert the beginning of your game loop here.
];
[ WhoSub; "WHO must come from a person."; ];
Verb 'who'
* -> Who;
[ JoinSub; "JOIN must come from a person."; ];
Verb 'join'
* AnyWord -> Join;
[ LeaveSub; "LEAVE must come from a player."; ];
Verb 'leave'
* -> Leave;
[ BeginSub; "BEGIN must come from a player."; ];
Verb 'begin'
* -> Begin;
[ MyQuitSub; "QUIT must come from a person."; ];
Verb 'quit'
* -> MyQuit;