/
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: Filters.h,v 1.4 1999/07/07 06:05:11 greear Exp $
// $Revision: 1.4 $  $Author: greear $ $Date: 1999/07/07 06:05:11 $

//
//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
//

///********************  Filters.h  *****************************///



#ifndef __FILTERS_INCLUDE
#define __FILTERS_INCLUDE

#include "critter.h"

// Use all variables to make the compiler warnings go away.
#define USE_VARS if (!(1 || &pc || b)) return FALSE

/** Matches all. */
class CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) { USE_VARS; return TRUE; }
   virtual const char* name() { return "CritterSelector"; }
};

/** Matches None. */
class SelectNone : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) { USE_VARS; return FALSE; }
   virtual const char* name() { return "SelectNone"; }
};

/** matches when pc is an NPC */
class SelectNPC : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return pc->isNPC();
   }
   virtual const char* name() { return "SelectNPC"; }
};

/** matches when pc != b */
class SelectAreSame : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* actor) {
      return pc == actor;
   }
   virtual const char* name() { return "SelectAreSame"; }
};

/** matches when pc is sleeping */
class SelectIsSleeping : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return pc->isSleeping();
   }
   virtual const char* name() { return "SelectIsSleeping"; }
};


/** matches when pc is meditating */
class SelectIsMeditating : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return pc->isMeditating();
   }
   virtual const char* name() { return "SelectIsMeditating"; }
};

/** matches when pc is an NPC and is possessed. */
class SelectNPC_Possessed : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return (pc->isNPC() && pc->isPossessed());
   }
   virtual const char* name() { return "SelectNPC_Possessed"; }
};

/** matches when pc is a PC. */
class SelectPC : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return pc->isPc();
   }
   virtual const char* name() { return "SelectPC"; }
};

/** matches mobs who MAY SEE mob entry message. */
class SelectActorEntryMsgs : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* actor) {
      return (actor->isPc() || (pc->pc && !pc->PC_FLAGS.get(28)));
   }
   virtual const char* name() { return "SelectActorEntryMsgs"; }
};

/** matches b if pc can see it. */
class SelectVisibleToActor : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* actor) {
      return actor->canDetect(*pc);
   }
   virtual const char* name() { return "SelectVisibleToActor"; }
};

/** matches b if pc can see it. */
class SelectCanDetectActor : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* actor) {
      return pc->canDetect(*actor);
   }
   virtual const char* name() { return "CanDetectActor"; }
};

/** returns true if pc cannot detect b's sneaking. */
class SelectActorSneakWorked : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* actor);
   virtual const char* name() { return "SelectActorSneakWorked"; }
};


/** returns true if pc should get extra info (imm only for now) */
class SelectGetsInfo : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return (pc->isPc() && pc->PC_FLAGS.get(14));
   }
   virtual const char* name() { return "SelectGetsInfo"; }
};


/** returns true if pc is using the Hegemon Client */
class SelectUsingClient : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return (pc->isUsingClient());
   }
   virtual const char* name() { return "SelectUsingClient"; }
};

/** returns true if pc is NOT using the Hegemon Client */
class SelectNotUsingClient : public CritterSelector {
public:
   virtual int matches(const critter* pc, const critter* b) {
      USE_VARS; return (!pc->isUsingClient());
   }
   virtual const char* name() { return "SelectNotUsingClient"; }
};


class CSelectorColl {
public:
   enum SelectorRule {
      SELECTOR_AND,
      SELECTOR_OR
   };

protected:
   ObjArray<CritterSelector*> selections;
   SelectorRule select_rule;

public:
   CSelectorColl() : select_rule(SELECTOR_OR) { }
   CSelectorColl(SelectorRule rule, CritterSelector* c1 = NULL,
                 CritterSelector* c2 = NULL, CritterSelector* c3 = NULL,
                 CritterSelector* c4 = NULL, CritterSelector* c5 = NULL,
                 CritterSelector* c6 = NULL) {
      select_rule = rule;
      addSelector(c1);
      addSelector(c2);
      addSelector(c3);
      addSelector(c4);
      addSelector(c5);
      addSelector(c6);
   }//constructor

   ~CSelectorColl() { };

   void setRule(SelectorRule rule) { select_rule = rule; }

   int matches(critter* pc_, critter* other = NULL) const;

   /** Does NOT make a deep copy of incomming data. */
   void addSelector(CritterSelector* selector) {
      if (selector)
         selections.addElement(selector);
   }//addSelector

private:
   CSelectorColl& operator=(const CSelectorColl& src);
   CSelectorColl(const CSelectorColl& src);
};


/** Just collects our filters for us. */
class Selectors {
protected:
   Selectors();

public:
   CritterSelector selectAll;
   SelectNone selectNone;
   SelectCanDetectActor selectCanDetectActor;
   SelectNPC selectNPC;
   SelectNPC_Possessed selectNPC_Possessed;
   SelectActorEntryMsgs selectActorEntryMsgs;
   SelectAreSame selectAreSame;
   SelectActorSneakWorked selectActorSneakWorked;
   SelectIsSleeping selectIsSleeping;
   SelectIsMeditating selectIsMeditating;
   SelectGetsInfo selectGetsInfo;
   SelectUsingClient selectUsingClient;
   SelectNotUsingClient selectNotUsingClient;

   CSelectorColl CC_all;
   CSelectorColl CC_none;
   CSelectorColl CC_mob_entry_allow;
   CSelectorColl CC_mob_entry_deny;
   CSelectorColl CC_gets_info_allow;
   CSelectorColl CC_using_client;
   CSelectorColl CC_not_using_client;

   static Selectors& instance();

private:
   Selectors& operator=(const Selectors& src);
   Selectors(const Selectors& src);
};




#endif