From: Franco <awe@mt.arias.net>
Subject: [Circle] New Teleport

I thought the relocate spell was overused, so I rewrote the teleport spell
(how often is the original used anyway, cept by a few snoopy morts?). You
have to change the spello/mag_assign_spell or wotever functions in
'spell_parser.c' to have the spell accept a TAR_VICT_WORLD (I think). 


/* New and improved teleport spell */
ASPELL(spell_teleport)
{
  struct room_data *newroom = 0;
  struct room_data *casting_room, *target_room;
  struct obj_data *foolz_objs;
  int randroom = 0, prob = 0, NR = 0, i;
  
  extern int top_of_world;

  if (ch == NULL || victim == NULL)
	  return;

  casting_room = &world[ch->in_room];
  target_room = &world[victim->in_room];

  if (GET_LEVEL(victim) > LVL_IMMORT && GET_LEVEL(ch) < LVL_IMMORT) {
	  send_to_char("Your mortal magic is foiled.\r\n", ch);
	  return;
  }
  /*
  if (IS_SET(casting_room->room_flags, ROOM_NOTELEPORT)) {
	  send_to_char("This room blocks your attempt to teleport.\r\n", ch);
	  return;
  }

  if (IS_SET(target_room->room_flags, ROOM_NOTELEPORT)) {
	  send_to_char("The destination room blocks your teleport.\r\n", ch);
	  return;
  }
  */
  if (IS_SET(casting_room->room_flags, ROOM_NOMAGIC)) {
	  send_to_char("Your magic fizzles out and dies.\r\n", ch);
	  return;
  }
 
  
  if (IS_NPC(victim)) {
	  send_to_char("You cannot get an image of the location..\r\n", ch);
	  return;
  }

  newroom = &world[victim->in_room];

  if (IS_SET(newroom->room_flags, ROOM_NOMAGIC)) {
	  send_to_char("Your destination's anti-magic barrier prevents the spell.\r\n", ch);
	  return;
  }
  if (IS_SET(newroom->room_flags, ROOM_TUNNEL)) {
	  send_to_char("The size of the destination prevents your teleportation.\r\n", ch);
	  return;
  }
  prob = number(1,100);

  if (GET_LEVEL(ch) >= LVL_IMMORT)
	  prob = 50;

  if (prob >= 3 && prob <= 90) {
	send_to_char("Your magic takes affect as your begin to shift locations...\r\n", ch);
	act("$n slowly disappears, teleporting away.", TRUE, ch, 0, 0, TO_NOTVICT);

    NR = victim->in_room;

	char_from_room(ch);
	char_to_room(ch, NR);

	act("$n teleports into the room.", TRUE, ch, 0, 0, TO_ROOM);
	send_to_char("You have teleported on target.\r\n", ch);
	look_at_room(ch, 0);
	return;
  }
  
  if (prob < 3) {
	  send_to_char("Your spell goes awry as you teleport into solid matter!\r\n", ch);
	  act("$n miscasts a teleport spell, and disappears.", TRUE, ch, 0, 0, TO_NOTVICT);

  	  for (i = 0; i < NUM_WEARS; i++) 
		if (GET_EQ(ch, i))
		  unequip_char(ch, i);
	  while (ch->carrying) {
			foolz_objs = ch->carrying;
			extract_obj(foolz_objs);
	  }
	  extract_char(ch);
	  sprintf(buf, "(GC) %s has misteleported, attempting to teleport to %s, and died.", GET_NAME(ch), GET_NAME(victim));
	  mudlog(buf, BRF, LVL_IMMORT, TRUE);
	  log(buf);
	  return;
  }

  if (prob < 90) {
	  send_to_char("Your spell goes awry as you teleport into an unknown place!\r\n", ch);
	  act("$n miscasts a teleport spell, and disappears.", TRUE, 0, 0, 0, TO_NOTVICT);
      do {
		randroom = number(0, top_of_world);
      }
	  while (ROOM_FLAGGED(randroom, ROOM_PRIVATE | ROOM_DEATH));
	  char_from_room(ch);
	  char_to_room(ch, randroom);
	  act("$n teleports into the room.", TRUE, ch, 0, 0, TO_ROOM);
	  send_to_char("You luckily have not died during teleportation.\r\n", ch);
	  look_at_room(victim, 0);
	  return;
  }
}

