00001
00002 #ifndef __ENTITIES_H
00003 #define __ENTITIES_H
00004
00005
00006 #include "irrlicht.h"
00007
00008
00009 class cWorld;
00010 class cSoul;
00011
00012
00013 enum eEntity { eNil=0, eElement=1, eTree, eBoulder, eRobot, eMeanie, eSentinel };
00014 enum eEnergy { eNilNrg=0, eTreeNrg=1, eBoulderNrg=2, eRobotNrg=3 };
00015
00016
00020 class cEntityBase {
00021 public:
00022 cEntityBase( eEntity type, cWorld* world, IrrlichtDevice* device ) :
00023 mWorld( world ), mDevice( device ), mPreviousEntity( NULL ),
00024 mNextEntity( NULL ), mType( type )
00025 { }
00026 virtual ~cEntityBase()
00027 { }
00028
00029 void setIndex( int i, int j )
00030 { mIndexI=i; mIndexJ=j; }
00031 int getIndexI()
00032 { return mIndexI; }
00033 int getIndexJ()
00034 { return mIndexJ; }
00035 void setGroundLevel( f32 groundLevel )
00036 { mGroundLevel = groundLevel; }
00037 f32 getGroundLevel()
00038 { return mGroundLevel; }
00039 void setHeight( f32 height )
00040 { mHeight = height; }
00041 f32 getHeight()
00042 { return mHeight; }
00043
00044
00045 cEntityBase* getPreviousEntity()
00046 { return mPreviousEntity; }
00047 void setPreviousEntity( cEntityBase* entity )
00048 { mPreviousEntity = entity; }
00049 cEntityBase* getNextEntity()
00050 { return mNextEntity; }
00051 void setNextEntity( cEntityBase* entity )
00052 { mNextEntity = entity; }
00053
00054 int getEnergy();
00055 eEntity getType()
00056 { return mType; }
00057 bool createEntity( eEntity entity );
00058
00059 virtual scene::ISceneNode* getNode() = 0;
00060
00061 protected:
00062 cWorld* mWorld;
00063 IrrlichtDevice* mDevice;
00064
00065 int mIndexI;
00066 int mIndexJ;
00067 f32 mGroundLevel;
00068 f32 mHeight;
00069
00070 cEntityBase* mPreviousEntity;
00071 cEntityBase* mNextEntity;
00072
00073 eEntity mType;
00074 };
00075
00076
00080 class cEntity : public cEntityBase {
00081 public:
00082 cEntity( eEntity type, cWorld* world, IrrlichtDevice* device );
00083 ~cEntity();
00084
00085 void setNode( scene::IAnimatedMeshSceneNode* Node )
00086 { mNode=Node; }
00087 scene::ISceneNode* getNode()
00088 { return mNode; }
00089
00090 private:
00091 scene::IAnimatedMeshSceneNode* mNode;
00092 };
00093
00094
00098 class cElement : public cEntityBase {
00099 public:
00100 cElement( cWorld* world, IrrlichtDevice* device );
00101 ~cElement();
00102
00103 void setLevel( int level )
00104 { mLevel=level; mGroundLevel=level*sqrt(2.0); }
00105 int getLevel()
00106 { return mLevel;}
00107 core::vector3df getPosition()
00108 { return core::vector3df( getIndexI()+0.5, mGroundLevel, getIndexJ()+0.5 ); }
00109
00110 void setNode( scene::IMeshSceneNode* Node )
00111 { mNode=Node; }
00112 scene::ISceneNode* getNode()
00113 { return mNode; };
00114
00115 void setFlat( bool flat )
00116 { mFlat=flat; }
00117 bool isFlat()
00118 { return mFlat; }
00119
00120 private:
00121 ILogger *mLogger;
00122 scene::IMeshSceneNode* mNode;
00123 int mLevel;
00124 bool mFlat;
00125 };
00126
00127
00131 class cSoul {
00132 public:
00133
00134 cSoul( scene::ICameraSceneNode* camera );
00135
00136 void changeView( f32 px, f32 py );
00137 void turnAround();
00138 void updateView();
00139
00140
00141 void setIndex( int i, int j )
00142 { mIndexI=i; mIndexJ=j; }
00143 void setGroundLevel( f32 groundLevel )
00144 { mGroundLevel = groundLevel; }
00145 f32 getGroundLevel()
00146 { return mGroundLevel; }
00147 int getIndexI()
00148 { return mIndexI;}
00149 int getIndexJ()
00150 { return mIndexJ;}
00151 core::vector3df getPosition()
00152 { return core::vector3df( mIndexI+0.5, mGroundLevel+1.1, mIndexJ+0.5 ); }
00153 void setTarget( core::vector3df target );
00154
00155
00156 int getEnergy()
00157 { return mEnergy; }
00158 void addToEnergy( int add )
00159 { mEnergy += add; }
00160 bool substractFromEnergy( int sub );
00161
00162
00163 cEntityBase* getRobot()
00164 { return mRobot; }
00165 void setRobot( cEntityBase* robot )
00166 { mRobot = robot; }
00167
00168 private:
00169 scene::ICameraSceneNode* mCamera;
00170 f32 mTheta, mPhi;
00171 const f32 mThetaMin, mThetaMax;
00172 f32 mRotateSpeed;
00173
00174 int mIndexI, mIndexJ;
00175 f32 mGroundLevel;
00176 int mEnergy;
00177
00178 cEntityBase* mRobot;
00179 };
00180
00181 #endif // __ENTITIES_H