#ifndef _HPP_KUNGFLOW_DEFINES
#define _HPP_KUNGFLOW_DEFINES

#include "gaia/gaia.hpp"
using namespace gaia;

// class Spatial;
// class Object;

#include <deque>

#include "gaia/vector2.hpp"

const Vector2 _DEFAULTVECTOR = Vector2(1, 0);

const bool _ENABLE_ASSIGNMENTMATRIX = false;
const bool _DEBUGVISUALS = true;
const float _PHYSICSSCALE = 1.0f;
const float _VELOCITYFACTOR = 1.2f;//0.8f;
const float _AGILITYFACTOR = 1.0f;
const float _WALK_AGILITYFACTOR = 1.0f;//2.0f; // separate from the other moves, because we usually want those kept as crisp as they we have designed them
const float _GRAVITYFACTOR = 1.0f;
const float _ATTACKDISTANCEFACTOR = 0.9f;
const float _DIRECTIONQUANTIZATIONFACTOR = 1.0f;
const float _AUTOKICKDIRECTIONFACTOR = 0.5f;//0.3f;
const bool _JAB_ONBEAT = true;
const bool _DODGE_ONBEAT = true;
const bool _JUMP_ONBEAT = true;
const bool _THROW_ONBEAT = true;
const float _RUMBLEFACTOR = 0.8f;
const float _AUDIOVOLUME_MUSIC = 0.5f;
const float _AUDIOVOLUME_SFX = 0.1f;
const float _AI_SKILLFACTOR = 0.5f;
//const float _AIRDENSITY = 0.5f; // air resistance
const float _ATMOSPHEREFRICTIONCOEFFICIENT = 1.5f; // air resistance
const float _SHADOWINTENSITY = 0.3f;
//const float _ROTATIONAL_AGILITY_FACTOR = 1.0f; // how fast a character can rotate
const float _CAMBASEDISTANCE = 3.5f + 1.2f;
const float _AXISMOVEMENT_BANDWIDTH = 6.0f; // how many units can we walk up+down the map flow direction axis? (away from the forced, autoprogressing base position)
const float _AXISMOVEMENT_CENTERPULL_EXP = 1.5f; // 1.0 == linear, > 1.0 means we have less pull towards the center until we get closer to the sides of the movement band
const float _CULLDISTANCE = 25;
const int _PIXELSPERMETER = 64; // this is a guideline, not mandatory

struct KeyInput {
  KeyInput() {
    left = false;
    right = false;
    up = false;
    down = false;
    for (int i = 0; i < 9; i++) {
      actionkeys[i] = false;
    }
  }
  /*
  void CopyOnlyDepressed(const KeyInput &in) {
    if (in.left  == false) left  = false;
    if (in.right == false) right = false;
    if (in.up    == false) up    = false;
    if (in.down  == false) down  = false;
    for (int i = 0; i < 9; i++) {
      if (in.actionkeys[i] == false) actionkeys[i] = false;
    }
  }
  */
  bool left;
  bool right;
  bool up;
  bool down;
  bool actionkeys[9];
};

struct JoyInput {
  JoyInput() {
    for (int i = 0; i < 4; i++) {
      buttons[i] = false;
    }
  }

  Vector2 stick1;
  Vector2 stick1_processed; // with deadzones and stuff like that
  Vector2 stick2;
  Vector2 stick2_processed; // with deadzones and stuff like that
  bool buttons[4];
};

#endif
