1 /*
2 * Abuse - dark 2D side-scrolling platform game
3 * Copyright (c) 1995 Crack dot Com
4 * Copyright (c) 2005-2011 Sam Hocevar <sam@hocevar.net>
5 *
6 * This software was released into the Public Domain. As with most public
7 * domain software, no warranty is made or implied by Crack dot Com, by
8 * Jonathan Clark, or by Sam Hocevar.
9 */
10
11 #if defined HAVE_CONFIG_H
12 # include "config.h"
13 #endif
14
15 #include <ctype.h>
16
17 #include "common.h"
18
19 #include "sdlport/joy.h"
20 #include "game.h"
21
22 #include "keys.h"
23 #include "lisp.h"
24 #include "jwindow.h"
25 #include "configuration.h"
26
27 extern int get_key_binding(char const *dir, int i);
28
29 int key_players = 0;
30 int morph_detail = MEDIUM_DETAIL;
31
32 struct player_keys
33 {
34 int joy, left, right, up, down, b1, b2, b3, b4;
35 };
36
37 static player_keys *key_map = NULL;
38
binding_for_player(int player)39 static int binding_for_player( int player )
40 {
41 char tmp[40];
42 sprintf( tmp, "player%d", player );
43 LSymbol *f = LSymbol::Find(tmp);
44 if( !NILP(f) && DEFINEDP(f->GetValue()))
45 {
46 void *what = f->GetValue();
47 if(what == LSymbol::FindOrCreate("keyboard"))
48 return 1;
49 else if(what == LSymbol::FindOrCreate("joystick"))
50 return 2;
51 }
52 return 0;
53 }
54
55 /*
56 int get_key_binding(char const *dir, int i)
57 {
58 char tmp[100], kn[50];
59 sprintf( tmp, "player%d-%s", i, dir );
60 Cell *f = find_symbol( tmp );
61 if( NILP(f) || !DEFINEDP( symbol_value( f ) ) )
62 return 0;
63 void *k = symbol_value( f );
64
65 if( item_type( k ) != L_SYMBOL )
66 return 0;
67
68 strcpy( tmp, lstring_value( symbol_name( k ) ) );
69
70 for( char *c = tmp; *c; c++ )
71 {
72 *c = tolower( *c );
73 if( *c == '_' )
74 *c = ' ';
75 }
76
77 for( int j = 0; j < JK_MAX_KEY; j++ )
78 {
79 key_name( j, kn );
80 for( char *c = kn; *c; c++ )
81 {
82 *c = tolower(*c);
83 }
84 if( !strcmp( kn, tmp ) )
85 return j;
86 }
87 return 0;
88 }
89 */
90
91 /*
92 void get_key_bindings()
93 {
94 if( key_map )
95 {
96 free( key_map );
97 }
98 key_map = NULL;
99
100 for( key_players = 0; binding_for_player( key_players + 1); key_players++ );
101 if( key_players )
102 {
103 key_map = ( player_keys *)malloc(sizeof(player_keys)*key_players);
104 for( int i = 0; i < key_players; i++ )
105 {
106 key_map[i].joy = ( binding_for_player( i + 1 ) == 2 );
107 if( !key_map[i].joy )
108 {
109 key_map[i].left = get_key_binding( "left", i + 1 );
110 key_map[i].right = get_key_binding( "right", i + 1 );
111 key_map[i].up = get_key_binding( "up", i + 1 );
112 key_map[i].down = get_key_binding( "down", i + 1 );
113 key_map[i].b4 = get_key_binding( "b4", i + 1 );
114 key_map[i].b3 = get_key_binding( "b3", i + 1 );
115 key_map[i].b2 = get_key_binding( "b2", i + 1 );
116 key_map[i].b1 = get_key_binding( "b1", i + 1 );
117 }
118 }
119 }
120 else
121 {
122 key_map = NULL;
123 }
124 }*/
125
126 // AK
get_key_bindings()127 void get_key_bindings()
128 {
129 if( key_map )
130 {
131 free( key_map );
132 }
133 key_map = NULL;
134
135 key_players = 1;
136 key_map = (player_keys *)malloc( sizeof( player_keys ) * key_players );
137 for( int i = 0; i < key_players; i++ )
138 {
139 key_map[i].joy = 0;
140 key_map[i].left = get_key_binding( "left", i + 1 );
141 key_map[i].right = get_key_binding( "right", i + 1 );
142 key_map[i].up = get_key_binding( "up", i + 1 );
143 key_map[i].down = get_key_binding( "down", i + 1 );
144 key_map[i].b4 = get_key_binding( "b4", i + 1 );
145 key_map[i].b3 = get_key_binding( "b3", i + 1 );
146 key_map[i].b2 = get_key_binding( "b2", i + 1 );
147 key_map[i].b1 = get_key_binding( "b1", i + 1 );
148 }
149 }
150
151
152 #define is_pressed(x) the_game->key_down(x)
153
get_movement(int player,int & x,int & y,int & b1,int & b2,int & b3,int & b4)154 void get_movement(int player, int &x, int &y, int &b1, int &b2, int &b3, int &b4)
155 {
156 if( player < key_players )
157 {
158 /* if( key_map[player].joy )
159 {
160 joy_status( b1,b2,b3,x,y );
161 b3 = ( b1 && b2 );
162 b4 = 0;
163 }
164 else if( !wm )
165 {
166 x = y = b1 = b2 = b3 = b4 = 0;
167 }
168 else*/
169 {
170 if( is_pressed( key_map[player].left ) )
171 x = -1;
172 else if( is_pressed( key_map[player].right ) )
173 x=1;
174 else
175 x = 0;
176
177 if( is_pressed( key_map[player].up ) )
178 y = -1;
179 else if( is_pressed( key_map[player].down ) )
180 y = 1;
181 else y = 0;
182
183 if( is_pressed( key_map[player].b1 ) )
184 b1 = 1;
185 else
186 b1 = 0;
187
188 if( is_pressed( key_map[player].b2 ) )
189 b2 = 1;
190 else
191 b2 = 0;
192
193 if( is_pressed( key_map[player].b3 ) )
194 b3 = 1;
195 else
196 b3 = 0;
197
198 if( is_pressed( key_map[player].b4 ) )
199 b4 = 1;
200 else
201 b4 = 0;
202 }
203 }
204 else
205 {
206 x = y = b1 = b2 = b3 = 0;
207 }
208 }
209
key_bindings(int player,int & left,int & right,int & up,int & down,int & b1,int & b2,int & b3,int & b4)210 void key_bindings(int player, int &left, int &right, int &up, int &down, int &b1, int &b2, int &b3, int &b4)
211 {
212 left = key_map[player].left;
213 right = key_map[player].right;
214 up = key_map[player].up;
215 down = key_map[player].down;
216 b1 = key_map[player].b1;
217 b2 = key_map[player].b2;
218 b3 = key_map[player].b3;
219 b3 = key_map[player].b4;
220 }
221
222
config_cleanup()223 void config_cleanup()
224 {
225 if(key_map)
226 {
227 free(key_map);
228 key_map = NULL;
229 }
230 }
231
232 //
233 // Get the keycode for the string 'str'
234 // Returns -1 for an invalid key code
235 //
get_keycode(char const * str)236 int get_keycode(char const *str)
237 {
238 if( !str[0] )
239 {
240 return -1;
241 }
242 else if( !str[1] )
243 {
244 return str[0];
245 }
246 else
247 {
248 int j;
249 char buf[20];
250 for( j = 256; j < JK_MAX_KEY; j++ )
251 {
252 key_name( j, buf );
253 char *c = buf;
254 for( ; *c; c++ )
255 {
256 if( *c == ' ' )
257 {
258 *c = '_';
259 }
260 else
261 {
262 *c = tolower( *c );
263 }
264 }
265 if( strcmp( str, buf ) == 0 )
266 {
267 return j;
268 }
269 }
270 }
271 return -1;
272 }
273