typedef struct player Player;
typedef struct hyperKaos HyperKaos;

typedef struct kaos
{
  void* kType;
  void (*run)(struct kaos* self);
  void (*destroy)(struct kaos* self);
  struct kaos* next;
} Kaos;

typedef struct kaos_Conversation
{
  Kaos* core;
  int index;
} Conversation;

typedef struct kaos_Choice
{
  Kaos* core;
  SDL_Surface* question;
  SDL_Surface* answ1;
  SDL_Surface* answ2;
  HyperKaos* path1;
  HyperKaos* path2;
} Choice;

typedef struct kaos_Manip
{
  Kaos* core;
  Player* target;
  int xSpd, ySpd;
} Manip;

typedef struct kaos_Look
{
  Kaos* core;
  Player* target;
  char dir;
} Look;

typedef struct kaos_FaceEachother
{
  Kaos* core;
  Player* p1;
  Player* p2;
} FaceEachother;

#ifdef SOUND_ON
typedef struct kaos_PlaySound
{
  Kaos* core;
  int i;
} PlaySound;
#endif

typedef struct kaos_Teleport
{
  Kaos* core;
  Player* target;
  int x, y;
  int out;
  SDL_Surface* aura;
} Teleport;

typedef struct kaos_Erase
{
  Kaos* core;
  char type;
  int index;
} Erase;

typedef struct kaos_Wait
{
  Kaos* core;
  char type;
  int frames;
} Wait;

typedef struct kaos_Spell_Beam
{
  Kaos* core;
  SDL_Surface* aura;
} Spell_Beam;

Kaos* rawKaos();

Kaos* newConversation(int i);
void runConversation(Kaos* self);
void deleteConversation(Kaos* target);

Kaos* newChoice(char* q, char* a1, char* a2, HyperKaos* p1, HyperKaos* p2);
void runChoice(Kaos* self);
void deleteChoice(Kaos* target);

Kaos* newManip(Player* t, int x, int y);
void runManip(Kaos* self);
void deleteManip(Kaos* target);

Kaos* newLook(Player* t, char d);
void runLook(Kaos* self);
void deleteLook(Kaos* target);

Kaos* newTeleport(Player* p, int x, int y, int o);
void runTeleport(Kaos* self);
void deleteTeleport(Kaos* target);

Kaos* newFaceEachother(Player* p1, Player* p2);
void runFaceEachother(Kaos* self);
void deleteFaceEachother(Kaos* target);

#ifdef SOUND_ON
Kaos* newPlaySound(int i);
void runPlaySound(Kaos* self);
void deletePlaySound(Kaos* target);
#endif

Kaos* newErase(char t, int i);
void runErase(Kaos* self);
void deleteErase(Kaos* target);

Kaos* newWait(char t, int i);
void runWait(Kaos* self);
void deleteWait(Kaos* target);

Kaos* newSpell_Beam();
void runSpell_Beam(Kaos* self);
void deleteSpell_Beam(Kaos* target);