rnd-19981026-1
[rocksndiamonds.git] / src / joystick.c
1 /***********************************************************
2 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
3 *----------------------------------------------------------*
4 *  (c) 1995-98 Artsoft Entertainment                       *
5 *              Holger Schemel                              *
6 *              Oststrasse 11a                              *
7 *              33604 Bielefeld                             *
8 *              phone: ++49 +521 290471                     *
9 *              email: aeglos@valinor.owl.de                *
10 *----------------------------------------------------------*
11 *  joystick.c                                              *
12 ***********************************************************/
13
14 #ifdef __FreeBSD__
15 #include <machine/joystick.h>
16 #endif
17
18 #include "joystick.h"
19 #include "misc.h"
20
21 void CheckJoystickData()
22 {
23   int i;
24   int distance = 100;
25
26   for(i=0;i<2;i++)
27   {
28     if (joystick[i].xmiddle <= distance)
29       joystick[i].xmiddle = distance;
30     if (joystick[i].ymiddle <= distance)
31       joystick[i].ymiddle = distance;
32
33     if (joystick[i].xleft >= joystick[i].xmiddle)
34       joystick[i].xleft = joystick[i].xmiddle-distance;
35     if (joystick[i].xright <= joystick[i].xmiddle)
36       joystick[i].xright = joystick[i].xmiddle+distance;
37
38     if (joystick[i].yupper >= joystick[i].ymiddle)
39       joystick[i].yupper = joystick[i].ymiddle-distance;
40     if (joystick[i].ylower <= joystick[i].ymiddle)
41       joystick[i].ylower = joystick[i].ymiddle+distance;
42   }
43 }
44
45 int JoystickPosition(int middle, int margin, int actual)
46 {
47   long range, pos;
48   int percentage;
49
50   if (margin<middle && actual>middle)
51     return(0);
52   if (margin>middle && actual<middle)
53     return(0);
54
55   range = ABS(margin-middle);
56   pos = ABS(actual-middle);
57   percentage = (int)(pos*100/range);
58   if (percentage>100)
59     percentage = 100;
60
61   return(percentage);
62 }
63
64 int Joystick()
65 {
66 #ifdef __FreeBSD__
67   struct joystick joy_ctrl;
68 #else
69   struct joystick_control
70   {
71     int buttons;
72     int x;
73     int y;
74   } joy_ctrl;
75 #endif
76
77   int joystick_nr = setup.input[0].joystick_nr;
78   int js_x,js_y, js_b1,js_b2;
79   int left, right, up, down;
80   int result=0;
81
82   if (joystick_status==JOYSTICK_OFF)
83     return(0);
84
85 #ifndef MSDOS
86   if (read(joystick_device, &joy_ctrl, sizeof(joy_ctrl)) != sizeof(joy_ctrl))
87   {
88     Error(ERR_WARN, "cannot read joystick settings - no joystick support");
89     joystick_status = JOYSTICK_OFF;
90     return(0);
91   }
92
93   js_x  = joy_ctrl.x;
94   js_y  = joy_ctrl.y;
95 #ifdef __FreeBSD__
96   js_b1 = joy_ctrl.b1;
97   js_b2 = joy_ctrl.b2;
98 #else
99   js_b1 = joy_ctrl.buttons & 1;
100   js_b2 = joy_ctrl.buttons & 2;
101 #endif
102
103   left = JoystickPosition(joystick[joystick_nr].xmiddle,
104                           joystick[joystick_nr].xleft,  js_x);
105   right = JoystickPosition(joystick[joystick_nr].xmiddle,
106                            joystick[joystick_nr].xright, js_x);
107   up =    JoystickPosition(joystick[joystick_nr].ymiddle,
108                            joystick[joystick_nr].yupper, js_y);
109   down =  JoystickPosition(joystick[joystick_nr].ymiddle,
110                            joystick[joystick_nr].ylower, js_y);
111
112   if (left>JOYSTICK_PERCENT)
113     result |= JOY_LEFT;
114   else if (right>JOYSTICK_PERCENT)
115     result |= JOY_RIGHT;
116   if (up>JOYSTICK_PERCENT)
117     result |= JOY_UP;
118   else if (down>JOYSTICK_PERCENT)
119     result |= JOY_DOWN;
120   if (js_b1)
121     result |= JOY_BUTTON_1;
122   if (js_b2)
123     result |= JOY_BUTTON_2;
124
125   return(result);
126 #else
127   return(0);
128 #endif
129 }
130
131 int JoystickButton()
132 {
133   static int last_joy_button = 0;
134   int joy_button = (Joystick() & JOY_BUTTON);
135   int result;
136
137   if (joy_button)
138   {
139     if (last_joy_button)
140       result = JOY_BUTTON_PRESSED;
141     else
142       result = JOY_BUTTON_NEW_PRESSED;
143   }
144   else
145   {
146     if (last_joy_button)
147       result = JOY_BUTTON_NEW_RELEASED;
148     else
149       result = JOY_BUTTON_NOT_PRESSED;
150   }
151
152   last_joy_button = joy_button;
153   return(result);
154 }