/* A christmas tree, for hanging ornaments on.
* Very customized board object, Wonderflug, Dec 95
*/
#include "mail.h"
inherit "/std/object";
#include "board.h"
#define MAX_XMAS_POSTS 2
/* Taniwha 1995, a list of immort write only boards, easy to extend */
static string *readonly = ({"playerinfo","quests","announcements"});
string board_name;
mapping being_written;
int action_pri;
void setup() {
set_name("tree");
set_short("A Huge Christmas Tree");
set_long("This is a HUGE Christmas tree, towering at least "
"40 feet in the air. Christmas candles and popcorn strings and "
"decorations cover it from top to bottom, and a little "
"charicature of Baldrick adorns the very top of it. You have the "
"sudden urge to 'create' an ornament for it, as many others have done. "
"Or just look at all the ornaments (with 'ornaments'). "
"And maybe 'study' the interesting ones.\n");
set_main_plural("trees");
reset_get();
board_name = "christmas";
this_object()->set_datafile("christmas");
being_written = ([ ]);
action_pri = 0;
} /* setup() */
int subjects(string str, int dark) {
int i;
mixed *stuff;
string ret;
mapping news_rc;
stuff = (mixed *)BOARD_HAND->get_subjects(board_name);
if (!sizeof(stuff)) {
notify_fail("The Christmas tree is bare of ornaments! It looks "
"so lonely.\n");
return 0;
}
news_rc = (mapping)this_player()->query_property(NEWS_RC);
if ( !news_rc )
news_rc = ([ ]);
ret = "You see the following ornaments hung on the tree:\n\n";
for (i=0;i<sizeof(stuff);i++)
if (news_rc[board_name] < stuff[i][B_TIME])
ret += (i+1)+". (New) A "+stuff[i][B_SUBJECT]+" hung by "+
capitalize(stuff[i][B_NAME])+"\n";
else
ret += (i+1)+". A "+stuff[i][B_SUBJECT]+" hung by "+
capitalize(stuff[i][B_NAME])+"\n";
this_player()->set_finish_func(0);
this_player()->more_string(ret);
return 1;
} /* subjects() */
void init() {
add_action("read", "study");
add_action("post", "create");
add_action("break_orn", "break");
add_action("subjects", "ornaments");
} /* init() */
void string_more(string arg, string prompt) {
object obj;
this_player()->set_finish_func(0);
this_player()->more_string(arg, prompt);
} /* string_more() */
int read(string str) {
int num, i;
mixed stuff;
mapping news_rc;
notify_fail("Syntax: study [ornament] <number>\n");
if ( !str )
return 0;
if ( sscanf(str, "%d", num) != 1 && sscanf(str, "ornament %d", num ) != 1 )
return 0;
stuff = (mixed *)BOARD_HAND->get_subjects(board_name);
news_rc = (mapping)this_player()->query_property(NEWS_RC);
if (!news_rc)
news_rc = ([ ]);
if (num < 1 || num > sizeof(stuff)) {
notify_fail("No ornament of that number.\n");
return 0;
}
num --;
if (news_rc[board_name] < stuff[num][B_TIME]) {
news_rc[board_name] = stuff[num][B_TIME];
this_player()->add_property(NEWS_RC, news_rc);
}
string_more(sprintf("%s's ornament is a %s that looks like this: \n",
capitalize(stuff[num][B_NAME]),
stuff[num][B_SUBJECT][0..(int)this_player()->query_cols()-10])+
BOARD_HAND->get_message(board_name, num),
"["+capitalize(stuff[num][B_NAME])+"'s ornament]");
return 1;
} /* read() */
int post(string str) {
string body;
mixed stuff;
int i, num_posts;
num_posts=0;
stuff = (mixed*)BOARD_HAND->get_subjects(board_name);
for (i=0;i<sizeof(stuff);i++)
if ( this_player()->query_name() == stuff[i][B_NAME] )
num_posts++;
if ( num_posts >= MAX_XMAS_POSTS )
{
notify_fail("You have already hung too many ornaments on the tree!\n");
return 0;
}
notify_fail("Syntax: create a <ornament>\n");
if ( !str || sscanf(str, "a %s", str) != 1 )
return 0;
write("Note that you can only add one ornament to the tree.\n");
write("Now you need to enter a description for your ornament.\n");
being_written[this_player()->query_name()] = str;
this_player()->do_edit(0,"end_of_thing");
return 1;
} /* post() */
void end_of_thing(string body) {
if (body && body != "" && being_written[this_player()->query_name()])
if (!BOARD_HAND->add_message(board_name, this_player()->query_name(),
being_written[this_player()->query_name()], body))
write("Oops you dropped the ornament on the ground, and it broke.\n");
else
write("You hang your ornament on the tree.\n");
else
write("Error.\n");
being_written = m_delete(being_written, this_player()->query_name());
return ;
} /* end_of_thing() */
int break_orn(string str) {
int num, i, eaten;
notify_fail("Syntax: break [up to] <ornament number>\n");
if (!str)
return 0;
if (sscanf(str, "up to %d", num)) {
for (i=0;i<num;i++)
eaten += (int)BOARD_HAND->delete_message(board_name, i);
if (!eaten) {
notify_fail("Failed to break any ornaments.\n");
return 0;
}
write("You broke "+eaten+" ornaments, you grinch!\n");
say(this_player()->query_cap_name()+" visciously rips off and shatters "+
query_num(eaten, 0)+" ornaments.\n");
if (eaten == 1)
event(users(), "inform", this_player()->query_cap_name()+" eats a note "+
"off "+board_name, "message");
else
event(users(), "inform", this_player()->query_cap_name()+" eats "+
query_num(eaten, 0)+" notes off "+board_name, "message");
return 1;
} else if (sscanf(str, "%d", num) != 1)
return 0;
if (!BOARD_HAND->delete_message(board_name, num-1))
return 0;
write("You viciously tear off and break ornament "+num+"\n");
say(this_player()->query_cap_name()+" viciously tears off and eats note "+
num+".\n");
event(users(), "inform", this_player()->query_cap_name()+" eats a note "+
"off "+board_name, "message");
return 1;
} /* eat() */
void set_board_name(string str) {
board_name = str;
BOARD_HAND->create_board(board_name, 0);
}
void set_datafile(string str) {
set_board_name(str);
/*board_name = str;*/
}
int query_new_messages() {
mixed *notes;
mapping news_rc;
news_rc = (mapping)this_player()->query_property(NEWS_RC);
if (!news_rc)
news_rc = ([ ]);
notes = (mixed *)BOARD_HAND->get_subjects(board_name);
if (!sizeof(notes)) return 0;
return (notes[sizeof(notes)-1][B_TIME] > news_rc[board_name]);
} /* query_new_messages() */