aboutsummaryrefslogtreecommitdiff
path: root/backends/dc/input.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/dc/input.cpp')
-rw-r--r--backends/dc/input.cpp173
1 files changed, 173 insertions, 0 deletions
diff --git a/backends/dc/input.cpp b/backends/dc/input.cpp
new file mode 100644
index 0000000000..ed7289e463
--- /dev/null
+++ b/backends/dc/input.cpp
@@ -0,0 +1,173 @@
+/* ScummVM - Scumm Interpreter
+ * Dreamcast port
+ * Copyright (C) 2002 Marcus Comstedt
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * $Header$
+ *
+ */
+
+#include "stdafx.h"
+#include "scumm.h"
+#include "dc.h"
+
+int handleInput(struct mapledev *pad, int &mouse_x, int &mouse_y,
+ byte &shiftFlags)
+{
+ int lmb=0, rmb=0, newkey=0;
+ static int lastkey = 0;
+ static byte lastlmb = 0, lastrmb = 0;
+ shiftFlags = 0;
+ for(int i=0; i<4; i++, pad++)
+ if(pad->func & MAPLE_FUNC_CONTROLLER) {
+ int buttons = pad->cond.controller.buttons;
+
+ if(!(buttons & 0x060e)) exit(0);
+
+ if(!(buttons & 4)) lmb++;
+ if(!(buttons & 2)) rmb++;
+
+ if(!(buttons & 8)) newkey = 319;
+ else if(!(buttons & 512)) newkey = ' ';
+ else if(!(buttons & 1024)) newkey = '0';
+
+ if(!(buttons & 128)) mouse_x++;
+ if(!(buttons & 64)) mouse_x--;
+ if(!(buttons & 32)) mouse_y++;
+ if(!(buttons & 16)) mouse_y--;
+
+ mouse_x += ((int)pad->cond.controller.joyx-128)>>4;
+ mouse_y += ((int)pad->cond.controller.joyy-128)>>4;
+ } else if(pad->func & MAPLE_FUNC_MOUSE) {
+ int buttons = pad->cond.mouse.buttons;
+
+ if(!(buttons & 4)) lmb++;
+ if(!(buttons & 2)) rmb++;
+
+ if(!(buttons & 8)) newkey = 319;
+
+ mouse_x += pad->cond.mouse.axis1;
+ mouse_y += pad->cond.mouse.axis2;
+ pad->cond.mouse.axis1 = 0;
+ pad->cond.mouse.axis2 = 0;
+ } else if(pad->func & MAPLE_FUNC_KEYBOARD) {
+ for(int p=0; p<6; p++) {
+ int shift = pad->cond.kbd.shift;
+ int key = pad->cond.kbd.key[p];
+ if(shift & 0x08) lmb++;
+ if(shift & 0x80) rmb++;
+ if(shift & 0x11) shiftFlags |= OSystem::KBD_CTRL;
+ if(shift & 0x44) shiftFlags |= OSystem::KBD_ALT;
+ if(shift & 0x22) shiftFlags |= OSystem::KBD_SHIFT;
+ if(key >= 4 && key <= 0x1d)
+ newkey = key+('a'-4);
+ else if(key >= 0x1e && key <= 0x26)
+ newkey = key+((shift & 0x22)? ('!'-0x1e) : ('1'-0x1e));
+ else if(key >= 0x59 && key <= 0x61)
+ newkey = key+('1'-0x59);
+ else if(key >= 0x3a && key <= 0x43)
+ newkey = key+(315-0x3a);
+ else switch(key) {
+ case 0x27: case 0x62:
+ newkey = ((shift & 0x22)? '~' : '0'); break;
+ case 0x28: case 0x58:
+ newkey = 13; break;
+ case 0x29:
+ newkey = 27; break;
+ case 0x2a:
+ newkey = 8; break;
+ case 0x2b:
+ newkey = 9; break;
+ case 0x2c:
+ newkey = ' '; break;
+ case 0x4c:
+ if((shift & 0x11) && (shift & 0x44))
+ exit(0);
+ break;
+ case 0x4f:
+ mouse_x++; break;
+ case 0x50:
+ mouse_x--; break;
+ case 0x51:
+ mouse_y++; break;
+ case 0x52:
+ mouse_y--; break;
+ }
+ }
+ }
+
+ if(lmb && !lastlmb) {
+ lastlmb = 1;
+ return -OSystem::EVENT_LBUTTONDOWN;
+ } else if(lastlmb && !lmb) {
+ lastlmb = 0;
+ return -OSystem::EVENT_LBUTTONUP;
+ }
+ if(rmb && !lastrmb) {
+ lastrmb = 1;
+ return -OSystem::EVENT_RBUTTONDOWN;
+ } else if(lastrmb && !rmb) {
+ lastrmb = 0;
+ return -OSystem::EVENT_RBUTTONUP;
+ }
+
+ if(!newkey)
+ lastkey = 0;
+ else if(newkey != lastkey)
+ return lastkey = newkey;
+
+ return 0;
+}
+
+bool OSystem_Dreamcast::poll_event(Event *event)
+{
+ unsigned int t = Timer();
+ if(((int)(t-_devpoll))<0)
+ return false;
+ _devpoll += USEC_TO_TIMER(17000);
+ int mask = getimask();
+ setimask(15);
+ checkSound();
+ int e = handleInput(locked_get_pads(), _ms_cur_x, _ms_cur_y,
+ event->kbd.flags);
+ setimask(mask);
+ if (_ms_cur_x<0) _ms_cur_x=0;
+ if (_ms_cur_x>319) _ms_cur_x=319;
+ if (_ms_cur_y<0) _ms_cur_y=0;
+ if (_ms_cur_y>=_screen_h) _ms_cur_y=_screen_h-1;
+ event->mouse.x = _ms_cur_x;
+ event->mouse.y = _ms_cur_y;
+ event->kbd.ascii = event->kbd.keycode = 0;
+ if(e<0) {
+ event->event_code = -e;
+ return true;
+ } else if(e>0) {
+ event->event_code = EVENT_KEYDOWN;
+ event->kbd.keycode = e;
+ event->kbd.ascii = (e>='a' && e<='z' && (event->kbd.flags & KBD_SHIFT)?
+ e &~ 0x20 : e);
+ return true;
+ } else if(_ms_cur_x != _ms_old_x || _ms_cur_y != _ms_old_y) {
+ event->event_code = EVENT_MOUSEMOVE;
+ _ms_old_x = _ms_cur_x;
+ _ms_old_y = _ms_cur_y;
+ return true;
+ } else {
+ event->event_code = 0;
+ return false;
+ }
+}
+