예제 #1
0
static boolean tcod_pauseForMilliseconds(short milliseconds)
{
	TCOD_mouse_t mouse;
	TCOD_console_flush();
	TCOD_sys_sleep_milli((unsigned int) milliseconds);

	#ifdef USE_NEW_TCOD_API
	if (bufferedKey.vk == TCODK_NONE) {
		TCOD_sys_check_for_event(TCOD_EVENT_KEY_PRESS | TCOD_EVENT_MOUSE, &bufferedKey, &mouse);
	} else {
		TCOD_sys_check_for_event(TCOD_EVENT_MOUSE, 0, &mouse);
	}
	#else
	if (bufferedKey.vk == TCODK_NONE) {
		bufferedKey = TCOD_console_check_for_keypress(TCOD_KEY_PRESSED);
	}
	#endif
	
	if (missedMouse.lmb == 0 && missedMouse.rmb == 0) {
		mouse = TCOD_mouse_get_status();
		if (mouse.lbutton_pressed || mouse.rbutton_pressed) {
			missedMouse.x = mouse.cx;
			missedMouse.y = mouse.cy;
			if (mouse.lbutton_pressed) missedMouse.lmb = MOUSE_DOWN;
			if (mouse.rbutton_pressed) missedMouse.rmb = MOUSE_DOWN;
		}
	}
	
	return (bufferedKey.vk != TCODK_NONE || missedMouse.lmb || missedMouse.rmb);
}
예제 #2
0
void TCOD_mouse_get_status_wrapper(TCOD_mouse_t *mouse) {
	*mouse=TCOD_mouse_get_status();
}
예제 #3
0
TCOD_mouse_t TCODMouse::getStatus() {
	return TCOD_mouse_get_status();
}
예제 #4
0
static void tcod_nextKeyOrMouseEvent(rogueEvent *returnEvent, boolean textInput, boolean colorsDance)
{
	boolean tryAgain;
	TCOD_key_t key;
	TCOD_mouse_t mouse;
	uint32 theTime, waitTime;
	short x, y;
	
	TCOD_console_flush();

	key.vk = TCODK_NONE;

	if (noMenu && rogue.nextGame == NG_NOTHING) rogue.nextGame = NG_NEW_GAME;
	
	for (;;) {
		theTime = TCOD_sys_elapsed_milli();
		
		if (TCOD_console_is_window_closed()) {
			rogue.gameHasEnded = true; // causes the game loop to terminate quickly
			rogue.nextGame = NG_QUIT; // causes the menu to drop out immediately
			returnEvent->eventType = KEYSTROKE;
			returnEvent->param1 = ESCAPE_KEY;
			return;
		}
		
		tryAgain = false;
		
		if (bufferedKey.vk != TCODK_NONE) {
			rewriteKey(&bufferedKey, textInput);
			if (processKeystroke(bufferedKey, returnEvent, textInput)) {
				bufferedKey.vk = TCODK_NONE;
				return;
			} else {
				bufferedKey.vk = TCODK_NONE;
			}
		}
		
		if (missedMouse.lmb) {
			returnEvent->eventType = missedMouse.lmb;

			returnEvent->param1 = missedMouse.x;
			returnEvent->param2 = missedMouse.y;
			if (TCOD_console_is_key_pressed(TCODK_CONTROL)) {
				returnEvent->controlKey = true;
			}
			if (TCOD_console_is_key_pressed(TCODK_SHIFT)) {
				returnEvent->shiftKey = true;
			}
			
			missedMouse.lmb = missedMouse.lmb == MOUSE_DOWN ? MOUSE_UP : 0;
			return;
		}

		if (missedMouse.rmb) {
			returnEvent->eventType = missedMouse.rmb == MOUSE_DOWN ? RIGHT_MOUSE_DOWN : RIGHT_MOUSE_UP;

			returnEvent->param1 = missedMouse.x;
			returnEvent->param2 = missedMouse.y;
			if (TCOD_console_is_key_pressed(TCODK_CONTROL)) {
				returnEvent->controlKey = true;
			}
			if (TCOD_console_is_key_pressed(TCODK_SHIFT)) {
				returnEvent->shiftKey = true;
			}
			
			missedMouse.rmb = missedMouse.rmb == MOUSE_DOWN ? MOUSE_UP : 0;
			return;
		}
		
		if (!(serverMode || (SDL_GetAppState() & SDL_APPACTIVE))) {
			TCOD_sys_sleep_milli(100);
		} else {
			if (colorsDance) {
				shuffleTerrainColors(3, true);
				commitDraws();
			}
			TCOD_console_flush();
		}

		#ifdef USE_NEW_TCOD_API
		TCOD_sys_check_for_event(TCOD_EVENT_KEY_PRESS | TCOD_EVENT_MOUSE, &key, &mouse);
		#else
		key = TCOD_console_check_for_keypress(TCOD_KEY_PRESSED);
		#endif

		rewriteKey(&key, textInput);
		if (processKeystroke(key, returnEvent, textInput)) {
			return;
		}

		mouse = TCOD_mouse_get_status();

		if (serverMode || (SDL_GetAppState() & SDL_APPACTIVE)) {
			x = mouse.cx;
			y = mouse.cy;
		} else {
			x = 0;
			y = 0;
		}

		if (
			mouse.lbutton_pressed || mouse.rbutton_pressed
			|| mouse.lbutton != brogueMouse.lmb || mouse.rbutton != brogueMouse.rmb
			|| brogueMouse.x !=x || brogueMouse.y != y) {

			returnEvent->param1 = x;
			returnEvent->param2 = y;

			getModifiers(returnEvent);

			if (mouse.lbutton_pressed) {
				if (!brogueMouse.lmb) {
					// we missed a mouseDown event -- better make up for it!
					missedMouse.x = x;
					missedMouse.y = y;
					missedMouse.lmb = MOUSE_UP;
					returnEvent->eventType = MOUSE_DOWN;
				} else {
					returnEvent->eventType = MOUSE_UP;
				}
			} else if (mouse.lbutton && !brogueMouse.lmb) {
				returnEvent->eventType = MOUSE_DOWN;
			} else {
				returnEvent->eventType = MOUSE_ENTERED_CELL;
			}

			if (mouse.rbutton_pressed) {
				if (!brogueMouse.rmb) {
					// we missed a mouseDown event -- better make up for it!
					missedMouse.x = x;
					missedMouse.y = y;
					missedMouse.rmb = MOUSE_UP;
					returnEvent->eventType = RIGHT_MOUSE_DOWN;
				} else {
					returnEvent->eventType = RIGHT_MOUSE_UP;
				}
			} else if (mouse.rbutton && !brogueMouse.rmb) {
				returnEvent->eventType = RIGHT_MOUSE_DOWN;
			}

			brogueMouse.x = x;
			brogueMouse.y = y;
			brogueMouse.lmb = mouse.lbutton;
			brogueMouse.rmb = mouse.rbutton;

			if (returnEvent->eventType == MOUSE_ENTERED_CELL && !hasMouseMoved) {
				hasMouseMoved = true;
			} else {
				return;
			}
		}

		waitTime = PAUSE_BETWEEN_EVENT_POLLING + theTime - TCOD_sys_elapsed_milli();
		
		if (waitTime > 0 && waitTime <= PAUSE_BETWEEN_EVENT_POLLING) {
			TCOD_sys_sleep_milli(waitTime);
		}
	}
}