This is from SillyMUD... please give SillyMUD some credit for this. Also, give me (Billy H. Chan (Strom)) some credit for modifying and adding stuff to the code. (also, use OasisOLC... I forgot how it's written into file.. I think it's a "T" section, please look at the db.c saving area for info on this.) Things that needs updating: In act.wizard.c: add: #include "teleport.h" in do_stat_room, somewhere, add: if (rm->tele != NULL) { sprintf(buf, "Teleports every %d0 (current %d0) seconds to %20s (Room %d)\r\n", rm->tele->time, rm->tele->cnt, world[real_room(rm->tele->targ)].name, rm->tele->targ); send_to_char(buf, ch); send_to_char("Teleport Flags :", ch); sprintbit(rm->tele->mask, teleport_bits, buf); send_to_char(buf, ch); send_to_char("\r\n",ch); if (IS_SET(rm->tele->mask, TELE_OBJ) || IS_SET(rm->tele->mask, TELE_NOOBJ)) { j = read_object(rm->tele->obj, VIRTUAL); sprintf(buf, "Teleport Object : %s\r\n", j->short_description); send_to_char(buf, ch); extract_obj(j); } } in do_show, add a place for teleport and (using the right case): case 14: /* teleport */ strcpy(buf, "Teleport Rooms\r\n--------------\r\n"); for (i = 0, j = 0; i <= top_of_world; i++) if (world[i].tele != NULL) sprintf(buf, "%s%2d: [%5d] %-24.24s Targ: %5d\r\n", buf, ++j, world[i].number, world[i].name, world[i].tele->targ); page_string(ch->desc, buf, 1); break; in comm.c: add: #include "teleport.h" move int pulse = 0; from within game_loop to outside game_loop in heartbeat(int pulse), add the following: /* Do teleport stuff */ if (teleport_on && !(pulse % PULSE_TELEPORT)) TeleportPulseStuff(); in config.c: add: /* is teleport rooms working yet? */ int teleport_on = YES; in constants.c: Add a ROOM_TELEPORT flag in structs.h and constants.c add: char *teleport_bits[] = { "ForceLook", "EntryResetsTime", "SetsRandomTime", "Spin(NOT AVAIL)", "HasOBJinInv", "NoOBJinInv", "NoMesgDisplay", "SkipMobs", "SkipGroundObjects", "\n" }; in db.c: in parse_room(FILE *fl, int virtual_nr) add: struct teleport_data *new_tele; world[room_nr].tele = NULL; after CASE 'S': add: case 'T': if (!get_line(fl, line) || sscanf(line, " %d %s %d %d", t, flags, t+2, t+3) != 4) { fprintf(stderr, "Format error in room #%d's section T\n", virtual_nr); exit(1); } CREATE(new_tele, struct teleport_data, 1); world[room_nr].tele = new_tele; world[room_nr].tele->targ = t[0]; world[room_nr].tele->mask = asciiflag_conv(flags); world[room_nr].tele->time = t[2]; world[room_nr].tele->obj = t[3]; break; in handler.c: in char_to_room(struct char_data *ch, int room) add (within the else): /* TELEPORTATION CODE */ if (!IS_NPC(ch) && world[ch->in_room].tele != NULL) { if (world[ch->in_room].tele->cnt > 0 && world[ch->in_room].tele->time == 0) { /* this is a teleport countdown room */ world[ch->in_room].tele->time = pulse + world[ch->in_room].tele->cnt; if (world[ch->in_room].tele->time % 10) { world[ch->in_room].tele->time += 10 - (world[ch->in_room].tele->time % 10); } if (world[ch->in_room].tele->time > 2400) { world[ch->in_room].tele->time = world[ch->in_room].tele->cnt; /* start of next day */ } } } if using OASISOLC, in redit.c: add: #include "teleport.h" void redit_disp_teleport_menu(struct descriptor_data *d); in redit_setup_new(struct descriptor_data *d) add: struct teleport_data *new_tele; /* set up teleporter */ CREATE(new_tele, struct teleport_data, 1); OLC_ROOM(d)->tele = new_tele; OLC_ROOM(d)->tele->time = MIN_TELEPORT_FREQ; in redit_setup_existing(...) add: struct teleport_data *new_tele; /* setup teleporter */ CREATE(new_tele, struct teleport_data, 1); room->tele = new_tele; if (world[real_num].tele != NULL) { room->tele->targ = world[real_num].tele->targ; room->tele->time = world[real_num].tele->time; room->tele->mask = world[real_num].tele->mask; room->tele->cnt = world[real_num].tele->cnt; room->tele->obj = world[real_num].tele->obj; } else { room->tele->time = MIN_TELEPORT_FREQ; } in redit_save_internally(...) add: if (OLC_ROOM(d)->tele->targ == 0) { /* this is a null teleport! Remove it! */ REMOVE_BIT(OLC_ROOM(d)->room_flags, ROOM_TELEPORT); free(OLC_ROOM(d)->tele); OLC_ROOM(d)->tele = NULL; } in redit_save_to_disk(...) after room->ex_description stuff: /* save teleport info */ if ((room->tele != NULL) && (room->tele->targ > 0)) { sprintf(buf, "T\n%d %s %d %d\n", room->tele->targ, sprintbitascii(room->tele->mask, buf1), room->tele->time, room->tele->obj); fputs(buf, fp); } in free_room(...): if (room->tele) free(room->tele); in redit_disp_menu(...) add: char buf3[200]; sprintbit(room->tele->mask, teleport_bits, buf3); after "%sB%s) Extra descriptions menu\r\n" add: "%sC%s) Tele-Target : %s%s (Set to '0' (The Void) to disable)\r\n" "%sD%s) Tele-Freq : %s%d*10 seconds\r\n" "%sE%s) Tele-Flags : %s%s\r\n" "%sF%s) Tele-Obj : %s%d (%s flag is set)\r\n" "%sQ%s) Quit\r\n" after grn, nrm, /* B: Description */ add: grn, nrm, cyn, world[real_room(room->tele->targ)].name, grn, nrm, cyn, room->tele->time, grn, nrm, cyn, buf3, grn, nrm, cyn, room->tele->obj, (IS_SET(room->tele->mask, TELE_NOOBJ) ? "if not have Obj" : "if has Obj"), in redit_parse(...) after case 'b' add: case 'c': case 'C': send_to_char("Enter target vnum: ", d->character); OLC_MODE(d) = REDIT_TELEPORT_TARGET; break; case 'd': case 'D': send_to_char("Enter teleport frequency: ", d->character); OLC_MODE(d) = REDIT_TELEPORT_FREQ; break; case 'e': case 'E': redit_disp_teleport_menu(d); break; case 'f': case 'F': send_to_char("Enter Object's Vnum: ", d->character); OLC_MODE(d) = REDIT_TELEPORT_OBJ; break; also, before default: /*we should never get here*/ add: case REDIT_TELEPORT_TARGET: if (isdigit(*arg)) { number = atoi(arg); if (real_room(number) != -1) { if (number == 0) { /* remove TELEPORT flag from room */ REMOVE_BIT(OLC_ROOM(d)->room_flags, ROOM_TELEPORT); } else { SET_BIT(OLC_ROOM(d)->room_flags, ROOM_TELEPORT); } OLC_ROOM(d)->tele->targ = number; break; } } send_to_char("That was not a valid room, please try again: ", d->character); return; case REDIT_TELEPORT_FREQ: if (isdigit(*arg)) { number = atoi(arg); if (number >= MIN_TELEPORT_FREQ && number <= MAX_TELEPORT_FREQ) { OLC_ROOM(d)->tele->time = number; break; } } sprintf(buf, "That was not a valid number.\r\n" "Please enter a frequency between %d and %d: ", MIN_TELEPORT_FREQ, MAX_TELEPORT_FREQ); send_to_char(buf, d->character); return; case REDIT_TELEPORT_OBJ: if (isdigit(*arg)) { number = atoi(arg); if (real_object(number) != -1) { OLC_ROOM(d)->tele->obj = number; break; } } send_to_char("That was not a valid number, please enter the object's VNUM: ", d->character); return; case REDIT_TELEPORT_MENU: number = atoi(arg); if (number < 0 || number > NUM_TELEPORT) { redit_disp_teleport_menu(d); } else { if (number == 0) break; else { if (IS_SET(OLC_ROOM(d)->tele->mask, 1 << (number - 1))) REMOVE_BIT(OLC_ROOM(d)->tele->mask, 1 << (number - 1)); else SET_BIT(OLC_ROOM(d)->tele->mask, 1 << (number - 1)); redit_disp_teleport_menu(d); } } return; add the following function to redit.c: /* For teleport flags */ void redit_disp_teleport_menu(struct descriptor_data *d) { int counter, columns = 0; get_char_cols(d->character); send_to_char("^[[H^[[J", d->character); for (counter = 0; counter < NUM_TELEPORT; counter ++) { sprintf(buf, "%s%2d%s) %-20.20s ", grn, counter + 1, nrm, teleport_bits[counter]); if(!(++columns % 2)) strcat(buf, "\r\n"); send_to_char(buf, d->character); } sprintbit(OLC_ROOM(d)->tele->mask, teleport_bits, buf1); sprintf(buf, "\r\nTeleport flags, %s%s%s\r\n" "Enter teleport flags, 0 to quit : ", cyn, buf1, nrm ); send_to_char(buf, d->character); OLC_MODE(d) = REDIT_TELEPORT_MENU; } in comm.h: add: extern int pulse; /* pulled out for teleport */ in constants.h: add: extern char *teleport_bits[]; in db.h: add: extern int teleport_on; Add a flag in structs.h and constants.c for ROOM_TELEPORT in structs.h: add: struct teleport_data { int time; room_num targ; long mask; int cnt; obj_num obj; };