/*
Room.m Class definition.
Copyright (C) 1995 David Flater.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "cheezmud.h"
@implementation Room
+ new
{
self = [super new];
contents = [OrdCltn new];
n = s = e = w = u = d = NULL;
return self;
}
- n: who
{
assert (n);
[[who getlocation] emote: who: "leave": "leaves": " north"];
[who setlocation: n];
[[who getlocation] emote: who: "arrive": "arrives": " from the south"];
return self;
}
- s: who
{
assert (s);
[[who getlocation] emote: who: "leave": "leaves": " south"];
[who setlocation: s];
[[who getlocation] emote: who: "arrive": "arrives": " from the north"];
return self;
}
- e: who
{
assert (e);
[[who getlocation] emote: who: "leave": "leaves": " east"];
[who setlocation: e];
[[who getlocation] emote: who: "arrive": "arrives": " from the west"];
return self;
}
- w: who
{
assert (w);
[[who getlocation] emote: who: "leave": "leaves": " west"];
[who setlocation: w];
[[who getlocation] emote: who: "arrive": "arrives": " from the east"];
return self;
}
- u: who
{
assert (u);
[[who getlocation] emote: who: "leave": "leaves": " up"];
[who setlocation: u];
[[who getlocation] emote: who: "arrive": "arrives": " from below"];
return self;
}
- d: who
{
assert (d);
[[who getlocation] emote: who: "leave": "leaves": " down"];
[who setlocation: d];
[[who getlocation] emote: who: "arrive": "arrives": " from above"];
return self;
}
/* Link up the map. */
- setexit: (char *) direction: destination
{
assert (direction);
assert (destination);
assert ([destination isKindOf: [Room class]]);
switch (direction[0]) {
case 'n':
n = destination;
break;
case 's':
s = destination;
break;
case 'e':
e = destination;
break;
case 'w':
w = destination;
break;
case 'u':
u = destination;
break;
case 'd':
d = destination;
break;
default:
assert (0);
}
return self;
}
- free
{
/* Free is disallowed for rooms. That way I don't have to worry about */
/* what happens to all the stuff that's in the room when it goes away */
/* and how to change the movement actions of adjoining rooms. */
assert (0);
return self;
}
- (float) priority: (char *) action: (int) numargs
{
if (numargs == 1) {
if (!strcmp (action, "n")) {
if (n)
return 10.0;
else
return -1.0;
}
if (!strcmp (action, "s")) {
if (s)
return 10.0;
else
return -1.0;
}
if (!strcmp (action, "e")) {
if (e)
return 10.0;
else
return -1.0;
}
if (!strcmp (action, "w")) {
if (w)
return 10.0;
else
return -1.0;
}
if (!strcmp (action, "u")) {
if (u)
return 10.0;
else
return -1.0;
}
if (!strcmp (action, "d")) {
if (d)
return 10.0;
else
return -1.0;
}
}
/* Not supported */
return -1.0;
}
- echo: (char *) text
{
/* A room echo is sent to everybody in the room. */
int i,c;
for(i=0,c=[contents size];i<c;i++) {
id whatever = [contents at:i];
[whatever echo: text];
}
return self;
}
- theres_a_fight_going_on
{
[contents elementsPerform: @selector(theres_a_fight_going_on)];
return self;
}
/* Emote is like echo except that it distinguishes 2nd and 3rd person */
- emote: emoter: (char *) verb_you: (char *) verb_he: (char *) emotion
{
int i,m;
for(i=0,m=[contents size];i<m;i++) {
char temp[160];
id whatever = [contents at:i];
if (emoter == whatever) {
/* Dirty kluge: don't tell people "You arrive" every time they move! */
if (!strcmp (verb_you, "arrive"))
continue;
sprintf (temp, "You %s%s.", verb_you, emotion);
}
else
sprintf (temp, "%s %s%s.", capitalize ([emoter def]), verb_he,
emotion);
[whatever echo: temp];
}
return self;
}
- emote: emoter: (char *) verb_you: (char *) verb_he: dobj: (char *) emotion
{
int i,m;
for(i=0,m=[contents size];i<m;i++) {
char temp[160], a2[80];
id whatever = [contents at:i];
if (dobj == whatever)
strcpy (a2, "you");
else
strcpy (a2, [dobj def]);
if (emoter == whatever)
sprintf (temp, "You %s %s%s.", verb_you, a2, emotion);
else
sprintf (temp, "%s %s %s%s.", capitalize ([emoter def]), verb_he,
a2, emotion);
[whatever echo: temp];
}
return self;
}
/* Same as emote, but doesn't add punctuation. */
- say: emoter: (char *) verb_you: (char *) verb_he: (char *) emotion
{
int i,m;
for(i=0,m=[contents size];i<m;i++) {
char temp[160];
id whatever = [contents at:i];
if (emoter == whatever)
sprintf (temp, "You %s%s", verb_you, emotion);
else
sprintf (temp, "%s %s%s", capitalize ([emoter def]), verb_he,
emotion);
[whatever echo: temp];
}
return self;
}
/* Put somebody in the room. */
- add: somebody
{
[contents add: somebody];
return self;
}
/* Take somebody out of the room. */
- remove: somebody
{
[contents remove: somebody];
return self;
}
/* Echo contents to somebody, excluding the person looking. */
- listcontents: who
{
int i,m;
if ([contents includes: who]) {
if ([contents size] < 2)
return self;
} else
if ([contents isEmpty])
return self;
[who echo: "Also here:"];
for(i=0,m=[contents size];i<m;i++) {
id whatever = [contents at:i];
if (who != whatever)
[who echo: capitalize ([whatever indef])];
}
return self;
}
/* Find something that is directly in the room. */
- find: (char *) what: (int) number
{
return generic_find (contents, what, number);
}
- contents
{
return contents;
}
- (int) capacity
{
return 1000000;
}
- dirquery: (char) dir
{
switch (dir) {
case 'n':
return n;
case 's':
return s;
case 'e':
return e;
case 'w':
return w;
case 'u':
return u;
case 'd':
return d;
}
assert (0);
return self;
}
@end