/*
    Amiga Joystick and Joypad support for ORBIT

    29.04.2000 - written, tested, worked :)
    30.04.2000 - added diagonal movement,
                 pitch roll for joypad,
                 fire while moving
*/

#include <libraries/lowlevel.h>
#include <clib/lowlevel_protos.h>
#include "orbit.h"

struct Library *LowLevelBase = NULL;
ULONG amiga_joy_type;

#define AMIGA_JOY_PORT 1

void InitJoy()
{
  UBYTE i;

  joy_available = 0;

  if (LowLevelBase = (struct Library *)OpenLibrary("lowlevel.library", 40L))
  {
    /*  we call this several times just to go sure  */
    for (i=0; i<3; i++)
    {
      amiga_joy_type = ReadJoyPort(AMIGA_JOY_PORT);
      Delay(1);
    }
    if ((amiga_joy_type == JP_TYPE_GAMECTLR) || (amiga_joy_type == JP_TYPE_JOYSTK))
    {
      joy_available = 1;
      return;
    }
    CloseLibrary(LowLevelBase);
    LowLevelBase = NULL;
  }
}

void JoyStick()
{
  /* Ignore joystick motion if dead */
  if ((state == STATE_DEAD1) || (state == STATE_DEAD2))
    return;

  switch(ReadJoyPort(AMIGA_JOY_PORT) - amiga_joy_type)
  {
    case JPF_BUTTON_RED:
      PlayerFires();
    break;
    case JPF_JOY_UP:
      player.move_up = 0.5;
    break;
    case JPF_JOY_DOWN:
      player.move_down = 0.5;
    break;
    case JPF_JOY_LEFT:
      player.move_left = 0.5;
    break;
    case JPF_JOY_RIGHT:
      player.move_right = 0.5;
    break;
    case (JPF_JOY_UP + JPF_JOY_LEFT):
      player.move_up =
      player.move_left = 0.5;
    break;
    case (JPF_JOY_UP + JPF_JOY_RIGHT):
      player.move_up =
      player.move_right = 0.5;
    break;
    case (JPF_JOY_DOWN + JPF_JOY_LEFT):
      player.move_down =
      player.move_left = 0.5;
    break;
    case (JPF_JOY_DOWN + JPF_JOY_RIGHT):
      player.move_down =
      player.move_right = 0.5;
    break;
    case (JPF_BUTTON_FORWARD):
      player.move_pitchright = 1.0;
    break;
    case (JPF_BUTTON_REVERSE):
      player.move_pitchleft = 1.0;
    break;
    case (JPF_JOY_UP + JPF_BUTTON_RED):
      player.move_up = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_DOWN + JPF_BUTTON_RED):
      player.move_down = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_LEFT + JPF_BUTTON_RED):
      player.move_left = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_RIGHT + JPF_BUTTON_RED):
      player.move_right = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_UP + JPF_JOY_LEFT + JPF_BUTTON_RED):
      player.move_up =
      player.move_left = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_UP + JPF_JOY_RIGHT + JPF_BUTTON_RED):
      player.move_up =
      player.move_right = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_DOWN + JPF_JOY_LEFT + JPF_BUTTON_RED):
      player.move_down =
      player.move_left = 0.5;
      PlayerFires();
    break;
    case (JPF_JOY_DOWN + JPF_JOY_RIGHT + JPF_BUTTON_RED):
      player.move_down =
      player.move_right = 0.5;
      PlayerFires();
    break;
    case (JPF_BUTTON_FORWARD + JPF_BUTTON_RED):
      player.move_pitchright = 1.0;
      PlayerFires();
    break;
    case (JPF_BUTTON_REVERSE + JPF_BUTTON_RED):
      player.move_pitchleft = 1.0;
      PlayerFires();
    break;
  }
}

void FreeJoy()
{
  if (LowLevelBase)
  {
    SetJoyPortAttrs(1, SJA_Reinitialize, TAG_DONE);
    CloseLibrary(LowLevelBase);
  }
}
