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