string current_room; int num_room; string data; /* * Data about current room; */ string data_this_room, room_complete, last_fail; id(str) { return str == "mapper" || str == "robot mapper" || str == "robot"; } short() { return "A mapper robot"; } long() { write("A small and highly movable robot. It constantly looks in all\n"); write("directions, storing all information.\n"); } reset(arg) { if (arg) return; set_heart_beat(1); enable_commands(); current_room = "start"; data = ""; data_this_room = ""; room_complete = 0; } heart_beat() { int i; string cmd, scratch; object here; i = random(6); if (i == 0) cmd = "north"; else if (i == 1) cmd = "west"; else if (i == 2) cmd = "south"; else if (i == 3) cmd = "east"; else if (i == 4) cmd = "up"; else if (i == 5) cmd = "down"; scratch = get_dir(cmd); if (scratch[0] == '!') { last_fail = cmd; return; } last_fail = ""; here = environment(this_object()); command(cmd); if (here == environment(this_object())) mark_dir_complete(cmd); } move_player(dir_dest) { string dir, dest; object ob; int is_light; if (sscanf(dir_dest, "%s#%s", dir, dest) != 2) return; if (get_dir(dir) == "") data_this_room = data_this_room + dir + "-" + dest + ","; insert(); log_file("mapper", current_room + ":\t" + dir + "\t" + dest + "\n"); current_room = dest; if (dir == "X") say("The mapper robot falls through a singularity\n"); else say("The mapper robot leaves " + dir + ".\n"); move_object(this_object(), dest); is_light = set_light(0); if(is_light < 0) is_light = 0; say("The mapper robot arrives.\n"); get_this_room(); } query_name() { return "Mapper robot"; } show_stats() { write("This is the mapper robot\n"); write("Current room: " + current_room + "\n"); write("Number of rooms visited: " + num_room + "\n"); write("Current room complete: " + room_complete + "\n"); write("Room data: " + data_this_room + "\n"); write("Data:\n" + data + "\n"); write("Last failed dir: " + last_fail + "\n"); } /* * Extract current room out of data base. */ get_this_room() { string rest, tmp; string scratch; rest = data; data = ""; while(rest != "") { sscanf(rest, "%s\n%s", tmp, rest); if (sscanf(tmp, current_room + ":%s(%d)", data_this_room, room_complete) == 2) { data = data + rest; return; } data = data + tmp + "\n"; } data_this_room = ""; num_room += 1; room_complete = 0; } get_dir(dir) { string rest, tmp_dir, tmp_dest; rest = data_this_room; while(rest != "") { sscanf(rest, "%s-%s,%s", tmp_dir, tmp_dest, rest); if (tmp_dir == "!" + dir) return "!"; if (tmp_dir == dir) return tmp_dest; } return ""; } mark_dir_complete(dir) { string rest, tmp_dir, tmp_dest; rest = data_this_room; data_this_room = ""; room_complete += 1; while(rest != "") { sscanf(rest, "%s-%s,%s", tmp_dir, tmp_dest, rest); if (tmp_dir == dir) { data_this_room = data_this_room + "!" + tmp_dir + "-" + tmp_dest + "," + rest; return; } data_this_room = data_this_room + tmp_dir + "-" + tmp_dest + ","; } data_this_room = data_this_room + "!" + dir + "-" + ","; } insert() { if (current_room == "start") return; data = data + current_room + ":" + data_this_room + "(" + room_complete + ")\n"; } force_us(str) { command(str); }