/
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 do_kill(ch:GCharacter;param:string);
var vict:GCharacter;
begin
  if (length(param) = 0) then
    begin
    ch.sendBuffer('Kill who?'#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
    ch.sendBuffer('You try to attack yourself, but somehow it just doesn''t work!'#13#10)
  else
  if IS_SET(ch.room.flags,ROOM_SAFE) then
    ch.sendBuffer('A strange force prevents you from attacking.'#13#10)
  else
  if (vict.position<>POS_FIGHTING) then
    begin
    if (not ch.IS_NPC) then
      GPlayer(ch).fightxp:=0;

    ch.position:=POS_FIGHTING;
    ch.fighting:=vict;
    // ch.fought_by.add(vict);

    vict.position:=POS_FIGHTING;
    vict.fighting:=ch;
    // vict.fought_by.add(ch);

    act(AT_FIGHT_YOU,'You attack $N!',false,ch,nil,vict,TO_CHAR);
//          act(AT_FIGHT_HIT,'You are being attacked by $N!',false,t,nil,ch,TO_CHAR);
//          act(AT_FIGHT,'$N attackes $n!',false,t,nil,ch,TO_NOTVICT);
    end
  else
  if (vict.position=POS_FIGHTING) and (ch.position<>POS_FIGHTING) then
    begin
    if (not ch.IS_NPC) then
      GPlayer(ch).fightxp:=0;

    ch.position:=POS_FIGHTING;
    ch.fighting:=vict;
    // vict.fought_by.add(ch);

    act(AT_FIGHT_YOU,'You assist $N!',false,ch,nil,vict.fighting,TO_CHAR);
    act(AT_FIGHT_HIT,'$N CHARGES into battle!',false,vict,nil,ch,TO_CHAR);
    act(AT_FIGHT,'$N CHARGES into the battle against $n!',false,vict,nil,ch,TO_NOTVICT);
    end
  else
  if (vict<>ch.fighting) then
    begin
    //ch.fighting.fought_by.delete(ch.fighting.fought_by.indexof(ch));

    if (not ch.IS_NPC) then
      GPlayer(ch).fightxp:=0;

    ch.fighting:=vict;
    //vict.fought_by.add(ch);

    act(AT_FIGHT_YOU,'You turn and target $N!',false,ch,nil,vict,TO_CHAR);
    act(AT_FIGHT_HIT,'$N turns and targets YOU!',false,vict,nil,ch,TO_CHAR);
    act(AT_FIGHT,'$N turns and targets $n!',false,vict,nil,ch,TO_NOTVICT);
    end
  else
    act(AT_REPORT,'You are already fighting $N!',false,ch,nil,vict,TO_CHAR);
end;

procedure do_flee(ch:GCharacter;param:string);
var a : integer;
    pexit : GExit;
    timer : GTimer;
    room : GRoom;
    vict : GCharacter;
    node : GListNode;
begin
  if (ch.position = POS_BASHED) then
    begin
    act(AT_REPORT,'You are bashed and cannot flee.',false,ch,nil,nil,TO_CHAR);
    exit;
    end;

  if (ch.bashing > -2) then
    begin
    act(AT_REPORT,'You are still too off-balance to flee.',false,ch,nil,nil,TO_CHAR);
    exit;
    end;

  if (ch.position <> POS_FIGHTING) then
    begin
    ch.sendBuffer('You can''t flee when you''re not fighting!'#13#10);
    exit;
    end;

  a := random(6)+1;
  pexit := ch.room.findExit(a);

  ch.position := POS_STANDING;
  room := ch.room;

  if (pexit <> nil) and (do_move(ch, pexit)) then
    begin
    // ch.fought_by.clear;
    ch.sendBuffer('You flee as fast as you can!'#13#10);

    node := room.chars.head;

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

      act(AT_REPORT,'$N flees away in panic!',false,vict,nil,ch,TO_CHAR);

      node := node.next;
      end;

    timer := hasTimer(ch, TIMER_COMBAT);

    if (timer <> nil) then
      timer.counter := combat_timer[COMBAT_MOBILE]
    else
      registerTimer(TIMER_COMBAT, nil, combat_timer[COMBAT_MOBILE], ch, nil, nil);

    if (ch.fighting.IS_NPC) then
      begin
      ch.fighting.hunting := ch;
      SET_BIT(GNPC(ch.fighting).act_flags, ACT_HUNTING);
      end;

    if (ch.fighting.fighting = ch) then
      ch.fighting.fighting := nil;
      
    ch.fighting.position := POS_STANDING;
    stopfighting(ch);
    ch.fighting := nil;
    end
  else
    begin
    ch.position := POS_FIGHTING;
    ch.sendBuffer('You cannot get away!'#13#10);
    end;
end;

procedure do_flurry(ch:GCharacter;param:string);
var a,num:integer;
begin
  if (ch.position = POS_BASHED) then
    begin
    ch.sendBuffer('You are bashed! You cannot flurry!'#13#10);
    exit;
    end
  else
  if (ch.position<>POS_FIGHTING) or (ch.fighting.CHAR_DIED) then
    begin
    ch.sendBuffer('You can only flurry when you are fighting.'#13#10);
    exit;
    end
  else
  if (ch.bashing > -2) then
    begin
    ch.sendBuffer('You cannot flurry this soon after a bash.'#13#10);
    exit;
    end
  else
  if (ch.mv < 15 + (ch.level div 10)+1) then
    begin
    ch.sendBuffer('You don''t have enough energy to flurry.'#13#10);
    exit;
    end;

  with ch do
    begin
    act(AT_REPORT,'You go crazy and open up in a flurry of attacks!',false,ch,nil,nil,TO_CHAR);
    act(AT_REPORT,'$n screams out a warcry and opens up in a flurry of attacks!',false,ch,nil,nil,TO_ROOM);

    mv := mv - 15 + (ch.level div 10);

    ch.setWait(8);

    num := URange(1,level div 10, rolldice(1,5));

    { first a predetermined number of attacks (the flurry) - Grimlord }
    for a := 1 to num do
      begin
      if (ch.fighting.CHAR_DIED) then
        exit;

      if (one_hit(ch, ch.fighting) <> RESULT_NONE) then
        exit;
      end;

    { then the other attacks (second/third/etc) - Grimlord }
    if (not ch.fighting.CHAR_DIED) then
      multi_hit(ch, ch.fighting);
    end;
end;

procedure do_assist(ch:GCharacter;param:string);
var vict:GCharacter;
begin
  case ch.position of
    POS_BASHED:begin
               ch.sendBuffer('You are bashed to the ground!'#13#10);
               exit;
               end;
  POS_FIGHTING:begin
               ch.sendBuffer('You are already fighting!'#13#10);
               exit;
               end;
  end;

  if (length(param) = 0) then
    ch.sendBuffer('Assist who?'#13#10)
  else
    begin
    vict := ch.room.findChar(ch, param);

    if (vict = nil) then
      ch.sendBuffer('They aren''t here.'#13#10)
    else
    if (vict.IS_NPC) then
      act(AT_REPORT,'$N doesn''t want your help.',false,ch,nil,vict,TO_CHAR)
    else
    if vict.fighting=nil then
      act(AT_REPORT,'$N isn''t fighting.',false,ch,nil,vict,TO_CHAR)
    else
      begin
      act(AT_REPORT,'You assist $N!',false,ch,nil,vict,TO_CHAR);
      act(AT_REPORT,'$n assists $N!',false,ch,nil,vict,TO_ROOM);
      ch.fighting := vict.fighting;
      ch.position := POS_FIGHTING;
      end;
    end;
end;

procedure do_disengage(ch:GCharacter;param:string);
begin
  if (ch.position<>POS_FIGHTING) then
    begin
    ch.sendBuffer('You are not fighting!'#13#10);
    exit;
    end;

  { cannot disengage when tanking }
  if (ch.fighting.fighting=ch) then
    begin
    ch.sendBuffer('You are in the frontline and can not disengage!'#13#10);
    exit;
    end;
    
  act(AT_REPORT,'You withdraw from the fight.',false,ch,nil,nil,TO_CHAR);

  ch.fighting:=nil;
  ch.position:=POS_STANDING;
end;