/*
* We are sent the line of the menu...
* From this, we are supposed to figure out whats actually here...
*/
#include "gopher.h"
#define VOID_OB "/room/void"
#undef DEBUG
#ifdef DEBUG
#define TP(STR) tell_object(find_player("pinkfish"), STR)
#else
#define TP(STR)
#endif
inherit "/std/room";
mixed *my_menu,
*junk,
*my_junk;
string room_long, rabbit;
int search_room;
mapping blue,
pending;
void setup() {
blue = ([ ]);
pending = ([ ]);
my_menu = ({ });
add_exit("up", "who_cares", "corridor");
modify_exit("up", ({ "function", "do_up" }));
add_exit("out", "/w/common", "corridor");
modify_exit("out", ({ "function", "do_out" }));
room_long = "";
} /* create() */
void init() {
if (rabbit)
write(long("", 0));
::init();
if (blue[this_player()]) {
this_player()->more_string(blue[this_player()]);
map_delete(blue, this_player());
}
/*
for (i=0;i<sizeof(my_menu);i++)
add_action("handle_item", (i+1)+"");
*/
add_action("do_refresh", "refresh");
add_action("do_jump", "gopher");
add_action("do_show", "show");
} /* init() */
long() {
object *obs;
string *cont, str;
int i, cols;
if (this_player())
cols = this_player()->query_cols();
else
cols = 78;
return "You are in the gopher maze.\n"+sprintf("%-*#s", cols, room_long)+
"\n'gopher <dest> [port]' to jump to another server, "+
"and 'refresh'"+
" to refresh the room.\n"+::long();
} /* query_long() */
void setup_room(mixed *junk, string arg) {
set_short(junk[TEXT]);
if (!arg)
if (junk[NAME] == "1")
GOPHER_CONTROL->add_connection("\t"+junk[MACHINE]+"\t"+
junk[PORT], this_object());
else
GOPHER_CONTROL->add_connection(junk[NAME]+"\t"+junk[MACHINE]+"\t"+
junk[PORT], this_object());
if (arg || junk[TEXT] == "who") {
search_room = 1;
set_heart_beat(1);
}
my_junk = junk;
set_long("Connecting.\n");
GOPHERD->do_connect(MENU, junk[NAME], junk[MACHINE], junk[PORT],
"finish_lookup", arg);
} /* setup() */
mixed *query_my_junk() { return my_junk; }
mixed *query_my_menu() { return my_menu; }
void finish_lookup(mixed *junk, mixed *called) {
int i, my_number, exit_no;
string my_path, *bits, cont, ret;
object *obs;
if (!junk) {
tell_room(this_object(), "Failed to connect.\n");
return 0;
}
bits = explode(file_name(this_object()), "/");
cont = implode(bits[0..sizeof(bits)-2], "/")+"/gopher_cont";
tell_room(this_object(), "Connection completed.\n");
ret = "";
my_menu = junk;
for (i=0;i<sizeof(junk);i++) {
switch (junk[i][TYPE]) {
case FILE :
ret += sprintf("%2d: %s\n", i+1, junk[i][DATA][TEXT]);
break;
case MENU :
ret += sprintf("%2d: %s/\n", i+1, junk[i][DATA][TEXT]);
break;
case SEARCH :
ret += sprintf("%2d: %s <?>\n", i+1, junk[i][DATA][TEXT]);
break;
}
add_exit((i+1)+"", "hmmmm", "corridor");
modify_exit((i+1)+"", ({ "function", "handle_item", "obvious", 0 }));
}
room_long = ret;
set_long("");
rabbit = 1;
(obs = all_inventory())->move(VOID_OB);
obs->move(this_object());
rabbit = 0;
} /* finish_lookup() */
void text_finish(string text, mixed *junk) {
string tmp;
int i;
object *obs;
TP(sprintf("%O\n", junk));
tmp = junk[0]+"\t"+junk[1];
if (!pending[tmp]) {
tell_room(this_object(), "Something weird.\n");
return ;
}
TP(sprintf("BING?, %O", pending[tmp]));
for (i=0;i<sizeof(pending[tmp]);i++) {
blue[pending[tmp][i]] = text;
map_delete(pending, pending[tmp][i]);
}
map_delete(pending, tmp);
TP("Doing move...\n");
(obs = all_inventory())->move(VOID_OB);
obs->move(this_object());
} /* text_finish() */
int handle_item() {
int num;
object dest;
mixed *tmp;
string bip;
sscanf(query_verb(), "%d", num);
num--;
if (pending[this_player()]) {
notify_fail("You have a pending transaction.\n");
return 0;
}
switch (my_menu[num][TYPE]) {
case FILE :
pending[this_player()] = 1;
bip = my_menu[num][DATA][NAME]+"\t"+my_menu[num][DATA][PORT];
if (!pending[bip]) {
GOPHERD->do_connect(FILE, my_menu[num][DATA][NAME],
my_menu[num][DATA][MACHINE],
my_menu[num][DATA][PORT],
"text_finish");
pending[bip] = ({ this_player() });
} else /* Someone is already getting it. */
pending[bip] += ({ this_player() });
/* We dont actually want to move them... */
notify_fail("Connecting....\n");
return 0;
break;
case MENU :
if (my_menu[num][DATA][NAME] == "1")
my_menu[num][DATA][NAME] = "";
if (!(dest = GOPHER_CONTROL->query_connection(my_menu[num][DATA][NAME]+
"\t"+my_menu[num][DATA][MACHINE]+"\t"+my_menu[num][DATA][PORT]))) {
/* Need a new room... */
dest = clone_object(GOPHER_ROOM);
dest->setup_room(my_menu[num][DATA]);
}
modify_exit(query_verb(), ({ "dest", dest }));
tmp = this_player()->query_property("gopher");
if (!tmp)
tmp = ({ });
tmp = tmp - ({ 0 });
this_player()->add_property("gopher", tmp+({ this_object() }));
break;
case SEARCH :
/* Now a search requires a room, but an unregistered one. */
write("You need to give the magic incantation to pass this exit.\n: ");
input_to("do_gopher_search", 0, num);
notify_fail("");
return 0;
}
return 1;
} /* handle_item() */
void do_gopher_search(string str, int num) {
object dest;
mixed *tmp;
printf("In here.\n");
dest = clone_object(GOPHER_ROOM);
dest->setup_room(my_menu[num][DATA], str);
tmp = this_player()->query_property("gopher");
if (!tmp)
tmp = ({ });
tmp = tmp - ({ 0 });
this_player()->add_property("gopher", tmp+({ this_object() }));
modify_exit((num+1)+"", ({ "dest", dest }));
this_player()->move_player("X", dest);
} /* do_search() */
int do_refresh(string str) {
if (search_room && !str) {
notify_fail("Syntax: refresh <text>\n");
return 0;
}
if (search_room)
setup_room(my_junk, str);
else
setup_room(my_junk, 0);
write("Refreshing...\n");
return 1;
} /* do_refresh() */
int do_up() {
object dest, *tmp;
int i;
if (!(tmp = this_player()->query_property("gopher"))) {
this_player()->remove_property("gopher");
call_out("do_exit_command", 0, "out");
notify_fail("");
return 0;
} else {
tmp = tmp - ({ 0 });
for (i=sizeof(tmp)-1;i>=0;i--)
if (tmp[i]) break;
if (i < 0) {
this_player()->remove_property("gopher");
call_out("do_exit_command", 0, "out");
notify_fail("");
return 0;
} else {
if (i)
this_player()->add_property("gopher", tmp[0..i-1]);
else
this_player()->add_property("gopher", 0);
dest = tmp[i];
}
}
modify_exit("up", ({ "dest", dest }));
return 1;
} /* do_up() */
void heart_beat() {
if (!sizeof(all_inventory()))
dest_me();
} /* heart_beat() */
int do_jump(string str) {
string host;
int port;
object dest;
mixed *tmp;
if (!str) {
notify_fail("Syntax: "+query_verb()+" <site> [port]\n");
return 0;
}
if (sscanf(str, "%s %d", host, port) != 2) {
host = str;
port = "70";
}
dest = GOPHER_CONTROL->query_connection("\t"+host+"\t"+port);
if (!dest) {
dest = clone_object(GOPHER_ROOM);
dest->setup_room(({ "Root level of "+host, "", host, port+"" }));
}
tmp = this_player()->query_property("gopher");
if (!tmp)
tmp = ({ });
this_player()->add_property("gopher", tmp+({ this_object() }));
this_player()->move_player("X", dest);
return 1;
} /* do_jump() */
/* Get me out of here! */
int do_out() {
this_player()->remove_property("gopher");
return 1;
} /* do_out() */
int do_show(string str) {
int num;
notify_fail("Syntax: show <num>\n");
if (!str)
return 0;
if (sscanf(str, "%d", num) != 1 || num < 1 || num > sizeof(my_menu))
return 0;
num--;
write("Text: "+my_menu[num][DATA][TEXT]+"\n");
write("Name: "+my_menu[num][DATA][NAME]+"\n");
write("Host: "+my_menu[num][DATA][MACHINE]+"\n");
write("Port: "+my_menu[num][DATA][PORT]+"\n");
return 1;
} /* do_who() */