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); 
}