www.pudn.com > ncdzsrc.rar > input.c
/***************************************************************************
input.c
入力デバイス制御
***************************************************************************/
#include "neogeocd.h"
/****************************************************************************
グローバル変数
***************************************************************************/
int key_code[MAX_PLAYER][MAX_BUTTON];
int joy_code[MAX_PLAYER][MAX_BUTTON];
int autofire[MAX_PLAYER][4];
int button_mask[MAX_PLAYER][4];
static int afcounter[MAX_PLAYER][4];
/***************************************************************************
グローバル関数
***************************************************************************/
/*------------------------------------------------------
入力デバイスの初期化
引 数: なし
戻り値: 1:成功 0:失敗
-----------------------------------------------------*/
int input_init(void)
{
if (osd_keyboard_init() == OSD_OK)
{
if (osd_joystick_init() == OSD_OK)
return 1;
osd_joystick_exit();
}
osd_keyboard_exit();
build_hotkey();
return 0;
}
/*------------------------------------------------------
入力デバイスの制御終了
引 数: なし
戻り値: なし
-----------------------------------------------------*/
void input_shutdown(void)
{
osd_joystick_exit();
osd_keyboard_exit();
}
/*------------------------------------------------------
入力デバイスをリセット
引 数: なし
戻り値: なし
-----------------------------------------------------*/
void input_reset(void)
{
osd_joystick_reset();
osd_keyboard_reset();
build_hotkey();
}
/*------------------------------------------------------
入力デバイスの状態を更新
引 数: なし
戻り値: なし
-----------------------------------------------------*/
void update_input_port(void)
{
osd_poll_joystick();
osd_poll_keyboard();
}
/*------------------------------------------------------
ホットキー作成
引 数: なし
戻り値: なし
-----------------------------------------------------*/
void build_hotkey(void)
{
int player, button;
for (player = 0; player < 2; player++)
{
for (button = 0; button < 4; button++)
{
int type = options.hotkey[player][button];
afcounter[player][button] = 0;
autofire[player][button] = 1;
button_mask[player][button] = 0xff;
switch (type)
{
case 5: // A+B
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTONB));
break;
case 6: // A+C
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTONC));
break;
case 7: // A+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTOND));
break;
case 8: // B+C
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONB) | (1 << NEOGEO_INPUT_BUTTONC));
break;
case 9: // B+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONB) | (1 << NEOGEO_INPUT_BUTTOND));
break;
case 10: // C+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONC) | (1 << NEOGEO_INPUT_BUTTOND));
break;
case 11: // A+B+C
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTONB) | (1 << NEOGEO_INPUT_BUTTONC));
break;
case 12: // A+B+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTONB) | (1 << NEOGEO_INPUT_BUTTOND));
break;
case 13: // A+C+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTONC) | (1 << NEOGEO_INPUT_BUTTOND));
break;
case 14: // B+C+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONB) | (1 << NEOGEO_INPUT_BUTTONC) | (1 << NEOGEO_INPUT_BUTTOND));
break;
case 15: // A+B+C+D
button_mask[player][button] &= ~((1 << NEOGEO_INPUT_BUTTONA) | (1 << NEOGEO_INPUT_BUTTONB) | (1 << NEOGEO_INPUT_BUTTONC) | (1 << NEOGEO_INPUT_BUTTOND));
break;
}
}
}
}
/*------------------------------------------------------
連射フラグ更新
引 数: なし
戻り値: なし
-----------------------------------------------------*/
void update_autofire_flag(void)
{
int player, button;
for (player = 0; player < 2; player++)
{
for (button = 0; button < 4; button++)
{
if (options.hotkey[player][button] == button + 1)
{
if (osd_is_joy_pressed(joy_code[player][button + 10]))
{
afcounter[player][button]++;
if (afcounter[player][button] == options.afinterval[player])
{
afcounter[player][button] = 0;
autofire[player][button] ^= 1;
}
}
else
{
afcounter[player][button] = 0;
autofire[player][button] = 1;
}
}
else
{
afcounter[player][button] = 0;
autofire[player][button] = 1;
}
}
}
}
/*------------------------------------------------------
ホットキーを反映
引 数: int player プレイヤー番号
UINT8 value 現在のボタンの状態
戻り値: ホットキーを反映したボタン状態
-----------------------------------------------------*/
UINT8 apply_hotkey(int player, UINT8 value)
{
int button;
for (button = 0; button < 4; button++)
{
// コントローラー情報に反映
if (options.hotkey[player][button])
{
if (osd_is_joy_pressed(joy_code[player][button + 10]))
{
switch (options.hotkey[player][button])
{
case 1: // autofire A
value &= ~(autofire[player][0] << NEOGEO_INPUT_BUTTONA);
break;
case 2: // autofire B
value &= ~(autofire[player][1] << NEOGEO_INPUT_BUTTONB);
break;
case 3: // autofire C
value &= ~(autofire[player][2] << NEOGEO_INPUT_BUTTONC);
break;
case 4: // autofire D
value &= ~(autofire[player][3] << NEOGEO_INPUT_BUTTOND);
break;
default:
value &= button_mask[player][button];
break;
}
}
}
}
return value;
}
/*------------------------------------------------------
NEOGEOコントローラ1入力チェック
引 数: なし
戻り値: ポートの入力状態のデータ
-----------------------------------------------------*/
UINT16 read_controler1(void)
{
int button;
UINT8 mask = 0x01, value = 0xff;
update_input_port();
for (button = NEOGEO_INPUT_UP; button <= NEOGEO_INPUT_BUTTOND; button++, mask <<= 1)
if (osd_is_key_pressed(key_code[PLAYER1][button]) || osd_is_joy_pressed(joy_code[PLAYER1][button]))
value &= ~mask;
value = apply_hotkey(0, value);
return value << 8;
}
/*------------------------------------------------------
NEOGEOコントローラ2入力チェック
引 数: なし
戻り値: ポートの入力状態のデータ
-----------------------------------------------------*/
UINT16 read_controler2(void)
{
int button;
UINT8 mask = 0x01, value = 0xff;
update_input_port();
for (button = NEOGEO_INPUT_UP; button <= NEOGEO_INPUT_BUTTOND; button++, mask <<= 1)
if (osd_is_key_pressed(key_code[PLAYER2][button]) || osd_is_joy_pressed(joy_code[PLAYER2][button]))
value &= ~mask;
value = apply_hotkey(1, value);
return value << 8;
}
/*------------------------------------------------------
ユーザインタフェースのボタンが押されたかチェック
引 数: int port ポート番号
戻り値: ポートの入力状態のデータ
-----------------------------------------------------*/
int input_ui_pressed(int code, int flag)
{
int pressed = 0;
if (flag & UI_PLAYER1)
{
if (flag & UI_KEYBOARD) pressed |= osd_is_key_pressed_memory(key_code[PLAYER1][code]);
if (flag & UI_JOYSTICK) pressed |= osd_is_joy_pressed_memory(joy_code[PLAYER1][code]);
}
if (flag & UI_PLAYER2)
{
if (flag & UI_KEYBOARD) pressed |= osd_is_key_pressed_memory(key_code[PLAYER2][code]);
if (flag & UI_JOYSTICK) pressed |= osd_is_joy_pressed_memory(joy_code[PLAYER2][code]);
}
if (code == INPUT_UP)
{
pressed |= osd_is_key_pressed_memory(KEYCODE_UP);
pressed |= osd_is_key_pressed_memory(KEYCODE_8_PAD);
}
if (code == INPUT_DOWN)
{
pressed |= osd_is_key_pressed_memory(KEYCODE_DOWN);
pressed |= osd_is_key_pressed_memory(KEYCODE_2_PAD);
}
if (code == INPUT_LEFT)
{
pressed |= osd_is_key_pressed_memory(KEYCODE_LEFT);
pressed |= osd_is_key_pressed_memory(KEYCODE_4_PAD);
}
if (code == INPUT_RIGHT)
{
pressed |= osd_is_key_pressed_memory(KEYCODE_RIGHT);
pressed |= osd_is_key_pressed_memory(KEYCODE_6_PAD);
}
if (code == INPUT_SELECT)
{
pressed |= osd_is_key_pressed_memory(KEYCODE_ENTER);
pressed |= osd_is_key_pressed_memory(KEYCODE_ENTER_PAD);
}
if (code == INPUT_CANCEL)
{
pressed |= osd_is_key_pressed_memory(KEYCODE_ESC);
}
return pressed;
}
/*------------------------------------------------------
入力されたキーが話されるまで待つ
引 数: int interval チェックする間隔(ミリ秒)
戻り値: なし
-----------------------------------------------------*/
void input_ui_wait_keyclear(int interval)
{
int pressed = 1;
do
{
int i, player;
Sleep(interval);
osd_poll_joystick();
osd_poll_keyboard();
pressed = 0;
for (player = 0; player < 2; player++)
{
for (i = 0; i < 10; i++)
pressed |= osd_is_key_pressed(key_code[player][i]);
for (i = 0; i < 10; i++)
pressed |= osd_is_joy_pressed(joy_code[player][i]);
}
} while (pressed);
}