/* notify.c */
#include "copyright.h"
#include "config.h"
#include <stdio.h>
#include "teeny.h"
void notify_except();
/*
* Routines for sending strings to players.
*/
void notify_bad(player)
int player;
{
notify_player(player, "Something truly horrid happened. Good luck.\r\n");
}
void do_huh(player)
int player;
{
notify_player(player, "Huh? (Type \"help\" for help.)\r\n");
}
/*
* Echoes the string to everyone in the room the player is in, except the
* player itself
*
*/
void notify_oall(player, str)
int player;
char *str;
{
notify_except(player, str, player);
}
/*
* Echoes the string to everyone in the room the player is in.
*/
void notify_all(player, str)
int player;
char *str;
{
notify_except(player, str, -1);
}
/*
* Writes a list out to a player, displaying numbers and so forth when
* appropriate.
*
*/
void notify_list(player, list, buff, siz, dark_ok)
int player; /* Obj # of player. */
int list; /* Obj # of 1st list element */
char *buff;
int siz;
int dark_ok;
{
int count;
/* Loop over the whole list */
for (count = 0; list != -1 && count < MAXLIST; count++) {
if (!dark_ok) {
if (!can_see(player, list)) { /* Skip this name */
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_list", "bad next reference");
break;
}
continue;
}
}
if ((dark_ok && (list == player)) || list != player) {
char *z;
z = stuff_name(player, list);
if (strlen(z) > (siz - 3))
z[siz - 4] = 0; /* trunicate it */
(void) strcpy(buff, z);
(void) strcat(buff, "\r\n");
notify_player(player, buff);
}
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_list", "bad next reference");
break;
}
}
}
/*
* Notifies everyone in the room where player is, except possibly the
* specified object number (typically either player or -1)
*
*/
void notify_except(player, str, except)
int player;
char *str;
int except;
{
int location, list;
if (get_int_elt(player, LOC, &location) == -1) {
warning("notify_except", "bad player location ref");
return;
}
/* Grab the first thing in the contents list */
if (get_int_elt(location, CONTENTS, &list) == -1) {
warning("notify_except", "bad contents reference on player loc");
return;
}
/* Trot down the contents list, looking for objects that are alive */
while (list != -1) {
if (!exists_object(list)) {
warning("notify_except", "non existant object in contents list");
continue;
}
if (isalive(list) && list != except) {
notify_player(list, str);
}
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_except", "bad reference to contents list");
return;
}
}
}
/* notify everyone in player's location except two people */
void notify_except2(player, string, except1, except2)
int player;
char *string;
int except1, except2;
{
int loc, list;
if (get_int_elt(player, LOC, &loc) == -1) {
warning("notify_except2", "bad loc ref on player");
return;
}
if (get_int_elt(loc, CONTENTS, &list) == -1) {
warning("notify_except2", "bad contents list on loc");
return;
}
while (list != -1) {
if (isalive(list) && (list != except1 && list != except2))
notify_player(list, string);
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_except2", "bad next ref on object");
return;
}
}
}
void notify_contents(loc, str)
int loc;
char *str;
{
int list;
if (get_int_elt(loc, CONTENTS, &list) == -1) {
warning("notify_contents", "bad contents list");
return;
}
while (list != -1) {
if (isalive(list))
notify_player(list, str);
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_contents", "bad next ref");
return;
}
}
}
void notify_exits(player, list)
int player, list;
{
char buffer[1024];
char *name, *p;
int any = 0;
(void) strcpy(buffer, "Obvious exits:\r\n");
p = buffer + 16;
while (list != -1) {
if (!isobvious(list)) {
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_exits", "bad next ref");
return;
}
continue;
}
if (!any)
any = 1;
if (get_str_elt(list, NAME, &name) == -1) {
warning("notify_exits", "bad name ref");
return;
}
while (name[0] == ' ' || name[0] == ';')
name++;
for (; *name && *name != ';' && (p - buffer) < 1000; *p++ = *name++);
if ((p - buffer) > 999) {
*p++ = '\r';
*p++ = '\n';
*p = 0;
break;
}
*p++ = ',';
*p++ = ' ';
if (get_int_elt(list, NEXT, &list) == -1) {
warning("notify_exits", "bad next ref");
return;
}
}
if (any) {
p -= 2;
p[0] = '\r';
p[1] = '\n';
p[2] = 0;
notify_player(player, buffer);
}
}