#ifndef _ENTITYBASETYPES_H
#define _ENTITYBASETYPES_H

namespace Engine {

struct EntityBase;
struct EntityPhysicState;
struct EntityControllerState;

/** \brief Represents the different types of an entity from the Engines' perspective
 *
 * The different EntityBaseTypes define their basic behaviour when it comes to
 * events such as collisions between two Entities.
 *
 * Here is an overview how collisions are handled:
 * 
 * <table>
 * <tr>
 *   <td></td>
 *   <td>EntityBaseTypeParticle</td>
 *   <td>EntityBaseTypeBlock</td>
 *   <td>EntityBaseTypeActor</td>
 * </tr>
 * <tr>
 *   <td>EntityBaseTypeParticle</td>
 *   <td>-</td>
 *   <td>C</td>
 *   <td>C</td>
 * </tr>
 * <tr>
 *   <td>EntityBaseTypeBlock</td>
 *   <td>C</td>
 *   <td>C</td>
 *   <td>C</td>
 * </tr>
 * <tr>
 *   <td>EntityBaseTypeActor</td>
 *   <td>C</td>
 *   <td>C</td>
 *   <td>C</td>
 * </tr>
 * </table>
 *
 * A 'C' means that Engine::Physics::CheckPossibleCollisionPair() will return
 * true (this results that the two types cannot penetrate each other).
 */
enum EntityBaseType {
	EntityBaseTypeNone = 0, /**< is the default type and does not collide with anything */
	EntityBaseTypeBlock,    /**< represents walls etc. that block Particles, Actors and other Blocks */
	EntityBaseTypeParticle, /**< is used for projectiles or Entities that just move
														but are "dumb" apart from that */
	EntityBaseTypeActor,    /**< is the type for objects that interact with each other */
	EntityBaseTypeLast      /**< marks the maximum number of EntityBaseType */
};


}

#endif // _ENTITYBASETYPES_H
