This is a combination of Tony Robbins and Glenn Campbell Portal Code...with a little of me...Modified to work with Circle30bpl17... Mainly from Tony Robbins Code, tho.. Me, I am just here. . . :-) Felix hope this is of use to someone.. structs.h Add an item type for portal: #define ITEM_PORTAL 24 /* or whatever the next highest number is */ constants.c Add a listing in item_types[] for portals. limits.c After the code to extract a corpse but within that for statement add: if (GET_OBJ_TYPE(j) == ITEM_PORTAL) { if (GET_OBJ_TIMER(j) > 0) GET_OBJ_TIMER(j)--; if (!GET_OBJ_TIMER(j)) { act("A glowing portal fades from existance.", TRUE, world[j->in_room].people, j, 0, TO_ROOM); act("A glowing portal fades from existance.", TRUE, world[j->in_room].people, j, 0, TO_CHAR); extract_obj(j); } } spells.h Add: #define SPELL_GATE 53 /* or whatever the netx highest number is */ And where the other ASPELL prototypes are: ASPELL(spell_gate); spell_parser.c In the spell names list: "gate", In call_magic() where other manual spells are called: case SPELL_GATE: MANUAL_SPELL(spell_gate); break; Anywhere in mag_assign_spells() between spellos: spello(SPELL_GATE, 50, 50, 0, POS_STANDING, TAR_CHAR_WORLD | TAR_NOT_SELF, FALSE, MAG_MANUAL); spells.c Anywhere between the other ASPELL functions: #define PORTAL_OBJ 20 /* the vnum of the portal object */ ASPELL(spell_gate) { /* create a magic portal */ struct obj_data *tmp_obj, *tmp_obj2; struct extra_descr_data *ed; struct room_data *rp, *nrp; struct char_data *tmp_ch = (struct char_data *) victim; char buf[512]; assert(ch); assert((level >= 0) && (level <= LVL_IMPL)); /* check target room for legality. */ rp = &world[ch->in_room]; tmp_obj = read_object(PORTAL_OBJ, VIRTUAL); if (!rp || !tmp_obj) { send_to_char("The magic fails\n\r", ch); extract_obj(tmp_obj); return; } if (IS_SET(rp->room_flags, ROOM_TUNNEL)) { send_to_char("There is no room in here to summon!\n\r", ch); extract_obj(tmp_obj); return; } if (!(nrp = &world[tmp_ch->in_room])) { char str[180]; sprintf(str, "%s not in any room", GET_NAME(tmp_ch)); log(str); send_to_char("The magic cannot locate the target\n", ch); extract_obj(tmp_obj); return; } if (ROOM_FLAGGED(tmp_ch->in_room, ROOM_NOMAGIC)) { send_to_char("Your target is protected against your magic.\n\r", ch); extract_obj(tmp_obj); return; } sprintf(buf, "Through the mists of the portal, you can faintly see %s",nrp->name); CREATE(ed , struct extra_descr_data, 1); ed->next = tmp_obj->ex_description; tmp_obj->ex_description = ed; CREATE(ed->keyword, char, strlen(tmp_obj->name) + 1); strcpy(ed->keyword, tmp_obj->name); ed->description = str_dup(buf); tmp_obj->obj_flags.value[0] = tmp_ch->in_room; GET_OBJ_TIMER(tmp_obj) = 2; GET_OBJ_TYPE(tmp_obj2) == ITEM_PORTAL; obj_to_room(tmp_obj,ch->in_room); act("$p suddenly appears.",TRUE,ch,tmp_obj,0,TO_ROOM); act("$p suddenly appears.",TRUE,ch,tmp_obj,0,TO_CHAR); /* Portal at other side */ rp = &world[ch->in_room]; tmp_obj2 = read_object(PORTAL_OBJ, VIRTUAL); if (!rp || !tmp_obj2) { send_to_char("The magic fails\n\r", ch); extract_obj(tmp_obj2); return; } sprintf(buf,"Through the mists of the portal, you can faintly see %s", rp->name); CREATE(ed , struct extra_descr_data, 1); ed->next = tmp_obj2->ex_description; tmp_obj2->ex_description = ed; CREATE(ed->keyword, char, strlen(tmp_obj2->name) + 1); strcpy(ed->keyword, tmp_obj2->name); ed->description = str_dup(buf); tmp_obj2->obj_flags.value[0] = ch->in_room; GET_OBJ_TIMER(tmp_obj2) = 2; GET_OBJ_TYPE(tmp_obj2) == ITEM_PORTAL; obj_to_room(tmp_obj2,tmp_ch->in_room); act("$p suddenly appears.", TRUE, tmp_ch, tmp_obj2, 0, TO_ROOM); act("$p suddenly appears.", TRUE, tmp_ch, tmp_obj2, 0, TO_CHAR); } _____________________________________ You also need to create an object in one of your .obj files for a portal template, this is the one I use: #20 portal gateway gate~ a glowing portal~ A glowing portal hovers here forming a gateway to another place.~ ~ 24 0 0 0 0 0 0 0 0 0 ____________________________________ If you use an object with a different vnum you need to change the value of the PORTAL_OBJ define before ASPELL(spell_gate). To be able to enter portals (probably pretty useful, eh?) you need to add this piece of code to do_enter in act.movement.c: above the: /* If this is a corpse */ and below the lines: /* objects */ for (j = object_list; j; j = next_thing) { next_thing = j->next; /* Next in object list */ add the following: /* Begin Remove Portal */ struct obj_data *obj = NULL; after 'if (*buf) {' and before 'for (door = 0; door < NUM_OF_DIRS; door++)' if ((obj = get_obj_in_list_vis(ch, buf, world[ch- No, I don't have a mud to see how this works on... it is siteless as of May 2000.