// ***************************************************************************
// controller
// ***************************************************************************

#pragma once

#include <vectrex.h>



// ---------------------------------------------------------------------------
// controller initialization, each controller axis can be individually
// switched on or off; for performance reasons, activate only what you
// really need

static inline void enable_controller_1_x()
{
		Vec_Joy_Mux_1_X = 1;
}

static inline void enable_controller_1_y()
{
		Vec_Joy_Mux_1_Y = 3;
}

static inline void enable_controller_2_x()
{
		Vec_Joy_Mux_2_X = 5;
}

static inline void enable_controller_2_y()
{
		Vec_Joy_Mux_2_Y = 7;
}

static inline void disable_controller_1_x()
{
		Vec_Joy_Mux_1_X = 0;
}

static inline void disable_controller_1_y()
{
		Vec_Joy_Mux_1_Y = 0;
}

static inline void disable_controller_2_x()
{
		Vec_Joy_Mux_2_X = 0;
}

static inline void disable_controller_2_y()
{
		Vec_Joy_Mux_2_Y = 0;
}

// ---------------------------------------------------------------------------
// read controller buttons

// must be called once each time you want to check the buttons
static inline void check_buttons()
{
	Read_Btns();
}

static inline unsigned int buttons_pressed()
{
	return Vec_Buttons;
}

static inline unsigned int buttons_held()
{
	return Vec_Btn_State;
}

// call these functions below to check if a specific button is pressed,
// the button must be released before another press is registered,
// return value is 0 or 1, so these functions can be used as check in
// conditional statements

static inline unsigned int button_1_1_pressed()
{
	return (buttons_pressed() & 0b00000001);
}

static inline unsigned int button_1_2_pressed()
{
	return (buttons_pressed() & 0b00000010);
}
static inline unsigned int button_1_3_pressed()
{
	return (buttons_pressed() & 0b00000100);
}
static inline unsigned int button_1_4_pressed()
{
	return (buttons_pressed() & 0b00001000);
}

static inline unsigned int button_2_1_pressed()
{
	return (buttons_pressed() & 0b00010000);
}

static inline unsigned int button_2_2_pressed()
{
	return (buttons_pressed() & 0b00100000);
}
static inline unsigned int button_2_3_pressed()
{
	return (buttons_pressed() & 0b01000000);
}

static inline unsigned int button_2_4_pressed()
{
	return (buttons_pressed() & 0b10000000);
}

// call these functions below to check if a specific button is held,
// return value is 0 or 1, so these functions can be used as check in
// conditional statements

static inline unsigned int button_1_1_held()
{
	return (buttons_held() & 0b00000001);
}

static inline unsigned int button_1_2_held()
{
	return (buttons_held() & 0b00000010);
}
static inline unsigned int button_1_3_held()
{
	return (buttons_held() & 0b00000100);
}
static inline unsigned int button_1_4_held()
{
	return (buttons_held() & 0b00001000);
}

static inline unsigned int button_2_1_held()
{
	return (buttons_held() & 0b00010000);
}

static inline unsigned int button_2_2_held()
{
	return (buttons_held() & 0b00100000);
}
static inline unsigned int button_2_3_held()
{
	return (buttons_held() & 0b01000000);
}

static inline unsigned int button_2_4_held()
{
	return (buttons_held() & 0b10000000);
}

// ---------------------------------------------------------------------------
// read controller joysticks

// must be called once each time you want to check the joysticks
static inline void check_joysticks()
{
	Joy_Digital();
}

static inline int joystick_1_x()
{
	return Vec_Joy_1_X;
}

static inline int joystick_1_y()
{
	return Vec_Joy_1_Y;
}

static inline int joystick_2_x()
{
	return Vec_Joy_2_X;
}

static inline int joystick_2_y()
{
	return Vec_Joy_2_Y;
}

// call these functions below to check if a joystick is moved in
// a specific direction,
// return value is 0 or 1, so these functions can be used as check in
// conditional statements

static inline int joystick_1_left()
{
	return (joystick_1_x() < 0);
}

static inline int joystick_1_right()
{
	return (joystick_1_x() > 0);
}

static inline int joystick_1_down()
{
	return (joystick_1_y() < 0);
}

static inline int joystick_1_up()
{
	return (joystick_1_y() > 0);
}

static inline int joystick_2_left()
{
	return (joystick_2_x() < 0);
}

static inline int joystick_2_right()
{
	return (joystick_2_x() > 0);
}

static inline int joystick_2_down()
{
	return (joystick_2_y() < 0);
}

static inline int joystick_2_up()
{
	return (joystick_2_y() > 0);
}

// ***************************************************************************
// end of file
// ***************************************************************************