/
CVS/
boards/CVS/
clans/
gmc/CVS/
help/CVS/
include/CVS/
players/
progs/CVS/
races/CVS/
system/CVS/
text/
text/CVS/
todo/
todo/CVS/
units/CVS/
procedure makeblood(ch : GCharacter; pexit : GExit);
var obj : GObject;
    node : GListNode;
begin
  node := ch.room.objects.head;

  while (node <> nil) do
    begin
    obj := node.element;

    if (obj.item_type=ITEM_BLOOD) and (obj.value[2]=pexit.direction) then
      begin
      exit;
      break;
      end;

    node := node.next;
    end;

  obj := nil;

  obj := GObject.Create;

  with obj do
    begin
    name := hash_string('a trail of blood');
    short := hash_string('a trail of $B$4blood$A$7');
    long := hash_string('a trail of $B$4blood$A$3 goes ' + headings[pexit.direction]);

    item_type:=ITEM_BLOOD;
    SET_BIT(flags,OBJ_NOPICKUP);
    SET_BIT(flags,OBJ_NOSAC);

    value[2]:=pexit.direction;
    wear1:=0; wear2:=0;
    weight:=0;
    obj_index:=nil;
    timer := 60;
    end;

  obj.node_world := object_list.insertLast(obj);

  obj.toRoom(ch.room);
end;

procedure maketrack(ch : GCharacter; pexit : GExit);
var
   node : GListNode;
   track : GTrack;
begin
  // first check wether tracks already exist
  node := ch.room.tracks.head;

  while (node <> nil) do
    begin
    track := node.element;

    if (track.who = ch.name^) and (track.direction = pexit.direction) then
      begin
      track.life := 150;
      exit;
      end;

    node := node.next;
    end;

  track := GTrack.Create;

  track.who := ch.name^;
  track.direction := pexit.direction;
  track.life := 150;

  ch.room.tracks.insertLast(track);
end;

function do_move(ch : GCharacter; pexit : GExit) : boolean;
var vict : GCharacter;
    sneaking:boolean;
    txt_ch,txt_room:array[0..32] of char;
    room_pos,room_to : GRoom;
    mv_cost:integer;
    drunk:boolean;
    node, node_next : GListNode;
begin
  do_move:=false;
  room_pos:=ch.room;

  if (not ch.IS_NPC) and (ch.IS_DRUNK) then
    drunk := true
  else
    drunk := false;

  if (drunk) then
    begin
    ch.sendBuffer('You sway a bit and have trouble maintaining your balance.'#13#10);
    pexit := room_pos.findExit(random(6)+1);
    end;

  { if exit is hidden or it is secret and closed then no exit - Grimlord }
  if (pexit = nil) or (IS_SET(pexit.flags, EX_SECRET) and IS_SET(pexit.flags, EX_CLOSED)) and (not ch.IS_HOLYWALK) then
    begin
    if (drunk) then
      case random(3) of
        0 : begin
            act(AT_REPORT, 'You stumble into some obstacle.', false, ch, nil, nil, TO_CHAR);
            act(AT_REPORT, '$n stumbles into an obstacle.', false, ch, nil, nil, TO_ROOM);
            end;
        1 : begin
            act(AT_REPORT, 'Your arms flailing wildly, you trip and tumble to the ground.', false, ch, nil, nil, TO_CHAR);
            act(AT_REPORT, 'Arms flailing wildly, $n trips and tumbles to the ground.', false, ch, nil, nil, TO_ROOM);
            end;
        2 : begin
            act(AT_REPORT, 'Staggering along, you are suddenly intercepted by something solid.', false, ch, nil, nil, TO_CHAR);
            act(AT_REPORT, 'Everything goes dark and blurry as you fall to the ground.', false, ch, nil, nil, TO_CHAR);

            act(AT_REPORT, '$n staggers along, muttering under $s breath, and bumps into something.', false, ch, nil, nil, TO_ROOM);
            act(AT_REPORT, 'A loud thud sounds as $n topples to the ground.', false, ch, nil, nil, TO_ROOM);
            end;
      end
    else
      ch.sendBuffer('You can''t go in that direction.'#13#10);

    exit;
    end
  else
    begin
    room_to := findRoom(pexit.vnum);

    if (room_to = nil) then
      begin
      ch.sendBuffer('You can''t go in that direction.'#13#10);

      bugreport('do_move', 'cmd_move.inc', 'room_to (' + inttostr(room_pos.vnum) + ' -> ' + inttostr(pexit.vnum) + ') is null',
                'The room this exit links to does not exist. Please check this area.');
      exit;
      end;
    end;

  if (ch.position = POS_FIGHTING) then
    begin
    ch.sendBuffer('You are fighting and cannot move.'#13#10);
    exit;
    end;

  if (ch.position = POS_BASHED) then
    begin
    ch.sendBuffer('You are bashed and cannot move.'#13#10);
    exit;
    end;

  if (ch.position <= POS_STUNNED) then
    begin
    ch.sendBuffer('You are hurt too badly.'#13#10);
    exit;
    end;

  if (ch.position <> POS_STANDING) then
    begin
    ch.sendBuffer('You must stand up first.'#13#10);
    exit;
    end;

  if (ch.IS_NPC) and (IS_SET(pexit.flags, EX_NOMOB)) then
    begin
    ch.sendBuffer('Sorry, you cannot pass.'#13#10);
    exit;
    end;

  if (ch.IS_NPC) and (IS_SET(pexit.flags, EX_PORTAL)) then
    begin
    ch.sendBuffer('Sorry, you cannot use portals.'#13#10);
    exit;
    end;

  if (not ch.IS_IMMORT) and (IS_SET(pexit.to_room.flags,ROOM_PRIVATE)) then
    begin
    ch.sendBuffer('That room is private.'#13#10);
    exit;
    end;

  if (ch.IS_EVIL) and (IS_SET(pexit.to_room.flags,ROOM_GOOD)) then
    begin
    ch.sendBuffer('An irritating holy force prevents you from entering.'#13#10);
    exit;
    end;

  if (ch.IS_GOOD) and (IS_SET(pexit.to_room.flags,ROOM_EVIL)) then
    begin
    ch.sendBuffer('A distinct evil force prevents you from entering.'#13#10);
    exit;
    end;

  if (IS_SET(pexit.to_room.flags,ROOM_SOLITARY)) and (pexit.to_room.chars.getSize > 0) and (not ch.IS_HOLYWALK) then
    begin
    ch.sendBuffer('Only one person can enter that room at a time.'#13#10);
    exit;
    end;

  if (IS_SET(pexit.flags, EX_CLOSED)) and (not ch.IS_HOLYWALK) then
    begin
    act(AT_REPORT, 'The $d is closed.', false, ch, nil, pexit, TO_CHAR);
    exit;
    end;

  if (room_pos.sector=SECT_AIR) or (room_to.sector=SECT_AIR) or
   IS_SET(pexit.flags, EX_FLY) then
    if (not ch.IS_FLYING) and (not ch.IS_HOLYWALK) then
     begin
     ch.sendBuffer('You''d need to fly to get there.'#13#10);
     exit;
     end;

  if (room_pos.sector = SECT_NOPASSAGE) and (not ch.IS_HOLYWALK) then
    begin
    ch.sendBuffer('You cannot fly, walk or swim there... it''s too dangerous.'#13#10);
    exit;
    end;

  if ((room_pos.sector = SECT_WATER_NOSWIM) or (room_to.sector = SECT_WATER_NOSWIM)) and (not ch.IS_HOLYWALK) then
    begin
    ch.sendBuffer('That water is too deep to swim in, you need a boat!'#13#10);
    exit;
    end;

  if ((ch.level < room_to.min_level) or (ch.level > room_to.max_level)) and
   (not ch.IS_IMMORT) and (not ch.IS_NPC) then
    begin
    ch.sendBuffer('A strange force prevents you from travelling there.'#13#10);
    exit;
    end;

  { when a mob blocks ch, we don't want to continue - Grimlord }

(*  node := ch.room.chars.head;
  while (node <> nil) do
    begin
    vict := node.element;

    if (blockTrigger(vict, ch, pexit.vnum)) and (not ch.IS_HOLYWALK) then
      begin
      ch.sendBuffer('A strange force prevents you from travelling there.'#13#10);
      exit;
      end;

    node := node.next;
    end; *)

  if (not ch.IS_FLYING) then
    mv_cost := movement_loss[room_pos.sector]
  else
    mv_cost := 1;

  if (ch.mv < mv_cost) then
    begin
    ch.sendBuffer('You are too exhausted.'#13#10);
    exit;
    end;

  if (not ch.IS_NPC) then
    begin
    if (ch.hp < ch.max_hp div 2) then
      makeblood(ch, pexit);

    maketrack(ch, pexit);
    end;

  sneaking := (IS_SET(ch.aff_flags,AFF_SNEAK) and skill_success(ch, gsn_sneak));

  if sneaking then
    improve_skill(ch, gsn_sneak);

  if (ch.IS_FLYING) then
    begin
    txt_ch := 'fly';
    txt_room := 'flies';
    end
  else
  if (IS_SET(pexit.flags, EX_SWIM)) then
    begin
    txt_ch := 'swim';
    txt_room := 'swims';
    end
  else
  if IS_SET(pexit.flags, EX_CLIMB) then
    begin
    txt_ch := 'climb';
    txt_room := 'climbs';
    end
  else
  if IS_SET(ch.aff_flags, AFF_SNEAK) then
    begin
    txt_ch := 'sneak';
    txt_room := 'sneaks';
    end
  else
  if (drunk) then
    begin
    txt_ch := 'stumble';
    txt_room := 'stumbles';
    end
  else
    begin
    txt_ch := 'walk';
    txt_room := 'walks';
    end;

  if (not sneaking) then
    begin
    if IS_SET(pexit.flags, EX_PORTAL) or IS_SET(pexit.flags, EX_ENTER) then
      act(AT_REPORT, '$n leaves through the $d.',true,ch,nil, pexit,TO_ROOM)
    else
      act(AT_REPORT, '$n '+txt_room+' ' + headings[pexit.direction] + '.',true,ch,nil,nil,TO_ROOM);
    end;

  ch.fromRoom;
  ch.toRoom(room_to);

  ch.mv := ch.mv - mv_cost;

  if (ch.mv < 15) then
    act(AT_REPORT,'You start breathing heavily... you are very tired.',false,ch,nil,nil,TO_CHAR);

  if IS_SET(pexit.flags, EX_PORTAL) or IS_SET(pexit.flags, EX_ENTER) then
    begin
    if (not sneaking) then
      act(AT_REPORT,'$n enters from somewhere.',true,ch,nil,nil,TO_ROOM);

    act(AT_REPORT,'You enter the $d.',false,ch,nil,pexit,TO_CHAR);
    end
  else
    begin
    if (not sneaking) then
      act(AT_REPORT,'$n ' + txt_room + ' in from ' + headingsi[pexit.direction] + '.',true,ch,nil,nil,TO_ROOM);

    act(AT_REPORT,'You ' + txt_ch + ' ' + headings[pexit.direction] + '.',false,ch,nil,nil,TO_CHAR);
    end;

  if (not ch.IS_OUTSIDE) then
   if (ch.IS_FLYING) then
    begin
    ch.sendBuffer('You cannot fly while indoors!'#13#10);
    ch.stopFlying;
    end;

  do_look(ch,'_AUTO');

  if (ch.tracking <> '') then
    begin
    unregisterTimer(ch, TIMER_TRACK);
    interpret(ch, 'track');
    end;

  node := room_pos.chars.head;

  while (node <> nil) do
    begin
    node_next := node.next;
    vict := node.element;

    if (vict.master = ch) then
      begin
      vict.in_command := true;

      act(AT_REPORT,'You follow $N '+headings[pexit.direction]+'.',false,vict,nil,ch,TO_CHAR);
      do_move(vict,pexit);
      vict.emptyBuffer;

      vict.in_command := false;
      end;

    node := node_next;
    end;

//  if (not ch.IS_NPC) then
//    greetTrigger(ch);

  do_move := true;
end;

procedure do_north(ch:GCharacter;param:string);
begin
  do_move(ch, ch.room.findExit(DIR_NORTH));
end;

procedure do_east(ch:GCharacter;param:string);
begin
  do_move(ch, ch.room.findExit(DIR_EAST));
end;

procedure do_south(ch:GCharacter;param:string);
begin
  do_move(ch, ch.room.findExit(DIR_SOUTH));
end;

procedure do_west(ch:GCharacter;param:string);
begin
  do_move(ch, ch.room.findExit(DIR_WEST));
end;

procedure do_down(ch:GCharacter;param:string);
begin
  do_move(ch, ch.room.findExit(DIR_DOWN));
end;

procedure do_up(ch:GCharacter;param:string);
begin
  do_move(ch, ch.room.findExit(DIR_UP));
end;

procedure do_sleep(ch:GCharacter;param:string);
begin
  with ch do
   case position of
     POS_FIGHTING:act(AT_REPORT,'You are fighting!',false,ch,nil,nil,TO_CHAR);
       POS_BASHED:act(AT_REPORT,'You are bashed to the ground!',false,ch,nil,nil,TO_CHAR);
     POS_DEAD,POS_MORTAL,POS_INCAP,POS_STUNNED:act(AT_REPORT,'You are hurt to badly.',false,ch,nil,nil,TO_CHAR);
     POS_SLEEPING:act(AT_REPORT,'You are already sleeping!',false,ch,nil,nil,TO_CHAR);
     POS_MEDITATE:begin
                  act(AT_REPORT,'You stop meditating and fall sleep.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops meditating and falls asleep.',true,ch,nil,nil,TO_ROOM);
                  position:=POS_SLEEPING;
                  end;
     POS_RESTING,POS_SITTING:begin
                  act(AT_REPORT,'You fall asleep.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n falls asleep.',true,ch,nil,nil,TO_ROOM);
                  position:=POS_SLEEPING;
                  end;
     POS_STANDING:begin
									ch.stopFlying;
                  act(AT_REPORT,'You lie down and fall sleep.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n lies down and falls asleep.',true,ch,nil,nil,TO_ROOM);
                  position:=POS_SLEEPING;
                  end;
   end;
end;

procedure do_stand(ch:GCharacter;param:string);
begin
  with ch do
   case position of
     POS_FIGHTING,POS_STANDING:act(AT_REPORT,'You are already standing.',false,ch,nil,nil,TO_CHAR);
       POS_BASHED:act(AT_REPORT,'You are bashed to the ground!',false,ch,nil,nil,TO_CHAR);
     POS_DEAD,POS_MORTAL,POS_INCAP,POS_STUNNED:act(AT_REPORT,'You are hurt to badly.',false,ch,nil,nil,TO_CHAR);
     POS_SLEEPING:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You awake and stand up.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n awakes and stands up.',true,ch,nil,nil,TO_ROOM);
                  end;
     POS_MEDITATE:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You stop meditating and stand up.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops meditating and stands up.',true,ch,nil,nil,TO_ROOM);
                  end;
     POS_RESTING,POS_SITTING:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You stand up.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stands up.',true,ch,nil,nil,TO_ROOM);
                  end;
   end;
end;

procedure do_meditate(ch:GCharacter;param:string);
begin
  with ch do
   case position of
     POS_FIGHTING:act(AT_REPORT,'You are fighting!',false,ch,nil,nil,TO_CHAR);
       POS_BASHED:act(AT_REPORT,'You are bashed to the ground!',false,ch,nil,nil,TO_CHAR);
     POS_DEAD,POS_MORTAL,POS_INCAP,POS_STUNNED:act(AT_REPORT,'You are hurt to badly.',false,ch,nil,nil,TO_CHAR);
     POS_SLEEPING:act(AT_REPORT,'You are asleep.',false,ch,nil,nil,TO_CHAR);
     POS_MEDITATE:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You stop meditating and stand up.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops meditating and stands up.',true,ch,nil,nil,TO_ROOM);
                  end;
     POS_RESTING,POS_SITTING:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You start meditating.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n starts meditating.',true,ch,nil,nil,TO_ROOM);
                  end;
     POS_STANDING:begin
                  position:=POS_MEDITATE;
									ch.stopFlying;
                  act(AT_REPORT,'You sit down cross-legged and begin meditating.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n sits down cross-legged and begins meditating.',true,ch,nil,nil,TO_ROOM);
                  end;
   end;
end;

procedure do_rest(ch:GCharacter;param:string);
begin
  with ch do
   case position of
     POS_FIGHTING:act(AT_REPORT,'You are fighting!',false,ch,nil,nil,TO_CHAR);
       POS_BASHED:act(AT_REPORT,'You are bashed to the ground!',false,ch,nil,nil,TO_CHAR);
     POS_DEAD,POS_MORTAL,POS_INCAP,POS_STUNNED:act(AT_REPORT,'You are hurt to badly.',false,ch,nil,nil,TO_CHAR);
     POS_SLEEPING:begin
                  position:=POS_RESTING;
                  act(AT_REPORT,'You wake up and rest.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n wakes up and rests.',false,ch,nil,nil,TO_ROOM);
                  end;
     POS_MEDITATE:begin
                  position:=POS_RESTING;
                  act(AT_REPORT,'You stop meditating and go to rest.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops meditating and rests.',true,ch,nil,nil,TO_ROOM);
                  end;
      POS_RESTING:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You stop resting and stand up.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops resting and stands up.',false,ch,nil,nil,TO_ROOM);
                  end;
      POS_SITTING:begin
                  position:=POS_RESTING;
                  act(AT_REPORT,'You rest.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n rests.',true,ch,nil,nil,TO_ROOM);
                  end;
     POS_STANDING:begin
                  position:=POS_RESTING;
									ch.stopFlying;
                  act(AT_REPORT,'You sit down comfortably and rest.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n sits down comfortably and rests.',true,ch,nil,nil,TO_ROOM);
                  end;
   end;
end;

procedure do_sit(ch:GCharacter;param:string);
begin
  with ch do
   case position of
     POS_FIGHTING:act(AT_REPORT,'You are fighting!',false,ch,nil,nil,TO_CHAR);
       POS_BASHED:act(AT_REPORT,'You are bashed to the ground!',false,ch,nil,nil,TO_CHAR);
     POS_DEAD,POS_MORTAL,POS_INCAP,POS_STUNNED:act(AT_REPORT,'You are hurt to badly.',false,ch,nil,nil,TO_CHAR);
     POS_SLEEPING:begin
                  position:=POS_SITTING;
                  act(AT_REPORT,'You wake up and sit down.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n wakes up and sits down.',false,ch,nil,nil,TO_ROOM);
                  end;
     POS_MEDITATE:begin
                  position:=POS_SITTING;
                  act(AT_REPORT,'You stop meditating.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops meditating.',true,ch,nil,nil,TO_ROOM);
                  end;
      POS_RESTING:begin
                  position:=POS_SITTING;
                  act(AT_REPORT,'You stop resting.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stops resting.',false,ch,nil,nil,TO_ROOM);
                  end;
      POS_SITTING:begin
                  position:=POS_STANDING;
                  act(AT_REPORT,'You stand up.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n stands up.',false,ch,nil,nil,TO_ROOM);
                  end;
     POS_STANDING:begin
                  position:=POS_SITTING;
									ch.stopFlying;
                  act(AT_REPORT,'You sit down.',false,ch,nil,nil,TO_CHAR);
                  act(AT_REPORT,'$n sits down.',true,ch,nil,nil,TO_ROOM);
                  end;
   end;
end;

procedure do_wake(ch:GCharacter;param:string);
var vict:GCharacter;
begin
  if (length(param)=0) then
    begin
    ch.sendBuffer('Wake whom?'#13#10);
    exit;
    end;

  vict := ch.room.findChar(ch, param);

  if (vict=nil) then
    ch.sendBuffer('They aren''t here.'#13#10)
  else
  if (vict=ch) then
    do_stand(ch,'')
  else
  if (vict.position<>POS_SLEEPING) then
    act(AT_REPORT,'$N is not sleeping.',false,ch,nil,vict,TO_CHAR)
  else
    begin
    act(AT_REPORT,'You wake $N.',false,ch,nil,vict,TO_CHAR);
    act(AT_REPORT,'$n wakes $N.',false,ch,nil,vict,TO_ROOM);
    vict.position:=POS_STANDING;
    end;
end;

procedure do_enter(ch:GCharacter;param:string);
var pexit, lexit : GExit;
    node : GListNode;
begin
  if (length(param)=0) then
    begin
    ch.sendBuffer('Enter what?'#13#10);
    exit;
    end;

  pexit:=nil;

  node := ch.room.exits.head;

  while (node <> nil) do
    begin
    lexit := node.element;

    if (IS_SET(lexit.flags, EX_PORTAL) or IS_SET(lexit.flags, EX_ENTER))
     and (pos(param, lexit.keywords^) <> 0) then
      begin
      pexit:=lexit;
      break;
      end;

    node := node.next;
    end;

  do_move(ch,pexit);
end;

procedure do_open(ch:GCharacter;param:string);
var room_pos : GRoom;
    pexit : GExit;
    dir:integer;
begin
  if (length(param)=0) then
    begin
    ch.sendBuffer('Open what?'#13#10);
    exit;
    end;

  room_pos:=ch.room;
  dir := findHeading(param);
  pexit := room_pos.findExit(dir);

  if (pexit <> nil) and (IS_SET(pexit.flags, EX_SECRET)) then
    pexit := nil;

  if (pexit = nil) then
    pexit := room_pos.findExitKeyword(param);

  if (pexit = nil) then
    begin
    ch.sendBuffer('That door cannot be found.'#13#10);
    exit;
    end;

  dir:=pexit.direction;

  if not IS_SET(pexit.flags, EX_ISDOOR) then
    begin
    ch.sendBuffer('That is not a door.'#13#10);
    exit;
    end;

  if not IS_SET(pexit.flags, EX_CLOSED) then
    begin
    ch.sendBuffer('That door is already open.'#13#10);
    exit;
    end;

  if IS_SET(pexit.flags, EX_LOCKED) then
    begin
    ch.sendBuffer('That door is locked.'#13#10);
    exit;
    end;

  REMOVE_BIT(pexit.flags, EX_CLOSED);

  act(AT_REPORT,'You open the $d.', false, ch, nil, pexit, TO_CHAR);
  act(AT_REPORT,'$n opens the $d.', false, ch, nil, pexit, TO_ROOM);

  { get reverse exit }
  room_pos := findRoom(pexit.vnum);

  if (room_pos = nil) then
    begin
    bugreport('do_open', 'cmd_move.inc', 'room_to (' + inttostr(ch.room.vnum) + ' -> ' + inttostr(pexit.vnum) + ') is null',
              'The room this exit links to does not exist. Please check this area.');
    exit;
    end;

  pexit := room_pos.findExit(dir_inv[dir]);

  if (pexit = nil) then
    begin
    bugreport('do_open', 'cmd_move.inc', 'reverse exit (' + inttostr(ch.room.vnum) + ') is null',
              'The reserve exit back to this room does not exist. Please check this area.');
    exit;
    end;

  REMOVE_BIT(pexit.flags, EX_CLOSED);
end;

procedure do_close(ch:GCharacter;param:string);
var room_pos : GRoom;
    pexit : GExit;
    dir:integer;
begin
  if (length(param)=0) then
    begin
    ch.sendBuffer('Close what?'#13#10);
    exit;
    end;

  room_pos := ch.room;
  dir := findHeading(param);
  pexit := room_pos.findExit(dir);

  if (pexit<>nil) and (IS_SET(pexit.flags, EX_SECRET)) then
    pexit := nil;

  if (pexit = nil) then
    pexit := room_pos.findExitKeyword(param);

  if (pexit = nil) then
    begin
    ch.sendBuffer('That door cannot be found.'#13#10);
    exit;
    end;

  dir:=pexit.direction;
  if not IS_SET(pexit.flags, EX_ISDOOR) then
    begin
    ch.sendBuffer('That is not a door.'#13#10);
    exit;
    end;

  if IS_SET(pexit.flags, EX_CLOSED) then
    begin
    ch.sendBuffer('That door is already closed.'#13#10);
    exit;
    end;

  SET_BIT(pexit.flags, EX_CLOSED);

  act(AT_REPORT,'You close the $d.', false, ch, nil, pexit, TO_CHAR);
  act(AT_REPORT,'$n closes the $d.', false, ch, nil, pexit, TO_ROOM);

  { get reverse exit }
  room_pos := findRoom(pexit.vnum);

  if (room_pos = nil) then
    begin
    bugreport('do_close', 'cmd_move.inc', 'room_to (' + inttostr(ch.room.vnum) + ' -> ' + inttostr(pexit.vnum) + ') is null',
              'The room this exit links to does not exist. Please check this area.');
    exit;
    end;

  pexit := room_pos.findExit(dir_inv[dir]);

  if (pexit = nil) then
    begin
    bugreport('do_close', 'cmd_move.inc', 'reverse exit (' + inttostr(ch.room.vnum) + ') is null',
              'The reserve exit back to this room does not exist. Please check this area.');
    exit;
    end;

  SET_BIT(pexit.flags, EX_CLOSED);
end;