/
ScryMUD/mud/
ScryMUD/mud/grrmud/Boards/
ScryMUD/mud/grrmud/Help/
ScryMUD/mud/grrmud/Pfiles/
ScryMUD/mud/grrmud/PlayerSacks/
ScryMUD/mud/grrmud/PlayerShops/
ScryMUD/mud/grrmud/help_filter/
ScryMUD/mud/hegemon/
ScryMUD/mud/hegemon/data/
ScryMUD/mud/hegemon/data/help/battle/
ScryMUD/mud/hegemon/data/help/client/
ScryMUD/mud/hegemon/data/help/communications/
ScryMUD/mud/hegemon/data/help/skills/
ScryMUD/mud/hegemon/data/help/spells/
ScryMUD/mud/include/
ScryMUD/mud/lib/
ScryMUD/mud/lib/bitfield/
ScryMUD/mud/lib/log/
ScryMUD/mud/lib/string2/
// $Id: batl_prc.cc,v 1.9.2.3 2000/02/19 17:44:36 justin Exp $
// $Revision: 1.9.2.3 $  $Author: justin $ $Date: 2000/02/19 17:44:36 $

//
//ScryMUD Server Code
//Copyright (C) 1998  Ben Greear
//
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either version 2
//of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
//
// To contact the Author, Ben Greear:  greear@cyberhighway.net, (preferred)
//                                     greearb@agcs.com
//

/************************  batl_prc.cc  ***************************/

#include "battle.h"
#include "batl_prc.h"
#include "classes.h"
#include <bitfield.h>
#include <string2.h>
#include "commands.h"
#include "command2.h"
#include "command3.h"
#include "command4.h"
#include "command5.h"
#include <tree2.h>
#include "misc.h"
#include "misc2.h"
#include "spells.h"
#include "trv_spll.h"
#include "skills.h"
#include "rm_spll.h"
#include "spells2.h"
#include "wep_skll.h"
#include "dam_spll.h"
#include "dam_skll.h"
#include "ez_spll.h"
#include "socials.h"
#include "social2.h"
#include "ar_skll.h"
#include <PtrArray.h>


void do_entered_room_procs(critter& pc, door* dr, const char* from_dir,
                           room& rm, int& is_dead, int sanity) {

   if (mudlog.ofLevel(TRC)) {
      mudlog << __FUNCTION__ << " pc: " << pc.getName() << " room: "
             << rm.getIdNum() << endl;
   }

   String buf(100);
   Cell<stat_spell_cell*> cll;
   stat_spell_cell* ptr;
   critter* crit = &pc;

   is_dead = FALSE;
   /* check for a firewall spell */

   if (dr) {
      dr->affected_by.head(cll);
      while ((ptr = cll.next())) {
         if (crit->isMob()) { //assume they will be affected!
            crit = mob_to_smob(*crit, rm.getRoomNum());
         }//if
         if (ptr->stat_spell == FIREWALL_SKILL_NUM) {
            do_firewall_effects(*crit, is_dead);
         }
         else if (ptr->stat_spell == DISTORTION_WALL_SKILL_NUM) {
            // Increment sanity here because this may re-curse through
            // this method again. --BEN
            do_distortion_wall_effects(*crit, is_dead, sanity + 1);
         }
      }//while
   }//if

   if (!is_dead) {
      rm.checkLight();

      pc.checkForBattle(rm);
      
      if (rm.haveCritter(&pc)) {
         String cmd = "enter";
         if (from_dir) {
            String from_dir_string(from_dir);
            rm.checkForProc(cmd, from_dir_string, pc, -1);
         }
         else {
            rm.checkForProc(cmd, NULL_STRING, pc, -1);
         }
      }//if
   }//if isn't dead yet
}//do_entered_room_procs



void do_entered_room_procs(object& obj, door* dr, const char* from_dir,
                           room& rm, int sanity) {
   if (sanity < 20) {
      // This just uses the variables to cut down on compiler warnings.
      if (&obj || dr || from_dir) {
         rm.checkLight();
      }
   }
}//do_entered_room_procs (objects)


void do_battle_proc(critter& pc) {

  if (pc.PAUSE > 0)
    return;

  if (!pc.mob)
    return;

  // Animals won't do spec procs now. (a kicking snake looks funny!)
  if (pc.isAnimal())
     return;

  // Replaced isStunned with this, should let you perm-sleep and trip critters to
  // make them stop kicking, bashing, casting spells...
  if (!pc.isStanding())
     return;

  if (pc.isParalyzed())
     return;

  String buf(100);

  /* these integers make this more efficient, as it will be called a lot */
  int cls = pc.CLASS;
  int lvl = pc.LEVEL;
  int num_fighting = pc.IS_FIGHTING.size();
  int violence, defense, chance;

  if (pc.mob->proc_data) {
    violence = pc.mob->getSkillViolence();
    defense = pc.mob->getDefensiveness();
  }//if
  else {
    violence = defense = 0;
  }//else

  critter* primary_targ = Top(pc.IS_FIGHTING);

  if (!primary_targ)
    return; //why are we here??

  if (violence < -8)
    return;

  chance = d(1, 10); //expand this for more cases            

  if (lvl > 20) {
    if (cls == THIEF) {
      if (violence > 7) { //lets kill the weaklings/clerics!
        if ((chance > 7) && (!is_tank(pc)) && pc.EQ[9] && 
            pc.EQ[9]->OBJ_FLAGS.get(43)) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_circle(*weakest, pc);
        }//if
        else if (chance > 5) {
          do_claw(*primary_targ, pc);
        }
      }//if very violent
      else if (violence > 3) {
        if (chance > 8) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_bash(*weakest, pc);
        }//if
        else if (chance > 5) {
          if (num_fighting > 5) {
            do_trip(*primary_targ, pc);
          }//if
        }
      }//if not so violent
      else if (violence >= 0) {
        if (chance > 7) {
          do_trip(*primary_targ, pc);
        }//if
      }//if not so violent
    }//if a thief
    else if ((cls == WIZARD) || (cls == ALCHEMIST) || (cls == CLERIC)) {
      if (pc.MANA < 0)
        return;

      if (defense <= 0) {
        if (violence > 8) { //lets kill the weaklings/clerics!
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_fireball(*weakest, pc, FALSE, 0);
          }//if
          else if (chance > 6) {
            if (num_fighting > 3) {
              do_cast_flame_strike(pc, FALSE, 0);
            }//if
            else {
              do_cast_rainbow(*primary_targ, pc, FALSE, 0);
            }//else
          }//else
          else if (chance > 4) {
            do_cast_lightning(*primary_targ, pc, FALSE, 0);
          }//if
          else if (chance > 2) {
            if (cls == CLERIC)
              do_cast_holy_word(*primary_targ, pc, FALSE, 0);
            else
              do_cast_harm(*primary_targ, pc, FALSE, 0);            
          }//if
        }//if very violent
        else if (violence > 3) {
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_rainbow(*weakest, pc, FALSE, 0);
          }//if
          else if (chance > 6) {
            if (num_fighting > 5) {
              do_cast_meteorstorm(pc, FALSE, 0);
            }//if
            else {
              do_cast_lightning(*primary_targ, pc, FALSE, 0);
            }//else
          }//if
          else if (chance > 4) {
            do_cast_harm(*primary_targ, pc, FALSE, 0);
          }//if
        }//if not so violent
        else if (violence >= 0) {
          if (chance > 7) {
            do_cast_fireball(*primary_targ, pc, FALSE, 0);
          }//if
          else if (chance > 4) {
            do_cast_rainbow(*primary_targ, pc, FALSE, 0);
          }//if
        }//if not so violent
      }//if more offensive
      else {//is more DEFENSIVE
        if (violence > 8) { //lets kill the weaklings/clerics!
          if (chance > 8) {
            if (!is_affected_by(SANCTUARY_SKILL_NUM, pc)) {
              do_cast_sanctuary(pc, pc, FALSE, 0);
            }//if
            else {
              if ((pc.HP + 300) < pc.HP_MAX) {
                do_cast_restore(pc, pc, FALSE, 0);
              }//if
            }//else
          }//if
          else if (chance > 5) {
            do_cast_dispel_magic(*primary_targ, pc, FALSE, 0);
          }//else
          else if (chance > 3) {
            do_cast_calm(pc, FALSE, 0);
            smirk(1, &NULL_STRING, pc, ROOM);
            do_cast_teleport(pc, pc, FALSE, 0);
          }//if
          else if (chance > 2) {
            if (cls == CLERIC)
              do_cast_holy_word(*primary_targ, pc, FALSE, 0);
            else
              do_cast_harm(*primary_targ, pc, FALSE, 0);            
          }//if
        }//if very violent
        else if (violence > 3) {
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_blindness(*weakest, pc, FALSE, 0);
          }//if
          else if ((chance > 6) && ((pc.HP + 300) < pc.HP_MAX)) {
            if (cls == CLERIC) {
              do_cast_restore(pc, pc, FALSE, 0);
            }//if
            else if (pc.HP < 60) {
              do_cast_teleport(pc, pc, FALSE, 0);
            }//else
          }//if
          else if ((chance > 4) && ((pc.HP + 100) < pc.HP_MAX)) {
            do_cast_harm(*primary_targ, pc, FALSE, 0);
          }//if
        }//if not so violent
        else if (violence >= 0) {
          if ((chance > 7) && ((pc.HP + 300) < pc.HP_MAX)) {
            do_cast_restore(pc, pc, FALSE, 0);
          }//if
          else if (chance > 4) {
            do_cast_armor(pc, pc, FALSE, 0);
          }//if
        }//if not so violent
      }//if more defensive
    }//if a magic user
    else {
      /* bards, warriors, rangers and all others */
      if (violence > 7) { //lets kill the weaklings/clerics!
        chance = d(1, 10); //expand this for more cases            
        if (chance > 7) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_body_slam(*weakest, pc);
        }//if
        else if ((chance > 5) && (pc.MOV > 0)) {
          if (num_fighting > 3) {
            do_berserk(pc);
          }//if
          else {
            do_hurl(*primary_targ, pc);
          }//else
        }
        else if ((chance > 4) && (primary_targ->EQ[9])) {
          do_disarm(*primary_targ, pc);
        }//if
        else if (chance > 2) {
          do_bash(*primary_targ, pc);
        }//if
      }//if very violent
      else if (violence > 3) {
        chance = d(1, 10); //expand this for more cases            
        if (chance > 8) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_bash(*weakest, pc);
        }//if
        else if ((chance > 6) && (pc.MOV > 0)) {
          if (num_fighting > 5) {
            do_berserk(pc);
          }//if
          else {
            do_trip(*primary_targ, pc);
          }//else
        }
        else if (chance > 4) {
          do_kick(*primary_targ, pc);
        }//if
      }//if not so violent
      else if (violence >= 0) {
        chance = d(1, 10); //expand this for more cases            
        if (chance > 7) {
          do_bash(*primary_targ, pc);
        }//if
        else if ((chance > 4) && (primary_targ->EQ[9])) {
          do_disarm(*primary_targ, pc);
        }//if
      }//if not so violent
    }//if a warrior or ranger or generic
  }//if level 20 and above
  else if (lvl > 10) {
    if (cls == THIEF) {
      if (violence > 7) { //lets kill the weaklings/clerics!
        if ((chance > 7) && (!is_tank(pc)) && pc.EQ[9] && 
            pc.EQ[9]->OBJ_FLAGS.get(43)) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_circle(*weakest, pc);
        }//if
        else if (chance > 5) {
          do_claw(*primary_targ, pc);
        }
      }//if very violent
      else if (violence > 3) {
        if (chance > 8) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_bash(*weakest, pc);
        }//if
        else if (chance > 5) {
          if (num_fighting > 5) {
            do_trip(*primary_targ, pc);
          }//if
        }
      }//if not so violent
      else if (violence >= 0) {
        if (chance > 7) {
          do_trip(*primary_targ, pc);
        }//if
      }//if not so violent
    }//if a thief
    else if ((cls == WIZARD) || (cls == ALCHEMIST) || (cls == CLERIC)) {
      if (pc.MANA < 0)
        return;
      if (defense <= 0) {
        if (violence > 8) { //lets kill the weaklings/clerics!
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_rainbow(*weakest, pc, FALSE, 0);
          }//if
          else if (chance > 6) {
            if (num_fighting > 3) {
              do_cast_icestorm(pc, FALSE, 0);
            }//if
            else {
              do_cast_shocking_grasp(*primary_targ, pc, FALSE, 0);
            }//else
          }//else
          else if (chance > 4) {
            do_cast_lightning(*primary_targ, pc, FALSE, 0);
          }//if
          else if (chance > 2) {
            if (cls == CLERIC)
              do_cast_harm(*primary_targ, pc, FALSE, 0);
            else
              do_cast_blindness(*primary_targ, pc, FALSE, 0);            
          }//if
        }//if very violent
        else if (violence > 3) {
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_rainbow(*weakest, pc, FALSE, 0);
          }//if
          else if (chance > 6) {
            if (num_fighting > 5) {
              do_cast_lightning_storm(pc, FALSE, 0);
            }//if
            else {
              do_cast_lightning(*primary_targ, pc, FALSE, 0);
            }//else
          }//if
          else if (chance > 4) {
            do_cast_weaken(*primary_targ, pc, FALSE, 0);
          }//if
        }//if not so violent
        else if (violence >= 0) {
          if (chance > 7) {
            do_cast_poison(*primary_targ, pc, FALSE, 0);
          }//if
          else if (chance > 4) {
            do_cast_burning_hands(*primary_targ, pc, FALSE, 0);
          }//if
        }//if not so violent
      }//if more offensive
      else {//is more DEFENSIVE
        if (violence > 8) { //lets kill the weaklings/clerics!
          if (chance > 8) {
            if (!is_affected_by(ARMOR_SKILL_NUM, pc)) {
              do_cast_armor(pc, pc, FALSE, 0);
            }//if
            else {
              if ((pc.HP + 100) < pc.HP_MAX) {
                do_cast_heal(pc, pc, FALSE, 0);
              }//if
            }//else
          }//if
          else if (chance > 5) {
            do_cast_blindness(*primary_targ, pc, FALSE, 0);
          }//else
          else if (chance > 3) {
            if (!is_affected_by(STONE_SKIN_SKILL_NUM, pc))
              do_cast_stone_skin(pc, pc, FALSE, 0);
          }//if
          else if (chance > 2) {
            if (cls == CLERIC)
              do_cast_cause_critical(*primary_targ, pc, FALSE, 0);
            else
              do_cast_burning_hands(*primary_targ, pc, FALSE, 0);    
          }//if
        }//if very violent
        else if (violence > 3) {
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_blindness(*weakest, pc, FALSE, 0);
          }//if
          else if ((chance > 6) && ((pc.HP + 100) < pc.HP_MAX)) {
            if (cls == CLERIC) {
              do_cast_heal(pc, pc, FALSE, 0);
            }//if
            else if (pc.HP < 60) {
              do_cast_cure_critical(pc, pc, FALSE, 0);
            }//else
          }//if
          else if (chance > 4) {
            do_cast_shocking_grasp(*primary_targ, pc, FALSE, 0);
          }//if
        }//if not so violent
        else if (violence >= 0) {
          if ((chance > 7) && ((pc.HP + 100) < pc.HP_MAX)) {
            do_cast_heal(pc, pc, FALSE, 0);
          }//if
          else if (chance > 4) {
            do_cast_armor(pc, pc, FALSE, 0);
          }//if
        }//if not so violent
      }//if more defensive
    }//if a magic user
    else {
      /* bards, warriors, rangers and all others */
      if (violence > 7) { //lets kill the weaklings/clerics!
        chance = d(1, 10); //expand this for more cases            
        if (chance > 7) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_bash(*weakest, pc);
        }//if
        else if ((chance > 5) && (pc.MOV > 0)) {
          if (num_fighting > 3) {
            do_berserk(pc);
          }//if
        }
        else if ((chance > 4) && (primary_targ->EQ[9])) {
          do_trip(*primary_targ, pc);
        }//if
        else if (chance > 2) {
          do_bash(*primary_targ, pc);
        }//if
      }//if very violent
      else if (violence > 3) {
        chance = d(1, 10); //expand this for more cases            
        if (chance > 8) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_bash(*weakest, pc);
        }//if
        else if (chance > 6) {
          do_trip(*primary_targ, pc);
        }
      }//if not so violent
      else if (violence >= 0) {
        chance = d(1, 10); //expand this for more cases            
        if (chance > 7) {
          do_bash(*primary_targ, pc);
        }//if
        else if (chance > 5) {
          do_kick(*primary_targ, pc);
        }//if
      }//if not so violent
    }//if a warrior or ranger or generic
  }//if level 11 - 20
  else { //class 1-10
    if (cls == THIEF) {
      if (violence > 7) { //lets kill the weaklings/clerics!
        if ((chance > 7) && (!is_tank(pc)) && pc.EQ[9] && 
            pc.EQ[9]->OBJ_FLAGS.get(43)) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_kick(*weakest, pc);
        }//if
      }//if very violent
      else if (violence >= 0) {
        if (chance > 8) {
          do_trip(*primary_targ, pc);
        }//if
      }//if not so violent
    }//if a thief
    else if ((cls == WIZARD) || (cls == ALCHEMIST) || (cls == CLERIC)) {
      if (pc.MANA < 0)
        return;
      if (defense <= 0) {
        if (violence > 8) { //lets kill the weaklings/clerics!
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_dark_dart(*weakest, pc, FALSE, 0);
          }//if
          else if (chance > 6) {
            do_cast_shocking_grasp(*primary_targ, pc, FALSE, 0);
          }//if
        }//if very violent
        else if (violence > 3) {
          if (chance > 8) {
            critter* weakest = find_weakest(pc.IS_FIGHTING);
            do_cast_burning_hands(*weakest, pc, FALSE, 0);
          }//if
          else if (chance > 4) {
            do_cast_cure_serious(pc, pc, FALSE, 0);
          }//if
        }//if not so violent
        else if (violence >= 0) {
          if (chance > 9) {
            do_cast_dark_dart(*primary_targ, pc, FALSE, 0);
          }//if
          else if (chance > 6) {
            do_cast_cure_serious(pc, pc, FALSE, 0);
          }//if
        }//if not so violent
      }//if more offensive
      else {//is more DEFENSIVE
        if (violence > 8) { //lets kill the weaklings/clerics!
          if (chance > 8) {
            if (!is_affected_by(BLESS_SKILL_NUM, pc)) {
              do_cast_bless(pc, pc, FALSE, 0);
            }//if
            else {
              do_cast_cure_serious(pc, pc, FALSE, 0);
            }//else
          }//if
        }//if very violent
        else if (violence > 3) {
          if (chance > 8) {
            do_cast_cure_serious(pc, pc, FALSE, 0);
          }//if
        }//if not so violent
        else if (violence >= 0) {
          if ((chance > 9) && ((pc.HP + 10) < pc.HP_MAX)) {
            do_cast_cure_serious(pc, pc, FALSE, 0);
          }//if
        }//if not so violent
      }//if more defensive
    }//if a magic user
    else {
      /* bards, warriors, rangers and all others */
      if (violence > 7) { //lets kill the weaklings/clerics!
        if (chance > 8) {
          critter* weakest = find_weakest(pc.IS_FIGHTING);
          do_kick(*weakest, pc);
        }//if
        else if (chance > 5) {
          do_kick(*primary_targ, pc);
        }//if
      }//if very violent
      else if (violence >= 0) {
        if (chance > 8) {
          do_kick(*primary_targ, pc);
        }//if
      }//if not so violent
    }//if a warrior or ranger or generic
  }//if level 0-10
}//do_battle_proc *whew*


/* path is empty upon failure, otherwise holds path */
void path_from_a_to_b(int start_room, int targ_room, List<int>& path) {
   Cell<door*> cll;
   door* ptr;
   int counter = 0;
   int tmp_rm;
   String buf(100);

   //log("In path_from_a_to_b.\n");

   Tree2<int> tree(start_room);

   Tree2Node<int>* tmp_child;
   Tree2Cell<int> par(tree);
   Tree2Cell<int> tcll;

   path.clear();

   if (targ_room == start_room) {
      return;  //already here
   }//if

   while (par) { //break out when found, or determined unfindable
      if (counter++ > 500) { //insanity check
         mudlog << "WARNING:  TRACK: Busted insanity check!, start_room: "
                << start_room << " targ_room: " << targ_room << endl;
         tcll.Head(tree);
         while (tcll) {
            counter = tcll.Next_Breadth();
            room_list[counter].setFlag(29, FALSE); //no longer in a path
               }//while
         path.clear(); //sorry, didn't find it!
         return;
      }//if

      /* par is a cell, pointing to a tree node, which contains the
         number of the current room.  This is par.Data(). */

      // Sprintf(buf, "TRACK:  Here is current room#:  %i\n", par.Data());
      // log(buf);

                 /* cll is a List<door*> cell, it will take us through
                    all of the possible exits in the room numbered 
                    by par.Data() */

      room_list[par.Data()].DOORS.head(cll);
      while ((ptr = cll.next())) {
         tmp_rm = abs(ptr->destination);

         if (!room_list[tmp_rm].getFlag(29)) {//not already in a path

            /* tmp_child will point to the newly inserted tree node */
            tmp_child = par.Push_Child(tmp_rm);   //add to tree

            // tree2.Log(); //write tree to logfile

            room_list[tmp_rm].setFlag(29, TRUE);   //now its in a path

            if (tmp_rm == targ_room) { //if found it
              //log("TRACK:  FOUND IT, here is tree:");
              //Tree2.Log();

               tcll.Head(*tmp_child); //tcll now points to the tmp_child

               while (tcll) {
                  tmp_rm = tcll.Parent();
                  path.prepend(tmp_rm);
               }//while


               tcll.Head(tree);
               while (tcll) {
                  counter = tcll.Next_Breadth();
                  room_list[counter].setFlag(29, FALSE);
                     }//while
               return;
            }//if
         }//if
      }//while, goes through each door
      par.Next_Breadth();
   }//while not done or count > 500

   // if here, then the search failed,
   // clean up mess and go home!

   //   log("TRACK:  Can't find path, or sanity check failed.\n");

   tcll.Head(tree);
   while (tcll) {
      counter = tcll.Next_Breadth();
      room_list[counter].setFlag(29, FALSE);
   }//while
   path.clear();
}//path from a to b


void a_summons_help_against_b(critter& vict, critter& pc) {
   List<critter*> tmp_lst;
   if (!vict.mob)
      return;

   /* first check room that C is in */
   Cell<critter*> cll(ROOM.getCrits());
   critter* ptr;

   while ((ptr = cll.next())) {
      if (a_will_help_b_against_c(*ptr, vict, pc)) {
         Put(ptr, tmp_lst);
      }//if
   }//while
   
   tmp_lst.head(cll);
   while ((ptr = cll.next())) {
      if (ptr->isMob()) {
         ptr = mob_to_smob(*ptr, pc.getCurRoomNum());
      }//if
      do_hit(pc, *ptr);
   }//while
   
   tmp_lst.clear();
   
   int cur_room = vict.getCurRoomNum();
   int targ_room;
   Cell<door*> dcll(room_list[cur_room].DOORS);
   door* dptr;
   while ((dptr = dcll.next())) {
      if (door::findDoorByDest(room_list[(targ_room = 
                                          abs(dptr->destination))].DOORS,
                               cur_room)) {
         List<critter*> room_crits(room_list[targ_room].getCrits());
         room_crits.head(cll);
         while ((ptr = cll.next())) {
            if (a_will_help_b_against_c(*ptr, vict, pc)) {
               tmp_lst.append(ptr);
            }//if
         }//while
         
         tmp_lst.head(cll);
         while ((ptr = cll.next())) {
            if (ptr->isMob()) {
               ptr = mob_to_smob(*ptr, targ_room);
            }//if
            int is_dead = FALSE;
            ptr->trackToKill(pc, is_dead);
         }//while
         tmp_lst.clear();
      }//if
   }//while
}//a summons help agains b


/* called when a projectile comes through room, usually from throw or shoot. */
void alert_room_proc(int rm_num, int alert_type, critter& targ,
                     critter& agg) {
   List<critter*> tmp_lst(room_list[rm_num].getCrits());
   Cell<critter*> cll(tmp_lst);
   critter* ptr;
   String buf(100);

   while ((ptr = cll.next())) {
      if (alert_type == PROJECTILE_DEATH) {
         if (ptr->mob && ptr->mob->proc_data) {
            if (ptr->mob->getBadAssedness() > 3) {
               buf = "get all corpse";
               ptr->processInput(buf, FALSE, TRUE);
            }//if
            if (ptr->mob->getBadAssedness() > 8) {
               buf = "skin corpse";
               ptr->processInput(buf, FALSE, TRUE);
            }//if
            if (ptr->mob->getBadAssedness() > 6) {
               buf = "wear all";
               ptr->processInput(buf, FALSE, TRUE);
            }//if
         }//if
      }//if PROJECTILE_DEATH
   }//while
}//alert_room_proc


critter* find_weakest(List<critter*>& lst) {
   Cell<critter*> cll(lst);
   critter* ptr;
   critter* weakest = Top(lst);
   
   while ((ptr = cll.next())) {
      if (ptr == weakest)
         continue;
      if (ptr->isWeakerThan(*weakest)) {
         weakest = ptr;
      }//if
   }//while
   return weakest;
}//find_weakest
  

short is_tank(critter& pc) {
  if (IsEmpty(pc.IS_FIGHTING))
    return FALSE;

  Cell<critter*> cll(pc.IS_FIGHTING);
  critter* ptr;

  while ((ptr = cll.next())) {
    if (Top(ptr->IS_FIGHTING) == &pc) {
      return TRUE;
    }//if
  }//while

  return FALSE;
}//is_tank


void do_was_calmed_procs(critter& calmed, critter& calmer) {
   if (!calmer.isImmort() && calmed.mob && calmed.mob->proc_data) {

      //should range from 0-20, where higher is meaner.
      int i = abs(calmed.mob->getBenevolence() - 10);
      if (d(1, i) > 8) {
         emote("looks very pissed!!\n", calmed, room_list[calmed.getCurRoomNum()],
               TRUE);
         if (!calmed.isAnimal()) {
            if (calmed.LEVEL > 20) {
               do_body_slam(calmer, calmed);
            }//if
            else if (calmed.LEVEL > 10) {
               do_bash(calmer, calmed);
            }//else
            else {
               do_kick(calmer, calmed);
            }//else
         }
         else {
            do_hit(calmer, calmed);
         }
      }//if
        
      return;
  }//if it's a mob etc
}//do_calmed_procs


///**********************************************************************///
///************************  auxillary functions  ***********************///
///**********************************************************************///