/*==LICENSE==*

CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011  Cyan Worlds, Inc.

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 3 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, see <http://www.gnu.org/licenses/>.

You can contact Cyan Worlds, Inc. by email legal@cyan.com
 or by snail mail at:
      Cyan Worlds, Inc.
      14617 N Newport Hwy
      Mead, WA   99021

*==LICENSE==*/
/** \file plArmatureEffects.h
    Manages environmental effects for the avatar.
*/
#ifndef plArmatureEffects_inc
#define plArmatureEffects_inc

#include "pnKeyedObject/hsKeyedObject.h"
#include "hsTemplates.h"
#include "hsBitVector.h"

class plArmatureMod;
class plArmatureEffect;
class plRandomSoundMod;

/** \class plArmatureEffects
    Passes key avatar events to external effects generators.
    Currently used for footstep sounds only, but should eventually
    generalize to water splashes, etc. 
    More to come...*/
class plArmatureEffectsMgr : public hsKeyedObject
{
protected:
    hsTArray<plArmatureEffect *> fEffects;
    hsBool fEnabled;

public:

    plArmatureEffectsMgr() : fArmature(nil), fEnabled(true) {}
    virtual ~plArmatureEffectsMgr() {}

    CLASSNAME_REGISTER( plArmatureEffectsMgr );
    GETINTERFACE_ANY( plArmatureEffectsMgr, hsKeyedObject );

    virtual void Read(hsStream* s, hsResMgr* mgr);
    virtual void Write(hsStream* s, hsResMgr* mgr); 

    virtual hsBool MsgReceive(plMessage* msg);

    UInt32 GetNumEffects();
    plArmatureEffect *GetEffect(UInt32 num);
    void ResetEffects();

    plArmatureMod *fArmature;

    enum
    {
        kFootDirt,
        kFootPuddle,
        kFootWater,
        kFootTile,
        kFootMetal,
        kFootWoodBridge,
        kFootRopeLadder,
        kFootGrass,
        kFootBrush,
        kFootHardWood,
        kFootRug,
        kFootStone,
        kFootMud,
        kFootMetalLadder,
        kFootWoodLadder,
        kFootDeepWater,
        kFootMaintainerGlass,
        kFootMaintainerStone,
        kFootSwimming,
        kMaxSurface,
        kFootNoSurface = kMaxSurface,
    };  
    static const char *SurfaceStrings[];
};

class plArmatureEffect : public hsKeyedObject
{
public:
    plArmatureEffect() {}
    ~plArmatureEffect() {}

    CLASSNAME_REGISTER( plArmatureEffect );
    GETINTERFACE_ANY( plArmatureEffect, hsKeyedObject );

    virtual hsBool HandleTrigger(plMessage* msg) = 0;
    virtual void Reset() {}
};

class plArmatureEffectFootSurface
{
public:
    UInt8 fID;
    plKey fTrigger;
};

class plArmatureEffectFootSound : public plArmatureEffect
{
protected:
    hsTArray<plArmatureEffectFootSurface *> fSurfaces;
    hsBitVector fActiveSurfaces;
    plRandomSoundMod *fMods[plArmatureEffectsMgr::kMaxSurface];

    UInt32 IFindSurfaceByTrigger(plKey trigger);

public:
    plArmatureEffectFootSound();
    ~plArmatureEffectFootSound();

    CLASSNAME_REGISTER( plArmatureEffectFootSound );
    GETINTERFACE_ANY( plArmatureEffectFootSound, plArmatureEffect );

    virtual void Read(hsStream* s, hsResMgr* mgr);
    virtual void Write(hsStream* s, hsResMgr* mgr); 

    virtual hsBool MsgReceive(plMessage* msg);
    virtual hsBool HandleTrigger(plMessage* msg);
    virtual void Reset();
    void SetFootType(UInt8);

    enum
    {
        kFootTypeShoe,
        kFootTypeBare,
    };
};

#endif