805
%{
#include "Entities/StdH/StdH.h"
#include "Models/Items/ItemHolder/ItemHolder.h"
%}

uses "Entities/Item";

// key type 
enum KeyItemType {
  0 KIT_ANKHWOOD          "Wooden ankh",
  1 KIT_ANKHROCK          "Stone ankh",
  2 KIT_ANKHGOLD          "Gold ankh",
  3 KIT_AMONGOLD          "Gold amon",
  4 KIT_ANKHGOLDDUMMY     "Gold ankh dummy key",
  5 KIT_ELEMENTEARTH      "Element - Earth",
  6 KIT_ELEMENTWATER      "Element - Water",
  7 KIT_ELEMENTAIR        "Element - Air",
  8 KIT_ELEMENTFIRE       "Element - Fire",
  9 KIT_RAKEY             "Ra Key",
 10 KIT_MOONKEY           "Moon Key",
 12 KIT_EYEOFRA           "Eye of Ra",
 13 KIT_SCARAB            "Scarab",
 14 KIT_COBRA             "Cobra",
 15 KIT_SCARABDUMMY       "Scarab dummy",
 16 KIT_HEART             "Gold Heart",
 17 KIT_FEATHER           "Feather of Truth",
 18 KIT_SPHINX1           "Sphinx 1",
 19 KIT_SPHINX2           "Sphinx 2",
};

// event for sending through receive item
event EKey {
  enum KeyItemType kitType,
};

%{

const char *GetKeyName(enum KeyItemType kit)
{
  switch(kit) {
  case KIT_ANKHWOOD :       return TRANS("Wooden ankh"); break;
  case KIT_ANKHROCK:        return TRANS("Stone ankh"); break;
  case KIT_ANKHGOLD :
  case KIT_ANKHGOLDDUMMY :  return TRANS("Gold ankh"); break;
  case KIT_AMONGOLD :       return TRANS("Gold Amon statue"); break;
  case KIT_ELEMENTEARTH  :  return TRANS("Earth element"); break;
  case KIT_ELEMENTWATER  :  return TRANS("Water element"); break;
  case KIT_ELEMENTAIR    :  return TRANS("Air element"); break;
  case KIT_ELEMENTFIRE   :  return TRANS("Fire element"); break;
  case KIT_RAKEY         :  return TRANS("Ra key"); break;
  case KIT_MOONKEY       :  return TRANS("Moon key"); break;
  case KIT_EYEOFRA       :  return TRANS("Eye of Ra"); break;
  case KIT_SCARAB        :
  case KIT_SCARABDUMMY   :  return TRANS("Scarab"); break;
  case KIT_COBRA         :  return TRANS("Cobra"); break;
  case KIT_HEART         :  return TRANS("Gold Heart"); break;
  case KIT_FEATHER       :  return TRANS("Feather of Truth"); break;
  case KIT_SPHINX1       :
  case KIT_SPHINX2       :  return TRANS("Gold Sphinx"); break;
  default: return TRANS("unknown item"); break;
  };
}

%}

class CKeyItem : CItem {
name      "KeyItem";
thumbnail "Thumbnails\\KeyItem.tbn";
features "IsImportant";

properties:
  1 enum KeyItemType m_kitType    "Type" 'Y' = KIT_ANKHWOOD,     // key type
  3 INDEX m_iSoundComponent = 0,

components:
  0 class   CLASS_BASE        "Classes\\Item.ecl",

// ********* ANKH KEY *********
  1 model   MODEL_ANKHWOOD      "Models\\Items\\Keys\\AnkhWood\\Ankh.mdl",
  2 texture TEXTURE_ANKHWOOD    "Models\\Ages\\Egypt\\Vehicles\\BigBoat\\OldWood.tex",

  3 model   MODEL_ANKHROCK      "Models\\Items\\Keys\\AnkhStone\\Ankh.mdl",
  4 texture TEXTURE_ANKHROCK    "Models\\Items\\Keys\\AnkhStone\\Stone.tex",

  5 model   MODEL_ANKHGOLD      "Models\\Items\\Keys\\AnkhGold\\Ankh.mdl",
  6 texture TEXTURE_ANKHGOLD    "Models\\Items\\Keys\\AnkhGold\\Ankh.tex",

  7 model   MODEL_AMONGOLD      "Models\\Ages\\Egypt\\Gods\\Amon\\AmonGold.mdl",
  8 texture TEXTURE_AMONGOLD    "Models\\Ages\\Egypt\\Gods\\Amon\\AmonGold.tex",

 10 model   MODEL_ELEMENTAIR    "Models\\Items\\Keys\\Elements\\Air.mdl",
 11 texture TEXTURE_ELEMENTAIR  "Models\\Items\\Keys\\Elements\\Air.tex",

 20 model   MODEL_ELEMENTWATER    "Models\\Items\\Keys\\Elements\\Water.mdl",
 21 texture TEXTURE_ELEMENTWATER  "Models\\Items\\Keys\\Elements\\Water.tex",

 30 model   MODEL_ELEMENTFIRE    "Models\\Items\\Keys\\Elements\\Fire.mdl",
 31 texture TEXTURE_ELEMENTFIRE  "Models\\Items\\Keys\\Elements\\Fire.tex",

 40 model   MODEL_ELEMENTEARTH    "Models\\Items\\Keys\\Elements\\Earth.mdl",
 41 texture TEXTURE_ELEMENTEARTH  "Models\\Items\\Keys\\Elements\\Texture.tex",

 50 model   MODEL_RAKEY           "Models\\Items\\Keys\\RaKey\\Key.mdl",
 51 texture TEXTURE_RAKEY         "Models\\Items\\Keys\\RaKey\\Key.tex",

 60 model   MODEL_MOONKEY         "Models\\Items\\Keys\\RaSign\\Sign.mdl",
 61 texture TEXTURE_MOONKEY       "Models\\Items\\Keys\\RaSign\\Sign.tex",

 70 model   MODEL_EYEOFRA         "Models\\Items\\Keys\\EyeOfRa\\EyeOfRa.mdl",
 71 texture TEXTURE_EYEOFRA       "Models\\Items\\Keys\\EyeOfRa\\EyeOfRa.tex",

 80 model   MODEL_SCARAB          "Models\\Items\\Keys\\Scarab\\Scarab.mdl",
 81 texture TEXTURE_SCARAB        "Models\\Items\\Keys\\Scarab\\Scarab.tex",

 90 model   MODEL_COBRA           "Models\\Items\\Keys\\Uaset\\Uaset.mdl",
 91 texture TEXTURE_COBRA         "Models\\Items\\Keys\\Uaset\\Uaset.tex",

 92 model   MODEL_FEATHER         "Models\\Items\\Keys\\Luxor\\FeatherOfTruth.mdl",
 93 texture TEXTURE_FEATHER       "Models\\Items\\Keys\\Luxor\\FeatherOfTruth.tex",
 94 model   MODEL_HEART           "Models\\Items\\Keys\\Luxor\\GoldHeart.mdl",
 95 texture TEXTURE_HEART         "Models\\Items\\Keys\\Luxor\\GoldHeart.tex",

 96 model   MODEL_SPHINXGOLD      "Models\\Items\\Keys\\GoldSphinx\\GoldSphinx.mdl",
 97 texture TEXTURE_SPHINXGOLD    "Models\\Items\\Keys\\GoldSphinx\\Sphinx.tex",

 // ********* MISC *********
255 texture TEXTURE_FLARE       "Models\\Items\\Flares\\Flare.tex",
256 model   MODEL_FLARE         "Models\\Items\\Flares\\Flare.mdl",
257 texture TEX_REFL_GOLD01     "Models\\ReflectionTextures\\Gold01.tex",
258 texture TEX_REFL_METAL01    "Models\\ReflectionTextures\\LightMetal01.tex",
259 texture TEX_SPEC_MEDIUM     "Models\\SpecularTextures\\Medium.tex",
260 texture TEX_SPEC_STRONG     "Models\\SpecularTextures\\Strong.tex",

// ************** SOUNDS **************
301 sound   SOUND_KEY         "Sounds\\Items\\Key.wav",

functions:
  void Precache(void) {
    PrecacheSound(SOUND_KEY);
  }
  /* Fill in entity statistics - for AI purposes only */
  BOOL FillEntityStatistics(EntityStats *pes)
  {
    pes->es_strName = GetKeyName(m_kitType);
    pes->es_ctCount = 1;
    pes->es_ctAmmount = 1;
    pes->es_fValue = 1;
    pes->es_iScore = 0;//m_iScore;
    return TRUE;
  }
  // render particles
  void RenderParticles(void) {
    // no particles when not existing
    if (GetRenderType()!=CEntity::RT_MODEL) {
      return;
    }
    switch (m_kitType) {
      case KIT_ANKHWOOD:
      case KIT_ANKHROCK:
      case KIT_ANKHGOLD:
      case KIT_ANKHGOLDDUMMY:
      default:
        Particles_Stardust(this, 0.9f, 0.70f, PT_STAR08, 32);
        break;
      case KIT_AMONGOLD:
        Particles_Stardust(this, 1.6f, 1.00f, PT_STAR08, 32);
        break;
    }
  }

  // set health properties depending on type
  void SetProperties(void) {
    m_fRespawnTime = 10.0f;
    m_strDescription = GetKeyName(m_kitType);

    switch (m_kitType) {
      case KIT_ANKHWOOD:
        // set appearance
        AddItem(MODEL_ANKHWOOD, TEXTURE_ANKHWOOD, 0, 0, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;
      case KIT_ANKHROCK:
        // set appearance
        AddItem(MODEL_ANKHROCK, TEXTURE_ANKHROCK, 0, 0, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;
      case KIT_ANKHGOLD:
      case KIT_ANKHGOLDDUMMY:
        // set appearance
        AddItem(MODEL_ANKHGOLD, TEXTURE_ANKHGOLD, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_SPHINX1:
      case KIT_SPHINX2:
        // set appearance
        AddItem(MODEL_SPHINXGOLD, TEXTURE_SPHINXGOLD, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(2.0f, 2.0f, 2.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_AMONGOLD:
        // set appearance
        AddItem(MODEL_AMONGOLD, TEXTURE_AMONGOLD, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.5f,0), FLOAT3D(2,2,0.3f) );
        StretchItem(FLOAT3D(2.0f, 2.0f, 2.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_ELEMENTEARTH:
        // set appearance
        AddItem(MODEL_ELEMENTEARTH, TEXTURE_ELEMENTEARTH, TEX_REFL_METAL01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_ELEMENTAIR:
        // set appearance
        AddItem(MODEL_ELEMENTAIR, TEXTURE_ELEMENTAIR, TEX_REFL_METAL01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_ELEMENTWATER:
        // set appearance
        AddItem(MODEL_ELEMENTWATER, TEXTURE_ELEMENTWATER, TEX_REFL_METAL01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_ELEMENTFIRE:
        // set appearance
        AddItem(MODEL_ELEMENTFIRE, TEXTURE_ELEMENTFIRE, TEX_REFL_METAL01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;
  
      case KIT_RAKEY:
        // set appearance
        AddItem(MODEL_RAKEY, TEXTURE_RAKEY, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;
      case KIT_MOONKEY:
        // set appearance
        AddItem(MODEL_MOONKEY, TEXTURE_MOONKEY, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_EYEOFRA:
        // set appearance
        AddItem(MODEL_EYEOFRA, TEXTURE_EYEOFRA, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_SCARAB:
      case KIT_SCARABDUMMY:
        // set appearance
        AddItem(MODEL_SCARAB, TEXTURE_SCARAB, TEX_REFL_METAL01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_COBRA:
        // set appearance
        AddItem(MODEL_COBRA, TEXTURE_COBRA, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;

      case KIT_FEATHER:
        // set appearance
        AddItem(MODEL_FEATHER, TEXTURE_FEATHER, 0, 0, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;
      case KIT_HEART:
        // set appearance
        AddItem(MODEL_HEART, TEXTURE_HEART, TEX_REFL_GOLD01, TEX_SPEC_MEDIUM, 0);
        // add flare
        AddFlare(MODEL_FLARE, TEXTURE_FLARE, FLOAT3D(0,0.2f,0), FLOAT3D(1,1,0.3f) );
        StretchItem(FLOAT3D(1.0f, 1.0f, 1.0f));
        m_iSoundComponent = SOUND_KEY;
        break;
    }
  };

procedures:
  ItemCollected(EPass epass) : CItem::ItemCollected {
    ASSERT(epass.penOther!=NULL);

    // send key to entity
    EKey eKey;
    eKey.kitType = m_kitType;
    // if health is received
    if (epass.penOther->ReceiveItem(eKey)) {
      if(_pNetwork->IsPlayerLocal(epass.penOther)) {IFeel_PlayEffect("PU_Key");}
      // play the pickup sound
      m_soPick.Set3DParameters(50.0f, 1.0f, 1.0f, 1.0f);
      PlaySound(m_soPick, m_iSoundComponent, SOF_3D);
      m_fPickSoundLen = GetSoundLength(m_iSoundComponent);
      jump CItem::ItemReceived();
    }
    return;
  };

  Main() {
    Initialize();     // initialize base class
    StartModelAnim(ITEMHOLDER_ANIM_SMALLOSCILATION, AOF_LOOPING|AOF_NORESTART);
    ForceCollisionBoxIndexChange(ITEMHOLDER_COLLISION_BOX_SMALL);
    SetProperties();  // set properties

    jump CItem::ItemLoop();
  };
};
