1 /*
2 * OpenBOR - http://www.LavaLit.com
3 * -----------------------------------------------------------------------
4 * Licensed under the BSD license, see LICENSE in OpenBOR root for details.
5 *
6 * Copyright (c) 2004 - 2011 OpenBOR Team
7 */
8
9 #include <stdio.h> // kbhit, getch
10 #include "control.h"
11 #include "xboxport.h"
12
13 static int usejoy;
14
15 #define PAD_START 1
16 #define PAD_END (16*4)
17
18 static const char *padnames[PAD_END+1+1] = {
19 "...",
20 #define CONTROLNAMES(x) \
21 x" Up", \
22 x" Right", \
23 x" Down", \
24 x" Left", \
25 x" A", \
26 x" B", \
27 x" X", \
28 x" Y", \
29 x" Black", \
30 x" White", \
31 x" Start", \
32 x" Back", \
33 x" L-Trigger", \
34 x" R-Trigger", \
35 x" L-Thumb", \
36 x" R-Thumb",
37 CONTROLNAMES("Joy 1")
38 CONTROLNAMES("Joy 2")
39 CONTROLNAMES("Joy 3")
40 CONTROLNAMES("Joy 4")
41 "undefined"
42 };
43
flag_to_index(unsigned long flag)44 static int flag_to_index(unsigned long flag){
45 int index = 0;
46 unsigned long bit = 1;
47
48 while(!((bit<<index)&flag) && index<31) ++index;
49 return index;
50 }
51
control_exit()52 void control_exit(){}
53
control_init(int joy_enable)54 void control_init(int joy_enable){
55 usejoy = 1 ;
56 }
57
control_usejoy(int enable)58 int control_usejoy(int enable){
59 return 1 ;
60 }
61
control_getjoyenabled()62 int control_getjoyenabled(){
63 return usejoy;
64 }
65
control_setkey(s_playercontrols * pcontrols,unsigned int flag,int key)66 void control_setkey(s_playercontrols * pcontrols, unsigned int flag, int key){
67 if(!pcontrols) return;
68 pcontrols->settings[flag_to_index(flag)] = key;
69 pcontrols->keyflags = pcontrols->newkeyflags = 0;
70 }
71
72 // Scan input for newly-pressed keys.
73 // Return value:
74 // 0 = no key was pressed
75 // >0 = key code for pressed key
76 // <0 = error
control_scankey()77 int control_scankey(){
78 static unsigned ready = 0;
79 unsigned k=0;
80 unsigned port0=xbox_get_playerinput(0);
81 unsigned port1=xbox_get_playerinput(1);
82 unsigned port2=xbox_get_playerinput(2);
83 unsigned port3=xbox_get_playerinput(3);
84
85 if(port0) k = 1 + 0*16 + flag_to_index(port0);
86 else if(port1) k = 1 + 1*16 + flag_to_index(port1);
87 else if(port2) k = 1 + 2*16 + flag_to_index(port2);
88 else if(port3) k = 1 + 3*16 + flag_to_index(port3);
89
90 if(ready && k) {
91 ready = 0;
92 return k;
93 }
94 ready = (!k);
95 return 0;
96 }
97
control_getkeyname(unsigned keycode)98 char * control_getkeyname(unsigned keycode){
99
100 if(keycode >= PAD_START && keycode <= PAD_END) return (char*)padnames[keycode];
101 return "...";
102 }
103
control_update(s_playercontrols ** playercontrols,int numplayers)104 void control_update(s_playercontrols ** playercontrols, int numplayers){
105
106 unsigned long k;
107 unsigned long i;
108 int player;
109 int t;
110 s_playercontrols * pcontrols;
111 unsigned port[4];
112 xbox_check_events();
113 port[0]=xbox_get_playerinput(0);
114 port[1]=xbox_get_playerinput(1);
115 port[2]=xbox_get_playerinput(2);
116 port[3]=xbox_get_playerinput(3);
117 for(player=0; player<numplayers; player++){
118 pcontrols = playercontrols[player];
119 k = 0;
120 for(i=0; i<32; i++){
121 t = pcontrols->settings[i];
122 if(t >= PAD_START && t <= PAD_END){
123 int portnum = (t-1) / 16;
124 int shiftby = (t-1) % 16;
125 if(portnum >= 0 && portnum <= 3){
126 if((port[portnum] >> shiftby) & 1) k |= (1<<i);
127 }
128 }
129 }
130 pcontrols->kb_break = 0;
131 pcontrols->newkeyflags = k & (~pcontrols->keyflags);
132 pcontrols->keyflags = k;
133 }
134 }
135
control_rumble(int port,int msec)136 void control_rumble(int port, int msec)
137 {
138 }
139